warmup: true
runs: 5
scenarios:
- # Load a page view
- # The only page that exists by default is the main page.
- # But, its actual name is configurable/unknown (T216791).
- # Omit 'title' to let MediaWiki show the defaul (which is the main page),
- # and a query string to prevent the normalization redirect.
- - url: "{MW_SERVER}{MW_SCRIPT_PATH}/index.php?noredirectplz"
+ Load a page:
+ # The only page that exists by default is the main page.
+ # But, its actual name is configurable/unknown (T216791).
+ # Omit 'title' to let MediaWiki show the defaul (which is the main page),
+ # and a query string to prevent a normalization redirect.
+ url: "{MW_SERVER}{MW_SCRIPT_PATH}/index.php?noredirectplz"
viewport:
width: 1100
height: 700
probes:
- screenshot
- trace
- # Load an 'edit' form
- - url: "{MW_SERVER}{MW_SCRIPT_PATH}/index.php?action=edit"
+ Load the editor:
+ url: "{MW_SERVER}{MW_SCRIPT_PATH}/index.php?action=edit"
viewport:
width: 1100
height: 700
probes:
- screenshot
- trace
- # View recent changes
- - url: "{MW_SERVER}{MW_SCRIPT_PATH}/index.php?title=Special:RecentChanges"
+ View recent changes:
+ url: "{MW_SERVER}{MW_SCRIPT_PATH}/index.php?title=Special:RecentChanges"
viewport:
width: 1100
height: 700
<exclude name="MediaWiki.ControlStructures.AssignmentInControlStructures.AssignmentInControlStructures" />
<exclude name="MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName" />
<exclude name="MediaWiki.Usage.DbrQueryUsage.DbrQueryFound" />
- <exclude name="MediaWiki.Usage.DeprecatedGlobalVariables.Deprecated$wgAuth" />
<exclude name="MediaWiki.Usage.DeprecatedGlobalVariables.Deprecated$wgContLang" />
<exclude name="MediaWiki.Usage.DeprecatedGlobalVariables.Deprecated$wgParser" />
<exclude name="MediaWiki.Usage.DeprecatedGlobalVariables.Deprecated$wgTitle" />
<exclude-pattern>*/includes/specials/SpecialMostlinkedtemplates\.php</exclude-pattern>
<exclude-pattern>*/includes/specials/SpecialMostrevisions\.php</exclude-pattern>
<exclude-pattern>*/includes/specials/SpecialMovepage\.php</exclude-pattern>
- <exclude-pattern>*/includes/specials/SpecialMyRedirectPages\.php</exclude-pattern>
<exclude-pattern>*/includes/specials/SpecialNewimages\.php</exclude-pattern>
<exclude-pattern>*/includes/specials/SpecialRandompage\.php</exclude-pattern>
<exclude-pattern>*/includes/specials/SpecialShortpages\.php</exclude-pattern>
<exclude-pattern>*/includes/api/ApiMessage\.php</exclude-pattern>
<exclude-pattern>*/includes/api/ApiOpenSearch\.php</exclude-pattern>
<exclude-pattern>*/includes/api/ApiRsd\.php</exclude-pattern>
- <exclude-pattern>*/includes/AuthPlugin\.php</exclude-pattern>
<exclude-pattern>*/includes/cache/CacheDependency\.php</exclude-pattern>
<exclude-pattern>*/includes/compat/XMPReader\.php</exclude-pattern>
<exclude-pattern>*/includes/diff/DairikiDiff\.php</exclude-pattern>
<exclude-pattern>*/includes/RevisionList\.php</exclude-pattern>
<exclude-pattern>*/includes/search/SearchEngine\.php</exclude-pattern>
<exclude-pattern>*/includes/specialpage/LoginSignupSpecialPage\.php</exclude-pattern>
- <exclude-pattern>*/includes/specialpage/RedirectSpecialPage\.php</exclude-pattern>
<exclude-pattern>*/includes/specials/forms/PreferencesFormLegacy\.php</exclude-pattern>
- <exclude-pattern>*/includes/specials/SpecialListusers\.php</exclude-pattern>
- <exclude-pattern>*/includes/specials/SpecialMyRedirectPages\.php</exclude-pattern>
<exclude-pattern>*/includes/StubObject\.php</exclude-pattern>
<exclude-pattern>*/includes/upload/UploadStash\.php</exclude-pattern>
<exclude-pattern>*/includes/utils/AutoloadGenerator\.php</exclude-pattern>
- <exclude-pattern>*/includes/WebResponse\.php</exclude-pattern>
<exclude-pattern>*/maintenance/dumpIterator\.php</exclude-pattern>
<exclude-pattern>*/maintenance/Maintenance\.php</exclude-pattern>
<exclude-pattern>*/maintenance/findDeprecated\.php</exclude-pattern>
* SearchResult::setExtensionData argument has been changed from accepting an
array to accepting a Closure that returns the array when called.
* Class CryptRand, everything in MWCryptRand except generateHex() and function
- MediaWikiServices::getCryptRand() are deprecated, use random_bytes() to
- generate cryptographically secure random byte sequences.
+ MediaWikiServices::getInstance()->getCryptRand() are deprecated, use
+ random_bytes() to generate cryptographically secure random byte sequences.
* Parser::getConverterLanguage() is deprecated. Use ::getTargetLanguage()
instead.
* Language::markNoConversion() is deprecated. It confused readers because
* All MagicWord static methods are now deprecated. Use the MagicWordFactory
methods instead.
* PasswordFactory::init is deprecated. To get a password factory with the
- standard configuration, use MediaWikiServices::getPasswordFactory.
-* $wgContLang is deprecated, use MediaWikiServices::getContentLanguage()
+ standard configuration, use
+ MediaWikiServices::getInstance()->getPasswordFactory.
+* $wgContLang is deprecated, use
+ MediaWikiServices::getInstance()->getContentLanguage() instead.
+* $wgParser is deprecated, use MediaWikiServices::getInstance()->getParser()
instead.
-* $wgParser is deprecated, use MediaWikiServices::getParser() instead.
* wfGetMainCache() is deprecated, use ObjectCache::getLocalClusterInstance()
instead.
* wfGetCache() is deprecated, use ObjectCache::getInstance() instead.
set `$wgParserCacheType = CACHE_NONE;` instead.
* $wgCommentTableSchemaMigrationStage has been removed. Extension code finding
it unset should treat it as being MIGRATION_NEW.
+* $wgAuth – This old setting, deprecated in 1.27, has been removed as part of
+ the removal of AuthPlugin.
=== New features in 1.33 ===
* (T96041) __EXPECTUNUSEDCATEGORY__ on a category page causes the category
passed a bad code.
* ApiBase::checkTitleUserPermissions() now takes an options array as its third
parameter. Passing a User object or null is deprecated.
+* The api-feature-usage log channel now has log context. The text message is
+ deprecated and will be removed in the future.
=== Languages updated in 1.33 ===
MediaWiki supports over 350 languages. Many localisations are updated regularly.
* MessageBlobStore::__construct() now requires its $rl parameter.
* Second parameter to Sanitizer::escapeIdReferenceList() (deprecated in 1.31)
has been removed.
+* The 'jquery.xmldom' module has been removed.
+* The 'jquery.mockjax' module has been removed.
+* The 'jquery.hidpi' module, deprecated in 1.32, has been removed.
+* AuthPlugin and related code, deprecated in 1.27, has been removed. Extensions
+ should instead use AuthManager. The following no longer exist:
+ * The AuthPlugin class itself and the related AuthPluginUser class and i18n
+ * The AuthPluginSetup and AuthPluginAutoCreate hooks
+ * The transitional wrapper classes AuthPluginPrimaryAuthenticationProvider,
+ AuthManagerAuthPlugin, and AuthManagerAuthPluginUser.
+ * The $wgAuth configuration setting and its use in Setup.php and unit tests
+* (T217772) The 'wgAvailableSkins' mw.config key in JavaScript, was removed.
=== Deprecations in 1.33 ===
* The configuration option $wgUseESI has been deprecated, and is expected
Block::isCreateAccountBlocked and Block::isUsertalkEditAllowed to get and set
block properties; use Block::appliesToRight and Block::appliesToUsertalk to
check block behaviour.
+* The api-feature-usage log channel now has log context. The text message is
+ deprecated and will be removed in the future.
=== Other changes in 1.33 ===
* (T201747) Html::openElement() warns if given an element name with a space
'AttachLatest' => __DIR__ . '/maintenance/attachLatest.php',
'AugmentPageProps' => __DIR__ . '/includes/search/AugmentPageProps.php',
'AuthManagerSpecialPage' => __DIR__ . '/includes/specialpage/AuthManagerSpecialPage.php',
- 'AuthPlugin' => __DIR__ . '/includes/AuthPlugin.php',
- 'AuthPluginUser' => __DIR__ . '/includes/AuthPlugin.php',
'AutoCommitUpdate' => __DIR__ . '/includes/deferred/AutoCommitUpdate.php',
'AutoLoader' => __DIR__ . '/includes/AutoLoader.php',
'AutoloadGenerator' => __DIR__ . '/includes/utils/AutoloadGenerator.php',
'FakeResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php',
'FatalError' => __DIR__ . '/includes/exception/FatalError.php',
'FauxRequest' => __DIR__ . '/includes/FauxRequest.php',
- 'FauxResponse' => __DIR__ . '/includes/WebResponse.php',
+ 'FauxResponse' => __DIR__ . '/includes/FauxResponse.php',
'FeedItem' => __DIR__ . '/includes/Feed.php',
'FeedUtils' => __DIR__ . '/includes/FeedUtils.php',
'FetchText' => __DIR__ . '/maintenance/fetchText.php',
'MediaWiki\\Logger\\ConsoleSpi' => __DIR__ . '/includes/debug/logger/ConsoleSpi.php',
'MediaWiki\\Logger\\LegacyLogger' => __DIR__ . '/includes/debug/logger/LegacyLogger.php',
'MediaWiki\\Logger\\LegacySpi' => __DIR__ . '/includes/debug/logger/LegacySpi.php',
+ 'MediaWiki\\Logger\\LogCapturingSpi' => __DIR__ . '/includes/debug/logger/LogCapturingSpi.php',
'MediaWiki\\Logger\\LoggerFactory' => __DIR__ . '/includes/debug/logger/LoggerFactory.php',
'MediaWiki\\Logger\\MonologSpi' => __DIR__ . '/includes/debug/logger/MonologSpi.php',
'MediaWiki\\Logger\\Monolog\\AvroFormatter' => __DIR__ . '/includes/debug/logger/monolog/AvroFormatter.php',
'MediaWiki\\Widget\\TitlesMultiselectWidget' => __DIR__ . '/includes/widget/TitlesMultiselectWidget.php',
'MediaWiki\\Widget\\UserInputWidget' => __DIR__ . '/includes/widget/UserInputWidget.php',
'MediaWiki\\Widget\\UsersMultiselectWidget' => __DIR__ . '/includes/widget/UsersMultiselectWidget.php',
- 'Mediawiki\\Logger\\LogCapturingSpi' => __DIR__ . '/includes/debug/logger/LogCapturingSpi.php',
'MemcLockManager' => __DIR__ . '/includes/libs/lockmanager/MemcLockManager.php',
'MemcachedBagOStuff' => __DIR__ . '/includes/libs/objectcache/MemcachedBagOStuff.php',
'MemcachedClient' => __DIR__ . '/includes/libs/objectcache/MemcachedClient.php',
'RecentChangesUpdateJob' => __DIR__ . '/includes/jobqueue/jobs/RecentChangesUpdateJob.php',
'RecompressTracked' => __DIR__ . '/maintenance/storage/recompressTracked.php',
'RecountCategories' => __DIR__ . '/maintenance/recountCategories.php',
- 'RedirectSpecialArticle' => __DIR__ . '/includes/specialpage/RedirectSpecialPage.php',
+ 'RedirectSpecialArticle' => __DIR__ . '/includes/specialpage/RedirectSpecialArticle.php',
'RedirectSpecialPage' => __DIR__ . '/includes/specialpage/RedirectSpecialPage.php',
'RedisBagOStuff' => __DIR__ . '/includes/libs/objectcache/RedisBagOStuff.php',
'RedisConnRef' => __DIR__ . '/includes/libs/redis/RedisConnRef.php',
'SlotDiffRenderer' => __DIR__ . '/includes/diff/SlotDiffRenderer.php',
'SpecialActiveUsers' => __DIR__ . '/includes/specials/SpecialActiveusers.php',
'SpecialAllMessages' => __DIR__ . '/includes/specials/SpecialAllMessages.php',
- 'SpecialAllMyUploads' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php',
+ 'SpecialAllMyUploads' => __DIR__ . '/includes/specials/redirects/SpecialAllMyUploads.php',
'SpecialAllPages' => __DIR__ . '/includes/specials/SpecialAllPages.php',
'SpecialApiHelp' => __DIR__ . '/includes/specials/SpecialApiHelp.php',
'SpecialApiSandbox' => __DIR__ . '/includes/specials/SpecialApiSandbox.php',
'SpecialImport' => __DIR__ . '/includes/specials/SpecialImport.php',
'SpecialJavaScriptTest' => __DIR__ . '/includes/specials/SpecialJavaScriptTest.php',
'SpecialLinkAccounts' => __DIR__ . '/includes/specials/SpecialLinkAccounts.php',
- 'SpecialListAdmins' => __DIR__ . '/includes/specials/SpecialListusers.php',
- 'SpecialListBots' => __DIR__ . '/includes/specials/SpecialListusers.php',
+ 'SpecialListAdmins' => __DIR__ . '/includes/specials/redirects/SpecialListAdmins.php',
+ 'SpecialListBots' => __DIR__ . '/includes/specials/redirects/SpecialListBots.php',
'SpecialListFiles' => __DIR__ . '/includes/specials/SpecialListfiles.php',
'SpecialListGrants' => __DIR__ . '/includes/specials/SpecialListgrants.php',
'SpecialListGroupRights' => __DIR__ . '/includes/specials/SpecialListgrouprights.php',
'SpecialLog' => __DIR__ . '/includes/specials/SpecialLog.php',
'SpecialMergeHistory' => __DIR__ . '/includes/specials/SpecialMergeHistory.php',
'SpecialMyLanguage' => __DIR__ . '/includes/specials/SpecialMyLanguage.php',
- 'SpecialMycontributions' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php',
- 'SpecialMypage' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php',
- 'SpecialMytalk' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php',
- 'SpecialMyuploads' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php',
+ 'SpecialMycontributions' => __DIR__ . '/includes/specials/redirects/SpecialMycontributions.php',
+ 'SpecialMypage' => __DIR__ . '/includes/specials/redirects/SpecialMypage.php',
+ 'SpecialMytalk' => __DIR__ . '/includes/specials/redirects/SpecialMytalk.php',
+ 'SpecialMyuploads' => __DIR__ . '/includes/specials/redirects/SpecialMyuploads.php',
'SpecialNewFiles' => __DIR__ . '/includes/specials/SpecialNewimages.php',
'SpecialNewpages' => __DIR__ . '/includes/specials/SpecialNewpages.php',
'SpecialPage' => __DIR__ . '/includes/specialpage/SpecialPage.php',
'SpecialRecentChanges' => __DIR__ . '/includes/specials/SpecialRecentchanges.php',
'SpecialRecentChangesLinked' => __DIR__ . '/includes/specials/SpecialRecentchangeslinked.php',
'SpecialRedirect' => __DIR__ . '/includes/specials/SpecialRedirect.php',
- 'SpecialRedirectToSpecial' => __DIR__ . '/includes/specialpage/RedirectSpecialPage.php',
+ 'SpecialRedirectToSpecial' => __DIR__ . '/includes/specialpage/SpecialRedirectToSpecial.php',
'SpecialRemoveCredentials' => __DIR__ . '/includes/specials/SpecialRemoveCredentials.php',
'SpecialResetTokens' => __DIR__ . '/includes/specials/SpecialResetTokens.php',
'SpecialRevisionDelete' => __DIR__ . '/includes/specials/SpecialRevisiondelete.php',
added to log contexts. Fields it might include:
- appId: the application ID, only if the login was with a bot password
-'AuthPluginAutoCreate': DEPRECATED since 1.27! Use the 'LocalUserCreated' hook
-instead. Called when creating a local account for an user logged in from an
-external authentication method.
-$user: User object created locally
-
-'AuthPluginSetup': DEPRECATED since 1.27! Extensions should be updated to use
-AuthManager. Update or replace authentication plugin object ($wgAuth). Gives a
-chance for an extension to set it programmatically to a variable class.
-&$auth: the $wgAuth object, probably a stub
-
'AutopromoteCondition': Check autopromote condition for user.
$type: condition type
$args: arguments
called before.
$user: The User for which the options have been saved
+'UserSendConfirmationMail': Called just before a confirmation email is sent to
+a user. Hook handlers can modify the email that will be sent.
+$user: The User for which the confirmation email is going to be sent
+&$mail: Associative array describing the email, with the following keys:
+ - subject: Subject line of the email
+ - body: Email body. Can be a string, or an array with keys 'text' and 'html'
+ - from: User object, or null meaning $wgPasswordSender will be used
+ - replyTo: MailAddress object or null
+$info: Associative array with additional information:
+ - type: 'created' if the user's account was just created; 'set' if the user
+ set an email address when they previously didn't have one; 'changed' if
+ the user had an email address and changed it
+ - ip: The IP address from which the user set/changed their email address
+ - confirmURL: URL the user should visit to confirm their email
+ - invalidateURL: URL the user should visit to invalidate confirmURL
+ - expiration: time and date when confirmURL expires
+
'UserSetCookies': DEPRECATED since 1.27! If you're trying to replace core
session cookie handling, you want to create a subclass of
MediaWiki\Session\CookieSessionProvider instead. Otherwise, you can no longer
variables.
* Add a constructor to MyExtHooks that takes a Bar service as a parameter.
* Add a static method called newFromGlobalState() with no parameters. It should
- just return new MyExtHooks( MediaWikiServices::getBar() ).
+ just return new MyExtHooks( MediaWikiServices::getInstance()->getBar() ).
* The original static handler method onFoo( $x ) is then implemented as
self::newFromGlobalState()->doFoo( $x ).
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rdf:RDF [
+ <!ENTITY cc "http://creativecommons.org/ns#">
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#">
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#">
xmlns:rdf="&rdf;"
xmlns:rdfs="&rdfs;"
xmlns:owl="&owl;"
+ xmlns:cc="&cc;"
>
<owl:Ontology rdf:about="&mediawiki;">
<rdfs:label>MediaWiki ontology</rdfs:label>
<rdfs:comment>The ontology of MediaWiki</rdfs:comment>
+ <cc:licence rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
</owl:Ontology>
<!--
return false;
}
- $mcvalue = ObjectCache::getMainWANInstance()->get( $mckey );
+ $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+ $mcvalue = $cache->get( $mckey );
if ( $mcvalue ) {
# Check to see if the value has been invalidated
if ( $touched <= $mcvalue['timestamp'] ) {
* @return bool
*/
function storeInMemcached( $mckey, $expiry = 86400 ) {
- ObjectCache::getMainWANInstance()->set( $mckey,
+ $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+ $cache->set( $mckey,
[
'timestamp' => wfTimestampNow(),
'value' => $this->mText
- ], $expiry
+ ],
+ $expiry
);
return true;
+++ /dev/null
-<?php
-/**
- * Authentication plugin interface
- *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * https://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Authentication plugin interface. Instantiate a subclass of AuthPlugin
- * and set $wgAuth to it to authenticate against some external tool.
- *
- * The default behavior is not to do anything, and use the local user
- * database for all authentication. A subclass can require that all
- * accounts authenticate externally, or use it only as a fallback; also
- * you can transparently create internal wiki accounts the first time
- * someone logs in who can be authenticated externally.
- *
- * @deprecated since 1.27
- */
-class AuthPlugin {
- /**
- * @var string
- */
- protected $domain;
-
- /**
- * Check whether there exists a user account with the given name.
- * The name will be normalized to MediaWiki's requirements, so
- * you might need to munge it (for instance, for lowercase initial
- * letters).
- *
- * @param string $username Username.
- * @return bool
- */
- public function userExists( $username ) {
- # Override this!
- return false;
- }
-
- /**
- * Check if a username+password pair is a valid login.
- * The name will be normalized to MediaWiki's requirements, so
- * you might need to munge it (for instance, for lowercase initial
- * letters).
- *
- * @param string $username Username.
- * @param string $password User password.
- * @return bool
- */
- public function authenticate( $username, $password ) {
- # Override this!
- return false;
- }
-
- /**
- * Modify options in the login template.
- *
- * @param BaseTemplate &$template
- * @param string &$type 'signup' or 'login'. Added in 1.16.
- */
- public function modifyUITemplate( &$template, &$type ) {
- # Override this!
- $template->set( 'usedomain', false );
- }
-
- /**
- * Set the domain this plugin is supposed to use when authenticating.
- *
- * @param string $domain Authentication domain.
- */
- public function setDomain( $domain ) {
- $this->domain = $domain;
- }
-
- /**
- * Get the user's domain
- *
- * @return string
- */
- public function getDomain() {
- return $this->domain ?? 'invaliddomain';
- }
-
- /**
- * Check to see if the specific domain is a valid domain.
- *
- * @param string $domain Authentication domain.
- * @return bool
- */
- public function validDomain( $domain ) {
- # Override this!
- return true;
- }
-
- /**
- * When a user logs in, optionally fill in preferences and such.
- * For instance, you might pull the email address or real name from the
- * external user database.
- *
- * The User object is passed by reference so it can be modified; don't
- * forget the & on your function declaration.
- *
- * @deprecated since 1.26, use the UserLoggedIn hook instead. And assigning
- * a different User object to $user is no longer supported.
- * @param User &$user
- * @return bool
- */
- public function updateUser( &$user ) {
- # Override this and do something
- return true;
- }
-
- /**
- * Return true if the wiki should create a new local account automatically
- * when asked to login a user who doesn't exist locally but does in the
- * external auth database.
- *
- * If you don't automatically create accounts, you must still create
- * accounts in some way. It's not possible to authenticate without
- * a local account.
- *
- * This is just a question, and shouldn't perform any actions.
- *
- * @return bool
- */
- public function autoCreate() {
- return false;
- }
-
- /**
- * Allow a property change? Properties are the same as preferences
- * and use the same keys. 'Realname' 'Emailaddress' and 'Nickname'
- * all reference this.
- *
- * @param string $prop
- *
- * @return bool
- */
- public function allowPropChange( $prop = '' ) {
- if ( $prop == 'realname' && is_callable( [ $this, 'allowRealNameChange' ] ) ) {
- return $this->allowRealNameChange();
- } elseif ( $prop == 'emailaddress' && is_callable( [ $this, 'allowEmailChange' ] ) ) {
- return $this->allowEmailChange();
- } elseif ( $prop == 'nickname' && is_callable( [ $this, 'allowNickChange' ] ) ) {
- return $this->allowNickChange();
- } else {
- return true;
- }
- }
-
- /**
- * Can users change their passwords?
- *
- * @return bool
- */
- public function allowPasswordChange() {
- return true;
- }
-
- /**
- * Should MediaWiki store passwords in its local database?
- *
- * @return bool
- */
- public function allowSetLocalPassword() {
- return true;
- }
-
- /**
- * Set the given password in the authentication database.
- * As a special case, the password may be set to null to request
- * locking the password to an unusable value, with the expectation
- * that it will be set later through a mail reset or other method.
- *
- * Return true if successful.
- *
- * @param User $user
- * @param string $password Password.
- * @return bool
- */
- public function setPassword( $user, $password ) {
- return true;
- }
-
- /**
- * Update user information in the external authentication database.
- * Return true if successful.
- *
- * @deprecated since 1.26, use the UserSaveSettings hook instead.
- * @param User $user
- * @return bool
- */
- public function updateExternalDB( $user ) {
- return true;
- }
-
- /**
- * Update user groups in the external authentication database.
- * Return true if successful.
- *
- * @deprecated since 1.26, use the UserGroupsChanged hook instead.
- * @param User $user
- * @param array $addgroups Groups to add.
- * @param array $delgroups Groups to remove.
- * @return bool
- */
- public function updateExternalDBGroups( $user, $addgroups, $delgroups = [] ) {
- return true;
- }
-
- /**
- * Check to see if external accounts can be created.
- * Return true if external accounts can be created.
- * @return bool
- */
- public function canCreateAccounts() {
- return false;
- }
-
- /**
- * Add a user to the external authentication database.
- * Return true if successful.
- *
- * @param User $user Only the name should be assumed valid at this point
- * @param string $password
- * @param string $email
- * @param string $realname
- * @return bool
- */
- public function addUser( $user, $password, $email = '', $realname = '' ) {
- return true;
- }
-
- /**
- * Return true to prevent logins that don't authenticate here from being
- * checked against the local database's password fields.
- *
- * This is just a question, and shouldn't perform any actions.
- *
- * @return bool
- */
- public function strict() {
- return false;
- }
-
- /**
- * Check if a user should authenticate locally if the global authentication fails.
- * If either this or strict() returns true, local authentication is not used.
- *
- * @param string $username Username.
- * @return bool
- */
- public function strictUserAuth( $username ) {
- return false;
- }
-
- /**
- * When creating a user account, optionally fill in preferences and such.
- * For instance, you might pull the email address or real name from the
- * external user database.
- *
- * The User object is passed by reference so it can be modified; don't
- * forget the & on your function declaration.
- *
- * @deprecated since 1.26, use the UserLoggedIn hook instead. And assigning
- * a different User object to $user is no longer supported.
- * @param User &$user
- * @param bool $autocreate True if user is being autocreated on login
- */
- public function initUser( &$user, $autocreate = false ) {
- # Override this to do something.
- }
-
- /**
- * If you want to munge the case of an account name before the final
- * check, now is your chance.
- * @param string $username
- * @return string
- */
- public function getCanonicalName( $username ) {
- return $username;
- }
-
- /**
- * Get an instance of a User object
- *
- * @param User &$user
- *
- * @return AuthPluginUser
- */
- public function getUserInstance( User &$user ) {
- return new AuthPluginUser( $user );
- }
-
- /**
- * Get a list of domains (in HTMLForm options format) used.
- *
- * @return array
- */
- public function domainList() {
- return [];
- }
-}
-
-/**
- * @deprecated since 1.27
- */
-class AuthPluginUser {
- function __construct( $user ) {
- # Override this!
- }
-
- public function getId() {
- # Override this!
- return -1;
- }
-
- /**
- * Indicate whether the user is locked
- * @deprecated since 1.26, use the UserIsLocked hook instead.
- * @return bool
- */
- public function isLocked() {
- # Override this!
- return false;
- }
-
- /**
- * Indicate whether the user is hidden
- * @deprecated since 1.26, use the UserIsHidden hook instead.
- * @return bool
- */
- public function isHidden() {
- # Override this!
- return false;
- }
-
- /**
- * @deprecated since 1.28, use SessionManager::invalidateSessionForUser() instead.
- * @return bool
- */
- public function resetAuthToken() {
- # Override this!
- return true;
- }
-}
* created by MediaWiki rather than being stored
* in the database. Value is a string to return
* from self::getSystemBlockType().
+ * sitewide bool Disallow editing all pages and all contribution
+ * actions, except those specifically allowed by
+ * other block flags
*
* @since 1.26 accepts $options array instead of individual parameters; order
* of parameters above reflects the original order
'ORDER BY' => $this->flip[$type] ? 'cl_sortkey DESC' : 'cl_sortkey',
],
[
- 'categorylinks' => [ 'INNER JOIN', 'cl_from = page_id' ],
+ 'categorylinks' => [ 'JOIN', 'cl_from = page_id' ],
'category' => [ 'LEFT JOIN', [
'cat_title = page_title',
'page_namespace' => NS_CATEGORY
/**
* A read-only mode service which does not depend on LoadBalancer.
- * To obtain an instance, use MediaWikiServices::getConfiguredReadOnlyMode().
+ * To obtain an instance, use MediaWikiServices::getInstance()->getConfiguredReadOnlyMode().
*
* @since 1.29
*/
* 100,000 commonly used passwords. Due to the size of the list this
* is a probabilistic test.
*
+ * If you add custom checks, for Special:PasswordPolicies to display them correctly,
+ * every check should have a corresponding passwordpolicies-policy-<check> message,
+ * and every settings field other than 'value' should have a corresponding
+ * passwordpolicies-policyflag-<flag> message (<check> and <flag> are in lowercase).
+ * The check message receives the policy value as a parameter, the flag message
+ * receives the flag value (or values if it's an array).
+ *
* @since 1.26
* @see PasswordPolicyChecks
* @see User::checkPasswordValidity()
/**
* Prefix for metric names sent to $wgStatsdServer.
*
- * @see MediaWikiServices::getStatsdDataFactory
+ * @see MediaWikiServices::getInstance()->getStatsdDataFactory
* @see BufferingStatsdDataFactory
* @since 1.25
*/
*/
$wgExtensionCredits = [];
-/**
- * Authentication plugin.
- * @var $wgAuth AuthPlugin
- * @deprecated since 1.27 use $wgAuthManagerConfig instead
- */
-$wgAuth = null;
-
/**
* Global list of hooks.
*
'upload' => [
'upload' => [ 'upload' ],
'overwrite' => [ 'overwrite' ],
+ 'revert' => [ 'revert' ],
],
];
--- /dev/null
+<?php
+/**
+ * Classes used to send headers and cookies back to the user
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup HTTP
+ */
+class FauxResponse extends WebResponse {
+ private $headers;
+ private $cookies = [];
+ private $code;
+
+ /**
+ * Stores a HTTP header
+ * @param string $string Header to output
+ * @param bool $replace Replace current similar header
+ * @param null|int $http_response_code Forces the HTTP response code to the specified value.
+ */
+ public function header( $string, $replace = true, $http_response_code = null ) {
+ if ( substr( $string, 0, 5 ) == 'HTTP/' ) {
+ $parts = explode( ' ', $string, 3 );
+ $this->code = intval( $parts[1] );
+ } else {
+ list( $key, $val ) = array_map( 'trim', explode( ":", $string, 2 ) );
+
+ $key = strtoupper( $key );
+
+ if ( $replace || !isset( $this->headers[$key] ) ) {
+ $this->headers[$key] = $val;
+ }
+ }
+
+ if ( $http_response_code !== null ) {
+ $this->code = intval( $http_response_code );
+ }
+ }
+
+ /**
+ * @since 1.26
+ * @param int $code Status code
+ */
+ public function statusHeader( $code ) {
+ $this->code = intval( $code );
+ }
+
+ public function headersSent() {
+ return false;
+ }
+
+ /**
+ * @param string $key The name of the header to get (case insensitive).
+ * @return string|null The header value (if set); null otherwise.
+ */
+ public function getHeader( $key ) {
+ $key = strtoupper( $key );
+
+ return $this->headers[$key] ?? null;
+ }
+
+ /**
+ * Get the HTTP response code, null if not set
+ *
+ * @return int|null
+ */
+ public function getStatusCode() {
+ return $this->code;
+ }
+
+ /**
+ * @param string $name The name of the cookie.
+ * @param string $value The value to be stored in the cookie.
+ * @param int|null $expire Ignored in this faux subclass.
+ * @param array $options Ignored in this faux subclass.
+ */
+ public function setCookie( $name, $value, $expire = 0, $options = [] ) {
+ global $wgCookiePath, $wgCookiePrefix, $wgCookieDomain;
+ global $wgCookieSecure, $wgCookieExpiration, $wgCookieHttpOnly;
+
+ $options = array_filter( $options, function ( $a ) {
+ return $a !== null;
+ } ) + [
+ 'prefix' => $wgCookiePrefix,
+ 'domain' => $wgCookieDomain,
+ 'path' => $wgCookiePath,
+ 'secure' => $wgCookieSecure,
+ 'httpOnly' => $wgCookieHttpOnly,
+ 'raw' => false,
+ ];
+
+ if ( $expire === null ) {
+ $expire = 0; // Session cookie
+ } elseif ( $expire == 0 && $wgCookieExpiration != 0 ) {
+ $expire = time() + $wgCookieExpiration;
+ }
+
+ $this->cookies[$options['prefix'] . $name] = [
+ 'value' => (string)$value,
+ 'expire' => (int)$expire,
+ 'path' => (string)$options['path'],
+ 'domain' => (string)$options['domain'],
+ 'secure' => (bool)$options['secure'],
+ 'httpOnly' => (bool)$options['httpOnly'],
+ 'raw' => (bool)$options['raw'],
+ ];
+ }
+
+ /**
+ * @param string $name
+ * @return string|null
+ */
+ public function getCookie( $name ) {
+ if ( isset( $this->cookies[$name] ) ) {
+ return $this->cookies[$name]['value'];
+ }
+ return null;
+ }
+
+ /**
+ * @param string $name
+ * @return array|null
+ */
+ public function getCookieData( $name ) {
+ return $this->cookies[$name] ?? null;
+ }
+
+ /**
+ * @return array
+ */
+ public function getCookies() {
+ return $this->cookies;
+ }
+}
* @file
* @ingroup Feed
*/
+use MediaWiki\MediaWikiServices;
/**
* Helper functions for feeds
$purge = $wgRequest->getVal( 'action' ) === 'purge';
// Allow users with 'purge' right to clear feed caches
if ( $purge && $wgUser->isAllowed( 'purge' ) ) {
- $cache = ObjectCache::getMainWANInstance();
+ $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
$cache->delete( $timekey, 1 );
$cache->delete( $key, 1 );
}
/**
* Get a load balancer object.
*
- * @deprecated since 1.27, use MediaWikiServices::getDBLoadBalancer()
- * or MediaWikiServices::getDBLoadBalancerFactory() instead.
+ * @deprecated since 1.27, use MediaWikiServices::getInstance()->getDBLoadBalancer()
+ * or MediaWikiServices::getInstance()->getDBLoadBalancerFactory() instead.
*
* @param string|bool $wiki Wiki ID, or false for the current wiki
* @return \Wikimedia\Rdbms\LoadBalancer
/**
* Get the load balancer factory object
*
- * @deprecated since 1.27, use MediaWikiServices::getDBLoadBalancerFactory() instead.
+ * @deprecated since 1.27, use MediaWikiServices::getInstance()->getDBLoadBalancerFactory() instead.
*
* @return \Wikimedia\Rdbms\LBFactory
*/
// Prevent caching of responses with cookies (T127993)
$headers = [];
foreach ( headers_list() as $header ) {
- list( $name, $value ) = explode( ':', $header, 2 );
- $headers[strtolower( trim( $name ) )][] = trim( $value );
+ $header = explode( ':', $header, 2 );
+
+ // Note: The code below (currently) does not care about value-less headers
+ if ( isset( $header[1] ) ) {
+ $headers[ strtolower( trim( $header[0] ) ) ][] = trim( $header[1] );
+ }
}
if ( isset( $headers['set-cookie'] ) ) {
// Silly XML.
return substr( $start, 0, -1 ) . '/>';
} else {
- return "$start$contents" . self::closeElement( $element );
+ return $start . $contents . self::closeElement( $element );
}
}
if ( $isXHTML ) { // XHTML5
// XML MIME-typed markup should have an xml header.
// However a DOCTYPE is not needed.
- $ret .= "<?xml version=\"1.0\" encoding=\"UTF-8\" ?" . ">\n";
+ $ret .= "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
// Add the standard xmlns
$attribs['xmlns'] = 'http://www.w3.org/1999/xhtml';
$attribs["xmlns:$tag"] = $ns;
}
} else { // HTML5
- // DOCTYPE
$ret .= "<!DOCTYPE html>\n";
}
if ( $html !== null ) {
$text = new HtmlArmor( $html );
} else {
- $text = $html; // null
+ $text = null;
}
if ( in_array( 'known', $options, true ) ) {
/**
* Make an external link
+ *
* @since 1.16.3. $title added in 1.21
* @param string $url URL to link to
+ * @param-taint $url escapes_html
* @param string $text Text of link
+ * @param-taint $text escapes_html
* @param bool $escape Do we escape the link text?
+ * @param-taint $escape none
* @param string $linktype Type of external link. Gets added to the classes
+ * @param-taint $linktype escapes_html
* @param array $attribs Array of extra attributes to <a>
+ * @param-taint $attribs escapes_html
* @param Title|null $title Title object used for title specific link attributes
+ * @param-taint $title none
* @return string
*/
public static function makeExternalLink( $url, $text, $escape = true,
* @return bool True if this namespace either is or has a corresponding talk namespace.
*/
public static function canTalk( $index ) {
+ wfDeprecated( __METHOD__, '1.30' );
return self::hasTalkNamespace( $index );
}
/** @var array */
protected $mModules = [];
- /** @var array */
- protected $mModuleScripts = [];
-
/** @var array */
protected $mModuleStyles = [];
}
/**
- * Get the list of script-only modules to load on this page.
- *
- * @param bool $filter
- * @param string|null $position Unused
- * @return array Array of module names
- */
- public function getModuleScripts( $filter = false, $position = null ) {
- return $this->getModules( $filter, null, 'mModuleScripts',
- ResourceLoaderModule::TYPE_SCRIPTS
- );
- }
-
- /**
- * Load the scripts of one or more ResourceLoader modules, on this page.
- *
- * This method exists purely to provide the legacy behaviour of loading
- * a module's scripts in the global scope, and without dependency resolution.
- * See <https://phabricator.wikimedia.org/T188689>.
- *
- * @deprecated since 1.31 Use addModules() instead.
- * @param string|array $modules Module name (string) or array of module names
+ * @deprecated since 1.33 Use getModules() instead.
+ * @return array
*/
- public function addModuleScripts( $modules ) {
- $this->mModuleScripts = array_merge( $this->mModuleScripts, (array)$modules );
+ public function getModuleScripts() {
+ wfDeprecated( __METHOD__, '1.33' );
+ return [];
}
/**
* good tags like \<i\> will be dropped entirely.
*
* @param string|Message $name
+ * @param-taint $name tainted
+ * Phan-taint-check gets very confused by $name being either a string or a Message
*/
public function setPageTitle( $name ) {
if ( $name instanceof Message ) {
# change "<i>foo&bar</i>" to "foo&bar"
$this->setHTMLTitle(
- $this->msg( 'pagetitle' )->rawParams( Sanitizer::stripAllTags( $nameWithTags ) )
+ $this->msg( 'pagetitle' )->plaintextParams( Sanitizer::stripAllTags( $nameWithTags ) )
->inContentLanguage()
);
}
$this->mNoGallery = $parserOutput->getNoGallery();
$this->mHeadItems = array_merge( $this->mHeadItems, $parserOutput->getHeadItems() );
$this->addModules( $parserOutput->getModules() );
- $this->addModuleScripts( $parserOutput->getModuleScripts() );
$this->addModuleStyles( $parserOutput->getModuleStyles() );
$this->addJsConfigVars( $parserOutput->getJsConfigVars() );
$this->mPreventClickjacking = $this->mPreventClickjacking
$this->addParserOutputText( $parserOutput, $poOptions );
$this->addModules( $parserOutput->getModules() );
- $this->addModuleScripts( $parserOutput->getModuleScripts() );
$this->addModuleStyles( $parserOutput->getModuleStyles() );
$this->addJsConfigVars( $parserOutput->getJsConfigVars() );
$rlClient->setConfig( $this->getJSVars() );
$rlClient->setModules( $this->getModules( /*filter*/ true ) );
$rlClient->setModuleStyles( $moduleStyles );
- $rlClient->setModuleScripts( $this->getModuleScripts( /*filter*/ true ) );
$rlClient->setExemptStates( $exemptStates );
$this->rlClient = $rlClient;
}
/**
* A service class for fetching the wiki's current read-only mode.
- * To obtain an instance, use MediaWikiServices::getReadOnlyMode().
+ * To obtain an instance, use MediaWikiServices::getInstance()->getReadOnlyMode().
*
* @since 1.29
*/
*/
public static function pageJoinCond() {
wfDeprecated( __METHOD__, '1.31' );
- return [ 'INNER JOIN', [ 'page_id = rev_page' ] ];
+ return [ 'JOIN', [ 'page_id = rev_page' ] ];
}
/**
'page_is_redirect',
'page_len',
] );
- $ret['joins']['page'] = [ 'INNER JOIN', [ 'page_id = rev_page' ] ];
+ $ret['joins']['page'] = [ 'JOIN', [ 'page_id = rev_page' ] ];
}
if ( in_array( 'user', $options, true ) ) {
'old_text',
'old_flags'
] );
- $ret['joins']['text'] = [ 'INNER JOIN', [ 'rev_text_id=old_id' ] ];
+ $ret['joins']['text'] = [ 'JOIN', [ 'rev_text_id=old_id' ] ];
}
return $ret;
'content_address',
'content_model',
] );
- $ret['joins']['content'] = [ 'INNER JOIN', [ 'slot_content_id = content_id' ] ];
+ $ret['joins']['content'] = [ 'JOIN', [ 'slot_content_id = content_id' ] ];
if ( in_array( 'model', $options, true ) ) {
// Use left join to attach model name, so we still find the revision row even
// Now that variant lists may be available...
$wgRequest->interpolateTitle();
-if ( !is_object( $wgAuth ) ) {
- $wgAuth = new MediaWiki\Auth\AuthManagerAuthPlugin;
- Hooks::run( 'AuthPluginSetup', [ &$wgAuth ] );
-}
-if ( $wgAuth && !$wgAuth instanceof MediaWiki\Auth\AuthManagerAuthPlugin ) {
- MediaWiki\Auth\AuthManager::singleton()->forcePrimaryAuthenticationProviders( [
- new MediaWiki\Auth\TemporaryPasswordPrimaryAuthenticationProvider( [
- 'authoritative' => false,
- ] ),
- new MediaWiki\Auth\AuthPluginPrimaryAuthenticationProvider( $wgAuth ),
- new MediaWiki\Auth\LocalPasswordPrimaryAuthenticationProvider( [
- 'authoritative' => true,
- ] ),
- ], '$wgAuth is ' . get_class( $wgAuth ) );
-}
-
/**
* @var MediaWiki\Session\SessionId|null $wgInitialSessionId The persistent
* session ID (if any) loaded at startup
/**
* @var Parser $wgParser
- * @deprecated since 1.32, use MediaWikiServices::getParser() instead
+ * @deprecated since 1.32, use MediaWikiServices::getInstance()->getParser() instead
*/
$wgParser = new StubObject( 'wgParser', function () {
return MediaWikiServices::getInstance()->getParser();
* so that a lack of error-handling will be explicit.
*/
class Status extends StatusValue {
- /** @var callable */
+ /** @var callable|false */
public $cleanCallback = false;
/**
function __get( $name ) {
if ( $name === 'ok' ) {
return $this->isOK();
- } elseif ( $name === 'errors' ) {
+ }
+ if ( $name === 'errors' ) {
return $this->getErrors();
}
* the error messages, and one that contains the warnings, only. The returned array is
* defined as:
* [
- * 0 => object(Status) # the Status with error messages, only
+ * 0 => object(Status) # The Status with error messages, only
* 1 => object(Status) # The Status with warning messages, only
* ]
*
}
/**
- * @param string|Language|null $lang Language to use for processing
+ * @param string|Language|null|StubUserLang $lang Language to use for processing
* messages, or null to default to the user language.
- * @return Language
+ * @return Language|StubUserLang
*/
protected function languageFromParam( $lang ) {
- global $wgLang;
-
if ( $lang === null ) {
- // @todo: Use RequestContext::getMain()->getLanguage() instead
- return $wgLang;
- } elseif ( $lang instanceof Language || $lang instanceof StubUserLang ) {
+ return RequestContext::getMain()->getLanguage();
+ }
+ if ( $lang instanceof Language || $lang instanceof StubUserLang ) {
return $lang;
- } else {
- return Language::factory( $lang );
}
+ return Language::factory( $lang );
}
/**
* @param string|bool $shortContext A short enclosing context message name, to
* be used when there is a single error
* @param string|bool $longContext A long enclosing context message name, for a list
- * @param string|Language|null $lang Language to use for processing messages
+ * @param string|Language|null|StubUserLang $lang Language to use for processing messages
* @return string
*/
public function getWikiText( $shortContext = false, $longContext = false, $lang = null ) {
$lang = $this->languageFromParam( $lang );
$rawErrors = $this->getErrors();
- if ( count( $rawErrors ) == 0 ) {
+ if ( count( $rawErrors ) === 0 ) {
if ( $this->isOK() ) {
$this->fatal( 'internalerror_info',
__METHOD__ . " called for a good result, this is incorrect\n" );
}
$rawErrors = $this->getErrors(); // just added a fatal
}
- if ( count( $rawErrors ) == 1 ) {
+ if ( count( $rawErrors ) === 1 ) {
$s = $this->getErrorMessage( $rawErrors[0], $lang )->plain();
if ( $shortContext ) {
$s = wfMessage( $shortContext, $s )->inLanguage( $lang )->plain();
$lang = $this->languageFromParam( $lang );
$rawErrors = $this->getErrors();
- if ( count( $rawErrors ) == 0 ) {
+ if ( count( $rawErrors ) === 0 ) {
if ( $this->isOK() ) {
$this->fatal( 'internalerror_info',
__METHOD__ . " called for a good result, this is incorrect\n" );
}
$rawErrors = $this->getErrors(); // just added a fatal
}
- if ( count( $rawErrors ) == 1 ) {
+ if ( count( $rawErrors ) === 1 ) {
$s = $this->getErrorMessage( $rawErrors[0], $lang );
if ( $shortContext ) {
$s = wfMessage( $shortContext, $s )->inLanguage( $lang );
} elseif ( is_string( $error ) ) {
$msg = wfMessage( $error );
} else {
- throw new UnexpectedValueException( "Got " . get_class( $error ) . " for key." );
+ throw new UnexpectedValueException( 'Got ' . get_class( $error ) . ' for key.' );
}
$msg->inLanguage( $this->languageFromParam( $lang ) );
$dbr = wfGetDB( DB_MASTER );
$rows = $loadRestrictionsFromDb( $dbr );
} else {
- $cache = ObjectCache::getMainWANInstance();
+ $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
$rows = $cache->getWithSetCallback(
// Page protections always leave a new null revision
$cache->makeKey( 'page-restrictions', $id, $this->getLatestRevID() ),
return $errors ?: true;
}
- /**
- * Check if the requested move target is a valid file move target
- * @todo move this to MovePage
- * @param Title $nt Target title
- * @return array List of errors
- */
- protected function validateFileMoveOperation( $nt ) {
- global $wgUser;
-
- $errors = [];
-
- $destFile = wfLocalFile( $nt );
- $destFile->load( File::READ_LATEST );
- if ( !$wgUser->isAllowed( 'reupload-shared' )
- && !$destFile->exists() && wfFindFile( $nt )
- ) {
- $errors[] = [ 'file-exists-sharedrepo' ];
- }
-
- return $errors;
- }
-
/**
* Move a title to a new location
*
return (bool)self::$setCookies;
}
}
-
-/**
- * @ingroup HTTP
- */
-class FauxResponse extends WebResponse {
- private $headers;
- private $cookies = [];
- private $code;
-
- /**
- * Stores a HTTP header
- * @param string $string Header to output
- * @param bool $replace Replace current similar header
- * @param null|int $http_response_code Forces the HTTP response code to the specified value.
- */
- public function header( $string, $replace = true, $http_response_code = null ) {
- if ( substr( $string, 0, 5 ) == 'HTTP/' ) {
- $parts = explode( ' ', $string, 3 );
- $this->code = intval( $parts[1] );
- } else {
- list( $key, $val ) = array_map( 'trim', explode( ":", $string, 2 ) );
-
- $key = strtoupper( $key );
-
- if ( $replace || !isset( $this->headers[$key] ) ) {
- $this->headers[$key] = $val;
- }
- }
-
- if ( $http_response_code !== null ) {
- $this->code = intval( $http_response_code );
- }
- }
-
- /**
- * @since 1.26
- * @param int $code Status code
- */
- public function statusHeader( $code ) {
- $this->code = intval( $code );
- }
-
- public function headersSent() {
- return false;
- }
-
- /**
- * @param string $key The name of the header to get (case insensitive).
- * @return string|null The header value (if set); null otherwise.
- */
- public function getHeader( $key ) {
- $key = strtoupper( $key );
-
- return $this->headers[$key] ?? null;
- }
-
- /**
- * Get the HTTP response code, null if not set
- *
- * @return int|null
- */
- public function getStatusCode() {
- return $this->code;
- }
-
- /**
- * @param string $name The name of the cookie.
- * @param string $value The value to be stored in the cookie.
- * @param int|null $expire Ignored in this faux subclass.
- * @param array $options Ignored in this faux subclass.
- */
- public function setCookie( $name, $value, $expire = 0, $options = [] ) {
- global $wgCookiePath, $wgCookiePrefix, $wgCookieDomain;
- global $wgCookieSecure, $wgCookieExpiration, $wgCookieHttpOnly;
-
- $options = array_filter( $options, function ( $a ) {
- return $a !== null;
- } ) + [
- 'prefix' => $wgCookiePrefix,
- 'domain' => $wgCookieDomain,
- 'path' => $wgCookiePath,
- 'secure' => $wgCookieSecure,
- 'httpOnly' => $wgCookieHttpOnly,
- 'raw' => false,
- ];
-
- if ( $expire === null ) {
- $expire = 0; // Session cookie
- } elseif ( $expire == 0 && $wgCookieExpiration != 0 ) {
- $expire = time() + $wgCookieExpiration;
- }
-
- $this->cookies[$options['prefix'] . $name] = [
- 'value' => (string)$value,
- 'expire' => (int)$expire,
- 'path' => (string)$options['path'],
- 'domain' => (string)$options['domain'],
- 'secure' => (bool)$options['secure'],
- 'httpOnly' => (bool)$options['httpOnly'],
- 'raw' => (bool)$options['raw'],
- ];
- }
-
- /**
- * @param string $name
- * @return string|null
- */
- public function getCookie( $name ) {
- if ( isset( $this->cookies[$name] ) ) {
- return $this->cookies[$name]['value'];
- }
- return null;
- }
-
- /**
- * @param string $name
- * @return array|null
- */
- public function getCookieData( $name ) {
- return $this->cookies[$name] ?? null;
- }
-
- /**
- * @return array
- */
- public function getCookies() {
- return $this->cookies;
- }
-}
$elevatedText = $elevated ? 'by elevated ' : '';
$log = LoggerFactory::getInstance( "security" );
$log->warning(
- "Unsafe JS/CSS/Json $elevatedText" . "load - {user} loaded {title} with {ctype}",
+ "Unsafe JS/CSS/Json {$elevatedText}load - {user} loaded {title} with {ctype}",
[
'user' => $this->getUser()->getName(),
'title' => $title->getPrefixedDBKey(),
0,
false,
false,
- $this->getUser()
+ $this->getUser(),
+ [],
+ true,
+ true
);
}
$status = Status::newGood();
foreach ( $errors as $error ) {
- if ( is_array( $error ) && isset( self::$blockMsgMap[$error[0]] ) && $user->getBlock() ) {
+ if ( !is_array( $error ) ) {
+ $error = [ $error ];
+ }
+ if ( is_string( $error[0] ) && isset( self::$blockMsgMap[$error[0]] ) && $user->getBlock() ) {
list( $msg, $code ) = self::$blockMsgMap[$error[0]];
$status->fatal( ApiMessage::create( $msg, $code,
[ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
) );
} else {
- $status->fatal( ...(array)$error );
+ $status->fatal( ...$error );
}
}
return $status;
* @param string $feature Feature being used.
*/
public function logFeatureUsage( $feature ) {
+ static $loggedFeatures = [];
+
+ // Only log each feature once per request. We can get multiple calls from calls to
+ // extractRequestParams() with different values for 'parseLimit', for example.
+ if ( isset( $loggedFeatures[$feature] ) ) {
+ return;
+ }
+ $loggedFeatures[$feature] = true;
+
$request = $this->getRequest();
- $s = '"' . addslashes( $feature ) . '"' .
- ' "' . wfUrlencode( str_replace( ' ', '_', $this->getUser()->getName() ) ) . '"' .
- ' "' . $request->getIP() . '"' .
- ' "' . addslashes( $request->getHeader( 'Referer' ) ) . '"' .
- ' "' . addslashes( $this->getMain()->getUserAgent() ) . '"';
- wfDebugLog( 'api-feature-usage', $s, 'private' );
+ $ctx = [
+ 'feature' => $feature,
+ // Spaces to underscores in 'username' for historical reasons.
+ 'username' => str_replace( ' ', '_', $this->getUser()->getName() ),
+ 'ip' => $request->getIP(),
+ 'referer' => (string)$request->getHeader( 'Referer' ),
+ 'agent' => $this->getMain()->getUserAgent(),
+ ];
+
+ // Text string is deprecated. Remove (or replace with just $feature) in MW 1.34.
+ $s = '"' . addslashes( $ctx['feature'] ) . '"' .
+ ' "' . wfUrlencode( $ctx['username'] ) . '"' .
+ ' "' . $ctx['ip'] . '"' .
+ ' "' . addslashes( $ctx['referer'] ) . '"' .
+ ' "' . addslashes( $ctx['agent'] ) . '"';
+
+ wfDebugLog( 'api-feature-usage', $s, 'private', $ctx );
}
/**@}*/
}
if ( isset( $prop['modules'] ) ) {
$retval['modules'] = array_values( array_unique( $p_output->getModules() ) );
- $retval['modulescripts'] = array_values( array_unique( $p_output->getModuleScripts() ) );
+ // Deprecated since 1.32 (T188689)
+ $retval['modulescripts'] = [];
$retval['modulestyles'] = array_values( array_unique( $p_output->getModuleStyles() ) );
}
if ( isset( $prop['jsconfigvars'] ) ) {
$fauxReqArr['wlallrev'] = '';
}
- // Create the request
$fauxReq = new FauxRequest( $fauxReqArr );
- // Execute
$module = new ApiMain( $fauxReq );
$module->execute();
'html' => $out->getHTML(),
'modules' => array_values( array_unique( array_merge(
$out->getModules(),
- $out->getModuleScripts(),
$out->getModuleStyles()
) ) ),
'continue' => $this->getResult()->getResultData( 'continue' ),
return 'application/vnd.php.serialized';
}
+ /**
+ * @suppress SecurityCheck-XSS Output type is not text/html
+ */
public function execute() {
$params = $this->extractRequestParams();
$this->setupExternalResponse( $module, $params );
}
- // Execute
$module->execute();
Hooks::run( 'APIAfterExecute', [ &$module ] );
$this->reportUnusedParams();
if ( !$this->mInternalMode ) {
- // append Debug information
MWDebug::appendDebugInfoToApiResult( $this->getContext(), $this->getResult() );
- // Print result data
$this->printResult();
}
}
*/
protected function logRequest( $time, $e = null ) {
$request = $this->getRequest();
- $logCtx = [
+ $legacyLogCtx = [
'ts' => time(),
'ip' => $request->getIP(),
'userAgent' => $this->getUserAgent(),
'params' => [],
];
+ $logCtx = [
+ '$schema' => '/mediawiki/api/request/0.0.1',
+ 'meta' => [
+ 'id' => UIDGenerator::newUUIDv1(),
+ 'dt' => gmdate( 'c' ),
+ 'domain' => $this->getConfig()->get( 'ServerName' ),
+ 'stream' => 'mediawiki.api-request'
+ ],
+ 'http' => [
+ 'method' => $request->getMethod(),
+ 'client_ip' => $request->getIP(),
+ 'request_headers' => []
+ ],
+ 'database' => wfWikiID(),
+ 'backend_time_ms' => (int)round( $time * 1000 ),
+ 'params' => []
+ ];
+
+ // If set, these headers will be logged in http.request_headers.
+ // A http.request_headers entry should not be set if the header was not provided.
+ if ( $request->getHeader( 'User-agent' ) ) {
+ $logCtx['http']['request_headers']['user-agent'] = $request->getHeader( 'User-agent' );
+ }
+ if ( $request->getHeader( 'Api-user-agent' ) ) {
+ $logCtx['http']['request_headers']['api-user-agent'] = $request->getHeader( 'Api-user-agent' );
+ }
+
+ $logCtx['meta']['request_id'] =
+ $logCtx['http']['request_headers']['x-request-id'] = WebRequest::getRequestId();
+
if ( $e ) {
+ $logCtx['api_error_codes'] = [];
foreach ( $this->errorMessagesFromException( $e ) as $msg ) {
- $logCtx['errorCodes'][] = $msg->getApiCode();
+ $legacyLogCtx['errorCodes'][] = $msg->getApiCode();
+ $logCtx['api_error_codes'][] = $msg->getApiCode();
}
}
// Construct space separated message for 'api' log channel
$msg = "API {$request->getMethod()} " .
wfUrlencode( str_replace( ' ', '_', $this->getUser()->getName() ) ) .
- " {$logCtx['ip']} " .
- "T={$logCtx['timeSpentBackend']}ms";
+ " {$legacyLogCtx['ip']} " .
+ "T={$legacyLogCtx['timeSpentBackend']}ms";
$sensitive = array_flip( $this->getSensitiveParams() );
foreach ( $this->getParamsUsed() as $name ) {
$encValue = $this->encodeRequestLogValue( $value );
}
+ $legacyLogCtx['params'][$name] = $value;
$logCtx['params'][$name] = $value;
$msg .= " {$name}={$encValue}";
}
wfDebugLog( 'api', $msg, 'private' );
- // ApiAction channel is for structured data consumers
- wfDebugLog( 'ApiAction', '', 'private', $logCtx );
+ // ApiAction channel is for structured data consumers.
+ // The ApiAction was using logging channel is deprecated and is replaced
+ // by the api-request channel.
+ wfDebugLog( 'ApiAction', '', 'private', $legacyLogCtx );
+ wfDebugLog( 'api-request', '', 'private', $logCtx );
}
/**
if ( isset( $prop['modules'] ) ) {
if ( $skin ) {
$result_array['modules'] = $outputPage->getModules();
- $result_array['modulescripts'] = $outputPage->getModuleScripts();
+ // Deprecated since 1.32 (T188689)
+ $result_array['modulescripts'] = [];
$result_array['modulestyles'] = $outputPage->getModuleStyles();
} else {
$result_array['modules'] = array_values( array_unique( $p_result->getModules() ) );
- $result_array['modulescripts'] = array_values( array_unique( $p_result->getModuleScripts() ) );
+ // Deprecated since 1.32 (T188689)
+ $result_array['modulescripts'] = [];
$result_array['modulestyles'] = array_values( array_unique( $p_result->getModuleStyles() ) );
}
}
}
} elseif ( $modCacheMode === 'public' ) {
// do nothing, if it's public already it will stay public
- } else { // private
+ } else {
$cacheMode = 'private';
}
if ( !is_null( $params['tag'] ) ) {
$this->addTables( 'change_tag' );
$this->addJoinConds(
- [ 'change_tag' => [ 'INNER JOIN', [ 'ar_rev_id=ct_rev_id' ] ] ]
+ [ 'change_tag' => [ 'JOIN', [ 'ar_rev_id=ct_rev_id' ] ] ]
);
$changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
try {
if ( $needPageTable ) {
$revQuery['tables'][] = 'page';
- $revQuery['joins']['page'] = [ 'INNER JOIN', [ "$pageField = page_id" ] ];
+ $revQuery['joins']['page'] = [ 'JOIN', [ "$pageField = page_id" ] ];
if ( (bool)$miser_ns ) {
$revQuery['fields'][] = 'page_namespace';
}
$this->addTables( 'user_groups', 'ug1' );
$this->addJoinConds( [
'ug1' => [
- 'INNER JOIN',
+ 'JOIN',
[
'ug1.ug_user=user_id',
'ug1.ug_group' => $params['group'],
// There shouldn't be any duplicate rows in querycachetwo here.
$this->addTables( 'querycachetwo' );
$this->addJoinConds( [ 'querycachetwo' => [
- 'INNER JOIN', [
+ 'JOIN', [
'qcc_type' => 'activeusers',
'qcc_namespace' => NS_USER,
'qcc_title=user_name',
$limitGroups = array_unique( $limitGroups );
$this->addTables( 'user_groups' );
$this->addJoinConds( [ 'user_groups' => [
- $excludeGroups ? 'LEFT OUTER JOIN' : 'INNER JOIN',
+ $excludeGroups ? 'LEFT OUTER JOIN' : 'JOIN',
[
'ug_user=' . $revQuery['fields']['rev_user'],
'ug_group' => $limitGroups,
if ( !is_null( $params['tag'] ) ) {
$this->addTables( 'change_tag' );
$this->addJoinConds(
- [ 'change_tag' => [ 'INNER JOIN', [ 'ar_rev_id=ct_rev_id' ] ] ]
+ [ 'change_tag' => [ 'JOIN', [ 'ar_rev_id=ct_rev_id' ] ] ]
);
$changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
try {
if ( !is_null( $params['tag'] ) ) {
$this->addTables( 'change_tag' );
$this->addJoinConds(
- [ 'change_tag' => [ 'INNER JOIN', [ 'ar_rev_id=ct_rev_id' ] ] ]
+ [ 'change_tag' => [ 'JOIN', [ 'ar_rev_id=ct_rev_id' ] ] ]
);
$changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
try {
if ( !is_null( $params['tag'] ) ) {
$this->addTables( 'change_tag' );
- $this->addJoinConds( [ 'change_tag' => [ 'INNER JOIN',
+ $this->addJoinConds( [ 'change_tag' => [ 'JOIN',
[ 'log_id=ct_log_id' ] ] ] );
$changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
try {
if ( !is_null( $params['tag'] ) ) {
$this->addTables( 'change_tag' );
- $this->addJoinConds( [ 'change_tag' => [ 'INNER JOIN', [ 'rc_id=ct_rc_id' ] ] ] );
+ $this->addJoinConds( [ 'change_tag' => [ 'JOIN', [ 'rc_id=ct_rc_id' ] ] ] );
$changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
try {
$this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) );
// Always join 'page' so orphaned revisions are filtered out
$this->addTables( [ 'revision', 'page' ] );
$this->addJoinConds(
- [ 'page' => [ 'INNER JOIN', [ 'page_id = rev_page' ] ] ]
+ [ 'page' => [ 'JOIN', [ 'page_id = rev_page' ] ] ]
);
$this->addFields( [
'rev_id' => $idField, 'rev_timestamp' => $tsField, 'rev_page' => $pageField
if ( $params['tag'] !== null ) {
$this->addTables( 'change_tag' );
$this->addJoinConds(
- [ 'change_tag' => [ 'INNER JOIN', [ 'rev_id=ct_rev_id' ] ] ]
+ [ 'change_tag' => [ 'JOIN', [ 'rev_id=ct_rev_id' ] ] ]
);
$changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
try {
if ( isset( $this->params['tag'] ) ) {
$this->addTables( 'change_tag' );
$this->addJoinConds(
- [ 'change_tag' => [ 'INNER JOIN', [ $idField . ' = ct_rev_id' ] ] ]
+ [ 'change_tag' => [ 'JOIN', [ $idField . ' = ct_rev_id' ] ] ]
);
$changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
try {
}
$this->addTables( 'user_groups' );
- $this->addJoinConds( [ 'user_groups' => [ 'INNER JOIN', 'ug_user=user_id' ] ] );
+ $this->addJoinConds( [ 'user_groups' => [ 'JOIN', 'ug_user=user_id' ] ] );
$this->addFields( [ 'user_name' ] );
$this->addFields( UserGroupMembership::selectFields() );
$this->addWhere( 'ug_expiry IS NULL OR ug_expiry >= ' .
}
/**
- * Call a legacy AuthPlugin method, if necessary
+ * This used to call a legacy AuthPlugin method, if necessary. Since that code has
+ * been removed, it now just returns the $return parameter.
+ *
* @codeCoverageIgnore
* @deprecated For backwards compatibility only, should be avoided in new code
* @param string $method AuthPlugin method to call
* @return mixed Return value from the AuthPlugin method, or $return
*/
public static function callLegacyAuthPlugin( $method, array $params, $return = null ) {
- global $wgAuth;
-
- if ( $wgAuth && !$wgAuth instanceof AuthManagerAuthPlugin ) {
- return $wgAuth->$method( ...$params );
- } else {
- return $return;
- }
+ wfDeprecated( __METHOD__, '1.33' );
+ return $return;
}
/**
// Inform the providers
$this->callMethodOnProviders( 6, 'autoCreatedAccount', [ $user, $source ] );
- \Hooks::run( 'AuthPluginAutoCreate', [ $user ], '1.27' );
\Hooks::run( 'LocalUserCreated', [ $user, true ] );
$user->saveSettings();
+++ /dev/null
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-namespace MediaWiki\Auth;
-
-use Psr\Log\LoggerInterface;
-use User;
-
-/**
- * Backwards-compatibility wrapper for AuthManager via $wgAuth
- * @since 1.27
- * @deprecated since 1.27
- */
-class AuthManagerAuthPlugin extends \AuthPlugin {
- /** @var string|null */
- protected $domain = null;
-
- /** @var LoggerInterface */
- protected $logger = null;
-
- public function __construct() {
- $this->logger = \MediaWiki\Logger\LoggerFactory::getInstance( 'authentication' );
- }
-
- public function userExists( $name ) {
- return AuthManager::singleton()->userExists( $name );
- }
-
- public function authenticate( $username, $password ) {
- $data = [
- 'username' => $username,
- 'password' => $password,
- ];
- if ( $this->domain !== null && $this->domain !== '' ) {
- $data['domain'] = $this->domain;
- }
- $reqs = AuthManager::singleton()->getAuthenticationRequests( AuthManager::ACTION_LOGIN );
- $reqs = AuthenticationRequest::loadRequestsFromSubmission( $reqs, $data );
-
- $res = AuthManager::singleton()->beginAuthentication( $reqs, 'null:' );
- switch ( $res->status ) {
- case AuthenticationResponse::PASS:
- return true;
- case AuthenticationResponse::FAIL:
- // Hope it's not a PreAuthenticationProvider that failed...
- $msg = $res->message instanceof \Message ? $res->message : new \Message( $res->message );
- $this->logger->info( __METHOD__ . ': Authentication failed: ' . $msg->plain() );
- return false;
- default:
- throw new \BadMethodCallException(
- 'AuthManager does not support such simplified authentication'
- );
- }
- }
-
- public function modifyUITemplate( &$template, &$type ) {
- // AuthManager does not support direct UI screwing-around-with
- }
-
- public function setDomain( $domain ) {
- $this->domain = $domain;
- }
-
- public function getDomain() {
- return $this->domain ?? 'invaliddomain';
- }
-
- public function validDomain( $domain ) {
- $domainList = $this->domainList();
- return $domainList ? in_array( $domain, $domainList, true ) : $domain === '';
- }
-
- public function updateUser( &$user ) {
- \Hooks::run( 'UserLoggedIn', [ $user ] );
- return true;
- }
-
- public function autoCreate() {
- return true;
- }
-
- public function allowPropChange( $prop = '' ) {
- return AuthManager::singleton()->allowsPropertyChange( $prop );
- }
-
- public function allowPasswordChange() {
- $reqs = AuthManager::singleton()->getAuthenticationRequests( AuthManager::ACTION_CHANGE );
- foreach ( $reqs as $req ) {
- if ( $req instanceof PasswordAuthenticationRequest ) {
- return true;
- }
- }
-
- return false;
- }
-
- public function allowSetLocalPassword() {
- // There should be a PrimaryAuthenticationProvider that does this, if necessary
- return false;
- }
-
- public function setPassword( $user, $password ) {
- $data = [
- 'username' => $user->getName(),
- 'password' => $password,
- ];
- if ( $this->domain !== null && $this->domain !== '' ) {
- $data['domain'] = $this->domain;
- }
- $reqs = AuthManager::singleton()->getAuthenticationRequests( AuthManager::ACTION_CHANGE );
- $reqs = AuthenticationRequest::loadRequestsFromSubmission( $reqs, $data );
- foreach ( $reqs as $req ) {
- $status = AuthManager::singleton()->allowsAuthenticationDataChange( $req );
- if ( !$status->isGood() ) {
- $this->logger->info( __METHOD__ . ': Password change rejected: {reason}', [
- 'username' => $data['username'],
- 'reason' => $status->getWikiText( null, null, 'en' ),
- ] );
- return false;
- }
- }
- foreach ( $reqs as $req ) {
- AuthManager::singleton()->changeAuthenticationData( $req );
- }
- return true;
- }
-
- public function updateExternalDB( $user ) {
- // This fires the necessary hook
- $user->saveSettings();
- return true;
- }
-
- public function updateExternalDBGroups( $user, $addgroups, $delgroups = [] ) {
- throw new \BadMethodCallException(
- 'Update of user groups via AuthPlugin is not supported with AuthManager.'
- );
- }
-
- public function canCreateAccounts() {
- return AuthManager::singleton()->canCreateAccounts();
- }
-
- public function addUser( $user, $password, $email = '', $realname = '' ) {
- throw new \BadMethodCallException(
- 'Creation of users via AuthPlugin is not supported with '
- . 'AuthManager. Generally, user creation should be left to either '
- . 'Special:CreateAccount, auto-creation when triggered by a '
- . 'SessionProvider or PrimaryAuthenticationProvider, or '
- . 'User::newSystemUser().'
- );
- }
-
- public function strict() {
- // There should be a PrimaryAuthenticationProvider that does this, if necessary
- return true;
- }
-
- public function strictUserAuth( $username ) {
- // There should be a PrimaryAuthenticationProvider that does this, if necessary
- return true;
- }
-
- public function initUser( &$user, $autocreate = false ) {
- \Hooks::run( 'LocalUserCreated', [ $user, $autocreate ] );
- }
-
- public function getCanonicalName( $username ) {
- // AuthManager doesn't support restrictions beyond MediaWiki's
- return $username;
- }
-
- public function getUserInstance( User &$user ) {
- return new AuthManagerAuthPluginUser( $user );
- }
-
- public function domainList() {
- return [];
- }
-}
+++ /dev/null
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-namespace MediaWiki\Auth;
-
-use User;
-
-/**
- * @since 1.27
- * @deprecated since 1.27
- */
-class AuthManagerAuthPluginUser extends \AuthPluginUser {
- /** @var User */
- private $user;
-
- function __construct( $user ) {
- $this->user = $user;
- }
-
- public function getId() {
- return $this->user->getId();
- }
-
- public function isLocked() {
- return $this->user->isLocked();
- }
-
- public function isHidden() {
- return $this->user->isHidden();
- }
-
- public function resetAuthToken() {
- \MediaWiki\Session\SessionManager::singleton()->invalidateSessionsForUser( $this->user );
- return true;
- }
-}
+++ /dev/null
-<?php
-/**
- * Primary authentication provider wrapper for AuthPlugin
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Auth
- */
-
-namespace MediaWiki\Auth;
-
-use AuthPlugin;
-use User;
-
-/**
- * Primary authentication provider wrapper for AuthPlugin
- * @warning If anything depends on the wrapped AuthPlugin being $wgAuth, it won't work with this!
- * @ingroup Auth
- * @since 1.27
- * @deprecated since 1.27
- */
-class AuthPluginPrimaryAuthenticationProvider
- extends AbstractPasswordPrimaryAuthenticationProvider
-{
- private $auth;
- private $hasDomain;
- private $requestType = null;
-
- /**
- * @param AuthPlugin $auth AuthPlugin to wrap
- * @param string|null $requestType Class name of the
- * PasswordAuthenticationRequest to use. If $auth->domainList() returns
- * more than one domain, this must be a PasswordDomainAuthenticationRequest.
- */
- public function __construct( AuthPlugin $auth, $requestType = null ) {
- parent::__construct();
-
- if ( $auth instanceof AuthManagerAuthPlugin ) {
- throw new \InvalidArgumentException(
- 'Trying to wrap AuthManagerAuthPlugin in AuthPluginPrimaryAuthenticationProvider ' .
- 'makes no sense.'
- );
- }
-
- $need = count( $auth->domainList() ) > 1
- ? PasswordDomainAuthenticationRequest::class
- : PasswordAuthenticationRequest::class;
- if ( $requestType === null ) {
- $requestType = $need;
- } elseif ( $requestType !== $need && !is_subclass_of( $requestType, $need ) ) {
- throw new \InvalidArgumentException( "$requestType is not a $need" );
- }
-
- $this->auth = $auth;
- $this->requestType = $requestType;
- $this->hasDomain = (
- $requestType === PasswordDomainAuthenticationRequest::class ||
- is_subclass_of( $requestType, PasswordDomainAuthenticationRequest::class )
- );
- $this->authoritative = $auth->strict();
-
- // Registering hooks from core is unusual, but is needed here to be
- // able to call the AuthPlugin methods those hooks replace.
- \Hooks::register( 'UserSaveSettings', [ $this, 'onUserSaveSettings' ] );
- \Hooks::register( 'UserGroupsChanged', [ $this, 'onUserGroupsChanged' ] );
- \Hooks::register( 'UserLoggedIn', [ $this, 'onUserLoggedIn' ] );
- \Hooks::register( 'LocalUserCreated', [ $this, 'onLocalUserCreated' ] );
- }
-
- /**
- * Create an appropriate AuthenticationRequest
- * @return PasswordAuthenticationRequest
- */
- protected function makeAuthReq() {
- $class = $this->requestType;
- if ( $this->hasDomain ) {
- return new $class( $this->auth->domainList() );
- } else {
- return new $class();
- }
- }
-
- /**
- * Call $this->auth->setDomain()
- * @param PasswordAuthenticationRequest $req
- */
- protected function setDomain( $req ) {
- if ( $this->hasDomain ) {
- $domain = $req->domain;
- } else {
- // Just grab the first one.
- $domainList = $this->auth->domainList();
- $domain = reset( $domainList );
- }
-
- // Special:UserLogin does this. Strange.
- if ( !$this->auth->validDomain( $domain ) ) {
- $domain = $this->auth->getDomain();
- }
- $this->auth->setDomain( $domain );
- }
-
- /**
- * Hook function to call AuthPlugin::updateExternalDB()
- * @param User $user
- * @codeCoverageIgnore
- */
- public function onUserSaveSettings( $user ) {
- // No way to know the domain, just hope the provider handles that.
- $this->auth->updateExternalDB( $user );
- }
-
- /**
- * Hook function to call AuthPlugin::updateExternalDBGroups()
- * @param User $user
- * @param array $added
- * @param array $removed
- */
- public function onUserGroupsChanged( $user, $added, $removed ) {
- // No way to know the domain, just hope the provider handles that.
- $this->auth->updateExternalDBGroups( $user, $added, $removed );
- }
-
- /**
- * Hook function to call AuthPlugin::updateUser()
- * @param User $user
- */
- public function onUserLoggedIn( $user ) {
- $hookUser = $user;
- // No way to know the domain, just hope the provider handles that.
- $this->auth->updateUser( $hookUser );
- if ( $hookUser !== $user ) {
- throw new \UnexpectedValueException(
- get_class( $this->auth ) . '::updateUser() tried to replace $user!'
- );
- }
- }
-
- /**
- * Hook function to call AuthPlugin::initUser()
- * @param User $user
- * @param bool $autocreated
- */
- public function onLocalUserCreated( $user, $autocreated ) {
- // For $autocreated, see self::autoCreatedAccount()
- if ( !$autocreated ) {
- $hookUser = $user;
- // No way to know the domain, just hope the provider handles that.
- $this->auth->initUser( $hookUser, $autocreated );
- if ( $hookUser !== $user ) {
- throw new \UnexpectedValueException(
- get_class( $this->auth ) . '::initUser() tried to replace $user!'
- );
- }
- }
- }
-
- public function getUniqueId() {
- return parent::getUniqueId() . ':' . get_class( $this->auth );
- }
-
- public function getAuthenticationRequests( $action, array $options ) {
- switch ( $action ) {
- case AuthManager::ACTION_LOGIN:
- case AuthManager::ACTION_CREATE:
- return [ $this->makeAuthReq() ];
-
- case AuthManager::ACTION_CHANGE:
- case AuthManager::ACTION_REMOVE:
- // No way to know the domain, just hope the provider handles that.
- return $this->auth->allowPasswordChange() ? [ $this->makeAuthReq() ] : [];
-
- default:
- return [];
- }
- }
-
- public function beginPrimaryAuthentication( array $reqs ) {
- $req = AuthenticationRequest::getRequestByClass( $reqs, $this->requestType );
- if ( !$req || $req->username === null || $req->password === null ||
- ( $this->hasDomain && $req->domain === null )
- ) {
- return AuthenticationResponse::newAbstain();
- }
-
- $username = User::getCanonicalName( $req->username, 'usable' );
- if ( $username === false ) {
- return AuthenticationResponse::newAbstain();
- }
-
- $this->setDomain( $req );
- if ( $this->testUserCanAuthenticateInternal( User::newFromName( $username ) ) &&
- $this->auth->authenticate( $username, $req->password )
- ) {
- return AuthenticationResponse::newPass( $username );
- } else {
- $this->authoritative = $this->auth->strict() || $this->auth->strictUserAuth( $username );
- return $this->failResponse( $req );
- }
- }
-
- public function testUserCanAuthenticate( $username ) {
- $username = User::getCanonicalName( $username, 'usable' );
- if ( $username === false ) {
- return false;
- }
-
- // We have to check every domain, because at least LdapAuthentication
- // interprets AuthPlugin::userExists() as applying only to the current
- // domain.
- $curDomain = $this->auth->getDomain();
- $domains = $this->auth->domainList() ?: [ '' ];
- foreach ( $domains as $domain ) {
- $this->auth->setDomain( $domain );
- if ( $this->testUserCanAuthenticateInternal( User::newFromName( $username ) ) ) {
- $this->auth->setDomain( $curDomain );
- return true;
- }
- }
- $this->auth->setDomain( $curDomain );
- return false;
- }
-
- /**
- * @see self::testUserCanAuthenticate
- * @note The caller is responsible for calling $this->auth->setDomain()
- * @param User $user
- * @return bool
- */
- private function testUserCanAuthenticateInternal( $user ) {
- if ( $this->auth->userExists( $user->getName() ) ) {
- return !$this->auth->getUserInstance( $user )->isLocked();
- } else {
- return false;
- }
- }
-
- public function providerRevokeAccessForUser( $username ) {
- $username = User::getCanonicalName( $username, 'usable' );
- if ( $username === false ) {
- return;
- }
- $user = User::newFromName( $username );
- if ( $user ) {
- // Reset the password on every domain.
- $curDomain = $this->auth->getDomain();
- $domains = $this->auth->domainList() ?: [ '' ];
- $failed = [];
- foreach ( $domains as $domain ) {
- $this->auth->setDomain( $domain );
- if ( $this->testUserCanAuthenticateInternal( $user ) &&
- !$this->auth->setPassword( $user, null )
- ) {
- $failed[] = $domain === '' ? '(default)' : $domain;
- }
- }
- $this->auth->setDomain( $curDomain );
- if ( $failed ) {
- throw new \UnexpectedValueException(
- "AuthPlugin failed to reset password for $username in the following domains: "
- . implode( ' ', $failed )
- );
- }
- }
- }
-
- public function testUserExists( $username, $flags = User::READ_NORMAL ) {
- $username = User::getCanonicalName( $username, 'usable' );
- if ( $username === false ) {
- return false;
- }
-
- // We have to check every domain, because at least LdapAuthentication
- // interprets AuthPlugin::userExists() as applying only to the current
- // domain.
- $curDomain = $this->auth->getDomain();
- $domains = $this->auth->domainList() ?: [ '' ];
- foreach ( $domains as $domain ) {
- $this->auth->setDomain( $domain );
- if ( $this->auth->userExists( $username ) ) {
- $this->auth->setDomain( $curDomain );
- return true;
- }
- }
- $this->auth->setDomain( $curDomain );
- return false;
- }
-
- public function providerAllowsPropertyChange( $property ) {
- // No way to know the domain, just hope the provider handles that.
- return $this->auth->allowPropChange( $property );
- }
-
- public function providerAllowsAuthenticationDataChange(
- AuthenticationRequest $req, $checkData = true
- ) {
- if ( get_class( $req ) !== $this->requestType ) {
- return \StatusValue::newGood( 'ignored' );
- }
-
- // Hope it works, AuthPlugin gives us no way to do this.
- $curDomain = $this->auth->getDomain();
- $this->setDomain( $req );
- try {
- // If !$checkData the domain might be wrong. Nothing we can do about that.
- if ( !$this->auth->allowPasswordChange() ) {
- return \StatusValue::newFatal( 'authmanager-authplugin-setpass-denied' );
- }
-
- if ( !$checkData ) {
- return \StatusValue::newGood();
- }
-
- if ( $this->hasDomain ) {
- if ( $req->domain === null ) {
- return \StatusValue::newGood( 'ignored' );
- }
- if ( !$this->auth->validDomain( $req->domain ) ) {
- return \StatusValue::newFatal( 'authmanager-authplugin-setpass-bad-domain' );
- }
- }
-
- $username = User::getCanonicalName( $req->username, 'usable' );
- if ( $username !== false ) {
- $sv = \StatusValue::newGood();
- if ( $req->password !== null ) {
- if ( $req->password !== $req->retype ) {
- $sv->fatal( 'badretype' );
- } else {
- $sv->merge( $this->checkPasswordValidity( $username, $req->password ) );
- }
- }
- return $sv;
- } else {
- return \StatusValue::newGood( 'ignored' );
- }
- } finally {
- $this->auth->setDomain( $curDomain );
- }
- }
-
- public function providerChangeAuthenticationData( AuthenticationRequest $req ) {
- if ( get_class( $req ) === $this->requestType ) {
- $username = $req->username !== null ? User::getCanonicalName( $req->username, 'usable' ) : false;
- if ( $username === false ) {
- return;
- }
-
- if ( $this->hasDomain && $req->domain === null ) {
- return;
- }
-
- $this->setDomain( $req );
- $user = User::newFromName( $username );
- if ( !$this->auth->setPassword( $user, $req->password ) ) {
- // This is totally unfriendly and leaves other
- // AuthenticationProviders in an uncertain state, but what else
- // can we do?
- throw new \ErrorPageError(
- 'authmanager-authplugin-setpass-failed-title',
- 'authmanager-authplugin-setpass-failed-message'
- );
- }
- }
- }
-
- public function accountCreationType() {
- // No way to know the domain, just hope the provider handles that.
- return $this->auth->canCreateAccounts() ? self::TYPE_CREATE : self::TYPE_NONE;
- }
-
- public function testForAccountCreation( $user, $creator, array $reqs ) {
- return \StatusValue::newGood();
- }
-
- public function beginPrimaryAccountCreation( $user, $creator, array $reqs ) {
- if ( $this->accountCreationType() === self::TYPE_NONE ) {
- throw new \BadMethodCallException( 'Shouldn\'t call this when accountCreationType() is NONE' );
- }
-
- $req = AuthenticationRequest::getRequestByClass( $reqs, $this->requestType );
- if ( !$req || $req->username === null || $req->password === null ||
- ( $this->hasDomain && $req->domain === null )
- ) {
- return AuthenticationResponse::newAbstain();
- }
-
- $username = User::getCanonicalName( $req->username, 'usable' );
- if ( $username === false ) {
- return AuthenticationResponse::newAbstain();
- }
-
- $this->setDomain( $req );
- if ( $this->auth->addUser(
- $user, $req->password, $user->getEmail(), $user->getRealName()
- ) ) {
- return AuthenticationResponse::newPass();
- } else {
- return AuthenticationResponse::newFail(
- new \Message( 'authmanager-authplugin-create-fail' )
- );
- }
- }
-
- public function autoCreatedAccount( $user, $source ) {
- $hookUser = $user;
- // No way to know the domain, just hope the provider handles that.
- $this->auth->initUser( $hookUser, true );
- if ( $hookUser !== $user ) {
- throw new \UnexpectedValueException(
- get_class( $this->auth ) . '::initUser() tried to replace $user!'
- );
- }
- }
-}
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
public static function getType() {
return static::TYPE;
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
public static function getTypeId() {
return static::TYPE_ID;
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
public function getBlockId() {
return $this->blockId;
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
public function setBlockId( $blockId ) {
$this->blockId = (int)$blockId;
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
public function getValue() {
return $this->value;
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
public static function newFromRow( \stdClass $row ) {
return new static( $row->ir_ipb_id, $row->ir_value );
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
public function toRow() {
return [
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
public function equals( Restriction $other ) {
return $this->getHash() === $other->getHash();
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
public function getHash() {
return $this->getType() . '-' . $this->getValue();
class NamespaceRestriction extends AbstractRestriction {
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
const TYPE = 'ns';
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
const TYPE_ID = 2;
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
public function matches( \Title $title ) {
return $this->getValue() === $title->getNamespace();
class PageRestriction extends AbstractRestriction {
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
const TYPE = 'page';
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
const TYPE_ID = 1;
protected $title;
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
public function matches( \Title $title ) {
if ( !$this->getTitle() ) {
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
public static function newFromRow( \stdClass $row ) {
$restriction = parent::newFromRow( $row );
*/
use Wikimedia\Rdbms\ResultWrapper;
+use MediaWiki\MediaWikiServices;
/**
* Feed to Special:RecentChanges and Special:RecentChangesLiked
return null;
}
- $cache = ObjectCache::getMainWANInstance();
+ $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
$optionsHash = md5( serialize( $opts->getAllValues() ) ) . $wgRenderHashAppend;
$timekey = $cache->makeKey(
$this->type, $this->format, $wgLang->getCode(), $optionsHash, 'timestamp' );
* @param string $key Memcached key of the content
*/
public function saveToCache( $feed, $timekey, $key ) {
- $cache = ObjectCache::getMainWANInstance();
+ $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
$cache->set( $key, $feed, $cache::TTL_DAY );
$cache->set( $timekey, wfTimestamp( TS_MW ), $cache::TTL_DAY );
}
public function loadFromCache( $lastmod, $timekey, $key ) {
global $wgFeedCacheTimeout, $wgOut;
- $cache = ObjectCache::getMainWANInstance();
+ $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
$feedLastmod = $cache->get( $timekey );
if ( ( $wgFeedCacheTimeout > 0 ) && $feedLastmod ) {
foreach ( $sorted as $obj ) {
$title = Title::makeTitle( $obj->rc_namespace, $obj->rc_title );
- $talkpage = MWNamespace::canTalk( $obj->rc_namespace )
+ $talkpage = MWNamespace::hasTalkNamespace( $obj->rc_namespace )
? $title->getTalkPage()->getFullURL()
: '';
// Add an INNER JOIN on change_tag
$tables[] = 'change_tag';
- $join_conds['change_tag'] = [ 'INNER JOIN', $join_cond ];
+ $join_conds['change_tag'] = [ 'JOIN', $join_cond ];
$filterTagIds = [];
$changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
foreach ( (array)$filter_tag as $filterTagName ) {
}
$tagTables = [ 'change_tag', 'change_tag_def' ];
- $join_cond_ts_tags = [ 'change_tag_def' => [ 'INNER JOIN', 'ct_tag_id=ctd_id' ] ];
+ $join_cond_ts_tags = [ 'change_tag_def' => [ 'JOIN', 'ct_tag_id=ctd_id' ] ];
$field = 'ctd_name';
return wfGetDB( DB_REPLICA )->buildGroupConcatField(
$loglink = $this->list->msg( 'parentheses' )->rawParams( $loglink )->escaped();
// User links and action text
$action = $formatter->getActionText();
- // Comment
+
$comment = $this->list->getLanguage()->getDirMark() .
$formatter->getComment();
}
if ( $this->readState == 'status' ) {
$this->processStatusLine( $lines[0] );
- } else { // header
+ } else {
$this->processHeaderLine( $lines[0] );
}
$this->readBuffer = $lines[1];
protected $configs = [];
/**
- * @deprecated since 1.27, use MediaWikiServices::getConfigFactory() instead.
+ * @deprecated since 1.27, use MediaWikiServices::getInstance()->getConfigFactory() instead.
*
* @return ConfigFactory
*/
private function unserialize( $string ) {
if ( $this->encoding === 'YAML' ) {
return yaml_parse( $string );
- } else { // JSON
+ } else {
return json_decode( $string, true );
}
}
/**
* Get the database type used for read operations.
*
- * @see MediaWikiServices::getDBLoadBalancer
+ * @see MediaWikiServices::getInstance()->getDBLoadBalancer
*
* @since 1.21
*
return $this->trxLevel ? OCI_NO_AUTO_COMMIT : OCI_COMMIT_ON_SUCCESS;
}
+ /**
+ * @param string $sql
+ * @return bool|mixed|ORAResult
+ */
protected function doQuery( $sql ) {
wfDebug( "SQL: [$sql]\n" );
if ( !StringUtils::isUtf8( $sql ) ) {
<?php
-namespace Mediawiki\Logger;
+namespace MediaWiki\Logger;
use Psr\Log\AbstractLogger;
use Psr\Log\LoggerInterface;
/**
* Do any deferred updates and clear the list
*
+ * If $stage is self::ALL then the queue of PRESEND updates will be resolved,
+ * followed by the queue of POSTSEND updates
+ *
* @param string $mode Use "enqueue" to use the job queue when possible [Default: "run"]
* @param int $stage DeferredUpdates constant (PRESEND, POSTSEND, or ALL) (since 1.27)
*/
* @param array $existing
* @return array
*/
- function getPropertyDeletions( $existing ) {
+ private function getPropertyDeletions( $existing ) {
return array_diff_assoc( $existing, $this->mProperties );
}
<?php
+use MediaWiki\MediaWikiServices;
use MediaWiki\Linker\LinkTarget;
use Psr\Log\LoggerInterface;
use Wikimedia\Rdbms\IDatabase;
function doUpdate() {
$reaper = new WANObjectCacheReaper(
- ObjectCache::getMainWANInstance(),
+ MediaWikiServices::getInstance()->getMainWANObjectCache(),
ObjectCache::getLocalClusterInstance(),
[ $this, 'getTitleChangeEvents' ],
[ $this, 'getEventAffectedKeys' ],
// Cacheable?
$key = false;
- $cache = ObjectCache::getMainWANInstance();
+ $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
if ( $this->mOldid && $this->mNewid ) {
// Check if subclass is still using the old way
// for backwards-compatibility
wfHttpError( 500, 'Internal Server Error', $this->getText() );
} elseif ( self::isCommandLine() ) {
$message = $this->getText();
- // T17602: STDERR may not be available
- if ( !defined( 'MW_PHPUNIT_TEST' ) && defined( 'STDERR' ) ) {
- fwrite( STDERR, $message );
- } else {
- echo $message;
- }
+ $this->writeToCommandLine( $message );
} else {
self::statusHeader( 500 );
self::header( "Content-Type: $wgMimeType; charset=utf-8" );
}
}
+ /**
+ * Write a message to stderr falling back to stdout if stderr unavailable
+ *
+ * @param string $message
+ * @suppress SecurityCheck-XSS
+ */
+ private function writeToCommandLine( $message ) {
+ // T17602: STDERR may not be available
+ if ( !defined( 'MW_PHPUNIT_TEST' ) && defined( 'STDERR' ) ) {
+ fwrite( STDERR, $message );
+ } else {
+ echo $message;
+ }
+ }
+
/**
* Check whether we are in command line mode or not to report the exception
* in the correct format.
* Print a message, if possible to STDERR.
* Use this in command line mode only (see isCommandLine)
*
+ * @suppress SecurityCheck-XSS
* @param string $message Failure text
*/
private static function printError( $message ) {
foreach ( $res as $row ) {
$this->author_list .= "<contributor>" .
"<username>" .
- htmlentities( $row->rev_user_text ) .
+ htmlspecialchars( $row->rev_user_text ) .
"</username>" .
"<id>" .
- $row->rev_user .
+ ( (int)$row->rev_user ) .
"</id>" .
"</contributor>";
}
$opts[] = 'STRAIGHT_JOIN';
$opts['USE INDEX']['revision'] = 'rev_page_id';
unset( $join['revision'] );
- $join['page'] = [ 'INNER JOIN', 'rev_page=page_id' ];
+ $join['page'] = [ 'JOIN', 'rev_page=page_id' ];
}
} elseif ( $this->history & self::CURRENT ) {
# Latest revision dumps...
if ( $this->list_authors && $cond != '' ) { // List authors, if so desired
$this->do_list_authors( $cond );
}
- $join['revision'] = [ 'INNER JOIN', 'page_id=rev_page AND page_latest=rev_id' ];
+ $join['revision'] = [ 'JOIN', 'page_id=rev_page AND page_latest=rev_id' ];
} elseif ( $this->history & self::STABLE ) {
# "Stable" revision dumps...
# Default JOIN, to be overridden...
- $join['revision'] = [ 'INNER JOIN', 'page_id=rev_page AND page_latest=rev_id' ];
+ $join['revision'] = [ 'JOIN', 'page_id=rev_page AND page_latest=rev_id' ];
# One, and only one hook should set this, and return false
if ( Hooks::run( 'WikiExporter::dumpStableQuery', [ &$tables, &$opts, &$join ] ) ) {
throw new MWException( __METHOD__ . " given invalid history dump type." );
* (This doesn't check $user's permissions.)
* @param bool $createNullRevision Set to false to avoid creation of a null revision on file
* upload, see T193621
+ * @param bool $revert If this file upload is a revert
* @return Status On success, the value member contains the
* archive name, or an empty string if it was a new file.
*/
function upload( $src, $comment, $pageText, $flags = 0, $props = false,
$timestamp = false, $user = null, $tags = [],
- $createNullRevision = true
+ $createNullRevision = true, $revert = false
) {
if ( $this->getRepo()->getReadOnlyReason() !== false ) {
return $this->readOnlyFatalStatus();
$timestamp,
$user,
$tags,
- $createNullRevision
+ $createNullRevision,
+ $revert
);
if ( !$uploadStatus->isOK() ) {
if ( $uploadStatus->hasMessage( 'filenotfound' ) ) {
* @param string[] $tags
* @param bool $createNullRevision Set to false to avoid creation of a null revision on file
* upload, see T193621
+ * @param bool $revert If this file upload is a revert
* @return Status
*/
function recordUpload2(
$oldver, $comment, $pageText, $props = false, $timestamp = false, $user = null, $tags = [],
- $createNullRevision = true
+ $createNullRevision = true, $revert = false
) {
global $wgActorTableSchemaMigrationStage;
$wikiPage = new WikiFilePage( $descTitle );
$wikiPage->setFile( $this );
+ // Determine log action. If reupload is done by reverting, use a special log_action.
+ if ( $revert === true ) {
+ $logAction = 'revert';
+ } elseif ( $reupload === true ) {
+ $logAction = 'overwrite';
+ } else {
+ $logAction = 'upload';
+ }
// Add the log entry...
- $logEntry = new ManualLogEntry( 'upload', $reupload ? 'overwrite' : 'upload' );
+ $logEntry = new ManualLogEntry( 'upload', $logAction );
$logEntry->setTimestamp( $this->timestamp );
$logEntry->setPerformer( $user );
$logEntry->setComment( $comment );
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*
* Use whatever the relative field is as the standard HTML input.
*/
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
protected function getOOUIModules() {
return array_merge(
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
public function getInputOOUI( $value ) {
return new ExpiryInputWidget(
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
public function loadDataFromRequest( $request ) {
return $this->relativeField->loadDataFromRequest( $request );
* @return string
*/
public function parse( $text, $lineStart = false ) {
- global $wgParser;
+ $parser = MediaWikiServices::getInstance()->getParser();
try {
- $out = $wgParser->parse( $text, $this->parserTitle, $this->parserOptions, $lineStart );
+ $out = $parser->parse( $text, $this->parserTitle, $this->parserOptions, $lineStart );
$html = $out->getText( [
'enableSectionEditLinks' => false,
'unwrap' => true,
public function dirIsExecutable( $dir, $url ) {
$scriptTypes = [
'php' => [
- "<?php echo 'ex' . 'ec';",
- "#!/var/env php\n<?php echo 'ex' . 'ec';",
+ "<?php echo 'exec';",
+ "#!/var/env php\n<?php echo 'exec';",
],
];
$this->request = $request;
// Add parser hooks
- global $wgParser;
- $wgParser->setHook( 'downloadlink', [ $this, 'downloadLinkHook' ] );
- $wgParser->setHook( 'doclink', [ $this, 'docLink' ] );
+ $parser = MediaWikiServices::getInstance()->getParser();
+ $parser->setHook( 'downloadlink', [ $this, 'downloadLinkHook' ] );
+ $parser->setHook( 'doclink', [ $this, 'docLink' ] );
}
/**
"config-pcre-no-utf8": "'''Fatal''': Modul PCRE PHP tampaknya dikompilasi tanpa dukungan PCRE_UTF8.\nMediaWiki memerlukan dukungan UTF-8 untuk berfungsi dengan benar.",
"config-memory-raised": "<code>memory_limit</code> PHP adalah $1, dinaikkan ke $2.",
"config-memory-bad": "'''Peringatan:''' <code>memory_limit</code> PHP adalah $1.\nIni terlalu rendah.\nInstalasi terancam gagal!",
- "config-apc": "[https://secure.php.net/apc APC] telah diinstal",
+ "config-apc": "[https://secure.php.net/apc APC] telah dipasang",
+ "config-apcu": "[https://secure.php.net/apcu APCu] telah dipasang",
"config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] telah diinstal",
"config-no-cache-apcu": "<strong>Peringatan:</strong> Tidak dapat menemukan [https://secure.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] atau [https://www.iis.net/downloads/microsoft/wincache-extension WinCache]. Singgahan obyek tidak diaktifkan.",
"config-mod-security": "<strong>Peringatan:</strong> Server web Anda memiliki [https://modsecurity.org/ mod_security] yang diaktifkan. Jika salah dalam mengkonfigurasi, ini dapat menyebabkan masalah untuk MediaWiki atau perangkat lunak lain yang memungkinkan pengguna untuk mengirim sembarang konten.\nLihat [https://modsecurity.org/documentation/ dokumentasi mod_security] atau hubungi layanan host Anda jika Anda mengalami kesalahan acak.",
"config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] adalah sistem basis data yang ringan yang sangat baik dukungannya. ([http://www.php.net/manual/en/pdo.installation.php cara mengompilasi PHP dengan dukungan SQLite], menggunakan PDO)",
"config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] adalah basis data komersial untuk perusahaan. ([http://www.php.net/manual/en/oci8.installation.php cara mengompilasi PHP dengan dukungan OCI8])",
"config-dbsupport-mssql": "[{{int:version-db-mssql-url}} Microsoft SQL Server] adalah database perusahaan komersial untuk Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Bagaimana cara mengkompilasi PHP dengan dukungan SQLSRV])",
- "config-header-mysql": "Pengaturan MySQL",
+ "config-header-mysql": "Pengaturan MariaDB/MySQL",
"config-header-postgres": "Pengaturan PostgreSQL",
"config-header-sqlite": "Pengaturan SQLite",
"config-header-oracle": "Pengaturan Oracle",
"config-help-tooltip": "klik untuk memperluas",
"config-nofile": "Berkas \"$1\" tidak dapat ditemukan. Mungkin sudah dihapus?",
"config-extension-link": "Tahukah Anda bahwa wiki Anda mendukung [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions ekstensi]?\n\nAnda dapat menjelajahi [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category ekstensi menurut kategori] atau [https://www.mediawiki.org/wiki/Extension_Matrix Ekstensi Matriks] untuk melihat daftar lengkap ekstensi.",
+ "config-skins-screenshots": "$1 (tangkapan layar: $2)",
+ "config-extensions-requires": "$1 (memerlukan $2)",
+ "config-screenshot": "tangkapan layar",
"mainpagetext": "<strong>MediaWiki telah terpasang dengan sukses.</strong>",
"mainpagedocfooter": "Konsultasikan [https://www.mediawiki.org/wiki/Help:Contents Panduan Pengguna] untuk cara penggunaan perangkat lunak wiki ini.\n\n== Memulai ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Daftar pengaturan konfigurasi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Pertanyaan yang sering diajukan mengenai MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Pelokalan MediaWiki untuk bahasa Anda]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Belajar bagaimana menghadapi spam di wiki lokal]"
}
"config-using-32bit": "<strong>Попередження:</strong> схоже, що Ваша система працює з 32-бітними цілими числами. Таке [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit не рекомендується].",
"config-db-type": "Тип бази даних:",
"config-db-host": "Хост бази даних:",
- "config-db-host-help": "Якщо сервер бази даних знаходиться на іншому сервері, введіть тут ім'я хосту і IP адресу.\n\nЯкщо Ви використовуєте віртуальний хостинг, Ваш хостинг-провайдер має надати Вам правильне ім'я хосту у його документації.\n\nЯкщо у Вас сервер із Windows Ви використовуєте MySQL, параметр \"localhost\" може не працювати для імені сервера. Якщо не працює, використайте \"127.0.0.1\" як локальну IP-адресу.\n\nЯкщо Ви використовуєте PostgreSQL, залиште це поле пустим, щоб під'єднатись через сокет Unix.",
+ "config-db-host-help": "Якщо сервер бази даних знаходиться на іншому сервері, введіть тут ім'я хосту і IP-адресу.\n\nЯкщо Ви використовуєте спільний веб-хостинг, Ваш хостинг-провайдер має надати Вам правильне ім'я хосту у його документації.\n\nЯкщо Ви використовуєте MySQL, можливість «localhost» може не працювати для серверного імені. Якщо не працює, використайте «127.0.0.1» як локальну IP-адресу.\n\nЯкщо Ви використовуєте PostgreSQL, залиште це поле пустим, щоб під'єднатись через сокет Unix.",
"config-db-host-oracle": "TNS бази даних:",
"config-db-host-oracle-help": "Введіть допустиме [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; файл tnsnames.ora має бути видимим для цієї інсталяції. <br />Якщо Ви використовуєте бібліотеки 10g чи новіші, можна також використовувати метод іменування [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
"config-db-wiki-settings": "Ідентифікувати цю вікі",
"config-invalid-db-server-oracle": "Неприпустиме TNS бази даних \"$1\".\nВикористовуйте \"TNS Name\" або рядок \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Методи найменування Oracle])",
"config-invalid-db-name": "Неприпустима назва бази даних \"$1\".\nВикористовуйте тільки ASCII букви (a-z, A-Z), цифри (0-9), знаки підкреслення (_) і дефіси (-).",
"config-invalid-db-prefix": "Неприпустимий префікс бази даних \"$1\".\nВикористовуйте тільки ASCII букви (a-z, A-Z), цифри (0-9), знаки підкреслення (_) і дефіси (-).",
- "config-connection-error": "$1.\n\nПеревірте хост, ім'я користувача та пароль і спробуйте ще раз.",
+ "config-connection-error": "$1.\n\nПеревірте нижченаведений хост, ім'я користувача та пароль і спробуйте ще раз. Якщо Ви використовуєте «localhost» як хост бази даних, замініть його на «127.0.0.1» (або навпаки)",
"config-invalid-schema": "Неприпустима схема для MediaWiki \"$1\".\nВикористовуйте тільки ASCII букви (a-z, A-Z), цифри (0-9) і знаки підкреслення(_).",
"config-db-sys-create-oracle": "Інсталятор підтримує лише використання облікового запису SYSDBA для створення нового облікового запису.",
"config-db-sys-user-exists-oracle": "Обліковий запис користувача \"$1\" уже існує. SYSDBA використовується лише для створення новий облікових записів!",
"Fengchao",
"Duolaimi",
"A Chinese Wikipedian",
- "水獭很懒"
+ "水獭很懒",
+ "Zazzzz"
]
},
"config-desc": "MediaWiki安装程序",
"config-wincache": "已安装[https://www.iis.net/downloads/microsoft/wincache-extension WinCache]",
"config-no-cache-apcu": "<strong>警告:</strong>找不到[https://secure.php.net/apcu APCu]或[https://www.iis.net/downloads/microsoft/wincache-extension WinCache]。对象缓存未启用。",
"config-mod-security": "<strong>警告:</strong>您的web服务器已启用[https://modsecurity.org/ mod_security]/mod_security2。它的很多常见配置可能导致MediaWiki及其他软件允许用户发布任意内容的问题。如果可能,这应当被禁用。否则,当您遭遇随机错误时,请参考[https://modsecurity.org/documentation/ mod_security 文档]或联络您的主机支持。",
- "config-diff3-bad": "找不到GNU diff3。",
+ "config-diff3-bad": "找不到GNU diff3文字对比工具程序,您可以暂时忽略它,但可能会更频繁遇到编辑冲突。",
"config-git": "发现Git版本控制软件:<code>$1</code>",
- "config-git-bad": "Git版本控制软件未找到。",
+ "config-git-bad": "Git版本控制软件未找到,您可以暂时忽略他,另请注意Special:Version不会显示提交散列。",
"config-imagemagick": "已找到ImageMagick:<code>$1</code>。如果您启用了上传功能,缩略图功能也将被启用。",
"config-gd": "已找到内建的GD图形库。如果你启用了上传功能,缩略图功能也将被启用。",
"config-no-scaling": "找不到GD库或ImageMagick。缩略图功能将不可用。",
"config-db-host-oracle": "数据库透明网络底层(TNS):",
"config-db-host-oracle-help": "请输入合法的[http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm 本地连接名],并确保tnsnames.ora文件对本安装程序可见。<br />如果您使用的客户端库为10g或更新的版本,您还可以使用[http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 简单连接名方法](easy connect naming method)。",
"config-db-wiki-settings": "标识本wiki",
- "config-db-name": "数据库名称:",
+ "config-db-name": "æ\95°æ\8d®åº\93å\90\8d称ï¼\88ä¸\8d带è¿\9eå\97å\8f·ï¼\89ï¼\9a",
"config-db-name-help": "请输入一个可以标识您的wiki的名称。请勿使用空格。\n\n如果您正在使用共享web主机,您的主机提供商或会给您指定一个数据库名称,或会让您通过控制面板创建数据库。",
"config-db-name-oracle": "数据库模式:",
"config-db-account-oracle-warn": "现有三种已支持方案可以将Oracle设置为后端数据库:\n\n如果您希望在安装过程中创建数据库帐户,请为安装程序提供具有SYSDBA角色的数据库帐户,并为web访问帐户指定所需身份证明;否则您可以手动创建web访问的账户并仅须提供该帐户(确保帐户已有创建方案对象(schema object)的所需权限);或提供两个不同的帐户,其一具有创建权限,另一则被限制为web访问。\n\n具有所需权限账户的创建脚本存放于本程序的“maintenance/oracle/”目录下。请注意,使用受限制的帐户将禁用默认帐户的所有维护性功能。",
"config-db-account-lock": "在普通操作中使用相同的用户名和密码",
"config-db-wiki-account": "用于普通操作的用户帐号",
"config-db-wiki-help": "输入在普通的wiki操作中(安装完成后)将用于连接数据库的用户名和密码。如果该帐号并不存在,而安装帐号具有足够的权限,该用户帐号会被自动创建,并被赋予足以运行此wiki的最低权限。",
- "config-db-prefix": "数据库表前缀:",
+ "config-db-prefix": "æ\95°æ\8d®åº\93表å\89\8dç¼\80ï¼\88ä¸\8d带è¿\9eå\97å\8f·ï¼\89ï¼\9a",
"config-db-prefix-help": "如果您需要在多个wiki之间(或在MediaWiki与其他web应用程序之间)共享一个数据库,您可以通过添加前缀的方式来避免出现表名称的冲突。请勿使用空格。\n\n此字段通常可留空。",
"config-mysql-old": "需要MySQL $1或更新的版本,您的版本为$2。",
"config-db-port": "数据库端口:",
- "config-db-schema": "MediaWiki的数据库模式",
+ "config-db-schema": "MediaWiki的数据库模式(不带连字号)",
"config-db-schema-help": "此数据库模式通常是正确的,请在有明确需求时才改动之。",
"config-pg-test-error": "无法连接到数据库<strong>$1</strong>:$2",
"config-sqlite-dir": "SQLite数据目录:",
parent::__construct( $params );
$this->cluster = $params['cluster'] ?? false;
- $this->cache = ObjectCache::getMainWANInstance();
+ $this->cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
}
protected function supportedOrders() {
* not just purges, which can be useful for cache warming. Writes are eventually
* consistent via the Dynamo replication model. See https://github.com/Netflix/dynomite.
*
- * Broadcasted operations like delete() and touchCheckKey() are done asynchronously
- * in all datacenters this way, though the local one should likely be near immediate.
+ * Broadcasted operations like delete() and touchCheckKey() are intended to run
+ * immediately in the local datacenter and asynchronously in remote datacenters.
*
* This means that callers in all datacenters may see older values for however many
* milliseconds that the purge took to reach that datacenter. As with any cache, this
/** Tiny negative float to use when CTL comes up >= 0 due to clock skew */
const TINY_NEGATIVE = -0.000001;
+ /** Tiny positive float to use when using "minTime" to assert an inequality */
+ const TINY_POSTIVE = 0.000001;
/** Seconds of delay after get() where set() storms are a consideration with 'lockTSE' */
const SET_DELAY_HIGH_SEC = 0.1;
+ /** Min millisecond set() backoff for keys in hold-off (far less than INTERIM_KEY_TTL) */
+ const RECENT_SET_LOW_MS = 50;
+ /** Max millisecond set() backoff for keys in hold-off (far less than INTERIM_KEY_TTL) */
+ const RECENT_SET_HIGH_MS = 100;
+
+ /** Parameter to get()/getMulti() to return extra information by reference */
+ const PASS_BY_REF = -1;
/** Cache format version number */
const VERSION = 1;
const FLD_VALUE = 1; // key to the cached value
const FLD_TTL = 2; // key to the original TTL
const FLD_TIME = 3; // key to the cache time
- const FLD_FLAGS = 4; // key to the flags bitfield
+ const FLD_FLAGS = 4; // key to the flags bitfield (reserved number)
const FLD_HOLDOFF = 5; // key to any hold-off TTL
- /** @var int Treat this value as expired-on-arrival */
- const FLG_STALE = 1;
-
const ERR_NONE = 0; // no error
const ERR_NO_RESPONSE = 1; // no response
const ERR_UNREACHABLE = 2; // can't connect
* @return WANObjectCache
*/
public static function newEmpty() {
- return new static( [
- 'cache' => new EmptyBagOStuff()
- ] );
+ return new static( [ 'cache' => new EmptyBagOStuff() ] );
}
/**
* Consider using getWithSetCallback() instead of get() and set() cycles.
* That method has cache slam avoiding features for hot/expensive keys.
*
+ * Pass $info as WANObjectCache::PASS_BY_REF to transform it into a cache key info map.
+ * This map includes the following metadata:
+ * - asOf: UNIX timestamp of the value or null if the key is nonexistant
+ * - tombAsOf: UNIX timestamp of the tombstone or null if the key is not tombstoned
+ * - lastCKPurge: UNIX timestamp of the highest check key or null if none provided
+ *
+ * Othwerwise, $info will transform into the cached value timestamp.
+ *
* @param string $key Cache key made from makeKey() or makeGlobalKey()
* @param mixed|null &$curTTL Approximate TTL left on the key if present/tombstoned [returned]
* @param array $checkKeys List of "check" keys
- * @param float|null &$asOf UNIX timestamp of cached value; null on failure [returned]
+ * @param mixed|null &$info Key info if WANObjectCache::PASS_BY_REF [returned]
* @return mixed Value of cache key or false on failure
*/
- final public function get( $key, &$curTTL = null, array $checkKeys = [], &$asOf = null ) {
- $curTTLs = [];
- $asOfs = [];
- $values = $this->getMulti( [ $key ], $curTTLs, $checkKeys, $asOfs );
+ final public function get(
+ $key, &$curTTL = null, array $checkKeys = [], &$info = null
+ ) {
+ $curTTLs = self::PASS_BY_REF;
+ $infoByKey = self::PASS_BY_REF;
+ $values = $this->getMulti( [ $key ], $curTTLs, $checkKeys, $infoByKey );
$curTTL = $curTTLs[$key] ?? null;
- $asOf = $asOfs[$key] ?? null;
+ if ( $info === self::PASS_BY_REF ) {
+ $info = [
+ 'asOf' => $infoByKey[$key]['asOf'] ?? null,
+ 'tombAsOf' => $infoByKey[$key]['tombAsOf'] ?? null,
+ 'lastCKPurge' => $infoByKey[$key]['lastCKPurge'] ?? null
+ ];
+ } else {
+ $info = $infoByKey[$key]['asOf'] ?? null; // b/c
+ }
return $values[$key] ?? false;
}
/**
* Fetch the value of several keys from cache
*
+ * Pass $info as WANObjectCache::PASS_BY_REF to transform it into a map of cache keys
+ * to cache key info maps, each having the same style as those of WANObjectCache::get().
+ * All the cache keys listed in $keys will have an entry.
+ *
+ * Othwerwise, $info will transform into a map of (cache key => cached value timestamp).
+ * Only the cache keys listed in $keys that exists or are tombstoned will have an entry.
+ *
* @see WANObjectCache::get()
*
* @param array $keys List of cache keys made from makeKey() or makeGlobalKey()
- * @param array &$curTTLs Map of (key => approximate TTL left) for existing keys [returned]
+ * @param mixed|null &$curTTLs Map of (key => TTL left) for existing/tombstoned keys [returned]
* @param array $checkKeys List of check keys to apply to all $keys. May also apply "check"
* keys to specific cache keys only by using cache keys as keys in the $checkKeys array.
- * @param float[] &$asOfs Map of (key => UNIX timestamp of cached value; null on failure)
+ * @param mixed|null &$info Map of (key => info) if WANObjectCache::PASS_BY_REF [returned]
* @return array Map of (key => value) for keys that exist and are not tombstoned
*/
final public function getMulti(
- array $keys, &$curTTLs = [], array $checkKeys = [], array &$asOfs = []
+ array $keys,
+ &$curTTLs = [],
+ array $checkKeys = [],
+ &$info = null
) {
$result = [];
$curTTLs = [];
- $asOfs = [];
+ $infoByKey = [];
$vPrefixLen = strlen( self::VALUE_KEY_PREFIX );
$valueKeys = self::prefixCacheKeys( $keys, self::VALUE_KEY_PREFIX );
foreach ( $checkKeys as $i => $checkKeyGroup ) {
$prefixed = self::prefixCacheKeys( (array)$checkKeyGroup, self::TIME_KEY_PREFIX );
$checkKeysFlat = array_merge( $checkKeysFlat, $prefixed );
- // Is this check keys for a specific cache key, or for all keys being fetched?
+ // Are these check keys for a specific cache key, or for all keys being fetched?
if ( is_int( $i ) ) {
$checkKeysForAll = array_merge( $checkKeysForAll, $prefixed );
} else {
- $checkKeysByKey[$i] = isset( $checkKeysByKey[$i] )
- ? array_merge( $checkKeysByKey[$i], $prefixed )
- : $prefixed;
+ $checkKeysByKey[$i] = $prefixed;
}
}
// Get the main cache value for each key and validate them
foreach ( $valueKeys as $vKey ) {
- if ( !isset( $wrappedValues[$vKey] ) ) {
- continue; // not found
+ $key = substr( $vKey, $vPrefixLen ); // unprefix
+ list( $value, $curTTL, $asOf, $tombAsOf ) = isset( $wrappedValues[$vKey] )
+ ? $this->unwrap( $wrappedValues[$vKey], $now )
+ : [ false, null, null, null ]; // not found
+ // Force dependent keys to be seen as stale for a while after purging
+ // to reduce race conditions involving stale data getting cached
+ $purgeValues = $purgeValuesForAll;
+ if ( isset( $purgeValuesByKey[$key] ) ) {
+ $purgeValues = array_merge( $purgeValues, $purgeValuesByKey[$key] );
}
- $key = substr( $vKey, $vPrefixLen ); // unprefix
+ $lastCKPurge = null; // timestamp of the highest check key
+ foreach ( $purgeValues as $purge ) {
+ $lastCKPurge = max( $purge[self::FLD_TIME], $lastCKPurge );
+ $safeTimestamp = $purge[self::FLD_TIME] + $purge[self::FLD_HOLDOFF];
+ if ( $value !== false && $safeTimestamp >= $asOf ) {
+ // How long ago this value was invalidated by *this* check key
+ $ago = min( $purge[self::FLD_TIME] - $now, self::TINY_NEGATIVE );
+ // How long ago this value was invalidated by *any* known check key
+ $curTTL = min( $curTTL, $ago );
+ }
+ }
- list( $value, $curTTL ) = $this->unwrap( $wrappedValues[$vKey], $now );
if ( $value !== false ) {
$result[$key] = $value;
- // Force dependent keys to be seen as stale for a while after purging
- // to reduce race conditions involving stale data getting cached
- $purgeValues = $purgeValuesForAll;
- if ( isset( $purgeValuesByKey[$key] ) ) {
- $purgeValues = array_merge( $purgeValues, $purgeValuesByKey[$key] );
- }
- foreach ( $purgeValues as $purge ) {
- $safeTimestamp = $purge[self::FLD_TIME] + $purge[self::FLD_HOLDOFF];
- if ( $safeTimestamp >= $wrappedValues[$vKey][self::FLD_TIME] ) {
- // How long ago this value was invalidated by *this* check key
- $ago = min( $purge[self::FLD_TIME] - $now, self::TINY_NEGATIVE );
- // How long ago this value was invalidated by *any* known check key
- $curTTL = min( $curTTL, $ago );
- }
- }
}
- $curTTLs[$key] = $curTTL;
- $asOfs[$key] = ( $value !== false ) ? $wrappedValues[$vKey][self::FLD_TIME] : null;
+ if ( $curTTL !== null ) {
+ $curTTLs[$key] = $curTTL;
+ }
+
+ $infoByKey[$key] = ( $info === self::PASS_BY_REF )
+ ? [ 'asOf' => $asOf, 'tombAsOf' => $tombAsOf, 'lastCKPurge' => $lastCKPurge ]
+ : $asOf; // b/c
}
+ $info = $infoByKey;
+
return $result;
}
// Do not cache potentially uncommitted data as it might get rolled back
if ( !empty( $opts['pending'] ) ) {
- $this->logger->info( 'Rejected set() for {cachekey} due to pending writes.',
- [ 'cachekey' => $key ] );
+ $this->logger->info(
+ 'Rejected set() for {cachekey} due to pending writes.',
+ [ 'cachekey' => $key ]
+ );
return true; // no-op the write for being unsafe
}
- $wrapExtra = []; // additional wrapped value fields
+ $logicalTTL = null; // logical TTL override
// Check if there's a risk of writing stale data after the purge tombstone expired
if ( $lag === false || ( $lag + $age ) > self::MAX_READ_LAG ) {
- // Case A: read lag with "lockTSE"; save but record value as stale
- if ( $lockTSE >= 0 ) {
- $ttl = max( 1, (int)$lockTSE ); // set() expects seconds
- $wrapExtra[self::FLD_FLAGS] = self::FLG_STALE; // mark as stale
- // Case B: any long-running transaction; ignore this set()
- } elseif ( $age > self::MAX_READ_LAG ) {
- $this->logger->info( 'Rejected set() for {cachekey} due to snapshot lag.',
- [ 'cachekey' => $key, 'lag' => $lag, 'age' => $age ] );
-
- return true; // no-op the write for being unsafe
- // Case C: high replication lag; lower TTL instead of ignoring all set()s
+ // Case A: any long-running transaction
+ if ( $age > self::MAX_READ_LAG ) {
+ if ( $lockTSE >= 0 ) {
+ // Store value as *almost* stale to avoid cache and mutex stampedes
+ $logicalTTL = self::TTL_SECOND;
+ $this->logger->info(
+ 'Lowered set() TTL for {cachekey} due to snapshot lag.',
+ [ 'cachekey' => $key, 'lag' => $lag, 'age' => $age ]
+ );
+ } else {
+ $this->logger->info(
+ 'Rejected set() for {cachekey} due to snapshot lag.',
+ [ 'cachekey' => $key, 'lag' => $lag, 'age' => $age ]
+ );
+
+ return true; // no-op the write for being unsafe
+ }
+ // Case B: high replication lag; lower TTL instead of ignoring all set()s
} elseif ( $lag === false || $lag > self::MAX_READ_LAG ) {
- $ttl = $ttl ? min( $ttl, self::TTL_LAGGED ) : self::TTL_LAGGED;
- $this->logger->warning( 'Lowered set() TTL for {cachekey} due to replication lag.',
- [ 'cachekey' => $key, 'lag' => $lag, 'age' => $age ] );
- // Case D: medium length request with medium replication lag; ignore this set()
+ if ( $lockTSE >= 0 ) {
+ $logicalTTL = min( $ttl ?: INF, self::TTL_LAGGED );
+ } else {
+ $ttl = min( $ttl ?: INF, self::TTL_LAGGED );
+ }
+ $this->logger->warning(
+ 'Lowered set() TTL for {cachekey} due to replication lag.',
+ [ 'cachekey' => $key, 'lag' => $lag, 'age' => $age ]
+ );
+ // Case C: medium length request with medium replication lag
} else {
- $this->logger->info( 'Rejected set() for {cachekey} due to high read lag.',
- [ 'cachekey' => $key, 'lag' => $lag, 'age' => $age ] );
+ if ( $lockTSE >= 0 ) {
+ // Store value as *almost* stale to avoid cache and mutex stampedes
+ $logicalTTL = self::TTL_SECOND;
+ $this->logger->info(
+ 'Lowered set() TTL for {cachekey} due to high read lag.',
+ [ 'cachekey' => $key, 'lag' => $lag, 'age' => $age ]
+ );
+ } else {
+ $this->logger->info(
+ 'Rejected set() for {cachekey} due to high read lag.',
+ [ 'cachekey' => $key, 'lag' => $lag, 'age' => $age ]
+ );
- return true; // no-op the write for being unsafe
+ return true; // no-op the write for being unsafe
+ }
}
}
// Wrap that value with time/TTL/version metadata
- $wrapped = $this->wrap( $value, $ttl, $now ) + $wrapExtra;
+ $wrapped = $this->wrap( $value, $logicalTTL ?: $ttl, $now );
$func = function ( $cache, $key, $cWrapped ) use ( $wrapped ) {
return ( is_string( $cWrapped ) )
$popWindow = $opts['hotTTR'] ?? self::HOT_TTR;
$ageNew = $opts['ageNew'] ?? self::AGE_NEW;
$minTime = $opts['minAsOf'] ?? self::MIN_TIMESTAMP_NONE;
- $versioned = isset( $opts['version'] );
- $touchedCallback = $opts['touchedCallback'] ?? null;
+ $needsVersion = isset( $opts['version'] );
+ $touchedCb = $opts['touchedCallback'] ?? null;
$initialTime = $this->getCurrentTime();
// Get a collection name to describe this class of key
$kClass = $this->determineKeyClass( $key );
- // Get the current key value and populate $curTTL and $asOf accordingly
- $curTTL = null;
- $cValue = $this->get( $key, $curTTL, $checkKeys, $asOf ); // current value
- $value = $cValue; // return value
- // Apply additional dynamic expiration logic if supplied
- $curTTL = $this->applyTouchedCallback( $value, $asOf, $curTTL, $touchedCallback );
+ // Get the current key value
+ $curTTL = self::PASS_BY_REF;
+ $curInfo = self::PASS_BY_REF; /** @var array $curInfo */
+ $curValue = $this->get( $key, $curTTL, $checkKeys, $curInfo );
+ // Apply any $touchedCb invalidation timestamp to get the "last purge timestamp"
+ list( $curTTL, $LPT ) = $this->resolveCTL( $curValue, $curTTL, $curInfo, $touchedCb );
+ // Keep track of the best candidate value and its timestamp
+ $value = $curValue; // return value
+ $asOf = $curInfo['asOf']; // return value timestamp
// Determine if a cached value regeneration is needed or desired
if (
- $this->isValid( $value, $versioned, $asOf, $minTime ) &&
+ $this->isValid( $value, $needsVersion, $asOf, $minTime ) &&
$this->isAliveOrInGracePeriod( $curTTL, $graceTTL )
) {
$preemptiveRefresh = (
$this->stats->increment( "wanobjectcache.$kClass.hit.good" );
return $value;
- } elseif ( $this->asyncHandler ) {
- // Update the cache value later, such during post-send of an HTTP request
- $func = $this->asyncHandler;
- $func( function () use ( $key, $ttl, $callback, $opts, $asOf ) {
- $opts['minAsOf'] = INF; // force a refresh
- $this->doGetWithSetCallback( $key, $ttl, $callback, $opts, $asOf );
- } );
+ } elseif ( $this->scheduleAsyncRefresh( $key, $ttl, $callback, $opts ) ) {
$this->stats->increment( "wanobjectcache.$kClass.hit.refresh" );
return $value;
}
}
- // Only a tombstoned key yields no value yet has a (negative) "current time left"
- $isKeyTombstoned = ( $curTTL !== null && $value === false );
+ $isKeyTombstoned = ( $curInfo['tombAsOf'] !== null );
+ if ( $isKeyTombstoned ) {
+ // Get the interim key value since the key is tombstoned (write-holed)
+ list( $value, $asOf ) = $this->getInterimValue( $key, $needsVersion, $minTime );
+ // Update the "last purge time" since the $touchedCb timestamp depends on $value
+ $LPT = $this->resolveTouched( $value, $LPT, $touchedCb );
+ }
+
+ // Reduce mutex and cache set spam while keys are in the tombstone/holdoff period by
+ // checking if $value was genereated by a recent thread much less than a second ago.
+ if (
+ $this->isValid( $value, $needsVersion, $asOf, $minTime, $LPT ) &&
+ $this->isVolatileValueAgeNegligible( $initialTime - $asOf )
+ ) {
+ $this->stats->increment( "wanobjectcache.$kClass.hit.volatile" );
+
+ return $value;
+ }
+
// Decide if only one thread should handle regeneration at a time
$useMutex =
// Note that since tombstones no-op set(), $lockTSE and $curTTL cannot be used to
- // deduce the key hotness because $curTTL will always keep increasing until the
+ // deduce the key hotness because |$curTTL| will always keep increasing until the
// tombstone expires or is overwritten by a new tombstone. Also, even if $lockTSE
// is not set, constant regeneration of a key for the tombstone lifetime might be
// very expensive. Assume tombstoned keys are possibly hot in order to reduce
// the risk of high regeneration load after the delete() method is called.
$isKeyTombstoned ||
// Assume a key is hot if requested soon ($lockTSE seconds) after invalidation.
- // This avoids stampedes when timestamps from $checkKeys/$touchedCallback bump.
+ // This avoids stampedes when timestamps from $checkKeys/$touchedCb bump.
( $curTTL !== null && $curTTL <= 0 && abs( $curTTL ) <= $lockTSE ) ||
// Assume a key is hot if there is no value and a busy fallback is given.
// This avoids stampedes on eviction or preemptive regeneration taking too long.
if ( $this->cache->add( self::MUTEX_KEY_PREFIX . $key, 1, self::LOCK_TTL ) ) {
// Lock acquired; this thread will recompute the value and update cache
$hasLock = true;
- } elseif ( $this->isValid( $value, $versioned, $asOf, $minTime ) ) {
+ } elseif ( $this->isValid( $value, $needsVersion, $asOf, $minTime ) ) {
// Lock not acquired and a stale value exists; use the stale value
$this->stats->increment( "wanobjectcache.$kClass.hit.stale" );
return $value;
} else {
// Lock not acquired and no stale value exists
- if ( $isKeyTombstoned ) {
- // Use the INTERIM value from the last thread that regenerated it if possible
- $value = $this->getInterimValue( $key, $versioned, $minTime, $asOf );
- if ( $value !== false ) {
- $this->stats->increment( "wanobjectcache.$kClass.hit.volatile" );
-
- return $value;
- }
- }
-
if ( $busyValue !== null ) {
// Use the busy fallback value if nothing else
$miss = is_infinite( $minTime ) ? 'renew' : 'miss';
$setOpts = [];
++$this->callbackDepth;
try {
- $value = call_user_func_array( $callback, [ $cValue, &$ttl, &$setOpts, $asOf ] );
+ $value = call_user_func_array( $callback, [ $curValue, &$ttl, &$setOpts, $asOf ] );
} finally {
--$this->callbackDepth;
}
if ( $isKeyTombstoned ) {
if ( $this->checkAndSetCooloff( $key, $kClass, $ago, $lockTSE, $hasLock ) ) {
- // When delete() is called, writes are write-holed by the tombstone,
- // so use a special INTERIM key to pass the new value among threads.
- $tempTTL = max( self::INTERIM_KEY_TTL, (int)$lockTSE ); // set() expects seconds
- $newAsOf = $this->getCurrentTime();
- $wrapped = $this->wrap( $value, $tempTTL, $newAsOf );
- // Avoid using set() to avoid pointless mcrouter broadcasting
- $this->setInterimValue( $key, $wrapped, $tempTTL );
+ // Use the interim key value since the key is tombstoned (write-holed)
+ $tempTTL = max( self::INTERIM_KEY_TTL, (int)$lockTSE );
+ $this->setInterimValue( $key, $value, $tempTTL, $this->getCurrentTime() );
}
} elseif ( !$useMutex || $hasLock ) {
if ( $this->checkAndSetCooloff( $key, $kClass, $ago, $lockTSE, $hasLock ) ) {
}
if ( $hasLock ) {
- // Avoid using delete() to avoid pointless mcrouter broadcasting
$this->cache->changeTTL( self::MUTEX_KEY_PREFIX . $key, (int)$initialTime - 60 );
}
return $value;
}
+ /**
+ * @param float $age Age of volatile/interim key in seconds
+ * @return bool Whether the age of a volatile value is negligible
+ */
+ private function isVolatileValueAgeNegligible( $age ) {
+ return ( $age < mt_rand( self::RECENT_SET_LOW_MS, self::RECENT_SET_HIGH_MS ) / 1e3 );
+ }
+
/**
* @param string $key
* @param string $kClass
/**
* @param mixed $value
- * @param float $asOf
- * @param float $curTTL
- * @param callable|null $callback
- * @return float
+ * @param float|null $curTTL
+ * @param array $curInfo
+ * @param callable|null $touchedCallback
+ * @return array (current time left or null, UNIX timestamp of last purge or null)
+ * @note Callable type hints are not used to avoid class-autoloading
*/
- protected function applyTouchedCallback( $value, $asOf, $curTTL, $callback ) {
- if ( $callback === null ) {
- return $curTTL;
+ protected function resolveCTL( $value, $curTTL, $curInfo, $touchedCallback ) {
+ if ( $touchedCallback === null || $value === false ) {
+ return [ $curTTL, max( $curInfo['tombAsOf'], $curInfo['lastCKPurge'] ) ];
}
- if ( !is_callable( $callback ) ) {
+ if ( !is_callable( $touchedCallback ) ) {
throw new InvalidArgumentException( "Invalid expiration callback provided." );
}
- if ( $value !== false ) {
- $touched = $callback( $value );
- if ( $touched !== null && $touched >= $asOf ) {
- $curTTL = min( $curTTL, self::TINY_NEGATIVE, $asOf - $touched );
- }
+ $touched = $touchedCallback( $value );
+ if ( $touched !== null && $touched >= $curInfo['asOf'] ) {
+ $curTTL = min( $curTTL, self::TINY_NEGATIVE, $curInfo['asOf'] - $touched );
}
- return $curTTL;
+ return [ $curTTL, max( $curInfo['tombAsOf'], $curInfo['lastCKPurge'], $touched ) ];
+ }
+
+ /**
+ * @param mixed $value
+ * @param float|null $lastPurge
+ * @param callable|null $touchedCallback
+ * @return float|null UNIX timestamp of last purge or null
+ * @note Callable type hints are not used to avoid class-autoloading
+ */
+ protected function resolveTouched( $value, $lastPurge, $touchedCallback ) {
+ if ( $touchedCallback === null || $value === false ) {
+ return $lastPurge;
+ }
+
+ if ( !is_callable( $touchedCallback ) ) {
+ throw new InvalidArgumentException( "Invalid expiration callback provided." );
+ }
+
+ return max( $touchedCallback( $value ), $lastPurge );
}
/**
* @param string $key
* @param bool $versioned
* @param float $minTime
- * @param mixed &$asOf
- * @return mixed
+ * @return array (cached value or false, cached value timestamp or null)
*/
- protected function getInterimValue( $key, $versioned, $minTime, &$asOf ) {
+ protected function getInterimValue( $key, $versioned, $minTime ) {
if ( !$this->useInterimHoldOffCaching ) {
- return false; // disabled
+ return [ false, null ]; // disabled
}
$wrapped = $this->cache->get( self::INTERIM_KEY_PREFIX . $key );
list( $value ) = $this->unwrap( $wrapped, $this->getCurrentTime() );
- if ( $this->isValid( $value, $versioned, $asOf, $minTime ) ) {
- $asOf = $wrapped[self::FLD_TIME];
-
- return $value;
+ $valueAsOf = $wrapped[self::FLD_TIME] ?? null;
+ if ( $this->isValid( $value, $versioned, $valueAsOf, $minTime ) ) {
+ return [ $value, $valueAsOf ];
}
- return false;
+ return [ false, null ];
}
/**
* @param string $key
- * @param array $wrapped
+ * @param mixed $value
* @param int $tempTTL
+ * @param float $newAsOf
*/
- protected function setInterimValue( $key, $wrapped, $tempTTL ) {
+ protected function setInterimValue( $key, $value, $tempTTL, $newAsOf ) {
+ $wrapped = $this->wrap( $value, $tempTTL, $newAsOf );
+
$this->cache->merge(
self::INTERIM_KEY_PREFIX . $key,
function () use ( $wrapped ) {
return $ok;
}
+ /**
+ * @param string $key
+ * @param int $ttl
+ * @param callable $callback
+ * @param array $opts
+ * @return bool Success
+ */
+ private function scheduleAsyncRefresh( $key, $ttl, $callback, $opts ) {
+ if ( !$this->asyncHandler ) {
+ return false;
+ }
+ // Update the cache value later, such during post-send of an HTTP request
+ $func = $this->asyncHandler;
+ $func( function () use ( $key, $ttl, $callback, $opts ) {
+ $asOf = null; // unused
+ $opts['minAsOf'] = INF; // force a refresh
+ $this->doGetWithSetCallback( $key, $ttl, $callback, $opts, $asOf );
+ } );
+
+ return true;
+ }
+
/**
* Check if a key is fresh or in the grace window and thus due for randomized reuse
*
* @param bool $versioned
* @param float $asOf The time $value was generated
* @param float $minTime The last time the main value was generated (0.0 if unknown)
+ * @param float|null $purgeTime The last time the value was invalidated
* @return bool
*/
- protected function isValid( $value, $versioned, $asOf, $minTime ) {
+ protected function isValid( $value, $versioned, $asOf, $minTime, $purgeTime = null ) {
+ // Avoid reading any key not generated after the latest delete() or touch
+ $safeMinTime = max( $minTime, $purgeTime + self::TINY_POSTIVE );
+
if ( $value === false ) {
return false;
} elseif ( $versioned && !isset( $value[self::VFLD_VERSION] ) ) {
return false;
- } elseif ( $minTime > 0 && $asOf < $minTime ) {
+ } elseif ( $safeMinTime > 0 && $asOf < $minTime ) {
return false;
}
/**
* Do not use this method outside WANObjectCache
*
+ * The cached value will be false if absent/tombstoned/malformed
+ *
* @param array|string|bool $wrapped
* @param float $now Unix Current timestamp (preferrably pre-query)
- * @return array (mixed; false if absent/tombstoned/malformed, current time left)
+ * @return array (cached value or false, current TTL, value timestamp, tombstone timestamp)
*/
protected function unwrap( $wrapped, $now ) {
// Check if the value is a tombstone
if ( $purge !== false ) {
// Purged values should always have a negative current $ttl
$curTTL = min( $purge[self::FLD_TIME] - $now, self::TINY_NEGATIVE );
- return [ false, $curTTL ];
+ return [ false, $curTTL, null, $purge[self::FLD_TIME] ];
}
if ( !is_array( $wrapped ) // not found
|| !isset( $wrapped[self::FLD_VERSION] ) // wrong format
|| $wrapped[self::FLD_VERSION] !== self::VERSION // wrong version
) {
- return [ false, null ];
+ return [ false, null, null, null ];
}
- $flags = $wrapped[self::FLD_FLAGS] ?? 0;
- if ( ( $flags & self::FLG_STALE ) == self::FLG_STALE ) {
- // Treat as expired, with the cache time as the expiration
- $age = $now - $wrapped[self::FLD_TIME];
- $curTTL = min( -$age, self::TINY_NEGATIVE );
- } elseif ( $wrapped[self::FLD_TTL] > 0 ) {
+ if ( $wrapped[self::FLD_TTL] > 0 ) {
// Get the approximate time left on the key
$age = $now - $wrapped[self::FLD_TIME];
$curTTL = max( $wrapped[self::FLD_TTL] - $age, 0.0 );
if ( $wrapped[self::FLD_TIME] < $this->epoch ) {
// Values this old are ignored
- return [ false, null ];
+ return [ false, null, null, null ];
}
- return [ $wrapped[self::FLD_VALUE], $curTTL ];
+ return [ $wrapped[self::FLD_VALUE], $curTTL, $wrapped[self::FLD_TIME], null ];
}
/**
}
/**
- * Run a query and return a DBMS-dependent wrapper (that has all IResultWrapper methods)
+ * Run a query and return a DBMS-dependent wrapper or boolean
*
- * This might return things, such as mysqli_result, that do not formally implement
- * IResultWrapper, but nonetheless implement all of its methods correctly
+ * For SELECT queries, this returns either:
+ * - a) A driver-specific value/resource, only on success. This can be iterated
+ * over by calling fetchObject()/fetchRow() until there are no more rows.
+ * Alternatively, the result can be passed to resultObject() to obtain a
+ * ResultWrapper instance which can then be iterated over via "foreach".
+ * - b) False, on any query failure
*
- * @param string $sql SQL query.
- * @return IResultWrapper|bool Iterator to feed to fetchObject/fetchRow; false on failure
+ * For non-SELECT queries, this returns either:
+ * - a) A driver-specific value/resource, only on success
+ * - b) True, only on success (e.g. no meaningful result other than "OK")
+ * - c) False, on any query failure
+ *
+ * @param string $sql SQL query
+ * @return mixed|bool An object, resource, or true on success; false on failure
*/
abstract protected function doQuery( $sql );
/**
* @param string $sql
* @return bool|MssqlResultWrapper|resource
- * @throws DBUnexpectedError
*/
protected function doQuery( $sql ) {
// several extensions seem to think that all databases support limits
class DatabaseMysqli extends DatabaseMysqlBase {
/**
* @param string $sql
- * @return mysqli_result
+ * @return mysqli_result|bool
*/
protected function doQuery( $sql ) {
$conn = $this->getBindingHandle();
!preg_match( '/^SELECT\s+pg_(try_|)advisory_\w+\(/', $sql );
}
+ /**
+ * @param string $sql
+ * @return bool|mixed|resource
+ */
public function doQuery( $sql ) {
$conn = $this->getBindingHandle();
return true;
}
+ protected function makeUpdateOptionsArray( $options ) {
+ if ( !is_array( $options ) ) {
+ $options = [ $options ];
+ }
+
+ // PostgreSQL doesn't support anything like "ignore" for
+ // UPDATE.
+ $options = array_diff( $options, [ 'IGNORE' ] );
+
+ return parent::makeUpdateOptionsArray( $options );
+ }
+
/**
* INSERT SELECT wrapper
* $varMap must be an associative array of the form [ 'dest1' => 'source1', ... ]
}
}
- /**
- * @param IDatabase $conn
- * @param DBMasterPos|bool $pos
- * @param int|null $timeout
- * @return bool
- */
public function safeWaitForMasterPos( IDatabase $conn, $pos = false, $timeout = null ) {
$timeout = max( 1, $timeout ?: $this->waitTimeout );
$pos = $masterConn->getMasterPos();
} else {
$masterConn = $this->openConnection( $this->getWriterIndex(), self::DOMAIN_ANY );
+ if ( !$masterConn ) {
+ throw new DBReplicationWaitError(
+ null,
+ "Could not obtain a master database connection to get the position"
+ );
+ }
$pos = $masterConn->getMasterPos();
$this->closeConnection( $masterConn );
}
use InvalidArgumentException;
/**
- * Trivial LoadBalancer that always returns an injected connection handle
+ * Trivial LoadBalancer that always returns an injected connection handle.
+ *
+ * Note that, while this LoadBalancer does not open any connections itself,
+ * it still closes the injected connection at times, including during destruction.
+ * It is therefore unsuitable for use in tests unless you have a Database instance
+ * separate from the main test database (which is expected to stay open).
*/
class LoadBalancerSingle extends LoadBalancer {
/** @var IDatabase */
'trxProfiler' => $params['trxProfiler'] ?? null,
'srvCache' => $params['srvCache'] ?? null,
'wanCache' => $params['wanCache'] ?? null,
- 'localDomain' => $params['localDomain'] ?? $this->db->getDomainID()
+ 'localDomain' => $params['localDomain'] ?? $this->db->getDomainID(),
+ 'readOnlyReason' => $params['readOnlyReason'] ?? false,
] );
if ( isset( $params['readOnlyReason'] ) ) {
protected $pool;
/** @var Redis */
protected $conn;
-
- protected $server; // string
- protected $lastError; // string
+ /** @var string */
+ protected $server;
+ /** @var string|null */
+ protected $lastError;
/**
* @var LoggerInterface
/** @var int A rev id associated to the log entry */
protected $revId = 0;
- /** @var array Change tags add to the log entry */
- protected $tags = null;
+ /** @var string[] Change tags add to the log entry */
+ protected $tags = [];
/** @var int Deletion state of the log entry */
protected $deleted;
/**
* Set change tags for the log entry.
*
+ * Passing `null` means the same as empty array,
+ * for compatibility with WikiPage::doUpdateRestrictions().
+ *
* @since 1.27
- * @param string|string[] $tags
+ * @param string|string[]|null $tags
*/
public function setTags( $tags ) {
- if ( is_string( $tags ) ) {
+ if ( $tags === null ) {
+ $tags = [];
+ } elseif ( is_string( $tags ) ) {
$tags = [ $tags ];
}
$this->tags = $tags;
if ( $to === 'rc' || $to === 'rcandudp' ) {
// save RC, passing tags so they are applied there
- $tags = $this->getTags();
- if ( is_null( $tags ) ) {
- $tags = [];
- }
- $rc->addTags( $tags );
+ $rc->addTags( $this->getTags() );
$rc->save( $rc::SEND_NONE );
}
/**
* @since 1.27
- * @return array
+ * @return string[]
*/
public function getTags() {
return $this->tags;
->rawParams( $target )->inContentLanguage()->escaped();
break;
case 'overwrite':
+ case 'revert':
$text = wfMessage( 'overwroteimage' )
->rawParams( $target )->inContentLanguage()->escaped();
break;
}
}
# Don't show duplicate rows when using log_search
- $joins['log_search'] = [ 'INNER JOIN', 'ls_log_id=log_id' ];
+ $joins['log_search'] = [ 'JOIN', 'ls_log_id=log_id' ];
$info = [
'tables' => $tables,
* @file
* @ingroup Media
*/
+use MediaWiki\MediaWikiServices;
/**
* Handler for DjVu images
}
protected function getDimensionInfo( File $file ) {
- $cache = ObjectCache::getMainWANInstance();
+ $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
return $cache->getWithSetCallback(
$cache->makeKey( 'file-djvu', 'dimensions', $file->getSha1() ),
$cache::TTL_INDEFINITE,
$val = substr( $this->mFilteredExifData[$prop], 8 );
switch ( $charCode ) {
- case "\x4A\x49\x53\x00\x00\x00\x00\x00":
- // JIS
+ case "JIS\x00\x00\x00\x00\x00":
$charset = "Shift-JIS";
break;
case "UNICODE\x00":
if ( $wgPriorityHints
&& !self::$firstNonIconImageRendered
&& $this->width * $this->height > 100 * 100 ) {
- self::$firstBigImageRendered = true;
+ self::$firstNonIconImageRendered = true;
$attribs['importance'] = 'high';
}
*
* @since 1.26
* @return WANObjectCache
- * @deprecated Since 1.28 Use MediaWikiServices::getMainWANObjectCache()
+ * @deprecated Since 1.28 Use MediaWikiServices::getInstance()->getMainWANObjectCache()
*/
public static function getMainWANInstance() {
return MediaWikiServices::getInstance()->getMainWANObjectCache();
*
* @return BagOStuff
* @since 1.26
- * @deprecated Since 1.28 Use MediaWikiServices::getMainObjectStash
+ * @deprecated Since 1.28 Use MediaWikiServices::getInstance()->getMainObjectStash()
*/
public static function getMainStashInstance() {
return MediaWikiServices::getInstance()->getMainObjectStash();
*
* @todo Move and rewrite code to an Action class
*
- * See design.txt for an overview.
* Note: edit user interface and cache support functions have been
* moved to separate EditPage and HTMLFileCache classes.
*/
$row .= "<td $selected style='white-space: nowrap;'>";
if ( !$file->userCan( File::DELETED_FILE, $user ) ) {
# Don't link to unviewable files
- $row .= '<span class="history-deleted">'
- . $lang->userTimeAndDate( $timestamp, $user ) . '</span>';
+ $row .= Html::element( 'span', [ 'class' => 'history-deleted' ],
+ $lang->userTimeAndDate( $timestamp, $user )
+ );
} elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
+ $timeAndDate = htmlspecialchars( $lang->userTimeAndDate( $timestamp, $user ) );
if ( $local ) {
$this->preventClickjacking();
$revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
# Make a link to review the image
$url = Linker::linkKnown(
$revdel,
- $lang->userTimeAndDate( $timestamp, $user ),
+ $timeAndDate,
[],
[
'target' => $this->title->getPrefixedText(),
]
);
} else {
- $url = $lang->userTimeAndDate( $timestamp, $user );
+ $url = $timeAndDate;
}
$row .= '<span class="history-deleted">' . $url . '</span>';
} elseif ( !$file->exists() ) {
- $row .= '<span class="mw-file-missing">'
- . $lang->userTimeAndDate( $timestamp, $user ) . '</span>';
+ $row .= Html::element( 'span', [ 'class' => 'mw-file-missing' ],
+ $lang->userTimeAndDate( $timestamp, $user )
+ );
} else {
$url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
$row .= Xml::element(
$row .= '<td><span class="history-deleted">' .
$this->msg( 'rev-deleted-comment' )->escaped() . '</span></td>';
} else {
- $row .=
- '<td dir="' . MediaWikiServices::getInstance()->getContentLanguage()->getDir() .
- '">' . Linker::formatComment( $description, $this->title ) . '</td>';
+ $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+ $row .= Html::rawElement(
+ 'td',
+ [ 'dir' => $contLang->getDir() ],
+ Linker::formatComment( $description, $this->title )
+ );
}
$rowClass = null;
],
__METHOD__,
[],
- [ 'categorylinks' => [ 'INNER JOIN', 'page_id = cl_from' ] ]
+ [ 'categorylinks' => [ 'JOIN', 'page_id = cl_from' ] ]
);
return TitleArray::newFromResult( $res );
*/
public function getContentModel() {
if ( $this->exists() ) {
- $cache = ObjectCache::getMainWANInstance();
+ $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
return $cache->getWithSetCallback(
$cache->makeKey( 'page-content-model', $this->getLatest() ),
const DIR_ASCENDING = false;
const DIR_DESCENDING = true;
+ /** @var WebRequest */
public $mRequest;
+ /** @var int[] List of default entry limit options to be presented to clients */
public $mLimitsShown = [ 20, 50, 100, 250, 500 ];
+ /** @var int The default entry limit choosen for clients */
public $mDefaultLimit = 50;
- public $mOffset, $mLimit;
+ /** @var string|int The starting point to enumerate entries */
+ public $mOffset;
+ /** @var int The maximum number of entries to show */
+ public $mLimit;
+ /** @var bool Whether the listing query completed */
public $mQueryDone = false;
/** @var IDatabase */
public $mDb;
+ /** @var stdClass|null Extra row fetched at the end to see if the end was reached */
public $mPastTheEndRow;
/**
protected $mOrderType;
/**
* $mDefaultDirection gives the direction to use when sorting results:
- * DIR_ASCENDING or DIR_DESCENDING. If $mIsBackwards is set, we
- * start from the opposite end, but we still sort the page itself according
- * to $mDefaultDirection. E.g., if $mDefaultDirection is false but we're
- * going backwards, we'll display the last page of results, but the last
- * result will be at the bottom, not the top.
+ * DIR_ASCENDING or DIR_DESCENDING. If $mIsBackwards is set, we start from
+ * the opposite end, but we still sort the page itself according to
+ * $mDefaultDirection. For example, if $mDefaultDirection is DIR_ASCENDING
+ * but we're going backwards, we'll display the last page of results, but
+ * the last result will be at the bottom, not the top.
*
* Like $mIndexField, $mDefaultDirection will be a single value even if the
* class supports multiple default directions for different order types.
$fname = __METHOD__ . ' (' . static::class . ')';
$section = Profiler::instance()->scopedProfileIn( $fname );
- // @todo This should probably compare to DIR_DESCENDING and DIR_ASCENDING constants
- $descending = ( $this->mIsBackwards == $this->mDefaultDirection );
+ $descending = $this->mIsBackwards
+ ? ( $this->mDefaultDirection === self::DIR_DESCENDING )
+ : ( $this->mDefaultDirection === self::DIR_ASCENDING );
+
# Plus an extra row so that we can tell the "next" link should be shown
$queryLimit = $this->mLimit + 1;
$username = trim( $username );
- // default
$gender = User::getDefaultOption( 'gender' );
// allow prefix and normalize (e.g. "*foo" -> "*foo" ).
$matches = [];
$taglist = implode( '|', $elements );
- $start = "/<($taglist)(\\s+[^>]*?|\\s*?)(\/?" . ">)|<(!--)/i";
+ $start = "/<($taglist)(\\s+[^>]*?|\\s*?)(\/?>)|<(!--)/i";
while ( $text != '' ) {
$p = preg_split( $start, $text, 2, PREG_SPLIT_DELIM_CAPTURE );
*/
public $mModules = [];
- /**
- * @var array $mModuleScripts Modules of which only the JS will be loaded by ResourceLoader.
- */
- public $mModuleScripts = [];
-
/**
* @var array $mModuleStyles Modules of which only the CSSS will be loaded by ResourceLoader.
*/
}
public function getModuleScripts() {
- return $this->mModuleScripts;
+ wfDeprecated( __METHOD__, '1.33' );
+ return [];
}
public function getModuleStyles() {
$this->mModules = array_merge( $this->mModules, (array)$modules );
}
- /**
- * @deprecated since 1.31 Use addModules() instead.
- * @see OutputPage::addModuleScripts
- */
- public function addModuleScripts( $modules ) {
- $this->mModuleScripts = array_merge( $this->mModuleScripts, (array)$modules );
- }
-
/**
* @see OutputPage::addModuleStyles
*/
*/
public function addOutputPageMetadata( OutputPage $out ) {
$this->addModules( $out->getModules() );
- $this->addModuleScripts( $out->getModuleScripts() );
$this->addModuleStyles( $out->getModuleStyles() );
$this->addJsConfigVars( $out->getJsConfigVars() );
// HTML and HTTP
$this->mHeadItems = self::mergeMixedList( $this->mHeadItems, $source->getHeadItems() );
$this->mModules = self::mergeList( $this->mModules, $source->getModules() );
- $this->mModuleScripts = self::mergeList( $this->mModuleScripts, $source->getModuleScripts() );
$this->mModuleStyles = self::mergeList( $this->mModuleStyles, $source->getModuleStyles() );
$this->mJsConfigVars = self::mergeMap( $this->mJsConfigVars, $source->getJsConfigVars() );
$this->mMaxAdaptiveExpiry = min( $this->mMaxAdaptiveExpiry, $source->mMaxAdaptiveExpiry );
/**
* Construct a new password factory.
- * Most of the time you'll want to use MediaWikiServices::getPasswordFactory instead.
+ * Most of the time you'll want to use MediaWikiServices::getInstance()->getPasswordFactory
+ * instead.
* @param array $config Mapping of password type => config
* @param string $default Default password type
* @see PasswordFactory::register
];
}
- // Language
$languages = Language::fetchLanguageNames( null, 'mwfile' );
$languageCode = $this->config->get( 'LanguageCode' );
if ( !array_key_exists( $languageCode, $languages ) ) {
'options' => $stubThresholdOptions,
// This is not a raw HTML message; label-raw is needed for the manual <a></a>
'label-raw' => $l10n->msg( 'stub-threshold' )->rawParams(
- '<a href="#" class="stub">' .
+ '<a class="stub">' .
$l10n->msg( 'stub-threshold-sample-link' )->parse() .
'</a>' )->parse(),
];
);
}
- AuthManager::callLegacyAuthPlugin( 'updateExternalDB', [ $user ] );
$user->saveSettings();
return $result;
// Add the QUnit testrunner as implicit dependency to extension test suites.
foreach ( $testModules['qunit'] as &$module ) {
// Shuck any single-module dependency as an array
- if ( is_string( $module['dependencies'] ) ) {
+ if ( isset( $module['dependencies'] ) && is_string( $module['dependencies'] ) ) {
$module['dependencies'] = [ $module['dependencies'] ];
}
/** @var array */
private $moduleStyles = [];
- /** @var array */
- private $moduleScripts = [];
-
/** @var array */
private $exemptStates = [];
$this->moduleStyles = $modules;
}
- /**
- * Ensure the scripts of one or more modules are loaded.
- *
- * @deprecated since 1.28
- * @param array $modules Array of module names
- */
- public function setModuleScripts( array $modules ) {
- $this->moduleScripts = $modules;
- }
-
/**
* Set state of special modules that are handled by the caller manually.
*
],
'general' => [],
'styles' => [],
- 'scripts' => [],
// Embedding for private modules
'embed' => [
'styles' => [],
}
}
- foreach ( $this->moduleScripts as $name ) {
- $module = $rl->getModule( $name );
- if ( !$module ) {
- continue;
- }
-
- $group = $module->getGroup();
- $context = $this->getContext( $group, ResourceLoaderModule::TYPE_SCRIPTS );
- if ( $module->isKnownEmpty( $context ) ) {
- // Avoid needless request for empty module
- $data['states'][$name] = 'ready';
- } else {
- // Load from load.php?only=scripts via <script src></script>
- $data['scripts'][] = $name;
-
- // Avoid duplicate request from mw.loader
- $data['states'][$name] = 'loading';
- }
- }
-
return $data;
}
);
}
- // Inline RLQ: Load only=scripts
- if ( $data['scripts'] ) {
- $chunks[] = $this->getLoad(
- $data['scripts'],
- ResourceLoaderModule::TYPE_SCRIPTS,
- $nonce
- );
- }
-
// External stylesheets (only=styles)
if ( $data['styles'] ) {
$chunks[] = $this->getLoad(
*/
class ResourceLoaderImageModule extends ResourceLoaderModule {
+ /** @var array|null */
protected $definition = null;
/**
protected $origin = self::ORIGIN_CORE_SITEWIDE;
+ /** @var ResourceLoaderImage[]|null */
+ protected $imageObjects = null;
+ /** @var array */
protected $images = [];
+ /** @var string|null */
protected $defaultColor = null;
protected $useDataURI = true;
+ /** @var array|null */
+ protected $globalVariants = null;
+ /** @var array */
protected $variants = [];
+ /** @var string|null */
protected $prefix = null;
protected $selectorWithoutVariant = '.{prefix}-{name}';
protected $selectorWithVariant = '.{prefix}-{name}-{variant}';
$option = [ 'default' => $option ];
}
foreach ( $option as $skin => $data ) {
- if ( !is_array( $option ) ) {
+ if ( !is_array( $data ) ) {
throw new InvalidArgumentException(
- "Invalid list error. '$option' given, array expected."
+ "Invalid list error. '$data' given, array expected."
);
}
}
*/
public function getImages( ResourceLoaderContext $context ) {
$skin = $context->getSkin();
- if ( !isset( $this->imageObjects ) ) {
+ if ( $this->imageObjects === null ) {
$this->loadFromDefinition();
$this->imageObjects = [];
}
*/
public function getGlobalVariants( ResourceLoaderContext $context ) {
$skin = $context->getSkin();
- if ( !isset( $this->globalVariants ) ) {
+ if ( $this->globalVariants === null ) {
$this->loadFromDefinition();
$this->globalVariants = [];
}
$localFileRefs = array_values( array_unique( $localFileRefs ) );
sort( $localFileRefs );
$localPaths = self::getRelativePaths( $localFileRefs );
-
$storedPaths = self::getRelativePaths( $this->getFileDependencies( $context ) );
- // If the list has been modified since last time we cached it, update the cache
- if ( $localPaths !== $storedPaths ) {
- $vary = $context->getSkin() . '|' . $context->getLanguage();
- $cache = ObjectCache::getLocalClusterInstance();
- $key = $cache->makeKey( __METHOD__, $this->getName(), $vary );
- $scopeLock = $cache->getScopedLock( $key, 0 );
- if ( !$scopeLock ) {
- return; // T124649; avoid write slams
- }
- // No needless escaping as this isn't HTML output.
- // Only stored in the database and parsed in PHP.
- $deps = json_encode( $localPaths, JSON_UNESCAPED_SLASHES );
- $dbw = wfGetDB( DB_MASTER );
- $dbw->upsert( 'module_deps',
- [
- 'md_module' => $this->getName(),
- 'md_skin' => $vary,
- 'md_deps' => $deps,
- ],
- [ 'md_module', 'md_skin' ],
- [
- 'md_deps' => $deps,
- ]
- );
+ if ( $localPaths === $storedPaths ) {
+ // Unchanged. Avoid needless database query (especially master conn!).
+ return;
+ }
- if ( $dbw->trxLevel() ) {
- $dbw->onTransactionResolution(
- function () use ( &$scopeLock ) {
- ScopedCallback::consume( $scopeLock ); // release after commit
- },
- __METHOD__
- );
- }
+ // The file deps list has changed, we want to update it.
+ $vary = $context->getSkin() . '|' . $context->getLanguage();
+ $cache = ObjectCache::getLocalClusterInstance();
+ $key = $cache->makeKey( __METHOD__, $this->getName(), $vary );
+ $scopeLock = $cache->getScopedLock( $key, 0 );
+ if ( !$scopeLock ) {
+ // Another request appears to be doing this update already.
+ // Avoid write slams (T124649).
+ return;
+ }
+
+ // No needless escaping as this isn't HTML output.
+ // Only stored in the database and parsed in PHP.
+ $deps = json_encode( $localPaths, JSON_UNESCAPED_SLASHES );
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->upsert( 'module_deps',
+ [
+ 'md_module' => $this->getName(),
+ 'md_skin' => $vary,
+ 'md_deps' => $deps,
+ ],
+ [ 'md_module', 'md_skin' ],
+ [
+ 'md_deps' => $deps,
+ ]
+ );
+
+ if ( $dbw->trxLevel() ) {
+ $dbw->onTransactionResolution(
+ function () use ( &$scopeLock ) {
+ ScopedCallback::consume( $scopeLock ); // release after commit
+ },
+ __METHOD__
+ );
}
} catch ( Exception $e ) {
+ // Probably a DB failure. Either the read query from getFileDependencies(),
+ // or the write query above.
wfDebugLog( 'resourceloader', __METHOD__ . ": failed to update DB: $e" );
}
}
}
$content['scripts'] = $scripts;
- // Styles
$styles = [];
// Don't create empty stylesheets like [ '' => '' ] for modules
// that don't *have* any stylesheets (T40024).
if ( !$this->getConfig()->get( 'ResourceLoaderValidateJS' ) ) {
return $contents;
}
- $cache = ObjectCache::getMainWANInstance();
+ $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
return $cache->getWithSetCallback(
$cache->makeGlobalKey(
'resourceloader',
'wgSiteName' => $conf->get( 'Sitename' ),
'wgDBname' => $conf->get( 'DBname' ),
'wgExtraSignatureNamespaces' => $conf->get( 'ExtraSignatureNamespaces' ),
- 'wgAvailableSkins' => Skin::getSkinNames(),
'wgExtensionAssetsPath' => $conf->get( 'ExtensionAssetsPath' ),
// MediaWiki sets cookies to have this prefix by default
'wgCookiePrefix' => $conf->get( 'CookiePrefix' ),
'wgCookieDomain' => $conf->get( 'CookieDomain' ),
'wgCookiePath' => $conf->get( 'CookiePath' ),
'wgCookieExpiration' => $conf->get( 'CookieExpiration' ),
- 'wgResourceLoaderMaxQueryLength' => $conf->get( 'ResourceLoaderMaxQueryLength' ),
'wgCaseSensitiveNamespaces' => $caseSensitiveNamespaces,
'wgLegalTitleChars' => Title::convertByteClassToUnicodeClass( Title::legalChars() ),
'wgIllegalFileChars' => Title::convertByteClassToUnicodeClass( $illegalFileChars ),
*/
public function getScript( ResourceLoaderContext $context ) {
global $IP;
+ $conf = $this->getConfig();
+
if ( $context->getOnly() !== 'scripts' ) {
return '/* Requires only=script */';
}
if ( $context->getDebug() ) {
$mwLoaderCode .= file_get_contents( "$IP/resources/src/startup/mediawiki.log.js" );
}
- if ( $this->getConfig()->get( 'ResourceLoaderEnableJSProfiler' ) ) {
+ if ( $conf->get( 'ResourceLoaderEnableJSProfiler' ) ) {
$mwLoaderCode .= file_get_contents( "$IP/resources/src/startup/profiler.js" );
}
// Perform replacements for mediawiki.js
$mwLoaderPairs = [
'$VARS.baseModules' => ResourceLoader::encodeJsonForScript( $this->getBaseModules() ),
+ '$VARS.maxQueryLength' => ResourceLoader::encodeJsonForScript(
+ $conf->get( 'ResourceLoaderMaxQueryLength' )
+ ),
];
$profilerStubs = [
'$CODE.profileExecuteStart();' => 'mw.loader.profiler.onExecuteStart( module );',
'$CODE.profileScriptStart();' => 'mw.loader.profiler.onScriptStart( module );',
'$CODE.profileScriptEnd();' => 'mw.loader.profiler.onScriptEnd( module );',
];
- if ( $this->getConfig()->get( 'ResourceLoaderEnableJSProfiler' ) ) {
+ if ( $conf->get( 'ResourceLoaderEnableJSProfiler' ) ) {
// When profiling is enabled, insert the calls.
$mwLoaderPairs += $profilerStubs;
} else {
// Perform string replacements for startup.js
$pairs = [
'$VARS.wgLegacyJavaScriptGlobals' => ResourceLoader::encodeJsonForScript(
- $this->getConfig()->get( 'LegacyJavaScriptGlobals' )
+ $conf->get( 'LegacyJavaScriptGlobals' )
),
'$VARS.configuration' => ResourceLoader::encodeJsonForScript(
$this->getConfigSettings( $context )
use Wikimedia\Assert\Assert;
use Wikimedia\Rdbms\Database;
use Wikimedia\Rdbms\IDatabase;
+use MediaWiki\MediaWikiServices;
/**
* Abstraction for ResourceLoader modules which pull from wiki pages
$func = [ static::class, 'fetchTitleInfo' ];
$fname = __METHOD__;
- $cache = ObjectCache::getMainWANInstance();
+ $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
$allInfo = $cache->getWithSetCallback(
$cache->makeGlobalKey( 'resourceloader', 'titleinfo', $db->getDomainID(), $hash ),
$cache::TTL_HOUR,
}
if ( $purge ) {
- $cache = ObjectCache::getMainWANInstance();
+ $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
$key = $cache->makeGlobalKey( 'resourceloader', 'titleinfo', $domain );
$cache->touchCheckKey( $key );
}
$loglink = $this->list->msg( 'parentheses' )->rawParams( $loglink )->escaped();
// User links and action text
$action = $formatter->getActionText();
- // Comment
+
$comment = CommentStore::getStore()->getComment( 'log_comment', $this->row )->text;
$comment = $this->list->getLanguage()->getDirMark()
. Linker::commentBlock( $comment );
$user->setToken();
$user->saveSettings();
- $authUser = \MediaWiki\Auth\AuthManager::callLegacyAuthPlugin( 'getUserInstance', [ &$user ] );
- if ( $authUser ) {
- $authUser->resetAuthToken();
- }
-
foreach ( $this->getProviders() as $provider ) {
$provider->invalidateSessionsForUser( $user );
}
$colon = $this->msg( 'colon-separator' )->escaped();
if ( !empty( $allCats['normal'] ) ) {
- $t = $embed . implode( "{$pop}{$embed}", $allCats['normal'] ) . $pop;
+ $t = $embed . implode( $pop . $embed, $allCats['normal'] ) . $pop;
$msg = $this->msg( 'pagecategories' )->numParams( count( $allCats['normal'] ) )->escaped();
$linkPage = $this->msg( 'pagecategorieslink' )->inContentLanguage()->text();
$title = Title::newFromText( $linkPage );
$link = $title ? Linker::link( $title, $msg ) : $msg;
$s .= '<div id="mw-normal-catlinks" class="mw-normal-catlinks">' .
- $link . $colon . '<ul>' . $t . '</ul>' . '</div>';
+ $link . $colon . '<ul>' . $t . '</ul></div>';
}
# Hidden categories
$s .= "<div id=\"mw-hidden-catlinks\" class=\"mw-hidden-catlinks$class\">" .
$this->msg( 'hidden-categories' )->numParams( count( $allCats['hidden'] ) )->escaped() .
- $colon . '<ul>' . $embed . implode( "{$pop}{$embed}", $allCats['hidden'] ) . $pop . '</ul>' .
+ $colon . '<ul>' . $embed . implode( $pop . $embed, $allCats['hidden'] ) . $pop . '</ul>' .
'</div>';
}
use Wikimedia\Rdbms\IResultWrapper;
use Wikimedia\Rdbms\FakeResultWrapper;
use Wikimedia\Rdbms\IDatabase;
+use MediaWiki\MediaWikiServices;
/**
* Special page which uses a ChangesList to show query results.
* @return array Tag data
*/
protected static function getChangeTagList( ResourceLoaderContext $context ) {
- $cache = ObjectCache::getMainWANInstance();
+ $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
return $cache->getWithSetCallback(
$cache->makeKey( 'changeslistspecialpage-changetags', $context->getLanguage() ),
$cache::TTL_MINUTE * 10,
protected function checkExecutePermissions( User $user ) {
$this->checkPermissions();
- if ( $this->requiresUnblock() && $user->isBlocked() ) {
+ if ( $this->requiresUnblock() ) {
$block = $user->getBlock();
- throw new UserBlockedError( $block );
+ if ( $block && $block->isSitewide() ) {
+ throw new UserBlockedError( $block );
+ }
}
if ( $this->requiresWrite() ) {
--- /dev/null
+<?php
+/**
+ * Shortcuts to construct a special page alias.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Superclass for any RedirectSpecialPage which redirects the user
+ * to a particular article (as opposed to user contributions, logs, etc.).
+ *
+ * For security reasons these special pages are restricted to pass on
+ * the following subset of GET parameters to the target page while
+ * removing all others:
+ *
+ * - useskin, uselang, printable: to alter the appearance of the resulting page
+ *
+ * - redirect: allows viewing one's user page or talk page even if it is a
+ * redirect.
+ *
+ * - rdfrom: allows redirecting to one's user page or talk page from an
+ * external wiki with the "Redirect from..." notice.
+ *
+ * - limit, offset: Useful for linking to history of one's own user page or
+ * user talk page. For example, this would be a link to "the last edit to your
+ * user talk page in the year 2010":
+ * https://en.wikipedia.org/wiki/Special:MyPage?offset=20110000000000&limit=1&action=history
+ *
+ * - feed: would allow linking to the current user's RSS feed for their user
+ * talk page:
+ * https://en.wikipedia.org/w/index.php?title=Special:MyTalk&action=history&feed=rss
+ *
+ * - preloadtitle: Can be used to provide a default section title for a
+ * preloaded new comment on one's own talk page.
+ *
+ * - summary : Can be used to provide a default edit summary for a preloaded
+ * edit to one's own user page or talk page.
+ *
+ * - preview: Allows showing/hiding preview on first edit regardless of user
+ * preference, useful for preloaded edits where you know preview wouldn't be
+ * useful.
+ *
+ * - redlink: Affects the message the user sees if their talk page/user talk
+ * page does not currently exist. Avoids confusion for newbies with no user
+ * pages over why they got a "permission error" following this link:
+ * https://en.wikipedia.org/w/index.php?title=Special:MyPage&redlink=1
+ *
+ * - debug: determines whether the debug parameter is passed to load.php,
+ * which disables reformatting and allows scripts to be debugged. Useful
+ * when debugging scripts that manipulate one's own user page or talk page.
+ *
+ * @par Hook extension:
+ * Extensions can add to the redirect parameters list by using the hook
+ * RedirectSpecialArticleRedirectParams
+ *
+ * This hook allows extensions which add GET parameters like FlaggedRevs to
+ * retain those parameters when redirecting using special pages.
+ *
+ * @par Hook extension example:
+ * @code
+ * $wgHooks['RedirectSpecialArticleRedirectParams'][] =
+ * 'MyExtensionHooks::onRedirectSpecialArticleRedirectParams';
+ * public static function onRedirectSpecialArticleRedirectParams( &$redirectParams ) {
+ * $redirectParams[] = 'stable';
+ * return true;
+ * }
+ * @endcode
+ *
+ * @ingroup SpecialPage
+ */
+abstract class RedirectSpecialArticle extends RedirectSpecialPage {
+ function __construct( $name ) {
+ parent::__construct( $name );
+ $redirectParams = [
+ 'action',
+ 'redirect', 'rdfrom',
+ # Options for preloaded edits
+ 'preload', 'preloadparams', 'editintro', 'preloadtitle', 'summary', 'nosummary',
+ # Options for overriding user settings
+ 'preview', 'minor', 'watchthis',
+ # Options for history/diffs
+ 'section', 'oldid', 'diff', 'dir',
+ 'limit', 'offset', 'feed',
+ # Misc options
+ 'redlink',
+ # Options for action=raw; missing ctype can break JS or CSS in some browsers
+ 'ctype', 'maxage', 'smaxage',
+ ];
+
+ Hooks::run( "RedirectSpecialArticleRedirectParams", [ &$redirectParams ] );
+ $this->mAllowedRedirectParams = $redirectParams;
+ }
+}
throw new MWException( "RedirectSpecialPage $class doesn't redirect!" );
}
}
-
-/**
- * @ingroup SpecialPage
- */
-abstract class SpecialRedirectToSpecial extends RedirectSpecialPage {
- /** @var string Name of redirect target */
- protected $redirName;
-
- /** @var string Name of subpage of redirect target */
- protected $redirSubpage;
-
- function __construct(
- $name, $redirName, $redirSubpage = false,
- $allowedRedirectParams = [], $addedRedirectParams = []
- ) {
- parent::__construct( $name );
- $this->redirName = $redirName;
- $this->redirSubpage = $redirSubpage;
- $this->mAllowedRedirectParams = $allowedRedirectParams;
- $this->mAddedRedirectParams = $addedRedirectParams;
- }
-
- /**
- * @param string|null $subpage
- * @return Title|bool
- */
- public function getRedirect( $subpage ) {
- if ( $this->redirSubpage === false ) {
- return SpecialPage::getTitleFor( $this->redirName, $subpage );
- }
-
- return SpecialPage::getTitleFor( $this->redirName, $this->redirSubpage );
- }
-}
-
-/**
- * Superclass for any RedirectSpecialPage which redirects the user
- * to a particular article (as opposed to user contributions, logs, etc.).
- *
- * For security reasons these special pages are restricted to pass on
- * the following subset of GET parameters to the target page while
- * removing all others:
- *
- * - useskin, uselang, printable: to alter the appearance of the resulting page
- *
- * - redirect: allows viewing one's user page or talk page even if it is a
- * redirect.
- *
- * - rdfrom: allows redirecting to one's user page or talk page from an
- * external wiki with the "Redirect from..." notice.
- *
- * - limit, offset: Useful for linking to history of one's own user page or
- * user talk page. For example, this would be a link to "the last edit to your
- * user talk page in the year 2010":
- * https://en.wikipedia.org/wiki/Special:MyPage?offset=20110000000000&limit=1&action=history
- *
- * - feed: would allow linking to the current user's RSS feed for their user
- * talk page:
- * https://en.wikipedia.org/w/index.php?title=Special:MyTalk&action=history&feed=rss
- *
- * - preloadtitle: Can be used to provide a default section title for a
- * preloaded new comment on one's own talk page.
- *
- * - summary : Can be used to provide a default edit summary for a preloaded
- * edit to one's own user page or talk page.
- *
- * - preview: Allows showing/hiding preview on first edit regardless of user
- * preference, useful for preloaded edits where you know preview wouldn't be
- * useful.
- *
- * - redlink: Affects the message the user sees if their talk page/user talk
- * page does not currently exist. Avoids confusion for newbies with no user
- * pages over why they got a "permission error" following this link:
- * https://en.wikipedia.org/w/index.php?title=Special:MyPage&redlink=1
- *
- * - debug: determines whether the debug parameter is passed to load.php,
- * which disables reformatting and allows scripts to be debugged. Useful
- * when debugging scripts that manipulate one's own user page or talk page.
- *
- * @par Hook extension:
- * Extensions can add to the redirect parameters list by using the hook
- * RedirectSpecialArticleRedirectParams
- *
- * This hook allows extensions which add GET parameters like FlaggedRevs to
- * retain those parameters when redirecting using special pages.
- *
- * @par Hook extension example:
- * @code
- * $wgHooks['RedirectSpecialArticleRedirectParams'][] =
- * 'MyExtensionHooks::onRedirectSpecialArticleRedirectParams';
- * public static function onRedirectSpecialArticleRedirectParams( &$redirectParams ) {
- * $redirectParams[] = 'stable';
- * return true;
- * }
- * @endcode
- *
- * @ingroup SpecialPage
- */
-abstract class RedirectSpecialArticle extends RedirectSpecialPage {
- function __construct( $name ) {
- parent::__construct( $name );
- $redirectParams = [
- 'action',
- 'redirect', 'rdfrom',
- # Options for preloaded edits
- 'preload', 'preloadparams', 'editintro', 'preloadtitle', 'summary', 'nosummary',
- # Options for overriding user settings
- 'preview', 'minor', 'watchthis',
- # Options for history/diffs
- 'section', 'oldid', 'diff', 'dir',
- 'limit', 'offset', 'feed',
- # Misc options
- 'redlink',
- # Options for action=raw; missing ctype can break JS or CSS in some browsers
- 'ctype', 'maxage', 'smaxage',
- ];
-
- Hooks::run( "RedirectSpecialArticleRedirectParams", [ &$redirectParams ] );
- $this->mAllowedRedirectParams = $redirectParams;
- }
-}
--- /dev/null
+<?php
+/**
+ * Shortcuts to construct a special page alias.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * @ingroup SpecialPage
+ */
+abstract class SpecialRedirectToSpecial extends RedirectSpecialPage {
+ /** @var string Name of redirect target */
+ protected $redirName;
+
+ /** @var string Name of subpage of redirect target */
+ protected $redirSubpage;
+
+ function __construct(
+ $name, $redirName, $redirSubpage = false,
+ $allowedRedirectParams = [], $addedRedirectParams = []
+ ) {
+ parent::__construct( $name );
+ $this->redirName = $redirName;
+ $this->redirSubpage = $redirSubpage;
+ $this->mAllowedRedirectParams = $allowedRedirectParams;
+ $this->mAddedRedirectParams = $addedRedirectParams;
+ }
+
+ /**
+ * @param string|null $subpage
+ * @return Title|bool
+ */
+ public function getRedirect( $subpage ) {
+ if ( $this->redirSubpage === false ) {
+ return SpecialPage::getTitleFor( $this->redirName, $subpage );
+ }
+
+ return SpecialPage::getTitleFor( $this->redirName, $this->redirSubpage );
+ }
+}
];
$joinConds = [
'revision' => [
- 'INNER JOIN', [
+ 'JOIN', [
'page_latest = rev_id'
]
],
protected function getFormFields() {
global $wgBlockAllowsUTEdit;
+ $this->getOutput()->enableOOUI();
+
$user = $this->getUser();
$suggestedDurations = self::getSuggestedDurations();
'type' => 'radio',
'cssclass' => 'mw-block-editing-restriction',
'options' => [
- $this->msg( 'ipb-sitewide' )->escaped() => 'sitewide',
- $this->msg( 'ipb-partial' )->escaped() => 'partial',
+ $this->msg( 'ipb-sitewide' )->escaped() .
+ new \OOUI\LabelWidget( [
+ 'classes' => [ 'oo-ui-inline-help' ],
+ 'label' => $this->msg( 'ipb-sitewide-help' )->text(),
+ ] ) => 'sitewide',
+ $this->msg( 'ipb-partial' )->escaped() .
+ new \OOUI\LabelWidget( [
+ 'classes' => [ 'oo-ui-inline-help' ],
+ 'label' => $this->msg( 'ipb-partial-help' )->text(),
+ ] ) => 'partial',
],
'section' => 'actions',
];
Hooks::run( 'PrefsEmailAudit', [ $user, $oldaddr, $newaddr ] );
$user->saveSettings();
- MediaWiki\Auth\AuthManager::callLegacyAuthPlugin( 'updateExternalDB', [ $user ] );
return $status;
}
* @ingroup SpecialPage
*/
-use MediaWiki\MediaWikiServices;
use MediaWiki\Widget\DateInputWidget;
/**
$out->addWikiMsg( 'nocontribs', $target );
} else {
# Show a message about replica DB lag, if applicable
- $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
- $lag = $lb->safeGetLag( $pager->getDatabase() );
+ $lag = $pager->getDatabase()->getSessionLagStatus()['lag'];
if ( $lag > 0 ) {
$out->showLagWarning( $lag );
}
* @ingroup SpecialPage
*/
-use MediaWiki\MediaWikiServices;
-
/**
* Implements Special:DeletedContributions to display archived revisions
* @ingroup SpecialPage
}
# Show a message about replica DB lag, if applicable
- $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
- $lag = $lb->safeGetLag( $pager->getDatabase() );
+ $lag = $pager->getDatabase()->getSessionLagStatus()['lag'];
if ( $lag > 0 ) {
$out->showLagWarning( $lag );
}
$this->setHeaders();
$this->outputHeader();
- $this->getOutput()->addModules( [ 'mediawiki.special.edittags',
- 'mediawiki.special' ] );
+ $output->addModules( [ 'mediawiki.special.edittags' ] );
+ $output->addModuleStyles( [
+ 'mediawiki.interface.helpers.styles',
+ 'mediawiki.special'
+ ] );
$this->submitClicked = $request->wasPosted() && $request->getBool( 'wpSubmit' );
return 'users';
}
}
-
-/**
- * Redirect page: Special:ListAdmins --> Special:ListUsers/sysop.
- *
- * @ingroup SpecialPage
- */
-class SpecialListAdmins extends SpecialRedirectToSpecial {
- function __construct() {
- parent::__construct( 'Listadmins', 'Listusers', 'sysop' );
- }
-}
-
-/**
- * Redirect page: Special:ListBots --> Special:ListUsers/bot.
- *
- * @ingroup SpecialPage
- */
-class SpecialListBots extends SpecialRedirectToSpecial {
- function __construct() {
- parent::__construct( 'Listbots', 'Listusers', 'bot' );
- }
-}
$this->setHeaders();
$this->outputHeader();
- $this->getOutput()->addModules( 'mediawiki.userSuggest' );
+ $out = $this->getOutput();
+ $out->addModules( 'mediawiki.userSuggest' );
+ $out->addModuleStyles( 'mediawiki.interface.helpers.styles' );
$this->addHelpLink( 'Help:Log' );
$opts = new FormOptions;
+++ /dev/null
-<?php
-/**
- * Special pages that are used to get user independent links pointing to
- * current user's pages (user page, talk page, contributions, etc.).
- * This can let us cache a single copy of some generated content for all
- * users or be linked in wikitext help pages.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup SpecialPage
- */
-
-/**
- * Special page pointing to current user's user page.
- *
- * @ingroup SpecialPage
- */
-class SpecialMypage extends RedirectSpecialArticle {
- public function __construct() {
- parent::__construct( 'Mypage' );
- }
-
- /**
- * @param string|null $subpage
- * @return Title
- */
- public function getRedirect( $subpage ) {
- if ( $subpage === null || $subpage === '' ) {
- return Title::makeTitle( NS_USER, $this->getUser()->getName() );
- }
-
- return Title::makeTitle( NS_USER, $this->getUser()->getName() . '/' . $subpage );
- }
-
- /**
- * Target identifies a specific User. See T109724.
- *
- * @since 1.27
- * @return bool
- */
- public function personallyIdentifiableTarget() {
- return true;
- }
-}
-
-/**
- * Special page pointing to current user's talk page.
- *
- * @ingroup SpecialPage
- */
-class SpecialMytalk extends RedirectSpecialArticle {
- public function __construct() {
- parent::__construct( 'Mytalk' );
- }
-
- /**
- * @param string|null $subpage
- * @return Title
- */
- public function getRedirect( $subpage ) {
- if ( $subpage === null || $subpage === '' ) {
- return Title::makeTitle( NS_USER_TALK, $this->getUser()->getName() );
- }
-
- return Title::makeTitle( NS_USER_TALK, $this->getUser()->getName() . '/' . $subpage );
- }
-
- /**
- * Target identifies a specific User. See T109724.
- *
- * @since 1.27
- * @return bool
- */
- public function personallyIdentifiableTarget() {
- return true;
- }
-}
-
-/**
- * Special page pointing to current user's contributions.
- *
- * @ingroup SpecialPage
- */
-class SpecialMycontributions extends RedirectSpecialPage {
- public function __construct() {
- parent::__construct( 'Mycontributions' );
- $this->mAllowedRedirectParams = [ 'limit', 'namespace', 'tagfilter',
- 'offset', 'dir', 'year', 'month', 'feed', 'deletedOnly',
- 'nsInvert', 'associated', 'newOnly', 'topOnly', 'start', 'end' ];
- }
-
- /**
- * @param string|null $subpage
- * @return Title
- */
- public function getRedirect( $subpage ) {
- return SpecialPage::getTitleFor( 'Contributions', $this->getUser()->getName() );
- }
-
- /**
- * Target identifies a specific User. See T109724.
- *
- * @since 1.27
- * @return bool
- */
- public function personallyIdentifiableTarget() {
- return true;
- }
-}
-
-/**
- * Special page pointing to current user's uploaded files.
- *
- * @ingroup SpecialPage
- */
-class SpecialMyuploads extends RedirectSpecialPage {
- public function __construct() {
- parent::__construct( 'Myuploads' );
- $this->mAllowedRedirectParams = [ 'limit', 'ilshowall', 'ilsearch' ];
- }
-
- /**
- * @param string|null $subpage
- * @return Title
- */
- public function getRedirect( $subpage ) {
- return SpecialPage::getTitleFor( 'Listfiles', $this->getUser()->getName() );
- }
-
- /**
- * Target identifies a specific User. See T109724.
- *
- * @since 1.27
- * @return bool
- */
- public function personallyIdentifiableTarget() {
- return true;
- }
-}
-
-/**
- * Special page pointing to current user's uploaded files (including old versions).
- *
- * @ingroup SpecialPage
- */
-class SpecialAllMyUploads extends RedirectSpecialPage {
- public function __construct() {
- parent::__construct( 'AllMyUploads' );
- $this->mAllowedRedirectParams = [ 'limit', 'ilsearch' ];
- }
-
- /**
- * @param string|null $subpage
- * @return Title
- */
- public function getRedirect( $subpage ) {
- $this->mAddedRedirectParams['ilshowall'] = 1;
-
- return SpecialPage::getTitleFor( 'Listfiles', $this->getUser()->getName() );
- }
-
- /**
- * Target identifies a specific User. See T109724.
- *
- * @since 1.27
- * @return bool
- */
- public function personallyIdentifiableTarget() {
- return true;
- }
-}
}
protected function setup( $par ) {
- // Options
$opts = new FormOptions();
$this->opts = $opts; // bind
$opts->add( 'hideliu', false );
$opts->add( $key, $params['default'] );
}
- // Set values
$opts->fetchValuesFromRequest( $this->getRequest() );
if ( $par ) {
$this->parseParams( $par );
}
- // Validate
$opts->validateIntBounds( 'limit', 0, 5000 );
}
'pp_propname' => $this->propName,
],
'join_conds' => [
- 'page' => [ 'INNER JOIN', 'page_id = pp_page' ]
+ 'page' => [ 'JOIN', 'page_id = pp_page' ]
],
'options' => []
];
);
$ret = [];
- foreach ( $groupPolicies as $gp => $val ) {
- if ( $val === false ) {
- // Policy isn't enabled, so no need to dislpay it
+ foreach ( $groupPolicies as $gp => $settings ) {
+ if ( !is_array( $settings ) ) {
+ $settings = [ 'value' => $settings ];
+ }
+ $val = $settings['value'];
+ $flags = array_diff_key( $settings, [ 'value' => true ] );
+ if ( !$val ) {
+ // Policy isn't enabled, so no need to display it
continue;
- } elseif ( $val === true ) {
- $msg = $this->msg( 'passwordpolicies-policy-' . strtolower( $gp ) );
+ }
+ $msg = $this->msg( 'passwordpolicies-policy-' . strtolower( $gp ) )->numParams( $val );
+ $flagMsgs = [];
+ foreach ( array_filter( $flags ) as $flag => $value ) {
+ $flagMsg = $this->msg( 'passwordpolicies-policyflag-' . strtolower( $flag ) );
+ $flagMsg->params( $value );
+ $flagMsgs[] = $flagMsg;
+ }
+ if ( $flagMsgs ) {
+ $ret[] = $this->msg(
+ 'passwordpolicies-policy-displaywithflags',
+ $msg,
+ '<span class="mw-passwordpolicies-policy-name">' . $gp . '</span>',
+ $this->getLanguage()->commaList( $flagMsgs )
+ )->parse();
} else {
- $msg = $this->msg( 'passwordpolicies-policy-' . strtolower( $gp ) )->numParams( $val );
+ $ret[] = $this->msg(
+ 'passwordpolicies-policy-display',
+ $msg,
+ '<span class="mw-passwordpolicies-policy-name">' . $gp . '</span>'
+ )->parse();
}
- $ret[] = $this->msg(
- 'passwordpolicies-policy-display',
- $msg,
- '<span class="mw-passwordpolicies-policy-name">' . $gp . '</span>'
- )->parse();
}
if ( $ret === [] ) {
return '';
'OFFSET' => $offset
],
'join_conds' => [
- 'page' => [ 'INNER JOIN', 'cl_from = page_id' ]
+ 'page' => [ 'JOIN', 'cl_from = page_id' ]
]
];
[ 'name' => 'namespace', 'id' => 'namespace' ]
);
$nsLabel = Xml::label( $this->msg( 'namespace' )->text(), 'namespace' );
- $invert = Xml::checkLabel(
+ $attribs = [ 'class' => [ 'mw-input-with-label' ] ];
+ // Hide the checkboxes when the namespace filter is set to 'all'.
+ if ( $opts['namespace'] === '' ) {
+ $attribs['class'][] = 'mw-input-hidden';
+ }
+ $invert = Html::rawElement( 'span', $attribs, Xml::checkLabel(
$this->msg( 'invert' )->text(), 'invert', 'nsinvert',
$opts['invert'],
[ 'title' => $this->msg( 'tooltip-invert' )->text() ]
- );
- $associated = Xml::checkLabel(
+ ) );
+ $associated = Html::rawElement( 'span', $attribs, Xml::checkLabel(
$this->msg( 'namespace_association' )->text(), 'associated', 'nsassociated',
$opts['associated'],
[ 'title' => $this->msg( 'tooltip-namespace_association' )->text() ]
- );
+ ) );
return [ $nsLabel, "$nsSelect $invert $associated" ];
}
'span',
[ 'class' => 'rclistfrom' ],
$this->makeOptionsLink(
- $this->msg( 'rclistfrom' )->rawParams( $now, $timenow, $datenow )->parse(),
+ $this->msg( 'rclistfrom' )->plaintextParams( $now, $timenow, $datenow )->parse(),
[ 'from' => $timestamp ],
$nondefaults
)
$conds + $subconds,
__METHOD__,
$order + $query_options,
- $join_conds + [ $link_table => [ 'INNER JOIN', $subjoin ] ]
+ $join_conds + [ $link_table => [ 'JOIN', $subjoin ] ]
);
if ( $dbr->unionSupportsOrderAndLimit() ) {
// Show form if the user can submit
if ( $this->mIsAllowed ) {
$out->addModules( [ 'mediawiki.special.revisionDelete' ] );
- $out->addModuleStyles( 'mediawiki.special' );
+ $out->addModuleStyles( [ 'mediawiki.special',
+ 'mediawiki.interface.helpers.styles' ] );
$form = Xml::openElement( 'form', [ 'method' => 'post',
'action' => $this->getPageTitle()->getLocalURL( [ 'action' => 'submit' ] ),
$url = str_replace( '$1', urlencode( $term ), $searchForwardUrl );
$out->redirect( $url );
} else {
- $out->addHTML(
- "<fieldset>" .
- "<legend>" .
- $this->msg( 'search-external' )->escaped() .
- "</legend>" .
- "<p class='mw-searchdisabled'>" .
- $this->msg( 'searchdisabled' )->escaped() .
- "</p>" .
- $this->msg( 'googlesearch' )->rawParams(
- htmlspecialchars( $term ),
- 'UTF-8',
- $this->msg( 'searchbutton' )->escaped()
- )->text() .
- "</fieldset>"
- );
+ $this->showGoogleSearch( $term );
}
return;
$this->showResults( $term );
}
+ /**
+ * Output a google search form if search is disabled
+ *
+ * @param string $term Search term
+ * @todo FIXME Maybe we should get rid of this raw html message at some future time
+ * @suppress SecurityCheck-XSS
+ */
+ private function showGoogleSearch( $term ) {
+ $this->getOutput()->addHTML(
+ "<fieldset>" .
+ "<legend>" .
+ $this->msg( 'search-external' )->escaped() .
+ "</legend>" .
+ "<p class='mw-searchdisabled'>" .
+ $this->msg( 'searchdisabled' )->escaped() .
+ "</p>" .
+ $this->msg( 'googlesearch' )->rawParams(
+ htmlspecialchars( $term ),
+ 'UTF-8',
+ $this->msg( 'searchbutton' )->escaped()
+ )->text() .
+ "</fieldset>"
+ );
+ }
+
/**
* Set up basic search parameters from the request and user settings.
*
$includesCachedPages = false;
foreach ( $groups as $group => $sortedPages ) {
- $out->wrapWikiMsg(
- "<h2 class=\"mw-specialpagesgroup\" id=\"mw-specialpagesgroup-$group\">$1</h2>\n",
- "specialpages-group-$group"
- );
+ if ( strpos( $group, '/' ) !== false ) {
+ list( $group, $subGroup ) = explode( '/', $group, 2 );
+ $out->wrapWikiMsg(
+ "<h3 class=\"mw-specialpagessubgroup\">$1</h3>\n",
+ "specialpages-group-$group-$subGroup"
+ );
+ } else {
+ $out->wrapWikiMsg(
+ "<h2 class=\"mw-specialpagesgroup\" id=\"mw-specialpagesgroup-$group\">$1</h2>\n",
+ "specialpages-group-$group"
+ );
+ }
$out->addHTML(
Html::openElement( 'div', [ 'class' => 'mw-specialpages-list' ] )
. '<ul>'
// add raw $hitcount for sorting, because tags-hitcount contains numbers and letters
$newRow .= Xml::tags( 'td', [ 'data-sort-value' => $hitcount ], $hitcountLabel );
- // actions
$actionLinks = [];
- // delete
if ( $showDeleteActions && ChangeTags::canDeleteTag( $tag )->isOK() ) {
$actionLinks[] = $linkRenderer->makeKnownLink(
$this->getPageTitle( 'delete' ),
}
if ( $showManageActions ) { // we've already checked that the user had the requisite userright
- // activate
if ( ChangeTags::canActivateTag( $tag )->isOK() ) {
$actionLinks[] = $linkRenderer->makeKnownLink(
$this->getPageTitle( 'activate' ),
[ 'tag' => $tag ] );
}
- // deactivate
if ( ChangeTags::canDeactivateTag( $tag )->isOK() ) {
$actionLinks[] = $linkRenderer->makeKnownLink(
$this->getPageTitle( 'deactivate' ),
// update groups in external authentication database
Hooks::run( 'UserGroupsChanged', [ $user, $add, $remove, $this->getUser(),
$reason, $oldUGMs, $newUGMs ] );
- MediaWiki\Auth\AuthManager::callLegacyAuthPlugin(
- 'updateExternalDBGroups', [ $user, $add, $remove ]
- );
wfDebug( 'oldGroups: ' . print_r( $oldGroups, true ) . "\n" );
wfDebug( 'newGroups: ' . print_r( $newGroups, true ) . "\n" );
$join_conds = array_merge(
[
'watchlist' => [
- 'INNER JOIN',
+ 'JOIN',
[
'wl_user' => $user->getId(),
'wl_namespace=rc_namespace',
$services = MediaWikiServices::getInstance();
# Show a message about replica DB lag, if applicable
- $lag = $services->getDBLoadBalancer()->safeGetLag( $dbr );
+ $lag = $dbr->getSessionLagStatus()['lag'];
if ( $lag > 0 ) {
$output->showLagWarning( $lag );
}
// Force JOIN order per T106682 to avoid large filesorts
[ 'ORDER BY' => $fromCol, 'LIMIT' => 2 * $queryLimit, 'STRAIGHT_JOIN' ],
[
- 'page' => [ 'INNER JOIN', "$fromCol = page_id" ],
+ 'page' => [ 'JOIN', "$fromCol = page_id" ],
'redirect' => [ 'LEFT JOIN', $on ]
]
);
[],
__CLASS__ . '::showIndirectLinks',
[ 'ORDER BY' => 'page_id', 'LIMIT' => $queryLimit ],
- [ 'page' => [ 'INNER JOIN', "$fromCol = page_id" ] ]
+ [ 'page' => [ 'JOIN', "$fromCol = page_id" ] ]
);
};
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
public function getInputHTML( $value ) {
$this->selected = $value;
$jcond = $rcQuery['fields']['rc_user'] . ' = ' . $imgQuery['fields']['img_user'];
}
$jconds['recentchanges'] = [
- 'INNER JOIN',
+ 'JOIN',
[
'rc_title = img_name',
$jcond,
$fields = array_merge( $rcQuery['fields'], [
'length' => 'page_len', 'rev_id' => 'page_latest', 'page_namespace', 'page_title'
] );
- $join_conds = [ 'page' => [ 'INNER JOIN', 'page_id=rc_cur_id' ] ] + $rcQuery['joins'];
+ $join_conds = [ 'page' => [ 'JOIN', 'page_id=rc_cur_id' ] ] + $rcQuery['joins'];
// Avoid PHP 7.1 warning from passing $this by reference
$pager = $this;
--- /dev/null
+<?php
+/**
+ * Special pages that are used to get user independent links pointing to
+ * current user's pages (user page, talk page, contributions, etc.).
+ * This can let us cache a single copy of some generated content for all
+ * users or be linked in wikitext help pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Special page pointing to current user's uploaded files (including old versions).
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialAllMyUploads extends RedirectSpecialPage {
+ public function __construct() {
+ parent::__construct( 'AllMyUploads' );
+ $this->mAllowedRedirectParams = [ 'limit', 'ilsearch' ];
+ }
+
+ /**
+ * @param string|null $subpage
+ * @return Title
+ */
+ public function getRedirect( $subpage ) {
+ $this->mAddedRedirectParams['ilshowall'] = 1;
+
+ return SpecialPage::getTitleFor( 'Listfiles', $this->getUser()->getName() );
+ }
+
+ /**
+ * Target identifies a specific User. See T109724.
+ *
+ * @since 1.27
+ * @return bool
+ */
+ public function personallyIdentifiableTarget() {
+ return true;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Implements Special:ListAdmins
+ *
+ * Copyright © 2004 Brion Vibber, lcrocker, Tim Starling,
+ * Domas Mituzas, Antoine Musso, Jens Frank, Zhengzhu,
+ * 2006 Rob Church <robchur@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Redirect page: Special:ListAdmins --> Special:ListUsers/sysop.
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialListAdmins extends SpecialRedirectToSpecial {
+ function __construct() {
+ parent::__construct( 'Listadmins', 'Listusers', 'sysop' );
+ }
+}
--- /dev/null
+<?php
+/**
+ * Implements Special:ListBots
+ *
+ * Copyright © 2004 Brion Vibber, lcrocker, Tim Starling,
+ * Domas Mituzas, Antoine Musso, Jens Frank, Zhengzhu,
+ * 2006 Rob Church <robchur@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Redirect page: Special:ListBots --> Special:ListUsers/bot.
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialListBots extends SpecialRedirectToSpecial {
+ function __construct() {
+ parent::__construct( 'Listbots', 'Listusers', 'bot' );
+ }
+}
--- /dev/null
+<?php
+/**
+ * Special pages that are used to get user independent links pointing to
+ * current user's pages (user page, talk page, contributions, etc.).
+ * This can let us cache a single copy of some generated content for all
+ * users or be linked in wikitext help pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Special page pointing to current user's contributions.
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialMycontributions extends RedirectSpecialPage {
+ public function __construct() {
+ parent::__construct( 'Mycontributions' );
+ $this->mAllowedRedirectParams = [ 'limit', 'namespace', 'tagfilter',
+ 'offset', 'dir', 'year', 'month', 'feed', 'deletedOnly',
+ 'nsInvert', 'associated', 'newOnly', 'topOnly', 'start', 'end' ];
+ }
+
+ /**
+ * @param string|null $subpage
+ * @return Title
+ */
+ public function getRedirect( $subpage ) {
+ return SpecialPage::getTitleFor( 'Contributions', $this->getUser()->getName() );
+ }
+
+ /**
+ * Target identifies a specific User. See T109724.
+ *
+ * @since 1.27
+ * @return bool
+ */
+ public function personallyIdentifiableTarget() {
+ return true;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Special pages that are used to get user independent links pointing to
+ * current user's pages (user page, talk page, contributions, etc.).
+ * This can let us cache a single copy of some generated content for all
+ * users or be linked in wikitext help pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Special page pointing to current user's user page.
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialMypage extends RedirectSpecialArticle {
+ public function __construct() {
+ parent::__construct( 'Mypage' );
+ }
+
+ /**
+ * @param string|null $subpage
+ * @return Title
+ */
+ public function getRedirect( $subpage ) {
+ if ( $subpage === null || $subpage === '' ) {
+ return Title::makeTitle( NS_USER, $this->getUser()->getName() );
+ }
+
+ return Title::makeTitle( NS_USER, $this->getUser()->getName() . '/' . $subpage );
+ }
+
+ /**
+ * Target identifies a specific User. See T109724.
+ *
+ * @since 1.27
+ * @return bool
+ */
+ public function personallyIdentifiableTarget() {
+ return true;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Special pages that are used to get user independent links pointing to
+ * current user's pages (user page, talk page, contributions, etc.).
+ * This can let us cache a single copy of some generated content for all
+ * users or be linked in wikitext help pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Special page pointing to current user's talk page.
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialMytalk extends RedirectSpecialArticle {
+ public function __construct() {
+ parent::__construct( 'Mytalk' );
+ }
+
+ /**
+ * @param string|null $subpage
+ * @return Title
+ */
+ public function getRedirect( $subpage ) {
+ if ( $subpage === null || $subpage === '' ) {
+ return Title::makeTitle( NS_USER_TALK, $this->getUser()->getName() );
+ }
+
+ return Title::makeTitle( NS_USER_TALK, $this->getUser()->getName() . '/' . $subpage );
+ }
+
+ /**
+ * Target identifies a specific User. See T109724.
+ *
+ * @since 1.27
+ * @return bool
+ */
+ public function personallyIdentifiableTarget() {
+ return true;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Special pages that are used to get user independent links pointing to
+ * current user's pages (user page, talk page, contributions, etc.).
+ * This can let us cache a single copy of some generated content for all
+ * users or be linked in wikitext help pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Special page pointing to current user's uploaded files.
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialMyuploads extends RedirectSpecialPage {
+ public function __construct() {
+ parent::__construct( 'Myuploads' );
+ $this->mAllowedRedirectParams = [ 'limit', 'ilshowall', 'ilsearch' ];
+ }
+
+ /**
+ * @param string|null $subpage
+ * @return Title
+ */
+ public function getRedirect( $subpage ) {
+ return SpecialPage::getTitleFor( 'Listfiles', $this->getUser()->getName() );
+ }
+
+ /**
+ * Target identifies a specific User. See T109724.
+ *
+ * @since 1.27
+ * @return bool
+ */
+ public function personallyIdentifiableTarget() {
+ return true;
+ }
+}
return Status::newFatal( 'botpasswords-locked' );
}
- // Throttle
$throttle = null;
if ( !empty( $wgPasswordAttemptThrottle ) ) {
$throttle = new MediaWiki\Auth\Throttler( $wgPasswordAttemptThrottle, [
return false;
}
- // Reject various classes of invalid names
- $name = AuthManager::callLegacyAuthPlugin(
- 'getCanonicalName', [ $t->getText() ], $t->getText()
- );
+ $name = $t->getText();
switch ( $validate ) {
case false:
// update groups in external authentication database
Hooks::run( 'UserGroupsChanged', [ $this, $toPromote, [], false, false, $oldUGMs, $newUGMs ] );
- AuthManager::callLegacyAuthPlugin( 'updateExternalDBGroups', [ $this, $toPromote ] );
$logEntry = new ManualLogEntry( 'rights', 'autopromote' );
$logEntry->setPerformer( $this );
if ( $this->mLocked !== null ) {
return $this->mLocked;
}
- // Avoid PHP 7.1 warning of passing $this by reference
- $user = $this;
- $authUser = AuthManager::callLegacyAuthPlugin( 'getUserInstance', [ &$user ], null );
- $this->mLocked = $authUser && $authUser->isLocked();
+ // Reset for hook
+ $this->mLocked = false;
Hooks::run( 'UserIsLocked', [ $this, &$this->mLocked ] );
return $this->mLocked;
}
}
$this->getBlockedStatus();
if ( !$this->mHideName ) {
- // Avoid PHP 7.1 warning of passing $this by reference
- $user = $this;
- $authUser = AuthManager::callLegacyAuthPlugin( 'getUserInstance', [ &$user ], null );
- $this->mHideName = $authUser && $authUser->isHidden();
+ // Reset for hook
+ $this->mHideName = false;
Hooks::run( 'UserIsHidden', [ $this, &$this->mHideName ] );
}
return (bool)$this->mHideName;
if ( $type == 'created' || $type === false ) {
$message = 'confirmemail_body';
+ $type = 'created';
} elseif ( $type === true ) {
$message = 'confirmemail_body_changed';
+ $type = 'changed';
} else {
// Messages: confirmemail_body_changed, confirmemail_body_set
$message = 'confirmemail_body_' . $type;
}
- return $this->sendMail( wfMessage( 'confirmemail_subject' )->text(),
- wfMessage( $message,
+ $mail = [
+ 'subject' => wfMessage( 'confirmemail_subject' )->text(),
+ 'body' => wfMessage( $message,
$this->getRequest()->getIP(),
$this->getName(),
$url,
$wgLang->userTimeAndDate( $expiration, $this ),
$invalidateURL,
$wgLang->userDate( $expiration, $this ),
- $wgLang->userTime( $expiration, $this ) )->text() );
+ $wgLang->userTime( $expiration, $this ) )->text(),
+ 'from' => null,
+ 'replyTo' => null,
+ ];
+ $info = [
+ 'type' => $type,
+ 'ip' => $this->getRequest()->getIP(),
+ 'confirmURL' => $url,
+ 'invalidateURL' => $invalidateURL,
+ 'expiration' => $expiration
+ ];
+
+ Hooks::run( 'UserSendConfirmationMail', [ $this, &$mail, $info ] );
+ return $this->sendMail( $mail['subject'], $mail['body'], $mail['from'], $mail['replyTo'] );
}
/**
* @param string $body Message body
* @param User|null $from Optional sending user; if unspecified, default
* $wgPasswordSender will be used.
- * @param string|null $replyto Reply-To address
+ * @param MailAddress|null $replyto Reply-To address
* @return Status
*/
public function sendMail( $subject, $body, $from = null, $replyto = null ) {
private function getWatchedItemsWithRCInfoQueryJoinConds( array $options ) {
$joinConds = [
- 'watchlist' => [ 'INNER JOIN',
+ 'watchlist' => [ 'JOIN',
[
'wl_namespace=rc_namespace',
'wl_title=rc_title'
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
public function getConfig( &$config ) {
$config['required'] = $this->required;
"sat": "Sab",
"january": "Buleuen Sa",
"february": "Buleuen Duwa",
- "march": "Buleuën Lhèë",
- "april": "Buleuën Peuët",
- "may_long": "Buleuën Limöng",
- "june": "Buleuën Nam",
- "july": "Buleuën Tujôh",
- "august": "Buleuën Lapan",
- "september": "Buleuën Sikureuëng",
- "october": "Buleuën Siplôh",
- "november": "Buleuën Siblaih",
+ "march": "Buleuen Lhèe",
+ "april": "Buleuen Peuet",
+ "may_long": "Buleuen Limöng",
+ "june": "Buleuen Nam",
+ "july": "Buleuen Tujôh",
+ "august": "Buleuen Lapan",
+ "september": "Buleuen Sikureueng",
+ "october": "Buleuen Siplôh",
+ "november": "Buleuen Siblaih",
"december": "Buleuen Duwa Blaih",
- "january-gen": "Buleuën Sa",
- "february-gen": "Buleuën Duwa",
- "march-gen": "Buleuën Lhèë",
- "april-gen": "Buleuën Peuët",
- "may-gen": "Buleuën Limöng",
- "june-gen": "Buleuën Nam",
- "july-gen": "Buleuën Tujôh",
- "august-gen": "Buleuën Lapan",
- "september-gen": "Buleuën Sikureuëng",
- "october-gen": "Buleuën Siplôh",
- "november-gen": "Buleuën Siblaih",
- "december-gen": "Buleuën Duwa Blaih",
+ "january-gen": "Buleuen Sa",
+ "february-gen": "Buleuen Duwa",
+ "march-gen": "Buleuen Lhèe",
+ "april-gen": "Buleuen Peuet",
+ "may-gen": "Buleuen Limöng",
+ "june-gen": "Buleuen Nam",
+ "july-gen": "Buleuen Tujôh",
+ "august-gen": "Buleuen Lapan",
+ "september-gen": "Buleuen Sikureueng",
+ "october-gen": "Buleuen Siplôh",
+ "november-gen": "Buleuen Siblaih",
+ "december-gen": "Buleuen Duwa Blaih",
"jan": "Sa",
"feb": "Duwa",
- "mar": "Lhèë",
- "apr": "Peuët",
+ "mar": "Lhèe",
+ "apr": "Peuet",
"may": "Limöng",
"jun": "Nam",
"jul": "Tujôh",
"oct": "Siplôh",
"nov": "Siblaih",
"dec": "Duwa Blaih",
- "january-date": "$1 Buleuën Sa",
- "february-date": "$1 Buleuën Duwa",
- "march-date": "$1 Buleuën Lhèë",
- "april-date": "$1 Buleuën Peuët",
- "may-date": "$1 Buleuën Limong",
- "june-date": "$1 Buleuën Nam",
- "july-date": "$1 Buleuën Tujôh",
- "august-date": "$1 Buleuën Lapan",
- "september-date": "$1 Buleuën Sikureuëng",
- "october-date": "$1 Buleuën Siplôh",
- "november-date": "$1 Buleuën Siblaih",
- "december-date": "$1 Buleuën Duwa Blaih",
+ "january-date": "$1 Buleuen Sa",
+ "february-date": "$1 Buleuen Duwa",
+ "march-date": "$1 Buleuen Lhèe",
+ "april-date": "$1 Buleuen Peuet",
+ "may-date": "$1 Buleuen Limöng",
+ "june-date": "$1 Buleuen Nam",
+ "july-date": "$1 Buleuen Tujôh",
+ "august-date": "$1 Buleuen Lapan",
+ "september-date": "$1 Buleuen Sikureueng",
+ "october-date": "$1 Buleuen Siplôh",
+ "november-date": "$1 Buleuen Siblaih",
+ "december-date": "$1 Buleuen Duwa Blaih",
"pagecategories": "{{PLURAL:$1|Kawan}}",
"category_header": "Seunurat lam kawan \"$1\"",
"subcategories": "Aneuk kawan",
"edithelp": "Bantu peusaneut",
"helppage-top-gethelp": "Beunantu",
"mainpage": "Ôn Keue",
- "mainpage-description": "Ôn Keuë",
+ "mainpage-description": "Ôn Keue",
"policy-url": "Project:Neuatô",
"portal": "Meusapat",
"portal-url": "Project:Meusapat",
"listfiles-latestversion-no": "Kön",
"file-anchor-link": "Beureukaih",
"filehist": "Riwayat beureukaih",
- "filehist-help": "Neuteugon bak uroë buleuën/watèë keu neu'eu beureukaih nyoë ‘oh watèë nyan.",
+ "filehist-help": "Neuteugon bak uroe buleuen/watèe keu neu-eu beureukaih nyoe ‘oh watèe nyan.",
"filehist-deleteall": "sampôh ban dum",
"filehist-deleteone": "sampôh",
"filehist-revert": "peuriwang",
"filehist-current": "jinoë hat",
- "filehist-datetime": "Uroë buleuën/Watèë",
+ "filehist-datetime": "Uroe buleuen/Watèe",
"filehist-thumb": "Beuntuk ubeut",
"filehist-thumbtext": "Beuntuk ubeut keu seunalén tiëp $1",
"filehist-nothumb": "Hana beuntuk ubeut",
"protect-cascade": "Peulindông ban mandum ôn nyang rôh lam ôn nyoë (lindông meuturôt).",
"protect-cantedit": "Droëneuh h‘an jeuët neu’ubah tingkat lindông ôn nyoë kareuna Droëneuh hana hak keu neupeulaku nyan.",
"protect-otherreason": "Alasan laén/teunamah:",
- "protect-expiry-options": "1 jeum:1 hour,1 uroë:1 day,1 minggu:1 week,2 minggu:2 weeks,1 buleuën:1 month,3 buleuën:3 months,6 buleuën:6 months,1 thôn:1 year,sabé:infinite",
+ "protect-expiry-options": "1 jeum:1 hour,1 uroe:1 day,1 minggu:1 week,2 minggu:2 weeks,1 buleuen:1 month,3 buleuen:3 months,6 buleuen:6 months,1 thôn:1 year,sabé:infinite",
"restriction-type": "Lindông:",
"restriction-level": "Tingkat:",
"restriction-edit": "Peusaneut",
"anoncontribs": "Beuneuri",
"contribsub2": "Keu {{GENDER:$3|$1}} ($2)",
"uctop": "jinoë",
- "month": "Mula phôn buleuën (ngön sigohlomjih)",
+ "month": "Mula phôn buleuen (ngön sigohlomjih)",
"year": "Mula phôn thôn (ngön sigohlomjih)",
"sp-contributions-newbies": "Peuleumah beuneuri atra ureuëng ban dapeuta mantöng",
"sp-contributions-newbies-sub": "Keu ureuëng nguy barô",
"whatlinkshere-filters": "Saréng",
"blockip": "Theun ureuëng ngui",
"ipbreason": "Alasan:",
- "ipboptions": "2 jeum:2 hours,1 uroë:1 day,3 uroë:3 days,1 minggu:1 week,2 minggu:2 weeks,1 buleuën:1 month,3 buleuën:3 months,6 buleuën:6 months,1 thôn:1 year,sabé:infinite",
+ "ipboptions": "2 jeum:2 hours,1 uroe:1 day,3 uroe:3 days,1 minggu:1 week,2 minggu:2 weeks,1 buleuen:1 month,3 buleuen:3 months,6 buleuen:6 months,1 thôn:1 year,sabé:infinite",
"ipbhidename": "Peusom nan ureueng ngui nibak hasé peusaneut ngön dapeuta",
"ipblocklist": "Ureuëng ngui teutheun",
"blocklist-reason": "Alasan",
"tooltip-search": "Mita lam {{SITENAME}}",
"tooltip-search-go": "Mita saboh ôn ngon nan nyang paih lagèe nyoe meunyo na",
"tooltip-search-fulltext": "Mita ôn nyang na asoe lagèe nyoe",
- "tooltip-p-logo": "Saweuë ôn keuë",
- "tooltip-n-mainpage": "Saweuë ôn keuë",
- "tooltip-n-mainpage-description": "Saweuë ôn keuë",
+ "tooltip-p-logo": "Saweue ôn keue",
+ "tooltip-n-mainpage": "Saweue ôn keue",
+ "tooltip-n-mainpage-description": "Saweue ôn keue",
"tooltip-n-portal": "Bhaih buët, peuë nyang jeuët neupubuët, pat keu mita sipeuë hai",
"tooltip-n-currentevents": "Mita haba barô",
"tooltip-n-recentchanges": "Dapeuta neuubah barô lam wiki.",
"authmanager-create-no-primary": "nipabeliay a pincen caay pisaungay i canghaw patizeng.",
"authmanager-link-no-primary": "nipabeliay a pincen caay pisaungay i canghaw masasiket.",
"authmanager-link-not-in-progress": "canghaw patizeng caay henay miteka saca kasasiketan kalunasulitan mahedaw tuway, piliyaw miteka aca.",
- "authmanager-authplugin-setpass-failed-title": "misumad mima mungangaw",
- "authmanager-authplugin-setpass-failed-message": "zencen cait ihekal makai misaimed tu mima.",
- "authmanager-authplugin-create-fail": "zencen cait ihekal makai patizeng tu canghaw.",
- "authmanager-authplugin-setpass-denied": "zencen cait ihekal caay mahasa misumad tu mima.",
- "authmanager-authplugin-setpass-bad-domain": "la’cusay a calay-subal(wangyi).",
"authmanager-autocreate-noperm": "caay mahasa lunuk canghaw patizeng.",
"authmanager-autocreate-exception": "lunuk canghaw patizeng zayhan mungangaw sisa nanunuz paedeb.",
"authmanager-userdoesnotexist": "misaungayay canghaw \"$1\" caay henay pangangan.",
"nstab-template": "Plantilla",
"nstab-help": "Aduya",
"nstab-category": "Categoría",
+ "mainpage-nstab": "Pachina principal",
"nosuchaction": "No se reconoixe ista acción",
"nosuchactiontext": "L'acción especificata por a URL no ye conforme.\nTalment s'haiga entivocau en escribir a URL, u haiga seguiu un vinclo incorrecto.\nTamién podría marcar un bug en o software emplegato por {{SITENAME}}.",
"nosuchspecialpage": "No existe ixa pachina especial",
"Azouz.anis",
"Elbasyouny",
"Omar Ghrida",
- "AHmed Khaled"
+ "AHmed Khaled",
+ "البراء صالح"
]
},
"tog-underline": "سطر تحت الوصلات:",
"view": "مطالعة",
"view-foreign": "اعرض في $1",
"edit": "عدل",
- "edit-local": "تعدÙ\8aل الوصف المحلي",
+ "edit-local": "عدل الوصف المحلي",
"create": "أنشئ",
"create-local": "أضف وصفا محليا",
"delete": "حذف",
"history-feed-item-nocomment": "$1 في $2",
"history-feed-empty": "الصفحة المطلوبة غير موجودة.\nمن المحتمل أن تكون هذه الصفحة قد حذفت من الويكي، أو نقلت.\nحاول [[Special:Search|البحث في الويكي]] عن صفحات جديدة ذات صلة.",
"history-edit-tags": "عدل وسوم المراجعات المختارة",
- "rev-deleted-comment": "(أزيل ملخص التعديل)",
+ "rev-deleted-comment": "(ملخص التعديل تمت إزالته)",
"rev-deleted-user": "(اسم المستخدم تمت إزالته)",
- "rev-deleted-event": "(محيت تفاصيل السجل)",
+ "rev-deleted-event": "(تفاصيل السجل تمت إزالتها)",
"rev-deleted-user-contribs": "[اسم المستخدم أو عنوان الأيبي تمت إزالته - التعديل مخفي من المساهمات]",
"rev-deleted-text-permission": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
"rev-suppressed-text-permission": "هذه النسخة قد <strong>أخفيت</strong> ([{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} تفاصيل].)",
"revdelete-legend": "وضع ضوابط رؤية",
"revdelete-hide-text": "نص المراجعة",
"revdelete-hide-image": "أخف محتوى الملف",
- "revdelete-hide-name": "أخف الهدف والمعيار",
+ "revdelete-hide-name": "أخف الهدف والمعاملات",
"revdelete-hide-comment": "ملخص التعديل",
"revdelete-hide-user": "اسم المستخدم/عنوان الآيبي",
"revdelete-hide-restricted": "أخف البيانات عن الإداريين إضافة إلى الآخرين",
"file-anchor-link": "ملف",
"filehist": "تاريخ الملف",
"filehist-help": "اضغط على زمن/تاريخ لرؤية الملف كما بدا في هذا الزمن.",
- "filehist-deleteall": "اØØ°Ù\81 اÙ\84Ù\83Ù\84",
+ "filehist-deleteall": "حذف الكل",
"filehist-deleteone": "حذف",
"filehist-revert": "استرجع",
"filehist-current": "حالي",
"sharedupload-desc-create": "هذا ملف من $1 وقد يكون مستخدما في مشاريع أخرى.\nيمكن لك أن تعدل وصف الملف في [$2 صفحته] هناك.",
"filepage-nofile": "لا ملف موجود بهذا الاسم.",
"filepage-nofile-link": "لا يوجد ملف بهذا الاسم، لكن يمكنك [$1 رفعه].",
- "uploadnewversion-linktext": "ارÙ\81ع Ù\86سخة جدÙ\8aدة Ù\85Ù\86 Ù\87ذا اÙ\84Ù\85Ù\84Ù\81",
+ "uploadnewversion-linktext": "رفع نسخة جديدة من هذا الملف",
"shared-repo-from": "من $1",
"shared-repo": "مستودع مشترك",
"shared-repo-name-wikimediacommons": "ويكيميديا كومنز",
"filerevert-success": "'''[[Media:$1|$1]]''' تم استرجاعها [$4 للنسخة بتاريخ $3، $2].",
"filerevert-badversion": "لا توجد نسخة محلية سابقة لهذا الملف بالتاريخ المعطى.",
"filerevert-identical": "الإصدار الحالي من الملف بالفعل مطابق للإصدار المحدد.",
- "filedelete": "اØØ°Ù\81 $1",
- "filedelete-legend": "اØØ°Ù\81 اÙ\84Ù\85Ù\84Ù\81",
- "filedelete-intro": "أنت على وشك حذف الملف '''[[Media:$1|$1]]''' مع كل تاريخه.",
+ "filedelete": "حذف $1",
+ "filedelete-legend": "حذف الملف",
+ "filedelete-intro": "أنت على وشك حذف الملف <strong>[[Media:$1|$1]]</strong> مع كل تاريخه.",
"filedelete-intro-old": "أنت تحذف نسخة '''[[Media:$1|$1]]''' بتاريخ [$4 $3، $2].",
"filedelete-comment": "السبب:",
"filedelete-submit": "حذف",
"ipb-disableusertalk": "تعديل صفحة نقاشه",
"ipb-change-block": "أعد منع المستخدم بهذه الإعدادات",
"ipb-confirm": "أكّد المنع",
- "ipb-sitewide": "الموقع بأكمله",
+ "ipb-sitewide": "كامل",
"ipb-partial": "جزئي",
"ipb-pages-label": "الصفحات",
- "ipb-namespaces-label": "النطاقات",
+ "ipb-namespaces-label": "نطاقات",
"badipaddress": "عنوان أيبي غير صحيح",
"blockipsuccesssub": "تم المنع بنجاح",
"blockipsuccesstext": "[[Special:Contributions/$1|$1]] تم {{GENDER:$1|منعه|منعها}}.<br />\nطالع [[Special:BlockList|قائمة منع الآيبي]] لمراجعة حالات المنع.",
"databasenotlocked": "قاعدة البيانات ليست مغلقة.",
"lockedbyandtime": "(من $1 على $2 في $3 )",
"move-page": "نقل $1",
- "move-page-legend": "نقل صفحة",
+ "move-page-legend": "Ù\86Ù\82Ù\84 اÙ\84صÙ\81ØØ©",
"movepagetext": "باستخدام الاستمارة بالأسفل بإمكانك أن تغير اسم الصفحة، وأن تنقل تاريخها إلى الاسم الجديد.\nالعنوان القديم سيصبح تحويلة للعنوان الجديد.\nيمكنك أن تترك التحويلات التي تشير إلى العنوان الأصلي كما هي لتقوم البوتات بتحديثها تلقائياً.\nإذا اخترت أن تقوم بالتحديث يدوياً، فتأكد من عدم وجود تحويلات [[Special:DoubleRedirects|مزدوجة]] أو [[Special:BrokenRedirects|مكسورة]] وقم بتصحيحها.\nأنت المسؤول عن التأكد من أن الوصلات تصل إلى الصفحات التي يفترض أن تصل إليها.\n\nلاحظ أنه <strong>لن يتم</strong> نقل الصفحة إذا وجدت صفحة في العنوان الجديد، إلا إذا كانت صفحة تحويل، ولا تاريخ لها.\nهذا يعني أنك تستطيع استرجاع الصفحة إلى مكانها لو قمت بخطأ، ولا يمكنك نسخ هذه الصفحة فوق صفحة موجودة.\n\n<strong>ملاحظة:</strong>\n\nهذا قد يكون تغييراً كارثياً وغير متوقع لصفحة مشهورة؛\nمن فضلك تأكد أنك تفهم عواقب هذا الفعل قبل أن تستمر.",
"movepagetext-noredirectfixer": "باستخدام الاستمارة بالأسفل بإمكانك أن تغير اسم الصفحة، وأن تنقل تاريخها إلى الاسم الجديد.\nالعنوان القديم سيصبح تحويلة للعنوان الجديد.\nيمكنك تحديث التحويلات التي تشير إلى العنوان الأصلي تلقائياً.\nلو اخترت ألا تفعل، تأكد من عدم وجود تحويلات [[Special:DoubleRedirects|مزدوجة]] أو [[Special:BrokenRedirects|مكسورة]].\nأنت المسؤول عن التأكد من أن الوصلات تصل إلى الصفحات التي يفترض أن تصل إليها.\n\nلاحظ أنه <strong>لن يتم</strong> نقل الصفحة إذا كان هناك صفحة بنفس العنوان الجديد، إلا إذا كانت فارغة، أو تحويلة لا تاريخ لها.\nهذا يعني أنك تستطيع استرجاع الصفحة إلى مكانها لو قمت بخطأ، وأنك لا يمكنك الكتابة على صفحة موجودة.\n\n<strong>ملاحظة</strong> \n\nهذا قد يكون تغييراً كارثياً وغير متوقع لصفحة مشهورة؛\nمن فضلك تأكد أنك تفهم عواقب هذا الفعل قبل أن تستمر.",
"movepagetalktext": "لو علمت على هذا الصندوق، فصفحة النقاش المرفقة يتم نقلها أوتوماتيكيا للعنوان الجديد، إلا لو كانت صفحة نقاش غير فارغة هناك بالفعل.\n\nفي هذه الحالة، فسيتعين عليك نقل أو دمج الصفحة يدويا لو رغبت في ذلك.",
"cant-move-to-category-page": "أنت لا تمتلك صلاحية نقل صفحة إلى صفحة تصنيف.",
"cant-move-subpages": "أنت لا تمتلك الصلاحية لنقل الصفحات الفرعية.",
"namespace-nosubpages": "النطاق \"$1\" لا يسمح بالصفحات الفرعية.",
- "newtitle": "عÙ\86Ù\88اÙ\86 جديد:",
- "move-watch": "راقب هذه الصفحة",
+ "newtitle": "اÙ\84عÙ\86Ù\88اÙ\86 اÙ\84جديد:",
+ "move-watch": "راقب الصفحتين المنقول منها والمنقول إليها",
"movepagebtn": "انقل الصفحة",
"pagemovedsub": "تم النقل بنجاح",
"cannotmove": "تعذر نقل الصفحة; {{PLURAL:$1|للسبب التالي|للأسباب التالية}}:",
"move-subpages": "انقل الصفحات الفرعية (حتى $1)",
"move-talk-subpages": "انقل الصفحات الفرعية لصفحة النقاش (حتى $1)",
"movepage-page-exists": "الصفحة $1 موجودة بالفعل ولا يمكن الكتابة عليها تلقائياً.",
- "movepage-page-moved": "نقلت صفحة $1 إلى $2.",
+ "movepage-page-moved": "نقلت صفحة $1 إلى $2 بنجاح.",
"movepage-page-unmoved": "لم يمكن نقل صفحة $1 إلى $2.",
- "movepage-max-pages": "تم نقل الحد الأقصى وهو {{PLURAL:$1||صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}} ولن يتم نقل المزيد تلقائياً.",
+ "movepage-max-pages": "تم نقل الحد الأقصى وهو {{PLURAL:$1|صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}} ولن يتم نقل المزيد تلقائيا.",
"movelogpage": "سجل النقل",
"movelogpagetext": "بالأسفل قائمة بالصفحات التي تم نقلها.",
"movesubpage": "{{PLURAL:$1||الصفحة الفرعية|الصفحتان الفرعيتان|الصفحات الفرعية}}",
"logentry-rights-autopromote": "تمَ تلقائياً ترقية {{GENDER:$2|المستخدم|المستخدمة}} $1 من $4 إلى $5",
"logentry-upload-upload": " {{GENDER:$2|رفع|رفعت}} $1 $3",
"logentry-upload-overwrite": "{{GENDER:$2|رفع|رفعت}} $1 نسخة جديدة من $3",
- "logentry-upload-revert": "{{GENDER:$2|رفع|رفعت}} $1 $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|استرجع|استرجعت}} $3 لنسخة قديمة",
"log-name-managetags": "سجل إدارة الوسوم",
"log-description-managetags": "هذه الصفحة تعرض مهام الإدارة المرتعلقة ب[[Special:Tags|الوسوم]]. السجل يحتوي فقط على الافعال التي تم عملها يدويا بواسطة إداري؛ الوسوم ربما يتم إنشاؤها او حذفها بواسطة برنامج الويكي بدون تسجيل مدخلة في هذا السجل.",
"logentry-managetags-create": "$1 {{GENDER:$2|أنشأ|أنشأت}} الوسم \"$4\"",
"log-action-filter-suppress-reblock": "إخفاء المستخدم بواسطة إعادة المنع",
"log-action-filter-upload-upload": "رفع جديد",
"log-action-filter-upload-overwrite": "إعادة الرفع",
+ "log-action-filter-upload-revert": "استرجاع",
"authmanager-authn-not-in-progress": "عملية التحقق ليست جارية أو بينات الجلسة تم فقدها. من فضلك ابدأ مرة ثانية من البداية.",
"authmanager-authn-no-primary": "الاعتماد الموفر لم يمكن التحقق منه.",
"authmanager-authn-no-local-user": "الاعتماد الموفر غير مرتبط بأي مستخدم على هذه الويكي.",
"authmanager-create-no-primary": "الاعتمادات الموفرة لم يمكن استخدامها لإنشاء الحساب.",
"authmanager-link-no-primary": "الاعتماد الموفر لم يمكن استخدامه لوصل الحسابات.",
"authmanager-link-not-in-progress": "وصل الحساب ليس جاريا أو بيانات الجلسة تم فقدها. من فضلك ابدأ ثانية من البداية.",
- "authmanager-authplugin-setpass-failed-title": "تغيير كلمة السر فشل",
- "authmanager-authplugin-setpass-failed-message": "إضافة التحقق رفضت تغيير كلمة السر.",
- "authmanager-authplugin-create-fail": "إضافة التحقق رفضت إنشاء الحساب.",
- "authmanager-authplugin-setpass-denied": "إضافة التحقق لا تسمح بتغيير كلمات السر.",
- "authmanager-authplugin-setpass-bad-domain": "نطاق غير صحيح.",
"authmanager-autocreate-noperm": "إنشاء الحساب التلقائي غير مسموح به.",
"authmanager-autocreate-exception": "إنشاء الحسابات التلقائي تم تعطيله مؤقتا نظرا للأخطاء السابقة.",
"authmanager-userdoesnotexist": "حساب المستخدم \"$1\" غير مسجل.",
"passwordpolicies-policy-maximalpasswordlength": "يجب أن يكون طول كلمة المرور أقل من $1 {{PLURAL:$1|حرف|أحرف}}",
"passwordpolicies-policy-passwordcannotbepopular": "لا يمكن أن تكون كلمة المرور {{PLURAL:$1|كلمة المرور الشائعة|في قائمة كلمات المرور الشائعة الـ$1}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "لا يمكن أن تكون كلمة المرور في قائمة كلمات المرور الـ100.000 الأكثر استخداما.",
+ "passwordpolicies-policyflag-forcechange": "يجب أن تتغير عند تسجيل الدخول",
"easydeflate-invaliddeflate": "المحتوى المقدم لا يتم تفريغه بشكل صحيح",
"unprotected-js": "لأسباب تتعلق بالأمان; لا يمكن تحميل جافا سكريبت من الصفحات غير المحمية; الرجاء إنشاء جافا سكريبت فقط في نطاق ميدياويكي: أو كصفحة فرعية للمستخدم"
}
"authmanager-create-no-primary": "Les credenciales apurríes nun pueden usase pa crear cuentes.",
"authmanager-link-no-primary": "Les credenciales apurríes nun pueden usase pa enllazar cuentes.",
"authmanager-link-not-in-progress": "L'enllazáu de la cuenta nun ta progresando, o perdiéronse los datos de la sesión. Por favor, vuelve de nueves al principiu.",
- "authmanager-authplugin-setpass-failed-title": "Falló'l cambiu de contraseña",
- "authmanager-authplugin-setpass-failed-message": "El complementu d'autenticación refugó'l cambéu de contraseña.",
- "authmanager-authplugin-create-fail": "El complementu d'autenticación refugó la creación de la cuenta.",
- "authmanager-authplugin-setpass-denied": "El complementu de autenticación nun permite cambiar contraseñes.",
- "authmanager-authplugin-setpass-bad-domain": "Dominiu inválidu.",
"authmanager-autocreate-noperm": "Nun se permite la creación automática de cuentes.",
"authmanager-autocreate-exception": "La creación automática de cuentes desactivóse temporalmente por cuenta d'errores previos.",
"authmanager-userdoesnotexist": "La cuenta d'usuariu «$1» nun ta rexistrada.",
"tog-hideminor": "Palsera va <i>Noeltaf betakseem</i> mezolonaf",
"tog-hidepatrolled": "Palsera va fieyen betaks div noeltaf betakseem",
"tog-newpageshidepatrolled": "Palsera va fieyenu bu mal vexala dem warzafu bu",
+ "tog-hidecategorization": "Palsera va bulomara",
"tog-extendwatchlist": "Divatcera va suzdasiki ta nedira va kot rorewan betaks",
"tog-usenewrc": "Noeltaf betakseem tulogijayan (kucilas va Javascript)",
"tog-numberheadings": "Mivaskafa vergumveltotukara",
"tog-watchdefault": "Loplekura va jinon betanu bu iku iyeltak gu suzdaxa",
"tog-watchmoves": "Kosuzdara va jinon arrundan bueem",
"tog-watchdeletion": "Kosuzdara va jinon sulan bueem",
+ "tog-watchuploads": "Loplekura va warzaf iyeltak | Kalvajara ko suzdaxa",
"tog-minordefault": "Jinaf betakseem omavon mezolonon zo torigid",
"tog-previewontop": "Abdinedira nediwer vamoe sutelaxo",
"tog-previewonfirst": "Nedira va abdinedira bal taneafa betara",
"underline-always": "Kotviele",
"underline-never": "Meviele",
"underline-default": "Omavafa exulexa",
+ "editfont-sansserif": "Sans-serif eltayinda",
+ "editfont-serif": "Serif eltayinda",
"sunday": "Taneaviel",
"monday": "Toleaviel",
"tuesday": "Bareaviel",
"retypenew": "Va warzaf remravlem gruyel",
"resetpass_submit": "Va beksa bazel nume zo dogluyatal !",
"changepassword-success": "Rinaf remravlem kiewatcon su zo betar ! Nume rinafa dogluyara tir...",
+ "botpasswords-label-appid": "Stiernaf yolt",
+ "botpasswords-label-create": "Redura",
+ "botpasswords-label-update": "Nuskera",
+ "botpasswords-label-cancel": "Measkira",
+ "botpasswords-label-delete": "Sulara",
+ "botpasswords-label-resetpassword": "Va remravlem gire bazel",
+ "botpasswords-label-grants": "Rorewan rictaks :",
+ "botpasswords-label-grants-column": "Rictan",
+ "botpasswords-bad-appid": "$1 stiernaf yolt me tir enaf.",
+ "botpasswords-created-title": "Remravlem ke stiernik tir reduyun",
+ "botpasswords-updated-title": "Remravlem ke stiernik tir nuskeyen",
+ "botpasswords-deleted-title": "Remravlem ke stiernik tir sulayan",
+ "botpasswords-not-exist": "\"$1\" webesik va stiernik yoltkiraf gu \"$2\" me dadir.",
"resetpass_forbidden": "Kona beksa tir merobetana",
+ "resetpass_forbidden-reason": "Remravlem tir merobetana : $1",
"resetpass-submit-loggedin": "Betara va remravlem",
"resetpass-submit-cancel": "Kuidera",
"resetpass-temp-password": "Ugaloraf remravlem :",
"sig_tip": "Rinafa evlakirafa sugdara",
"hr_tip": "Zidafa gluyaxa ( me faversel )",
"summary": "Vildeks:",
- "subject": "Detce/vergumvelt:",
+ "subject": "Detce :",
"minoredit": "Betamaks.",
"watchthis": "Va bat teliz suzdá",
"savearticle": "Giwara",
+ "savechanges": "Giwara va betakseem",
+ "publishpage": "Busanegara",
+ "publishchanges": "Sanegara va betakseem",
+ "savearticle-start": "Bugiwara...",
+ "savechanges-start": "Giwara va betakseem...",
+ "publishpage-start": "Busanegara...",
+ "publishchanges-start": "Sanegara va betakseem...",
"preview": "Abdinedira",
"showpreview": "Abdinedira",
"showdiff": "Nedira va betakseem",
"anoneditwarning": "'''Obral !''' Rin til medogluyayan. Rinafe IP mane ko bubetarizvot zo stragatar. Ede <strong>[$1 va int dogluyal]</strong> oke <strong>[$2 pataredul]</strong>, betaks ik aryona belunda pu rinaf webesikyolt di zo gad.",
- "missingcommenttext": "Va sebuks vlevon bazel, vay !",
- "summary-preview": "Abdinedira va vildeks:",
- "subject-preview": "Abdinedira va detce ik kroj:",
+ "missingcommenttext": "Va sebuks valevon bazel, vay !!",
+ "summary-preview": "Abdinedira va vildeks :",
+ "subject-preview": "Abdinedira va detce :",
+ "previewerrortext": "Rokla sokiyir edje va betakseem fu abdinedil.",
"blockedtitle": "Elekan favesik",
"blockedtext": "<strong>Rinafa favesikpata oku IP mane tid elekayane.</strong>\n\nElekara skuyuna gan $1.\nLazava tir <em>$2</em>.\n\n* Elekaratoza : $8\n* Eleckaratena : $6\n* Xialana elekara : $7\n\nTa keyaksera va $1 ok konar [[{{MediaWiki:Grouppage-sysop}}|ristusik]] rotuzeral.\nVa '\"e-mail\" staksara pu bat favesik' me rofavel vaxede \"e-mail\" mane tir koe rinaf [[Special:Preferences|lodamaceem]] ise vaon faveson me zo elekayal.\nRinafe tise IP mane tir $3 isen ID elekara tir #$5.\nVa batyona pinta ko kota erura vay di bazel !!",
"blockednoreason": "Meka bazena lazava",
"whitelistedittext": "Ta bubetara rin gonaskil ta $1",
"confirmedittext": "Abdi bubetara va rinafe e-mail mane gogruyel. Kan rinaf [[Special:Preferences|favesiklodamaceem]] va rinafe e-mail mane vay plekul ise tuenal !",
- "nosuchsectiontitle": "Me man gabot",
- "nosuchsectiontext": "Rin yawal da va metis gabot betal.",
+ "nosuchsectiontitle": "Me man gabot trasiyin",
+ "nosuchsectiontext": "Va mekruldes gabot labetal.\nBan in zo arrundayar ike zo sulayar edje va bu nediyil.",
"loginreqtitle": "Kucilan favesikyolt",
"loginreqlink": "dogluyara",
"loginreqpagetext": "$1 tir adrafa ta da va aru bu rodisukel.",
"noarticletext-nopermission": "Dure me krent koe batu bu.\nVanmia yonaru bu [[Special:Search/{{PAGENAME}}|va batu bu rotaneyal]],\noke <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|bu={{FULLPAGENAMEE}}}} va icdef logs rotaneyal]</span>, voxe va batu bu vol ronoredul.",
"userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" favesikpata me tir vuesteyena. Vay stujel ede va batu bu roredul ike robetal.",
"userpage-userdoesnotexist-view": "$1 favesikpata me zo koverteyer.",
+ "blocked-notice-logextract": "Bat webesik re zo elekar.\nBocaf \"log\" vuesteks valeveon zo bazer :",
"clearyourcache": "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.\n* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Go to <em>Menu → Settings</em> (<em>Opera → Preferences</em> on a Mac) and then to <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
- "usercssyoucanpreview": "'''Astuce :''' utilisez le bouton '''Prévisualisation''' pour tester votre nouvelle feuille css/js avant de l'enregistrer.",
- "userjsyoucanpreview": "'''Astuce :''' utilisez le bouton '''Prévisualisation''' pour tester votre nouvelle feuille css/js avant de l'enregistrer.",
- "usercsspreview": "'''Rappelez-vous que vous êtes en train de prévisualiser votre propre feuille css et qu'elle n'a pas encore été enregistrée !'''",
+ "usercssyoucanpreview": "<strong>Djasta :</strong> Va \"{{int:showpreview}}\" uzadjo ta weslara va rinaf warzaf CSS abdida giwal.",
+ "userjsonyoucanpreview": "<strong>Djasta :</strong> Va \"{{int:showpreview}}\" uzadjo ta weslara va rinaf warzaf JSON abdida giwal.",
+ "userjsyoucanpreview": "<strong>Djasta :</strong> Va \"{{int:showpreview}}\" uzadjo ta weslara va rinaf warzaf JavaScript abdida giwal.",
+ "usercsspreview": "<strong>Setikel da va rinaf CSS anton abdinedil.\nBan in men zo giwar !</strong>",
+ "userjsonpreview": "<strong>Setikel da va rinaf JSON tazukara anton weslal ike abdinedil.\nBana ina men zo giwar !</strong>",
"userjspreview": "'''Rappelez-vous que vous êtes en train de visualiser ou de tester votre code javascript et qu'il n'a pas encore été enregistré !'''",
+ "sitecsspreview": "<strong>Setikel da va rinaf CSS anton abdinedil.\nBan in men zo giwar !</strong>",
+ "sitejsonpreview": "<strong>Setikel da va rinaf JSON tazukara anton abdinedil.\nBana ina men zo giwar !</strong>",
+ "sitejspreview": "<strong>Setikel da va rinaf JavaScript beks anton abdinedil.\nBana ina men zo giwar !</strong>",
"updated": "(Nuskeyen)",
"note": "'''Straga :'''",
"previewnote": "'''Obral, bat krent anton tir abdinedik.'''\nRinafa betara men tid giwayan !",
"recreate-moveddeleted-warn": "'''Obral: Rin va sulayanu bu djutolredul.'''\n\nGokrafial ede tolredura va batu bu tir vodanyaf.\nSulara \"log\" va batu bu krafiason batlize zo nedir :",
"moveddeleted-notice": "Sulayanu bu.\n\"Log\" sulara va batu bu oku nendara oku arrundara valeveon vuesteson zo nedid.",
"edit-conflict": "Rupera va koboda.",
+ "postedit-confirmation-created": "Bu su zo redur.",
+ "postedit-confirmation-restored": "Bu su zo dimplekur.",
+ "postedit-confirmation-saved": "Betara zo giwayar.",
+ "postedit-confirmation-published": "Betara zo sanegayar.",
"edit-already-exists": "Buredura tir merotisa.\nBu ixam krulder.",
+ "defaultmessagetext": "Omavaf krent",
+ "slot-name-main": "Dalaf",
"content-model-wikitext": "\"wikitext\"",
+ "content-model-text": "Krentack",
+ "content-model-javascript": "JavaScript",
+ "content-json-empty-object": "Nedaca",
+ "content-json-empty-array": "Nedafa wafra",
+ "deprecated-self-close-category": "Bu dem meenafa HTML arttcala",
+ "duplicate-args-warning": "<strong>OBRAL</strong> [[:$1]] va [[:$2]] rozar, kan loa tanoya voda mu \"$3\" dor. Ant bocafa deana voda zo saveter.",
+ "duplicate-args-category": "Bu favesu va jontolayana rustoda ta tezarozara",
"expensive-parserfunction-category": "Bu dem slika rozara va exulerafli",
"post-expand-template-inclusion-warning": "'''Obral !:''' Lum ke toefa teza mantarsaf.\nKonaka teza me di zo kodoplekud.",
"post-expand-template-inclusion-category": "Bu dem lumars ke dofa teza",
"revdelete-show-file-submit": "En",
"logdelete-selected": "{{PLURAL:$1|Reban \"log\" bif|Yon reban \"log\" bif}} :",
"revdelete-legend": "Skus irutareem",
- "revdelete-hide-text": "Palsera va betaracek",
+ "revdelete-hide-text": "Krentbetara",
"revdelete-hide-image": "Palsera va iyeltakcek",
- "revdelete-hide-name": "Palsera va tegira is xala",
- "revdelete-hide-comment": "Palsera va betarasebusiki",
- "revdelete-hide-user": "Palsera va sutes favesikyolt iku IP mane",
+ "revdelete-hide-name": "Palsera va xala is doreem",
+ "revdelete-hide-comment": "Betara va vildeks",
+ "revdelete-hide-user": "Favesikyolt ik IP mane",
"revdelete-hide-restricted": "Rewara va bat irutareem pu kot ristusik az elekara va bati walasiki",
"revdelete-radio-same": "(videra)",
- "revdelete-radio-set": "En",
- "revdelete-radio-unset": "Me",
+ "revdelete-radio-set": "Palsen",
+ "revdelete-radio-unset": "Rowin",
"revdelete-suppress": "Origsulara mal ristusik lidam artan",
"revdelete-unsuppress": "Dimirutara va dimplekun betaks yo",
"revdelete-log": "Lazava :",
- "revdelete-submit": "Ko reban siatos rewar",
- "revdelete-success": "'''Kiewaskinon plekuyuna betarafa rowinuca.'''",
+ "revdelete-submit": "Ko reban {{PLURAL:$1|siatos}} rewar",
+ "revdelete-success": "Rowin siatos nuskeyen.",
+ "revdelete-failure": "Rowin siatos me zo ronusker :\n$1",
"logdelete-success": "'''Kiewaskinon plekuyuna bifafa rowinuca.'''",
"revdel-restore": "Betara va rowinuca",
"pagehist": "Buizvot",
"diff-multi-sameuser": "( {{PLURAL:$1|Tanoya walifa betara|$1 walifa betara}} gan mil menedin favesik )",
"diff-multi-otherusers": "({{PLURAL:$1|Tanoya walif betaks|$1 walif betaks}} gan {{PLURAL:$2|tanoy ar favesik|$2 favesik}} menedin)",
"searchresults": "Aneyan trasikseem",
+ "search-filter-title-prefix-reset": "Aneyara va bueem",
"searchresults-title": "Aneyan trasiks va \"$1\"",
"titlematches": "Vadjesaceem vanmia vergumvelteem",
"textmatches": "Vadjesaceem ko krenteem",
"notextmatches": "Mek krentvergumvelt ruldas va erune",
"prevn": "{{PLURAL:$1|$1}} daref",
"nextn": "{{PLURAL:$1|$1}} diref",
+ "prev-page": "darebu",
+ "next-page": "direbu",
"prevn-title": "Abdif $1 {{PLURAL:$1|trasiks|trasiks}}",
"nextn-title": "Diref $1 {{PLURAL:$1|trasiks}}",
"shown-title": "Nedira va $1 {{PLURAL:$1|trasiks}} tanbuon",
"search-result-category-size": "{{PLURAL:$1|1 bewik|$1 bewik}} ({{PLURAL:$2|1 volveyloma|$2 volveyloma}}, {{PLURAL:$3|1 iyeltak|$3 iyeltak}})",
"search-redirect": "( graskara male $1 )",
"search-section": "($1 gabot)",
+ "search-category": "( $1 loma )",
"search-file-match": "( va cek ke iyeltak aneyar )",
"search-suggest": "Va $1 sugdalayal ?",
+ "search-rewritten": "Nedira va trasiks va $1. Va $2 ikaon aneyal !!",
"search-interwiki-caption": "Beraf abdumimakseem",
"search-interwiki-default": "$1 trasiks :",
"search-interwiki-more": "(loon)",
+ "search-interwiki-more-results": "Lo trasiks",
"search-relatedarticle": "Skedaf",
"searchrelated": "skedaf",
"searchall": "kot",
"search-nonefound": "Mek trasiks vas kucilara",
"powersearch-legend": "Aneyapara",
"powersearch-ns": "Aneyara koe yoltxo:",
+ "powersearch-togglelabel": "Stujera :",
"powersearch-toggleall": "Kot",
"powersearch-togglenone": "Mek",
"search-external": "Divafa aneyara",
"searchdisabled": "<p>La fonction de recherche sur l'intégralité du texte a été temporairement désactivée à cause de la grande charge que cela impose au serveur. Nous espérons la rétablir prochainement lorsque nous disposerons d'un serveur plus puissant. En attendant, vous pouvez faire la recherche avec Google:</p>",
+ "search-error": "Rokla bak aneyara va $1 sokiyir",
+ "search-warning": "Walzera bak aneyara va $1 sokiyir",
"preferences": "Lodamaceem",
"mypreferences": "Jinaf lodamaceem",
"prefs-edits": "Ota va betaks :",
"prefs-skin": "Laviuca",
"skin-preview": "Abdiwira",
"datedefault": "Megelukon",
+ "prefs-user-pages": "Favesikbu",
"prefs-personal": "Ilkagiveem",
"prefs-rc": "Noeltaf betakseem",
"prefs-watchlist": "Suzdasiki",
+ "prefs-editwatchlist": "Betara va suzdaxa",
+ "prefs-editwatchlist-label": "Betara va olk ke suzdaxa :",
+ "prefs-editwatchlist-clear": "Tunedara va suzdaxa",
"prefs-watchlist-days": "Cugafa vielota gonedina koe suzdasiki :",
"prefs-watchlist-days-max": "Cugon $1 {{PLURAL:$1|viel|viel}}",
- "prefs-watchlist-edits": "Betaracugota gonedina koe mantafi suzdasiki :",
+ "prefs-watchlist-edits": "Betaksafa cugota gonedina koe suzdaxa :",
"prefs-watchlist-edits-max": "Cugafa ota : 1000",
"prefs-misc": "Gedrafa lodamaca yo",
"prefs-resetpass": "Betara va remravlem",
+ "prefs-changeemail": "Betara va e-mail mane",
+ "prefs-setemail": "Bazera va e-mail mane",
+ "prefs-email": "Ukeyeem ke e-mail mane",
"prefs-rendering": "Laviuca",
"saveprefs": "Va lodamaceem tuená",
"prefs-editing": "Sutelaxo",
"timezoneregion-indian": "India welfa",
"timezoneregion-pacific": "Pacifika welfa",
"allowemail": "Tutegirara va e-mail staksara mal ar favesik",
- "prefs-searchoptions": "Aneyarikatcura",
+ "prefs-searchoptions": "Aneyara",
"prefs-namespaces": "Yoltxo",
"default": "omava",
"prefs-files": "Iyeltak se",
+ "prefs-custom-css": "Ilkaf CSS",
+ "prefs-custom-json": "Ilkaf JSON",
+ "prefs-custom-js": "Ilkaf JavaScript",
"youremail": "Jinafe internetmane",
- "username": "Favesikyolt:",
- "prefs-memberingroups": "Bewik ke {{PLURAL:$1|lospa|lospa}}:",
+ "username": "{{GENDER:$1|Favesikyolt}} :",
+ "prefs-memberingroups": "{{GENDER:$2|Bewik}} ke {{PLURAL:$1|lospa}} :",
+ "group-membership-link-with-expiry": "$1 ( ik $2 )",
"yourrealname": "Rinaf ageltaf yolt*",
"yourlanguage": "Walasikiava",
"yournick": "Sugdara tori prilara se (do <tt><nowiki>~~~</nowiki></tt>) ",
"prefs-help-email": "E-mail mane tir rotikatcune vox adrafe gu betara va remravlem todon gu vulkura va bat.",
"prefs-help-email-others": "Dere ronaral da rictal da artan va rin kan e-mail is gluyasiki moe rinafu favesikbu oku prilarabu rotuzerar.\nRinafe e-mail mane me zo razdar viele ar webesik uzerar.",
"prefs-help-email-required": "E-mail mane zo kucilar.",
+ "prefs-preview": "Abdinedira",
+ "prefs-advancedrc": "Lo ukey",
+ "prefs-advancedrendering": "Lo ukey",
+ "prefs-advancedsearchoptions": "Lo ukey",
+ "prefs-advancedwatchlist": "Lo ukey",
+ "prefs-displayrc": "Fintara va ukey",
+ "prefs-displaywatchlist": "Fintara va ukey",
+ "prefs-changesrc": "Betaks nedin",
+ "prefs-changeswatchlist": "Betaks nedin",
+ "prefs-pageswatchlist": "Wiyinu bu",
+ "prefs-diffs": "Amid-",
"userrights": "Pofera va favesikrokeem",
- "userrights-lookup-user": "Pofera va favesikeem",
+ "userrights-lookup-user": "Rebara va favesik",
"userrights-user-editname": "Va favesikyolt bazel",
- "editusergroup": "Betara va favesikeem lospa",
+ "editusergroup": "Vajara va favesikafa lospa",
"editinguser": "Betara va rokeem ke '''[[User:$1|$1]]''' favesik ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
"userrights-editusergroup": "Betara va favesiklospa",
"saveusergroups": "Giwara va favesiklospa",
"right-userrights": "Betara va favesikrokeem",
"right-userrights-interwiki": "Betara va favesikrokeem koe aro 'wiki' xo",
"right-siteadmin": "Origakelekara is dimelekara",
+ "grant-group-email": "Staksera va e-mail",
+ "grant-editprotected": "Betara va nendanu bu",
"newuserlogpage": "Buredura \"log\"",
"rightslog": "\"Log\" bu va favesikrokeem",
"rightslogtext": "Tir \"log\" va betara va favesikroka.",
"create": "Yarat",
"create-local": "Lokal izah əlavə et",
"delete": "Sil",
- "undelete_short": "$1 {{PLURAL:$1|dəyişikliyi|dəyişiklikləri}} bərpa et",
+ "undelete_short": "$1 {{PLURAL:$1|dəyişikliyi}} bərpa et",
"viewdeleted_short": "{{PLURAL:$1|bir silinmiş redaktəyə|$1 silinmiş redaktəyə}}",
"protect": "Mühafizə et",
"protect_change": "dəyiş",
"privacypage": "Project:Gizlilik prinsipi",
"badaccess": "İcazə xətası",
"badaccess-group0": "Bu fəaliyyəti icra etmək səlahiyyətiniz yoxdur.",
- "badaccess-groups": " Bu fəaliyyəti, yalnız $1 {{PLURAL:$2|qrupundakı|qruplarındakı}} istifadəçilər icra edə bilərlər.",
- "versionrequired": "MediyaViki $1 versiyası lazımdır",
- "versionrequiredtext": "Bu səhifəni istifadə etmək üçün MediaWikinin $1 versiyası tələb olunur.\nBax: [[Special:Version|Versiyalar]].",
+ "badaccess-groups": "Bu fəaliyyəti, yalnız $1 {{PLURAL:$2|qrupundakı|qruplarından birindəki}} istifadəçilər icra edə bilərlər.",
+ "versionrequired": "MediaViki $1 versiyası lazımdır",
+ "versionrequiredtext": "Bu səhifəni istifadə etmək üçün MediaVikinin $1 versiyası tələb olunur.\nBax: [[Special:Version|Versiyalar]].",
"ok": "OK",
"pagetitle": "$1 - {{SITENAME}}",
"pagetitle-view-mainpage": "{{SITENAME}}",
"createacct-benefit-heading": "{{SITENAME}} sizin kimi insanlar tərəfindən yaradılır.",
"createacct-benefit-body1": "{{PLURAL:$1|redaktə}}",
"createacct-benefit-body2": "{{PLURAL:$1|səhifə|səhifə}}",
- "createacct-benefit-body3": "nəfər yenicə {{PLURAL:$1|redaktə edən}}",
+ "createacct-benefit-body3": "yeni {{PLURAL:$1|redaktor}}",
"badretype": "Daxil etdiyiniz parol uyğun gəlmir.",
"userexists": "Daxil edilmiş ad artıq istifadədədir.\nLütfən başqa ad seçin.",
"loginerror": "Daxil olma xətası",
"revdelete-suppress": "Məlumatları idarəçilərdən də gizlə",
"revdelete-unsuppress": "Bərpa olunan versiyalar üzərindən məhdudiyyətləri qaldır",
"revdelete-log": "Səbəb:",
- "revdelete-submit": "Seçilmiş {{PLURAL:$1|versiyaya|versiyayalara}} tətbiq et",
+ "revdelete-submit": "Seçilmiş {{PLURAL:$1|versiyaya|versiyalara}} tətbiq et",
"revdelete-success": "Versiyanın görünəbilərliyi yeniləndi.",
"revdelete-failure": "'''Versiyanın görünüşü dəyişdirilə bilməz:'''\n$1",
"logdelete-success": "Qeydin görünəbilərliyi təsdiqləndi.",
"mergehistory-go": "Birləşdirilə bilən redaktələri göstər",
"mergehistory-submit": "Qarışıq düzəlişlər",
"mergehistory-empty": "Birləşdiriləcək redaktələr tapılmamışdır.",
- "mergehistory-done": "$1 səhifəsinin $3 {{PLURAL:$3|revizyonu|dəyişikliyi}} uğurla [[:$2]] -yə birləşdirildi.",
- "mergehistory-no-source": "Mənbə $1 yoxdur.",
- "mergehistory-no-destination": "Mənbə səhifəsi $1 mövcud deyil.",
+ "mergehistory-done": "$1 səhifəsindəki $3 {{PLURAL:$3|dəyişiklik|dəyişiklik}} uğurla [[:$2]] səhifəsinə birləşdirildi.",
+ "mergehistory-no-source": "Mənbə səhifəsi $1 yoxdur.",
+ "mergehistory-no-destination": "Hədəf səhifəsi $1 mövcud deyil.",
"mergehistory-invalid-source": "Mənbənin düzgün başlığı olmalıdır.",
"mergehistory-invalid-destination": "Hədəf səhifəsinin düzgün başlığı olmalıdır.",
"mergehistory-autocomment": "[[:$1]] səhifəsi [[:$2]] səhifəsinə birləşdirildi",
"showhideselectedversions": "Seçilən versiyaları göstər/gizlə",
"editundo": "əvvəlki halına qaytar",
"diff-empty": "(Fərqli deyil)",
- "diff-multi-sameuser": "(Eyni istifadəçi tərəfindən edilmiş {{PLURAL:$1|bir dəyişiklik|$1 bir neçə dəyişiklik}} göstərilmir)",
+ "diff-multi-sameuser": "(Eyni istifadəçi tərəfindən edilmiş {{PLURAL:$1|bir dəyişiklik|$1 dəyişiklik}} göstərilmir)",
"diff-multi-manyusers": "({{PLURAL:$2|Bir istifadəçi|$2 istifadəçi}} tərəfindən edilən {{PLURAL:$1|bir ara redaktə|$1 ara redaktə}} göstərilmir)",
- "difference-missing-revision": "Səhifənin {{PLURAL:$2|bu versiyasının|$2 versiyalarının}} müqayisəsi ($1) tapılmadı.\nBu xəta adətən, köhnəlmiş səhifələrin müqayisə versiyalarından keçid edildikdə baş verir.\nDaha ətraflı məlumat üçün [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} silmə qeydlərinə] baxın.",
+ "difference-missing-revision": "Səhifənin {{PLURAL:$2|$2 versiyasının}} müqayisəsi tapılmadı ($1).\nBu xəta adətən, köhnəlmiş səhifələrin müqayisə versiyalarından keçid edildikdə baş verir.\nDaha ətraflı məlumat üçün [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} silmə qeydlərinə] baxın.",
"searchresults": "Axtarış nəticələri",
"searchresults-title": "''$1'' üçün axtarış nəticələri",
"titlematches": "Səhifə adı eynidir",
"textmatches": "Mətn eynidir",
"notextmatches": "Məqalələrdə uyğun məzmun tapılmadı",
"prevn": "əvvəlki {{PLURAL:$1|$1}}",
- "nextn": "sonrakı {{PLURAL:$1|$1}}",
+ "nextn": "növbəti {{PLURAL:$1|$1}}",
"prev-page": "əvvəlki səhifə",
"next-page": "növbəti səhifə",
"prevn-title": "Əvvəlki bir $1 {{PLURAL:$1|nəticə|nəticə}}",
"nextn-title": "Əvvəlki bir $1 {{PLURAL:$1|nəticə|nəticə}}",
"shown-title": "Səhifə üçün $1 {{PLURAL:$1|nəticə|nəticəyə}} bax",
"viewprevnext": "Göstər ($1 {{int:pipe-separator}} $2) ($3).",
- "searchmenu-exists": "'''Bu vikidə \"[[:$1]]\" adında səhifə mövcuddur'''",
+ "searchmenu-exists": "</strong>Bu vikidə \"[[:$1]]\" adında səhifə mövcuddur.</strong> {{PLURAL:$2|0=|Həmçinin tapılmış digər axtarış nəticələrinə də baxın.}}",
"searchmenu-new": "<strong>Bu viki-layihədə \"[[:$1]]\" səhifəsini yaradın!</strong> {{PLURAL:$2|0=|Həmçinin, axtarışınız əsasında çıxan səhifəyə baxın.|Həmçinin, axtarışınız əsasında çıxan nəticələrə baxın.}}",
"searchprofile-articles": "Məzmun səhifələri",
"searchprofile-images": "Multimedia",
"searchprofile-everything-tooltip": "Bütün səhifələrdə axtar (müzakirə səhifələri daxil)",
"searchprofile-advanced-tooltip": "Ad aralığında axtar",
"search-result-size": "$1 ({{PLURAL:$2|1 söz|$2 söz}})",
- "search-result-category-size": "{{PLURAL:$1|$1 element|$1 elementlər}} ({{PLURAL:$2|$2 alt kateqoriya|$2 alt kateqoriyalar}}, {{PLURAL:$3|$3 fayl|$3 fayllar}})",
+ "search-result-category-size": "{{PLURAL:$1|1 element|$1 element}} ({{PLURAL:$2|1 alt kateqoriya|$2 alt kateqoriya}}, {{PLURAL:$3|1 fayl|$3 fayl}})",
"search-redirect": "($1 səhifəsindən yönləndirmə)",
"search-section": "(bölmə $1)",
"search-category": "(kateqoriya $1)",
"grant-group-high-volume": "Юғары әүҙемлекле алым эшләргә",
"grant-group-customization": "Көйләүҙәр һәм өҫтөнлөк биргән көйләүҙәр",
"grant-group-administration": "Административ алымдар ҡулланыу",
- "grant-group-private-information": "Доступ к конфиденциальным данным о вас\nҺеҙҙең туралағы йәшерелгән белешмәләргә инеү",
+ "grant-group-private-information": "Һеҙҙең туралағы йәшерелгән белешмәләргә инеү",
"grant-group-other": "Әүҙемлек төрлө",
"grant-blockusers": "Иҫәп яҙмаларын блоклау һәм блоклауҙы асыу",
"grant-createaccount": "Иҫәп яҙмаһын булдырырға",
"log-action-filter-upload-upload": "Яңы күсереү",
"log-action-filter-upload-overwrite": "Ҡабаттан тейәү",
"authmanager-create-disabled": "Иҫәп яҙмаһын булдырыу бикләнгән.",
- "authmanager-authplugin-setpass-failed-title": "Серһүҙҙе үҙгәртеү хатаһы",
"authmanager-userdoesnotexist": "\"$1\" иҫәп яҙмаһы теркәлмәгән.",
"authmanager-domain-help": "Тышҡы аутентификация домены (өҫтәмә).",
"authmanager-email-label": "Электрон почта адресы",
"Mjbmr",
"Macofe",
"Matěj Suchánek",
- "Rachitrali"
+ "Rachitrali",
+ "Sultanselim baloch"
]
},
"tog-underline": ":لینکانآ خط کش",
"special-characters-group-devanagari": "دیواناگرى",
"special-characters-group-thai": "تایلندی",
"special-characters-group-lao": "لائو",
- "special-characters-group-khmer": "خمر"
+ "special-characters-group-khmer": "خمر",
+ "log-action-filter-upload-revert": "Cahr Dayag"
}
"logentry-rights-autopromote": "$1 {{GENDER:$1|быў аўтаматычна пераведзены|была аўтаматычна пераведзеная}} з групы $4 ў $5",
"logentry-upload-upload": "$1 {{GENDER:$2|загрузіў|загрузіла}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|загрузіў|загрузіла}} новую вэрсію $3",
- "logentry-upload-revert": "$1 {{GENDER:$2|загÑ\80Ñ\83зÑ\96Ñ\9e|загÑ\80Ñ\83зÑ\96ла}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|вÑ\8fÑ\80нÑ\83Ñ\9e|вÑ\8fÑ\80нÑ\83ла}} $3 да Ñ\81Ñ\82аÑ\80ой вÑ\8dÑ\80Ñ\81Ñ\96Ñ\96",
"log-name-managetags": "Журнал кіраваньня меткамі",
"log-description-managetags": "На гэтай старонцы пералічаныя спасылкі, зьвязаныя зь [[Special:Tags|меткамі]]. Журнал зьмяшчае толькі падзеі, выкананыя адміністратарам уручную; меткі могуць быць створаныя або выдаленыя праграмным забесьпячэньнем вікі бяз запісу пра падзею ў журнал.",
"logentry-managetags-create": "$1 {{GENDER:$2|стварыў|стварыла}} метку «$4»",
"log-action-filter-suppress-reblock": "Утойваньне ўдзельніка праз паўторнае блякаваньне",
"log-action-filter-upload-upload": "Новая загрузка",
"log-action-filter-upload-overwrite": "Паўторная загрузка",
+ "log-action-filter-upload-revert": "Адкат",
"authmanager-authn-not-in-progress": "Аўтэнтыфікацыя не выконваецца або страчаныя зьвесткі пра сэсію. Калі ласка, пачніце зноў з самага пачатку.",
"authmanager-authn-no-primary": "Пададзеныя ўліковыя зьвесткі ня могуць быць правераныя на сапраўднасьць.",
"authmanager-authn-no-local-user": "Пададзеныя ўліковыя зьвесткі не зьвязаныя зь ніводным удзельнікам гэтай вікі.",
"authmanager-create-no-primary": "Пададзеныя ўліковыя зьвесткі ня могуць быць выкарыстаныя для стварэньня рахунку.",
"authmanager-link-no-primary": "Пададзеныя ўліковыя зьвесткі ня могуць быць выкарыстаныя для злучэньня рахункаў.",
"authmanager-link-not-in-progress": "Злучэньне рахункаў не выконваецца або страчаныя зьвесткі сэсіі. Калі ласка, пачніце ізноў спачатку.",
- "authmanager-authplugin-setpass-failed-title": "Памылка зьмены паролю",
- "authmanager-authplugin-setpass-failed-message": "Дадатак аўтэнтыфікацыі адмовіў зьмену паролю.",
- "authmanager-authplugin-create-fail": "Дадатак аўтэнтыфікацыі адмовіў у стварэньні рахунку.",
- "authmanager-authplugin-setpass-denied": "Дадатак аўтэнтыфікацыі не дазваляе зьмяняць паролі.",
- "authmanager-authplugin-setpass-bad-domain": "Няслушны дамэн.",
"authmanager-autocreate-noperm": "Аўтаматычнае стварэньне рахункаў не дазволенае.",
"authmanager-autocreate-exception": "Аўтаматычнае стварэньне рахункаў часова адключанае праз папярэднія памылкі.",
"authmanager-userdoesnotexist": "Рахунак «$1» не зарэгістраваны.",
"passwordpolicies-policy-maximalpasswordlength": "Пароль мусіць быць даўжынёй менш за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}",
"passwordpolicies-policy-passwordcannotbepopular": "Пароль ня можа {{PLURAL:$1|супадаць з самым папулярным паролем|быць зь сьпісу $1 папулярных пароляў}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "Пароль ня можа быць зь сьпісу 100 000 найчасьцей ужываных пароляў.",
+ "passwordpolicies-policyflag-forcechange": "мусіць быць зьменены па ўваходзе",
"easydeflate-invaliddeflate": "Пададзены зьмест ня сьціснуты адпаведным чынам",
"unprotected-js": "З прычынаў бясьпекі JavaScript ня можа быць загружаны зь неабароненых сайтаў. Калі ласка, стварайце javascript выключна ў прасторы назваў MediaWiki: ці як падстаронку ўдзельніка"
}
"saveusergroups": "Захаваць групы {{GENDER:$1|ўдзельнікаў|ўдзельніц}}",
"userrights-groupsmember": "У групе:",
"userrights-groupsmember-auto": "Няяўны член:",
- "userrights-groups-help": "Тут можна мяняць групы, да якіх належыць гэты ўдзельнік.\n* Адзначанае поле выбару азначае ўваходжанне ўдзельніка ў пэўную групу.\n* Чыстае поле выбару азначае неўваходжанне.\n* Знак * азначае, што нельга выняць удзельніка з групы, калі ён ужо там, або наадварот.адкласці час \n* Знак # азначае, што Вы можаце толькі адкласці час выдалення з групы; Вы не можаце перанесці яго на больш ранні тэрмін.",
+ "userrights-groups-help": "Тут можна мяняць групы, да якіх належыць гэты ўдзельнік.\n* Адзначанае поле выбару азначае ўваходжанне ўдзельніка ў пэўную групу.\n* Чыстае поле выбару азначае неўваходжанне.\n* Знак * азначае, што нельга выняць удзельніка з групы, калі ён ужо там, або наадварот.\n* Знак # азначае, што Вы можаце толькі адкласці час выдалення з групы; Вы не можаце перанесці яго на больш ранні тэрмін.",
"userrights-reason": "Прычына:",
"userrights-no-interwiki": "Вам не дазволена мяняць дазволаў карыстальнікам на іншых Вікі-ах.",
"userrights-nodatabase": "Не знойдзена тут, або не існуе база даных $1.",
"authmanager-create-no-primary": "Прадастаўленыя ўліковыя дадзеныя не могуць быць выкарыстаны для стварэння ўліковага запісу.",
"authmanager-link-no-primary": "Прадастаўленыя ўліковыя дадзеныя не могуць быць выкарыстаны для прывязкі рахунку.",
"authmanager-link-not-in-progress": "Звязванне ўліковага запісу не выконваецца або сесія перадачы дадзеных была страчана. Калі ласка, пачніце зноў з самага пачатку.",
- "authmanager-authplugin-setpass-failed-title": "Памылка змены пароля",
- "authmanager-authplugin-setpass-failed-message": "Убудова аўтэнтыфікацыі адмоўлена па змене пароля.",
- "authmanager-authplugin-create-fail": "Убудова аўтэнтыфікацыі адмоўлена ў рэгістрацыі.",
- "authmanager-authplugin-setpass-denied": "Убудова праверкі сапраўднасці не дазваляе змяняць паролі.",
- "authmanager-authplugin-setpass-bad-domain": "Недапушчальны дамен.",
"authmanager-autocreate-noperm": "Аўтаматычнае стварэнне уліковых запісаў не дапускаецца.",
"authmanager-autocreate-exception": "Аўтаматычнае стварэнне уліковых запісаў часова адключана з-за памылак папярэдніх.",
"authmanager-userdoesnotexist": "Уліковы запіс удзельніка \"$1\" не зарэгістраваны.",
"Kareyac",
"ShockD",
"Fitoschido",
- "Vlad5250"
+ "Vlad5250",
+ "Ted Masters"
]
},
"tog-underline": "Подчертаване на препратките:",
"tog-hideminor": "Скриване на малки редакции в последните промени",
"tog-hidepatrolled": "Скриване на патрулираните редакции от списъка с последните промени",
"tog-newpageshidepatrolled": "Скриване на патрулираните редакции от списъка на новите страници",
- "tog-hidecategorization": "Скриване на категоризацията на статии",
+ "tog-hidecategorization": "Скриване на категоризацията на страниците",
"tog-extendwatchlist": "Разширяване на списъка за наблюдение, така че да показва всички промени, не само последните",
"tog-usenewrc": "Групиране по страници на промените на Последни промени и в списъка за наблюдение",
"tog-numberheadings": "Автоматично номериране на заглавията",
"pool-timeout": "Изтичане на времето за заключване на страницата",
"pool-queuefull": "Опашката за заявки е пълна",
"pool-errorunknown": "Непозната грешка",
- "poolcounter-usage-error": "Ð\93Ñ\80еÑ\88ка пÑ\80и Ñ\83поÑ\82Ñ\80еба: $1",
+ "poolcounter-usage-error": "Ð\93Ñ\80еÑ\88ка в Ñ\83поÑ\82Ñ\80ебаÑ\82а: $1",
"aboutsite": "За {{SITENAME}}",
"aboutpage": "Project:За {{SITENAME}}",
"copyright": "Освен ако не е посочено друго, съдържанието е достъпно при условията на $1.",
"missingarticle-rev": "(версия#: $1)",
"missingarticle-diff": "(Разлика: $1, $2)",
"readonly_lag": "Базата от данни беше автоматично заключена, докато подчинените сървъри успеят да се синхронизират с основния сървър.",
+ "nonwrite-api-promise-error": "HTTP-заглавието „Promise-Non-Write-API-Action“ беше изпратено, но заявката беше направена към записен модул на извършника.",
"internalerror": "Вътрешна грешка",
"internalerror_info": "Вътрешна грешка: $1",
"internalerror-fatal-exception": "Фатална грешка от тип „$1“",
"badarticleerror": "Действието не може да бъде изпълнено на тази страница.",
"cannotdelete": "Указаната страница или файл „$1“ не можа да бъде изтрит(а). Възможно е вече да е бил(а) изтрит(а) от някой друг.",
"cannotdelete-title": "Страницата „$1“ не може да бъде изтрита",
+ "delete-scheduled": "Страницата „$1“ е предвидена за изтриване.\nМоля, бъдете търпеливи.",
"delete-hook-aborted": "Изтриването беше прекъснато от софтуерно прехващане.\nНе беше посочена причина за това.",
"no-null-revision": "Не може да бъде създадена празна версия на страницата „$1“",
"badtitle": "Невалидно заглавие",
"customcssprotected": "Нямате права за редактиране на тази CSS страница, защото тя съдържа чужди потребителски настройки.",
"customjsonprotected": "Нямате права за редактиране на тази JSON страница, защото тя съдържа чужди потребителски настройки.",
"customjsprotected": "Нямате права за редактиране на тази JavaScript страница, тъй като съдържа чужди потребителски настройки.",
+ "sitecssprotected": "Нямате права за редактиране на тази CSS страница, защото може да засегне всички посетители.",
+ "sitejsonprotected": "Нямате права за редактиране на тази JSON страница, защото може да засегне всички посетители.",
+ "sitejsprotected": "Нямате права за редактиране на тази JavaScript страница, защото може да засегне всички посетители.",
"mycustomcssprotected": "Нямате права за редактиране на тази CSS страница.",
"mycustomjsonprotected": "Нямате права за редактиране на тази JSON страница.",
"mycustomjsprotected": "Нямате права за редактиране на тази JavaScript страница.",
"createacct-emailoptional": "Адрес за електронна поща (незадължително)",
"createacct-email-ph": "Въведете Вашия адрес за електронна поща",
"createacct-another-email-ph": "Въведете електронна поща",
- "createaccountmail": "Ð\98зползване на Ñ\81лÑ\83Ñ\87айна вÑ\80еменна паÑ\80ола, коÑ\8fÑ\82о Ñ\81е изпÑ\80аÑ\89а на елекÑ\82Ñ\80оннаÑ\82а поÑ\89а, поÑ\81оÑ\87ена по-долÑ\83",
+ "createaccountmail": "Ð\98зползване на Ñ\81лÑ\83Ñ\87айна вÑ\80еменна паÑ\80ола, коÑ\8fÑ\82о Ñ\81е изпÑ\80аÑ\89а на поÑ\81оÑ\87енаÑ\82а елекÑ\82Ñ\80оннаÑ\82а поÑ\89а",
"createacct-realname": "Истинско име (незадължително)",
"createacct-reason": "Причина",
"createacct-reason-ph": "Защо създавате друга сметка",
+ "createacct-reason-help": "Съобщение, показвано в дневника на създадени сметки",
"createacct-submit": "Създаване на сметката",
"createacct-another-submit": "Създаване на сметка",
"createacct-continue-submit": "Продължаване създаването на сметка",
"createacct-benefit-body2": "{{PLURAL:$1|страница|страници}}",
"createacct-benefit-body3": "{{PLURAL:$1|скорошен сътрудник|скорошни сътрудници}}",
"badretype": "Въведените пароли не съвпадат.",
+ "usernameinprogress": "Създаването на сметката за този потребител е вече в прогрес.\nМоля, изчакайте.",
"userexists": "Въведеното потребителско име вече се използва.\nИзберете друго име.",
"loginerror": "Грешка при влизане",
- "createacct-error": "Ð\93Ñ\80еÑ\88ка пÑ\80и Ñ\81Ñ\8aздаване на Ñ\81меÑ\82ка",
+ "createacct-error": "Ð\93Ñ\80еÑ\88ка в Ñ\81Ñ\8aздаванеÑ\82о на Ñ\81меÑ\82каÑ\82а",
"createaccounterror": "Не може да бъде създадена сметка: $1",
"nocookiesnew": "Потребителската сметка беше създадена, но все още не сте влезли.\n{{SITENAME}} използва бисквитки при влизането на потребителите.\nРазрешете бисквитките в браузъра си, тъй като те са забранени, а след това влезте с потребителското си име и парола.",
"nocookieslogin": "{{SITENAME}} използва бисквитки (cookies) за запис на влизанията.\nРазрешете бисквитките в браузъра си, тъй като те са забранени, и опитайте отново.",
"noname": "Не указахте валидно потребителско име.",
"loginsuccesstitle": "Успешно влизане",
"loginsuccess": "<strong>Влязохте в {{SITENAME}} като „$1“.</strong>",
- "nosuchuser": "Не съществува потребител с име „$1“.\nПотребителските имена са чувствителни към регистъра на буквите.\nПроверете изписването или [[Special:CreateAccount|създайте нова сметка]].",
+ "nosuchuser": "Няма потребител с името „$1“.\nПотребителските имена са чувствителни към регистъра на буквите.\nПроверете изписването или [[Special:CreateAccount|създайте нова сметка]].",
"nosuchusershort": "Не съществува потребител с името „$1“.\nПроверете изписването.",
"nouserspecified": "Необходимо е да се посочи потребителско име.",
"login-userblocked": "Този потребител е блокиран. Влизането в системата не е позволено.",
"passwordtooshort": "Необходимо е паролата да съдържа поне {{PLURAL:$1|1 знак|$1 знака}}.",
"passwordtoolong": "Паролата не може да бъде по-дългa от {{PLURAL:$1|1 знак|$1 знака}}.",
"passwordtoopopular": "Често използвани пароли не могат да бъдат ползвани. Моля, изберете парола, която е по-трудна за познаване.",
+ "passwordinlargeblacklist": "Въведената парола е между най-често ползваните. Моля, изберете по-неповторима парола.",
"password-name-match": "Паролата Ви трябва да се различава от потребителското Ви име.",
"password-login-forbidden": "Използването на това потребителско име и парола е забранено.",
"mailmypassword": "Възстановяване на парола",
"changepassword-success": "Паролата беше променена успешно!",
"changepassword-throttled": "Направили сте твърде много опити да въведете паролата за тази сметка.\nНеобходимо е да изчакате $1 преди да опитате отново.",
"botpasswords": "Пароли за ботове",
+ "botpasswords-summary": "<em>Паролите за ботове</em> дават достъп до потребителска сметка през API, без да се използват данните за влизане в основната сметка. Потребителските права могат да бъдат ограничени при влизане на този начин.\n\nАко не знаете за какво това би ви послужило, по-добро не правете това. Никой никога не трябва да ви моли да създавате такава парола, за да му я дадете.",
"botpasswords-disabled": "Паролите за ботове са изключени.",
"botpasswords-no-central-id": "За да използвате пароли за ботове, трябва да сте влезли в централна сметка.",
"botpasswords-existing": "Съществуващи пароли за ботове",
"botpasswords-createnew": "Създаване на нова парола за бота",
- "botpasswords-editexisting": "РедакÑ\82иÑ\80ане на съществуваща парола на бот",
+ "botpasswords-editexisting": "Ð\9fÑ\80омÑ\8fна на съществуваща парола на бот",
"botpasswords-label-needsreset": "(нужна е нова парола)",
"botpasswords-label-appid": "Име на бота:",
"botpasswords-label-create": "Създаване",
"botpasswords-label-delete": "Изтриване",
"botpasswords-label-resetpassword": "Възстановяване на парола",
"botpasswords-label-grants": "Приложими разрешения:",
+ "botpasswords-help-grants": "Разрешенията ви дават достъп до права, които вече имат вашата сметка. Като включите разрешение тук, няма да получавате никакви права, които вече няма сметката. Повече информация ще намерите на [[Special:ListGrants|таблицата на разрешения]].",
"botpasswords-label-grants-column": "Дадено",
"botpasswords-bad-appid": "Името на бота „$1“ не е валидно.",
"botpasswords-insert-failed": "Неуспешно добавяне на име на бота „$1“. Дали не е добавяно вече?",
"botpasswords-updated-body": "Паролата на бот „$1“ на потребител {{GENDER:$2|„$2“}} е обновена.",
"botpasswords-deleted-title": "Паролата на бота е изтрита",
"botpasswords-deleted-body": "Паролата на бот „$1“ на {{GENDER:$2|потребител}} „$2“ е премахната.",
+ "botpasswords-no-provider": "BotPasswordsSessionProvider не е наличен.",
+ "botpasswords-needs-reset": "Паролата на бота с име „$2“ на {{GENDER:$2|потребител}} „$1“ трябва да бъде подновена.",
"resetpass_forbidden": "Не е разрешена промяна на паролата",
"resetpass_forbidden-reason": "Паролите не могат да се променят: $1",
"resetpass-no-info": "За да имате директен достъп до тази страница е необходимо да влезете в системата.",
"passwordreset-emailelement": "Потребителско име: \n$1\n\nВременна парола: \n$2",
"passwordreset-emailsentemail": "Ако електронната Ви поща е свързана със сметката Ви, на нея е изпратено писмо за възстановяване на паролата.",
"passwordreset-emailsentusername": "Ако това потребителско име е свързано с електронна поща, е изпратено писмо за възстановяване на паролата.",
+ "passwordreset-nocaller": "Трябва да е посочен повиквател",
"passwordreset-nosuchcaller": "Източникът на извикването не съществува: $1",
+ "passwordreset-ignored": "Промяната на паролата беше неуспешна. Може би не е посочен доставчик?",
"passwordreset-invalidemail": "Неправилен email адрес",
"passwordreset-nodata": "Не сте указали нито потребителско име, нито адрес на ел. поща",
"changeemail": "Промяна или премахване на адреса за е-поща",
"subject-preview": "Предварителен преглед на заглавието:",
"previewerrortext": "Възникна грешка при опита за преглед на промените.",
"blockedtitle": "Потребителят е блокиран",
+ "blocked-email-user": "<strong>Вашето потребителско име е забранено да изпраща електронната поща. Все още можете да редактирате други страници в това уики. </strong> Всички подробности за забраната ще намерите в [[Special:MyContributions|приносите на сметката]].\n\nЗабраната даде $1.\n\nПосочената причина е <em>$2</em>.\n\n* Начало на забраната: $8\n* Край на забраната: $6\n* Забраната се отнася за: $7\n* Идентификатор на забраната #$5",
"blockedtext-partial": "<strong>Вашето потребителско име или IP-адрес е забранено да правите промени на тази страница. Все още можете да редактирате други страници в това уики. </strong> Всички подробности за забраната ще намерите в [[Special:MyContributions|приносите за сметката]].\n\nЗабраната даде $1.\n\nПосочената причина е <em>$2</em>.\n\n* Начало на забраната: $8\n* Край на забраната: $6\n* Забраната се отнася за: $7\n* Идентификатор на забраната #$5",
"blockedtext": "'''Вашето потребителско име (или IP-адрес) беше блокирано.'''\n\nБлокирането е извършено от $1. Посочената причина е: ''$2''\n\n*Начало на блокирането: $8\n*Край на блокирането: $6\n*Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „{{int:emailuser}}“ само ако не ви е забранена употребата ѝ и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nВашият IP адрес е $3, а номерът на блокирането е $5. Включвайте едно от двете или и двете във всяко запитване, което правите.",
"autoblockedtext": "IP-адресът ви беше блокиран автоматично, защото е бил използван от друг потребител, който е бил блокиран от $1.\nПосочената причина е:\n\n:<em>$2</em>\n\n* Начало на блокирането: $8\n* Край на блокирането: $6\n* Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „{{int:emailuser}}“ само ако не ви е забранена употребата ѝ и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nТекущият Ви IP-адрес е $3, а номерът на блокирането ви е $5.\nВключвайте ги във всяка заявка, която правите.",
"yourdiff": "Разлики",
"copyrightwarning": "Обърнете внимание, че всички приноси към {{SITENAME}} се публикуват при условията на $2 (за подробности вижте $1).\nАко не сте съгласни вашата писмена работа да бъде променяна и разпространявана без ограничения, не я публикувайте.<br />\nСъщо потвърждавате, че вие сте написали материала или сте използвали свободни ресурси — <em>обществено достояние</em> или друг свободен източник.\nАко сте ползвали чужди материали, за които имате разрешение, непременно посочете източника.\n<strong>Не публикувайте произведения с авторски права без разрешение!</strong>",
"copyrightwarning2": "Обърнете внимание, че всички приноси към {{SITENAME}} могат да бъдат редактирани, променяни или премахвани от останалите сътрудници.\nАко не сте съгласни вашата писмена работа да бъде променяна без ограничения, не я публикувайте.<br />\nСъщо потвърждавате, че вие сте написали материала или сте използвали свободни ресурси — обществено достояние< или друг свободен източник (за подробности вижте $1).\nАко сте ползвали чужди материали, за които имате разрешение, непременно посочете източника.\n<strong>Не публикувайте произведения с авторски права без разрешение!</strong>",
+ "editpage-cannot-use-custom-model": "Моделът на съдържанието на страницата не може да бъде променен.",
"longpageerror": "<strong>Грешка: Изпратеният текст е с големина {{PLURAL:$1|един килобайт|$1 килобайта}}, което надвишава позволения максимум от {{PLURAL:$2|един килобайт|$2 килобайта}}.</strong>\nПоради тази причина той не може да бъде съхранен.",
"readonlywarning": "<strong>Внимание: Базата данни беше затворена за поддръжка, затова в момента промените няма да могат да бъдат съхранени.</strong>\nАко желаете, можете да съхраните страницата като текстов файл и да се опитате да я публикувате по-късно.\n\nСистемният администратор, който е затворил базата данни, е посочил следната причина: $1",
"protectedpagewarning": "<strong>Внимание: Страницата е защитена и само потребители със статут на администратори могат да я редактират.</strong>\nЗа справка по-долу е показан последният запис от дневниците.",
"permissionserrorstext-withaction": "Нямате разрешение за $2 поради {{PLURAL:$1|следната причина|следните причини}}:",
"recreate-moveddeleted-warn": "<strong>Внимание: Създавате страница, която по-рано вече е била изтрита.</strong>\n\nОбмислете добре дали е уместно повторното създаване на страницата.\nЗа ваша информация по-долу е посочена причината за предишното изтриване на страницата:",
"moveddeleted-notice": "Тази страница е изтрита.\nДневниците на изтриванията, защитите и преместванията е показан по-долу.",
+ "moveddeleted-notice-recent": "За съжаление, страницата наскоро е била изтрита (в последните 24 часа).\nПо-долу можете да видите дневник на изтриванията, защитите и преместванията.",
"log-fulllog": "Преглеждане на пълния дневник",
"edit-hook-aborted": "Редакцията беше прекъсната от кука.\nНе беше посочена причина за това.",
"edit-gone-missing": "Страницата не можа да се обнови.\nВероятно междувременно е била изтрита.",
"edit-conflict": "Конфликт при редактирането.",
"edit-no-change": "Редакцията Ви беше пренебрегната, защото не съдържа промени по текста.",
+ "edit-slots-cannot-add": "{{PLURAL:$1|Следното място тук не е поддържано|Следните места тук не са поддържани}}: $2",
+ "edit-slots-cannot-remove": "{{PLURAL:$1|Следното място е задължително и не може да бъде премахнато|Следните места са задължителни и не могат да бъде премахнати}}: $2.",
"postedit-confirmation-created": "Страницата е създадена.",
"postedit-confirmation-restored": "Страницата е възстановена.",
"postedit-confirmation-saved": "Редакцията Ви беше съхранена.",
"defaultmessagetext": "Текст на съобщението по подразбиране",
"content-failed-to-parse": "Неуспех при анализиране на съдържанието от тип $2 за модела $1: $3",
"invalid-content-data": "Невалидни данни за съдържание",
- "content-not-allowed-here": "На страницата [[:$2]] не е позволено използването на $1",
+ "content-not-allowed-here": "На страницата [[:$2]] не е позволено използването на „$1“ на позиция „$3“",
"editwarning-warning": "Ако излезете от тази страница, може да загубите всички несъхранени промени, които сте направили.\nАко сте влезли в системата, можете да изключите това предупреждение чрез менюто „{{int:prefs-editing}}“ в личните ви настройки.",
"editpage-invalidcontentmodel-title": "Форматът на съдържанието не се поддържа",
"editpage-invalidcontentmodel-text": "Модел на съдържание „$1“ не се поддържа.",
"editpage-notsupportedcontentformat-title": "Форматът на съдържанието не се поддържа",
+ "editpage-notsupportedcontentformat-text": "Форматът $1 не е поддържан от модела на съдържание $2.",
"slot-name-main": "Основно",
"content-model-wikitext": "уикитекст",
"content-model-text": "обикновен текст",
"expansion-depth-exceeded-warning": "Страницата е превишила разрешената дълбочина на разгръщане",
"parser-unstrip-loop-warning": "Открито е ''unstrip'' зацикляне",
"unstrip-depth-warning": "Превишено ограничение на дълбочина ($1)",
+ "unstrip-size-warning": "Превишено ограничение на размера ($1)",
"undo-success": "Редакцията може да бъде върната.\nПрегледайте долното сравнение и се уверете, че наистина искате да го направите. След това съхранете страницата, за да извършите връщането.",
"undo-failure": "Редакцията не може да бъде върната поради конфликтни междинни редакции.",
+ "undo-main-slot-only": "Редакцията не може да бъде върната, защото има съдържание извън главния слот.",
"undo-norev": "Редакцията не може да бъде върната, тъй като не съществува или е била изтрита.",
"undo-nochange": "Тази редакция изглежда вече е отменена.",
"undo-summary": "Премахната редакция $1 на [[Special:Contributions/$2|$2]] ([[User talk:$2|беседа]])",
"powersearch-remember": "Запомняне в бъдеще",
"search-external": "Външно търсене",
"searchdisabled": "Търсенето в {{SITENAME}} е временно изключено.\nМеждувременно можете да търсите чрез Google.\nОбърнете внимание, че съхранените при тях страници най-вероятно са остарели.",
- "search-error": "Възникна грешка при търсене: $1",
+ "search-error": "Възникна грешка при търсенето: $1",
"search-warning": "По време на търсенето беше генерирано предупреждение: $1",
"preferences": "Настройки",
"mypreferences": "Настройки",
"prefs-watchlist-days": "Брой дни, които да се показват в списъка за наблюдение:",
"prefs-watchlist-days-max": "Най-много $1 {{PLURAL:$1|ден|дни}}",
"prefs-watchlist-edits": "Максимален брой редакции в списъка за наблюдение:",
- "prefs-watchlist-edits-max": "Ð\9cакÑ\81имален бÑ\80ой: 1000",
+ "prefs-watchlist-edits-max": "Ð\9dай-много: 1000",
"prefs-watchlist-token": "Уникален идентификатор на списъка за наблюдение:",
"prefs-watchlist-managetokens": "Управление на маркерите",
"prefs-misc": "Други",
"recentchangesdays": "Брой дни в последни промени:",
"recentchangesdays-max": "(най-много $1 {{PLURAL:$1|ден|дни}})",
"recentchangescount": "Брой показвани редакции в последните промени, историята на страници и логове по подразбиране:",
- "prefs-help-recentchangescount": "Ð\9cакÑ\81имален бÑ\80ой: 1000",
+ "prefs-help-recentchangescount": "Ð\9dай-много: 1000",
"prefs-help-watchlist-token2": "Това е секретният ключ към уеб хранилката на вашия списък за наблюдение.\nВсеки, който го знае, би могъл да прегледа списъка ви за наблюдение, така че не го споделяйте.\nПри нужда можете да го [[Special:ResetTokens|изчистите]].",
"prefs-help-tokenmanagement": "Можете да видите и нулирате тайния ключ за Вашата сметка, който може да има достъп до уеб хранилката на Вашия списък за наблюдение. Всеки, който знае ключа, ще може да види Вашия списък за наблюдение, така че не го споделяйте.",
"savedprefs": "Настройките ви бяха съхранени.",
"yourrealname": "Истинско име:",
"yourlanguage": "Език:",
"yourvariant": "Езиков вариант на съдържанието:",
+ "prefs-help-variant": "Вашият предпочитан вариант или правопис за показване на съдържателните страници в това уики.",
"yournick": "Подпис:",
"prefs-help-signature": "Коментарите в дискусионните страници трябва да се подписват с поредица от четири тилди \"<nowiki>~~~~</nowiki>\", която при съхранение на редакцията сървърът превръща в подпис с потребителско име, дата и час.",
"badsig": "Избраният подпис не е валиден. Проверете HTML-етикетите!",
"userrights-groups-help": "Може да променяте групите, в които е потребителят:\n* Поставена отметка означава, че потребителят е член на групата.\n* Поле без отметка означава, че потребителят не е член на групата.\n* Знакът * показва, че не можете да премахнете групата, след като е вече добавена (или обратно).\n* Знакът # показва, че можете да удължите само срокът на членството; не може да го върнете на по-ранна дата.",
"userrights-reason": "Причина:",
"userrights-no-interwiki": "Нямате права да редактирате потребителските групи на други уикита.",
- "userrights-nodatabase": "Ð\91азаÑ\82а данни $1 не Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва или не е на локалния сървър.",
+ "userrights-nodatabase": "Ð\91азаÑ\82а данни $1 не Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва или не е на меÑ\81Ñ\82ния сървър.",
"userrights-changeable-col": "Групи, които можете да променяте",
"userrights-unchangeable-col": "Групи, които не можете да променяте",
"userrights-irreversible-marker": "$1*",
"userrights-expiry-current": "Изтича на $1",
"userrights-expiry-none": "Не изтича",
"userrights-expiry": "Изтича на:",
- "userrights-expiry-existing": "Ð\9eÑ\81Ñ\82аваÑ\89о вÑ\80еме: $2, $3",
+ "userrights-expiry-existing": "ТекÑ\83Ñ\89оÑ\82о вÑ\80еме на изÑ\82иÑ\87ане: $3, $2",
"userrights-expiry-othertime": "Друго време:",
"userrights-expiry-options": "1 ден:1 day,1 седмица:1 week,1 месец:1 month,3 месеца:3 months,6 месеца:6 months,1 година:1 year",
+ "userrights-invalid-expiry": "Изтичане за групата „$1“ е невалидно.",
+ "userrights-expiry-in-past": "Изтичане за групата „$1“ е в миналото.",
"group": "Потребителска група:",
"group-user": "Потребители",
"group-autoconfirmed": "Автоматично одобрени потребители",
"right-applychangetags": "Задаване на [[Special:Tags|етикети]] заедно с направените промени",
"right-changetags": "Добавяне и премахване на произволни [[Special:Tags|етикети]] на индивидуални редакции и записи в дневници",
"right-deletechangetags": "Изтриване на [[Special:Tags|етикети]] от базата от данни",
+ "grant-generic": "Набор от права „$1“",
"grant-group-page-interaction": "Взаимодействие със страници",
"grant-group-file-interaction": "Взаимодействие с медийни файлове",
"grant-group-watchlist-interaction": "Взаимодействие с вашия списък за наблюдение",
"rcfilters-watchlist-edit-watchlist-button": "Редактиране на списъка за наблюдение",
"rcfilters-watchlist-showupdated": "Промени по страници, които не сте посетили откакто са внесени промените, са в <strong>получер</strong>, с удебелени маркери.",
"rcfilters-preference-label": "Използване на интерфейс без JavaScript",
- "rcfilters-preference-help": "Ð\9eÑ\82менÑ\8f пÑ\80еÑ\80абоÑ\82каÑ\82а на инÑ\82еÑ\80Ñ\84ейÑ\81а напÑ\80авена пÑ\80ез 2017 година, какÑ\82о и вÑ\81иÑ\87ки инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82и добавени оÑ\82 Ñ\82огава до Ñ\81ега.",
+ "rcfilters-preference-help": "Ð\97аÑ\80ежда поÑ\81ледниÑ\82е пÑ\80омени без Ñ\84илÑ\82Ñ\80и за Ñ\82Ñ\8aÑ\80Ñ\81ене и Ñ\84Ñ\83нкÑ\86ионалноÑ\81Ñ\82 за оÑ\86веÑ\82Ñ\8fване.",
"rcfilters-watchlist-preference-label": "Използване на интерфейс без JavaScript",
- "rcfilters-watchlist-preference-help": "Ð\9eÑ\82менÑ\8f пÑ\80еÑ\80абоÑ\82каÑ\82а на инÑ\82еÑ\80Ñ\84ейÑ\81а напÑ\80авена пÑ\80ез 2017 година, какÑ\82о и вÑ\81иÑ\87ки инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82и добавени оÑ\82 Ñ\82огава до Ñ\81ега.",
+ "rcfilters-watchlist-preference-help": "Ð\97аÑ\80ежда Ñ\81пиÑ\81Ñ\8aка за наблÑ\8eдение без Ñ\84илÑ\82Ñ\80и за Ñ\82Ñ\8aÑ\80Ñ\81ене и Ñ\84Ñ\83нкÑ\86ионалноÑ\81Ñ\82 за оÑ\86веÑ\82Ñ\8fване.",
"rcfilters-filter-showlinkedfrom-label": "Показване на промени на страници, към които има връзка от",
"rcfilters-filter-showlinkedfrom-option-label": "<strong>Страници, към които има връзка от</strong> избраната страница",
"rcfilters-filter-showlinkedto-label": "Показване на промени на страници, сочещи към",
"uploadbtn": "Качване на файл",
"reuploaddesc": "Връщане към формуляра за качване",
"upload-tryagain": "Съхраняване на промененото описание на файла",
+ "upload-tryagain-nostash": "Съхраняване на повторно качения файл и промененото описание",
"uploadnologin": "Не сте влезли",
"uploadnologintext": "За да могат да бъдат качвани файлове е необходимо $1 в системата.",
"upload_directory_missing": "Директорията за качване ($1) липсва и не може да бъде създадена на сървъра.",
"file-deleted-duplicate": "Идентичен с този файл ([[:$1]]) вече е бил изтриван.\nИсторията на изтриването на файла следва да се провери, преди да се пристъпи към повторното му качване.",
"uploadwarning": "Предупреждение при качване",
"uploadwarning-text": "Необходимо е да промените описанието на файла по-долу и да опитате отново.",
+ "uploadwarning-text-nostash": "Необходимо е да качите повторно файла, да промените описанието по-долу и да опитате отново.",
"savefile": "Съхраняване на файл",
"uploaddisabled": "Качванията са забранени.",
"copyuploaddisabled": "Спряно е качването на файлове чрез URL.",
"statistics": "Статистика",
"statistics-header-pages": "Статистики за страницата",
"statistics-header-edits": "Статистики за редакциите",
- "statistics-header-users": "Ð\9fоÑ\82Ñ\80ебиÑ\82ели",
+ "statistics-header-users": "СÑ\82аÑ\82иÑ\81Ñ\82ики за поÑ\82Ñ\80ебиÑ\82елиÑ\82е",
"statistics-header-hooks": "Други статистики",
"statistics-articles": "Съдържателни страници",
"statistics-pages": "Страници",
"anoncontribs": "Приноси",
"contribsub2": "За {{GENDER:$3|$1}} ($2)",
"contributions-userdoesnotexist": "Няма регистрирана потребителска сметка за „$1“.",
+ "negative-namespace-not-supported": "Не са поддържани именни пространства с негативни стойности.",
"nocontribs": "Не са намерени промени, отговарящи на критерия.",
"uctop": "текуща",
"month": "От месец (и по-рано):",
"ipb-disableusertalk": "Редактиране на собствената дискусионна страница",
"ipb-change-block": "Повторно блокиране на потребителя с тези настройки",
"ipb-confirm": "Потвърждаване на блокирането",
+ "ipb-pages-label": "Страници",
"ipb-namespaces-label": "Именни пространства",
"badipaddress": "Невалиден IP-адрес",
"blockipsuccesssub": "Блокирането беше успешно",
"createaccountblock": "създаването на сметки е блокирано",
"emailblock": "е-пощенската услуга е блокирана",
"blocklist-nousertalk": "забрана за редактиране на личната беседа",
+ "blocklist-editing": "Редактиране",
+ "blocklist-editing-sitewide": "Редактиране (за всички уики)",
"blocklist-editing-page": "страници",
"blocklist-editing-ns": "именни пространства",
"ipblocklist-empty": "Списъкът на блокиранията е празен.",
"ip_range_invalid": "Невалиден диапазон на IP-адреси.",
"ip_range_toolarge": "Забранено е блокиране на диапазони от IP адреси по-големи от /$1.",
"ip_range_exceeded": "IP диапазонът превишава максималния диапазон. Позволен диапазон: /$1.",
+ "ip_range_toolow": "IP диапазоните не са позволени.",
"proxyblocker": "Блокировач на проксита",
"proxyblockreason": "IP-адресът Ви беше блокиран, тъй като представлява анонимно достъпен междинен сървър.\nСвържете се с доставчика си на Интернет и го информирайте за този сериозен проблем в сигурността.",
"sorbs": "DNSBL",
"djvu_no_xml": "Не е възможно вземането на XML за DjVu-файла",
"thumbnail-temp-create": "Временния файл с миникартинка не може да бъде създаден.",
"thumbnail_invalid_params": "Параметрите за миникартинка са невалидни",
+ "thumbnail_toobigimagearea": "Файл с размери по-големи от $1",
"thumbnail_dest_directory": "Целевата директория не може да бъде създадена",
"thumbnail_image-type": "Типът картинка не се поддържа",
"thumbnail_gd-library": "Непълна конфугурация на библиотеката GD: липсва функцията $1",
"import-interwiki-history": "Копиране на всички версии на страницата",
"import-interwiki-templates": "Включване на всички шаблони",
"import-interwiki-submit": "Внасяне",
+ "import-mapping-default": "Внасяне в стандартни места",
"import-mapping-namespace": "Импортиране в именно пространство:",
"import-mapping-subpage": "Импортиране като подстраници на следната страница:",
"import-upload-filename": "Име на файл:",
+ "import-upload-username-prefix": "Междууики представка:",
"import-comment": "Коментар:",
"importtext": "Изнесете файла от изходното уики чрез „[[Special:Export|инструмента за изнасяне]]“. Съхранете го на твърдия диск на компютъра си и го качете тук.",
"importstart": "Внасяне на страници…",
"imported-log-entries": "{{PLURAL:$1|Внесен е $1 запис|Внесени са $1 записа}} в дневника.",
"importfailed": "Внасянето беше неуспешно: nowiki>$1</nowiki>",
"importunknownsource": "Непознат тип файл",
+ "importnoprefix": "Не е указана междууики представка",
"importcantopen": "Не е възможно да се отвори файла за внасяне",
"importbadinterwiki": "Невалидна уики препратка",
"importsuccess": "Внасянето беше успешно!",
"confirmemail_body_set": "Някой, вероятно Вие, от IP адрес $1,\nе посочил този адрес за електронната поща, свързан с потребителска сметка „$2“ в {{SITENAME}}.\n\nЗа потвърждаване, че тази потребителска сметка наистина Ви принадлежи и за да активирате отново функциите, свързани с електронна поща в {{SITENAME}}, необходимо е да отворите във вашия браузър следната препратка:\n\n$3\n\nАко потребителската сметка *не* Ви принадлежи, можете да откажете потвърждението, като последвате следната препратка:\n\n$5\n\nВалидността на този код за потвърждение изтича на $4.",
"confirmemail_invalidated": "Отменено потвърждение за електронна поща",
"invalidateemail": "Отмяна на потвърждението за електронна поща",
+ "notificationemail_body_changed": "Някой, вероятно вие, от IP-адрес $1,\nе сменил електронната поща на сметката „$2“ на „$3“ в {{SITENAME}}.\n\nАко не сте вие, веднага се свържете с администратор.",
"scarytranscludedisabled": "[Включването между уикита е деактивирано]",
"scarytranscludefailed": "[Зареждането на шаблона за $1 не сполучи]",
"scarytranscludetoolong": "[Адресът е твърде дълъг]",
"confirm-unwatch-top": "Премахване на страницата от списъка Ви за наблюдение?",
"confirm-rollback-button": "OK",
"confirm-rollback-top": "Отменяне на редакции по тази страница?",
+ "confirm-mcrrestore-title": "Възстановяване на версия",
+ "confirm-mcrundo-title": "Връщане на промяна",
+ "mcrundofailed": "Неуспех при връщане",
+ "mcrundo-missingparam": "Липсващи задължителни параметри на заявката",
"semicolon-separator": "; ",
"comma-separator": ", ",
"colon-separator": ": ",
"logentry-rights-autopromote": "$1 е автоматично {{GENDER:$2|повишен|повишена}} от $4 до $5",
"logentry-upload-upload": "$1 {{GENDER:$2|качи}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|качи}} нова версия на $3",
- "logentry-upload-revert": "$1 {{GENDER:$2|каÑ\87и}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|вÑ\8aÑ\80на}} $3 кÑ\8aм по-Ñ\81Ñ\82аÑ\80а веÑ\80Ñ\81иÑ\8f",
"log-name-managetags": "Дневник на управлението на етикети",
"log-description-managetags": "На тази страница са изброени задачи, свързани с управлението на [[Special:Tags|етикети]]. Дневникът съдържа само действия, извършвани ръчно от администратор. Етикети могат да бъдат създавани или изтривани от уики софтуера без това да бъде отразено в този дневник.",
"logentry-managetags-create": "$1 {{GENDER:$2|създаде}} етикета „$4“",
"special-characters-title-endash": "средно тире",
"special-characters-title-emdash": "дълго тире",
"special-characters-title-minus": "знак минус",
- "mw-widgets-abandonedit": "Сигурни ли сте, че искате да напуснете режима за редактиране без да запишете статията преди това?",
+ "mw-widgets-abandonedit": "Сигурни ли сте, че искате да напуснете режима за редактиране без да съхраните промените?",
"mw-widgets-abandonedit-discard": "Отказване на редакциите",
"mw-widgets-abandonedit-keep": "Продължаване на редактирането",
"mw-widgets-abandonedit-title": "Сигурни ли сте?",
"log-action-filter-rights-autopromote": "Автоматична промяна",
"log-action-filter-upload-upload": "Ново качване",
"log-action-filter-upload-overwrite": "Повторно качване",
+ "log-action-filter-upload-revert": "Връщане",
"authmanager-create-disabled": "Създаването на сметки е изключено.",
"authmanager-create-from-login": "За да създадете сметка, моля попълнете полетата.",
- "authmanager-authplugin-setpass-failed-title": "Промяната на паролата е неуспешна",
- "authmanager-authplugin-setpass-bad-domain": "Невалиден домейн.",
"authmanager-userdoesnotexist": "Няма регистрирана потребителска сметка за „$1“.",
"authmanager-retype-help": "Парола (повторно) за потвърждение.",
"authmanager-email-label": "Е-поща",
"gotointerwiki-invalid": "Указаното заглавие е невалидно.",
"pagedata-title": "Данни за страницата",
"pagedata-bad-title": "Невалидно заглавие: $1.",
+ "unregistered-user-config": "От съображения за сигурност, потребителските подстраници с JavaScript, CSS и JSON не се зареждат за нерегистрирани потребители.",
"passwordpolicies": "Правила за паролите",
"passwordpolicies-summary": "Това е списъкът на действащите правила за паролите на потребителските групи дефинирани в това уики.",
"passwordpolicies-group": "Група",
"passwordpolicies-policy-passwordcannotmatchusername": "Паролата не може да бъде същата като потребителското име",
"passwordpolicies-policy-passwordcannotmatchblacklist": "Паролата не може да съвпада с пароли от черния списък",
"passwordpolicies-policy-maximalpasswordlength": "Паролата трябва да бъде по-малко от $1 {{PLURAL:$1|знак|знака}}",
- "passwordpolicies-policy-passwordcannotbepopular": "Паролата не може да бъде {{PLURAL:$1|най-популярната такава|от списъка на най-популярните $1 пароли}}"
+ "passwordpolicies-policy-passwordcannotbepopular": "Паролата не може да бъде {{PLURAL:$1|най-популярната такава|от списъка на най-популярните $1 пароли}}",
+ "passwordpolicies-policyflag-forcechange": "трябва да бъде променена при влизане"
}
"Shahadat1971",
"Rasal Lia",
"আফতাবুজ্জামান",
- "Tahmid02016"
+ "Tahmid02016",
+ "Ifsad"
]
},
"tog-underline": "সংযোগের নিচে দাগ দেখানো হোক:",
"logentry-rights-autopromote": "$1 স্বয়ংক্রিয়ভাবে $4 থেকে $5-এ {{GENDER:$2|উন্নীত}} হয়েছেন",
"logentry-upload-upload": "$1 $3 {{GENDER:$2|আপলোড করেছেন}}",
"logentry-upload-overwrite": "$1 $3-এর একটি নতুন সংস্করণ {{GENDER:$2|আপলোড করেছেন}}",
- "logentry-upload-revert": "$1 $3 {{GENDER:$2|আপলোড করেছেন}}",
+ "logentry-upload-revert": "$1 $3 একটি পুরাতন সংস্করণে {{GENDER:$2|প্রত্যাবর্তন করেছেন}}",
"log-name-managetags": "ট্যাগ ব্যবস্থাপনা লগ",
"log-description-managetags": "এই পাতাতে [[Special:Tags|ট্যাগ]] ব্যবস্থাপনা কার্যাবলির একটি তালিকা আছে। এই লগে কেবলমাত্র সেইসব কর্মের তালিকা আছে, যেগুলি একজন প্রশাসক নিজ হাতে সম্পাদন করেছেন; উইকি সফটওয়্যার দিয়ে ট্যাগ সৃষ্টি বা অপসারণ করা সম্ভব, যার কোন ভুক্তি এই লগে সংরক্ষিত হবে না।",
"logentry-managetags-create": "$1 \"$4\" ট্যাগটি {{GENDER:$2|তৈরি করেছেন}}",
"log-action-filter-suppress-reblock": "পুনরায় বাধাদানের মাধ্যমে ব্যবহারকারী দমন",
"log-action-filter-upload-upload": "নতুন আপলোড",
"log-action-filter-upload-overwrite": "পুনঃআপলোড",
+ "log-action-filter-upload-revert": "প্রত্যাবর্তন",
"authmanager-authn-not-in-progress": "শনাক্তকরণ প্রক্রিয়াটি আর অগ্রসর হচ্ছে না কিংবা সেশনের উপাত্ত হারিয়ে গেছে। অনুগ্রহ করে আবার শুরু থেকে শুরু করুন।",
"authmanager-authn-no-primary": "সরবরাহকৃত পরিচয়পত্রের অনুমোদন যাচাই করা যায়নি।",
"authmanager-authn-no-local-user": "সরবরাহকৃত পরিচয়জ্ঞাপক তথ্যগুলি এই উইকির কোনও ব্যবহারকারীর সাথে সংশ্লিষ্ট নয়।",
"authmanager-create-no-primary": "সরবরাহকৃত পরিচয়জ্ঞাপক উপাত্তগুলি অ্যাকাউন্ট সৃষ্টির জন্য ব্যবহার করা সম্ভব হয়নি।",
"authmanager-link-no-primary": "সরবরাহকৃত পরিচয়জ্ঞাপক উপাত্তগুলি অ্যাকাউন্ট সংযুক্তকরণের জন্য ব্যবহার করা সম্ভব হয়নি।",
"authmanager-link-not-in-progress": "অ্যাকাউন্ট সংযুক্তকরণ প্রক্রিয়াটি আর অগ্রসর হচ্ছে না কিংবা সেশনের উপাত্ত হারিয়ে গেছে। অনুগ্রহ আবার শুরু থেকে শুরু করুন।",
- "authmanager-authplugin-setpass-failed-title": "পাসওয়ার্ড পরিবর্তন ব্যর্থ হয়েছে",
- "authmanager-authplugin-setpass-failed-message": "প্রমাণীকরণ প্লাগইন পাসওয়ার্ড পরিবর্তন করতে অস্বীকৃতি জানিয়েছে।",
- "authmanager-authplugin-create-fail": "প্রমাণীকরণ প্লাগইন অ্যাকাউন্ট তৈরি করতে অস্বীকৃতি জানিয়েছে।",
- "authmanager-authplugin-setpass-denied": "প্রমাণীকরণ প্লাগইন পাসওয়ার্ড পরিবর্তন করার অনুমতি দেয় না।",
- "authmanager-authplugin-setpass-bad-domain": "অবৈধ ডোমেইন।",
"authmanager-autocreate-noperm": "স্বয়ংক্রিয় অ্যাকাউন্ট সৃষ্টি মঞ্জুরিপ্রাপ্ত নয়।",
"authmanager-autocreate-exception": "স্বয়ংক্রিয় অ্যাকাউন্ট সৃষ্টিকরণ পূর্ববর্তী ত্রুটির কারণে সাময়িকভাবে অক্ষম করা হয়েছে।",
"authmanager-userdoesnotexist": "ব্যবহারকারী অ্যাকাউন্ট \"$1\" অনিবন্ধিত।",
"mycustomcssprotected": "ایسا ساْلا آلشدکاری css ای بٱلگاْ ناْ نارین",
"mycustomjsonprotected": "ایسا ساْلا آلشدکاری JSON ای بٱلگاْ ناْ نارین",
"mycustomjsprotected": "ایسا ساْلا آلشدکاری JavaScript ای بٱلگاْ ناْ نارین",
- "myprivateinfoprotected": "ایسا سلا آلشدکاری دۊنسمٱندیٱل خوسۊسی خوتۊناْ نارین.",
+ "myprivateinfoprotected": "ایسا سلا آلشدکاری دۊنسمٱندیٱل خوسۊسی خوتوناْ نارین.",
"mypreferencesprotected": "ایسا سلا آلشدکاری چیا دیٱر خوتۊناْ نارین.",
"ns-specialprotected": "نیبۊ بٱلگاْیٱل ڤیجاْ ناْ آلشد کرد",
"titleprotected": "ای داسۊن ڤا دٱسدا کاریار [[User:$1|$1]] نیاگری ڤابیڌاْ.\nدلیلس یوناْ <em>$2</em>.",
"welcomecreation-msg": "هساوتوݩ راسد ڤابی.\nب ڤیرتوݩ بۊ کاْ {{نوم دیارگٱ}} [[Special:Preferences|preferences]] خوتوناْ آلشد کونین.",
"yourname": "نوم کاریاری:",
"userlogin-yourname": "نوم کاریاری",
- "userlogin-yourname-ph": "نوم کاریاریتۊناْ بزنین",
- "createacct-another-username-ph": "نوم کاریاریتۊناْ بزنین",
+ "userlogin-yourname-ph": "نوم کاریاریتوناْ بزنین",
+ "createacct-another-username-ph": "نوم کاریاریتوناْ بزنین",
"yourpassword": "رازیناْ گوڌٱشتن",
"userlogin-yourpassword": "رازیناْ گوڌٱشتن",
"userlogin-yourpassword-ph": "رازیناْ گوڌاْشتن ناْ بزٱ",
"cannotcreateaccount-title": "نٱترین هساو کاریاری راسد کونین",
"cannotcreateaccount-text": "ایسا نٱترین موستٱقیم میٛن ای ڤیکی هساو کاریاری راسد کونین.",
"yourdomainname": "پۊشگر ايسا:",
- "password-change-forbidden": "ایسا نٱترین رازیناْ گوڌٱشتن خوتۊناْ میٛن ای ڤیکی آلشد کونین.",
+ "password-change-forbidden": "ایسا نٱترین رازیناْ گوڌٱشتن خوتوناْ میٛن ای ڤیکی آلشد کونین.",
"externaldberror": "اٛشتڤایی میٛن پاٛیڤٱند ڤا رسیناْگا اْتفاق ڤٱستاْ یا ایسا ساْلا یوناْ کاْ یٱ هساو کاریاری خارجی ز خوتۊناْ ب هاْنگوم سازی کونین نارین.",
"login": "ڤامیٛن ٱڤوڌن",
"login-security": "نشوݩ دیارکون خوتۊناْ آلشد کونین",
"nav-login-createaccount": "ٱڤوڌن ڤامیٛن/راس کردن هساو کاریاری",
- "logout": "ز سامۊناْ درٱڤوڌن",
- "userlogout": "ز سامۊناْ درٱڤوڌن",
+ "logout": "ز ساموناْ درٱڤوڌن",
+ "userlogout": "ز ساموناْ درٱڤوڌن",
"notloggedin": "هٱنی نٱڤۊڌیناْ ڤامیٛن",
"userlogin-noaccount": "یٱ هساو کاریاری دارین؟",
"userlogin-joinproject": "ٱندوم دیارگٱ {{SITENAME}} ڤابۊین",
"copyrightwarning2": "ب ڤیرتوݩ بۊ کاْ تٱموم هومیاریٱل ایسا {{SITENAME}} زیرناْخیز «$2» دٱرتیچ اْبوݩ).\n\n(سی دیڌن جوزئیات بیشتر ز $1 رۉین\n\nٱر نیخاین نڤشداْیٱلوݩ گٱن آلشدکاری نٱڤبۊن و دل ب خایی باْسی ڤابۊن، ایچو باْسی سوݩ نٱکونین.<br />\nهٱنی ٱم ایسا دارین بیما قۉل اْڌین کاْ خوتوݩ یوناْ نڤشدیناْ یا هوناْ ز یٱ سرچشماْ آزاڌ ڤا مالکیت خٱلکمٱند یا چی هو ڤورداشتین ساْ. '''چیا ناْ بی موجٱڤز و بی سلا کوپی رایت باْسی نٱکونین!''''",
"templatesused": "{{PLURAL:$1|چۊاْ|چۊاْیٱل}} ڤا کار ڤٱسداْ میٛن ای بٱلگاْ:",
"templatesusedpreview": "قالڤٱل یا اولگۊیٱل ڤاْ کار رٱئڌاْ مؽن ای نهانماو",
+ "templatesusedsection": "{{PLURAL:$1|چۊاْ|چۊاْیٱل}} ڤا کار ڤٱسداْ میٛن ای بٱئرجا:",
"template-protected": "(پٱر و پیم ڤابیڌٱ)",
"template-semiprotected": "(نسم نیماْ پٱر و پیم ڤابیڌاْ)",
"hiddencategories": "ای بٱلگاْ یکی ز ٱندوما {{PLURAL:$1|1 hidden category|$1 hidden categories}} اْ:",
"nocreatetext": "{{SITENAME}}قابلیت درست کردن صفحات تازه را محدود کرده. ترین برگردین و صفحه موجود را اصلاح کنین یا اینکه [[Special:UserLogin|به سیستم داخل بوین یا حساب کاربری درست کنین]].",
+ "nocreate-loggedin": "ایسا سیٛلا راسد کرد ای بٱلگاْیٱل ناْ نارین",
"sectioneditnotsupported-title": "ایسا سیٛلا آلشدکاری بٱئرجا ناْ نارین.",
+ "sectioneditnotsupported-text": "ایسا نٱترین آلشدکاری بٱئرجایی میٛن ای بٱلگاْ ٱنجوم بڌین",
"permissionserrors": "پٱلاْ:اْجازاْ ڤگرا",
"permissionserrorstext-withaction": "ایسا سی نیاگری $2 ساٛلا\nنارین {{PLURAL:$1|دلیل|دلیلٱل}}:",
"recreate-moveddeleted-warn": "'''هوشڌار: ایسا هنؽ سٱرزاْنۊ بٱلٛگی ناْ ؤرکل اْکونین کاْ نهاتٱرپاکسا آڤیڌاْ '''مؽن فرگ داشڌ ڤۊهین کاْ آلشڌ ای بٱلٛگاْ کارؽ دوروساْ هؽڌا آ نٱ. نمایاٛ پاکسا مؽنڌار ڤا ای بٱلٛگاْ سی راهٱتی کار ڤا دینا آؤوڌاْ",
"history-edit-tags": "آلشدکاری سردیسٱل ڤانیاریٱل گولاْڤورچین ڤابیڌاْ.",
"rev-deleted-comment": "(خولاساْ آلشدکاری پاکسا ڤابی)",
"rev-deleted-user": "(نوم کاریاری پاکسا ڤابیڌاْ)",
+ "rev-deleted-event": "(جوزئیات پهرستنوماْ پاکسا ڤابیڌاْ)",
+ "rev-deleted-user-contribs": "[نوم کاریاری یا تیرنشوݩ آی پی پاکسا ڤابیڌاْ - چیا قام ڤابیڌاْ ز ڤٱر هومیارٱل ناْ آلشدکار کونین]",
"rev-delundel": "آلشد هال و بال ديڌن",
"rev-showdeleted": "دیاری کردن",
"revisiondelete": "پاکسا کردن/زنداْ کردن ڤانیٱریٱل",
"revdelete-nooldid-title": "ڤانیٱری نادیار",
"revdelete-no-file": "جانیا تیار ڤابیڌاْ ڤوجۊڌ ناراْ.",
"revdelete-show-file-submit": "هٱراْ",
+ "revdelete-selected-text": "{{PLURAL:$1|ڤانیٱری گولاْڤورچین ڤابیڌاْ|ڤانیٱریٱل گولاْڤورچین ڤابیڌاْ}} ڤا [[:$2]]:",
+ "revdelete-selected-file": "{{PLURAL:$1| نوسقاْ جانیا گولاْڤورچین ڤابیڌاْ|نوسقاْ جانیایٱل گولاْڤورچین ڤابیڌاْ}} ڤا [[:$2]]:",
"revdelete-hide-text": "متن ڤانیٱری",
"revdelete-hide-image": "میٛنۊناْیٱل جانیا ناْ قام کو",
"revdelete-hide-comment": "خولاساْ آلشدکاری",
"revdel-restore": "آلشد هال و بال ديڌن",
"pagehist": "ڤیرگار بٱلگاْ",
"deletedhist": "ڤیرگار پاکسا ڤابیڌاْ",
+ "revdelete-otherreason": "دیٱری/دلیل اْزافی:",
"revdelete-reasonotherlist": "دلیل هاْنی",
"revdelete-edit-reasonlist": "دلیل پاکسا کردن آلشدکاریٱل",
+ "suppressionlog": "پهرستنوماْ پاکساکاری",
+ "mergehistory": "یکی کردن ڤیرگار بٱگاْ",
+ "mergehistory-box": "یکی کردن ڤانیٱریٱل دوتا بٱلگاْ:",
"mergehistory-from": "بٱلگاْ سرچشماْ:",
"mergehistory-into": "بٱگاْ مٱقسٱڌ:",
"mergehistory-list": "ڤیرگار آلشدکاریٱل سٱریٱک بیڌنی",
"mergehistory-submit": "سر یٱک کردن ڤانیاریٱل",
"mergehistory-fail-invalid-source": "سرچشمٱ بٱلگاْ نادیاراْ.",
"mergehistory-fail-invalid-dest": "بٱلگاْ مٱقسٱڌ نادیاراْ.",
+ "mergehistory-no-source": "سرچشماْ بٱلگاْ $1 ڤوجۊڌ ناراْ.",
+ "mergehistory-no-destination": "بٱلگاْ $1 ڤوجۊڌ ناراْ.",
+ "mergehistory-invalid-source": "سرچشماْ بٱلگاْ ڤا یٱ داسوݩ خۊ داشداْ بۊ.",
+ "mergehistory-autocomment": "یکی بیڌاْ [[:$1]] ڤا [[:$2]]",
+ "mergehistory-comment": "یکی بیڌاْ [[:$1]] ڤا [[:$2]]: $3",
"mergehistory-reason": "دلیل:",
"mergelog": "سیائاْ ؤریٱک",
"revertmerge": "سٱڤا کردن",
"search-showingresults": "{{PLURAL:$4|نتیجاْیٱل<strong>$1</strong> ز <strong>$3</strong>|نتیجاْ یٱل<strong>$1 - $2</strong ز <strong>$3</strong>}}",
"search-nonefound": "هیژ نتیجاْیی ڤا پاٛی جوست توݩ یکی نیڌ.",
"powersearch-legend": "پاٛی جۊری پیشکرداْ",
+ "powersearch-ns": "پاٛی جۊری میٛن نومجایٱل:",
"powersearch-togglelabel": "ڤارسی کردن:",
"powersearch-toggleall": "هٱماْ",
"powersearch-togglenone": "هيش کوم",
"prefs-rc": "آلشدکاریٱل ایسنی",
"prefs-watchlist": "ساٛیل بٱرگ",
"prefs-editwatchlist": "آلشدکاری ساٛیل بٱرگ",
+ "prefs-editwatchlist-label": "چیا خوتوناْ میٛن ساٛیل بٱگرتوݩ آلشدکاری کونین:",
"prefs-editwatchlist-clear": "ساٛیل بٱرگ خوتوناْ پاکسا کونین",
"prefs-watchlist-edits-max": "شوماراْ بیشتروناْ:1000",
"prefs-watchlist-token": "نشوناْ ساٛیل بٱرگ:",
"log-action-filter-block-block": "نیاگری ڤابۊ",
"log-action-filter-block-unblock": "نیاگری نٱڤابۊ",
"log-action-filter-delete-delete": "پاکسا کردن بٱلگاْ",
- "authmanager-authplugin-setpass-bad-domain": "پۊشگر نادیار.",
"authmanager-retype-help": "سی پوشت راسدکاری ز نۉ رازیناْ گوڌٱشتن ناْ بزنین",
"authmanager-email-label": "ٱنجوماناماْ",
"authmanager-email-help": "تیرنشۊن ٱنجوماناماْ",
"authmanager-create-no-primary": "N'eus ket bet gallet implijout an titouroù kred lakaet evit krouiñ ur gont.",
"authmanager-link-no-primary": "Ne c'hallomp ket liammañ ur gont gant an titouroù anaout pourchaset.",
"authmanager-link-not-in-progress": "Ne'z a ket war-raok al liammañ kontoù pe kollet ez eus bet roadennoù dalc'h marteze. Adkrogit adalek ar penn-kentañ.",
- "authmanager-authplugin-setpass-failed-title": "C'hwitet eo bet ar cheñchamant ger-tremen",
- "authmanager-authplugin-setpass-failed-message": "Nac'het eo bet cheñch ar ger-tremen gant an adveziant dilesa.",
- "authmanager-authplugin-create-fail": "Nac'het eo bet krouiñ ar gont gant an adveziant dilesa.",
- "authmanager-authplugin-setpass-denied": "N'eo ket aotreet cheñch gerioù-tremen gant an adveziant dilesa.",
- "authmanager-authplugin-setpass-bad-domain": "Domani direizh.",
"authmanager-autocreate-noperm": "N'haller ket krouiñ kontoù ent emgefre.",
"authmanager-autocreate-exception": "Diweredekaet eo bet ar c'hrouiñ kontoù evit ar mare abalamour da fazioù kent.",
"authmanager-userdoesnotexist": "N'eo ket enrollet ar gont implijer \"$1\".",
"authmanager-create-disabled": "Onemogućeno pravljenje računa.",
"authmanager-create-from-login": "Popunite polja da biste napravili račun.",
"authmanager-create-not-in-progress": "Pravljenje računa nije u toku ili su podaci o sesiji izgubljeni. Počnite ispočetka.",
- "authmanager-authplugin-setpass-failed-title": "Promjena lozinke nije uspjela",
- "authmanager-authplugin-setpass-failed-message": "Dodatak za autentifikaciju odbio je promjenu lozinke.",
- "authmanager-authplugin-create-fail": "Dodatak za autentifikaciju odbio je pravljenje računa.",
- "authmanager-authplugin-setpass-denied": "Dodatak za autentifikaciju ne dozvoljava mijenjanje lozinki.",
- "authmanager-authplugin-setpass-bad-domain": "Neispravna domena.",
"authmanager-autocreate-noperm": "Automatsko pravljenje računa nije dozvoljeno.",
"authmanager-autocreate-exception": "Automatsko pravljenje računa privremeno je onemogućeno zbog prijašnjih greški.",
"authmanager-userdoesnotexist": "Korisnički račun \"$1\" nije registriran.",
"ipbreason": "Motiu:",
"ipbreason-dropdown": "*Motius de blocatge més freqüents\n** Inserció d'informació falsa\n** Supressió de contingut sense justificació\n** Inserció d'enllaços promocionals (spam)\n** Inserció de contingut sense cap sentit\n** Conducta intimidatòria o hostil\n** Abús de comptes d'usuari múltiples\n** Nom d'usuari no acceptable",
"ipb-hardblock": "Impedeix que els usuaris registrats puguin editar des d'aquesta adreça IP",
- "ipbcreateaccount": "Impedeix la creació de comptes",
- "ipbemailban": "Impedeix que l'usuari enviï correus electrònics",
+ "ipbcreateaccount": "Creació de comptes",
+ "ipbemailban": "Enviament de correus electrònics",
"ipbenableautoblock": "Bloca l'adreça IP d'aquest usuari, i totes les subseqüents adreces des de les quals intenti registrar-se",
"ipbsubmit": "Bloca aquest usuari",
"ipbother": "Un altre termini",
"ipboptions": "2 hores:2 hours,1 dia:1 day,3 dies:3 days,1 setmana:1 week,2 setmanes:2 weeks,1 mes:1 month,3 mesos:3 months,6 mesos:6 months,1 any:1 year,infinit:infinite",
"ipbhidename": "Amaga el nom d'usuari de les edicions i llistes",
"ipbwatchuser": "Vigila les pàgines d'usuari i de discussió de l'usuari",
- "ipb-disableusertalk": "Impedeix que aquest usuari pugui modificar la seva pàgina de discussió mentre dura el blocatge",
+ "ipb-disableusertalk": "Modificació de la pròpia pàgina de discussió",
"ipb-change-block": "Torna a blocar l'usuari amb aquests paràmetres",
"ipb-confirm": "Confirma el blocatge",
"ipb-sitewide": "A tot el lloc web",
"logentry-block-block": "$1 {{GENDER:$2|ha blocat}} {{GENDER:$4|$3}} per un temps de $5 $6",
"logentry-block-unblock": "$1 {{GENDER:$2|va desblocar}} {{GENDER:$4|$3}}",
"logentry-block-reblock": "$1 {{GENDER:$2|ha canviat}} la configuració del blocatge de {{GENDER:$4|$3}} per un temps de $5 $6",
+ "logentry-partialblock-block-page": "{{PLURAL:$1|la pàgina|les pàgines}} $2",
+ "logentry-partialblock-block-ns": "{{PLURAL:$1|l’espai de noms|els espais de noms}} $2",
"logentry-suppress-block": "$1 {{GENDER:$2|ha blocat}} {{GENDER:$4|$3}} per un temps de $5 $6",
"logentry-suppress-reblock": "$1 {{GENDER:$2|ha canviat}} la configuració de blocatge de {{GENDER:$4|$3}} per un temps de $5 $6",
"logentry-import-upload": "$1 {{GENDER:$2|va importar}} $3 a través de càrrega de fitxer",
"authmanager-authn-autocreate-failed": "Ha fallat la creació automàtica d'un compte local: $1",
"authmanager-create-disabled": "S'ha inhabilitat la creació de comptes.",
"authmanager-create-from-login": "Per crear un compte, ompliu els camps.",
- "authmanager-authplugin-setpass-failed-title": "El canvi de contrasenya ha fallat",
- "authmanager-authplugin-setpass-bad-domain": "Domini invàlid.",
"authmanager-autocreate-noperm": "No es permet la creació automàtica de comptes.",
"authmanager-userdoesnotexist": "El compte d'usuari «$1» no està registrat.",
"authmanager-username-help": "Nom d'usuari per a l'autenticació.",
"tooltip-namespace_association": "Zaškrtnutím tohoto políčka zahrnete i diskusní či obsahový jmenný prostor příslušný k vybranému jmennému prostoru",
"blanknamespace": "(Hlavní)",
"contributions": "Příspěvky {{GENDER:$1|uživatele|uživatelky}}",
- "contributions-title": "Příspěvky {{GENDER:$1|uživatele|uživatelky|uživatele/uživatelky}} $1",
+ "contributions-title": "Příspěvky {{GENDER:$1|uživatele|uživatelky|uživatele}} $1",
"mycontris": "Příspěvky",
"anoncontribs": "Příspěvky",
"contribsub2": "{{GENDER:$3|uživatele|uživatelky}} $1 ($2)",
"logentry-rights-autopromote": "$1 {{GENDER:$2|byl automaticky povýšen|byla automaticky povýšena}} z $4 na $5",
"logentry-upload-upload": "$1 {{GENDER:$2|načetl|načetla}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|načetl|načetla}} novou verzi $3",
- "logentry-upload-revert": "$1 {{GENDER:$2|načetl|načetla}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|vrátil|vrátila}} $3 na starou verzi",
"log-name-managetags": "Kniha správy značek",
"log-description-managetags": "Tato stránka obsahuje seznam správcovských úkonů týkajících se [[Special:Tags|značek]]. Protokol obsahuje pouze akce, které provedl ručně správce; značky může vytvářet či mazat přímo software wiki, aniž by v tomto protokolu vznikl záznam.",
"logentry-managetags-create": "$1 {{GENDER:$2|vytvořil|vytvořila}} značku „$4“",
"log-action-filter-suppress-reblock": "Utajení uživatele novým zablokováním",
"log-action-filter-upload-upload": "Nové načtení",
"log-action-filter-upload-overwrite": "Znovunačtení",
+ "log-action-filter-upload-revert": "Vrácení zpět",
"authmanager-authn-not-in-progress": "Autentizace neprobíhá nebo se ztratila data relace. Začněte, prosíme, znovu od začátku.",
"authmanager-authn-no-primary": "Uvedené přihlašovací údaje se nepodařilo autentizovat.",
"authmanager-authn-no-local-user": "Uvedené přihlašovací údaje neodpovídají žádnému uživateli této wiki.",
"authmanager-create-no-primary": "Uvedené přihlašovací údaje nelze použít pro založení účtu.",
"authmanager-link-no-primary": "Uvedené přihlašovací údaje nelze použít pro propojení účtů.",
"authmanager-link-not-in-progress": "Propojování účtů neprobíhá nebo se ztratila data relace. Začněte, prosíme, znovu od začátku.",
- "authmanager-authplugin-setpass-failed-title": "Změna hesla se nezdařila",
- "authmanager-authplugin-setpass-failed-message": "Autentizační modul změnu hesla zamítl.",
- "authmanager-authplugin-create-fail": "Autentizační modul založení účtu zamítl.",
- "authmanager-authplugin-setpass-denied": "Autentizační modul neumožňuje měnit hesla.",
- "authmanager-authplugin-setpass-bad-domain": "Neplatná doména.",
"authmanager-autocreate-noperm": "Automatické zakládání účtů není povoleno.",
"authmanager-autocreate-exception": "Automatické založení účtu je dočasně zakázáno kvůli předchozím chybám.",
"authmanager-userdoesnotexist": "Uživatelský účet „$1“ není zaregistrován.",
"showhideselectedlogentries": "Dewis dangos neu guddio cofnodion lòg",
"checkbox-all": "Y cyfan",
"checkbox-none": "Dim",
+ "checkbox-invert": "Gwrthdroi",
"allpages": "Pob tudalen",
"nextpage": "Y bloc nesaf gan ddechrau gyda ($1)",
"prevpage": "Y bloc cynt gan ddechrau gyda ($1)",
"logentry-rights-autopromote": "$1 blev automatisk {{GENDER:$2|forfremmet}} fra $4 til $5",
"logentry-upload-upload": "$1 {{GENDER:$2|lagde}} $3 op",
"logentry-upload-overwrite": "$1 {{GENDER:$2|lagde}} en ny udgave af $3 op",
- "logentry-upload-revert": "$1 {{GENDER:$2|lagde}} $3 op",
+ "logentry-upload-revert": "$1 {{GENDER:$2|gendannede}} $3 til en gammel version",
"logentry-managetags-create": "$1 {{GENDER:$2|oprettede}} tagget \"$4\"",
"rightsnone": "(-)",
"rightslogentry-temporary-group": "$1 (midlertidig, indtil $2)",
"log-action-filter-rights-rights": "Manuel ændring",
"log-action-filter-rights-autopromote": "Automatisk ændring",
"log-action-filter-upload-upload": "Ny overførsel",
+ "log-action-filter-upload-revert": "Gendan",
"authmanager-create-disabled": "Kontooprettelse deaktiveret",
"authmanager-create-from-login": "For at oprette din konto, så udfyld venligst felterne.",
- "authmanager-authplugin-setpass-failed-title": "Ændring af adgangskode mislykkedes",
- "authmanager-authplugin-setpass-bad-domain": "Ugyldig domæne.",
"authmanager-autocreate-noperm": "Automatisk kontooprettelse er ikke tilladt.",
"authmanager-userdoesnotexist": "Brugerkontoen \"$1\" er ikke registreret.",
"authmanager-email-label": "E-post",
"logentry-rights-autopromote": "$1 wurde automatisch von $4 zu $5 {{GENDER:$2|zugeordnet}}",
"logentry-upload-upload": "$1 {{GENDER:$2|lud}} $3 hoch",
"logentry-upload-overwrite": "$1 {{GENDER:$2|lud}} eine neue Version von $3 hoch",
- "logentry-upload-revert": "$1 {{GENDER:$2|lud}} $3 hoch",
+ "logentry-upload-revert": "$1 {{GENDER:$2|setzte}} $3 auf eine alte Version zurück",
"log-name-managetags": "Markierungsverwaltungs-Logbuch",
"log-description-managetags": "Diese Seite listet Verwaltungsaufgaben bezüglich der [[Special:Tags|Markierungen]] auf. Das Logbuch enthält nur Aktionen, die manuell von einem Administrator ausgeführt wurden; Markierungen können auch von der Wikisoftware erstellt oder gelöscht werden, ohne dass ein aufgezeichneter Eintrag in diesem Logbuch vorliegt.",
"logentry-managetags-create": "$1 {{GENDER:$2|erstellte}} die Markierung „$4“",
"log-action-filter-suppress-reblock": "Benutzerunterdrückung durch Neusperre",
"log-action-filter-upload-upload": "Neue Hochladung",
"log-action-filter-upload-overwrite": "Wiederhochladung",
+ "log-action-filter-upload-revert": "Zurücksetzung",
"authmanager-authn-not-in-progress": "Die Authentifizierung ist nicht im Gang oder es sind Sitzungsdaten verloren gegangen. Bitte beginne von vorn.",
"authmanager-authn-no-primary": "Die angegebenen Anmeldeinformationen konnten nicht überprüft werden.",
"authmanager-authn-no-local-user": "Die angegebenen Anmeldeinformationen sind mit keinem Benutzer auf diesem Wiki verknüpft.",
"authmanager-create-no-primary": "Die angegebenen Anmeldeinformationen konnten nicht für die Benutzerkontenerstellung verwendet werden.",
"authmanager-link-no-primary": "Die angegebenen Anmeldeinformationen konnten nicht für die Benutzerkontenverknüpfung verwendet werden.",
"authmanager-link-not-in-progress": "Die Benutzerkontenverknüpfung ist nicht im Gang oder es sind Sitzungsdaten verloren gegangen. Bitte beginne von vorn.",
- "authmanager-authplugin-setpass-failed-title": "Passwortänderung fehlgeschlagen",
- "authmanager-authplugin-setpass-failed-message": "Das Authentifizierungs-Plugin hat die Passwortänderung abgelehnt.",
- "authmanager-authplugin-create-fail": "Das Authentifizierungs-Plugin hat die Benutzerkontenerstellung abgelehnt.",
- "authmanager-authplugin-setpass-denied": "Das Authentifizierungs-Plugin erlaubt keine Passwortänderungen.",
- "authmanager-authplugin-setpass-bad-domain": "Ungültige Domain.",
"authmanager-autocreate-noperm": "Die automatische Benutzerkontenerstellung ist nicht erlaubt.",
"authmanager-autocreate-exception": "Die automatische Benutzerkontenerstellung ist aufgrund früherer Fehler vorübergehend deaktiviert.",
"authmanager-userdoesnotexist": "Das Benutzerkonto „$1“ ist nicht registriert.",
"passwordpolicies-policy-maximalpasswordlength": "Ein Passwort muss weniger als {{PLURAL:$1|ein|$1}} Zeichen lang sein",
"passwordpolicies-policy-passwordcannotbepopular": "Ein Passwort kann nicht {{PLURAL:$1|das beliebteste Passwort|in der Liste der $1 beliebtesten Passwörter}} sein",
"passwordpolicies-policy-passwordnotinlargeblacklist": "Das Passwort kann nicht in der Liste der 100.000 am häufigsten verwendeten Passwörter sein.",
+ "passwordpolicies-policyflag-forcechange": "muss bei der Anmeldung geändert werden",
"easydeflate-invaliddeflate": "Der angegebene Inhalt ist nicht ordnungsgemäß komprimiert",
"unprotected-js": "Aus Sicherheitsgründen kann JavaScript-Code nicht mehr von ungeschützten Seiten geladen werden. Erstelle die JavaScript-Seite bitte ausschließlich im Namensraum „MediaWiki“ oder als Benutzerunterseite."
}
"prefs-labs": "Xacetê labs",
"prefs-user-pages": "Pelê karberi",
"prefs-personal": "Profilê karberi",
- "prefs-rc": "Vırnayışê peyêni",
+ "prefs-rc": "Vurnayışê peyêni",
"prefs-watchlist": "Lista seyrkerdışi",
"prefs-editwatchlist": "Lista seyrkerdışi bıvurne",
"prefs-editwatchlist-label": "Listey serkerdışanê cıkewtışi timar kerê",
"nchanges": "$1 {{PLURAL:$1|vurnayış|vurnayışi}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ziyaretê peyêni ra nata}}",
"enhancedrc-history": "tarix",
- "recentchanges": "Vırnayışê peyêni",
+ "recentchanges": "Vurnayışê peyêni",
"recentchanges-legend": "Tercihê vırnayışanê peyênan",
- "recentchanges-summary": "Wiki sero vırnayışê peyêni asenê.",
+ "recentchanges-summary": "Ena pele de Wiki sero vurnayışê peyêni asenê.",
"recentchanges-noresult": "Demê periyodi de vırnayış be enê kriteran çıniyo.",
"recentchanges-feed-description": "Ena feed dı vurnayişanê tewr peniyan teqip bık.",
"recentchanges-label-newpage": "Enê vırnayışi yew perra newiye vıraşta.",
"recentchanges-label-bot": "Eno vırnayış terefê yew boti ra vıraziyo",
"recentchanges-label-unpatrolled": "Eno vurnayış hewna dewriya nêbiyo",
"recentchanges-label-plusminus": "Ebadê perre de bazê bayti de vayey cı",
- "recentchanges-legend-heading": "<strong>Kıtabekê vırnayışê peyêni:</strong>",
+ "recentchanges-legend-heading": "<strong>Kıtabekê vurnayışê peyêni:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} Şıma şenê ([[Special:NewPages|Lista peranê newan]] zi bıvênê)",
"recentchanges-legend-plusminus": "''(±123)''",
"recentchanges-submit": "Bımocne",
"tooltip-n-mainpage-description": "Şo perra seri",
"tooltip-n-portal": "Heqa procey de, kes çı şeno bıkero, çı kamca vêniyeno",
"tooltip-n-currentevents": "Vurnayışanê peyênan de melumatê pey bıvêne",
- "tooltip-n-recentchanges": "Wiki dı yew lista vurnayışanê peyênan",
+ "tooltip-n-recentchanges": "Wiki de yew lista vurnayışanê peyênan",
"tooltip-n-randompage": "Pelê da raştameyiye bar ke",
"tooltip-n-help": "Cayê peştigırewtışi",
"tooltip-t-whatlinkshere": "Lista pelanê wikiya pêroina ke tiya gırê bena",
"markaspatrolledtext": "Ena pele kontrol biyayi nışan ke",
"markedaspatrolled": "Nişan biyo ke verni de devriye biyo",
"markedaspatrolledtext": "Versiyone weçinaye [[:$1]] nişan biyo ke devriye biyo",
- "rcpatroldisabled": "Dewriyay vırnayışê peyêni nêxebetiyena",
+ "rcpatroldisabled": "Dewriyaya vurnayışanê peyênan nêxebetiyena",
"rcpatroldisabledtext": "Dewriya vırnayışanê peyênan nêgırweniyena.",
"markedaspatrollederror": "Nişan nibeno ke devriye biyo",
"markedaspatrollederrortext": "Ti gani revizyon işaret bike ke Nişanê devriye biyo",
"specialpages-group-maintenance": "Rapora pawıtışi",
"specialpages-group-other": "Pelê xısusiyê bini",
"specialpages-group-login": "Cı kewe / hesab vıraze",
- "specialpages-group-changes": "Vırnayışê peyêni u qeydi",
+ "specialpages-group-changes": "Vurnayışê peyêni û qeydi",
"specialpages-group-media": "Raporê medya û barkerdışi",
"specialpages-group-users": "Karberi u heqê inan",
"specialpages-group-highuse": "Pelê ke zêdêr gureniyenê",
"logentry-rights-autopromote": "$1 otomatikmen $4 ra $5 {{GENDER:$2|terfi bi}}",
"logentry-upload-upload": "$1 {{GENDER:$2|bar kerd}} $3",
"logentry-upload-overwrite": "$1 versiyonê $3 {{GENDER:$2|bar kerd}}",
- "logentry-upload-revert": "$1, {{GENDER:$2|bar kerd}} $3",
+ "logentry-upload-revert": "$1, {{GENDER:$2|bar kerd}} $3\n\n$1 peyser {{GENDER:$2|na}} be yew versiyonê keheni $3 ra",
"log-name-managetags": "Qeydê idareyê etiketi",
"log-name-tag": "Qeydê etiketi",
"rightsnone": "(çıniyo)",
"date-range-from": "Nê tarixi ra:",
"date-range-to": "Heta nê tarixi:",
"randomrootpage": "Pela raştameya rıçıkıne",
- "log-action-filter-block": "Tipê kılitkerdışi:",
+ "log-action-filter-block": "Tewrê kılitkerdışi:",
+ "log-action-filter-contentmodel": "Tewrê vurnayışê modelê zerreki:",
"log-action-filter-delete": "Tewrê esterıtışi:",
"log-action-filter-import": "Tewrê zerrenayışi:",
"log-action-filter-move": "Tewrê berdışi:",
"log-action-filter-block-reblock": "Vurniyayışê kılitkerdışi",
"log-action-filter-block-unblock": "Ake",
"log-action-filter-contentmodel-change": "Modelê zerreki bıvurne",
+ "log-action-filter-contentmodel-new": "Ebe modelê zerrekiyê nêhesabiyayeyi ra vıraştışê pele",
"log-action-filter-delete-delete": "Esterıtışê pele",
+ "log-action-filter-delete-delete_redir": "Serşıkıtışi sero bınusne",
"log-action-filter-delete-restore": "Esterıtışê pele peyser bıgê",
- "log-action-filter-delete-event": "Rocek esterıtış",
+ "log-action-filter-delete-event": "Esterıtışê roceki",
+ "log-action-filter-delete-revision": "Esterıtışê çımraviyarnayışi",
+ "log-action-filter-import-interwiki": "Zerrenayışê Transwikiyi",
+ "log-action-filter-import-upload": "Ebe barkerdışê XMLi ra zerre ke",
+ "log-action-filter-upload-revert": "Wegeyrayış",
"authprovider-resetpass-skip-label": "Ravêre",
"authprovider-resetpass-skip-help": "Peysereştışê parola ra bıvêre.",
"authform-notoken": "Tokeno kemi",
"log-action-filter-upload-upload": "Νέα μεταφόρτωση",
"log-action-filter-upload-overwrite": "Επαναμεταφόρτωση",
"authmanager-create-disabled": "Η δημιουργία λογαριασμού έχει απενεργοποιηθεί.",
- "authmanager-authplugin-setpass-failed-title": "Η αλλαγή κωδικού πρόσβασης απέτυχε",
"authmanager-email-label": "Διεύθυνση ηλ. ταχυδρομείου",
"authmanager-email-help": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
"authmanager-realname-label": "Πραγματικό όνομα",
"edit": "Edit",
"edit-local": "Edit local description",
"create": "Create",
- "create-local": "Add local description",
"delete": "Delete",
"undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
"viewdeleted_short": "View {{PLURAL:$1|one deleted edit|$1 deleted edits}}",
"ipb-confirm": "Confirm block",
"ipb-sitewide": "Sitewide",
"ipb-partial": "Partial",
+ "ipb-sitewide-help": "Every page on the wiki and all other contribution actions.",
+ "ipb-partial-help": "Specific pages or namespaces.",
"ipb-pages-label": "Pages",
"ipb-namespaces-label": "Namespaces",
"badipaddress": "Invalid IP address",
"logentry-rights-autopromote": "$1 was automatically {{GENDER:$2|promoted}} from $4 to $5",
"logentry-upload-upload": "$1 {{GENDER:$2|uploaded}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|uploaded}} a new version of $3",
- "logentry-upload-revert": "$1 {{GENDER:$2|uploaded}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|reverted}} $3 to an old version",
"log-name-managetags": "Tag management log",
"log-description-managetags": "This page lists management tasks related to [[Special:Tags|tags]]. The log contains only actions carried out manually by an administrator; tags may be created or deleted by the wiki software without an entry being recorded in this log.",
"logentry-managetags-create": "$1 {{GENDER:$2|created}} the tag \"$4\"",
"log-action-filter-suppress-reblock": "User suppression by reblock",
"log-action-filter-upload-upload": "New upload",
"log-action-filter-upload-overwrite": "Reupload",
+ "log-action-filter-upload-revert": "Revert",
"authmanager-authn-not-in-progress": "Authentication is not in progress or session data has been lost. Please start again from the beginning.",
"authmanager-authn-no-primary": "The supplied credentials could not be authenticated.",
"authmanager-authn-no-local-user": "The supplied credentials are not associated with any user on this wiki.",
"authmanager-create-no-primary": "The supplied credentials could not be used for account creation.",
"authmanager-link-no-primary": "The supplied credentials could not be used for account linking.",
"authmanager-link-not-in-progress": "Account linking is not in progress or session data has been lost. Please start again from the beginning.",
- "authmanager-authplugin-setpass-failed-title": "Password change failed",
- "authmanager-authplugin-setpass-failed-message": "The authentication plugin denied the password change.",
- "authmanager-authplugin-create-fail": "The authentication plugin denied the account creation.",
- "authmanager-authplugin-setpass-denied": "The authentication plugin does not allow changing passwords.",
- "authmanager-authplugin-setpass-bad-domain": "Invalid domain.",
"authmanager-autocreate-noperm": "Automatic account creation is not allowed.",
"authmanager-autocreate-exception": "Automatic account creation temporarily disabled due to prior errors.",
"authmanager-userdoesnotexist": "User account \"$1\" is not registered.",
"passwordpolicies-group": "Group",
"passwordpolicies-policies": "Policies",
"passwordpolicies-policy-display": "<span class=\"passwordpolicies-policy\">$1 <code>($2)</code></span>",
+ "passwordpolicies-policy-displaywithflags": "<span class=\"passwordpolicies-policy\">$1 <code>($2)</code></span> <span class=\"passwordpolicies-policy-flags\">($3)</span>",
"passwordpolicies-policy-minimalpasswordlength": "Password must be at least $1 {{PLURAL:$1|character|characters}} long",
"passwordpolicies-policy-minimumpasswordlengthtologin": "Password must be at least $1 {{PLURAL:$1|character|characters}} long to be able to login",
"passwordpolicies-policy-passwordcannotmatchusername": "Password cannot be the same as username",
"passwordpolicies-policy-maximalpasswordlength": "Password must be less than $1 {{PLURAL:$1|character|characters}} long",
"passwordpolicies-policy-passwordcannotbepopular": "Password cannot be {{PLURAL:$1|the popular password|in the list of $1 popular passwords}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "Password cannot be in the list of 100,000 most commonly used passwords.",
+ "passwordpolicies-policyflag-forcechange": "must change on login",
"easydeflate-invaliddeflate": "Content provided is not properly deflated",
"unprotected-js": "For security reasons JavaScript cannot be loaded from unprotected pages. Please only create javascript in the MediaWiki: namespace or as a User subpage"
}
"accmailtext": "Hazarde generita pasvorto por [[User talk:$1|$1]] estas sendita al $2.\n\nLa pasvorto por ĉi tiu nova konto povas esti ŝanĝita en la paĝo ''[[Special:ChangePassword|ŝanĝi pasvorton]]'' dum ensalutado.",
"newarticle": "(Nova)",
"newarticletext": "Vi sekvis ligilon al paĝo ankoraŭ ne ekzistanta. Se vi volas krei ĝin, ektajpu malsupre (vidu la [$1 helpopaĝon] por klarigoj.) Se vi malintence alvenis ĉi tien, simple alklaku <strong>Reen</strong>-butonon de via retumilo.",
- "anontalkpagetext": "<em>Jen diskutopaĝo por anonima kontribuanto kiu ankoraŭ ne kreis konton aŭ ne uzas ĝin.</em>\nNi tial devas uzi la cifran IP-adreson por identigi tiun kontribuanton.\nĈi tia IP-adreso povas esti uzata de pluraj uzantoj.\nSe vi estas anonimulo kaj preferus eviti tiajn mistrafajn komentojn al vi, bonvolu [[Special:CreateAccount|krei konton]] aŭ [[Special:UserLogin|ensaluti]] por eviti estontan konfuzon pro aliaj anonimaj uzantoj.''",
+ "anontalkpagetext": "----\n<em>Jen diskutopaĝo por anonima kontribuanto kiu ankoraŭ ne kreis konton aŭ ne uzas ĝin.</em>\nNi tial devas uzi nombran IP-adreson por identigi tiun kontribuanton.\nĈi tia IP-adreso povas esti uzata de pluraj uzantoj.\nSe vi estas anonimulo kaj preferus eviti tiajn mistrafajn komentojn al vi, bonvolu [[Special:CreateAccount|krei konton]] aŭ [[Special:UserLogin|ensaluti]] por eviti estontan konfuzon pro aliaj anonimaj uzantoj.",
"noarticletext": "Mankas teksto en ĉi tiu paĝo.\nVi povas [[Special:Search/{{PAGENAME}}|serĉi ĉi tiun paĝtitolon]] en aliaj paĝoj,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serĉi la rilatajn protokolojn],\naŭ [{{fullurl:{{FULLPAGENAME}}|action=edit}} krei ĉi tiun paĝon]</span>.",
"noarticletext-nopermission": "Estas neniom da teksto en ĉi tiu paĝo.\nVi povas [[Special:Search/{{PAGENAME}}|serĉi ĉi tiun paĝan titolon]] en aliaj paĝoj,\naŭ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serĉi la rilatajn protokolojn]</span>, sed vi ne rajtas krei ĉi tiun paĝon.",
"missing-revision": "La revizio n-ro $1 de la paĝo nomata \"{{FULLPAGENAME}}\" ne ekzistas.\n\nTio kutime estas kaŭzata per sekvado de malaktuala historio-ligilo al paĝo forigita.\nDetaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de forigoj].",
"authmanager-create-no-primary": "La provizitaj legitimaĵoj ne povus esti uzita por konta kreo.",
"authmanager-link-no-primary": "La provizitaj legitimaĵoj ne povus esti uzita por konta ligado.",
"authmanager-link-not-in-progress": "La kontokreado ne estas progresanta aŭ la sencaj datumoj perdiĝis. Bonvolu provi denove ekde la komenco.",
- "authmanager-authplugin-setpass-failed-title": "Pasvorta ŝanĝo malsukcesis",
- "authmanager-authplugin-setpass-failed-message": "La aŭtentikigado kromprogramo neis la pasvortan ŝanĝon.",
- "authmanager-authplugin-create-fail": "La kromprogramo de aŭtentikigado neis la keon de konto.",
- "authmanager-authplugin-setpass-denied": "La kromprogramaro de aŭtentikigado ne permisas ŝanĝadon de pasvorto.",
- "authmanager-authplugin-setpass-bad-domain": "Malvalida domajno.",
"authmanager-autocreate-noperm": "Aŭtomata kreo de konto ne estas permesita.",
"authmanager-autocreate-exception": "Aŭtomata kreo de konto estas provizore malfunkciigita pro antaŭaj eraroj.",
"authmanager-userdoesnotexist": "Uzanto-konto \"$1\" ne estas registrita.",
"logentry-rights-autopromote": "$1 ha sido {{GENDER:$2|promocionado|promocionada}} automáticamente de $4 a $5",
"logentry-upload-upload": "$1 {{GENDER:$2|subió}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|subió}} una nueva versión de $3",
- "logentry-upload-revert": "$1 {{GENDER:$2|subió}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|revirtió}} $3 a una versión anterior",
"log-name-managetags": "Registro de gestión de etiquetas",
"log-description-managetags": "Esta página muestra las acciones realizadas sobre las [[Special:Tags|etiquetas]]. El registro solo contiene acciones llevadas a cabo por un administrador de forma manual; el software del wiki podría crear o eliminar etiquetas sin que se registre aquí.",
"logentry-managetags-create": "$1 {{GENDER:$2|creó}} la etiqueta «$4»",
"log-action-filter-suppress-reblock": "Usuario supresión de rebloqueo",
"log-action-filter-upload-upload": "Subida nueva",
"log-action-filter-upload-overwrite": "Volver a subir",
+ "log-action-filter-upload-revert": "Revertir",
"authmanager-authn-not-in-progress": "La autenticación no está en curso o los datos de sesión se han perdido. Por favor, vuelve a empezar desde el principio.",
"authmanager-authn-no-primary": "Las credenciales proporcionadas no se han podido autentificar.",
"authmanager-authn-no-local-user": "Las credenciales suministradas no están asociadas con ningún usuario en este wiki.",
"authmanager-create-no-primary": "Las credenciales suministradas no pueden usarse para la creación de la cuenta.",
"authmanager-link-no-primary": "Las credenciales proporcionadas no se han podido utilizar para enlazar cuentas.",
"authmanager-link-not-in-progress": "La vinculación de cuentas no está en curso o los datos de la sesión se han perdido. Por favor, vuelve a empezar desde el principio.",
- "authmanager-authplugin-setpass-failed-title": "Error de cambio de contraseña",
- "authmanager-authplugin-setpass-failed-message": "El complemento de autenticación denegó el cambio de contraseña.",
- "authmanager-authplugin-create-fail": "El complemento de autenticación denegó la creación de la cuenta.",
- "authmanager-authplugin-setpass-denied": "El complemento de autenticación no permite el cambio de contraseñas.",
- "authmanager-authplugin-setpass-bad-domain": "El dominio no es válido.",
"authmanager-autocreate-noperm": "La creación automática de cuentas no está permitida.",
"authmanager-autocreate-exception": "La creación automática de cuentas ha sido temporalmente desactivada debido a errores previos.",
"authmanager-userdoesnotexist": "El usuario «$1» no está registrado.",
"authmanager-create-no-primary": "Ette antud autentimisandmetega ei õnnestunud kontot luua.",
"authmanager-link-no-primary": "Ette antud autentimisandmetega ei õnnestunud kontot linkida.",
"authmanager-link-not-in-progress": "Konto linkimine pole teoksil või läksid seansiandmed kaduma. Palun alusta uuesti.",
- "authmanager-authplugin-setpass-failed-title": "Parooli muutmine ebaõnnestus",
- "authmanager-authplugin-setpass-failed-message": "Autentimise tarkvaralisa keeldus parooli muutmast.",
- "authmanager-authplugin-create-fail": "Autentimise tarkvaralisa keeldus kontot loomast.",
- "authmanager-authplugin-setpass-denied": "Autentimise tarkvaralisa ei luba paroole muuta.",
- "authmanager-authplugin-setpass-bad-domain": "Vigane domeen.",
"authmanager-autocreate-noperm": "Kontode automaatne loomine pole lubatud.",
"authmanager-autocreate-exception": "Kontode automaatne loomine on varasemate tõrgete tõttu ajutiselt keelatud.",
"authmanager-userdoesnotexist": "Kasutajakonto \"$1\" pole registreeritud.",
"returnto": "$1(e)ra itzuli.",
"tagline": "{{SITENAME}}tik",
"help": "Laguntza",
+ "help-mediawiki": "MediaWikiri buruzko laguntza",
"search": "Bilatu",
"search-ignored-headings": " #<!-- utzi marra hau den bezala --> <pre>\n# Bilaketan ez ikusi egingo diren izenburuak.\n# Honetarako aldaketek eragina izango dute goiburua indexatuta dagoen orrialdean.\n# Orriaren birdefinizioa behartu dezakezu edizio nulua egiteaz.\n# Sintaxia horrela da:\n# * \"#\" karakteretik marraren bukaerararte dagoen guztia iruzkina da.\n# * Hutsunezko lerroa ez den bakoitza kontuan ez hartzeko izenburu zehatza da, kasu eta guzti.\nErreferentziak\nKanpoko linkak\nIkusi ere\n #</pre> <!-- utzi marra hau den bezala -->",
"searchbutton": "Bilatu",
"passwordtooshort": "Pasahitzek {{PLURAL:$1|karaktere 1|$1 karaktere}} gutxienez eduki behar dituzte.",
"passwordtoolong": "Pasahitzak ezin dira {{PLURAL:$1|karaktere bat|$1 karaktere}} baino luzeagoak izan.",
"passwordtoopopular": "Ezin dira pasahitz ohikoenak erabili. Aukera ezazu asmatzeko zailagoa den pasahitz bat.",
+ "passwordinlargeblacklist": "Sartu duzun pasahitza pasahitza oso erabilien zerrenda batean dago. Mesedez, erabili ezazu hain ohikoa ez den bat.",
"password-name-match": "Zure pasahitza ezin da zure erabiltzaile-izen bera izan.",
"password-login-forbidden": "Erabiltzaile izen eta pasahitz hau erabiltzea debekaturik dago.",
"mailmypassword": "Pasahitza berrezarri",
"botpasswords-invalid-name": "Zehaztutako erabiltzaileak ez du bot pasahitzaren ($1) bereizlea.",
"botpasswords-not-exist": "$1 erabiltzaileak ez du $2 izeneko pasahitza.",
"botpasswords-needs-reset": "\"$1\"{{GENDER:$1|erabiltzailearen}} \"$2\" robotaren pasahitza berrezarri behar da.",
+ "botpasswords-locked": "Ezin zara sartu bot pasahitz batekin zure kontua blokeatua dagoelako.",
"resetpass_forbidden": "Ezin dira pasahitzak aldatu",
"resetpass_forbidden-reason": "Ezin dira pasahitzak aldatu: $1",
"resetpass-no-info": "Orrialde honetara zuzenean sartzeko izena eman behar duzu.",
"resetpass-abort-generic": "Estentsio batek pasahitza aldatzea ekidin du.",
"resetpass-expired": "Zure pasahitza iraungitu da. Sartzeko, pasahitz berria ezarri, mesedez.",
"resetpass-expired-soft": "Zure pasahitza iraungi egin da eta aldatu beharra dago. Mesedez, aukeratu orain pasahitz berria edo egin klik \"{{int:authprovider-resetpass-skip-label}}\"-n geroago aldatzeko.",
+ "resetpass-validity": "Zure pasahitza ez da baliagarria: $1\n\nMesedez, aukera ezazu beste pasahitz bat sartzeko.",
"resetpass-validity-soft": "Zure pasahitzak ez du balio: $1\n\nMesedez, aukeratu orain pasahitz berri bat, edo \"{{int:authprovider-resetpass-skip-label}}\" klikatu geroago berrezartzeko.",
"passwordreset": "Pasahitzaren berrezarpena",
"passwordreset-text-one": "Bete formulario hau zure pasahitza berrezartzeko.",
"editpage-invalidcontentmodel-text": "$1 eduki eredua ezin da erabili.",
"editpage-notsupportedcontentformat-title": "Eduki formatu hori ez da onartzen",
"editpage-notsupportedcontentformat-text": "$2 eduki ereduak ezin da erabili $1 eduki formatuarekin.",
+ "slot-name-main": "Nagusia",
"content-model-wikitext": "wikitestua",
"content-model-text": "testu laua",
"content-model-javascript": "JavaScript",
"localtime": "Ordu lokala:",
"timezoneuseserverdefault": "Erabili lehenetsitako wikia ($1)",
"timezoneuseoffset": "Beste bat (diferentzia ezarri)",
+ "timezone-useoffset-placeholder": "Adibideak: \"-07:00\" edo \"01:00\"",
"servertime": "Zerbitzariko ordua:",
"guesstimezone": "Nabigatzailetik jaso",
"timezoneregion-africa": "Afrika",
"prefs-advancedwatchlist": "Aukera aurreratuak",
"prefs-displayrc": "Aukerak erakutsi",
"prefs-displaywatchlist": "Aukerak erakutsi",
+ "prefs-changesrc": "Erakusten diren aldaketak",
+ "prefs-changeswatchlist": "Erakusten diren aldaketak",
+ "prefs-pageswatchlist": "Jarraitutako orrialdeak",
"prefs-tokenwatchlist": "Token",
"prefs-diffs": "Ezberdintasunak",
"prefs-help-prefershttps": "Hobespen hauek eragina izango dute sartzen zaren hurrengoan.",
"ipb-disableusertalk": "Galarazi erabiltzaile honi bere eztabaida orria editatzea, blokeatuta dagoen aldian",
"ipb-change-block": "Berriz blokeatu erabiltzailea, parametro hauekin",
"ipb-confirm": "Blokeoa baieztatu",
+ "ipb-pages-label": "Orrialdeak",
+ "ipb-namespaces-label": "Izen-tarteak",
"badipaddress": "Baliogabeko IP helbidea",
"blockipsuccesssub": "Blokeoa burutu da",
"blockipsuccesstext": "[[Special:Contributions/$1|$1]] blokeatua izan da.<br />\nIkus [[Special:BlockList|blokeoen zerrenda]] blokeoak aztertzeko.",
"ipb-blocklist-duration-left": "gainerako $1",
"block-actions": "Blokeatuko diren ekintzak:",
"block-expiry": "Iraungipena",
+ "block-options": "Aukera gehigarriak:",
+ "block-prevent-edit": "Aldatzen",
+ "block-reason": "Arrazoia:",
+ "block-target": "Erabiltzaile izena edo IP helbidea:",
"unblockip": "Erabiltzailea desblokeatu",
"unblockiptext": "Erabili beheko formularioa lehenago blokeatutako IP helbide edo erabiltzaile baten idazketa baimenak leheneratzeko.",
"ipusubmit": "Blokeoa ezabatu",
"blocklist-nousertalk": "zure buruaren eztabaida orrialdea ezin duzu aldatu",
"blocklist-editing": "aldatzen",
"blocklist-editing-sitewide": "editatzea (gune osoan)",
+ "blocklist-editing-page": "orrialdeak",
+ "blocklist-editing-ns": "izen-tarteak",
"ipblocklist-empty": "Blokeaketa zerrenda hutsik dago.",
"ipblocklist-no-results": "Zehaztutako IP helbide edo erabiltzaile izena ez dago blokeatuta.",
"blocklink": "blokeatu",
"pageinfo-display-title": "Ageri den izenburua",
"pageinfo-default-sort": "Ordenatze irizpide lehenetsia",
"pageinfo-length": "Orriaren neurria (byteak)",
+ "pageinfo-namespace": "Izen-tartea",
"pageinfo-article-id": "Orriaren identifikazio zenbakia",
"pageinfo-language": "Orriaren edukiaren hizkuntza",
"pageinfo-language-change": "aldatu",
"log-action-filter-suppress-reblock": "Birblokoz kendutako erabiltzailea",
"log-action-filter-upload-upload": "Igoera berria",
"log-action-filter-upload-overwrite": "Birkargatu",
+ "log-action-filter-upload-revert": "Leheneratu",
"authmanager-authn-not-in-progress": "Egiaztatzea ez dago prozesuan edo saioaren datuak galdu egin dira. Hasi berriro hasieratik mesedez.",
"authmanager-authn-no-primary": "Emandako kredentzialak ezin izan dira egiaztatu.",
"authmanager-authn-no-local-user": "Emandako kredentzialak ez dute lotura wiki honetako erabiltzaileekin.",
"authmanager-create-no-primary": "Ezin izan dira hornitutako kredentzialak kontu-sortzerakoan erabili.",
"authmanager-link-no-primary": "Ezin izan dira hornitutako kredentzialak kontuari lotzeko erabili.",
"authmanager-link-not-in-progress": "Kontua sortzea ez doa aurrera edo saioaren datuak galdu egin dira. Hasi berriro hasieratik mesedez.",
- "authmanager-authplugin-setpass-failed-title": "Ezin izan da pasahitza aldatu",
- "authmanager-authplugin-setpass-failed-message": "Autentifikazio pluginak pasahitza aldatzea ukatu du.",
- "authmanager-authplugin-create-fail": "Autentifikazio pluginak kontua sortzea ukatu du.",
- "authmanager-authplugin-setpass-denied": "Autentifikazio pluginak pasahitza aldatzerik ez du ahalbidetzen.",
- "authmanager-authplugin-setpass-bad-domain": "Balio ez duen domeinua.",
"authmanager-autocreate-noperm": "Ezin da automatikoki erabiltzaile bat sortu.",
"authmanager-autocreate-exception": "Kontua automatikoki sortzea aldi baterako desgaituta aurreko erroreak direla eta.",
"authmanager-userdoesnotexist": "\"$1\" erabiltzaile kontua ez dago erregistratua.",
"exif-countrycodecreated": "Код на държавата, в която е направена снимката",
"exif-provinceorstatecreated": "Област или щат, в който е направена снимката",
"exif-citycreated": "Град, в който е направена снимката",
+ "exif-sublocationcreated": "Район на града в който е направена снимката",
"exif-worldregiondest": "Показан регион на света",
"exif-countrydest": "Показана държава",
"exif-countrycodedest": "Код на показаната държава",
"exif-objectname": "Кратко заглавие",
"exif-specialinstructions": "Специални инструкции",
"exif-headline": "Заглавие",
+ "exif-credit": "Субект, предоставил изображението",
"exif-source": "Източник",
+ "exif-editstatus": "Редакционен статус на изображението",
"exif-urgency": "Спешност",
+ "exif-locationdest": "Показано място",
+ "exif-locationdestcode": "Код на показаното място",
+ "exif-objectcycle": "Време от деня за което е предназначена снимката",
"exif-contact": "Информация за контакти",
"exif-writer": "Автор на текста",
"exif-languagecode": "Език",
"exif-iimcategory": "Категория",
"exif-iimsupplementalcategory": "Допълнителни категории",
"exif-datetimeexpires": "Да не се използва след",
+ "exif-datetimereleased": "Издадена на",
+ "exif-originaltransmissionref": "Код на мястото от което е изпратена снимката",
"exif-identifier": "Идентификатор",
"exif-lens": "Използвана оптична леща",
"exif-serialnumber": "Сериен номер на фотоапарата",
"exif-originaldocumentid": "Уникален номер на оригиналния документ",
"exif-licenseurl": "Адрес с информация за авторски права",
"exif-morepermissionsurl": "Алтернативна информация за лиценза",
+ "exif-attributionurl": "При използване на творбата, моля поставете връзка до",
+ "exif-preferredattributionname": "При използване на творбата, моля укажете автора",
"exif-pngfilecomment": "Kоментар на PNG файл",
"exif-disclaimer": "Уточнение",
"exif-contentwarning": "Предупреждение за съдържанието",
"exif-giffilecomment": "Kоментар на GIF файл",
"exif-intellectualgenre": "Тип елемент",
+ "exif-subjectnewscode": "Код на темата",
"exif-event": "Изобразено събитие",
"exif-organisationinimage": "Изобразена организация",
"exif-personinimage": "Изобразена личност",
"exif-compression-7": "JPEG",
"exif-copyrighted-true": "Заштитено с авторски права",
"exif-copyrighted-false": "Статутът на авторските права не е указан",
+ "exif-photometricinterpretation-0": "Чернобяло (Бялото е 0)",
+ "exif-photometricinterpretation-1": "Чернобяло (Черното е 0)",
"exif-photometricinterpretation-2": "RGB",
+ "exif-photometricinterpretation-3": "Цветова палитра",
+ "exif-photometricinterpretation-4": "Маска на прозрачност",
+ "exif-photometricinterpretation-5": "Разделено (Вероятно CMYK)",
+ "exif-photometricinterpretation-8": "CIE L*a*b*",
+ "exif-photometricinterpretation-9": "CIE L*a*b* (ICC-кодиране)",
+ "exif-photometricinterpretation-10": "CIE L*a*b* (ITU-кодиране)",
"exif-unknowndate": "Неизвестна дата",
"exif-orientation-1": "Нормално",
"exif-orientation-2": "Отражение по хоризонталата",
"exif-gpsdop-poor": "Лошо ($1)",
"exif-objectcycle-a": "Само сутрин",
"exif-objectcycle-p": "Само вечер",
+ "exif-objectcycle-b": "Сутрин и вечер",
"exif-gpsdirection-t": "Истинска",
"exif-gpsdirection-m": "Магнитна",
"exif-ycbcrpositioning-1": "Центрирани",
"exif-compression-6": "JPEG",
"exif-copyrighted-true": "Copyrightduna",
"exif-copyrighted-false": "Copyright egoera ez da ezarri",
+ "exif-photometricinterpretation-0": "Zuri-beltza (beltza 0 da)",
"exif-photometricinterpretation-1": "Zuri-beltza (beltza 0 da)",
"exif-photometricinterpretation-2": "GBU (RGB)",
+ "exif-photometricinterpretation-3": "Kolore-paleta",
+ "exif-photometricinterpretation-4": "Gardentasun maskara",
+ "exif-photometricinterpretation-5": "Bereiztuak (ziurrenik CMYK)",
"exif-photometricinterpretation-6": "YCbCr",
+ "exif-photometricinterpretation-8": "CIE L*a*b*",
+ "exif-photometricinterpretation-9": "CIE L*a*b* (ICC kodeketa)",
+ "exif-photometricinterpretation-10": "CIE L*a*b* (ITU kodeketa)",
"exif-unknowndate": "Data ezezaguna",
"exif-orientation-1": "Arrunta",
"exif-orientation-2": "Horizontalki buelta emana",
"authmanager-create-no-primary": "اطلاعات اعتبارسنجی ارائه شده نمیتواند جهت ايجاد حساب بکار رود.",
"authmanager-link-no-primary": "اطلاعات اعتبارسنجی ارائه شده نمیتواند جهت مرتبط کردن حساب بکار رود.",
"authmanager-link-not-in-progress": "مرتبط کردن حساب در جريان نيست یا اطلاعات جلسه کاری از بين رفته است. لطفاً دوباره از ابتدا شروع کنيد.",
- "authmanager-authplugin-setpass-failed-title": "تغییر گذرواژه ناموفق بود",
- "authmanager-authplugin-setpass-failed-message": "افزونهٔ اعتبارسنجی، تغيير گذزواژه را مردود دانست",
- "authmanager-authplugin-create-fail": "افزونهٔ اعتبارسنجی، ايجاد حساب را مردود دانست",
- "authmanager-authplugin-setpass-denied": "افزونهٔ اعتبارسنجی اجازهٔ تغيير گذرواژه را نمیدهد",
- "authmanager-authplugin-setpass-bad-domain": "دامنه نامعتبر است.",
"authmanager-autocreate-noperm": "ایجاد حساب خودکار مجاز نیست.",
"authmanager-autocreate-exception": "ایجاد حساب کاربری به خاطر خطاهای قبلی به طور موقت غیرفعال است.",
"authmanager-userdoesnotexist": "حساب کاربری «$1» ثبت نشدهاست.",
"authmanager-create-no-primary": "Annettuja kirjautumistietoja ei voitu käyttää tunnuksen luontiin.",
"authmanager-link-no-primary": "Annettuja kirjautumistietoja ei voitu käyttää tunnuksen linkittämiseen.",
"authmanager-link-not-in-progress": "Tunnuksen linkitys ei ole käynnissä tai istunnon tiedot ovat hävinneet. Ole hyvä ja aloita uudelleen alusta.",
- "authmanager-authplugin-setpass-failed-title": "Salasanan muuttaminen epäonnistui",
- "authmanager-authplugin-setpass-failed-message": "Varmennuslisäosa esti salasanan muuttamisen.",
- "authmanager-authplugin-create-fail": "Varmennuslisäosa esti tunnuksen luonnin.",
- "authmanager-authplugin-setpass-denied": "Varmennuslisäosa ei salli salasanojen muuttamista.",
- "authmanager-authplugin-setpass-bad-domain": "Virheellinen domain.",
"authmanager-autocreate-noperm": "Automaattinen tunnustenluonti ei ole sallittu.",
"authmanager-autocreate-exception": "Automaattinen tunnuksenluonti on tilapäisesti poistettu käytöstä aikaisempien virheiden vuoksi.",
"authmanager-userdoesnotexist": "Käyttäjätunnusta ”$1” ei ole rekisteröity.",
"logentry-rights-autopromote": "$1 {{GENDER:$2|a été promu}} automatiquement de $4 à $5",
"logentry-upload-upload": "$1 {{GENDER:$2|a téléversé}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|a téléversé}} une nouvelle version de $3",
- "logentry-upload-revert": "$1 {{GENDER:$2|a téléversé}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|a annulé}} $3 vers une ancienne version",
"log-name-managetags": "Journal des modifications de balises",
"log-description-managetags": "Cette page recense les tâches de maintenance liées aux [[Special:Tags|balises]]. Le journal contient uniquement les actions faites manuellement par un administrateur ; les balises peuvent être créées ou supprimées par le logiciel wiki sans que cette action ne soit inscrite dans ce journal.",
"logentry-managetags-create": "$1 {{GENDER:$2|a créé}} la balise « $4 ».",
"log-action-filter-suppress-reblock": "Suppression d’utilisateur par blocage réitéré",
"log-action-filter-upload-upload": "Nouveau téléversement",
"log-action-filter-upload-overwrite": "Réitérer le téléversement",
+ "log-action-filter-upload-revert": "Révoquer",
"authmanager-authn-not-in-progress": "L’authentification n’est pas en cours ou les données de session ont été perdues. Veuillez recommencer depuis le début.",
"authmanager-authn-no-primary": "Les informations d’identification fournies n’ont pas pu être authentifiées.",
"authmanager-authn-no-local-user": "Les informations d’identification fournies ne sont associées à aucun utilisateur sur ce wiki.",
"authmanager-create-no-primary": "Les informations d’identification fournies n’ont pas pu être utilisées pour la création de compte.",
"authmanager-link-no-primary": "Les informations d’identification fournies n’ont pas pu être utilisées pour lier un compte.",
"authmanager-link-not-in-progress": "La liaison de compte n’est pas en cours ou les données de session ont été perdues. Veuillez recommencer depuis le début.",
- "authmanager-authplugin-setpass-failed-title": "Échec du changement de mot de passe",
- "authmanager-authplugin-setpass-failed-message": "Le module d’authentification a refusé le changement de mot de passe.",
- "authmanager-authplugin-create-fail": "Le module d’authentification a refusé la création de compte.",
- "authmanager-authplugin-setpass-denied": "Le module d’authentification ne permet pas la modification des mots de passe.",
- "authmanager-authplugin-setpass-bad-domain": "Domaine non valide.",
"authmanager-autocreate-noperm": "La création automatique de compte n’est pas autorisée.",
"authmanager-autocreate-exception": "La création automatique de compte est désactivée temporairement, du fait d’erreurs antérieures.",
"authmanager-userdoesnotexist": "Le compte utilisateur « $1 » n’est pas inscrit.",
"passwordpolicies-policy-maximalpasswordlength": "Les mots de passe doivent avoir moins de $1 caractère{{PLURAL:$1||s}} de long",
"passwordpolicies-policy-passwordcannotbepopular": "Le mot de passe ne peut pas être {{PLURAL:$1|le mot de passe populaire|dans la liste des $1 mots de passe populaires}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "Le mot de passe ne peut pas faire partie de la liste des 100 000 mots de passe les plus communément utilisés.",
+ "passwordpolicies-policyflag-forcechange": "doit changer à la reconnexion",
"easydeflate-invaliddeflate": "Le contenu fourni n'est pas correctement développé",
"unprotected-js": "Pour des raisons de sécurité, JavaScript ne peut pas être chargé depuis des pages non protégées. Veuillez ne créer du javascript que dans l’espace de noms MediaWiki: ou comme sous-page utilisateur"
}
"anoncontribs": "Contribucións",
"contribsub2": "De {{GENDER:$3|$1}} ($2)",
"contributions-userdoesnotexist": "A conta de usuario \"$1\" non está rexistrada.",
+ "negative-namespace-not-supported": "Non están soportados os espazos de nomes con valore negativos.",
"nocontribs": "Non se deron atopado cambios con eses criterios.",
"uctop": "actual",
"month": "Desde o mes de (e anteriores):",
"logentry-rights-autopromote": "$1 foi {{GENDER:$2|promovido|promovida}} automaticamente de $4 a $5",
"logentry-upload-upload": "$1 {{GENDER:$2|cargou}} \"$3\"",
"logentry-upload-overwrite": "$1 {{GENDER:$2|cargou}} unha nova versión de \"$3\"",
- "logentry-upload-revert": "$1 {{GENDER:$2|cargou}} \"$3\"",
+ "logentry-upload-revert": "$1 {{GENDER:$2|reverteu}} $3 a unha versión antiga",
"log-name-managetags": "Rexistro de xestión de etiquetas",
"log-description-managetags": "Esta páxina contén unha lista das tarefas de xestión relacionadas con [[Special:Tags|tags]]. No rexistro figuran só aquelas accións realizadas de forma manual por un administrador; pódense crear ou borrar etiquetas por medio do software wiki sen que se engada unha nova entrada ao rexistro.",
"logentry-managetags-create": "$1 {{GENDER:$2|created}} a etiqueta \"$4\"",
"expand_templates_generate_rawhtml": "Amosar o HTML en bruto",
"expand_templates_preview": "Vista previa",
"expand_templates_preview_fail_html": "<em>Dado que o código HTML puro está activado en {{SITENAME}} e se produciu unha perda dos datos da sesión, a vista previa está oculta como precaución contra ataques mediante código JavaScript.</em>\n\n<strong>Se este é un intento lexítimo de acceso á vista previa, probe de novo.</strong>\nEn caso de que siga sen funcionar, intente [[Special:UserLogout|saír]] e volver entrar na súa conta e verifique que o seu navegador permite o uso de cookies neste sitio.",
- "expand_templates_preview_fail_html_anon": "<em>Dado que o código HTML puro está activado en {{SITENAME}} e produciuse unha perda dos datos da sesión, a vista previa está oculta como precaución contra ataques mediante código JavaScript.</em>\n\n<strong>Se este é un intento lexítimo de acceso á vista previa, probe a [[UserLogin|iniciar a sesión]] e volver a entrar coa súa conta.</strong>",
+ "expand_templates_preview_fail_html_anon": "<em>Dado que o código HTML puro está activado en {{SITENAME}} e non iniciou sesión, a vista previa está oculta como precaución contra ataques mediante código JavaScript.</em>\n\n<strong>Se este é un intento lexítimo de acceso á vista previa, probe a [[Special:UserLogin|iniciar a sesión]] e ténteo de novo.</strong>",
"expand_templates_input_missing": "Necesita proporcionar polo menos algún texto wiki de entrada.",
"pagelanguage": "Cambiar a lingua da páxina",
"pagelang-name": "Páxina",
"log-action-filter-suppress-reblock": "Supresión de usuario por bloqueo reiterado",
"log-action-filter-upload-upload": "Nova subida",
"log-action-filter-upload-overwrite": "Resubida",
+ "log-action-filter-upload-revert": "Reverter",
"authmanager-authn-not-in-progress": "O proceso de autenticación non está en progreso ou perdéronse os datos da sesión. Empece de novo desde o principio.",
"authmanager-authn-no-primary": "A información de identificación proporcionada non pode ser autenticada.",
"authmanager-authn-no-local-user": "As credenciais proporcionadas non están asociadas con ningún usuario neste wiki.",
"authmanager-create-no-primary": "As credenciais subministradas non poden usarse para a creación da conta.",
"authmanager-link-no-primary": "As credenciais subministradas non poden usarse para a ligazón da conta.",
"authmanager-link-not-in-progress": "A vinculación da conta non está en progreso ou perdéronse os datos da sesión. Empece de novo desde o principio.",
- "authmanager-authplugin-setpass-failed-title": "Fallou o cambio do contrasinal",
- "authmanager-authplugin-setpass-failed-message": "O complemento de autenticación denegou o cambio de contrasinal.",
- "authmanager-authplugin-create-fail": "O complemento de autenticación denegou a creación da conta.",
- "authmanager-authplugin-setpass-denied": "O complemento de autenticación non permite o cambio de contrasinais.",
- "authmanager-authplugin-setpass-bad-domain": "Dominio non válido.",
"authmanager-autocreate-noperm": "A creación automatica de contas non está permitida.",
"authmanager-autocreate-exception": "A creación automatica de contas foi desactivada temporalmente debido a erros previos.",
"authmanager-userdoesnotexist": "O usuario \"$1\" non está rexistrado.",
"group-all": "(soglle)",
"grouppage-bot": "{{ns:project}}:Robotam",
"grouppage-sysop": "{{ns:project}}:Karbhari",
+ "right-move": "Panam haloi",
"right-writeapi": "Borovpeache API-cho upeog",
"newuserlogpage": "Vapurpi rochnnechem sotr",
"rightslog": "Vaporpeachea hokancho sotr",
"recentchanges-label-plusminus": "Hea panacho akar itlea baitani bodol'lo",
"recentchanges-legend-heading": "<strong>Kunji:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|nove pananchi suchi]]-ui polloi)",
+ "rcfilters-tag-remove": "'$1' kadd",
"rcfilters-activefilters-hide": "Lipoi",
"rcfilters-activefilters-show": "Dakhoi",
+ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|bodol}}, $2",
+ "rcfilters-days-title": "Halinche dis",
+ "rcfilters-hours-title": "Halinche voram",
+ "rcfilters-days-show-days": "$1 {{PLURAL:$1|dis}}",
+ "rcfilters-days-show-hours": "$1 {{PLURAL:$1|vor|voram}}",
+ "rcfilters-savedqueries-rename": "Nanv bodol",
+ "rcfilters-savedqueries-remove": "Kadun udoi",
+ "rcfilters-savedqueries-new-name-label": "Nanv",
+ "rcfilters-savedqueries-cancel-label": "Rod'd kor",
+ "rcfilters-show-new-changes": "Soglleavon noveo bodol polloi",
+ "rcfilters-filter-editsbyself-label": "Tuven kel'leo bodol",
+ "rcfilters-filter-editsbyself-description": "Tujeo svotacheo yogdanam.",
+ "rcfilters-filter-editsbyother-label": "Dusreanim kel'le bodol",
+ "rcfilters-filter-bots-label": "Robot",
+ "rcfilters-filter-minor-label": "Dhakte bodol",
+ "rcfilters-filter-pageedits-label": "Panacheo sompadonam",
+ "rcfilters-filter-categorization-label": "Vorgache bodol",
+ "rcfilters-filtergroup-lastRevision": "Akherchim uzollnnim",
+ "rcfilters-tag-prefix-namespace-inverted": "$1 <strong>:nhoi</strong>",
"rcnotefrom": "Sokoil <strong>$3, $4<strong> savn {{PLURAL:$5|zalelem bodol dilam|zalelem bodol dileant}} (<strong>$1<strong> meren {{PLURAL:$5|dakhoilam|dakhoileant}}).",
"rclistfrom": "$3 $2 savn suru zatelim nove bodol dakhoi",
"rcshowhideminor": "$1 dhakte bodol",
"reblock-logentry": "addavpachem bosovp bodol’lam [[$1]] hache khatir sompacho vell dilam $2 $3",
"block-log-flags-nocreate": "Khatem rochop opatr kelam",
"proxyblocker": "Protinidhi-sirvidor addavpi",
+ "move-page": "$1 haloi",
+ "move-page-legend": "Pan haloi",
"move-watch": "Hea panar dixtt dovor",
"movepagebtn": "Pan haloi",
+ "movepage-moved": "<strong>\"$1\" haka \"$2\" hanga haloila</strong>",
+ "movepage-moved-redirect": "Punornirdexon rochun ailam.",
+ "movepage-moved-noredirect": "Punornirdexon rochop addaila.",
+ "movepage-page-moved": "$1 panak $2 hanga haloila.",
+ "movepage-page-unmoved": "$1 haka $2 hanga halounk zaunk na.",
"movelogpage": "Pan halovneancho sotr",
"movereason": "Karonn:",
"revertmove": "porti",
"logentry-rights-autopromote": "$1 קודם אוטומטית מ{{GRAMMAR:תחילית|$4}} ל{{GRAMMAR:תחילית|$5}}",
"logentry-upload-upload": "$1 {{GENDER:$2|העלה|העלתה}} את $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|העלה|העלתה}} גרסה חדשה של $3",
- "logentry-upload-revert": "$1 {{GENDER:$2|×\94×¢×\9c×\94|×\94×¢×\9cת×\94}} ×\90ת $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|ש×\97×\96ר|ש×\97×\96ר×\94}} ×\90ת $3 ×\9c×\92רס×\94 ×\99×©× ×\94",
"log-name-managetags": "יומן ניהול תגיות",
"log-description-managetags": "דף זה כולל רשימה של פעולות ניהול הקשורות ל[[Special:Tags|תגיות]]. היומן כולל רק פעולות שבוצעו ידנית על־ידי מפעיל מערכת; ייתכן שתגיות ייווצרו או יימחקו על־ידי תוכנת הוויקי ללא הוספת ערך ליומן זה.",
"logentry-managetags-create": "$1 {{GENDER:$2|יצר|יצרה}} את התגית \"$4\"",
"log-action-filter-suppress-reblock": "העלמות של משתמשים באמצעות חסימה מחדש",
"log-action-filter-upload-upload": "העלאות של קבצים חדשים",
"log-action-filter-upload-overwrite": "דריסות של קבצים קיימים",
+ "log-action-filter-upload-revert": "שחזורי קבצים לגרסה ישנה",
"authmanager-authn-not-in-progress": "האימות נכשל או שנתוני הפעולה נאבדו. נא להתחיל את התהליך מחדש.",
"authmanager-authn-no-primary": "לא ניתן היה לאמת את נתוני ההזדהות שסופקו.",
"authmanager-authn-no-local-user": "נתוני ההזדהות שסופקו אינם שייכים לשום משתמש באתר זה.",
"authmanager-create-no-primary": "נתוני ההזדהות שסופקו לא יכולים להיות בשימוש ביצירת חשבון.",
"authmanager-link-no-primary": "נתוני ההזדהות שסופקו לא יכולים להיות בשימוש לשם קישור חשבונות.",
"authmanager-link-not-in-progress": "קישור החשבונות נכשל או שנתוני הפעולה נאבדו. נא להתחיל את התהליך מחדש.",
- "authmanager-authplugin-setpass-failed-title": "שינוי הסיסמה נכשל",
- "authmanager-authplugin-setpass-failed-message": "תוסף האימות דחה את שינוי הסיסמה.",
- "authmanager-authplugin-create-fail": "תוסף האימות דחה את יצירת החשבון.",
- "authmanager-authplugin-setpass-denied": "תוסף האימות אינו מאפשר לשנות סיסמאות.",
- "authmanager-authplugin-setpass-bad-domain": "דומיין לא תקין.",
"authmanager-autocreate-noperm": "אין אפשרות ליצור חשבונות באופן אוטומטי.",
"authmanager-autocreate-exception": "יצירת חשבונות אוטומטית מבוטלת באופן אוטומטי בשל שגיאות קודמות.",
"authmanager-userdoesnotexist": "חשבון המשתמש \"$1\" אינו רשום.",
"passwordpolicies-policy-maximalpasswordlength": "הסיסמה חייבת להיות קצרה יותר {{PLURAL:$1|מתו אחד|מ־$1 תווים}}",
"passwordpolicies-policy-passwordcannotbepopular": "הסיסמה לא יכולה להיות זהה {{PLURAL:$1|לסיסמה נפוצה|לאחת הסיסמאות שנמצאות ברשימה של $1 הסיסמאות הנפוצות}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "הסיסמה לא יכולה להיות ברשימת 100,000 הסיסמאות הנפוצות ביותר.",
+ "passwordpolicies-policyflag-forcechange": "נדרש שינוי הסיסמה בכניסה",
"easydeflate-invaliddeflate": "התוכן שהועבר אינו דחוס כנדרש",
"unprotected-js": "מסיבות אבטחה, לא ניתן לטעון JavaScript מדפים שאינם מוגנים. ניתן ליצור סקריפטי JavaScript רק במרחב השם \"מדיה ויקי:\" או בדפי משנה של דף המשתמש."
}
"authmanager-create-no-primary": "खाता निर्माण के लिए आपूर्ति की गई क्रेडेंशियल्स का उपयोग नहीं किया जा सका।",
"authmanager-link-no-primary": "खाता लिंकिंग के लिए आपूर्ति की गई क्रेडेंशियल का उपयोग नहीं किया जा सका।",
"authmanager-link-not-in-progress": "खाता लिंक प्रगति में नहीं है या सत्र डेटा खो गया है। कृपया शुरुआत से फिर से शुरू करें",
- "authmanager-authplugin-setpass-failed-title": "पासवर्ड बदलाव विफल हुआ।",
- "authmanager-authplugin-setpass-failed-message": "प्रमाणन प्लगइन ने पासवर्ड बदलाव से इनकार किया।",
- "authmanager-authplugin-create-fail": "प्रमाणीकरण प्लग इन ने खाता निर्माण को अस्वीकार कर दिया।",
- "authmanager-authplugin-setpass-denied": "प्रमाणन प्लगइन पासवर्ड बदलने की अनुमति नहीं देता है",
- "authmanager-authplugin-setpass-bad-domain": "अमान्य जालस्थल।",
"authmanager-autocreate-noperm": "स्वचालित खाता निर्माण की अनुमति नहीं है।",
"authmanager-autocreate-exception": "स्वचालित खाता निर्माण को पहले के कुछ त्रुटियों के कारण कुछ समय के लिए निष्क्रिय किया गया है।",
"authmanager-userdoesnotexist": "सदस्य खाता \"$1\" पंजीकृत नहीं है।",
"authmanager-create-no-primary": "Supplied credentials ke account banae me nai kaam me laae sakaa.",
"authmanager-link-no-primary": "Supplied credentials ke account linking me nai kaam me laae sakaa.",
"authmanager-link-not-in-progress": "Account linking progress me nai hai, nai to, session data has been lost. Meharbaani kar ke suruu se suruu karo.",
- "authmanager-authplugin-setpass-failed-title": "Pasword ke nai badle sakaa",
- "authmanager-authplugin-setpass-failed-message": "The authentication plugin denied the password change.",
- "authmanager-authplugin-create-fail": "The authentication plugin denied the account creation.",
- "authmanager-authplugin-setpass-denied": "The authentication plugin does not allow changing passwords.",
- "authmanager-authplugin-setpass-bad-domain": "Domain invalid hai.",
"authmanager-autocreate-noperm": "Automatic account creation, allowed nai hai.",
"authmanager-autocreate-exception": "Automatic account creation ke temporarily disable kar dewa gais hai, due to prior errors.",
"authmanager-userdoesnotexist": "User account \"$1\" abhi registered nai hai",
"delete-warning-toobig": "Ova stranica ima veliku povijest uređivanja, preko $1 {{PLURAL:$1|promjene|promjena}}. Brisanje može poremetiti bazu podataka {{SITENAME}}; postupajte s oprezom.",
"deleteprotected": "Ne možete obrisati ovu stranicu jer je zaštićena.",
"deleting-backlinks-warning": "<strong>Upozorenje:</strong> \nbrišete stranicu koja je uključena u [[Special:WhatLinksHere/{{FULLPAGENAME}}|druge]] ili druge stranice povezuju na nju.",
+ "deleting-subpages-warning": "<strong>Upozorenje:</strong> Stranica koju ste nakanili izbrisati ima [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|$1 podstranicu|$1 podstranice|$1 podstranica|51=preko 50 podstranica}}]].",
"rollback": "Ukloni posljednju promjenu",
"rollbacklink": "ukloni",
"rollbacklinkcount": "ukloni $1 {{PLURAL:$1|uređivanje|uređivanja}}",
"logentry-rights-autopromote": "Suradničkom računu $1 {{GENDER:$2|automatski je promijenjeno članstvo|automatski su promijenjena članstva}} iz $4 u $5",
"logentry-upload-upload": "$1 је {{GENDER:$2|postavio|postavila}} $3",
"logentry-upload-overwrite": "$1 је {{GENDER:$2|postavio|postavila}} novu inačicu $3",
- "logentry-upload-revert": "$1 је {{GENDER:$2|postavio|postavila}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|postavio|postavila}} je $3 na stariju inačicu",
"log-name-managetags": "Evidencija upravljanja oznakama",
"log-name-tag": "Evidencija oznaka",
"rightsnone": "(osnovno)",
"authmanager-create-no-primary": "A megadott hitelesítő adatok nem használhatók fióklétrehozásra.",
"authmanager-link-no-primary": "A megadott hitelesítő adatok nem használhatók fiókok összekapcsolására.",
"authmanager-link-not-in-progress": "Fiókok összekapcsolása nincs folyamatban, vagy a folyamat adatai elvesztek. Kérjük, indítsd újra az elejétől.",
- "authmanager-authplugin-setpass-failed-title": "Jelszó megváltoztatása nem sikerült",
- "authmanager-authplugin-setpass-failed-message": "A hitelesítés beépülője megtagadta a jelszó módosítását.",
- "authmanager-authplugin-create-fail": "A hitelesítés beépülője megtagadta a fiók létrehozását.",
- "authmanager-authplugin-setpass-denied": "A hitelesítés beépülője nem teszi lehetővé a jelszó megváltoztatását.",
- "authmanager-authplugin-setpass-bad-domain": "Érvénytelen domain.",
"authmanager-autocreate-noperm": "Az automatikus fióklétrehozás nem engedélyezett.",
"authmanager-autocreate-exception": "A fiókok automatikus létrehozását átmenetileg letiltottuk a korábbi hibák miatt.",
"authmanager-userdoesnotexist": "A(z) „$1” felhasználó nincs regisztrálva.",
"prefs-email": "Էլ-հասցեի ընտրանքներ",
"prefs-rendering": "Արտաքին տեսք",
"saveprefs": "Հիշել",
- "restoreprefs": "Զրոյացնել, բերելով իլռելայն նախընտրանքներին (բոլոր բաժիններում)",
+ "restoreprefs": "Վերականգնել սկզբնական կարգավորումները (բոլոր ներդիրներում)",
"prefs-editing": "Խմբագրում",
"searchresultshead": "Որոնում",
"stub-threshold": "<a href=\"#\" class=\"stub\">Պատառ հոդվածների հղումների</a> ձևավորման որոշման սահմանը.",
"logentry-rights-autopromote": "$1 ha essite automaticamente {{GENDER:$2|promovite}} de $4 a $5",
"logentry-upload-upload": "$1 {{GENDER:$2|ha incargate}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|ha incargate}} un nove version de $3",
- "logentry-upload-revert": "$1 {{GENDER:$2|ha incargate}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|ha revertite}} $3 a un version ancian",
"log-name-managetags": "Registro de gestion de etiquettas",
"log-description-managetags": "Iste pagina lista le cargas de gestion relative a [[Special:Tags|etiquettas]]. Le registro contine solmente le actiones exequite manualmente per un administrator; etiquettas pote esser create o delite per le software wiki sin insertion de un entrata in iste registro.",
"logentry-managetags-create": "$1 {{GENDER:$2|creava}} le etiquetta \"$4\"",
"log-action-filter-suppress-reblock": "Suppression de usator per re-blocada",
"log-action-filter-upload-upload": "Nove file incargate",
"log-action-filter-upload-overwrite": "File re-incargate",
+ "log-action-filter-upload-revert": "Reverter",
"authmanager-authn-not-in-progress": "Le authentication non es in curso o le datos del session ha essite perdite. Per favor, recomencia ab initio.",
"authmanager-authn-no-primary": "Le credentiales fornite non poteva esse authenticate.",
"authmanager-authn-no-local-user": "Le credentiales fornite non es associate a alcun usator in iste wiki.",
"authmanager-create-no-primary": "Le credentiales fornite non pote esser usate pro crear un conto.",
"authmanager-link-no-primary": "Le credentiales fornite non pote esser usate pro ligar un conto.",
"authmanager-link-not-in-progress": "Nulle ligation de conto es in curso, o le datos del session ha essite perdite. Per favor, recomencia ab initio.",
- "authmanager-authplugin-setpass-failed-title": "Cambio de contrasigno fallite",
- "authmanager-authplugin-setpass-failed-message": "Le modulo de authentication ha refusate le cambio de contrasigno.",
- "authmanager-authplugin-create-fail": "Le modulo de authentication ha refusate le creation de conto.",
- "authmanager-authplugin-setpass-denied": "Le modulo de authentication non permitte cambiar contrasignos.",
- "authmanager-authplugin-setpass-bad-domain": "Dominio non valide.",
"authmanager-autocreate-noperm": "Le creation automatic de contos non es permittite.",
"authmanager-autocreate-exception": "Le creation automatic de contos ha essite temporarimente disactivate a causa de errores previe.",
"authmanager-userdoesnotexist": "Le conto de usator \"$1\" non es registrate.",
"passwordpolicies-policy-maximalpasswordlength": "Le contrasigno debe continer minus de $1 {{PLURAL:$1|character|characteres}}",
"passwordpolicies-policy-passwordcannotbepopular": "Le contrasigno non pote esser {{PLURAL:$1|le contrasigno le plus popular|in le lista de $1 contrasignos popular}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "Le contrasigno non pote apparer in le lista del 100.000 contrasignos le plus commun.",
+ "passwordpolicies-policyflag-forcechange": "debe cambiar al apertura de session",
"easydeflate-invaliddeflate": "Le contento fornite non es correctemente comprimite",
"unprotected-js": "Pro motivos de securitate, non es possibile cargar codice JavaScript de paginas non protegite. Crea JavaScript solmente in le spatio de nomines \"MediaWiki:\" o como un subpagina de usator."
}
"sitejspreview": "'''Ingatlah bahwa Anda hanya menampilkan pratayang dari kode JavaScript ini.'''\n'''Perubahan belum disimpan!'''",
"userinvalidconfigtitle": "<strong>Peringatan:</strong> Kulit \"$1\" tidak ditemukan. Harap diingat bahwa halaman .css, .json, dan .js menggunakan huruf kecil, contoh {{ns:user}}:Foo/vector.css dan bukannya {{ns:user}}:Foo/Vector.css.",
"updated": "(Diperbarui)",
- "note": "'''Catatan:'''",
+ "note": "<strong>Catatan:</strong>",
"previewnote": "'''Ingatlah bahwa ini hanya pratayang.'''\nPerubahan Anda belum disimpan!",
"continue-editing": "Lanjutkan penyuntingan",
"previewconflict": "Pratayang ini mencerminkan teks pada bagian atas kotak suntingan teks sebagaimana akan terlihat bila Anda menyimpannya.",
"previousrevision": "← Revisi sebelumnya",
"nextrevision": "Revisi selanjutnya →",
"currentrevisionlink": "Revisi terkini",
- "cur": "skr",
+ "cur": "skrg.",
"next": "selanjutnya",
- "last": "sebelum",
+ "last": "sblm.",
"page_first": "pertama",
"page_last": "terakhir",
"histlegend": "Pilih dua tombol radio lalu tekan tombol ''bandingkan'' untuk membandingkan versi. Klik suatu tanggal untuk melihat versi halaman pada tanggal tersebut.<br />(skr) = perbedaan dengan versi sekarang, (akhir) = perbedaan dengan versi sebelumnya, '''k''' = suntingan kecil, '''b''' = suntingan bot, → = suntingan bagian, ← = ringkasan otomatis",
"notextmatches": "Tidak ada teks halaman yang cocok",
"prevn": "{{PLURAL:$1|$1}} sebelumnya",
"nextn": "{{PLURAL:$1|$1}} selanjutnya",
- "prev-page": "Halaman sebelumnya",
+ "prev-page": "halaman sebelumnya",
"next-page": "Halaman selanjutnya",
"prevn-title": "$1 {{PLURAL:$1|hasil|hasil}} sebelumnya",
"nextn-title": "$1 {{PLURAL:$1|hasil|hasil}} selanjutnya",
"rcfilters-noresults-conflict": "Hasil tidak ditemukan karena kriteria pencariannya bertentangan",
"rcfilters-state-message-subset": "Filter ini tidak akan berpengaruh karena hasilnya disertakan oleh {{PLURAL:$2|filter}} berikut yang lebih luas (coba soroti untuk membedakannya): $1",
"rcfilters-state-message-fullcoverage": "Memilih semua penyaringan dalam kelompok ini sama dengan tidak memilih apapun, sehingga penyaringan ini tidak memberikan hasil. Kelompok termasuk: $1",
- "rcfilters-filtergroup-authorship": "Kontribusi pengarang",
+ "rcfilters-filtergroup-authorship": "Kontribusi penulis",
"rcfilters-filter-editsbyself-label": "Suntingan Anda",
"rcfilters-filter-editsbyself-description": "Kontribusi saya",
"rcfilters-filter-editsbyother-label": "Suntingan orang lain",
"uncategorizedcategories": "Kategori yang tak terkategori",
"uncategorizedimages": "Berkas yang tak terkategori",
"uncategorizedtemplates": "Templat yang tak terkategori",
+ "uncategorized-categories-exceptionlist": "# Terkandung daftar kategori, yang tidak boleh disebut di Special:UncategorizedCategories. Satu per baris, dimulai dengan \"*\". Baris-baris dimulai dengan karakter lain (termasuk baris putih) tidak dianggap. Gunakan \"#\" untuk memberikan komentar.",
"unusedcategories": "Kategori yang tak terpakai (kosong)",
"unusedimages": "Berkas yang tak terpakai",
"wantedcategories": "Kategori yang diinginkan",
"apisandbox-dynamic-parameters-add-label": "Tambah parameter:",
"apisandbox-dynamic-parameters-add-placeholder": "Nama parameter",
"apisandbox-dynamic-error-exists": "Parameter bernama \"$1\" telah tersedia.",
+ "apisandbox-templated-parameter-reason": "Ini adalah [[Special:ApiHelp/main#main/templatedparams|parameter templat]] yang ditawarkan berdasarkan {{PLURAL:$1|value|values}} dari $2.",
"apisandbox-deprecated-parameters": "Parameter usang",
"apisandbox-fetch-token": "Isi token dengan otomatis",
"apisandbox-add-multi": "Tambahkan",
"apisandbox-sending-request": "Mengirim permintaan API...",
"apisandbox-loading-results": "Menerima hasil API...",
"apisandbox-results-error": "Sebuah galat terjadi ketika memuat permintaan respon API: $1.",
+ "apisandbox-results-login-suppressed": "Permintaan ini akan diproses sebagai pengguna log-out dan akan digunakan untuk memotong keamanan browser yang memiliki asal yang sama. Tolong diperhatikan pengurusan token bak pasir otomatis tidak bekerja dengan baik dengan permintaan tersebut, tolong isi secara manual.",
"apisandbox-request-selectformat-label": "Tampilkan permintaan data sebagai:",
"apisandbox-request-format-url-label": "String kueri URL",
"apisandbox-request-url-label": "URL Permintaan:",
"magiclink-tracking-isbn-desc": "Halaman ini menggunakan pranala magis ISBN. Lihat [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] bagaimana melakukan migrasi.",
"specialloguserlabel": "Pengguna:",
"speciallogtitlelabel": "Target (judul atau {{ns:user}}:nama pengguna untuk pengguna)",
- "log": "Catatan (Log)",
+ "log": "Log",
"logeventslist-submit": "Tampilkan",
"logeventslist-more-filters": "Tampilkan log tambahan:",
"logeventslist-patrol-log": "Log patroli",
"anoncontribs": "Kontribusi",
"contribsub2": "Untuk {{GENDER:$3|$1}} ($2)",
"contributions-userdoesnotexist": "Pengguna \"$1\" tidak terdaftar.",
+ "negative-namespace-not-supported": "Ruangnama dengan nilai negatif tidak didukung.",
"nocontribs": "Tidak ada perubahan yang sesuai dengan kriteria tersebut.",
"uctop": "saat ini",
"month": "Sejak bulan (dan sebelumnya):",
"ipb-sitewide": "Keseluruhan situs",
"ipb-partial": "Parsial",
"ipb-pages-label": "Halaman",
+ "ipb-namespaces-label": "Ruang nama",
"badipaddress": "Format alamat IP atau nama pengguna salah.",
"blockipsuccesssub": "Pemblokiran sukses",
"blockipsuccesstext": "[[Special:Contributions/$1|$1]] telah diblokir.<br />\nLihat [[Special:BlockList|daftar pemblokiran]] untuk meninjau kembali pemblokiran.",
"blocklist-nousertalk": "tidak dapat menyunting halaman pembicaraan sendiri",
"blocklist-editing": "penyuntingan",
"blocklist-editing-sitewide": "editing (keseluruhan situs)",
+ "blocklist-editing-page": "laman",
+ "blocklist-editing-ns": "Ruang nama",
"ipblocklist-empty": "Daftar pemblokiran kosong.",
"ipblocklist-no-results": "Alamat IP atau pengguna yang diminta tidak diblokir.",
"blocklink": "blokir",
"logentry-block-block": "$1 {{GENDER:$2|memblokir}} {{GENDER:$4|$3}} dengan waktu kedaluwarsa $5 $6",
"logentry-block-unblock": "$1 telah {{GENDER:$2|mencabut pemblokiran}} atas {{GENDER:$4|$3}}",
"logentry-block-reblock": "$1 {{GENDER:$2|mengubah}} pemblokiran {{GENDER:$4|$3}} dengan waktu kedaluwarsa $5 $6",
+ "logentry-partialblock-block-page": "{{PLURAL:$1|halaman|halaman}} $2",
+ "logentry-partialblock-block-ns": "{{PLURAL:$1|ruangnama|ruangnama}} $2",
"logentry-partialblock-block": "$1 {{GENDER:$2|memblokir}} {{GENDER:$4|$3}} dari penyuntingan $7 dengan waktu kedaluwarsa $5 $6",
+ "logentry-partialblock-reblock": "$1 {{GENDER:$2|mengubah}} pengaturan blokir pada {{GENDER:$4|$3}} untuk mencegah penyuntingan pada $7 dengan masa pemblokiran $5 $6",
"logentry-suppress-block": "$1 {{GENDER:$2|memblokir}} {{GENDER:$4|$3}} dengan waktu kedaluwarsa $5 $6",
"logentry-suppress-reblock": "$1 {{GENDER:$2|mengubah}} pemblokiran {{GENDER:$4|$3}} dengan waktu kedaluwarsa $5 $6",
"logentry-import-upload": "$1 {{GENDER:$2|mengimpor}} $3 melalui pemuatan berkas",
"logentry-rights-autopromote": "$1 secara otomatis {{GENDER:$2|dipromosikan}} dari $4 menjadi $5",
"logentry-upload-upload": "$1 {{GENDER:$2|mengunggah}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|mengunggah}} versi baru dari $3",
- "logentry-upload-revert": "$1 {{GENDER:$2|mengunggah}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|mengembalikan}} $3 ke versi lama",
"log-name-managetags": "Log pengelolaan tag",
"log-description-managetags": "Daftar halaman ini mencantumkan tugas-tugas yang terkait dengan [[Special:Tags|tag]]. Lognya hanya mengandung tindakan-tindakan yang dijalankan secara manual oleh pengurus; tag-tag bisa dibuat atau dihapus oleh perangkat lunak wiki tanpa tercatat entrinya dalam log ini.",
"logentry-managetags-create": "$1 {{GENDER:$2|membuat}} tag \"$4\"",
"log-action-filter-suppress-reblock": "Penyembunyian oleh pengguna menurut pemblokiran",
"log-action-filter-upload-upload": "Unggahan baru",
"log-action-filter-upload-overwrite": "Unggah kembali",
+ "log-action-filter-upload-revert": "Batalkan",
"authmanager-authn-not-in-progress": "Otentikasi tidak dilanjutkan atau data sesi telah hilang. Ulang kembali dari awal.",
"authmanager-authn-no-primary": "Kredensial yang diberikan tidak dapat diotentikasi.",
"authmanager-authn-no-local-user": "Kredensial yang diberikan tidak terkait dengan satu orang pun pengguna di wiki ini.",
"authmanager-create-no-primary": "Kredensial yang diberikan tidak dapat digunakan untuk pembuatan akun.",
"authmanager-link-no-primary": "Kredensial yang diberikan tidak dapat digunakan untuk menautkan akun.",
"authmanager-link-not-in-progress": "Penautan akun tidak dilanjutkan atau data sesi telah hilang. Ulang kembali dari awal.",
- "authmanager-authplugin-setpass-failed-title": "Penggantian kata sandi gagal",
- "authmanager-authplugin-setpass-failed-message": "Plugin autentikasi mencegah pengubahan pasword.",
- "authmanager-authplugin-create-fail": "Plugin autentikasi mencegah pembuatan akun.",
- "authmanager-authplugin-setpass-denied": "Plugin autentikasi tidak memperbolehkan mengubah kata kunci.",
- "authmanager-authplugin-setpass-bad-domain": "Domain tidak sah.",
"authmanager-autocreate-noperm": "Pembuatan akun otomatis tidak diizinkan.",
"authmanager-autocreate-exception": "Pembuatan akun otomatis dimatikan sementara karena galat sebelumnya.",
"authmanager-userdoesnotexist": "Pengguna \"$1\" tidak terdaftar.",
"passwordpolicies-policy-maximalpasswordlength": "Kata sandi tidak boleh kurang dari {{PLURAL:$1|karakter|karakter}}.",
"passwordpolicies-policy-passwordcannotbepopular": "Kata sandi tidak boleh {{PLURAL:$1|kata sandi populer|dalam senarai $1 kata sandi populer}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "Kata sandi tidak boleh termasuk dalam daftar 100.000 kata sandi yang paling umum digunakan.",
+ "passwordpolicies-policyflag-forcechange": "wajib diganti ketika masuk log",
"unprotected-js": "Karena alasan keamanan Javascript tidak dapat dimuat dari halaman yang tidak dilindungi. Mohon hanya buat javascript di ruangnama MediaWiki: atau sebagai subhalaman Pengguna"
}
"authmanager-create-no-primary": "Dagiti naited a kredensial ket saan a mabalin a mausar para iti panagpartuat ti pakabilangan.",
"authmanager-link-no-primary": "Dagiti naited a kredensial ket saan a mabalin a mausar para iti panangisilpo ti pakabilangan.",
"authmanager-link-not-in-progress": "Saan nga agprogprogreso ti panangisilpo ti pakabilangan wenno napukaw ti datos ti sesion. Pangngaasi a mangrugi manen iti pagrugian.",
- "authmanager-authplugin-setpass-failed-title": "Napaay ti panagbaliw ti kontrasenias",
- "authmanager-authplugin-setpass-failed-message": "Ti plugin ti pammasingked ket di nangipalubos ti panagbaliw ti kontrasenias.",
- "authmanager-authplugin-create-fail": "Ti plugin ti pammasingked ket di nangipalubos ti panagpartuat ti pakabilangan.",
- "authmanager-authplugin-setpass-denied": "Ti plugin ti pammasingked ket saan a mangipalubos iti panagbaliw kadagiti kontrasenias.",
- "authmanager-authplugin-setpass-bad-domain": "Imbalido a dominio.",
"authmanager-autocreate-noperm": "Saan a maipalubos ti automatiko a panagpartuat ti pakabilangan.",
"authmanager-autocreate-exception": "Temporario a nabaldado ti automatiko a panagpartuat iti pakabilangan gapu kadagiti dati a biddut.",
"authmanager-userdoesnotexist": "Ti pakabilangan ti agar-aramat ni \"$1\" ket saan a nakarehistro.",
"defaultmessagetext": "Ordinara mesajo-texto",
"invalid-content-data": "Nevalida kontenajo",
"content-model-wikitext": "texto Wiki",
+ "content-model-text": "simpla texto",
"content-model-javascript": "JavaScript",
"content-json-empty-object": "vakua objekto",
"content-json-empty-array": "vakua tabelo",
"undo-failure": "Ne povis nuligar la redakto pro konflikti kun intermeza redakti.",
"undo-summary-username-hidden": "Desfacar revizo $1 facita da celita uzero",
"cantcreateaccount-text": "La kreo di konto de ica adreso IP (<strong>$1</strong>) blokusesis da [[User:$3|$3]].\n\nLa motivo, segun $3, esas <em>$2</em>",
+ "cantcreateaccount-range-text": "La kreo di konti de IP-adresi de <strong>$1</strong>, qua inkluzas vua IP-adreso (<strong>$4</strong>), blokusesis dal uzero [[User:$3|$3]].\n\nLa motivo quon $3 informis por la blokuso esis <em>$2</em>",
"viewpagelogs": "Videz registrari por ca pagino",
"nohistory": "Ne esas redakto-historio por ica pagino.",
"currentrev": "Nuna versiono",
"rev-showdeleted": "montrar",
"revisiondelete": "Efacar/Restaurar revizi",
"revdelete-show-file-submit": "Yes",
+ "revdelete-text-text": "Versioni efacata duros aparar en la pagino-historio, tamen parto ek lia kontenaji ne restos publike videbla.",
"revdelete-hide-image": "Celar kontenajo dil arkivo",
"revdelete-hide-comment": "Rezumo di redakto",
"revdelete-hide-user": "uzeronomo di redaktanto/IP-adreso",
"revertpage": "Desfacita redakti da [[Special:Contributions/$2|$2]] ([[User talk:$2|Debato]]) e rekuperita la lasta redakto da [[User:$1|$1]]",
"rollback-success": "Desfacis redakti da $1;\nrestauris ad lasta versiono da $2.",
"sessionfailure": "Semblas ke eventis problemo kun vua sesiono di 'login';\nta agado abrogesis, quale presorgo kontre sequestro di sesiono ('hijacking').\nVoluntez risendar la formulario, plenigita.",
+ "changecontentmodel": "Chanjar la konteno-modelo di (u)la pagino",
+ "changecontentmodel-title-label": "Titulo di la pagino",
+ "log-name-contentmodel": "Registro di la modifikuri en la modelo pri kontenajo",
"logentry-contentmodel-change-revertlink": "restaurar",
"logentry-contentmodel-change-revert": "restaurar",
"protectlogpage": "Protekto-registraro",
"block-log-flags-noautoblock": "automatala blokuso nekapabligata",
"block-log-flags-noemail": "e-posto blokusita",
"block-log-flags-nousertalk": "ne povas redaktar lua propra diskuto-pagino",
+ "range_block_disabled": "Ne permisesas al administrero blokusar grupi di IP.",
"ipb_expiry_invalid": "Nevalida expiro-tempo.",
"ipb-needreblock": "$1 ja esas blokusata. Ka vu deziras modifikar la selekti?",
"ipb-otherblocks-header": "Altra {{PLURAL:$1|blokuso|blokusi}}",
"allmessagescurrent": "Nuna texti di mesajo",
"allmessagestext": "Yen listo pri omna sistemo-mesaji disponebla en la MediaWiki nomaro.\nVizitez [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Lokizado] e [https://translatewiki.net translatewiki.net] se vu volos kontributar ad generala MediaWiki lokizado.",
"allmessages-language": "Linguo:",
- "thumbnail-more": "Grandigar",
+ "thumbnail-more": "Plugrandigar",
"thumbnail_error": "Ne sucesas krear imajeto: $1",
"import": "Importacar pagini",
"import-comment": "Komento:",
"randomrootpage": "Handahófsvalin rótarsíða",
"log-action-filter-all": "Allt",
"log-action-filter-delete-delete": "Eyðing síðu",
- "authmanager-authplugin-setpass-bad-domain": "Ógilt lén.",
"authmanager-email-label": "Tölvupóstur",
"authmanager-email-help": "Tölvupóstfang",
"authmanager-realname-label": "Raunverulegt nafn",
"logentry-rights-autopromote": "$1 è {{GENDER:$2|stato promosso|stata promossa|stato/a promosso/a}} automaticamente da $4 a $5",
"logentry-upload-upload": "$1 {{GENDER:$2|ha caricato}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|ha caricato}} una nuova versione di $3.",
- "logentry-upload-revert": "$1 {{GENDER:$2|ha caricato}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|ha ripristinato}} $3 ad una vecchia versione",
"log-name-managetags": "Gestione etichette",
"log-description-managetags": "Questa pagina elenca le azioni di gestione relative alle [[Special:Tags|etichette]]. Il registro contiene solo le azioni effettuate manualmente da un amministratore; le etichette potrebbero essere create o cancellate dal programma wiki senza che ciò venga registrato qui.",
"logentry-managetags-create": "$1 {{GENERE:$2|ha creato}} il tag \"$4\"",
"log-action-filter-suppress-reblock": "Soppressione utente da ri-blocco",
"log-action-filter-upload-upload": "Nuovo caricamento",
"log-action-filter-upload-overwrite": "Ricaricamento",
+ "log-action-filter-upload-revert": "Ripristina",
"authmanager-authn-not-in-progress": "L'autenticazione non è in corso o i dati della sessione sono andati persi. Si prega di ricominciare dall'inizio.",
"authmanager-authn-no-primary": "Le credenziali fornite non possono essere autenticate.",
"authmanager-authn-no-local-user": "Le credenziali fornite non sono associate a nessun utente di questo wiki.",
"authmanager-create-no-primary": "Le credenziali fornite non possono essere utilizzate per la creazione dell'utenza.",
"authmanager-link-no-primary": "Le credenziali fornite non possono essere utilizzate per il collegamento dell'utenza.",
"authmanager-link-not-in-progress": "Il collegamento dell'utenza non è in corso o i dati della sessione sono andati persi. Si prega di ricominciare dall'inizio.",
- "authmanager-authplugin-setpass-failed-title": "Modifica della password fallita",
- "authmanager-authplugin-setpass-failed-message": "Il plugin di autenticazione ha impedito la modifica della password.",
- "authmanager-authplugin-create-fail": "Il plugin di autenticazione ha impedito la creazione dell'utenza.",
- "authmanager-authplugin-setpass-denied": "Il plugin di autenticazione non consente di cambiare le password.",
- "authmanager-authplugin-setpass-bad-domain": "Dominio non valido.",
"authmanager-autocreate-noperm": "La creazione automatica dell'utenza non è permessa.",
"authmanager-autocreate-exception": "La creazione automatica di utenze è temporaneamente disabilitata a causa di errori precedenti.",
"authmanager-userdoesnotexist": "L'utenza \"$1\" non è registrata.",
"Oxbqskeptzwizkgdcxakhnrb",
"Suyama",
"고솜",
- "Wat"
+ "Wat",
+ "Puntti ja"
]
},
"tog-underline": "リンクの下線:",
"right-override-export-depth": "リンク先ページを5階層まで含めて書き出す",
"right-sendemail": "他の利用者にメールを送信",
"right-managechangetags": "[[Special:Tags|タグ]]の作成、有効化および無効化",
- "right-applychangetags": "自分の編集に[[Special:Tags|タグ]]を適用する",
+ "right-applychangetags": "自身の編集に[[Special:Tags|タグ]]を適用",
"right-changetags": "個々の版と記録項目の任意の[[Special:Tags|タグ]]の追加と削除",
"right-deletechangetags": "データベースから[[Special:Tags|タグ]]を削除",
"grant-generic": "「$1」の権限バンドル",
"action-userrights-interwiki": "他のウィキの利用者の利用者権限変更",
"action-siteadmin": "データベースのロックまたはロック解除",
"action-sendemail": "メールの送信",
- "action-editmyoptions": "あなたの個人設定を編集",
+ "action-editmyoptions": "自分のの個人設定の編集",
"action-editmywatchlist": "自身のウォッチリストの編集",
"action-viewmywatchlist": "自身のウォッチリストの閲覧",
"action-viewmyprivateinfo": "自分の非公開情報の閲覧",
"action-editmyprivateinfo": "自分の非公開情報の編集",
- "action-editcontentmodel": "ã\83\9aã\83¼ã\82¸ã\81®ã\82³ã\83³ã\83\86ã\83³ã\83\84ã\83¢ã\83\87ã\83«ã\82\92編集",
+ "action-editcontentmodel": "ã\83\9aã\83¼ã\82¸ã\81®ã\82³ã\83³ã\83\86ã\83³ã\83\84ã\83¢ã\83\87ã\83«ã\81®編集",
"action-managechangetags": "タグの作成、有効化および無効化",
- "action-applychangetags": "è\87ªå\88\86ã\81®ç·¨é\9b\86ã\81«ã\82¿ã\82°ã\82\92é\81©ç\94¨ã\81\99ã\82\8b",
+ "action-applychangetags": "è\87ªå\88\86ã\81®ç·¨é\9b\86ã\81¸ã\81®ã\82¿ã\82°ã\81®é\81©ç\94¨",
"action-changetags": "個々の版および記録項目への任意のタグの追加と除去",
"action-deletechangetags": "データベースからタグの削除",
"action-purge": "このページのキャッシュ破棄",
"rcfilters-show-new-changes": "最新の変更を表示",
"rcfilters-search-placeholder": "絞り込みを行う(メニューから選択、またはフィルター名で検索)",
"rcfilters-invalid-filter": "無効なフィルター",
- "rcfilters-empty-filter": "絞り込みは行われていません。全ての項目が表示さます。",
+ "rcfilters-empty-filter": "çµ\9eã\82\8aè¾¼ã\81¿ã\81¯è¡\8cã\82\8fã\82\8cã\81¦ã\81\84ã\81¾ã\81\9bã\82\93ã\80\82å\85¨ã\81¦ã\81®é \85ç\9b®ã\81\8c表示ã\81\95ã\82\8cã\81¾ã\81\99ã\80\82",
"rcfilters-filterlist-title": "フィルター",
"rcfilters-filterlist-whatsthis": "これらはどのように機能しますか?",
"rcfilters-filterlist-feedbacklink": "絞り込み機能に関するフィードバック",
"upload-form-label-infoform-description-tooltip": "この作品に対して特筆すべきことをすべて説明します。\n写真であれば、主に何が写っているのか、いつ、どこで撮ったものなのかについて述べてください。",
"upload-form-label-usage-title": "使用法",
"upload-form-label-usage-filename": "ファイル名",
- "upload-form-label-own-work": "ã\81\93ã\82\8cã\81¯ã\81\82ã\81ªã\81\9fè\87ªèº«ã\81«ã\82\88ã\82\8bä½\9cæ¥です",
+ "upload-form-label-own-work": "ã\81\93ã\82\8cã\81¯ã\82\8fã\81\9fã\81\97è\87ªèº«ã\81«ã\82\88ã\82\8bä½\9cå\93\81です",
"upload-form-label-infoform-categories": "カテゴリ",
"upload-form-label-infoform-date": "日付",
"upload-form-label-own-work-message-generic-local": "私は {{SITENAME}} 上での以下の利用規約とライセンス方針で、このファイルをアップロードしていることを確認します。",
"move": "移動",
"movethispage": "このページを移動",
"unusedimagestext": "以下のファイルは、存在しますがどのページにも埋め込まれていません。\nただし、他のウェブサイトがURLでファイルに直接リンクする場合があることに注意してください。以下のファイル一覧には、そのような形で利用中のファイルが含まれている場合があります。",
+ "unusedimagestext-categorizedimgisused": "以下のファイルは存在していますがどのページにも含まれていません。カテゴライズされた画像ファイルは他のどのページにも含まれていないにもかかわらず、使用されているものと扱われています。\nまた、他のウェブサイトがファイルのURLを直接リンクすることで使用しているため、実際には使用されている画像がリストアップされていると言う可能性もあることを考慮してください。",
"unusedcategoriestext": "以下のカテゴリはページが存在しますが、他のどのページおよびカテゴリでも使用されていません。",
"notargettitle": "対象が存在しません",
"notargettext": "この機能の実行対象となるページまたは利用者が指定されていません。",
"anoncontribs": "投稿記録",
"contribsub2": "利用者: {{GENDER:$3|$1}} ($2)",
"contributions-userdoesnotexist": "利用者アカウント「$1」は登録されていません。",
+ "negative-namespace-not-supported": "負の値で指定される名前空間はサポートされていません。",
"nocontribs": "これらの条件に一致する変更は見つかりませんでした。",
"uctop": "最新",
"month": "この月以前:",
"blocklist-nousertalk": "自分のトークページも編集禁止",
"blocklist-editing": "編集",
"blocklist-editing-sitewide": "編集(サイト全体)",
+ "blocklist-editing-page": "ページ",
"blocklist-editing-ns": "名前空間",
"ipblocklist-empty": "ブロック一覧は空です。",
"ipblocklist-no-results": "指定されたIPアドレスまたは利用者名はブロックされていません。",
"ipb_expiry_old": "有効期限が過去の時刻です。",
"ipb_expiry_temp": "利用者名秘匿のブロックは、無期限ブロックになります。",
"ipb_hide_invalid": "このアカウントを秘匿できません。編集回数が{{PLURAL:$1|$1回}}を超えています。",
+ "ipb_hide_partial": "ユーザー名を秘匿してのブロックは完全なブロックである必要があります。",
"ipb_already_blocked": "「$1」は既にブロックされています。",
"ipb-needreblock": "$1 は既にブロックされています。設定を変更しますか?",
"ipb-otherblocks-header": "その他の{{PLURAL:$1|ブロック}}",
"movepage-moved": "<strong>「$1」は「$2」へ移動されました</strong>",
"movepage-moved-redirect": "転送ページを作成しました。",
"movepage-moved-noredirect": "転送ページは作成されませんでした。",
+ "movepage-delete-first": "送り先のページには多くの版があり、移動操作の行程の1つとしての削除はできません。まず、ページを手動で削除してから操作を行ってください。",
"articleexists": "指定された移動先には既にページが存在するか、名前が不適切です。\n別の名前を選択してください。",
"cantmove-titleprotected": "新しいページ名が作成保護されているため、この場所にページを移動できません",
"movetalk": "付随するトークページも移動",
"specialpages-group-developer": "開発者用ツール",
"blankpage": "白紙ページ",
"intentionallyblankpage": "このページは意図的に白紙にされています。",
+ "disabledspecialpage-disabled": "このページはシステム管理者により無効化されています。",
"external_image_whitelist": " #この行はこのままにしておいてください<pre>\n#この下に正規表現 (//の間に入る記述) を置いてください\n#外部の (ホットリンクされている) 画像の URL と一致するか検査されます\n#一致する場合は画像として、一致しない場合は画像へのリンクとして表示されます\n#行の頭に # を付けるとコメントとして扱われます\n#大文字と小文字は区別されません\n\n#正規表現はすべてこの行の上に置いてください。この行はこのままにしておいてください</pre>",
"tags": "有効な変更タグ",
"tag-filter": "[[Special:Tags|タグ]]絞り込み:",
"authmanager-create-no-primary": "指定された証明情報は、アカウントの作成に使用できませんでした。",
"authmanager-link-no-primary": "指定された証明情報は、アカウントの関連付けに使用できませんでした。",
"authmanager-link-not-in-progress": "アカウントの関連付けが処理されていないか、セッションデータが失われています。最初からやり直してください。",
- "authmanager-authplugin-setpass-failed-title": "パスワードの変更に失敗しました",
- "authmanager-authplugin-setpass-failed-message": "パスワードの変更は、認証プラグインによって拒否されました。",
- "authmanager-authplugin-create-fail": "アカウントの作成は、認証プラグインによって拒否されました。",
- "authmanager-authplugin-setpass-denied": "パスワードの変更は、認証プラグインによって許可されていません。",
- "authmanager-authplugin-setpass-bad-domain": "無効なドメインです。",
"authmanager-autocreate-noperm": "アカウントの自動作成は許可されていません。",
"authmanager-autocreate-exception": "自動アカウント作成は、以前のエラーにより一時的に無効になっています。",
"authmanager-userdoesnotexist": "利用者アカウント「$1」は登録されていません。",
"authmanager-authn-autocreate-failed": "Gawéan otomatis akun lokal wurung: $1",
"authmanager-create-disabled": "Gawéan akun dipatèni.",
"authmanager-create-from-login": "Saperlu nggawé akun, panjenengan mangga ngisi babagan-babagan ing ngisor iki.",
- "authmanager-authplugin-setpass-bad-domain": "Dhomain ora trep.",
"authmanager-autocreate-noperm": "Gawéan akun otomatis ora diidinaké.",
"authmanager-autocreate-exception": "Gawéan akun otomatis sawetara dipatèni amarga masalah sadurungé.",
"authmanager-userdoesnotexist": "Akun panganggo \"$1\" ora kadhaftar.",
"authmanager-create-no-primary": "მოწოდებული მონაცემები არ გამოდგა ანგარიშის შესაქმნელად.",
"authmanager-link-no-primary": "მოწოდებული მონაცემები არ გამოდგა ანგარიშის დასაკავშირებლად.",
"authmanager-link-not-in-progress": "ანგარიშის დაკავშირება არ მიმდინარეობს ან სესიის მონაცემი დაიკარგა. გთხოვთ დაიწყეთ თავიდან.",
- "authmanager-authplugin-setpass-failed-title": "პაროლის ცვლილება ვერ განხორციელდა",
- "authmanager-authplugin-setpass-failed-message": "აუთენთიფიკაციის პლაგინმა უარყო პაროლის ცვლილება.",
- "authmanager-authplugin-create-fail": "აუთენთიფიკაციის პლაგინმა უარყო ანგარიშის შექმნა.",
- "authmanager-authplugin-setpass-denied": "აუთენთიფიკაციის პლაგინი არ იძლევა პაროლების გამოცვლის უფლებას.",
- "authmanager-authplugin-setpass-bad-domain": "არასწორი დომეინი.",
"authmanager-autocreate-noperm": "ავტომატური ანგარიშის შექმნა არ არის ნებადართული.",
"authmanager-autocreate-exception": "ავტომატური ანგარიშის შექმნა დროებით გათიშულია ადრინდელი ხარვეზების გამო.",
"authmanager-userdoesnotexist": "მომხმარებლის ანგარიში „$1“ არ არის რეგისტრირებული",
"logentry-rights-autopromote": "$1님이 권한을 자동으로 $4에서 $5(으)로 {{GENDER:$2|바꾸었습니다}}",
"logentry-upload-upload": "$1님이 $3 파일을 {{GENDER:$2|올렸습니다}}",
"logentry-upload-overwrite": "$1님이 $3의 새 판을 {{GENDER:$2|올렸습니다}}",
- "logentry-upload-revert": "$1님이 $3 파일을 {{GENDER:$2|올렸습니다}}",
+ "logentry-upload-revert": "$1님이 $3 파일을 오래된 판으로 {{GENDER:$2|되돌렸습니다}}",
"log-name-managetags": "태그 관리 기록",
"log-description-managetags": "이 문서는 [[Special:Tags|태그]]에 관한 관리 작업의 목록입니다. 이 기록에는 관리자가 직접 실행한 동작만이 기록되며, 위키 소프트웨어에 의해 태그가 생성 및 삭제되는 경우는 기록되지 않습니다.",
"logentry-managetags-create": "$1님이 \"$4\" 태그를 {{GENDER:$2|만들었습니다}}",
"log-action-filter-suppress-reblock": "재차단을 통한 사용자 숨기기",
"log-action-filter-upload-upload": "새로 업로드",
"log-action-filter-upload-overwrite": "다시 업로드",
+ "log-action-filter-upload-revert": "되돌리기",
"authmanager-authn-not-in-progress": "인증이 진행 중이 아니거나 세션 데이터를 분실했습니다. 처음부터 다시 시작해 주십시오.",
"authmanager-authn-no-primary": "제공된 자격 증명으로 인증할 수 없습니다.",
"authmanager-authn-no-local-user": "자격 증명으로 이 위키의 어느 사용자로도 로그인할 수 없습니다.",
"authmanager-create-no-primary": "제공된 자격 증명은 계정 생성에 쓰일 수 없습니다.",
"authmanager-link-no-primary": "제공된 자격 증명은 계정을 연결하는 데 쓰일 수 없습니다.",
"authmanager-link-not-in-progress": "계정 연결이 진행 중이 아니거나 세션 데이터를 분실했습니다. 처음부터 다시 시작해 주십시오.",
- "authmanager-authplugin-setpass-failed-title": "비밀번호 변경 실패",
- "authmanager-authplugin-setpass-failed-message": "인증 플러그인이 비밀번호 변경을 거부했습니다.",
- "authmanager-authplugin-create-fail": "인증 플러그인이 계정 만들기를 거부했습니다.",
- "authmanager-authplugin-setpass-denied": "인증 플러그인이 비밀번호 변경을 허용하지 않습니다.",
- "authmanager-authplugin-setpass-bad-domain": "잘못된 도메인.",
"authmanager-autocreate-noperm": "자동 계정 만들기는 허용되지 않습니다.",
"authmanager-autocreate-exception": "이전의 오류들로 인해 자동 계정 만들기를 일시적으로 사용할 수 없습니다.",
"authmanager-userdoesnotexist": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.",
"authmanager-authn-autocreate-failed": "Automattesch ene Zojang för heh et Wikki hät nit jeflup: $1",
"authmanager-create-disabled": "Neu Aanmelde es afjeschalldt",
"authmanager-create-from-login": "Öm Der ene Zohjang aanzelähje, bes esu johd, un föll heh di Fällder us:",
- "authmanager-authplugin-setpass-failed-title": "Dat Paßwoot ze änndere hät nit jeflupp",
- "authmanager-authplugin-setpass-bad-domain": "Onjöltijje Domäijn",
"authmanager-autocreate-noperm": "Automattesch Zohjäng aanzelähje es nit zohjelohße.",
"authmanager-autocreate-exception": "Automattesch Zohjäng aanzelähje es wähje verjange Fähler för en Zigg nit zohjelohße.",
"authmanager-userdoesnotexist": "Ene Metmaacher mem Nahme „$1“ es nit ennjedrahre.",
"tog-norollbackdiff": "Ciyawaziyê piştî şûndekirinê nîşan nede",
"underline-always": "Hertim",
"underline-never": "Qet",
- "underline-default": "Tercîhên lêgerokê",
+ "underline-default": "Tercîhên lêgerok an jî xuyangê",
+ "editfont-style": "Şêwaza curetîpê ya qada sererastkirinê:",
+ "editfont-monospace": "Curetîpa yek-navberî",
"editfont-sansserif": "Fonta Sans-serif'ê",
"editfont-serif": "Fonta Serif'ê",
"sunday": "yekşem",
"returnto": "Vegere $1.",
"tagline": "Ji {{SITENAME}}",
"help": "Alîkarî",
+ "help-mediawiki": "Alîkariya di derbarê MedyaWîkiyê de",
"search": "Lêgerîn",
"searchbutton": "Lêgerîn",
"go": "Here",
"log-action-filter-all": "Hemû",
"log-action-filter-block-block": "Asteng bike",
"log-action-filter-upload-upload": "Barkirina nû",
+ "log-action-filter-upload-revert": "Şûnde vegerîne",
"authmanager-email-label": "E-name",
"authmanager-email-help": "Navnîşana e-nameyê"
}
"log-action-filter-upload-overwrite": "Nees eroplueden",
"authmanager-create-disabled": "D'Opmaache vu Benotzerkonten ass gespaart.",
"authmanager-create-from-login": "Fir Äre Benotzerkont unzeleeën fëllt w.e.g. d'Felder aus.",
- "authmanager-authplugin-setpass-failed-title": "Änner vum Passwuert huet net funktionéiert",
- "authmanager-authplugin-setpass-bad-domain": "Net valabelen Domain.",
"authmanager-autocreate-noperm": "Automatescht Uleeë vu Benotzerkonten ass net erlaabt.",
"authmanager-autocreate-exception": "Automatescht Uleeë vu Benotzerkonte gouf op Grond vu fréiere Feeler temporär ausgeschalt.",
"authmanager-userdoesnotexist": "De Benotzerkont \"$1\" ass net registréiert.",
"authmanager-create-no-primary": "La identia furnida no pote es usada per crea un conta.",
"authmanager-link-no-primary": "La identia furnida no pote es usada per junta de conta.",
"authmanager-link-not-in-progress": "Junta de conta no aveni, o datos de sesion es perdeda. Per favore, comensa denova.",
- "authmanager-authplugin-setpass-failed-title": "Cambia de clave ia fali",
- "authmanager-authplugin-setpass-failed-message": "La estendente de autentici ia rejeta la cambia de clave.",
- "authmanager-authplugin-create-fail": "La estendente de autentici ia rejeta la crea de conta.",
- "authmanager-authplugin-setpass-denied": "La estendente de autentici no permete cambia claves.",
- "authmanager-authplugin-setpass-bad-domain": "Domina nonvalida.",
"authmanager-autocreate-noperm": "La crea automata de contas no es permeteda.",
"authmanager-autocreate-exception": "La crea automata de contas es tempora descomutada par causa de eras presedente.",
"authmanager-userdoesnotexist": "Conta de usor \"$1\" no es rejistrada.",
"authmanager-create-no-primary": "De ingeveurde aanmeljgegaeves kóste neet waere gebroek veur 't aanmake van de konto.",
"authmanager-link-no-primary": "De ingeveurde aanmeljgegaeves kóste neet waere gebroek veur de konto te koppele.",
"authmanager-link-not-in-progress": "Konto-koppeling is neet in behanjeling of de sessiegegaeves zint verlaore gegange. Begin gans oppernuuj van begins aaf aan.",
- "authmanager-authplugin-setpass-failed-title": "Verangere wachwaord mislök",
- "authmanager-authplugin-setpass-failed-message": "De verificatie-inveugtoepassing haet 't verangere van 't wachwaord taengegehaje.",
- "authmanager-authplugin-create-fail": "De verificatie-inveugtoepassing haet 't aanmake van diene konto taengegehaje.",
- "authmanager-authplugin-setpass-denied": "De verificatie-inveugtoepassing steit 't verangere van 't wachwaord neet toe.",
- "authmanager-authplugin-setpass-bad-domain": "Óngeljig demien.",
"authmanager-autocreate-noperm": "De verificatie-inveugtoepassing steit 't aanmake van konto's neet toe.",
"authmanager-autocreate-exception": "'t Automatisch aanmake van konto's is tiedelik oetgezat door ierder foute.",
"authmanager-userdoesnotexist": "Gebroeker \"$1\" is neet geregistreerd.",
"authmanager-create-no-primary": "E credençiæ fornie no poeuan ese doeuviæ pe-a creaçion de l'utença.",
"authmanager-link-no-primary": "E credençiæ fornie no pœuan ese dœuviæ pe conligâ l'utença.",
"authmanager-link-not-in-progress": "O conligamento de l'utença o no procede ò i dæti da sescion so-anæti perdui. Se prega de recomençâ da cavo.",
- "authmanager-authplugin-setpass-failed-title": "Modiffica da password fallia",
- "authmanager-authplugin-setpass-failed-message": "O plugin d'aotenticaçion o l'ha impedio a modiffica da password.",
- "authmanager-authplugin-create-fail": "O plugin d'aotenticaçion o l'ha impedio a creaçion de l'utença.",
- "authmanager-authplugin-setpass-denied": "O plugin d'aotenticaçion o no consente de cangiâ e password.",
- "authmanager-authplugin-setpass-bad-domain": "Dominnio non vallido.",
"authmanager-autocreate-noperm": "A creaçion aotomattica del'utença a no l'è permissa.",
"authmanager-autocreate-exception": "A creaçion aotomattica di utençe a l'è temporaniamente disabilitâ a caosa di erroî precedenti.",
"authmanager-userdoesnotexist": "L'utença \"$1\" a no l'è registrâ.",
"authmanager-create-from-login": "Norėdami sukurti savo paskyrą užpildykite laukelius žemiau.",
"authmanager-create-not-in-progress": "Paskyros kūrimas nevyksta arba buvo prarasti sesijos duomenys. Prašome pradėti iš naujo.",
"authmanager-link-not-in-progress": "Paskyrų susiejimas nevyksta arba buvo prarasti sesijos duomenys. Prašome pradėti iš naujo.",
- "authmanager-authplugin-setpass-failed-title": "Slaptažodžio keitimas nepavyko",
- "authmanager-authplugin-setpass-bad-domain": "Negalimas domenas.",
"authmanager-autocreate-noperm": "Automatinis paskyros kūrimas neleidžiamas.",
"authmanager-autocreate-exception": "Automatinis paskyros kūrimas laikinai neleidžiamas dėl ankstesnių klaidų.",
"authmanager-userdoesnotexist": "Vartotojo paskyrą „$1“ nėra registruota.",
"changeemail-none": "(nav)",
"changeemail-password": "Jūsu {{SITENAME}} parole:",
"changeemail-submit": "Mainīt e-pastu",
+ "changeemail-throttled": "Tu esi veicis pārāk daudz pieslēgšanās mēģinājumus.\nLūdzu, uzgaidi $1, pirms mēģini vēlreiz.",
"changeemail-nochange": "Lūdzu, ievadi atšķirīgu jauno e-pasta adresi.",
"resettokens-tokens": "Marķieri:",
"resettokens-token-label": "$1 (šībrīža vērtība: $2)",
"localtime": "Vietējais laiks:",
"timezoneuseserverdefault": "Lietot viki noklusēto ($1)",
"timezoneuseoffset": "Cita (norādi starpību zemāk)",
+ "timezone-useoffset-placeholder": "Vērtības piemēri: \"-07:00\" vai \"01:00\"",
"servertime": "Servera laiks šobrīd:",
"guesstimezone": "Izmantot datora sistēmas laiku",
"timezoneregion-africa": "Āfrika",
"logentry-protect-protect": "$1 {{GENDER:$2|aizsargāja}} $3 $4",
"logentry-upload-upload": "$1 {{GENDER:$2|augšupielādēja}} $3",
"logentry-upload-overwrite": "$1 augšupielādēja jaunu $3 versiju",
- "logentry-upload-revert": "$1 {{GENDER:$2|augšupielādēja}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|atjaunoja}} $3 uz vecāku versiju",
"logentry-managetags-create": "$1 {{GENDER:$2|izveidoja}} iezīmi \"$4\"",
"log-name-tag": "Iezīmju žurnāls",
"rightsnone": "(nav)",
"log-action-filter-upload-upload": "Jauna augšupielāde",
"log-action-filter-upload-overwrite": "Atkārtota augšupielāde",
"authmanager-create-disabled": "Kontu veidošana ir atspējota.",
- "authmanager-authplugin-setpass-bad-domain": "Nederīgs domēns.",
"authmanager-email-label": "E-pasts",
"authmanager-email-help": "E-pasta adrese",
"authmanager-realname-label": "Tavs īstais vārds",
"log-action-filter-upload-upload": "नया अपलोड",
"log-action-filter-upload-overwrite": "फैनसे अपलोड",
"authmanager-create-disabled": "लेखा निर्माण अशक्त कएल",
- "authmanager-authplugin-setpass-bad-domain": "अमान्य जालस्थल।",
"authmanager-userdoesnotexist": "प्रयोक्ता खाता \"$1\" पंजीकृत नै अछि।",
"authmanager-email-label": "इमेल",
"authmanager-email-help": "ई-पत्र ठेगान:",
"log-action-filter-protect-protect": "Fiarovana",
"log-action-filter-protect-unprotect": "Fanalana fiarovana",
"authmanager-authn-not-in-progress": "Tsy andalam-panaovana ny fampamantarana, na very ny angon'ny sesiôna. Avereno hatramin'ny voalohany azafady.",
- "authmanager-authplugin-setpass-failed-title": "Tsy nahomby ny fanovana tenimiafina",
- "authmanager-authplugin-setpass-failed-message": "Nandà ny fanovana tenimiafina ny plugin fampamantarana.",
- "authmanager-authplugin-create-fail": "Nandà ny famoronan-kaonty ny plugin fampamantarana.",
- "authmanager-authplugin-setpass-denied": "Tsy ahafahana manova tenimiafina ny plugin fampamantarana.",
"authmanager-userlogin-remembermypassword-help": "Milaza raha tsy maintsy tadidiana mihoatra ny halafan'ny fotoam-pitsidihana ny tenimiafina.",
"authmanager-username-help": "Anaram-pikambana ho an'ny fampamantarana.S",
"authmanager-password-help": "Tenimiafina ho an'ny fampamantarana.",
"아라",
"Sergey Ivanov",
"Irus",
- "Fitoschido"
+ "Fitoschido",
+ "Сергей Иванов"
]
},
- "tog-underline": "Ð\9aÑ\83зе кÑ\8bлвеÑ\80-влакÑ\8bм ӱлÑ\8bÑ\87Ñ\8bн Ñ\83дÑ\8bÑ\80алаÑ\88?",
- "tog-hideminor": "Ð\9fÑ\8bÑ\82аÑ\80Ñ\82Ñ\8bÑ\88 Ñ\82Ó§Ñ\80лаÑ\82Ñ\8bмаÑ\88-влак Ñ\80адам гÑ\8bÑ\87 изи Ñ\82Ó§Ñ\80лаÑ\82Ñ\8bмаÑ\88-влакÑ\8bм коÑ\80аҥдаш",
- "tog-hidepatrolled": "Тергыме тӧрлатымаш-влакым пытартыш тӧрлатымаш лӱмерыште шылташ",
+ "tog-underline": "Ð\9aÑ\8bлвеÑ\80лам ӱлÑ\8bÑ\87 Ñ\83дÑ\8bÑ\80алмаÑ\88:",
+ "tog-hideminor": "У Ñ\82Ó§Ñ\80лаÑ\82Ñ\8bмаÑ\88-влак Ñ\80адам гÑ\8bÑ\87 изи Ñ\82Ó§Ñ\80лаÑ\82Ñ\8bмаÑ\88-влакÑ\8bм Ñ\88Ñ\8bлÑ\82аш",
+ "tog-hidepatrolled": "Тергыме тӧрлатымаш-влакым у тӧрлатымаш лӱмерыште шылташ",
"tog-newpageshidepatrolled": "Тергыме лаштык-влакым у лаштык лӱмерыште шылташ",
"tog-hidecategorization": "Лаштык категоризацийым шылташ",
"tog-extendwatchlist": "Чыла вашталтышым, а пытартыш гына огылым ончыкташлан эскерыме лӱмерым кугемдаш",
"underline-always": "Кеч-кунам",
"underline-never": "Нигунам",
"underline-default": "Браузерысе келыштарымаш дене пайдаланаш",
- "sunday": "Рушарня",
- "monday": "Шочмо",
- "tuesday": "Ð\9aушкыжмо",
- "wednesday": "Ð\92ӱргече",
- "thursday": "Ð\98зарня",
- "friday": "Ð\9aугарня",
- "saturday": "Шуматкече",
+ "sunday": "рушарня",
+ "monday": "шочмо",
+ "tuesday": "кушкыжмо",
+ "wednesday": "вӱргече",
+ "thursday": "изарня",
+ "friday": "кугарня",
+ "saturday": "шуматкече",
"sun": "Рш",
"mon": "Шч",
"tue": "Кш",
"thu": "Из",
"fri": "Кг",
"sat": "Шм",
- "january": "Шорыкйол",
- "february": "Ð\9fургыж",
- "march": "Ó°ярня",
- "april": "Ð\92ӱдшор",
- "may_long": "Ð\90га",
- "june": "Ð\9fеледыш",
- "july": "Сӱрем",
- "august": "Сорла",
- "september": "Ð\98дым",
- "october": "Шыжа",
- "november": "Ð\9aылме",
- "december": "Теле",
- "january-gen": "Шорыкйол",
- "february-gen": "Ð\9fÑ\83Ñ\80гÑ\8bж",
- "march-gen": "Ó°Ñ\8fÑ\80нÑ\8f",
- "april-gen": "Ð\92ӱдÑ\88оÑ\80",
- "may-gen": "Ð\90га",
- "june-gen": "Ð\9fеледÑ\8bÑ\88",
- "july-gen": "Сӱрем",
- "august-gen": "Сорла",
- "september-gen": "Ð\98дÑ\8bм",
- "october-gen": "Шыжа",
- "november-gen": "Ð\9aÑ\8bлме",
- "december-gen": "Теле",
- "jan": "Шорыкйол",
- "feb": "Ð\9fÑ\83Ñ\80гÑ\8bж",
- "mar": "Ó°Ñ\8fÑ\80нÑ\8f",
- "apr": "Ð\92ӱдÑ\88оÑ\80",
- "may": "Ð\90га",
- "jun": "Ð\9fеледÑ\8bÑ\88",
- "jul": "Сӱрем",
- "aug": "Сорла",
- "sep": "Ð\98дÑ\8bм",
- "oct": "Шыжа",
- "nov": "Ð\9aÑ\8bлме",
- "dec": "Теле",
+ "january": "шорыкйол",
+ "february": "пургыж",
+ "march": "Ó±ярня",
+ "april": "вӱдшор",
+ "may_long": "ага",
+ "june": "пеледыш",
+ "july": "сӱрем",
+ "august": "сорла",
+ "september": "идым",
+ "october": "шыжа",
+ "november": "кылме",
+ "december": "теле",
+ "january-gen": "шорыкйол тылзын",
+ "february-gen": "пÑ\83Ñ\80гÑ\8bж Ñ\82Ñ\8bлзÑ\8bн",
+ "march-gen": "Ó±Ñ\8fÑ\80нÑ\8f Ñ\82Ñ\8bлзÑ\8bн",
+ "april-gen": "вӱдÑ\88оÑ\80 Ñ\82Ñ\8bлзÑ\8bн",
+ "may-gen": "ага Ñ\82Ñ\8bлзÑ\8bн",
+ "june-gen": "пеледÑ\8bÑ\88 Ñ\82Ñ\8bлзÑ\8bн",
+ "july-gen": "сӱрем тылзын",
+ "august-gen": "сорла тылзын",
+ "september-gen": "идÑ\8bм Ñ\82Ñ\8bлзÑ\8bн",
+ "october-gen": "шыжа тылзын",
+ "november-gen": "кÑ\8bлме Ñ\82Ñ\8bлзÑ\8bн",
+ "december-gen": "теле тылзын",
+ "jan": "шрк",
+ "feb": "пÑ\80г",
+ "mar": "Ó±Ñ\80н",
+ "apr": "вдÑ\88",
+ "may": "ага",
+ "jun": "плд",
+ "jul": "срм",
+ "aug": "срл",
+ "sep": "идм",
+ "oct": "шыж",
+ "nov": "клм",
+ "dec": "тел",
"pagecategories": "{{PLURAL:$1|Категорий|Категорий-влак}}",
"category_header": "\"$1\" категорийыште лаштык-влак",
"subcategories": "Ӱлылкатегорий-влак",
"timezoneregion-asia": "Азий",
"timezoneregion-atlantic": "Атлантик таптеҥыз",
"timezoneregion-australia": "Австралий",
- "timezoneregion-europe": "Ð\95вÑ\80опо",
+ "timezoneregion-europe": "Ð\95вÑ\80опа",
"timezoneregion-indian": "Индий таптеҥыз",
"allowemail": "Вес ушнышо-влак деч электрон почтым налаш кӧнаш",
"prefs-searchoptions": "Кычалаш",
"newpages": "У лаштык-влак",
"newpages-username": "Пайдаланышын лӱмжӧ:",
"ancientpages": "Пытартыш тӧрталтымаш-влак почеш ойырымо статья-влак",
- "move": "Лӱмым вашталташ",
+ "move": "Лаштык лӱмым вашталташ",
"movethispage": "Тиде лаштыкын лӱмжым вашталташ",
"pager-newer-n": "{{PLURAL:$1|1=вес|вес}}",
"pager-older-n": "{{PLURAL:$1|1=ончычсо|ончычсо}}",
"watch": "Эскераш",
"watchthispage": "Тиде лаштыкым эскераш",
"unwatch": "Эскерыман огыл",
- "unwatchthispage": "ÐÑ\81кеÑ\80Ñ\8bмÑ\8bм Ñ\87аÑ\80наÑ\88",
+ "unwatchthispage": "Эскерымым чараш",
"watchlist-details": "Эскерымаш лӱмерыштет $1 {{PLURAL:$1|лаштык}}, каҥашымаш лаштык-влакым шотлыде",
"wlshowlast": "Пытартыш $1 шагат $2 кечылан ончыкташ",
"wlshowhidecategorization": "лаштык категоризацийым",
"protect-cantedit": "Тый тиде лаштыкын шыгыремдымашыжым тӧрлатен от керт, тидлан тылат кертеж пуалтын огыл.",
"protect-otherreason": "Вес/ешартыш амал:",
"protect-otherreason-op": "вес/ешартыш амал",
- "restriction-type": "Ð\9aеÑ\80Ñ\82еж:",
- "restriction-level": "ТÑ\8bгай Ñ\88Ñ\8bгÑ\8bÑ\80емдаÑ\88:",
+ "restriction-type": "Ð\9fÑ\80ава-влак:",
+ "restriction-level": "Ð\9fÑ\8bÑ\80аÑ\88 лийме кӱкÑ\88Ñ\8bÑ\82:",
"undeletelink": "ончалаш/тӧрлатен шындаш",
"undeleteviewlink": "ончыкташ",
"undelete-search-submit": "Кычал",
"laggedslavemode": "Предупредување: Страницата може да не ги содржи скорешните поднови.",
"readonly": "Базата е заклучена",
"enterlockreason": "Внесете причина за заклучувањето, вклучувајќи и приближно време на отклучување",
- "readonlytext": "Базата е моментално заклучена за нови статии и други измени, најверојатно како рутинска проверка, по што ќе се врати во нормална состојба. Администраторот кој ја заклучи го понуди следното образложение: <p>$1",
+ "readonlytext": "Базата е моментално заклучена за нови статии и други измени, најверојатно како рутинска проверка, по што ќе се врати во нормална состојба.\n\nАдминистраторот кој ја заклучи го понуди следното образложение: $1",
"missing-article": "Базата на податоци не го пронајде текстот на страницата кој требаше да го пронајде, именуван „$1“ $2.\n\nОва најчесто е предизвикано од застарена разл. или врска до историја на страница која била избришана.\n\nАко не е таков случај, можеби сте наишле грешка во програмската опрема.\nПријавете го ова на некој [[Special:ListUsers/sysop|администратор]], давајќи врска до URL адресата.",
"missingarticle-rev": "(измена#: $1)",
"missingarticle-diff": "(разлика: $1, $2)",
"readonly_lag": "Базата е автоматски заклучена додека помошните опслужувачи не се усогласат",
- "nonwrite-api-promise-error": "HTTP-заглавието „Promise-Non-Write-API-Action“ беше испратено, но барањето беше упатено кон записен модул на извршникот.",
+ "nonwrite-api-promise-error": "HTTP-заглавието „Promise-Non-Write-API-Action“ беше испратено, но барањето беше упатено кон записен модул на API.",
"internalerror": "Внатрешна грешка",
"internalerror_info": "Внатрешна грешка: $1",
"internalerror-fatal-exception": "Кобен исклучок на типот „$1“",
"createacct-benefit-body2": "{{PLURAL:$1|страница|страници}}",
"createacct-benefit-body3": "{{PLURAL:$1|скорешен учесник|скорешни учесници}}",
"badretype": "Внесените лозинки не се совпаѓаат.",
- "usernameinprogress": "Создавањето на сметката за овој корисни е веќе во тек.",
+ "usernameinprogress": "Создавањето на сметката за овој корисник е веќе во тек.\nПочекајте.",
"userexists": "Корисничкото име што го внесовте е зафатено.\nИзберете друго име.",
"loginerror": "Грешка при најавувањето",
"createacct-error": "Грешка во создавањето на сметката",
"createacct-loginerror": "Сметката е успешно создадена но не можев да ве најавам автоматски. Појдеете да се [[Special:UserLogin|најавите рачно]].",
"noname": "Внесовте погрешно корисничко име.",
"loginsuccesstitle": "Најавени сте",
- "loginsuccess": "Сега сте најавени на {{SITENAME}} како „$1“.",
+ "loginsuccess": "<strong>Сега сте најавени на {{SITENAME}} како „$1“.</strong>",
"nosuchuser": "Нема корисник со името „$1“.\nКорисничките имиња разликуваат мали и големи букви.\nПроверете да не сте направиле грешка во пишувањето, или [[Special:CreateAccount|создајте нова корисничка сметка]].",
"nosuchusershort": "Нема корисник со името „$1“.\nПроверете дали правилно сте напишале.",
"nouserspecified": "Мора да наведете корисничко име.",
"changepassword-success": "Вашата лозинка е сменета!",
"changepassword-throttled": "Имате премногу обиди за најава за кратко време.\nПочекајте $1 пред да се обидете повторно.",
"botpasswords": "Ботовски лозинки",
- "botpasswords-summary": "<em>Ботовските лозинки</em> даваат пристап до корисничка сметка преку приложникот без да се користат главните најавни податоци на сметката. Корисничките права може да се ограничени кога се најавувате на овој начин.\n\nДоколку не знаете за што ова би ви послужило, подобро не го правете ова. Никој никогаш не треба да ви побара да направите ваква лозинка и да му ја дадете.",
+ "botpasswords-summary": "<em>Ботовските лозинки</em> даваат пристап до корисничка сметка преку API без да се користат главните најавни податоци на сметката. Корисничките права може да се ограничени кога се најавувате на овој начин.\n\nДоколку не знаете за што ова би ви послужило, подобро не го правете ова. Никој никогаш не треба да ви побара да направите ваква лозинка и да му ја дадете.",
"botpasswords-disabled": "Ботовските лозинки се оневозможени.",
"botpasswords-no-central-id": "За да користите ботовски лозинки, мора да сте најавени со централизирана сметка.",
"botpasswords-existing": "Постоечки ботовски лозинки",
"subject-preview": "Преглед на насловот:",
"previewerrortext": "Се појави грешка при обидот да се прегледаат промените.",
"blockedtitle": "Корисникот е блокиран",
- "blocked-email-user": "<strong><strong>На вашето корисничко име му е забрането да праќа е-пошта. Можете сепак да уредувате други страници на ова вики.</strong> Сите поединости за забраната ќе ги најдете во [[Special:MyContributions|придонесите на сметката]].\n\nЗабраната ја дал $1.\n\nНаведената причина гласи <em>$2</em>.\n\n* Почеток на забраната: $8\n* Истек на забраната: $6\n* Предвиден забраненик: $7\n* Назнака на забраната #$5",
+ "blocked-email-user": "<strong>На вашето корисничко име му е забрането да праќа е-пошта. Можете сепак да уредувате други страници на ова вики.</strong> Сите поединости за забраната ќе ги најдете во [[Special:MyContributions|придонесите на сметката]].\n\nЗабраната ја дал $1.\n\nНаведената причина гласи <em>$2</em>.\n\n* Почеток на забраната: $8\n* Истек на забраната: $6\n* Предвиден забраненик: $7\n* Назнака на забраната #$5",
"blockedtext-partial": "<strong>На вашето корисничко име или IP-адреса му е забрането да прави измени на страницава. Можете сепак да уредувате други страници на ова вики.</strong> Сите поединости за забраната ќе ги најдете во [[Special:MyContributions|придонесите на сметката]].\n\nЗабраната ја дал $1.\n\nНаведената причина гласи <em>$2</em>.\n\n* Почеток на забраната: $8\n* Истек на забраната: $6\n* Предвиден забраненик: $7\n* Назнака на забраната #$5",
"blockedtext": "<strong>Вашето корисничко име или IP-адреса е блокирано.</strong>\n\nБлокирањето е направено од страна на $1.\nДаденото образложение е <em>$2</em>.\n\n* Почеток на блокирањето: $8\n* Истекување на блокирањето: $6\n* Корисникот што требало да биде блокиран: $7\n\nМоже да контактирате со $1 или некој друг [[{{MediaWiki:Grouppage-sysop}}|администратор]] за да разговарате во врска со блокирањето.\nМожете да ја искористите можноста „{{int:emailuser}}“ ако е назначена важечка е-поштенска адреса во [[Special:Preferences|вашите нагодувања]] и не ви е забрането да ја користите.\nВашата сегашна IP-адреса е $3, а назнака на блокирањето гласи #$5.\nВе молиме наведете ги сите подробности прикажани погоре, во вашата евентуална реакција.",
"autoblockedtext": "Вашата IP-адреса е автоматски блокирана бидејќи била користена од страна на друг корисник, кој бил блокиран од $1.\nДаденото образложение е следново:\n\n:<em>$2</em>\n\n* Почеток на блокирањето: $8\n* Истекување на блокирањето: $6\n* Со намера да се блокира: $7\n\nМоже да контактирате со $1 или некој друг [[{{MediaWiki:Grouppage-sysop}}|администратор]] за да разговарате во врска со ова блокирање.\n\nИмајте предвид дека можеби нема да можете да ја искористите можноста „{{int:emailuser}}“ доколку не е назначена важечка е-поштенска адреса во [[Special:Preferences|вашите нагодувања]] и ви е забрането користење на истата.\n\nВашата IP-адреса е $3, a назнака на блокирањетo е $5.\nВе молиме наведете ги овие подробности доколку реагирате на блокирањето.",
"usercssyoucanpreview": "'''Совет:''' Употребете го копчето „{{int:showpreview}}“ за да го испробате вашиот нов CSS пред да зачувате.",
"userjsonyoucanpreview": "'''Совет:''' Употребете го копчето „{{int:showpreview}}“ за да го испробате вашиот нов JSON пред да зачувате.",
"userjsyoucanpreview": "'''Совет:''' Употребете го копчето „{{int:showpreview}}“ за да ја испробате вашата нова JavaScript пред да зачувате.",
- "usercsspreview": "'''Запомнете дека ова е само преглед на вашиот кориснички CSS код, страницата сè уште не е зачувана!'''",
+ "usercsspreview": "<strong>Запомнете дека ова е само преглед на вашиот кориснички CSS код.\nСтраницата сè уште не е зачувана!</strong>",
"userjsonpreview": "<strong>Запомнете дека ова е само испробување/преглед на поставеноста на вашиот JSON. \nСтраницата сè уште не е зачувана!</strong>",
- "userjspreview": "'''Запомнете дека ова е само преглед на вашиот JavaScript код, страницата сè уште не е зачувана!'''",
+ "userjspreview": "<strong>Запомнете дека ова е само преглед на вашиот JavaScript код.\nСтраницата сè уште не е зачувана!</strong>",
"sitecsspreview": "'''Запомнете дека ова е само преглед на овој CSS-код.'''\n'''Сè уште не е зачуван!'''",
"sitejsonpreview": "<strong>Запомнете дека ова е само преглед на оваа поставеност на JSON. Сè уште не е зачуван!</strong>",
"sitejspreview": "'''Запомнете дека ова е само преглед на овој JavaScript-код.'''\n'''Сè уште не е зачуван!'''",
"permissionserrorstext-withaction": "Немате дозвола за $2, од {{PLURAL:$1|следнава причина|следниве причини}}:",
"contentmodelediterror": "Не можете да ја измените оваа преработка бидејќи нејзиниот содржински модел е <code>$1</code>, што се разликува од тековниот содржински модел на страницата <code>$2</code>.",
"recreate-moveddeleted-warn": "Внимание: Повторно создавате страница што претходно била бришена.'''\n\nРазмислете дали е правилно да продолжите со уредување на оваа страница.\nПодолу е прикажан дневникот на бришења и преместувања на оваа страница:",
- "moveddeleted-notice": "Оваа страница е избришана.\nДневникот на бришења и преместувања за оваа страница е прикажан подолу.",
+ "moveddeleted-notice": "Оваа страница е избришана.\nДневникот на бришења, заштитувања и преместувања за оваа страница е прикажан подолу.",
"moveddeleted-notice-recent": "За жал, страницава беше неодамна избришана (во последниве 24 часа).\nПодолу можете да го погледате дневникот на бришења, заштити и преместувања.",
"log-fulllog": "Преглед на целиот дневник",
"edit-hook-aborted": "Уредувањето е прекинато со пресретник.\nНе е дадено никакво образложение.",
"editpage-invalidcontentmodel-title": "Содржинскиот модел не е поддржан",
"editpage-invalidcontentmodel-text": "Содржинскиот модел „$1“ не е поддржан.",
"editpage-notsupportedcontentformat-title": "Форматот на содржината не е поддржан",
- "editpage-notsupportedcontentformat-text": "ФоÑ\80маÑ\82оÑ\82 $1 is не е поддржан од содржинскиот модел $2.",
+ "editpage-notsupportedcontentformat-text": "СодÑ\80жинÑ\81киоÑ\82 Ñ\84оÑ\80маÑ\82 $1 не е поддржан од содржинскиот модел $2.",
"slot-name-main": "Главна",
"content-model-wikitext": "викитекст",
"content-model-text": "прост текст",
"content-json-empty-object": "Празен објект",
"content-json-empty-array": "Празна низа",
"deprecated-self-close-category": "Страници со неважечки самозатворени HTML-ознаки",
- "deprecated-self-close-category-desc": "Страницава содржи неважечки самозатворени HTML-ознаки, како што се <code><b/></code> или <code><span/></code>. Нивното поведение наскоро ќе биде сменето, за да бидат во склад со определбите на HTML5. Ова значи дека се застарени и не треба да се употребуваат во викитекст.",
+ "deprecated-self-close-category-desc": "Страницата содржи неважечки самозатворени HTML-ознаки, како што се <code><b/></code> или <code><span/></code>. Нивното поведение наскоро ќе биде сменето, за да бидат во склад со определбите на HTML5. Ова значи дека се застарени и не треба да се употребуваат во викитекст.",
"duplicate-args-warning": "<strong>Предупредување:</strong> [[:$1]] го повикува [[:$2]] со повеќе од една вредност за параметарот „$3“. Ќе се употреби само последната вредност.",
"duplicate-args-category": "Страници што користат дуплирани аргументи во повикувања на шаблони",
"duplicate-args-category-desc": "Страницава содржи повикувања на шаблони кои се дупликати на аргументи, како што се <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> или <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"post-expand-template-argument-category": "Страници кои содржат изземени аргументи на шаблони",
"parser-template-loop-warning": "Пронајдена е јамка во шаблонот: [[$1]]",
"template-loop-category": "Страници со шаблонски јамки",
- "template-loop-category-desc": "Страницава содржи шаблонска јамка, т.е. шаблон кој повторливо се самоповикува",
+ "template-loop-category-desc": "Страницата содржи шаблонска јамка, т.е. шаблон кој повторливо се самоповикува.",
"template-loop-warning": "<strong>Предупредување:</strong> Страницава го повикува [[:$1]], што предизвикува јамка во шаблонот (бесконечно повторлив повик).",
"parser-template-recursion-depth-warning": "Пречекорена е границата на длабочината на рекурзијата во шаблонот ($1)",
"language-converter-depth-warning": "Пречекорена е границата на длабочината на јазичниот претворач ($1)",
"history-feed-description": "Историја на измените на оваа страница на викито",
"history-feed-item-nocomment": "$1 на $2",
"history-feed-empty": "Бараната страница не постои.\nМоже била избришана од викито или преименувана.\nОбидете се да [[Special:Search|пребарате низ викито]] за релевантни нови страници.",
- "history-edit-tags": "Ð\98змени ознаки на одÑ\80едени преработки",
+ "history-edit-tags": "Ð\98змени ознаки на избÑ\80аниÑ\82е преработки",
"rev-deleted-comment": "(избришан опис на промени)",
"rev-deleted-user": "(избришано корисничко име)",
"rev-deleted-event": "(избришани податоци од дневникот)",
"rev-suppressed-unhide-diff": "Една од преработките на оваа разлика е '''притаена'''.\nПовеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} дневникот на скривања].\nМожете да [$1 ја видите оваа разлика] ако сакате да продолжите.",
"rev-deleted-diff-view": "Една од преработките на оваа разлика е '''избришана'''.\nМожете да ја погледате оваа разлика; подробности ќе најдете во [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневникот на бришење].",
"rev-suppressed-diff-view": "Една од преработките на оваа разлика е '''притаена'''.\nМожете да ја погледате оваа разлика; подробности ќе најдете во [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} дневникот на скривања].",
- "rev-delundel": "пÑ\80икажи/Ñ\81кÑ\80иÑ\98",
+ "rev-delundel": "измени видливоÑ\81Ñ\82",
"rev-showdeleted": "прикажи",
"revisiondelete": "Избриши/врати преработки",
- "revdelete-nooldid-title": "Ð\91аÑ\80анаÑ\82а измена не поÑ\81Ñ\82ои",
- "revdelete-nooldid-text": "Немате укажано ниедна целна преработка врз која треба да се изврши оваа функикја, сте укажале преработка која не постои, или пак се обидувате да ја скриете тековната преработка.",
+ "revdelete-nooldid-title": "Ð\9dеважеÑ\87ка Ñ\86елна измена",
+ "revdelete-nooldid-text": "Немате укажано ниедна целна преработка врз која треба да се изврши оваа функција, сте укажале преработка која не постои, или пак се обидувате да ја скриете тековната преработка.",
"revdelete-no-file": "Наведената податотека не постои.",
"revdelete-show-file-confirm": "Дали сакате да ја погледнете избришаната преработка на податотеката „<nowiki>$1</nowiki>“ од $2 во $3?",
"revdelete-show-file-submit": "Да",
"revdel-restore": "Промена на видливост",
"pagehist": "Историја на страницата",
"deletedhist": "Историја на бришења",
- "revdelete-hide-current": "Грешка при сокривањето на ставката од $2, $1: Ова е тековната преработка.",
- "revdelete-show-no-access": "Грешка при прикажување на ставката датирана на $2, $1: оваа ставка е означена како „ограничена“. Немате пристап до неа.",
- "revdelete-modify-no-access": "Грешка при промена на ставката датирана на $2, $1: оваа ставка била означена како „ограничена“. Немате пристап до неа.",
+ "revdelete-hide-current": "Грешка при сокривањето на ставката од $2, $1: Ова е тековната преработка.\nТаа не може да се скрива.",
+ "revdelete-show-no-access": "Грешка при прикажување на ставката датирана на $2, $1: оваа ставка е означена како „ограничена“.\nНемате пристап до неа.",
+ "revdelete-modify-no-access": "Грешка при промена на ставката датирана на $2, $1: оваа ставка била означена како „ограничена“.\nНемате пристап до неа.",
"revdelete-modify-missing": "Грешка при промена на ставка со број $1: ја нема во базата на податоци!",
"revdelete-no-change": "'''Предупредување:''' ставката датирана на $2, $1 веќе ги има бараните нагодувања за видливост.",
"revdelete-concurrent-change": "Грешка при промена на ставката датирана на $2, $1: нејзиниот статус изгледа дека бил изменет од некој друг додека вие се обидувавте да го направите тоа. Ве молиме проверете во дневниците.",
"difference-multipage": "(Разлики помеѓу страници)",
"lineno": "Ред $1:",
"compareselectedversions": "Спореди ги избраните преработки",
- "showhideselectedversions": "Ð\9fÑ\80икажи/Ñ\81кÑ\80иÑ\98 ги избраните преработки",
+ "showhideselectedversions": "Ð\98змени видливоÑ\81Ñ\82 на избраните преработки",
"editundo": "откажи",
"diff-empty": "(нема разлика)",
"diff-multi-sameuser": "({{PLURAL:$1|Не е прикажана една меѓувремена преработка|Не се прикажани $1 меѓувремени преработки}} од истиот корисник)",
"recentchangescount": "Бројот на уредувања за приказ во скорешните промени, историите на страниците и во дневници. По основно:",
"prefs-help-recentchangescount": "Највеќе: 1000",
"prefs-help-watchlist-token2": "Ова е тајна шифра за тековникот на вашите набљудувања.\nСекој што ја знае ќе може да ја чита, па затоа ви препорачуваме да не ја кажувате никому.\nАко е потребно, [[Special:ResetTokens|можете да ставите нова]].",
- "prefs-help-tokenmanagement": "Можете да го погледате и одново зададете тајниот клуч з авашата сметка со кој се пристапува до семрежниот тековник на вашите набљудувани. Секој еден што го знае клучот може да ви ги ги чита набљудуваните — затоа не го кажувајте никому.",
+ "prefs-help-tokenmanagement": "Можете да го погледате и одново зададете тајниот клуч за вашата сметка со кој се пристапува до семрежниот тековник на вашите набљудувани. Секој еден што го знае клучот може да ви ги чита набљудуваните — затоа не го кажувајте никому.",
"savedprefs": "Вашите нагодувања се зачувани.",
"savedrights": "Корисничките групи на {{GENDER:$1|$1}} се зачувани.",
"timezonelegend": "Часовен појас:",
"saveusergroups": "Зачувај ги {{GENDER:$1|корисничките}} групи",
"userrights-groupsmember": "Член на:",
"userrights-groupsmember-auto": "Подразбран член на:",
- "userrights-groups-help": "Можете да измените на кои групи припаѓа корисник:\n* Штиклирано — корисникот е во таа група.\n* Нештиклирано — корисникот не припаѓа на групата.\n* Ѕвездичка (*) — не можете да ја отстраните групата откако сте ја додале (и обратно).\n* Тараба (#) — можете само да го вратите истекот на членството во групава, но не можете да го поместите нанапред.",
+ "userrights-groups-help": "Можете да измените на кои групи припаѓа корисник:\n* Штиклирано — корисникот е во таа група.\n* Нештиклирано — корисникот не припаѓа на групата.\n* Ѕвездичка (*) — не можете да ја отстраните групата откако сте ја додале (и обратно).\n* Тараба (#) — можете само да го вратите истекот на членството во групата, но не можете да го поместите нанапред.",
"userrights-reason": "Причина:",
"userrights-no-interwiki": "Немате дозвола за уредување на кориснички права на други викија.",
"userrights-nodatabase": "Базата на податоци $1 не постои или не е месна.",
"grant-basic": "Основни права",
"grant-viewdeleted": "Преглед на избришани податотеки и страници",
"grant-viewmywatchlist": "Преглед на вашите набљудувања",
- "grant-viewrestrictedlogs": "Преглед на ограничени дневнички ставки",
+ "grant-viewrestrictedlogs": "Преглед на ограничени дневнички записи",
"newuserlogpage": "Дневник на регистрирања на корисници",
"newuserlogpagetext": "Ова е дневник на регистрирани корисници.",
"rightslog": "Дневник на корисничките права",
"rightslogtext": "Ова е дневник на промени на кориснички права.",
"action-read": "читање на оваа страница",
"action-edit": "уредување на оваа страница",
- "action-createpage": "создавање страници",
+ "action-createpage": "создавање на оваа страница",
"action-createtalk": "создавање на оваа разговорна страница",
- "action-createaccount": "создај ја оваа корисничка сметка",
+ "action-createaccount": "создавање на оваа корисничка сметка",
"action-autocreateaccount": "автоматско создавање на оваа надворешна корисничка сметка",
"action-history": "преглед на историјата на оваа страница",
"action-minoredit": "означување на ова уредување како ситно",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (погл. и [[Special:NewPages|списокот на нови страници]])",
"recentchanges-legend-plusminus": "(''±123'')",
"recentchanges-submit": "Прикажи",
- "rcfilters-tag-remove": "Отстрани го „$1“",
+ "rcfilters-tag-remove": "Отстрани „$1“",
"rcfilters-legend-heading": "<strong>Список на кратенки:</strong>",
"rcfilters-other-review-tools": "Други алатки за проверка",
"rcfilters-group-results-by-page": "Групен исход по страница",
"undeletepagetext": "{{PLURAL:$1|Следната страница била избришана но сè уште е во архивот и може да биде вратена.|Следните $1 страници биле избришани но сè уште се во архивот и можат да бидат вратени.}}\nАрхивот може периодично да се чисти.",
"undelete-fieldset-title": "Врати преработки",
"undeleteextrahelp": "За да вратите целосна историја на една страница, отштиклирајте ги сите полиња и притиснете на „'''{{int:undeletebtn}}'''“.\nЗа да извршите делумно враќање, штиклирајте ги соодветните преработки за враќање и притиснете на „'''{{int:undeletebtn}}'''“.",
- "undeleterevisions": "${{PLURAL:$1|Избришана една преработка|Избришани $1 преработки}}",
+ "undeleterevisions": "{{PLURAL:$1|Избришана една преработка|Избришани $1 преработки}}",
"undeletehistory": "Ако ја обновите страницата, сите преработки ќе бидат вратени во историјата.\nАко нова страница со исто име е создадена по бришењето, обновените преработки ќе се појават во претходната историја.",
"undeleterevdel": "Избришаното нема да биде вратено ако тоа значи дека со тоа најгорната страница или преработката на податотеката делумно ќе се избрише.\nВо такви случаи, морате да ја отштиклирате или откриете (ако е скриена) најновата избришана преработка.",
"undeletehistorynoadmin": "Оваа статија е избришана. Причината за бришењето е наведена подолу,\nзаедно со информации за корисникот кој ја уредувал страницата пред бришењето. Целиот текст\nод избришаните верзии е достапен само за администраторите.",
"logentry-rights-autopromote": "$1 автоматски {{GENDER:$2|унапреден|унапредена}} од $4 во $5",
"logentry-upload-upload": "$1 {{GENDER:$2|ја подигна}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|подигна}} нова верзија на $3",
- "logentry-upload-revert": "$1 {{GENDER:$2|Ñ\98а подигна}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|Ñ\98а вÑ\80аÑ\82и}} $3 на поÑ\81Ñ\82аÑ\80а веÑ\80зиÑ\98а",
"log-name-managetags": "Дневник на раководство со ознаки",
"log-description-managetags": "На страницава се наведени раководните задачи што се однесуваат на [[Special:Tags|ознаки]]. Дневникот содржи само дејства извршени рачно од администратор; ознаките можат да се создаваат и бришат од википрограмот без да се заведуваат во дневников.",
"logentry-managetags-create": "$1 {{GENDER:$2|ја создаде}} ознаката „$4“",
"log-action-filter-suppress-reblock": "Притајување на корисникот преку преблокирање",
"log-action-filter-upload-upload": "Ново подигање",
"log-action-filter-upload-overwrite": "Преподигање",
+ "log-action-filter-upload-revert": "Отповикај",
"authmanager-authn-not-in-progress": "Заверката не е во тек, или има губиток на седничките податоци. Почнете одново.",
"authmanager-authn-no-primary": "Укажаните најавни податоци не можат да се заверат.",
"authmanager-authn-no-local-user": "Укажаните најавни податоци не се поврзани со ниеден корисник на ова вики.",
"authmanager-create-no-primary": "Укажаните најавни податоци не можат да се употребат во создавање на сметка.",
"authmanager-link-no-primary": "Укажаните најавни податоци не можат да се употребат во поврзување на сметка.",
"authmanager-link-not-in-progress": "Поврзувањето на сметката не е во тек, или има губиток на седничките податоци. Почнете одново.",
- "authmanager-authplugin-setpass-failed-title": "Промената на лозинката не успеа",
- "authmanager-authplugin-setpass-failed-message": "Приклучокот за заверка ја одби промената на лозинката.",
- "authmanager-authplugin-create-fail": "Приклучокот за заверка го одби создавањето на сметката.",
- "authmanager-authplugin-setpass-denied": "Приклучокот за заверка не допушта менување на лозинки.",
- "authmanager-authplugin-setpass-bad-domain": "Неважечки домен.",
"authmanager-autocreate-noperm": "Автоматското создавање на сметки не е дозволено.",
"authmanager-autocreate-exception": "Автоматското создавање на сметки е привремено оневозможено поради претходни грешки.",
"authmanager-userdoesnotexist": "Корисничката сметка „$1“ не е регистрирана.",
"passwordpolicies-policy-maximalpasswordlength": "Лозинката не треба да има повеќе од $1 {{PLURAL:$1|знак|знаци}}",
"passwordpolicies-policy-passwordcannotbepopular": "Лозинката не треба да биде {{PLURAL:$1|најзастапената|од списокот на $1 најзастапени лозинки}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "Лозинката не може да биде меѓу 100.000-те најчести лозинки.",
+ "passwordpolicies-policyflag-forcechange": "мора да се промени при најава",
"easydeflate-invaliddeflate": "Содржината не е соодветно прочистена",
"unprotected-js": "JavaScript не може да се вчита од незаштитени страници од безбедносни причини. Создавајте JavaScript само во именскиот простор МедијаВики: или како корисничка потстраница"
}
"Viswaprabha",
"Nesi",
"Macofe",
- "Jameela P."
+ "Jameela P.",
+ "Adithyak1997"
]
},
"tog-underline": "കണ്ണികൾക്ക് അടിവരയിടുക:",
"changepassword-throttled": "കുറഞ്ഞ സമയത്തിനുള്ളിൽ താങ്കൾ നിരവധി തവണ പ്രവേശിക്കാൻ ശ്രമിച്ചിരിക്കുന്നു.\nവീണ്ടും ശ്രമിക്കുന്നതിനു മുമ്പ് ദയവായി $1 കാത്തിരിക്കുക.",
"botpasswords": "യന്ത്രത്തിനുള്ള രഹസ്യവാക്കുകൾ",
"botpasswords-disabled": "യാന്ത്രിക രഹസ്യവാക്കുകൾ അനുവദനീയമല്ല.",
+ "botpasswords-existing": "നിലവിലുള്ള ബോട്ട് രഹസ്യവാക്കുകൾ",
+ "botpasswords-createnew": "പുതിയ ബോട്ട് രഹസ്യവാക്ക് സൃഷ്ടിക്കുക",
+ "botpasswords-editexisting": "നിലവിലുള്ള ബോട്ട് രഹസ്യവാക്ക് തിരുത്തുക",
"botpasswords-label-needsreset": "(രഹസ്യവാക്ക് പുനഃസജ്ജീകരിക്കേണ്ടതുണ്ട്)",
"botpasswords-label-appid": "യന്ത്രത്തിന്റെ പേര്:",
"botpasswords-label-create": "സൃഷ്ടിക്കുക",
"botpasswords-label-resetpassword": "രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക",
"botpasswords-label-grants": "ബാധകമായ അനുമതികൾ:",
"botpasswords-label-grants-column": "അനുവദിച്ചിരിക്കുന്നവ",
+ "botpasswords-bad-appid": "\"$1\" എന്ന ബോട്ട് നാമം സാധുവല്ല.",
+ "botpasswords-created-title": "ബോട്ടിന്റെ രഹസ്യവാക്ക് സൃഷ്ടിച്ചു",
+ "botpasswords-updated-title": "ബോട്ട് രഹസ്യവാക്ക് പുതുക്കി",
+ "botpasswords-deleted-title": "ബോട്ടിന്റെ രഹസ്യവാക്ക് ഒഴിവാക്കി",
"resetpass_forbidden": "രഹസ്യവാക്കുകൾ മാറ്റുന്നത് അനുവദിക്കുന്നില്ല",
"resetpass_forbidden-reason": "രഹസ്യവാക്കുകൾ മാറ്റാൻ കഴിയില്ല: $1",
"resetpass-no-info": "ഈ താൾ നേരിട്ടു കാണുന്നതിന് താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കണം.",
"passwordreset-emailelement": "ഉപയോക്തൃനാമം: \n$1\n\nതാത്കാലിക രഹസ്യവാക്ക്: \n$2",
"passwordreset-emailsentemail": "താങ്കളുടെ അംഗത്വത്തിന് നൽകിയിട്ടുള്ള ഇമെയിൽ വിലാസം ഇതാണെങ്കിൽ, രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയക്കുന്നതാണ്.",
"passwordreset-emailsentusername": "ഈ ഉപയോക്തൃനാമത്തിന് ഒരു ഇമെയിൽ വിലാസം ചേർത്തിട്ടുണ്ടെങ്കിൽ, രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയക്കുന്നതാണ്.",
+ "passwordreset-nocaller": "ഒരു കോളറിനെ ചേർക്കണം",
+ "passwordreset-nosuchcaller": "കോളർ $1 നിലവിലില്ല",
"passwordreset-invalidemail": "അസാധുവായ ഇമെയിൽ വിലാസം",
"passwordreset-nodata": "ഉപയോക്തൃനാമമോ ഇമെയിൽ വിലാസമോ നൽകിയിട്ടില്ല",
"changeemail": "ഇമെയിൽ വിലാസം മാറ്റുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക",
"content-model-text": "വെറും എഴുത്ത്",
"content-model-javascript": "ജാവാസ്ക്രിപ്റ്റ്",
"content-model-css": "സി.എസ്.എസ്.",
+ "content-json-empty-object": "ശൂന്യമായ വസ്തു",
+ "content-json-empty-array": "അറേ ശൂന്യമാണ്",
+ "deprecated-self-close-category": "Pages using invalid self-closed HTML tags",
"duplicate-args-warning": "<strong>മുന്നറിയിപ്പ്:</strong> [[:$1]], [[:$2]] എന്നതിനെ വിളിക്കുമ്പോൾ \"$3\" എന്ന ചരത്തിന് ഒന്നിലധികം വിലകൾ നൽകിയിട്ടുണ്ട്. നൽകിയ വിലകളിൽ അവസാനത്തേതുമാത്രം ഉപയോഗിക്കുന്നതാണ്.",
"duplicate-args-category": "ഫലകങ്ങൾ വിളിക്കുമ്പോൾ ചരങ്ങൾ ആവർത്തിച്ചുപയോഗിക്കുന്ന താളുകൾ",
"duplicate-args-category-desc": "താളിൽ ഫലകങ്ങൾ വിളിക്കുമ്പോൾ ചരങ്ങൾ അതായത് <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> അല്ലെങ്കിൽ <code><nowiki>{{foo|bar|1=baz}}</nowiki></code> എന്ന രീതിയിൽ.",
"rcfilters-filter-humans-description": "മനുഷ്യലേഖകർ ചെയ്ത തിരുത്തുകൾ",
"rcfilters-filtergroup-reviewstatus": "സംശോധന സ്ഥിതി",
"rcfilters-filter-reviewstatus-unpatrolled-label": "റോന്ത് ചുറ്റപ്പെടാത്തവ",
+ "rcfilters-filter-reviewstatus-auto-label": "സ്വതേ റോന്തുചുറ്റുന്നവർ",
"rcfilters-filtergroup-significance": "പ്രാധാന്യം",
"rcfilters-filter-minor-label": "ചെറുതിരുത്തുകൾ",
"rcfilters-filter-minor-description": "ലേഖകൻ ചെറുതെന്ന് അടയാളപ്പെടുത്തിയ തിരുത്തുകൾ.",
"authmanager-create-no-primary": "അംഗത്വസൃഷ്ടിക്ക് നൽകിയിരിക്കുന്ന വിവരങ്ങൾ ഉപയോഗിക്കാനാവില്ല.",
"authmanager-link-no-primary": "അംഗത്വം ബന്ധിപ്പിക്കാൻ നൽകിയിരിക്കുന്ന വിവരങ്ങൾ ഉപയോഗിക്കാനാവില്ല.",
"authmanager-link-not-in-progress": "സെഷൻ ഡേറ്റ നഷ്ടപ്പെട്ടതിനാൽ അംഗത്വം ബന്ധിപ്പിക്കലിന്റെ പുരോഗതി നഷ്ടമായിരിക്കുന്നു. ദയവായി ആദ്യം മുതൽ വീണ്ടും തുടങ്ങുക.",
- "authmanager-authplugin-setpass-failed-title": "രഹസ്യവാക്ക് മാറ്റം പരാജയപ്പെട്ടു",
- "authmanager-authplugin-setpass-bad-domain": "അസാധുവായ ഡൊമൈൻ.",
"authmanager-userdoesnotexist": "\"$1\" എന്ന ഉപയോക്തൃ അംഗത്വം നിലവിലില്ല.",
"authmanager-userlogin-remembermypassword-help": "രഹസ്യവാക്ക് സെഷൻ കാലയളവിലധികം ഓർത്തുവെക്കണോ.",
"authmanager-username-help": "രഹസ്യവാക്ക് ഉപയോഗിച്ചുള്ള സാധൂകരണം.",
"accmailtext": "Kata laluan janaan rawak untuk [[User talk:$1|$1]] telah dikirim kepada $2. Anda boleh menukarnya di halaman ''[[Special:ChangePassword|tukar kata laluan]]'' sebaik sahaja log masuk.",
"newarticle": "(Baru)",
"newarticletext": "Anda telah mengikuti pautan ke laman yang belum wujud.\nUntuk mencipta laman ini, sila taip dalam kotak di bawah\n(lihat [$1 laman bantuan] untuk maklumat lanjut).\nJika anda tiba di sini secara tak sengaja, hanya klik butang '''back''' pada pelayar anda.",
- "anontalkpagetext": "<em>Ini ialah laman perbincangan bagi pengguna tanpa nama yang belum membuka akaun atau tidak menggunakannya.</em>\nOleh itu, kami terpaksa menggunakan alamat IP angka untuk mengenal pasti pengguna tersebut. Alamat IP ini boleh dikongsi oleh ramai pengguna.\nSekiranya anda ialah seorang pengguna tanpa nama dan berasa bahawa komen yang tidak relevan telah ditujukan kepada anda, sila [[Special:CreateAccount|buka akaun baru]] atau [[Special:UserLogin|log masuk]] untuk mengelakkan sebarang kekeliruan dengan pengguna tanpa nama yang lain.",
+ "anontalkpagetext": "----\n<em>Ini laman perbincangan bagi pengguna tanpa nama yang belum cipta akaun lagi, atau yang tudaj menggunakannya.</em>\nOleh itu, kami perlu menggunakan alamat IP berangka untuk mengecam mereka^.\nAlamat IP sebegini boleh dikongsi oleh beberapa pengguna.\nJika anda ini pengguna tanpa nama dan rasa bahawa ulasan tiada kaitan telah ditujukan kepada anda, sila [[Special:CreateAccount|cipta akaun]] atau [[Special:UserLogin|log masuk]] untuk mengelakkan kekeliruan kelak dengan pengguna tanpa nama yang lain.",
"noarticletext": "Laman ini tiada teks buat masa sekarang.\nAnda boleh [[Special:Search/{{PAGENAME}}|cari tajuk bagi laman ini]] di laman-laman lain, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cari log-log yang berkaitan], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} sunting laman ini]</span>.",
"noarticletext-nopermission": "Tiada teks dalam laman ini ketika ini.\nAnda boleh [[Special:Search/{{PAGENAME}}|mencari tajuk laman ini]] dalam laman lain,\natau <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mencari log yang berkaitan]</span>.",
"missing-revision": "Semakan #$1 pada halaman \"{{FULLPAGENAME}}\" tidak wujud.\n\nHal ini biasanya disebabkan oleh pautan sejarah yang lapuk ke halaman yang sudah dihapuskan.\nButirannya boleh didapati di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
"editpage-invalidcontentmodel-text": "Model kandungan \"$1\" tidak disokong.",
"editpage-notsupportedcontentformat-title": "Format kandungan tidak disokong",
"editpage-notsupportedcontentformat-text": "Format kandungan $1 tidak disokong oleh model kandungan $2.",
+ "slot-name-main": "Utama",
"content-model-wikitext": "wikiteks",
"content-model-text": "teks biasa",
"content-model-javascript": "JavaScript",
"right-managechangetags": "Mencipta dan menghapuskan [[Special:Tags|teg]] dari pangkalan data",
"right-applychangetags": "Mengenakan [[Special:Tags|teg]] di samping suntingan seseorang",
"right-changetags": "Menambah dan menggugurkan [[Special:Tags|teg]] yang dikenakan sembarangan pada semakan dan entri log individu",
+ "grant-group-email": "Hantar e-mel",
+ "grant-createaccount": "Cipta akaun",
+ "grant-createeditmovepage": "Cipta, sunting dan pindah laman",
"grant-editmywatchlist": "Sunting senarai pantau anda",
"grant-editpage": "Sunting laman sedia ada",
"grant-editprotected": "Sunting laman yang dilindungi",
+ "grant-sendemail": "Hantar e-mel ke pengguna lain",
"grant-uploadfile": "Muat naik fail baru",
"grant-basic": "Hak-hak asas",
"newuserlogpage": "Log akaun baru",
"filehist-comment": "Komen",
"imagelinks": "Penggunaan fail",
"linkstoimage": "{{PLURAL:$1|Laman|$1 buah laman}} berikut menggunakan fail ini:",
- "linkstoimage-more": "Lebih daripada $1 laman mengandungi pautan ke fail ini.\nYang berikut ialah {{PLURAL:$1||$1}} pautan pertama ke fail ini.\nAnda boleh melihat [[Special:WhatLinksHere/$2|senarai penuh]].",
+ "linkstoimage-more": "Lebih daripada $1 {{PLURAL:$1|laman menggunakan|laman menggunakan}} fail ini.\nYang berikut ialah {{PLURAL:$1|laman pertama|laman $1 pertama}} yang menggunakan fail ini sahaja.\nTerdapat [[Special:WhatLinksHere/$2|senarai penuh]] tersedia.",
"nolinkstoimage": "Tiada laman yang menggunakan fail ini.",
"morelinkstoimage": "Lihat [[Special:WhatLinksHere/$1|semua pautan]] ke fail ini.",
"linkstoimage-redirect": "$1 (lencongan fail) $2",
"unwatchthispage": "Berhenti memantau",
"notanarticle": "Bukan laman kandungan",
"notvisiblerev": "Semakan ini telah dihapuskan",
- "watchlist-details": "$1 laman dipantau ,tidak termasuk laman perbincangan.",
+ "watchlist-details": "{{PLURAL:$1|$1 laman|$1 laman}} di Senarai Pantau anda (termasuk laman perbincangan).",
"wlheader-enotif": "Pemberitahuan melalui e-mel dibolehkan.",
"wlheader-showupdated": "Laman-laman yang telah diubah sejak kunjungan terakhir anda dipaparkan dalam '''teks tebal'''.",
"wlnote": "Yang berikut ialah <strong>$1</strong> perubahan terakhir sejak $2 jam yang lalu, sehingga $3, $4.",
"tooltip-feed-rss": "Suapan RSS bagi laman ini",
"tooltip-feed-atom": "Suapan Atom bagi laman ini",
"tooltip-t-contributions": "Senarai sumbangan {{GENDER:$1|pengguna ini}}",
- "tooltip-t-emailuser": "Kirim e-mel kepada pengguna ini",
+ "tooltip-t-emailuser": "Kirim e-mel kepada {{GENDER:$1|pengguna ini}}",
"tooltip-t-info": "Maklumat lanjut mengenai laman ini",
"tooltip-t-upload": "Muat naik imej atau fail media",
"tooltip-t-specialpages": "Senarai laman khas",
"version-libraries-license": "Lesen",
"version-libraries-description": "Keterangan",
"version-libraries-authors": "Pengarang",
- "redirect": "Lencongkan mengikut ID fail, pengguna, halaman atau semakan",
+ "redirect": "Lencongkan mengikut fail, pengguna, laman, semakan, atau ID log",
"redirect-summary": "Halaman khas ini melencong kepada fail (dengan nama fail), halaman (dengan ID semakan atau ID halaman) atau halaman pengguna (dengan ID pengguna berangka), atau entri log (dengan ID log). Kegunaan: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], atau [[{{#Special:Redirect}}/user/101]].",
"redirect-submit": "Pergi",
"redirect-lookup": "Cari:",
"htmlform-cloner-delete": "Buang",
"htmlform-cloner-required": "Sekurang-kurangnya satu nilai diperlukan.",
"logentry-delete-delete": "$1 telah {{GENDER:$2|menghapuskan}} laman $3",
- "logentry-delete-restore": "$1 telah {{GENDER:$2|memulihkan}} laman $3",
+ "logentry-delete-restore": "$1 telah {{GENDER:$2|memulihkan}} laman $3 ($4)",
"logentry-delete-event": "$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 peristiwa log di $3: $4",
"logentry-delete-revision": "$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 semakan di halaman $3: $4",
"logentry-delete-event-legacy": "$1 telah {{GENDER:$2|mengubah}} keterlihatan peristiwa log di $3",
"log-action-filter-rights-rights": "လူဖြင့် ပြောင်းလဲမှု",
"log-action-filter-rights-autopromote": "အလိုအလျောက် ပြောင်းလဲမှု",
"authmanager-create-disabled": "အကောင့်ဖန်တီးခြင်းကို ပိတ်ထားသည်။",
- "authmanager-authplugin-setpass-failed-title": "စကားဝှက်ပြောင်းလဲမှု မအောင်မြင်ပါ",
"authmanager-autocreate-noperm": "အလိုအလျာက် အကောင့်ဖန်တီးခြင်းကို ခွင့်မပြုပါ။",
"authmanager-autocreate-exception": "ရှေ့ကအမှားများကြောင့် အလိုအလျာက် အကောင့်ဖန်တီးခြင်းကို ယာယီပိတ်ထားသည်။",
"authmanager-userdoesnotexist": "အသုံးပြုသူအကောင့် \"$1\" သည် မှတ်ပုံမတင်ထားပါ။",
"authmanager-create-no-primary": "Le credenziali date nun se ponno ausà pe' puté crià n'utenza.",
"authmanager-link-no-primary": "'E credenziale date nun se ponno ausà p' 'o cullegamento 'utenza.",
"authmanager-link-not-in-progress": "'O cullegamento 'e cunte nun è 'ncurzo o 'e date d' 'a sessione so' ghiute pierze. Verite 'accummincià n'ata vota a 'o prencipio.",
- "authmanager-authplugin-setpass-failed-title": "'O cagnamento d' 'a password è ghiuto malamente",
- "authmanager-authplugin-setpass-failed-message": "'O plugin 'autenticazione nun ave lassato 'o cagnamento d' 'a password.",
- "authmanager-authplugin-create-fail": "'O plugin autenticazione nun lassaie crià ll'utenza.",
- "authmanager-authplugin-setpass-denied": "'O plugin autenticazione nun premmettesse 'e cagnà 'e password.",
- "authmanager-authplugin-setpass-bad-domain": "Dominio invalido.",
"authmanager-autocreate-noperm": "'A criazione automatica 'e ll'utenza nun fosse premmessa.",
"authmanager-autocreate-exception": "Criazione 'e cunte automatica stutata pe nu poc'ê tiempo pe vvìa 'e ll'errure precedenti.",
"authmanager-userdoesnotexist": "'O cunto utente \"$1\" nun è riggistrato.",
"anoncontribs": "Bidrag",
"contribsub2": "For {{GENDER:$3|$1}} ($2)",
"contributions-userdoesnotexist": "Brukerkontoen «$1» er ikke registrert.",
+ "negative-namespace-not-supported": "Navnerom med negative verdier støttes ikke.",
"nocontribs": "Ingen endringer er funnet som passer disse kriteriene.",
"uctop": "siste",
"month": "Fra måned (og tidligere):",
"authmanager-create-no-primary": "De oppgitte akkreditivene kunne ikke brukes for kontooppretting.",
"authmanager-link-no-primary": "De oppgitte akkreditivene kunne ikke brukes for kontolenking.",
"authmanager-link-not-in-progress": "Kontolenking foregår ikke eller sesjonsdata er tapt. Start igjen fra begynnelsen.",
- "authmanager-authplugin-setpass-failed-title": "Passordendring mislyktes",
- "authmanager-authplugin-setpass-failed-message": "Autentiseringspluginen avviste passordendringen.",
- "authmanager-authplugin-create-fail": "Autentiseringspluginen avviste kontoopprettelsen.",
- "authmanager-authplugin-setpass-denied": "Autentiseringspluginen tillater ikke endring av passord.",
- "authmanager-authplugin-setpass-bad-domain": "Ugyldig domene.",
"authmanager-autocreate-noperm": "Automatisk kontoopprettelse tillates ikke.",
"authmanager-autocreate-exception": "Automatisk kontoopprettelse er midlertidig deaktivert på grunn av tidligere feil.",
"authmanager-userdoesnotexist": "Brukerkontoen «$1» er ikke registrert.",
"group-autoconfirmed": "स्वत निश्चित गरिएका प्रयोगकर्ताहरू",
"group-bot": "बोटहरू",
"group-sysop": "प्रवन्धकहरू",
+ "group-interface-admin": "अन्तरमोहडा सम्पादक",
"group-bureaucrat": "प्रशासकहरू",
"group-suppress": "अतिदृष्टिहरू",
"group-all": "(सबै)",
"logentry-rights-autopromote": "$1 {{GENDER:$2|is}} automatisch gepromoveerd van $4 naar $5",
"logentry-upload-upload": "$1 heeft $3 {{GENDER:$2|geüpload}}",
"logentry-upload-overwrite": "$1 {{GENDER:$2|heeft}} een nieuwe versie van $3 geüpload",
- "logentry-upload-revert": "$1 heeft $3 {{GENDER:$2|geupload}}",
+ "logentry-upload-revert": "$1 heeft $3 naar een oudere versie {{GENDER:$2|teruggedraaid}}",
"log-name-managetags": "Labelbeheerlogboek",
"log-description-managetags": "Deze pagina geeft een overzicht van managementtaken met betrekking tot [[Special:Tags|labels]]. Het logboek bevat alleen activiteiten die handmatig zijn uitgevoerd door een beheerder. Labels kunnen door de wikisoftware worden gemaakt of verwijderd zonder dat er een vermelding is opgenomen in dit logboek.",
"logentry-managetags-create": "$1 heeft het label \"$4\" {{GENDER:$2|aangemaakt}}",
"log-action-filter-suppress-reblock": "Verbergen van gebruiker tijdens wijzigen blokkade",
"log-action-filter-upload-upload": "Nieuwe upload",
"log-action-filter-upload-overwrite": "Herupload",
+ "log-action-filter-upload-revert": "Terugdraaiing",
"authmanager-authn-not-in-progress": "Verificatie is niet in behandeling, of de sessiegegevens zijn verloren gegaan. Start opnieuw vanaf het begin.",
"authmanager-authn-no-primary": "De ingevoerde inloggegevens kunnen niet worden geverifieerd.",
"authmanager-authn-no-local-user": "De ingevoerde inloggegevens zijn niet gekoppeld aan een gebruiker op deze wiki.",
"authmanager-create-no-primary": "De ingevoerde inloggegevens kunnen niet worden gebruikt voor het aanmaken van het account.",
"authmanager-link-no-primary": "De ingevoerde inloggegevens kunnen niet worden gebruikt om het account te koppelen.",
"authmanager-link-not-in-progress": "Het koppelen van het account is niet in behandeling, of de sessiegegevens zijn verloren gegaan. Start opnieuw vanaf het begin.",
- "authmanager-authplugin-setpass-failed-title": "Wachtwoord wijzigen is mislukt",
- "authmanager-authplugin-setpass-failed-message": "De verificatie-invoegtoepassing heeft het wijzigen van het wachtwoord geweigerd.",
- "authmanager-authplugin-create-fail": "De verificatie-invoegtoepassing heeft geweigerd uw account aan te maken.",
- "authmanager-authplugin-setpass-denied": "De verificatie-invoegtoepassing staat het wijzigen van wachtwoorden niet toe.",
- "authmanager-authplugin-setpass-bad-domain": "Ongeldig domein.",
"authmanager-autocreate-noperm": "Het automatisch aanmaken van accounts is niet toegestaan.",
"authmanager-autocreate-exception": "Het automatisch aanmaken van accounts is tijdelijk uitgeschakelijk vanwege eerdere fouten.",
"authmanager-userdoesnotexist": "Gebruikersaccount \"$1\" is niet geregistreerd.",
"passwordpolicies-policy-maximalpasswordlength": "Wachtwoord moet minder dan $1 {{PLURAL:$1|teken|tekens}} bevatten",
"passwordpolicies-policy-passwordcannotbepopular": "Watchwoord mag niet {{PLURAL:$1|overeenkomen met het bekende wachtwoord|voorkomen in de lijst met $1 bekende wachtwoorden}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "Wachtwoorden mogen niet voorkomen in de lijst met 100.000 veelvoorkomende wachtwoorden.",
+ "passwordpolicies-policyflag-forcechange": "moet gewijzigd worden bij het aanmelden",
"unprotected-js": "Vanwege veiligheidsredenen kan er geen JavaScript geladen worden vanaf onbeveiligde pagina's. Gelieve alleen JavaScript pagina's aan te maken in de MediaWiki: naamruimte of als een subpagina van een gebruikerspagina."
}
"log-action-filter-upload-overwrite": "Tornar mandar",
"authmanager-authn-autocreate-failed": "La creacion automatica d’un compte local a fracassat : $1",
"authmanager-create-disabled": "La creacion de compte es desactivada.",
- "authmanager-authplugin-setpass-bad-domain": "Domeni invalid.",
"authmanager-autocreate-noperm": "La creacion automatica de compte es pas autorizada.",
"authmanager-password-help": "Senhal per l'autentificacion.",
"authmanager-domain-help": "Domeni per l'autentificacion extèrna.",
"log-action-filter-all": "ਸਾਰੇ",
"log-action-filter-block-block": "ਪਾਬੰਦੀ",
"log-action-filter-block-unblock": "ਪਾਬੰਦੀ ਹਟਾਈ",
- "authmanager-authplugin-setpass-bad-domain": "ਗਲਤ ਡੋਮੇਨ",
"authmanager-password-help": "ਪ੍ਰਮਾਣਿਕਤਾ ਲਈ ਪਛਾਣ-ਸ਼ਬਦ।",
"authmanager-email-label": "ਈਮੇਲ",
"authmanager-email-help": "ਈਮੇਲ ਪਤਾ",
"authmanager-create-no-primary": "Podanych danych uwierzytelniających nie można użyć do utworzenia konta.",
"authmanager-link-no-primary": "Podanych danych uwierzytelniających nie można użyć do powiązania konta.",
"authmanager-link-not-in-progress": "Tworzenie konta nie jest wykonywane lub dane sesji zostały utracone. Zacznij od początku.",
- "authmanager-authplugin-setpass-failed-title": "Zmiana hasła nie powiodła się",
- "authmanager-authplugin-setpass-failed-message": "Wtyczka do uwierzytelniania uniemożliwiła zmianę hasła.",
- "authmanager-authplugin-create-fail": "Wtyczka do uwierzytelniania uniemożliwiła utworzenie konta.",
- "authmanager-authplugin-setpass-denied": "Wtyczka uwierzytelniania nie zezwala na zmianę haseł.",
- "authmanager-authplugin-setpass-bad-domain": "Niepoprawna domena.",
"authmanager-autocreate-noperm": "Automatyczne tworzenie konta jest niedozwolone.",
"authmanager-autocreate-exception": "Automatyczne tworzenie konta tymczasowo wyłączone z powodu wcześniejszych błędów.",
"authmanager-userdoesnotexist": "Konto użytkownika „$1” nie jest zarejestrowane.",
"authmanager-create-no-primary": "د ورکړل شوي کړني اعتبار نه شي کولی چي د حساب جوړولو لپاره وکارول شي.",
"authmanager-link-no-primary": "د ورکړل شوي تایید وړتیا د حساب کولو لپاره نه کارول کیدی.",
"authmanager-link-not-in-progress": "تایید په پرمختګ کې ندي یا د ناستې ډاټا ورک شوی. لطفا د پیل څخه بیا شروع وکړئ.",
- "authmanager-authplugin-setpass-failed-title": "د پټنوم بدلون ترسره نشو",
- "authmanager-authplugin-setpass-failed-message": "د تایید کولو پلگ ان د پاسورډ بدلون رد کړ.",
- "authmanager-authplugin-create-fail": "د تایید کولو پلگ ان د حساب جوړولو انکار رد کړ.",
- "authmanager-authplugin-setpass-denied": "د تاییدولو فلګن بدل شوي پټنوم اجازه نلري.",
- "authmanager-authplugin-setpass-bad-domain": "ناباوره ډومین.",
"authmanager-autocreate-noperm": "د اتوماتيک حساب جوړولو جوړولو اجازه نشته.",
"authmanager-autocreate-exception": "د پخوانیو غلطیو له امله د اتوماتیک حساب ورکولو جوړول په عارضي ډول معیوب شوی.",
"authmanager-userdoesnotexist": "د \"$1\" گڼون نه دی ثبت شوی.",
"logentry-rights-autopromote": "$1 foi promovido automaticamente de $4 para $5",
"logentry-upload-upload": "$1 {{GENDER:$2|carregou}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|carregada}} uma nova versão de $3",
- "logentry-upload-revert": "$1 {{GENDER:$2|carregado}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|revertido}} $3 para uma versão antiga",
"log-name-managetags": "Registo de gestão de etiquetas",
"log-description-managetags": "Esta página lista as tarefas de gestão relacionadas a [[Special:Tags|etiquetas]]. O registro contém apenas ações realizadas manualmente por um administrador; etiquetas podem ser criadas ou apagadas pelo software da wiki sem uma entrada a ser gravada neste registro.",
"logentry-managetags-create": "$1 {{GENDER:$2|criada}} a etiqueta \"$4\"",
"log-action-filter-suppress-reblock": "Supressão de usuário por rebloqueio",
"log-action-filter-upload-upload": "Novo Upload",
"log-action-filter-upload-overwrite": "Recarregar",
+ "log-action-filter-upload-revert": "Reverter",
"authmanager-authn-not-in-progress": "A autenticação não está em andamento ou os dados da sessão foram perdidos. Por favor, comece novamente desde o início.",
"authmanager-authn-no-primary": "As credenciais fornecidas não puderam ser autenticadas.",
"authmanager-authn-no-local-user": "As credenciais fornecidas não estão associadas a nenhum usuário neste wiki.",
"authmanager-create-no-primary": "As credenciais fornecidas não puderam ser usadas para criação de conta.",
"authmanager-link-no-primary": "As credenciais fornecidas não puderam ser usadas para vinculação de contas.",
"authmanager-link-not-in-progress": "A associação de contas não está em andamento ou os dados da sessão foram perdidos. Por favor, comece novamente desde o início.",
- "authmanager-authplugin-setpass-failed-title": "Falha na alteração da senha",
- "authmanager-authplugin-setpass-failed-message": "O plugin de autenticação negou a alteração da senha.",
- "authmanager-authplugin-create-fail": "O plugin de autenticação negou a criação da conta.",
- "authmanager-authplugin-setpass-denied": "O plugin de autenticação não permite alterar senhas.",
- "authmanager-authplugin-setpass-bad-domain": "Domínio inválido.",
"authmanager-autocreate-noperm": "A criação automática de conta não é permitida.",
"authmanager-autocreate-exception": "Criação automática de conta temporariamente desativada devido a erros anteriores.",
"authmanager-userdoesnotexist": "A conta de usuário \"$1\" não está registrada.",
"passwordpolicies-policy-maximalpasswordlength": "A senha deve ser menor que $1 {{PLURAL:$1|caráter|caracteres}}",
"passwordpolicies-policy-passwordcannotbepopular": "A senha não pode {{PLURAL:$1|ser a mais popular|estar na lista das $1 palavras-passe mais populares}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "A senha não pode estar na lista de 100.000 senhas mais usadas.",
+ "passwordpolicies-policyflag-forcechange": "deve mudar no login",
"easydeflate-invaliddeflate": "O conteúdo fornecido não está devidamente comprimido",
"unprotected-js": "Por razões de segurança o JavaScript não pode ser carregado de páginas desprotegidas. Por favor, crie apenas javascript no MediaWiki: namespace ou como uma subpágina do usuário"
}
"logentry-rights-autopromote": "$1 foi automaticamente {{GENDER:$2|promovido|promovida}} de $4 a $5",
"logentry-upload-upload": "$1 {{GENDER:$2|carregou}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|carregou}} uma nova versão de $3",
- "logentry-upload-revert": "$1 {{GENDER:$2|carregou}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|reverteu}} $3 para uma versão antiga",
"log-name-managetags": "Registo de gestão de etiquetas",
"log-description-managetags": "Esta página lista as tarefas de gestão relacionadas com [[Special:Tags|etiquetas]]. O registo contém apenas ações realizadas manualmente por um administrador; etiquetas podem ser criadas ou eliminadas pelo ''software'' da wiki sem uma entrada a ser gravada neste registo.",
"logentry-managetags-create": "$1 {{GENDER:$2|criou}} a etiqueta \"$4\"",
"log-action-filter-suppress-reblock": "Supressão de utilizador por rebloqueio",
"log-action-filter-upload-upload": "Novo carregamento",
"log-action-filter-upload-overwrite": "Recarregamento",
+ "log-action-filter-upload-revert": "Reverter",
"authmanager-authn-not-in-progress": "A autenticação não está em curso ou os dados da sessão foram perdidos. Comece novamente desde o princípio, por favor.",
"authmanager-authn-no-primary": "As informações de identificação fornecidas não podem ser autenticadas.",
"authmanager-authn-no-local-user": "As credenciais fornecidas não estão associadas a nenhum utilizador nesta wiki.",
"authmanager-create-no-primary": "Não foi possível criar uma conta com as credenciais fornecidas.",
"authmanager-link-no-primary": "Não foi possível ligar a conta usando as credenciais fornecidas.",
"authmanager-link-not-in-progress": "A ligação da conta não está em curso ou os dados da sessão foram perdidos. Comece novamente desde o princípio, por favor.",
- "authmanager-authplugin-setpass-failed-title": "A alteração de palavra-passe falhou",
- "authmanager-authplugin-setpass-failed-message": "O plugin de autenticação negou a alteração de palavra-passe.",
- "authmanager-authplugin-create-fail": "O plugin de autenticação negou a criação de conta.",
- "authmanager-authplugin-setpass-denied": "O plugin de autenticação não permite a alteração de palavras-passe.",
- "authmanager-authplugin-setpass-bad-domain": "Domínio inválido.",
"authmanager-autocreate-noperm": "A criação automática de contas não é permitida.",
"authmanager-autocreate-exception": "A criação automática de contas foi temporariamente desativada devido a erros prévios.",
"authmanager-userdoesnotexist": "A conta de utilizador(a) \"$1\" não está registada.",
"passwordpolicies-policy-maximalpasswordlength": "A palavra-passe tem de ter menos de $1 {{PLURAL:$1|carácter|caracteres}}",
"passwordpolicies-policy-passwordcannotbepopular": "A palavra-passe não pode {{PLURAL:$1|ser a mais popular|estar na lista das $1 palavras-passe mais populares}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "A palavra-passe não pode constar na lista das 100 000 palavras-passe usadas com mais frequência.",
+ "passwordpolicies-policyflag-forcechange": "deve mudar ao iniciar sessão",
"easydeflate-invaliddeflate": "O conteúdo fornecido não está devidamente comprimido",
"unprotected-js": "Por motivos de segurança o JavaScript de páginas desprotegidas não pode ser carregado. Crie javascript só no espaço nominal/domínio MediaWiki: ou numa subpágina do utilizador"
}
"site-rss-feed": "Used in the HTML header of a wiki's RSS feed.\nHTML markup cannot be used.\n\nParameters:\n* $1 - <nowiki>{{SITENAME}}</nowiki>\n{{Identical|S1 RSS/Atom feed}}",
"site-atom-feed": "Used in the HTML header of a wiki's Atom feed.\nHTML markup cannot be used.\n\nParameters:\n* $1 - <nowiki>{{SITENAME}}</nowiki>\n{{Identical|S1 RSS/Atom feed}}",
"page-rss-feed": "Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Page-atom-feed}}\n{{Identical|S1 RSS/Atom feed}}",
- "page-atom-feed": "Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Page-rss-feed}}\n{{Identical|S1 RSS/Atom feed}}",
+ "page-atom-feed": "Used as the \"title\" attribute in the <link rel=\"alternate\" type=\"application/atom+xml\"> element of the HTML source of the page. Not rendered in the web page.\n\nParameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Page-rss-feed}}\n{{Identical|S1 RSS/Atom feed}}",
"feed-atom": "{{optional}}\nSee also:\n* {{msg-mw|Feed-atom}}\n* {{msg-mw|Accesskey-feed-atom}}\n* {{msg-mw|Tooltip-feed-atom}}",
"feed-rss": "{{optional}}\nSee also:\n* {{msg-mw|Feed-rss}}\n* {{msg-mw|Accesskey-feed-rss}}\n* {{msg-mw|Tooltip-feed-rss}}",
"sitenotice": "{{Notranslate}}\n\nMediaWiki:Sitenotice is displayed above the page title for all users if it is defined, unless it is superseded by another notice. 'Defined' means it exists and has content other than the single character '-'.\n\nManual: [[mw:Manual:Interface/Sitenotice]]",
"ipb-confirm": "Used as hidden field in the form on [[Special:Block]].",
"ipb-sitewide": "A type of block the user can select from on [[Special:Block]].",
"ipb-partial": "A type of block the user can select from on [[Special:Block]].",
+ "ipb-sitewide-help": "Help text describing the effects of a sitewide block on [[Special:Block]]",
+ "ipb-partial-help": "Help text describing the effects of a partial block on [[Special:Block]]",
"ipb-pages-label": "The label for an autocomplete text field to specify pages to block a user from editing on [[Special:Block]].",
"ipb-namespaces-label": "The label for an autocomplete text field to specify namespaces to block a user from editing on [[Special:Block]].",
"badipaddress": "An error message shown when one entered an invalid IP address in blocking page.",
"ip_range_toolarge": "Used as error message in [[Special:Block]]. Parameters:\n* $1 - a number from 0 to 32 for IPv4 (from 0 to 128 for IPv6); a part of CIDR (Classless Inter-Domain Routing) notation.\nSee also:\n* {{msg-mw|Range block disabled}}\n* {{msg-mw|Ip range invalid}}\n* {{msg-mw|Ip range toolarge}}",
"ip_range_exceeded": "Used as error message in HTMLUserTextField when an IP range exceeds its maximum amount. See {{msg-mw|ip_range_toolarge}} for parameter.\n/$1 is the width as a number of bits.",
"ip_range_toolow": "Used as error message in HTMLUserTextField, if effectively no IP ranges are interpreted as valid (IPv4 CIDR range /32 or IPv6 /128).",
- "proxyblocker": "Used in [[Special:BlockMe]].\n\nSee also:\n* {{msg-mw|proxyblocker-disabled}}\n* {{msg-mw|proxyblockreason}}\n* {{msg-mw|proxyblocksuccess}}",
- "proxyblockreason": "Used as explanation of the reason in [[Special:BlockMe]].\n\nSee also:\n* {{msg-mw|proxyblocker-disabled}}\n* {{msg-mw|proxyblocker}}\n* {{msg-mw|proxyblocksuccess}}",
+ "proxyblocker": "Username for blocking IP addresses listed in [[mw:Manual:$wgProxyList|$wgProxyList]].\n\nSee also:\n* {{msg-mw|proxyblockreason}}",
+ "proxyblockreason": "Reason for blocking IP addresses listed in [[mw:Manual:$wgProxyList|$wgProxyList]].\n\nSee also:\n* {{msg-mw|proxyblocker}}",
"sorbs": "{{optional}}",
"sorbsreason": "See also:\n* {{msg-mw|Sorbsreason}}\n* {{msg-mw|Sorbs create account_reason}}",
"sorbs_create_account_reason": "Used in [[Special:UserLogin]] when creating an account.\n\nSee also:\n* {{msg-mw|Sorbsreason}}\n* {{msg-mw|Sorbs create account_reason}}",
"log-action-filter-suppress-reblock": "{{doc-log-action-filter-action|suppress|reblock}}",
"log-action-filter-upload-upload": "{{doc-log-action-filter-action|upload|upload}}",
"log-action-filter-upload-overwrite": "{{doc-log-action-filter-action|upload|overwrite}}",
+ "log-action-filter-upload-revert": "{{doc-log-action-filter-action|upload|revert}}",
"authmanager-authn-not-in-progress": "Error message when AuthManager session data is lost during authentication, or the user hits the \"continue\" endpoint without an active authentication attempt.",
"authmanager-authn-no-primary": "Error message when no AuthenticationProvider handles the AuthenticationRequests for login. This might mean the user needs to fill out all the form fields.",
"authmanager-authn-no-local-user": "Error message when authentication somehow succeeds without a username being known. This probably should never happen.",
"authmanager-create-no-primary": "Error message when no AuthenticationProvider handles the AuthenticationRequests for account creation. This might mean the user needs to fill out all the form fields.",
"authmanager-link-no-primary": "Error message when no AuthenticationProvider handles the AuthenticationRequests for account linking. This might mean the user needs to fill out all the form fields.",
"authmanager-link-not-in-progress": "Error message when AuthManager session data is lost during account linking, or the user hits the \"continue\" endpoint without an active account link attempt.",
- "authmanager-authplugin-setpass-failed-title": "Title of error page from AuthManager if AuthPlugin returns false from its setPassword() method.",
- "authmanager-authplugin-setpass-failed-message": "Text of error page from AuthManager if AuthPlugin returns false from its setPassword() method.",
- "authmanager-authplugin-create-fail": "Error message from AuthManager if the AuthPlugin returns false from its addUser() method.",
- "authmanager-authplugin-setpass-denied": "Error message from AuthManager if the AuthPlugin returns false from its allowPasswordChange() method.",
- "authmanager-authplugin-setpass-bad-domain": "Error message from AuthManager if the AuthPlugin rejects the passed domain.",
"authmanager-autocreate-noperm": "Error message when auto-creation fails due to lack of permission.",
"authmanager-autocreate-exception": "Error message when auto-creation fails because we tried recently and an exception was thrown, so we're not going to try again yet.",
"authmanager-userdoesnotexist": "Error message when a user account does not exist. Parameters:\n* $1 - User name.",
"passwordpolicies-summary": "The description used on [[Special:PasswordPolicies]].\n\nRefers to {{msg-mw|Passwordpolicies-helppage}}.",
"passwordpolicies-group": "The title of the column in the table, about user groups (like you are in the ''translator'' group).\n\n{{Identical|Group}}\n{{Related|Passwordpolicies}}",
"passwordpolicies-policies": "The title of the column in the table, about password policies.\n{{Related|Passwordpolicies}}",
- "passwordpolicies-policy-display": "{{optional}}\nParameters:\n* $1 - the text from the \"passwordpolicies-policy-...\" messages, i.e. {{msg-mw|passwordpolicies-policy-minimalpasswordlength}}\n* $2 - the name of this password policy",
+ "passwordpolicies-policy-display": "{{optional}}\nParameters:\n* $1 - the text from the \"passwordpolicies-policy-...\" messages, e.g. {{msg-mw|passwordpolicies-policy-minimalpasswordlength}}\n* $2 - the name of this password policy",
+ "passwordpolicies-policy-displaywithflags": "{{optional}}\nParameters:\n* $1 - the text from the \"passwordpolicies-policy-...\" messages, i.e. {{msg-mw|passwordpolicies-policy-minimalpasswordlength}}\n* $2 - the name of this password policy\n* $3 - comma-separated list of the text from the \"passwordpolicies-policyflag-...\" messages, e.g. {{msg-mw|passwordpolicies-policyflag-forcechange}}",
"passwordpolicies-policy-minimalpasswordlength": "Password policy that enforces a minimum number of characters a password must be. $1 - minimum number of characters that a password can be",
"passwordpolicies-policy-minimumpasswordlengthtologin": "Password policy that enforces a minimum number of characters a password must be to be able to login to the wiki. $1 - minimum number of characters that a password can be to be able to login",
"passwordpolicies-policy-passwordcannotmatchusername": "Password policy that enforces that the password of the account cannot be the same as the username",
"passwordpolicies-policy-maximalpasswordlength": "Password policy that enforces a maximum number of characters a password must be. $1 - maximum number of characters that a password can be",
"passwordpolicies-policy-passwordcannotbepopular": "Password policy that enforces that a password is not in a list of $1 number of \"popular\" passwords. $1 - number of popular passwords the password will be checked against",
"passwordpolicies-policy-passwordnotinlargeblacklist": "Password policy that enforces that a password is not in a list of 100,000 number of \"popular\" passwords.",
+ "passwordpolicies-policyflag-forcechange": "Password policy flag that enforces changing invalid passwords on login.",
"easydeflate-invaliddeflate": "Error message if the content passed to easydeflate was not deflated (compressed) properly",
"unprotected-js": "Error message shown when trying to load javascript via action=raw that is not protected"
}
"grant-privateinfo": "Accesați informații confidențiale",
"grant-protect": "Protejați și deprotejați pagini",
"grant-rollback": "Reveniți asupra modificărilor paginilor",
- "grant-sendemail": "Trimite-ți e-mail altor utilizatori",
+ "grant-sendemail": "Trimiteți e-mail altor utilizatori",
"grant-uploadeditmovefile": "Încărcați, înlocuiți și mutați fișiere",
"grant-uploadfile": "Încărcați fișiere noi",
"grant-basic": "Drepturi de bază",
"trackingcategories-nodesc": "Nicio descriere disponibilă.",
"trackingcategories-disabled": "Categoria este dezactivată",
"mailnologin": "Nu există adresă de trimitere",
- "mailnologintext": "Trebuie să fii [[Special:UserLogin|autentificat]] și să ai o adresă validă de e-mail în [[Special:Preferences|preferințe]] pentru a trimite e-mail altor utilizatori.",
+ "mailnologintext": "Trebuie să fiți [[Special:UserLogin|autentificat]] și să aveți o adresă validă de e-mail în [[Special:Preferences|preferințe]] pentru a trimite e-mail altor utilizatori.",
"emailuser": "Trimite-i un e-mail",
"emailuser-title-target": "E-mail către {{GENDER:$1|acest utilizator|această utilizatoare}}",
"emailuser-title-notarget": "E-mail către utilizator",
"block-log-flags-anononly": "doar utilizatori anonimi",
"block-log-flags-nocreate": "fără drept de a crea conturi",
"block-log-flags-noautoblock": "fără blocare automată",
- "block-log-flags-noemail": "fără drept de a trimite e-mail",
+ "block-log-flags-noemail": "e-mail dezactivat",
"block-log-flags-nousertalk": "fără drept de modificare a propriei pagini de discuții",
"block-log-flags-angry-autoblock": "autoblocarea avansată activată",
"block-log-flags-hiddenname": "nume de utilizator ascuns",
"authmanager-create-no-primary": "Credețialele folosite nu au putut fi folosite pentru crearea de conturi.",
"authmanager-link-no-primary": "Credențialele folosite nu au putut fi folosite pentru conectarea conturilor.",
"authmanager-link-not-in-progress": "Conectarea conturilor nu este în progres sau datele sesiunii au fost pierdute. Vă rugăm să începeți de la început.",
- "authmanager-authplugin-setpass-failed-title": "Schimbarea parolei a eșuat",
- "authmanager-authplugin-setpass-failed-message": "Pluginul de autentificare a respins modificarea parolei.",
- "authmanager-authplugin-create-fail": "Pluginul de autentificare a respins crearea contului.",
- "authmanager-authplugin-setpass-denied": "Pluginul de autentificare nu permite schimbarea parolei.",
- "authmanager-authplugin-setpass-bad-domain": "Domeniu invalid.",
"authmanager-autocreate-noperm": "Crearea automată de conturi nu este permisă.",
"authmanager-autocreate-exception": "Crearea automată de conturi este temporar oprită din cauza erorilor anterioare.",
"authmanager-userdoesnotexist": "Contul de utilizator „$1” nu este înregistrat.",
"logentry-rights-autopromote": "$1 ha state {{GENDER:$2|promosse}} automaticamende da $4 a $5",
"logentry-upload-upload": "$1 {{GENDER:$2|carecate}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|carecate}} 'na versiona nove de $3",
- "logentry-upload-revert": "$1 {{GENDER:$2|carecate}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|turnate}} $3 a 'na versiona vecchie",
"log-name-managetags": "Archivije d'a gestione de le tag",
"log-description-managetags": "Sta pàgene elenghe le combite de gestione collegate a le [[Special:Tags|tags]]. L'archivije téne sulamende aziune fatte a màne da 'n'amministratore; le tag ponne essere ccrejate o scangellate da software de uicchi senze ca 'na vôsce avène scritte jndr'à l'archivije.",
"logentry-managetags-create": "$1 {{GENDER:$2|ccrejate}} 'u tag \"$4\"",
"log-action-filter-suppress-reblock": "Soppressione de l'utende da ri-blocche",
"log-action-filter-upload-upload": "Carecamende nuève",
"log-action-filter-upload-overwrite": "Recareche",
- "authmanager-authplugin-setpass-failed-title": "Cangiamende d'a passuord fallite",
- "authmanager-authplugin-setpass-bad-domain": "Dominie invalide.",
+ "log-action-filter-upload-revert": "Turnate",
"authmanager-email-label": "Email",
"authmanager-email-help": "Indirizze e-mail",
"authmanager-realname-label": "Nome vere",
"Infovarius",
"Cronolio",
"Nk88",
- "Edward Chernenko"
+ "Edward Chernenko",
+ "Romanko Mikhail"
]
},
"tog-underline": "Подчёркивание ссылок:",
"tog-hidepatrolled": "Скрывать патрулированные правки в списке свежих правок",
"tog-newpageshidepatrolled": "Скрывать отпатрулированные страницы в списке новых страниц",
"tog-hidecategorization": "Скрывать категоризацию страниц",
- "tog-extendwatchlist": "Расширить список наблюдения, включая все изменения, а не только последние <small>(они могут быть сгруппированы настройкой на вкладке «[[Служебная:Настройки#mw-prefsection-rc|Свежие правки]]»)</small>",
+ "tog-extendwatchlist": "Расширить список наблюдения, включая все изменения, а не только последние",
"tog-usenewrc": "Группировать изменения в свежих правках и списке наблюдения",
"tog-numberheadings": "Автоматически нумеровать заголовки",
"tog-editondblclick": "Править страницы по двойному щелчку",
"tog-watchdeletion": "Добавлять в список наблюдения удалённые мной страницы и файлы",
"tog-watchuploads": "Добавлять загруженные мною файлы в список наблюдения",
"tog-watchrollback": "Добавлять страницы, где я выполнил откат, в мой список наблюдения",
- "tog-minordefault": "По умолчанию помечать правки как малые",
+ "tog-minordefault": "Ð\9fо Ñ\83молÑ\87аниÑ\8e помеÑ\87аÑ\82Ñ\8c вÑ\81е пÑ\80авки как малÑ\8bе",
"tog-previewontop": "Помещать предпросмотр перед окном редактирования",
"tog-previewonfirst": "Показывать предпросмотр при переходе к редактированию",
"tog-enotifwatchlistpages": "Уведомлять по электронной почте об изменениях страниц и файлов из списка наблюдения",
"anoncontribs": "Вклад",
"contribsub2": "Вклад {{GENDER:$3|$1}} ($2)",
"contributions-userdoesnotexist": "Не зарегистрировано учётной записи «$1».",
+ "negative-namespace-not-supported": "Пространства имён с отрицательными значениями не поддерживаются.",
"nocontribs": "Изменений, соответствующих заданным условиям, не найдено.",
"uctop": "текущая",
"month": "С месяца (и ранее):",
"authmanager-create-no-primary": "Предоставленные учётные данные не могут быть использованы для создания учётной записи.",
"authmanager-link-no-primary": "Предоставленные учётные данные не могут быть использованы для связывания учётных записей.",
"authmanager-link-not-in-progress": "Связывание учётной записи не выполняется или данные сессии были утеряны. Пожалуйста, начните снова с самого начала.",
- "authmanager-authplugin-setpass-failed-title": "Ошибка изменения пароля",
- "authmanager-authplugin-setpass-failed-message": "Плагин аутентификации запрещает смену пароля.",
- "authmanager-authplugin-create-fail": "Плагин аутентификации запрещает создание учётных записей.",
- "authmanager-authplugin-setpass-denied": "Плагин аутентификации не позволяет изменять пароли.",
- "authmanager-authplugin-setpass-bad-domain": "Неверный домен.",
"authmanager-autocreate-noperm": "Автоматическое создание учётных записей не разрешено.",
"authmanager-autocreate-exception": "Автоматическое создание учётной записи временно отключено из-за предыдущих ошибок.",
"authmanager-userdoesnotexist": "Не зарегистрировано учётной записи «$1».",
"passwordpolicies-policy-maximalpasswordlength": "Пароль должен быть короче $1 {{PLURAL:$1|символа|символов}}",
"passwordpolicies-policy-passwordcannotbepopular": "Пароль не может соответствовать {{PLURAL:$1|самому часто используемому паролю|какому-либо из $1 самых часто используемых паролей}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "Пароль не может соответствовать какому-либо из 100 000 самых часто используемых паролей.",
+ "passwordpolicies-policyflag-forcechange": "необходимо изменить при входе",
"easydeflate-invaliddeflate": "Предоставленное содержимое не спущено надлежащим образом",
"unprotected-js": "По соображениям безопасности JavaScript нельзя загружать с незащищенных страниц. Пожалуйста, создавайте скрипты только в пространстве имён MediaWiki: или как подстраницы участника."
}
"authmanager-create-no-primary": "Эппит сибидиэнньэҕин туһанан бэлиэтэнэр сатаммат эбит.",
"authmanager-link-no-primary": "Эппит сибидиэнньэҕин туһанан бэлиэ ааттары холбуур сатаммат эбит.",
"authmanager-link-not-in-progress": "Бэлиэ ааттары холбуур сатаммата эбэтэр сиэссийэ быстан хаалла. Саҥаттан хатылаан көр.",
- "authmanager-authplugin-setpass-failed-title": "Аһарыгы уларытар табыллыбата",
- "authmanager-authplugin-setpass-failed-message": "Аутентификация былаҕыына аһарыгы уларытары бобор.",
- "authmanager-authplugin-create-fail": "Аутентификация былаҕыына бэлиэтэнэри бобор.",
- "authmanager-authplugin-setpass-denied": "Аутентификация былаҕыына аһарыгы уларытары бобор.",
- "authmanager-authplugin-setpass-bad-domain": "Алҕастаах домен.",
"authmanager-autocreate-noperm": "Аптамаатынан бэлиэтэнии көҥүллэммэт.",
"authmanager-autocreate-exception": "Аптамаатынан бэлиэтэнии урут тахсыбыт алҕастартан сылтаан араарыллыбыт.",
"authmanager-userdoesnotexist": "Маннык аат «$1» суох.",
"Fagunkoyel Hansdah",
"Subasmurmu",
"Amire80",
- "Dulal Kisku"
+ "Dulal Kisku",
+ "Rocky 734"
]
},
"tog-underline": "ᱡᱚᱱᱚᱲ ᱞᱟᱛᱟᱨᱨᱮ ᱫᱟᱜᱽ ᱩᱫᱩᱜᱽᱢᱮ:",
"login-throttled": "ᱟᱢ ᱫᱚ ᱢᱤᱫᱜᱷᱟᱹᱲᱤ ᱞᱟᱦᱟᱨᱮ ᱟᱭᱢᱟ ᱫᱷᱟᱣ ᱵᱚᱞᱚᱜᱮᱢ ᱠᱩᱨᱩᱢᱩᱴᱩ ᱠᱮᱫᱟ᱾ \nᱟᱨᱦᱚᱸ ᱠᱩᱨᱩᱢᱩᱴᱩᱭ ᱞᱟᱦᱟᱨᱮ ᱫᱟᱭᱟᱠᱟᱛᱮ $1 ᱛᱟᱸᱜᱤᱭᱢᱮ᱾",
"login-abort-generic": "ᱟᱢᱟᱜ ᱵᱷᱤᱛᱨᱤ ᱵᱚᱠᱟᱜ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭᱞᱮᱱᱟ - ᱵᱟᱫᱽᱱᱟ",
"loginlanguagelabel": "ᱯᱟᱹᱨᱥᱤ: $1",
- "pt-login": "á±µá±\9aá±\9eá±\9aá±\9c ᱫᱩᱣᱟᱹᱨ",
+ "pt-login": "á±µá±\9aá±\9eá±\9aá±± ᱫᱩᱣᱟᱹᱨ",
"pt-login-button": "ᱵᱚᱞᱚᱜ ᱢᱮ",
"pt-login-continue-button": "ᱞᱮᱛᱟᱲ ᱵᱚᱞᱚ ᱠᱚᱜᱼᱢᱮ",
"pt-createaccount": "ᱮᱠᱟᱶᱩᱴ ᱛᱮᱭᱟᱨᱢᱮ",
"thu": "Thu",
"fri": "Fri",
"sat": "Sat",
- "january": "Januair",
+ "january": "Januar",
"february": "Febuair",
"march": "Mairch",
"april": "Apryle",
"tog-extendwatchlist": "تازه ترين بدران سموريون تبديليون ڏيکارڻ لاءِ زير نظر فهرست کي وسيع ڪريو.",
"tog-numberheadings": "سُرخين کي خودڪاراً نمبر ڏيو",
"tog-editondblclick": "ٻٽي ڪلڪ تي صفحا سنواريو",
+ "tog-editsectiononrightclick": "ڀاڱن جي عنوان کي رائيٽ ڪلڪ ڪري ترميم ڪرڻ واري سهولت کي ڪارگر بڻايو.",
"tog-watchcreations": "منھنجا سرجيل صفحا ۽ منھنجا چاڙھيل فائيل منھنجي نظر ۾ فھرست تي رکو",
"tog-watchdefault": "منھنجا ترميميل صفحا ۽ فائيل منھنجي نظر ۾ فھرست ۾ رکو",
"tog-watchmoves": "جيڪي صفحا ۽ فائيل آءُٗ چوريان، سي منهنجي نظر ۾ فھرست ۾ شامل ڪريو",
"tog-hideminor": "Sakrij manje izmjene u spisku nedavnih izmjena",
"tog-hidepatrolled": "Sakrij patrolirane izmjene u nedavnim promjenama",
"tog-newpageshidepatrolled": "Sakrij patrolirane stranice sa spiska novih stranica",
+ "tog-hidecategorization": "Sakrij kategorizaciju stranica",
"tog-extendwatchlist": "Proširi spisak praćenja za pogled svih izmjena, ne samo nedavnih",
"tog-usenewrc": "Promene u grupi po stranici u spisku nedavnih izmhena i nadgledanih stranica (zahtijeva JavaScript)",
"tog-numberheadings": "Automatski numeriši podnaslove",
"tog-watchdefault": "Dodaj stranice i datoteke koje izmijenim u spisak praćenja",
"tog-watchmoves": "Dodaj stranice i datoteke koje premjestim na moj spisak praćenja",
"tog-watchdeletion": "Dodaj stranice i datoteke koje izbrišem na moj spisak praćenja",
+ "tog-watchuploads": "Dodaj datoteke koje postavim na moj spisak praćenja",
"tog-watchrollback": "Dodaj stranice na kojima sam vratio uređivanja na popis praćenja",
"tog-minordefault": "Označi da su sve izmjene u pravilu manje",
"tog-previewontop": "Prikaži pretpregled prije kutije za uređivanje",
"tog-enotifminoredits": "Pošalji mi e-mail i kod manjih izmjena stranica i datoteka",
"tog-enotifrevealaddr": "Otkrij adresu moje e-pošte u porukama obaviještenja",
"tog-shownumberswatching": "Prikaži broj korisnika koji prate",
- "tog-oldsig": "Postojeći potpis:",
+ "tog-oldsig": "Vaš postojeći potpis:",
"tog-fancysig": "Smatraj potpis kao wikitekst (bez automatskog linka)",
- "tog-uselivepreview": "Koristi pretpregled uživo",
+ "tog-uselivepreview": "Pretpregledi uživo bez preučitavanja stranice",
"tog-forceeditsummary": "Opomeni me pri unosu praznog sažetka",
"tog-watchlisthideown": "Sakrij moje izmjene sa spiska praćenih članaka",
"tog-watchlisthidebots": "Sakrij izmjene botova sa spiska praćenih članaka",
"tog-watchlisthideminor": "Sakrij manje izmjene sa spiska praćenja",
"tog-watchlisthideliu": "Sakrij izmjene prijavljenih korisnika sa liste praćenja",
+ "tog-watchlistreloadautomatically": "Preučitavaj spisak praćenja kad god se izmijeni filter (potreban JavaScript)",
"tog-watchlisthideanons": "Sakrij izmjene anonimnih korisnika sa liste praćenja",
"tog-watchlisthidepatrolled": "Sakrij patrolirane izmjene sa spiska praćenja",
"tog-watchlisthidecategorization": "Sakrij kategorizaciju stranica",
"tog-ccmeonemails": "Pošalji mi kopije emailova koje šaljem drugim korisnicima",
"tog-diffonly": "Ne prikazuj sadržaj stranice ispod prikaza razlika",
"tog-showhiddencats": "Prikaži skrivene kategorije",
- "tog-norollbackdiff": "Nakon povrata zanemari prikaz razlika",
+ "tog-norollbackdiff": "Ne prikazuj razliku nakon izvršenog vraćanja",
"tog-useeditwarning": "Upozori me kad napuštam stranicu za uređivanje bez snimanja izmjena",
- "tog-prefershttps": "Uvijek koristi sigurnu vezu kod prijave",
+ "tog-prefershttps": "Uvijek koristi sigurnu vezu dok sam prijavljen",
"underline-always": "Uvijek",
"underline-never": "Nikad",
"underline-default": "prema skinu ili postavkama preglednika",
"newwindow": "(otvara se u novom prozoru)",
"cancel": "Otkaži",
"moredotdotdot": "Još...",
- "morenotlisted": "Ovaj spisak nije kompletan.",
- "mypage": "Moja stranica",
+ "morenotlisted": "Ovaj spisak možda nije potpun.",
+ "mypage": "Stranica",
"mytalk": "Razgovor",
"anontalk": "Razgovor",
"navigation": "Navigacija - Навигација",
"returnto": "Povratak na $1.",
"tagline": "Iz {{SITENAME}}",
"help": "Pomoć",
+ "help-mediawiki": "Pomoć o MediaWikiju",
"search": "Traži / Тражи",
"searchbutton": "Traži",
"go": "Idi / Иди",
"searcharticle": "Idi",
"history": "Historija stranice",
"history_short": "Historija",
+ "history_small": "historija",
"updatedmarker": "promjene od moje zadnje posjete",
"printableversion": "Verzija za ispis",
"permalink": "Trajni link",
"talk": "Razgovor",
"views": "Pregledi",
"toolbox": "Alati",
+ "tool-link-userrights": "Promijeni {{GENDER:$1|korisničke}} grupe",
+ "tool-link-userrights-readonly": "Vidi {{GENDER:$1|korisničke}} grupe",
+ "tool-link-emailuser": "Pošalji e-poruku {{GENDER:$1|korisniku|korisnici}}",
"imagepage": "Vidi stranicu datoteke/fajla",
"mediawikipage": "Pogledaj stranicu s porukom",
"templatepage": "Pogledajte stranicu sa šablonom",
"redirectedfrom": "(Preusmjereno sa $1)",
"redirectpagesub": "Preusmjeri stranicu",
"redirectto": "Preusmjerenje na:",
- "lastmodifiedat": "Ova stranica je posljednji put izmijenjena $1, $2.",
+ "lastmodifiedat": "Ova stranica je posljednji put izmijenjena $1 u $2.",
"viewcount": "Ovoj stranici je pristupljeno {{PLURAL:$1|$1 put|$1 puta}}.",
"protectedpage": "Zaštićena stranica",
"jumpto": "Skoči na:",
"jumptosearch": "pretraga",
"view-pool-error": "Žao nam je, serveri su trenutno preopterećeni.\nPreviše korisnika pokušava da pregleda ovu stranicu.\nMolimo pričekajte trenutak prije nego što ponovno pokušate pristupiti ovoj stranici.\n\n$1",
"generic-pool-error": "Žao nam je, serveri su trenutno preopterećeni.\nPreviše korisnika pokušava da pregleda ovu stranicu.\nMolimo pričekajte trenutak prije nego što ponovno pokušate pristupiti ovoj stranici.",
- "pool-timeout": "Zaustavi čekanje za zaključavanje",
+ "pool-timeout": "Istek vremena čeka na zaključavanje",
"pool-queuefull": "Red na pool je prenapunjen",
- "pool-errorunknown": "nepoznata greška",
+ "pool-errorunknown": "Nepoznata greška",
"pool-servererror": "Usluga brojača poola nije dostupna ($1).",
"poolcounter-usage-error": "Greška pri upotrebi: $1",
"aboutsite": "O projektu {{SITENAME}}",
"databaseerror-query": "Upit: $1",
"databaseerror-function": "Funkcija: $1",
"databaseerror-error": "Greška: $1",
+ "transaction-duration-limit-exceeded": "Da se izbjegne veliko zaostajanje replikacije, transakcija je prekinuta zato što je trajanje zapisivanja ($1) prekoračilo ograničenje od {{PLURAL:$2|jedne sekunde|$2 sekunde|$2 sekundi}}.\nAko mijenjate mnogo stavki odjednom, uradite to u više navrata.",
"laggedslavemode": "'''Upozorenje''': Stranica ne mora sadržavati posljednja ažuriranja.",
"readonly": "Baza podataka je zaključana",
"enterlockreason": "Unesite razlog za zaključavanje, uključujući procjenu vremena otključavanja",
- "readonlytext": "Baza je trenutno zaključana za nove unose i ostale izmjene, vjerovatno zbog rutinskog održavanja, posle čega će biti vraćena u uobičajeno stanje.\n\nAdministrator koji ju je zaključao je ponudio ovo objašnjenje: $1",
+ "readonlytext": "Baza je trenutno zaključana za nove unose i ostale izmjene, vjerovatno zbog rutinskog održavanja, posle čega će biti vraćena u uobičajeno stanje.\n\nSistemski administrator koji ju je zaključao je ponudio ovo objašnjenje: $1",
"missing-article": "U bazi podataka nije pronađen tekst stranice tražen pod nazivom \"$1\" $2.\n\nDo ovoga dolazi kada se prati premještaj ili historija linka za stranicu koja je pobrisana.\n\nU slučaju da se ne radi o gore navedenom, moguće je da ste pronašli grešku u programu.\nMolimo Vas da ovo prijavite [[Special:ListUsers/sysop|administratoru]] sa navođenjem tačne adrese stranice",
"missingarticle-rev": "(izmjena#: $1)",
"missingarticle-diff": "(razlika: $1, $2)",
"readonly_lag": "Baza podataka je zaključana dok se sekundarne baze podataka na serveru ne sastave sa glavnom.",
+ "nonwrite-api-promise-error": "HTTP-zaglavlje \"Promise-Non-Write-API-Action\" je poslano, ali je upućeno zapisnom modulu izvršnika.",
"internalerror": "Interna pogreška",
"internalerror_info": "Interna greška: $1",
"internalerror-fatal-exception": "Fatalna greška tipa \"$1\"",
- "filecopyerror": "Ne može se kopirati \"$1\" na \"$2\".",
+ "filecopyerror": "Ne mogu kopirati datoteku \"$1\" na \"$2\".",
"filerenameerror": "Ne mogu preimenovati datoteku \"$1\" u \"$2\".",
"filedeleteerror": "Ne može se izbrisati datoteka \"$1\".",
"directorycreateerror": "Nije moguće napraviti direktorijum \"$1\".",
"badarticleerror": "Ova akcija ne može biti izvršena na ovoj stranici.",
"cannotdelete": "Ne može se obrisati stranica ili datoteka \"$1\".\nMoguće je da ju je neko drugi već obrisao.",
"cannotdelete-title": "Brisanje stranice \"$1\" nije moguće",
+ "delete-scheduled": "Stranica \"$1\" je predviđena za brisanje.\nBudite strpljivi.",
"delete-hook-aborted": "Brisanje prekinuto softverskim priključkom (hook).\nNema obrazloženja ili poruke o grešci.",
"no-null-revision": "Nije se mogla stvoriti nova ništavna revizija za stranicu \"$1\"",
"badtitle": "Loš naslov",
"cascadeprotected": "Uređivanje ove stranice zabranjeno je jer se koristi u {{PLURAL:$1|sljedećoj stranici, koja je zaštićena|sljedećim stranicama, koje su zaštićene}} prenosivom zaštitom:\n$2",
"namespaceprotected": "Nemate dozvolu uređivati stranice imenskog prostora '''$1'''.",
"customcssprotected": "Nemate dozvolu za mijenjanje ove CSS stranice jer sadrži osobne postavke nekog drugog korisnika.",
+ "customjsonprotected": "Nemate dozvolu za mijenjanje ove JSON stranice jer sadrži osobne postavke nekog drugog korisnika.",
"customjsprotected": "Nemate dozvolu za mijenjanje ove JavaScript stranice jer sadrži osobne postavke nekog drugog korisnika.",
- "mycustomcssprotected": "Nemate ovlasti za uređivanje ove CSS stranice.",
+ "sitecssprotected": "Nemate dozvolu za mijenjanje ove CSS stranice jer to može utjecati na sve posjetitelje.",
+ "sitejsonprotected": "Nemate dozvolu za mijenjanje ove JSON stranice jer to može utjecati na sve posjetitelje.",
+ "sitejsprotected": "Nemate dozvolu za mijenjanje ove JavaScript stranice jer to može utjecati na sve posjetitelje.",
+ "mycustomcssprotected": "Nemate ovlasti za uređivanje ove kaskadne stilske stranice (CSS).",
+ "mycustomjsonprotected": "Nemate dozvolu da uređujete ovu stranicu sa JSONom.",
"mycustomjsprotected": "Nemate dozvolu da uređujete ovu stranicu sa JavaScriptom.",
"myprivateinfoprotected": "Nemate dozvolu da uređujete svoje privatne informacije.",
"mypreferencesprotected": "Nemate dozvolu da uređujete svoje postavke.",
"ns-specialprotected": "Posebne stranice se ne mogu uređivati.",
"titleprotected": "Naslov stranice je zaštićen od postavljanja od strane korisnika [[User:$1|$1]].\nKao razlog je naveden <em>$2</em>.",
"filereadonlyerror": "Ne mogu da izmenim datoteku „$1“ jer je riznica „$2“ u režimu za čitanje.\n\nAdministrator koji ju je zaključao ponudio je sledeće objašnjenje: „$3“.",
+ "invalidtitle": "Neispravan naslov",
"invalidtitle-knownnamespace": "Neispravan naslov s imenskim prostorom „$2“ i tekstom „$3“",
"invalidtitle-unknownnamespace": "Neispravan naslov s imenskim prostorom br. $1 i tekstom „$2“",
"exception-nologin": "Niste prijavljeni",
"exception-nologin-text": "Molimo prijavite se ako želite pristup ovoj stranici ili djelovanje.",
"exception-nologin-text-manual": "Molimo $1 da biste pristupili ovoj stranici ili radnji.",
- "virus-badscanner": "Loša konfiguracija: nepoznati anti-virus program: ''$1''",
+ "virus-badscanner": "Loša postavka: nepoznati provjeritelj za viruse: ''$1''",
"virus-scanfailed": "skeniranje nije uspjelo (code $1)",
"virus-unknownscanner": "nepoznati anti-virus program:",
"logouttext": "'''Sad ste odjavljeni.'''\n\nObratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste još uvijek prijavljeni, dok ne očistite keš svog preglednika.",
+ "cannotlogoutnow-title": "Odjava trenutno nije moguća",
+ "cannotlogoutnow-text": "Odjava nije moguća tijekom uporabe $1.",
"welcomeuser": "Dobro došli, $1!",
- "welcomecreation-msg": "Vaš korisnički račun je napravljen.\nNe zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].",
+ "welcomecreation-msg": "Vaš korisnički račun je napravljen.\nNe zaboravite izmijeniti vlastita [[Special:Preferences|{{SITENAME}} podešavanja]].",
"yourname": "Vaše korisničko ime / Ваше корисничко име",
"userlogin-yourname": "Korisničko ime",
"userlogin-yourname-ph": "Unesite svoje korisničko ime",
"createacct-yourpasswordagain-ph": "Unesite lozinku/zaporku ponovno",
"userlogin-remembermypassword": "Zapamti prijavu",
"userlogin-signwithsecure": "Koristite sigurnu vezu",
+ "cannotlogin-title": "Prijava nije moguća",
+ "cannotlogin-text": "Prijava nija moguća.",
+ "cannotloginnow-title": "Prijava trenutno nije moguća.",
+ "cannotloginnow-text": "Prijava nije moguća tijekom uporabe $1.",
+ "cannotcreateaccount-title": "Nije moguće stvoriti račune",
+ "cannotcreateaccount-text": "Direktno pravljenje računa nije omogućeno na ovom wikiju.",
"yourdomainname": "Vaš domen:",
"password-change-forbidden": "Ne možete da promenite lozinku na ovom vikiju.",
"externaldberror": "Došlo je do greške pri vanjskoj autorizaciji baze podataka ili vam nije dopušteno osvježavanje Vašeg vanjskog korisničkog računa.",
"login": "Prijava / Пријава",
+ "login-security": "Potvrdite svoj identitet",
"nav-login-createaccount": "Prijavi se / Registruj se",
"logout": "Odjava",
"userlogout": "Odjava / Одјава",
"userlogin-resetpassword-link": "Zaboravili ste lozinku?",
"userlogin-helplink2": "Pomoć pri prijavljivanju",
"userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.",
+ "userlogin-reauth": "Morate se ponovo prijaviti da biste potvrdili da ste {{GENDER:$1|$1}}.",
"userlogin-createanother": "Izradi drugi račun",
"createacct-emailrequired": "E-mail adresa",
"createacct-emailoptional": "E-mail adresa (opcionalno)",
"createacct-email-ph": "Unesite svoju E-mail adresu",
"createacct-another-email-ph": "Postavite E-mail adresu",
- "createaccountmail": "Koristite privremenu, slučajno stvorenu šifru/lozinku i pošaljite na navedenu adrеsu e-pošte",
+ "createaccountmail": "Daj privremenu nasumičnu lozinku i pošalji na navedenu adresu",
+ "createaccountmail-help": "Može se koristiti za stvaranje računa u tuđem imenu bez da se sazna lozinka.",
"createacct-realname": "Stvarno ime (opcionalno)",
"createacct-reason": "Razlog",
"createacct-reason-ph": "Zašto stvarate novi račun",
+ "createacct-reason-help": "Poruka koja se prikazuje u zapisniku stvaranja korisničkih računa",
"createacct-submit": "Stvorite svoj račun",
"createacct-another-submit": "Izradi račun",
+ "createacct-continue-submit": "Nastavi sa stvaranjem računa",
+ "createacct-another-continue-submit": "Nastavi sa stvaranjem računa",
"createacct-benefit-heading": "{{SITENAME}} se stvara od ljudi poput vas.",
"createacct-benefit-body1": "$1 {{PLURAL:$1|izmjena|izmjene}}",
"createacct-benefit-body2": "$1 {{PLURAL:$1|stranica|stranice|stranica}}",
"nocookiesnew": "Korisnički nalog je napravljen, ali niste prijavljeni.\n{{SITENAME}} koristi kolačiće (''cookies'') da bi se korisnici prijavili.\nVi ste onemogućili kolačiće na Vašem računaru.\nMolimo Vas da ih omogućite, a onda se prijavite sa svojim novim korisničkim imenom i šifrom.",
"nocookieslogin": "{{SITENAME}} koristi kolačiće (''cookies'') da bi se korisnici prijavili.\nVi ste onemogućili kolačiće na Vašem kompjuteru.\nMolimo Vas da ih omogućite i da pokušate ponovo sa prijavom.",
"nocookiesfornew": "Korisnički račun nije napravljen, jer nismo mogli da potvrdimo njegov izvor.\nProvjerite da li su cookies omogućeni, ponovo učitajte ovu stranicu i pokušajte ponovo.",
+ "createacct-loginerror": "Račun je uspješno napravljen, ali Vas nije bilo moguće automatski prijaviti. Pređite na [[Special:UserLogin|ručno prijavljivanje]].",
"noname": "Niste izabrali ispravno korisničko ime.",
- "loginsuccesstitle": "Prijavljivanje uspješno",
- "loginsuccess": "Trenutno ste prijavljeni na {{SITENAME}} kao \"$1\".",
- "nosuchuser": "Ne postoji korisnik sa imenom \"$1\".\nKorisnička imena razlikuju velika i mala slova.\nProvjerite vaše kucanje ili [[Special:CreateAccount|napravite novi korisnički račun]].",
+ "loginsuccesstitle": "Prijava uspješna",
+ "loginsuccess": "<strong>Trenutno ste prijavljeni na {{SITENAME}} kao \"$1\".</strong>",
+ "nosuchuser": "Ne postoji korisnik sa imenom \"$1\".\nKorisnička imena razlikuju velika i mala slova.\nProvjerite jeste li ga tačno upisali ili [[Special:CreateAccount|napravite novi korisnički račun]].",
"nosuchusershort": "Ne postoji korisnik sa imenom \"$1\".\nProvjerite da li ste dobro ukucali.",
"nouserspecified": "Morate izabrati korisničko ime.",
"login-userblocked": "Ovaj korisnik je blokiran. Prijava nije dozvoljena.",
"wrongpassword": "Šifra koju ste uneli je neodgovarajuće. Molimo, upišite je ponovo.\n\nШифра коју сте унели је неодговарајућа. Молимо, упишите је поново.",
- "wrongpasswordempty": "Unesena šifra je bila prazna.\nMolimo Vas da pokušate ponovno.",
+ "wrongpasswordempty": "Unesena lozinka je bila prazna.\nPokušajte ponovno.",
"passwordtooshort": "Lozinka mora imati najmanje {{PLURAL:$1|1 znak|$1 znakova}}.",
"passwordtoolong": "Šifre/lozinke/zaporke ne mogu biti duže od {{PLURAL:$1|jednog znaka|$1 znaka|$1 znakova}}.",
+ "passwordtoopopular": "Nije moguće koristiti često odabrane lozinke. Odaberite lozinku koju je teže pogoditi.",
+ "passwordinlargeblacklist": "Unesena zaporka je jedna od najčešće korištenih. Izaberite drugačiju.",
"password-name-match": "Vaša lozinka mora biti različita od Vašeg korisničkog imena.",
"password-login-forbidden": "Korištenje ovog korisničkog imena i lozinke je zabranjeo.",
"mailmypassword": "Resetiraj lozinku/zaporku",
"noemail": "Ne postoji adresa e-maila za korisnika \"$1\".",
"noemailcreate": "Morate da navedete valjanu e-mail adresu",
"passwordsent": "Nova šifra je poslata na e-mail adresu korisnika \"$1\".\nMolimo Vas da se prijavite pošto je primite.",
- "blocked-mailpassword": "Da bi se spriječila nedozvoljena akcija, Vašoj IP adresi je onemogućeno uređivanje stranica kao i mogućnost zahtijevanje nove šifre.",
+ "blocked-mailpassword": "Vaša IP adresa ima zabranu uređivanja. Da bi se spriječila zloupotreba, nije dopušteno povratak lozinke od nje.",
"eauthentsent": "Na navedenu adresu poslana je e-poruka s potvrdom.\nPrije nego što pošaljemo daljnje poruke, pratite uputstva s e-pošte da biste potvrdili da je račun zaista Vaš.",
"throttled-mailpassword": "Već Vam je poslan e-mail za promjenu šifre u {{PLURAL:$1|zadnjih sat vremena|zadnja $1 sata|zadnjih $1 sati}}.\nDa bi se spriječila zloupotreba, može se poslati samo jedan e-mail za promjenu šifre {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.",
"mailerror": "Greška pri slanju e-pošte: $1",
- "acct_creation_throttle_hit": "Posjetioci na ovoj wiki koji koriste Vašu IP adresu su već napravili {{PLURAL:$1|$1 račun|$1 računa}} u zadnjih nekoliko dana, što je najveći broj dopuštenih napravljenih računa za ovaj period.\nKao rezultat, posjetioci koji koriste ovu IP adresu ne mogu trenutno praviti više računa.",
+ "acct_creation_throttle_hit": "Posjetioci na ovoj wiki koji koriste Vašu IP adresu su već napravili {{PLURAL:$1|$1 račun|$1 računa}} u zadnjih $2, što je najveći broj dopuštenih napravljenih računa za ovaj period.\nKao rezultat, posjetioci koji koriste ovu IP adresu ne mogu trenutno praviti više računa.",
"emailauthenticated": "Vaša adresa e-pošte potvrđena je $2 u $3.",
"emailnotauthenticated": "Vaša adresa e-pošte još nije potvrđena.\nNijedna e-poruka neće biti poslana za bilo koju uslugu od sljedećih.",
"noemailprefs": "Unesite e-mail adresu za osposobljavanje slijedećih usluga.",
"createaccount-title": "Pravljenje korisničkog računa za {{SITENAME}}",
"createaccount-text": "Neko je napravio korisnički račun za vašu e-mail adresu na {{SITENAME}} ($4) sa imenom \"$2\", i sa šifrom \"$3\".\nTrebali biste se prijaviti i promjeniti šifru.\n\nMožete ignorisati ovu poruku, ako je korisnički račun napravljen greškom.",
"login-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
- "login-abort-generic": "Vaša prijava nije bila uspješna – Prekinuto",
+ "login-abort-generic": "Neuspješna prijava – Prekinuto",
"login-migrated-generic": "Vaš se korisnički račun preselio, te Vaše korisničko ime više ne postoji na ovom wikiju.",
"loginlanguagelabel": "Jezik: $1",
"suspicious-userlogout": "Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.",
"newpassword": "Nova šifra:",
"retypenew": "Ukucajte ponovo novu šifru:",
"resetpass_submit": "Odredi lozinku i prijavi se",
- "changepassword-success": "Vaša šifra je uspiješno promjenjena! Prijava u toku...",
- "changepassword-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
+ "changepassword-success": "Vaša lozinka je smijenjena!",
+ "changepassword-throttled": "Imate previše pokušaja prijave u kratkom vremenu.\nPričekajte $1 prije nego što pokušate ponovno.",
+ "botpasswords": "Botovske lozinke",
+ "botpasswords-summary": "<em>Lozinke botova</em> daju pristup korisničkom računu preko priložnika bez da se koriste podaci o prijavi glavnog računa. Korisnička prava mogla bi biti ograničena kada se prijavite na ovaj način.\n\nUkoliko ne znate kako bi Vam ovo poslužilo, vjerovatno to ne biste trebali raditi. Niko nikada ne treba od Vas tražiti da napravite ovakve lozinke i da mu ih date.",
+ "botpasswords-disabled": "Lozinke botova su onemogućene.",
+ "botpasswords-no-central-id": "Da biste koristili botovske lozinke, morate biti prijavljeni na središnji račun.",
+ "botpasswords-existing": "Postojeće lozinke botova",
+ "botpasswords-createnew": "Napravi novu lozinku bota",
+ "botpasswords-editexisting": "Promijeni postojeću lozinku bota",
+ "botpasswords-label-needsreset": "(lozinku treba resetovati)",
+ "botpasswords-label-appid": "Ime bota:",
+ "botpasswords-label-create": "Stvori",
+ "botpasswords-label-update": "Ažuriraj",
"botpasswords-label-cancel": "Otkaži",
+ "botpasswords-label-delete": "Izbriši",
+ "botpasswords-label-resetpassword": "Stavite novu lozinku",
+ "botpasswords-label-grants": "Primjenjive dozvole:",
"resetpass_forbidden": "Šifre ne mogu biti promjenjene",
"resetpass-no-info": "Morate biti prijavljeni da bi ste pristupili ovoj stranici direktno.",
"resetpass-submit-loggedin": "Promijeni lozinku",
"savechanges": "Sačuvaj - Сачувај",
"publishpage": "Objavi stranicu",
"publishchanges": "Objavi izmjene",
+ "savearticle-start": "Sačuvaj stranicu...",
+ "savechanges-start": "Spremi promjene...",
+ "publishpage-start": "Objavi stranicu...",
+ "publishchanges-start": "Objavi promjene…",
"preview": "Pregled",
"showpreview": "Prikaži pregled",
"showdiff": "Prikaži izmjene",
"anonpreviewwarning": "''Niste prijavljeni. Vaša IP adresa će biti zabilježena u historiji ove stranice.''",
"missingsummary": "'''Podsjećanje:''' Niste unijeli sažetak izmjene.\nAko kliknete na Sačuvaj/Snimi, Vaša izmjena će biti snimljena bez sažetka.",
"selfredirect": "<strong>Upozorenje:</strong> Preusmjeravate stranicu na samu sebe.\nMožda ste naveli pogrešan cilj preusmjeravanja ili ste uređivali pogrešnu stranicu.\nAko ponovno kliknete \"$1\", ipak će nastati preusmjerenje.",
- "missingcommenttext": "Molimo unesite komentar ispod.",
+ "missingcommenttext": "Molimo unesite komentar.",
"missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali temu za ovaj komentar.\nAko ponovo kliknete na \"$1\", vaša izmjena će biti sačuvana bez teme/naslova.",
"summary-preview": "Pretpregled sažetka:",
- "subject-preview": "Pretpregled teme:",
+ "subject-preview": "Pretpregled naslova:",
"previewerrortext": "Dogodila se greška prilikom prikazivanja vaših izmjena.",
"blockedtitle": "Korisnik je blokiran",
"blockedtext": "'''Vaše korisničko ime ili IP adresa je blokirana.'''\n\nBlokada izvršena od strane $1.\nDati razlog je slijedeći: ''$2''.\n\n*Početak blokade: $8\n*Kraj perioda blokade: $6\n*Ime blokiranog korisnika: $7\n\nMožete kontaktirati $1 ili nekog drugog [[{{MediaWiki:Grouppage-sysop}}|administratora]] da biste razgovarali o blokadi.\n\nNe možete koristiti opciju ''Pošalji e-mail korisniku'' osim ako niste unijeli e-mail adresu u [[Special:Preferences|Vaše postavke]].\nVaša trenutna IP adresa je $3, a oznaka blokade je #$5.\nMolimo Vas da navedete gornje podatke u zahtjevu za deblokadu.",
"userpage-userdoesnotexist-view": "Korisnički račun \"$1\" nije registrovan.",
"blocked-notice-logextract": "Ovaj korisnik je trenutno blokiran.\nPosljednje stavke evidencije blokiranja možete pogledati ispod:",
"clearyourcache": "'''Napomena:''' Nakon snimanja možda ćete trebate očistiti cache svog preglednika kako biste vidjeli promjene.\n* '''Firefox / Safari:''' držite ''Shift'' i pritisnite ''Reload'', ili pritisnite bilo ''Ctrl-F5'' ili ''Ctrl-R'' (''Command-R'' na Macu)\n* '''Google Chrome:''' pritisnite ''Ctrl-Shift-R'' (''Command-Shift-R'' na Macu)\n* '''Internet Explorer:''' držite ''Ctrl'' i kliknite ''Refresh'', ili pritisnite ''Ctrl-F5''\n* '''Opera:''' očistite međuspremnik u ''Tools → Preferences''",
- "usercssyoucanpreview": "'''Sugestija:''' Koristite 'Prikaži izgled' dugme da testirate svoj novi CSS prije nego što ga snimite.",
- "userjsyoucanpreview": "'''Sugestija:''' Koristite 'Prikaži izgled' dugme da testirate svoj novi JS prije nego što ga snimite.",
+ "usercssyoucanpreview": "'''Sugestija:''' Koristite dugme \"{{int:showpreview}}\" da testirate svoj novi CSS prije nego što sačuvate.",
+ "userjsonyoucanpreview": "'''Sugestija:''' Koristite dugme \"{{int:showpreview}}\" da testirate svoj novi JSON prije nego što sačuvate.",
+ "userjsyoucanpreview": "'''Sugestija:''' Koristite dugme \"{{int:showpreview}}\" da testirate svoj novi JavaScript prije nego što sačuvate.",
"usercsspreview": "'''Zapamtite ovo je samo izgled Vašeg CSS-a.'''\n'''Još uvijek nije snimljen!'''",
+ "userjsonpreview": "<strong>Zapamite da je ovo samo test/pretpregled postavljenosti Vašeg JSON-a.\nJoš uvijek nije snimljena!</strong>",
"userjspreview": "'''Zapamite da je ovo samo test/pretpregled Vaše JavaScript-e.'''\n'''Još uvijek nije snimljena!'''",
"sitecsspreview": "'''Zapamtite ovo je samo izgled Vašeg CSS-a.'''\n'''Još uvijek nije snimljen!'''",
+ "sitejsonpreview": "<strong>Zapamtite ovo je samo izgled ove postavljenosti JSON-a. Još uvijek nije snimljen!</strong>",
"sitejspreview": "'''Zapamtite ovo je samo izgled ovog koda JavaScripte.'''\n'''Još uvijek nije snimljen!'''",
- "userinvalidconfigtitle": "'''Upozorenje:''' Nema skina pod imenom \"$1\".\nUpamtite da korisničke .css i .js stranice koriste naslov s malim slovom, npr. {{ns:user}}:Foo/monobook.css umjesto {{ns:user}}:Foo/Monobook.css.",
+ "userinvalidconfigtitle": "<strong>Upozorenje:</strong> Nema skina pod imenom \"$1\".\nUpamtite da korisničke .css, .json i .js stranice koriste naslov s malim slovom, npr. {{ns:user}}:Foo/vector.css umjesto {{ns:user}}:Foo/Vector.css.",
"updated": "(Osvježeno)",
"note": "'''Napomena:'''",
"previewnote": "<strong>Ne zaboravite da je ovo samo pregled</strong>\nIzmjene stranice nisu još sačuvane!",
"continue-editing": "Idi na područje uređivanja",
"previewconflict": "Ovaj pretpregled reflektuje tekst u gornjem polju\nkako će izgledati ako pritisnete \"Snimi stranicu\".",
- "session_fail_preview": "'''Izvinjavamo se! Nismo mogli obraditi vašu izmjenu zbog gubitka podataka o prijavi. Molimo pokušajte ponovno. Ako i dalje ne bude radilo, pokušajte se [[Special:UserLogout|odjaviti]] i ponovno prijaviti.'''",
+ "session_fail_preview": "Nažalost, nisam mogao obraditi izmjenu zbog gubitka podataka o sesiji.\n\nMožda ste odjavljeni. <strong>Provjerite jeste li i dalje prijavljeni i pokušajte ponovno.<strong>\nAko se problem nastavi pojavljivati, [[Special:UserLogout|odjavite se]] i ponovno prijavite, te provjerite da preglednik dopušta kolačiće s ovog sajta.",
"session_fail_preview_html": "'''Žao nam je! Nismo mogli da obradimo vašu izmjenu zbog gubitka podataka.'''\n\n''Zbog toga što {{SITENAME}} ima omogućen izvorni HTML, predpregled je sakriven kao predostrožnost protiv JavaScript napada.''\n\n'''Ako ste pokušali da napravite pravu izmjenu, molimo pokušajte ponovo. Ako i dalje ne radi, pokušajte da se [[Special:UserLogout|odjavite]] i ponovo prijavite.'''",
"token_suffix_mismatch": "'''Vaša izmjena nije prihvaćena jer je Vaš web preglednik ubacio znakove interpunkcije u token uređivanja.'''\nIzmjena je odbačena da bi se spriječilo uništavanje teksta stranice.\nTo se događa ponekad kad korisite problematični anonimni proxy koji je baziran na web-u.",
"edit_form_incomplete": "'''Neki dijelovi uređivačkog obrasca nisu došli do servera; dvaput provjerite da su vaše izmjene nepromjenjene i pokušajte ponovno.'''",
"longpageerror": "'''Greška: tekst koji ste uneli je veličine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, što je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''\nStranica ne može biti sačuvana.",
"readonlywarning": "<strong>Upozorenje: baza podataka je zaključana radi održavanja, tako da trenutno nećete moći da sačuvate izmene.</strong>\nMožda biste želeli sačuvati tekst za kasnije u nekoj tekstualnoj datoteci.\n\nAdministrator koji je zaključao bazu dao je sledeće objašnjenje: $1",
"protectedpagewarning": "'''PAŽNJA: Ova stranica je zaključana tako da samo korisnici sa administratorskim privilegijama mogu da je mijenjaju.'''\nPosljednja stavka u registru je prikazana ispod kao referenca:",
- "semiprotectedpagewarning": "'''Pažnja:''' Ova stranica je zaključana tako da je samo registrovani korisnici mogu uređivati.\nPosljednja stavka registra je prikazana ispod kao referenca:",
- "cascadeprotectedwarning": "<strong>Upozorenje:</strong> Ova stranica je zaključana tako da je samo administratori mogu mijenjati, jer je ona uključena u {{PLURAL:$1|ovu, lančanu povezanu, zaštićenu stranicu|sljedeće, prenosivo povezane, zaštićene stranice}}:",
- "titleprotectedwarning": "'''UPOZORENJE: Ova stranica je zaključana tako da su potrebna [[Special:ListGroupRights|posebna prava]] da se ona napravi.'''\nPosljednja stavka registra je prikazana ispod kao referenca:",
+ "semiprotectedpagewarning": "<strong>Pažnja:</strong> Ova stranica je zaključana tako da je samo automatski potvrđeni korisnici mogu uređivati.\nPosljednja stavka registra je prikazana ispod kao referenca:",
+ "cascadeprotectedwarning": "<strong>Upozorenje:</strong> Ova stranica je zaključana tako da je samo korisnici sa [[Special:ListGroupRights|određenim pravima]] mogu mijenjati, jer je ona uključena u {{PLURAL:$1|sljedeću, prenosivo zaštićenu stranicu|sljedeće, prenosivo zaštićene stranice}}:",
+ "titleprotectedwarning": "<strong>Upozorenje: Ova stranica je zaključana tako da su potrebna [[Special:ListGroupRights|posebna prava]] da se ona napravi.</strong>\nPosljednja stavka registra je prikazana ispod kao referenca:",
"templatesused": "{{PLURAL:$1|Šablon|Šabloni}} koji su upotrebljeni na ovoj stranici:",
"templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} prikazani u ovom pregledu:",
"templatesusedsection": "{{PLURAL:$1|Šablon|Šabloni}} korišteni u ovoj sekciji:",
"permissionserrorstext-withaction": "Nemate dozvolu za $2, zbog {{PLURAL:$1|sljedećeg|sljedećih}} razloga:",
"contentmodelediterror": "Ne možete urediti ovu izmjenu jer je model sadržaja <code>$1</code>, a trenutni model sadržaja stranice je <code>$2</code>.",
"recreate-moveddeleted-warn": "'''Upozorenje: Postavljate stranicu koja je prethodno brisana.'''\n\nRazmotrite da li je nastavljanje uređivanja ove stranice u skladu s pravilima.\nOvdje je naveden registar brisanja i premještanja s obrazloženjem:",
- "moveddeleted-notice": "Ova stranica je obrisana.\nRegistar brisanja i premještanja stranice je prikazan ispod kao referenca.",
- "moveddeleted-notice-recent": "Žao nam je, ova stranica je izbrisana u prošla 24 sata. \nNiže je navedena evidencija brisanja i premještanja.",
+ "moveddeleted-notice": "Ova stranica je obrisana.\nRegistar brisanja, zaštite i premještanja stranice je prikazan ispod.",
+ "moveddeleted-notice-recent": "Žao nam je, ova stranica je nedavno izbrisana (u prošla 24 sata). \nNiže je navedena evidencija brisanja, zaštite i premještanja.",
"log-fulllog": "Vidi potpuni registar",
"edit-hook-aborted": "Izmjena je poništena putem interfejsa.\nNije ponuđeno nikakvo objašnjenje.",
"edit-gone-missing": "Stranica se nije mogla osvježiti.\nIzgleda da je obrisana.",
"postedit-confirmation-created": "Stranica je stvorena.",
"postedit-confirmation-restored": "Stranica je obnovljena.",
"postedit-confirmation-saved": "Vaša izmjena je snimljena.",
+ "postedit-confirmation-published": "Vaša izmjena je objavljena.",
"edit-already-exists": "Stranica nije mogla biti kreirana.\nIzgleda da već postoji.",
"defaultmessagetext": "Uobičajeni tekst poruke",
"content-failed-to-parse": "Ne mogu da raščlanim sadržaj tipa $2 za model $1: $3",
"invalid-content-data": "Neispravni podaci sadržaja",
"content-not-allowed-here": "Sadržaj modela „$1“ nije dozvoljen na stranici [[:$2]]",
"editwarning-warning": "Ako napustite ovu stranicu, izgubićete sve izmene koje ste napravili.\nAko ste prijavljeni, možete onemogućiti ovo upozorenje u svojim podešavanjima, u odeljku \"{{int:prefs-editing}}\".",
+ "editpage-invalidcontentmodel-title": "Sadržajni model nije podržan",
+ "editpage-invalidcontentmodel-text": "Sadržajni model \"$1\" nije podržan.",
"editpage-notsupportedcontentformat-title": "Format sadržaja nije podržan",
"editpage-notsupportedcontentformat-text": "Format sadržaja $1 nije podržan modelom sadržaja $2.",
+ "slot-name-main": "Glavna",
"content-model-wikitext": "wikitekst",
"content-model-text": "obični tekst",
"content-model-javascript": "JavaScript",
"content-model-css": "CSS",
"content-json-empty-object": "Prazan objekat",
"content-json-empty-array": "Prazan niz",
+ "deprecated-self-close-category": "Stranice s neispravnim samozatvorenim HTML oznakama",
+ "deprecated-self-close-category-desc": "Stranica sadrži neispravne samozatvorene HTML oznake, kao što su <code><b/></code> ili <code><span/></code>. Njihovo funkcioniranje uskoro će se promijeniti da bude u skladu sa specifikacijama za HTML5. Ovo znači da su zastarjeli i ne bi se trebali upotrebljavati u wikitekstu.",
"duplicate-args-warning": "<strong>Upozorenje:</strong> [[:$1]] poziva na [[:$2]] sa više od jedne vrijednosti za parametar \"$3\". Koristit će se samo posljednja navedena vrijednost.",
"duplicate-args-category": "Stranice sa istim argumentima kod poziva šablona",
"duplicate-args-category-desc": "Stranica sadrži pozive šablona koji koriste argumente dvojnike, kao što su <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ili <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"post-expand-template-argument-warning": "'''Upozorenje:''' Ova stranica sadrži najmanje jedan argument u šablonu koji ima preveliku veličinu.\nOvakvi argumenti se trebaju izbjegavati.",
"post-expand-template-argument-category": "Stranice koje sadrže nedostajuće argumente u šablonu",
"parser-template-loop-warning": "Otkrivena kružna greška u šablonu: [[$1]]",
+ "template-loop-category": "Stranice sa šablonskim petljama",
"parser-template-recursion-depth-warning": "Dubina uključivanja šablona prekoračena ($1)",
"language-converter-depth-warning": "Prekoračena granica dubine jezičkog pretvarača ($1)",
"node-count-exceeded-category": "Stranice sa prekoračenim brojem čvorova",
"page_first": "prva",
"page_last": "zadnja",
"histlegend": "Odabir razlika: označite radio dugme verzija za usporedbu i pritisnite enter ili dugme na dnu.<br />\nObjašnjenje: '''({{int:cur}})''' = razlika sa trenutnom verzijom,\n'''({{int:last}})''' = razlika sa prethodnom verzijom, '''{{int:minoreditletter}}''' = manja izmjena.",
- "history-fieldset-title": "Pretraga historije",
- "history-show-deleted": "Samo obrisane",
+ "history-fieldset-title": "Pretraga izmjena",
+ "history-show-deleted": "Samo obrisane izmjene",
"histfirst": "najstarije",
"histlast": "najnovije",
"historysize": "({{PLURAL:$1|1 bajt|$1 bajta|$1 bajtova}})",
"rev-suppressed-unhide-diff": "Jedna od izmjena ove razlike je '''sakrivena'''.\nDetalji se nalaze u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registru sakrivanja].\nIpak možete [$1 vidjeti ovu razliku] ako želite nastaviti.",
"rev-deleted-diff-view": "Izmjena ove stranice je '''obrisana'''.\nMožete je pogledati; više detalja možete naći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registru brisanja].",
"rev-suppressed-diff-view": "Izmena ove stranice je '''sakrivena'''.\nMožete je pogledati; više detalja možete naći u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registru sakrivanja].",
- "rev-delundel": "pokaži/sakrij",
+ "rev-delundel": "promijeni vidljivost",
"rev-showdeleted": "Pokaži",
"revisiondelete": "Obriši/vrati revizije",
- "revdelete-nooldid-title": "Nije unesena tačna revizija",
+ "revdelete-nooldid-title": "Nevažeća odredišna izmjena",
"revdelete-nooldid-text": "Niste odredili odredišnu verziju da se izvrši ova funkcija, ili ta verzija ne postoji, ili pokušavate sakriti trenutnu verziju.",
"revdelete-no-file": "Navedena datoteka ne postoji.",
"revdelete-show-file-confirm": "Da li ste sigurni da želite pogledati obrisanu reviziju datoteke \"<nowiki>$1</nowiki>\" od $2 u $3?",
"revdelete-unsuppress": "Ukloni ograničenja na vraćenim revizijama",
"revdelete-log": "Razlog:",
"revdelete-submit": "Primijeni na odabrane {{PLURAL:$1|izmjena|izmjene}}",
- "revdelete-success": "'''Vidljivost revizije uspješno postavljena.'''",
- "revdelete-failure": "'''Zapisnik vidljivosti nije mogao biti postavljen:'''\n$1",
- "logdelete-success": "'''Vidljivost evidencije uspješno postavljena.'''",
- "logdelete-failure": "'''Registar vidljivosti nije mogao biti postavljen:'''\n$1",
- "revdel-restore": "promijeni dostupnost",
+ "revdelete-success": "Vidljivost izmjene je ažurirana.",
+ "revdelete-failure": "Nije moguće ažurirati vidljivost izmjene:\n$1",
+ "logdelete-success": "Vidljivost evidencije postavljena.",
+ "logdelete-failure": "Registar vidljivosti nije mogao biti postavljen:\n$1",
+ "revdel-restore": "promijeni vidljivost",
"pagehist": "Historija stranice",
"deletedhist": "Izbrisana historija",
"revdelete-hide-current": "Greška pri sakrivanju stavke od $2, $1: ovo je trenutna revizija.\nNe može biti sakrivena.",
"mergehistory-empty": "Nema revizija za spajanje.",
"mergehistory-done": "$3 {{PLURAL:$3|revizija|revizije|revizija}} stranice $1 uspješno spojeno u [[:$2]].",
"mergehistory-fail": "Ne može se izvršiti spajanje historije, molimo provjerite opet stranicu i parametre vremena.",
+ "mergehistory-fail-bad-timestamp": "Vremenska oznaka je nevažeća.",
+ "mergehistory-fail-invalid-source": "Izvorna stranica nije važeća.",
+ "mergehistory-fail-invalid-dest": "Odredišna stranica je nevažeća.",
+ "mergehistory-fail-no-change": "Spajanje historije nije spojilo nijednu izmjenu. Provjerite stranicu i vremenski parametri.",
+ "mergehistory-fail-permission": "Nemate dopuštenje da spojite historiju.",
+ "mergehistory-fail-self-merge": "Izvorna i odredišna stranica su iste.",
+ "mergehistory-fail-timestamps-overlap": "Izvorne izmjene se preklapaju ili dolaze nakon odredišnih izmjena.",
"mergehistory-fail-toobig": "Ne može se izvršiti spajanje historije jer će se više premjestiti više od ograničenja od $1 {{PLURAL:$1|revizije|revizija}}.",
"mergehistory-no-source": "Izvorna stranica $1 ne postoji.",
"mergehistory-no-destination": "Odredišna stranica $1 ne postoji.",
"difference-multipage": "(Razlika između stranica)",
"lineno": "Linija $1:",
"compareselectedversions": "Uporedi označene verzije",
- "showhideselectedversions": "Pokaži/sakrij odabrane verzije",
+ "showhideselectedversions": "Promijeni vidljivost izabranih izmjena",
"editundo": "ukloni ovu izmjenu - уклони ову измену",
"diff-empty": "(nema razlike)",
"diff-multi-sameuser": "({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}} istog korisnika)",
"diff-multi-otherusers": "({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}} {{PLURAL:$2|jednog|$2}} korisnika)",
"diff-multi-manyusers": "({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}}) od strane {{PLURAL:$2|korisnika|korisnika}}",
+ "diff-paragraph-moved-tonew": "Pasus je premješten. Kliknite da pređete na njegovo novo mjesto.",
+ "diff-paragraph-moved-toold": "Pasus je premješten. Kliknite da pređete na njegovo staro mjesto.",
"difference-missing-revision": "Ne mogu da pronađem {{PLURAL:$2|jednu izmenu|$2 izmene|$2 izmena}} od ove razlike ($1).\n\nOvo se obično dešava kada pratite zastarjelu vezu do stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} evidenciji brisanja].",
- "searchresults": "Rezultati pretrage",
- "searchresults-title": "Rezultati pretrage za \"$1\"",
+ "searchresults": "Ishod pretrage",
+ "search-filter-title-prefix": "Traži stranice čiji naslov počinje s \"$1\"",
+ "search-filter-title-prefix-reset": "Pretraži sve stranice",
+ "searchresults-title": "Ishod pretrage za \"$1\"",
"titlematches": "Naslov članka odgovara",
"textmatches": "Tekst stranice odgovara",
"notextmatches": "Tekst stranice ne odgovara",
"nextn": "{{PLURAL:$1|slijedeći $1|slijedećih $1}}",
"prev-page": "prethodna stranica",
"next-page": "sljedeća stranica",
- "prevn-title": "{{PLURAL:$1|Prethodni $1 rezultat|Prethodna $1 rezultata|Prethodnih $1 rezultata}}",
- "nextn-title": "{{PLURAL:$1|Slijedeći $1 rezultat|Slijedeća $1 rezultata|Slijedećih $1 rezultata}}",
- "shown-title": "Pokaži $1 {{PLURAL:$1|rezultat|rezultata}} po stranici",
+ "prevn-title": "{{PLURAL:$1|Prethodna $1 stavka|Prethodne $1 stavke|Prethodnih $1 stavka}}",
+ "nextn-title": "{{PLURAL:$1|Slijedeća $1 stavka|Slijedeće $1 stavke|Slijedećih $1 stavka}}",
+ "shown-title": "Pokaži $1 {{PLURAL:$1|stavku|stavka}} po stranici",
"viewprevnext": "Pogledaj ($1 {{int:pipe-separator}} $2) ($3)",
"searchmenu-exists": "'''Postoji stranica pod nazivom \"[[:$1]]\" na ovoj wiki'''",
"searchmenu-new": "<strong>Napravi stranicu \"[[:$1]]\" na ovoj wiki!</strong> {{PLURAL:$2|0=|Pogledajte također straniu pronađenu vašom pretragom.|Pogledajte također i vaše rezultate pretrage.}}",
"searchprofile-advanced-tooltip": "Traži u ostalim imenskim prostorima",
"search-result-size": "$1 ({{PLURAL:$2|1 riječ|$2 riječi}})",
"search-result-category-size": "{{PLURAL:$1|1 član|$1 člana|$1 članova}} ({{PLURAL:$2|1 podkategorija|$2 podkategorije|$2 podkategorija}}, {{PLURAL:$3|1 datoteka|$3 datoteke|$3 datoteka}})",
- "search-redirect": "(preusmjeravanje $1)",
+ "search-redirect": "(preusmjerenje sa $1)",
"search-section": "(sekcija $1)",
"search-category": "(kategorija $1)",
"search-file-match": "(odgovara sadržaju datoteke)",
"search-suggest": "Da li ste mislili: $1",
- "search-rewritten": "Prikazuju se rezultati za $1. Umjesto toga pretraži $2.",
- "search-interwiki-caption": "Srodni projekti",
+ "search-rewritten": "Ishod iz $1. Umjesto toga pretraži $2.",
+ "search-interwiki-caption": "Ishod s bratskih projekata",
"search-interwiki-default": "Rezultati od $1:",
"search-interwiki-more": "(više)",
+ "search-interwiki-more-results": "više stavka",
"search-relatedarticle": "Povezano",
"searchrelated": "povezano",
"searchall": "sve",
- "showingresults": "Dole {{PLURAL:$1|je prikazan '''1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}} počev od '''$2'''.",
- "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
- "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1 - $2</strong> od <strong>$3</strong>}}",
- "search-nonefound": "Nisu pronađeni rezultati koji odgovaraju upitu.",
- "search-nonefound-thiswiki": "Nisu pronađeni rezultati koji odgovaraju upitu na ovom sajtu.",
+ "showingresults": "Dole {{PLURAL:$1|je prikazana <strong>1</strong> stavka|su prikazane <strong>$1</strong> stavke|je prikazano <strong>$1</strong> stavka}} počev od <strong>$2</strong>.",
+ "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazana <strong>1</strong> stavka|su prikazane <strong>$1</strong> stavke|je prikazano <strong>$1</strong> stavka}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
+ "search-showingresults": "{{PLURAL:$4|Stavka <strong>$1</strong> od <strong>$3</strong>|Stavke <strong>$1 - $2</strong> od <strong>$3</strong>}}",
+ "search-nonefound": "Nisu pronađene ishodne stavke koji odgovaraju upitu.",
+ "search-nonefound-thiswiki": "Nisu pronađene stavke koji odgovaraju upitu na ovom sajtu.",
"powersearch-legend": "Napredna pretraga",
"powersearch-ns": "Pretraga u imenskim prostorima:",
"powersearch-togglelabel": "Označi:",
"search-external": "Vanjska/spoljna pretraga",
"searchdisabled": "Pretraga teksta na ovoj Wiki je trenutno onemogućena.\nU međuvremenu možete pretraživati preko Googlea.\nUzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.",
"search-error": "Dogodila se pogreška prilikom pretraživanja: $1",
+ "search-warning": "Došlo je do upozorenja prilikom pretraživanja: $1",
"preferences": "Postavke",
"mypreferences": "Postavke",
"prefs-edits": "Broj izmjena:",
"prefs-skin": "Izgled (skin)",
"skin-preview": "Pregled",
"datedefault": "Bez preferenci",
- "prefs-labs": "Eksperimentalne mogućnosti",
+ "prefs-labs": "Probne mogućnosti",
"prefs-user-pages": "Korisničke stranice",
"prefs-personal": "Korisnički profil",
- "prefs-rc": "Podešavanje nedavnih izmjena",
+ "prefs-rc": "Nedavne izmjene",
"prefs-watchlist": "Lista praćenja",
"prefs-editwatchlist": "Uredi popis praćenja",
"prefs-editwatchlist-label": "Uredi unose na popisu praćenja:",
"prefs-editwatchlist-clear": "očisti listu praćenja",
"prefs-watchlist-days": "Broj dana za prikaz u spisku praćenja:",
"prefs-watchlist-days-max": "(najviše $1 {{PLURAL:$1|dan|dana}})",
- "prefs-watchlist-edits": "Najveći broj izmjena za prikaz u proširenom spisku praćenja:",
+ "prefs-watchlist-edits": "Najviše prikazanih izmjena na spisku praćenja:",
"prefs-watchlist-edits-max": "Maksimalni broj: 1000",
"prefs-watchlist-token": "Token spiska za praćenje:",
+ "prefs-watchlist-managetokens": "Upravljanje tokenima",
"prefs-misc": "Razno / Разно",
"prefs-resetpass": "Promijeni lozinku",
"prefs-changeemail": "Promijeni ili ukloni adresu e-pošte",
"stub-threshold-disabled": "Isključen/a",
"recentchangesdays": "Broj dana za prikaz u nedavnim izmjenama:",
"recentchangesdays-max": "(najviše $1 {{PLURAL:$1|dan|dana}})",
- "recentchangescount": "Broj uređivanja za prikaz po pretpostavkama:",
- "prefs-help-recentchangescount": "Ovo uključuje nedavne izmjene, historije stranice i registre.",
+ "recentchangescount": "Podrazumevani broj izmjena za prikaz u skorašnjim izmjenama, istorijama stranica i dnevnicima:",
+ "prefs-help-recentchangescount": "Najveći broj: 1000",
"prefs-help-watchlist-token2": "Ovo je tajni ključ prema sažetku Vašeg popisa praćenja. Svaki suradnik kojem je poznat, moći će čitati Vaš popis praćenih stranica. Ne dijelite ga ni s kim. [[Special:ResetTokens|Kliknite ovdje ako ga želite ponovo postaviti]].",
"savedprefs": "Vaša postavke su snimljene.",
- "savedrights": "Korisnička prava {{GENDER:$1|korisnika|korisnice}} su snimljena.",
+ "savedrights": "Korisnička prava {{GENDER:$1|$1}} su snimljena.",
"timezonelegend": "Vremenska zona / Временска зона",
"localtime": "Lokalno vrijeme:",
"timezoneuseserverdefault": "Koristi postavke wikija ($1)",
- "timezoneuseoffset": "Ostalo (odredi odstupanje)",
+ "timezoneuseoffset": "Ostalo (odredi odstupanje ispod)",
+ "timezone-useoffset-placeholder": "Primjerne vrednosti: „-07:00” ili „01:00”",
"servertime": "Vrijeme na serveru:",
"guesstimezone": "Popuni iz preglednika",
"timezoneregion-africa": "Afrika",
"timezoneregion-indian": "Indijski okean",
"timezoneregion-pacific": "Tihi okean",
"allowemail": "Dozvoli e-mail od ostalih korisnika",
+ "email-allow-new-users-label": "Dozvoli e-mail od potpuno novih korisnika",
+ "email-blacklist-label": "Zabrani e-mail od sljedećih korisnika:",
"prefs-searchoptions": "Pretraga",
"prefs-namespaces": "Imenski prostori",
"default": "standardno",
"prefs-files": "Datoteke",
"prefs-custom-css": "Prilagođeni CSS",
+ "prefs-custom-json": "Prilagođeni JSON",
"prefs-custom-js": "Prilagođeni JS",
- "prefs-common-config": "Zajednički CSS/JS za sve izglede (skinove):",
- "prefs-reset-intro": "Možete koristiti ovu stranicu da poništite Vaše postavke na ovom sajtu na pretpostavljene vrijednosti.\nOvo se ne može vratiti unazad.",
+ "prefs-common-config": "Zajednički CSS/JSON/JavaScript za sve izglede (skinove):",
+ "prefs-reset-intro": "Možete koristiti ovu stranicu da poništite Vaše postavke na ovom wikiju na pretpostavljene vrijednosti.\nOvo se ne može vratiti unazad.",
"prefs-emailconfirm-label": "E-mail potvrda:",
"youremail": "Vaša e-pošta / Ваша е-пошта*",
"username": "Ime {{GENDER:$1|korisnika|korisnice}}:",
"prefs-memberingroups": "{{GENDER:$2|Korisnik|Korisnica}} je član {{PLURAL:$1|grupe|grupâ}}:",
+ "group-membership-link-with-expiry": "$1 (do $2)",
"prefs-registration": "Vrijeme registracije:",
"yourrealname": "Vaše ime / Ваше име*",
"yourlanguage": "Jezik interfejsa / Језик интерфејса",
"prefs-help-email-others": "Također možete da odaberete da vas drugi kontaktiraju putem vaše korisničke stranice ili stranice za razgovor bez otkrivanja vašeg identiteta.",
"prefs-help-email-required": "Neophodno je navesti e-mail adresu.",
"prefs-info": "Osnovne informacije",
- "prefs-i18n": "Internacionalizacije",
+ "prefs-i18n": "Internacionalizacija",
"prefs-signature": "Potpis",
"prefs-dateformat": "Format datuma",
"prefs-timeoffset": "Vremenska razlika",
"prefs-advancedediting": "Opće opcije",
+ "prefs-developertools": "Razvojni alati",
"prefs-editor": "Uređivač",
"prefs-preview": "Pregled",
"prefs-advancedrc": "Napredne opcije",
"prefs-advancedwatchlist": "Napredne opcije",
"prefs-displayrc": "Postavke displeja",
"prefs-displaywatchlist": "Postavke prikaza",
+ "prefs-changesrc": "Prikazivanje izmjena",
+ "prefs-changeswatchlist": "Prikazivanje izmjena",
+ "prefs-pageswatchlist": "Praćene stranice",
"prefs-tokenwatchlist": "Žeton",
"prefs-diffs": "Razlike",
"prefs-help-prefershttps": "Ova mogućnost će stupiti na snagu kod vaše sljedeće prijave.",
"prefswarning-warning": "Napravili ste promjene u vašim postavkama koje još uvijek nisu sačuvane. Ako napustite ovu stranicu bez da pritisnete na \"$1\", postavke neće biti ažurirane.",
"prefs-tabs-navigation-hint": "Savjet: Možete koristi lijevu i desnu navigacijsku tipku kako biste se kretali između tabova u popisu tabova.",
- "userrights": "Postavke korisničkih prava",
- "userrights-lookup-user": "Menadžment korisničkih prava",
+ "userrights": "Korisnička prava",
+ "userrights-lookup-user": "Izaberite korisnika",
"userrights-user-editname": "Unesi korisničko ime:",
"editusergroup": "Učitaj korisničke grupe",
"editinguser": "Mijenjate korisnička prava {{GENDER:$1|korisnika|korisnice}} <strong>[[User:$1|$1]]</strong> $2",
- "userrights-editusergroup": "Uredi korisničke grupe",
- "saveusergroups": "Snimi korisničke grupe",
+ "viewinguserrights": "Pogled korisničkih prava {{GENDER:$1|korisnika|korisnice}} <strong>[[User:$1|$1]]</strong> $2",
+ "userrights-editusergroup": "Uredi {{GENDER:$1|korisničke}} grupe",
+ "userrights-viewusergroup": "Pregled {{GENDER:$1|korisničkih}} grupa",
+ "saveusergroups": "Snimi {{GENDER:$1|korisničke}} grupe",
"userrights-groupsmember": "Član:",
- "userrights-groupsmember-auto": "Uključeni član od:",
- "userrights-groups-help": "Možete promijeniti grupe kojima ovaj korisnik pripada:\n* Označeni kvadratić znači da je korisnik u toj grupi.\n* Neoznačen kvadratić znači da korisnik nije u toj grupi.\n* Oznaka * (zvjezdica) označava da Vi ne možete izbrisati ovu grupu ako je dodate i obrnutno.",
+ "userrights-groupsmember-auto": "Implicitan član od:",
+ "userrights-groups-help": "Možete promijeniti grupe kojima ovaj korisnik pripada:\n* Označeni kvadratić znači da je korisnik u toj grupi.\n* Neoznačen kvadratić znači da korisnik nije u toj grupi.\n* Zvjezdica (*) označava da ne možete izbrisati ovu grupu ako je dodate i obrnutno.\n* Taraba (#) označava da jedino možete odložiti vrijeme isteka članstva u ovoj grupi, ali ne možete ga ubrzati.",
"userrights-reason": "Razlog:",
"userrights-no-interwiki": "Nemate dopuštenja da uređujete korisnička prava na drugim wikijima.",
"userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalna baza.",
"userrights-changeable-col": "Grupe koje možete mijenjati",
"userrights-unchangeable-col": "Grupe koje ne možete mijenjati",
+ "userrights-expiry-current": "Ističe $1",
+ "userrights-expiry-none": "Ne ističe",
+ "userrights-expiry": "Ističe:",
+ "userrights-expiry-existing": "Postojeće vrijeme isticanja: $3, $2",
+ "userrights-expiry-othertime": "Drugo vrijeme:",
+ "userrights-invalid-expiry": "Vrijeme isticanja grupe \"$1\" nije ispravno.",
+ "userrights-expiry-in-past": "Vrijeme isticanja grupe \"$1\" je u prošlosti.",
+ "userrights-cannot-shorten-expiry": "Ne možete ubrzati istek članstva u grupi \"$1\". To mogu učiniti samo korisnici s dozvolom za dodavanje ili uklanjanje ove grupe.",
"userrights-conflict": "Sukob u izmjeni korisničkih prava! Molimo da razmotrite i potvrdite Vaše promjene.",
"group": "Grupa:",
"group-user": "Korisnici",
"group-autoconfirmed": "Potvrđeni korisnici",
"group-bot": "Botovi",
"group-sysop": "Administratori",
+ "group-interface-admin": "Administratori interfejsa",
"group-bureaucrat": "Birokrati",
"group-suppress": "Skrivači",
"group-all": "(svi)",
"group-autoconfirmed-member": "{{GENDER:$1|automatski potvrđen korisnik|automatski potvrđena korisnica|automatski potvrđen korisnik}}",
"group-bot-member": "{{GENDER:$1|bot}}",
"group-sysop-member": "{{GENDER:$1|administrator|administratorka|administrator}}",
+ "group-interface-admin-member": "{{GENDER:$1|administrator interfejsa|administratorica interfejsa}}",
"group-bureaucrat-member": "{{GENDER:$1|birokrat|birokratica|birokrat}}",
"group-suppress-member": "{{GENDER:$1|skrivač|skrivačica}}",
"grouppage-user": "{{ns:project}}:Korisnici",
"grouppage-autoconfirmed": "{{ns:project}}:Potvrđeni korisnici",
"grouppage-bot": "{{ns:project}}:Botovi",
"grouppage-sysop": "{{ns:project}}:Administratori",
+ "grouppage-interface-admin": "{{ns:project}}:Administratori interfejsa",
"grouppage-bureaucrat": "{{ns:project}}:Birokrati",
"grouppage-suppress": "{{ns:project}}:Skrivač",
"right-read": "Čitanje stranica",
"right-createpage": "Pravljenje stranica (ne uključujući stranice za razgovor)",
"right-createtalk": "Pravljenje stranica za razgovor",
"right-createaccount": "Pravljenje korisničkog računa",
+ "right-autocreateaccount": "Automatska prijava s vanjskim korisničkim računom",
"right-minoredit": "Označavanje izmjena kao malih",
"right-move": "Premještanje stranica",
"right-move-subpages": "Premještanje stranica sa svim podstranicama",
- "right-move-rootuserpages": "Premještanje stranica osnovnih korisnika",
+ "right-move-rootuserpages": "Premještanje osnovnih korisničkih stranica",
"right-move-categorypages": "Premještanje stranica kategorija",
"right-movefile": "Premještanje datoteka",
- "right-suppressredirect": "Ne pravi preusmjeravanje sa starog imena pri preusmjeravanju stranica",
+ "right-suppressredirect": "Ne pravi preusmjeravanje sa starog imena pri premještanju stranica",
"right-upload": "Postavljanje datoteka",
"right-reupload": "Postavljanje nove verzije datoteke",
"right-reupload-own": "Postavljanje nove verzije datoteke koju je postavio korisnik",
"right-editmyusercss": "Uredite svoje vlastite CSS datoteke",
"right-editmyuserjs": "Uredite vlastite korisničke JavaScript datoteke",
"right-viewmywatchlist": "Pregled vlastitog popisa praćenih stranica",
- "right-editmywatchlist": "Uredite vlastiti spisak praćenja. Obratite pažnju da će neke akcije dodati stranice čak bez ovog prava.",
- "right-viewmyprivateinfo": "Vidite svoje privatne podatke (npr. adresu e-pošte, stvarno ime)",
- "right-editmyprivateinfo": "Uredite svoje privatne podatke (npr. adresa e-pošte, stvarno ime)",
- "right-editmyoptions": "Uredite svoje postavke",
- "right-rollback": "Brzo vraćanje izmjena na zadnjeg korisnika koji je uređivao određenu stranicu",
+ "right-editmywatchlist": "Uređivanje vlastitih praćenih. Obratite pažnju da će neke akcije dodati stranice čak bez ovog prava.",
+ "right-viewmyprivateinfo": "Pregledanje vlastitih ličnih podataka (npr. adresa e-pošte, stvarno ime)",
+ "right-editmyprivateinfo": "Uređivanje vlastitih ličnih podataka (npr. adresa e-pošte, stvarno ime)",
+ "right-editmyoptions": "Uređivanje vlastitih postavki",
+ "right-rollback": "Brzo vraćanje izmjena posljednjeg korisnika koji je uređivao određenu stranicu",
"right-markbotedits": "Označavanje vraćenih izmjena kao izmjene bota",
"right-noratelimit": "Izbjegavanje ograničenja uzrokovanih brzinom",
"right-import": "Uvoz stranica iz drugih wikija",
"right-override-export-depth": "Izvoz stranica uključujući povezane stranice do dubine od 5 linkova",
"right-sendemail": "Slanje e-maila drugim korisnicima",
"right-managechangetags": "Pravljenje i (de)aktiviranje [[Special:Tags|oznaka]]",
- "right-applychangetags": "Primijeni [[Special:Tags|oznake]] na nečije izmjene",
+ "right-applychangetags": "Primjenjivanje [[Special:Tags|oznaka]] na nečije izmjene",
"right-changetags": "Dodavanje ili uklanjanje raznih [[Special:Tags|oznaka]] na pojedinačnim verzijama i unosima zapisnika",
+ "right-deletechangetags": "Brisanje [[Special:Tags|oznaka]] iz baze podataka",
+ "grant-generic": "Zbir prava \"$1\"",
+ "grant-group-page-interaction": "Interakcija sa stranicama",
+ "grant-group-file-interaction": "Interakcija sa slikama i snimkama",
+ "grant-group-watchlist-interaction": "Interakcija s praćenima",
+ "grant-group-email": "Slanje e-pošte",
+ "grant-group-high-volume": "Izvršavanje velikog broja radnji",
+ "grant-group-customization": "Prilagodbe i postavke",
+ "grant-group-administration": "Izvršavanje administrativnih radnji",
+ "grant-group-private-information": "Pristupanje vašim ličnim podacima",
+ "grant-group-other": "Razne aktivnosti",
+ "grant-blockusers": "Blokiranje i deblokiranje korisnika",
+ "grant-createaccount": "Stvaranje računa",
+ "grant-createeditmovepage": "Pravljenje, uređivanje i premještanje stranica",
+ "grant-delete": "Brisanje stranica, izmjena i unosa u zapisnicima",
"grant-editinterface": "Uređivanje imenskog prostora \"MediaWiki\" i JSON za cijelo wiki/za korisnika",
"grant-editmycssjs": "Uređivanje Vašeg korisničkog CSS/JSON/JavaScripta",
+ "grant-editmyoptions": "Uređivanje vaših korisničkih podešavanja i postavljenosti JSON-a",
+ "grant-editmywatchlist": "Uređivanje Vaših praćenih",
"grant-editsiteconfig": "Uređivanje CSS/JS za cijelo wiki i za korisnika",
+ "grant-editpage": "Uređivanje postojećih stranica",
+ "grant-editprotected": "Uređivanje zaštićenih stranica",
+ "grant-highvolume": "Veliki broj izmjena",
+ "grant-oversight": "Skrivanje korisnika i izmjena",
+ "grant-patrol": "Patroliranje izmjena stranica",
+ "grant-privateinfo": "Pristupanje ličnim podacima",
+ "grant-protect": "Dodavanje i uklanjanje zaštita sa stranica",
+ "grant-rollback": "Vraćanje izmjena na stranicama",
+ "grant-sendemail": "Slanje e-maila drugim korisnicima",
+ "grant-uploadeditmovefile": "Postavljanje, zamjena i premještanje datoteka",
+ "grant-uploadfile": "Postavljanje novih datoteka",
+ "grant-basic": "Osnovna prava",
+ "grant-viewdeleted": "Pregled obrisanih datoteka i stranica",
+ "grant-viewmywatchlist": "Pregled vaših praćenja",
+ "grant-viewrestrictedlogs": "Pregledanje ograničenih unosa u zapisniku",
"newuserlogpage": "Registar novih korisnika",
"newuserlogpagetext": "Ovo je evidencija registracije novih korisnika.",
"rightslog": "Evidencija korisničkih prava",
"rightslogtext": "Ovo je evidencija izmjene korisničkih prava.",
"action-read": "čitanje ove stranice",
"action-edit": "uređujete ovu stranicu",
- "action-createpage": "stvaranje stranica",
- "action-createtalk": "stvaranje stranica za razgovor",
+ "action-createpage": "stvaranje ove stranice",
+ "action-createtalk": "stvaranje ove stranice za razgovor",
"action-createaccount": "stvaranje ovog korisničkog računa",
+ "action-autocreateaccount": "automatski napravite ovaj vanjski korisnički račun",
"action-history": "gledate historiju ove stranice",
"action-minoredit": "označavanje ove izmjene kao manje",
"action-move": "premještanje ove stranice",
"action-move-subpages": "premještanje ove stranice, i njenih podstranica",
"action-move-rootuserpages": "premještanje osnovne stranice korisnika",
- "action-move-categorypages": "pomakni stranice kategorije",
+ "action-move-categorypages": "premještanje kategorije",
"action-movefile": "premjesti ovu datoteku",
"action-upload": "postavljate ovu datoteku",
"action-reupload": "postavljanje nove verzije datoteke",
"action-upload_by_url": "postavljanje ove datoteke preko URL adrese",
"action-writeapi": "korištenje ''write API'' opcije",
"action-delete": "brisanje ove stranice",
- "action-deleterevision": "brisanje ove izmjene",
+ "action-deleterevision": "brisanje izmjena",
+ "action-deletelogentry": "brisanje dnevničkih unosa",
"action-deletedhistory": "gledanje obrisane historije ove stranice",
+ "action-deletedtext": "pregled teksta obrisanih izmjena",
"action-browsearchive": "pretraživanje obrisanih stranica",
- "action-undelete": "vraćanje ove stranice",
- "action-suppressrevision": "pregledavanje i vraćanje ove skrivene izmjene",
+ "action-undelete": "vraćanje stranica",
+ "action-suppressrevision": "pregledavanje i vraćanje sakrivenih izmjena",
"action-suppressionlog": "gledanje ove privatne evidencije",
"action-block": "blokiranje uređivanja ovog korisnika",
"action-protect": "promijeniti nivo zaštite ove stranice",
"action-userrights-interwiki": "uređivanje korisničkih prava na drugim wikijima",
"action-siteadmin": "zaključavanje i otključavanje baze podataka",
"action-sendemail": "pošalji e-poštu",
- "action-editmywatchlist": "uredite svoj spisak praćenja",
- "action-viewmywatchlist": "pogledajte svoj spisak praćenja",
- "action-viewmyprivateinfo": "pogledajte svoje privatne informacije",
- "action-editmyprivateinfo": "uredite svoje privatne informacije",
- "action-editcontentmodel": "uredi model sadržaja stranice",
- "action-managechangetags": "napravite i uklonite oznake iz baze podataka",
+ "action-editmyoptions": "uređivanje vlastitih podešavanja",
+ "action-editmywatchlist": "uređivanje mojih praćenih",
+ "action-viewmywatchlist": "pregled vašeg spiska praćenja",
+ "action-viewmyprivateinfo": "pregled vaših ličnih podataka",
+ "action-editmyprivateinfo": "uređivanje vaših ličnih podataka",
+ "action-editcontentmodel": "uređivanje modela sadržaja stranice",
+ "action-managechangetags": "pravljenje ili (de)aktiviranje oznaka",
"action-applychangetags": "dodajte oznake uz vaše izmjene",
"action-changetags": "dodajte ili uklonite razne oznake na pojedinačnim verzijama i unosima u zapisnicima",
+ "action-deletechangetags": "brišete oznake iz baze podataka",
+ "action-purge": "preučitavanje ove stranice",
"nchanges": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmjena od Vaše posljedne posjete}}",
"enhancedrc-history": "historija",
"recentchanges-legend": "Postavke za Nedavne promjene",
"recentchanges-summary": "Na ovoj stranici možete pratiti nedavne izmjene.",
"recentchanges-noresult": "Bez promjena tokom cijelog perioda koji ispunjava ove kriterije.",
+ "recentchanges-timeout": "Ovo pretraživanje je isteklo. Probajte s drugačijm parametrima.",
+ "recentchanges-network": "Zbog tehničke greške nisam mogao učitati ishod. Ponovo učitajte stranicu.",
+ "recentchanges-notargetpage": "Iznad unesite stranicu da biste vidjeli promjene povezane s njom.",
"recentchanges-feed-description": "Praćenje nedavnih izmjena na ovom wikiju u ovom feedu.",
"recentchanges-label-newpage": "Ovom izmjenom je stvorena nova stranica",
"recentchanges-label-minor": "Ovo je manja izmjena",
"recentchanges-label-bot": "Ovu je izmjenu učinio bot",
- "recentchanges-label-unpatrolled": "Ova izmjena još nije patrolirana",
- "recentchanges-label-plusminus": "Veličina stranice promijenila se za ovoliko bajtova",
+ "recentchanges-label-unpatrolled": "Ova izmjena još nije ispatrolirana",
+ "recentchanges-label-plusminus": "Promjena veličine stranice u bajtovima",
"recentchanges-legend-heading": "<strong>Legenda:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (također pogledajte [[Special:NewPages|spisak novih stranica]])",
+ "recentchanges-submit": "Prikaži",
+ "rcfilters-tag-remove": "Ukloni '$1'",
+ "rcfilters-legend-heading": "<strong>Spisak skraćenica:</strong>",
+ "rcfilters-other-review-tools": "Drugi alati za pregled",
+ "rcfilters-group-results-by-page": "Grupni ishod po stranicama",
+ "rcfilters-activefilters": "Aktivni filteri",
+ "rcfilters-activefilters-hide": "Sakrij",
+ "rcfilters-activefilters-show": "Prikaži",
+ "rcfilters-activefilters-hide-tooltip": "Sakrij područje aktivnih filtara",
+ "rcfilters-activefilters-show-tooltip": "Prikaži područje aktivnih filtara",
+ "rcfilters-advancedfilters": "Napredni filteri",
+ "rcfilters-limit-title": "Stavki za prikaz",
+ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}, $2",
+ "rcfilters-date-popup-title": "Vremenski period za pretragu",
+ "rcfilters-days-title": "Nedavni dani",
+ "rcfilters-hours-title": "Nedavni sati",
+ "rcfilters-days-show-days": "{{PLURAL:$1|jedan dan|$1 dana}}",
+ "rcfilters-days-show-hours": "{{PLURAL:$1|jedan sat|$1 sata|$1 sati}}",
+ "rcfilters-highlighted-filters-list": "Istaknuto: $1",
+ "rcfilters-quickfilters": "Sačuvani filteri",
+ "rcfilters-quickfilters-placeholder-title": "Još nema sačuvanih filtera",
+ "rcfilters-quickfilters-placeholder-description": "Da biste sačuvali filterske psotavke kako biste ih koristili ponovo, kliknite ikonu notepad u području \"Aktivni filteri\" ispod.",
+ "rcfilters-savedqueries-defaultlabel": "Sačuvani filteri",
+ "rcfilters-savedqueries-rename": "Preimenuj",
+ "rcfilters-savedqueries-setdefault": "Postavi kao podrazumevano",
+ "rcfilters-savedqueries-unsetdefault": "Ukloni od podrazumevano",
+ "rcfilters-savedqueries-remove": "Izbriši",
+ "rcfilters-savedqueries-new-name-label": "Naziv",
+ "rcfilters-savedqueries-new-name-placeholder": "Opišite svrhu filtera",
+ "rcfilters-savedqueries-apply-label": "Napravi filter",
+ "rcfilters-savedqueries-apply-and-setdefault-label": "Napravi podrazumevani filter",
+ "rcfilters-savedqueries-cancel-label": "Otkaži",
+ "rcfilters-savedqueries-add-new-title": "Sačuvaj trenutne filterske postavke",
+ "rcfilters-savedqueries-already-saved": "Ovi filteri su već sačuvani. Promenite postavke da biste napravili novi sačuvan filter.",
+ "rcfilters-restore-default-filters": "Vrati podrazumevane filtere",
+ "rcfilters-clear-all-filters": "Očisti sve filtre",
+ "rcfilters-show-new-changes": "Pogl. najnovije izmjene",
+ "rcfilters-search-placeholder": "Filtriranje promene (koristite meni ili potražite za naziv filtera)",
+ "rcfilters-invalid-filter": "Nevažeći filter",
+ "rcfilters-empty-filter": "Nema aktivnih filtera. Prikazani su svi doprinosi.",
+ "rcfilters-filterlist-title": "Filteri",
+ "rcfilters-filterlist-whatsthis": "Kako ovo radi?",
+ "rcfilters-filterlist-feedbacklink": "Recite nam Vaše mišljenje o ovim filterskim alatkama",
+ "rcfilters-highlightbutton-title": "Istaćavanje ishoda",
+ "rcfilters-highlightmenu-title": "Izaberite boju",
+ "rcfilters-highlightmenu-help": "Izaberite boju da biste istaknuli ovo svojstvo",
+ "rcfilters-filterlist-noresults": "Nije pronađen nijedan filtar",
+ "rcfilters-noresults-conflict": "Nisam ništa našao jer su kriteriji pretrage sukobljeni.",
+ "rcfilters-state-message-subset": "Filter ne radi jer je njegov ishod već sadržan u {{PLURAL:$2|slijedećim sveobuhvatnijim filteru|slijedećim sveobuhvatnijim filterima}} (istaknite ga da biste ih raspoznali): $1",
+ "rcfilters-state-message-fullcoverage": "Odabir svih filtera u grupi isti je kao da niste odabrali nijedan, tako da ovaj filtar ne radi. Grupa uključuje: $1",
+ "rcfilters-filtergroup-authorship": "Autorstvo doprinosa",
+ "rcfilters-filter-editsbyself-label": "Vaše promjene",
+ "rcfilters-filter-editsbyself-description": "Vaši vlastiti doprinosi.",
+ "rcfilters-filter-editsbyother-label": "Tuđe promjene",
+ "rcfilters-filter-editsbyother-description": "Sve promjene osim Vaših.",
+ "rcfilters-filtergroup-userExpLevel": "Korisnička registracija i iskustvo",
+ "rcfilters-filter-user-experience-level-registered-label": "Registrirani",
+ "rcfilters-filter-user-experience-level-registered-description": "Prijavljeni urednici.",
+ "rcfilters-filter-user-experience-level-unregistered-label": "Neregistrirani",
+ "rcfilters-filter-user-experience-level-unregistered-description": "Urednici koji nisu prijavljeni.",
+ "rcfilters-filter-user-experience-level-newcomer-label": "Novajlije",
+ "rcfilters-filter-user-experience-level-newcomer-description": "Registrovani urednici koji imaju manje od 10 izmjena ili 4 dana aktivnosti.",
"rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
"rclistfrom": "Prikaži nove poruke od / Прикажи нове поруке од $3 $2",
"rcshowhideminor": "$1 male izmjene / мале измене",
"nrevisions": "$1 {{PLURAL:$1|revizija|revizije|revizija}}",
"nimagelinks": "Koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
"ntransclusions": "koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
- "specialpage-empty": "Ne postoje rezultati za ovaj izvještaj.",
+ "specialpage-empty": "Pretraživanje ovog izvještaja nije dalo ništa.",
"lonelypages": "Stranice - siročići",
"lonelypagestext": "Slijedeće stranice nemaju linkove na ostalim stranicama na ovoj {{SITENAME}}.",
"uncategorizedpages": "Nekategorisane stranice / Некатегорисане странице",
"undeletepagetext": "{{PLURAL:$1|Slijedeća $1 stranica je obrisana|Slijedeće $1 stranice su obrisane|Slijedećih $1 je obrisano}} ali su još uvijek u arhivi i mogu biti vraćene.\nArhiva moše biti periodično čišćena.",
"undelete-fieldset-title": "Vraćanje revizija",
"undeleteextrahelp": "Da vratite cijelu historiju članka, ostavite sve kutijice neoznačene i kliknite '''''{{int:undeletebtn}}'''''.\nDa bi izvršili selektivno vraćanje, odaberite kutijice koje odgovaraju revizijama koje želite vratiti, i kliknite '''''{{int:undeletebtn}}'''''.",
- "undeleterevisions": "izmjena {{PLURAL:$1|izbrisana|izbrisane|izbrisano}}",
+ "undeleterevisions": "$1 {{PLURAL:$1|izmjena je obrisana|izmjene su obrisane|izmjena je obrisano}}",
"undeletehistory": "Ako vratite stranicu, sve revizije će biti vraćene njenoj historiji.\nAko je nova stranica istog imena napravljena od brisanja, vraćene revizije će se pojaviti u njenoj ranijoj historiji.",
"undeleterevdel": "Vraćanje obrisanog se neće izvršiti ako bi rezultiralo da zaglavlje stranice ili revizija datoteke bude djelimično obrisano.\nU takvim slučajevima, morate ukloniti označene ili otkriti sakrivene najskorije obrisane revizije.",
"undeletehistorynoadmin": "Ova stranica je izbrisana. \nRazlog za brisanje se nalazi ispod u sažetku, zajedno sa detaljima korisnika koji su uređivali ovu stranicu prije brisanja. \nTekst izbrisane stranice je vidljiv samo administratorima.",
"move-page-legend": "Premjesti stranicu",
"movepagetext": "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.\nČlanak pod starim imenom će postati stranica koja preusmjerava na članak pod novim imenom. \nMožete automatski izmjeniti preusmjerenje do izvornog naslova.\nAko se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].\nDužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.\n\nImajte na umu da članak '''neće''' biti preusmjeren ukoliko već postoji članak pod imenom na koje namjeravate da preusmjerite osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.\nTo znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice;\nMolimo dobro razmislite prije nego što preimenujete stranicu.",
"movepagetext-noredirectfixer": "Koristeći obrazac ispod ćete preimenovati stranicu i premjestiti cijelu njenu historiju na novi naziv.\nStari naziv će postati preusmjerenje na novi naziv.\nMolimo provjerite da li postoje [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].\nVi ste za to odgovorni te morate provjeriti da li su linkovi ispravni i da li vode tamo gdje bi trebali.\n\nImajte na umu da stranica <strong>neće</strong> biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.\nOvo znali da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili a ne možete ponovo preimenovati postojeću stranicu.\n\n<strong>Napomena:</strong>\nImajte na umu da premještanje popularnog članka može biti\ndrastična i neočekivana promjena za korisnike; molimo budite sigurni da ste shvatili posljedice prije nego što nastavite.",
- "movepagetalktext": "Ako označite ovu kutijucu, pridružena stranica za razgovor će se automatski premjestiti na novi naslov, ukoliko ne-prazna stranica razgovor sa istim imenom već postoji. U tom slučaju ćete morati, ako želite, ručno premjestiti ili spojiti stranicu.",
+ "movepagetalktext": "Ako označite ovu kutijucu, pridružena stranica za razgovor će se automatski premjestiti na novi naslov, ukoliko ne-prazna stranica razgovor sa istim imenom već postoji. U tom slučaju ćete morati, ako želite, ručno premjestiti ili spojiti stranicu.\n\nU tom slučaju, morat ćete ručno premjestiti ili spojiti stranicu ako to želite.",
"moveuserpage-warning": "'''Upozorenje:''' Premještate korisničku stranicu. Molimo da zapamtite da će se samo stranica premjestiti a korisnik se ''neće'' preimenovati.",
"movecategorypage-warning": "<strong>Upozorenje:</strong> Premještate stranicu kategorije. Imajte na umu da će samo stranica biti premještena i da sve stranice u staroj kategoriji <em>neće</em> biti ponovo kategorirane u novu kategoriju.",
"movenologintext": "Morate se registrovati ili [[Special:Userlogin|prijaviti]] kako biste premjestili članak.<br>\nМорате се регистровати или [[Special:Userlogin|пријавити]] како бисте преместили чланак.",
"authmanager-create-no-primary": "Navedenih poverilnic ne moremo uporabiti za ustvarjanje računa.",
"authmanager-link-no-primary": "Navedenih poverilnic ne moremo uporabiti za povezovanje računa.",
"authmanager-link-not-in-progress": "Povezovanje računa ni v teku ali pa smo izgubili podatke seje. Prosimo, pričnite znova od začetka.",
- "authmanager-authplugin-setpass-failed-title": "Sprememba gesla je spodletela",
- "authmanager-authplugin-setpass-failed-message": "Vtičnik za overitev je zavrnil spremembo gesla.",
- "authmanager-authplugin-create-fail": "Vtičnik za overitev je zavrnil ustvarjanje računa.",
- "authmanager-authplugin-setpass-denied": "Vtičnik za overitev ne dovoljuje spreminjanje gesel.",
- "authmanager-authplugin-setpass-bad-domain": "Neveljavna domena.",
"authmanager-autocreate-noperm": "Samodejno ustvarjanje računov ni dovoljeno.",
"authmanager-autocreate-exception": "Samodejno ustvarjanje računov smo začasno onemogočili zaradi predhodnih napak.",
"authmanager-userdoesnotexist": "Uporabniški račun »$1« ni registriran.",
"passwordpolicies-policy-maximalpasswordlength": "Geslo ne sme biti daljše od $1 {{PLURAL:$1|znak|znaka|znake|znakov}}",
"passwordpolicies-policy-passwordcannotbepopular": "Geslo ne sme biti {{PLURAL:$1|1=popularno geslo|na seznamu $1 popularnih gesel}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "Geslo ne more biti na seznamu 100.000 najpogosteje uporabljenih gesel.",
+ "passwordpolicies-policyflag-forcechange": "treba spremeniti ob prijavi",
"easydeflate-invaliddeflate": "Dana vsebina ni pravilno stisnjena",
"unprotected-js": "Iz varnostnih razlogov JavaScripta ni možno naložiti z nezaščitenih strani. Prosimo, da JavaScript ustvarite samo v imenskem prostoru MediaWiki ali kot uporabniško podstran."
}
"authmanager-create-no-primary": "Kredencialet e dhëna nuk mund të përdoreshin për krijim të llogarisë.",
"authmanager-link-no-primary": "Kredencialet e dhëna nuk mund të përdoreshin për lidhje të llogarive.",
"authmanager-link-not-in-progress": "Lidhja e llogarive nuk është në progres ose të dhënat e sesionit janë humbur. Ju lutem filloni nga fillimi.",
- "authmanager-authplugin-setpass-failed-title": "Ndryshimi i fjalëkalimit dështoi",
- "authmanager-authplugin-setpass-failed-message": "Plugin-i i autentikimit mohoi ndërrimin e fjalëkalimit.",
- "authmanager-authplugin-create-fail": "Plugin-i i autentikimit mohoi krijimin e llogarisë.",
- "authmanager-authplugin-setpass-denied": "Plugin-i i autentikimit nuk lejon ndërrimin e fjalëkalimeve.",
- "authmanager-authplugin-setpass-bad-domain": "Domen i pavlefshëm.",
"authmanager-autocreate-noperm": "Krijimi automatik i llogarive nuk lejohet.",
"authmanager-autocreate-exception": "Krijimi automatik i llogarive përkohësisht i pamundësuar për shkak të gabimeve.",
"authmanager-userdoesnotexist": "Llogaria e përdoruesit \"$1\" nuk është e regjistruar.",
"tog-watchlisthidebots": "Сакривај измене ботова са списка надгледања",
"tog-watchlisthideminor": "Сакривај мање измене са списка надгледања",
"tog-watchlisthideliu": "Сакривај измене пријављених корисника са списка надгледања",
- "tog-watchlistreloadautomatically": "Аутоматски поново учитај списак надгледања кад год се филтер промени (потребан JavaScript)",
- "tog-watchlistunwatchlinks": "Додај означиваче за прекид надгледања/нагледање ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) на надгледане странице са променама (за функционалност пребацивања је потребан JavaScript)",
+ "tog-watchlistreloadautomatically": "Аутоматски поново учитај списак надгледања кад год се филтер промени (потребан јаваскрипт)",
+ "tog-watchlistunwatchlinks": "Додај означиваче за прекид надгледања/нагледање ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) на надгледане странице са променама (за функционалност пребацивања је потребан јаваскрипт)",
"tog-watchlisthideanons": "Сакривај измене анонимних корисника са списка надгледања",
"tog-watchlisthidepatrolled": "Сакривај патролиране измене са списка надгледања",
"tog-watchlisthidecategorization": "Сакривај категоризацију страница",
"viewdeleted": "Приказати $1?",
"restorelink": "{{PLURAL:$1|једну избрисану измену|$1 избрисане измене|$1 избрисаних измена}}",
"feedlinks": "Фид:",
- "feed-invalid": "Ð\9dеважеÑ\9bи Ñ\82ип пÑ\80иÑ\98аве на Ñ\84ид.",
+ "feed-invalid": "Ð\9dеважеÑ\9bа вÑ\80Ñ\81Ñ\82а пÑ\80иÑ\98аве на довод.",
"feed-unavailable": "Фидови синдикације нису доступни",
"site-rss-feed": "$1 – RSS фид",
"site-atom-feed": "$1 – Atom фид",
"nstab-category": "Категорија",
"mainpage-nstab": "Главна страна",
"nosuchaction": "Нема такве радње",
- "nosuchactiontext": "Радња која је наведена у URL адреси није важећа.\nМожда сте откуцали погрешан URL-а или сте пратили покварену везу.\nОво такође може да указује на грешку у софтверу који користи {{SITENAME}}.",
+ "nosuchactiontext": "Радња која је наведена у УРЛ-у није важећа.\nМожда сте погрешно откуцали УРЛ или сте следили покварену везу.\nОво такође може да указује на грешку у софтверу који користи {{SITENAME}}.",
"nosuchspecialpage": "Нема такве посебне странице",
"nospecialpagetext": "<strong>Захтевали сте невалидну посебну страницу.</strong>\n\nСписак валидних посебних страница може да се пронађе на „[[Special:SpecialPages|{{int:specialpages}}]]”.",
"error": "Грешка",
"readonly_lag": "База података је аутоматски закључана да би се секундарни сервери базе података ускладили с главним.",
"internalerror": "Унутрашња грешка",
"internalerror_info": "Унутрашња грешка: $1",
- "internalerror-fatal-exception": "Грешка необрађеног изузетка типа „$1“",
+ "internalerror-fatal-exception": "Грешка необрађеног изузетка врсте „$1”",
"filecopyerror": "Није могуће копирати датотеку „$1” у „$2”.",
"filerenameerror": "Није могуће преименовати датотеку „$1” у „$2”.",
"filedeleteerror": "Није могуће избрисати датотеку „$1”.",
"translateinterface": "Да бисте додали или променили преводе за све викије, посетите [https://translatewiki.net/ translatewiki.net], пројекат за локализацију Медијавикија.",
"cascadeprotected": "Ова страница је закључана јер садржи {{PLURAL:$1|следећу страницу која је заштићена|следеће странице које су заштићене}} „преносивом“ заштитом:\n$2",
"namespaceprotected": "Немате дозволу да уређујете странице у именском простору: <strong>$1</strong>.",
- "customcssprotected": "Немате дозволу да мењате ову CSS страницу јер садржи лична подешавања другог корисника.",
- "customjsonprotected": "Немате дозволу да мењате ову JSON страницу зато што садржи лична подешавања другог корисника.",
- "customjsprotected": "Немате дозволу да мењате ову JavaScript страницу јер садржи лична подешавања другог корисника.",
- "sitecssprotected": "Немате дозволу да мењате ову CSS страницу зато што може утицати на све посетиоце.",
- "sitejsonprotected": "Немате дозволу да мењате ову JSON страницу зато што може утицати на све посетиоце.",
- "sitejsprotected": "Немате дозволу да мењате ову JavaScript страницу зато што може утицати на све посетиоце.",
- "mycustomcssprotected": "Немате дозволу да уређујете ову CSS страницу.",
- "mycustomjsonprotected": "Немате дозволу да уређујете ову JSON страницу.",
- "mycustomjsprotected": "Ð\9dемаÑ\82е дозволÑ\83 да Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98еÑ\82е овÑ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ñ\81 Ñ\98аваÑ\81кÑ\80ипÑ\82ом.",
+ "customcssprotected": "Немате дозволу да мењате ову Це-Ес-Ес страницу јер садржи лична подешавања другог корисника.",
+ "customjsonprotected": "Немате дозволу да мењате ову ЈСОН страницу зато што садржи лична подешавања другог корисника.",
+ "customjsprotected": "Немате дозволу да мењате ову јаваскрипт страницу јер садржи лична подешавања другог корисника.",
+ "sitecssprotected": "Немате дозволу да мењате ову Це-Ес-Ес страницу зато што може утицати на све посетиоце.",
+ "sitejsonprotected": "Немате дозволу да мењате ову ЈСОН страницу зато што може утицати на све посетиоце.",
+ "sitejsprotected": "Немате дозволу да мењате ову јаваскрипт страницу зато што може утицати на све посетиоце.",
+ "mycustomcssprotected": "Немате дозволу да уређујете ову Це-Ес-Ес страницу.",
+ "mycustomjsonprotected": "Немате дозволу да уређујете ову ЈСОН страницу.",
+ "mycustomjsprotected": "Ð\9dемаÑ\82е дозволÑ\83 да Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98еÑ\82е овÑ\83 Ñ\98аваÑ\81кÑ\80ипÑ\82 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83.",
"myprivateinfoprotected": "Немате дозволу да уређујете своје приватне информације.",
"mypreferencesprotected": "Немате дозволу да уређујете своја подешавања.",
"ns-specialprotected": "Није могуће уређивати посебне странице.",
"userlogin-reauth": "Морате да се поново пријавите да бисте верификовали да сте {{GENDER:$1|$1}}.",
"userlogin-createanother": "Отвори још један налог",
"createacct-emailrequired": "Адреса е-поште",
- "createacct-emailoptional": "Ð\90дÑ\80еÑ\81а е-поÑ\88Ñ\82е (опÑ\86ионално)",
+ "createacct-emailoptional": "Ð\90дÑ\80еÑ\81а е-поÑ\88Ñ\82е (необавезно)",
"createacct-email-ph": "Унесите адресу е-поште",
"createacct-another-email-ph": "Унесите адресу е-поште",
"createaccountmail": "Користи привремену, насумичну лозинку и пошаљи је на наведену адресу е-поште",
"passwordtooshort": "Лозинка мора имати најмање {{PLURAL:$1|један знак|$1 знака|$1 знакова}}.",
"passwordtoolong": "Лозинке не могу бити дуже од {{PLURAL:$1|$1 знака|$1 знакова}}.",
"passwordtoopopular": "Није могуће користити често одабране лозинке. Одаберите лозинку коју је теже погодити.",
- "passwordinlargeblacklist": "Унесена лозинка је на листи веома често коришћених лозинки. Одаберите јединственију лозинку.",
+ "passwordinlargeblacklist": "Унесена лозинка је на списку веома често коришћених лозинки. Одаберите јединственију лозинку.",
"password-name-match": "Лозинка се мора разликовати од корисничког имена.",
"password-login-forbidden": "Коришћење овог корисничког имена и лозинке је забрањено.",
"mailmypassword": "Ресетуј лозинку",
"eauthentsent": "Е-порука о потврди је послата на наведену адресу е-поште.\nПре било којих других слања е-порука на налог, мораћете пратити упутства у е-поруци да бисте потврдили да је налог заиста ваш.",
"throttled-mailpassword": "Порука за промену лозинке је послата у {{PLURAL:$1|1=последњих сат времена|последња $1 сата|последњих $1 сати}}.\nДа бисмо спречили злоупотребу, подсетник шаљемо само једном у року од {{PLURAL:$1|1=сат времена|$1 сата|$1 сати}}.",
"mailerror": "Грешка при слању поруке: $1",
- "acct_creation_throttle_hit": "Посетиоци овог викија који користе вашу IP адресу су отворили {{PLURAL:$1|1=један налог|$1 налога}} у претходних $2, што је највећа дозвољена вредност у овом временском периоду.\nКао резултат тога, ти посетиоци тренутно не могу отварати више налога.",
+ "acct_creation_throttle_hit": "Посетиоци овог викија који користе вашу Ај-Пи адресу су отворили {{PLURAL:$1|1=један налог|$1 налога}} у претходних $2, што је највећа дозвољена вредност у овом временском периоду.\nКао резултат тога, ти посетиоци тренутно не могу отварати више налога.",
"emailauthenticated": "Ваша адреса е-поште је потврђена на дан $2 у $3 ч.",
"emailnotauthenticated": "Ваша адреса е-поште још није потврђена.\nНиједна е-порука неће бити послата ни у једном од следећих случајева.",
"noemailprefs": "Наведите адресу е-поште у подешавањима за оспособљавање ових функција.",
"login-migrated-generic": "Ваш налог је мигриран. Ваше корисничко више не постоји на овом викију.",
"loginlanguagelabel": "Језик: $1",
"suspicious-userlogout": "Ваш захтев за одјаву је одбијен јер изгледа да га је послао покварени прегледач или кеширани прокси.",
- "createacct-another-realname-tip": "Ð\9fÑ\80аво име Ñ\98е опÑ\86ионално.\nÐ\90ко одабеÑ\80еÑ\82е да га наведете, биће коришћено за приписивање вашег рада.",
+ "createacct-another-realname-tip": "Ð\9fÑ\80аво име Ñ\98е необавезно.\nÐ\90ко одабеÑ\80еÑ\82е да га пÑ\80Ñ\83жите, биће коришћено за приписивање вашег рада.",
"pt-login": "Пријава",
"pt-login-button": "Пријави ме",
"pt-login-continue-button": "Настави пријављивање",
"loginreqlink": "Пријавите се",
"loginreqpagetext": "$1 да бисте видели друге странице.",
"accmailtitle": "Лозинка је послата.",
- "accmailtext": "Насумично генерисана лозинка за корисника [[User talk:$1|$1]] послата је на $2. Након пријаве, лозинка може да се промени на страници <em>[[Special:ChangePassword|Промена лозинке]]</em>.",
+ "accmailtext": "Насумично створена лозинка за корисника [[User talk:$1|$1]] послата је на $2. Након пријаве, лозинка може да се промени на страници <em>[[Special:ChangePassword|Промена лозинке]]</em>.",
"newarticle": "(нови)",
"newarticletext": "Дошли сте на страницу која још не постоји.\nДа бисте је направили, почните да куцате у прозор испод овог текста (погледајте [$1 страницу за помоћ]).\nАко сте овде дошли грешком, вратите се на претходну страницу.",
"anontalkpagetext": "----\n<em>Ово је страница за разговор с анонимним корисником који још нема налог или га не користи.</em>\nЗбог тога морамо да користимо бројчану IP адресу како бисмо га препознали.\nТакву адресу може делити више корисника.\nАко сте анонимни корисник и мислите да су вам упућене примедбе, [[Special:CreateAccount|отворите налог]] или се [[Special:UserLogin|пријавите]] да бисте избегли будућу забуну с осталим анонимним корисницима.",
"userpage-userdoesnotexist": "Кориснички налог „<nowiki>$1</nowiki>” није регистрован.\nРазмислите желите ли заиста да направите/уредите ову страницу.",
"userpage-userdoesnotexist-view": "Кориснички налог „$1“ није отворен.",
"blocked-notice-logextract": "Овај корисник је тренутно блокиран.\nНајновији унос у дневнику блокирања је наведен испод као референца:",
- "clearyourcache": "<strong>Ð\9dапомена:</strong> Ð\9dакон Ñ\87Ñ\83ваÑ\9aа, можда Ñ\9bеÑ\82е моÑ\80аÑ\82и да обÑ\80иÑ\88еÑ\82е кеÑ\88 пÑ\80егледаÑ\87а како биÑ\81Ñ\82е видели пÑ\80омене.\n* <strong>ФаÑ\98еÑ\80Ñ\84окÑ\81 / СаÑ\84аÑ\80и:</strong> Ð\94Ñ\80жиÑ\82е <em>Shift</em> и кликниÑ\82е на <em>Ð\9eÑ\81вежи</em> или пÑ\80иÑ\82иÑ\81ниÑ\82е <em>Ctrl-F5</em> или <em>Ctrl-R</em> (<em>â\8c\98-R</em> на Ð\9cекÑ\83)\n* <strong>Ð\93Ñ\83гл кÑ\80оÑ\83м:</strong> Ð\9fÑ\80иÑ\82иÑ\81ниÑ\82е <em>Ctrl-Shift-R</em> (<em>â\8c\98-Shift-R</em> на Ð\9cекÑ\83)\n* <strong>Ð\98нÑ\82еÑ\80неÑ\82 екÑ\81плоÑ\80еÑ\80:</strong> Ð\94Ñ\80жиÑ\82е <em>Ctrl</em> и кликниÑ\82е на <em>Ð\9eÑ\81вежи</em> или пÑ\80иÑ\82иÑ\81ниÑ\82е <em>Ctrl-F5</em>\n* <strong>Ð\9eпеÑ\80а:</strong> Ð\98диÑ\82е на <em>Ð\90лаÑ\82ке â\86\92 Ð\9fодеÑ\88аваÑ\9aа</em> (<em>Ð\9eпеÑ\80а â\86\92 Ð\9fодеÑ\88аваÑ\9aа</em> на Ð\9cеку) и затим <em>Приватност и безбедност → Очистите податке о прегледима → Кеширане слике и датотеке</em>.",
- "usercssyoucanpreview": "<strong>СавеÑ\82:<strong> Ð\9aоÑ\80иÑ\81иÑ\82иÑ\82е дÑ\83гме â\80\9e{{int:showpreview}}â\80\9c да иÑ\81пÑ\80обаÑ\82е Ñ\81воÑ\98 нови CSS пре него што га сачувате.",
- "userjsonyoucanpreview": "<strong>Савет:</strong> Користите дугме \"{{int:showpreview}}\" да испробате свој нови JSON пре него што га сачувате.",
- "userjsyoucanpreview": "<strong>СавеÑ\82:</strong> Ð\9aоÑ\80иÑ\81иÑ\82иÑ\82е дÑ\83гме â\80\9e{{int:showpreview}}â\80\9c да иÑ\81пÑ\80обаÑ\82е Ñ\81воÑ\98 нови јаваскрипт пре него што га сачувате.",
- "usercsspreview": "<strong>Ð\9eво Ñ\98е Ñ\81амо пÑ\80еглед CSS-а.\nСÑ\82Ñ\80аниÑ\86а Ñ\98оÑ\88 ниÑ\98е Ñ\81аÑ\87Ñ\83вана!</strong>",
- "userjsonpreview": "<strong>Ð\97апамÑ\82иÑ\82е да Ñ\81амо Ñ\82еÑ\81Ñ\82иÑ\80аÑ\82е/пÑ\80егледаваÑ\82е ваÑ\88Ñ\83 коÑ\80иÑ\81ниÑ\87кÑ\83 JSON конÑ\84игÑ\83Ñ\80аÑ\86иÑ\98Ñ\83.\nСÑ\82Ñ\80аниÑ\86а Ñ\98оÑ\88 ниÑ\98е Ñ\81аÑ\87Ñ\83вана!</strong>",
- "userjspreview": "<strong>Ð\97апамÑ\82иÑ\82е да Ñ\81амо Ñ\82еÑ\81Ñ\82иÑ\80аÑ\82е/пÑ\80егледаваÑ\82е ваÑ\88 коÑ\80иÑ\81ниÑ\87ки Ñ\98аваÑ\81кÑ\80ипÑ\82.\nСÑ\82Ñ\80аниÑ\86а Ñ\98оÑ\88 ниÑ\98е Ñ\81аÑ\87Ñ\83вана!</strong>",
- "sitecsspreview": "<strong>Запамтите да је ово само преглед CSS-а.\nСтраница још није сачувана!</strong>",
- "sitejsonpreview": "<strong>Запамтите да је ово само преглед JSON-а.\nСтраница још није сачувана!</strong>",
- "sitejspreview": "<strong>Ð\9eво Ñ\98е Ñ\81амо пÑ\80еглед Ñ\98аваÑ\81кÑ\80ипÑ\82а.\nСÑ\82Ñ\80аниÑ\86а Ñ\98оÑ\88 ниÑ\98е Ñ\81аÑ\87Ñ\83вана!</strong>",
- "userinvalidconfigtitle": "<strong>УпозоÑ\80еÑ\9aе:</strong> не поÑ\81Ñ\82оÑ\98и Ñ\82ема â\80\9e$1â\80\9c.\nÐ\9fÑ\80илагоÑ\92ене Ñ\81Ñ\82Ñ\80аниÑ\86е CSS, JSON и Ð\88аваÑ\81кÑ\80ипÑ\82 поÑ\87иÑ\9aÑ\83 малим Ñ\81ловом, нпÑ\80. {{ns:user}}:Foo/vector.css, а не {{ns:user}}:Foo/Vector.css.",
+ "clearyourcache": "<strong>Ð\9dапомена:</strong> Ð\9dакон Ñ\87Ñ\83ваÑ\9aа, можда Ñ\9bеÑ\82е моÑ\80аÑ\82и да обÑ\80иÑ\88еÑ\82е кеÑ\88 пÑ\80егледаÑ\87а како биÑ\81Ñ\82е видели пÑ\80омене.\n* <strong>ФаÑ\98еÑ\80Ñ\84окÑ\81 / СаÑ\84аÑ\80и:</strong> Ð\94Ñ\80жиÑ\82е <em>Shift</em> и кликниÑ\82е на <em>Ð\9eÑ\81вежи</em> или пÑ\80иÑ\82иÑ\81ниÑ\82е <em>Ctrl-F5</em> или <em>Ctrl-R</em> (<em>â\8c\98-R</em> на Ð\9cакÑ\83)\n* <strong>Ð\93Ñ\83гл кÑ\80оÑ\83м:</strong> Ð\9fÑ\80иÑ\82иÑ\81ниÑ\82е <em>Ctrl-Shift-R</em> (<em>â\8c\98-Shift-R</em> на Ð\9cакÑ\83)\n* <strong>Ð\98нÑ\82еÑ\80неÑ\82 екÑ\81плоÑ\80еÑ\80:</strong> Ð\94Ñ\80жиÑ\82е <em>Ctrl</em> и кликниÑ\82е на <em>Ð\9eÑ\81вежи</em> или пÑ\80иÑ\82иÑ\81ниÑ\82е <em>Ctrl-F5</em>\n* <strong>Ð\9eпеÑ\80а:</strong> Ð\98диÑ\82е на <em>Ð\90лаÑ\82ке â\86\92 Ð\9fодеÑ\88аваÑ\9aа</em> (<em>Ð\9eпеÑ\80а â\86\92 Ð\9fодеÑ\88аваÑ\9aа</em> на Ð\9cаку) и затим <em>Приватност и безбедност → Очистите податке о прегледима → Кеширане слике и датотеке</em>.",
+ "usercssyoucanpreview": "<strong>СавеÑ\82:<strong> Ð\9aоÑ\80иÑ\81иÑ\82иÑ\82е дÑ\83гме â\80\9e{{int:showpreview}}â\80\9d да биÑ\81Ñ\82е иÑ\81пÑ\80обали нови Це-Ð\95Ñ\81-Ð\95Ñ\81 пре него што га сачувате.",
+ "userjsonyoucanpreview": "<strong>Савет:</strong> Користите дугме „{{int:showpreview}}” да бисте испробали нови ЈСОН пре него што га сачувате.",
+ "userjsyoucanpreview": "<strong>СавеÑ\82:</strong> Ð\9aоÑ\80иÑ\81иÑ\82иÑ\82е дÑ\83гме â\80\9e{{int:showpreview}}â\80\9d да биÑ\81Ñ\82е иÑ\81пÑ\80обали нови јаваскрипт пре него што га сачувате.",
+ "usercsspreview": "<strong>Ð\97апамÑ\82иÑ\82е да Ñ\98е ово Ñ\81амо пÑ\80еглед Це-Ð\95Ñ\81-Ð\95Ñ\81а.\nСÑ\82Ñ\80аниÑ\86а Ñ\98оÑ\88 ниÑ\98е Ñ\81аÑ\87Ñ\83вана.</strong>",
+ "userjsonpreview": "<strong>Ð\97апамÑ\82иÑ\82е да Ñ\81амо Ñ\82еÑ\81Ñ\82иÑ\80аÑ\82е/пÑ\80егледаваÑ\82е коÑ\80иÑ\81ниÑ\87ке Ð\88СÐ\9eÐ\9d поÑ\81Ñ\82авке.\nСÑ\82Ñ\80аниÑ\86а Ñ\98оÑ\88 ниÑ\98е Ñ\81аÑ\87Ñ\83вана.</strong>",
+ "userjspreview": "<strong>Ð\97апамÑ\82иÑ\82е да Ñ\81амо Ñ\82еÑ\81Ñ\82иÑ\80аÑ\82е/пÑ\80егледаваÑ\82е коÑ\80иÑ\81ниÑ\87ки Ñ\98аваÑ\81кÑ\80ипÑ\82.\nСÑ\82Ñ\80аниÑ\86а Ñ\98оÑ\88 ниÑ\98е Ñ\81аÑ\87Ñ\83вана.</strong>",
+ "sitecsspreview": "<strong>Запамтите да је ово само преглед Це-Ес-Еса.\nСтраница још није сачувана.</strong>",
+ "sitejsonpreview": "<strong>Запамтите да је ово само преглед ЈСОН-а.\nСтраница још није сачувана.</strong>",
+ "sitejspreview": "<strong>Ð\97апамÑ\82иÑ\82е да Ñ\98е ово Ñ\81амо пÑ\80еглед Ñ\98аваÑ\81кÑ\80ипÑ\82 кода.\nСÑ\82Ñ\80аниÑ\86а Ñ\98оÑ\88 ниÑ\98е Ñ\81аÑ\87Ñ\83вана.</strong>",
+ "userinvalidconfigtitle": "<strong>УпозоÑ\80еÑ\9aе:</strong> Ð\9dе поÑ\81Ñ\82оÑ\98и Ñ\82ема â\80\9e$1â\80\9c.\nÐ\9fÑ\80илагоÑ\92ене Ñ\81Ñ\82Ñ\80аниÑ\86е .css, .json и .js поÑ\87иÑ\9aÑ\83 малим Ñ\81ловом, нпÑ\80. {{ns:user}}:Ð\91лабла/vector.css, а не {{ns:user}}:Ð\91лабла/Vector.css.",
"updated": "(ажурирано)",
"note": "<strong>Напомена:</strong>",
"previewnote": "<strong>Не заборавите да је ово само претпреглед.</strong>\nВаше промене још нису сачуване!",
"postedit-confirmation-published": "Ваша измена је објављена.",
"edit-already-exists": "Није могуће направити нову страницу.\nИзгледа да она већ постоји.",
"defaultmessagetext": "Подразумевани текст поруке",
- "content-failed-to-parse": "РаÑ\88Ñ\87лаÑ\9aиваÑ\9aе Ñ\81адÑ\80жаÑ\98а Ñ\82ипа $2 за модел $1 ниÑ\98е Ñ\83Ñ\81пело: $3",
+ "content-failed-to-parse": "Ð\9dе могÑ\83 да Ñ\80аÑ\88Ñ\87ланим Ñ\81адÑ\80жаÑ\98 вÑ\80Ñ\81Ñ\82е $2 за модел $1: $3",
"invalid-content-data": "Неважећи подаци садржаја",
"content-not-allowed-here": "Садржај $1 није дозвољен на страници [[:$2]] у слоту „$3”",
"editwarning-warning": "Ако напустите ову страницу, изгубићете све измене које сте направили. Ако сте пријављени, можете онемогућити ово упозорење у својим подешавањима, у одељку „{{int:prefs-editing}}“.",
"slot-name-main": "Главни",
"content-model-wikitext": "викитекста",
"content-model-text": "чистог текста",
- "content-model-javascript": "JavaScript-а",
- "content-model-css": "CSS-а",
- "content-model-json": "JSON-а",
+ "content-model-javascript": "јаваскрипта",
+ "content-model-css": "Це-Ес-Еса",
+ "content-model-json": "ЈСОН-а",
"content-json-empty-object": "Празан објекат",
"content-json-empty-array": "Празан низ",
"deprecated-self-close-category": "Странице које користе невалидне самозатварајуће HTML тагове",
"prefs-namespaces": "Именски простори",
"default": "подразумевано",
"prefs-files": "Датотеке",
- "prefs-custom-css": "прилагођени CSS",
- "prefs-custom-json": "Прилагођени JSON",
- "prefs-custom-js": "прилагођени JavaScript",
- "prefs-common-config": "Дељени CSS/JSON/JavaScript за све теме:",
+ "prefs-custom-css": "прилагођени Це-Ес-Ес",
+ "prefs-custom-json": "Прилагођени ЈСОН",
+ "prefs-custom-js": "прилагођени јаваскрипт",
+ "prefs-common-config": "Дељени Це-Ес-Ес/ЈСОН/јаваскрипт за све теме:",
"prefs-reset-intro": "Можете користити ову страницу да поново поставите своја подешавања на подразумеване вредности сајта.\nОво се не може опозвати.",
"prefs-emailconfirm-label": "Потврда е-поште:",
"youremail": "Е-пошта:",
"gender-unknown": "Кад вас спомиње, софтвер ће користити родно неутралне речи кад год је то могуће",
"gender-male": "Он уређује вики странице",
"gender-female": "Она уређује вики странице",
- "prefs-help-gender": "Ð\9fоÑ\81Ñ\82авÑ\99аÑ\9aе овог подеÑ\88аваÑ\9aа Ñ\98е опÑ\86ионално.\nСофтвер користи дату вредност да би вам се обратио и споменуо вас другима користећи одговарајући граматички род.\nОва информација ће бити јавна.",
+ "prefs-help-gender": "Ð\9fоÑ\81Ñ\82авÑ\99аÑ\9aе овог подеÑ\88аваÑ\9aа Ñ\98е необавезно.\nСофтвер користи дату вредност да би вам се обратио и споменуо вас другима користећи одговарајући граматички род.\nОва информација ће бити јавна.",
"email": "Е-пошта",
- "prefs-help-realname": "Ð\9fÑ\80аво име Ñ\98е опÑ\86ионално.\nÐ\90ко Ñ\98е наведено, биће коришћено за приписивање вашег рада.",
- "prefs-help-email": "Ð\90дÑ\80еÑ\81а е-поÑ\88Ñ\82е Ñ\98е опÑ\86ионална, али је потребна за ресетовање лозинке, ако је заборавите.",
+ "prefs-help-realname": "Ð\9fÑ\80аво име Ñ\98е необавезно.\nÐ\90ко Ñ\98е пÑ\80Ñ\83жено, биће коришћено за приписивање вашег рада.",
+ "prefs-help-email": "Ð\90дÑ\80еÑ\81а е-поÑ\88Ñ\82е Ñ\98е необавезна, али је потребна за ресетовање лозинке, ако је заборавите.",
"prefs-help-email-others": "Такође можете оабрати да допустите другима да вас контактирају преко е-поште путем везе на вашој корисничкој страници или страници за разговор.\nВаша адреса е-поште неће бити приказана другим корисницима који вас контактирају.",
"prefs-help-email-required": "Потребна је адреса е-поште.",
"prefs-info": "Основне информације",
"prefs-diffs": "Разлике",
"prefs-help-prefershttps": "Ова подешавања ће ступити на снагу при следећој пријави.",
"prefswarning-warning": "Направили сте промене у подешавањима које још увек нису сачуване.\nАко напустите ову страницу без клика на „$1“, подешавања неће да буду ажурирана.",
- "prefs-tabs-navigation-hint": "СавеÑ\82: можеÑ\82е коÑ\80иÑ\81Ñ\82иÑ\82и Ñ\82ипке Ñ\81а левом и деÑ\81ном Ñ\81Ñ\82Ñ\80елиÑ\86ом за кÑ\80еÑ\82аÑ\9aе кÑ\80оз каÑ\80Ñ\82иÑ\86е.",
+ "prefs-tabs-navigation-hint": "СавеÑ\82: Ð\9cожеÑ\82е коÑ\80иÑ\81Ñ\82иÑ\82и Ñ\82аÑ\81Ñ\82еÑ\80 Ñ\81а левом и деÑ\81ном Ñ\81Ñ\82Ñ\80елиÑ\86ом за кÑ\80еÑ\82аÑ\9aе кÑ\80оз каÑ\80Ñ\82иÑ\86е на Ñ\81пиÑ\81кÑ\83.",
"userrights": "Корисничка права",
"userrights-lookup-user": "Избор корисника",
"userrights-user-editname": "Корисничко име:",
"right-reupload": "замењивање постојећих датотека",
"right-reupload-own": "замењивање сопствених датотека",
"right-reupload-shared": "локално замењивање датотека на дељеном спремишту медија",
- "right-upload_by_url": "отпремање датотека са URL адресе",
+ "right-upload_by_url": "отпремање датотека са УРЛ-а",
"right-purge": "чишћење кеш меморије странице без потврде",
"right-autoconfirmed": "без ограничавања ставки за IP адресе",
"right-bot": "сматрање измена као аутоматски процес",
"right-editsemiprotected": "уређивање страница под заштитом „{{int:protect-level-autoconfirmed}}“",
"right-editcontentmodel": "мењање модела садржаја странице",
"right-editinterface": "уређивање корисничког окружења",
- "right-editusercss": "уређивање туђих CSS датотека",
- "right-edituserjson": "уређивање туђих JSON датотека",
- "right-edituserjs": "уређивање туђих JavaScript датотека",
- "right-editmyusercss": "уређивање сопствених CSS датотека",
- "right-editmyuserjson": "уређивање сопствених JSON датотека",
- "right-editmyuserjs": "уређивање сопствених JavaScript датотека",
+ "right-editusercss": "уређивање туђих Це-Ес-Ес датотека",
+ "right-edituserjson": "уређивање туђих ЈСОН датотека",
+ "right-edituserjs": "уређивање туђих јаваскрипт датотека",
+ "right-editmyusercss": "уређивање сопствених Це-Ес-Ес датотека",
+ "right-editmyuserjson": "уређивање сопствених ЈСОН датотека",
+ "right-editmyuserjs": "уређивање сопствених јаваскрипт датотека",
"right-viewmywatchlist": "преглед сопственог списка надгледања",
"right-editmywatchlist": "уређивање сопственог списка надгледања; неке предузете радње ће свеједно додати странице на списак и без овог права",
"right-viewmyprivateinfo": "преглед сопствених приватних података (нпр. адресе е-поште, право име)",
"grant-createaccount": "Отварање налога",
"grant-createeditmovepage": "Прављење, уређивање и премештање страница",
"grant-delete": "Брисање страница, измена и уноса у дневницима",
- "grant-editinterface": "Уређивање именског простора Медијавики и JSON-а сајта/корисника",
- "grant-editmycssjs": "Уређивање вашег CSS/JSON/Јаваскрипта",
- "grant-editmyoptions": "Уређивање ваших корисничких подешавања и JSON конфигурације",
+ "grant-editinterface": "Уређивање именског простора Медијавики и ЈСОН-а сајта/корисника",
+ "grant-editmycssjs": "Уређивање вашег корисничког Це-Ес-Еса/ЈСОН-а/јаваскрипта",
+ "grant-editmyoptions": "Уређивање ваших корисничких подешавања и ЈСОН поставке",
"grant-editmywatchlist": "Уређивање вашег списка надгледања",
"grant-editpage": "Уређивање постојећих страница",
"grant-editprotected": "Уређивање заштићених страница",
"action-upload": "отпремите ову датотеку",
"action-reupload": "замењујете ову постојећу датотеку",
"action-reupload-shared": "премостите ову датотеку са заједничког складишта",
- "action-upload_by_url": "отпремите ову датотеку са URL адресе",
+ "action-upload_by_url": "отпремите ову датотеку са УРЛ-а",
"action-writeapi": "користите API за писање",
"action-delete": "избришете ову страницу",
"action-deleterevision": "бришете измене",
"rcfilters-watchlist-markseen-button": "Означи све промене као виђене",
"rcfilters-watchlist-edit-watchlist-button": "Уреди списак надгледаних страница",
"rcfilters-watchlist-showupdated": "Промене на страницама које нисте посетили од када је измена извршена су <strong>подебљане</strong>, с испуњеним ознакама.",
- "rcfilters-preference-label": "Користи интерфејс без JavaScript-а",
+ "rcfilters-preference-label": "Користи интерфејс без јаваскрипта",
"rcfilters-preference-help": "Учитава скорашње измене без претраге филтера или функционалности истицања.",
- "rcfilters-watchlist-preference-label": "Користи интерфејс без JavaScript-а",
+ "rcfilters-watchlist-preference-label": "Користи интерфејс без јаваскрипта",
"rcfilters-watchlist-preference-help": "Учитава списак надгледања без претраге филтера или функционалности истицања.",
"rcfilters-filter-showlinkedfrom-label": "Прикажи промене на страницама са којих долазе везе",
"rcfilters-filter-showlinkedfrom-option-label": "<strong>Странице са којих долазе везе до</strong> изабране странице",
"illegalfilename": "Име датотеке „$1“ садржи знакове који нису дозвољени у насловима страница.\nПреименујте датотеку и покушате да је поново отпремите.",
"filename-toolong": "Називи датотека могу имати највише 240 бајтова.",
"badfilename": "Име датотеке је промењено у „$1“.",
- "filetype-mime-mismatch": "Ð\9fÑ\80оÑ\88иÑ\80еÑ\9aе даÑ\82оÑ\82еке â\80\9e.$1â\80\9c не одговаÑ\80а пÑ\80епознаÑ\82ом Ñ\82ипÑ\83 MIME датотеке ($2).",
- "filetype-badmime": "Ð\94аÑ\82оÑ\82еке MIME Ñ\82ипа â\80\9e$1â\80\9c ниÑ\98е дозвоÑ\99ено Ñ\81лаÑ\82и.",
- "filetype-bad-ie-mime": "Ð\9dе могÑ\83 да оÑ\82пÑ\80емим овÑ\83 даÑ\82оÑ\82екÑ\83 Ñ\98еÑ\80 би Ñ\98е Ð\98нÑ\82еÑ\80неÑ\82 екÑ\81плоÑ\80еÑ\80 пÑ\80епознао као â\80\9e$1â\80\9c, Ñ\88Ñ\82о Ñ\98е недозвоÑ\99ен и поÑ\82енÑ\86иÑ\98ално опаÑ\81ан Ñ\82ип датотеке.",
+ "filetype-mime-mismatch": "Ð\9fÑ\80оÑ\88иÑ\80еÑ\9aе даÑ\82оÑ\82еке â\80\9e.$1â\80\9d не одговаÑ\80а пÑ\80епознаÑ\82оÑ\98 вÑ\80Ñ\81Ñ\82и Ð\9cÐ\98Ð\9cÐ\95 датотеке ($2).",
+ "filetype-badmime": "Ð\9dиÑ\98е дозвоÑ\99ено оÑ\82пÑ\80емаÑ\82и даÑ\82оÑ\82еке вÑ\80Ñ\81Ñ\82е Ð\9cÐ\98Ð\9cÐ\95 â\80\9e$1â\80\9d.",
+ "filetype-bad-ie-mime": "Ð\9dе могÑ\83 да оÑ\82пÑ\80емим овÑ\83 даÑ\82оÑ\82екÑ\83 Ñ\98еÑ\80 би Ñ\98е Ð\98нÑ\82еÑ\80неÑ\82 екÑ\81плоÑ\80еÑ\80 пÑ\80епознао као â\80\9e$1â\80\9d, Ñ\88Ñ\82о Ñ\98е недозвоÑ\99ена и поÑ\82енÑ\86иÑ\98ално опаÑ\81на вÑ\80Ñ\81Ñ\82а датотеке.",
"filetype-unwanted-type": "<strong>„.$1“</strong> је непожељан тип датотеке.\n{{PLURAL:$3|Пожељан тип датотеке је|Пожељни типови датотека су}} $2.",
"filetype-banned-type": "<strong>„.$1“</strong> {{PLURAL:$4|није допуштен тип датотеке|нису допуштени типови датотека}}.\n{{PLURAL:$3|Дозвољен тип датотеке је|Дозвољени типови датотека су}} $2.",
"filetype-missing": "Ова датотека нема проширење (нпр. „.jpg“).",
"uploadwarning-text-nostash": "Ре-отпремите датотеку, измените опис испод и покушајте поново.",
"savefile": "Сачувај датотеку",
"uploaddisabled": "Отпремање је онемогућено.",
- "copyuploaddisabled": "Отпремање са URL адресе је онемогућено.",
+ "copyuploaddisabled": "Отпремање са УРЛ-а је онемогућено.",
"uploaddisabledtext": "Отпремање датотека је онемогућено.",
"php-uploaddisabledtext": "Отпремање датотека је онемогућено у PHP-у.\nПроверите подешавања file_uploads.",
"uploadscripted": "Датотека садржи HTML или скриптни код који може бити погрешно протумачен од стране прегледача.",
"upload-scripted-pi-callback": "Датотека која садржи инструкције за обраду XML стилског облика се не може отпремити.",
"upload-scripted-dtd": "Није могуће отпремање SVG датотека које садрже нестандардну DTD декларацију.",
"uploaded-script-svg": "Пронађен скриптни елеменат „$1“ у постављеној SVG датотеци.",
- "uploaded-hostile-svg": "Пронађен небезбедан CSS у стилском елементу постављене SVG датотеке.",
+ "uploaded-hostile-svg": "Пронађен је небезбедан Це-Ес-Ес у стилском елементу отпремљене СВГ датотеке.",
"uploaded-event-handler-on-svg": "Није дозвољено постављање атрибута који контролишу догађаје <code>$1=\"$2\"</code> у SVG датотекама.",
"uploaded-href-unsafe-target-svg": "Пронађен href са несигурним подацима: URI одредиште <code><$1 $2=\"$3\"></code> у постављеној SVG датотеци.",
"uploaded-animate-svg": "Пронађена „animate“ ознака која можда мења href користећи се „from“ атрибутом <code><$1 $2=\"$3\"></code> у постављеној SVG датотеци.",
"uploadjava": "Датотека је формата ZIP који садржи јава .class елемент.\nСлање јава датотека није дозвољено јер оне могу изазвати заобилажење сигурносних ограничења.",
"upload-source": "Изворна датотека",
"sourcefilename": "Назив изворне датотеке:",
- "sourceurl": "URL адреса извора:",
+ "sourceurl": "УРЛ извора:",
"destfilename": "Назив:",
"upload-maxfilesize": "Максимална величина датотеке: $1",
"upload-description": "Опис датотеке",
"filename-bad-prefix": "Назив датотеке коју шаљете почиње са <strong>„$1“</strong>, а њега обично додељују дигитални фотоапарати.\nИзаберите назив датотеке који описује њен садржај.",
"filename-prefix-blacklist": " #<!-- оставите овај ред онаквим какав јесте --> <pre>\n# Синтакса је следећа:\n# * Све од тарабе па до краја реда је коментар\n# * Сваки ред означава префикс типичних назива датотека које додељивају дигитални апарати\nCIMG # Касио\nDSC_ # Никон\nDSCF # Фуџи\nDSCN # Никон\nDUW # неки мобилни телефони\nIMG # опште\nJD # Џеноптик\nMGP # Пентакс\nPICT # разно\n #</pre> <!-- оставите овај ред онаквим какав јесте -->",
"upload-proto-error": "Неважећи протокол",
- "upload-proto-error-text": "Удаљено отпремање захтева URL адресе које почињу са <code>http://</code> или <code>ftp://</code>.",
+ "upload-proto-error-text": "Удаљено отпремање захтева УРЛ-ове које почињу са <code>http://</code> или <code>ftp://</code>.",
"upload-file-error": "Унутрашња грешка",
"upload-file-error-text": "Дошло је до унутрашње грешке при отварању привремене датотеке на серверу.\nКонтактирајте [[Special:ListUsers/sysop|администратора]].",
"upload-misc-error": "Непозната грешка при слању датотеке",
- "upload-misc-error-text": "Ð\9dепознаÑ\82а гÑ\80еÑ\88ка пÑ\80и оÑ\82пÑ\80емаÑ\9aÑ\83 даÑ\82оÑ\82еке.\nÐ\9fÑ\80овеÑ\80иÑ\82е да ли Ñ\98е адÑ\80еÑ\81а валидна и покÑ\83Ñ\88аÑ\98Ñ\82е поново.\nÐ\90ко Ñ\81е пÑ\80облем не Ñ\80еÑ\88и, конÑ\82акÑ\82иÑ\80аÑ\98Ñ\82е [[Special:ListUsers/sysop|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80а]].",
+ "upload-misc-error-text": "Ð\94оÑ\88ло Ñ\98е до непознаÑ\82е гÑ\80еÑ\88ке пÑ\80и оÑ\82пÑ\80емаÑ\9aÑ\83 даÑ\82оÑ\82еке.\nÐ\9fÑ\80овеÑ\80иÑ\82е да ли Ñ\98е УРÐ\9b важеÑ\9bи и доÑ\81Ñ\82Ñ\83пан, па покÑ\83Ñ\88аÑ\98Ñ\82е поново.\nÐ\90ко Ñ\81е пÑ\80облем бÑ\83де поново Ñ\98авио, обÑ\80аÑ\82иÑ\82е Ñ\81е [[Special:ListUsers/sysop|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\83]].",
"upload-too-many-redirects": "Адреса садржи превише преусмерења",
"upload-http-error": "Дошло је до HTTP грешке: $1",
"upload-copy-upload-invalid-domain": "Примерци отпремања нису доступни на овом домену.",
"uploadstash-thumbnail": "прикажи сличицу",
"uploadstash-exception": "Не могу сачувати датотеку у складиште ($1): „$2“.",
"uploadstash-bad-path": "Путања не постоји.",
- "uploadstash-bad-path-invalid": "Ð\9fÑ\83Ñ\82аÑ\9aа ниÑ\98е валидна.",
+ "uploadstash-bad-path-invalid": "Ð\9fÑ\83Ñ\82аÑ\9aа ниÑ\98е важеÑ\9bа.",
"uploadstash-bad-path-unknown-type": "Непознат тип „$1“.",
"uploadstash-bad-path-unrecognized-thumb-name": "Непрепознато име минијатуре.",
"uploadstash-bad-path-bad-format": "Кључ „$1“ није у одговарајућем облику.",
"uploadstash-file-not-found-no-thumb": "Није могуће прибавити сличицу.",
"uploadstash-file-not-found-no-local-path": "Нема локалне путање за умањену ставку.",
"uploadstash-file-not-found-no-object": "Није могуће направити локални датотечни објекат за сличицу.",
- "uploadstash-file-not-found-no-remote-thumb": "Ð\94обавÑ\99аÑ\9aе Ñ\81лиÑ\87иÑ\86е ниÑ\98е Ñ\83Ñ\81пело: $1\nURL адÑ\80еÑ\81а = $2",
+ "uploadstash-file-not-found-no-remote-thumb": "Ð\9dе могÑ\83 да добавим Ñ\81лиÑ\87иÑ\86Ñ\83: $1\nУРÐ\9b = $2",
"uploadstash-file-not-found-missing-content-type": "Недостаје заглавље за тип садржаја.",
"uploadstash-file-not-found-not-exists": "Не могу наћи путању или ово није обична датотека.",
"uploadstash-file-too-large": "Не могу послужити датотеку већу од $1 {{PLURAL:$1|бајта|бајтова}}",
"img-auth-streaming": "Учитавам „$1“...",
"img-auth-public": "Сврха img_auth.php је да прослеђује датотеке из приватних викија.\nОвај вики је постављен као јавни.\nРади сигурности, img_auth.php је онемогућен.",
"img-auth-noread": "Корисник нема приступ за читање „$1“.",
- "http-invalid-url": "Ð\9dеважеÑ\9bа URL адÑ\80еÑ\81а: $1",
+ "http-invalid-url": "Ð\9dеважеÑ\9bи УРÐ\9b: $1",
"http-invalid-scheme": "Адресе са шемом „$1“ нису подржане.",
"http-request-error": "HTTP захтев није прошао због непознате грешке.",
"http-read-error": "HTTP грешка при читању.",
"http-timed-out": "Захтев HTTP је истекао.",
- "http-curl-error": "Грешка при добављању URL адресе: $1",
+ "http-curl-error": "Грешка при добављању УРЛ-а: $1",
"http-bad-status": "Дошло је до проблема током захтева HTTP: $1 $2",
"http-internal-error": "HTTP интерна грешка.",
- "upload-curl-error6": "Ð\9dиÑ\98е могÑ\83Ñ\9bе пÑ\80иÑ\81Ñ\82Ñ\83пиÑ\82и URL адÑ\80еÑ\81и",
- "upload-curl-error6-text": "Ð\9dиÑ\98е могÑ\83Ñ\9bе пÑ\80иÑ\81Ñ\82Ñ\83пиÑ\82и наведеноÑ\98 URL адÑ\80еÑ\81и.\nÐ\9fоново пÑ\80овеÑ\80иÑ\82е да ли Ñ\98е иÑ\81пÑ\80авна и да ли сајт ради.",
+ "upload-curl-error6": "Ð\9dе могÑ\83 да пÑ\80иÑ\81Ñ\82Ñ\83пим УРÐ\9b-Ñ\83",
+ "upload-curl-error6-text": "Ð\9dе могÑ\83 да пÑ\80иÑ\81Ñ\82Ñ\83пим пÑ\80Ñ\83женом УРÐ\9b-Ñ\83.\nÐ\9fоново пÑ\80овеÑ\80иÑ\82е да ли Ñ\98е иÑ\81пÑ\80аван и да ли сајт ради.",
"upload-curl-error28": "Отпремање је истекло",
"upload-curl-error28-text": "Сервер не одговара на упит.\nПроверите да ли сајт ради, мало осачекајте и покушајте поново.\nПробајте касније када буде мање оптерећење.",
"license": "Лиценца:",
"nolicense": "Није изабрано",
"licenses-edit": "Уреди избор лиценци",
"license-nopreview": "(преглед није доступан)",
- "upload_source_url": "(ваÑ\88а одабÑ\80ана даÑ\82оÑ\82ека од важеÑ\9bиÑ\85, Ñ\98авно доÑ\81Ñ\82Ñ\83пниÑ\85 URL адÑ\80еÑ\81а)",
+ "upload_source_url": "(ваÑ\88а одабÑ\80ана даÑ\82оÑ\82ека из важеÑ\9bег, Ñ\98авно доÑ\81Ñ\82Ñ\83пног УРÐ\9b-а)",
"upload_source_file": "(ваша одабрана датотека са рачунара)",
"listfiles-delete": "избриши",
"listfiles-summary": "Ова посебна страница приказује све отпремљене датотеке.",
"filedelete-maintenance-title": "Није могуће избрисати датотеку",
"mimesearch": "MIME претрага",
"mimesearch-summary": "Ова страница омогућава филтрирање датотека према њиховим MIME типовима.\nУлазни подаци: contenttype/subtype или contenttype/*, нпр. <code>image/jpeg</code>.",
- "mimetype": "MIME тип:",
+ "mimetype": "МИМЕ врста:",
"download": "преузми",
"unwatchedpages": "Ненадгледане странице",
"listredirects": "Списак преусмерења",
"apihelp": "API помоћ",
"apihelp-no-such-module": "Модул „$1“ није пронађен.",
"apisandbox": "API песак",
- "apisandbox-jsonly": "JavaScript је неопходан за коришћење API песка.",
+ "apisandbox-jsonly": "Јаваскрипт је неопходан за коришћење АПИ песка.",
"apisandbox-api-disabled": "АПИ је онемогућен на овом сајту.",
"apisandbox-submit": "Пошаљи захтев",
"apisandbox-reset": "Обриши",
"apisandbox-deprecated-parameters": "Застарели параметри",
"apisandbox-fetch-token": "Аутоматски испуни токен",
"apisandbox-add-multi": "Додај",
- "apisandbox-submit-invalid-fields-title": "Ð\9dека поÑ\99а ниÑ\81Ñ\83 валидна",
+ "apisandbox-submit-invalid-fields-title": "Ð\9dека поÑ\99а ниÑ\81Ñ\83 важеÑ\9bа",
"apisandbox-submit-invalid-fields-message": "Молимо Вас поправите означена поља и покушајте поново.",
"apisandbox-results": "Резултати",
"apisandbox-sending-request": "Шаљем API захтев…",
"apisandbox-loading-results": "Пријем API резултата...",
"apisandbox-results-error": "Дошло је до грешке приликом учитавања резултата API упита: $1.",
"apisandbox-request-selectformat-label": "Прикажи сахтеване податке као:",
- "apisandbox-request-url-label": "URL адреса захтева:",
+ "apisandbox-request-url-label": "УРЛ захтева:",
"apisandbox-request-format-json-label": "JSON",
- "apisandbox-request-json-label": "Затражите JSON:",
+ "apisandbox-request-json-label": "Затражите ЈСОН:",
"apisandbox-request-time": "Време за извршавање захтјева: {{PLURAL:$1|$1 милисекунда|$1 милисекунде|$1 милисекунди}}",
"apisandbox-results-fixtoken": "Исправи токен и пошаљи поново",
"apisandbox-results-fixtoken-fail": "Неуспело добијање „$1“ токена.",
"tooltip-ca-watch": "Додајте ову страницу на списак надгледања",
"tooltip-ca-unwatch": "Уклоните ову страницу са списка надгледања",
"tooltip-search": "Претражите пројекат {{SITENAME}}",
- "tooltip-search-go": "Идите на страницу са тачно овим именом ако постоји",
+ "tooltip-search-go": "Идите на страницу са тачно овим именом, ако постоји",
"tooltip-search-fulltext": "Претражите странице са овим текстом",
"tooltip-p-logo": "Посетите главну страну",
"tooltip-n-mainpage": "Посетите главну страну",
"group-bot.css": "/* CSS постављен овде ће утицати само на ботове */",
"group-sysop.css": "/* CSS постављен овде ће утицати само на системске операторе */",
"group-bureaucrat.css": "/* CSS постављен овде ће утицати само на бирократе */",
- "common.json": "/* JSON постављен овде ће се користити за све кориснике при отварању сваке странице. */",
+ "common.json": "/* ЈСОН постављен овде ће се користити за све кориснике при отварању сваке странице. */",
"common.js": "/* Јаваскрипт постављен овде ће се користити за све кориснике при отварању сваке странице. */",
"group-autoconfirmed.js": "/* Јаваскрипт постављен овде ће се учитати за самопотврђене кориснике */",
"group-user.js": "/* Јаваскрипт постављен овде ће се учитати за регистроване кориснике */",
"newimages-newbies": "Прикажи само доприносе нових налога",
"newimages-showbots": "Прикажи отпремања ботова",
"newimages-hidepatrolled": "Сакриј патролирана отпремања",
- "newimages-mediatype": "Тип медиÑ\98а:",
+ "newimages-mediatype": "Ð\92Ñ\80Ñ\81Ñ\82а медиÑ\98Ñ\83ма:",
"noimages": "Нема ништа.",
"gallery-slideshow-toggle": "сличице",
"ilsubmit": "Претражи",
"scarytranscludedisabled": "[Међувики укључивање шаблона је онемогућено]",
"scarytranscludefailed": "[Добављање шаблона за $1 није успело]",
"scarytranscludefailed-httpstatus": "[Не могу да преузмем шаблон $1: HTTP $2]",
- "scarytranscludetoolong": "[URL адреса је предугачка]",
+ "scarytranscludetoolong": "[УРЛ је предугачак]",
"deletedwhileediting": "<strong>Упозорење</strong>: Ова страница је избрисана након што сте почели са уређивањем!",
"confirmrecreate": "{{GENDER:$1|Корисник|Корисница}} [[User:$1|$1]] ([[User talk:$1|разговор]]) је {{GENDER:$1|избрисао|избрисала}} ову страницу након што сте почели да је уређујете из следећег разлога:\n: <em>$2</em>\nПотврдите да стварно желите да направите страницу.",
"confirmrecreate-noreason": "{{GENDER:$1|Корисник|Корисница}} [[User:$1|$1]] ([[User talk:$1|разговор]]) је {{GENDER:$1|избрисао|избрисала}} ову страницу након што сте почели да је уређујете. Потврдите да стварно желите да поново направите ову страницу.",
"quotation-marks": "„$1“",
"imgmultipageprev": "← претходна страница",
"imgmultipagenext": "следећа страница →",
- "imgmultigo": "Иди!",
+ "imgmultigo": "Иди",
"imgmultigoto": "Пређи на страницу $1",
"img-lang-opt": "$2 ($1)",
"img-lang-default": "(подразумевани језик)",
"version-software": "Инсталирани софтвер",
"version-software-product": "Производ",
"version-software-version": "Верзија",
- "version-entrypoints": "URL адресе улазне тачке",
+ "version-entrypoints": "УРЛ-ови улазне тачке",
"version-entrypoints-header-entrypoint": "Улазна тачка",
- "version-entrypoints-header-url": "URL адреса",
+ "version-entrypoints-header-url": "УРЛ",
"version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Путања до чланка]",
"version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Путања до скрипте]",
"version-libraries": "Инсталиране библиотеке",
"version-libraries-license": "Лиценца",
"version-libraries-description": "Опис",
"version-libraries-authors": "Аутори",
- "redirect": "Ð\9fÑ\80еÑ\83Ñ\81меÑ\80еÑ\9aе на даÑ\82оÑ\82екÑ\83, коÑ\80иÑ\81ника, Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, изменÑ\83 или дневник (ID)",
- "redirect-summary": "Ð\9eва поÑ\81ебна Ñ\81Ñ\82Ñ\80аниÑ\86а пÑ\80еÑ\83Ñ\81меÑ\80ава до даÑ\82оÑ\82еке (Ñ\81 даÑ\82им именом даÑ\82оÑ\82еке), Ñ\81Ñ\82Ñ\80аниÑ\86е (Ñ\81 даÑ\82им ID-ом измене или ID-ом Ñ\81Ñ\82Ñ\80аниÑ\86е), коÑ\80иÑ\81ниÑ\87ке Ñ\81Ñ\82Ñ\80аниÑ\86е (Ñ\81 даÑ\82им нÑ\83меÑ\80иÑ\87ким коÑ\80иÑ\81ниÑ\87ким ID-ом), или Ñ\83ноÑ\81а Ñ\83 дневникÑ\83 (Ñ\81 даÑ\82им дневниÑ\87ким ID-ом). УпоÑ\82Ñ\80еба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
+ "redirect": "Ð\9fÑ\80еÑ\83Ñ\81меÑ\80еÑ\9aе на даÑ\82оÑ\82екÑ\83, иденÑ\82иÑ\84. коÑ\80иÑ\81ника, Ñ\81Ñ\82Ñ\80аниÑ\86е, измене или дневника",
+ "redirect-summary": "Ð\9eва поÑ\81ебна Ñ\81Ñ\82Ñ\80аниÑ\86а пÑ\80еÑ\83Ñ\81меÑ\80ава на даÑ\82оÑ\82екÑ\83 (даÑ\82ог имена), Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 (даÑ\82ог иденÑ\82иÑ\84икаÑ\82оÑ\80а измене или Ñ\81Ñ\82Ñ\80аниÑ\86е), коÑ\80иÑ\81ниÑ\87кÑ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 (даÑ\82ог бÑ\80оÑ\98Ñ\87аног иденÑ\82иÑ\84икаÑ\82оÑ\80а) или Ñ\83ноÑ\81 Ñ\83 дневникÑ\83 (даÑ\82ог иденÑ\82иÑ\84икаÑ\82оÑ\80а). УпоÑ\82Ñ\80еба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] или [[{{#Special:Redirect}}/logid/186]].",
"redirect-submit": "Иди",
- "redirect-lookup": "Тип вредности:",
+ "redirect-lookup": "Тражи:",
"redirect-value": "Вредност:",
- "redirect-user": "Ð\9aоÑ\80иÑ\81ниÑ\87ки ID",
- "redirect-page": "ID странице",
- "redirect-revision": "РевизиÑ\98а странице",
- "redirect-file": "Ð\9dазив датотеке",
- "redirect-logid": "ID дневника",
+ "redirect-user": "коÑ\80иÑ\81ниÑ\87ки иденÑ\82иÑ\84икаÑ\82оÑ\80",
+ "redirect-page": "идентификатор странице",
+ "redirect-revision": "изменÑ\83 странице",
+ "redirect-file": "име датотеке",
+ "redirect-logid": "идентификатор дневника",
"redirect-not-exists": "Вредност није пронађена",
"redirect-not-numeric": "Вредност није нумеричка",
"fileduplicatesearch": "Претрага дупликата датотека",
"tags-delete-explanation-warning": "Ова радња је <strong>неповратна</strong> и <strong>не може да се поништи</strong>. Ово не могу да ураде чак ни администратори базе података. Будите сигурни да је ово ознака коју желите избрисати.",
"tags-delete-reason": "Разлог:",
"tags-delete-submit": "Неповратно избриши ову ознаку",
- "tags-delete-not-allowed": "Ð\9eзнаке коÑ\98е Ñ\81Ñ\83 деÑ\84иниÑ\81ане екÑ\81Ñ\82ензиÑ\98ом не могÑ\83 Ñ\81е избÑ\80иÑ\81аÑ\82и оÑ\81им ако иÑ\85 екÑ\81Ñ\82ензиÑ\98а не дозвоÑ\99ава.",
+ "tags-delete-not-allowed": "Ð\9eзнаке коÑ\98е Ñ\81Ñ\83 одÑ\80еÑ\92ене пÑ\80оÑ\88иÑ\80еÑ\9aем не могÑ\83 Ñ\81е избÑ\80иÑ\81аÑ\82и оÑ\81им ако им Ñ\82о пÑ\80оÑ\88иÑ\80еÑ\9aе не дозволи.",
"tags-delete-not-found": "Ознака „$1“ не постоји.",
"tags-delete-too-many-uses": "Ознака „$1” је примењена на више од $2 {{PLURAL:$2|измене|измена}}, што значи да се не може избрисати.",
"tags-delete-no-permission": "Немате дозволу да бришете ознаке промена.",
"dberr-info": "(Не могу приступити бази података: $1)",
"dberr-info-hidden": "(Не могу приступити бази података)",
"htmlform-invalid-input": "Постоје проблеми са неким од ваших уноса.",
- "htmlform-select-badoption": "Ð\92Ñ\80едноÑ\81Ñ\82 коÑ\98Ñ\83 Ñ\81Ñ\82е навели ниÑ\98е валидна опција.",
+ "htmlform-select-badoption": "Ð\92Ñ\80едноÑ\81Ñ\82 коÑ\98Ñ\83 Ñ\81Ñ\82е навели ниÑ\98е важеÑ\9bа опција.",
"htmlform-int-invalid": "Наведена вредност није цели број.",
"htmlform-float-invalid": "Наведена вредност није број.",
"htmlform-int-toolow": "Наведена вредност је испод минимума од $1",
"htmlform-title-not-creatable": "Страница „$1“ се не може направити",
"htmlform-title-not-exists": "$1 не постоји.",
"htmlform-user-not-exists": "<strong>$1</strong> не постоји.",
- "htmlform-user-not-valid": "<strong>$1</strong> ниÑ\98е валидно корисничко име.",
+ "htmlform-user-not-valid": "<strong>$1</strong> ниÑ\98е важеÑ\9bе корисничко име.",
"logentry-delete-delete": "$1 је {{GENDER:$2|избрисао|избрисала}} страницу $3",
"logentry-delete-delete_redir": "$1 је {{GENDER:$2|избрисао|избрисала}} преусмерење $3 преписивањем",
"logentry-delete-restore": "$1 је {{GENDER:$2|вратио|вратила}} страницу $3 ($4)",
"logentry-block-block": "$1 је {{GENDER:$2|блокирао|блокирала}} {{GENDER:$4|$3}} у трајању од $5 $6",
"logentry-block-unblock": "$1 је {{GENDER:$2|деблокирао|деблокирала}} {{GENDER:$4|$3}}",
"logentry-block-reblock": "$1 је {{GENDER:$2|променио|променила}} подешавања за блокирање {{GENDER:$4|корисника|кориснице}} {{GENDER:$4|$3}} у трајању од $5 $6",
- "logentry-partialblock-block": "$1 је {{GENDER:$2|блокирао|блокирала}} уређивање {{PLURAL:$8|странице|страница}} $7 {{GENDER:$4|кориснику|корисници|кориснику/ци}} $3 са временом истека од $5 $6",
+ "logentry-partialblock-block-page": "{{PLURAL:$1|странице|страница}} $2",
+ "logentry-partialblock-block": "$1 је {{GENDER:$2|блокирао|блокирала}} уређивање $7 {{GENDER:$4|кориснику|корисници|кориснику/ци}} $3 са временом истека од $5 $6",
"logentry-non-editing-block-block": "$1 је {{GENDER:$2|блокирао|блокирала}} одређене неуређивачке радње {{GENDER:$4|кориснику|корисници|кориснику/ци}} $3 са временом истека од $5 $6",
"logentry-non-editing-block-reblock": "$1 је {{GENDER:$2|променио|променила}} подешавања блокаде одређених неуређивачких радњи {{GENDER:$4|кориснику|корисници|кориснику/ци}} $3 са временом истека од $5 $6",
"logentry-suppress-block": "$1 је {{GENDER:$2|блокирао|блокирала}} {{GENDER:$4|$3}} у трајању од $5 $6",
"logentry-rights-autopromote": "$1 је аутоматски {{GENDER:$2|унапређен|унапређена}} из $4 у $5",
"logentry-upload-upload": "$1 је {{GENDER:$2|отпремио|отпремила}} $3",
"logentry-upload-overwrite": "$1 је {{GENDER:$2|отпремио|отпремила}} нову верзију датотеке $3",
- "logentry-upload-revert": "$1 Ñ\98е {{GENDER:$2|оÑ\82пÑ\80емио|оÑ\82пÑ\80емила}} $3",
+ "logentry-upload-revert": "$1 Ñ\98е {{GENDER:$2|вÑ\80аÑ\82ио|вÑ\80аÑ\82ила}} даÑ\82оÑ\82екÑ\83 $3 на Ñ\81Ñ\82аÑ\80иÑ\98Ñ\83 веÑ\80зиÑ\98Ñ\83",
"log-name-managetags": "Дневник управљања ознакама",
"log-description-managetags": "На овој страници се налази списак измена у вези [[Special:Tags|ознака]]. Дневник садржи само радње које су ручно извршили администратори; уноси за ознаке које је направио или избрисао вики софтвер, а не налазе се у овом дневнику.",
"logentry-managetags-create": "$1 је {{GENDER:$2|направио|направила}} ознаку „$4“",
"limitreport-walltime-value": "$1 {{PLURAL:$1|секунд|секунда|секунди}}",
"limitreport-ppvisitednodes": "Број предпроцесираних посећених нодова",
"limitreport-ppvisitednodes-value": "$1/$2",
- "limitreport-ppgeneratednodes": "Број предпроцесираних генерисаних нодова",
+ "limitreport-ppgeneratednodes": "Број створених чворова од предобрађивача",
"limitreport-ppgeneratednodes-value": "$1/$2",
"limitreport-postexpandincludesize": "Укључена величина након проширења",
"limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|бајт|бајта|бајтова}}",
"mediastatistics-header-archive": "Компресовани формати",
"mediastatistics-header-3d": "3D",
"mediastatistics-header-total": "Све датотеке",
- "json-warn-trailing-comma": "$1 {{PLURAL:$1|пратећа тачка је уклоњена|пратеће тачке су уклоњене|пратећих тачки је уклоњено}} из JSON-a",
- "json-error-unknown": "Догодио се проблем с JSON-ом. Грешка: $1",
+ "json-warn-trailing-comma": "$1 {{PLURAL:$1|пратећа тачка је уклоњена|пратеће тачке су уклоњене|пратећих тачки је уклоњено}} из ЈСОН-a",
+ "json-error-unknown": "Дошло је до проблема са ЈСОН-ом. Грешка: $1",
"json-error-depth": "Прекорачена је највећа дубина",
- "json-error-state-mismatch": "Ð\9dеважеÑ\9bи или покваÑ\80ени JSON",
+ "json-error-state-mismatch": "Ð\9dеважеÑ\9bи или погÑ\80еÑ\88но Ñ\83облиÑ\87ен Ð\88СÐ\9eÐ\9d",
"json-error-ctrl-char": "Грешка контролног симбола, могуће је да је неисправно енкодиран",
"json-error-syntax": "Грешка у синтакси",
"json-error-utf8": "Малформирани UTF-8 знаци, могуће је да су неисправно енкодирани",
"sessionprovider-mediawiki-session-cookiesessionprovider": "сесије са колачићима",
"sessionprovider-nocookies": "Колачићи су можда онемогућени. Уверите се да имате колачиће омогућене и почните поново.",
"randomrootpage": "Случајна коренска страница",
- "log-action-filter-block": "Тип блокаде:",
- "log-action-filter-contentmodel": "Тип промене модела садржаја:",
- "log-action-filter-delete": "Тип брисања:",
- "log-action-filter-import": "Тип увоза:",
- "log-action-filter-managetags": "Тип радње управљања ознакама:",
- "log-action-filter-move": "Тип премештања:",
- "log-action-filter-newusers": "Тип отварања налога:",
- "log-action-filter-patrol": "Тип патролирања:",
- "log-action-filter-protect": "Тип заштите:",
- "log-action-filter-rights": "Тип промене корисничких права:",
+ "log-action-filter-block": "Ð\92Ñ\80Ñ\81Ñ\82а блокиÑ\80аÑ\9aа:",
+ "log-action-filter-contentmodel": "Ð\92Ñ\80Ñ\81Ñ\82а промене модела садржаја:",
+ "log-action-filter-delete": "Ð\92Ñ\80Ñ\81Ñ\82а брисања:",
+ "log-action-filter-import": "Ð\92Ñ\80Ñ\81Ñ\82а увоза:",
+ "log-action-filter-managetags": "Ð\92Ñ\80Ñ\81Ñ\82а радње управљања ознакама:",
+ "log-action-filter-move": "Ð\92Ñ\80Ñ\81Ñ\82а премештања:",
+ "log-action-filter-newusers": "Ð\92Ñ\80Ñ\81Ñ\82а отварања налога:",
+ "log-action-filter-patrol": "Ð\92Ñ\80Ñ\81Ñ\82а патролирања:",
+ "log-action-filter-protect": "Ð\92Ñ\80Ñ\81Ñ\82а заштите:",
+ "log-action-filter-rights": "Ð\92Ñ\80Ñ\81Ñ\82а промене корисничких права:",
"log-action-filter-suppress": "Тип скривања:",
"log-action-filter-upload": "Тип отпремања:",
"log-action-filter-all": "Све",
"log-action-filter-suppress-reblock": "Скривање корисника поновним блокирањем",
"log-action-filter-upload-upload": "ново отпремање",
"log-action-filter-upload-overwrite": "промена постојећег",
+ "log-action-filter-upload-revert": "Враћа",
"authmanager-authn-not-in-progress": "Потврда идентитета није у току или је дошло до губитка података о сесији. Почните испочетка.",
"authmanager-authn-no-primary": "Није могуће потврдити пружене акредитиве.",
"authmanager-authn-no-local-user": "Пружени акредитиви нису повезани ни са једним корисником на овом викију.",
"authmanager-create-no-primary": "Не могу да искористим пружене акредитиве за отварање налога.",
"authmanager-link-no-primary": "Не могу да искористим пружене акредитиве за спајање налога.",
"authmanager-link-not-in-progress": "Спајање налога није у току или је дошло до губитка података о сесији. Почните испочетка.",
- "authmanager-authplugin-setpass-failed-title": "Неуспешна промена лозинке",
- "authmanager-authplugin-setpass-failed-message": "Додатак за потврду идентитета је одбио промену лозинке.",
- "authmanager-authplugin-create-fail": "Додатак за потврду идентитета је одбио отварање налога.",
- "authmanager-authplugin-setpass-denied": "Додатак за потврду идентитета не дозвољава мењање лозику.",
- "authmanager-authplugin-setpass-bad-domain": "Неважећи домен.",
"authmanager-autocreate-noperm": "Аутоматско отварање налога није дозвољено.",
"authmanager-autocreate-exception": "Аутоматско креирање налога је привремено онемогућено због претходних грешака.",
"authmanager-userdoesnotexist": "Кориснички налог „$1“ није отворен.",
"unlinkaccounts": "Раздвајање налога",
"unlinkaccounts-success": "Налог је обједињен.",
"authenticationdatachange-ignored": "Промена података аутенификације није обрађена. Можда ниједан провајдер није конфигурисан?",
- "userjsispublic": "Напомена: JavaScript подстранице не би требале садржавати поверљиве информације будући да су видљиве другим корисницима.",
- "userjsonispublic": "Напомена: JSON подстранице не би требале садржавати поверљиве информације будући да су видљиве другим корисницима.",
- "usercssispublic": "Напомена: CSS подстранице не би требале садржавати поверљиве информације будући да су видљиве другим корисницима.",
+ "userjsispublic": "Напомена: Јаваскрипт подстранице не би требале садржавати поверљиве информације будући да су видљиве другим корисницима.",
+ "userjsonispublic": "Напомена: ЈСОН подстранице не би требале садржавати поверљиве информације будући да су видљиве другим корисницима.",
+ "usercssispublic": "Напомена: Це-Ес-Ес подстранице не би требале садржавати поверљиве информације будући да су видљиве другим корисницима.",
"restrictionsfield-badip": "Неважећа IP адреса или опсег: $1",
"restrictionsfield-label": "Дозвољени IP опсези:",
"edit-error-short": "Грешка: $1",
"pagedata-title": "Подаци странице",
"pagedata-not-acceptable": "Није пронађен одговарајући облик. Подржане MIME-врсте: $1",
"pagedata-bad-title": "Невалидан наслов: $1.",
- "unregistered-user-config": "Из безбедоносних разлога JavaScript, CSS и JSON корисничке подстранице не могу бити учитане за нерегистроване кориснике.",
+ "unregistered-user-config": "Из безбедоносних разлога, јаваскрипт, Це-Ес-Ес и ЈСОН корисничке подстранице не могу бити учитане за нерегистроване кориснике.",
"passwordpolicies": "Правила за лозинке",
- "passwordpolicies-summary": "Ð\9eво Ñ\98е Ñ\81пиÑ\81ак еÑ\84икаÑ\81ниÑ\85 Ñ\81меÑ\80ниÑ\86а за лозинке за коÑ\80иÑ\81ниÑ\87ке гÑ\80Ñ\83пе деÑ\84иниÑ\81ане на овом викију.",
+ "passwordpolicies-summary": "Ð\9eво Ñ\98е Ñ\81пиÑ\81ак делоÑ\82воÑ\80ниÑ\85 Ñ\81меÑ\80ниÑ\86а за лозинке за коÑ\80иÑ\81ниÑ\87ке гÑ\80Ñ\83пе одÑ\80еÑ\92ене на овом викију.",
"passwordpolicies-group": "Група",
"passwordpolicies-policies": "Правила",
"passwordpolicies-policy-display": "<span class=\"passwordpolicies-policy\">$1 <code>($2)</code></span>",
"passwordpolicies-policy-minimalpasswordlength": "Лозинка мора да има најмање {{PLURAL:$1|један знак|$1 знака|$1 знакова}}",
"passwordpolicies-policy-minimumpasswordlengthtologin": "Лозинка мора садржати најмање $1 {{PLURAL:$1|карактер|карактера}} да би сте могли да се пријавите.",
- "passwordpolicies-policy-passwordcannotmatchusername": "Лозинка не може да буде иста као корисничко име",
+ "passwordpolicies-policy-passwordcannotmatchusername": "Лозинка не сме бити иста као корисничко име",
"passwordpolicies-policy-passwordcannotmatchblacklist": "Лозинка се не може подударати са лозинкама на црном списку",
"passwordpolicies-policy-maximalpasswordlength": "Лозинка мора да буде краћа од $1 {{PLURAL:$1|знака|знакова}}",
- "passwordpolicies-policy-passwordcannotbepopular": "Лозинка не може да буде {{PLURAL:$1|популарна лозинка|на списку $1 популарних лозинки}}",
- "passwordpolicies-policy-passwordnotinlargeblacklist": "Лозинка не може да буде на листи 100.000 најчешће коришћених лозинки.",
- "unprotected-js": "Из безбедносних разлога, JavaScript не може да се учита са незаштићене странице. Само направите JavaScript у именском простору „Медијавики:” или као корисничку подстраницу"
+ "passwordpolicies-policy-passwordcannotbepopular": "Лозинка не сме бити {{PLURAL:$1|позната лозинка|на списку $1 познатих лозинки}}",
+ "passwordpolicies-policy-passwordnotinlargeblacklist": "Лозинка не сме бити на списку 100.000 најчешће коришћених лозинки.",
+ "unprotected-js": "Из безбедносних разлога, јаваскрипт не може да се учита са незаштићене странице. Само направите јаваскрипт у именском простору „Медијавики:” или као корисничку подстраницу"
}
"authmanager-create-no-primary": "Ne mogu da iskoristim pružene akreditive za otvaranje naloga.",
"authmanager-link-no-primary": "Ne mogu da iskoristim pružene akreditive za spajanje naloga.",
"authmanager-link-not-in-progress": "Spajanje naloga nije u toku ili je došlo do gubitka podataka o sesiji. Počnite ispočetka.",
- "authmanager-authplugin-setpass-failed-title": "Neuspešna promena lozinke",
- "authmanager-authplugin-setpass-failed-message": "Dodatak za potvrdu identiteta je odbio promenu lozinke.",
- "authmanager-authplugin-create-fail": "Dodatak za potvrdu identiteta je odbio otvaranje naloga.",
- "authmanager-authplugin-setpass-denied": "Dodatak za potvrdu identiteta ne dozvoljava menjanje loziku.",
- "authmanager-authplugin-setpass-bad-domain": "Nevažeći domen.",
"authmanager-autocreate-noperm": "Automatsko otvaranje naloga nije dozvoljeno.",
"authmanager-autocreate-exception": "Automatsko kreiranje naloga je privremeno onemogućeno zbog prethodnih grešaka.",
"authmanager-userdoesnotexist": "Korisnički nalog „$1“ nije otvoren.",
"log-action-filter-upload-overwrite": "Unjal deui",
"authmanager-create-disabled": "Panyieunan akun ditumpurkeun",
"authmanager-create-from-login": "Pikeun nyieun akun, mangga eusi ieu kolom di handap.",
- "authmanager-authplugin-setpass-failed-title": "Parobahan kecap sandi gagal",
- "authmanager-authplugin-setpass-bad-domain": "Domain teu sah.",
"authmanager-autocreate-noperm": "Panyieunan akun otomatis teu diidinan.",
"authmanager-userdoesnotexist": "Akun pamaké \"$1\" teu kadaptar.",
"authmanager-username-help": "Sandiasma pikeun oténtikasi.",
"logentry-rights-autopromote": "$1 {{GENDER:$2|befordrades}} automatiskt från $4 till $5",
"logentry-upload-upload": "$1 {{GENDER:$2|laddade upp}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|laddade upp}} en ny version av $3",
- "logentry-upload-revert": "$1 {{GENDER:$2|laddade upp}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|återställde}} $3 till en gammal version",
"log-name-managetags": "Märkeshanteringslogg",
"log-description-managetags": "Denna sida innehåller administrativa [[Special:Tags|märke]]srelaterade uppgifter. Loggen innehåller bara åtgärder som utförts manuellt av en administratör; märken kan skapas eller raderas av wikins mjukvara utan att en post registreras i loggen.",
"logentry-managetags-create": "$1 {{GENDER:$2|skapade}} märket \"$4\"",
"log-action-filter-suppress-reblock": "Användarcensur efter återblockering",
"log-action-filter-upload-upload": "Ny uppladdning",
"log-action-filter-upload-overwrite": "Återuppladdning",
+ "log-action-filter-upload-revert": "Återställ",
"authmanager-authn-not-in-progress": "Autentiseringen pågår inte eller så har sessionsdata förlorats. Var god börja om från början igen.",
"authmanager-authn-no-primary": "De angivna inloggningsuppgifterna kunde inte autentiseras.",
"authmanager-authn-no-local-user": "De angivna inloggningsuppgifterna är inte associerade med någon användare på denna wiki.",
"authmanager-create-no-primary": "De angivna inloggningsuppgifterna kunde inte användas för att skapa ett konto.",
"authmanager-link-no-primary": "De angivna inloggningsuppgifterna kunde inte användas för att länka ett konto.",
"authmanager-link-not-in-progress": "Kontolänkning pågår inte eller så har sessionsdata förlorats. Var god börja om från början igen.",
- "authmanager-authplugin-setpass-failed-title": "Kunde inte ändra lösenordet",
- "authmanager-authplugin-setpass-failed-message": "Insticksmodulen för autentisering nekade lösenordsändringen.",
- "authmanager-authplugin-create-fail": "Insticksmodulen för autentisering nekade skapande av konto.",
- "authmanager-authplugin-setpass-denied": "Insticksmodulen för autentisering tillåter inte ändring av lösenord.",
- "authmanager-authplugin-setpass-bad-domain": "Ogiltig domän.",
"authmanager-autocreate-noperm": "Det är inte tillåtet att skapa konton automatiskt.",
"authmanager-autocreate-exception": "P.g.a. tidigare fel har automatiskt skapande av konton inaktiverats.",
"authmanager-userdoesnotexist": "Användarkontot \"$1\" är inte registrerat.",
"passwordpolicies-policy-maximalpasswordlength": "Lösenordet måste vara högst $1 {{PLURAL:$1|tecken}} långt",
"passwordpolicies-policy-passwordcannotbepopular": "Lösenordet kan inte vara {{PLURAL:$1|det populäraste lösenordet|i listan över de $1 populäraste lösenorden}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "Lösenordet kan inte vara med i listan över de 100 000 vanligaste lösenorden.",
+ "passwordpolicies-policyflag-forcechange": "måste ändras vid inloggning",
"easydeflate-invaliddeflate": "Innehåll som tillhandahålls är inte helt komprimerat",
"unprotected-js": "Av säkerhetsskäl kan inte JavaScript läsas in från oskyddade sidor. Skapa endast JavaScript i namnrymden MediaWiki: eller som en användarundersida."
}
"log-action-filter-suppress-delete": "Laxiy pkt’aniy quw zngazyan",
"log-action-filter-upload-upload": "Misan sni’",
"log-action-filter-upload-overwrite": "T’aring lawziy pawsa’ sa kktan",
- "authmanager-authplugin-setpass-failed-title": "Wal yaqih quw sinbah sa mima’",
- "authmanager-authplugin-setpass-bad-domain": "Ungat zyuwaw na wangyu’.",
"authmanager-email-label": "e-meyo’",
"authmanager-email-help": "Zyusyo na e-meyo’",
"authmanager-realname-label": "Spzyang balay lalu’",
"diff-multi-manyusers": "({{PLURAL:$1|ಒಂಜಿ ನಡುತ ಪಡಿಪಾಟ|$1 ನಡುತ ಪಡಿಪಾಟೊಲು}} $2 ಡುದು ಎಚ್ಚದ {{PLURAL:$2|ಬಳಕೆದಾರೆ|ಬಳಕೆದಾರೆರ್}} ತೋಜಾದಿಜಿ)",
"diff-paragraph-moved-tonew": "ವಾಕ್ಯಪಂಕ್ತಿ ಚಲನೆ ಆತ್ಂಡ್. ಪೊಸ ಜಾಗೊಗು ನೆಗೆಪರೆ ಒತ್ತುಲೆ.",
"diff-paragraph-moved-toold": "ವಾಕ್ಯಪಂಕ್ತಿ ಚಲನೆ ಆತ್ಂಡ್. ದುಂಬುಇತ್ತಿನ ಜಾಗೊಗು ನೆಗೆಪರೆ ಒತ್ತುಲೆ.",
+ "difference-missing-revision": "{{PLURAL:$2|ಒಂಜಿ ಪಡಿಪಾಟ|$2 ಪಡಿಪಾಟೊಲು}} ಈ ವ್ಯತ್ಯಾಸ ($1) {{PLURAL:$2|ವು|ಲು}} ತಿಕ್ಕುಜಿ.\nಉಂದು ಸಾಮಾನ್ಯವಾದ್ ಒಂಜಿ ಮಾಜಾಯಿನ ಪುಟೊತ ಒಂಜಿ ಕಾಲಕರಿನ ವ್ಯತ್ಯ ಕೊಂಡಿದ ಕಾರಣೊಡು ಆಪಿನವು.\nವಿವರೊಲು [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ಮಾಜಾಯಿನ ಗಮನಿ].ಡು ತಿಕ್ಕುಂಡು.",
"searchresults": "ನಾಡ್ಪತ್ತ್ನೆತ ಪಲಿತಾಂಸೊಲು",
+ "search-filter-title-prefix": "ತರೆಬರವು $1 ರ್ದ್ ಸುರುವಾಪಿನ ಪುಟೊಲೆನ್ ಮಾತ್ರಾ ನಾಡುಂಡು",
+ "search-filter-title-prefix-reset": "ಮಾತಾ ಪುಟೊಲೆನ್ ನಾಡ್'ಲೆ.",
"searchresults-title": "\"$1\"ಕ್ ನಾಡ್ಪತ್ತ್ನೆತ ಪಲಿತಾಂಸೊಲು",
+ "titlematches": "ಪುಟ ತೆರಬರವು ಸದೃಶ ಆದುಂಡು.",
+ "textmatches": "ಪುಟತ ಪಟ್ಯ ಸದೃಶ ಆದುಂಡು.",
"notextmatches": "ವಾ ಪುಟೊತ ಪಠ್ಯೊಡುಲಾ ಹೋಲಿಕೆ ಇಜ್ಜಿ",
"prevn": "ದುಂಬುದ {{PLURAL:$1|$1}}",
"nextn": "ಬೊಕ್ಕದ {{PLURAL:$1|$1}}",
"search-category": "(ವರ್ಗ $1)",
"search-file-match": "ಫೈಲ್ಡಿತ್ತಿ ವಿಸಯೊಗು ಸರಿ ಒಂಬುಂಡು",
"search-suggest": "ಇಂದೆನ್ ನಾಡೊಂದುಲ್ಲರೆ: $1",
+ "search-rewritten": "ತೋಜಾವುನು $1 ತ ಫಲಿತಾಂಶೊಲು. ಬದಲಾದ್ $2 ಕ್ ನಾಡುಲೆ.",
"search-interwiki-caption": "ಸೋದರಿ ಯೋಜನೆಲೆನ ಫಲಿತಾಂಶೊಲು",
"search-interwiki-default": "$1 ಫಲಿತಾಂಶೊಲು:",
"search-interwiki-more": "(ಮಸ್ತ್)",
"search-relatedarticle": "ಸ೦ಬ೦ದ ಇತ್ತಿನ",
"searchrelated": "ಸ೦ಬ೦ಧ ಇತ್ತಿನ",
"searchall": "ಮಾತ",
+ "showingresults": "#<strong>$2</strong>ರ್ದ್ ಸುರುವಾಪಿನ, {{PLURAL:$1|<strong>1</strong> ಫಲಿತಾಂಶ|<strong>$1</strong>ಫಲಿತಾಂಶೊಲು}} ಮುಟ್ಟದವೆನ್ ಈ ತಿರ್ತ್ ತೋಜಾವುಂಡು .",
+ "showingresultsinrange": "#<strong>$2</strong>ರ್ದ್ #<strong>$3</strong>.ವ್ಯಾಪ್ತಿದ, {{PLURAL:$1|<strong>1</strong> ಫಲಿತಾಂಶ|<strong>$1</strong>ಫಲಿತಾಂಶೊಲು}} ಮುಟ್ಟದವೆನ್ ಈ ತಿರ್ತ್ ತೋಜಾವುಂಡು .",
"search-showingresults": "{{PLURAL:$4|<strong>$3</strong>ಟ್ <strong>$1</strong> ಫಲಿತಾಂಸೊ|<strong>$3</strong>ಟ್ <strong>$1 - $2</strong> ಫಲಿತಾಂಸೊಲು}}",
"search-nonefound": "ಈರೆನ ವಿಚಾರಣೆಗ್ ತಕ್ಕಂದಿನ ಪಲಿತಾಂಸೊಲು ಇಜ್ಜಿ.",
"search-nonefound-thiswiki": "ಈ ಸೈಟ್ಡ್ ಪ್ರಸ್ನೆನೆದ ಪಲಿತಾಂಸೊ ಕೂಡೊಂದಿಜ್ಜಿ",
"powersearch-togglelabel": "ಪರೀಕ್ಷಿಸಲೆ:",
"powersearch-toggleall": "ಮಾತಾ",
"powersearch-togglenone": "ಇದ್ದಿ",
+ "powersearch-remember": "ಮುಂಗಾಲದ (ಭವಿಷದ) ನಾಡುನವೆಕ್ ಪೆಜಿದಿನೆನ್ ನೆನಪುದೀಲೆ",
"search-external": "ಬಾಹ್ಯೊ ಹುಡುಕಾಟೊ",
+ "searchdisabled": "{{SITENAME}} ನಾಡುನವು ನಿಷ್ಕ್ರಿಯ ಆತ್ಂಡ್. ಈನಡುವೆ ಈರ್ ಗೂಗಲ್ಡ್ ನಾಡೊಲಿ.\nಗಮನಕೊರುಲೆ: ಅಕಲೆನ {{SITENAME}} ವಿಷಯದ ಅನುಕ್ರಮಸೂಚಿಲು ಕಾಲಕರಿನವು ಆದಿಪ್ಪು.",
+ "search-error": "$1: ನಾಡುನಗ ಒಂಜಿ ದೋಷ ಆಂಡ್",
+ "search-warning": "$1: ನಾಡುನಗ ಒಂಜಿ ಎಚ್ಚರಿಗೆ ಉಂಡಾಂಡ್.",
"preferences": "ಪ್ರಾಶಸ್ತ್ಯೊಲು",
"mypreferences": "ಪ್ರಾಸಸ್ತ್ಯೊಲು",
"prefs-edits": "ಸಂಪಾದನೆಲೆನ ಸಂಕೆ:",
+ "prefsnologintext2": "ಇರೆನ ಇಷ್ಟಾಯ್ಕೆಲೆನ್ ಬದಲಾರೆ ದಯಮಲ್ತ್ ಉಳಗಮನ ಮಲ್ಪುಲೆ.",
"prefs-skin": "ಸ್ಕಿನ್",
"skin-preview": "ಮುನ್ನೋಟೊ",
"datedefault": "ಒವ್ವೇ ಪ್ರಾಸಸ್ತ್ಯೊ ಇದ್ದಿ",
+ "prefs-labs": "ಪ್ರಯೋಗಸಾಲೆ ಗುಣವಿಶೇಷೊಲು",
"prefs-user-pages": "ಸದಸ್ಯೆರೆನ ಪುಟೊ",
"prefs-personal": "ಸದಸ್ಯೆರ್ನ ಬಗ್ಗೆ",
"prefs-rc": "ಇಂಚಿಪದ ಬದಲಾವಣೆಲು",
"prefs-watchlist": "ವೀಕ್ಷಣಾಪಟ್ಟಿ",
+ "prefs-editwatchlist": "ತೂಪಿಪಟ್ಟಿ ಸಂಪಾದಿಲೆ",
+ "prefs-editwatchlist-label": "ಇರೆನ ತೂಪಿಪಟ್ಟಿ ಸೇರಿಕೆಲೆನ್ ಸಂಪಾದಿಲೆ:",
+ "prefs-editwatchlist-edit": "ಇರೆನ ತೂಪಿಪಟ್ಟಿಡ್ ತರೆಬರವುಲೆನ್ ತೂಲೆ ಬೊಕ ದೆಪ್ಪುಲೆ.",
+ "prefs-editwatchlist-raw": "ಪಜ್ಜಿ ತೂಪಿಪಟ್ಟಿ ಸಂಪಾದಿಲೆ.",
+ "prefs-editwatchlist-clear": "ಇರೆನ ತೂಪಿಪಟ್ಟಿನ್ ಖಾಲಿ ಮಲ್ಪುಲೆ.",
+ "prefs-watchlist-days": "ತೂಪಿಪಟ್ಟಿಡ್ ತೋಜಾವುನ ದಿನೊಲು",
+ "prefs-watchlist-days-max": "ಗರಿಷ್ಟ $1 {{PLURAL:$1|ದಿನ|ದಿನೊಲು}}",
+ "prefs-watchlist-edits": "Maximum number of changes to show in watchlist:\nತೂಪಿಪಟ್ಟಿಡ್ ತೋಜಾವುನ ಗರಿಷ್ಟ ಬದಲಾವಣೆ ಸಂಕೆಲು",
+ "prefs-watchlist-edits-max": "ಗರಿಷ್ಟ ಸಂಕೆ:1000",
+ "prefs-watchlist-token": "ತೂಪಿಪಟ್ಟಿ ಬಿಲ್ಲೆ:",
+ "prefs-watchlist-managetokens": "ಬಿಲ್ಲೆಲೆನ್ ತೂವೊನುಲೆ.",
+ "prefs-misc": "ಇತರೆ",
"prefs-resetpass": "ಪ್ರವೇಶಪದೊನ್ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
"prefs-changeemail": "ಇ-ಅಂಚೆ ವಿಳಾಸೊನು ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ ಅತ್ತಂಡ ದೆಪ್ಪುಲೆ",
"prefs-setemail": "ಇ-ಅಂಚೆ ವಿಳಾಸೊನು ಸ್ತಾಪನೆ ಮಲ್ಪು",
"prefs-email": "ಇ-ಮೈಲ್ ಆಯ್ಕೆಲು",
"prefs-rendering": "ಗೋಚರೊ",
"saveprefs": "ಒರಿಪಾಲೆ",
+ "restoreprefs": "ಮಾತಾ ಸಮಸ್ಥಿತಿ ಅಟ್ಟಣೆಲೆನ್ ಪಿರತಾಪನೆ ಮಲ್ಪುಲೆ (ಮಾತಾ ವಿಭಾಗೊಲೆಡ್)",
"prefs-editing": "ಸಂಪೊಲಿಪು",
"searchresultshead": " \nನಾಡ್’ಲೆ",
+ "stub-threshold": "ಮೋಟು ಕೊಂಡಿ ರೂಪನೊಗು ತಡ್ಯ ($1):",
"stub-threshold-sample-link": "ಸಾಂಪಲ್",
"stub-threshold-disabled": "ಕ್ರಿಯೆ ಉಂತ್ದ್ಂಡ್",
"recentchangesdays": "ಇಂಚಿಪೊದ ಬದಲಾವಣೆಡ್ ತೋಜ್ಪಾವೊಡಾಯಿನ ದಿನೊಕುಲು:",
+ "recentchangesdays-max": "ಗರಿಷ್ಟ $1 {{PLURAL:$1|ದಿನ|ದಿನೊಲು}}",
+ "recentchangescount": "ಇಂಚೊದ ಬದಲಾವಣೆಲು, ಪುಟ ಚರಿತ್ರೆಲು ಬೊಕ ಗಮನಿಲೆಡ್, ಸಮಸ್ಥಿತಿಟ್ ತೋಜಾವುನ ಸಂಪಾದಿ ಸಂಕೆಲು:",
+ "prefs-help-recentchangescount": "ಗರಿಷ್ಟ ಸಂಕೆ:1000",
+ "prefs-help-watchlist-token2": "ಇರೆನ ತೂಪಿಪಟ್ಟಿದ ಜಾಲ ಆಹಾರೊಗು ಉಂದೇ ಗುಪಿತ ಕೀಲಿ ಆದುಂಡು.\nಏರ್ಲಾ ಗೊತ್ತಿತ್ತಿನಾಯಗ್ ಇರೆನ ತೂಪಿಪಟ್ಟಿನ್ ಓದರೆ ಆಪುಂಡು,ಅಂಚಾದ್ ಅವೆನ್ ಪಟ್ಟೊರ್ಚಿ.\nಬೋಡಾಂಡಾ, [[Special:ResetTokens|you can reset it]].",
+ "prefs-help-tokenmanagement": "ಇರೆನ ತೂಪಿಪಟ್ಟಿದ ಜಾಲಾಹಾರೊಗು ಸಾದಿ ಉಪ್ಪುನ ಇರೆನ ಖಾತೆದ ಗುಪಿತ ಕೀಲಿನ್ ಈರ್ ತೂದ್ ಪಿರತಾಪನೆ ಮಲ್ಪೊಲಿ. ಏರ್ಲಾ ಗೊತ್ತಿತ್ತಿನಾಯಗ್ ಇರೆನ ತೂಪಿಪಟ್ಟಿನ್ ಓದರೆ ಆಪುಂಡು, ಅಂಚಾದ್ ಅವೆನ್ ಪಟ್ಟೊರ್ಚಿ.",
+ "savedprefs": "ಇರೆನ ಇಷ್ಟಾಯ್ಕೆಲೆನ್ ಒರಿಪಾದುಂಡು.",
+ "savedrights": "{{GENDER:$1|$1}} ಬಳಕೆದಾರೆ ಗುಂಪುಲೆನ್ ಒರಿಪಾದುಂಡು.",
"timezonelegend": "ಸಮಯೊದ ವಲಯೊ:",
"localtime": "ಸ್ಥಳೀಯ ಸಮಯ:",
+ "timezoneuseserverdefault": "ವಿಕಿ ಸಮಸ್ಥಿತಿ ($1)ನ್ ಬಳಕೆ ಮಲ್ಪುಲೆ.",
+ "timezoneuseoffset": "ಇತರೆ (ಪರತಾಪನೆ ತಿರ್ತ್ ಸೂಚಿಸಾಲೆ)",
+ "timezone-useoffset-placeholder": "ಉದರ್ಮೆಗ್ ಮೌಲ್ಯೊಲು: \"-07:00\" ಇಜಿಂಡ \"01:00\"",
"servertime": "ಸರ್ವರ್ದ ಕಾಲೊ:",
"guesstimezone": "ಬ್ರೌಸರ್ಡ್ದ ದಿಂಜವು",
"timezoneregion-africa": "ಆಫ್ರಿಕ",
"timezoneregion-indian": "ಹಿಂದೂ ಮಹಾಸಾಗರೊ",
"timezoneregion-pacific": "ಪೆಸಿಫಿಕ್ ಮಹಾಸಾಗರೊ",
"allowemail": "ಎಂಕ್ ಇ-ಅಂಚೆ ಮಲ್ಪರೆ ಬೇತೆ ಸದಸ್ಯೆರೆಗ್ ಅನುಮತಿ ಕೊರುಲೆ.",
+ "email-allow-new-users-label": "ಪಚ್ಚ-ಪೊಸ ಬಳಕೆದಾರೆರೆನ ಇಮೇಲುಲೆಗ್ ಎಡೆಕೊರುಲೆ",
+ "email-blacklist-label": "ಈ ಬಳಕೆದಾರೆರ್ ಎಂಕ್ ಇಮೇಲ್ ಕಡಪುಡುನೆನ್ ತಡೆಪುಲೆ:",
"prefs-searchoptions": "ನಾಡ್ಲ",
"prefs-namespaces": "ಪುದರ್ದ ವರ್ಗೊಲು",
"default": "ಮೂಲೊಸ್ಥಿತಿ",
"prefs-files": "ಕಡತೊಲು",
"prefs-custom-css": "ಕಸ್ಟಮ್ ಸಿಎಸ್ಎಸ್",
+ "prefs-custom-json": "ನಿಷ್ಟ ಜೆಎಸ್ಒಎನ್ JSON",
"prefs-custom-js": "ಕಸ್ಟಮ್ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್",
+ "prefs-common-config": "ಮಾತಾ ಚೋಲಿಲೆಗ್ ಪಟ್ಟಿನ ಸಿಎಸ್ಎಸ್ CSS/ ಜೆಎಸ್ಒಎನ್ JSON/ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ JavaScript :",
+ "prefs-reset-intro": "ತಾನ ಸಮಸ್ಥಿತಿಲೆಗ್ ಇರೆನ ಇಷ್ಟಾಯ್ಕೆಲೆನ್ ಪಿರತಾಪನೆಗ್ ಈ ಪುಟೊನು ಈರ್ ಬಳಕೆ ಮಲ್ಪೊಲಿ. ಉಂದೆನ್ ಪಿರಮಲ್ಪರೆ ಆಪುಜಿ.",
"prefs-emailconfirm-label": "ಈ-ಮೈಲ್ದ ಒಪ್ಪಿಗೆ:",
"youremail": "ಇ-ಮೈಲ್",
"username": "{{GENDER:$1|ಸದಸ್ಯತ್ವೊದ ಪುದರ್}}:",
"prefs-memberingroups": "{{GENDER:$2|ಸದಸ್ಯೆರ್}} ಆದುಪ್ಪುನ {{PLURAL:$1|ಗುಂಪು|ಗುಂಪುಲು}}:",
+ "group-membership-link-with-expiry": "$1 ( $2 ಮುಟ್ಟ)",
"prefs-registration": "ನೋಂದಣಿದ ಸಮಯ:",
"yourrealname": "ನಿಜವಾಯಿನ ಪುದರ್",
"yourlanguage": "ಬಾಸೆ:",
"prefs-i18n": "ಅಂತರರಾಷ್ಟ್ರೀಕರಣ",
"prefs-signature": "ದಸ್ಕತ್ತ್",
"prefs-dateformat": "ತಾರೋಕ್ದ ಸೈಲಿ",
+ "prefs-timeoffset": "ಕಾಲ ಪರತಾಪನೆ",
"prefs-advancedediting": "ಸಾಮಾನ್ಯೊ ಆಯ್ಕೆಲು",
+ "prefs-developertools": "ಬುಳೇರ ಉಪಕರಣೊಲು",
"prefs-editor": "ಸಂಪಾದಕೆ",
"prefs-preview": "ಮುನ್ನೋಟೊ",
"prefs-advancedrc": "ಪರಿಣತ ಇಚ್ಛೆಲು",
"prefs-changeswatchlist": "ತೋಜಾಯಿನ ಬದಲಾವಣೆಲು",
"prefs-pageswatchlist": "ವೀಕ್ಷಿತ (ತೂಯಿನ) ಪುಟೊಲು",
"prefs-tokenwatchlist": "ಟೊಕನ್",
+ "prefs-diffs": "ವ್ಯತ್ಯಲು",
+ "prefs-help-prefershttps": "ಈ ಇಷ್ಟಾಯ್ಕೆ ಇರೆನ ದುಂಬುದ ಉಳಗಮನೊಡು ಪರಿಣಾಮೊಗು ಬರ್ಪುಂಡು.",
+ "prefswarning-warning": "ಈರ್ ಇರೆನ ಇಷ್ಟಾಯ್ಕೆಲೆಗ್ ಬದಲಾವಣೆ ಮಲ್ದರ್, ಅವೆನ್ ನನಲಾ ಒರಿಪಾದಿಜರ್. ಈರ್ $1 ಒತ್ತಂದೆ ಈ ಪುಟೊನು ಬುಡುದು ಪೋಯರ್ಡ, ಇರೆನ ಇಷ್ಟಾಯ್ಕೆಲು ಕಾಲನವಿ ಆಪುಜಾ.",
+ "prefs-tabs-navigation-hint": "ಕೊಡಿ: ಕಿರ್ಪಟ ಪಟ್ಟಿದ ಕಿರ್ಪಟೊಲೆಡ್ ಪರಿಮಾರರೆ ಈರ್ ದತ್ತ ಬೊಕ ಬಲತ್ತ ಬಾಣ ಕೀಲಿಲೆನ್ ಬಳಕೆ ಮಲ್ಪೊಲಿ.",
"userrights": "ಸದಸ್ಯೆರೆ ಹಕ್ಕುಲು",
"userrights-lookup-user": "ಒರಿ ಬಳಕೆದಾರೆನ್ ಆಯ್ಕೆ ಮಲ್ಪುಲೆ",
"userrights-user-editname": "ಒಂಜಿ ಸದಸ್ಯ ಪುದರ್ ಬರೆಲೆ",
+ "editusergroup": "ಬಳಕೆದಾರೆ ಗುಂಪುಲೆನ್ ದಿಂಜಾಲೆ",
+ "editinguser": "{{GENDER:$1|ಬಳಕೆದಾರೆ}}ಬಳಕೆದಾರೆ ಹಕ್ಕುಲೆನ್ <strong>[[User:$1|$1]]</strong> $2 ಬದಲಾವುನು",
+ "viewinguserrights": "{{GENDER:$1|ಬಳಕೆದಾರೆ}}ಬಳಕೆದಾರೆ ಹಕ್ಕುಲೆನ್ <strong>[[User:$1|$1]]</strong> $2 ತೂಪಿನಿ",
"userrights-editusergroup": "{{GENDER:$1|ಸದಸ್ಯೆರ್ನ}} ಗುಂಪುನ್ ಸೆರ್ಸಲೇ",
"userrights-viewusergroup": "{{GENDER:$1|ಸದಸ್ಯೆರ್ನ}} ಗುಂಪುನ್ ತೂಲೆ",
"saveusergroups": "{{GENDER:$1|ಸದಸ್ಯೆರ್ನ}} ಗುಂಪುನ್ ಒರಿಪಾಲೆ",
"userrights-groupsmember": "ಸದರ್ಸೇರ್:",
+ "userrights-groupsmember-auto": "ನೆತ್ತ ಸೂಚ್ಯ ಸದಸ್ಯೆರ್:",
+ "userrights-groups-help": "ಈ ಬಳಕೆದಾರೆರ್ ಉಪ್ಪುನ ಗುಂಪುಲೆನ್ ಈರ್ ಬದಲ್ ಮಲ್ಪೊಲಿ:\n* ಒಂಜಿ ಗುರ್ತುಮಲ್ತಿನ ಪಟ್ಟಿಕೆ ಇನ್ನಗ ಬಳಕೆದಾರೆ ಆ ಗುಂಪುಡು ಉಲ್ಲೆರ್ ಇಂದ್\n* ಒಂಜಿ ಗುರ್ತುಮಲ್ಪಂದಿನ ಪಟ್ಟಿಕೆ ಇನ್ನಗ ಬಳಕೆದಾರೆ ಆ ಗುಂಪುಡು ಇಜ್ಜೆರ್ ಇಂದ್\n* ಒಂಜಿ * ಇನ್ನಗ ಈರ್ ಗುಂಪುನು ಸೇರಾಯಿನ ಬೊಕ ಅವೆನ್ ದೆಪ್ಪರೆ ಆಪುಜಿ ಇಜಿಂಡ ಅಯಿತ ಉಲ್ಟಾ ಇಂದ್\n* ಒಂಜಿ # ಇನ್ನಗ ಈರ್ ಗುಂಪು ಸದಸ್ಯತ್ವದ ಮುಗಿಕಾಲೊನು ಪಿರ ಪಾಡೆರೆ ಮಾತ್ರಾ ಆಪುಂಡು; ಅವೆನ್ ದುಂಬು ಕಣರೆ ಆಪುಜಿ ಇಂದ್",
"userrights-reason": "ಕಾರಣೊ:",
+ "userrights-no-interwiki": "ಇತರೆ ವಿಕಿಲೆಡ್ ಬಳಕೆದಾರೆ ಹಕ್ಕುಲೆನ್ ಸಂಪಾದೆರೆ ಇರೆಗ್ ಅನುಮತಿ ಇಜ್ಜಿ.",
+ "userrights-nodatabase": "ದತ್ತಸಂಚಯ $1 ಇಜ್ಜಿ, ಇಜಿಂಡ ಅವು ಸ್ಥಳಿಯ ಅತ್ತ್.",
+ "userrights-changeable-col": "ಇರೆಗ್ ಬದಲಾವರೆ ಆಪಿನ ಗುಂಪುಲು",
+ "userrights-unchangeable-col": "ಇರೆಗ್ ಬದಲಾವರೆ ಆವಂದಿನ ಗುಂಪುಲು",
+ "userrights-expiry-current": "$1 ಮುಗಿವುಂಡು",
+ "userrights-expiry-none": "ಮುಗಿಯುಜಿ",
+ "userrights-expiry": "ಮುಗಿವುಂಡು:",
+ "userrights-expiry-existing": "ಉಪ್ಪುನ ಮುಗಿಕಾಲ: $3, $2",
+ "userrights-expiry-othertime": "ಇತರೆ ಕಾಲ:",
+ "userrights-expiry-options": "1 ದಿನ:1 ದಿನ,1 ವಾರ:1 ವಾರ,1 ತಿಂಗೊಲು:1 ತಿಂಗೊಲು,3 ತಿಂಗೊಲುಲು:3 ತಿಂಗೊಲುಲು,6 ತಿಂಗೊಲುಲು:6 ತಿಂಗೊಲುಲು,1 ವರ್ಷ:1 ವರ್ಷ",
+ "userrights-invalid-expiry": "\"$1\" ಗುಂಪುದ ಮುಗಿಕಾಲ ಅಮಾನ್ಯ ಆದುಂಡು.",
+ "userrights-expiry-in-past": "\"$1\" ಗುಂಪುದ ಮುಗಿಕಾಲ ಭೂತಕಾಲೊಡು ಉಂಡು.",
+ "userrights-cannot-shorten-expiry": "ಗುಂಪು $1 ದ ಸದಸ್ಯತ್ವದ ಮುಗಿಕಾಲೊನು ಈರ್ ದುಂಬು ಕಣರೆ ಆಪುಜಿ. ಈ ಗುಂಪುನು ಸೇರಾರೆ ಬೊಕ ದೆಪ್ಪರೆ ಅನುಮತಿ ಉಪ್ಪುನ ಬಳಕೆದಾರೆರ್ ಮಾತ್ರಾ ಮುಗಿಕಾಲೊಲೆನ್ ದುಂಬು ಕಣವೊಲಿ.",
+ "userrights-conflict": "ಬಳಕೆದಾರೆ ಹಕ್ಕುಲೆ ಬದಲಾವಣೆಲೆನ ಸಂಘರ್ಷ! ದಯಮಲ್ತ್ ಪಿರಾತೂದ್ ಇರೆನ ಬದಲಾವಣೆಲೆನ್ ದೃಡ ಮಲ್ಪುಲೆ.",
"group": "ಗುಂಪುಲು:",
"group-user": "ಬಳಕೆದಾರೆರ್",
+ "group-autoconfirmed": "ಸ್ವಯಂದೃಡೀಕೃತ ಬಳಕೆದಾರೆರ್",
"group-bot": "ಬಾಟ್ಸ್",
"group-sysop": "ನಿರ್ವಾಹಕೆರ್",
+ "group-interface-admin": "ಅಂತರಮುಕ ನಿರ್ವಾಹಕೆರ್",
+ "group-bureaucrat": "ಅಧಿಕಾರಶಾಹಿಲು",
+ "group-suppress": "ದಮನಕೆರ್",
"group-all": "ಮಾತಾ",
"group-user-member": "{{GENDER:$1|ಸದರ್ಸೆ}}",
+ "group-autoconfirmed-member": "{{GENDER:$1|ಸ್ವಯಂದೃಡೀಕೃತ ಬಳಕೆದಾರೆ}}",
+ "group-bot-member": "{{GENDER:$1|ಬೊಟ್}}",
+ "group-sysop-member": "{{GENDER:$1|ನಿರ್ವಾಹಕೆ}}",
+ "group-interface-admin-member": "{{GENDER:$1|ಅಂತರಮುಕ ನಿರ್ವಾಹಕೆ}}",
+ "group-bureaucrat-member": "{{GENDER:$1|ಅಧಿಕಾರಶಾಹಿ}}",
+ "group-suppress-member": "{{GENDER:$1|ದಮನಕಾರೆ}}",
+ "grouppage-user": "{{ns:project}}:ಬಳಕೆದಾರೆರ್",
+ "grouppage-autoconfirmed": "{{ns:project}}:ಸ್ವಯಂದೃಡೀಕೃತ ಬಳಕೆದಾರೆರ್",
"grouppage-bot": "{{ns:project}}:ಬಾಟ್ಸ್",
"grouppage-sysop": "{{ns:project}}:ನಿರ್ವಾಹಕೆರ್",
+ "grouppage-interface-admin": "{{ns:project}}:ಅಂತರಮುಕ ನಿರ್ವಾಹಕೆರ್",
+ "grouppage-bureaucrat": "{{ns:project}}:ಅಧಿಕಾರಶಾಹಿಲು",
+ "grouppage-suppress": "{{ns:project}}:ದಮನಿಸಾಲೆ",
"right-read": "ಪುಟಕ್ಲೆನ್ ಓದುಲೆ",
"right-edit": "ಪುಟೊಲೆನ್ ಸಂಪಾದಿಸಾಲೆ",
+ "right-createpage": " ಪುಟೊಲೆನ್ ರಚಿಸಾಲೆ (ಚರ್ಚಾಪುಟೊಲು ಅತ್ತಾಂದಿನವೆನ್)",
+ "right-createtalk": "ಚರ್ಚಾಪುಟೊಲೆನ್ ರಚಿಸಾಲೆ",
+ "right-createaccount": "ಪೊಸ ಬಳಕೆದಾರೆ ಖಾತೆಲೆನ್ ರಚಿಸಾಲೆ",
+ "right-autocreateaccount": "ಒಂಜಿ ಬಾಹ್ಯ ಬಳಕೆದಾರೆ ಖಾತೆರ್ದ್ ಸ್ವಯಂಕೃತ ಉಳಗಮನ",
+ "right-minoredit": "ಸಂಪಾದಿಲು ಕಿನ್ಯ ಇಂದ್ ಗುರ್ತಿಸಾಲೆ",
"right-move": "ಪುಟೊನ್",
+ "right-move-subpages": "ಪುಟೊಲು ಅಯಿತ ಉಪಪುಟೊಲೆ ಸಮೇತ ಪಂದಾಲೆ.",
+ "right-move-rootuserpages": "ಮೂಲ ಬಳಕೆದಾರೆ ಪುಟೊಲೆನ್ ಪಂದಾಲೆ",
+ "right-move-categorypages": "ವರ್ಗ ಪುಟೊಲೆನ್ ಪಂದಾಲೆ",
+ "right-movefile": "ಕಡತೊಲೆನ್ ಪಂದಾಲೆ",
+ "right-suppressredirect": "ಪುಟೊಲೆನ್ ಪಂದಾನಗ ಮೂಲ ಪುಟೊರ್ದು ಪಿರರವಾನೆ ರಚನೆ ಇಜ್ಜಿ",
+ "right-upload": "ಕಡತೊಲೆನ್ ಮಿತೇರಾಲೆ",
+ "right-reupload": "ಇತ್ತಿನ ಕಡತೊಲೆನ ಮಿತ್'ಬರೇಲೆ",
+ "right-reupload-own": "ಒರಿ ಮಿತೇರಾದ್ ಇತ್ತಿನ ಕಡತೊಲೆನ ಮಿತ್'ಬರೇಲೆ",
+ "right-reupload-shared": "ಪಟ್ಟಿನ ಸ್ಥಳೀಯ ಮಾಧ್ಯಮ ಸಂಚಯದ ಕಡತೊಲೆನ ಮಿತ್ಸವಾರಿ ಮಲ್ಪುಲೆ.",
+ "right-upload_by_url": "ಒಂಜಿ ಯುಆರ್'ಎಲ್'ರ್ದ್ URL ಕಡತೊಲೆನ್ ಮಿತೇರಾಲೆ",
+ "right-purge": "ಒಂಜಿ ದೃಡೀಕರಣ ದಾಂತಿನ ಪುಟತ ತಾನ ನೆನಕೂಟನು ಉರ್ಚಾಲೆ.",
+ "right-autoconfirmed": "ಐಪಿ ಆಧಾರಿತ ದರ ಮಿತಿಲೆರ್ದ್ ಪರಿಣಾಮ ಆವಂದ್",
+ "right-bot": "ಒಂಜಿ ಸ್ವಯಂಕೃತ ಪ್ರಕ್ರಿಯೆ ಇಂದ್ ಪರಿಗಣಿಸಾಲೆ",
+ "right-nominornewtalk": "ಚರ್ಚಾ ಪುಟೊಲೆನ ಕಿನ್ಯ ಸಂಪಾದಿಲು ಪೊಸ ಸಂದೇಶಲೆನ ಚೋದಿ ಕಡಪುಡುಜಾ",
+ "right-apihighlimits": "ಎಪಿಐ API ಕೇಣಿಲೆಡ್ ಪರಮ ಮಿತಿಲೆನ್ ಬಳಕೆ ಮಲ್ಪುಲೆ.",
"right-writeapi": "ಬರವು ಎ.ಪಿ.ಐ. ದ ಉಪಯೋಗೊ",
"right-delete": "ಪುಟೊಕುಲೆನ್ ಮಾಜಾಲೆ",
+ "right-bigdelete": "ಮಲ್ಲ ಚರಿತ್ರೆಲು ಇತ್ತಿನ ಪುಟೊಲೆನ್ ಮಾಜಾಲೆ.",
+ "right-deletelogentry": "ವಿಸೂಚಿತ ಗಮನಿ ಸೇರಿಕೆಲೆನ್ ಮಾಜಾಲೆ ಬೊಕ ಅ-ಮಾಜಾಲೆ",
+ "right-deleterevision": "ವಿಸೂಚಿತ ಪುಟ ಪಡಿಪಾಟೊಲೆನ್ ಮಾಜಾಲೆ ಬೊಕ ಅ-ಮಾಜಾಲೆ",
+ "right-deletedhistory": "ಮಾಜಾಯಿನ ಚರಿತ್ರೆ ಸೇರಿಕೆಲೆನ್ , ಅಯಿತ ಸಹಕ್ರಮ ಪಟ್ಯ ದಾಂತೆ, ತೂಲೆ.",
+ "right-deletedtext": "ಮಾಜಾಯಿನ ಪಟ್ಯ ಬೊಕ ಮಾಜಾಯಿನ ಪಡಿಪಾಟೊಲೆನ ನಡುತ ಬದಲಾವಣೆಲೆನ್ ತೂಲೆ",
+ "right-browsearchive": "ಮಾಜಾಯಿನ ಪುಟೊಲೆನ್ ನಾಡುಲೆ",
"right-undelete": "ಪುಟೊನ್ ಮಾಜಾವಡೆ",
+ "right-suppressrevision": "ಒವ್ವೆ ಬಳಕೆದಾರೆನ ಪುಟೊತ ವಿಸೂಚಿತ ಪಡಿಪಾಟೊಲೆನ್ ತೂಲೆ,ದೆಂಗಾಲೆ ಬೊಕ ಅ-ದೆಂಗಾಲೆ.",
+ "right-viewsuppressed": "ಒವ್ವೆ ಬಳಕೆದಾರೆರ್ದ್ ದೆಂಗಾಯಿನ ಪಡಿಪಾಟೊಲೆನ್ ತೂಲೆ",
+ "right-suppressionlog": "ಖಾಸಗಿ ಗಮನಿಲೆನ್ ತೂಲೆ",
+ "right-block": "ಇತರೆ ಬಳಕೆದಾರೆರ್ ಸಂಪಾದಿಸಂಚ ತಡೆಪುಲೆ",
+ "right-blockemail": "ಒಂಜಿ ಬಳಕೆದಾರೆ ಇಮೇಲ್ ಕಡಪುಡದಿನಂಚ ತಡೆಪುಲೆ",
+ "right-hideuser": "ಒಂಜಿ ಬಳಕೆಪುರುನು ತಡೆಪುಲೆ, ಅವೆನ್ ಸಾರ್ವಜನಿಕೊರ್ದು ದೆಂಗಾಲೆ.",
+ "right-ipblock-exempt": "ಐಪಿ ತಡೆಲು,ಸ್ವಯಂ-ತಡೆಲು ಬೊಕ ವ್ಯಾಪ್ತಿ ತಡೆಲೆನ್ ಮೀರ್ದ್ ಪೋಲೆ.",
+ "right-unblockself": "ಒರಿಯನ ಅ-ತಡೆ",
+ "right-protect": "ರಕ್ಷಣ ಮಜಲುಲೆನ್ ಬದಲಾದ್ ಬೊಕ ಸೋಪಾನ-ರಕ್ಷಿತ ಪುಟೊಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "right-editprotected": "\"{{int:protect-level-sysop}}\"ಇಂದ್ ರಕ್ಷಿತ ಪುಟೊಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\"ಇಂದ್ ರಕ್ಷಿತ ಪುಟೊಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "right-editcontentmodel": "ಒಂಜಿ ಪುಟೊತ ವಿಷಯ ಮಾದರಿನ್ ಸಂಪಾದಿಲೆ",
+ "right-editinterface": "ಬಳಕೆದಾರೆ ಅಂತರಮುಕೊನು ಸಂಪಾದಿಲೆ",
+ "right-editusercss": "ಇತರೆ ಬಳಕೆದಾರೆರೆನ ಸಿಎಸ್ಎಸ್ ಕಡತೊಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "right-edituserjson": "ಇತರೆ ಬಳಕೆದಾರೆರೆನ ಜೆಎಸ್ಒಎನ್ ಕಡತೊಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "right-edituserjs": "ಇತರೆ ಬಳಕೆದಾರೆರೆನ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಕಡತೊಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "right-editsitecss": "ತಾನ-ಅಗೆಲದ ಸಿಎಸ್ಎಸ್ ಸಂಪಾದಿಲೆ",
+ "right-editsitejson": "ತಾನ-ಅಗೆಲದ ಜೆಎಸ್ಒಎನ್ ಸಂಪಾದಿಲೆ",
+ "right-editsitejs": "ತಾನ-ಅಗೆಲದ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಸಂಪಾದಿಲೆ",
+ "right-editmyusercss": "ಇರೆನ ಸ್ವಂತದ ಬಳಕೆದಾರೆ ಸಿಎಸ್ಎಸ್ ಕಡತೊಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "right-editmyuserjson": "ಇರೆನ ಸ್ವಂತದ ಬಳಕೆದಾರೆ ಜೆಎಸ್ಒಎನ್ ಕಡತೊಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "right-editmyuserjs": "ಇರೆನ ಸ್ವಂತದ ಬಳಕೆದಾರೆ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಕಡತೊಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "right-viewmywatchlist": "ಇರೆನ ಸ್ವಂತದ ತೂಪಿಪಟ್ಟಿನ್ ತೂಲೆ",
+ "right-editmywatchlist": "ಇರೆನ ಸ್ವಂತದ ತೂಪಿಪಟ್ಟಿನ್ ಸಂಪಾದಿಲೆ. ಸಮತೂಲೆ: ಈ ಹಕ್ಕು ದಾಂತೆ ಇತ್ತಂಡಲಾ ಕೆಲವು ಕ್ರಿಯೆಲು ನನಲಾ ಪುಟೊಲೆನ್ ಕೂಡಾವಾ.",
+ "right-viewmyprivateinfo": "ಇರೆನ ಸ್ವಂತದ ಖಾಸಗಿ ದತ್ತಾಂಶೊನು ತೂಲೆ (ಉದರ್ಮೆಗ್: ಇಮೇಲ್ ವಿಳಾಸ, ನಿಜಪುದರು)",
+ "right-editmyprivateinfo": "ಇರೆನ ಸ್ವಂತದ ಖಾಸಗಿ ದತ್ತಾಂಶೊನು ಸಂಪಾದಿಲೆ (ಉದರ್ಮೆಗ್: ಇಮೇಲ್ ವಿಳಾಸ, ನಿಜಪುದರು)",
+ "right-editmyoptions": "ಇರೆನ ಸ್ವಂತದ ಇಷ್ಟಾಯ್ಕೆಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "right-rollback": "ಒಂಜಿ ನಿರ್ದಿಷ್ಟ ಪುಟೊನು ಸಂಪಾದಿನ, ಕಡೆತ ಬಳಕೆದಾರೆನ ಸಂಪಾದಿಲೆನ್, ಬೇಗ ಪಿರತಿರ್ಗಾಲೆ.",
+ "right-markbotedits": "ಪಿರ-ತಿರ್ಗಾಯಿನ ಸಂಪಾದಿಲೆನ್ ಬೊಟ್ ಸಂಪಾದಿಲು ಇಂದ್ ಗುರುತು ಮಲ್ಪುಲೆ",
+ "right-noratelimit": "ದರ ಮಿತಿಲೆರ್ದ್ ಪರಿಣಾಮ ಆವಂದ್",
+ "right-import": "ಇತರೆ ವಿಕಿಲೆರ್ದ್ ಪುಟೊಲೆನ್ ಉಳಯಿ-ಕಣಲೆ",
+ "right-importupload": "ಒಂಜಿ ಕಡತ ಮಿತೇರಾಯಿನ ಪುಟೊಲೆನ್ ಉಳಯಿ-ಕಣಲೆ",
+ "right-patrol": "ಇತರೆರನ ಸಂಪಾದಿಲೆನ್ ಕಾಪಿನವೆಂದ್ ಗುರುತುಮಲ್ಪುಲೆ.",
+ "right-autopatrol": "ತನ್ನ ಸ್ವಂತ ಸಂಪಾದಿಲೆನ್ ಸ್ವಯಂಕೃತವಾದ್ ಕಾಪಿನವೆಂದ್ ಗುರುತುಮಲ್ಪುಲೆ.",
+ "right-patrolmarks": "ಇಂಚೊದ ಬದಲಾವಣೆಲೆನ್ ಕಾಪಿನ ಗುರುತುಲೆನ್ ತೂಲೆ",
+ "right-unwatchedpages": "ಅವೀಕ್ಷಿತ ಪುಟೊಕುಲೆನ ಪಟ್ಟಿ ತೂಲೆ",
+ "right-mergehistory": "ಪುಟೊಲೆನ ಚರಿತ್ರೆ ಸಮ್ಮಿಲಾಲೆ",
+ "right-userrights": "ಮಾತಾ ಬಳಕೆದಾರೆ ಹಕ್ಕುಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "right-userrights-interwiki": "ಇತರೆ ವಿಕಿಲೆಡ್ ಬಳಕೆದಾರೆರೆನ ಬಳಕೆ ಹಕ್ಕುಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "right-siteadmin": "ದತ್ತಾಂಶೊಗು ಬೀಗ ಪಾಡ್'ದು ಬೊಕ ಬೀಗದೆಪ್ಪುಲೆ",
+ "right-override-export-depth": "5 ಗಾಂತ್'ದ ಮುಟ್ಟದ ಪುಟೊ ಬೊಕ ಗೋಡಿನ ಪುಟೊಲೆನ್ ಪಿದಯಿಕಡಪುಡುಲೆ",
+ "right-sendemail": "ಇತರೆ ಬಳಕೆದಾರೆರೆಗ್ ಇಮೇಲ್ ಕಡಪುಡುಲೆ",
+ "right-managechangetags": " [[Special:Tags|tags]] ರಚಿಸಾಲೆ ಬೊಕ (ನ)ಕ್ರಿಯೆಮಲ್ಪಾಲೆ",
+ "right-applychangetags": "[[Special:Tags|tags]] ತನ್ನ ಬದಲಾವಣೆಲೆನ ಒಟ್ಟುಗು ಅನ್ವಯ ಮಲ್ಪುಲೆ",
+ "right-changetags": "ವೈಯಕ್ತಿಕ ಪಡಿಪಾಟೊಲು ಬೊಕ ಗಮನಿ ಸೇರಿಕೆಲೆಡ್ ವಿನಾಕ್ರಮ [[Special:Tags|tags]] ಸೇರಾಲೆ ಬೊಕ ದೆಪ್ಪುಲೆ",
+ "right-deletechangetags": " ದತ್ತಸಂಚಯೊರ್ದು [[Special:Tags|tags]] ಮಾಜಾಲೆ",
+ "grant-generic": "\"$1\" ಹಕ್ಕುಲೆನ ರಾಶಿ",
+ "grant-group-page-interaction": "ಪುಟೊಲೆಗ್ ಅಂತರಕ್ರಿಯೆ ಮಲ್ಪುಲೆ",
+ "grant-group-file-interaction": "ಮಾಧ್ಯಮೊಟ್ಟುಗು ಅಂತರಕ್ರಿಯೆ ಮಲ್ಪುಲೆ",
+ "grant-group-watchlist-interaction": "ಇರೆನ ತೂಪಿಪಟ್ಟಿಡ್ ಅಂತರಕ್ರಿಯೆ ಮಲ್ಪುಲೆ",
"grant-group-email": "ಇ-ಅಂಚೆ ಕಡಪುಡುಲೆ",
+ "grant-group-high-volume": "ಪರಮ ಪ್ರಮಾಣದ ಕ್ರಿಯೆ ಮಲ್ಪುಲೆ",
+ "grant-group-customization": "ನಿಷ್ಟಕರಣ ಬೊಕ ಇಷ್ಟಾಯ್ಕೆಲು",
+ "grant-group-administration": "ಆಡಳಿತಾತ್ಮಕ ಕ್ರಿಯೆಲೆನ್ ಮಲ್ಪುಲೆ",
+ "grant-group-private-information": "ಇರೆನ ಖಾಸಗಿ ದತ್ತಾಂಶ ದೆತೊನುಲೆ",
+ "grant-group-other": "ಇತರೆ ಕ್ರಿಯೆಲು",
+ "grant-blockusers": "ಬಳಕೆದಾರೆರೆನ್ ತಡೆಪುಲೆ ಬೊಕ ಅತಡೆಪುಲೆ",
"grant-createaccount": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
+ "grant-createeditmovepage": "ಪುಟೊಲೆನ್ ರಚಿಸಾದ್, ಸಂಪಾದಿದ್ ಬೊಕ ಪಂದಾಲೆ",
+ "grant-delete": "ಪುಟೊಲು,ಪಡಿಪಾಟೊಲು ಬೊಕ ಗಮನಿ ಸೇರಿಕೆಲೆನ್ ಮಾಜಾಲೆ",
+ "grant-editinterface": "ಮಿಡಿಯಾವಿಕಿ ಪುದರಜಾಗ ಬೊಕ ತಾನಅಗೆಲ/ಬಳಕೆದಾರೆ ಜೆಎಸ್ಒಎನ್ ಸಂಪಾದಿಲೆ",
+ "grant-editmycssjs": "ಇರೆನ ಬಳಕೆದಾರೆ ಸಿಎಸ್ಎಸ್/ ಜೆಎಸ್ಒಎನ್ /ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಸಂಪಾದಿಲೆ",
+ "grant-editmyoptions": "ಇರೆನ ಬಳಕೆದಾರೆ ಇಷ್ಟಾಯ್ಕೆಲು ಬೊಕ ಜೆಎಸ್ಒಎನ್ ಸಂರಚನೆನ್ ಸಂಪಾದಿಲೆ",
+ "grant-editmywatchlist": "ಇರೆನ ತೂಪಿಪಟ್ಟಿನ್ ಸಂಪಾದಿಲೆ",
+ "grant-editsiteconfig": "ತಾನ-ಅಗೆಲದ ಬೊಕ ಬಳಕೆದಾರೆ ಸಿಎಸ್ಎಸ್/ ಜೆಎಸ್ ಸಂಪಾದಿಲೆ",
+ "grant-editpage": "ಉಪ್ಪುನ ಪುಟೊಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "grant-editprotected": "ರಕ್ಷಿತ ಪುಟೊಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "grant-highvolume": "ಭಾರೀ ಪ್ರಮಾಣದ ಸಂಪಾದಿಕೆ",
+ "grant-oversight": "ಬಳಕೆದಾರೆರೆನ್ ದೆಂಗಾಲೆ ಬೊಕ ಪಡಿಪಾಟೊಲೆನ್ ದಮನಿಸಾಲೆ",
+ "grant-patrol": "ಪುಟೊಲೆನ ಕಾಪಿನ ಬದಲಾವಣೆಲು",
+ "grant-privateinfo": "ಖಾಸಗಿ ಮಾಹಿತಿ ದೆತೊನುಲೆ",
+ "grant-protect": "ಪುಟೊಲೆನ್ ರಕ್ಷಿಸಾಲೆ ಬೊಕ ಅರಕ್ಷಿಸಾಲೆ",
+ "grant-rollback": "ಪುಟೊಲೆನ ಬದಲಾವಣೆಲೆನ್ ಪಿರತಿರ್ಗಾಲೆ",
+ "grant-sendemail": "ಇತರೆ ಬಳಕೆದಾರೆರೆಗ್ ಇಮೇಲ್ ಕಡಪುಡುಲೆ",
+ "grant-uploadeditmovefile": "ಕಡತೊಲೆನ್ ಮಿತೇರಾಲೆ,ಪಿರಪಲ್ಲಟ ಮಲ್ಪಿ ಬೊಕ ಪಂದಾಲೆ",
+ "grant-uploadfile": "ಪೊಸ ಕಡತೊಲೆನ್ ಮಿತೇರಾಲೆ",
+ "grant-basic": "ಮೂಲ ಹಕ್ಕುಲು",
+ "grant-viewdeleted": "ಮಾಜಾಯಿನ ಕಡತೊಲು ಬೊಕ ಪುಟೊಲೆನ್ ತೂಲೆ",
+ "grant-viewmywatchlist": "ಇರೆನ ತೂಪಿಪಟ್ಟಿನ್ ತೂಲೆ",
+ "grant-viewrestrictedlogs": "ನಿರ್ಬಂದಿತ ಗಮನಿ ಸೇರಿಕೆಲೆನ್ ತೂಲೆ",
"newuserlogpage": "ಸದಸ್ಯೆರೆ ಉಂಡುಮಲ್ತಿನ ದಾಕಲೆ",
+ "newuserlogpagetext": "ಉಂದು ಬಳಕೆದಾರೆರೆ ರಚನೆಲೆನ ಒಂಜಿ ಗಮನಿ",
"rightslog": "ಸದಸ್ಯೆರ್ನ ಹಕ್ಕ್ ದಾಖಲೆ",
+ "rightslogtext": "ಉಂದು ಬಳಕೆದಾರ ಹಕ್ಕುಲೆನ ಬದಲಾವಣೆಲೆನ ಒಂಜಿ ಗಮನಿ",
"action-read": "ಈ ಪುಟೊನು ಓದುಲೆ",
"action-edit": "ಈ ಪುಟೊನು ಸಂಪೊಲಿಪುಲೆ",
"action-createpage": "ಈ ಪುಟೊನು ಸೃಷ್ಟಿಸಾಲೆ",
"action-createtalk": "ಚರ್ಚಾ ಪುಟೊನ್ ಸೃಷ್ಟಿಸಾಲೆ",
"action-createaccount": "ಈ ಸದಸ್ಯೆರನ ಖಾತೆನ್ ಉಂಡುಮಲ್ಪುಲೆ",
+ "action-autocreateaccount": "ಈ ಬಾಹ್ಯ ಬಳಕೆದಾರೆ ಖಾತೆನ್ ಸ್ವಯಂಕೃತವಾದ್ ರಚಿಸಾಲೆ",
+ "action-history": "ಈ ಪುಟೊತ ಚರಿತ್ರೆನ್ ತೂಲೆ",
"action-minoredit": "ಉದೊಂಜಿ ಎಲ್ಯ ಬದಲಾವಣೆ",
"action-move": "ಈ ಪೂಟೊನು ಮೂವ್(ಸ್ಥಳಾಂತರ) ಮಲ್ಪುಲೆ",
+ "action-move-subpages": "ಈ ಪುಟೊನು ಬೊಕ ಅಯಿತ ಉಪಪುಟೊಲೆನ್ ಪಂದಾಲೆ",
+ "action-move-rootuserpages": "ಮೂಲ ಬಳಕೆದಾರೆ ಪುಟೊಲೆನ್ ಪಂದಾಲೆ",
+ "action-move-categorypages": "ವರ್ಗ ಪುಟೊಲೆನ್ ಪಂದಾಲೆ",
"action-movefile": "ಈ ಫೈಲ್‘ನ್ ಸ್ಥಳಾಂತರ ಮಲ್ಪುಲೆ",
"action-upload": "ಈ ಫೈಲ್‘ನ್ ಅಪ್‘ಲೋಡ್ ಮಲ್ಪುಲೆ",
+ "action-reupload": "ಉಪ್ಪುನ ಕಡತದ ಮಿತ್'ಬರೇಲೆ",
+ "action-reupload-shared": " ಈ ಕಡತೊನು ಪಟ್ಟಿನ ಸಂಚಯೊಡು ಮೇಲ್ಸವಾರಿ ಮಲ್ಪುಲೆ",
+ "action-upload_by_url": "ಈ ಕಡತೊನು ಒಂಜಿ ಯುಆರ್'ಎಲ್' ರ್ದ್ ಮಿತೇರಾಲೆ",
+ "action-writeapi": "ಬರೆಪಿ ಎಪಿಐ'ನ್ ಬಳಸಿಲೆ.",
"action-delete": "ಈ ಪುಟೊನ್ ಮಾಜಾಲೆ",
"action-deleterevision": "ಈ ಆವೃತ್ತಿನ್ ಮಾಜಾಲೆ",
+ "action-deletelogentry": "ಗಮನಿ ಸೇರಿಕೆಲೆನ್ ಮಾಜಾಲೆ.",
+ "action-deletedhistory": "ಒಂಜಿ ಪುಟತ ಮಾಜಾಯಿನ ಚರಿತ್ರೆನ್ ತೂಲೆ",
+ "action-deletedtext": "ಮಾಜಾಯಿನ ಪಡಿಪಾಟ ಪಟ್ಯೊನು ತೂಲೆ",
"action-browsearchive": "ಮಜಾಯಿನಾ ಪುಟೋನ್ ನಡ್ಲೆ",
"action-undelete": "ಪುಟೊಲೆನ್ ಮಾಜಾವಂದೆ ದೀಲೆ",
+ "action-suppressrevision": "ದೆಂಗಿನ ಪಡಿಪಾಟೊಲೆನ್ ಪಿರತೂದ್ ಬೊಕ ಪಿರತಾಪಿಸಾಲೆ",
+ "action-suppressionlog": "ಈ ಖಾಸಗಿ ಗಮನಿನ್ ತೂಲೆ",
+ "action-block": "ಈ ಬಳಕೆದಾರೆ ಸಂಪಾದಿಸನಂಚ ತಡೆಪುಲೆ",
+ "action-protect": "ಈ ಪುಟೊಕು ರಕ್ಷಣಾ ಮಜಲುಲೆನ್ ಬದಲಾಲೆ",
+ "action-rollback": "ಒಂಜಿ ನಿರ್ದಿಷ್ಟ ಪುಟೊನು ಸಂಪಾದಿನ, ಕಡೇತ ಬಳಕೆದಾರೆನ ಸಂಪಾದಿಲೆನ್, ಬೇಗ ಪಿರತಿರ್ಗಾಲೆ.",
+ "action-import": "ನನೊಂಜಿ ವಿಕಿರ್ದ್ ಪುಟೊಲೆನ್ ಉಳಯಿ-ಕಣಲೆ",
+ "action-importupload": "ಒಂಜಿ ಕಡತ ಮಿತೇರಾಯಿನ ಪುಟೊಲೆನ್ ಉಳಯಿ-ಕಣಲೆ",
+ "action-patrol": "ಇತರೆರೆನ ಸಂಪಾದಿಲೆನ್ ಕಾಪಿನವೆಂದ್ ಗುರುತುಮಲ್ಪುಲೆ.",
+ "action-autopatrol": "ಇರೆನ ಸಂಪಾದಿನ್ ಕಾಪಿನವು ಇಂದ್ ಗುರುತುಮಲ್ಪುಲೆ",
+ "action-unwatchedpages": "ಅವೀಕ್ಷಿತ ಪುಟೊಲೆನ ಪಟ್ಟಿನ್ ತೂಲೆ",
+ "action-mergehistory": "ಈ ಪುಟೊತ ಚರಿತ್ರೆನ್ ಸಮ್ಮಿಲಾಲೆ",
+ "action-userrights": "ಮಾತಾ ಬಳಕೆದಾರೆ ಹಕ್ಕುಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "action-userrights-interwiki": "ಇತರೆ ವಿಕಿಲೆಡ್ ಬಳಕೆದಾರೆರೆನ ಬಳಕೆ ಹಕ್ಕುಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "action-siteadmin": "ದತ್ತಸಂಚಯೊಗು ಬೀಗಪಾಡ್'ಲೆ ಇಜಿಂಡ ಬೀಗದೆಪ್ಪುಲೆ",
"action-sendemail": "ಇ-ಅಂಚೆ ಕಡಪುಡುಲೆ",
+ "action-editmyoptions": "ಇರೆನ ಇಷ್ಟಾಯ್ಕೆಲೆನ್ ಸಂಪಾದಿಲೆ",
+ "action-editmywatchlist": "ಇರೆನ ತೂಪಿಪಟ್ಟಿನ್ ಸಂಪಾದಿಲೆ",
+ "action-viewmywatchlist": "ಇರೆನ ತೂಪಿಪಟ್ಟಿನ್ ತೂಲೆ",
+ "action-viewmyprivateinfo": "ಇರೆನ ಖಾಸಗಿ ಮಾಹಿತಿನ್ ತೂಲೆ",
+ "action-editmyprivateinfo": "ಇರೆನ ಖಾಸಗಿ ಮಾಹಿತಿನ್ ಸಂಪಾದಿಲೆ",
+ "action-editcontentmodel": "ಒಂಜಿ ಪುಟೊತ ವಿಷಯ ಮಾದರಿನ್ ಸಂಪಾದಿಲೆ",
+ "action-managechangetags": "ಕುಚ್ಚಿಲೆನ್ ರಚಿಸಾಲೆ ಬೊಕ (ನ)ಕ್ರಿಯಾ ಮಲ್ಪುಲೆ",
+ "action-applychangetags": "ಇರೆನ ಬದಲಾವಣೆದೊಟ್ಟುಗು ಕುಚ್ಚಿಲೆನ್ ಅನ್ವಯಿಸಾಲೆ",
+ "action-changetags": "ವೈಯಕ್ತಿಕ ಪಡಿಪಾಟೊಲು ಬೊಕ ಗಮನಿ ಸೇರಿಕೆಲೆಡ್, ವಿನಾಕ್ರಮ ಕುಚ್ಚಿಲೆನ್ ಸೇರಾಲೆ ಬೊಕ ದೆಪ್ಪುಲೆ",
+ "action-deletechangetags": "ದತ್ತಸಂಚಯೊದ ಕುಚ್ಚಿಲೆನ್ ಮಾಜಾಲೆ",
+ "action-purge": "ಈ ಪುಟೊನು ಉರ್ಚಾಲೆ",
"nchanges": "$1 {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಲು}}",
+ "enhancedrc-since-last-visit": "$1 {{PLURAL:$1| ಕಡೆತ ಸಂದರ್ಶನೊರ್ದು ಇಂಚಿಗ್ }}",
"enhancedrc-history": "ಇತಿಹಾಸೊ",
"recentchanges": "ಇಂಚಿಪೊದ ಬದಲಾವಣೆಲು",
"recentchanges-legend": "ಇಂಚಿಪೊದ ಬದಲಾವಣೆಲೆ ಆಯ್ಕೆಲು",
"recentchanges-summary": "ಈ ವಿಕಿಟ್ ಇಂಚಿಪ್ಪ ಮಲ್ತ್ನ ಬದಲಾವಣೆನ್ ಈ ಪುಟೊಡು ಈರ್ ತೂವೊಲಿ",
"recentchanges-noresult": "ಈ ಮಾನದಂಡೊಲೆಗ್ ಸರಿ ಒಂಬುನ ಬದಲಾವಣೆಲು ಕೊರಿನ ಪೊರ್ತುಡು ಇಜ್ಜಿ",
+ "recentchanges-timeout": "ಈ ನಾಡುನ ಕಾಲ ಕರಿಂಡ್. ಈರ್ ಬೇತೆ ನಾಡುನ ಪರಿಮಾನೊಲೆನ್ ಯತ್ನಿಸಾವರೆ ಬಯಸೊಲಿ.",
+ "recentchanges-network": "ಒಂಜಿ ತಾಂತ್ರಿಕ ದೋಷದ ಕಾರಣ, ಒವ್ವೆ ಫಲಿತಾಂಶೊಲೆನ್ ದಿಂಜಾವರೆ ಆತಿಜಿ. ದಯಮಲ್ತ್ ಪುಟೊನು ಪಿರಚೇತನ ಮಲ್ಪರೆ ಯತ್ನಿಸಾಲೆ.",
+ "recentchanges-notargetpage": "ಮಿತ್ತ್ ಒಂಜಿ ಪುಟತ ಪುದರ್ ಸೇರಾಲೆ, ಆ ಪುಟ ಸಮ್ಮಂದದ ಬದಲಾವಣೆಲೆನ್ ತೂವರೆಗಾದ್",
"recentchanges-feed-description": "ಈ ಫೀಡ್ಡ್ ವಿಕಿಕ್ ಇಂಚಿಪ್ಪ ಆತಿನಂಚಿನ ಬದಲಾವಣೆಲೆನ್ ತೂವೊಂದುಪ್ಪೊಲಿ.",
"recentchanges-label-newpage": "ಈ ಬದಲಾವಣೆ ಒಂಜಿ ಪೊಸ ಪುಟೊನು ಉಂಡು ಮಲ್ತ್ಂಡ್.",
"recentchanges-label-minor": "ಉಂದು ಕಿಞ್ಞ ಬದಲಾವಣೆ",
"recentchanges-legend-heading": "<strong>ಪರಿವಿಡಿ:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|ಪೊಸ ಪುಟೊಕ್ಲೆನ ಪಟ್ಟಿ]]ನ್ಲಾ ತೂಲೆ)",
"recentchanges-submit": "ತೋಜಾಲೆ",
+ "rcfilters-tag-remove": " '$1' ದೆಪ್ಪುಲೆ",
+ "rcfilters-legend-heading": "<strong>ಸಂಕ್ಷೇಪೊಲೆನ ಪಟ್ಟಿ:</strong>",
+ "rcfilters-other-review-tools": "ಇತರೆ ಪಿರತೂಪಿನ ಉಪಕರಣೊಲು",
+ "rcfilters-group-results-by-page": "ಪುಟ ಅನುಸಾರ ಗುಂಪು ಫಲಿತಾಂಶೊಲು",
+ "rcfilters-activefilters": "ಸಕ್ರಿಯ ಅರಿಪೆಲು",
+ "rcfilters-activefilters-hide": "ದೆಂಗಾಲೆ",
+ "rcfilters-activefilters-show": "ತೋಜಾಲೆ",
+ "rcfilters-activefilters-hide-tooltip": "ಸಕ್ರಿಯ ಅರಿಪೆಲೆನ ಜಾಗ ದೆಂಗಾಲೆ",
+ "rcfilters-activefilters-show-tooltip": "ಸಕ್ರಿಯ ಅರಿಪೆಲೆನ ಜಾಗ ತೋಜಾಲೆ",
+ "rcfilters-advancedfilters": "ಮುಂದರಿನ ಅರಿಪೆಲು",
+ "rcfilters-limit-title": "ತೋಜಾರೆ ಫಲಿತಾಂಶೊಲು",
+ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಲು}}, $2",
+ "rcfilters-date-popup-title": "ನಾಡರೆ ಕಾಲಾವಧಿ",
+ "rcfilters-days-title": "ಇಂಚೊದ ದಿನೊಲು",
+ "rcfilters-hours-title": "ಇಂಚೊದ ಗಂಟೆಲು",
+ "rcfilters-days-show-days": "$1 {{PLURAL:$1|ದಿನ|ದಿನೊಲು}}",
+ "rcfilters-days-show-hours": "$1 {{PLURAL:$1|ಗಂಟೆ|ಗಂಟೆಲು}}",
+ "rcfilters-highlighted-filters-list": "ಅತಿಪ್ರಕಾಶಿತ: $1",
"rcfilters-quickfilters": "ಅರಿತ್ನ ವಿಸಯೊನ್ ಒರಿಪಾಲೆ",
+ "rcfilters-quickfilters-placeholder-title": "ಒವ್ವೆ ಅರಿಪೆಲೆನ್ ನನಲಾ ಒರಿಪಾದಿಜಿ.",
+ "rcfilters-quickfilters-placeholder-description": "ಇರೆನ ಅರಿಪೆ ಅಟ್ಟಣೆಲೆನ್ ಒರಿಪಾದ್ ಬೊಕ ಅವೆನ್ ಪಿರಬಳಕೆ ಮಲ್ಪರೆ, ತಿರ್ತ್'ದ ಸಕ್ರಿಯ ಅರಿಪೆಲೆನ ಜಾಗೊಡು, ಪುಸ್ತಕಗುರ್ತುದ ಕಿನ್ನೆನ್ ಒತ್ತುಲೆ",
+ "rcfilters-savedqueries-defaultlabel": "ಒರಿಪಾಯಿನ ಅರಿಪೆಲು",
"rcfilters-savedqueries-rename": "ಪೊಸ ಪುದರ್",
+ "rcfilters-savedqueries-setdefault": "ಸಮಸ್ಥಿತಿರೂಪೊದ ಅಟ್ಟಣೆ ಮಲ್ಪುಲೆ",
+ "rcfilters-savedqueries-unsetdefault": "ಸಮಸ್ಥಿತಿರೂಪೊ ದೆಪ್ಪುಲೆ",
"rcfilters-savedqueries-remove": "ಮಾಜಾಲೆ",
"rcfilters-savedqueries-new-name-label": "ಪುದರ್",
+ "rcfilters-savedqueries-new-name-placeholder": "ಅರಿಪೆದ ಉದ್ದೇಶ ವಿವರಿಸಾಲೆ",
+ "rcfilters-savedqueries-apply-label": "ಅರಿಪೆ ರಚಿಸಾಲೆ",
+ "rcfilters-savedqueries-apply-and-setdefault-label": "ಸಮಸ್ಥಿತಿ ಅರಿಪೆ ರಚಿಸಾಲೆ",
"rcfilters-savedqueries-cancel-label": "ವಜಾ ಮಲ್ಪುಲೆ",
+ "rcfilters-savedqueries-add-new-title": "ಇತ್ತೆದ ಅರಿಪೆ ಅಟ್ಟಣೆಲೆನ್ ಒರಿಪಾಲೆ",
+ "rcfilters-savedqueries-already-saved": "ಇಂಚಿತ್ತಿ ಅರಿಪೆಲೆನ್ ಇದಮುಟ್ಟನೆ ಒರಿಪಾದುಂಡು. ಒಂಜಿ ಪೊಸ ಒರಿಪಾಯಿನ ಅರಿಪೆ ರಚಿಸಾರೆ, ಇರೆನ ಅಟ್ಟಣೆಲೆನ್ ಬದಲಾಲೆ.",
+ "rcfilters-restore-default-filters": "ಸಮಸ್ಥಿತಿ ಅರಿಪೆಲೆನ್ ಪಿರತಾಪಿಸಾಲೆ",
+ "rcfilters-clear-all-filters": "ಮಾತಾ ಅರಿಪೆಲೆನ್ ಖಾಲಿ ಮಲ್ಪುಲೆ.",
+ "rcfilters-show-new-changes": "ಪೊಚ್ಚಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೂಲೆ",
+ "rcfilters-search-placeholder": "ಅರಿಪೆ ಬದಲಾವಣೆಲು (ಯಾದಿ ಬಳಕೆ ಮಲ್ಪುಲೆ ಇಜಿಂಡ ಅರಿಪೆ ಪುದರುಡು ನಾಡ್'ಲೆ )",
+ "rcfilters-invalid-filter": "ಅಮಾನ್ಯ ಅರಿಪೆ",
+ "rcfilters-empty-filter": "ಸಕ್ರಿಯ ಅರಿಪೆಲು ಇಜ್ಜಿ. ಮಾತಾ ಕಾಣಿಕೆಲೆನ್ ತೋಜಾದುಂಡು.",
+ "rcfilters-filterlist-title": "ಅರಿಪೆಲು",
"rcfilters-filterlist-whatsthis": "ಉಂದು ಎಂಚ ಬೇಲೆ ಮಲ್ಪುಂಡು?",
+ "rcfilters-filterlist-feedbacklink": "ಇಂಚಿನ ಅರಿಪೆ ಉಪಕರಣೆಲೆನ ಮಿತ್ತ್ ಈರ್ ದಾದ ಎಣ್ಣುವರ್ ಇಂದ್ ಎಂಕಲೆಗ್ ತೆರಿಪಾಲೆ.",
+ "rcfilters-highlightbutton-title": "ಫಲಿತಾಂಶೊಲೆನ್ ಅತಿಪ್ರಕಾಶಿಸಾಲೆ.",
+ "rcfilters-highlightmenu-title": "ಒಂಜಿ ಬಣ್ಣೊನು ಪೆಜಿಲೆ.",
+ "rcfilters-highlightmenu-help": "ಈ ಗುಣೊನು ಅತಿಪ್ರಕಾಶಿಸಾರೆ ಒಂಜಿ ಬಣ್ಣೊನು ಪೆಜಿಲೆ.",
+ "rcfilters-filterlist-noresults": "ಒವ್ವೆ ಅರಿಪೆಲು ತಿಕ್ಕುಜಿ.",
+ "rcfilters-noresults-conflict": "ಒವ್ವೆ ಫಲಿತಾಂಶೊಲು ತಿಕ್ಕುಜಾ ಕಾರಣ ನಾಡುನ ಮಾನಕೊಲು ಸಂಘರ್ಷೊಡು ಉಲ್ಲಾ.",
+ "rcfilters-state-message-subset": "ಈ ಅರಿಪೆಗ್ ಒವ್ವೆ ಪರಿಣಾಮ ಇಜ್ಜಿ, ಕಾರಣ ಅಯಿತ ಫಲಿತಾಂಶೊಲು ಈ ತಿರತ್'ದೊಟ್ಟುಗು ಸೇರೊಂದಾ,\nವಿಶಾಲವಾದ್ {{PLURAL:$2|ಅರಿಪೆ|ಅರಿಪೆಲು}} (ಅವೆನ್ ಪ್ರಶಸ್ತ ಮಲ್ಪರೆ ಅತಿಪ್ರಕಾಶಿಸಾವರೆ ಯತ್ನಿಸಾಲೆ): $1",
+ "rcfilters-state-message-fullcoverage": "ಈ ಗುಂಪುದ ಮಾತಾ ಅರಿಪೆಲೆನ್ ಪೆಜುನವು ಒಂಜೆನ್ಲಾ ಪೆಜಂದಿನೆಕ್ ಸಮಾ, ಆಯಿನೆರ್ದಾವರಾ ಈ ಅರಿಪೆಗ್ ಪರಿಣಾಮ ಇಜ್ಜಿ. ಗುಂಪುಡು $1 ಸೇರ್ದುಂಡು.",
+ "rcfilters-filtergroup-authorship": "ಕಾಣಿಕೆ ಲೇಖಕತ್ವ",
+ "rcfilters-filter-editsbyself-label": "ಈರ್ ಮಲ್ತಿನ ಬದಲಾವಣೆಲು",
+ "rcfilters-filter-editsbyself-description": "ಇರೆನ ಸ್ವಂತದ ಕಾಣಿಕೆಲು",
+ "rcfilters-filter-editsbyother-label": "ಇತರೆರ್ ಮಲ್ತಿನ ಬದಲಾವಣೆಲು",
+ "rcfilters-filter-editsbyother-description": "ಇರೆನ ಸ್ವಂತದ ಬುಡುದು, ಮಾತಾ ಬದಲಾವಣೆಲು",
+ "rcfilters-filtergroup-userExpLevel": "ಬಳಕೆದಾರೆ ನೊಂದಣಿ ಬೊಕ ಅನುಭವ",
+ "rcfilters-filter-user-experience-level-registered-label": "ನೋಂದಾಯಿನ",
+ "rcfilters-filter-user-experience-level-registered-description": "ಉಳಗಮನ ಆತಿನ ಸಂಪಾದಕೆರ್",
+ "rcfilters-filter-user-experience-level-unregistered-label": "ಅನೊಂದಾಯಿತ",
+ "rcfilters-filter-user-experience-level-unregistered-description": "ಉಳಗಮನ ಆವಂದಿನ ಸಂಪಾದಕೆರ್",
+ "rcfilters-filter-user-experience-level-newcomer-label": "ಪೊಸತ್'ಬತ್ತಿನಕುಲು",
+ "rcfilters-filter-user-experience-level-newcomer-description": "10 ಸಂಪಾದಿಲೆರ್ದ್ ಕಡಿಮೆ, ಇಜಿಂಡ 4 ದಿನತ ಸಕ್ರಿಯೆ ಇತ್ತಿನ, ನೊಂದಾಯಿನ ಸಂಪಾದಕೆರ್",
"rcfilters-filter-user-experience-level-learner-label": "ಕಲ್ಪುನರ್",
+ "rcfilters-filter-user-experience-level-learner-description": " \"ಪೊಸತ್'ಬತ್ತಿನಕುಲು\" ಬೊಕ \"ಅನುಭವಿ ಬಳಕೆದಾರೆರ್\" ಈ ನಡುಟು ಬೂರುನ ಅನುಭವ ಇತ್ತಿನ ನೊಂದಾಯಿನ ಸಂಪಾದಕೆರ್",
+ "rcfilters-filter-user-experience-level-experienced-label": "ಅನುಭವಿ ಬಳಕೆದಾರೆರ್",
+ "rcfilters-filter-user-experience-level-experienced-description": "500 ಸಂಪಾದಿಲೆರ್ದ್ ಹೆಚ್ಚ ಬೊಕ 30 ದಿನೊತ ಸಕ್ರಿಯೆ ಇತ್ತಿನ ನೋಂದಾಯಿನ ಸಂಪಾದಕೆರ್",
+ "rcfilters-filtergroup-automated": "ಸ್ವಯಂಕೃತ ಕಾಣಿಕೆಲು",
+ "rcfilters-filter-bots-label": "ಬೊಟ್",
+ "rcfilters-filter-bots-description": "ಸ್ವಯಂಕೃತ ಉಪಕರಣೊಲು ಮಲ್ತಿನ ಸಂಪಾದಿಲು",
+ "rcfilters-filter-humans-label": "ಮಾನವೆ(ಬೊಟ್ ಅತ್ತ್)",
+ "rcfilters-filter-humans-description": "ಮಾನವ ಸಂಪಾದಕೆರ್ ಮಲ್ತಿನ ಸಂಪಾದಿಲು.",
+ "rcfilters-filtergroup-reviewstatus": "ಸ್ಥಿತಿನ್ ಪಿರತೂಲೆ.",
+ "rcfilters-filter-reviewstatus-unpatrolled-description": "ಅಂಗಿಕವಾದಾತ್ತಾಂದೆ ಇಜಿಂಡ ಸ್ವಯಂಕೃತವಾದ್ ಕಾಪಿನವು ಇಂದ್ ಗುರುತುಪಾಡಿನ ಸಂಪಾದಿಲು",
+ "rcfilters-filter-reviewstatus-unpatrolled-label": "ಕಾಪಂದಿನವು",
+ "rcfilters-filter-reviewstatus-manual-description": "ಅಂಗಿಕವಾದ್ ಕಾಪಿನವು ಇಂದ್ ಗುರುತುಪಾಡಿನ ಸಂಪಾದಿಲು",
+ "rcfilters-filter-reviewstatus-manual-label": "ಅಂಗಿಕವಾದ್ ಕಾಪಿನವು",
+ "rcfilters-filter-reviewstatus-auto-description": " ಕಾಯಕ ಸ್ವಯಂಕೃತವಾದ್ ಕಾಪಿನವು ಇಂದ್ ಗುರುತಾಯಿನ ಮುಂದರಿನ ಬಳಕೆದಾರೆರೆನ, ಸಂಪಾದಿಲು",
+ "rcfilters-filter-reviewstatus-auto-label": "ಸ್ವಯಂ-ಕಾಪಿನವು",
+ "rcfilters-filtergroup-significance": "ವಿಶಿಷ್ಟತೆ",
+ "rcfilters-filter-minor-label": "ಕಿನ್ಯ ಸಂಪಾದಿಲು",
+ "rcfilters-filter-minor-description": "ಲೇಖಕೆ ಕಿನ್ಯ ಇಂದ್ ಪುದರ್ಪಟ್ಟಿ ಪಾಡಿನ ಸಂಪಾದಿಲು",
+ "rcfilters-filter-major-label": "ಕಿನ್ಯ-ಅತ್ತಾಂದಿನ ಸಂಪಾದಿಲು",
+ "rcfilters-filter-major-description": "ಕಿನ್ಯ ಇಂದ್ ಪುದರ್ಪಟ್ಟಿ ಪಾಡಂದಿನ ಸಂಪಾದಿಲು",
+ "rcfilters-filtergroup-watchlist": "ತೂಪಿಪಟ್ಟಿಯಾತಿನ ಪುಟೊಲು",
+ "rcfilters-filter-watchlist-watched-label": "ತೂಪಿಪಟ್ಟಿಡ್",
+ "rcfilters-filter-watchlist-watched-description": "ಇರೆನ ತೂಪಿಪಟ್ಟಿದ ಪುಟೊಲೆಡ್ ಬದಲಾವಣೆಲು",
+ "rcfilters-filter-watchlist-watchednew-label": "ಪೊಸ ತೂಪಿಪಟ್ಟಿದ ಬದಲಾವಣೆಲು",
+ "rcfilters-filter-watchlist-watchednew-description": "ತೂಪಿಪಟ್ಟಿದ ಪುಟೊಲೆಡ್ ಬದಲಾವಣೆಲು, ಬದಲಾವಣೆ ಆಯಿಬೊಕ ಈರ್ ತೂವಂದಿನವು.",
+ "rcfilters-filter-watchlist-notwatched-label": "ತೂಪಿಪಟ್ಟಿಡ್ ಇಜ್ಜಿ",
+ "rcfilters-filter-watchlist-notwatched-description": "ಇರೆನ ತೂಪಿಪಟ್ಟಿದ ಪುಟೊಲೆಡ್ ಬದಲಾವಣೆಲೆನ್ ಬುಡುದು ಮಾತಾ",
+ "rcfilters-filtergroup-watchlistactivity": "ತೂಪಿಪಟ್ಟಿದ ಕ್ರಿಯೆ",
+ "rcfilters-filter-watchlistactivity-unseen-label": "ತೂವಂದಿನ ಬದಲಾವಣೆಲು",
+ "rcfilters-filter-watchlistactivity-unseen-description": "ಪುಟೊಲೆಡ್ ಬದಲಾವಣೆಲು, ಬದಲಾವಣೆ ಆಯಿಬೊಕ ಈರ್ ತೂವಂದಿನವು.",
+ "rcfilters-filter-watchlistactivity-seen-label": "ತೂಯಿನ ಬದಲಾವಣೆಲು",
+ "rcfilters-filter-watchlistactivity-seen-description": "ಪುಟೊಲೆಡ್ ಬದಲಾವಣೆಲು, ಬದಲಾವಣೆ ಆಯಿಬೊಕ ಈರ್ ತೂತಿನವು.",
+ "rcfilters-filtergroup-changetype": "ಬದಲಾವಣೆದ ನಮೂನೆ",
+ "rcfilters-filter-pageedits-label": "ಪುಟ ಸಂಪಾದಿಲು",
+ "rcfilters-filter-pageedits-description": "ವಿಕಿ ವಿಷಯ, ಚರ್ಚೆಲು, ವರ್ಗ ವಿವರಣೆಲೆಗ್ ಸಂಪಾದಿಲು..",
+ "rcfilters-filter-newpages-label": "ಪುಟ ರಚನೆಲು",
+ "rcfilters-filter-newpages-description": "ಪೊಸ ಪುಟ ಮಲ್ಪುನ ಸಂಪಾದಿಲು",
+ "rcfilters-filter-categorization-label": "ವರ್ಗ ಬದಲಾವಣೆಲು",
+ "rcfilters-filter-categorization-description": "ವರ್ಗೊಲೆಡ್ ಸೇರಾವೊಂದಿತ್ತಿನ ಇಜಿಂಡ ದೆತ್ತಿದಿನ ಪುಟೊಲೆನ ದಾಖಲೆಲು",
+ "rcfilters-filter-logactions-label": "ಗಮನಿತ ಕಾರ್ಯೊಲು",
+ "rcfilters-filter-logactions-description": "ನಿರ್ವಾಹಕ ಕಾರ್ಯೊಲು, ಖಾತೆ ರಚನೆಲು, ಪುಟ ಮಾಜಿಕೆಲು, ಮಿತೇರಾಯಿನವು ....",
+ "rcfilters-hideminor-conflicts-typeofchange-global": "\"ಕಿನ್ಯ ಸಂಪಾದಿಲು\" ಅರಿಪೆ ಒಂಜಿ ಇಜಿಂಡ ಹೆಚ್ಚಿನ ಅರಿಪೆಲ ಒಟ್ಟುಗು ಸಂಘರ್ಷೊಡು ಉಂಡು, ಕಾರಣ ಕೆಲ ಬಗೆತ ಬದಲಾವಣೆಲೆನ್ \" ಕಿನ್ಯ \" ಇಂದ್ ಪಣೆರೆ ಆಪುಜಿ. ಸಂಘರ್ಷದ ಅರಿಪೆಲೆನ್, ಮಿತ್ತ್'ದ ಸಕ್ರಿಯ ಅರಿಪೆಲೆನ ಜಾಗೊಡು ಗುರುತು ಮಲ್ಪುಂಡು.",
+ "rcfilters-hideminor-conflicts-typeofchange": " ಕೆಲ ಬಗೆತ ಬದಲಾವಣೆಲೆನ್ \" ಕಿನ್ಯ \" ಇಂದ್ ಪಣೆರೆ ಆಪುಜಿ. ಅಂಚಾದ್ ಈ ಅರಿಪೆ, ಈ ದುಂಬುದ $1 ಅರಿಪೆಲೆನ ಬದಲಾವಣೆಡ್ ಸಂಘರ್ಷ ಮಲ್ಪುಂಡು:",
+ "rcfilters-typeofchange-conflicts-hideminor": "ಈ ಬಗೆತ ಅರಿಪೆಲೆನ ಬದಲಾವಣೆ \"ಕಿನ್ಯ ಸಂಪಾದಿಲು\" ಅರಿಪೆದ ಒಟ್ಟುಗು ಸಂಘರ್ಷ ಮಲ್ಪುಂಡು: ಕೆಲ ಬಗೆತ ಬದಲಾವಣೆಲೆನ್ \" ಕಿನ್ಯ \" ಇಂದ್ ಪಣೆರೆ ಆಪುಜಿ.",
+ "rcfilters-filtergroup-lastRevision": "ಇಂಚೊದ ಪಡಿಪಾಟೊಲು",
+ "rcfilters-filter-lastrevision-label": "ಇಂಚೊದ ಪಡಿಪಾಟ",
+ "rcfilters-filter-lastrevision-description": "ಒಂಜಿ ಪುಟೊಕು ಅತಿ ಇಂಚೊದ ಬದಲಾವಣೆ ಮಾತ್ರಾ",
+ "rcfilters-filter-previousrevision-label": "ಇಂಚೊದ ಪಡಿಪಾಟ ಅತ್ತ್",
+ "rcfilters-filter-previousrevision-description": "\"ಇಂಚೊದ ಪಡಿಪಾಟ\" ಅತ್ತಾಂದಿನ ಮಾತಾ ಬದಲಾವಣೆಲು",
+ "rcfilters-filter-excluded": "ಬುಡುದ್",
+ "rcfilters-tag-prefix-namespace-inverted": "<strong>:ಅತ್ತ್</strong> $1",
+ "rcfilters-exclude-button-off": "ಪೆಜಿನೆನ್ ಬುಡುಲೆ",
+ "rcfilters-exclude-button-on": "ಪೆಜಿನೆನ್ ಬುಡುದು",
+ "rcfilters-view-tags": "ಕುಚ್ಚಿದ ಸಂಪಾದಿಲು",
+ "rcfilters-view-namespaces-tooltip": "ಪುದರ್'ಜಾಗದ ಪ್ರಕಾರ ಫಲಿತಾಂಶೊಲೆನ್ ಅರಿಪುಲೆ",
+ "rcfilters-view-tags-tooltip": "ಸಂಪಾದಿ ಕುಚ್ಚಿಲೆನ್ ಬಳಸ್'ದ್ ಫಲಿತಾಂಶೊಲೆನ್ ಅರಿಪುಲೆ",
+ "rcfilters-view-return-to-default-tooltip": "ಪ್ರಮುಖ ಅರಿಪೆ ಯಾದಿಗ್ ಪಿರಬಲೆ",
+ "rcfilters-view-tags-help-icon-tooltip": "ಕುಚ್ಚಿದ ಸಂಪಾದಿಲೆನ ಮಿತ್ತ್ ನನಾತ್ ಕಲ್ಪುಲೆ",
+ "rcfilters-liveupdates-button": "ಜೀವಂತ ಕಾಲನವಿ'ಲು",
+ "rcfilters-liveupdates-button-title-on": "ಜೀವಂತ ಕಾಲನವಿಲೆನ್ ಉಂತಾಲೆ",
+ "rcfilters-liveupdates-button-title-off": "ಪೊಸ ಬದಲಾವಣೆಲು ಆವೊಂದಿತ್ತಿನ ಅಪಗನೆ ತೋಜಾಲೆ",
+ "rcfilters-watchlist-markseen-button": "ಮಾತಾ ಬದಲಾವಣೆಲು ತೂತಿನವು ಇಂದ್ ಗುರುತು ಮಲ್ಪುಲೆ",
+ "rcfilters-watchlist-edit-watchlist-button": "ಇರೆನ ತೂತಿನ ಪುಟೊಲೆನ ಪಟ್ಟಿನ್ ಸಂಪಾದಿಲೆ",
+ "rcfilters-watchlist-showupdated": "ಬದಲಾವಣೆಲು ಆಯಿಬೊಕ ಈರ್ ತೂವಂದಿನ ಪುಟತ ಬದಲಾವಣೆಲು <strong>ದಪ್ಪ</strong>, ಘನ ಗುರ್ತಿಕೆಡ್ ಉಂಡು.",
+ "rcfilters-preference-label": "ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಅತ್ತಾಂದಿನ ಅಂತರಮುಕ ಬಳಸಿಲೆ.",
+ "rcfilters-preference-help": "ಅರಿಪೆ ನಾಡುನ ಇಜಿಂಡ ಅತಿಪ್ರಕಾಶದ ಕಾರ್ಯಶೀಲತೆ ದಾಂತೆನೆ, ಇಂಚೊದ-ಬದಲಾವಣೆಲು ಏರಾವುಂಡು,",
+ "rcfilters-watchlist-preference-label": "ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಅತ್ತಾಂದಿನ ಅಂತರಮುಕ ಬಳಸಿಲೆ",
+ "rcfilters-watchlist-preference-help": "ಅರಿಪೆ ನಾಡುನ ಇಜಿಂಡ ಅತಿಪ್ರಕಾಶದ ಕಾರ್ಯಶೀಲತೆ ದಾಂತೆನೆ, ತೂಪಿಪಟ್ಟಿನ್ ಏರಾವುಂಡು,",
+ "rcfilters-filter-showlinkedfrom-label": " ಕೊಂಡಿದ ಪುಟೊಲೆನ ಬದಲಾವಣೆ ತೋಜಾಲೆ",
+ "rcfilters-filter-showlinkedfrom-option-label": "<strong>ಕೊಂಡಿದ ಪುಟ</strong> ಪೆಜಿದಿನ ಪುಟ",
+ "rcfilters-filter-showlinkedto-label": "ಕೊಂಡಿದ ಪುಟೊಲೆಡ್ ಬದಲಾವಣೆಲೆನ್ ತೋಜಾಲೆ",
+ "rcfilters-filter-showlinkedto-option-label": "<strong>ಕೊಂಡಿ ಕೂಡಿನ ಪುಟೊಲು</strong> ಪೆಜಿದಿನ ಪುಟ",
+ "rcfilters-target-page-placeholder": "ಒಂಜಿ ಪುಟತ ಪುದರ್ (ಇಜಿಂಡ ವರ್ಗ) ಸೇರಾಲೆ",
"rcnotefrom": "<strong>$3, $4</strong> ಡ್ದ್ ಆತಿನ {{PLURAL:$5|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಲು}} ತಿರ್ತ್ ಉಂಡು (ಒಟ್ಟುಗು <strong>$1</strong> ತೋಜೊಂದುಂಡು).",
+ "rclistfromreset": "ದಿನಾಂಕ ಆಯ್ಕೆನ್ ಪಿರತಾಪಿಸಾಲೆ",
"rclistfrom": "$2, $3 ಡ್ದ್ ಸುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
"rcshowhideminor": "$1 ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು",
"rcshowhideminor-show": "ತೋಜಾಲೆ",
"rcshowhidemine": "ಎನ್ನ ಸಂಪಾದನೆಲೆನ್ $1",
"rcshowhidemine-show": "ತೋಜಾಲೆ",
"rcshowhidemine-hide": "ಅಡೆಂಗಾವು",
+ "rcshowhidecategorization": "$1 ಪುಟ ವರ್ಗೀಕರಣ",
"rcshowhidecategorization-show": "ತೋಜಾಲೆ",
"rcshowhidecategorization-hide": "ಅಡೆಂಗಾವು",
"rclinks": "ಕರಿನ $2 ದಿನೊಲೆಡ್ ಮಲ್ತಿನ ಕಡೆತ್ತ $1 ಬದಲಾವಣೆಲೆನ್ ತೂಲೆ",
"minoreditletter": "ಕಿ",
"newpageletter": "ಪೊ",
"boteditletter": "ಬಾ",
+ "number_of_watching_users_pageview": "[$1 ತೂಪಿನ {{PLURAL:$1|ಬಳಕೆದಾರೆ|ಬಳಕೆದಾರೆರ್}}]",
"rc-change-size-new": "$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್ಲು}}ಬದಲಾವಣೆಡ್ದ್ ಬುಕ್ಕೊ",
"newsectionsummary": "\n/* $1 */ಪೊಸ ವಿಭಾಗ",
"rc-enhanced-expand": "ವಿವರೊಲೆನ್ ತೊಜಾವ್",
"recentchangeslinked-summary": "ಒಂಜಿ ನಿರ್ದಿಸ್ಟೊ ಪುಟೊರ್ದು ಸಂಪರ್ಕೊ ಉಪ್ಪುನ ಪುಟೊಕುಲೆಗ್ (ಅತ್ತಂಡ ನಿರ್ದಿಸ್ಟೊ ವರ್ಗೊಗು ಸೇರ್ದಿನ ಸದಸ್ಯೆರೆಗ್) ಇಂಚಿಪ ಮಲ್ತಿನಂಚಿನ ಬದಲಾವಣೆಲೆನ್ ತಿರ್ತ್ ಪಟ್ಟಿ ಮಲ್ತ್ದ್ಂಡ್.\n[[Special:Watchlist|ಇರೆನ ವೀಕ್ಷಣೆ ಪಟ್ಟಿಡ್]] ಉಪ್ಪುನ ಪುಟೊಕುಲು ''ದಪ್ಪ ಅಕ್ಷರೊಡು\" ಉಂಡು.",
"recentchangeslinked-page": "ಪುಟೊತ ಪುದರ್:",
"recentchangeslinked-to": "ಇಂದೆತ ಬದಲ್ಗ್ ಕೊರ್ತ್ನ ಪುಟೊಗು ಕೊಂಡಿ ಉಪ್ಪುನಂಚಿನ ಪುಟೊಲೆದ ಬದಲಾವಣೆಲೆನ್ ತೋಜಾವು",
+ "recentchanges-page-added-to-category": "[[:$1]] ವರ್ಗೊಗು ಸೇರಾದುಂಡು",
+ "recentchanges-page-added-to-category-bundled": "[[:$1]] ವರ್ಗೊಗು ಸೇರಾದುಂಡು, [[Special:WhatLinksHere/$1|ಈ ಪುಟೊ ಇತರೆ ಪುಟೊಲೆಡ್ ಸೇರಿಕೆ ಆತ್ಂಡ್]]",
+ "recentchanges-page-removed-from-category": "[[:$1]] ವರ್ಗೊರ್ದು ದೆತ್'ದ್ಂಡ್.",
+ "recentchanges-page-removed-from-category-bundled": "[[:$1]] ವರ್ಗೊರ್ದು ದೆತ್ತುದುಂಡು, [[Special:WhatLinksHere/$1|ಈ ಪುಟೊ ಇತರೆ ಪುಟೊಲೆಡ್ ಸೇರಿಕೆ ಆತ್ಂಡ್]]",
+ "autochange-username": "ಮೀಡಿಯಾವಿಕಿ ಸ್ವಯಂಕೃತ ಬದಲಾವಣೆ",
"upload": "ಫೈಲ್’ನ್ ಅಪ್ಲೋಡ್ ಮಲ್ಪುಲೆ",
"uploadbtn": "ಫೈಲ್’ನ್ ಅಪ್ಲೋಡ್ ಮಲ್ಪುಲೆ",
+ "reuploaddesc": "ಮಿತೇರಾವುನ ರದ್ದು ಮಲ್ತ್'ದ್ ಬೊಕ ಮಿತೇರಾವುನ ರೂಪತ್ರೊಗು ಪಿರಪೋಲೆ",
+ "upload-tryagain": "ತಿದ್ದಿಪಾಡಿನ ಕಡತದ ವಿವರೊನು ಸಲ್ಲಿಸಾಲೆ",
+ "upload-tryagain-nostash": "ಪಿರ-ಮಿತೇರಾಯಿನ ಕಡತ ಬೊಕ ತಿದ್ದಿಪಾಡಿನ ವಿವರಣೆ ಸಲ್ಲಿಸಾಲೆ",
"uploadnologin": "ಲಾಗಿನ್ ಆತ್‘ಜ್ಜರ್",
+ "uploadnologintext": "ಕಡತ ಮಿತೇರಾವರೆ ದಯಮಲ್ತ್ $1.",
+ "upload_directory_missing": "ಮಿತೇರಿಕೆದ ನಿರ್ದೇಶಿಕೆ ($1) ತಿಕ್ಕುಜಿ, ಬೊಕ ಜಾಲಸೇವಕೊಗ್ ಅವೆನ್ ರಚಿಸಾವರೆ ಆವೊಂದಿಜ್ಜಿ.",
+ "upload_directory_read_only": "ಮಿತೇರಿಕೆದ ನಿರ್ದೇಶಿಕೆ ($1) ಜಾಲಸೇವಕೊಗು ಬರೆವರೆ ಆಪಿನವತ್ತ್",
+ "uploaderror": "ಮಿತೇರಿಕೆ ದೋಷ",
+ "upload-recreate-warning": "<strong>ಎಚ್ಚರಿಗೆ: ಆ ಪುರುದ ಒಂಜಿ ಕಡತ ಮಾಜಿದ್ಂಡ್ ಇಜ್ಜಾ ಪಂದಾದ್ಂಡ್</strong>\nಈ ಪುಟತ ಮಾಜಿಕೆ ಬೊಕ ಪಂದಿಕೆದ ಗಮನಿನ್ ಸೌಕರ್ಯಗಾದ್ ಮುಲ್ಪ ಕೊರ್ತುಂಡು:",
+ "uploadtext": " ಕಡತೊಲೆನ್ ಮಿತೇರಾವರೆ ತಿರ್ತ್'ದ ರೂಪತ್ರೊನು ಬಳಸಿಲೆ.\nನೆಟ್ದ್ ದುಂಬು ಮಿತೇರಾಯಿನ ಕಡತೊಲೆನ್ ತೂವರೆ ಇಜಿಂಡ ನಾಡರೆ ಇಡೆಗ್ [[Special:FileList| ಮಿತೇರಾಯಿನ ಕಡತೊಲೆನ ಪಟ್ಟಿ]] ಪೋಲೆ. (ಪಿರ)ಮಿತೇರಿಕೆಲುಲಾ [[Special:Log/upload|uಮಿತೇರಿಕೆ ಗಮನಿ]] ಡ್ ಉಂಡು, ಮಾಜಿಕೆಲು [[Special:Log/delete|ಮಾಜಿಕೆ ಗಮನಿ]] ಡು ಉಂಡು.\nಒಂಜಿ ಪುಟೊಟು ಒಂಜಿ ಕಡತೊನು ಸೇರಾರೆ,ಈ ತಿರ್ತ್'ದ ರೂಪತ್ರಲೆಡ್ ಒಂಜಿ ಕೊಂಡಿನ್ ಬಳಸಿಲೆ:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> ಕಡತದ ಪೂರ್ಣ ಆವೃತ್ತಿನ್ ಬಳಕೆ ಮಲ್ಪರೆ\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> ದತ್ತ ಕರೆತ ಪೆಟ್ಟಿಡ್ \"alt ಪಟ್ಯ\" ಇನ್ಪಿನ ವಿವರಣೆದೊಟ್ಟುಗು ಒಂಜಿ 200 ಪಿಕ್ಸೆಲ್ ಅಗೆಲದ ಚಿತ್ರಾರ್ಪಣ ಬಳಸರೆ\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> ಕಡತೊನು ತೋಜಾವಂದೆ ಕಡತೊಗು ಸರ್ತವಾದ್ ಗೋಡಿಸಾರೆ",
+ "upload-permitted": "ಅನುಮತಿದ ಕಡತ{{PLURAL:$2|ನಮೂನೆ|ನಮೂನೆಲು}}: $1.",
+ "upload-preferred": "ಇಷ್ಟಾಯ್ಕೆದ ಕಡತ{{PLURAL:$2|ನಮೂನೆ|ನಮೂನೆಲು}}: $1.",
+ "upload-prohibited": "ನಿರ್ಬಂದದ ಕಡತ{{PLURAL:$2|ನಮೂನೆ|ನಮೂನೆಲು}}: $1.",
"uploadlogpage": "ಅಪ್ಲೋಡ್ ದಾಕಲೆ",
+ "uploadlogpagetext": "ತಿರತ್ ಒಂಜಿ ಅತಿ ಇಂಚೊಗು ಮಿತೇರಾಯಿನ ಕಡತೊಲೆನ ಪಟ್ಟಿ ಉಂಡು.\nಹೆಚ್ಚಿನ ಒಂಜಿ ಸದೃಶ್ಯ ಮೇಲ್ನೋಟೊಗು [[Special:NewFiles| ಪೊಸ ಕಡತೊಲೆನ ಚಿತ್ರದರ್ಶಿನಿ]] ತೂಲೆ.",
"filename": "ಕಡತದ ಪುದರ್",
"filedesc": "ಸಾರಾಂಸೊ",
"fileuploadsummary": "ಸಾರಾಂಸೊ:",
+ "filereuploadsummary": "ಕಡತ ಬದಲಾವಣೆಲು:",
+ "filestatus": "ಕೃತಿಸ್ವಾಮ್ಯದ ಸ್ಥಿತಿ:",
"filesource": "ಮೂಲ",
+ "ignorewarning": "ಎಚ್ಚರಿಗೆ ಆಲಕ್ಷಿಸಾದ್ ಬೊಕ ಎಂಚಿತಿನ ಕಡತ ಒರಿಪಾಲೆ",
+ "ignorewarnings": "ಒವ್ವೆ ಎಚ್ಚರಿಗೆಲೆನ್ ಆಲಕ್ಷಿಸಾಲೆ",
+ "minlength1": "ಕಡತಪುದರುಲು ಕನಿಷ್ಟ ಒಂಜಿ ಅಕ್ಷರದವು ಆದಿಪ್ಪೊಡು.",
+ "illegalfilename": "ಕಡತಪುದರ್ \"$1\" ಡು ಪುಟತ ತರೆಬರವುಲೆಡ್ ಒಪ್ಪಂದಿನ ಅಕ್ಷರೊಲು ಉಂಡು. ದಯಮಲ್ತ್ ಕಡತೊಗು ಪಿರಪುದರು ಕೊರ್ದು ಬೊಕ ಕುಡ ಮಿತೇರಾವರೆ ಯತ್ನ ಮಲ್ಪುಲೆ.",
+ "filename-toolong": "ಕಡತಪುದರುಲು 240 ಬೈಟುಲೆರ್ದ್ ಉದ್ದ ಆವರೆ ಬಲ್ಲಿ.",
+ "badfilename": "ಕಡತಪುದರು $1 ಗು ಬದಲಾತ್ಂಡ್.",
+ "filetype-mime-mismatch": "ಕಡತ ವಿಸ್ತರಣ \"$1\" ಪತ್ತೆ ಯಾಯಿನ ಮೈಮ್ (MIME) ನಮೂನೆದ ಕಡತೊಗು $2 ಪೋಲಿಕೆ ಆಪುಜಿ.",
+ "filetype-badmime": "ಮೈಮ್ (MIME) ನಮೂನೆದ $1 ಕಡತೊಲೆನ್ ಮಿತೇರಾವರೆ ಒಪ್ಪಿಗೆ ಇಜ್ಜಿ.",
+ "filetype-bad-ie-mime": "ಈ ಕಡತೊನು ಮಿತೇರಾವರೆ ಆತಿಜಿ, ಕಾರಣ ಇಂಟರ್'ನೆಟ್ ಎಕ್ಸ್'ಪ್ಲೋರರ್ ಅವೆನ್ $1 ಇಂದ್ ಪತ್ತೆ ಮಲ್ಪುಂಡು, ಅವು ಒಂಜಿ ಒಪ್ಪಿಗೆದಾಂತಿನ ಬೊಕ ಅಪಾಯಕಾರಿ ಕಡತ ನಮೂನೆ ಆದುಂಡು.",
+ "filetype-unwanted-type": "<strong>\".$1\"</strong> ಉಂದೊಂಜಿ ಬೊಡ್ಚಾಯಿನ ಕಡತ ನಮೂನೆ.\nಇಷ್ಟಾಯ್ಕೆದ {{PLURAL:$3|ಕಡತ ನಮೂನೆ|ಕಡತ ನಮೂನೆಲು}} $2.",
+ "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|ಉಂದೊಂಜಿ ಒಪ್ಪಂದಿನ ಕಡತ ನಮೂನೆ|ಉಂದು ಒಪ್ಪಂದಿನ ಕಡತ ನಮೂನೆಲು}}.\nಅನುಮತಿ ಇತ್ತಿನ {{PLURAL:$3|ಕಡತ ನಮೂನೆ|ಕಡತ ನಮೂನೆಲು}} $2.",
+ "filetype-missing": "ಕಡತೊಗು ವಿಸ್ತರಣ ಇಜ್ಜಿ (ಉದರ್ಮೆಗ್ \".jpg\").",
+ "empty-file": "ಈರ್ ಸಲ್ಲಿಸಾಯಿನ ಕಡತ ಖಾಲಿ ಆದಿತ್ತ್ಂಡ್.",
+ "file-too-large": "ಈರ್ ಸಲ್ಲಿಸಾಯಿನ ಕಡತ ಬಾರೀ ಮಲ್ಲ ಆದಿತ್ತ್ಂಡ್.",
+ "filename-tooshort": "ಕಡತಪುರು ಮಸ್ತ್ ಕುದ್ಯ ಆಂಡ್.",
+ "filetype-banned": "ಈ ನಮೂನೆದ ಕಡತ ನಿಷಿದ್ದ ಆತ್ಂಡ್.",
+ "verification-error": "ಈ ಕಡತ ಕಡತ ಪರಿಶೀಲನೊಡು ನಪಾಸಾಂಡ್.",
+ "hookaborted": "ಈರ್ ತಿದ್ದುಪಾಟ ಮಲ್ಪರೆ ಯತ್ನ ಮಲ್ತಿವು, ಒಂಜಿ ವಿಸ್ತರಣೊರ್ದು ವಿಫಲವಾಂಡ್.",
+ "illegal-filename": "ಕಡತಪುದರು ಒಪ್ಪಿಗೆ ಇಜ್ಜಿ.",
+ "overwrite": "ಒಂಜಿ ಉಪ್ಪುನ ಕಡತದ ಮಿತ್ತ್'ಬರೆಪಿನೆಕ್ ಒಪ್ಪಿಗೆ ಇಜ್ಜಿ.",
+ "unknown-error": "ಒಂಜಿ ಗೊತ್ತಾಂತಿನ ದೋಷ ಉಂಡಾಂಡ್.",
+ "tmp-create-error": "ಹಂಗಾಮಿ ಕಡತ ರಚಿಸಾವರೆ ಆತಿಜಿ.",
+ "tmp-write-error": "ಹಂಗಾಮಿ ಕಡತ ಬರೆನಗ ದೋಷ.",
+ "large-file": "ಕಡತೊಲು $1 ರ್ದ್ ಉದ್ದ ಆವರೆ ಬಲ್ಲಿಂದ್ ಶಿಫಾರಸು ಮಲ್ದ್ಂಡ್. \nಈ ಕಡತ $2 ಆದುಂಡು.",
+ "largefileserver": "ಈ ಕಡತ ಜಾಲಸೇವಕ ಸಂರಚನೆಡ್ ಒಪ್ಪಿಗೆ ಆಪಿನೆರ್ದ್ ಮಲ್ಲೆ ಉಂಡು.",
+ "emptyfile": "ಈರ್ ಮಿತೇರಾಯಿನ ಕಡತ ಖಾಲಿ ಇಂದ್ ತೋಜುಂಡು.\nಉಂದು ಕಡತಪುರುಡು ಇತ್ತಿನ ಬರೆಪಿದೋಷದ ಕಾರಣ ಆದಿಪ್ಪು.\nಈರ್ ದಯಮಲ್ತ್ ಈ ಕಡತೊನು ನಿಜವಾದ್ಲಾ ಮಿತೇರಾವೊಡೆ ಇಂದ್ ಸಮಾತೂಲೆ.",
+ "windows-nonascii-filename": "ಈ ವಿಕಿ ವಿಶೇಷ ಅಕ್ಷರೊಲು ಉಪ್ಪುನ ಕಡತಪುರುಲೆಗ್ ಬೆರಿಬಲ ಕೊರ್ಪುಜಿ.",
+ "fileexists": "ಈ ಪುದರುದ ಒಂಜಿ ಕಡತ ಇದಗನೆ ಉಂಡು, ದಯಮಲ್ತ್ ಸಮಾತೂಲೆ <strong>[[:$1]]</strong> ಒಂಜಿ ವೇಳೆ {{GENDER:|ಈರ್}} ನಿಜವಾದ್ಲಾ ಅವೆನ್ ಬದಲಾವರೆ ದೃಡ ಮಲ್ದರ್ಡ.\n[[$1|thumb]]",
+ "filepageexists": "ಈ ಕಡತದ ವಿವರಣ ಪುಟ ಅದಗನೆ <strong>[[:$1]]</strong> ಡು ರಚನೆ ಆತ್ಂಡ್ , ಆಂಡ ಈ ಪುದರುದ ಒವ್ವೆ ಕಡತ ಇತ್ತೆ ಅಸ್ತಿತ್ವೊಡು ಇಜ್ಜಿ.\nಈರ್ ಸೇರಾಯಿನ ಸಾರಾಂಶ ವಿವರಣ ಪುಟೊಟು ತೋಜಂದ್.\nಇರೆನ ಸಾರಾಂಶ ಮುಲ್ಪ ತೋಜರೆ ಈರ್ ಅವೆನ್ ಅಂಗಿಕವಾದ್ ಸಂಪಾದಿಸೊಡು.\n[[$1|thumb]]",
+ "fileexists-extension": "ಒಂಜಿ ಸಮಾನ ಪುದರುದ ಕಡತ ಉಂಡು:[[$2|thumb]]\n* ಮಿತೇರಾವುನ ಕಡತದ ಪುದರು: <strong>[[:$1]]</strong>\n* ಉಪ್ಪುನ ಕಡತದ ಪುದರು: <strong>[[:$2]]</strong>\nಈರ್ ಬಹುಶಃ ಒಂಜಿ ಹೆಚ್ಚ ಸ್ಪುಟವಾಯಿನ ಪುದರುನು ಬಳಸರೆ ಬಯಸುವರಾ?",
+ "fileexists-thumbnail-yes": "ಕಡತ ಒಂಜಿ ಕುಗ್ಗಾಯಿನ ಗಾತ್ರದ ಆಕೃತಿದ ಲೆಕ್ಕ ತೋಜುಂಡು <em>(thumbnail)</em>.\n[[$1|thumb]]\nದಯಮಲ್ತ್ ಕಡತೊನು ಸಮಾತೂಲೆ <strong>[[:$1]]</strong>.\nಸಮಾತೂಯಿನ ಕಡತ ಮೂಲಗಾತ್ರದ ಅವೇ ಆಕೃತಿ ಆಂಡ, ನನ ಒಂಜಿ (ಕೊಂಬಿರೆಲ್ ಚಿತ್ರ) ಕಿರ್ಚಿತ್ರ ಮಿತೇರಾವುನ ಅಗತ್ಯ ಇಜ್ಜಿ.",
+ "file-thumbnail-no": "ಕಡತದ ಪುದ <strong>$1</strong>.ರು ಸುರುವಾಪುಂಡು\nಕಡತ ಒಂಜಿ ಕುಗ್ಗಾಯಿನ ಗಾತ್ರದ ಆಕೃತಿದ ಲೆಕ್ಕ ತೋಜುಂಡು <em>(thumbnail)</em>.\nಇರೆಡ ಈ ಆಕೃತಿದ ಪೂರ್ಣ ಸಂಕಲ್ಪದ ಪ್ರತಿ ಇತ್ತಿನಾಂಡ ಅವೆನ್ ಮಿತೇರಾಲೆ, ಇಜ್ಜಾಂಡ ದಯಮಲ್ತ್ ಕಡತಪುದರು ಬದಲಾಲೆ.",
+ "fileexists-forbidden": "ಈ ಪುದರುದ ಒಂಜಿ ಕಡತ ಅದಗನೆ ಉಂಡು, ಬೊಕ ಅಯಿತ ಮೇಲ್'ಬರೆವರೆ ಆಪುಜಿ.\nಈರ್ ನನಲಾ ಇರೆನ ಕಡತೊನು ಮಿತೇರಾವರೆ ಬಯಕುವರ್ಡ, ದಯಮಲ್ತ್ ಪಿರ ಪೋಲೆ ಬೊಕ ಒಂಜಿ ಪೊಸ ಪುದರು ಬಳಸಿಲೆ.\n[[File:$1|thumb|center|$1]]",
+ "fileexists-shared-forbidden": "ಈ ಪುದರುದ ಒಂಜಿ ಕಡತ ಅದಗನೆ ಉಂಡು, ಪಟೊಂದಿನ ಕಡತ ಸಂಚಯನೊಡು.\nಈರ್ ನನಲಾ ಇರೆನ ಕಡತೊನು ಮಿತೇರಾವರೆ ಬಯಕುವರ್ಡ, ದಯಮಲ್ತ್ ಪಿರ ಪೋಲೆ ಬೊಕ ಒಂಜಿ ಪೊಸ ಪುದರು ಬಳಸಿಲೆ.\n[[File:$1|thumb|center|$1]]",
+ "fileexists-no-change": "ಮಿತೇರಿಕೆ ಆಯಿನವು <strong>[[:$1]]</strong> ಇತ್ತೆದ ಆವೃತ್ತಿದ ಒಂಜಿ ಯಥಾರ್ಥ ಇರ್ಪಡಿ ಆದುಂಡು.",
+ "fileexists-duplicate-version": "ಮಿತೇರಿಕೆ ಆಯಿನವು <strong>[[:$1]]</strong> {{PLURAL:$2|ಒಂಜಿ ಪರ ಆವೃತ್ತಿ|ಪರ ಆವೃತ್ತಿಲೆನ}} ಒಂಜಿ ಯಥಾರ್ಥ ಇರ್ಪಡಿ ಆದುಂಡು.",
+ "file-exists-duplicate": "ಈ ಕಡತ ಬೆರಿಟೆಬರ್ಪಿನ {{PLURAL:$1|ಕಡತ|ಕಡತೊಲು}} ದ ಒಂಜಿ ಇರ್ಪಡಿ ಆದುಂಡು:",
+ "file-deleted-duplicate": " ಈ ಕಡತದ ಒಂಜಿ ಸರ್ವಸಮ ಕಡತೊನು ([[:$1]]) ನೆಡ್ದ್ ದುಂಬು ಮಾಜಾದುಂಡು.\nಪಿರ ಮಿತೇರಾವರೆ ಪೋಪಿನೆರ್ದ್ ಸುರುಟು ಈರ್, ಆ ಕಡತದ ಮಾಜಿಕೆ ಚರಿತ್ರೆನ್ ಸಮಾತೂವೊಡು.",
+ "file-deleted-duplicate-notitle": "ಈ ಕಡತದ ಒಂಜಿ ಸರ್ವಸಮ ಕಡತೊನು ನೆಡ್ದ್ ದುಂಬು ಮಾಜಾದುಂಡು ಬೊಕ ತರೆಬರವುನು ದಮನಿಸಾದುಂಡು.\nಕಡತೊನು ಪಿರ-ಮಿತೇರಾವರೆ ಪೋಪಿನೆರ್ದ್ ಸುರುಟು ಈರ್, ಸನ್ನಿವೇಶೊನು ಪರಿಶೀಲಿಸಾವರೆ,ದಮನಿತ ಕಡತ ದತ್ತಾಂಶ ತೂವರೆ ಶಕ್ತವಾಯಿನ ಏರೆನಾಂಡಲಾ ಈರ್ ಕೇಣೊಡು",
+ "uploadwarning": "ಮಿತೇರಿಕೆ ಎಚ್ಚರಿಗೆ",
+ "uploadwarning-text": "ದಯಮಲ್ತ್ ತಿರ್ತ್'ದ ಕಡತ ವಿವರಣೆನ್ ತಿದ್ದುಪಾಟ ಮಲ್ತ್'ದ್ ಬೊಕ ಕುಡಾ ಯತ್ನ ಮಲ್ಪುಲೆ.",
+ "uploadwarning-text-nostash": "ದಯಮಲ್ತ್ ಕಡತೊನು ಪಿರ ಮಿತೇರಾಲೆ, ತಿರ್ತ್'ದ ಕಡತ ವಿವರಣೆನ್ ತಿದ್ದುಪಾಟ ಮಲ್ತ್'ದ್ ಬೊಕ ಕುಡಾ ಯತ್ನ ಮಲ್ಪುಲೆ.",
"savefile": "ಕಡತನ್ ಒರಿಪಾಲೆ",
+ "uploaddisabled": "ಮಿತೇರಿಕೆಲೆನ್ ನಿಷ್ಕ್ರಿಯ ಮಲ್ದ್ಂಡ್.",
+ "copyuploaddisabled": "ಯುಆರ್'ಎಲ್ ಮಿತೇರಿಕೆ ನಿಷ್ಕ್ರಿಯ ಮಲ್ದ್ಂಡ್.",
+ "uploaddisabledtext": "ಕಡತ ಮಿತೇರಿಕೆಲೆನ್ ನಿಷ್ಕ್ರಿಯ ಮಲ್ದ್ಂಡ್",
+ "php-uploaddisabledtext": "ಪಿಎಚ್'ಪಿ. ಡ್ ಕಡತ ಮಿತೇರಿಕೆಲೆನ್ ನಿಷ್ಕ್ರಿಯ ಮಲ್ದ್ಂಡ್.\nದಯಮಲ್ತ್ ಕಡತ_ಮಿತೇರಿಕೆ ಅಟ್ಟಣೆಲೆನ್ ಸಮಾತೂಲೆ.",
+ "uploadscripted": "ಕಡತೊಡು ಎಚ್'ಟಿಎಂಎಲ್ ಇಜಿಂಡ ಸ್ಕ್ರಿಪ್ಟ್ ಅಂಕೇತ ಉಂಡು, ಅವೆನ್ ಜಾಲದರ್ಶಿಲು ದೋಷಪೂರ್ಣವಾದ್ ವ್ಯಾಖ್ಯಾನ ಮಲ್ಪರೆ ಯಾವು.",
+ "upload-scripted-pi-callback": "ಎಕ್ಸ್'ಎಂಎಲ್ - ಶೈಲಿಪತ್ರ ಪ್ರಕ್ರಿಯೆಕಾರಕ ಸೂಚನೆ ಉಪ್ಪುನ ಕಡತೊನು ಮಿತೇರಿಸಾವರೆ ಆಪುಜಿ.",
+ "upload-scripted-dtd": "ಅ-ಮಾನಕ ಡಿಟಿಡಿ ಘೋಷಣೆ ಉಪ್ಪುನ ಎಸ್ವಿಜಿ ಕಡತೊಲೆನ್ ಮಿತೇರಾವರೆ ಆಪುಜಿ.",
+ "uploaded-script-svg": "ಮಿತೇರಾಯಿನ ಎಸ್ವಿಜಿ ಕಡತೊಡು $1 ಲಿಪಿಕಾರಕ ಘಟಕ ಪತ್ತೆ ಆಂಡ್.",
+ "uploaded-hostile-svg": "ಮಿತೇರಾಯಿನ ಎಸ್ವಿಜಿ ಕಡತದ ಶೈಲಿ ಘಟಕೊಡು ಅಸುರಕ್ಷಿತ ಸಿಎಸ್ಎಸ್ ಪತ್ತೆ ಆಂಡ್.",
+ "uploaded-event-handler-on-svg": "ಎಸ್ವಿಜಿ ಕಡತೊಲೆಡ್ ಘಟನೆ-ನಿರ್ವಹಣ ಗುಣೊ <code>$1=\"$2\"</code> ಅಟ್ಟಣೆಗ್ ಒಪ್ಪಿಗೆ ಇಜ್ಜಿ.",
+ "uploaded-href-attribute-svg": "<a> ಫಟಕೊಲು ದತ್ತಾಂಶೊಗು ಮಾತ್ರಾ ಕೊಂಡಿ (href) ಆಪಾ: (ಅಂತರ್ಗತ ಕಡತ), http:// or https://, ಇಜಿಂಡ ತುಂಡು (#, ಅವೇ-ದಾಖಲೆ) ಗುರಿಲು. ಇತರೆ ಘಟಕೊಲೆಗ್,ಉದರ್ಮೆಗ್ <image>, ದತ್ತಾಂಶ ಮಾತ್ರಾ: ಬೊಕ ತುಂಡುಲು ಒಪ್ಪುಂಡು. ಎಸ್ವಿಜಿ-ನ್ ರಪ್ತು ಮಲ್ಪುನಗ ಆಕೃತಿಲೆನ್ ಅಂತರ್ಗತಿಸಾರೆ ಯತ್ನಿಸಾಲೆ. ಪತ್ತೆ ಆಂಡ್ <code><$1 $2=\"$3\"></code>.",
+ "uploaded-href-unsafe-target-svg": "ಅಸುರಕ್ಷಿತ ದತ್ತಾಂಶ href ಪತ್ತೆ ಆಂಡ್: ಮಿತೇರಾಯಿನ ಎಸ್ವಿಜಿ ಕಡತೊಡು ಯೂಆರ್'ಐ URI ಗುರಿ <code><$1 $2=\"$3\"></code> .",
+ "uploaded-animate-svg": "ಮಿತೇರಾಯಿನ ಎಸ್ವಿಜಿ ಕಡತೊಡು \"ಇಂದ\" ಗುಣ ಬಳಕೆ ಆಯಿನ <code><$1 $2=\"$3\"></code>, href ನು ಬದಲ್'ಮಲ್ಪುನ \"ಜೀವಂತಿಸಾಲೆ\" ಕುಚ್ಚಿ ಪತ್ತೆ ಆಂಡ್.",
+ "uploaded-setting-event-handler-svg": "ಘಟನೆ-ನಿರ್ವಹಣ ಗುಣೊಲೆನ ಅಟ್ಟಣೆ ತಡೆಯಾತುಂಡು. ಮಿತೇರಾಯಿನ ಎಸ್ವಿಜಿ ಕಡತೊಡು <code><$1 $2=\"$3\"></code> ಪತ್ತೆಯಾಂಡ್.",
+ "uploaded-setting-href-svg": "ಪಿತೃ ಘಟಕೊಗು \"href\" ಸೇರಾರೆ, \"ಅಟ್ಟಣೆ\" ಕುಚ್ಚಿ ಬಳಕೆನ್ ತಡೆತ್'ದುಂಡು,",
+ "uploaded-wrong-setting-svg": "ಒವ್ವೆ ಗುಣೊಕು ಒಂಜಿ ದೂರಸಂವೇದಿ/ದತ್ತಾಂಶ/ಲಿಪಿಕಾರ ಗುರಿ ಸೇರಾರೆ, \"ಅಟ್ಟಣೆ\" ಕುಚ್ಚಿದ ಬಳಕೆನ್ ತಡೆತ್'ದುಂಡು, ಮಿತೇರಾಯಿನ ಎಸ್ವಿಜಿ ಕಡತೊಡು <code><set to=\"$1\"></code> ಪತ್ತೆ ಆಂಡ್.",
"upload-source": "ಮೂಲ ಕಡತ",
"upload-options": "ಅಪ್ಲೋಡ್ ಆಯ್ಕೆಲು",
"watchthisupload": "ಈ ಪುಟೊನು ತೂಲೆ",
"returnto": "తిరిగి $1కి.",
"tagline": "{{SITENAME}} నుండి",
"help": "సహాయం",
+ "help-mediawiki": "మీడియావికీ సహాయం",
"search": "వెతుకు",
"search-ignored-headings": " #<!-- ఈ లైనును ఉన్నది ఉన్నట్లుగా వదిలేయండి --> <pre>\n# వెతుకులాటలో పరిగణింపబడని శీర్షికలు.\n# శీర్షికతో సహా పేజీ ఇండెక్స్ కాగానే మార్పులు వర్తిస్తాయి.\n# ఉత్తుత్తి సవరణ చేయడం ద్వారా బలవంతంగా రీయిండెక్సింగ్ చేయించవచ్చు.\n# వ్యాకరణం ఇలా ఉంటుంది:\n# * \"#\" కారెక్టరు నుండి లైను చివరి వరకూ ఉన్నదంతా వ్యాఖ్య అవుతుంది\n# * ఖాళీగా లేని ప్రతీ లైను వెతుకులాటలో పట్టించుకోనక్కర్లేని శీర్షికగా పరిగణింపబడుతుంది.\nమూలాలు\nబయటి లింకులు\nఇవి కూడా చూడండి\n #</pre> <!-- ఈ లైనును ఉన్నది ఉన్నట్లుగా వదిలేయండి -->",
"searchbutton": "వెతుకు",
"databaseerror-query": "క్వెరీ: $1",
"databaseerror-function": "ఫంక్షన్: $1",
"databaseerror-error": "లోపం: $1",
+ "transaction-duration-limit-exceeded": "రైట్ సమయం ($1) దాని పరిమితి అయిన $2 ను మించిపోయింది. అక్కువ రెప్లికేషన్ లాగ్ సృష్టించకుండా నివారించేందుకు గాను, ఈ ట్రాన్సాక్షనును ఆపేసాం.\nమీరు అనేక అంశాలను ఏకకాలంలో మారుస్తున్నట్లైతే, చిన్న చిన్న ఆపరేషన్లుగా విభజించి ప్రయత్నించండి.",
"laggedslavemode": "<strong>హెచ్చరిక:</strong> పేజీలో ఇటీవల జరిగిన మార్పులు ఉండకపోవచ్చు.",
"readonly": "డేటాబేసు లాక్చెయ్యబడింది",
"enterlockreason": "డేటాబేసుకు వేయబోతున్న లాకుకు కారణం తెలుపండి, దానితోపాటే ఎంతసమయం తరువాత ఆ లాకు తీసేస్తారో కూడా తెలుపండి",
"missingarticle-rev": "(కూర్పు#: $1)",
"missingarticle-diff": "(తేడా: $1, $2)",
"readonly_lag": "అనుచర (స్లేవ్) డేటాబేసు సర్వర్లు, ప్రధాన (మాస్టరు) సర్వరును అందుకునేందుకుగాను, డేటాబేసు ఆటోమాటిక్గా లాకు అయింది.",
+ "nonwrite-api-promise-error": "'Promise-Non-Write-API-Action' అనే HTTP హెడరును పంపించారు, కానీ దాన్ని API రైట్ మాడ్యూలుకు పంపించారు.",
"internalerror": "అంతర్గత లోపం",
"internalerror_info": "అంతర్గత లోపం: $1",
"internalerror-fatal-exception": "\"$1\" రకం వినాశకర ఎక్సెప్షను",
"badarticleerror": "ఈ పేజీపై ఈ పని చేయడం కుదరదు.",
"cannotdelete": "\"$1\" అనే పేజీ లేదా ఫైలుని తొలగించలేకపోయాం.\nదాన్ని ఇప్పటికే ఎవరైనా తొలగించి ఉండవచ్చు.",
"cannotdelete-title": "పేజీ \"$1\" ని తొలగించలేరు",
+ "delete-scheduled": "\"$1\" పేజీ తొలగింపు షెడ్యూలులో ఉంది.\nకాస్త ఓర్పుతో ఉండండి.",
"delete-hook-aborted": "తొలగింపును హుక్ ఆపేసింది.\nవివరణ ఏమీ ఇవ్వలేదు.",
"no-null-revision": "\"$1\" పేజీకి కొత్త శూన్య కూర్పు (నల్ రివిజన్) ను సృష్టించలేకపోయాం",
"badtitle": "తప్పు శీర్షిక",
"cascadeprotected": "కింది {{PLURAL:$1|పేజీని|పేజీలను}} కాస్కేడింగు ఆప్షనుతో సంరక్షించబడింది. ప్రస్తుత పేజీ, ఈ పేజీల్లో ట్రాన్స్క్లూడు అయి ఉంది కాబట్టి, దిద్దుబాటు చేసే వీలు లేకుండా ఇది కూడా రక్షణలో ఉంది:\n$2",
"namespaceprotected": "'''$1''' నేంస్పేసులో మార్పులు చేయటానికి మీకు అనుమతి లేదు.",
"customcssprotected": "ఈ CSS పేజీని మార్చేందుకు మీకు అనుమతి లేదు. ఎందుకంటే వేరే వాడుకరి యొక్క వ్యక్తిగత సెట్టింగులు అందులో ఉన్నాయి.",
+ "customjsonprotected": "ఈ JSON పేజీలో వేరే వాడుకరి వ్యక్తిగత సెట్టింగులున్నాయి కాబట్టి, అందులో దిద్దుబాటు చేసే అనుమతులు మీకు లేవు.",
"customjsprotected": "ఈ JavaScript పేజీని మార్చేందుకు మీకు అనుమతి లేదు. ఎందుకంటే వేరే వాడుకరి యొక్క వ్యక్తిగత సెట్టింగులు అందులో ఉన్నాయి.",
- "sitecssprotected": "à°\88 CSS à°²à±\8b à°®à±\80à°°à±\81 à°\9aà±\87à°¸à±\87 మారà±\8dà°ªà±\81 à°®à±\8aà°¤à±\8dà°¤à°\82 à°¸à°\82దరà±\8dà°¶à°\95à±\81à°²à°\82దరినà±\80 à°ªà±\8dà°°à°à°¾à°µà°¿à°¤à°\82 à°\9aà±\87à°¸à±\87 à°\85à°µà°\95ాశà°\82 à°\89à°\82ది à°\95ాబà°\9fà±\8dà°\9fà°¿ ఆ అనుమతి మీకు లేదు.",
- "sitejsonprotected": "à°\88 JSON à°²à±\8b à°®à±\80à°°à±\81 à°\9aà±\87à°¸à±\87 మారà±\8dà°ªà±\81 à°®à±\8aà°¤à±\8dà°¤à°\82 à°¸à°\82దరà±\8dà°¶à°\95à±\81à°²à°\82దరినà±\80 à°ªà±\8dà°°à°à°¾à°µà°¿à°¤à°\82 à°\9aà±\87à°¸à±\87 à°\85à°µà°\95ాశà°\82 à°\89à°\82ది à°\95ాబà°\9fà±\8dà°\9fà°¿ ఆ అనుమతి మీకు లేదు.",
- "sitejsprotected": "à°\88 JavaScript à°²à±\8b à°®à±\80à°°à±\81 à°\9aà±\87à°¸à±\87 మారà±\8dà°ªà±\81 à°®à±\8aà°¤à±\8dà°¤à°\82 à°¸à°\82దరà±\8dà°¶à°\95à±\81à°²à°\82దరినà±\80 à°ªà±\8dà°°à°à°¾à°µà°¿à°¤à°\82 à°\9aà±\87à°¸à±\87 à°\85à°µà°\95ాశà°\82 à°\89à°\82ది à°\95ాబà°\9fà±\8dà°\9fà°¿ ఆ అనుమతి మీకు లేదు.",
+ "sitecssprotected": "à°\88 CSS à°ªà±\87à°\9cà±\80à°²à±\8b à°²à±\8b à°®à±\80à°°à±\81 à°\9aà±\87à°¸à±\87 మారà±\8dà°ªà±\81 à°®à±\8aà°¤à±\8dà°¤à°\82 à°¸à°\82దరà±\8dà°¶à°\95à±\81à°²à°\82దరినà±\80 à°ªà±\8dà°°à°à°¾à°µà°¿à°¤à°\82 à°\9aà±\87à°¸à±\87 à°\85à°µà°\95ాశà°\82 à°\89à°\82ది à°\95ాబà°\9fà±\8dà°\9fà°¿, ఆ అనుమతి మీకు లేదు.",
+ "sitejsonprotected": "à°\88 JSON à°ªà±\87à°\9cà±\80à°²à±\8b à°²à±\8b à°®à±\80à°°à±\81 à°\9aà±\87à°¸à±\87 మారà±\8dà°ªà±\81 à°®à±\8aà°¤à±\8dà°¤à°\82 à°¸à°\82దరà±\8dà°¶à°\95à±\81à°²à°\82దరినà±\80 à°ªà±\8dà°°à°à°¾à°µà°¿à°¤à°\82 à°\9aà±\87à°¸à±\87 à°\85à°µà°\95ాశà°\82 à°\89à°\82ది à°\95ాబà°\9fà±\8dà°\9fà°¿, ఆ అనుమతి మీకు లేదు.",
+ "sitejsprotected": "à°\88 JavaScript à°ªà±\87à°\9cà±\80à°²à±\8b à°®à±\80à°°à±\81 à°\9aà±\87à°¸à±\87 మారà±\8dà°ªà±\81 à°®à±\8aà°¤à±\8dà°¤à°\82 à°¸à°\82దరà±\8dà°¶à°\95à±\81à°²à°\82దరినà±\80 à°ªà±\8dà°°à°à°¾à°µà°¿à°¤à°\82 à°\9aà±\87à°¸à±\87 à°\85à°µà°\95ాశà°\82 à°\89à°\82ది à°\95ాబà°\9fà±\8dà°\9fà°¿, ఆ అనుమతి మీకు లేదు.",
"mycustomcssprotected": "ఈ CSS పేజీని సవరించేందుకు మీకు అనుమతి లేదు.",
"mycustomjsonprotected": "ఈ JSON పేజీని సవరించేందుకు మీకు అనుమతి లేదు.",
"mycustomjsprotected": "ఈ జావాస్క్రిప్టు పేజీని సవరించేందుకు మీకు అనుమతి లేదు.",
"ns-specialprotected": "ప్రత్యేక పేజీలపై దిద్దుబాట్లు చేయలేరు.",
"titleprotected": "ఈ శీర్షికను [[User:$1|$1]] సృష్టించకుండా సంరక్షించబడింది.\nఅందుకు ఇచ్చిన కారణం: <em>$2</em>.",
"filereadonlyerror": "ఫైలు ఖజానా \"$2\" రీడ్-ఓన్లీ స్థితిలో ఉండటం చేత \"$1\" ఫైలులో మార్పులు చెయ్యలేకపోయాం.\n\nదానికి తాళం వేసిన సిస్టము నిర్వాహకుడు ఇచ్చిన వివరణ ఇది: \"$3\".",
+ "invalidtitle": "తప్పుడు శీర్షిక",
"invalidtitle-knownnamespace": "పేరుబరి \"$2\", పాఠ్యము \"$3\" తో కూడిన ఈ శీర్షిక చెల్లనిది",
"invalidtitle-unknownnamespace": "అపరిచితమైన పేరుబరి సంఖ్య \"$1\", పాఠ్యము \"$2\" తో కూడిన ఈ శీర్షిక చెల్లనిది",
"exception-nologin": "లాగినై లేరు",
"passwordtooshort": "సంకేతపదం కనీసం {{PLURAL:$1|1 అక్షరం|$1 అక్షరాల}} నిడివి ఉండాలి.",
"passwordtoolong": "సంకేతపదం పొడవు {{PLURAL:$1|1 అక్షరం|$1 అక్షరాల}} కన్నా ఎక్కువ ఉండకూడదు.",
"passwordtoopopular": "సాధారణంగా వాడే సంకేతపదాలను వాడే వీల్లేదు. ఊహించడానికి కష్టమైన సంకేతపదాన్ని ఎంచుకోండి.",
+ "passwordinlargeblacklist": "మీరిచ్చిన సంకేతపదం సర్వసామాన్యంగా వాడే సంకేతపదాల జాబితాలో ఉంది. మరింత అరుదైన సంకేతపదాన్ని ఎంచుకోండి.",
"password-name-match": "మీ సంకేతపదం మీ వాడుకరిపేరుకి భిన్నంగా ఉండాలి.",
"password-login-forbidden": "ఈ వాడుకరిపేరు, సంకేతపదాలను ఉపయోగించడం నిషిద్ధం.",
"mailmypassword": "సంకేతపదాన్ని మార్చు",
"accmailtext": "[[User talk:$1|$1]] కొరకు ఒక యాదృచ్ఛిక సంకేతపదాన్ని $2కి పంపించాం. లాగినయ్యాక, ''[[Special:ChangePassword|సంకేతపదాన్ని మార్చుకోండి]]'' అనే పేజీలో ఈ సంకేతపదాన్ని మార్చుకోవచ్చు.",
"newarticle": "(కొత్తది)",
"newarticletext": "ఈ లింకుకు సంబంధించిన పేజీ లేనే లేదు.\nకింది పెట్టెలో మీ రచనను టైపు చేసి ఆ పేజీని సృష్టించండి (దీనిపై సమాచారం కొరకు [$1 సహాయం పేజీ] చూడండి). మీరిక్కడికి పొరపాటున వచ్చి ఉంటే, మీ బ్రౌజరు <strong>back</strong> మీట నొక్కండి.",
- "anontalkpagetext": "----\n<em>à°\87ది à°\92à°\95 à°\85à°\9cà±\8dà°\9eాత వాడà±\81à°\95à°°à°¿ à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80. à°\86 వాడà±\81à°\95à°°à°¿ à°\87à°\82à°\95à°¾ తనà°\95à±\88 à°\96ాతానà±\81 à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà±\81à°\95à±\8bà°²à±\87à°¦à±\81, à°²à±\87దా à°\96ాతా à°\89à°¨à±\8dనా దానిని à°\89పయà±\8bà°\97à°¿à°\82à°\9aà°¡à°\82 à°²à±\87à°¦à±\81.</em>\nà°\85à°\82à°\9aà±\87à°¤, à°\85తణà±\8dణి/à°\86à°®à±\86à°¨à±\81 à°\97à±\81à°°à±\8dతిà°\82à°\9aడానిà°\95à°¿ à°\90.à°ªà±\80. à°\9aà°¿à°°à±\81నామానà±\81 వాడాలà±\8dసి à°µà°\9aà±\8dà°\9aà°¿à°\82ది. \nà°\86 à°\90.à°ªà±\80. à°\9aà°¿à°°à±\81నామానà±\81 à°\9aాలా à°®à°\82ది వాడà±\81à°\95à°°à±\81à°²à±\81 à°\89పయà±\8bà°\97à°¿à°\82à°\9aà±\87 à°\85à°µà°\95ాశà°\82 à°\89à°\82ది. \nà°®à±\80à°°à±\82 à°\85à°\9cà±\8dà°\9eాత వాడà±\81à°\95à°°à°¿ à°\85యితà±\87, à°®à±\80à°\95à±\81 à°¸à°\82à°¬à°\82à°§à°\82à°²à±\87ని à°µà±\8dయాà°\96à±\8dయలà±\81 మిమà±\8dమలà±\8dని à°\89à°¦à±\8dà°¦à±\87శిà°\82à°\9aà°¿à°¨à°\9fà±\8dà°\9fà±\81à°\97à°¾ à°\85నిపిసà±\8dà°¤à±\87, à°à°µà°¿à°·à±\8dయతà±\8dà°¤à±\81à°²à±\8b à°\87తర à°\85à°\9cà±\8dà°\9eాత వాడà±\81à°\95à°°à±\81లతà±\8b à°\85à°¯à±\8bమయà°\82 à°²à±\87à°\95à±\81à°\82à°¡à°¾ à°\89à°\82à°¡à°\9fానిà°\95à°¿, [[Special:CreateAccount|à°\96ాతానà±\81 à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà±\81à°\95à±\8bà°\82à°¡à°¿]] à°²à±\87దా [[Special:UserLogin|లాà°\97ినవà°\82à°¡à°¿]].''",
+ "anontalkpagetext": "----\n<em>à°\87ది à°\92à°\95 à°\85à°\9cà±\8dà°\9eాత వాడà±\81à°\95à°°à°¿ à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80. à°\86 వాడà±\81à°\95à°°à°¿ à°\87à°\82à°\95à°¾ తనà°\95à±\88 à°\96ాతానà±\81 à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà±\81à°\95à±\8bà°²à±\87à°¦à±\81, à°²à±\87దా à°\96ాతా à°\89à°¨à±\8dనా దానిని à°\89పయà±\8bà°\97à°¿à°\82à°\9aà°¡à°\82 à°²à±\87à°¦à±\81.</em>\nà°\85à°\82à°\9aà±\87à°¤, వారిని à°\97à±\81à°°à±\8dతిà°\82à°\9aడానిà°\95à°¿ à°\90.à°ªà±\80. à°\9aà°¿à°°à±\81నామానà±\81 వాడాలà±\8dసి à°µà°\9aà±\8dà°\9aà°¿à°\82ది. \nà°\86 à°\90.à°ªà±\80. à°\9aà°¿à°°à±\81నామానà±\81 à°\9aాలా à°®à°\82ది వాడà±\81à°\95à°°à±\81à°²à±\81 à°\89పయà±\8bà°\97à°¿à°\82à°\9aà±\87 à°\85à°µà°\95ాశà°\82 à°\89à°\82ది. \nà°®à±\80à°°à±\82 à°\85à°\9cà±\8dà°\9eాత వాడà±\81à°\95à°°à°¿ à°\85యితà±\87, à°®à±\80à°\95à±\81 à°¸à°\82à°¬à°\82à°§à°\82à°²à±\87ని à°µà±\8dయాà°\96à±\8dయలà±\81 మిమà±\8dమలà±\8dని à°\89à°¦à±\8dà°¦à±\87శిà°\82à°\9aà°¿à°¨à°\9fà±\8dà°\9fà±\81à°\97à°¾ à°\85నిపిసà±\8dà°¤à±\87, à°à°µà°¿à°·à±\8dయతà±\8dà°¤à±\81à°²à±\8b à°\87తర à°\85à°\9cà±\8dà°\9eాత వాడà±\81à°\95à°°à±\81లతà±\8b à°¸à°\82దిà°\97à±\8dధత à°²à±\87à°\95à±\81à°\82à°¡à°¾ à°\89à°\82à°¡à°\9fానిà°\95à°¿, [[Special:CreateAccount|à°\96ాతానà±\81 à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà±\81à°\95à±\8bà°\82à°¡à°¿]] à°²à±\87దా [[Special:UserLogin|లాà°\97ినవà°\82à°¡à°¿]].",
"noarticletext": "ప్రస్తుతం ఈ పేజీలో పాఠ్యమేమీ లేదు.\nవేరే పేజీలలో [[Special:Search/{{PAGENAME}}|ఈ పేజీ శీర్షిక కోసం వెతకవచ్చు]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} సంబంధిత చిట్టాలు చూడవచ్చు],\nలేదా [{{fullurl:{{FULLPAGENAME}}|action=edit}} ఈ పేజీని మార్చవచ్చు]</span>.",
"noarticletext-nopermission": "ప్రస్తుతం ఈ పేజీలో పాఠ్యమేమీ లేదు.\nమీరు ఇతర పేజీలలో [[Special:Search/{{PAGENAME}}|ఈ పేజీ శీర్షిక కోసం వెతకవచ్చు]], లేదా <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} సంబంధిత చిట్టాలలో వెతకవచ్చు]</span>, కానీ ఈ పేజీని సృష్టించడానికి మీకు అనుమతి లేదు.",
"missing-revision": "\"{{FULLPAGENAME}}\" అనే పేజీ యొక్క కూర్పు #$1 ఉనికిలో లేదు. సాధారణంగా ఏదైనా తొలగించబడిన పేజీ యొక్క కాలం చెల్లిన చరితం లింకును నొక్కినపుడు ఇది జరుగుతుంది. వివరాలు [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు లాగ్] లో దొరుకుతాయి.",
"blocked-notice-logextract": "ప్రస్తుతం ఈ వాడుకరిని నిరోధించారు.\nనిరోధపు చిట్టాలోని చివరి పద్దుని మీ సమాచారం కోసం ఈ క్రింద ఇస్తున్నాం:",
"clearyourcache": "<strong>గమనిక:</strong> భద్రపరచిన తర్వాత, మార్పులను చూడాలంటే మీ విహారిణి యొక్క కోశాన్ని తీసేయాల్సిరావచ్చు.\n*<strong>ఫైర్ఫాక్స్ / సఫారి:</strong> <em>Shift</em> మీటని నొక్కిపట్టి <em>Reload</em>ని నొక్కండి లేదా <em>Ctrl-F5</em> గానీ <em>Ctrl-R</em> (మాకింటోషులో <em>⌘-Shift-R</em>) గానీ నొక్కండి\n* <strong>గూగుల్ క్రోమ్:</strong> <em>Ctrl-Shift-R</em> (మాక్ లో <em>⌘-Shift-R</em>) నొక్కండి\n*<strong>ఇంటర్నెట్ ఎక్ప్లోరర్:</strong> <em>Ctrl</em> ను నొక్కిపట్టి <em>Refresh</em> నొక్కండి లేదా <em>Ctrl-F5</em> నొక్కండి.\n* <strong>ఓపెరా:</strong> <em>Menu → Settings</em> వెళ్ళి (మ్యాక్లో <em>Opera → Preferences</em>కు వెళ్ళాలి) తర్వాత <em>Privacy & security → Clear browsing data → Cached images and files</em>కు వెళ్ళండి.",
"usercssyoucanpreview": "<strong>చిట్కా:</strong> భద్రపరిచేముందు మీ కొత్త CSSని పరీక్షించడానికి \"{{int:showpreview}}\" బొత్తాన్ని వాడండి.",
+ "userjsonyoucanpreview": "<strong>చిట్కా:</strong> కొత్త JSON ను భద్రపరచే ముందు, \"{{int:showpreview}}\" మీటను నొక్కి దాన్ని పరీక్షించండి.",
"userjsyoucanpreview": "<strong>చిట్కా:</strong> భద్రపరిచేముందు మీ కొత్త జావాస్క్రిప్టుని పరీక్షించడానికి \"{{int:showpreview}}\" బొత్తాన్ని వాడండి.",
"usercsspreview": "<strong>మీరు వాడుకరి CSSను కేవలం సరిచూస్తున్నారని గుర్తుంచుకోండి.\nదాన్నింకా భద్రపరచలేదు!</strong>",
"userjspreview": "<strong>గుర్తుంచుకోండి, మీరింకా మీ వాడుకరి జావాస్క్రిప్ట్‌ను భద్రపరచలేదు, కేవలం పరీక్షిస్తున్నారు/సరిచూస్తున్నారు!</strong>",
"copyrightwarning2": "{{SITENAME}}లో ప్రచురించే రచనలన్నిటినీ ఇతర రచయితలు సరిదిద్దడం, మార్చడం, తొలగించడం జరగవచ్చు. మీ రచనలను అలా నిర్దాక్షిణ్యంగా దిద్దుబాట్లు చెయ్యడం మీకిష్టం లేకపోతే, వాటిని ఇక్కడ ప్రచురించకండి. <br />\nఅలాగే, ఈ రచనను మీరే చేసారని, లేదా ఏదైనా సార్వజనిక వనరు నుండి గానీ, అలాంటి ఉచిత, స్వేచ్ఛా వనరు నుండి గానీ కాపీ చేసి తెచ్చారని మాకు వాగ్దానం చేస్తున్నారు. (వివరాలకు $1 చూడండి).\n<strong>తగు అనుమతులు లేకుండా కాపీ హక్కులు గల రచనలను సమర్పించకండి!</strong>",
"editpage-cannot-use-custom-model": "ఈ పేజీ కంటెంట్ మోడల్ మార్చడం వీలుకాదు.",
"longpageerror": "<strong>లోపం: మీరు సమర్పించిన పాఠ్యం {{PLURAL:$1|ఒక కిలోబైటు|$1 కిలోబైట్ల}} నిడివి కలిగి ఉంది. ఇది గరిష్ఠ పరిమితి అయిన {{PLURAL:$2|ఒక కిలోబైటుని|$2 కిలోబైట్లను}} మించింది.</strong>\n దీన్ని భద్రపరచలేము.",
- "readonlywarning": "<strong>à°¹à±\86à°\9aà±\8dà°\9aà°°à°¿à°\95: నిరà±\8dవహణ à°\95à±\8aà°°à°\95à±\81 à°¡à±\87à°\9fాబà±\87à°¸à±\81à°\95à°¿ తాళà°\82 à°µà±\87సారà±\81. à°\95ాబà°\9fà±\8dà°\9fà°¿ à°®à±\80 మారà±\8dà°ªà±\81à°\9aà±\87à°°à±\8dà°ªà±\81లనà±\81 à°\87à°ªà±\8dà°ªà±\81à°¡à±\81 à°à°¦à±\8dరపరà°\9aà°²à±\87à°°à±\81.</strong> \nà°®à±\80 మారà±\8dà°ªà±\81లనà±\81 à°\92à°\95 ఫాఠà±\8dà°¯ à°«à±\88à°²à±\81à°²à±\8bà°\95à°¿ à°\95ాపà±\80 à°\9aà±\87సి à°à°¦à±\8dరపరà°\9aà±\81à°\95à±\8aని, తరà±\81వాత సమరà±\8dపిà°\82à°\9aà°\82à°¡à°¿.\n\nతాళà°\82 à°µà±\87సిన నిరà±\8dవాహà°\95à±\81à°¡à°¿ వివరణ à°\87à°¦à±\80: $1",
+ "readonlywarning": "<strong>à°¹à±\86à°\9aà±\8dà°\9aà°°à°¿à°\95: నిరà±\8dవహణ à°\95à±\8aà°°à°\95à±\81 à°¡à±\87à°\9fాబà±\87à°¸à±\81à°\95à°¿ తాళà°\82 à°µà±\87సారà±\81. à°\95ాబà°\9fà±\8dà°\9fà°¿ à°®à±\80 మారà±\8dà°ªà±\81à°\9aà±\87à°°à±\8dà°ªà±\81లనà±\81 à°\87à°ªà±\8dà°ªà±\81à°¡à±\81 à°à°¦à±\8dరపరà°\9aà°²à±\87à°°à±\81.</strong> \nà°®à±\80 మారà±\8dà°ªà±\81లనà±\81 à°\92à°\95 ఫాఠà±\8dà°¯ à°«à±\88à°²à±\81à°²à±\8bà°\95à°¿ à°\95ాపà±\80 à°\9aà±\87సి à°à°¦à±\8dరపరà°\9aà±\81à°\95à±\8aని, తరà±\81వాత సమరà±\8dపిà°\82à°\9aà°\82à°¡à°¿.\n\nతాళà°\82 à°µà±\87సిన సిసà±\8dà°\9fà°®à±\81 నిరà±\8dవాహà°\95à±\81à°¡à°¿ వివరణ à°\87ది: $1",
"protectedpagewarning": "<strong>హెచ్చరిక: ఈ పేజీ సంరక్షించబడింది. కాబట్టి నిర్వాహక అనుమతులు ఉన్న వాడుకరులు మాత్రమే మార్చగలరు.</strong>\nచివరి లాగ్ పద్దును మీ సమాచారం కోసం ఇక్కడ ఇస్తున్నాం:",
- "semiprotectedpagewarning": "<strong>à°\97మనిà°\95:</strong> నమà±\8bదయిన వాడà±\81à°\95à°°à±\81à°²à±\81 మాతà±\8dà°°à°®à±\87 మారà±\8dà°ªà±\81à°²à±\81 à°\9aà±\86à°¯à±\8dà°¯à°\97లిà°\97à±\87లా à°\88 à°ªà±\87à°\9cà±\80à°\95ి సంరక్షించారు.\nమీ సమాచారం కోసం చివరి లాగ్ పద్దుని ఇక్కడ ఇస్తున్నాం:",
- "cascadeprotectedwarning": "'''హెచ్చరిక:''' ఈ పేజీ, కాస్కేడింగు రక్షణలో ఉన్న కింది {{PLURAL:$1|పేజీ|పేజీల్లో}} ఇంక్లూడు అయి ఉంది కాబట్టి, నిర్వాహకులు తప్ప ఇతరులు దిద్దుబాటు చేసే వీలు లేకుండా {{PLURAL:$1|పేజీని|పేజీలను}} లాకు చేసాం:",
+ "semiprotectedpagewarning": "<strong>à°\97మనిà°\95:</strong> à°\86à°\9fà±\8b-à°\95à°¨à±\8dà°«à°°à±\8dà°®à±\8dâ\80\8cà°¡à±\8d వాడà±\81à°\95à°°à±\81à°²à±\81 మాతà±\8dà°°à°®à±\87 మారà±\8dà°ªà±\81à°²à±\81 à°\9aà±\86à°¯à±\8dà°¯à°\97లిà°\97à±\87లా à°\88 à°ªà±\87à°\9cà±\80à°¨ి సంరక్షించారు.\nమీ సమాచారం కోసం చివరి లాగ్ పద్దుని ఇక్కడ ఇస్తున్నాం:",
+ "cascadeprotectedwarning": "<strong>హెచ్చరిక:</strong> ఈ పేజీ కాస్కేడింగు రక్షణలో ఉన్న కింది {{PLURAL:$1|పేజీ|పేజీల్లో}} ట్రాన్స్క్లూడు అయి ఉంది కాబట్టి రక్షణలో ఉంది. [[Special:ListGroupRights|ప్రత్యేకించిన అనుమతులు]] ఉన్న వాడుకరులు మాత్రమే దీనిలో దిద్దుబాటు చెయ్యగలరు:",
"titleprotectedwarning": "<strong>హెచ్చరిక: ఈ పేజీని సంరక్షించారు కాబట్టి దీన్ని సృష్టించడానికి [[Special:ListGroupRights|ప్రత్యేక హక్కులు]] ఉండాలి.</strong>\nమీ సమాచారం కోసం చివరి చిట్టా పద్దుని ఇక్కడ ఇస్తున్నాం:",
"templatesused": "ఈ పేజీలో వాడిన {{PLURAL:$1|మూస|మూసలు}}:",
"templatesusedpreview": "ఈ మునుజూపులో వాడిన {{PLURAL:$1|మూస|మూసలు}}:",
"unwatch": "వీక్షించవద్దు",
"unwatchthispage": "వీక్షణను ఆపు",
"notanarticle": "వ్యాసం పేజీ కాదు",
- "notvisiblerev": "à°\88 కూర్పును తొలగించాం",
+ "notvisiblerev": "à°µà±\87à°°à±\87 వాడà±\81à°\95à°°à°¿ à°\9aà±\87సిన à°\9aివరి కూర్పును తొలగించాం",
"watchlist-details": "మీ వీక్షణ జాబితాలో {{PLURAL:$1|ఒక పేజీ ఉంది|$1 పేజీలున్నాయి}} (చర్చా పేజీలు అదనం).",
"wlheader-enotif": "ఈ-మెయిలు గమనికలు పంపబడతాయి.",
"wlheader-showupdated": "మీ గత సందర్శన తరువాత మారిన పేజీలు <strong>బొద్దు</strong>గా చూపించబడ్డాయి.",
"editcomment": "దిద్దుబాటు సారాశం: <em>$1</em>.",
"revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|చర్చ]]) చేసిన మార్పులను [[User:$1|$1]] చివరి కూర్పు వరకు తిప్పికొట్టారు.",
"revertpage-nouser": "దాగి ఉన్న వాడుకరి చేసిన మార్పులను [[User:$1|$1]] చివరి కూర్పు వరకు తిప్పికొట్టారు",
- "rollback-success": "{{GENDER:$3|$1}} à°\9aà±\87సిన దిదà±\8dà°¦à±\81బాà°\9fà±\8dలనà±\81 à°µà±\86à°¨à°\95à±\8dà°\95à±\81 à°¤à±\80à°¸à±\81à°\95à±\86à°³à±\8dళాà°\82; తిరిà°\97à°¿ {{GENDER:$4|$2}} à°\9aà±\87సిన à°\9aివరి à°\95à±\82à°°à±\8dà°ªà±\81à°\95à±\81 మారà±\8dà°\9aà°¾à°\82.",
- "rollback-success-notify": "$1 à°\9aà±\87సిన దిదà±\8dà°¦à±\81బాà°\9fà±\8dలనà±\81 à°µà±\86à°¨à°\95à±\8dà°\95à±\81 à°¤à±\80à°¸à±\81à°\95à±\86à°³à±\8dళాà°\82;\nతిరిà°\97à°¿ $2 à°\9aà±\87సిన à°\9aివరి à°\95à±\82à°°à±\8dà°ªà±\81à°\95à±\81 మారà±\8dà°\9aà°¾à°\82. [$3 మార్పులు చూపించు]",
+ "rollback-success": "{{GENDER:$3|$1}} à°\9aà±\87సిన దిదà±\8dà°¦à±\81బాà°\9fà±\8dలనà±\81 à°µà±\86à°¨à°\95à±\8dà°\95à±\81 à°¤à±\80à°¸à±\81à°\95à±\86à°³à±\8dళారà±\81; తిరిà°\97à°¿ {{GENDER:$4|$2}} à°\9aà±\87సిన à°\9aివరి à°\95à±\82à°°à±\8dà°ªà±\81à°\95à±\81 మారà±\8dà°\9aారà±\81.",
+ "rollback-success-notify": "$1 à°\9aà±\87సిన దిదà±\8dà°¦à±\81బాà°\9fà±\8dలనà±\81 à°µà±\86à°¨à°\95à±\8dà°\95à±\81 à°¤à±\80à°¸à±\81à°\95à±\86à°³à±\8dళారà±\81;\nతిరిà°\97à°¿ $2 à°\9aà±\87సిన à°\9aివరి à°\95à±\82à°°à±\8dà°ªà±\81à°\95à±\81 మారà±\8dà°\9aారà±\81. [$3 మార్పులు చూపించు]",
"sessionfailure-title": "సెషను వైఫల్యం",
"sessionfailure": "మీ లాగిన్ సెషనుతో ఏదో సమస్య ఉన్నట్లుంది;\nసెషను హైజాకు కాకుండా ఈ చర్యను రద్దు చేసాం.\nఫారమును తిరిగి సమర్పించండి.",
"changecontentmodel": "పేజీ కంటెంటు మోడలును మార్చు",
"protectlogpage": "సంరక్షణల చిట్టా",
"protectlogtext": "ఈ క్రింద ఉన్నది పేజీల సంరక్షణలకు జరిగిన మార్పుల జాబితా.\nప్రస్తుతం అమలులో ఉన్న సంరక్షణలకై [[Special:ProtectedPages|సంరక్షిత పేజీల జాబితా]]ను చూడండి.",
"protectedarticle": "\"[[$1]]\" సంరక్షించబడింది.",
- "modifiedarticleprotection": "\"[[$1]]\" à°¸à°\82à°°à°\95à±\8dà°·à°£ à°¸à±\8dథాయిని మారà±\8dà°\9aà°¾à°\82",
- "unprotectedarticle": "\"[[$1]]\" à°¯à±\8aà°\95à±\8dà°\95 à°¸à°\82à°°à°\95à±\8dషణనà±\81 à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°¾à°\82",
+ "modifiedarticleprotection": "\"[[$1]]\" à°¸à°\82à°°à°\95à±\8dà°·à°£ à°¸à±\8dథాయిని మారà±\8dà°\9aారà±\81",
+ "unprotectedarticle": "\"[[$1]]\" à°¯à±\8aà°\95à±\8dà°\95 à°¸à°\82à°°à°\95à±\8dషణనà±\81 à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81",
"movedarticleprotection": "సంరక్షణా అమరికని \"[[$2]]\" నుండి \"[[$1]]\"కి మార్చారు",
"protectedarticle-comment": "\"[[$1]]\" ను {{GENDER:$2|సంరక్షించారు}}",
"modifiedarticleprotection-comment": "\"[[$1]]\" యొక్క {{GENDER:$2|సంరక్షణ స్థాయిని మార్చారు}}",
"ipusubmit": "ఈ నిరోధాన్ని తొలగించు",
"unblocked": "[[User:$1|$1]]పై నిరోధం తొలగించబడింది",
"unblocked-range": "$1 పై నిరోధాన్ని తీసేసాం",
- "unblocked-id": "$1 అనే నిరోధాన్ని తొలగించాం",
+ "unblocked-id": "$1 అనే నిరోధాన్ని తొలగించాం.",
"unblocked-ip": "[[Special:Contributions/$1|$1]] పైనున్న నిరోధాన్ని ఎత్తివేసాం.",
"blocklist": "నిరోధిత వాడుకరులు",
"autoblocklist": "ఆటోబ్లాకులు",
"createaccountblock": "ఖాతా తెరవడాన్ని నిరోధించాము",
"emailblock": "ఈ-మెయిలుని నిరోధించాం",
"blocklist-nousertalk": "తమ చర్చాపేజీని మార్చలేరు",
+ "blocklist-editing": "దిద్దుబాటు",
+ "blocklist-editing-sitewide": "దిద్దుబాటు (సైటు పర్యంతం)",
+ "blocklist-editing-page": "పేజీలు",
+ "blocklist-editing-ns": "పేరుబరులు",
"ipblocklist-empty": "నిరోధపు జాబితా ఖాళీగా ఉంది.",
"ipblocklist-no-results": "మీరడిగిన ఐపీ అడ్రసు లేదా వాడుకరిపేరును నిరోధించలేదు.",
"blocklink": "నిరోధించు",
"blocklogtext": "వాడుకరుల నిరోధాలు, పునస్థాపనల చిట్టా ఇది. \nఆటోమాటిక్గా నిరోధానికి గురైన ఐ.పి. చిరునామాలు ఈ జాబితాలో ఉండవు. \nప్రస్తుతం అమల్లో ఉన్న నిరోధాలు, నిషేధాల కొరకు [[Special:BlockList|నిరోధాల జాబితా]]ను చూడండి.",
"unblocklogentry": "$1పై నిరోధం తొలగించబడింది",
"block-log-flags-anononly": "అజ్ఞాత వాడుకరులు మాత్రమే",
- "block-log-flags-nocreate": "à°\96ాతా à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aడానà±\8dని à°\85à°¶à°\95à±\8dà°¤à°\82 à°\9aà±\87సాà°\82",
- "block-log-flags-noautoblock": "à°\86à°\9fà±\8bమాà°\9fà°¿à°\95à±\8d నిరà±\8bధానà±\8dని à°\85à°¶à°\95à±\8dà°¤à°\82 à°\9aà±\87సాà°\82",
+ "block-log-flags-nocreate": "à°\96ాతా à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aడానà±\8dని à°\85à°¶à°\95à±\8dà°¤à°\82 à°\9aà±\87సారà±\81",
+ "block-log-flags-noautoblock": "à°\86à°\9fà±\8bమాà°\9fà°¿à°\95à±\8d నిరà±\8bధానà±\8dని à°\85à°¶à°\95à±\8dà°¤à°\82 à°\9aà±\87సారà±\81",
"block-log-flags-noemail": "ఈ-మెయిలుని నిరోధించాం",
"block-log-flags-nousertalk": "తమ చర్చాపేజీని మార్చలేరు",
"block-log-flags-angry-autoblock": "మరింత ధృడమైన స్వయంనిరోధకం సచేతనం చేయబడింది",
"block-log-flags-hiddenname": "వాడుకరిపేరుని దాచాం",
- "range_block_disabled": "à°¶à±\8dà°°à±\87ణి(à°°à±\87à°\82à°\9cà°¿) నిరà±\8bà°§à°\82 à°\9aà±\86à°¯à±\8dà°¯à°\97à°² నిరà±\8dవాహà°\95 à°\85à°¨à±\81మతిని à°\85à°¶à°\95à±\8dà°¤à°\82 à°\9aà±\87సాà°\82.",
+ "range_block_disabled": "à°¶à±\8dà°°à±\87ణి(à°°à±\87à°\82à°\9cà°¿) నిరà±\8bà°§à°\82 à°\9aà±\86à°¯à±\8dà°¯à°\97à°² నిరà±\8dవాహà°\95 à°\85à°¨à±\81మతిని à°\85à°¶à°\95à±\8dà°¤à°\82 à°\9aà±\87సారà±\81.",
"ipb_expiry_invalid": "అంతమయ్యే గడువు సరైనది కాదు.",
+ "ipb_expiry_old": "ముగిసే సమయం గతించిన కాలంలో ఉంది.",
"ipb_expiry_temp": "దాచిన వాడుకరిపేరు నిరోధాలు శాశ్వతంగా ఉండాలి.",
"ipb_hide_invalid": "ఈ ఖాతాను అణచలేకపోతున్నాం. దాని ఖాతాలో {{PLURAL:$1|ఒకటి కంటే|$1 కంటే}} ఎక్కువ దిద్దుబాట్లు ఉన్నాయి.",
+ "ipb_hide_partial": "వాడుకరిపేరును దాచి ఉంచిన నిరోధాలు, తప్పనిసరిగా సైటు పర్యంతం ఉండాలి.",
"ipb_already_blocked": "\"$1\" ను ఇప్పటికే నిరోధించాం",
"ipb-needreblock": "$1ని ఇప్పటికే నిరోధించారు. ఆ అమరికలని మీరు మార్చాలనుకుంటున్నారా?",
"ipb-otherblocks-header": "ఇతర {{PLURAL:$1|నిరోధం|నిరోధాలు}}",
"ipb_blocked_as_range": "లోపం: ఐపీ $1 ను నేరుగా నిరోధించలేదు, అంచేత నిరోధాన్ని రద్దుపరచలేము. అయితే, అది $2 శ్రేణిలో భాగంగా నిరోధానికి గురైంది, ఈ శ్రేణిపై ఉన్న నిరోధాన్ని రద్దుపరచవచ్చు.",
"ip_range_invalid": "సరైన ఐపీ శ్రేణి కాదు.",
"ip_range_toolarge": "/$1 కంటే పెద్దవైన సామూహిక నిరోధాలు అనుమతించబడవు.",
+ "ip_range_exceeded": "ఐపీ శ్రేణి గరిష్ఠ శ్రేణిని దాటిపోయింది. అనుమతించిన శ్రేణి: /$1.",
"proxyblocker": "ప్రాక్సీ నిరోధకం",
"proxyblockreason": "మీ ఐపీ అడ్రసు ఒక ఓపెన్ ప్రాక్సీ కాబట్టి దాన్ని నిరోధించాం. మీ ఇంటర్నెట్ సేవాదారుని గానీ, సాంకేతిక సహాయకుని గానీ సంప్రదించి తీవ్రమైన ఈ భద్రతా వైఫల్యాన్ని గురించి తెలపండి.",
"sorbsreason": "{{SITENAME}} వాడే DNSBLలో మీ ఐపీ అడ్రసు ఒక ఓపెన్ ప్రాక్సీగా నమోదై ఉంది.",
"move-watch": "ఈ పేజీని గమనించు",
"movepagebtn": "పేజీని తరలించు",
"pagemovedsub": "తరలింపు విజయవంతమైనది",
+ "cannotmove": "ఈ పేజీని కింది {{PLURAL:$1|కారణం|కారణాల}} వలన తరలించలేక పోయాం:",
"movepage-moved": "'''\"$1\"ని \"$2\"కి తరలించాం'''",
"movepage-moved-redirect": "ఒక దారిమార్పుని సృష్టించాం.",
"movepage-moved-noredirect": "దారిమార్పుని సృష్టించలేదు.",
+ "movepage-delete-first": "లక్ష్యిత పేజీకి చాలాకూర్పులు ఉన్నందున, తరలింపులో భాగంగా దాన్ని తొలగించలేం. ముందు ఆ పేజీని మానవికంగా తొలగించి, అప్పుడు ప్రయత్నించండి.",
"articleexists": "ఆ పేరుతో ఇప్పటికే ఒక పేజీ ఉంది, లేదా మీరు ఎంచుకున్న పేరు సరైనది కాదు. వేరే పేరు ఎంచుకోండి.",
"cantmove-titleprotected": "ఈ పేరుతోఉన్న పేజీని సృష్టించనివ్వకుండా సంరక్షిస్తున్నారు, అందుకని ఈ ప్రదేశంలోకి పేజీని తరలించలేను",
"movetalk": "కూడా వున్న చర్చ పేజీని తరలించు",
"tooltip-undo": "\"రద్దుచేయి\" ఈ మార్పుని రద్దుచేసి, దిద్దుబాటు ఫారాన్ని మునుజూపులో తెరుస్తుంది.\nసారాంశానికి కారణాన్ని చేర్చే వీలుకల్పిస్తుంది.",
"tooltip-preferences-save": "అభిరుచులను భద్రపరచు",
"tooltip-summary": "చిన్న సారాంశాన్ని ఇవ్వండి",
+ "common.json": "/* ఇక్కడున్న JSON, ప్రతి పేజీలోడుకు అందరి వాడుకరులకూ లోడవుతుంది. */",
"anonymous": "{{SITENAME}} యొక్క అజ్ఞాత {{PLURAL:$1|వాడుకరి|వాడుకరులు}}",
"siteuser": "{{SITENAME}} వాడుకరి $1",
"anonuser": "{{SITENAME}} అజ్ఞాత వాడుకరి $1",
"pageinfo-display-title": "చూపించే శీర్షిక",
"pageinfo-default-sort": "అప్రమేయంగా విడదీసే కీ",
"pageinfo-length": "పేజీ నిడివి (బైట్లలో)",
+ "pageinfo-namespace": "పేరుబరి",
"pageinfo-article-id": "పేజీ ఐడీ",
"pageinfo-language": "పేజీ విషయపు భాష",
"pageinfo-language-change": "మార్చు",
"pageinfo-category-files": "దస్త్రాల సంఖ్య",
"pageinfo-user-id": "వాడుకరి ID",
"pageinfo-file-hash": "హ్యాష్ వ్యాల్యూ",
+ "pageinfo-view-protect-log": "ఈ పేజీకి సంబంధించిన సంరక్షణ లాగ్ను చూడండి.",
"markaspatrolleddiff": "పరీక్షించినట్లుగా గుర్తు పెట్టు",
"markaspatrolledtext": "ఈ వ్యాసాన్ని పరీక్షించినట్లుగా గుర్తు పెట్టు",
"markaspatrolledtext-file": "దస్త్రపు ఈ కూర్పు నిఘాలో ఉందని గుర్తు పెట్టు",
"previousdiff": "← మునుపటి మార్పు",
"nextdiff": "తరువాతి మార్పు →",
"mediawarning": "'''హెచ్చరిక''': ఈ రకపు ఫైలులో హానికరమైన కోడ్ ఉండవచ్చు.\nదాన్ని నడపడం వల్ల, మీ సిస్టమ్ లొంగిపోవచ్చు.",
- "imagemaxsize": "à°¬à±\8aà°®à±\8dà°® పరిమాణà°\82à°ªà±\88 పరిమితి:<br />''(దసà±\8dà°¤à±\8dà°°à°ªà±\81 వివరణ à°ªà±\81à°\9fà°² à°\95à±\8aà°°à°\95à±\81)''",
+ "imagemaxsize": "వివరణ à°ªà±\87à°\9cà±\80à°²à±\8dà°²à±\8b à°¬à±\8aà°®à±\8dà°® పరిమాణ పరిమితి:",
"thumbsize": "నఖచిత్రం వైశాల్యం:",
"widthheightpage": "$1 × $2, $3 {{PLURAL:$3|పేజీ|పేజీలు}}",
"file-info": "ఫైలు పరిమాణం: $1, MIME రకం: $2",
"confirmemail_subject": "{{SITENAME}} ఈ-మెయిలు చిరునామా ధృవీకరణ",
"confirmemail_body": "$1 ఐపీ చిరునామా నుండి ఎవరో, బహుశా మీరే,\n{{SITENAME}}లో \"$2\" అనే ఖాతాని ఈ ఈమెయిలు చిరునామాతో నమోదుచేసుకున్నారు.\n\nఆ ఖాతా నిజంగా మీదే అని నిర్ధారించేందుకు మరియు {{SITENAME}}లో ఈమెయిలు సౌలభ్యాలని చేతనం చేసుకునేందుకు, ఈ లంకెని మీ విహారిణిలో తెరవండి:\n\n$3\n\nఒకవేళ ఆ ఖాతా మీది *కాకపోతే*, ఈమెయిలు చిరునామా నిర్ధారణని రద్దుచేసేందుకు ఈ లంకెని అనుసరించండి:\n\n$5\n\nఈ నిర్ధారణా సంకేతం $4కి కాలంచెల్లుతుంది.",
"confirmemail_body_changed": "$1 ఐపీ చిరునామా నుండి ఎవరో, బహుశా మీరే,\n{{SITENAME}}లో \"$2\" అనే ఖాతా యొక్క ఈ-మెయిలు చిరునామాని ఈ చిరునామాకి మార్చారు.\n\nఆ ఖాతా నిజంగా మీదే అని నిర్ధారించేందుకు మరియు {{SITENAME}}లో\nఈ-మెయిలు సౌలభ్యాలని పునఃచేతనం చేసుకునేందుకు, ఈ లంకెని మీ విహారిణిలో తెరవండి:\n\n$3\n\nఒకవేళ ఆ ఖాతా మీది *కాకపోతే*, ఈ-మెయిలు చిరునామా నిర్ధారణని రద్దుచేసేందుకు\nఈ లంకెని అనుసరించండి:\n\n$5\n\nఈ నిర్ధారణా సంకేతం $4కి కాలంచెల్లుతుంది.",
+ "confirmemail_body_set": "$1 ఐపీ చిరునామా నుండి ఎవరో, బహుశా మీరే, ఈ ఈ-మెయిలు చిరునామాను\n{{SITENAME}}లో \"$2\" అనే ఖాతా యొక్క ఈ-మెయిలు చిరునామాగా సెట్ చేసారు.\n\nఆ ఖాతా నిజంగా మీదే అని నిర్ధారించేందుకు, {{SITENAME}}లో\nఈ-మెయిలు సౌలభ్యాలని చేతనం చేసుకునేందుకూ ఈ లంకెని మీ విహారిణిలో తెరవండి:\n\n$3\n\nఒకవేళ ఆ ఖాతా మీది *కాకపోతే*, ఈ-మెయిలు చిరునామా నిర్ధారణను రద్దుచేసేందుకు\nఈ లంకెని నొక్కండి:\n\n$5\n\nఈ నిర్ధారణ లింకుకు $4 కు కాలం చెల్లుతుంది.",
"confirmemail_invalidated": "ఈ-మెయిలు చిరునామా నిర్ధారణని రద్దుచేసాం",
"invalidateemail": "ఈ-మెయిలు నిర్ధారణని రద్దుచేయండి",
- "notificationemail_subject_changed": "{{SITENAME}} నమà±\8bà°¦à±\88à°¨ à°\88à°®à±\86యిలà±\81 à°\85à°¡à±\8dà°°à°¸à±\81à°¨à±\81 మారà±\8dà°\9aà°¾à°\82",
+ "notificationemail_subject_changed": "{{SITENAME}} నమà±\8bà°¦à±\88à°¨ à°\88à°®à±\86యిలà±\81 à°\85à°¡à±\8dà°°à°¸à±\81à°¨à±\81 మారà±\8dà°\9aారà±\81",
"notificationemail_subject_removed": "{{SITENAME}} నమోదైన ఈమెయిలు అడ్రసును తీసివేసాం",
"notificationemail_body_changed": "ఐపీ అడ్రసు $1 నుండి ఎవరో - బహుశా మీరే కావచ్చు -\n{{SITENAME}} లోని ఖాతా ఈమెయిలు అడ్రసు, \"$2\" ను \"$3\" కు మార్చారు.\n\nఅది మీరు కాకపోతే, వెంటనే ఓ సైటు నిర్వాహకుణ్ణి సంప్రదించండి.",
"notificationemail_body_removed": "ఐపీ అడ్రసు $1 నుండి ఎవరో - బహుశా మీరే కావచ్చు -\n{{SITENAME}} లోని ఖాతా ఈమెయిలు అడ్రసు, \"$2\" ను తొలగించారు.\n\nఅది మీరు కాకపోతే, వెంటనే ఓ సైటు నిర్వాహకుణ్ణి సంప్రదించండి.",
"confirm-unwatch-top": "ఈ పుటను మీ వీక్షణ జాబితా నుండి తొలగించాలా?",
"confirm-rollback-button": "సరే",
"confirm-rollback-top": "ఈ పేజీలో జరిగిన దిద్దుబాట్లను వెనక్కి తిప్పాలా?",
+ "confirm-mcrrestore-title": "ఓ కూర్పును పునస్స్థాపించండి",
+ "confirm-mcrundo-title": "మార్పును రద్దుచెయ్యండి",
+ "mcrundofailed": "రద్దు విఫలమైంది",
+ "mcrundo-changed": "ఈ పేజీ తేడాను చూసిన తరువాత, పేజీలో దిద్దుబాటు జరిగింది. కొత్త మార్పును పరిశీలించండి.",
"quotation-marks": "“$1”",
"imgmultipageprev": "← మునుపటి పేజీ",
"imgmultipagenext": "తరువాతి పేజీ →",
"autosumm-replace": "పేజీని '$1' తో మారుస్తున్నాం",
"autoredircomment": "పేజీని [[$1]] కు దారి మళ్ళించారు",
"autosumm-removed-redirect": "[[$1]] కు ఉన్న దారిమార్పును తీసేసాం",
- "autosumm-changed-redirect-target": "దారిమారà±\8dà°ªà±\81à°¨à±\81 [[$1]] à°¨à±\81à°\82à°¡à°¿ [[$2]] à°\95à±\81 మారà±\8dà°\9aà°¾à°\82",
+ "autosumm-changed-redirect-target": "దారిమారà±\8dà°ªà±\81à°¨à±\81 [[$1]] à°¨à±\81à°\82à°¡à°¿ [[$2]] à°\95à±\81 మారà±\8dà°\9aారà±\81",
"autosumm-new": "'$1' తో కొత్త పేజీని సృష్టించారు",
"autosumm-newblank": "ఖాళీ పేజీని సృష్టించారు",
"lag-warn-normal": "$1 {{PLURAL:$1|క్షణం|క్షణాల}} లోపు జరిగిన మార్పులు ఈ జాబితాలో కనిపించకపోవచ్చు.",
"specialpages-group-developer": "వికాసకుల పనిముట్లు",
"blankpage": "ఖాళీ పేజీ",
"intentionallyblankpage": "బెంచిమార్కింగు, మొదలగు వాటికై ఈ పేజీని కావాలనే ఖాళీగా వదిలాము.",
+ "disabledspecialpage-disabled": "ఈ పేజీని సిస్టం నిర్వాహకుడు అచేతనం చేసారు.",
"external_image_whitelist": " #ఈ లైనును ఎలా ఉన్నదో అలాగే వదిలెయ్యండి<pre>\n#regular expression తునకలను (// ల మధ్య ఉండే భాగం)కింద పెట్టండి\n#వీటిని బయటి బొమ్మల URLలతో సరిపోల్చుతాము\n#సరిపోలిన బొమ్మలను చూపిస్తాము, మిగిలినవాటి లింకులను మాత్రమే చూపిస్తాము\n##తో మొదలయ్యే లైనులు వ్యాఖ్యానాలుగా భావించబడతాయి\n#ఇది కేస్-సెన్సిటివ్\n\n#అన్ని తునకలను ఈ లైనుకు పైన ఉంచండి. ఈ లైనును ఎలా ఉన్నదో అలాగే వదిలెయ్యండి</pre>",
"tags": "సరైన మార్పు ట్యాగులు",
"tag-filter": "[[Special:Tags|ట్యాగుల]] వడపోత:",
"tag-mw-replace-description": "పేజీలోని పాఠ్యంలో 90% కి పైగా తీసివేసే దిద్దుబాట్లు",
"tag-mw-rollback": "రోల్బ్యాక్",
"tag-mw-rollback-description": "వెనక్కితిప్పు లింకు ద్వారా మునుపటి దిద్దుబాట్లను రద్దు చేసే దిద్దుబాట్లు",
+ "tag-mw-undo": "రద్దుచెయ్యి",
"tags-title": "ట్యాగులు",
"tags-intro": "మార్పుచేర్పులకు సాఫ్టువేరు ఇచ్చే ట్యాగులను, వాటి అర్ధాలనూ ఈ పేజీ చూపిస్తుంది.",
"tags-tag": "ట్యాగు పేరు",
"tags-actions-header": "చర్యలు",
"tags-active-yes": "అవును",
"tags-active-no": "కాదు",
+ "tags-source-extension": "సాఫ్టువేరు సృష్టించినవి",
+ "tags-source-manual": "వాడుకరులు, బాట్లు అమలు చేసేవి",
"tags-source-none": "వాడుకలో లేదు",
"tags-edit": "మార్చు",
"tags-delete": "తొలగించు",
"tags-activate": "చేతనంచేయి",
+ "tags-deactivate": "అచేతనం చేయి",
"tags-hitcount": "$1 {{PLURAL:$1|మార్పు|మార్పులు}}",
"tags-manage-no-permission": "ట్యాగులను నిర్వహించడానికి మీకు అనుమతి లేదు.",
+ "tags-manage-blocked": "{{GENDER:$1|మీరు}} నిరోధంలో ఉండగా, ట్యాగుల మార్పులను నిర్వహించలేరు.",
"tags-create-heading": "కొత్త ట్యాగును సృష్టించు",
"tags-create-explanation": "డిఫాల్టుగా, కొత్తగా సృష్టించిన ట్యాగులు, వాడుకరులు బాట్లూ వాడుకునేందుకు వెంటనే అందుబాటులోకి వస్తాయి.",
"tags-create-tag-name": "ట్యాగు పేరు:",
"tags-edit-logentry-submit": "{{PLURAL:$1|ఈ చిట్టా పద్దుకు|$1 చిట్టా పద్దులకు}} మార్పులను వర్తింపజేయి",
"tags-edit-success": "మార్పులు ఆపాదించబడ్డాయి.",
"tags-edit-failure": "మార్పులను వర్తింపజేయలేక పోయాం:\n$1",
+ "tags-edit-nooldid-title": "తప్పుడు లక్ష్యపు-కూర్పు",
+ "tags-edit-nooldid-text": "ఈ పని చేసేందుకు, మీరు లక్ష్యం కూర్పును ఇవ్వలేదు. లేదా ఇచ్చిన కూర్పు ఉనికిలో లేదు.",
"tags-edit-none-selected": "చేర్చడానికి/తీసెయ్యడానికి కనీసం ఒక్క ట్యాగునైనా ఎంచుకోండి",
"comparepages": "పుటల పోలిక",
"compare-page1": "పుట 1",
"compare-revision-not-exists": "మీరు పేర్కొన్న కూర్పు లేనే లేదు.",
"diff-form": "తేడాలు",
"diff-form-oldid": "పాత కూర్పు ID (ఐచ్ఛికం)",
+ "diff-form-revid": "తేడా యొక్క కూర్పు ఐడి",
"diff-form-submit": "తేడాలను చూపించు",
"permanentlink": "స్థిర లంకె",
"permanentlink-revid": "కూర్పు ID",
"logentry-block-block": "$1, {{GENDER:$4|$3}}ను {{GENDER:$2|నిరోధించారు}}. నిరోధ కాలం: $5 $6",
"logentry-block-unblock": "$1 {{GENDER:$4|$3}} పై ఉన్న {{GENDER:$2|నిరోధాన్ని ఎత్తివేసారు}}",
"logentry-block-reblock": "$1 {{GENDER:$4|$3}} యొక్క నిరోధపు కాలం తీరిపోయే వ్యవధిని $5 $6 గా సెట్టింగులను {{GENDER:$2|మార్చారు}}",
- "logentry-partialblock-block": "{{GENDER:$4|$3}} {{PLURAL:$8}} పేజీల్లో ($7) మార్పులు చేయకుండా $1 {{GENDER:$2|నిరోధించారు}}. నిరోధించిన కాలం : $5 $6",
- "logentry-partialblock-reblock": "{{GENDER:$4|$3}} {{PLURAL:$8}} పేజీల్లో ($7) మార్పులు చేయకుండా $1 {{GENDER:$2|నిరోధించారు}}. నిరోధించిన కాలం : $5 $6",
+ "logentry-partialblock-block-page": "{{PLURAL:$1|పేజీ|పేజీలు}} $2",
+ "logentry-partialblock-block-ns": "{{PLURAL:$1|పేరుబరి|పేరుబరులు}} $2",
+ "logentry-partialblock-block": "$7 లో దిద్దుబాట్లు చెయ్యకుండా {{GENDER:$4|$3}} ను $1 {{GENDER:$2|నిరోధించారు}}. గడువు $5 $6",
+ "logentry-partialblock-reblock": "$7 లో దిద్దుబాట్లు చెయ్యకుండా {{GENDER:$4|$3}} పై విధించిన నిరోధాన్ని, $1 {{GENDER:$2|సవరించారు}}. గడువు $5 $6",
"logentry-non-editing-block-block": "$5 $6 సమయానికి నిరోధం ముగిసే వరకు {{GENDER:$4|$3}}ని $1 దిద్దుబాట్లు కాకుండా ఇతర చర్యల నుంచి {{GENDER:$2|నిరోధించారు}}",
"logentry-non-editing-block-reblock": "{{GENDER:$4|$3}} నిరోధాల సెట్టింగులను $1 {{GENDER:$2|మార్చారు}}. ప్రస్తుతం నిరోధ కాలపు గడువు: $5 $6.",
"logentry-suppress-block": "$1, {{GENDER:$4|$3}}ను {{GENDER:$2|నిరోధించారు}}. నిరోధ కాలం: $5 $6",
"api-error-publishfailed": "అంతర్గత లోపం: తాత్కాలిక ఫైలును ప్రచురించడంలో సర్వరు విఫలమైంది.",
"api-error-stashfailed": "అంతర్గత లోపం: తాత్కాలిక దస్త్రాన్ని భద్రపరచడంలో సేవకి విఫలమైంది.",
"api-error-unknown-warning": "తెలియని హెచ్చరిక: \"$1\".",
- "api-error-unknownerror": "à°¤à±\86లియని à°ªà±\8aరపాà°\9fà±\81: \"$1\".",
+ "api-error-unknownerror": "à°¤à±\86లియని à°²à±\8bà°ªà°\82: \"$1\".",
"duration-seconds": "$1 {{PLURAL:$1|క్షణం|క్షణాలు}}",
"duration-minutes": "$1 {{PLURAL:$1|నిమిషం|నిమిషాలు}}",
"duration-hours": "$1 {{PLURAL:$1|గంట|గంటలు}}",
"authmanager-create-no-primary": "మీరిచ్చిన విశేషాలతో ఖాతాను సృష్టించలేకపోయాం.",
"authmanager-link-no-primary": "మీరిచ్చిన విశేషాలతో ఖాతాలను లింకు చెయ్యలేకపోయాం.",
"authmanager-link-not-in-progress": "ఖాతాలను లింకు చేసే పని జరగడం లేదు. లేదా సెషను డేటా పోయింది. మళ్ళీ మొదటినుండి మొదలుపెట్టండి.",
- "authmanager-authplugin-setpass-failed-title": "సంకేతపదం మార్పు విఫలమైంది.",
- "authmanager-authplugin-setpass-failed-message": "సంకేతపదం మార్పును ఆథెంటికేషన్ ప్లగిన్ తిరస్కరించింది.",
- "authmanager-authplugin-create-fail": "ఖాతా సృష్టిని ఆథెంటికేషన్ ప్లగిన్ తిరస్కరించింది.",
- "authmanager-authplugin-setpass-denied": "ఆథెంటికేషన్ ప్లగిన్ సంకేతపదం మార్పులను అనుమతించదు.",
- "authmanager-authplugin-setpass-bad-domain": "తప్పు డొమెయిన్",
"authmanager-autocreate-noperm": "ఆటోమాటిక్ ఖాతా సృష్టికి అనుమతి లేదు.",
"authmanager-userdoesnotexist": "వాడుకరి ఖాతా \"$1\" నమోదయి లేదు.",
"authmanager-userlogin-remembermypassword-help": "సెషను ముగిసిన తరువాత కూడా సంకేతపదాన్ని గుర్తుంచుకోమంటారా",
"group-bot": "บอต",
"group-sysop": "ผู้ดูแลระบบ",
"group-interface-admin": "ผู้ดูแลระบบอินเตอร์เฟซ",
- "group-bureaucrat": "à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aสิà¸\97à¸\98ิà¹\8cà¹\81à¸\95à¹\88à¸\87à¸\95ัà¹\89à¸\87",
+ "group-bureaucrat": "ผู้ดูแลระบบสิทธิแต่งตั้ง",
"group-suppress": "ผู้ดูแลประวัติ",
"group-all": "(ทั้งหมด)",
"group-user-member": "{{GENDER:$1|ผู้ใช้}}",
"group-bot-member": "{{GENDER:$1|บอต}}",
"group-sysop-member": "{{GENDER:$1|ผู้ดูแลระบบ}}",
"group-interface-admin-member": "{{GENDER:$1|ผู้ดูแลระบบอินเตอร์เฟซ}}",
- "group-bureaucrat-member": "{{GENDER:$1|à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aสิà¸\97à¸\98ิà¹\8cà¹\81à¸\95à¹\88à¸\87à¸\95ัà¹\89à¸\87}}",
+ "group-bureaucrat-member": "{{GENDER:$1|ผู้ดูแลระบบสิทธิแต่งตั้ง}}",
"group-suppress-member": "{{GENDER:$1|ผู้ดูแลประวัติ}}",
"grouppage-user": "{{ns:project}}:ผู้ใช้",
"grouppage-autoconfirmed": "{{ns:project}}:ผู้ใช้ยืนยันอัตโนมัติ",
"grouppage-bot": "{{ns:project}}:บอต",
"grouppage-sysop": "{{ns:project}}:ผู้ดูแลระบบ",
"grouppage-interface-admin": "{{ns:project}}:ผู้ดูแลระบบอินเตอร์เฟซ",
- "grouppage-bureaucrat": "{{ns:project}}:à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aสิà¸\97à¸\98ิà¹\8cà¹\81à¸\95à¹\88à¸\87à¸\95ัà¹\89à¸\87",
+ "grouppage-bureaucrat": "{{ns:project}}:ผู้ดูแลระบบสิทธิแต่งตั้ง",
"grouppage-suppress": "{{ns:project}}:ผู้ดูแลประวัติ",
"right-read": "อ่านหน้า",
"right-edit": "แก้ไขหน้า",
"listgrouprights-summary": "ด้านล่างเป็นรายการกลุ่มผู้ใช้ที่นิยามบนวิกินี้ และสิทธิการเข้าถึงที่เกี่ยวข้อง\nอาจมี[[{{MediaWiki:Listgrouprights-helppage}}|ข้อมูลเพิ่มเติม]]เกี่ยวกับสิทธิหนึ่ง ๆ",
"listgrouprights-key": "คำอธิบาย:\n* <span class=\"listgrouprights-granted\">สิทธิที่ได้รับแต่งตั้ง</span>\n* <span class=\"listgrouprights-revoked\">สิทธิที่ถูกเพิกถอน</span>",
"listgrouprights-group": "กลุ่ม",
- "listgrouprights-rights": "สิทธิ์",
+ "listgrouprights-rights": "สิทธิ",
"listgrouprights-helppage": "Help:สิทธิกลุ่ม",
"listgrouprights-members": "(รายการสมาชิก)",
"listgrouprights-addgroup": "เพิ่ม{{PLURAL:$2|กลุ่มนี้|กลุ่มเหล่านี้}}: $1",
"listgrouprights-namespaceprotection-restrictedto": "สิทธิอนุญาตให้ผู้ใช้แก้ไข",
"listgrants": "การให้สิทธิ",
"listgrants-grant": "การให้สิทธิ",
- "listgrants-rights": "สิทธิ์",
+ "listgrants-rights": "สิทธิ",
"trackingcategories": "หมวดหมู่ค้นหาและติดตาม",
"trackingcategories-summary": "หน้านี้แสดงรายการหมวดหมู่ค้นหาและติดตามซึ่งซอฟต์แวร์มีเดียวิกิจัดการอัตโนมัติ สามารถเปลี่ยนชื่อเหล่านี้ได้โดยการเปลี่ยนข้อความระบบที่เกี่ยวข้องในเนมสเปซ {{ns:8}}",
"trackingcategories-msg": "หมวดหมู่ค้นหาและติดตาม",
"authmanager-create-no-primary": "เอกสารทางการที่ให้ไม่สามารถใช้สำหรับการสร้างบัญชีได้",
"authmanager-link-no-primary": "เอกสารทางการที่ให้ไม่สามารถใช้สำหรับการเชื่อมโยงบัญชี",
"authmanager-link-not-in-progress": "ไม่อยู่ระหว่างการโยงบัญชีหรือข้อมูลเซสชันสูญหาย กรุณาเริ่มใหม่ตั้งแต่ต้น",
- "authmanager-authplugin-setpass-failed-title": "การเปลี่ยนรหัสผ่านล้มเหลว",
- "authmanager-authplugin-setpass-failed-message": "ปลั๊กอินการพิสูจน์ตัวจริงปฏิเสธการเปลี่ยนรหัสผ่าน",
- "authmanager-authplugin-create-fail": "ปลั๊กอินการพิสูจน์ตัวจริงปฏิเสธการสร้างบัญชี",
- "authmanager-authplugin-setpass-denied": "ปลั๊กอินการพิสูจน์ตัวจริงไม่อนุญาตการเปลี่ยนรหัสผ่าน",
- "authmanager-authplugin-setpass-bad-domain": "โดเมนไม่สมเหตุสมผล",
"authmanager-autocreate-noperm": "ไม่อนุญาตการสร้างบัญชีอัตโนมัติ",
"authmanager-autocreate-exception": "ปิดใช้งานการสร้างบัญชีอัตโนมัติชั่วคราวเนื่องจากข้อผิดพลาดก่อนหน้านี้",
"authmanager-userdoesnotexist": "บัญชีผู้ใช้ \"$1\"ยังไม่ลงทะเบียน",
"log-action-filter-protect-move_prot": "Taşıma koruması",
"log-action-filter-upload-upload": "Yeni yükleme",
"log-action-filter-upload-overwrite": "Yeniden yükle",
- "authmanager-authplugin-setpass-bad-domain": "Geçersiz alanadı.",
"authmanager-autocreate-noperm": "Otomatik kullanıcı oluşturma izni yok.",
"authmanager-userdoesnotexist": "\"$1\" kullanıcı hesabı kayıtlı değil.",
"authmanager-email-label": "E-posta",
"upload-scripted-pi-callback": "Неможливо завантажити файл, що містить інструкції опрацювання таблиці стилів XML.",
"upload-scripted-dtd": "Неможливо завантажувати SVG-файли, які містять нестандартну декларацію DTD.",
"uploaded-script-svg": " \t\t\nЗнайдений небезпечний елемент з підтримкою сценаріїв «$1» в завантаженому файлі SVG.",
- "uploaded-hostile-svg": " \t\nЗнайдений небезпечний CSS-код в елементі стилю завантаженого файлу SVG.",
+ "uploaded-hostile-svg": "Знайдений небезпечний CSS-код в елементі стилю завантаженого файлу SVG.",
"uploaded-event-handler-on-svg": " \t\nУстановка атрибутів обробника подій <code>$1=\"$2\"</code> не дозволено для SVG-файлів.",
"uploaded-href-attribute-svg": "<a> елементи можуть лише посилатися (href) на цілі типу data: (вбудований файл), http:// або https://, або ж fragment (#, same-document). Для інших елементів, таких як <image>, дозволені лише data: і fragment. Спробуйте вбудовувати зображення при експортуванні Вашого файлу SVG. Знайдено <code><$1 $2=\"$3\"></code>.",
"uploaded-href-unsafe-target-svg": "У завантаженому SVG-файлі знайдено href на небезпечні дані: ціль URI <code><$1 $2=\"$3\"></code>.",
"logentry-rights-autopromote": "$1 було автоматично переведено із $4 в $5",
"logentry-upload-upload": "$1 {{GENDER:$2|завантажив|завантажила}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|завантажив|завантажила}} нову версію $3",
- "logentry-upload-revert": "$1 {{GENDER:$2|заванÑ\82ажив|заванÑ\82ажила}} $3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|повеÑ\80нÑ\83в|повеÑ\80нÑ\83ла}} $3 до Ñ\81Ñ\82аÑ\80оÑ\97 веÑ\80Ñ\81Ñ\96Ñ\97",
"log-name-managetags": "Журнал управління мітками",
"log-description-managetags": "На цій сторінці перераховані завдання управління, пов'язані з [[Special:Tags|мітками]]. Журнал містить тільки дії, виконані вручну адміністратором; мітки можуть бути створені або видалені програмним забезпеченням вікі без запису в цей журнал.",
"logentry-managetags-create": "$1 {{GENDER:$2|створив|створила}} мітку «$4»",
"log-action-filter-suppress-reblock": "Приховування користувача через повторне блокування",
"log-action-filter-upload-upload": "Нове завантаження",
"log-action-filter-upload-overwrite": "Повторне завантаження",
+ "log-action-filter-upload-revert": "Відкотити",
"authmanager-authn-not-in-progress": "Автентифікація не виконується або втрачено дані сесії. Будь ласка, почніть знову з самого початку.",
"authmanager-authn-no-primary": "Надані облікові дані не можуть бути завірені.",
"authmanager-authn-no-local-user": "Надані облікові дані не пов'язані з жодним користувачем у цій вікі.",
"authmanager-create-no-primary": "Надані облікові дані не можуть бути використані для створення облікового запису.",
"authmanager-link-no-primary": "Надані облікові дані не можуть бути використані для прив'язки облікового запису.",
"authmanager-link-not-in-progress": "Пов'язання облікового запису не виконується або втрачено дані сесії. Будь ласка, почніть знову з самого початку.",
- "authmanager-authplugin-setpass-failed-title": "Не вдалося змінити пароль",
- "authmanager-authplugin-setpass-failed-message": "Плагін автентифікації відмовив у зміні пароля.",
- "authmanager-authplugin-create-fail": "Плагін автентифікації відмовив у створенні облікового запису.",
- "authmanager-authplugin-setpass-denied": "Плагін автентифікації не дозволяє змінювати паролі.",
- "authmanager-authplugin-setpass-bad-domain": "Неприпустимий домен.",
"authmanager-autocreate-noperm": "Автоматичне створення облікових записів не допускається.",
"authmanager-autocreate-exception": "Автоматичне створення облікових записів тимчасово відключене через попередні помилки.",
"authmanager-userdoesnotexist": "Обліковий запис користувача «$1» не зареєстровано.",
"passwordpolicies-policy-maximalpasswordlength": "Пароль повинен бути коротшим $1 {{PLURAL:$1|символа|символів}}",
"passwordpolicies-policy-passwordcannotbepopular": "Пароль не може бути {{PLURAL:$1|часто вживаним|будь-яким з $1 часто вживаних паролів}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "Пароль не може перебувати у списку 100 000 найчастіше вживаних паролів.",
+ "passwordpolicies-policyflag-forcechange": "має бути змінено при вході",
"easydeflate-invaliddeflate": "Наданий вміст не стиснений належним чином",
"unprotected-js": "З міркувань безпеки JavaScript не можна запускати з незахищених сторінок. Будь ласка, створюйте javascript лише в просторі MediaWiki, або як особисту підсторінку користувача."
}
"authmanager-create-no-primary": "فراہم کردہ وثیقوں کو کھاتہ سازی کے لیے استعمال نہیں کیا جا سکا۔",
"authmanager-link-no-primary": "فراہم کردہ وثیقوں کو کھاتوں سے مربوط کرنے کے لیے استعمال نہیں کیا جا سکا۔",
"authmanager-link-not-in-progress": "کھاتوں کو مربوط کرنے کا عمل جاری نہ رہ سکا یا نشست کا ڈیٹا گم ہو چکا ہے۔ براہ کرم آغاز سے دوبارہ کوشش کریں۔",
- "authmanager-authplugin-setpass-failed-title": "پاس ورڈ کی تبدیلی ناکام رہی",
- "authmanager-authplugin-setpass-failed-message": "تصدیقی ہلگ ان نے پاس ورڈ کی تبدیلی کو رد کر دیا۔",
- "authmanager-authplugin-create-fail": "تصدیقی ہلگ ان نے کھاتہ سازی کو رد کر دیا۔",
- "authmanager-authplugin-setpass-denied": "تصدیقی ہلگ ان میں پاس ورڈ کی تبدیلی کی اجازت نہیں ہے۔",
- "authmanager-authplugin-setpass-bad-domain": "نادرست ڈومین۔",
"authmanager-autocreate-noperm": "خودکار کھاتہ سازی کی اجازت نہیں ہے۔",
"authmanager-autocreate-exception": "سابقہ نقص کی وجہ سے عارضی طور پر خودکار کھاتہ سازی غیر فعال ہے۔",
"authmanager-userdoesnotexist": "«$1» کے نام سے صارف کھاتہ مندرج نہیں ہے۔",
"log-action-filter-suppress-reblock": "Ẩn giấu người dùng bằng cách cấm lại",
"log-action-filter-upload-upload": "Tải lên mới",
"log-action-filter-upload-overwrite": "Tải lên lại",
+ "log-action-filter-upload-revert": "Lùi lại",
"authmanager-authn-not-in-progress": "Không phải đang xác thực, hoặc dữ liệu phiên làm việc bị mất. Xin hãy thử lại từ đầu.",
"authmanager-authn-no-primary": "Không thể xác thực định danh được cung cấp.",
"authmanager-authn-no-local-user": "Định danh được cung cấp không ứng với người dùng nào trên wiki này.",
"authmanager-create-no-primary": "Không thể sử dụng định danh được cung cấp để tạo tài khoản.",
"authmanager-link-no-primary": "Không thể sử dụng định danh được cung cấp để liên kết tài khoản.",
"authmanager-link-not-in-progress": "Không phải đang liên kết tài khoản, hoặc dữ liệu phiên làm việc bị mất. Xin hãy thử lại từ đầu.",
- "authmanager-authplugin-setpass-failed-title": "Thay đổi mật khẩu bị thất bại",
- "authmanager-authplugin-setpass-failed-message": "Phần bổ trợ xác thực đã từ chối việc đổi mật khẩu.",
- "authmanager-authplugin-create-fail": "Phần bổ trợ xác thực đã từ chối việc tạo tài khoản.",
- "authmanager-authplugin-setpass-denied": "Phần bổ trợ xác thực không cho phép đổi mật khẩu.",
- "authmanager-authplugin-setpass-bad-domain": "Tên miền không hợp lệ.",
"authmanager-autocreate-noperm": "Không cho phép tự động tạo tài khoản.",
"authmanager-autocreate-exception": "Tạm thời không cho phép tự động tạo tài khoản vì các lỗi trước đây.",
"authmanager-userdoesnotexist": "Chưa có tài khoản với tên “$1”.",
"special-characters-group-khmer": "ქჰმერული",
"special-characters-title-endash": "საშუალო ტირე",
"special-characters-title-emdash": "გრძელი ტირე",
- "special-characters-title-minus": "მინუსის ნიშანი"
+ "special-characters-title-minus": "მინუსის ნიშანი",
+ "passwordpolicies-policyflag-forcechange": "მიშულაშ ბორჯის ითირას ოკო"
}
"log-action-filter-protect-protect": "保護",
"log-action-filter-protect-unprotect": "取消保護",
"log-action-filter-upload-overwrite": "再上載",
- "authmanager-authplugin-setpass-failed-title": "改唔到密碼",
"authmanager-email-label": "電郵",
"authmanager-email-help": "電郵地址",
"authmanager-realname-label": "真名",
"mediastatistics-header-total": "ⵎⴰⵕⵕⴰ ⵉⴼⵓⵍⵢⴰ",
"randomrootpage": "ⵜⴰⵙⵏⴰ ⴰⵥⵓⵔ ⵜⴰⵡⴳⴰⵛⵓⵔⵜ",
"log-action-filter-all": "ⵎⴰⵕⵕⴰ",
- "authmanager-authplugin-setpass-denied": "ⵎⴰⵕⵕⴰ",
"authmanager-email-label": "ⵉⵎⴰⵢⵍ",
"authmanager-realname-label": "ⵉⵙⵎ ⴰⵎⴷⴷⴰⵜ",
"authmanager-realname-help": "ⵉⵙⵎ ⴰⵎⴷⴷⴰⵜ ⵏ ⵓⵏⵙⵙⵔⵎⵙ",
"Angrydog001",
"GoForceX",
"Ff98sha",
- "VulpesVulpes825"
+ "VulpesVulpes825",
+ "佛壁灯"
]
},
"tog-underline": "链接下划线:",
"previewnote": "<strong>请记住这只是预览。</strong>您的更改尚未保存!",
"continue-editing": "前往编辑区",
"previewconflict": "该预览反映了上面文字编辑区中的文字在你保存后的显示状况。",
- "session_fail_preview": "对不起!由于会话数据丢失,我们无法处理您的编辑。\n\n您可能已经退出。<strong>请核实您是否仍在登录,并重试</strong>。如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
+ "session_fail_preview": "对不起!由于会话数据丢失,我们无法处理您的编辑。\n\n您可能已经退出登录。<strong>请核实您是否仍在登录状态,并重试操作。</strong>如果这仍然无效,请尝试[[Special:UserLogout|注销]]后重新登录,并检查您的浏览器是否允许来自本网站的cookie。",
"session_fail_preview_html": "对不起!由于会话数据丢失,我们无法处理您的编辑,\n\n<em>因为{{SITENAME}}已启用原始HTML,为了预防JavaScript攻击,预览被隐藏。</em>\n\n<strong>如果该编辑尝试合法,请重试。</strong>如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
"token_suffix_mismatch": "<strong>由于您客户端中的编辑令牌毁损了一些标点符号字符,您的编辑已经被拒绝。</strong>\n此次编辑被拒绝以防止页面文本损坏。\n这种情况通常在您使用含有故障的网页式匿名代理服务的时候出现。",
"edit_form_incomplete": "<strong>编辑表格的某些部分没有到达服务器,请检查您的编辑是否完整并重试。</strong>",
"logentry-rights-autopromote": "$1被自动地{{GENDER:$2|提升}}自$4至$5",
"logentry-upload-upload": "$1{{GENDER:$2|上传}}$3",
"logentry-upload-overwrite": "$1{{GENDER:$2|上传}}$3的新版本",
- "logentry-upload-revert": "$1{{GENDER:$2|上传}}$3",
+ "logentry-upload-revert": "$1 {{GENDER:$2|已恢复}} $3 至旧版本",
"log-name-managetags": "标签管理日志",
"log-description-managetags": "此页面列出有关[[Special:Tags|标签]]的管理任务。该日志仅包含管理员手工进行的操作;wiki软件可能创建或删除标签而未在此日志中留下记录。",
"logentry-managetags-create": "$1{{GENDER:$2|创建了}}标签“$4”",
"log-action-filter-suppress-reblock": "通过再封禁的用户屏蔽",
"log-action-filter-upload-upload": "新上传",
"log-action-filter-upload-overwrite": "重新上传",
+ "log-action-filter-upload-revert": "恢复",
"authmanager-authn-not-in-progress": "身份验证尚未进行,或会话数据丢失。请从头重新开始。",
"authmanager-authn-no-primary": "提供的凭据不能被认证。",
"authmanager-authn-no-local-user": "提供的证书没有与该wiki上的任何用户相关联。",
"authmanager-create-no-primary": "提供的凭据不能用于账户创建。",
"authmanager-link-no-primary": "提供的证书不能用于账户链接。",
"authmanager-link-not-in-progress": "账户链接尚未进行,或会话数据丢失。请从头重新开始。",
- "authmanager-authplugin-setpass-failed-title": "密码更改失败",
- "authmanager-authplugin-setpass-failed-message": "身份验证插件拒绝了密码更改。",
- "authmanager-authplugin-create-fail": "身份验证插件拒绝了账户创建。",
- "authmanager-authplugin-setpass-denied": "身份验证插件不允许更改密码。",
- "authmanager-authplugin-setpass-bad-domain": "无效域。",
"authmanager-autocreate-noperm": "不允许自动账户创建。",
"authmanager-autocreate-exception": "由于之前的错误,自动账户创建已临时停用。",
"authmanager-userdoesnotexist": "用户帐户“$1”尚未注册。",
"passwordpolicies-policy-maximalpasswordlength": "密码长度必须少于$1个{{PLURAL:$1|字符}}",
"passwordpolicies-policy-passwordcannotbepopular": "密码不能{{PLURAL:$1|是最常见的密码|在$1个最常见密码的列表中}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "密码不能在100000个最常用的密码列表中。",
+ "passwordpolicies-policyflag-forcechange": "必须在登录时更改",
"easydeflate-invaliddeflate": "提供的内容未被适当缩小",
"unprotected-js": "基于安全原因,JavaScript不能在未保护页面中载入。请在 MediaWiki : 命名空间或者用户子页面中添加JavaScript。"
}
"Kanashimi",
"Hello903hello",
"Luuva",
- "Davidzdh"
+ "Davidzdh",
+ "WQL"
]
},
"tog-underline": "底線標示連結:",
"december-date": "12月$1日",
"period-am": "AM",
"period-pm": "PM",
- "pagecategories": "{{PLURAL:$1|分類|$1 個分類}}",
+ "pagecategories": "{{PLURAL:$1|分類}}",
"category_header": "「$1」分類的頁面",
"subcategories": "子分類",
"category-media-header": "「$1」分類的媒體",
"navigation-heading": "導覽選單",
"errorpagetitle": "錯誤",
"returnto": "返回「$1」頁面",
- "tagline": "出自 {{SITENAME}}",
+ "tagline": "出自{{SITENAME}}",
"help": "說明",
"help-mediawiki": "有關 MediaWiki 的說明",
"search": "搜尋",
"logentry-rights-autopromote": "$1 已自動{{GENDER:$2|提升}}從 $4 成為 $5",
"logentry-upload-upload": "$1 {{GENDER:$2|已上傳}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|上傳了}}新版本的 $3",
- "logentry-upload-revert": "$1 {{GENDER:$2|已上傳}} $3",
+ "logentry-upload-revert": "$1{{GENDER:$2|已還原}}$3至舊版本",
"log-name-managetags": "標籤管理日誌",
"log-description-managetags": "此頁面列出與[[Special:Tags|標籤]]相關的管理工作項目。 在日誌中僅包含由管理員手動所做的操作;被 Wiki 軟體所建立或刪除的標籤項目,不會記錄在此日誌中",
"logentry-managetags-create": "$1 {{GENDER:$2|已建立}}標籤 \"$4\"",
"log-action-filter-suppress-reblock": "由重新封鎖禁止顯示使用者",
"log-action-filter-upload-upload": "新上傳",
"log-action-filter-upload-overwrite": "重新上傳",
+ "log-action-filter-upload-revert": "還原",
"authmanager-authn-not-in-progress": "認證尚未進行或連線階段資料已遺失,請重頭再開始。",
"authmanager-authn-no-primary": "提供的憑證無法用來認証。",
"authmanager-authn-no-local-user": "提供的憑證沒有與任何在此 wiki 上的使用者相關聯。",
"authmanager-create-no-primary": "提供的憑證不能用於帳號建立。",
"authmanager-link-no-primary": "提供的憑證無使用在帳號連結。",
"authmanager-link-not-in-progress": "帳號連結尚未進行或連線階段資料已遺失,請重頭再開始。",
- "authmanager-authplugin-setpass-failed-title": "密碼變更失敗",
- "authmanager-authplugin-setpass-failed-message": "認証外掛已拒絕密碼變更。",
- "authmanager-authplugin-create-fail": "認証外掛已拒絕帳號建立。",
- "authmanager-authplugin-setpass-denied": "驗證外掛程式不允許變更密碼。",
- "authmanager-authplugin-setpass-bad-domain": "無效網域。",
"authmanager-autocreate-noperm": "不允許自動帳號建立。",
"authmanager-autocreate-exception": "自動帳號建立因發生錯誤臨時關閉。",
"authmanager-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。",
"passwordpolicies-policy-maximalpasswordlength": "密碼必須小於 $1 個{{PLURAL:$1|字元|字元}}長度",
"passwordpolicies-policy-passwordcannotbepopular": "密碼不可以是{{PLURAL:$1|常用密碼內容|在清單中的編號 $1 常用密碼}}",
"passwordpolicies-policy-passwordnotinlargeblacklist": "不能採用列在 100000 個最常用到密碼清單當中的密碼。",
+ "passwordpolicies-policyflag-forcechange": "必須在登入時更改",
"easydeflate-invaliddeflate": "提供的內容未被正常的壓縮",
"unprotected-js": "基於安全因素,JavaScript 不能從未保護的頁面來載入。建立 JavaScript 請僅在 MediaWiki 的:命名空間或使用者子頁面"
}
"Quest for Truth",
"Wxyveronica",
"和平至上",
- "A2093064"
+ "A2093064",
+ "WQL"
]
},
"tog-watchlisthidebots": "隱藏監視清單中機械人的編輯",
"namespaces": "命名空間",
"variants": "變體",
"navigation-heading": "導覽菜單",
- "tagline": "å¾\9e {{SITENAME}}",
+ "tagline": "å\87ºè\87ª{{SITENAME}}",
"help": "說明",
"search": "搜尋",
"searchbutton": "搜尋",
$settingsFile = "$IP/LocalSettings.php";
}
if ( isset( $this->mOptions['wiki'] ) ) {
- $bits = explode( '-', $this->mOptions['wiki'] );
+ $bits = explode( '-', $this->mOptions['wiki'], 2 );
if ( count( $bits ) == 1 ) {
$bits[] = '';
}
],
__METHOD__,
[ 'ORDER BY' => 'rev_timestamp DESC', 'LIMIT' => 1 ],
- [ 'revision' => [ 'INNER JOIN', 'rev_page=page_id' ] ]
+ [ 'revision' => [ 'JOIN', 'rev_page=page_id' ] ]
);
return $id;
'rc_type' => RC_LOG,
] );
$it->addJoinConditions( [
- 'page' => [ 'INNER JOIN', 'rc_cur_id = page_id' ],
+ 'page' => [ 'JOIN', 'rc_cur_id = page_id' ],
] );
$this->addIndex( $it );
return $it;
global $wgHiddenPrefs, $wgDefaultUserOptions;
$dbw = $this->getDB( DB_MASTER );
- $didWork = false;
$hidden = $this->hasOption( 'hidden' );
$unknown = $this->hasOption( 'unknown' );
$bogus = $this->hasOption( 'bogus' );
$this->fatalError( "Unable to read file, exiting" );
}
- $dbw = $this->getDB( DB_MASTER );
-
# Handle each entry
for ( $linenum = 1; !feof( $file ); $linenum++ ) {
$line = trim( fgets( $file ) );
hideredirects
hiderevision
hideuser
-hidpi
highlimit
highmax
highuse
$joinConds = [];
if ( $mtime1 || $mtime2 ) {
$joinTables[] = 'page';
- $joinConds['page'] = [ 'INNER JOIN',
+ $joinConds['page'] = [ 'JOIN',
[ 'page_title = img_name', 'page_namespace' => NS_FILE ] ];
$joinTables[] = 'logging';
$on = [ 'log_page = page_id', 'log_type' => [ 'upload', 'move', 'delete' ] ];
if ( $mtime2 ) {
$on[] = "log_timestamp < {$dbr->addQuotes($mtime2)}";
}
- $joinConds['logging'] = [ 'INNER JOIN', $on ];
+ $joinConds['logging'] = [ 'JOIN', $on ];
}
do {
$files = [];
while ( ( $file = readdir( $dhl ) ) !== false ) {
if ( is_file( $dir . '/' . $file ) ) {
- list( /* $name */, $ext ) = $this->splitFilename( $dir . '/' . $file );
+ $ext = pathinfo( $file, PATHINFO_EXTENSION );
if ( array_search( strtolower( $ext ), $exts ) !== false ) {
$files[] = $dir . '/' . $file;
}
}
}
- /**
- * Split a filename into filename and extension
- *
- * @param string $filename
- * @return array
- */
- private function splitFilename( $filename ) {
- $parts = explode( '.', $filename );
- $ext = $parts[count( $parts ) - 1];
- unset( $parts[count( $parts ) - 1] );
- $fname = implode( '.', $parts );
-
- return [ $fname, $ext ];
- }
-
/**
* Find an auxilliary file with the given extension, matching
* the give base file path. $maxStrip determines how many extensions
/** @var LoadBalancer */
protected $lb;
- // @todo Unused?
- private $stubText = false; // include rev_text_id instead of text; for 2-pass dump
-
/**
* @param array|null $args For backward compatibility
*/
switch ( $opt ) {
case 'plugin':
- $val = explode( ':', $param );
+ $val = explode( ':', $param, 2 );
if ( count( $val ) === 1 ) {
$this->loadPlugin( $val[0], '' );
} elseif ( count( $val ) === 2 ) {
$this->loadPlugin( $val[0], $val[1] );
- } else {
- $this->fatalError( 'Invalid plugin parameter' );
- return;
}
break;
$sink = new DumpOutput();
}
- $split = explode( ':', $param );
+ $split = explode( ':', $param, 2 );
$key = $split[0];
if ( !isset( $this->filterTypes[$key] ) ) {
$filter = new $type( $sink );
} elseif ( count( $split ) === 2 ) {
$filter = new $type( $sink, $split[1] );
- } else {
- $this->fatalError( 'Invalid filter parameter' );
}
// references are lame in php...
$complainedAboutUsers = [];
$primaryKey = [ 'ls_value', 'ls_log_id' ];
- $pkFilter = array_flip( $primaryKey );
$this->output( "Beginning migration of log_search\n" );
wfWaitForSlaves();
};
</script>
<script>
- // Mock startup.js
+ // Mock ResourceLoaderStartUpModule substitutions
window.$VARS = {
- baseModules: []
+ baseModules: [],
+ maxQueryLength: 2000
};
+ // Mock startup.js
window.RLQ = [];
</script>
<script src="modules/src/startup/mediawiki.js"></script>
$extdir = $this->getOption( 'extensions-dir' );
# Allow multiple directories to be passed with ":" as delimiter
$extdirs = explode( ':', $extdir );
- $entries = [];
foreach ( $extdirs as $extdir ) {
$entries = scandir( $extdir );
foreach ( $entries as $extname ) {
fwrite( STDERR, "\n" );
$s =
- "<" . "?php\n" .
+ "<?php\n" .
"## This file is generated by mergeMessageFileList.php. Do not edit it directly.\n\n" .
"if ( defined( 'MW_NO_EXTENSION_MESSAGES' ) ) return;\n\n" .
'$wgExtensionMessagesFiles = ' . var_export( $wgExtensionMessagesFiles, true ) . ";\n\n" .
$host = $this->getOption( 'host' );
$serverCount = $lb->getServerCount();
for ( $index = 0; $index < $serverCount; ++$index ) {
- $serverInfo = $lb->getServerInfo( $index );
-
if ( $lb->getServerName( $index ) === $host ) {
break;
}
public function execute() {
$this->checkOrphans( $this->hasOption( 'fix' ) );
$this->checkSeparation( $this->hasOption( 'fix' ) );
- # Does not work yet, do not use
- # $this->checkWidows( $this->hasOption( 'fix' ) );
}
/**
if ( $extraTable ) {
$tbls = array_merge( $tbls, $extraTable );
}
- $db->lockTables( [], $tbls, __METHOD__, false );
+ $db->lockTables( [], $tbls, __METHOD__ );
}
/**
}
}
- /**
- * @param bool $fix
- * @todo DON'T USE THIS YET! It will remove entries which have children,
- * but which aren't properly attached (eg if page_latest is bogus
- * but valid revisions do exist)
- */
- private function checkWidows( $fix ) {
- $dbw = $this->getDB( DB_MASTER );
- $page = $dbw->tableName( 'page' );
- $revision = $dbw->tableName( 'revision' );
-
- if ( $fix ) {
- $this->lockTables( $dbw );
- }
-
- $this->output( "\nChecking for childless page table entries... "
- . "(this may take a while on a large wiki)\n" );
- $result = $dbw->query( "
- SELECT *
- FROM $page LEFT OUTER JOIN $revision ON page_latest=rev_id
- WHERE rev_id IS NULL
- " );
- $widows = $result->numRows();
- if ( $widows > 0 ) {
- $this->output( "$widows childless pages...\n" );
- $this->output( sprintf( "%10s %11s %2s %s\n", 'page_id', 'page_latest', 'ns', 'page_title' ) );
- foreach ( $result as $row ) {
- printf( "%10d %11d %2d %s\n",
- $row->page_id,
- $row->page_latest,
- $row->page_namespace,
- $row->page_title );
- if ( $fix ) {
- $dbw->delete( 'page', [ 'page_id' => $row->page_id ] );
- }
- }
- if ( !$fix ) {
- $this->output( "Run again with --fix to remove these entries automatically.\n" );
- }
- } else {
- $this->output( "No childless pages! Yay!\n" );
- }
-
- if ( $fix ) {
- $dbw->unlockTables( __METHOD__ );
- }
- }
-
/**
* Check for pages where page_latest is wrong
* @param bool $fix Whether to fix broken entries
$title = Title::newFromText( $titleArg );
$pageExists = $title && $title->exists();
- $text = '';
$code = 0;
if ( $pageExists ) {
$text = "{$title} exists.";
}
public function doDBUpdates() {
- $force = $this->getOption( 'force' );
-
$db = $this->getDB( DB_MASTER );
$this->output( "Updating *_from_namespace fields in links tables.\n" );
} else { // revision
$selectTables = [ 'revision', 'page' ];
$fields = [ 'page_title', 'page_namespace' ];
- $join_conds = [ 'page' => [ 'INNER JOIN', 'rev_page=page_id' ] ];
+ $join_conds = [ 'page' => [ 'JOIN', 'rev_page=page_id' ] ];
$where = $ns === 'all' ? [] : [ 'page_namespace' => $ns ];
$page_id_column = 'rev_page';
$rev_id_column = 'rev_id';
],
[
'el_id' => $row->el_id,
- ], __METHOD__, [ 'IGNORE' ]
+ ], __METHOD__
);
}
wfWaitForSlaves();
$this->fatalError( "Invalid username" );
}
- // @todo FIXME: This is reset 7 lines down.
- $restrictions = [ 'edit' => $protection, 'move' => $protection ];
-
$t = Title::newFromText( $this->getArg() );
if ( !$t ) {
$this->fatalError( "Invalid title" );
global $wgHTCPRouting;
if ( $this->hasOption( 'htcp-dest' ) ) {
- $parts = explode( ':', $this->getOption( 'htcp-dest' ) );
+ $parts = explode( ':', $this->getOption( 'htcp-dest' ), 2 );
if ( count( $parts ) < 2 ) {
// Add default htcp port
$parts[] = '4827';
global $wgHTCPRouting;
if ( $this->hasOption( 'htcp-dest' ) ) {
- $parts = explode( ':', $this->getOption( 'htcp-dest' ) );
+ $parts = explode( ':', $this->getOption( 'htcp-dest' ), 2 );
if ( count( $parts ) < 2 ) {
// Add default htcp port
$parts[] = '4827';
__METHOD__,
[ 'ORDER BY' => 'rev_timestamp', 'LIMIT' => $bSize ],
[
- 'page' => [ 'INNER JOIN', 'rev_page=page_id' ],
+ 'page' => [ 'JOIN', 'rev_page=page_id' ],
]
);
[ 'ug_group' => $botgroups ],
__METHOD__,
[ 'DISTINCT' ],
- [ 'user_group' => [ 'JOIN', 'user_id = ug_user' ] ] + $userQuery['joins']
+ [ 'user_groups' => [ 'JOIN', 'user_id = ug_user' ] ] + $userQuery['joins']
);
$botusers = [];
[ 'ug_group' => $autopatrolgroups ],
__METHOD__,
[ 'DISTINCT' ],
- [ 'user_group' => [ 'JOIN', 'user_id = ug_user' ] ] + $userQuery['joins']
+ [ 'user_groups' => [ 'JOIN', 'user_id = ug_user' ] ] + $userQuery['joins']
);
foreach ( $res as $obj ) {
class ResetUserEmail extends Maintenance {
public function __construct() {
$this->addDescription( "Resets a user's email" );
- $this->addArg( 'user', 'Username or user ID, if starts with #', true );
+ $this->addArg( 'user', 'Username or user ID, if starts with #' );
$this->addArg( 'email', 'Email to assign' );
- $this->addOption( 'no-reset-password', 'Don\'t reset the user\'s password', false, false );
+ $this->addOption( 'no-reset-password', 'Don\'t reset the user\'s password' );
parent::__construct();
}
'src' => $fsFile->getPath(), 'dst' => $dPath, 'overwrite' => 1 ];
} elseif ( $sExists === false ) { // does not exist in source
$ops[] = [ 'op' => 'delete', 'src' => $dPath, 'ignoreMissingSource' => 1 ];
- } else { // error
+ } else {
$this->error( "Unable to sync '$dPath': could not stat file." );
$status->fatal( 'backend-fail-internal', $src->getName() );
wfWaitForSlaves();
}
$count = 0;
- $batchCount = 0;
$batchConds = [];
do {
$this->output( "Selecting next " . self::BATCH_SIZE . " rows..." );
foreach ( $res as $row ) {
$oldRestrictions = [];
foreach ( explode( ':', trim( $row->page_restrictions ) ) as $restrict ) {
- $temp = explode( '=', trim( $restrict ) );
+ $temp = explode( '=', trim( $restrict ), 2 );
// Make sure we are not settings restrictions to ""
if ( count( $temp ) == 1 && $temp[0] ) {
// old old format should be treated as edit/move restriction
$this->doSpecialPageCacheUpdates( $dbw );
foreach ( QueryPage::getPages() as $page ) {
- list( $class, $special ) = $page;
+ list( , $special ) = $page;
$limit = $page[2] ?? null;
# --list : just show the name of pages
class ValidateRegistrationFile extends Maintenance {
public function __construct() {
parent::__construct();
- $this->addArg( 'path', 'Path to extension.json/skin.json file.', true );
+ $this->addArg(
+ 'path',
+ 'Path or glob pattern to extension.json/skin.json file.',
+ true
+ );
}
public function execute() {
$validator = new ExtensionJsonValidator( function ( $msg ) {
$this->fatalError( $msg );
} );
$validator->checkDependencies();
- $path = $this->getArg( 0 );
- try {
- $validator->validate( $path );
- $this->output( "$path validates against the schema!\n" );
- } catch ( ExtensionJsonValidationError $e ) {
- $this->fatalError( $e->getMessage() );
+ $paths = glob( $this->getArg( 0 ) );
+ foreach ( $paths as $path ) {
+ try {
+ $validator->validate( $path );
+ $this->output( "$path validates against the schema!\n" );
+ } catch ( ExtensionJsonValidationError $e ) {
+ $this->fatalError( $e->getMessage() );
+ }
}
}
}
'scripts' => 'resources/src/jquery/jquery.getAttrs.js',
'targets' => [ 'desktop', 'mobile' ],
],
- 'jquery.hidpi' => [
- 'deprecated' => 'Use of the srcset polyfill is deprecated since MediaWiki 1.32.0',
- 'scripts' => 'resources/src/jquery/jquery.hidpi.js',
- 'targets' => [ 'desktop', 'mobile' ],
- ],
'jquery.highlightText' => [
'scripts' => 'resources/src/jquery/jquery.highlightText.js',
'dependencies' => [
'messages' => [ 'collapsible-expand', 'collapsible-collapse' ],
'targets' => [ 'desktop', 'mobile' ],
],
- 'jquery.mockjax' => [
- 'scripts' => 'resources/lib/jquery.mockjax.js',
- ],
'jquery.mw-jump' => [
'scripts' => 'resources/src/jquery/jquery.mw-jump.js',
'targets' => [ 'desktop', 'mobile' ],
'scripts' => 'resources/lib/jquery.ba-throttle-debounce.js',
'targets' => [ 'desktop', 'mobile' ],
],
- 'jquery.xmldom' => [
- 'scripts' => 'resources/lib/jquery.xmldom.js',
- ],
/* jQuery Tipsy */
'group' => 'jquery.ui',
'targets' => [ 'desktop', 'mobile' ],
],
- // Effects
+
'jquery.effects.core' => [
'deprecated' => true,
'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect.js',
'fy' => 'resources/lib/moment/locale/fy.js',
'gd' => 'resources/lib/moment/locale/gd.js',
'gl' => 'resources/lib/moment/locale/gl.js',
+ 'gom' => 'resources/lib/moment/locale/gom-latn.js',
'gom-latn' => 'resources/lib/moment/locale/gom-latn.js',
'gu' => 'resources/lib/moment/locale/gu.js',
'he' => 'resources/lib/moment/locale/he.js',
],
'dependencies' => [
'mediawiki.language',
+ 'mediawiki.RegExp',
],
'targets' => [ 'desktop', 'mobile' ],
],
],
],
'mediawiki.diff.styles' => [
- // FIXME: Remove class and lessMessages
- // when I6aad563e48f41c783df8b176a4f437e60a1255cc has
- // been in production for 1 week.
- 'class' => ResourceLoaderLessVarFileModule::class,
'styles' => [
- // Remove resources/src/mediawiki.interface.helpers.styles.less
- // when I6aad563e48f41c783df8b176a4f437e60a1255cc has
- // been in production for 1 week.
- 'resources/src/mediawiki.interface.helpers.styles.less',
'resources/src/mediawiki.diff.styles/diff.css',
'resources/src/mediawiki.diff.styles/print.css' => [
'media' => 'print'
],
],
- 'lessMessages' => [
- 'parentheses-start',
- 'parentheses-end',
- 'pipe-separator'
- ],
'targets' => [ 'desktop', 'mobile' ],
],
'mediawiki.feedback' => [
],
'mediawiki.cldr' => [
- 'scripts' => 'resources/src/mediawiki.language/mediawiki.cldr.js',
+ 'scripts' => 'resources/src/mediawiki.cldr/index.js',
'dependencies' => [
'mediawiki.libs.pluralruleparser',
],
'targets' => [ 'desktop', 'mobile' ],
],
'mediawiki.special.changeslist' => [
- // FIXME: Remove class and lessMessages
- // when I6aad563e48f41c783df8b176a4f437e60a1255cc has
- // been in production for 1 week.
- 'class' => ResourceLoaderLessVarFileModule::class,
- 'lessMessages' => [
- 'parentheses-start',
- 'parentheses-end',
- 'pipe-separator'
- ],
'styles' => [
- // FIXME: Remove this line when I6aad563e48f41c783df8b176a4f437e60a1255cc has
- // been in production for 1 week.
- 'resources/src/mediawiki.interface.helpers.styles.less',
'resources/src/mediawiki.special.changeslist.less',
],
'targets' => [ 'desktop', 'mobile' ],
'period-pm',
],
'dependencies' => [
+ 'mediawiki.RegExp',
'oojs-ui-core',
'oojs-ui.styles.icons-moderation',
'oojs-ui.styles.icons-movement',
+++ /dev/null
-/*!
- * MockJax - jQuery Plugin to Mock Ajax requests
- *
- * Version: 1.4.0
- * Released: 2011-02-04
- * Source: http://github.com/appendto/jquery-mockjax
- * Docs: http://enterprisejquery.com/2010/07/mock-your-ajax-requests-with-mockjax-for-rapid-development
- * Plugin: mockjax
- * Author: Jonathan Sharp (http://jdsharp.com)
- * License: MIT,GPL
- *
- * Copyright (c) 2010 appendTo LLC.
- * Dual licensed under the MIT or GPL licenses.
- * http://appendto.com/open-source-licenses
- */
-(function($) {
- var _ajax = $.ajax,
- mockHandlers = [];
-
- function parseXML(xml) {
- if ( window['DOMParser'] == undefined && window.ActiveXObject ) {
- DOMParser = function() { };
- DOMParser.prototype.parseFromString = function( xmlString ) {
- var doc = new ActiveXObject('Microsoft.XMLDOM');
- doc.async = 'false';
- doc.loadXML( xmlString );
- return doc;
- };
- }
-
- try {
- var xmlDoc = ( new DOMParser() ).parseFromString( xml, 'text/xml' );
- if ( $.isXMLDoc( xmlDoc ) ) {
- var err = $('parsererror', xmlDoc);
- if ( err.length == 1 ) {
- throw('Error: ' + $(xmlDoc).text() );
- }
- } else {
- throw('Unable to parse XML');
- }
- } catch( e ) {
- var msg = ( e.name == undefined ? e : e.name + ': ' + e.message );
- $(document).trigger('xmlParseError', [ msg ]);
- return undefined;
- }
- return xmlDoc;
- }
-
- $.extend({
- ajax: function(origSettings) {
- var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings),
- mock = false;
- // Iterate over our mock handlers (in registration order) until we find
- // one that is willing to intercept the request
- $.each(mockHandlers, function(k, v) {
- if ( !mockHandlers[k] ) {
- return;
- }
- var m = null;
- // If the mock was registered with a function, let the function decide if we
- // want to mock this request
- if ( $.isFunction(mockHandlers[k]) ) {
- m = mockHandlers[k](s);
- } else {
- m = mockHandlers[k];
- // Inspect the URL of the request and check if the mock handler's url
- // matches the url for this ajax request
- if ( $.isFunction(m.url.test) ) {
- // The user provided a regex for the url, test it
- if ( !m.url.test( s.url ) ) {
- m = null;
- }
- } else {
- // Look for a simple wildcard '*' or a direct URL match
- var star = m.url.indexOf('*');
- if ( ( m.url != '*' && m.url != s.url && star == -1 ) ||
- ( star > -1 && m.url.substr(0, star) != s.url.substr(0, star) ) ) {
- // The url we tested did not match the wildcard *
- m = null;
- }
- }
- if ( m ) {
- // Inspect the data submitted in the request (either POST body or GET query string)
- if ( m.data && s.data ) {
- var identical = false;
- // Deep inspect the identity of the objects
- (function ident(mock, live) {
- // Test for situations where the data is a querystring (not an object)
- if (typeof live === 'string') {
- // Querystring may be a regex
- identical = $.isFunction( mock.test ) ? mock.test(live) : mock == live;
- return identical;
- }
- $.each(mock, function(k, v) {
- if ( live[k] === undefined ) {
- identical = false;
- return false;
- } else {
- identical = true;
- if ( typeof live[k] == 'object' ) {
- return ident(mock[k], live[k]);
- } else {
- if ( $.isFunction( mock[k].test ) ) {
- identical = mock[k].test(live[k]);
- } else {
- identical = ( mock[k] == live[k] );
- }
- return identical;
- }
- }
- });
- })(m.data, s.data);
- // They're not identical, do not mock this request
- if ( identical == false ) {
- m = null;
- }
- }
- // Inspect the request type
- if ( m && m.type && m.type != s.type ) {
- // The request type doesn't match (GET vs. POST)
- m = null;
- }
- }
- }
- if ( m ) {
- mock = true;
-
- // Handle console logging
- var c = $.extend({}, $.mockjaxSettings, m);
- if ( c.log && $.isFunction(c.log) ) {
- c.log('MOCK ' + s.type.toUpperCase() + ': ' + s.url, $.extend({}, s));
- }
-
- var jsre = /=\?(&|$)/, jsc = (new Date()).getTime();
-
- // Handle JSONP Parameter Callbacks, we need to replicate some of the jQuery core here
- // because there isn't an easy hook for the cross domain script tag of jsonp
- if ( s.dataType === "jsonp" ) {
- if ( s.type.toUpperCase() === "GET" ) {
- if ( !jsre.test( s.url ) ) {
- s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
- }
- } else if ( !s.data || !jsre.test(s.data) ) {
- s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
- }
- s.dataType = "json";
- }
-
- // Build temporary JSONP function
- if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
- jsonp = s.jsonpCallback || ("jsonp" + jsc++);
-
- // Replace the =? sequence both in the query string and the data
- if ( s.data ) {
- s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
- }
-
- s.url = s.url.replace(jsre, "=" + jsonp + "$1");
-
- // We need to make sure
- // that a JSONP style response is executed properly
- s.dataType = "script";
-
- // Handle JSONP-style loading
- window[ jsonp ] = window[ jsonp ] || function( tmp ) {
- data = tmp;
- success();
- complete();
- // Garbage collect
- window[ jsonp ] = undefined;
-
- try {
- delete window[ jsonp ];
- } catch(e) {}
-
- if ( head ) {
- head.removeChild( script );
- }
- };
- }
-
- var rurl = /^(\w+:)?\/\/([^\/?#]+)/,
- parts = rurl.exec( s.url ),
- remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
-
- // Test if we are going to create a script tag (if so, intercept & mock)
- if ( s.dataType === "script" && s.type.toUpperCase() === "GET" && remote ) {
- // Synthesize the mock request for adding a script tag
- var callbackContext = origSettings && origSettings.context || s;
-
- function success() {
- // If a local callback was specified, fire it and pass it the data
- if ( s.success ) {
- s.success.call( callbackContext, ( m.response ? m.response.toString() : m.responseText || ''), status, {} );
- }
-
- // Fire the global callback
- if ( s.global ) {
- trigger( "ajaxSuccess", [{}, s] );
- }
- }
-
- function complete() {
- // Process result
- if ( s.complete ) {
- s.complete.call( callbackContext, {} , status );
- }
-
- // The request was completed
- if ( s.global ) {
- trigger( "ajaxComplete", [{}, s] );
- }
-
- // Handle the global AJAX counter
- if ( s.global && ! --jQuery.active ) {
- jQuery.event.trigger( "ajaxStop" );
- }
- }
-
- function trigger(type, args) {
- (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);
- }
-
- if ( m.response && $.isFunction(m.response) ) {
- m.response(origSettings);
- } else {
- $.globalEval(m.responseText);
- }
- success();
- complete();
- return false;
- }
- mock = _ajax.call($, $.extend(true, {}, origSettings, {
- // Mock the XHR object
- xhr: function() {
- // Extend with our default mockjax settings
- m = $.extend({}, $.mockjaxSettings, m);
-
- if ( m.contentType ) {
- m.headers['content-type'] = m.contentType;
- }
-
- // Return our mock xhr object
- return {
- status: m.status,
- readyState: 1,
- open: function() { },
- send: function() {
- // This is a substitute for < 1.4 which lacks $.proxy
- var process = (function(that) {
- return function() {
- return (function() {
- // The request has returned
- this.status = m.status;
- this.readyState = 4;
-
- // We have an executable function, call it to give
- // the mock handler a chance to update it's data
- if ( $.isFunction(m.response) ) {
- m.response(origSettings);
- }
- // Copy over our mock to our xhr object before passing control back to
- // jQuery's onreadystatechange callback
- if ( s.dataType == 'json' && ( typeof m.responseText == 'object' ) ) {
- this.responseText = JSON.stringify(m.responseText);
- } else if ( s.dataType == 'xml' ) {
- if ( typeof m.responseXML == 'string' ) {
- this.responseXML = parseXML(m.responseXML);
- } else {
- this.responseXML = m.responseXML;
- }
- } else {
- this.responseText = m.responseText;
- }
- // jQuery < 1.4 doesn't have onreadystate change for xhr
- if ( $.isFunction(this.onreadystatechange) ) {
- this.onreadystatechange( m.isTimeout ? 'timeout' : undefined );
- }
- }).apply(that);
- };
- })(this);
-
- if ( m.proxy ) {
- // We're proxying this request and loading in an external file instead
- _ajax({
- global: false,
- url: m.proxy,
- type: m.proxyType,
- data: m.data,
- dataType: s.dataType,
- complete: function(xhr, txt) {
- m.responseXML = xhr.responseXML;
- m.responseText = xhr.responseText;
- this.responseTimer = setTimeout(process, m.responseTime || 0);
- }
- });
- } else {
- // type == 'POST' || 'GET' || 'DELETE'
- if ( s.async === false ) {
- // TODO: Blocking delay
- process();
- } else {
- this.responseTimer = setTimeout(process, m.responseTime || 50);
- }
- }
- },
- abort: function() {
- clearTimeout(this.responseTimer);
- },
- setRequestHeader: function() { },
- getResponseHeader: function(header) {
- // 'Last-modified', 'Etag', 'content-type' are all checked by jQuery
- if ( m.headers && m.headers[header] ) {
- // Return arbitrary headers
- return m.headers[header];
- } else if ( header.toLowerCase() == 'last-modified' ) {
- return m.lastModified || (new Date()).toString();
- } else if ( header.toLowerCase() == 'etag' ) {
- return m.etag || '';
- } else if ( header.toLowerCase() == 'content-type' ) {
- return m.contentType || 'text/plain';
- }
- },
- getAllResponseHeaders: function() {
- var headers = '';
- $.each(m.headers, function(k, v) {
- headers += k + ': ' + v + "\n";
- });
- return headers;
- }
- };
- }
- }));
- return false;
- }
- });
- // We don't have a mock request, trigger a normal request
- if ( !mock ) {
- return _ajax.apply($, arguments);
- } else {
- return mock;
- }
- }
- });
-
- $.mockjaxSettings = {
- //url: null,
- //type: 'GET',
- log: function(msg) {
- window['console'] && window.console.log && window.console.log(msg);
- },
- status: 200,
- responseTime: 500,
- isTimeout: false,
- contentType: 'text/plain',
- response: '',
- responseText: '',
- responseXML: '',
- proxy: '',
- proxyType: 'GET',
-
- lastModified: null,
- etag: '',
- headers: {
- etag: 'IJF@H#@923uf8023hFO@I#H#',
- 'content-type' : 'text/plain'
- }
- };
-
- $.mockjax = function(settings) {
- var i = mockHandlers.length;
- mockHandlers[i] = settings;
- return i;
- };
- $.mockjaxClear = function(i) {
- if ( arguments.length == 1 ) {
- mockHandlers[i] = null;
- } else {
- mockHandlers = [];
- }
- };
-})(jQuery);
+++ /dev/null
-/*!
- * jQuery xmlDOM Plugin v1.0
- * http://outwestmedia.com/jquery-plugins/xmldom/
- *
- * Released: 2009-04-06
- * Version: 1.0
- *
- * Copyright (c) 2009 Jonathan Sharp, Out West Media LLC.
- * Dual licensed under the MIT and GPL licenses.
- * http://docs.jquery.com/License
- */
-(function($) {
- // IE DOMParser wrapper
- if ( window['DOMParser'] == undefined && window.ActiveXObject ) {
- DOMParser = function() { };
- DOMParser.prototype.parseFromString = function( xmlString ) {
- var doc = new ActiveXObject('Microsoft.XMLDOM');
- doc.async = 'false';
- doc.loadXML( xmlString );
- return doc;
- };
- }
-
- $.xmlDOM = function(xml, onErrorFn) {
- try {
- var xmlDoc = ( new DOMParser() ).parseFromString( xml, 'text/xml' );
- if ( $.isXMLDoc( xmlDoc ) ) {
- var err = $('parsererror', xmlDoc);
- if ( err.length == 1 ) {
- throw('Error: ' + $(xmlDoc).text() );
- }
- } else {
- throw('Unable to parse XML');
- }
- } catch( e ) {
- var msg = ( e.name == undefined ? e : e.name + ': ' + e.message );
- if ( $.isFunction( onErrorFn ) ) {
- onErrorFn( msg );
- } else {
- $(document).trigger('xmlParseError', [ msg ]);
- }
- return $([]);
- }
- return $( xmlDoc );
- };
-})(jQuery);
\ No newline at end of file
+++ /dev/null
-/**
- * Responsive images based on `srcset` and `window.devicePixelRatio` emulation where needed.
- *
- * Call `.hidpi()` on a document or part of a document to proces image srcsets within that section.
- *
- * `$.devicePixelRatio()` can be used as a substitute for `window.devicePixelRatio`.
- * It provides a familiar interface to retrieve the pixel ratio for browsers that don't
- * implement `window.devicePixelRatio` but do have a different way of getting it.
- *
- * @class jQuery.plugin.hidpi
- */
-( function () {
-
- /**
- * Get reported or approximate device pixel ratio.
- *
- * - 1.0 means 1 CSS pixel is 1 hardware pixel
- * - 2.0 means 1 CSS pixel is 2 hardware pixels
- * - etc.
- *
- * Uses `window.devicePixelRatio` if available, or CSS media queries on IE.
- *
- * @static
- * @inheritable
- * @return {number} Device pixel ratio
- */
- $.devicePixelRatio = function () {
- if ( window.devicePixelRatio !== undefined ) {
- // Most web browsers:
- // * WebKit/Blink (Safari, Chrome, Android browser, etc)
- // * Opera
- // * Firefox 18+
- // * Microsoft Edge (Windows 10)
- return window.devicePixelRatio;
- } else if ( window.msMatchMedia !== undefined ) {
- // Windows 8 desktops / tablets, probably Windows Phone 8
- //
- // IE 10/11 doesn't report pixel ratio directly, but we can get the
- // screen DPI and divide by 96. We'll bracket to [1, 1.5, 2.0] for
- // simplicity, but you may get different values depending on zoom
- // factor, size of screen and orientation in Metro IE.
- if ( window.msMatchMedia( '(min-resolution: 192dpi)' ).matches ) {
- return 2;
- } else if ( window.msMatchMedia( '(min-resolution: 144dpi)' ).matches ) {
- return 1.5;
- } else {
- return 1;
- }
- } else {
- // Legacy browsers...
- // Assume 1 if unknown.
- return 1;
- }
- };
-
- /**
- * Bracket a given device pixel ratio to one of [1, 1.5, 2].
- *
- * This is useful for grabbing images on the fly with sizes based on the display
- * density, without causing slowdown and extra thumbnail renderings on devices
- * that are slightly different from the most common sizes.
- *
- * The bracketed ratios match the default 'srcset' output on MediaWiki thumbnails,
- * so will be consistent with default renderings.
- *
- * @static
- * @inheritable
- * @param {number} baseRatio Base ratio
- * @return {number} Device pixel ratio
- */
- $.bracketDevicePixelRatio = function ( baseRatio ) {
- if ( baseRatio > 1.5 ) {
- return 2;
- } else if ( baseRatio > 1 ) {
- return 1.5;
- } else {
- return 1;
- }
- };
-
- /**
- * Get reported or approximate device pixel ratio, bracketed to [1, 1.5, 2].
- *
- * This is useful for grabbing images on the fly with sizes based on the display
- * density, without causing slowdown and extra thumbnail renderings on devices
- * that are slightly different from the most common sizes.
- *
- * The bracketed ratios match the default 'srcset' output on MediaWiki thumbnails,
- * so will be consistent with default renderings.
- *
- * - 1.0 means 1 CSS pixel is 1 hardware pixel
- * - 1.5 means 1 CSS pixel is 1.5 hardware pixels
- * - 2.0 means 1 CSS pixel is 2 hardware pixels
- *
- * @static
- * @inheritable
- * @return {number} Device pixel ratio
- */
- $.bracketedDevicePixelRatio = function () {
- return $.bracketDevicePixelRatio( $.devicePixelRatio() );
- };
-
- /**
- * Implement responsive images based on srcset attributes, if browser has no
- * native srcset support.
- *
- * @return {jQuery} This selection
- * @chainable
- */
- $.fn.hidpi = function () {
- var $target = this,
- // TODO add support for dpi media query checks on Firefox, IE
- devicePixelRatio = $.devicePixelRatio(),
- testImage = new Image();
-
- if ( devicePixelRatio > 1 && testImage.srcset === undefined ) {
- // No native srcset support.
- $target.find( 'img' ).each( function () {
- var $img = $( this ),
- srcset = $img.attr( 'srcset' ),
- match;
- if ( typeof srcset === 'string' && srcset !== '' ) {
- match = $.matchSrcSet( devicePixelRatio, srcset );
- if ( match !== null ) {
- $img.attr( 'src', match );
- }
- }
- } );
- }
-
- return $target;
- };
-
- /**
- * Match a srcset entry for the given device pixel ratio
- *
- * Exposed for testing.
- *
- * @private
- * @static
- * @param {number} devicePixelRatio
- * @param {string} srcset
- * @return {Mixed} null or the matching src string
- */
- $.matchSrcSet = function ( devicePixelRatio, srcset ) {
- var candidates,
- candidate,
- bits,
- src,
- i,
- ratioStr,
- ratio,
- selectedRatio = 1,
- selectedSrc = null;
- candidates = srcset.split( / *, */ );
- for ( i = 0; i < candidates.length; i++ ) {
- candidate = candidates[ i ];
- bits = candidate.split( / +/ );
- src = bits[ 0 ];
- if ( bits.length > 1 && bits[ 1 ].charAt( bits[ 1 ].length - 1 ) === 'x' ) {
- ratioStr = bits[ 1 ].slice( 0, -1 );
- ratio = parseFloat( ratioStr );
- if ( ratio <= devicePixelRatio && ratio > selectedRatio ) {
- selectedRatio = ratio;
- selectedSrc = src;
- }
- }
- }
- return selectedSrc;
- };
-
- /**
- * @class jQuery
- * @mixins jQuery.plugin.hidpi
- */
-
-}() );
}
if ( response.parse.modules ) {
mw.loader.load( response.parse.modules.concat(
- response.parse.modulescripts,
response.parse.modulestyles
) );
}
var deferred = $.Deferred();
// Allow calling with a single dependency as a string
- if ( typeof dependencies === 'string' ) {
+ if ( !Array.isArray( dependencies ) ) {
dependencies = [ dependencies ];
}
return deferred.reject( e ).promise();
}
- mw.loader.enqueue( dependencies, function () {
- deferred.resolve( mw.loader.require );
- }, deferred.reject );
+ mw.loader.enqueue(
+ dependencies,
+ function () { deferred.resolve( mw.loader.require ); },
+ deferred.reject
+ );
return deferred.promise();
};
+ /**
+ * Load a script by URL.
+ *
+ * Example:
+ *
+ * mw.loader.getScript(
+ * 'https://example.org/x-1.0.0.js'
+ * )
+ * .then( function () {
+ * // Script succeeded. You can use X now.
+ * }, function ( e ) {
+ * // Script failed. X is not avaiable
+ * mw.log.error( e.message ); // => "Failed to load script"
+ * } );
+ * } );
+ *
+ * @member mw.loader
+ * @param {string} url Script URL
+ * @return {jQuery.Promise} Resolved when the script is loaded
+ */
+ mw.loader.getScript = function ( url ) {
+ return $.ajax( url, { dataType: 'script', cache: true } )
+ .catch( function () {
+ throw new Error( 'Failed to load script' );
+ } );
+ };
+
// Alias $j to jQuery for backwards compatibility
// @deprecated since 1.23 Use $ or jQuery instead
mw.log.deprecate( window, '$j', $, 'Use $ or jQuery instead.' );
--- /dev/null
+( function () {
+ 'use strict';
+
+ /**
+ * Namespace for CLDR-related utility methods.
+ *
+ * @class
+ * @singleton
+ */
+ mw.cldr = {
+ /**
+ * Get the plural form index for the number.
+ *
+ * In case none of the rules passed, we return `pluralRules.length` -
+ * that means it is the "other" form.
+ *
+ * @param {number} number
+ * @param {Array} pluralRules
+ * @return {number} plural form index
+ */
+ getPluralForm: function ( number, pluralRules ) {
+ var i, pluralRuleParser = require( 'mediawiki.libs.pluralruleparser' );
+ for ( i = 0; i < pluralRules.length; i++ ) {
+ if ( pluralRuleParser( pluralRules[ i ], number ) ) {
+ break;
+ }
+ }
+ return i;
+ }
+ };
+
+}() );
+++ /dev/null
-( function () {
- 'use strict';
-
- /**
- * Namespace for CLDR-related utility methods.
- *
- * @class
- * @singleton
- */
- mw.cldr = {
- /**
- * Get the plural form index for the number.
- *
- * In case none of the rules passed, we return `pluralRules.length` -
- * that means it is the "other" form.
- *
- * @param {number} number
- * @param {Array} pluralRules
- * @return {number} plural form index
- */
- getPluralForm: function ( number, pluralRules ) {
- var i, pluralRuleParser = require( 'mediawiki.libs.pluralruleparser' );
- for ( i = 0; i < pluralRules.length; i++ ) {
- if ( pluralRuleParser( pluralRules[ i ], number ) ) {
- break;
- }
- }
- return i;
- }
- };
-
-}() );
padding-right: 1.875em + 0.5em;
> .oo-ui-buttonWidget {
- top: 50%;
- .transform( translateY( -50% ) );
+ top: 0.5em;
}
> .oo-ui-iconWidget {
- float: none;
- display: inline-block;
- margin: 0;
+ vertical-align: top;
}
> .oo-ui-labelElement-label {
float: none;
display: inline-block;
+ // Label doesn't wrap without `max-width`. First setting a pretty arbitrary percentage value.
+ max-width: 80%;
+ // Overwrite it with `calc` reduced by icon width and left margin combined.
+ max-width: calc( ~'100% - 1.42857143em - 0.25em' );
+ margin: 0 0 0 0.25em;
font-size: 1.2em;
- margin: 0;
font-weight: bold;
- vertical-align: middle;
+ line-height: 1.25;
+ vertical-align: top;
}
}
}
* Styling for Special:Watchlist and Special:RecentChanges
*/
+.client-js .mw-input-hidden {
+ display: none;
+}
+
+/* Make sure namespace label is aligned correctly on mobile when checkboxes are displayed */
+.mw-label.mw-namespace-label {
+ vertical-align: top;
+}
+
.mw-changeslist-line-watched .mw-title {
font-weight: bold;
}
*/
rc = {
/**
- * Handler to disable/enable the namespace selector checkboxes when the
+ * Handler to hide/show the namespace selector checkboxes when the
* special 'all' namespace is selected/unselected respectively.
*/
updateCheckboxes: function () {
var isAllNS = $select.val() === '';
// Iterates over checkboxes and propagate the selected option
- $checkboxes.prop( 'disabled', isAllNS );
+ $checkboxes.toggleClass( 'mw-input-hidden', isAllNS );
},
init: function () {
$select = $( '#namespace' );
- $checkboxes = $( '#nsassociated, #nsinvert' );
+ $checkboxes = $( '#nsassociated, #nsinvert' ).closest( '.mw-input-with-label' );
- // Bind to change event, and trigger once to set the initial state of the checkboxes.
- rc.updateCheckboxes();
+ // Bind to change event of the checkboxes.
+ // The initial state is already set in HTML.
$select.on( 'change', rc.updateCheckboxes );
}
};
.mw-passwordpolicies-table tr {
vertical-align: top;
}
+
+.passwordpolicies-policy-flags {
+ font-size: 90%;
+}
* {
// Reset font sizes, see T74727
- font: inherit;
+ font-size: inherit;
vertical-align: middle;
}
// This specifies styling for individual field validation error messages.
// Show them below the fields to prevent line break glitches, and leave
// some space between the field and the error message box.
- .mw-ui-vform-field .error {
- display: block;
- margin-top: 5px;
+ .mw-ui-vform-field {
+ .error,
+ .warning {
+ display: block;
+ margin-top: 5px;
+ }
}
}
* {
// reset font sizes (see T74727)
- font: inherit;
+ font-size: inherit;
vertical-align: middle;
}
// eslint-disable-next-line no-restricted-properties
v = v.normalize();
}
- re = new RegExp( '^\\s*' + v.replace( /([\\{}()|.?*+\-^$\[\]])/g, '\\$1' ), 'i' ); // eslint-disable-line no-useless-escape
+ re = new RegExp( '^\\s*' + mw.RegExp.escape( v ), 'i' );
for ( k in this.values ) {
k = +k;
if ( !isNaN( k ) && re.test( this.values[ k ] ) ) {
* @param {string[]} batch
*/
function batchRequest( batch ) {
- var reqBase, splits, maxQueryLength, b, bSource, bGroup,
+ var reqBase, splits, b, bSource, bGroup,
source, group, i, modules, sourceLoadScript,
currReqBase, currReqBaseLength, moduleMap, currReqModules, l,
lastDotIndex, prefix, suffix, bytesAdded;
lang: mw.config.get( 'wgUserLanguage' ),
debug: mw.config.get( 'debug' )
};
- maxQueryLength = mw.config.get( 'wgResourceLoaderMaxQueryLength', 2000 );
// Split module list by source and by group.
splits = Object.create( null );
modules[ i ].length + 3; // '%7C'.length == 3
// If the url would become too long, create a new one, but don't create empty requests
- if ( maxQueryLength > 0 && currReqModules.length && l + bytesAdded > maxQueryLength ) {
+ if ( currReqModules.length && l + bytesAdded > mw.loader.maxQueryLength ) {
// Dispatch what we've got...
doRequest();
// .. and start again.
moduleMap = Object.create( null );
currReqModules = [];
- mw.track( 'resourceloader.splitRequest', { maxQueryLength: maxQueryLength } );
+ mw.track( 'resourceloader.splitRequest', { maxQueryLength: mw.loader.maxQueryLength } );
}
if ( !moduleMap[ prefix ] ) {
moduleMap[ prefix ] = [];
*/
moduleRegistry: registry,
+ /**
+ * Exposed for testing and debugging only.
+ *
+ * @see #batchRequest
+ * @property
+ * @private
+ */
+ maxQueryLength: $VARS.maxQueryLength,
+
/**
* @inheritdoc #newStyleTag
* @method
return;
}
} catch ( e ) {
- mw.trackError( 'resourceloader.exception', {
- exception: e,
- source: 'store-localstorage-init'
- } );
+ // Perhaps localStorage was disabled by the user, or got corrupted.
+ // See point 3 and 4 below. (T195647)
}
// If we get here, one of four things happened:
global $wgDevelopmentWarnings;
global $wgSessionProviders, $wgSessionPbkdf2Iterations;
global $wgJobTypeConf;
- global $wgAuthManagerConfig, $wgAuth;
+ global $wgAuthManagerConfig;
// wfWarn should cause tests to fail
$wgDevelopmentWarnings = true;
],
'secondaryauth' => [],
];
- $wgAuth = new MediaWiki\Auth\AuthManagerAuthPlugin();
// T46192 Do not attempt to send a real e-mail
Hooks::clear( 'AlternateUserMailer' );
# tests/phpunit/includes/specialpage
'SpecialPageTestHelper' => "$testDir/phpunit/includes/specialpage/SpecialPageTestHelper.php",
'AbstractChangesListSpecialPageTestCase' => "$testDir/phpunit/includes/specialpage/AbstractChangesListSpecialPageTestCase.php",
+ 'FormSpecialPageTestCase' => "$testDir/phpunit/includes/specialpage/FormSpecialPageTestCase.php",
# tests/phpunit/includes/specials
'SpecialPageTestBase' => "$testDir/phpunit/includes/specials/SpecialPageTestBase.php",
* Wrapper around Hamcrest's assertThat, which marks the assertion
* for PHPUnit so the test is not marked as risky
*/
- public function assertThatHamcrest( /* ... */ ) {
- call_user_func_array( 'assertThat', func_get_args() );
+ public function assertThatHamcrest( ...$args ) {
+ assertThat( ...$args );
$this->addToAssertionCount( 1 );
}
}
<?php
-use Mediawiki\Logger\LoggerFactory;
-use Mediawiki\Logger\Spi;
-use Mediawiki\Logger\LogCapturingSpi;
+use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\Logger\Spi;
+use MediaWiki\Logger\LogCapturingSpi;
/**
* Replaces the logging SPI on each test run. This allows
* @param bool $expected
*/
public function testCanTalk( $index, $expected ) {
+ $this->hideDeprecated( 'MWNamespace::canTalk' );
$actual = MWNamespace::canTalk( $index );
$this->assertSame( $actual, $expected, "NS $index" );
}
// @todo Make sure to test the following in addParserOutputMetadata() as well when we add tests
// for them:
// * addModules()
- // * addModuleScripts()
// * addModuleStyles()
// * addJsConfigVars()
// * enableOOUI()
[ 'rev_id' => $rev->getId(), 'rev_text_id > 0' ],
[ [ 1 ] ],
[],
- [ 'text' => [ 'INNER JOIN', [ 'rev_text_id = old_id' ] ] ]
+ [ 'text' => [ 'JOIN', [ 'rev_text_id = old_id' ] ] ]
);
parent::assertRevisionExistsInDatabase( $rev );
[ 'rev_id' => $rev->getId(), 'rev_text_id > 0' ],
[ [ 1 ] ],
[],
- [ 'text' => [ 'INNER JOIN', [ 'rev_text_id = old_id' ] ] ]
+ [ 'text' => [ 'JOIN', [ 'rev_text_id = old_id' ] ] ]
);
parent::assertRevisionExistsInDatabase( $rev );
]
),
'joins' => [
- 'page' => [ 'INNER JOIN', [ 'page_id = rev_page' ] ],
+ 'page' => [ 'JOIN', [ 'page_id = rev_page' ] ],
],
]
];
]
),
'joins' => [
- 'text' => [ 'INNER JOIN', [ 'rev_text_id=old_id' ] ],
+ 'text' => [ 'JOIN', [ 'rev_text_id=old_id' ] ],
],
]
];
[ 'rev_id' => $rev->getId(), 'rev_text_id > 0' ],
[ [ 1 ] ],
[],
- [ 'text' => [ 'INNER JOIN', [ 'rev_text_id = old_id' ] ] ]
+ [ 'text' => [ 'JOIN', [ 'rev_text_id = old_id' ] ] ]
);
parent::assertRevisionExistsInDatabase( $rev );
$this->getNewCommentQueryFields( 'rev' )
),
'joins' => [
- 'page' => [ 'INNER JOIN', [ 'page_id = rev_page' ] ],
+ 'page' => [ 'JOIN', [ 'page_id = rev_page' ] ],
'user' => [
'LEFT JOIN',
[ 'actor_rev_user.actor_user != 0', 'user_id = actor_rev_user.actor_user' ],
),
'joins' => array_merge(
[
- 'page' => [ 'INNER JOIN', [ 'page_id = rev_page' ] ],
+ 'page' => [ 'JOIN', [ 'page_id = rev_page' ] ],
'user' => [
'LEFT JOIN',
[
),
'joins' => array_merge(
[
- 'page' => [ 'INNER JOIN', [ 'page_id = rev_page' ] ],
+ 'page' => [ 'JOIN', [ 'page_id = rev_page' ] ],
'user' => [
'LEFT JOIN',
[
),
'joins' => array_merge(
[
- 'page' => [ 'INNER JOIN', [ 'page_id = rev_page' ] ],
+ 'page' => [ 'JOIN', [ 'page_id = rev_page' ] ],
'user' => [
'LEFT JOIN',
[
$this->getNewCommentQueryFields( 'rev' )
),
'joins' => [
- 'page' => [ 'INNER JOIN', [ 'page_id = rev_page' ] ],
+ 'page' => [ 'JOIN', [ 'page_id = rev_page' ] ],
'user' => [ 'LEFT JOIN', [ 'rev_user != 0', 'user_id = rev_user' ] ],
'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
'comment_rev_comment'
$this->getNewCommentQueryFields( 'rev' )
),
'joins' => [
- 'page' => [ 'INNER JOIN', [ 'page_id = rev_page' ], ],
+ 'page' => [ 'JOIN', [ 'page_id = rev_page' ], ],
'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
'comment_rev_comment'
=> [ 'JOIN', 'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
$this->getNewCommentQueryFields( 'rev' )
),
'joins' => [
- 'text' => [ 'INNER JOIN', [ 'rev_text_id=old_id' ] ],
+ 'text' => [ 'JOIN', [ 'rev_text_id=old_id' ] ],
'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
'comment_rev_comment'
=> [ 'JOIN', 'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
),
'joins' => [
'page' => [
- 'INNER JOIN',
+ 'JOIN',
[ 'page_id = rev_page' ],
],
'user' => [
],
],
'text' => [
- 'INNER JOIN',
+ 'JOIN',
[ 'rev_text_id=old_id' ],
],
'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
'content_model',
],
'joins' => [
- 'content' => [ 'INNER JOIN', [ 'slot_content_id = content_id' ] ],
+ 'content' => [ 'JOIN', [ 'slot_content_id = content_id' ] ],
],
]
];
'model_name',
],
'joins' => [
- 'content' => [ 'INNER JOIN', [ 'slot_content_id = content_id' ] ],
+ 'content' => [ 'JOIN', [ 'slot_content_id = content_id' ] ],
'content_models' => [ 'LEFT JOIN', [ 'content_model = model_id' ] ],
],
]
public function testRevisionPageJoinCond() {
$this->hideDeprecated( 'Revision::pageJoinCond' );
$this->assertEquals(
- [ 'INNER JOIN', [ 'page_id = rev_page' ] ],
+ [ 'JOIN', [ 'page_id = rev_page' ] ],
Revision::pageJoinCond()
);
}
[
'tables' => [ 'text' ],
'fields' => [ 'old_id', 'old_text', 'old_flags', 'rev_text_id' ],
- 'joins' => [ 'text' => [ 'INNER JOIN', 'old_id=rev_text_id' ] ]
+ 'joins' => [ 'text' => [ 'JOIN', 'old_id=rev_text_id' ] ]
]
];
}
public function provideGetName() {
return [
- [ new HashBagOStuff(), 3, 3 ],
+ [ new HashBagOStuff(), 3, 2 ],
[ new EmptyBagOStuff(), 3, 3 ],
];
}
* @dataProvider provideGetName
*/
public function testGetName( $cacheBag, $insertCalls, $selectCalls ) {
+ // Check for operations to in-memory cache (IMC) and persistent cache (PC)
$store = $this->getNameTableSqlStore( $cacheBag, $insertCalls, $selectCalls );
// Get 1 ID and make sure getName returns correctly
- $fooId = $store->acquireId( 'foo' );
- $this->assertSame( 'foo', $store->getName( $fooId ) );
+ $fooId = $store->acquireId( 'foo' ); // regen PC, set IMC, update IMC, tombstone PC
+ $this->assertSame( 'foo', $store->getName( $fooId ) ); // use IMC
// Get another ID and make sure getName returns correctly
- $barId = $store->acquireId( 'bar' );
- $this->assertSame( 'bar', $store->getName( $barId ) );
+ $barId = $store->acquireId( 'bar' ); // update IMC, tombstone PC
+ $this->assertSame( 'bar', $store->getName( $barId ) ); // use IMC
// Blitz the cache and make sure it still returns
- TestingAccessWrapper::newFromObject( $store )->tableCache = null;
- $this->assertSame( 'foo', $store->getName( $fooId ) );
- $this->assertSame( 'bar', $store->getName( $barId ) );
+ TestingAccessWrapper::newFromObject( $store )->tableCache = null; // clear IMC
+ $this->assertSame( 'foo', $store->getName( $fooId ) ); // regen interim PC, set IMC
+ $this->assertSame( 'bar', $store->getName( $barId ) ); // use IMC
// Blitz the cache again and get another ID and make sure getName returns correctly
- TestingAccessWrapper::newFromObject( $store )->tableCache = null;
- $bazId = $store->acquireId( 'baz' );
- $this->assertSame( 'baz', $store->getName( $bazId ) );
- $this->assertSame( 'baz', $store->getName( $bazId ) );
+ TestingAccessWrapper::newFromObject( $store )->tableCache = null; // clear IMC
+ $bazId = $store->acquireId( 'baz' ); // set IMC using interim PC, update IMC, tombstone PC
+ $this->assertSame( 'baz', $store->getName( $bazId ) ); // uses IMC
+ $this->assertSame( 'baz', $store->getName( $bazId ) ); // uses IMC
}
public function testGetName_masterFallback() {
$this->assertEquals( [],
$this->title->getUserPermissionsErrors( 'edit', $this->user ) );
}
+
+ /**
+ * @covers Title::checkUserBlock
+ *
+ * Tests to determine that the passed in permission does not get mixed up with
+ * an action of the same name.
+ */
+ public function testUserBlockAction() {
+ global $wgLang;
+
+ $tester = $this->getMockBuilder( Action::class )
+ ->disableOriginalConstructor()
+ ->getMock();
+ $tester->method( 'getName' )
+ ->willReturn( 'tester' );
+ $tester->method( 'getRestriction' )
+ ->willReturn( 'test' );
+ $tester->method( 'requiresUnblock' )
+ ->willReturn( false );
+
+ $this->setMwGlobals( [
+ 'wgActions' => [
+ 'tester' => $tester,
+ ],
+ 'wgGroupPermissions' => [
+ '*' => [
+ 'tester' => true,
+ ],
+ ],
+ ] );
+
+ $now = time();
+ $this->user->mBlockedby = $this->user->getName();
+ $this->user->mBlock = new Block( [
+ 'address' => '127.0.8.1',
+ 'by' => $this->user->getId(),
+ 'reason' => 'no reason given',
+ 'timestamp' => $now,
+ 'auto' => false,
+ 'expiry' => 'infinity',
+ ] );
+
+ $errors = [ [ 'blockedtext',
+ '[[User:Useruser|Useruser]]', 'no reason given', '127.0.0.1',
+ 'Useruser', null, 'infinite', '127.0.8.1',
+ $wgLang->timeanddate( wfTimestamp( TS_MW, $now ), true ) ] ];
+
+ $this->assertEquals( $errors,
+ $this->title->getUserPermissionsErrors( 'tester', $this->user ) );
+ }
}
* @param array|string|bool $expected Required error
* @dataProvider provideTestIsValidMoveOperation
* @covers Title::isValidMoveOperation
- * @covers Title::validateFileMoveOperation
*/
public function testIsValidMoveOperation( $source, $target, $expected ) {
$this->setMwGlobals( 'wgContentHandlerUseDB', false );
[ 'Test', 'Special:FooBar', 'immobile-target-namespace' ],
[ 'MediaWiki:Common.js', 'Help:Some wikitext page', 'bad-target-model' ],
[ 'Page', 'File:Test.jpg', 'nonfile-cannot-move-to-file' ],
- // for Title::validateFileMoveOperation
[ 'File:Test.jpg', 'Page', 'imagenocrossnamespace' ],
];
}
public function testErrorArrayToStatus() {
$mock = new MockApi();
+ $msg = new Message( 'mainpage' );
+
// Sanity check empty array
$expect = Status::newGood();
$this->assertEquals( $expect, $mock->errorArrayToStatus( [] ) );
$expect->fatal( 'autoblockedtext' );
$expect->fatal( 'systemblockedtext' );
$expect->fatal( 'mainpage' );
+ $expect->fatal( $msg );
+ $expect->fatal( $msg, 'foobar' );
$expect->fatal( 'parentheses', 'foobar' );
$this->assertEquals( $expect, $mock->errorArrayToStatus( [
[ 'blockedtext' ],
[ 'autoblockedtext' ],
[ 'systemblockedtext' ],
'mainpage',
+ $msg,
+ [ $msg, 'foobar' ],
[ 'parentheses', 'foobar' ],
] ) );
$expect->fatal( ApiMessage::create( 'apierror-autoblocked', 'autoblocked', $blockinfo ) );
$expect->fatal( ApiMessage::create( 'apierror-systemblocked', 'blocked', $blockinfo ) );
$expect->fatal( 'mainpage' );
+ $expect->fatal( $msg );
+ $expect->fatal( $msg, 'foobar' );
$expect->fatal( 'parentheses', 'foobar' );
$this->assertEquals( $expect, $mock->errorArrayToStatus( [
[ 'blockedtext' ],
[ 'autoblockedtext' ],
[ 'systemblockedtext' ],
'mainpage',
+ $msg,
+ [ $msg, 'foobar' ],
[ 'parentheses', 'foobar' ],
], $user ) );
}
public function testAddBlockInfoToStatus() {
$mock = new MockApi();
+ $msg = new Message( 'mainpage' );
+
// Sanity check empty array
$expect = Status::newGood();
$test = Status::newGood();
$expect->fatal( 'autoblockedtext' );
$expect->fatal( 'systemblockedtext' );
$expect->fatal( 'mainpage' );
+ $expect->fatal( $msg );
+ $expect->fatal( $msg, 'foobar' );
$expect->fatal( 'parentheses', 'foobar' );
$test = clone $expect;
$mock->addBlockInfoToStatus( $test );
$expect->fatal( ApiMessage::create( 'apierror-autoblocked', 'autoblocked', $blockinfo ) );
$expect->fatal( ApiMessage::create( 'apierror-systemblocked', 'blocked', $blockinfo ) );
$expect->fatal( 'mainpage' );
+ $expect->fatal( $msg );
+ $expect->fatal( $msg, 'foobar' );
$expect->fatal( 'parentheses', 'foobar' );
$test = Status::newGood();
$test->fatal( 'blockedtext' );
$test->fatal( 'autoblockedtext' );
$test->fatal( 'systemblockedtext' );
$test->fatal( 'mainpage' );
+ $test->fatal( $msg );
+ $test->fatal( $msg, 'foobar' );
$test->fatal( 'parentheses', 'foobar' );
$mock->addBlockInfoToStatus( $test, $user );
$this->assertEquals( $expect, $test );
__METHOD__,
[],
[
- 'change_tag' => [ 'INNER JOIN', 'ct_log_id = log_id' ],
- 'change_tag_def' => [ 'INNER JOIN', 'ctd_id = ct_tag_id' ],
+ 'change_tag' => [ 'JOIN', 'ct_log_id = log_id' ],
+ 'change_tag_def' => [ 'JOIN', 'ctd_id = ct_tag_id' ],
]
) );
}
__METHOD__,
[],
[
- 'change_tag' => [ 'INNER JOIN', 'ct_log_id = log_id' ],
- 'change_tag_def' => [ 'INNER JOIN', 'ctd_id = ct_tag_id' ]
+ 'change_tag' => [ 'JOIN', 'ct_log_id = log_id' ],
+ 'change_tag_def' => [ 'JOIN', 'ctd_id = ct_tag_id' ]
]
) );
}
'ctd_name',
[ 'ct_rev_id' => $revId ],
__METHOD__,
- [ 'change_tag_def' => [ 'INNER JOIN', 'ctd_id = ct_tag_id' ] ]
+ [ 'change_tag_def' => [ 'JOIN', 'ctd_id = ct_tag_id' ] ]
)
);
}
function ( $parser ) {
$output = $parser->getOutput();
$output->addModules( [ 'foo', 'bar' ] );
- $output->addModuleScripts( [ 'baz', 'quuz' ] );
$output->addModuleStyles( [ 'aaa', 'zzz' ] );
$output->addJsConfigVars( [ 'x' => 'y', 'z' => -3 ] );
}
] );
$this->assertSame( [ 'foo', 'bar' ], $res[0]['parse']['modules'] );
- $this->assertSame( [ 'baz', 'quuz' ], $res[0]['parse']['modulescripts'] );
+ $this->assertSame( [], $res[0]['parse']['modulescripts'] );
$this->assertSame( [ 'aaa', 'zzz' ], $res[0]['parse']['modulestyles'] );
$this->assertSame( [ 'x' => 'y', 'z' => -3 ], $res[0]['parse']['jsconfigvars'] );
$this->assertSame( '{"x":"y","z":-3}', $res[0]['parse']['encodedjsconfigvars'] );
];
$this->setMwGlobals( [
- 'wgAuth' => new MediaWiki\Auth\AuthManagerAuthPlugin,
'wgRequest' => new FauxRequest( [] ),
'wgUser' => self::$users['sysop']->getUser(),
] );
__METHOD__,
[],
[
- 'change_tag' => [ 'INNER JOIN', 'ct_log_id = log_id' ],
- 'change_tag_def' => [ 'INNER JOIN', 'ctd_id = ct_tag_id' ],
+ 'change_tag' => [ 'JOIN', 'ct_log_id = log_id' ],
+ 'change_tag_def' => [ 'JOIN', 'ctd_id = ct_tag_id' ],
]
) );
}
'log_title' => strtr( $user->getName(), ' ', '_' )
],
__METHOD__,
- [ 'change_tag_def' => [ 'INNER JOIN', 'ctd_id = ct_tag_id' ] ]
+ [ 'change_tag_def' => [ 'JOIN', 'ctd_id = ct_tag_id' ] ]
)
);
}
/** @var TestingAccessWrapper */
protected $managerPriv;
- protected function setUp() {
- parent::setUp();
-
- $this->setMwGlobals( [ 'wgAuth' => null ] );
- }
-
/**
* Sets a mock on a hook
* @param string $hook
}
public function testAutoAccountCreation() {
- global $wgHooks;
-
// PHPUnit seems to have a bug where it will call the ->with()
// callbacks for our hooks again after the test is run (WTF?), which
// breaks here because $username no longer matches $user by the end of
$session->clear();
$username = self::usernameForCreation();
$user = \User::newFromName( $username );
- $this->hook( 'AuthPluginAutoCreate', $this->once() )
- ->with( $callback );
- $this->hideDeprecated( 'AuthPluginAutoCreate hook (used in ' .
- get_class( $wgHooks['AuthPluginAutoCreate'][0] ) . '::onAuthPluginAutoCreate)' );
$this->hook( 'LocalUserCreated', $this->once() )
->with( $callback, $this->equalTo( true ) );
$ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
$this->unhook( 'LocalUserCreated' );
- $this->unhook( 'AuthPluginAutoCreate' );
$this->assertEquals( \Status::newGood(), $ret );
$this->assertNotEquals( 0, $user->getId() );
$this->assertEquals( $username, $user->getName() );
+++ /dev/null
-<?php
-
-namespace MediaWiki\Auth;
-
-/**
- * @group AuthManager
- * @covers \MediaWiki\Auth\AuthPluginPrimaryAuthenticationProvider
- */
-class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
- public function testConstruction() {
- $plugin = new AuthManagerAuthPlugin();
- try {
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $this->fail( 'Expected exception not thrown' );
- } catch ( \InvalidArgumentException $ex ) {
- $this->assertSame(
- 'Trying to wrap AuthManagerAuthPlugin in AuthPluginPrimaryAuthenticationProvider ' .
- 'makes no sense.',
- $ex->getMessage()
- );
- }
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
-
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $this->assertEquals(
- [ new PasswordAuthenticationRequest ],
- $provider->getAuthenticationRequests( AuthManager::ACTION_LOGIN, [] )
- );
-
- $req = $this->createMock( PasswordAuthenticationRequest::class );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin, get_class( $req ) );
- $this->assertEquals(
- [ $req ],
- $provider->getAuthenticationRequests( AuthManager::ACTION_LOGIN, [] )
- );
-
- $reqType = get_class( $this->createMock( AuthenticationRequest::class ) );
- try {
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin, $reqType );
- $this->fail( 'Expected exception not thrown' );
- } catch ( \InvalidArgumentException $ex ) {
- $this->assertSame(
- "$reqType is not a MediaWiki\\Auth\\PasswordAuthenticationRequest",
- $ex->getMessage()
- );
- }
- }
-
- public function testOnUserSaveSettings() {
- $user = \User::newFromName( 'UTSysop' );
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->once() )->method( 'updateExternalDB' )
- ->with( $this->identicalTo( $user ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
-
- \Hooks::run( 'UserSaveSettings', [ $user ] );
- }
-
- public function testOnUserGroupsChanged() {
- $user = \User::newFromName( 'UTSysop' );
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->once() )->method( 'updateExternalDBGroups' )
- ->with(
- $this->identicalTo( $user ),
- $this->identicalTo( [ 'added' ] ),
- $this->identicalTo( [ 'removed' ] )
- );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
-
- \Hooks::run( 'UserGroupsChanged', [ $user, [ 'added' ], [ 'removed' ], false, false, [], [] ] );
- }
-
- public function testOnUserLoggedIn() {
- $user = \User::newFromName( 'UTSysop' );
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->exactly( 2 ) )->method( 'updateUser' )
- ->with( $this->identicalTo( $user ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- \Hooks::run( 'UserLoggedIn', [ $user ] );
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->once() )->method( 'updateUser' )
- ->will( $this->returnCallback( function ( &$user ) {
- $user = \User::newFromName( 'UTSysop' );
- } ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- try {
- \Hooks::run( 'UserLoggedIn', [ $user ] );
- $this->fail( 'Expected exception not thrown' );
- } catch ( \UnexpectedValueException $ex ) {
- $this->assertSame(
- get_class( $plugin ) . '::updateUser() tried to replace $user!',
- $ex->getMessage()
- );
- }
- }
-
- public function testOnLocalUserCreated() {
- $user = \User::newFromName( 'UTSysop' );
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->exactly( 2 ) )->method( 'initUser' )
- ->with( $this->identicalTo( $user ), $this->identicalTo( false ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- \Hooks::run( 'LocalUserCreated', [ $user, false ] );
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->once() )->method( 'initUser' )
- ->will( $this->returnCallback( function ( &$user ) {
- $user = \User::newFromName( 'UTSysop' );
- } ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- try {
- \Hooks::run( 'LocalUserCreated', [ $user, false ] );
- $this->fail( 'Expected exception not thrown' );
- } catch ( \UnexpectedValueException $ex ) {
- $this->assertSame(
- get_class( $plugin ) . '::initUser() tried to replace $user!',
- $ex->getMessage()
- );
- }
- }
-
- public function testGetUniqueId() {
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $this->assertSame(
- 'MediaWiki\\Auth\\AuthPluginPrimaryAuthenticationProvider:' . get_class( $plugin ),
- $provider->getUniqueId()
- );
- }
-
- /**
- * @dataProvider provideGetAuthenticationRequests
- * @param string $action
- * @param array $response
- * @param bool $allowPasswordChange
- */
- public function testGetAuthenticationRequests( $action, $response, $allowPasswordChange ) {
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->any() )->method( 'allowPasswordChange' )
- ->will( $this->returnValue( $allowPasswordChange ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $this->assertEquals( $response, $provider->getAuthenticationRequests( $action, [] ) );
- }
-
- public static function provideGetAuthenticationRequests() {
- $arr = [ new PasswordAuthenticationRequest() ];
- return [
- [ AuthManager::ACTION_LOGIN, $arr, true ],
- [ AuthManager::ACTION_LOGIN, $arr, false ],
- [ AuthManager::ACTION_CREATE, $arr, true ],
- [ AuthManager::ACTION_CREATE, $arr, false ],
- [ AuthManager::ACTION_LINK, [], true ],
- [ AuthManager::ACTION_LINK, [], false ],
- [ AuthManager::ACTION_CHANGE, $arr, true ],
- [ AuthManager::ACTION_CHANGE, [], false ],
- [ AuthManager::ACTION_REMOVE, $arr, true ],
- [ AuthManager::ACTION_REMOVE, [], false ],
- ];
- }
-
- public function testAuthentication() {
- $req = new PasswordAuthenticationRequest();
- $req->action = AuthManager::ACTION_LOGIN;
- $reqs = [ PasswordAuthenticationRequest::class => $req ];
-
- $plugin = $this->getMockBuilder( \AuthPlugin::class )
- ->setMethods( [ 'authenticate' ] )
- ->getMock();
- $plugin->expects( $this->never() )->method( 'authenticate' );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
-
- $this->assertEquals(
- AuthenticationResponse::newAbstain(),
- $provider->beginPrimaryAuthentication( [] )
- );
-
- $req->username = 'foo';
- $req->password = null;
- $this->assertEquals(
- AuthenticationResponse::newAbstain(),
- $provider->beginPrimaryAuthentication( $reqs )
- );
-
- $req->username = null;
- $req->password = 'bar';
- $this->assertEquals(
- AuthenticationResponse::newAbstain(),
- $provider->beginPrimaryAuthentication( $reqs )
- );
-
- $req->username = 'foo';
- $req->password = 'bar';
-
- $plugin = $this->getMockBuilder( \AuthPlugin::class )
- ->setMethods( [ 'userExists', 'authenticate' ] )
- ->getMock();
- $plugin->expects( $this->once() )->method( 'userExists' )
- ->will( $this->returnValue( true ) );
- $plugin->expects( $this->once() )->method( 'authenticate' )
- ->with( $this->equalTo( 'Foo' ), $this->equalTo( 'bar' ) )
- ->will( $this->returnValue( true ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $this->assertEquals(
- AuthenticationResponse::newPass( 'Foo', $req ),
- $provider->beginPrimaryAuthentication( $reqs )
- );
-
- $plugin = $this->getMockBuilder( \AuthPlugin::class )
- ->setMethods( [ 'userExists', 'authenticate' ] )
- ->getMock();
- $plugin->expects( $this->once() )->method( 'userExists' )
- ->will( $this->returnValue( false ) );
- $plugin->expects( $this->never() )->method( 'authenticate' );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $this->assertEquals(
- AuthenticationResponse::newAbstain(),
- $provider->beginPrimaryAuthentication( $reqs )
- );
-
- $pluginUser = $this->getMockBuilder( \AuthPluginUser::class )
- ->setMethods( [ 'isLocked' ] )
- ->disableOriginalConstructor()
- ->getMock();
- $pluginUser->expects( $this->once() )->method( 'isLocked' )
- ->will( $this->returnValue( true ) );
- $plugin = $this->getMockBuilder( \AuthPlugin::class )
- ->setMethods( [ 'userExists', 'getUserInstance', 'authenticate' ] )
- ->getMock();
- $plugin->expects( $this->once() )->method( 'userExists' )
- ->will( $this->returnValue( true ) );
- $plugin->expects( $this->once() )->method( 'getUserInstance' )
- ->will( $this->returnValue( $pluginUser ) );
- $plugin->expects( $this->never() )->method( 'authenticate' );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $this->assertEquals(
- AuthenticationResponse::newAbstain(),
- $provider->beginPrimaryAuthentication( $reqs )
- );
-
- $plugin = $this->getMockBuilder( \AuthPlugin::class )
- ->setMethods( [ 'userExists', 'authenticate' ] )
- ->getMock();
- $plugin->expects( $this->once() )->method( 'userExists' )
- ->will( $this->returnValue( true ) );
- $plugin->expects( $this->once() )->method( 'authenticate' )
- ->with( $this->equalTo( 'Foo' ), $this->equalTo( 'bar' ) )
- ->will( $this->returnValue( false ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $this->assertEquals(
- AuthenticationResponse::newAbstain(),
- $provider->beginPrimaryAuthentication( $reqs )
- );
-
- $plugin = $this->getMockBuilder( \AuthPlugin::class )
- ->setMethods( [ 'userExists', 'authenticate', 'strict' ] )
- ->getMock();
- $plugin->expects( $this->once() )->method( 'userExists' )
- ->will( $this->returnValue( true ) );
- $plugin->expects( $this->once() )->method( 'authenticate' )
- ->with( $this->equalTo( 'Foo' ), $this->equalTo( 'bar' ) )
- ->will( $this->returnValue( false ) );
- $plugin->expects( $this->any() )->method( 'strict' )->will( $this->returnValue( true ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $ret = $provider->beginPrimaryAuthentication( $reqs );
- $this->assertSame( AuthenticationResponse::FAIL, $ret->status );
- $this->assertSame( 'wrongpassword', $ret->message->getKey() );
-
- $plugin = $this->getMockBuilder( \AuthPlugin::class )
- ->setMethods( [ 'userExists', 'authenticate', 'strictUserAuth' ] )
- ->getMock();
- $plugin->expects( $this->once() )->method( 'userExists' )
- ->will( $this->returnValue( true ) );
- $plugin->expects( $this->once() )->method( 'authenticate' )
- ->with( $this->equalTo( 'Foo' ), $this->equalTo( 'bar' ) )
- ->will( $this->returnValue( false ) );
- $plugin->expects( $this->any() )->method( 'strictUserAuth' )
- ->with( $this->equalTo( 'Foo' ) )
- ->will( $this->returnValue( true ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $ret = $provider->beginPrimaryAuthentication( $reqs );
- $this->assertSame( AuthenticationResponse::FAIL, $ret->status );
- $this->assertSame( 'wrongpassword', $ret->message->getKey() );
-
- $plugin = $this->getMockBuilder( \AuthPlugin::class )
- ->setMethods( [ 'domainList', 'validDomain', 'setDomain', 'userExists', 'authenticate' ] )
- ->getMock();
- $plugin->expects( $this->any() )->method( 'domainList' )
- ->will( $this->returnValue( [ 'Domain1', 'Domain2' ] ) );
- $plugin->expects( $this->any() )->method( 'validDomain' )
- ->will( $this->returnCallback( function ( $domain ) {
- return in_array( $domain, [ 'Domain1', 'Domain2' ] );
- } ) );
- $plugin->expects( $this->once() )->method( 'setDomain' )
- ->with( $this->equalTo( 'Domain2' ) );
- $plugin->expects( $this->once() )->method( 'userExists' )
- ->will( $this->returnValue( true ) );
- $plugin->expects( $this->once() )->method( 'authenticate' )
- ->with( $this->equalTo( 'Foo' ), $this->equalTo( 'bar' ) )
- ->will( $this->returnValue( true ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- list( $req ) = $provider->getAuthenticationRequests( AuthManager::ACTION_LOGIN, [] );
- $req->username = 'foo';
- $req->password = 'bar';
- $req->domain = 'Domain2';
- $provider->beginPrimaryAuthentication( [ $req ] );
- }
-
- public function testTestUserExists() {
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->once() )->method( 'userExists' )
- ->with( $this->equalTo( 'Foo' ) )
- ->will( $this->returnValue( true ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
-
- $this->assertTrue( $provider->testUserExists( 'foo' ) );
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->once() )->method( 'userExists' )
- ->with( $this->equalTo( 'Foo' ) )
- ->will( $this->returnValue( false ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
-
- $this->assertFalse( $provider->testUserExists( 'foo' ) );
- }
-
- public function testTestUserCanAuthenticate() {
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->once() )->method( 'userExists' )
- ->with( $this->equalTo( 'Foo' ) )
- ->will( $this->returnValue( false ) );
- $plugin->expects( $this->never() )->method( 'getUserInstance' );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $this->assertFalse( $provider->testUserCanAuthenticate( 'foo' ) );
-
- $pluginUser = $this->getMockBuilder( \AuthPluginUser::class )
- ->disableOriginalConstructor()
- ->getMock();
- $pluginUser->expects( $this->once() )->method( 'isLocked' )
- ->will( $this->returnValue( true ) );
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->once() )->method( 'userExists' )
- ->with( $this->equalTo( 'Foo' ) )
- ->will( $this->returnValue( true ) );
- $plugin->expects( $this->once() )->method( 'getUserInstance' )
- ->with( $this->callback( function ( $user ) {
- $this->assertInstanceOf( \User::class, $user );
- $this->assertEquals( 'Foo', $user->getName() );
- return true;
- } ) )
- ->will( $this->returnValue( $pluginUser ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $this->assertFalse( $provider->testUserCanAuthenticate( 'foo' ) );
-
- $pluginUser = $this->getMockBuilder( \AuthPluginUser::class )
- ->disableOriginalConstructor()
- ->getMock();
- $pluginUser->expects( $this->once() )->method( 'isLocked' )
- ->will( $this->returnValue( false ) );
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->once() )->method( 'userExists' )
- ->with( $this->equalTo( 'Foo' ) )
- ->will( $this->returnValue( true ) );
- $plugin->expects( $this->once() )->method( 'getUserInstance' )
- ->with( $this->callback( function ( $user ) {
- $this->assertInstanceOf( \User::class, $user );
- $this->assertEquals( 'Foo', $user->getName() );
- return true;
- } ) )
- ->will( $this->returnValue( $pluginUser ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $this->assertTrue( $provider->testUserCanAuthenticate( 'foo' ) );
- }
-
- public function testProviderRevokeAccessForUser() {
- $plugin = $this->getMockBuilder( \AuthPlugin::class )
- ->setMethods( [ 'userExists', 'setPassword' ] )
- ->getMock();
- $plugin->expects( $this->once() )->method( 'userExists' )->willReturn( true );
- $plugin->expects( $this->once() )->method( 'setPassword' )
- ->with( $this->callback( function ( $u ) {
- return $u instanceof \User && $u->getName() === 'Foo';
- } ), $this->identicalTo( null ) )
- ->willReturn( true );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $provider->providerRevokeAccessForUser( 'foo' );
-
- $plugin = $this->getMockBuilder( \AuthPlugin::class )
- ->setMethods( [ 'domainList', 'userExists', 'setPassword' ] )
- ->getMock();
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [ 'D1', 'D2', 'D3' ] );
- $plugin->expects( $this->exactly( 3 ) )->method( 'userExists' )
- ->willReturnCallback( function () use ( $plugin ) {
- return $plugin->getDomain() !== 'D2';
- } );
- $plugin->expects( $this->exactly( 2 ) )->method( 'setPassword' )
- ->with( $this->callback( function ( $u ) {
- return $u instanceof \User && $u->getName() === 'Foo';
- } ), $this->identicalTo( null ) )
- ->willReturnCallback( function () use ( $plugin ) {
- $this->assertNotEquals( 'D2', $plugin->getDomain() );
- return $plugin->getDomain() !== 'D1';
- } );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- try {
- $provider->providerRevokeAccessForUser( 'foo' );
- $this->fail( 'Expected exception not thrown' );
- } catch ( \UnexpectedValueException $ex ) {
- $this->assertSame(
- 'AuthPlugin failed to reset password for Foo in the following domains: D1',
- $ex->getMessage()
- );
- }
- }
-
- public function testProviderAllowsPropertyChange() {
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->any() )->method( 'allowPropChange' )
- ->will( $this->returnCallback( function ( $prop ) {
- return $prop === 'allow';
- } ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
-
- $this->assertTrue( $provider->providerAllowsPropertyChange( 'allow' ) );
- $this->assertFalse( $provider->providerAllowsPropertyChange( 'deny' ) );
- }
-
- /**
- * @dataProvider provideProviderAllowsAuthenticationDataChange
- * @param string $type
- * @param bool|null $allow
- * @param StatusValue $expect
- */
- public function testProviderAllowsAuthenticationDataChange( $type, $allow, $expect ) {
- $domains = $type instanceof PasswordDomainAuthenticationRequest ? [ 'foo', 'bar' ] : [];
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( $domains );
- $plugin->expects( $allow === null ? $this->never() : $this->once() )
- ->method( 'allowPasswordChange' )->will( $this->returnValue( $allow ) );
- $plugin->expects( $this->any() )->method( 'validDomain' )
- ->willReturnCallback( function ( $d ) use ( $domains ) {
- return in_array( $d, $domains, true );
- } );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
-
- if ( is_object( $type ) ) {
- $req = $type;
- } else {
- $req = $this->createMock( $type );
- }
- $req->action = AuthManager::ACTION_CHANGE;
- $req->username = 'UTSysop';
- $req->password = 'Pa$$w0Rd!!!';
- $req->retype = 'Pa$$w0Rd!!!';
- $this->assertEquals( $expect, $provider->providerAllowsAuthenticationDataChange( $req ) );
- }
-
- public static function provideProviderAllowsAuthenticationDataChange() {
- $domains = [ 'foo', 'bar' ];
- $reqNoDomain = new PasswordDomainAuthenticationRequest( $domains );
- $reqValidDomain = new PasswordDomainAuthenticationRequest( $domains );
- $reqValidDomain->domain = 'foo';
- $reqInvalidDomain = new PasswordDomainAuthenticationRequest( $domains );
- $reqInvalidDomain->domain = 'invalid';
-
- return [
- [ AuthenticationRequest::class, null, \StatusValue::newGood( 'ignored' ) ],
- [ new PasswordAuthenticationRequest, true, \StatusValue::newGood() ],
- [
- new PasswordAuthenticationRequest,
- false,
- \StatusValue::newFatal( 'authmanager-authplugin-setpass-denied' )
- ],
- [ $reqNoDomain, true, \StatusValue::newGood( 'ignored' ) ],
- [ $reqValidDomain, true, \StatusValue::newGood() ],
- [
- $reqInvalidDomain,
- true,
- \StatusValue::newFatal( 'authmanager-authplugin-setpass-bad-domain' )
- ],
- ];
- }
-
- public function testProviderChangeAuthenticationData() {
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->never() )->method( 'setPassword' );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $provider->providerChangeAuthenticationData(
- $this->createMock( AuthenticationRequest::class )
- );
-
- $req = new PasswordAuthenticationRequest();
- $req->action = AuthManager::ACTION_CHANGE;
- $req->username = 'foo';
- $req->password = 'bar';
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->once() )->method( 'setPassword' )
- ->with( $this->callback( function ( $u ) {
- return $u instanceof \User && $u->getName() === 'Foo';
- } ), $this->equalTo( 'bar' ) )
- ->will( $this->returnValue( true ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $provider->providerChangeAuthenticationData( $req );
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->once() )->method( 'setPassword' )
- ->with( $this->callback( function ( $u ) {
- return $u instanceof \User && $u->getName() === 'Foo';
- } ), $this->equalTo( 'bar' ) )
- ->will( $this->returnValue( false ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- try {
- $provider->providerChangeAuthenticationData( $req );
- $this->fail( 'Expected exception not thrown' );
- } catch ( \ErrorPageError $e ) {
- $this->assertSame( 'authmanager-authplugin-setpass-failed-title', $e->title );
- $this->assertSame( 'authmanager-authplugin-setpass-failed-message', $e->msg );
- }
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )
- ->will( $this->returnValue( [ 'Domain1', 'Domain2' ] ) );
- $plugin->expects( $this->any() )->method( 'validDomain' )
- ->will( $this->returnCallback( function ( $domain ) {
- return in_array( $domain, [ 'Domain1', 'Domain2' ] );
- } ) );
- $plugin->expects( $this->once() )->method( 'setDomain' )
- ->with( $this->equalTo( 'Domain2' ) );
- $plugin->expects( $this->once() )->method( 'setPassword' )
- ->with( $this->callback( function ( $u ) {
- return $u instanceof \User && $u->getName() === 'Foo';
- } ), $this->equalTo( 'bar' ) )
- ->will( $this->returnValue( true ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- list( $req ) = $provider->getAuthenticationRequests( AuthManager::ACTION_CREATE, [] );
- $req->username = 'foo';
- $req->password = 'bar';
- $req->domain = 'Domain2';
- $provider->providerChangeAuthenticationData( $req );
- }
-
- /**
- * @dataProvider provideAccountCreationType
- * @param bool $can
- * @param string $expect
- */
- public function testAccountCreationType( $can, $expect ) {
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->once() )
- ->method( 'canCreateAccounts' )->will( $this->returnValue( $can ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
-
- $this->assertSame( $expect, $provider->accountCreationType() );
- }
-
- public static function provideAccountCreationType() {
- return [
- [ true, PrimaryAuthenticationProvider::TYPE_CREATE ],
- [ false, PrimaryAuthenticationProvider::TYPE_NONE ],
- ];
- }
-
- public function testTestForAccountCreation() {
- $user = \User::newFromName( 'foo' );
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $this->assertEquals(
- \StatusValue::newGood(),
- $provider->testForAccountCreation( $user, $user, [] )
- );
- }
-
- public function testAccountCreation() {
- $user = \User::newFromName( 'foo' );
- $user->setEmail( 'email' );
- $user->setRealName( 'realname' );
-
- $req = new PasswordAuthenticationRequest();
- $req->action = AuthManager::ACTION_CREATE;
- $reqs = [ PasswordAuthenticationRequest::class => $req ];
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
- ->will( $this->returnValue( false ) );
- $plugin->expects( $this->never() )->method( 'addUser' );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- try {
- $provider->beginPrimaryAccountCreation( $user, $user, [] );
- $this->fail( 'Expected exception was not thrown' );
- } catch ( \BadMethodCallException $ex ) {
- $this->assertSame(
- 'Shouldn\'t call this when accountCreationType() is NONE', $ex->getMessage()
- );
- }
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
- ->will( $this->returnValue( true ) );
- $plugin->expects( $this->never() )->method( 'addUser' );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
-
- $this->assertEquals(
- AuthenticationResponse::newAbstain(),
- $provider->beginPrimaryAccountCreation( $user, $user, [] )
- );
-
- $req->username = 'foo';
- $req->password = null;
- $this->assertEquals(
- AuthenticationResponse::newAbstain(),
- $provider->beginPrimaryAccountCreation( $user, $user, $reqs )
- );
-
- $req->username = null;
- $req->password = 'bar';
- $this->assertEquals(
- AuthenticationResponse::newAbstain(),
- $provider->beginPrimaryAccountCreation( $user, $user, $reqs )
- );
-
- $req->username = 'foo';
- $req->password = 'bar';
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
- ->will( $this->returnValue( true ) );
- $plugin->expects( $this->once() )->method( 'addUser' )
- ->with(
- $this->callback( function ( $u ) {
- return $u instanceof \User && $u->getName() === 'Foo';
- } ),
- $this->equalTo( 'bar' ),
- $this->equalTo( 'email' ),
- $this->equalTo( 'realname' )
- )
- ->will( $this->returnValue( true ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $this->assertEquals(
- AuthenticationResponse::newPass(),
- $provider->beginPrimaryAccountCreation( $user, $user, $reqs )
- );
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
- $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
- ->will( $this->returnValue( true ) );
- $plugin->expects( $this->once() )->method( 'addUser' )
- ->with(
- $this->callback( function ( $u ) {
- return $u instanceof \User && $u->getName() === 'Foo';
- } ),
- $this->equalTo( 'bar' ),
- $this->equalTo( 'email' ),
- $this->equalTo( 'realname' )
- )
- ->will( $this->returnValue( false ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- $ret = $provider->beginPrimaryAccountCreation( $user, $user, $reqs );
- $this->assertSame( AuthenticationResponse::FAIL, $ret->status );
- $this->assertSame( 'authmanager-authplugin-create-fail', $ret->message->getKey() );
-
- $plugin = $this->createMock( \AuthPlugin::class );
- $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
- ->will( $this->returnValue( true ) );
- $plugin->expects( $this->any() )->method( 'domainList' )
- ->will( $this->returnValue( [ 'Domain1', 'Domain2' ] ) );
- $plugin->expects( $this->any() )->method( 'validDomain' )
- ->will( $this->returnCallback( function ( $domain ) {
- return in_array( $domain, [ 'Domain1', 'Domain2' ] );
- } ) );
- $plugin->expects( $this->once() )->method( 'setDomain' )
- ->with( $this->equalTo( 'Domain2' ) );
- $plugin->expects( $this->once() )->method( 'addUser' )
- ->with( $this->callback( function ( $u ) {
- return $u instanceof \User && $u->getName() === 'Foo';
- } ), $this->equalTo( 'bar' ) )
- ->will( $this->returnValue( true ) );
- $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
- list( $req ) = $provider->getAuthenticationRequests( AuthManager::ACTION_CREATE, [] );
- $req->username = 'foo';
- $req->password = 'bar';
- $req->domain = 'Domain2';
- $provider->beginPrimaryAccountCreation( $user, $user, [ $req ] );
- }
-
-}
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
protected function getClass() {
return NamespaceRestriction::class;
}
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
protected function getClass() {
return PageRestriction::class;
// HACK if we call $dbr->buildGroupConcatField() now, it will return the wrong table names
// We have to have the test runner call it instead
$baseConcats = [ ',', [ 'change_tag', 'change_tag_def' ], 'ctd_name' ];
- $joinConds = [ 'change_tag_def' => [ 'INNER JOIN', 'ct_tag_id=ctd_id' ] ];
+ $joinConds = [ 'change_tag_def' => [ 'JOIN', 'ct_tag_id=ctd_id' ] ];
$groupConcats = [
'recentchanges' => array_merge( $baseConcats, [ 'ct_rc_id=rc_id', $joinConds ] ),
'logging' => array_merge( $baseConcats, [ 'ct_log_id=log_id', $joinConds ] ),
'tables' => [ 'recentchanges', 'change_tag' ],
'fields' => [ 'rc_id', 'rc_timestamp', 'ts_tags' => $groupConcats['recentchanges'] ],
'conds' => [ "rc_timestamp > '20170714183203'", 'ct_tag_id' => [ 1 ] ],
- 'join_conds' => [ 'change_tag' => [ 'INNER JOIN', 'ct_rc_id=rc_id' ] ],
+ 'join_conds' => [ 'change_tag' => [ 'JOIN', 'ct_rc_id=rc_id' ] ],
'options' => [ 'ORDER BY' => 'rc_timestamp DESC' ],
]
],
'tables' => [ 'logging', 'change_tag' ],
'fields' => [ 'log_id', 'ts_tags' => $groupConcats['logging'] ],
'conds' => [ "log_timestamp > '20170714183203'", 'ct_tag_id' => [ 1 ] ],
- 'join_conds' => [ 'change_tag' => [ 'INNER JOIN', 'ct_log_id=log_id' ] ],
+ 'join_conds' => [ 'change_tag' => [ 'JOIN', 'ct_log_id=log_id' ] ],
'options' => [ 'ORDER BY log_timestamp DESC' ],
]
],
'tables' => [ 'revision', 'change_tag' ],
'fields' => [ 'rev_id', 'rev_timestamp', 'ts_tags' => $groupConcats['revision'] ],
'conds' => [ "rev_timestamp > '20170714183203'", 'ct_tag_id' => [ 1 ] ],
- 'join_conds' => [ 'change_tag' => [ 'INNER JOIN', 'ct_rev_id=rev_id' ] ],
+ 'join_conds' => [ 'change_tag' => [ 'JOIN', 'ct_rev_id=rev_id' ] ],
'options' => [ 'ORDER BY' => 'rev_timestamp DESC' ],
]
],
'tables' => [ 'archive', 'change_tag' ],
'fields' => [ 'ar_id', 'ar_timestamp', 'ts_tags' => $groupConcats['archive'] ],
'conds' => [ "ar_timestamp > '20170714183203'", 'ct_tag_id' => [ 1 ] ],
- 'join_conds' => [ 'change_tag' => [ 'INNER JOIN', 'ct_rev_id=ar_rev_id' ] ],
+ 'join_conds' => [ 'change_tag' => [ 'JOIN', 'ct_rev_id=ar_rev_id' ] ],
'options' => [ 'ORDER BY' => 'ar_timestamp DESC' ],
]
],
'tables' => [ 'recentchanges', 'change_tag' ],
'fields' => [ 'rc_id', 'rc_timestamp', 'ts_tags' => $groupConcats['recentchanges'] ],
'conds' => [ "rc_timestamp > '20170714183203'", 'ct_tag_id' => [ 1, 2 ] ],
- 'join_conds' => [ 'change_tag' => [ 'INNER JOIN', 'ct_rc_id=rc_id' ] ],
+ 'join_conds' => [ 'change_tag' => [ 'JOIN', 'ct_rc_id=rc_id' ] ],
'options' => [ 'ORDER BY' => 'rc_timestamp DESC', 'DISTINCT' ],
]
],
'tables' => [ 'recentchanges', 'change_tag' ],
'fields' => [ 'rc_id', 'rc_timestamp', 'ts_tags' => $groupConcats['recentchanges'] ],
'conds' => [ "rc_timestamp > '20170714183203'", 'ct_tag_id' => [ 1, 2 ] ],
- 'join_conds' => [ 'change_tag' => [ 'INNER JOIN', 'ct_rc_id=rc_id' ] ],
+ 'join_conds' => [ 'change_tag' => [ 'JOIN', 'ct_rc_id=rc_id' ] ],
'options' => [ 'DISTINCT', 'ORDER BY' => 'rc_timestamp DESC' ],
]
],
'tables' => [ 'recentchanges', 'change_tag' ],
'fields' => [ 'rc_id', 'ts_tags' => $groupConcats['recentchanges'] ],
'conds' => [ "rc_timestamp > '20170714183203'", 'ct_tag_id' => [ 1, 2 ] ],
- 'join_conds' => [ 'change_tag' => [ 'INNER JOIN', 'ct_rc_id=rc_id' ] ],
+ 'join_conds' => [ 'change_tag' => [ 'JOIN', 'ct_rc_id=rc_id' ] ],
'options' => [ 'ORDER BY rc_timestamp DESC', 'DISTINCT' ],
]
],
'{"file":"db1023-bin.001288","pos":"308257743","asOfTime":' .
// Embed dynamically because TestSetup sets serialize_precision=17
// which, in PHP 7.1 and 7.2, produces 1457521464.3814001 instead
- json_encode( 1457521464.3814 ) . '} ' . 'triggeredRecursive=1 ' .
+ json_encode( 1457521464.3814 ) . '} triggeredRecursive=1 ' .
$requestId
],
];
}
public function testProcessCache() {
+ $mockWallClock = 1549343530.2053;
+ $this->cache->setMockTime( $mockWallClock );
+
$hit = 0;
$callback = function () use ( &$hit ) {
++$hit;
$this->assertEquals( 6, $hit, "New values cached" );
foreach ( $keys as $i => $key ) {
+ // Should evict from process cache
$this->cache->delete( $key );
+ $mockWallClock += 0.001; // cached values will be newer than tombstone
+ // Get into cache (specific process cache group)
$this->cache->getWithSetCallback(
$key, 100, $callback, [ 'pcTTL' => 5, 'pcGroup' => $groups[$i] ] );
}
- $this->assertEquals( 9, $hit, "Values evicted" );
+ $this->assertEquals( 9, $hit, "Values evicted by delete()" );
- $key = reset( $keys );
// Get into cache (default process cache group)
+ $key = reset( $keys );
+ $this->cache->getWithSetCallback( $key, 100, $callback, [ 'pcTTL' => 5 ] );
+ $this->assertEquals( 9, $hit, "Value recently interim-cached" );
+
+ $mockWallClock += 0.2; // interim key not brand new
+ $this->cache->clearProcessCache();
$this->cache->getWithSetCallback( $key, 100, $callback, [ 'pcTTL' => 5 ] );
- $this->assertEquals( 10, $hit, "Value calculated" );
+ $this->assertEquals( 10, $hit, "Value calculated (interim key not recent and reset)" );
$this->cache->getWithSetCallback( $key, 100, $callback, [ 'pcTTL' => 5 ] );
- $this->assertEquals( 10, $hit, "Value cached" );
+ $this->assertEquals( 10, $hit, "Value process cached" );
+
+ $mockWallClock += 0.2; // interim key not brand new
$outerCallback = function () use ( &$callback, $key ) {
$v = $this->cache->getWithSetCallback( $key, 100, $callback, [ 'pcTTL' => 5 ] );
$t2 = $cache->getCheckKeyTime( $cKey2 );
$this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check keys generated on miss' );
- $mockWallClock += 0.01;
+ $mockWallClock += 0.2; // interim key is not brand new and check keys have past values
$priorTime = $mockWallClock; // reference time
$wasSet = 0;
$v = $cache->getWithSetCallback(
return $value;
};
- $cache = new NearExpiringWANObjectCache( [
- 'cache' => new HashBagOStuff()
- ] );
+ $cache = new NearExpiringWANObjectCache( [ 'cache' => new HashBagOStuff() ] );
+ $mockWallClock = 1549343530.2053;
+ $cache->setMockTime( $mockWallClock );
$wasSet = 0;
$key = wfRandomString();
$v = $cache->getWithSetCallback( $key, 20, $func, $opts );
$this->assertEquals( $value, $v, "Value returned" );
$this->assertEquals( 1, $wasSet, "Value calculated" );
+
+ $mockWallClock += 0.2; // interim key is not brand new
$v = $cache->getWithSetCallback( $key, 20, $func, $opts );
$this->assertEquals( 2, $wasSet, "Value re-calculated" );
$key = wfRandomString();
$value = wfRandomString();
+ $mockWallClock = 1549343530.2053;
+ $cache->setMockTime( $mockWallClock );
+
$calls = 0;
$func = function () use ( &$calls, $value, $cache, $key ) {
++$calls;
$this->assertEquals( 1, $calls, 'Callback was not used' );
$cache->delete( $key );
+ $mockWallClock += 0.001; // cached values will be newer than tombstone
$ret = $cache->getWithSetCallback( $key, 30, $func,
[ 'lockTSE' => 5, 'checkKeys' => $checkKeys ] );
$this->assertEquals( $value, $ret, 'Callback was used; interim saved' );
public function testLockTSESlow() {
$cache = $this->cache;
$key = wfRandomString();
+ $key2 = wfRandomString();
$value = wfRandomString();
+ $mockWallClock = 1549343530.2053;
+ $cache->setMockTime( $mockWallClock );
+
$calls = 0;
- $func = function ( $oldValue, &$ttl, &$setOpts ) use ( &$calls, $value, $cache, $key ) {
+ $func = function ( $oldValue, &$ttl, &$setOpts ) use ( &$calls, $value, &$mockWallClock ) {
++$calls;
- $setOpts['since'] = microtime( true ) - 10;
- // Immediately kill any mutex rather than waiting a second
- $cache->delete( $cache::MUTEX_KEY_PREFIX . $key );
+ $setOpts['since'] = $mockWallClock - 10;
return $value;
};
- // Value should be marked as stale due to snapshot lag
+ // Value should be given a low logical TTL due to snapshot lag
$curTTL = null;
- $ret = $cache->getWithSetCallback( $key, 30, $func, [ 'lockTSE' => 5 ] );
+ $ret = $cache->getWithSetCallback( $key, 300, $func, [ 'lockTSE' => 5 ] );
$this->assertEquals( $value, $ret );
$this->assertEquals( $value, $cache->get( $key, $curTTL ), 'Value was populated' );
- $this->assertLessThan( 0, $curTTL, 'Value has negative curTTL' );
+ $this->assertEquals( 1, $curTTL, 'Value has reduced logical TTL', 0.01 );
$this->assertEquals( 1, $calls, 'Value was generated' );
+ $mockWallClock += 2; // low logical TTL expired
+
+ $ret = $cache->getWithSetCallback( $key, 300, $func, [ 'lockTSE' => 5 ] );
+ $this->assertEquals( $value, $ret );
+ $this->assertEquals( 2, $calls, 'Callback used (mutex acquired)' );
+
+ $ret = $cache->getWithSetCallback( $key, 300, $func, [ 'lockTSE' => 5 ] );
+ $this->assertEquals( $value, $ret );
+ $this->assertEquals( 2, $calls, 'Callback was not used (interim value used)' );
+
+ $mockWallClock += 2; // low logical TTL expired
// Acquire a lock to verify that getWithSetCallback uses lockTSE properly
$this->internalCache->add( $cache::MUTEX_KEY_PREFIX . $key, 1, 0 );
- $ret = $cache->getWithSetCallback( $key, 30, $func, [ 'lockTSE' => 5 ] );
+
+ $ret = $cache->getWithSetCallback( $key, 300, $func, [ 'lockTSE' => 5 ] );
$this->assertEquals( $value, $ret );
- $this->assertEquals( 1, $calls, 'Callback was not used' );
+ $this->assertEquals( 2, $calls, 'Callback was not used (mutex not acquired)' );
+
+ $mockWallClock += 301; // physical TTL expired
+ // Acquire a lock to verify that getWithSetCallback uses lockTSE properly
+ $this->internalCache->add( $cache::MUTEX_KEY_PREFIX . $key, 1, 0 );
+
+ $ret = $cache->getWithSetCallback( $key, 300, $func, [ 'lockTSE' => 5 ] );
+ $this->assertEquals( $value, $ret );
+ $this->assertEquals( 3, $calls, 'Callback was used (mutex not acquired, not in cache)' );
+
+ $calls = 0;
+ $func2 = function ( $oldValue, &$ttl, &$setOpts ) use ( &$calls, $value ) {
+ ++$calls;
+ $setOpts['lag'] = 15;
+ return $value;
+ };
+
+ // Value should be given a low logical TTL due to replication lag
+ $curTTL = null;
+ $ret = $cache->getWithSetCallback( $key2, 300, $func2, [ 'lockTSE' => 5 ] );
+ $this->assertEquals( $value, $ret );
+ $this->assertEquals( $value, $cache->get( $key2, $curTTL ), 'Value was populated' );
+ $this->assertEquals( 30, $curTTL, 'Value has reduced logical TTL', 0.01 );
+ $this->assertEquals( 1, $calls, 'Value was generated' );
+
+ $ret = $cache->getWithSetCallback( $key2, 300, $func2, [ 'lockTSE' => 5 ] );
+ $this->assertEquals( $value, $ret );
+ $this->assertEquals( 1, $calls, 'Callback was used (not expired)' );
+
+ $mockWallClock += 31;
+
+ $ret = $cache->getWithSetCallback( $key2, 300, $func2, [ 'lockTSE' => 5 ] );
+ $this->assertEquals( $value, $ret );
+ $this->assertEquals( 2, $calls, 'Callback was used (mutex acquired)' );
}
/**
$value = wfRandomString();
$busyValue = wfRandomString();
+ $mockWallClock = 1549343530.2053;
+ $cache->setMockTime( $mockWallClock );
+
$calls = 0;
$func = function () use ( &$calls, $value, $cache, $key ) {
++$calls;
- // Immediately kill any mutex rather than waiting a second
- $cache->delete( $cache::MUTEX_KEY_PREFIX . $key );
return $value;
};
$this->assertEquals( $value, $ret );
$this->assertEquals( 1, $calls, 'Value was populated' );
+ $mockWallClock += 0.2; // interim keys not brand new
+
// Acquire a lock to verify that getWithSetCallback uses busyValue properly
$this->internalCache->add( $cache::MUTEX_KEY_PREFIX . $key, 1, 0 );
$this->assertEquals( 2, $calls, 'Callback was not used; used busy value' );
$this->internalCache->delete( $cache::MUTEX_KEY_PREFIX . $key );
+ $mockWallClock += 0.001; // cached values will be newer than tombstone
$ret = $cache->getWithSetCallback( $key, 30, $func,
[ 'lockTSE' => 30, 'busyValue' => $busyValue, 'checkKeys' => $checkKeys ] );
$this->assertEquals( $value, $ret, 'Callback was used; saved interim' );
public function testInterimHoldOffCaching() {
$cache = $this->cache;
+ $mockWallClock = 1549343530.2053;
+ $cache->setMockTime( $mockWallClock );
+
$value = 'CRL-40-940';
$wasCalled = 0;
$func = function () use ( &$wasCalled, $value ) {
$v = $cache->getWithSetCallback( $key, 60, $func );
$v = $cache->getWithSetCallback( $key, 60, $func );
$this->assertEquals( 1, $wasCalled, 'Value cached' );
+
$cache->delete( $key );
+ $mockWallClock += 0.001; // cached values will be newer than tombstone
$v = $cache->getWithSetCallback( $key, 60, $func );
$this->assertEquals( 2, $wasCalled, 'Value regenerated (got mutex)' ); // sets interim
$v = $cache->getWithSetCallback( $key, 60, $func );
+ $this->assertEquals( 2, $wasCalled, 'Value interim cached' ); // reuses interim
+
+ $mockWallClock += 0.2; // interim key not brand new
+ $v = $cache->getWithSetCallback( $key, 60, $func );
$this->assertEquals( 3, $wasCalled, 'Value regenerated (got mutex)' ); // sets interim
// Lock up the mutex so interim cache is used
$this->internalCache->add( $cache::MUTEX_KEY_PREFIX . $key, 1, 0 );
} catch ( DBUnexpectedError $ex ) {
$this->assertSame(
'Invalid atomic section ended (got ' . __METHOD__ . ' but expected ' .
- __METHOD__ . 'X' . ').',
+ __METHOD__ . 'X).',
$ex->getMessage()
);
}
);
$innerFactory->expects( $this->once() )
->method( $method )
- ->with( 'testprefix.' . 'metricname' );
+ ->with( 'testprefix.metricname' );
$proxy = new PrefixingStatsdDataFactoryProxy( $innerFactory, 'testprefix' );
// 1,2,3,4 simply makes sure we provide enough parameters, without caring what they are
);
$innerFactory->expects( $this->once() )
->method( $method )
- ->with( 'testprefix.' . 'metricname' );
+ ->with( 'testprefix.metricname' );
$proxy = new PrefixingStatsdDataFactoryProxy( $innerFactory, 'testprefix...' );
// 1,2,3,4 simply makes sure we provide enough parameters, without caring what they are
// Query added
$this->assertEquals(
- '<a href="/w/index.php?title=Foobar&foo=bar" ' . 'title="Foobar">Foobar</a>',
+ '<a href="/w/index.php?title=Foobar&foo=bar" title="Foobar">Foobar</a>',
$linkRenderer->makeKnownLink( $target, null, [], [ 'foo' => 'bar' ] )
);
- // forcearticlepath
$linkRenderer->setForceArticlePath( true );
$this->assertEquals(
'<a href="/wiki/Foobar?foo=bar" title="Foobar">Foobar</a>',
],
],
[
- 'text' => 'User uploaded File:File.png',
+ 'text' => 'User reverted File:File.png to an old version',
'api' => [
'img_sha1' => 'hash',
'img_timestamp' => '2015-01-01T00:00:00Z',
'params' => [],
],
[
- 'text' => 'User uploaded File:File.png',
+ 'text' => 'User reverted File:File.png to an old version',
'api' => [],
],
],
$a->addHeadItem( '<foo1>' );
$a->addHeadItem( '<bar1>', 'bar' );
$a->addModules( 'test-module-a' );
- $a->addModuleScripts( 'test-module-script-a' );
$a->addModuleStyles( 'test-module-styles-a' );
$b->addJsConfigVars( 'test-config-var-a', 'a' );
$b->addHeadItem( '<foo2>' );
$b->addHeadItem( '<bar2>', 'bar' );
$b->addModules( 'test-module-b' );
- $b->addModuleScripts( 'test-module-script-b' );
$b->addModuleStyles( 'test-module-styles-b' );
$b->addJsConfigVars( 'test-config-var-b', 'b' );
$b->addJsConfigVars( 'test-config-var-a', 'X' );
'test-module-a',
'test-module-b',
],
- 'getModuleScripts' => [
- 'test-module-script-a',
- 'test-module-script-b',
- ],
'getModuleStyles' => [
'test-module-styles-a',
'test-module-styles-b',
* @covers ResourceLoaderClientHtml::__construct
* @covers ResourceLoaderClientHtml::setModules
* @covers ResourceLoaderClientHtml::setModuleStyles
- * @covers ResourceLoaderClientHtml::setModuleScripts
* @covers ResourceLoaderClientHtml::getData
* @covers ResourceLoaderClientHtml::getContext
*/
'test.styles.deprecated',
'test.unregistered.styles',
] );
- $client->setModuleScripts( [
- 'test.scripts',
- 'test.scripts.user',
- 'test.scripts.user.empty',
- 'test.scripts.shouldembed',
- 'test.unregistered.scripts',
- ] );
$expected = [
'states' => [
'test.styles.private' => 'ready',
'test.styles.shouldembed' => 'ready',
'test.styles.deprecated' => 'ready',
- 'test.scripts' => 'loading',
- 'test.scripts.user' => 'loading',
- 'test.scripts.user.empty' => 'ready',
- 'test.scripts.shouldembed' => 'loading',
],
'general' => [
'test',
'test.styles.pure',
'test.styles.deprecated',
],
- 'scripts' => [
- 'test.scripts',
- 'test.scripts.user',
- 'test.scripts.shouldembed',
- ],
'embed' => [
'styles' => [ 'test.styles.private', 'test.styles.shouldembed' ],
'general' => [
'test.styles.private',
'test.styles.deprecated',
] );
- $client->setModuleScripts( [
- 'test.scripts',
- ] );
$client->setExemptStates( [
'test.exempt' => 'ready',
] );
$expected = '<script>document.documentElement.className = document.documentElement.className.replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );</script>' . "\n"
. '<script>(window.RLQ=window.RLQ||[]).push(function(){'
. 'mw.config.set({"key":"value"});'
- . 'mw.loader.state({"test.exempt":"ready","test.private":"loading","test.styles.pure":"ready","test.styles.private":"ready","test.styles.deprecated":"ready","test.scripts":"loading"});'
+ . 'mw.loader.state({"test.exempt":"ready","test.private":"loading","test.styles.pure":"ready","test.styles.private":"ready","test.styles.deprecated":"ready"});'
. 'mw.loader.implement("test.private@{blankVer}",null,{"css":[]});'
. 'RLPAGEMODULES=["test"];mw.loader.load(RLPAGEMODULES);'
- . 'mw.loader.load("/w/load.php?debug=false\u0026lang=nl\u0026modules=test.scripts\u0026only=scripts\u0026skin=fallback");'
. '});</script>' . "\n"
. '<link rel="stylesheet" href="/w/load.php?debug=false&lang=nl&modules=test.styles.deprecated%2Cpure&only=styles&skin=fallback"/>' . "\n"
. '<style>.private{}</style>' . "\n"
$client->setModuleStyles( [
'test.styles.deprecated',
] );
- $client->setModuleScripts( [
- 'test.scripts',
- ] );
// phpcs:disable Generic.Files.LineLength
$expected = '<script>(window.RLQ=window.RLQ||[]).push(function(){'
. 'mw.log.warn("This page is using the deprecated ResourceLoader module \"test.styles.deprecated\".\nDeprecation message.");'
--- /dev/null
+<?php
+/**
+ * Factory for handling the special page list and generating SpecialPage objects.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @group SpecialPage
+ */
+abstract class FormSpecialPageTestCase extends SpecialPageTestBase {
+
+ /**
+ * @covers FormSpecialPage::checkExecutePermissions
+ */
+ public function testCheckExecutePermissionsSitewideBlock() {
+ $special = $this->newSpecialPage();
+ $checkExecutePermissions = $this->getMethod( $special, 'checkExecutePermissions' );
+
+ $user = clone $this->getTestUser()->getUser();
+ $user->mBlockedby = $user->getName();
+ $user->mBlock = new Block( [
+ 'address' => '127.0.8.1',
+ 'by' => $user->getId(),
+ 'reason' => 'sitewide block',
+ 'timestamp' => time(),
+ 'sitewide' => true,
+ 'expiry' => 10,
+ ] );
+
+ $this->expectException( UserBlockedError::class );
+ $checkExecutePermissions( $user );
+ }
+
+ /**
+ * @covers FormSpecialPage::checkExecutePermissions
+ */
+ public function testCheckExecutePermissionsPartialBlock() {
+ $special = $this->newSpecialPage();
+ $checkExecutePermissions = $this->getMethod( $special, 'checkExecutePermissions' );
+
+ $user = clone $this->getTestUser()->getUser();
+ $user->mBlockedby = $user->getName();
+ $user->mBlock = new Block( [
+ 'address' => '127.0.8.1',
+ 'by' => $user->getId(),
+ 'reason' => 'partial block',
+ 'timestamp' => time(),
+ 'sitewide' => false,
+ 'expiry' => 10,
+ ] );
+
+ $this->assertNull( $checkExecutePermissions( $user ) );
+ }
+
+ /**
+ * Get a protected/private method.
+ *
+ * @param object $obj
+ * @param string $name
+ * @return callable
+ */
+ protected function getMethod( $obj, $name ) {
+ $method = new ReflectionMethod( $obj, $name );
+ $method->setAccessible( true );
+ return $method->getClosure( $obj );
+ }
+}
*/
class SpecialBlockTest extends SpecialPageTestBase {
/**
- * {@inheritdoc}
+ * @inheritDoc
*/
protected function newSpecialPage() {
return new SpecialBlock();
--- /dev/null
+<?php
+
+class SpecialPasswordResetTest extends FormSpecialPageTestCase {
+ /**
+ * {@inheritdoc}
+ */
+ protected function newSpecialPage() {
+ return new SpecialPasswordReset();
+ }
+}
] );
// 1. Log in a test user, and block them.
- $userBlocker = $this->getTestSysop()->getUser();
$user1tmp = $this->getTestUser()->getUser();
$request1 = new FauxRequest();
$request1->getSession()->setUser( $user1tmp );
] );
$block->setBlocker( $this->getTestSysop()->getUser() );
$block->setTarget( $user1tmp );
- $block->setBlocker( $userBlocker );
$res = $block->insert();
$this->assertTrue( (bool)$res['id'], 'Failed to insert block' );
$user1 = User::newFromSession( $request1 );
] );
// 1. Log in a test user, and block them.
- $userBlocker = $this->getTestSysop()->getUser();
$testUser = $this->getTestUser()->getUser();
$request1 = new FauxRequest();
$request1->getSession()->setUser( $testUser );
$block = new Block( [ 'enableAutoblock' => true ] );
$block->setBlocker( $this->getTestSysop()->getUser() );
$block->setTarget( $testUser );
- $block->setBlocker( $userBlocker );
$res = $block->insert();
$this->assertTrue( (bool)$res['id'], 'Failed to insert block' );
$user = User::newFromSession( $request1 );
] );
// 1. Log in a test user, and block them indefinitely.
- $userBlocker = $this->getTestSysop()->getUser();
$user1Tmp = $this->getTestUser()->getUser();
$request1 = new FauxRequest();
$request1->getSession()->setUser( $user1Tmp );
$block = new Block( [ 'enableAutoblock' => true, 'expiry' => 'infinity' ] );
$block->setBlocker( $this->getTestSysop()->getUser() );
$block->setTarget( $user1Tmp );
- $block->setBlocker( $userBlocker );
$res = $block->insert();
$this->assertTrue( (bool)$res['id'], 'Failed to insert block' );
$user1 = User::newFromSession( $request1 );
] );
// 1. Log in a blocked test user.
- $userBlocker = $this->getTestSysop()->getUser();
$user1tmp = $this->getTestUser()->getUser();
$request1 = new FauxRequest();
$request1->getSession()->setUser( $user1tmp );
$block = new Block( [ 'enableAutoblock' => true ] );
$block->setBlocker( $this->getTestSysop()->getUser() );
$block->setTarget( $user1tmp );
- $block->setBlocker( $userBlocker );
$res = $block->insert();
$this->assertTrue( (bool)$res['id'], 'Failed to insert block' );
$user1 = User::newFromSession( $request1 );
] );
// 1. Log in a blocked test user.
- $userBlocker = $this->getTestSysop()->getUser();
$user1tmp = $this->getTestUser()->getUser();
$request1 = new FauxRequest();
$request1->getSession()->setUser( $user1tmp );
$block = new Block( [ 'enableAutoblock' => true ] );
$block->setBlocker( $this->getTestSysop()->getUser() );
$block->setTarget( $user1tmp );
- $block->setBlocker( $userBlocker );
$res = $block->insert();
$this->assertTrue( (bool)$res['id'], 'Failed to insert block' );
$user1 = User::newFromSession( $request1 );
],
[
'watchlist' => [
- 'INNER JOIN',
+ 'JOIN',
[
'wl_namespace=rc_namespace',
'wl_title=rc_title'
],
[
'watchlist' => [
- 'INNER JOIN',
+ 'JOIN',
[
'wl_namespace=rc_namespace',
'wl_title=rc_title'
$expectedJoinConds = array_merge(
[
'watchlist' => [
- 'INNER JOIN',
+ 'JOIN',
[
'wl_namespace=rc_namespace',
'wl_title=rc_title'
$this->isType( 'string' ),
$this->isType( 'array' ),
array_merge( [
- 'watchlist' => [ 'INNER JOIN', [ 'wl_namespace=rc_namespace', 'wl_title=rc_title' ] ],
+ 'watchlist' => [ 'JOIN', [ 'wl_namespace=rc_namespace', 'wl_title=rc_title' ] ],
'page' => [ 'LEFT JOIN', 'rc_cur_id=page_id' ],
], $expectedExtraJoins )
)
[],
[
'watchlist' => [
- 'INNER JOIN',
+ 'JOIN',
[
'wl_namespace=rc_namespace',
'wl_title=rc_title'
[],
[
'watchlist' => [
- 'INNER JOIN',
+ 'JOIN',
[
'wl_namespace=rc_namespace',
'wl_title=rc_title'
[],
[
'watchlist' => [
- 'INNER JOIN',
+ 'JOIN',
[
'wl_namespace=rc_namespace',
'wl_title=rc_title'
--- /dev/null
+<?php
+
+/**
+ * @coversNothing
+ */
+class PasswordPolicyStructureTest extends MediaWikiTestCase {
+
+ public function provideChecks() {
+ global $wgPasswordPolicy;
+
+ foreach ( $wgPasswordPolicy['checks'] as $name => $callback ) {
+ yield [ $name ];
+ }
+ }
+
+ public function provideFlags() {
+ global $wgPasswordPolicy;
+
+ // This won't actually find all flags, just the ones in use. Can't really be helped,
+ // other than adding the core flags here.
+ $flags = [ 'forceChange' ];
+ foreach ( $wgPasswordPolicy['policies'] as $group => $checks ) {
+ foreach ( $checks as $check => $settings ) {
+ if ( is_array( $settings ) ) {
+ $flags = array_merge( $flags, array_diff( $settings, [ 'value' ] ) );
+ }
+ }
+ }
+ foreach ( $flags as $flag ) {
+ yield [ $flag ];
+ }
+ }
+
+ /** @dataProvider provideChecks */
+ public function testCheckMessage( $check ) {
+ $msg = wfMessage( 'passwordpolicies-policy-' . strtolower( $check ) );
+ $this->assertTrue( $msg->exists() );
+ }
+
+ /** @dataProvider provideFlags */
+ public function testFlagMessage( $flag ) {
+ $msg = wfMessage( 'passwordpolicies-policyflag-' . strtolower( $flag ) );
+ $this->assertTrue( $msg->exists() );
+ }
+
+}
'tests/qunit/suites/resources/jquery/jquery.color.test.js',
'tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js',
'tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js',
- 'tests/qunit/suites/resources/jquery/jquery.hidpi.test.js',
'tests/qunit/suites/resources/jquery/jquery.highlightText.test.js',
'tests/qunit/suites/resources/jquery/jquery.lengthLimit.test.js',
'tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js',
'jquery.color',
'jquery.colorUtil',
'jquery.getAttrs',
- 'jquery.hidpi',
'jquery.highlightText',
'jquery.lengthLimit',
'jquery.makeCollapsible',
--- /dev/null
+mw.getScriptExampleScriptLoaded = true;
+++ /dev/null
-( function () {
- QUnit.module( 'jquery.hidpi', QUnit.newMwEnvironment() );
-
- QUnit.test( 'devicePixelRatio', function ( assert ) {
- var devicePixelRatio = $.devicePixelRatio();
- assert.strictEqual( typeof devicePixelRatio, 'number', '$.devicePixelRatio() returns a number' );
- } );
-
- QUnit.test( 'bracketedDevicePixelRatio', function ( assert ) {
- var ratio = $.bracketedDevicePixelRatio();
- assert.strictEqual( typeof ratio, 'number', '$.bracketedDevicePixelRatio() returns a number' );
- } );
-
- QUnit.test( 'bracketDevicePixelRatio', function ( assert ) {
- assert.strictEqual( $.bracketDevicePixelRatio( 0.75 ), 1, '0.75 gives 1' );
- assert.strictEqual( $.bracketDevicePixelRatio( 1 ), 1, '1 gives 1' );
- assert.strictEqual( $.bracketDevicePixelRatio( 1.25 ), 1.5, '1.25 gives 1.5' );
- assert.strictEqual( $.bracketDevicePixelRatio( 1.5 ), 1.5, '1.5 gives 1.5' );
- assert.strictEqual( $.bracketDevicePixelRatio( 1.75 ), 2, '1.75 gives 2' );
- assert.strictEqual( $.bracketDevicePixelRatio( 2 ), 2, '2 gives 2' );
- assert.strictEqual( $.bracketDevicePixelRatio( 2.5 ), 2, '2.5 gives 2' );
- assert.strictEqual( $.bracketDevicePixelRatio( 3 ), 2, '3 gives 2' );
- } );
-
- QUnit.test( 'matchSrcSet', function ( assert ) {
- var srcset = 'onefive.png 1.5x, two.png 2x';
-
- // Nice exact matches
- assert.strictEqual( $.matchSrcSet( 1, srcset ), null, '1.0 gives no match' );
- assert.strictEqual( $.matchSrcSet( 1.5, srcset ), 'onefive.png', '1.5 gives match' );
- assert.strictEqual( $.matchSrcSet( 2, srcset ), 'two.png', '2 gives match' );
-
- // Non-exact matches; should return the next-biggest specified
- assert.strictEqual( $.matchSrcSet( 1.25, srcset ), null, '1.25 gives no match' );
- assert.strictEqual( $.matchSrcSet( 1.75, srcset ), 'onefive.png', '1.75 gives match to 1.5' );
- assert.strictEqual( $.matchSrcSet( 2.25, srcset ), 'two.png', '2.25 gives match to 2' );
- } );
-}() );
// TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
- QUnit.test( '"all" namespace disable checkboxes', function ( assert ) {
+ QUnit.test( '"all" namespace hides checkboxes', function ( assert ) {
var selectHtml, $env, $options,
rc = require( 'mediawiki.special.recentchanges' );
+ '<option value="4">ProjectName</option>'
+ '<option value="5">ProjectName talk</option>'
+ '</select>'
+ + '<span class="mw-input-with-label mw-input-hidden">'
+ '<input name="invert" type="checkbox" value="1" id="nsinvert" title="no title" />'
+ '<label for="nsinvert" title="no title">Invert selection</label>'
+ + '</span>'
+ + '<span class="mw-input-with-label mw-input-hidden">'
+ '<input name="associated" type="checkbox" value="1" id="nsassociated" title="no title" />'
+ '<label for="nsassociated" title="no title">Associated namespace</label>'
+ + '</span>'
+ '<input type="submit" value="Go" />'
+ '<input type="hidden" value="Special:RecentChanges" name="title" />';
// TODO abstract the double strictEquals
- // At first checkboxes are enabled
- assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), false );
- assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), false );
+ // At first checkboxes are hidden
+ assert.strictEqual( $( '#nsinvert' ).closest( '.mw-input-with-label' ).hasClass( 'mw-input-hidden' ), true );
+ assert.strictEqual( $( '#nsassociated' ).closest( '.mw-input-with-label' ).hasClass( 'mw-input-hidden' ), true );
// Initiate the recentchanges module
rc.init();
// By default
- assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), true );
- assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), true );
+ assert.strictEqual( $( '#nsinvert' ).closest( '.mw-input-with-label' ).hasClass( 'mw-input-hidden' ), true );
+ assert.strictEqual( $( '#nsassociated' ).closest( '.mw-input-with-label' ).hasClass( 'mw-input-hidden' ), true );
// select second option...
$options = $( '#namespace' ).find( 'option' );
$options.eq( 1 ).prop( 'selected', true );
$( '#namespace' ).trigger( 'change' );
- // ... and checkboxes should be enabled again
- assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), false );
- assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), false );
+ // ... and checkboxes should be visible again
+ assert.strictEqual( $( '#nsinvert' ).closest( '.mw-input-with-label' ).hasClass( 'mw-input-hidden' ), false );
+ assert.strictEqual( $( '#nsassociated' ).closest( '.mw-input-with-label' ).hasClass( 'mw-input-hidden' ), false );
// select first option ( 'all' namespace)...
$options.eq( 1 ).removeProp( 'selected' );
$options.eq( 0 ).prop( 'selected', true );
$( '#namespace' ).trigger( 'change' );
- // ... and checkboxes should now be disabled
- assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), true );
- assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), true );
+ // ... and checkboxes should now be hidden
+ assert.strictEqual( $( '#nsinvert' ).closest( '.mw-input-with-label' ).hasClass( 'mw-input-hidden' ), true );
+ assert.strictEqual( $( '#nsassociated' ).closest( '.mw-input-with-label' ).hasClass( 'mw-input-hidden' ), true );
// DOM cleanup
$env.remove();
};
},
teardown: function () {
+ mw.loader.maxQueryLength = 2000;
// Teardown for StringSet shim test
if ( this.nativeSet ) {
window.Set = this.nativeSet;
// exposed for cross-file mocks.
delete mw.loader.testCallback;
delete mw.loader.testFail;
+ delete mw.getScriptExampleScriptLoaded;
}
} ) );
[ 'testUrlIncDump', 'dump', [], null, 'testloader' ]
] );
- mw.config.set( 'wgResourceLoaderMaxQueryLength', 10 );
+ mw.loader.maxQueryLength = 10;
return mw.loader.using( [ 'testUrlIncDump', 'testUrlInc' ] ).then( function ( require ) {
assert.propEqual(
} );
} );
+ QUnit.test( '.getScript() - success', function ( assert ) {
+ var scriptUrl = QUnit.fixurl(
+ mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/mediawiki.loader.getScript.example.js'
+ );
+
+ return mw.loader.getScript( scriptUrl ).then(
+ function () {
+ assert.strictEqual( mw.getScriptExampleScriptLoaded, true, 'Data attached to a global object is available' );
+ }
+ );
+ } );
+
+ QUnit.test( '.getScript() - failure', function ( assert ) {
+ assert.rejects(
+ mw.loader.getScript( 'https://example.test/not-found' ),
+ /Failed to load script/,
+ 'Descriptive error message'
+ );
+ } );
+
}() );
*/
beforeTest: function ( test ) {
if ( process.env.DISPLAY && process.env.DISPLAY.startsWith( ':' ) ) {
+ var logBuffer;
let videoPath = filePath( test, logPath, 'mp4' );
const { spawn } = require( 'child_process' );
ffmpeg = spawn( 'ffmpeg', [
videoPath // output file
] );
+ logBuffer = function ( buffer, prefix ) {
+ let lines = buffer.toString().trim().split( '\n' );
+ lines.forEach( function ( line ) {
+ console.log( prefix + line );
+ } );
+ };
+
ffmpeg.stdout.on( 'data', ( data ) => {
- console.log( `ffmpeg stdout: ${data}` );
+ logBuffer( data, 'ffmpeg stdout: ' );
} );
ffmpeg.stderr.on( 'data', ( data ) => {
- console.log( `ffmpeg stderr: ${data}` );
+ logBuffer( data, 'ffmpeg stderr: ' );
} );
- ffmpeg.on( 'close', ( code ) => {
+ ffmpeg.on( 'close', ( code, signal ) => {
console.log( '\n\tVideo location:', videoPath, '\n' );
- console.log( `ffmpeg exited with code ${code}` );
+ if ( code !== null ) {
+ console.log( `\tffmpeg exited with code ${code} ${videoPath}` );
+ }
+ if ( signal !== null ) {
+ console.log( `\tffmpeg received signal ${signal} ${videoPath}` );
+ }
} );
}
},