<exclude-pattern>*/includes/RevisionList\.php</exclude-pattern>
<exclude-pattern>*/includes/installer/PhpBugTests\.php</exclude-pattern>
<exclude-pattern>*/includes/specials/SpecialMostinterwikis\.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/specials/SpecialAncientpages\.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/cache/CacheDependency\.php</exclude-pattern>
<exclude-pattern>*/includes/compat/XMPReader\.php</exclude-pattern>
<exclude-pattern>*/includes/diff/DairikiDiff\.php</exclude-pattern>
- <exclude-pattern>*/includes/diff/DiffEngine\.php</exclude-pattern>
<exclude-pattern>*/includes/Feed\.php</exclude-pattern>
<exclude-pattern>*/includes/filerepo/file/LocalFile\.php</exclude-pattern>
<exclude-pattern>*/includes/gallery/PackedOverlayImageGallery\.php</exclude-pattern>
* $wgEnablePartialBlocks – This enables the Partial Blocks feature, which gives
accounts with block permissions the ability to block users, IPs, and IP ranges
from editing specific pages, while allowing them to edit the rest of the wiki.
-* $wgMediaInTargetLanguage – whether multilingual images should be dispalyed in
- the current parse language where available.
==== Changed configuration ====
* Some external link searches will not work correctly until update.php (or
(requires PHP 7.2+) and GPU hacking (7.3+).
* Special:CreateAccount now warns the user if their chosen username has to be
normalized.
+* (T205040) Multilingual images are now be displayed in the current parse
+ language where available.
=== External library changes in 1.33 ===
* (T217772) The 'wgAvailableSkins' mw.config key in JavaScript, was removed.
* Language::markNoConversion, deprecated in 1.32, has been removed. Use
LanguageConverter::markNoConversion instead.
+* BagOStuff::modifySimpleRelayEvent() method has been removed.
=== Deprecations in 1.33 ===
* The configuration option $wgUseESI has been deprecated, and is expected
'BufferingStatsdDataFactory' => __DIR__ . '/includes/libs/stats/BufferingStatsdDataFactory.php',
'CLIParser' => __DIR__ . '/maintenance/parse.php',
'CSSMin' => __DIR__ . '/includes/libs/CSSMin.php',
- 'CacheDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
+ 'CacheDependency' => __DIR__ . '/includes/cache/dependency/CacheDependency.php',
'CacheHelper' => __DIR__ . '/includes/cache/CacheHelper.php',
'CacheTime' => __DIR__ . '/includes/parser/CacheTime.php',
'CachedAction' => __DIR__ . '/includes/actions/CachedAction.php',
'ConfigException' => __DIR__ . '/includes/config/ConfigException.php',
'ConfigFactory' => __DIR__ . '/includes/config/ConfigFactory.php',
'ConfiguredReadOnlyMode' => __DIR__ . '/includes/ConfiguredReadOnlyMode.php',
- 'ConstantDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
+ 'ConstantDependency' => __DIR__ . '/includes/cache/dependency/ConstantDependency.php',
'Content' => __DIR__ . '/includes/content/Content.php',
'ContentHandler' => __DIR__ . '/includes/content/ContentHandler.php',
'ContentModelLogFormatter' => __DIR__ . '/includes/logging/ContentModelLogFormatter.php',
'DeleteSelfExternals' => __DIR__ . '/maintenance/deleteSelfExternals.php',
'DeletedContribsPager' => __DIR__ . '/includes/specials/pagers/DeletedContribsPager.php',
'DeletedContributionsPage' => __DIR__ . '/includes/specials/SpecialDeletedContributions.php',
- 'DependencyWrapper' => __DIR__ . '/includes/cache/CacheDependency.php',
+ 'DependencyWrapper' => __DIR__ . '/includes/cache/dependency/DependencyWrapper.php',
'DeprecatedGlobal' => __DIR__ . '/includes/DeprecatedGlobal.php',
'DeprecatedInterfaceFinder' => __DIR__ . '/maintenance/findDeprecated.php',
'DeprecationHelper' => __DIR__ . '/includes/debug/DeprecationHelper.php',
'FileContentHandler' => __DIR__ . '/includes/content/FileContentHandler.php',
'FileContentsHasher' => __DIR__ . '/includes/utils/FileContentsHasher.php',
'FileDeleteForm' => __DIR__ . '/includes/FileDeleteForm.php',
- 'FileDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
+ 'FileDependency' => __DIR__ . '/includes/cache/dependency/FileDependency.php',
'FileDuplicateSearchPage' => __DIR__ . '/includes/specials/SpecialFileDuplicateSearch.php',
'FileJournal' => __DIR__ . '/includes/libs/filebackend/filejournal/FileJournal.php',
'FileOp' => __DIR__ . '/includes/libs/filebackend/fileop/FileOp.php',
'GetReplicaServer' => __DIR__ . '/maintenance/getReplicaServer.php',
'GetTextMaint' => __DIR__ . '/maintenance/getText.php',
'GitInfo' => __DIR__ . '/includes/GitInfo.php',
- 'GlobalDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
+ 'GlobalDependency' => __DIR__ . '/includes/cache/dependency/GlobalDependency.php',
'GlobalVarConfig' => __DIR__ . '/includes/config/GlobalVarConfig.php',
'GuzzleHttpRequest' => __DIR__ . '/includes/http/GuzzleHttpRequest.php',
'HHVMMakeRepo' => __DIR__ . '/maintenance/hhvm/makeRepo.php',
'MagicWordArray' => __DIR__ . '/includes/MagicWordArray.php',
'MagicWordFactory' => __DIR__ . '/includes/MagicWordFactory.php',
'MailAddress' => __DIR__ . '/includes/mail/MailAddress.php',
- 'MainConfigDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
+ 'MainConfigDependency' => __DIR__ . '/includes/cache/dependency/MainConfigDependency.php',
'MaintainableDBConnRef' => __DIR__ . '/includes/libs/rdbms/database/MaintainableDBConnRef.php',
'Maintenance' => __DIR__ . '/maintenance/Maintenance.php',
'MakeTestEdits' => __DIR__ . '/maintenance/makeTestEdits.php',
'RSSFeed' => __DIR__ . '/includes/Feed.php',
'RandomPage' => __DIR__ . '/includes/specials/SpecialRandompage.php',
'RangeChronologicalPager' => __DIR__ . '/includes/pager/RangeChronologicalPager.php',
- 'RangeDifference' => __DIR__ . '/includes/diff/DiffEngine.php',
+ 'RangeDifference' => __DIR__ . '/includes/diff/RangeDifference.php',
'RawAction' => __DIR__ . '/includes/actions/RawAction.php',
'RawMessage' => __DIR__ . '/includes/RawMessage.php',
'ReadOnlyError' => __DIR__ . '/includes/exception/ReadOnlyError.php',
*/
public function getRedactedName() {
if ( $this->mAuto ) {
- return Html::rawElement(
+ return Html::element(
'span',
[ 'class' => 'mw-autoblockid' ],
- wfMessage( 'autoblockid', $this->mId )
+ wfMessage( 'autoblockid', $this->mId )->text()
);
} else {
return htmlspecialchars( $this->getTarget() );
*/
public function processTemplate( $templateName, $args, array $scopes = [] ) {
$template = $this->getTemplate( $templateName );
- return call_user_func( $template, $args, $scopes );
+ return $template( $args, $scopes );
}
}
wfDebugLog( 'cookie', 'already set ' . $func . ': "' . implode( '", "', $data ) . '"' );
} else {
wfDebugLog( 'cookie', $func . ': "' . implode( '", "', $data ) . '"' );
- if ( call_user_func_array( $func, array_values( $data ) ) ) {
+ if ( $func( ...array_values( $data ) ) ) {
self::$setCookies[$key] = $deleting ? null : [ $func, $data ];
}
}
$db, 'log_user', User::newFromName( $params['user'], false )
);
$this->addWhere( $q['conds'] );
+
+ // T71222: MariaDB's optimizer, at least 10.1.37 and .38, likes to choose a wildly bad plan for
+ // some reason for this code path. Tell it not to use the wrong index it wants to pick.
+ $this->addOption( 'IGNORE INDEX', [ 'logging' => [ 'times' ] ] );
}
$title = $params['title'];
+++ /dev/null
-<?php
-/**
- * Data caching with dependencies.
- *
- * 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 Cache
- */
-use MediaWiki\MediaWikiServices;
-
-/**
- * This class stores an arbitrary value along with its dependencies.
- * Users should typically only use DependencyWrapper::getValueFromCache(),
- * rather than instantiating one of these objects directly.
- * @ingroup Cache
- */
-class DependencyWrapper {
- private $value;
- /** @var CacheDependency[] */
- private $deps;
-
- /**
- * @param mixed $value The user-supplied value
- * @param CacheDependency|CacheDependency[] $deps A dependency or dependency
- * array. All dependencies must be objects implementing CacheDependency.
- */
- function __construct( $value = false, $deps = [] ) {
- $this->value = $value;
-
- if ( !is_array( $deps ) ) {
- $deps = [ $deps ];
- }
-
- $this->deps = $deps;
- }
-
- /**
- * Returns true if any of the dependencies have expired
- *
- * @return bool
- */
- function isExpired() {
- foreach ( $this->deps as $dep ) {
- if ( $dep->isExpired() ) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Initialise dependency values in preparation for storing. This must be
- * called before serialization.
- */
- function initialiseDeps() {
- foreach ( $this->deps as $dep ) {
- $dep->loadDependencyValues();
- }
- }
-
- /**
- * Get the user-defined value
- * @return bool|mixed
- */
- function getValue() {
- return $this->value;
- }
-
- /**
- * Store the wrapper to a cache
- *
- * @param BagOStuff $cache
- * @param string $key
- * @param int $expiry
- */
- function storeToCache( $cache, $key, $expiry = 0 ) {
- $this->initialiseDeps();
- $cache->set( $key, $this, $expiry );
- }
-
- /**
- * Attempt to get a value from the cache. If the value is expired or missing,
- * it will be generated with the callback function (if present), and the newly
- * calculated value will be stored to the cache in a wrapper.
- *
- * @param BagOStuff $cache
- * @param string $key The cache key
- * @param int $expiry The expiry timestamp or interval in seconds
- * @param bool|callable $callback The callback for generating the value, or false
- * @param array $callbackParams The function parameters for the callback
- * @param array $deps The dependencies to store on a cache miss. Note: these
- * are not the dependencies used on a cache hit! Cache hits use the stored
- * dependency array.
- *
- * @return mixed The value, or null if it was not present in the cache and no
- * callback was defined.
- */
- static function getValueFromCache( $cache, $key, $expiry = 0, $callback = false,
- $callbackParams = [], $deps = []
- ) {
- $obj = $cache->get( $key );
-
- if ( is_object( $obj ) && $obj instanceof DependencyWrapper && !$obj->isExpired() ) {
- $value = $obj->value;
- } elseif ( $callback ) {
- $value = $callback( ...$callbackParams );
- # Cache the newly-generated value
- $wrapper = new DependencyWrapper( $value, $deps );
- $wrapper->storeToCache( $cache, $key, $expiry );
- } else {
- $value = null;
- }
-
- return $value;
- }
-}
-
-/**
- * @ingroup Cache
- */
-abstract class CacheDependency {
- /**
- * Returns true if the dependency is expired, false otherwise
- */
- abstract function isExpired();
-
- /**
- * Hook to perform any expensive pre-serialize loading of dependency values.
- */
- function loadDependencyValues() {
- }
-}
-
-/**
- * @ingroup Cache
- */
-class FileDependency extends CacheDependency {
- private $filename;
- private $timestamp;
-
- /**
- * Create a file dependency
- *
- * @param string $filename The name of the file, preferably fully qualified
- * @param null|bool|int $timestamp The unix last modified timestamp, or false if the
- * file does not exist. If omitted, the timestamp will be loaded from
- * the file.
- *
- * A dependency on a nonexistent file will be triggered when the file is
- * created. A dependency on an existing file will be triggered when the
- * file is changed.
- */
- function __construct( $filename, $timestamp = null ) {
- $this->filename = $filename;
- $this->timestamp = $timestamp;
- }
-
- /**
- * @return array
- */
- function __sleep() {
- $this->loadDependencyValues();
-
- return [ 'filename', 'timestamp' ];
- }
-
- function loadDependencyValues() {
- if ( is_null( $this->timestamp ) ) {
- Wikimedia\suppressWarnings();
- # Dependency on a non-existent file stores "false"
- # This is a valid concept!
- $this->timestamp = filemtime( $this->filename );
- Wikimedia\restoreWarnings();
- }
- }
-
- /**
- * @return bool
- */
- function isExpired() {
- Wikimedia\suppressWarnings();
- $lastmod = filemtime( $this->filename );
- Wikimedia\restoreWarnings();
- if ( $lastmod === false ) {
- if ( $this->timestamp === false ) {
- # Still nonexistent
- return false;
- } else {
- # Deleted
- wfDebug( "Dependency triggered: {$this->filename} deleted.\n" );
-
- return true;
- }
- } else {
- if ( $lastmod > $this->timestamp ) {
- # Modified or created
- wfDebug( "Dependency triggered: {$this->filename} changed.\n" );
-
- return true;
- } else {
- # Not modified
- return false;
- }
- }
- }
-}
-
-/**
- * @ingroup Cache
- */
-class GlobalDependency extends CacheDependency {
- private $name;
- private $value;
-
- function __construct( $name ) {
- $this->name = $name;
- $this->value = $GLOBALS[$name];
- }
-
- /**
- * @return bool
- */
- function isExpired() {
- if ( !isset( $GLOBALS[$this->name] ) ) {
- return true;
- }
-
- return $GLOBALS[$this->name] != $this->value;
- }
-}
-
-/**
- * @ingroup Cache
- */
-class MainConfigDependency extends CacheDependency {
- private $name;
- private $value;
-
- function __construct( $name ) {
- $this->name = $name;
- $this->value = $this->getConfig()->get( $this->name );
- }
-
- private function getConfig() {
- return MediaWikiServices::getInstance()->getMainConfig();
- }
-
- /**
- * @return bool
- */
- function isExpired() {
- if ( !$this->getConfig()->has( $this->name ) ) {
- return true;
- }
-
- return $this->getConfig()->get( $this->name ) != $this->value;
- }
-}
-
-/**
- * @ingroup Cache
- */
-class ConstantDependency extends CacheDependency {
- private $name;
- private $value;
-
- function __construct( $name ) {
- $this->name = $name;
- $this->value = constant( $name );
- }
-
- /**
- * @return bool
- */
- function isExpired() {
- return constant( $this->name ) != $this->value;
- }
-}
--- /dev/null
+<?php
+/**
+ * Data caching with dependencies.
+ *
+ * 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 Cache
+ */
+
+/**
+ * @ingroup Cache
+ */
+abstract class CacheDependency {
+ /**
+ * Returns true if the dependency is expired, false otherwise
+ */
+ abstract function isExpired();
+
+ /**
+ * Hook to perform any expensive pre-serialize loading of dependency values.
+ */
+ function loadDependencyValues() {
+ }
+}
--- /dev/null
+<?php
+/**
+ * Data caching with dependencies.
+ *
+ * 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 Cache
+ */
+
+/**
+ * @ingroup Cache
+ */
+class ConstantDependency extends CacheDependency {
+ private $name;
+ private $value;
+
+ function __construct( $name ) {
+ $this->name = $name;
+ $this->value = constant( $name );
+ }
+
+ /**
+ * @return bool
+ */
+ function isExpired() {
+ return constant( $this->name ) != $this->value;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Data caching with dependencies.
+ *
+ * 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 Cache
+ */
+
+/**
+ * This class stores an arbitrary value along with its dependencies.
+ * Users should typically only use DependencyWrapper::getValueFromCache(),
+ * rather than instantiating one of these objects directly.
+ * @ingroup Cache
+ */
+class DependencyWrapper {
+ private $value;
+ /** @var CacheDependency[] */
+ private $deps;
+
+ /**
+ * @param mixed $value The user-supplied value
+ * @param CacheDependency|CacheDependency[] $deps A dependency or dependency
+ * array. All dependencies must be objects implementing CacheDependency.
+ */
+ function __construct( $value = false, $deps = [] ) {
+ $this->value = $value;
+
+ if ( !is_array( $deps ) ) {
+ $deps = [ $deps ];
+ }
+
+ $this->deps = $deps;
+ }
+
+ /**
+ * Returns true if any of the dependencies have expired
+ *
+ * @return bool
+ */
+ function isExpired() {
+ foreach ( $this->deps as $dep ) {
+ if ( $dep->isExpired() ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Initialise dependency values in preparation for storing. This must be
+ * called before serialization.
+ */
+ function initialiseDeps() {
+ foreach ( $this->deps as $dep ) {
+ $dep->loadDependencyValues();
+ }
+ }
+
+ /**
+ * Get the user-defined value
+ * @return bool|mixed
+ */
+ function getValue() {
+ return $this->value;
+ }
+
+ /**
+ * Store the wrapper to a cache
+ *
+ * @param BagOStuff $cache
+ * @param string $key
+ * @param int $expiry
+ */
+ function storeToCache( $cache, $key, $expiry = 0 ) {
+ $this->initialiseDeps();
+ $cache->set( $key, $this, $expiry );
+ }
+
+ /**
+ * Attempt to get a value from the cache. If the value is expired or missing,
+ * it will be generated with the callback function (if present), and the newly
+ * calculated value will be stored to the cache in a wrapper.
+ *
+ * @param BagOStuff $cache
+ * @param string $key The cache key
+ * @param int $expiry The expiry timestamp or interval in seconds
+ * @param bool|callable $callback The callback for generating the value, or false
+ * @param array $callbackParams The function parameters for the callback
+ * @param array $deps The dependencies to store on a cache miss. Note: these
+ * are not the dependencies used on a cache hit! Cache hits use the stored
+ * dependency array.
+ *
+ * @return mixed The value, or null if it was not present in the cache and no
+ * callback was defined.
+ */
+ static function getValueFromCache( $cache, $key, $expiry = 0, $callback = false,
+ $callbackParams = [], $deps = []
+ ) {
+ $obj = $cache->get( $key );
+
+ if ( is_object( $obj ) && $obj instanceof DependencyWrapper && !$obj->isExpired() ) {
+ $value = $obj->value;
+ } elseif ( $callback ) {
+ $value = $callback( ...$callbackParams );
+ # Cache the newly-generated value
+ $wrapper = new DependencyWrapper( $value, $deps );
+ $wrapper->storeToCache( $cache, $key, $expiry );
+ } else {
+ $value = null;
+ }
+
+ return $value;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Data caching with dependencies.
+ *
+ * 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 Cache
+ */
+
+/**
+ * @ingroup Cache
+ */
+class FileDependency extends CacheDependency {
+ private $filename;
+ private $timestamp;
+
+ /**
+ * Create a file dependency
+ *
+ * @param string $filename The name of the file, preferably fully qualified
+ * @param null|bool|int $timestamp The unix last modified timestamp, or false if the
+ * file does not exist. If omitted, the timestamp will be loaded from
+ * the file.
+ *
+ * A dependency on a nonexistent file will be triggered when the file is
+ * created. A dependency on an existing file will be triggered when the
+ * file is changed.
+ */
+ function __construct( $filename, $timestamp = null ) {
+ $this->filename = $filename;
+ $this->timestamp = $timestamp;
+ }
+
+ /**
+ * @return array
+ */
+ function __sleep() {
+ $this->loadDependencyValues();
+
+ return [ 'filename', 'timestamp' ];
+ }
+
+ function loadDependencyValues() {
+ if ( is_null( $this->timestamp ) ) {
+ Wikimedia\suppressWarnings();
+ # Dependency on a non-existent file stores "false"
+ # This is a valid concept!
+ $this->timestamp = filemtime( $this->filename );
+ Wikimedia\restoreWarnings();
+ }
+ }
+
+ /**
+ * @return bool
+ */
+ function isExpired() {
+ Wikimedia\suppressWarnings();
+ $lastmod = filemtime( $this->filename );
+ Wikimedia\restoreWarnings();
+ if ( $lastmod === false ) {
+ if ( $this->timestamp === false ) {
+ # Still nonexistent
+ return false;
+ } else {
+ # Deleted
+ wfDebug( "Dependency triggered: {$this->filename} deleted.\n" );
+
+ return true;
+ }
+ } else {
+ if ( $lastmod > $this->timestamp ) {
+ # Modified or created
+ wfDebug( "Dependency triggered: {$this->filename} changed.\n" );
+
+ return true;
+ } else {
+ # Not modified
+ return false;
+ }
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ * Data caching with dependencies.
+ *
+ * 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 Cache
+ */
+
+/**
+ * @ingroup Cache
+ */
+class GlobalDependency extends CacheDependency {
+ private $name;
+ private $value;
+
+ function __construct( $name ) {
+ $this->name = $name;
+ $this->value = $GLOBALS[$name];
+ }
+
+ /**
+ * @return bool
+ */
+ function isExpired() {
+ if ( !isset( $GLOBALS[$this->name] ) ) {
+ return true;
+ }
+
+ return $GLOBALS[$this->name] != $this->value;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Data caching with dependencies.
+ *
+ * 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 Cache
+ */
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @ingroup Cache
+ */
+class MainConfigDependency extends CacheDependency {
+ private $name;
+ private $value;
+
+ function __construct( $name ) {
+ $this->name = $name;
+ $this->value = $this->getConfig()->get( $this->name );
+ }
+
+ private function getConfig() {
+ return MediaWikiServices::getInstance()->getMainConfig();
+ }
+
+ /**
+ * @return bool
+ */
+ function isExpired() {
+ if ( !$this->getConfig()->has( $this->name ) ) {
+ return true;
+ }
+
+ return $this->getConfig()->get( $this->name ) != $this->value;
+ }
+}
}
}
-
-/**
- * Alternative representation of a set of changes, by the index
- * ranges that are changed.
- *
- * @ingroup DifferenceEngine
- */
-class RangeDifference {
-
- /** @var int */
- public $leftstart;
-
- /** @var int */
- public $leftend;
-
- /** @var int */
- public $leftlength;
-
- /** @var int */
- public $rightstart;
-
- /** @var int */
- public $rightend;
-
- /** @var int */
- public $rightlength;
-
- function __construct( $leftstart, $leftend, $rightstart, $rightend ) {
- $this->leftstart = $leftstart;
- $this->leftend = $leftend;
- $this->leftlength = $leftend - $leftstart;
- $this->rightstart = $rightstart;
- $this->rightend = $rightend;
- $this->rightlength = $rightend - $rightstart;
- }
-
-}
--- /dev/null
+<?php
+/**
+ * New version of the difference engine
+ *
+ * Copyright © 2008 Guy Van den Broeck <guy@guyvdb.eu>
+ *
+ * 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 DifferenceEngine
+ */
+
+/**
+ * Alternative representation of a set of changes, by the index
+ * ranges that are changed.
+ *
+ * @ingroup DifferenceEngine
+ */
+class RangeDifference {
+
+ /** @var int */
+ public $leftstart;
+
+ /** @var int */
+ public $leftend;
+
+ /** @var int */
+ public $leftlength;
+
+ /** @var int */
+ public $rightstart;
+
+ /** @var int */
+ public $rightend;
+
+ /** @var int */
+ public $rightlength;
+
+ function __construct( $leftstart, $leftend, $rightstart, $rightend ) {
+ $this->leftstart = $leftstart;
+ $this->leftend = $leftend;
+ $this->leftlength = $leftend - $leftstart;
+ $this->rightstart = $rightstart;
+ $this->rightend = $rightend;
+ $this->rightlength = $rightend - $rightstart;
+ }
+
+}
if ( !is_callable( $function ) ) {
return null;
} else {
- $this->$name = call_user_func( $function );
+ $this->$name = $function();
return $this->$name;
}
public function getDefault() {
$default = parent::getDefault();
if ( $default instanceof Closure ) {
- $default = call_user_func( $default, $this->mParams );
+ $default = $default( $this->mParams );
}
return $default;
}
}
if ( !$caches ) {
- $key = 'config-no-cache-apcu';
- $this->showMessage( $key );
+ $this->showMessage( 'config-no-cache-apcu' );
}
$this->setVar( '_Caches', $caches );
}
/**
- * Generate a secret value for variables using our CryptRand generator.
- * Produce a warning if the random source was insecure.
+ * Generate a secret value for variables using a secure generator.
*
* @param array $keys
* @return Status
$ticket = $factory->getEmptyTransactionTicket( __METHOD__ );
// Update page_touched (skipping pages already touched since the root job).
// Check $wgUpdateRowsPerQuery for sanity; batch jobs are sized by that already.
- foreach ( array_chunk( $pageIds, $wgUpdateRowsPerQuery ) as $batch ) {
- $factory->commitAndWaitForReplication( __METHOD__, $ticket );
-
+ $batches = array_chunk( $pageIds, $wgUpdateRowsPerQuery );
+ foreach ( $batches as $batch ) {
$dbw->update( 'page',
[ 'page_touched' => $dbw->timestamp( $touchTimestamp ) ],
[ 'page_id' => $batch,
],
__METHOD__
);
+ if ( count( $batches ) > 1 ) {
+ $factory->commitAndWaitForReplication( __METHOD__, $ticket );
+ }
}
// Get the list of affected pages (races only mean something else did the purge)
$titleArray = TitleArray::newFromResult( $dbw->select(
$batchSize = $services->getMainConfig()->get( 'UpdateRowsPerQuery' );
$ticket = $lbFactory->getEmptyTransactionTicket( $fname );
- foreach ( array_chunk( $ids, $batchSize ) as $idBatch ) {
+ $idBatches = array_chunk( $ids, $batchSize );
+ foreach ( $idBatches as $idBatch ) {
$dbw->update(
'page',
[ 'page_touched' => $now ],
],
$fname
);
- $lbFactory->commitAndWaitForReplication( $fname, $ticket );
+ if ( count( $idBatches ) > 1 ) {
+ $lbFactory->commitAndWaitForReplication( $fname, $ticket );
+ }
}
}
) );
/** @var int[] Map of (ATTR_* class constant => QOS_* class constant) */
protected $attrMap = [];
- /** Possible values for getLastError() */
- const ERR_NONE = 0; // no error
- const ERR_NO_RESPONSE = 1; // no response
- const ERR_UNREACHABLE = 2; // can't connect
- const ERR_UNEXPECTED = 3; // response gave some error
-
/** Bitfield constants for get()/getMulti() */
const READ_LATEST = 1; // use latest data for replicated stores
const READ_VERIFIED = 2; // promise that caller can tell when keys are stale
$this->busyCallbacks[] = $workCallback;
}
- /**
- * Modify a cache update operation array for EventRelayer::notify()
- *
- * This is used for relayed writes, e.g. for broadcasting a change
- * to multiple data-centers. If the array contains a 'val' field
- * then the command involves setting a key to that value. Note that
- * for simplicity, 'val' is always a simple scalar value. This method
- * is used to possibly serialize the value and add any cache-specific
- * key/values needed for the relayer daemon (e.g. memcached flags).
- *
- * @param array $event
- * @return array
- * @since 1.26
- */
- public function modifySimpleRelayEvent( array $event ) {
- return $event;
- }
-
/**
* @param string $text
*/
return $this->backend->clearLastError();
}
- public function modifySimpleRelayEvent( array $event ) {
- return $this->backend->modifySimpleRelayEvent( $event );
- }
-
// @codeCoverageIgnoreEnd
}
const QOS_SYNCWRITES_SS = 4; // strict-serializable, nodes refuse reads if possible stale
// Generic "unknown" value that is useful for comparisons (e.g. always good enough)
const QOS_UNKNOWN = INF;
+
+ const ERR_NONE = 0; // no error
+ const ERR_NO_RESPONSE = 1; // no response
+ const ERR_UNREACHABLE = 2; // can't connect
+ const ERR_UNEXPECTED = 3; // response gave some error
}
protected function debugLog( $text ) {
$this->logger->debug( $text );
}
-
- public function modifySimpleRelayEvent( array $event ) {
- if ( array_key_exists( 'val', $event ) ) {
- $event['flg'] = 0; // data is not serialized nor gzipped (for memcached driver)
- }
-
- return $event;
- }
}
return $result;
}
- public function modifySimpleRelayEvent( array $event ) {
- if ( array_key_exists( 'val', $event ) ) {
- $event['val'] = serialize( $event['val'] ); // this class uses PHP serialization
- }
-
- return $event;
- }
-
/**
* @param mixed $data
* @return string
const FLD_FLAGS = 4; // key to the flags bitfield (reserved number)
const FLD_HOLDOFF = 5; // key to any hold-off TTL
- const ERR_NONE = 0; // no error
- const ERR_NO_RESPONSE = 1; // no response
- const ERR_UNREACHABLE = 2; // can't connect
- const ERR_UNEXPECTED = 3; // response gave some error
- const ERR_RELAY = 4; // relay broadcast failed
-
const VALUE_KEY_PREFIX = 'WANCache:v:';
const INTERIM_KEY_PREFIX = 'WANCache:i:';
const TIME_KEY_PREFIX = 'WANCache:t:';
* @param array $params
* - cache : BagOStuff object for a persistent cache
* - logger : LoggerInterface object
- * - stats : LoggerInterface object
+ * - stats : StatsdDataFactoryInterface object
* - asyncHandler : A function that takes a callback and runs it later. If supplied,
* whenever a preemptive refresh would be triggered in getWithSetCallback(), the
* current cache value is still used instead. However, the async-handler function
* @param string $key Cache key
* @param mixed $value
* @param int $ttl Seconds to live. Special values are:
- * - WANObjectCache::TTL_INDEFINITE: Cache forever
+ * - WANObjectCache::TTL_INDEFINITE: Cache forever (default)
* @param array $opts Options map:
* - lag : Seconds of replica DB lag. Typically, this is either the replica DB lag
* before the data was read or, if applicable, the replica DB lag before
* @note Options added in 1.28: staleTTL
* @return bool Success
*/
- final public function set( $key, $value, $ttl = 0, array $opts = [] ) {
+ final public function set( $key, $value, $ttl = self::TTL_INDEFINITE, array $opts = [] ) {
$now = $this->getCurrentTime();
$lockTSE = $opts['lockTSE'] ?? self::TSE_NONE;
$staleTTL = $opts['staleTTL'] ?? self::STALE_TTL_NONE;
* @return bool True if the item was purged or not found, false on failure
*/
final public function delete( $key, $ttl = self::HOLDOFF_TTL ) {
- $key = self::VALUE_KEY_PREFIX . $key;
-
if ( $ttl <= 0 ) {
// Publish the purge to all datacenters
- $ok = $this->relayDelete( $key );
+ $ok = $this->relayDelete( self::VALUE_KEY_PREFIX . $key );
} else {
// Publish the purge to all datacenters
- $ok = $this->relayPurge( $key, $ttl, self::HOLDOFF_NONE );
+ $ok = $this->relayPurge( self::VALUE_KEY_PREFIX . $key, $ttl, self::HOLDOFF_NONE );
}
+ $kClass = $this->determineKeyClassForStats( $key );
+ $this->stats->increment( "wanobjectcache.$kClass.delete." . ( $ok ? 'ok' : 'error' ) );
+
return $ok;
}
*/
final public function touchCheckKey( $key, $holdoff = self::HOLDOFF_TTL ) {
// Publish the purge to all datacenters
- return $this->relayPurge( self::TIME_KEY_PREFIX . $key, self::CHECK_KEY_TTL, $holdoff );
+ $ok = $this->relayPurge( self::TIME_KEY_PREFIX . $key, self::CHECK_KEY_TTL, $holdoff );
+
+ $kClass = $this->determineKeyClassForStats( $key );
+ $this->stats->increment( "wanobjectcache.$kClass.ck_touch." . ( $ok ? 'ok' : 'error' ) );
+
+ return $ok;
}
/**
*/
final public function resetCheckKey( $key ) {
// Publish the purge to all datacenters
- return $this->relayDelete( self::TIME_KEY_PREFIX . $key );
+ $ok = $this->relayDelete( self::TIME_KEY_PREFIX . $key );
+
+ $kClass = $this->determineKeyClassForStats( $key );
+ $this->stats->increment( "wanobjectcache.$kClass.ck_reset." . ( $ok ? 'ok' : 'error' ) );
+
+ return $ok;
}
/**
$touchedCb = $opts['touchedCallback'] ?? null;
$initialTime = $this->getCurrentTime();
- // Get a collection name to describe this class of key
- $kClass = $this->determineKeyClass( $key );
+ $kClass = $this->determineKeyClassForStats( $key );
// Get the current key value
$curTTL = self::PASS_BY_REF;
/**
* @param string $key String of the format <scope>:<class>[:<class or variable>]...
- * @return string
+ * @return string A collection name to describe this class of key
*/
- protected function determineKeyClass( $key ) {
+ protected function determineKeyClassForStats( $key ) {
$parts = explode( ':', $key );
return $parts[1] ?? $parts[0]; // sanity
return $this->__call( __FUNCTION__, func_get_args() );
}
+ public function addIdentifierQuotes( $s ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
public function buildLike() {
return $this->__call( __FUNCTION__, func_get_args() );
}
}
/**
+ * Error out if the DB is not in a valid state for a query via query()
+ *
* @param string $sql
* @param string $fname
* @throws DBTransactionStateError
*/
private function assertTransactionStatus( $sql, $fname ) {
- if ( $this->getQueryVerb( $sql ) === 'ROLLBACK' ) { // transaction/savepoint
+ $verb = $this->getQueryVerb( $sql );
+ if ( $verb === 'USE' ) {
+ throw new DBUnexpectedError( $this, "Got USE query; use selectDomain() instead." );
+ }
+
+ if ( $verb === 'ROLLBACK' ) { // transaction/savepoint
return;
}
}
}
- /**
- * Quotes an identifier using `backticks` or "double quotes" depending on the database type.
- * MySQL uses `backticks` while basically everything else uses double quotes.
- * Since MySQL is the odd one out here the double quotes are our generic
- * and we implement backticks in DatabaseMysqlBase.
- *
- * @param string $s
- * @return string
- */
public function addIdentifierQuotes( $s ) {
return '"' . str_replace( '"', '""', $s ) . '"';
}
}
protected function doSelectDomain( DatabaseDomain $domain ) {
- $encDatabase = $this->addIdentifierQuotes( $domain->getDatabase() );
- $this->query( "USE $encDatabase" );
+ if ( $domain->getSchema() !== null ) {
+ throw new DBExpectedError( $this, __CLASS__ . ": domain schemas are not supported." );
+ }
+
+ $database = $domain->getDatabase();
+ if ( $database !== $this->getDBname() ) {
+ $encDatabase = $this->addIdentifierQuotes( $database );
+ $res = $this->doQuery( "USE $encDatabase" );
+ if ( !$res ) {
+ throw new DBExpectedError( $this, "Could not select database '$database'." );
+ }
+ }
// Update that domain fields on success (no exception thrown)
$this->currentDomain = $domain;
}
function doSelectDomain( DatabaseDomain $domain ) {
- $conn = $this->getBindingHandle();
-
if ( $domain->getSchema() !== null ) {
throw new DBExpectedError( $this, __CLASS__ . ": domain schemas are not supported." );
}
$database = $domain->getDatabase();
- if ( !$conn->select_db( $database ) ) {
- throw new DBExpectedError( $this, "Could not select database '$database'." );
+ if ( $database !== $this->getDBname() ) {
+ $conn = $this->getBindingHandle();
+ if ( !$conn->select_db( $database ) ) {
+ throw new DBExpectedError( $this, "Could not select database '$database'." );
+ }
}
// Update that domain fields on success (no exception thrown)
*/
public function addQuotes( $s );
+ /**
+ * Quotes an identifier, in order to make user controlled input safe
+ *
+ * Depending on the database this will either be `backticks` or "double quotes"
+ *
+ * @param string $s
+ * @return string
+ * @since 1.33
+ */
+ public function addIdentifierQuotes( $s );
+
/**
* LIKE statement wrapper, receives a variable-length argument list with
* parts of pattern to match containing either string literals that will be
# * bottom
# * text-bottom
- global $wgMediaInTargetLanguage;
-
# Protect LanguageConverter markup when splitting into parts
$parts = StringUtils::delimiterExplode(
'-{', '}-', '|', $options, true /* allow nesting */
# Use the "caption" for the tooltip text
$params['frame']['title'] = $this->stripAltText( $caption, $holders );
}
- if ( $wgMediaInTargetLanguage ) {
- $params['handler']['targetlang'] = $this->getTargetLanguage()->getCode();
- }
+ $params['handler']['targetlang'] = $this->getTargetLanguage()->getCode();
Hooks::run( 'ParserMakeImageParams', [ $title, $file, &$params, $this ] );
}
throw new UnexpectedValueException( "callback '$cb' is not callable" );
}
- call_user_func( $cb, $info['credits'][$name] );
+ $cb( $info['credits'][$name] );
}
}
// mw.loader.implement will use globalEval if scripts is a string.
// Minify manually here, because general response minification is
// not effective due it being a string literal, not a function.
- if ( !self::inDebugMode() ) {
+ if ( !$context->getDebug() ) {
$scripts = self::filter( 'minify-js', $scripts ); // T107377
}
} else {
'modules' => self::makePackedModulesString( $modules ),
'lang' => $lang,
'skin' => $skin,
- 'debug' => $debug ? 'true' : 'false',
];
+ if ( $debug === true ) {
+ $query['debug'] = 'true';
+ }
if ( $user !== null ) {
$query['user'] = $user;
}
// Various parameters
$this->user = $request->getRawVal( 'user' );
- $this->debug = $request->getFuzzyBool(
- 'debug',
- $this->getConfig()->get( 'ResourceLoaderDebug' )
- );
+ $this->debug = $request->getRawVal( 'debug' ) === 'true';
$this->only = $request->getRawVal( 'only', null );
$this->version = $request->getRawVal( 'version', null );
$this->raw = $request->getFuzzyBool( 'raw' );
"badretype": "كلمات السر التي أدخلتها لا تتطابق.",
"usernameinprogress": "إن عملية إنشاء حساب لاسم المستخدم هذا جارية بالفعل. برجاء الانتظار.",
"userexists": "اسم المستخدم الذي تم إدخاله مستعمل بالفعل.\nالرجاء اختيار اسم مختلف.",
+ "createacct-normalization": "سيتم تعديل اسم المستخدم الخاص بك إلى \"$2\" بسبب قيود فنية.",
"loginerror": "خطأ في الدخول",
"createacct-error": "خطأ في إنشاء حساب",
"createaccounterror": "تعذر إنشاء حساب المستخدم: $1",
"badretype": "Уведзеныя Вамі паролі не супадаюць.",
"usernameinprogress": "Стварэньне рахунку з гэтым імем удзельніка ўжо ідзе. Калі ласка, пачакайце.",
"userexists": "Уведзенае Вамі імя ўдзельніка ўжо выкарыстоўваецца кімсьці іншым. \nКалі ласка, выберыце іншае імя.",
+ "createacct-normalization": "Вашае імя карыстальніка будзе скарэктаванае на «$2» праз тэхнічныя абмежаваньні.",
"loginerror": "Памылка ўваходу",
"createacct-error": "Памылка стварэньня рахунку",
"createaccounterror": "Немагчыма стварыць рахунак: $1",
"ipb-sitewide": "На ўсім сайце",
"ipb-partial": "Частковая",
"ipb-sitewide-help": "Кожная старонка ў гэтай вікі і ўсе іншыя дзеяньні.",
+ "ipb-partial-help": "Вызначаныя старонкі ці прасторы назваў.",
"ipb-pages-label": "Старонкі",
"ipb-namespaces-label": "Прасторы назваў",
"badipaddress": "Некарэктны IP-адрас",
"missingarticle-rev": "(версия#: $1)",
"missingarticle-diff": "(Разлика: $1, $2)",
"readonly_lag": "Базата от данни беше автоматично заключена, докато подчинените сървъри успеят да се синхронизират с основния сървър.",
- "nonwrite-api-promise-error": "HTTP-заглавиеÑ\82о â\80\9ePromise-Non-Write-API-Actionâ\80\9c беÑ\88е изпÑ\80аÑ\82ено, но заÑ\8fвкаÑ\82а беÑ\88е напÑ\80авена кÑ\8aм запиÑ\81ен модÑ\83л на извÑ\8aÑ\80Ñ\88ника.",
+ "nonwrite-api-promise-error": "HTTP-заглавкаÑ\82а â\80\9ePromise-Non-Write-API-Actionâ\80\9c е изпÑ\80аÑ\82ена, но заÑ\8fвкаÑ\82а е напÑ\80авена кÑ\8aм модÑ\83л за запиÑ\81 на API.",
"internalerror": "Вътрешна грешка",
"internalerror_info": "Вътрешна грешка: $1",
"internalerror-fatal-exception": "Фатална грешка от тип „$1“",
"badarticleerror": "Действието не може да бъде изпълнено на тази страница.",
"cannotdelete": "Указаната страница или файл „$1“ не можа да бъде изтрит(а). Възможно е вече да е бил(а) изтрит(а) от някой друг.",
"cannotdelete-title": "Страницата „$1“ не може да бъде изтрита",
- "delete-scheduled": "Страницата „$1“ е предвидена за изтриване.\nМоля, бъдете търпеливи.",
+ "delete-scheduled": "Страница „$1“ е предвидена за изтриване.\nМоля, бъдете търпеливи.",
"delete-hook-aborted": "Изтриването беше прекъснато от софтуерно прехващане.\nНе беше посочена причина за това.",
"no-null-revision": "Не може да бъде създадена празна версия на страницата „$1“",
"badtitle": "Невалидно заглавие",
"createacct-benefit-body2": "{{PLURAL:$1|страница|страници}}",
"createacct-benefit-body3": "{{PLURAL:$1|скорошен сътрудник|скорошни сътрудници}}",
"badretype": "Въведените пароли не съвпадат.",
- "usernameinprogress": "Създаването на сметката за този потребител е вече в прогрес.\nМоля, изчакайте.",
+ "usernameinprogress": "Създаването на сметката за този потребител се извършва в момента.\nМоля, изчакайте.",
"userexists": "Въведеното потребителско име вече се използва.\nИзберете друго име.",
"loginerror": "Грешка при влизане",
- "createacct-error": "Ð\93Ñ\80еÑ\88ка в Ñ\81Ñ\8aздаванеÑ\82о на Ñ\81меÑ\82каÑ\82а",
+ "createacct-error": "Ð\93Ñ\80еÑ\88ка пÑ\80и Ñ\81Ñ\8aздаванеÑ\82о на Ñ\81меÑ\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": "Въведената парола е между най-често ползваните. Моля, изберете по-неповторима парола.",
+ "passwordinlargeblacklist": "Въведената парола е между най-често ползваните. Моля, изберете по-различна парола.",
"password-name-match": "Паролата Ви трябва да се различава от потребителското Ви име.",
"password-login-forbidden": "Използването на това потребителско име и парола е забранено.",
"mailmypassword": "Възстановяване на парола",
"changepassword-success": "Паролата беше променена успешно!",
"changepassword-throttled": "Направили сте твърде много опити да въведете паролата за тази сметка.\nНеобходимо е да изчакате $1 преди да опитате отново.",
"botpasswords": "Пароли за ботове",
- "botpasswords-summary": "<em>Ð\9fаÑ\80олиÑ\82е за боÑ\82ове</em> даваÑ\82 доÑ\81Ñ\82Ñ\8aп до поÑ\82Ñ\80ебиÑ\82елÑ\81ка Ñ\81меÑ\82ка пÑ\80ез API, без да Ñ\81е използваÑ\82 данниÑ\82е за влизане в оÑ\81новнаÑ\82а Ñ\81меÑ\82ка. Ð\9fоÑ\82Ñ\80ебиÑ\82елÑ\81киÑ\82е пÑ\80ава могаÑ\82 да бÑ\8aдаÑ\82 огÑ\80аниÑ\87ени пÑ\80и влизане на Ñ\82ози наÑ\87ин.\n\nÐ\90ко не знаеÑ\82е за какво Ñ\82ова би ви поÑ\81лÑ\83жило, по-добÑ\80о не пÑ\80авеÑ\82е Ñ\82ова. Никой никога не трябва да ви моли да създавате такава парола, за да му я дадете.",
+ "botpasswords-summary": "<em>Ð\9fаÑ\80олиÑ\82е за боÑ\82ове</em> даваÑ\82 доÑ\81Ñ\82Ñ\8aп до поÑ\82Ñ\80ебиÑ\82елÑ\81ка Ñ\81меÑ\82ка пÑ\80ез API, без да Ñ\81е използваÑ\82 иденÑ\82иÑ\84икаÑ\86ионниÑ\82е данни в оÑ\81новнаÑ\82а Ñ\81меÑ\82ка. Ð\9fоÑ\82Ñ\80ебиÑ\82елÑ\81киÑ\82е пÑ\80ава могаÑ\82 да бÑ\8aдаÑ\82 огÑ\80аниÑ\87ени пÑ\80и влизане по Ñ\82ози наÑ\87ин.\n\nÐ\90ко не знаеÑ\82е за какво би ви поÑ\81лÑ\83жило Ñ\82ова, по-добÑ\80е не го пÑ\80авеÑ\82е. Никой никога не трябва да ви моли да създавате такава парола, за да му я дадете.",
"botpasswords-disabled": "Паролите за ботове са изключени.",
"botpasswords-no-central-id": "За да използвате пароли за ботове, трябва да сте влезли в централна сметка.",
"botpasswords-existing": "Съществуващи пароли за ботове",
"botpasswords-label-delete": "Изтриване",
"botpasswords-label-resetpassword": "Възстановяване на парола",
"botpasswords-label-grants": "Приложими разрешения:",
- "botpasswords-help-grants": "Разрешенията ви дават достъп до права, които вече имат вашата сметка. Като включите разрешение тук, няма да получавате никакви права, които вече няма сметката. Повече информация ще намерите на [[Special:ListGrants|таблицата на разрешения]].",
+ "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-no-provider": "BotPasswordsSessionProvider не е наличен.",
"botpasswords-needs-reset": "Паролата на бота с име „$2“ на {{GENDER:$2|потребител}} „$1“ трябва да бъде подновена.",
"resetpass_forbidden": "Не е разрешена промяна на паролата",
"resetpass_forbidden-reason": "Паролите не могат да се променят: $1",
"resetpass-abort-generic": "Промяната на паролата беше прекъсната от използвано разширение.",
"resetpass-expired": "Срокът на валидност на паролата е изтекъл. Изберете нова парола за влизане.",
"resetpass-expired-soft": "Вашата парола е изтекла и трябва да бъде променена. Моля, въведете нова парола сега или натиснете бутона \"{{int:authprovider-resetpass-skip-label}}\" за да я промените по-късно.",
- "resetpass-validity": "Ð\9fаÑ\80олаÑ\82а ви е невалидна: $1\n\nÐ\97адайте нова парола за влизане.",
+ "resetpass-validity": "Ð\9fаÑ\80олаÑ\82а ви е невалидна: $1\n\nУÑ\81Ñ\82ановете нова парола за влизане.",
"resetpass-validity-soft": "Вашата парола е невалидна: $1\n\nМоля, въведете нова парола или натиснете бутона „{{int:authprovider-resetpass-skip-label}}“ за да я промените по-късно.",
"passwordreset": "Възстановяване на парола",
"passwordreset-text-one": "Попълването на формуляра ще доведе до възстановяване на паролата.",
"passwordreset-emailelement": "Потребителско име: \n$1\n\nВременна парола: \n$2",
"passwordreset-emailsentemail": "Ако електронната Ви поща е свързана със сметката Ви, на нея е изпратено писмо за възстановяване на паролата.",
"passwordreset-emailsentusername": "Ако това потребителско име е свързано с електронна поща, е изпратено писмо за възстановяване на паролата.",
- "passwordreset-nocaller": "ТÑ\80Ñ\8fбва да е поÑ\81оÑ\87ен повикваÑ\82ел",
+ "passwordreset-nocaller": "ТÑ\80Ñ\8fбва да е поÑ\81оÑ\87ен изÑ\82оÑ\87ник на извикванеÑ\82о",
"passwordreset-nosuchcaller": "Източникът на извикването не съществува: $1",
- "passwordreset-ignored": "Ð\9fÑ\80омÑ\8fнаÑ\82а на паÑ\80олаÑ\82а беÑ\88е неÑ\83Ñ\81пеÑ\88на. Ð\9cоже би не е поÑ\81оÑ\87ен доставчик?",
+ "passwordreset-ignored": "Ð\9fÑ\80омÑ\8fнаÑ\82а на паÑ\80олаÑ\82а беÑ\88е неÑ\83Ñ\81пеÑ\88на. Ð\9cоже би не е наÑ\81Ñ\82Ñ\80оен доставчик?",
"passwordreset-invalidemail": "Неправилен email адрес",
"passwordreset-nodata": "Не сте указали нито потребителско име, нито адрес на ел. поща",
"changeemail": "Промяна или премахване на адреса за е-поща",
"subject-preview": "Предварителен преглед на заглавието:",
"previewerrortext": "Възникна грешка при опита за преглед на промените.",
"blockedtitle": "Потребителят е блокиран",
- "blocked-email-user": "<strong>Ð\92аÑ\88еÑ\82о поÑ\82Ñ\80ебиÑ\82елÑ\81ко име е забÑ\80анено да изпÑ\80аÑ\89а елекÑ\82Ñ\80оннаÑ\82а поÑ\89а. Ð\92Ñ\81е оÑ\89е можеÑ\82е да Ñ\80едакÑ\82иÑ\80аÑ\82е дÑ\80Ñ\83ги Ñ\81Ñ\82Ñ\80аниÑ\86и в Ñ\82ова Ñ\83ики. </strong> Ð\92Ñ\81иÑ\87ки подÑ\80обноÑ\81Ñ\82и за забÑ\80анаÑ\82а Ñ\89е намеÑ\80иÑ\82е в [[Special:MyContributions|пÑ\80иноÑ\81иÑ\82е на Ñ\81меÑ\82каÑ\82а]].\n\nÐ\97абÑ\80анаÑ\82а даде $1.\n\nÐ\9fоÑ\81оÑ\87енаÑ\82а пÑ\80иÑ\87ина е <em>$2</em>.\n\n* Ð\9dаÑ\87ало на забÑ\80анаÑ\82а: $8\n* Ð\9aÑ\80ай на забÑ\80анаÑ\82а: $6\n* Ð\97абÑ\80анаÑ\82а Ñ\81е оÑ\82наÑ\81Ñ\8f за: $7\n* Ð\98денÑ\82иÑ\84икаÑ\82оÑ\80 на забÑ\80анаÑ\82а #$5",
+ "blocked-email-user": "<strong>Ð\92аÑ\88еÑ\82о поÑ\82Ñ\80ебиÑ\82елÑ\81ко име е блокиÑ\80ано оÑ\82 изпÑ\80аÑ\89ане на елекÑ\82Ñ\80онна поÑ\89а. Ð\92Ñ\81е оÑ\89е можеÑ\82е да Ñ\80едакÑ\82иÑ\80аÑ\82е дÑ\80Ñ\83ги Ñ\81Ñ\82Ñ\80аниÑ\86и в Ñ\82ова Ñ\83ики.</strong> Ð\92Ñ\81иÑ\87ки подÑ\80обноÑ\81Ñ\82и за забÑ\80анаÑ\82а Ñ\89е намеÑ\80иÑ\82е в [[Special:MyContributions|пÑ\80иноÑ\81иÑ\82е на Ñ\81меÑ\82каÑ\82а]].\n\nÐ\91локиÑ\80анеÑ\82о е извÑ\8aÑ\80Ñ\88ено оÑ\82 $1.\n\nÐ\9fоÑ\81оÑ\87енаÑ\82а пÑ\80иÑ\87ина е <em>$2</em>.\n\n* Ð\9dаÑ\87ало на блокиÑ\80анеÑ\82о: $8\n* Ð\9aÑ\80ай на блокиÑ\80анеÑ\82о: $6\n* Ð\91локиÑ\80анеÑ\82о Ñ\81е оÑ\82наÑ\81Ñ\8f за: $7\n* Ð\98денÑ\82иÑ\84икаÑ\82оÑ\80 на блокиÑ\80анеÑ\82о #$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Включвайте ги във всяка заявка, която правите.",
"userjsonyoucanpreview": "<strong>Съвет:</strong> Използвайте бутона „{{int:showpreview}}“, за да изпробвате новия код на JSON преди съхранението.",
"userjsyoucanpreview": "<strong>Съвет:</strong> Използвайте бутона „{{int:showpreview}}“, за да изпробвате новия код на Джаваскрипт преди съхранението.",
"usercsspreview": "<strong>Не забравяйте, че това е само предварителен преглед на кода на CSS.\nСтраницата все още не е съхранена!</strong>",
- "userjsonpreview": "<strong>Ð\9dе забÑ\80авÑ\8fйÑ\82е, Ñ\87е Ñ\82ова е Ñ\81амо изпÑ\80обване/пÑ\80едваÑ\80иÑ\82елен пÑ\80еглед на поÑ\81Ñ\82авеноÑ\81Ñ\82Ñ\82а на ваÑ\88иÑ\8f JSON.\nСтраницата все още не е съхранена!</strong>",
+ "userjsonpreview": "<strong>Ð\9dе забÑ\80авÑ\8fйÑ\82е, Ñ\87е Ñ\82ова е Ñ\81амо изпÑ\80обване/пÑ\80едваÑ\80иÑ\82елен пÑ\80еглед на ваÑ\88аÑ\82а поÑ\82Ñ\80ебиÑ\82елÑ\81ка JSON-конÑ\84игÑ\83Ñ\80аÑ\86иÑ\8f.\nСтраницата все още не е съхранена!</strong>",
"userjspreview": "<strong>Не забравяйте, че това е само изпробване/предварителен преглед на кода на JavaScript.\nСтраницата все още не е съхранена!</strong>",
"sitecsspreview": "<strong>Не забравяйте, че това е само предварителен преглед на този CSS.\nТой все още не е съхранен!</strong>",
- "sitejsonpreview": "<strong>Не забравяйте, че това е само предварителен преглед на тази поставеност на JSON. Той все още не е съхранен!</strong>",
+ "sitejsonpreview": "<strong>Не забравяйте, че това е само предварителен преглед на тази JSON-конфигурация.\nТой все още не е съхранен!</strong>",
"sitejspreview": "<strong>Не забравяйте, че това е само предварителен преглед на този JavaScript код.\nТой все още не е съхранен!</strong>",
"userinvalidconfigtitle": "<strong>Внимание:</strong> Не съществува облик „$1“.\nИмената на потребителски .css, .json и .js страници трябва да използват малки букви, например: {{ns:user}}:Иван/vector.css (а не {{ns:user}}:Иван/Vector.css).",
"updated": "(обновена)",
"edit-gone-missing": "Страницата не можа да се обнови.\nВероятно междувременно е била изтрита.",
"edit-conflict": "Конфликт при редактирането.",
"edit-no-change": "Редакцията Ви беше пренебрегната, защото не съдържа промени по текста.",
- "edit-slots-cannot-add": "{{PLURAL:$1|Следното място тук не е поддържано|Следните места тук не са поддържани}}: $2",
+ "edit-slots-cannot-add": "{{PLURAL:$1|Следното място не се поддържа|Следните места не се поддържат}} тук: $2",
"edit-slots-cannot-remove": "{{PLURAL:$1|Следното място е задължително и не може да бъде премахнато|Следните места са задължителни и не могат да бъде премахнати}}: $2.",
"postedit-confirmation-created": "Страницата е създадена.",
"postedit-confirmation-restored": "Страницата е възстановена.",
"editpage-invalidcontentmodel-title": "Форматът на съдържанието не се поддържа",
"editpage-invalidcontentmodel-text": "Модел на съдържание „$1“ не се поддържа.",
"editpage-notsupportedcontentformat-title": "Форматът на съдържанието не се поддържа",
- "editpage-notsupportedcontentformat-text": "Форматът $1 не е поддържан от модела на съдържание $2.",
+ "editpage-notsupportedcontentformat-text": "Форматът $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, а употреба им в уикитекста отпада.",
"duplicate-args-category": "Страници, които използват повтарящи се аргументи в извикванията на шаблона",
"duplicate-args-category-desc": "Страницата съдържа шаблонни извиквания, които използват повтарящи се аргументи, като например <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> или <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"expensive-parserfunction-warning": "<strong>Внимание:</strong> Тази страница прави твърде много ресурсоемки извиквания на анализиращи функции.\n\nВ момента има {{PLURAL:$1|$1 обръщение|$1 обръщения}} към такива функции, а трябва да {{PLURAL:$1|е|са}} по-малко от $2.",
"expansion-depth-exceeded-warning": "Страницата е превишила разрешената дълбочина на разгръщане",
"parser-unstrip-loop-warning": "Открито е ''unstrip'' зацикляне",
"unstrip-depth-warning": "Превишено ограничение на дълбочина ($1)",
- "unstrip-size-warning": "Превишено ограничение на размера ($1)",
+ "unstrip-size-warning": "Превишено ограничение на размера на unstrip ($1)",
"undo-success": "Редакцията може да бъде върната.\nПрегледайте долното сравнение и се уверете, че наистина искате да го направите. След това съхранете страницата, за да извършите връщането.",
"undo-failure": "Редакцията не може да бъде върната поради конфликтни междинни редакции.",
- "undo-main-slot-only": "РедакÑ\86иÑ\8fÑ\82а не може да бÑ\8aде вÑ\8aÑ\80наÑ\82а, заÑ\89оÑ\82о има съдържание извън главния слот.",
+ "undo-main-slot-only": "РедакÑ\86иÑ\8fÑ\82а не може да бÑ\8aде вÑ\8aÑ\80наÑ\82а, заÑ\89оÑ\82о е Ñ\81вÑ\8aÑ\80зана Ñ\81Ñ\8aÑ\81 съдържание извън главния слот.",
"undo-norev": "Редакцията не може да бъде върната, тъй като не съществува или е била изтрита.",
"undo-nochange": "Тази редакция изглежда вече е отменена.",
"undo-summary": "Премахната редакция $1 на [[Special:Contributions/$2|$2]] ([[User talk:$2|беседа]])",
"powersearch-togglelabel": "Избор:",
"powersearch-toggleall": "Всички",
"powersearch-togglenone": "Никои",
- "powersearch-remember": "Ð\97апомнÑ\8fне в бÑ\8aдеÑ\89е",
+ "powersearch-remember": "Ð\97апомнÑ\8fне на избоÑ\80а за бÑ\8aдеÑ\89и Ñ\82Ñ\8aÑ\80Ñ\81ениÑ\8f",
"search-external": "Външно търсене",
"searchdisabled": "Търсенето в {{SITENAME}} е временно изключено.\nМеждувременно можете да търсите чрез Google.\nОбърнете внимание, че съхранените при тях страници най-вероятно са остарели.",
"search-error": "Възникна грешка при търсенето: $1",
"prefs-watchlist-days": "Брой дни, които да се показват в списъка за наблюдение:",
"prefs-watchlist-days-max": "Най-много $1 {{PLURAL:$1|ден|дни}}",
"prefs-watchlist-edits": "Максимален брой редакции в списъка за наблюдение:",
- "prefs-watchlist-edits-max": "Ð\9dай-много: 1000",
+ "prefs-watchlist-edits-max": "Ð\9cакÑ\81имална Ñ\81Ñ\82ойноÑ\81Ñ\82: 1000",
"prefs-watchlist-token": "Уникален идентификатор на списъка за наблюдение:",
"prefs-watchlist-managetokens": "Управление на маркерите",
"prefs-misc": "Други",
"recentchangesdays": "Брой дни в последни промени:",
"recentchangesdays-max": "(най-много $1 {{PLURAL:$1|ден|дни}})",
"recentchangescount": "Брой показвани редакции в последните промени, историята на страници и логове по подразбиране:",
- "prefs-help-recentchangescount": "Ð\9dай-много: 1000",
+ "prefs-help-recentchangescount": "Ð\9cакÑ\81имална Ñ\81Ñ\82ойноÑ\81Ñ\82: 1000",
"prefs-help-watchlist-token2": "Това е секретният ключ към уеб хранилката на вашия списък за наблюдение.\nВсеки, който го знае, би могъл да прегледа списъка ви за наблюдение, така че не го споделяйте.\nПри нужда можете да го [[Special:ResetTokens|изчистите]].",
"prefs-help-tokenmanagement": "Можете да видите и нулирате тайния ключ за Вашата сметка, който може да има достъп до уеб хранилката на Вашия списък за наблюдение. Всеки, който знае ключа, ще може да види Вашия списък за наблюдение, така че не го споделяйте.",
"savedprefs": "Настройките ви бяха съхранени.",
"yourrealname": "Истинско име:",
"yourlanguage": "Език:",
"yourvariant": "Езиков вариант на съдържанието:",
- "prefs-help-variant": "Ð\92аÑ\88иÑ\8fÑ\82 пÑ\80едпоÑ\87иÑ\82ан ваÑ\80ианÑ\82 или пÑ\80авопиÑ\81 за показване на Ñ\81Ñ\8aдÑ\8aÑ\80жаÑ\82елниÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86и в това уики.",
+ "prefs-help-variant": "Ð\92аÑ\88иÑ\8fÑ\82 пÑ\80едпоÑ\87иÑ\82ан ваÑ\80ианÑ\82 или пÑ\80авопиÑ\81 за показване на Ñ\81Ñ\82Ñ\80аниÑ\86и Ñ\81Ñ\8aÑ\81 Ñ\81Ñ\8aдÑ\8aÑ\80жание в това уики.",
"yournick": "Подпис:",
"prefs-help-signature": "Коментарите в дискусионните страници трябва да се подписват с поредица от четири тилди \"<nowiki>~~~~</nowiki>\", която при съхранение на редакцията сървърът превръща в подпис с потребителско име, дата и час.",
"badsig": "Избраният подпис не е валиден. Проверете HTML-етикетите!",
"gender-unknown": "Когато Ви споменава, софтуерът ще използва неутрални думи за пол, когато е възможно",
"gender-male": "Той редактира уики страниците",
"gender-female": "Тя редактира уики страниците",
- "prefs-help-gender": "УÑ\81Ñ\82ановÑ\8fванеÑ\82о на Ñ\82ази наÑ\81Ñ\82Ñ\80ойка не е задÑ\8aлжиÑ\82елно.\nСоÑ\84Ñ\82Ñ\83еÑ\80Ñ\8aÑ\82 използва поÑ\81оÑ\87ениÑ\8f Ñ\80од, за да Ñ\81е обÑ\8aÑ\80не кÑ\8aм ваÑ\81 Ñ\81Ñ\8aобÑ\80азно пола Ð\92и.\nÐ\98нÑ\84оÑ\80маÑ\86иÑ\8fÑ\82а Ñ\89е бÑ\8aде пÑ\83блиÑ\87но доÑ\81Ñ\82Ñ\8aпна.",
+ "prefs-help-gender": "УÑ\81Ñ\82ановÑ\8fванеÑ\82о на Ñ\82ази наÑ\81Ñ\82Ñ\80ойка не е задÑ\8aлжиÑ\82елно.\nСоÑ\84Ñ\82Ñ\83еÑ\80Ñ\8aÑ\82 използва поÑ\81оÑ\87ениÑ\8f Ñ\80од, за да Ñ\81е обÑ\8aÑ\80не кÑ\8aм Ð\92аÑ\81 Ñ\81Ñ\8aобÑ\80азно пола Ð\92и.\nÐ\98нÑ\84оÑ\80маÑ\86иÑ\8fÑ\82а Ñ\89е бÑ\8aде доÑ\81Ñ\82Ñ\8aпна пÑ\83блиÑ\87но.",
"email": "Е-поща",
"prefs-help-realname": "Истинското име не е задължително.\nАко го посочите, вашите приноси ще бъдат приписани на него.",
"prefs-help-email": "Електронната поща е незадължителна, но позволява възстановяване на забравена или загубена парола.",
"userrights-groups-help": "Може да променяте групите, в които е потребителят:\n* Поставена отметка означава, че потребителят е член на групата.\n* Поле без отметка означава, че потребителят не е член на групата.\n* Знакът * показва, че не можете да премахнете групата, след като е вече добавена (или обратно).\n* Знакът # показва, че можете да удължите само срокът на членството; не може да го върнете на по-ранна дата.",
"userrights-reason": "Причина:",
"userrights-no-interwiki": "Нямате права да редактирате потребителските групи на други уикита.",
- "userrights-nodatabase": "Ð\91азаÑ\82а данни $1 не Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва или не е на меÑ\81Ñ\82ния сървър.",
+ "userrights-nodatabase": "Ð\91азаÑ\82а данни $1 не Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва или не е на локалния сървър.",
"userrights-changeable-col": "Групи, които можете да променяте",
"userrights-unchangeable-col": "Групи, които не можете да променяте",
"userrights-irreversible-marker": "$1*",
"userrights-expiry-existing": "Текущото време на изтичане: $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": "Ð\98зÑ\82иÑ\87ане за гÑ\80Ñ\83паÑ\82а â\80\9e$1â\80\9c е невалидно.",
- "userrights-expiry-in-past": "Ð\98зÑ\82иÑ\87ане за гÑ\80Ñ\83паÑ\82а „$1“ е в миналото.",
+ "userrights-invalid-expiry": "СÑ\80окÑ\8aÑ\82 на изÑ\82иÑ\87ане за гÑ\80Ñ\83паÑ\82а â\80\9e$1â\80\9c е невалиден.",
+ "userrights-expiry-in-past": "СÑ\80окÑ\8aÑ\82 на изÑ\82иÑ\87ане на гÑ\80Ñ\83Ð¿а „$1“ е в миналото.",
"group": "Потребителска група:",
"group-user": "Потребители",
"group-autoconfirmed": "Автоматично одобрени потребители",
"right-applychangetags": "Задаване на [[Special:Tags|етикети]] заедно с направените промени",
"right-changetags": "Добавяне и премахване на произволни [[Special:Tags|етикети]] на индивидуални редакции и записи в дневници",
"right-deletechangetags": "Изтриване на [[Special:Tags|етикети]] от базата от данни",
- "grant-generic": "Ð\9dабоÑ\80 от права „$1“",
+ "grant-generic": "Ð\9fакеÑ\82 от права „$1“",
"grant-group-page-interaction": "Взаимодействие със страници",
"grant-group-file-interaction": "Взаимодействие с медийни файлове",
"grant-group-watchlist-interaction": "Взаимодействие с вашия списък за наблюдение",
"grant-createaccount": "Създаване на сметки",
"grant-createeditmovepage": "Създаване, редактиране и преместване на страници",
"grant-delete": "Изтриване на страници, редакции и записи в дневника",
- "grant-editinterface": "РедакÑ\82иÑ\80ане на пÑ\80оÑ\81Ñ\82Ñ\80анÑ\81Ñ\82воÑ\82о „МедияУики“ и глобалния/потребителския JSON",
+ "grant-editinterface": "РедакÑ\82иÑ\80ане на именноÑ\82о пÑ\80оÑ\81Ñ\82Ñ\80анÑ\81Ñ\82Ð²о „МедияУики“ и глобалния/потребителския JSON",
"grant-editmycssjs": "Редактиране на собствения CSS/JSON/JavaScript",
- "grant-editmyoptions": "РедакÑ\82иÑ\80ане на ваÑ\88иÑ\82е поÑ\82Ñ\80ебиÑ\82елÑ\81ки наÑ\81Ñ\82Ñ\80ойки и поÑ\81Ñ\82авеноÑ\81Ñ\82Ñ\82а на JSON",
+ "grant-editmyoptions": "РедакÑ\82иÑ\80ане на ваÑ\88иÑ\82е поÑ\82Ñ\80ебиÑ\82елÑ\81ки пÑ\80едпоÑ\87иÑ\82аниÑ\8f и JSON-конÑ\84игÑ\83Ñ\80аÑ\86иÑ\8fÑ\82а",
"grant-editmywatchlist": "Редактиране на списъка ви за наблюдение",
"grant-editsiteconfig": "Редактиране на глобалните и потребителските CSS/JS",
"grant-editpage": "Редактиране на съществуващи страници",
"uploadbtn": "Качване на файл",
"reuploaddesc": "Връщане към формуляра за качване",
"upload-tryagain": "Съхраняване на промененото описание на файла",
- "upload-tryagain-nostash": "СÑ\8aÑ\85Ñ\80анÑ\8fване на повторно качения файл и промененото описание",
+ "upload-tryagain-nostash": "Ð\98зпÑ\80аÑ\89ане на повторно качения файл и промененото описание",
"uploadnologin": "Не сте влезли",
"uploadnologintext": "За да могат да бъдат качвани файлове е необходимо $1 в системата.",
"upload_directory_missing": "Директорията за качване ($1) липсва и не може да бъде създадена на сървъра.",
"unwatchedpages": "Ненаблюдавани страници",
"listredirects": "Списък на пренасочванията",
"listduplicatedfiles": "Списък на повтарящи се файлове",
- "listduplicatedfiles-summary": "Това е Ñ\81пиÑ\81Ñ\8aк на Ñ\84айловеÑ\82е, за коиÑ\82о поÑ\81леднаÑ\82а веÑ\80Ñ\81иÑ\8f е дÑ\83бликаÑ\82 Ñ\81 поÑ\81леднаÑ\82а веÑ\80Ñ\81иÑ\8f на дÑ\80Ñ\83г Ñ\84айл. Ð\9fоказани Ñ\81а Ñ\81амо меÑ\81Ñ\82ните файлове.",
+ "listduplicatedfiles-summary": "Това е Ñ\81пиÑ\81Ñ\8aк на Ñ\84айловеÑ\82е, за коиÑ\82о поÑ\81леднаÑ\82а веÑ\80Ñ\81иÑ\8f е дÑ\83бликаÑ\82 Ñ\81 поÑ\81леднаÑ\82а веÑ\80Ñ\81иÑ\8f на дÑ\80Ñ\83г Ñ\84айл. Ð\9fоказани Ñ\81а Ñ\81амо локалните файлове.",
"listduplicatedfiles-entry": "[[:File:$1|$1]] има [[$3|{{PLURAL:$2|дубликат|$2 дубликата}}]].",
"unusedtemplates": "Неизползвани шаблони",
"unusedtemplatestext": "Тази страница съдържа списък на страниците в именно пространство {{ns:template}}, които не са включени в друга страница. Проверявайте за препратки към отделните шаблони преди да ги изтриете или предложите за изтриване.",
"statistics": "Статистика",
"statistics-header-pages": "Статистики за страницата",
"statistics-header-edits": "Статистики за редакциите",
- "statistics-header-users": "СÑ\82аÑ\82иÑ\81Ñ\82ики за поÑ\82Ñ\80ебиÑ\82елиÑ\82е",
+ "statistics-header-users": "Ð\9fоÑ\82Ñ\80ебиÑ\82елÑ\81ки Ñ\81Ñ\82аÑ\82иÑ\81Ñ\82ики",
"statistics-header-hooks": "Други статистики",
"statistics-articles": "Съдържателни страници",
"statistics-pages": "Страници",
"pager-older-n": "{{PLURAL:$1|по-стара 1|по-стари $1}}",
"suppress": "Подтискане",
"querypage-disabled": "Тази специална страница е изключена, защото затруднява производителността на уикито.",
- "apihelp": "Помощ за приложението",
+ "apihelp": "Помощ за API-то",
"apihelp-no-such-module": "Модул „$1“ не беше намерен.",
"apisandbox": "Пясъчник за API",
"apisandbox-submit": "Направи запитване",
"apisandbox-alert-field": "Стойността на това поле не е валидна.",
"apisandbox-continue": "Продължаване",
"apisandbox-continue-clear": "Изчистване",
- "apisandbox-param-limit": "Ð\92Ñ\8aведеÑ\82е <kbd>max</kbd> за използване на кÑ\80айниÑ\8f пÑ\80едел.",
+ "apisandbox-param-limit": "Ð\92Ñ\8aведеÑ\82е <kbd>max</kbd> за използване на макÑ\81ималнаÑ\82а Ñ\81Ñ\82ойноÑ\81Ñ\82.",
"apisandbox-multivalue-all-namespaces": "$1 (Всички именни пространства)",
"apisandbox-multivalue-all-values": "$1 (Всички стойности)",
"booksources": "Източници на книги",
"booksources-text": "По-долу е списъкът от връзки към други сайтове, продаващи нови и използвани книги или имащи повече информация за книгите, които търсите:",
"booksources-invalid-isbn": "Предоставеният ISBN изглежда е невалиден; проверете за грешки и копирайте от оригиналния източник.",
"magiclink-tracking-rfc": "Страници, използващи вълшебни препратки RFC",
+ "magiclink-tracking-rfc-desc": "Тази страница използва вълшебни препратки RFC. Вижте [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] как да ги пренесете.",
"magiclink-tracking-pmid": "Страници, използващи вълшебни препратки PMID",
"magiclink-tracking-pmid-desc": "Тази страница използва вълшебни препратки PMID. Вижте [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] как да ги пренесете.",
"magiclink-tracking-isbn": "Страници, използващи вълшебни препратки ISBN",
"trackingcategories-name": "Име на съобщението",
"trackingcategories-desc": "Критерий за включване на категория",
"restricted-displaytitle-ignored": "Страници с игнорирани заглавия за показване",
+ "restricted-displaytitle-ignored-desc": "Страницата съдържа игнориран <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, защото той не съвпада с текущото заглавие на страницата.",
+ "expensive-parserfunction-category-desc": "Страницата използва твърде много ресурсоемки анализиращи функции (като <code>#ifexist</code>). Вижте [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+ "broken-file-category-desc": "Страницата съдържа повредена препратка за файл (препратка за поставяне на файл, когато такъв не съществува).",
"trackingcategories-nodesc": "Няма налично описание.",
"trackingcategories-disabled": "Категорията е деактивирана",
"mailnologin": "Няма електронна поща",
"anoncontribs": "Приноси",
"contribsub2": "За {{GENDER:$3|$1}} ($2)",
"contributions-userdoesnotexist": "Няма регистрирана потребителска сметка за „$1“.",
- "negative-namespace-not-supported": "Ð\9dе Ñ\81а поддÑ\8aÑ\80жани именни пÑ\80оÑ\81Ñ\82Ñ\80анÑ\81Ñ\82ва Ñ\81 негаÑ\82ивни Ñ\81Ñ\82ойноÑ\81Ñ\82и.",
+ "negative-namespace-not-supported": "Ð\98менни пÑ\80оÑ\81Ñ\82Ñ\80анÑ\81Ñ\82ва Ñ\81 негаÑ\82ивни Ñ\81Ñ\82ойноÑ\81Ñ\82и не Ñ\81е поддÑ\8aÑ\80жаÑ\82.",
"nocontribs": "Не са намерени промени, отговарящи на критерия.",
"uctop": "текуща",
"month": "От месец (и по-рано):",
"ipb-blocklist-contribs": "Приноси на {{GENDER:$1|$1}}",
"ipb-blocklist-duration-left": "{{PLURAL:$1|остава още $1|остават още $1}}",
"block-actions": "Действия за блокиране:",
- "block-expiry": "Срок:",
- "block-options": "Ð\94опÑ\8aлниÑ\82елни вÑ\8aзможноÑ\81Ñ\82и:",
+ "block-expiry": "Срок на изтичане:",
+ "block-options": "Ð\94опÑ\8aлниÑ\82елни наÑ\81Ñ\82Ñ\80ойки:",
"block-prevent-edit": "Редактиране",
"block-reason": "Причина:",
"block-target": "Потребителско име или IP-адрес:",
"createaccountblock": "създаването на сметки е блокирано",
"emailblock": "е-пощенската услуга е блокирана",
"blocklist-nousertalk": "забрана за редактиране на личната беседа",
- "blocklist-editing": "Редактиране",
- "blocklist-editing-sitewide": "Редактиране (за всички уики)",
+ "blocklist-editing": "редактиране",
+ "blocklist-editing-sitewide": "редактиране (за всички уикита)",
"blocklist-editing-page": "страници",
"blocklist-editing-ns": "именни пространства",
"ipblocklist-empty": "Списъкът на блокиранията е празен.",
"ipb_expiry_old": "Срокът на изтичане е минал.",
"ipb_expiry_temp": "Скритите потребителски имена трябва да се блокират безсрочно.",
"ipb_hide_invalid": "Тази потребителска сметка не може да бъде прикрита; с нея са направени повече от {{PLURAL:$1|една редакция|$1 редакции}}.",
- "ipb_hide_partial": "СкÑ\80иÑ\82иÑ\82е забÑ\80ани за потребителски имена трябва да се прилагат за цяло уики.",
+ "ipb_hide_partial": "СкÑ\80иÑ\82иÑ\82е блокиÑ\80аниÑ\8f на потребителски имена трябва да се прилагат за цяло уики.",
"ipb_already_blocked": "„$1“ е вече блокиран.",
"ipb-needreblock": "$1 е вече блокиран. Желаете ли да промените настройките?",
"ipb-otherblocks-header": "{{PLURAL:$1|Друго блокиране|Други блокирания}}",
"ip_range_invalid": "Невалиден диапазон на IP-адреси.",
"ip_range_toolarge": "Забранено е блокиране на диапазони от IP адреси по-големи от /$1.",
"ip_range_exceeded": "IP диапазонът превишава максималния диапазон. Позволен диапазон: /$1.",
- "ip_range_toolow": "IP диапазоните не са позволени.",
+ "ip_range_toolow": "IP-диапазоните не са позволени.",
"proxyblocker": "Блокировач на проксита",
"proxyblockreason": "IP-адресът Ви беше блокиран, тъй като представлява анонимно достъпен междинен сървър.\nСвържете се с доставчика си на Интернет и го информирайте за този сериозен проблем в сигурността.",
"sorbs": "DNSBL",
"import-interwiki-history": "Копиране на всички версии на страницата",
"import-interwiki-templates": "Включване на всички шаблони",
"import-interwiki-submit": "Внасяне",
- "import-mapping-default": "Ð\92наÑ\81Ñ\8fне в Ñ\81Ñ\82андаÑ\80Ñ\82ни меÑ\81Ñ\82а",
+ "import-mapping-default": "Ð\92наÑ\81Ñ\8fне в Ñ\81Ñ\82андаÑ\80Ñ\82ни меÑ\81Ñ\82оположениÑ\8f",
"import-mapping-namespace": "Импортиране в именно пространство:",
"import-mapping-subpage": "Импортиране като подстраници на следната страница:",
"import-upload-filename": "Име на файл:",
"tooltip-n-help": "Място, където може да се информирате",
"tooltip-t-whatlinkshere": "Списък на всички страници, сочещи насам",
"tooltip-t-recentchangeslinked": "Последните промени на страници, сочени от тази страница",
- "tooltip-feed-rss": "RSS feed за страницата",
+ "tooltip-feed-rss": "RSS-хранилка за страницата",
"tooltip-feed-atom": "Atom feed за страницата",
"tooltip-t-contributions": "Списък на приносите на {{GENDER:$1|потребителя}}",
"tooltip-t-emailuser": "Изпращане на писмо до {{GENDER:$1|потребителя}}",
"tooltip-watchlistedit-normal-submit": "Премахване на заглавия",
"tooltip-watchlistedit-raw-submit": "Обновяване на списъка за наблюдение",
"tooltip-recreate": "Възстановяване на страницата независимо, че е била изтрита",
- "tooltip-upload": "Ð\97апоÑ\87ване на качването",
+ "tooltip-upload": "Ð\9dаÑ\87ало на качването",
"tooltip-rollback": "Чрез „отмяна“ ще премахнете наведнъж всички промени, нанесени от последния редактор",
"tooltip-undo": "Препратката „връщане“ премахва тази редакция и отваря страницата за редактиране в режим на предварителен преглед.\nВ полето за резюме може да се впише причина за връщането.",
"tooltip-preferences-save": "Съхраняване на предпочитанията",
"pageinfo-file-hash": "Хеш-стойност",
"pageinfo-view-protect-log": "Преглед на дневника на защитата за тази страница.",
"markaspatrolleddiff": "Отбелязване на редакцията като патрулирана",
- "markaspatrolledtext": "Отбелязване на редакцията като проверена",
- "markaspatrolledtext-file": "Отбелязване на версията на файла като проверена",
- "markedaspatrolled": "Проверена редакция",
+ "markaspatrolledtext": "Отбелязване на редакцията като патрулирана",
+ "markaspatrolledtext-file": "Отбелязване на версията на файла като патрулирана",
+ "markedaspatrolled": "Патрулирана редакция",
"markedaspatrolledtext": "Избраната редакция на [[:$1]] беше отбелязана като патрулирана.",
"rcpatroldisabled": "Патрулът е деактивиран",
"rcpatroldisabledtext": "Патрулирането на последните промени е деактивирано.",
- "markedaspatrollederror": "Не е възможно да се отбележи като проверена",
- "markedaspatrollederrortext": "Необходимо е да се посочи редакция, която да бъде отбелязана като проверена.",
+ "markedaspatrollederror": "Не е възможно да се отбележи като патрулирана",
+ "markedaspatrollederrortext": "Необходимо е да се посочи редакция, която да бъде отбелязана като патрулирана.",
"markedaspatrollederror-noautopatrol": "Не е разрешено да маркирате своите редакции като патрулирани.",
"markedaspatrollednotify": "Редакцията на $1 беше отбелязана като патрулирана.",
"markedaspatrollederrornotify": "Неуспешно отбелязване на редакция като патрулирана.",
"newimages-user": "IP-адрес или потребителско име",
"newimages-newbies": "Показване на приносите само на нови потребители",
"newimages-showbots": "Показване на качвания от ботове",
- "newimages-hidepatrolled": "Скриване на проверените качвания",
+ "newimages-hidepatrolled": "Скриване на патрулираните качвания",
"newimages-mediatype": "Файлов тип:",
"noimages": "Няма нищо.",
"gallery-slideshow-toggle": "Превключване на миниатюрите",
"confirm-mcrrestore-title": "Възстановяване на версия",
"confirm-mcrundo-title": "Връщане на промяна",
"mcrundofailed": "Неуспех при връщане",
- "mcrundo-missingparam": "Липсващи задължителни параметри на заявката",
+ "mcrundo-missingparam": "Липсващи задължителни параметри на заявката.",
"semicolon-separator": "; ",
"comma-separator": ", ",
"colon-separator": ": ",
"autosumm-changed-redirect-target": "Промяна на целта на пренасочване от [[$1]] на [[$2]]",
"autosumm-new": "Нова страница: „$1“",
"autosumm-newblank": "Създаване на празна страница",
- "lag-warn-normal": "Промените от {{PLURAL:$1|последната $1 секунда|последните $1 секунди}} вероятно не са показани в списъка.",
- "lag-warn-high": "Поради голямото изоставане в сървърната синхронизация, промените от {{PLURAL:$1|последната $1 секунда|последните $1 секунди}} вероятно не са показани в списъка.",
+ "lag-warn-normal": "Промените от {{PLURAL:$1|последната секунда|последните $1 секунди}} вероятно не са показани в списъка.",
+ "lag-warn-high": "Поради голямото изоставане в сървърната синхронизация, промените от {{PLURAL:$1|последната секунда|последните $1 секунди}} вероятно не са показани в списъка.",
"watchlistedit-normal-title": "Редактиране на списъка за наблюдение",
"watchlistedit-normal-legend": "Премахване на записи от списъка за наблюдение",
"watchlistedit-normal-explain": "По-долу са показани заглавията на страниците от списъка ви за наблюдение.\nЗа да премахнете страница, отбележете полето пред нея и щракнете на бутона „{{int:Watchlistedit-normal-submit}}“.\nМожете също да редактирате [[Special:EditWatchlist/raw|необработения списък за наблюдение]].",
"tags-edit": "редактиране",
"tags-delete": "изтриване",
"tags-activate": "активиране",
- "tags-deactivate": "спиране",
+ "tags-deactivate": "деактивиране",
"tags-hitcount": "$1 {{PLURAL:$1|промяна|промени}}",
"tags-manage-no-permission": "Нямате права за управление на етикети за промени.",
"tags-manage-blocked": "Не може да управлявате етикети за промени, докато сте {{GENDER:$1|блокирани}}.",
"authmanager-email-help": "Електронна поща",
"authmanager-realname-label": "Истинско име",
"authmanager-realname-help": "Истинско име на потребителя",
- "authmanager-provider-password": "Ð\90вÑ\82енÑ\82икаÑ\86иÑ\8f с парола",
+ "authmanager-provider-password": "УдоÑ\81Ñ\82овеÑ\80Ñ\8fване с парола",
"authmanager-provider-temporarypassword": "Временна парола",
"authprovider-confirmlink-option": "$1 ($2)",
"authprovider-confirmlink-failed-line": "$1: $2",
"specialpage-securitylevel-not-allowed-title": "Не е позволено",
"cannotauth-not-allowed-title": "Достъпът е отказан",
"cannotauth-not-allowed": "Не ви е позволено да използвате тази страница",
- "changecredentials": "Ð\9fÑ\80омÑ\8fна на поÑ\82Ñ\80ебиÑ\82елÑ\81ките данни",
- "changecredentials-submit": "Ð\9fÑ\80омÑ\8fна на паÑ\80ола",
- "removecredentials": "Ð\9fÑ\80емаÑ\85ване на поÑ\82Ñ\80ебиÑ\82елÑ\81ките данни",
- "removecredentials-submit": "Ð\9fÑ\80емаÑ\85ване на поÑ\82Ñ\80ебиÑ\82елÑ\81ките данни",
- "credentialsform-provider": "Тип на авÑ\82енÑ\82икаÑ\86иÑ\8fÑ\82а:",
+ "changecredentials": "Ð\9fÑ\80омÑ\8fна на иденÑ\82иÑ\84икаÑ\86ионните данни",
+ "changecredentials-submit": "Ð\9fÑ\80омÑ\8fна на иденÑ\82иÑ\84икаÑ\86ионниÑ\82е данни",
+ "removecredentials": "Ð\9fÑ\80емаÑ\85ване на иденÑ\82иÑ\84икаÑ\86ионните данни",
+ "removecredentials-submit": "Ð\9fÑ\80емаÑ\85ване на иденÑ\82иÑ\84икаÑ\86ионните данни",
+ "credentialsform-provider": "Тип на иденÑ\82иÑ\84икаÑ\86ионниÑ\82е данни:",
"credentialsform-account": "Име на сметка:",
"linkaccounts": "Свързване на сметки",
"linkaccounts-success-text": "Сметката беше свързана.",
"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 à¦\95à§\87 à¦\8fà¦\95à¦\9fি পà§\81রাতন সà¦\82সà§\8dà¦\95রণà§\87 {{GENDER:$2|পà§\8dরতà§\8dযাবরà§\8dতন à¦\95রà§\87à¦\9bà§\87ন}}",
"log-name-managetags": "ট্যাগ ব্যবস্থাপনা লগ",
"log-description-managetags": "এই পাতাতে [[Special:Tags|ট্যাগ]] ব্যবস্থাপনা কার্যাবলির একটি তালিকা আছে। এই লগে কেবলমাত্র সেইসব কর্মের তালিকা আছে, যেগুলি একজন প্রশাসক নিজ হাতে সম্পাদন করেছেন; উইকি সফটওয়্যার দিয়ে ট্যাগ সৃষ্টি বা অপসারণ করা সম্ভব, যার কোন ভুক্তি এই লগে সংরক্ষিত হবে না।",
"logentry-managetags-create": "$1 \"$4\" ট্যাগটি {{GENDER:$2|তৈরি করেছেন}}",
"badretype": "Die beiden Passwörter stimmen nicht überein.",
"usernameinprogress": "Eine Benutzerkontenerstellung für diesen Benutzernamen ist bereits in Bearbeitung.\nBitte warten.",
"userexists": "Dieser Benutzername ist schon vergeben.\nBitte wähle einen anderen.",
+ "createacct-normalization": "Dein Benutzername wird aufgrund technischer Beschränkungen zu „$2“ geändert.",
"loginerror": "Fehler bei der Anmeldung",
"createacct-error": "Fehler beim Erstellen des Benutzerkontos",
"createaccounterror": "Benutzerkonto konnte nicht erstellt werden: $1",
"badretype": "Syöttämäsi salasanat ovat keskenään erilaiset.",
"usernameinprogress": "Tunnuksen luominen tälle käyttäjänimelle on parhaillaan käynnissä.\nOle hyvä ja odota.",
"userexists": "Pyytämäsi käyttäjänimi on jo käytössä. Valitse toinen käyttäjänimi.",
+ "createacct-normalization": "Käyttäjätunnuksesi muutetaan muotoon \"$2\" teknisten rajoitusten vuoksi.",
"loginerror": "Sisäänkirjautumisvirhe",
"createacct-error": "Virhe tunnuksen luomisessa",
"createaccounterror": "Tunnuksen luonti ei onnistunut: $1",
"badretype": "Les mots de passe que vous avez saisis ne correspondent pas.",
"usernameinprogress": "Une création de compte pour ce nom d’utilisateur est déjà en cours.\nVeuillez patienter.",
"userexists": "Le nom d’utilisateur saisi est déjà utilisé.\nVeuillez choisir un nom différent.",
+ "createacct-normalization": "Votre nom d’utilisateur sera modifié en « $2 » à cause de restrictions techniques.",
"loginerror": "Erreur de connexion",
"createacct-error": "Erreur lors de la création du compte",
"createaccounterror": "Impossible de créer le compte : $1",
"category_header": "Siden yn de kategory \"$1\"",
"subcategories": "Subkategoryen",
"category-media-header": "Media yn de kategory \"$1\"",
- "category-empty": "<em>Yn dizze kategory binne gjin siden of triemmen opnaam.</em>",
+ "category-empty": "<em>Yn dizze kategory binne gjin siden of bestannen opnaam.</em>",
"hidden-categories": "Ferburgen {{PLURAL:$1|kategory|kategoryen}}",
"hidden-category-category": "Ferburgen kategoryen",
"category-subcat-count": "{{PLURAL:$2|Dizze kategory hat allinne de folgjende ûnderkategory.|Dizze kategory hat de folgjende {{PLURAL:$1|ûnderkategory|$1 ûnderkategoryen}}, fan yn totaal $2.}}",
"category-subcat-count-limited": "Dizze kategory hat de folgjende {{PLURAL:$1|ûnderkategory|$1 ûnderkategoryen}}.",
"category-article-count": "{{PLURAL:$2|Dizze kategory befettet allinne de folgjende side.|De folgjende {{PLURAL:$1|side is|$1 siden binne}} yn dizze kategory, fan yn totaal $2.}}",
"category-article-count-limited": "De folgjende {{PLURAL:$1|side is|$1 siden binne}} yn dizze kategory.",
- "category-file-count": "{{PLURAL:$2|Dizze kategory befettet de folgjende triem.|Dizze kategory befettet {{PLURAL:$1|de folgjende triem|$1 de folgjende triemmen}}, fan yn totaal $2.}}",
- "category-file-count-limited": "Dizze kategory befettet {{PLURAL:$1|de folgjende triem|de folgjende $1 triemmen}}.",
+ "category-file-count": "{{PLURAL:$2|Dizze kategory befettet it folgjende bestân.|Dizze kategory befettet {{PLURAL:$1|it folgjende bestân|$1 de folgjende bestannen}}, fan yn totaal $2.}}",
+ "category-file-count-limited": "Dizze kategory befettet {{PLURAL:$1|it folgjende bestân|de folgjende $1 bestannen}}.",
"listingcontinuesabbrev": "(ferfolch)",
"index-category": "Yndeksearre siden",
"noindex-category": "Net-yndeksearre siden",
"history": "Sideskiednis",
"history_short": "Skiednis",
"updatedmarker": "bewurke sûnt myn lêste besite",
- "printableversion": "Ofdruk-ferzje",
+ "printableversion": "Ofdrukferzje",
"permalink": "Fêste keppeling",
"print": "Ofdrukke",
"view": "Lêze",
"protect_change": "feroarje nivo fan skoatteljen",
"unprotect": "Jou frij",
"newpage": "Nije side",
- "talkpagelinktext": "Oerlis",
+ "talkpagelinktext": "oerlis",
"specialpage": "Bysûndere side",
"personaltools": "Persoanlike ynstellingen",
"talk": "Oerlis",
- "views": "Aspekten/aksjes",
- "toolbox": "Arkkiste",
+ "views": "Werjeften",
+ "toolbox": "Ark",
"imagepage": "Besjoch triemside",
"mediawikipage": "Berjochtside sjen litte",
"templatepage": "Berjochtside lêze",
"mainpage": "Haadside",
"mainpage-description": "Haadside",
"policy-url": "Project:Belied",
- "portal": "Brûkersportaal",
- "portal-url": "Project:Brûkersportaal",
+ "portal": "Mienskipsportaal",
+ "portal-url": "Project:Mienskipsportaal",
"privacy": "Privacybelied",
"privacypage": "Project:Privacybelied",
"badaccess": "Gjin tastimming",
"nstab-media": "Mediaside",
"nstab-special": "Bysûndere side",
"nstab-project": "Projektside",
- "nstab-image": "Triem",
+ "nstab-image": "Bestân",
"nstab-mediawiki": "Berjocht",
"nstab-template": "Berjocht",
"nstab-help": "Helpside",
"readonly_lag": "De database is automatysk beskoattele wylst de ûndergeskikte databaseservers syngronisearje mei de haadserver.",
"internalerror": "Ynterne fout",
"internalerror_info": "Ynterne fout: $1",
- "filecopyerror": "Koe triem \"$1\" net kopiearje as \"$2\".",
- "filerenameerror": "Koe triem \"$1\" net omneame as \"$2\".",
- "filedeleteerror": "Koe triem \"$1\" net wiskje.",
+ "filecopyerror": "Koe bestân \"$1\" net kopiearje as \"$2\".",
+ "filerenameerror": "Koe bestân \"$1\" net omneame as \"$2\".",
+ "filedeleteerror": "Koe bestân \"$1\" net wiskje.",
"directorycreateerror": "Map \"$1\" koe net oanmakke wurde.",
- "filenotfound": "Koe triem \"$1\" net fine.",
+ "filenotfound": "Koe bestân \"$1\" net fine.",
"unexpected": "Hommelse wearde: \"$1\"=\"$2\".",
"formerror": "Flater: Koe formulier net oerlizze",
"badarticleerror": "Dat kin op dizze side net dien wurden.",
"nowiki_tip": "Negearje it wiki formaat",
"image_sample": "Foarbyld.jpg",
"image_tip": "Mediatriem",
- "media_tip": "Link nei triem",
+ "media_tip": "Link nei bestân",
"sig_tip": "Jo hântekening mei dei en oere",
"hr_tip": "Horizontale line (mei ferdrach brûke)",
"summary": "Gearfetting:",
"revisiondelete": "Wiskje/weromsette ferzjes",
"revdelete-nooldid-title": "Gjin doelferzje",
"revdelete-nooldid-text": "Jo hawwe gjin doelferzje(s) foar dizze hanneling opjûn, de oanjûne ferzje bestiet net, of jo besykje de lêste ferzje te ferskûljen.",
- "revdelete-no-file": "De spesifisearre triem bestiet net.",
+ "revdelete-no-file": "It spesifisearre bestân bestiet net.",
"revdelete-show-file-submit": "Ja",
"logdelete-selected": "{{PLURAL:$1|keazen lochboekregel|keazen lochboekregels}}:",
"revdelete-legend": "Sichtberensbeheinings ynstelle.",
"revdelete-hide-text": "De bewurke tekst ferskûlje",
- "revdelete-hide-image": "Triem ynhâld ferskûlje",
+ "revdelete-hide-image": "Bestânsynhâld ferskûlje",
"revdelete-hide-name": "Aksje en doel ferskûlje",
"revdelete-hide-comment": "Bewurkingsgearfetting",
"revdelete-hide-user": "Meidoggernamme/IP fan de meidogger ferskûlje",
"searchprofile-everything": "Alles",
"searchprofile-advanced": "Utwreide",
"searchprofile-articles-tooltip": "Sykje yn $1",
- "searchprofile-images-tooltip": "Sykje om triemmen",
+ "searchprofile-images-tooltip": "Sykje om bestannen",
"searchprofile-everything-tooltip": "Alle ynhâld trochsykje (ynklusyf oerlissiden)",
"searchprofile-advanced-tooltip": "Sykje yn oanjûne nammerûmten",
"search-result-size": "$1 ({{PLURAL:$2|1 wurd|$2 wurden}})",
"prefs-searchoptions": "Sykje",
"prefs-namespaces": "Nammeromten",
"default": "standert",
- "prefs-files": "Triemmen",
+ "prefs-files": "Bestannen",
"prefs-custom-js": "Persoanlik JS",
"prefs-emailconfirm-label": "E-mailbefêstiging:",
"youremail": "E-mail:",
"right-move": "Siden werneamen",
"right-move-subpages": "Siden ynklusyf har subsiden ferpleatse.",
"right-move-rootuserpages": "Brûkerssiden fan it heechste nivo in oare namme jaan",
- "right-movefile": "Triemmen in oare namme jaan",
+ "right-movefile": "Bestannen in oare namme jaan",
"right-suppressredirect": "In trochferwizing op 'e doelside fuorthelje by werneamen fan in side",
- "right-upload": "Triemmen oanbieden",
- "right-reupload": "In besteande triem oerskriuwen",
- "right-reupload-own": "Sels heechladene triemmen oerskriuwe",
+ "right-upload": "Bestannen oanbiede",
+ "right-reupload": "In besteand bestân oerskriuwen",
+ "right-reupload-own": "Sels heechladene bestannen oerskriuwe",
"right-reupload-shared": "Media út 'e dielde mediadatabank lokaal oerskriuwe",
- "right-upload_by_url": "Triemen oanbieden fia in URL",
+ "right-upload_by_url": "Bestannen oanbiede fia in URL",
"right-purge": "De cache foar in side leegje sûnder befêstiging",
"right-autoconfirmed": "Behannele wurde as in registrearre brûker",
"right-bot": "Behannele wurde as in automatisearre proses",
"right-protect": "Befeiligingsnivo's feroarje en beskerme siden bewurkje",
"right-editprotected": "Befeilige siden bewurkje (sûnder cascading-befeiliging)",
"right-editinterface": "Brûkersinterface bewurkje",
- "right-editusercss": "De CSS-triemmen fan oare brûkers bewurkje",
- "right-edituserjson": "De JSON-triemmen fan oare brûkers bewurkje",
- "right-edituserjs": "De JS-triemmen fan oare brûkers bewurkje",
+ "right-editusercss": "De CSS-bestannen fan oare brûkers bewurkje",
+ "right-edituserjson": "De JSON-bestannen fan oare brûkers bewurkje",
+ "right-edituserjs": "De JS-bestannen fan oare brûkers bewurkje",
"right-rollback": "Gau de lêste bewurking(s) fan in brûker fan in side tebekdraaie",
"right-markbotedits": "Tebekdraaide bewurkings markearje as botbewurkings",
"right-noratelimit": "Hat gjin tiidsôfhinklike beheinings",
"action-move-subpages": "dizze side en de derby hearrende subsiden in oare namme te jaan",
"action-move-rootuserpages": "meidoggersiden fan it heechste nivo in oare namme te jaan",
"action-move-categorypages": "categorysiden ferpleatse",
- "action-movefile": "dizze triem in oare namme te jaan",
- "action-upload": "dizze triem te opladen",
- "action-reupload": "dizze besteande triem te oerskriuwen",
- "action-reupload-shared": "dizze triem te opladen, wylst der al in triem mei deselde namme yn 'e dielde repository stiet",
- "action-upload_by_url": "dizze triem fan in URL ôf op te laden",
+ "action-movefile": "dit bestân in oare namme jaan",
+ "action-upload": "dit bestân oplade",
+ "action-reupload": "dit besteande bestân te oerskriuwen",
+ "action-reupload-shared": "dit bestân oplade, wylst der al in bestân mei deselde namme yn 'e dielde repository stiet",
+ "action-upload_by_url": "dit bestân fan in URL ôf oplade",
"action-writeapi": "fia de API te bewurkjen",
"action-delete": "dizze side fuort te heljen",
"action-deleterevision": "dizze ferzje fuort te heljen",
"action-block": "dizze meidogger in bewurkingsblokkade oplizze",
"action-protect": "it befeiligingsnivo fan dizze side oanpasse",
"action-import": "dizze side fan in oare wiki ymportearje",
- "action-importupload": "dizze side ymportearje fan in triem-oplading",
+ "action-importupload": "dizze side ymportearje fan in bestânsoplading",
"action-patrol": "bewurkings fan oaren as kontrolearre beskôgje",
"action-autopatrol": "eigen bewurkings as kontrolearre markearje litte",
"action-unwatchedpages": "de list mei siden dy't net op in folchlist steane besjen",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 folgjende {{PLURAL:$1|meidogger|meidoggers}}]",
"rc-change-size": "$1",
- "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} nei de wiziging",
+ "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} nei wiziging",
"newsectionsummary": "/* $1 */ nije seksje",
"rc-enhanced-expand": "Details werjaan",
"rc-enhanced-hide": "Details ferskûlje",
"recentchangeslinked-summary": "Dizze spesjale side lit de lêste bewurkings sjen op siden dy't keppele wurde fan in spesifisearre side ôf (of fan in spesifisearre Kategory ôf). Siden dy't op [[Special:Watchlist|jo folchlist]] steane, wurde '''tsjûk''' werjûn.",
"recentchangeslinked-page": "Sidenamme:",
"recentchangeslinked-to": "Feroarings oan siden mei ferwizings nei dizze side besjen",
- "upload": "Bied triem oan",
- "uploadbtn": "Bied triem oan",
+ "upload": "Bied bestân oan",
+ "uploadbtn": "Bied bestân oan",
"reuploaddesc": "Werom nei oanbied-side.",
"uploadnologin": "Net oanmeld",
- "uploadnologintext": "Jo moatte [[Special:UserLogin|oanmeld]] wêze om in triem oanbiede te kinnen.",
+ "uploadnologintext": "Jo moatte [[Special:UserLogin|oanmeld]] wêze om in bestân oanbiede te kinnen.",
"upload_directory_missing": "De heechlaadmap ($1) is der net en koe net oanmakke wurde troch de webserver.",
"upload_directory_read_only": "De webserver kin net skriuwe yn de oanbiedpad ($1).",
"uploaderror": "Oanbiedfout",
- "uploadtext": "Om in nije triemmen oan te bieden, brûke jo de ûndersteande formulier. Earder oanbeane triemmen, kinne jo fine op de [[Special:FileList|list fan oanbeane ôfbylden]].\nWat oanbean en wat wiske wurdt, wurdt delskreaun yn it [[Special:Log/upload|lochboek]].\n\nOm de triem yn in side op te nimmen, meitsje jo dêr sa'n keppeling:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:jo_foto.jpg]]</nowiki></code>''', foar grutte ferzje,\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:jo_logo.png|omskriuwing]]</nowiki></code>''' foar 200 in piksel ferzje, mei 'alternative tekst' as beskriuwing, of\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:jo_lûd.ogg]]</nowiki></code>''', foar direkt keppeling nei de triem (sûnder byld).",
+ "uploadtext": "Om in nije bestannen oan te bieden, brûke jo de ûndersteande formulier. Earder oanbeane bestannen, kinne jo fine op de [[Special:FileList|list fan oanbeane ôfbylden]].\nWat oanbean en wat wiske wurdt, wurdt delskreaun yn it [[Special:Log/upload|lochboek]].\n\nOm it bestân yn in side op te nimmen, meitsje jo dêr sa'n keppeling:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:jo_foto.jpg]]</nowiki></code>''', foar grutte ferzje,\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:jo_logo.png|omskriuwing]]</nowiki></code>''' foar 200 in piksel ferzje, mei 'alternative tekst' as beskriuwing, of\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:jo_lûd.ogg]]</nowiki></code>''', foar direkt keppeling nei it bestân (sûnder byld).",
"upload-permitted": "Talitten triemtypen: $1.",
"upload-preferred": "Oanwiisde triemtypen: $1.",
"upload-prohibited": "Ferbeane triemtypen: $1.",
"uploadlogpage": "Oanbiedloch",
- "uploadlogpagetext": "List fan de lêst oanbeane triemmen. (Tiid oanjûn as UTC).",
+ "uploadlogpagetext": "List fan de lêst oanbeane bestannen. (Tiid oanjûn as UTC).",
"filename": "Triemnamme",
"filedesc": "Omskriuwing",
"fileuploadsummary": "Gearfetting:",
"filereuploadsummary": "Triemferoarings:",
"filestatus": "Auteursrjochtensituaasje:",
"filesource": "Boarne:",
- "ignorewarning": "Negearje de warskôging en lis triem dochs fêst.",
+ "ignorewarning": "Negearje de warskôging en lis bestân dochs fêst.",
"ignorewarnings": "Negearje warskôgings",
"minlength1": "Triemnammen moatte minstens út ien teken bestean.",
- "illegalfilename": "De triemnamme \"$1\" befettet ûnjildige tekens.\nJou de triem in oare namme en besykje him dan op'e nij heech te laden.",
+ "illegalfilename": "De bestânsnamme \"$1\" befettet ûnjildige tekens.\nJou it bestân in oare namme en besykje him dan op 'e nij heech te laden.",
"badfilename": "De ôfbyldnamme is feroare nei \"$1\".",
- "filetype-badmime": "Triemmen fan it MIME type \"$1\" meie net heechladen wurde.",
- "filetype-bad-ie-mime": "Dizze triem kin net tafoege wurde, om't Internet Explorer dy idintifisearje soe as \"$1\", in net talitten triemtype dat potinsjeel skealik is.",
- "filetype-unwanted-type": "'''\".$1\"''' is in net winske triem-type.\n{{PLURAL:$3|Oanwiisd triem-type is|Oanwiisde triem-typen binne}} $2.",
- "filetype-banned-type": "'''\".$1\"''' is gjin talitten triem-type.\n{{PLURAL:$3|Talitten triem-type is|Talittene triem-typen binne}} $2.",
- "filetype-missing": "De triem hat gjin taheaksel (lykas \".jpg\").",
- "large-file": "Oanbefelling: meitsje triemmen net grutter as $1; dizze triem is $2.",
- "largefileserver": "De triem is grutter as dat de ynstelling fan de server talit.",
- "emptyfile": "De triem dy jo heechladen hawwe liket leech te wêzen.\nDat soe komme kinne fan in typflater yn 'e triemnamme.\nGean nei oft jo dizze triem wier bedoelden heech te laden.",
- "fileexists": "Der bestiet al in triem mei dizze namme.\nKontrolearje <strong>[[:$1]]</strong> as jo net wis binne oft jo de besteande triem oerskriuwe wolle.\n[[$1|thumb]]",
- "filepageexists": "De beskriuwingsside foar dizze triem bestiet al op <strong>[[:$1]]</strong>, mar der bestiet gjin triem mei dizze namme.\nDe gearfetting dy't jo opjûn hawwe sil net op 'e beskriuwingsside ferskine.\nBewurkje de side mei de hân om de beskriuwing dêr wer te jaan.",
- "fileexists-extension": "In triem mei deselde namme bestiet al: [[$2|thumb]]\n* Namme fan 'e heechladene triem: <strong>[[:$1]]</strong>\n* Namme fan 'e besteande triem: <strong>[[:$2]]</strong>\nKies in oare namme.",
- "fileexists-thumbnail-yes": "De triem liket in ferlytse ferzje te wêzen ''(miniatuerôfbylding)''. [[$1|thumb]]\nKontrolearje de triem <strong>[[:$1]]</strong>.\nAs de kontrolearre triem deselde ôfbylding fan deselde grutte is, dan hoecht net in ekstra miniatuerôfbylding oanbean te wurden.",
+ "filetype-badmime": "Bestannen fan it MIME type \"$1\" meie net heechladen wurde.",
+ "filetype-bad-ie-mime": "Dit bestân kin net tafoege wurde, om't Internet Explorer dy idintifisearje soe as \"$1\", in net talitten bestânstype dat potinsjeel skealik is.",
+ "filetype-unwanted-type": "'''\".$1\"''' is in net winske bestânstype.\n{{PLURAL:$3|Oanwiisd bestânstype is|Oanwiisde bestânstypen binne}} $2.",
+ "filetype-banned-type": "'''\".$1\"''' is gjin talitten bestânstype.\n{{PLURAL:$3|Talitten bestânstype is|Talittene bestânstypen binne}} $2.",
+ "filetype-missing": "It bestân hat gjin taheaksel (lykas \".jpg\").",
+ "large-file": "Oanbefelling: meitsje bestannen net grutter as $1; dit bestân is $2.",
+ "largefileserver": "It bestân is grutter as dat de ynstelling fan de server talit.",
+ "emptyfile": "It bestân dat jo heechladen hawwe liket leech te wêzen.\nDat soe komme kinne fan in typflater yn 'e bestânsnamme.\nGean nei oft jo dit bestân wier bedoelden heech te laden.",
+ "fileexists": "Der bestiet al in bestân mei dizze namme.\nKontrolearje <strong>[[:$1]]</strong> as jo net wis binne oft jo it besteande bestân oerskriuwe wolle.\n[[$1|thumb]]",
+ "filepageexists": "De beskriuwingsside foar dit bestân bestiet al op <strong>[[:$1]]</strong>, mar der bestiet gjin bestân mei dizze namme.\nDe gearfetting dy't jo opjûn hawwe sil net op 'e beskriuwingsside ferskine.\nBewurkje de side mei de hân om de beskriuwing dêr wer te jaan.",
+ "fileexists-extension": "In bestân mei deselde namme bestiet al: [[$2|thumb]]\n* Namme fan it heechladen bestân: <strong>[[:$1]]</strong>\n* Namme fan it besteande bestân: <strong>[[:$2]]</strong>\nKies in oare namme.",
+ "fileexists-thumbnail-yes": "It bestân liket in ferlytse ferzje te wêzen ''(miniatuerôfbylding)''. [[$1|thumb]]\nKontrolearje it bestân <strong>[[:$1]]</strong>.\nAs it kontrolearre bestân deselde ôfbylding fan deselde grutte is, dan hoecht net in ekstra miniatuerôfbylding oanbean te wurden.",
"file-thumbnail-no": "De triemnamme begjint mei <strong>$1</strong>.\nIt liket in ferlytse ôfbylding te wêzen ''(miniatuerôfbylding)''.\nAs jo dy ôfbylding yn folsleine resolúsje hawwe, bied him dan oan.\nFeroarje oars de triemnamme.",
- "fileexists-forbidden": "Der bestiet al in triem mei dizze namme.\nBied jo triem ûnder in oare namme oan.\n[[File:$1|thumb|center|$1]]",
- "fileexists-shared-forbidden": "Der bestiet al in triem mei dizze namme by de dielde triemmen.\nAs jo de triem dochs noch oanbiede wolle, gean dan werom en kies in oare namme.\n[[File:$1|thumb|center|$1]]",
- "file-exists-duplicate": "Dizze triem is idintyk oan {{PLURAL:$1|de folgjende triem|de folgjende triemmen}}:",
- "file-deleted-duplicate": "In triem idintyk oan dizze triem ([[:$1]]) is foarhinne fuorthelle.\nRieplachtsje it fuorthel-logboek foar't jo fierder geane.",
+ "fileexists-forbidden": "Der bestiet al in bestân mei dizze namme.\nBied jo bestân ûnder in oare namme oan.\n[[File:$1|thumb|center|$1]]",
+ "fileexists-shared-forbidden": "Der bestiet al in bestân mei dizze namme by de dielde bestannen.\nAs jo it bestân dochs noch oanbiede wolle, gean dan werom en kies in oare namme.\n[[File:$1|thumb|center|$1]]",
+ "file-exists-duplicate": "Dit bestân is idintyk oan {{PLURAL:$1|it folgjende bestân|de folgjende bestannen}}:",
+ "file-deleted-duplicate": "In bestân idintyk oan dit bestân ([[:$1]]) is foarhinne fuorthelle.\nRieplachtsje it fuorthel-logboek foar't jo fierder geane.",
"uploadwarning": "Oanbied-warskôging",
- "savefile": "Lis triem fêst",
+ "savefile": "Lis bestân fêst",
"uploaddisabled": "Sorry, op dizze tsjinner kin net oanbean wurde.",
- "uploaddisabledtext": "It oanbieden fan triemmen is útskeakele.",
+ "uploaddisabledtext": "It oanbieden fan bestannen is útskeakele.",
"php-uploaddisabledtext": "PHP-triemuploads binne útskeakele.\nKontrolearje de ynstelling \"file_uploads\".",
- "uploadscripted": "Dizze triem befettet HTML- of scriptkoade dy't ferkeard troch jo browser werjûn wurde kin.",
- "uploadvirus": "De triem befettet in firus! Details: $1",
+ "uploadscripted": "Dit bestân befettet HTML- of scriptkoade dy't ferkeard troch jo browser werjûn wurde kin.",
+ "uploadvirus": "It bestân befettet in firus! Details: $1",
"upload-source": "Boarnetriem",
"sourcefilename": "Triemnamme boarne:",
"sourceurl": "Boarne-URL:",
"upload-maxfilesize": "Maksimale triemgrutte: $1",
"upload-description": "Triembeskriuwing",
"upload-options": "Uploadynstellingen",
- "watchthisupload": "Folgje dizze triem",
- "filewasdeleted": "Der is earder in triem mei dizze namme fuorthelle.\nRieplachtsje it $1 foar't jo him op'e nij tafoegje.",
- "filename-bad-prefix": "De namme fan de triem dy't jo oanbiede begjint mei '''\"$1\"''', dit wiist op in namme dy't automatysk troch in digitale kamera oanmakke wurdt. Feroarje de namme as jo wolle yn ien dy't in omskriuwing jout fan de triem.",
+ "watchthisupload": "Folgje dit bestân",
+ "filewasdeleted": "Der is earder in bestân mei dizze namme fuorthelle.\nRieplachtsje it $1 foar't jo him op'e nij tafoegje.",
+ "filename-bad-prefix": "De namme fan it bestân dat't jo oanbiede begjint mei '''\"$1\"''', dit wiist op in namme dy't automatysk troch in digitale kamera oanmakke wurdt. Feroarje de namme as jo wolle yn ien dy't in omskriuwing jout fan it bestân.",
"filename-prefix-blacklist": " #<!-- lit dizze line exakt sa't er is --> <pre>\n# Syntax is as folget:\n# * Alles fan in \"#\"-teken oan't de ein fan de line is in kommintaar\n# * Elke net blanke line is a foarheaksel foar triemnammen sa't dy automatysk jûn wurde troch digitale kamera's\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # guon mobile tillefoanen\nIMG # algemien\nJD # Jenoptik\nMGP # Pentax\nPICT # ferskaat\n #</pre> <!-- lit dizze line exakt sa't er is -->",
"upload-proto-error": "Ferkeard protokol",
"upload-proto-error-text": "Oanbieden mei dizze metoade freget URL's dy't begjinne mei <code>http://</code> of <code>ftp://</code>.",
"upload-file-error": "Ynterne fout",
- "upload-file-error-text": "Der wie in ynterne fout doe't in tydlike triem op'e server oanmakke waard.\nNim kontakt op mei in [[Special:ListUsers/sysop|behearder]].",
+ "upload-file-error-text": "Der wie in ynterne fout doe't in tydlik bestân op 'e server oanmakke waard.\nNim kontakt op mei in [[Special:ListUsers/sysop|behearder]].",
"upload-misc-error": "Unbekende oanbiedflater",
"upload-misc-error-text": "Der is by it oanbieden in ûnbekende fout optreden.\nKontrolearje of de URL krekt en beskikber is en besykje it nochris.\nAs it probleem oanhâldt, nim dan kontakt op mei in\n[[Special:ListUsers/sysop|behearder]].",
"upload-dialog-button-done": "Klear",
"nolicense": "Neat keazen",
"license-nopreview": "(Foarfertoaning net beskikber)",
"upload_source_url": " (in jildige, publyk tagonklike URL)",
- "upload_source_file": " (in triem op jo kompjûter)",
+ "upload_source_file": " (in bestân op jo kompjûter)",
"listfiles-delete": "fuortsmite",
- "listfiles-summary": "Op dizze spesjale side binne alle tafoege triemmen te besjen.\nStandert wurde de lêst tafoege triemmen boppe oan de list werjûn.\nKlikken op in kolomkop feroaret de sortearring.",
- "listfiles_search_for": "Sykje nei triem:",
- "imgfile": "triem",
+ "listfiles-summary": "Op dizze spesjale side binne alle tafoege bestannen te besjen.\nStandert wurde de lêst tafoege bestannen boppe oan de list werjûn.\nKlikken op in kolomkop feroaret de sortearring.",
+ "listfiles_search_for": "Sykje nei bestân:",
+ "imgfile": "bestân",
"listfiles": "Triemlist",
"listfiles_thumb": "Miniatuerôfbylding",
"listfiles_date": "Datum",
"listfiles_count": "Ferzjes",
"listfiles-latestversion-yes": "Ja",
"listfiles-latestversion-no": "Nee",
- "file-anchor-link": "Triem",
- "filehist": "Triem skiednis",
- "filehist-help": "Klik op in tiid om de ferzje fan de triem op dat stuit te sjen.",
+ "file-anchor-link": "Bestân",
+ "filehist": "Bestânsskiednis",
+ "filehist-help": "Klik op in tiid om de ferzje fan it bestân op dat stuit te sjen.",
"filehist-deleteall": "wiskje alles",
"filehist-deleteone": "fuortsmite",
"filehist-revert": "werom sette",
"filehist-comment": "Opmerkings",
"imagelinks": "Ofbyldkeppelings",
"linkstoimage": "Dizze {{PLURAL:$1|side is|$1 siden binne}} keppele oan it ôfbyld:",
- "linkstoimage-more": "Der {{PLURAL:$2|is|binne}} mear as $1 {{PLURAL:$1|ferwizing|ferwizings}} nei dizze triem.\nDe folgjende list jout allinne de earste {{PLURAL:$1|ferwizing|$1 ferwizings}} nei dizze triem wer.\nDer is ek in [[Special:WhatLinksHere/$2|folsleine list]].",
+ "linkstoimage-more": "Der {{PLURAL:$2|is|binne}} mear as $1 {{PLURAL:$1|ferwizing|ferwizings}} nei dit bestân.\nDe folgjende list jout allinne de earste {{PLURAL:$1|ferwizing|$1 ferwizings}} nei dit bestân wer.\nDer is ek in [[Special:WhatLinksHere/$2|folsleine list]].",
"nolinkstoimage": "Der binne gjin siden oan dit ôfbyld keppele.",
- "morelinkstoimage": "[[Special:WhatLinksHere/$1|Mear ferwizings]] nei dizze triem besjen.",
- "duplicatesoffile": "{{PLURAL:$1|De folgjende triem is|De folgjende $1 triemmen binne}} idintyk oan dizze triem:",
- "sharedupload": "Dizze triem is in dielde oanbieding en kin ek troch oare projekten brûkt wurde.",
- "filepage-nofile": "Der bestiet gjin triem mei sa'n namme.",
- "filepage-nofile-link": "Der bestiet gjin triem mei sa'n namme [bied $1 oan].",
- "uploadnewversion-linktext": "Bied in nije ferzje fan dizze triem oan",
+ "morelinkstoimage": "[[Special:WhatLinksHere/$1|Mear ferwizings]] nei dit bestân besjen.",
+ "duplicatesoffile": "{{PLURAL:$1|De folgjende bestân is|De folgjende $1 bestannen binne}} idintyk oan dit bestân:",
+ "sharedupload": "Dit bestân is in dielde oanbieding en kin ek troch oare projekten brûkt wurde.",
+ "filepage-nofile": "Der bestiet gjin bestân mei sa'n namme.",
+ "filepage-nofile-link": "Der bestiet gjin bestân mei sa'n namme [bied $1 oan].",
+ "uploadnewversion-linktext": "Bied in nije ferzje fan dit bestân oan",
"shared-repo-from": "fan $1",
"filerevert": "$1 weromsette",
- "filerevert-legend": "Triem weromsette",
+ "filerevert-legend": "Bestân weromsette",
"filerevert-intro": "Jo binne '''[[Media:$1|$1]]''' oan it weromdraaien ta de [$4 ferzje op $2, $3].",
"filerevert-comment": "Reden:",
"filerevert-defaultcomment": "Weromdraaid ta de ferzje op $1, $2 ($3)",
"filerevert-submit": "werom sette",
"filerevert-success": "<strong>[[Media:$1|$1]]</strong> is weromdraaid ta de [$4 ferzje op $2, $3].",
- "filerevert-badversion": "Der is gjin foarige lokale ferzje fan dizze triem fan 'e opjûne tiid.",
+ "filerevert-badversion": "Der is gjin foarige lokale ferzje fan dit bestân fan 'e opjûne tiid.",
"filedelete": "Wiskje $1",
- "filedelete-legend": "Wiskje triem",
+ "filedelete-legend": "Wiskje bestân",
"filedelete-intro": "Jo wiskje '''[[Media:$1|$1]]'''.",
"filedelete-intro-old": "Jo wiskje de ferzje fan '''[[Media:$1|$1]]''' fan [$4 $3, $2].",
"filedelete-comment": "Reden:",
"filedelete-reason-dropdown": "*Faak foarkommende redenen foar fuortheljen\n** Skeinen fan auteursrjochten\n** Duplikaattriem",
"filedelete-edit-reasonlist": "Redenen foar fuortheljen bewurkje",
"mimesearch": "Sykje op MIME-type",
- "mimesearch-summary": "Dizze side makket it filterjen mûglik fan triemmen foar it MIME-type.\nYnfier: contenttype/subtype, bygelyks <code>image/jpeg</code>.",
+ "mimesearch-summary": "Dizze side makket it filterjen mûglik fan bestannen foar it MIME-type.\nYnfier: contenttype/subtype, bygelyks <code>image/jpeg</code>.",
"mimetype": "MIME-type:",
"download": "oanbiede",
"unwatchedpages": "Siden dy't net op in folchlist steane",
"statistics-articles": "Ynhâldlike siden",
"statistics-pages": "Siden",
"statistics-pages-desc": "Alle siden yn 'e wiki, ynbegrepen oerlissiden, trochferwizings ens.",
- "statistics-files": "Triemmen",
+ "statistics-files": "Bestannen",
"statistics-edits": "Sidebewurkings sûnt it begjin fan {{SITENAME}}",
"statistics-edits-average": "Trochstrings tal bewurkings per side",
"statistics-users": "Registrearre brûkers",
"unusedimages": "Lossteande ôfbylden",
"wantedcategories": "Nedige kategoryen",
"wantedpages": "Nedige siden",
- "wantedfiles": "Net-besteande triemmen mei ferwizings",
+ "wantedfiles": "Net-besteande bestannen mei ferwizings",
"wantedtemplates": "Net besteande sjabloanen mei ferwizings",
"mostlinked": "Siden wêr it meast mei keppele is",
"mostlinkedcategories": "Kategoryen dy't it meast brûkt wurde",
"export-addcattext": "Siden tafoegje fan kategory:",
"export-addcat": "Tafoegje",
"export-addns": "Tafoegje",
- "export-download": "Bewarje as triem",
+ "export-download": "Bewarje as bestân",
"export-templates": "Tafoegje berjochten",
"allmessages": "Alle wikiberjochten",
"allmessagesname": "Namme",
"allmessages-language": "Taal:",
"allmessages-filter-translate": "Oersette",
"thumbnail-more": "Fergrutsje",
- "filemissing": "Triem net fûn",
+ "filemissing": "Bestân net fûn",
"thumbnail_error": "Flater by it oanmeitsjen fan thumbnail: $1",
"thumbnail_dest_directory": "Kin de doelmap net oanmeitsje",
"import": "Importearje siden",
"tooltip-pt-mycontris": "Oersjocht fan jo bydragen",
"tooltip-pt-login": "Jo wurde fan herten útnûge jo oan te melden, mar it hoecht net.",
"tooltip-pt-logout": "Ofmelde",
+ "tooltip-pt-createaccount": "Jo wurde fan herten útnûge in akkount oan te meitsjen en jo oan te melden, mar it hoecht net.",
"tooltip-ca-talk": "Oerlis oer dizze side",
- "tooltip-ca-edit": "Jo kinne dizze side bewurkje. Brûk a.j.w. de foarbyldwerjefteknop foar't Jo de boel bewarje.",
+ "tooltip-ca-edit": "Bewurkje dizze side",
"tooltip-ca-addsection": "In opmerking tafoegje oan de oerlis-side.",
"tooltip-ca-viewsource": "Dizze side is befeilige, mar jo kinne de boarne wol besjen.",
"tooltip-ca-history": "Eardere ferzjes fan dizze side.",
"tooltip-ca-watch": "Dizze side oan myn folchside tafoegje",
"tooltip-ca-unwatch": "Dizze side fan myn folchlist ôfhelje",
"tooltip-search": "{{SITENAME}} trochsykje",
- "tooltip-search-go": "Gean nei in side mei dizze namme as dy bestiet",
+ "tooltip-search-go": "Gean nei de side mei dizze namme at dy bestiet",
"tooltip-search-fulltext": "De siden foar dizze tekst sykje",
"tooltip-p-logo": "Haadside",
"tooltip-n-mainpage": "Gean nei de haadside",
"tooltip-n-mainpage-description": "Nei de haadside gean",
- "tooltip-n-portal": "Oer it projekt: wat'st dwaan kinst, wêr'st dingen fine kinst.",
+ "tooltip-n-portal": "Oer it projekt: wat jo dwaan kinne, wêr jo dingen fine",
"tooltip-n-currentevents": "Eftergrûnynformaasje oer rinnende saken.",
- "tooltip-n-recentchanges": "De list fan koartlyn oanbrochte feroarings yn dizze wiki.",
- "tooltip-n-randompage": "Samar in side sjen litte.",
- "tooltip-n-help": "Helpynformaasje oer dizze wiki.",
+ "tooltip-n-recentchanges": "List fan de lêste feroarings oan 'e wiki",
+ "tooltip-n-randompage": "Gean nei likefolle hokfoar side",
+ "tooltip-n-help": "It plak om eat út te fiskjen",
"tooltip-t-whatlinkshere": "List fan alle siden dy't nei dizze side ferwize",
"tooltip-feed-rss": "RSS-feed foar dizze side",
"tooltip-feed-atom": "Atom-feed foar dizze side",
"tooltip-t-contributions": "Bydragen fan dizze brûker",
"tooltip-t-emailuser": "Stjoer in e-mail nei {{GENDER:$1|dizze meidogger}}",
- "tooltip-t-upload": "Triemmen oplade",
+ "tooltip-t-upload": "Bestannen oplade",
"tooltip-t-specialpages": "List fan alle spesjale siden",
+ "tooltip-t-print": "Ofdrukferzje fan dizze side",
"tooltip-ca-nstab-user": "Brûkersside sjen litte",
"tooltip-ca-nstab-special": "Dit is in spesjale side; jo kinne de side sels net feroarje",
"tooltip-ca-nstab-project": "Projektside sjen litte",
"pageinfo-category-total": "Totaal oantal lidden",
"pageinfo-category-pages": "Oantal siden",
"pageinfo-category-subcats": "Oantal subkategoryen",
- "pageinfo-category-files": "Oantal triemmen",
+ "pageinfo-category-files": "Oantal bestannen",
"markaspatrolleddiff": "Markearje as kontroleare",
"markaspatrolledtext": "Markearje dizze side as kontrolearre",
"markedaspatrolled": "Markearre as kontrolearre",
"file-info-size": "$1 × $2 pixels, triemgrutte: $3, MIME-type: $4",
"file-info-size-pages": "$1 × $2 pixels, triemgrutte: $3, MIME-type: $4, $5 {{PLURAL:$5|side|siden}}",
"file-nohires": "Gjin hegere resolúsje beskikber.",
- "svg-long-desc": "SVG-triem, nominaal $1 × $2 pixels, triemgrutte: $3",
- "show-big-image": "Oarspronklike triem",
+ "svg-long-desc": "SVG-bestân, nominaal $1 × $2 pixels, bestânsgrutte: $3",
+ "show-big-image": "Oarspronklik bestân",
"show-big-image-other": "Oare {{PLURAL:$2|resolúsje|resolúsjes}}: $1.",
"show-big-image-size": "$1 × $2 pixels",
"newimages": "Nije ôfbylden",
- "imagelisttext": "Dit is in list fan '''$1''' {{PLURAL:$1|triem|triemen}}, op $2.",
+ "imagelisttext": "Dit is in list fan '''$1''' {{PLURAL:$1|bestân|bestannen}}, op $2.",
"newimages-legend": "Filter",
"noimages": "Neat te sjen.",
"ilsubmit": "Sykje",
"yesterday-at": "juster om $1",
"bad_image_list": "De opmaak is as folget:\n\nAllinne rigels fan in list (rigels dy't begjinne mei *) wurde ferwurke. De earste link op in rigel moat in link wêze nei in net winske ôfbylding.\nAlle folgjende links dy't op deselde rigel steane, wurde behannele as útsûndering, lykas bygelyks siden dêr't de ôfbylding yn'e tekst opnommen is.",
"metadata": "Metadata",
- "metadata-help": "Dizze triem befettet oanfoljende ynformaasje, dy't troch in fotokamera, scanner of fotobewurkingsprogramma tafoege wêze kin. As de triem oanpast is, komme de details mûglik net folslein oerien mei de feroare ôfbylding.",
+ "metadata-help": "Dit bestân befettet oanfoljende ynformaasje, dy't troch in fotokamera, scanner of fotobewurkingsprogramma tafoege wêze kin. As it bestân oanpast is, komme de details mûglik net folslein oerien mei de feroare ôfbylding.",
"metadata-expand": "Utwreide details sjen litte",
"metadata-collapse": "Ferskûlje útwreide details",
"metadata-fields": "De ôfbyldingsmetadatafjilden yn dit berjocht steane op in ôfbyldingsside as de metadatatabel ynklapt is.\nOare fjilden wurde ferburgen.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
"fileduplicatesearch-filename": "Triemnamme:",
"fileduplicatesearch-submit": "Sykje",
"fileduplicatesearch-info": "$1 × $2 pixel<br />Triemgrutte: $3<br />MIME-type: $4",
- "fileduplicatesearch-result-1": "De triem \"$1\" hat gjin duplikaten.",
- "fileduplicatesearch-result-n": "De triem \"$1\" hat {{PLURAL:$2|1 duplikaat|$2 duplikaten}}.",
+ "fileduplicatesearch-result-1": "It bestân \"$1\" hat gjin duplikaten.",
+ "fileduplicatesearch-result-n": "It bestân \"$1\" hat {{PLURAL:$2|1 duplikaat|$2 duplikaten}}.",
"specialpages": "Bysûndere siden",
"specialpages-note-top": "Leginda",
"specialpages-note-restricted": "* Normale bysûndere siden.\n* <strong class=\"mw-specialpagerestricted\">Beheinde bysûndere siden.</strong>",
"mediastatistics-nfiles": "$1 ($2%)",
"mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
"mediastatistics-table-mimetype": "MIME-type",
- "mediastatistics-table-count": "Oantal triemmen",
+ "mediastatistics-table-count": "Oantal bestannen",
"mediastatistics-header-unknown": "Unbekend",
"mediastatistics-header-bitmap": "Bitmapôfbyldings",
"mediastatistics-header-drawing": "Tekeningen (fektorôfbyldings)",
"mediastatistics-header-multimedia": "Ynteraktive media",
"mediastatistics-header-office": "Kantoartriemmen",
"mediastatistics-header-text": "Tekstriemmen",
- "mediastatistics-header-executable": "Utfierbere triemmen",
- "mediastatistics-header-archive": "Komprimearre triemmen",
+ "mediastatistics-header-executable": "Utfierbere bestannen",
+ "mediastatistics-header-archive": "Komprimearre bestannen",
"json-error-syntax": "Syntaksisflater",
"special-characters-group-latin": "Latyn",
"special-characters-group-latinextended": "Latyn útwreide",
"badretype": "הסיסמאות שהזנת אינן תואמות.",
"usernameinprogress": "יצירת חשבון עבור שם המשתמש הזה כבר התחילה.\nנא להמתין.",
"userexists": "שם המשתמש שבחרת כבר נמצא בשימוש.\nנא לבחור שם אחר.",
+ "createacct-normalization": "שם המשתמש שבחרת ישונה ל\"$2\" עקב מגבלות טכניות.",
"loginerror": "שגיאה בכניסה לחשבון",
"createacct-error": "שגיאה ביצירת חשבון",
"createaccounterror": "לא ניתן היה ליצור את החשבון: $1",
"minoredit": "ЗӀамига хувцам",
"watchthis": "Зем бе укх оагӀонна",
"savearticle": "ОагӀув дIаязъе",
+ "savechanges": "ДIаязъе оагӀув",
+ "publishchanges": "ДIаязъе оагӀув",
+ "publishchanges-start": "ДIаязъе оагӀув…",
"preview": "Хьалххе бIаргтохар",
"showpreview": "Хьалххе бIаргтохар",
"showdiff": "Даь дола хувцамаш",
"badretype": "Le password inserite non coincidono tra loro.",
"usernameinprogress": "La creazione di account con questo nome utente è già in corso.\nSi prega di attendere.",
"userexists": "Il nome utente inserito è già utilizzato.\nScegli un nome utente diverso.",
+ "createacct-normalization": "Il tuo nome utente sarà corretto in \"$2\" a causa di restrizioni tecniche.",
"loginerror": "Errore durante l'accesso",
"createacct-error": "Errore durante la creazione dell'utenza",
"createaccounterror": "Impossibile creare l'account: $1",
"ipb-confirm": "차단 확인",
"ipb-sitewide": "사이트 전체",
"ipb-partial": "부분",
+ "ipb-partial-help": "특정 문서 또는 이름공간입니다.",
"ipb-pages-label": "문서",
"ipb-namespaces-label": "이름공간",
"badipaddress": "잘못된 IP 주소",
"rcfilters-filter-humans-label": "Cilvēki (ne boti)",
"rcfilters-filter-humans-description": "Cilvēku veikti labojumi.",
"rcfilters-filtergroup-reviewstatus": "Pārskatīšanas statuss",
+ "rcfilters-filter-reviewstatus-unpatrolled-description": "Labojumi, kas nav manuāli vai automātiski atzīmēti kā pārbaudīti.",
"rcfilters-filter-reviewstatus-unpatrolled-label": "Nepārbaudīti",
+ "rcfilters-filter-reviewstatus-manual-description": "Labojumi, kas manuāli atzīmēti kā pārbaudīti.",
"rcfilters-filter-reviewstatus-manual-label": "Manuāli pārbaudīti",
+ "rcfilters-filter-reviewstatus-auto-description": "Pieredzējušu dalībnieku labojumi, kuru devums tiek automātiski atzīmēts kā pārbaudīts.",
"rcfilters-filter-reviewstatus-auto-label": "Automātiski pārbaudīti",
"rcfilters-filtergroup-significance": "Nozīmīgums",
"rcfilters-filter-minor-label": "Maznozīmīgi labojumi",
"october": "шыжа",
"november": "кылме",
"december": "теле",
- "january-gen": "шорыкйол тылзын",
- "february-gen": "пургыж тылзын",
- "march-gen": "ӱярня тылзын",
- "april-gen": "вӱдшор тылзын",
- "may-gen": "ага тылзын",
- "june-gen": "пеледыш тылзын",
- "july-gen": "сӱрем тылзын",
- "august-gen": "сорла тылзын",
- "september-gen": "идым тылзын",
- "october-gen": "шыжа тылзын",
- "november-gen": "кылме тылзын",
- "december-gen": "теле тылзын",
+ "january-gen": "шорыкйол",
+ "february-gen": "пургыж",
+ "march-gen": "ӱярня",
+ "april-gen": "вӱдшор",
+ "may-gen": "ага",
+ "june-gen": "пеледыш",
+ "july-gen": "сӱрем",
+ "august-gen": "сорла",
+ "september-gen": "идым",
+ "october-gen": "шыжа",
+ "november-gen": "кылме",
+ "december-gen": "теле",
"jan": "шрк",
"feb": "прг",
"mar": "ӱрн",
"badretype": "De ingevoerde wachtwoorden verschillen van elkaar.",
"usernameinprogress": "Het aanmaken van een account met die naam is al in behandeling.\nEven geduld alstublieft.",
"userexists": "De gekozen gebruikersnaam is al in gebruik.\nKies een andere naam.",
+ "createacct-normalization": "Uw gebruikersnaam zal worden aangepast naar \"$2\" vanwege technische beperkingen.",
"loginerror": "Aanmeldfout",
"createacct-error": "Fout tijdens aanmaken account",
"createaccounterror": "Het was niet mogelijk het account aan te maken: $1",
"ipb-confirm": "Blokkade bevestigen",
"ipb-sitewide": "Van de hele site",
"ipb-partial": "Gedeeltelijk",
+ "ipb-partial-help": "Specifieke pagina's of naamruimten.",
"ipb-pages-label": "Pagina's",
"ipb-namespaces-label": "Naamruimten",
"badipaddress": "Geen geldig IP-adres",
"htmlform-int-toolow": "De opgegeven waarde ligt onder de minimumwaarde van $1",
"htmlform-int-toohigh": "De opgegeven waarde ligt boven de maximumwaarde van $1",
"htmlform-required": "Deze waarde is verplicht",
- "htmlform-submit": "Opslaan",
+ "htmlform-submit": "Verzenden",
"htmlform-reset": "Wijzigingen ongedaan maken",
"htmlform-selectorother-other": "Anders",
"htmlform-no": "Nee",
"badretype": "Le doe ciav che a l'ha scrivù a resto diferente antra 'd lor.",
"usernameinprogress": "Na creassion ëd cont për së stranòm a l'é già an cors. Ch'a l'abia passiensa.",
"userexists": "Lë stranòm anserì a l'é già dovrà.\nPër piasì ch'a serna në stranòm diferent.",
+ "createacct-normalization": "Sò stranòm a sarà modificà a «$2» për dle contrente técniche.",
"loginerror": "Eror ën rintrand ant ël sistema",
"createacct-error": "Eror durant la creassion dël cont",
"createaccounterror": "A l'é nen podusse creé ël cont: $1",
"badretype": "As palavras-passe que introduziu não coincidem.",
"usernameinprogress": "Já está a ser criada uma conta para este nome de utilizador.\nAguarde, por favor.",
"userexists": "O nome de utilizador introduzido já existe.\nEscolha um nome diferente, por favor.",
+ "createacct-normalization": "O seu nome de utilizador será ajustado para \"$2\" devido a restrições técnicas.",
"loginerror": "Erro ao iniciar sessão",
"createacct-error": "Erro na criação da conta",
"createaccounterror": "Não foi possível criar a conta: $1",
"badretype": "Введённые вами пароли не совпадают.",
"usernameinprogress": "Создание учётной записи для данного имени участника уже выполняется.\nПожалуйста, подождите.",
"userexists": "Введённое имя участника уже используется.\nПожалуйста, выберите другое имя.",
+ "createacct-normalization": "Ваше имя участника будет исправлено на «$2» из-за технических ограничений.",
"loginerror": "Ошибка опознавания участника",
"createacct-error": "Ошибка создания учётной записи",
"createaccounterror": "Невозможно создать учётную запись: $1",
"badretype": "Gesli, ki ste ju vnesli, se ne ujemata.",
"usernameinprogress": "Ustvarjanje računa za to uporabniško ime je že v teku. Prosimo, počakajte.",
"userexists": "Uporabniško ime, ki ste ga vnesli, je že zasedeno.\nProsimo, izberite drugo.",
+ "createacct-normalization": "Vaše uporabniško ime bomo spremenili na »$2« zaradi tehničnih omejitev.",
"loginerror": "Napaka ob prijavi",
"createacct-error": "Napaka pri ustvarjanju računa",
"createaccounterror": "Ne morem ustvariti računa: $1",
"badretype": "ಈರ್ ಕೊರ್ನ ಪ್ರವೇಶ ಪದೆ ಬೇತೆ ಬೇತೆ ಅತ್ಂಡ್",
"usernameinprogress": "ಈ ಬಳಕೆದಾರೆ ಪುದರುದ ಖಾತೆ ರಚನೆ ಪ್ರಗತಿಡು ಉಂಡು. ದಯಮಲ್ತ್ ವಂತೆ ಕಾಪುಲೆ.",
"userexists": "ಈರ್ ಕೊರ್ನ ಸದಸ್ಯರ ಪುದರ್ ಬಳಕೆಡ್ ಉಂಡು. ದಯದೀದ್ ಬೇತೆ ಪುದರ್ ಕೊರ್ಲೆ",
+ "createacct-normalization": "ತಾಂತ್ರಿಕ ನಿರ್ಬಂದೊಲೆಗಾದ್, ಇರೆನ ಬಳಕೆಪುದರುನು $2 ಕ್ ಸರಿಮಲ್ಪುಂಡು",
"loginerror": "ಲಾಗಿನ್ ದೋಷ",
"createacct-error": "ಕಾತೆ ನಿರ್ಮಾಣೊ ದೋಸೊ",
"createaccounterror": "ಕಾತೆ ನಿರ್ಮಾಣೊ ಮಲ್ಪೆರೆ ಆವೊಂದಿದ್ದಿ: $1",
"uploaded-setting-event-handler-svg": "ಘಟನೆ-ನಿರ್ವಹಣ ಗುಣೊಲೆನ ಅಟ್ಟಣೆ ತಡೆಯಾತುಂಡು. ಮಿತೇರಾಯಿನ ಎಸ್ವಿಜಿ ಕಡತೊಡು <code><$1 $2=\"$3\"></code> ಪತ್ತೆಯಾಂಡ್.",
"uploaded-setting-href-svg": "ಪಿತೃ ಘಟಕೊಗು \"href\" ಸೇರಾರೆ, \"ಅಟ್ಟಣೆ\" ಕುಚ್ಚಿ ಬಳಕೆನ್ ತಡೆತ್'ದುಂಡು,",
"uploaded-wrong-setting-svg": "ಒವ್ವೆ ಗುಣೊಕು ಒಂಜಿ ದೂರಸಂವೇದಿ/ದತ್ತಾಂಶ/ಲಿಪಿಕಾರ ಗುರಿ ಸೇರಾರೆ, \"ಅಟ್ಟಣೆ\" ಕುಚ್ಚಿದ ಬಳಕೆನ್ ತಡೆತ್'ದುಂಡು, ಮಿತೇರಾಯಿನ ಎಸ್ವಿಜಿ ಕಡತೊಡು <code><set to=\"$1\"></code> ಪತ್ತೆ ಆಂಡ್.",
+ "uploaded-setting-handler-svg": "ದೂರಸಂವೇದಿ/ದತ್ತಾಂಶ/ಲಿಪಿಕರ ಒಟ್ಟುಗು ನಿಯಂತ್ರಕ ಗುಣೊನು ಪತ್ತುನ ಎಸ್ವಿಜಿ-ನ್ ತಡೆತ್'ದುಂಡು.\nಮಿತೇರಾಯಿನ ಎಸ್ವಿಜಿ ಕಡತೊಡು <code>$1=\"$2\"</code> ಪತ್ತೆ ಯಾಂಡ್ .",
+ "uploaded-remote-url-svg": "ದೂರಸಂವೇದಿ ಯೂಅರ್'ಎಲ್'ದ ಒಟ್ಟುಗು ಒವ್ವೆ ಶೈಲಿದ ಗುಣೊನು ಪತ್ತುನ ಎಸ್ವಿಜಿ-ನ್ ತಡೆತ್'ದುಂಡು.\nಮಿತೇರಾಯಿನ ಎಸ್ವಿಜಿ ಕಡತೊಡು <code>$1=\"$2\"</code> ಪತ್ತೆ ಯಾಂಡ್.",
+ "uploaded-image-filter-svg": "ಮಿತೇರಾಯಿನ ಎಸ್ವಿಜಿ ಕಡತೊಡು <code><$1 $2=\"$3\"></code> ಯೂಆರ್'ಎಲ್'ದ ಆಕೃತಿ ಅರಿಪೆ ಪತ್ತೆ ಆಂಡ್.",
+ "uploadscriptednamespace": "ಈ ಎಸ್ವಿಜಿ ಕಡತೊಡು <nowiki>$1</nowiki> ಇನ್ಪಿನ ಒಂಜಿ ಕಾನೂನುಬಾಹಿರ ಪುದರತಾನ ಉಂಡು.",
+ "uploadinvalidxml": "ಮಿತೇರಾಯಿನ ಕಡತೊಡು ಇತ್ತಿನ ಎಕ್ಸ್'ಎಂಎಲ್- ನ್ ವಿಂಗಡರೆ ಆಪುಜಿ.",
+ "uploadvirus": "ಕಡತೊಡು ಒಂಜಿ ವೈರಾಣು ಉಂಡು!\nವಿವರೊಲು:$1",
+ "uploadjava": "ಕಡತ ಒಂಜಿ ಜಾವಾ.class ಕಡತ ಉಪ್ಪುನ ಜಿಪ್ (ZIP) ಕಡತ ಆದುಂಡು.\nಜಾವಾ ಕಡತೊಲೆನ್ ಮಿತೇರಾವರೆ ಒಪ್ಪಿಗೆ ಇಜ್ಜಿ ಕಾರಣ ಅವು ರಕ್ಷಕ ನಿರ್ಬಂದೊಲೆನ್ ಅತಿಕ್ರಮ ಮಲ್ಪಾವರೆ ಯಾವು.",
"upload-source": "ಮೂಲ ಕಡತ",
+ "sourcefilename": "ಮೂಲ ಕಡತಪುದರ್:",
+ "sourceurl": "ಮೂಲ ಯೂಆರ್'ಎಲ್:",
+ "destfilename": "ಗಮ್ಯತಾನ ಕಡತಪುದರ್:",
+ "upload-maxfilesize": "ಗರಿಷ್ಟ ಕಡತ ಗಾತ್ರ:$1",
+ "upload-description": "ಕಡತ ವಿವರಣೆ",
"upload-options": "ಅಪ್ಲೋಡ್ ಆಯ್ಕೆಲು",
"watchthisupload": "ಈ ಪುಟೊನು ತೂಲೆ",
+ "filewasdeleted": "ಈ ಪುದರುದ ಒಂಜಿ ಕಡತ ನೆತ ದುಂಬೆ ಮಿತೇರಾದ್ ಅಯಿಡ್ದ್ ಬೊಕ ಮಾಜಾದುಂಡು.\nಈರ್ ಅವೆನ್ ಕುಡೊರ ಮಿತೇರಾವರೆ ಪೋಪಿನ ದುಂಬು $1 ನ್ ಸಮಾತೂವೊಡು.",
+ "filename-thumb-name": "ಉಂದು ಕೊಂಬಿರೆಲ್'ಚಿತ್ರದ ತರೆಬರವುದ ಲೆಕ್ಕ ತೋಜುಂಡು. ದಯಮಲ್ತ್ ಅವೆ ವಿಕಿಕ್ ಕೊಂಬಿರೆಲ್'ಚಿತ್ರೊಲೆನ್ ಪಿರ ಮಿತೇರಾವೊರ್ಚಿ. ಇಜಿಂಡ ದಯಮಲ್ತ್ ಕಡತಪುದರುನು, ಅವು ಹೆಚ್ಚ ಅರ್ಥಪೂರ್ಣವಾದಿತ್ತ್'ದ್, ಕೊಂಬಿರೆಲ್'ಚಿತ್ರದ ಆದಿಪ್ರತ್ಯಯ ಉಪ್ಪಂದಿಲೆಕ್ಕ ಸರಿಮಲ್ಪುಲೆ.",
+ "filename-bad-prefix": "ಈರ್ ಮಿತೇರಾವುನ ಕಡತದ ಪುದರ್ <strong>\"$1\"</strong>, ಸುರುವಾಪುಂಡು; ಅವು ಒಂಜಿ ವಿವರಣಹೀನ ಪುದರ್ ಲಕ್ಷಣೊಡು ಸ್ವಯಂಕೃತವಾದ್ ಅಂಕಿಕ ಕ್ಯಾಮರೊಲು ಕೊರ್ಪಿನವು ಆದುಂಡು.\nದಯಮಲ್ತ್ ಇರೆನ ಕಡತೊಗು ಒಂಜಿ ಹೆಚ್ಚಿನ ವಿವರಣೆದ ಪುದರುನು ಪೆಜಿಲೆ.",
+ "upload-proto-error": "ಅಸಮಪರ್ಕ ಶಿಷ್ಟಾಚಾರ",
+ "upload-proto-error-text": "ದೂರಸಂವೇದಿ ಮಿತೇರಿಕೆಗ್ <code>http://</code> or <code>ftp://</code> ಸುರುವಾಪಿನ ಯೂಆರ್'ಎಲ್'-ಲು ಬೋಡು.",
"upload-file-error": "ಆ೦ತರಿಕ ದೋಷ",
+ "upload-file-error-text": "ಜಾಲಸೇವಕೊಡು ಒಂಜಿ ಹಂಗಾಮಿ ಕಡತೊನು ರಚಿಸಾವರೆ ಯತ್ನ ಮಲ್ಪುನಗ ಒಂಜಿ ಆಂತರಿಕ ದೋಷ ಆಂಡ್ .\nದಯಮಲ್ತ್ ಒರಿ [[Special:ListUsers/sysop|administrator]]. ನ್ ಸಂಪರ್ಕಿಸಾಲೆ",
+ "upload-misc-error": "ಗೊತ್ತಾಂತಿನ ಮಿತೇರಿಕೆ ದೋಷ",
+ "upload-misc-error-text": "ಮಿತೇರಿಕೆಡ್ ಒಂಜಿ ಗೊತ್ತಾಂತಿನ ದೋಷ ಆಂಡ್.\nದಯಮಲ್ತ್ ಯೂಆರ್'ಎಲ್ ಮಾನ್ಯವಾದುಂಡು ಬೊಕ ಗಮ್ಯವಾದುಂಡು ಇಂದ್ ಪರಿಶೀಲಿಸಾದ್ ಬೊಕ ಕುಡಾ ಯತ್ನ ಮಲ್ಪುಲೆ.\nಸಮಸ್ಯೆ ಒರೀಂಡ, ಒರಿ [[Special:ListUsers/sysop|administrator]]ನು ಸಂಪರ್ಕಿಸಾಲೆ.",
+ "upload-too-many-redirects": "ಯೂಆರ್'ಎಲ್- ಡು ದಿಂಜ ಪಿರರವಾನೆಲು ಉಂಡು.",
+ "upload-http-error": "ಒಂಜಿ HTTP ದೋಷ ಆಂಡ್: $1",
+ "upload-copy-upload-invalid-domain": "ಈ ಪರಿವಲಯೊಡು ನಕಲು ಮಿತೇರಿಕೆಲು ಲಭ್ಯ ಇಜ್ಜಿ.",
+ "upload-foreign-cant-upload": "ಕೇಣಿನ ವಿದೇಶಿ ಕಡತ ಸಂಚಯೊಗು ಕಡತೊಲೆನ್ ಮಿತೇರಾವರೆ ಈ ವಿಕಿ ಸಂರಚನೆ ಆತಿಜಿ.",
+ "upload-foreign-cant-load-config": "ವಿದೇಶಿ ಕಡತ ಸಂಚಯೊಗು ಕಡತೊಲೆನ ಮಿತೇರಿಕೆಗ್ ಸಂರಚನೆ ದಿಂಜಾವುನ ವಿಫಲವಾಂಡ್.",
+ "upload-dialog-disabled": "ಈ ಸಂವಾದಿನ್ ಬಳಸಿನ ಕಡತ ಮಿತೇರಿಕೆಲೆನ್ ಈ ವಿಕಿಟ್ ನಿಷ್ಕ್ರಿಯ ಮಲ್ದ್ಂಡ್.",
"upload-dialog-title": "ಫೈಲ್ ಅಪ್ಲೋಡ್",
"upload-dialog-button-cancel": "ವಜಾ ಮಲ್ಪುಲೆ",
"upload-dialog-button-back": "ಪಿರ",
"upload-dialog-button-upload": "ಅಪ್ಲೊಡ್",
"upload-form-label-infoform-title": "ವಿವರೊ",
"upload-form-label-infoform-name": "ಪುದರ್",
+ "upload-form-label-infoform-name-tooltip": "ಕಡತೊಗು ಒಂಜಿ ಅನನ್ಯ ವಿವರಣೆದ ತೆರಬರವು, ಅವು ಕಡತಪುದರಾದ್ ಒದಗೋಡು. ಈರ್ ಸರಳ ಭಾಷೆನ್ ಅವಕಾಶ ಸಹಿತವಾದ್ ಬಳಸೊಲಿ. ಕಡತ ವಿಸ್ತರಣ ಸೇರಾವೊರ್ಚಿ.",
"upload-form-label-infoform-description": "ವಿವರಣೆ",
+ "upload-form-label-infoform-description-tooltip": "ಕಾಯಕದ ಮಾತಾ ಗಮನಾರ್ಹ ವಿಷಯೊಲೆನ್ ಸಂಕ್ಷಿಪ್ತವಾದ್ ವಿವರಿಸಾಲೆ.\nಒಂಜಿ ಚಿತ್ರದ ಮಿತ್ತ್ : ಚಿತ್ರ ತೋಜಾವುನ ಮುಖ್ಯವಿಷಯೊಲು, ಸಂದರ್ಭ ಇಜಿಂಡ ಜಾಗ ತೆರಿಪಾಲೆ",
+ "upload-form-label-usage-title": "ಬಳಕೆ",
"upload-form-label-usage-filename": "ಕಡತದ ಪುದರ್",
+ "upload-form-label-own-work": "ಉಂದು ಎನ್ನ ಸ್ವಂತದ ಕೆಲಸ",
"upload-form-label-infoform-categories": "ವರ್ಗೊಲು",
"upload-form-label-infoform-date": "ದಿನೊ",
+ "upload-form-label-own-work-message-generic-local": "ಯಾನ್ ಈ ಕಡತೊನು {{SITENAME}} ಸೇವೆದ ಷರತ್ತುಲು ಬೊಕ ಪರವಾನಿ ಕಾರ್ಯನೀತಿದ ಅನುಸಾರ ಮಿತೇರಾವೊಂದುಲ್ಲೆ ಇಂದ್ ದೃಡ ಮಲ್ಪುವೆ",
"license": "ಪರವಾನಗಿ:",
"license-header": "ಪರವಾನಿಗೆ",
"listfiles-delete": "ಮಾಜಾಲೆ",
"badretype": "మీరు ఇచ్చిన రెండు సంకేతపదాలు ఒకదానితో మరొకటి సరిపోలడం లేదు.",
"usernameinprogress": "ఈ వాడుకరి పేరుతో ఖాతా సృష్టించుకోవడం పురోగతిలో ఉంది. కాస్త ఆగండి.",
"userexists": "ఇచ్చిన వాడుకరిపేరు ఇప్పటికే వాడుకలో ఉంది.\nవేరే పేరును ఎంచుకోండి.",
+ "createacct-normalization": "సాంకేతిక కారణాల వలన మీ వాడుకరి పేరును \"$2\" కు సర్దుతాం.",
"loginerror": "లాగిన్ లోపం",
"createacct-error": "ఖాతా సృష్టించడంలో లోపం",
"createaccounterror": "ఖాతాను సృష్టించలేకపోయాం: $1",
"badretype": "Hai mật khẩu không khớp.",
"usernameinprogress": "Đã tiến hành tạo tài khoản với tên người dùng này.\nXin vui lòng chờ đợi.",
"userexists": "Tên người dùng được nhập đã có người lấy.\nHãy chọn một tên khác.",
+ "createacct-normalization": "Tên người dùng của bạn sẽ bị chỉnh lại thành “$2” do hạn chế kỹ thuật.",
"loginerror": "Lỗi đăng nhập",
"createacct-error": "Lỗi mở tài khoản",
"createaccounterror": "Không thể mở tài khoản: $1",
"accmailtext": "Uska hinimo nga random nga tigaman-panakob para kan [[User talk:$1|$1]] in ginpadangat ha $2. Puydi ini mabal-iwan ha ''[[Special:ChangePassword|liwani an tigaman-panakob]]'' nga pakli han paglog-in.",
"newarticle": "(Bag-o)",
"newarticletext": "Ginsunod mo an pakli nga waray pa kahihimo. Para ighimo an pakli, tikanga pagmakinilya ha kahon nga aada ha ubos (kitaa an [$1 nabulig nga pakli] para han kadugangan nga pananabutan). Kun sayop an imo pagkanhi, igpidlit an imo kanan panngaykay (''browser'') '''balik''' (''back'') nga piridlitan.",
- "anontalkpagetext": "----\n<em>Ini in hiruhimangraw-nga-pakli para han waray magpakilala nga gumaramit, nga waray pa hinmimo hin akawnt.</em>\nMagamit la kami hin IP address para makilal-an hiya.\nSugad hini nga IP address, in puydi sinmaro hiton pipira nga mga gumaramit.\nKun ikaw in waray magpakilala nga gumaramit, ngan pag-abat mo in may mga diri naangay nga komento an ginpapadangat ha imo, alayon nala [[Special:CreateAccount|paghimo hin akawnt]] o [[Special:UserLogin|pag-log in]] para malikyan an sumurunod nga mga pagkalipat nga dapat para ha iba nga waray magpakilala nga mga gumaramit.",
+ "anontalkpagetext": "----\n<em>Ini in hiruhimangraw-nga-pakli para han waray magpakilala nga gumaramit, nga waray pa hinmimo hin akawnt.</em>\nMagamit la kami hin IP address para makilal-an hira.\nSugad hini nga IP address, in puydi sinmaro hiton pipira nga mga gumaramit.\nKun ikaw in waray magpakilala nga gumaramit, ngan pag-abat mo in may mga diri naangay nga komento an ginpapadangat ha imo, alayon nala [[Special:CreateAccount|paghimo hin akawnt]] o [[Special:UserLogin|pag-log in]] para malikyan an sumurunod nga mga pagkalipat nga dapat para ha iba nga waray magpakilala nga mga gumaramit.",
"noarticletext": "Waray yana teksto ha sulod hinin nga pakli.\nPuyde ka [[Special:Search/{{PAGENAME}}|mamiling hin titulo hinin nga pakli]] ha iba pa nga mga pakli,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pamilnga an may mga pagkahisumpay nga mga talaan],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} igliwat ini nga pakli]</span>.",
"noarticletext-nopermission": "Waray yana nahasurat hini nga pakli\nPuyde hi ikaw [[Special:Search/{{PAGENAME}}|magbiling han ngaran hini nga pakli]] ha iba nga mga pakli,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mamiling han mga nanginginlabot nga mga talaan]</span>, kundi diri ka gintutugotan hin paghímò hini nga pakli.",
"missing-revision": "Waray na an rebisyon #$1 han pakli nga ginngaranan nga \"{{FULLPAGENAME}}\".\n\nIni in agsob tungod han pagsunod hin daan nga sumpay hin kaagi ha pakli nga ginpara.\nAn mga detalye in mabibilngan ha [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
"post-expand-template-inclusion-category": "Mga pakli kun diin an mga nahilalakip nga kadako han batakan in nalabaw.",
"post-expand-template-argument-warning": "'''Pahimatngaon:''' Ini nga pakli in nagsusulod hin pinakaguti usa nga argumento hin batakan nga may-ada sobra nga dako it padako nga kadako.\nIni nga mga argumento in ginlaktawan.",
"post-expand-template-argument-category": "Mga pakli nga nagsusulod hin ginlaktawan nga mga argumento hin batakan",
+ "undo-failure": "Ini nga pagliwat diri maakos matanggal an binuhat tungod han diri nagkakauyon nga intermediate edits.",
"undo-norev": "An pagliwat in diri mapapawaray-buhat tungod waray ito dida o napara na.",
"undo-summary": "Ginpawara-buhat an rebisyon nga $1 ni [[Special:Contributions/$2|$2]] ([[User talk:$2|himangrawi]])",
"undo-summary-username-hidden": "Igpawara-an-ginbuhat nga rebisyon $1 han uska tago nga gumaramit",
"notanarticle": "Diri uska unod nga pakli",
"notvisiblerev": "An urhi nga pagliwat han iba nga gumaramit in ginpara",
"watchlist-details": "{{PLURAL:$1|$1 nga pakli|$1 nga mga pakli}} aada ha imo talaan nga binabantayan (upod an mga hiruhimangraw-nga-pakli).",
+ "wlheader-showupdated": "An mga pakli nga nagbag-o tikang ha imo urhi nga pagbisita in ginpapakita hin <strong>madakmol nga kasurat</strong>.",
+ "wlnote": "Ha ilarom {{PLURAL:$1|amo an urhi nga pagbag-o|amo an mga urhi nga <strong>$1</strong> nga pagbag-o}} ha urhi nga {{PLURAL:$2|oras|<strong>$2</strong> mga oras}}, han $3, $4.",
"wlshowlast": "Igpakita an katapusan nga $1 ka mga oras $2 ka mga adlaw",
"watchlist-hide": "Tago-a",
"watchlist-submit": "Pakit-a",
"mycontris": "Mga ámot nakon",
"anoncontribs": "Mga amot",
"contribsub2": "Para {{HENERO:$3|$1}} ($2)",
+ "nocontribs": "Waray pagliwat an nabilngan han nauyon hini nga criteria.",
"uctop": "pagkayana",
"month": "Tikang ha bulan (ngan uruunhan):",
"year": "Tikang ha tuig (ngan uruunhan):",
"emaillink": "Padara hin e-mail",
"blocklogpage": "Talaan han pagpugong",
"blocklogentry": "ginpugngan hi [[$1]] nga natatapos ha takna hin $2 $3",
+ "reblock-logentry": "ginbalyo an block settings para kan [[$1]] nga may expiration time nga $2 $3",
"unblocklogentry": "gintanggal an pagpugong $1",
"block-log-flags-nocreate": "diri gintutugutan an paghimo hin akawnt",
"block-log-flags-noemail": "Diri ginpapagana an e-mail",
"widthheightpage": "$1 × $2, $3 {{PLURAL:$3|pakli|mga pakli}}",
"file-info": "Kadako han paypay: $1, klase han MIME: $2",
"file-info-size": "$1 × $2 nga pixel, kadako han fayl: $3, MIME nga tipo: $4",
+ "file-info-size-pages": "$1 × $2 mga pixel, kadako han file: $3, klase han MIME: $4, $5 {{PLURAL:$5|pakli|mga pakli}}",
"file-nohires": "Waray mas hiruhitaas nga resolusyon.",
"svg-long-desc": "SVG nga fayl, ginbabanabanahan nga $1 × $2 nga mga pixel, kadako han fayl: $3",
"show-big-image": "Orihinal nga paypay",
"watchlistedit-raw-removed": "{{PLURAL:$1|1 nga titulo|$1 nga mga titulo}} in gintanggal:",
"watchlistedit-clear-titles": "Mga titulo:",
"watchlistedit-clear-submit": "Hawana an barantayon nga listahan (Permamente ini!)",
+ "watchlisttools-clear": "Igpara an barantayan",
"watchlisttools-view": "Kitaa an mga nanginginlabot nga mga pagbabag-o",
"watchlisttools-edit": "Kitaa ngan igliwat an talaan han binabantayan",
"watchlisttools-raw": "Igliwat an hilaw nga talaan han binabantayan",
"badretype": "您所输入的密码并不相同。",
"usernameinprogress": "此用户名的账户创建已在进行中。请等待。",
"userexists": "用户名已存在。请使用其他名称。",
+ "createacct-normalization": "由于技术限制,您的用户名将被调整为“$2”。",
"loginerror": "登录错误",
"createacct-error": "账户创建出错",
"createaccounterror": "无法建立账户:$1",
"badretype": "兩次輸入的密碼並不相同。",
"usernameinprogress": "已正在進行此使用者名稱的帳號建立作業。\n請稍候。",
"userexists": "您所輸入的使用者名稱已存在,請另選一個名稱。",
+ "createacct-normalization": "基於技術限制,您的用戶名將調整為「$2」。",
"loginerror": "登入錯誤",
"createacct-error": "帳號建立錯誤",
"createaccounterror": "無法建立帳號:$1",
* @ingroup Maintenance
*/
+use MediaWiki\MediaWikiServices;
+
require_once __DIR__ . '/Maintenance.php';
/**
$outText = InstallDocFormatter::format( $inText );
if ( $this->hasOption( 'html' ) ) {
- global $wgParser;
+ $parser = MediaWikiServices::getInstance()->getParser();
$opt = new ParserOptions;
$title = Title::newFromText( 'Text file' );
- $out = $wgParser->parse( $outText, $title, $opt );
+ $out = $parser->parse( $outText, $title, $opt );
$outText = "<html><body>\n" . $out->getText() . "\n</body></html>\n";
}
* @ingroup Maintenance
*/
+use MediaWiki\MediaWikiServices;
+
require_once __DIR__ . '/dumpIterator.php';
/**
public $mPPNodeCount = 0;
public function getStripList() {
- global $wgParser;
+ $parser = MediaWikiServices::getInstance()->getParser();
- return $wgParser->getStripList();
+ return $parser->getStripList();
}
public function __construct() {
wfInstallerMain();
function wfInstallerMain() {
- global $wgRequest, $wgLang, $wgMetaNamespace, $wgCanonicalNamespaceNames;
+ global $wgLang, $wgMetaNamespace, $wgCanonicalNamespaceNames;
+ $request = RequestContext::getMain()->getRequest();
- $installer = InstallerOverrides::getWebInstaller( $wgRequest );
+ $installer = InstallerOverrides::getWebInstaller( $request );
if ( !$installer->startSession() ) {
if ( $installer->request->getVal( "css" ) ) {
$session = array();
}
- if ( !is_null( $wgRequest->getVal( 'uselang' ) ) ) {
- $langCode = $wgRequest->getVal( 'uselang' );
+ if ( !is_null( $request->getVal( 'uselang' ) ) ) {
+ $langCode = $request->getVal( 'uselang' );
} elseif ( isset( $session['settings']['_UserLang'] ) ) {
$langCode = $session['settings']['_UserLang'];
} else {
'styles' => 'resources/src/mediawiki.checkboxtoggle.styles.css',
],
'mediawiki.cookie' => [
- 'scripts' => 'resources/src/mediawiki.cookie.js',
+ 'scripts' => 'resources/src/mediawiki.cookie/index.js',
'dependencies' => 'jquery.cookie',
'targets' => [ 'desktop', 'mobile' ],
],
'mediawiki.widgets.NamespacesMultiselectWidget' => [
'scripts' => [
'resources/src/mediawiki.widgets/mw.widgets.NamespacesMultiselectWidget.js',
+ 'resources/src/mediawiki.widgets/mw.widgets.NamespacesMenuOptionWidget.js',
],
'dependencies' => [
'oojs-ui-widgets',
return false;
}
+ /**
+ * @param {HTMLElement} node
+ * @return {string}
+ */
function getElementSortKey( node ) {
- var $node = $( node ),
- // Use data-sort-value attribute.
- // Use data() instead of attr() so that live value changes
- // are processed as well (T40152).
- data = $node.data( 'sortValue' );
+ // Get data-sort-value attribute. Uses jQuery to allow live value
+ // changes from other code paths via data(), which reside only in jQuery.
+ // Must use $().data() instead of $.data(), as the latter *only*
+ // accesses the live values, without reading HTML5 attribs first (T40152).
+ var data = $( node ).data( 'sortValue' );
if ( data !== null && data !== undefined ) {
// Cast any numbers or other stuff to a string, methods
// like charAt, toLowerCase and split are expected.
return String( data );
}
- if ( !node ) {
- return $node.text();
- }
if ( node.tagName.toLowerCase() === 'img' ) {
- return $node.attr( 'alt' ) || ''; // handle undefined alt
+ return node.alt;
}
- return $.makeArray( node.childNodes ).map( function ( elem ) {
+ // Iterate the NodeList (not an array).
+ // Also uses null-return as filter in the same pass.
+ // eslint-disable-next-line no-jquery/no-map-util
+ return $.map( node.childNodes, function ( elem ) {
if ( elem.nodeType === Node.ELEMENT_NODE ) {
if ( $( elem ).hasClass( 'reference' ) ) {
return null;
- } else {
- return getElementSortKey( elem );
}
+ return getElementSortKey( elem );
+ }
+ if ( elem.nodeType === Node.TEXT_NODE ) {
+ return elem.textContent;
}
- return $.text( elem );
+ // Ignore other node types, such as HTML comments.
+ return null;
} ).join( '' );
}
+++ /dev/null
-( function () {
- 'use strict';
-
- /**
- * Provides an API for getting and setting cookies that is
- * syntactically and functionally similar to the server-side cookie
- * API (`WebRequest#getCookie` and `WebResponse#setcookie`).
- *
- * @author Sam Smith <samsmith@wikimedia.org>
- * @author Matthew Flaschen <mflaschen@wikimedia.org>
- * @author Timo Tijhof <krinklemail@gmail.com>
- *
- * @class mw.cookie
- * @singleton
- */
- mw.cookie = {
-
- /**
- * Set or delete a cookie.
- *
- * While this is natural in JavaScript, contrary to `WebResponse#setcookie` in PHP, the
- * default values for the `options` properties only apply if that property isn't set
- * already in your options object (e.g. passing `{ secure: null }` or `{ secure: undefined }`
- * overrides the default value for `options.secure`).
- *
- * @param {string} key
- * @param {string|null} value Value of cookie. If `value` is `null` then this method will
- * instead remove a cookie by name of `key`.
- * @param {Object|Date|number} [options] Options object, or expiry date
- * @param {Date|number|null} [options.expires] The expiry date of the cookie, or lifetime in seconds.
- *
- * If `options.expires` is null, then a session cookie is set.
- *
- * By default cookie expiration is based on `wgCookieExpiration`. Similar to `WebResponse`
- * in PHP, we set a session cookie if `wgCookieExpiration` is 0. And for non-zero values
- * it is interpreted as lifetime in seconds.
- *
- * @param {string} [options.prefix=wgCookiePrefix] The prefix of the key
- * @param {string} [options.domain=wgCookieDomain] The domain attribute of the cookie
- * @param {string} [options.path=wgCookiePath] The path attribute of the cookie
- * @param {boolean} [options.secure=false] Whether or not to include the secure attribute.
- * (Does **not** use the wgCookieSecure configuration variable)
- */
- set: function ( key, value, options ) {
- var config, defaultOptions, date;
-
- // wgCookieSecure is not used for now, since 'detect' could not work with
- // ResourceLoaderStartUpModule, as module cache is not fragmented by protocol.
- config = mw.config.get( [
- 'wgCookiePrefix',
- 'wgCookieDomain',
- 'wgCookiePath',
- 'wgCookieExpiration'
- ] );
-
- defaultOptions = {
- prefix: config.wgCookiePrefix,
- domain: config.wgCookieDomain,
- path: config.wgCookiePath,
- secure: false
- };
-
- // Options argument can also be a shortcut for the expiry
- // Expiry can be a Date, number or null
- if ( !options || options instanceof Date || typeof options === 'number' ) {
- // Also takes care of options = undefined, in which case we also don't need $.extend()
- defaultOptions.expires = options;
- options = defaultOptions;
- } else {
- options = $.extend( defaultOptions, options );
- }
-
- // Default to using wgCookieExpiration (lifetime in seconds).
- // If wgCookieExpiration is 0, that is considered a special value indicating
- // all cookies should be session cookies by default.
- if ( options.expires === undefined && config.wgCookieExpiration !== 0 ) {
- date = new Date();
- date.setTime( Number( date ) + ( config.wgCookieExpiration * 1000 ) );
- options.expires = date;
- } else if ( typeof options.expires === 'number' ) {
- // Lifetime in seconds
- date = new Date();
- date.setTime( Number( date ) + ( options.expires * 1000 ) );
- options.expires = date;
- } else if ( options.expires === null ) {
- // $.cookie makes a session cookie when options.expires is omitted
- delete options.expires;
- }
-
- // Process prefix
- key = options.prefix + key;
- delete options.prefix;
-
- // Process value
- if ( value !== null ) {
- value = String( value );
- }
-
- // Other options are handled by $.cookie
- $.cookie( key, value, options );
- },
-
- /**
- * Get the value of a cookie.
- *
- * @param {string} key
- * @param {string} [prefix=wgCookiePrefix] The prefix of the key. If `prefix` is
- * `undefined` or `null`, then `wgCookiePrefix` is used
- * @param {Mixed} [defaultValue=null]
- * @return {string|null|Mixed} If the cookie exists, then the value of the
- * cookie, otherwise `defaultValue`
- */
- get: function ( key, prefix, defaultValue ) {
- var result;
-
- if ( prefix === undefined || prefix === null ) {
- prefix = mw.config.get( 'wgCookiePrefix' );
- }
-
- // Was defaultValue omitted?
- if ( arguments.length < 3 ) {
- defaultValue = null;
- }
-
- result = $.cookie( prefix + key );
-
- return result !== null ? result : defaultValue;
- }
- };
-
-}() );
--- /dev/null
+( function () {
+ 'use strict';
+
+ /**
+ * Provides an API for getting and setting cookies that is
+ * syntactically and functionally similar to the server-side cookie
+ * API (`WebRequest#getCookie` and `WebResponse#setcookie`).
+ *
+ * @author Sam Smith <samsmith@wikimedia.org>
+ * @author Matthew Flaschen <mflaschen@wikimedia.org>
+ * @author Timo Tijhof <krinklemail@gmail.com>
+ *
+ * @class mw.cookie
+ * @singleton
+ */
+ mw.cookie = {
+
+ /**
+ * Set or delete a cookie.
+ *
+ * While this is natural in JavaScript, contrary to `WebResponse#setcookie` in PHP, the
+ * default values for the `options` properties only apply if that property isn't set
+ * already in your options object (e.g. passing `{ secure: null }` or `{ secure: undefined }`
+ * overrides the default value for `options.secure`).
+ *
+ * @param {string} key
+ * @param {string|null} value Value of cookie. If `value` is `null` then this method will
+ * instead remove a cookie by name of `key`.
+ * @param {Object|Date|number} [options] Options object, or expiry date
+ * @param {Date|number|null} [options.expires] The expiry date of the cookie, or lifetime in seconds.
+ *
+ * If `options.expires` is null, then a session cookie is set.
+ *
+ * By default cookie expiration is based on `wgCookieExpiration`. Similar to `WebResponse`
+ * in PHP, we set a session cookie if `wgCookieExpiration` is 0. And for non-zero values
+ * it is interpreted as lifetime in seconds.
+ *
+ * @param {string} [options.prefix=wgCookiePrefix] The prefix of the key
+ * @param {string} [options.domain=wgCookieDomain] The domain attribute of the cookie
+ * @param {string} [options.path=wgCookiePath] The path attribute of the cookie
+ * @param {boolean} [options.secure=false] Whether or not to include the secure attribute.
+ * (Does **not** use the wgCookieSecure configuration variable)
+ */
+ set: function ( key, value, options ) {
+ var config, defaultOptions, date;
+
+ // wgCookieSecure is not used for now, since 'detect' could not work with
+ // ResourceLoaderStartUpModule, as module cache is not fragmented by protocol.
+ config = mw.config.get( [
+ 'wgCookiePrefix',
+ 'wgCookieDomain',
+ 'wgCookiePath',
+ 'wgCookieExpiration'
+ ] );
+
+ defaultOptions = {
+ prefix: config.wgCookiePrefix,
+ domain: config.wgCookieDomain,
+ path: config.wgCookiePath,
+ secure: false
+ };
+
+ // Options argument can also be a shortcut for the expiry
+ // Expiry can be a Date, number or null
+ if ( !options || options instanceof Date || typeof options === 'number' ) {
+ // Also takes care of options = undefined, in which case we also don't need $.extend()
+ defaultOptions.expires = options;
+ options = defaultOptions;
+ } else {
+ options = $.extend( defaultOptions, options );
+ }
+
+ // Default to using wgCookieExpiration (lifetime in seconds).
+ // If wgCookieExpiration is 0, that is considered a special value indicating
+ // all cookies should be session cookies by default.
+ if ( options.expires === undefined && config.wgCookieExpiration !== 0 ) {
+ date = new Date();
+ date.setTime( Number( date ) + ( config.wgCookieExpiration * 1000 ) );
+ options.expires = date;
+ } else if ( typeof options.expires === 'number' ) {
+ // Lifetime in seconds
+ date = new Date();
+ date.setTime( Number( date ) + ( options.expires * 1000 ) );
+ options.expires = date;
+ } else if ( options.expires === null ) {
+ // $.cookie makes a session cookie when options.expires is omitted
+ delete options.expires;
+ }
+
+ // Process prefix
+ key = options.prefix + key;
+ delete options.prefix;
+
+ // Process value
+ if ( value !== null ) {
+ value = String( value );
+ }
+
+ // Other options are handled by $.cookie
+ $.cookie( key, value, options );
+ },
+
+ /**
+ * Get the value of a cookie.
+ *
+ * @param {string} key
+ * @param {string} [prefix=wgCookiePrefix] The prefix of the key. If `prefix` is
+ * `undefined` or `null`, then `wgCookiePrefix` is used
+ * @param {Mixed} [defaultValue=null]
+ * @return {string|null|Mixed} If the cookie exists, then the value of the
+ * cookie, otherwise `defaultValue`
+ */
+ get: function ( key, prefix, defaultValue ) {
+ var result;
+
+ if ( prefix === undefined || prefix === null ) {
+ prefix = mw.config.get( 'wgCookiePrefix' );
+ }
+
+ // Was defaultValue omitted?
+ if ( arguments.length < 3 ) {
+ defaultValue = null;
+ }
+
+ result = $.cookie( prefix + key );
+
+ return result !== null ? result : defaultValue;
+ }
+ };
+
+}() );
}
ul {
- list-style-type: square;
margin: 0.3em 0 0 1.6em;
padding: 0;
}
--- /dev/null
+/*!
+ * MediaWiki Widgets - NamespacesMenuOptionWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function () {
+
+ /**
+ * Creates an mw.widgets.NamespacesMenuOptionWidget object
+ *
+ * This MenuOptionWidget widget returns an item match text that includes
+ * both the label and the data, so the menu can filter on either.
+ *
+ * @class
+ * @extends OO.ui.MenuOptionWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+ mw.widgets.NamespacesMenuOptionWidget = function MwWidgetsNamespacesMenuOptionWidget( config ) {
+ // Parent
+ mw.widgets.NamespacesMenuOptionWidget.parent.call( this, config );
+ };
+
+ /* Setup */
+
+ OO.inheritClass( mw.widgets.NamespacesMenuOptionWidget, OO.ui.MenuOptionWidget );
+
+ /**
+ * @inheritdoc
+ */
+ mw.widgets.NamespacesMenuOptionWidget.prototype.getMatchText = function () {
+ return this.getData() + ' ' + this.getLabel();
+ };
+
+}() );
{
clearInputOnChoose: true,
inputPosition: 'inline',
- allowEditTags: false
+ allowEditTags: false,
+ menu: {
+ filterMode: 'substring'
+ }
},
config,
{
OO.inheritClass( mw.widgets.NamespacesMultiselectWidget, OO.ui.MenuTagMultiselectWidget );
OO.mixinClass( mw.widgets.NamespacesMultiselectWidget, OO.ui.mixin.PendingElement );
+ /* Methods */
+
+ /**
+ * @inheritdoc
+ */
+ mw.widgets.NamespacesMultiselectWidget.prototype.createMenuOptionWidget = function ( data, label, icon ) {
+ return new mw.widgets.NamespacesMenuOptionWidget( {
+ data: data,
+ label: label || data,
+ icon: icon
+ } );
+ };
+
}() );
$setup['wgHtml5'] = true;
$setup['wgDisableLangConversion'] = false;
$setup['wgDisableTitleConversion'] = false;
- $setup['wgMediaInTargetLanguage'] = false;
// "extra language links"
// see https://gerrit.wikimedia.org/r/111390
+ [ 'ISBN' => true, 'PMID' => true, 'RFC' => true ],
// Test with legacy encoding by default until HTML5 is very stable and default
'wgFragmentMode' => [ 'legacy' ],
- 'wgMediaInTargetLanguage' => self::getOptionValue( 'wgMediaInTargetLanguage', $opts, false ),
];
$nonIncludable = self::getOptionValue( 'wgNonincludableNamespaces', $opts, false );
# You can also set the following parser properties via test options:
# wgEnableUploads, wgAllowExternalImages, wgMaxTocLevel,
# wgLinkHolderBatchSize, wgRawHtml, wgInterwikiMagic,
-# wgEnableMagicLinks, wgMediaInTargetLanguage
+# wgEnableMagicLinks
#
# For testing purposes, temporary articles can created:
# !!article / NAMESPACE:TITLE / !!text / ARTICLE TEXT / !!endarticle
SVG thumbnails in page language
!! options
language=ru
-wgMediaInTargetLanguage = true
!! wikitext
[[File:Foobar.svg]] [[File:Foobar.svg|lang=en]]
!! html/php
SVG thumbnails in page language not present in the file
!! options
language=de
-wgMediaInTargetLanguage = true
!! wikitext
[[File:Foobar.svg]] [[File:Foobar.svg|lang=ru]]
!! html/php
"PhanParamTooMany",
// approximate error count: 3
"PhanParamTooManyInternal",
- // approximate error count: 1
- "PhanRedefineFunctionInternal",
// approximate error count: 2
"PhanTraitParentReference",
// approximate error count: 3
$options = [ 'lang' => $options ];
}
$options += [
+ 'debug' => 'true',
'lang' => 'en',
'dir' => 'ltr',
'skin' => 'vector',
];
$resourceLoader = $rl ?: new ResourceLoader();
$request = new FauxRequest( [
+ 'debug' => $options['debug'],
'lang' => $options['lang'],
'modules' => $options['modules'],
'only' => $options['only'],
[
[ 'test.foo', ResourceLoaderModule::TYPE_SCRIPTS ],
"<script nonce=\"secret\">(window.RLQ=window.RLQ||[]).push(function(){"
- . 'mw.loader.load("http://127.0.0.1:8080/w/load.php?debug=false\u0026lang=en\u0026modules=test.foo\u0026only=scripts\u0026skin=fallback");'
+ . 'mw.loader.load("http://127.0.0.1:8080/w/load.php?lang=en\u0026modules=test.foo\u0026only=scripts\u0026skin=fallback");'
. "});</script>"
],
// Multiple only=styles load
[
[ [ 'test.baz', 'test.foo', 'test.bar' ], ResourceLoaderModule::TYPE_STYLES ],
- '<link rel="stylesheet" href="http://127.0.0.1:8080/w/load.php?debug=false&lang=en&modules=test.bar%2Cbaz%2Cfoo&only=styles&skin=fallback"/>'
+ '<link rel="stylesheet" href="http://127.0.0.1:8080/w/load.php?lang=en&modules=test.bar%2Cbaz%2Cfoo&only=styles&skin=fallback"/>'
],
// Private embed (only=scripts)
[
// noscript group
[
[ 'test.noscript', ResourceLoaderModule::TYPE_STYLES ],
- '<noscript><link rel="stylesheet" href="http://127.0.0.1:8080/w/load.php?debug=false&lang=en&modules=test.noscript&only=styles&skin=fallback"/></noscript>'
+ '<noscript><link rel="stylesheet" href="http://127.0.0.1:8080/w/load.php?lang=en&modules=test.noscript&only=styles&skin=fallback"/></noscript>'
],
// Load two modules in separate groups
[
[ [ 'test.group.foo', 'test.group.bar' ], ResourceLoaderModule::TYPE_COMBINED ],
"<script nonce=\"secret\">(window.RLQ=window.RLQ||[]).push(function(){"
- . 'mw.loader.load("http://127.0.0.1:8080/w/load.php?debug=false\u0026lang=en\u0026modules=test.group.bar\u0026skin=fallback");'
- . 'mw.loader.load("http://127.0.0.1:8080/w/load.php?debug=false\u0026lang=en\u0026modules=test.group.foo\u0026skin=fallback");'
+ . 'mw.loader.load("http://127.0.0.1:8080/w/load.php?lang=en\u0026modules=test.group.bar\u0026skin=fallback");'
+ . 'mw.loader.load("http://127.0.0.1:8080/w/load.php?lang=en\u0026modules=test.group.foo\u0026skin=fallback");'
. "});</script>"
],
];
'default logged-out' => [
'exemptStyleModules' => [ 'site' => [ 'site.styles' ] ],
'<meta name="ResourceLoaderDynamicStyles" content=""/>' . "\n" .
- '<link rel="stylesheet" href="/w/load.php?debug=false&lang=en&modules=site.styles&only=styles&skin=fallback"/>',
+ '<link rel="stylesheet" href="/w/load.php?lang=en&modules=site.styles&only=styles&skin=fallback"/>',
],
'default logged-in' => [
'exemptStyleModules' => [ 'site' => [ 'site.styles' ], 'user' => [ 'user.styles' ] ],
'<meta name="ResourceLoaderDynamicStyles" content=""/>' . "\n" .
- '<link rel="stylesheet" href="/w/load.php?debug=false&lang=en&modules=site.styles&only=styles&skin=fallback"/>' . "\n" .
- '<link rel="stylesheet" href="/w/load.php?debug=false&lang=en&modules=user.styles&only=styles&skin=fallback&version=1ai9g6t"/>',
+ '<link rel="stylesheet" href="/w/load.php?lang=en&modules=site.styles&only=styles&skin=fallback"/>' . "\n" .
+ '<link rel="stylesheet" href="/w/load.php?lang=en&modules=user.styles&only=styles&skin=fallback&version=1ai9g6t"/>',
],
'custom modules' => [
'exemptStyleModules' => [
'user' => [ 'user.styles', 'example.user' ],
],
'<meta name="ResourceLoaderDynamicStyles" content=""/>' . "\n" .
- '<link rel="stylesheet" href="/w/load.php?debug=false&lang=en&modules=example.site.a%2Cb&only=styles&skin=fallback"/>' . "\n" .
- '<link rel="stylesheet" href="/w/load.php?debug=false&lang=en&modules=site.styles&only=styles&skin=fallback"/>' . "\n" .
- '<link rel="stylesheet" href="/w/load.php?debug=false&lang=en&modules=example.user&only=styles&skin=fallback&version=0a56zyi"/>' . "\n" .
- '<link rel="stylesheet" href="/w/load.php?debug=false&lang=en&modules=user.styles&only=styles&skin=fallback&version=1ai9g6t"/>',
+ '<link rel="stylesheet" href="/w/load.php?lang=en&modules=example.site.a%2Cb&only=styles&skin=fallback"/>' . "\n" .
+ '<link rel="stylesheet" href="/w/load.php?lang=en&modules=site.styles&only=styles&skin=fallback"/>' . "\n" .
+ '<link rel="stylesheet" href="/w/load.php?lang=en&modules=example.user&only=styles&skin=fallback&version=0a56zyi"/>' . "\n" .
+ '<link rel="stylesheet" href="/w/load.php?lang=en&modules=user.styles&only=styles&skin=fallback&version=1ai9g6t"/>',
],
];
// phpcs:enable
/**
* @dataProvider statsKeyProvider
- * @covers WANObjectCache::determineKeyClass
+ * @covers WANObjectCache::determineKeyClassForStats
*/
public function testStatsKeyClass( $key, $class ) {
$wanCache = TestingAccessWrapper::newFromObject( new WANObjectCache( [
'cache' => new HashBagOStuff
] ) );
- $this->assertEquals( $class, $wanCache->determineKeyClass( $key ) );
+ $this->assertEquals( $class, $wanCache->determineKeyClassForStats( $key ) );
}
}
*/
public function testGetXMLMetadata( $infile, $expected ) {
$r = new XMLReader();
- if ( !method_exists( $r, 'readInnerXML' ) ) {
- $this->markTestSkipped( 'XMLReader::readInnerXML() does not exist (libxml >2.6.20 needed).' );
-
- return;
- }
$this->assertMetadata( $infile, $expected );
}
'ResourceModuleSkinStyles' => [],
'ResourceModules' => [],
'EnableJavaScriptTest' => false,
- 'ResourceLoaderDebug' => false,
'LoadScript' => '/w/load.php',
] );
return new ResourceLoaderContext(
. 'mw.loader.implement("test.private@{blankVer}",null,{"css":[]});'
. 'RLPAGEMODULES=["test"];mw.loader.load(RLPAGEMODULES);'
. '});</script>' . "\n"
- . '<link rel="stylesheet" href="/w/load.php?debug=false&lang=nl&modules=test.styles.deprecated%2Cpure&only=styles&skin=fallback"/>' . "\n"
+ . '<link rel="stylesheet" href="/w/load.php?lang=nl&modules=test.styles.deprecated%2Cpure&only=styles&skin=fallback"/>' . "\n"
. '<style>.private{}</style>' . "\n"
- . '<script async="" src="/w/load.php?debug=false&lang=nl&modules=startup&only=scripts&skin=fallback"></script>';
+ . '<script async="" src="/w/load.php?lang=nl&modules=startup&only=scripts&skin=fallback"></script>';
// phpcs:enable
$expected = self::expandVariables( $expected );
// phpcs:disable Generic.Files.LineLength
$expected = '<script>document.documentElement.className = document.documentElement.className.replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );</script>' . "\n"
- . '<script async="" src="/w/load.php?debug=false&lang=nl&modules=startup&only=scripts&skin=fallback&target=example"></script>';
+ . '<script async="" src="/w/load.php?lang=nl&modules=startup&only=scripts&skin=fallback&target=example"></script>';
// phpcs:enable
$this->assertEquals( $expected, $client->getHeadHtml() );
// phpcs:disable Generic.Files.LineLength
$expected = '<script>document.documentElement.className = document.documentElement.className.replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );</script>' . "\n"
- . '<script async="" src="/w/load.php?debug=false&lang=nl&modules=startup&only=scripts&safemode=1&skin=fallback"></script>';
+ . '<script async="" src="/w/load.php?lang=nl&modules=startup&only=scripts&safemode=1&skin=fallback"></script>';
// phpcs:enable
$this->assertEquals( $expected, $client->getHeadHtml() );
// phpcs:disable Generic.Files.LineLength
$expected = '<script>document.documentElement.className = document.documentElement.className.replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );</script>' . "\n"
- . '<script async="" src="/w/load.php?debug=false&lang=nl&modules=startup&only=scripts&skin=fallback"></script>';
+ . '<script async="" src="/w/load.php?lang=nl&modules=startup&only=scripts&skin=fallback"></script>';
// phpcs:enable
$this->assertEquals( $expected, $client->getHeadHtml() );
'context' => [],
'modules' => [ 'test.unknown' ],
'only' => ResourceLoaderModule::TYPE_STYLES,
+ 'extra' => [],
'output' => '',
],
[
'context' => [],
'modules' => [ 'test.styles.private' ],
'only' => ResourceLoaderModule::TYPE_STYLES,
+ 'extra' => [],
'output' => '<style>.private{}</style>',
],
[
'context' => [],
'modules' => [ 'test.private' ],
'only' => ResourceLoaderModule::TYPE_COMBINED,
+ 'extra' => [],
'output' => '<script>(window.RLQ=window.RLQ||[]).push(function(){mw.loader.implement("test.private@{blankVer}",null,{"css":[]});});</script>',
],
[
// Eg. startup module
'modules' => [ 'test.scripts.raw' ],
'only' => ResourceLoaderModule::TYPE_SCRIPTS,
- 'output' => '<script async="" src="/w/load.php?debug=false&lang=nl&modules=test.scripts.raw&only=scripts&skin=fallback"></script>',
+ 'extra' => [],
+ 'output' => '<script async="" src="/w/load.php?lang=nl&modules=test.scripts.raw&only=scripts&skin=fallback"></script>',
],
[
- 'context' => [ 'sync' => true ],
+ 'context' => [],
'modules' => [ 'test.scripts.raw' ],
'only' => ResourceLoaderModule::TYPE_SCRIPTS,
- 'output' => '<script src="/w/load.php?debug=false&lang=nl&modules=test.scripts.raw&only=scripts&skin=fallback&sync=1"></script>',
+ 'extra' => [ 'sync' => '1' ],
+ 'output' => '<script src="/w/load.php?lang=nl&modules=test.scripts.raw&only=scripts&skin=fallback&sync=1"></script>',
],
[
'context' => [],
'modules' => [ 'test.scripts.user' ],
'only' => ResourceLoaderModule::TYPE_SCRIPTS,
- 'output' => '<script>(window.RLQ=window.RLQ||[]).push(function(){mw.loader.load("/w/load.php?debug=false\u0026lang=nl\u0026modules=test.scripts.user\u0026only=scripts\u0026skin=fallback\u0026user=Example\u0026version=0a56zyi");});</script>',
+ 'extra' => [],
+ 'output' => '<script>(window.RLQ=window.RLQ||[]).push(function(){mw.loader.load("/w/load.php?lang=nl\u0026modules=test.scripts.user\u0026only=scripts\u0026skin=fallback\u0026user=Example\u0026version=0a56zyi");});</script>',
],
[
'context' => [],
'modules' => [ 'test.user' ],
'only' => ResourceLoaderModule::TYPE_COMBINED,
- 'output' => '<script>(window.RLQ=window.RLQ||[]).push(function(){mw.loader.load("/w/load.php?debug=false\u0026lang=nl\u0026modules=test.user\u0026skin=fallback\u0026user=Example\u0026version=0a56zyi");});</script>',
+ 'extra' => [],
+ 'output' => '<script>(window.RLQ=window.RLQ||[]).push(function(){mw.loader.load("/w/load.php?lang=nl\u0026modules=test.user\u0026skin=fallback\u0026user=Example\u0026version=0a56zyi");});</script>',
],
[
- 'context' => [ 'debug' => true ],
+ 'context' => [ 'debug' => 'true' ],
'modules' => [ 'test.styles.pure', 'test.styles.mixed' ],
'only' => ResourceLoaderModule::TYPE_STYLES,
+ 'extra' => [],
'output' => '<link rel="stylesheet" href="/w/load.php?debug=true&lang=nl&modules=test.styles.mixed&only=styles&skin=fallback"/>' . "\n"
. '<link rel="stylesheet" href="/w/load.php?debug=true&lang=nl&modules=test.styles.pure&only=styles&skin=fallback"/>',
],
[
- 'context' => [ 'debug' => false ],
+ 'context' => [ 'debug' => 'false' ],
'modules' => [ 'test.styles.pure', 'test.styles.mixed' ],
'only' => ResourceLoaderModule::TYPE_STYLES,
- 'output' => '<link rel="stylesheet" href="/w/load.php?debug=false&lang=nl&modules=test.styles.mixed%2Cpure&only=styles&skin=fallback"/>',
+ 'extra' => [],
+ 'output' => '<link rel="stylesheet" href="/w/load.php?lang=nl&modules=test.styles.mixed%2Cpure&only=styles&skin=fallback"/>',
],
[
'context' => [],
'modules' => [ 'test.styles.noscript' ],
'only' => ResourceLoaderModule::TYPE_STYLES,
- 'output' => '<noscript><link rel="stylesheet" href="/w/load.php?debug=false&lang=nl&modules=test.styles.noscript&only=styles&skin=fallback"/></noscript>',
+ 'extra' => [],
+ 'output' => '<noscript><link rel="stylesheet" href="/w/load.php?lang=nl&modules=test.styles.noscript&only=styles&skin=fallback"/></noscript>',
],
[
'context' => [],
'modules' => [ 'test.shouldembed' ],
'only' => ResourceLoaderModule::TYPE_COMBINED,
+ 'extra' => [],
'output' => '<script>(window.RLQ=window.RLQ||[]).push(function(){mw.loader.implement("test.shouldembed@09p30q0",null,{"css":[]});});</script>',
],
[
'context' => [],
'modules' => [ 'test.styles.shouldembed' ],
'only' => ResourceLoaderModule::TYPE_STYLES,
+ 'extra' => [],
'output' => '<style>.shouldembed{}</style>',
],
[
'context' => [],
'modules' => [ 'test.scripts.shouldembed' ],
'only' => ResourceLoaderModule::TYPE_SCRIPTS,
+ 'extra' => [],
'output' => '<script>(window.RLQ=window.RLQ||[]).push(function(){mw.loader.state({"test.scripts.shouldembed":"ready"});});</script>',
],
[
'context' => [],
'modules' => [ 'test', 'test.shouldembed' ],
'only' => ResourceLoaderModule::TYPE_COMBINED,
- 'output' => '<script>(window.RLQ=window.RLQ||[]).push(function(){mw.loader.load("/w/load.php?debug=false\u0026lang=nl\u0026modules=test\u0026skin=fallback");mw.loader.implement("test.shouldembed@09p30q0",null,{"css":[]});});</script>',
+ 'extra' => [],
+ 'output' => '<script>(window.RLQ=window.RLQ||[]).push(function(){mw.loader.load("/w/load.php?lang=nl\u0026modules=test\u0026skin=fallback");mw.loader.implement("test.shouldembed@09p30q0",null,{"css":[]});});</script>',
],
[
'context' => [],
'modules' => [ 'test.styles.pure', 'test.styles.shouldembed' ],
'only' => ResourceLoaderModule::TYPE_STYLES,
+ 'extra' => [],
'output' =>
- '<link rel="stylesheet" href="/w/load.php?debug=false&lang=nl&modules=test.styles.pure&only=styles&skin=fallback"/>' . "\n"
+ '<link rel="stylesheet" href="/w/load.php?lang=nl&modules=test.styles.pure&only=styles&skin=fallback"/>' . "\n"
. '<style>.shouldembed{}</style>'
],
[
'context' => [],
'modules' => [ 'test.ordering.a', 'test.ordering.e', 'test.ordering.b', 'test.ordering.d', 'test.ordering.c' ],
'only' => ResourceLoaderModule::TYPE_STYLES,
+ 'extra' => [],
'output' =>
- '<link rel="stylesheet" href="/w/load.php?debug=false&lang=nl&modules=test.ordering.a%2Cb&only=styles&skin=fallback"/>' . "\n"
+ '<link rel="stylesheet" href="/w/load.php?lang=nl&modules=test.ordering.a%2Cb&only=styles&skin=fallback"/>' . "\n"
. '<style>.orderingC{}.orderingD{}</style>' . "\n"
- . '<link rel="stylesheet" href="/w/load.php?debug=false&lang=nl&modules=test.ordering.e&only=styles&skin=fallback"/>'
+ . '<link rel="stylesheet" href="/w/load.php?lang=nl&modules=test.ordering.e&only=styles&skin=fallback"/>'
],
];
// phpcs:enable
* @covers ResourceLoader::makeLoaderQuery
* @covers ResourceLoader::makeInlineScript
*/
- public function testMakeLoad( array $extraQuery, array $modules, $type, $expected ) {
- $context = self::makeContext( $extraQuery );
+ public function testMakeLoad(
+ array $contextQuery,
+ array $modules,
+ $type,
+ array $extraQuery,
+ $expected
+ ) {
+ $context = self::makeContext( $contextQuery );
$context->getResourceLoader()->register( self::makeSampleModules() );
$actual = ResourceLoaderClientHtml::makeLoad( $context, $modules, $type, $extraQuery, false );
$expected = self::expandVariables( $expected );
}, $scripts );
$rl->register( $modules );
- $this->setMwGlobals( 'wgResourceLoaderDebug', $debug );
$context = $this->getResourceLoaderContext(
[
'modules' => implode( '|', array_keys( $modules ) ),
'only' => 'scripts',
+ 'debug' => $debug ? 'true' : 'false',
],
$rl
);