Merge "Revert "change phabricator URL""
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 27 May 2019 06:43:07 +0000 (06:43 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 27 May 2019 06:43:07 +0000 (06:43 +0000)
95 files changed:
RELEASE-NOTES-1.34
autoload.php
composer.json
includes/AjaxResponse.php
includes/Block.php
includes/DefaultSettings.php
includes/FeedUtils.php
includes/Linker.php
includes/MediaWiki.php
includes/OutputPage.php
includes/ServiceWiring.php
includes/Setup.php
includes/Storage/DerivedPageDataUpdater.php
includes/actions/RawAction.php
includes/api/ApiMain.php
includes/api/ApiQueryRevisions.php
includes/api/i18n/zh-hans.json
includes/cache/localisation/LocalisationCache.php
includes/clientpool/SquidPurgeClient.php
includes/deferred/CdnCacheUpdate.php
includes/deferred/DeferredUpdates.php
includes/deferred/TransactionRoundAwareUpdate.php [new file with mode: 0644]
includes/deferred/TransactionRoundDefiningUpdate.php
includes/installer/DatabaseInstaller.php
includes/installer/MssqlInstaller.php
includes/installer/MysqlInstaller.php
includes/installer/OracleInstaller.php
includes/installer/PostgresInstaller.php
includes/installer/SqliteInstaller.php
includes/jobqueue/Job.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/libs/rdbms/ChronologyProtector.php
includes/libs/rdbms/lbfactory/LBFactory.php
includes/preferences/DefaultPreferencesFactory.php
includes/resourceloader/ResourceLoaderModule.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialSearch.php
includes/specials/pagers/AllMessagesTablePager.php
languages/Language.php
languages/i18n/aeb-arab.json
languages/i18n/ar.json
languages/i18n/as.json
languages/i18n/az.json
languages/i18n/ban.json
languages/i18n/be-tarask.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/fa.json
languages/i18n/fr.json
languages/i18n/fy.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/io.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/mk.json
languages/i18n/my.json
languages/i18n/nl.json
languages/i18n/nqo.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sc.json
languages/i18n/skr-arab.json
languages/i18n/sl.json
languages/i18n/sr-el.json
languages/i18n/te.json
languages/i18n/th.json
languages/i18n/uk.json
languages/i18n/uz.json
languages/messages/MessagesEn.php
maintenance/benchmarks/benchmarkPurge.php
maintenance/purgeChangedPages.php
maintenance/purgeList.php
opensearch_desc.php
resources/Resources.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/WebRequestTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/deferred/DeferredUpdatesTest.php
tests/phpunit/includes/libs/rdbms/ChronologyProtectorTest.php [new file with mode: 0644]
thumb.php

index 197d983..85b7536 100644 (file)
@@ -35,6 +35,13 @@ For notes on 1.33.x and older releases, see HISTORY.
   module or will be generated by Mediawiki itself (depending on the set-up).
 
 ==== Changed configuration ====
+* $wgUseCdn, $wgCdnServers, $wgCdnServersNoPurge, and $wgCdnMaxAge – These four
+  CDN-related config variables have been renamed from being specific to Squid –
+  they were previously $wgUseSquid, $wgSquidServers, $wgSquidServersNoPurge, and
+  $wgSquidMaxage respectively. This aligns them with the related existing
+  variable $wgCdnMaxageLagged. The previous configuration variable names are
+  deprecated, but will be used as the fall back if they are still set.
+  Note that wgSquidPurgeUseHostHeader has not been renamed, as it is deprecated.
 * …
 
 ==== Removed configuration ====
@@ -62,6 +69,7 @@ For notes on 1.33.x and older releases, see HISTORY.
 * Updated mediawiki/codesniffer from 25.0.0 to 26.0.0 (dev-only).
 * Updated cssjanus/cssjanus from 1.2.1 to 1.3.0.
 * Updated wikimedia/at-ease from 1.2.0 to 2.0.0.
+* Updated wikimedia/remex-html from 2.0.1 to 2.0.3.
 * …
 
 ==== Removed external libraries ====
@@ -220,6 +228,9 @@ because of Phabricator reports.
 * Constructing Parser directly is deprecated. Obtain one from ParserFactory.
 * Title::moveSubpages is deprecated. Use MovePage::moveSubpages or
   MovePage::moveSubpagesIfAllowed.
+* The MWNamespace class is deprecated. Use MediaWikiServices::getNamespaceInfo.
+* (T62260) Hard deprecate Language::getExtraUserToggles() method.
+* …
 
 === Other changes in 1.34 ===
 * …
index 4c8f5a4..486239d 100644 (file)
@@ -1496,6 +1496,7 @@ $wgAutoloadLocalClasses = [
        'TrackBlobs' => __DIR__ . '/maintenance/storage/trackBlobs.php',
        'TrackingCategories' => __DIR__ . '/includes/TrackingCategories.php',
        'TraditionalImageGallery' => __DIR__ . '/includes/gallery/TraditionalImageGallery.php',
+       'TransactionRoundAwareUpdate' => __DIR__ . '/includes/deferred/TransactionRoundAwareUpdate.php',
        'TransactionRoundDefiningUpdate' => __DIR__ . '/includes/deferred/TransactionRoundDefiningUpdate.php',
        'TransformParameterError' => __DIR__ . '/includes/media/TransformParameterError.php',
        'TransformTooBigImageAreaError' => __DIR__ . '/includes/media/TransformTooBigImageAreaError.php',
index 11680ff..d3fe1e9 100644 (file)
@@ -47,7 +47,7 @@
                "wikimedia/php-session-serializer": "1.0.7",
                "wikimedia/purtle": "1.0.7",
                "wikimedia/relpath": "2.1.1",
-               "wikimedia/remex-html": "2.0.1",
+               "wikimedia/remex-html": "2.0.3",
                "wikimedia/running-stat": "1.2.1",
                "wikimedia/scoped-callback": "3.0.0",
                "wikimedia/utfnormal": "2.0.0",
index 5f889ad..323c5d3 100644 (file)
@@ -179,8 +179,7 @@ class AjaxResponse {
                        # If CDN caches are configured, tell them to cache the response,
                        # and tell the client to always check with the CDN. Otherwise,
                        # tell the client to use a cached copy, without a way to purge it.
-
-                       if ( $this->mConfig->get( 'UseSquid' ) ) {
+                       if ( $this->mConfig->get( 'UseCdn' ) ) {
                                # Expect explicit purge of the proxy cache, but require end user agents
                                # to revalidate against the proxy on each visit.
                                # Surrogate-Control controls our CDN, Cache-Control downstream caches
index 9f7f77d..0f5e8dd 100644 (file)
@@ -1154,7 +1154,7 @@ class Block extends AbstractBlock {
                        if ( !IP::isValid( $ipaddr ) ) {
                                continue;
                        }
-                       # Don't check trusted IPs (includes local squids which will be in every request)
+                       # Don't check trusted IPs (includes local CDNs which will be in every request)
                        if ( $proxyLookup->isTrustedProxy( $ipaddr ) ) {
                                continue;
                        }
@@ -1208,14 +1208,14 @@ class Block extends AbstractBlock {
         *  - Other softblocks are chosen over autoblocks
         *  - If there are multiple exact or range blocks at the same level, the one chosen
         *    is random
-        * This should be used when $blocks where retrieved from the user's IP address
+        * This should be used when $blocks were retrieved from the user's IP address
         * and $ipChain is populated from the same IP address information.
         *
         * @param array $blocks Array of Block objects
         * @param array $ipChain List of IPs (strings). This is used to determine how "close"
         *     a block is to the server, and if a block matches exactly, or is in a range.
         *     The order is furthest from the server to nearest e.g., (Browser, proxy1, proxy2,
-        *     local-squid, ...)
+        *     local-cdn, ...)
         * @throws MWException
         * @return Block|null The "best" block from the list
         */
index de94f77..eed732b 100644 (file)
@@ -2701,7 +2701,8 @@ $wgExtensionInfoMTime = false;
  * @name   HTTP proxy (CDN) settings
  *
  * Many of these settings apply to any HTTP proxy used in front of MediaWiki,
- * although they are referred to as Squid settings for historical reasons.
+ * although they are sometimes still referred to as Squid settings for
+ * historical reasons.
  *
  * Achieving a high hit ratio with an HTTP proxy requires special
  * configuration. See https://www.mediawiki.org/wiki/Manual:Squid_caching for
@@ -2713,8 +2714,10 @@ $wgExtensionInfoMTime = false;
 /**
  * Enable/disable CDN.
  * See https://www.mediawiki.org/wiki/Manual:Squid_caching
+ *
+ * @since 1.34 Renamed from $wgUseSquid.
  */
-$wgUseSquid = false;
+$wgUseCdn = false;
 
 /**
  * If you run Squid3 with ESI support, enable this (default:false):
@@ -2756,12 +2759,15 @@ $wgInternalServer = false;
  * out s-maxage in the CDN config.
  *
  * 18000 seconds = 5 hours, more cache hits with 2678400 = 31 days.
+ *
+ * @since 1.34 Renamed from $wgSquidMaxage
  */
-$wgSquidMaxage = 18000;
+$wgCdnMaxAge = 18000;
 
 /**
  * Cache timeout for the CDN when DB replica DB lag is high
- * @see $wgSquidMaxage
+ * @see $wgCdnMaxAge
+ *
  * @since 1.27
  */
 $wgCdnMaxageLagged = 30;
@@ -2784,7 +2790,7 @@ $wgCdnReboundPurgeDelay = 0;
 
 /**
  * Cache timeout for the CDN when a response is known to be wrong or incomplete (due to load)
- * @see $wgSquidMaxage
+ * @see $wgCdnMaxAge
  * @since 1.27
  */
 $wgCdnMaxageSubstitute = 60;
@@ -2803,20 +2809,24 @@ $wgForcedRawSMaxage = 300;
  * headers sent/modified from these proxies when obtaining the remote IP address
  *
  * For a list of trusted servers which *aren't* purged, see $wgSquidServersNoPurge.
+ *
+ * @since 1.34 Renamed from $wgSquidServers.
  */
-$wgSquidServers = [];
+$wgCdnServers = [];
 
 /**
- * As above, except these servers aren't purged on page changes; use to set a
- * list of trusted proxies, etc. Supports both individual IP addresses and
- * CIDR blocks.
+ * As with $wgCdnServers, except these servers aren't purged on page changes;
+ * use to set a list of trusted proxies, etc. Supports both individual IP
+ * addresses and CIDR blocks.
+ *
  * @since 1.23 Supports CIDR ranges
+ * @since 1.34 Renamed from $wgSquidServersNoPurge
  */
-$wgSquidServersNoPurge = [];
+$wgCdnServersNoPurge = [];
 
 /**
  * Whether to use a Host header in purge requests sent to the proxy servers
- * configured in $wgSquidServers. Set this to false to support Squid
+ * configured in $wgCdnServers. Set this to false to support a CDN
  * configured in forward-proxy mode.
  *
  * If this is set to true, a Host header will be sent, and only the path
@@ -6505,7 +6515,7 @@ $wgCachePrefix = false;
 /**
  * Display the new debugging toolbar. This also enables profiling on database
  * queries and other useful output.
- * Will be ignored if $wgUseFileCache or $wgUseSquid is enabled.
+ * Will be ignored if $wgUseFileCache or $wgUseCdn is enabled.
  *
  * @since 1.19
  */
index 0a88b23..59efc98 100644 (file)
@@ -20,7 +20,6 @@
  * @file
  * @ingroup Feed
  */
-use MediaWiki\MediaWikiServices;
 
 /**
  * Helper functions for feeds
@@ -29,25 +28,6 @@ use MediaWiki\MediaWikiServices;
  */
 class FeedUtils {
 
-       /**
-        * Check whether feed's cache should be cleared; for changes feeds
-        * If the feed should be purged; $timekey and $key will be removed from cache
-        *
-        * @param string $timekey Cache key of the timestamp of the last item
-        * @param string $key Cache key of feed's content
-        */
-       public static function checkPurge( $timekey, $key ) {
-               global $wgRequest, $wgUser;
-
-               $purge = $wgRequest->getVal( 'action' ) === 'purge';
-               // Allow users with 'purge' right to clear feed caches
-               if ( $purge && $wgUser->isAllowed( 'purge' ) ) {
-                       $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
-                       $cache->delete( $timekey, 1 );
-                       $cache->delete( $key, 1 );
-               }
-       }
-
        /**
         * Check whether feeds can be used and that $type is a valid feed type
         *
index 4d684b5..3f50c97 100644 (file)
@@ -895,7 +895,7 @@ class Linker {
         */
        public static function userLink( $userId, $userName, $altUserName = false ) {
                if ( $userName === '' ) {
-                       wfLogWarning( __METHOD__ . ' received an empty username. Are there database errors ' .
+                       wfDebug( __METHOD__ . ' received an empty username. Are there database errors ' .
                                'that need to be fixed?' );
                        return wfMessage( 'empty-username' )->parse();
                }
@@ -943,7 +943,7 @@ class Linker {
                $useParentheses = true
        ) {
                if ( $userText === '' ) {
-                       wfLogWarning( __METHOD__ . ' received an empty username. Are there database errors ' .
+                       wfDebug( __METHOD__ . ' received an empty username. Are there database errors ' .
                                'that need to be fixed?' );
                        return ' ' . wfMessage( 'empty-username' )->parse();
                }
@@ -1031,7 +1031,7 @@ class Linker {
         */
        public static function userTalkLink( $userId, $userText ) {
                if ( $userText === '' ) {
-                       wfLogWarning( __METHOD__ . ' received an empty username. Are there database errors ' .
+                       wfDebug( __METHOD__ . ' received an empty username. Are there database errors ' .
                                'that need to be fixed?' );
                        return wfMessage( 'empty-username' )->parse();
                }
@@ -1053,7 +1053,7 @@ class Linker {
         */
        public static function blockLink( $userId, $userText ) {
                if ( $userText === '' ) {
-                       wfLogWarning( __METHOD__ . ' received an empty username. Are there database errors ' .
+                       wfDebug( __METHOD__ . ' received an empty username. Are there database errors ' .
                                'that need to be fixed?' );
                        return wfMessage( 'empty-username' )->parse();
                }
index 69bafaf..ca77121 100644 (file)
@@ -486,14 +486,14 @@ class MediaWiki {
                        }
 
                        # Let CDN cache things if we can purge them.
-                       if ( $this->config->get( 'UseSquid' ) &&
+                       if ( $this->config->get( 'UseCdn' ) &&
                                in_array(
                                        // Use PROTO_INTERNAL because that's what getCdnUrls() uses
                                        wfExpandUrl( $request->getRequestURL(), PROTO_INTERNAL ),
                                        $requestTitle->getCdnUrls()
                                )
                        ) {
-                               $output->setCdnMaxage( $this->config->get( 'SquidMaxage' ) );
+                               $output->setCdnMaxage( $this->config->get( 'CdnMaxAge' ) );
                        }
 
                        $action->show();
@@ -597,7 +597,7 @@ class MediaWiki {
                wfDebug( __METHOD__ . ': primary transaction round committed' );
 
                // Run updates that need to block the user or affect output (this is the last chance)
-               DeferredUpdates::doUpdates( 'enqueue', DeferredUpdates::PRESEND );
+               DeferredUpdates::doUpdates( 'run', DeferredUpdates::PRESEND );
                wfDebug( __METHOD__ . ': pre-send deferred updates completed' );
                // T214471: persist the session to avoid race conditions on subsequent requests
                $request->getSession()->save();
index edffc3b..54b3ee5 100644 (file)
@@ -746,10 +746,10 @@ class OutputPage extends ContextSource {
                        'user' => $this->getUser()->getTouched(),
                        'epoch' => $config->get( 'CacheEpoch' )
                ];
-               if ( $config->get( 'UseSquid' ) ) {
+               if ( $config->get( 'UseCdn' ) ) {
                        $modifiedTimes['sepoch'] = wfTimestamp( TS_MW, $this->getCdnCacheEpoch(
                                time(),
-                               $config->get( 'SquidMaxage' )
+                               $config->get( 'CdnMaxAge' )
                        ) );
                }
                Hooks::run( 'OutputPageCheckLastModified', [ &$modifiedTimes, $this ] );
@@ -818,7 +818,7 @@ class OutputPage extends ContextSource {
         * @return int Timestamp
         */
        private function getCdnCacheEpoch( $reqTime, $maxAge ) {
-               // Ensure Last-Modified is never more than (wgSquidMaxage) in the past,
+               // Ensure Last-Modified is never more than $wgCdnMaxAge in the past,
                // because even if the wiki page content hasn't changed since, static
                // resources may have changed (skin HTML, interface messages, urls, etc.)
                // and must roll-over in a timely manner (T46570)
@@ -2248,12 +2248,12 @@ class OutputPage extends ContextSource {
         *
         * @param string|int|float|bool|null $mtime Last-Modified timestamp
         * @param int $minTTL Minimum TTL in seconds [default: 1 minute]
-        * @param int $maxTTL Maximum TTL in seconds [default: $wgSquidMaxage]
+        * @param int $maxTTL Maximum TTL in seconds [default: $wgCdnMaxAge]
         * @since 1.28
         */
        public function adaptCdnTTL( $mtime, $minTTL = 0, $maxTTL = 0 ) {
                $minTTL = $minTTL ?: IExpiringStore::TTL_MINUTE;
-               $maxTTL = $maxTTL ?: $this->getConfig()->get( 'SquidMaxage' );
+               $maxTTL = $maxTTL ?: $this->getConfig()->get( 'CdnMaxAge' );
 
                if ( $mtime === null || $mtime === false ) {
                        return $minTTL; // entity does not exist
@@ -2567,7 +2567,7 @@ class OutputPage extends ContextSource {
 
                if ( $this->mEnableClientCache ) {
                        if (
-                               $config->get( 'UseSquid' ) &&
+                               $config->get( 'UseCdn' ) &&
                                !$response->hasCookies() &&
                                !SessionManager::getGlobalSession()->isPersistent() &&
                                !$this->isPrintable() &&
@@ -2584,7 +2584,7 @@ class OutputPage extends ContextSource {
                                        # start with a shorter timeout for initial testing
                                        # header( 'Surrogate-Control: max-age=2678400+2678400, content="ESI/1.0"');
                                        $response->header(
-                                               "Surrogate-Control: max-age={$config->get( 'SquidMaxage' )}" .
+                                               "Surrogate-Control: max-age={$config->get( 'CdnMaxAge' )}" .
                                                "+{$this->mCdnMaxage}, content=\"ESI/1.0\""
                                        );
                                        $response->header( 'Cache-Control: s-maxage=0, must-revalidate, max-age=0' );
index c9db5a8..c5764d2 100644 (file)
@@ -484,8 +484,8 @@ return [
        'ProxyLookup' => function ( MediaWikiServices $services ) : ProxyLookup {
                $mainConfig = $services->getMainConfig();
                return new ProxyLookup(
-                       $mainConfig->get( 'SquidServers' ),
-                       $mainConfig->get( 'SquidServersNoPurge' )
+                       $mainConfig->get( 'CdnServers' ),
+                       $mainConfig->get( 'CdnServersNoPurge' )
                );
        },
 
index a51cb83..f367fc2 100644 (file)
@@ -518,9 +518,61 @@ foreach ( LanguageCode::getNonstandardLanguageCodeMapping() as $code => $bcp47 )
 // To determine the user language, use $wgLang->getCode()
 $wgContLanguageCode = $wgLanguageCode;
 
+// Temporary backwards-compatibility reading of old Squid-named CDN settings as of MediaWiki 1.34,
+// to support sysadmins who fail to update their settings immediately:
+
+if ( isset( $wgUseSquid ) ) {
+       // If the sysadmin is still setting a value of $wgUseSquid to true but $wgUseCdn is the default of
+       // false, to be safe, assume they do want this still, so enable it.
+       if ( !$wgUseCdn && $wgUseSquid ) {
+               $wgUseCdn = $wgUseSquid;
+               wfDeprecated( '$wgUseSquid enabled but $wgUseCdn disabled; enabling CDN functions', '1.34' );
+       }
+} else {
+       // Backwards-compatibility for extensions that read this value.
+       $wgUseSquid = $wgUseCdn;
+}
+
+if ( isset( $wgSquidServers ) ) {
+       // If the sysadmin is still setting a value of $wgSquidServers but $wgCdnServers is the default of
+       // empty, to be safe, assume they do want these servers to be still used, so use them.
+       if ( !empty( $wgSquidServers ) && empty( $wgCdnServers ) ) {
+               $wgCdnServers = $wgSquidServers;
+               wfDeprecated( '$wgSquidServers set, $wgCdnServers empty; using them', '1.34' );
+       }
+} else {
+       // Backwards-compatibility for extensions that read this value.
+       $wgSquidServers = $wgCdnServers;
+}
+
+if ( isset( $wgSquidServersNoPurge ) ) {
+       // If the sysadmin is still setting values in $wgSquidServersNoPurge but $wgCdnServersNoPurge is
+       // the default of empty, to be safe, assume they do want these servers to be still used, so use
+       // them.
+       if ( !empty( $wgSquidServersNoPurge ) && empty( $wgCdnServersNoPurge ) ) {
+               $wgCdnServersNoPurge = $wgSquidServersNoPurge;
+               wfDeprecated( '$wgSquidServersNoPurge set, $wgCdnServersNoPurge empty; using them', '1.34' );
+       }
+} else {
+       // Backwards-compatibility for extensions that read this value.
+       $wgSquidServersNoPurge = $wgCdnServersNoPurge;
+}
+
+if ( isset( $wgSquidMaxage ) ) {
+       // If the sysadmin is still setting a value of $wgSquidMaxage and it's higher than $wgCdnMaxAge,
+       // to be safe, assume they want the higher (lower performance requirement) value, so use that.
+       if ( $wgCdnMaxAge < $wgSquidMaxage ) {
+               $wgCdnMaxAge = $wgSquidMaxage;
+               wfDeprecated( '$wgSquidMaxage set higher than $wgCdnMaxAge; using the higher value', '1.34' );
+       }
+} else {
+       // Backwards-compatibility for extensions that read this value.
+       $wgSquidMaxage = $wgCdnMaxAge;
+}
+
 // Easy to forget to falsify $wgDebugToolbar for static caches.
 // If file cache or CDN cache is on, just disable this (DWIMD).
-if ( $wgUseFileCache || $wgUseSquid ) {
+if ( $wgUseFileCache || $wgUseCdn ) {
        $wgDebugToolbar = false;
 }
 
index bc48a0e..ff5541d 100644 (file)
@@ -1582,10 +1582,10 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                ];
                $deferValues = [ false, DeferredUpdates::PRESEND, DeferredUpdates::POSTSEND ];
                if ( !in_array( $options['defer'], $deferValues, true ) ) {
-                       throw new InvalidArgumentException( 'invalid value for defer: ' . $options['defer'] );
+                       throw new InvalidArgumentException( 'Invalid value for defer: ' . $options['defer'] );
                }
-               Assert::parameterType( 'integer|null', $options['transactionTicket'],
-                       '$options[\'transactionTicket\']' );
+               Assert::parameterType(
+                       'integer|null', $options['transactionTicket'], '$options[\'transactionTicket\']' );
 
                $updates = $this->getSecondaryDataUpdates( $options['recursive'] );
 
@@ -1596,14 +1596,13 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                $causeAction = $this->options['causeAction'] ?? 'unknown';
                $causeAgent = $this->options['causeAgent'] ?? 'unknown';
                $legacyRevision = new Revision( $this->revision );
+               $ticket = $options['transactionTicket'];
 
-               if ( $options['defer'] === false && $options['transactionTicket'] !== null ) {
+               if ( $options['defer'] === false && $ticket !== null ) {
                        // For legacy hook handlers doing updates via LinksUpdateConstructed, make sure
                        // any pending writes they made get flushed before the doUpdate() calls below.
                        // This avoids snapshot-clearing errors in LinksUpdate::acquirePageLock().
-                       $this->loadbalancerFactory->commitAndWaitForReplication(
-                               __METHOD__, $options['transactionTicket']
-                       );
+                       $this->loadbalancerFactory->commitAndWaitForReplication( __METHOD__, $ticket );
                }
 
                foreach ( $updates as $update ) {
@@ -1616,8 +1615,8 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                        }
 
                        if ( $options['defer'] === false ) {
-                               if ( $update instanceof DataUpdate && $options['transactionTicket'] !== null ) {
-                                       $update->setTransactionTicket( $options['transactionTicket'] );
+                               if ( $update instanceof DataUpdate && $ticket !== null ) {
+                                       $update->setTransactionTicket( $ticket );
                                }
                                $update->doUpdate();
                        } else {
index 14f7603..505c9d5 100644 (file)
@@ -67,7 +67,7 @@ class RawAction extends FormlessAction {
 
                $contentType = $this->getContentType();
 
-               $maxage = $request->getInt( 'maxage', $config->get( 'SquidMaxage' ) );
+               $maxage = $request->getInt( 'maxage', $config->get( 'CdnMaxAge' ) );
                $smaxage = $request->getIntOrNull( 'smaxage' );
                if ( $smaxage === null ) {
                        if (
index 1a7175a..b845c57 100644 (file)
@@ -148,7 +148,7 @@ class ApiMain extends ApiBase {
        private $mContinuationManager;
        private $mAction;
        private $mEnableWrite;
-       private $mInternalMode, $mSquidMaxage;
+       private $mInternalMode, $mCdnMaxAge;
        /** @var ApiBase */
        private $mModule;
 
@@ -288,7 +288,7 @@ class ApiMain extends ApiBase {
                $this->mContinuationManager = null;
                $this->mEnableWrite = $enableWrite;
 
-               $this->mSquidMaxage = -1; // flag for executeActionWithErrorHandling()
+               $this->mCdnMaxAge = -1; // flag for executeActionWithErrorHandling()
                $this->mCommit = false;
        }
 
@@ -1368,18 +1368,20 @@ class ApiMain extends ApiBase {
                                                $ts->format( 'D M j H:i:s Y' ) === $value ||
                                                $ts->format( 'D M  j H:i:s Y' ) === $value
                                        ) {
+                                               $config = $this->getConfig();
                                                $lastMod = $module->getConditionalRequestData( 'last-modified' );
                                                if ( $lastMod !== null ) {
                                                        // Mix in some MediaWiki modification times
                                                        $modifiedTimes = [
                                                                'page' => $lastMod,
                                                                'user' => $this->getUser()->getTouched(),
-                                                               'epoch' => $this->getConfig()->get( 'CacheEpoch' ),
+                                                               'epoch' => $config->get( 'CacheEpoch' ),
                                                        ];
-                                                       if ( $this->getConfig()->get( 'UseSquid' ) ) {
+
+                                                       if ( $config->get( 'UseCdn' ) ) {
                                                                // T46570: the core page itself may not change, but resources might
                                                                $modifiedTimes['sepoch'] = wfTimestamp(
-                                                                       TS_MW, time() - $this->getConfig()->get( 'SquidMaxage' )
+                                                                       TS_MW, time() - $config->get( 'CdnMaxAge' )
                                                                );
                                                        }
                                                        Hooks::run( 'OutputPageCheckLastModified', [ &$modifiedTimes, $this->getOutput() ] );
index e60835b..ee6a264 100644 (file)
@@ -389,6 +389,10 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
 
                $this->addOption( 'LIMIT', $this->limit + 1 );
 
+               // T224017: `rev_timestamp` is never the correct index to use for this module, but
+               // MariaDB (10.1.37-39) sometimes insists on trying to use it anyway. Tell it not to.
+               $this->addOption( 'IGNORE INDEX', [ 'revision' => 'rev_timestamp' ] );
+
                $count = 0;
                $generated = [];
                $hookData = [];
index b174993..13b22b1 100644 (file)
@@ -27,7 +27,8 @@
                        "Wbxshiori",
                        "Wxyveronica",
                        "WhitePhosphorus",
-                       "科劳"
+                       "科劳",
+                       "SolidBlock"
                ]
        },
        "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|文档]]\n* [[mw:Special:MyLanguage/API:FAQ|常见问题]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 程序错误与功能请求]\n</div>\n<strong>状态信息:</strong>MediaWiki API是一个成熟稳定的,不断受到支持和改进的界面。尽管我们尽力避免,但偶尔也需要作出重大更新;请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n<strong>错误请求:</strong>当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:Special:MyLanguage/API:Errors_and_warnings|API:错误与警告]]。\n\n<p class=\"mw-apisandbox-link\"><strong>测试中:</strong>测试API请求的易用性,请参见[[Special:ApiSandbox]]。</p>",
        "apihelp-upload-param-comment": "上传注释。如果没有指定<var>$1text</var>,那么它也被用于新文件的初始页面文本。",
        "apihelp-upload-param-tags": "更改标签以应用于上传日志记录和文件页面修订中。",
        "apihelp-upload-param-text": "用于新文件的初始页面文本。",
-       "apihelp-upload-param-watch": "监视页面。",
+       "apihelp-upload-param-watch": "关注页面。",
        "apihelp-upload-param-watchlist": "无条件地将页面加入至当前用户的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-upload-param-ignorewarnings": "忽略任何警告。",
        "apihelp-upload-param-file": "文件内容。",
index 788eec3..bb84f97 100644 (file)
@@ -108,14 +108,15 @@ class LocalisationCache {
         */
        public static $allKeys = [
                'fallback', 'namespaceNames', 'bookstoreList',
-               'magicWords', 'messages', 'rtl', 'capitalizeAllNouns', 'digitTransformTable',
-               'separatorTransformTable', 'minimumGroupingDigits',
-               'fallback8bitEncoding', 'linkPrefixExtension',
-               'linkTrail', 'linkPrefixCharset', 'namespaceAliases',
-               'dateFormats', 'datePreferences', 'datePreferenceMigrationMap',
-               'defaultDateFormat', 'extraUserToggles', 'specialPageAliases',
-               'imageFiles', 'preloadedMessages', 'namespaceGenderAliases',
-               'digitGroupingPattern', 'pluralRules', 'pluralRuleTypes', 'compiledPluralRules',
+               'magicWords', 'messages', 'rtl', 'capitalizeAllNouns',
+               'digitTransformTable', 'separatorTransformTable',
+               'minimumGroupingDigits', 'fallback8bitEncoding',
+               'linkPrefixExtension', 'linkTrail', 'linkPrefixCharset',
+               'namespaceAliases', 'dateFormats', 'datePreferences',
+               'datePreferenceMigrationMap', 'defaultDateFormat',
+               'specialPageAliases', 'imageFiles', 'preloadedMessages',
+               'namespaceGenderAliases', 'digitGroupingPattern', 'pluralRules',
+               'pluralRuleTypes', 'compiledPluralRules',
        ];
 
        /**
@@ -129,7 +130,7 @@ class LocalisationCache {
        /**
         * Keys for items which are a numbered array.
         */
-       public static $mergeableListKeys = [ 'extraUserToggles' ];
+       public static $mergeableListKeys = [];
 
        /**
         * Keys for items which contain an array of arrays of equivalent aliases
index 75f51ef..6b5482c 100644 (file)
@@ -150,7 +150,7 @@ class SquidPurgeClient {
                        if ( IP::isIPv4( $this->host ) ) {
                                $this->ip = $this->host;
                        } elseif ( IP::isIPv6( $this->host ) ) {
-                               throw new MWException( '$wgSquidServers does not support IPv6' );
+                               throw new MWException( '$wgCdnServers does not support IPv6' );
                        } else {
                                Wikimedia\suppressWarnings();
                                $this->ip = gethostbyname( $this->host );
index 2d07f75..66ce9a3 100644 (file)
@@ -79,14 +79,14 @@ class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
        }
 
        /**
-        * Purges a list of CDN nodes defined in $wgSquidServers.
+        * Purges a list of CDN nodes defined in $wgCdnServers.
         * $urlArr should contain the full URLs to purge as values
         * (example: $urlArr[] = 'http://my.host/something')
         *
         * @param string[] $urlArr List of full URLs to purge
         */
        public static function purge( array $urlArr ) {
-               global $wgSquidServers, $wgHTCPRouting;
+               global $wgCdnServers, $wgHTCPRouting;
 
                if ( !$urlArr ) {
                        return;
@@ -120,20 +120,20 @@ class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
                }
 
                // Do direct server purges if enabled (this does not scale very well)
-               if ( $wgSquidServers ) {
-                       // Maximum number of parallel connections per squid
-                       $maxSocketsPerSquid = 8;
+               if ( $wgCdnServers ) {
+                       // Maximum number of parallel connections per CDN
+                       $maxSocketsPerCdn = 8;
                        // Number of requests to send per socket
                        // 400 seems to be a good tradeoff, opening a socket takes a while
                        $urlsPerSocket = 400;
-                       $socketsPerSquid = ceil( count( $urlArr ) / $urlsPerSocket );
-                       if ( $socketsPerSquid > $maxSocketsPerSquid ) {
-                               $socketsPerSquid = $maxSocketsPerSquid;
+                       $socketsPerCdn = ceil( count( $urlArr ) / $urlsPerSocket );
+                       if ( $socketsPerCdn > $maxSocketsPerCdn ) {
+                               $socketsPerCdn = $maxSocketsPerCdn;
                        }
 
                        $pool = new SquidPurgeClientPool;
-                       $chunks = array_chunk( $urlArr, ceil( count( $urlArr ) / $socketsPerSquid ) );
-                       foreach ( $wgSquidServers as $server ) {
+                       $chunks = array_chunk( $urlArr, ceil( count( $urlArr ) / $socketsPerCdn ) );
+                       foreach ( $wgCdnServers as $server ) {
                                foreach ( $chunks as $chunk ) {
                                        $client = new SquidPurgeClient( $server );
                                        foreach ( $chunk as $url ) {
index 3b7de9d..4b54378 100644 (file)
@@ -22,6 +22,7 @@
 use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\LBFactory;
+use Wikimedia\Rdbms\ILBFactory;
 use Wikimedia\Rdbms\LoadBalancer;
 
 /**
@@ -136,11 +137,11 @@ class DeferredUpdates {
                // Normally, these use the subqueue, but that isn't true for MergeableUpdate items.
                do {
                        if ( $stage === self::ALL || $stage === self::PRESEND ) {
-                               self::execute( self::$preSendUpdates, $mode, $stageEffective );
+                               self::handleUpdateQueue( self::$preSendUpdates, $mode, $stageEffective );
                        }
 
                        if ( $stage === self::ALL || $stage == self::POSTSEND ) {
-                               self::execute( self::$postSendUpdates, $mode, $stageEffective );
+                               self::handleUpdateQueue( self::$postSendUpdates, $mode, $stageEffective );
                        }
                } while ( $stage === self::ALL && self::$preSendUpdates );
        }
@@ -169,15 +170,15 @@ class DeferredUpdates {
        }
 
        /**
-        * Immediately run/queue a list of updates
+        * Immediately run or enqueue a list of updates
         *
         * @param DeferrableUpdate[] &$queue List of DeferrableUpdate objects
-        * @param string $mode Use "enqueue" to use the job queue when possible
+        * @param string $mode Either "run" or "enqueue" (to use the job queue when possible)
         * @param int $stage Class constant (PRESEND, POSTSEND) (since 1.28)
         * @throws ErrorPageError Happens on top-level calls
         * @throws Exception Happens on second-level calls
         */
-       protected static function execute( array &$queue, $mode, $stage ) {
+       protected static function handleUpdateQueue( array &$queue, $mode, $stage ) {
                $services = MediaWikiServices::getInstance();
                $stats = $services->getStatsdDataFactory();
                $lbFactory = $services->getDBLoadBalancerFactory();
@@ -216,7 +217,7 @@ class DeferredUpdates {
                                        self::$executeContext = [ 'stage' => $stage, 'subqueue' => [] ];
                                        try {
                                                /** @var DeferrableUpdate $update */
-                                               $guiError = self::runUpdate( $update, $lbFactory, $mode, $stage );
+                                               $guiError = self::handleUpdate( $update, $lbFactory, $mode, $stage );
                                                $reportableError = $reportableError ?: $guiError;
                                                // Do the subqueue updates for $update until there are none
                                                while ( self::$executeContext['subqueue'] ) {
@@ -228,7 +229,7 @@ class DeferredUpdates {
                                                                $subUpdate->setTransactionTicket( $ticket );
                                                        }
 
-                                                       $guiError = self::runUpdate( $subUpdate, $lbFactory, $mode, $stage );
+                                                       $guiError = self::handleUpdate( $subUpdate, $lbFactory, $mode, $stage );
                                                        $reportableError = $reportableError ?: $guiError;
                                                }
                                        } finally {
@@ -249,13 +250,15 @@ class DeferredUpdates {
        }
 
        /**
+        * Run or enqueue an update
+        *
         * @param DeferrableUpdate $update
         * @param LBFactory $lbFactory
         * @param string $mode
         * @param int $stage
         * @return ErrorPageError|null
         */
-       private static function runUpdate(
+       private static function handleUpdate(
                DeferrableUpdate $update, LBFactory $lbFactory, $mode, $stage
        ) {
                $guiError = null;
@@ -265,21 +268,15 @@ class DeferredUpdates {
                                $spec = $update->getAsJobSpecification();
                                $domain = $spec['domain'] ?? $spec['wiki'];
                                JobQueueGroup::singleton( $domain )->push( $spec['job'] );
-                       } elseif ( $update instanceof TransactionRoundDefiningUpdate ) {
-                               $update->doUpdate();
                        } else {
-                               // Run the bulk of the update now
-                               $fnameTrxOwner = get_class( $update ) . '::doUpdate';
-                               $lbFactory->beginMasterChanges( $fnameTrxOwner );
-                               $update->doUpdate();
-                               $lbFactory->commitMasterChanges( $fnameTrxOwner );
+                               self::attemptUpdate( $update, $lbFactory );
                        }
                } catch ( Exception $e ) {
                        // Reporting GUI exceptions does not work post-send
                        if ( $e instanceof ErrorPageError && $stage === self::PRESEND ) {
                                $guiError = $e;
                        }
-                       MWExceptionHandler::rollbackMasterChangesAndLog( $e );
+                       $lbFactory->rollbackMasterChanges( __METHOD__ );
 
                        // VW-style hack to work around T190178, so we can make sure
                        // PageMetaDataUpdater doesn't throw exceptions.
@@ -291,6 +288,32 @@ class DeferredUpdates {
                return $guiError;
        }
 
+       /**
+        * Attempt to run an update with the appropriate transaction round state it expects
+        *
+        * DeferredUpdate classes that wrap the execution of bundles of other DeferredUpdate
+        * instances can use this method to run the updates. Any such wrapper class should
+        * always use TRX_ROUND_ABSENT itself.
+        *
+        * @param DeferrableUpdate $update
+        * @param ILBFactory $lbFactory
+        * @since 1.34
+        */
+       public static function attemptUpdate( DeferrableUpdate $update, ILBFactory $lbFactory ) {
+               if (
+                       $update instanceof TransactionRoundAwareUpdate &&
+                       $update->getTransactionRoundRequirement() == $update::TRX_ROUND_ABSENT
+               ) {
+                       $update->doUpdate();
+               } else {
+                       // Run the bulk of the update now
+                       $fnameTrxOwner = get_class( $update ) . '::doUpdate';
+                       $lbFactory->beginMasterChanges( $fnameTrxOwner );
+                       $update->doUpdate();
+                       $lbFactory->commitMasterChanges( $fnameTrxOwner );
+               }
+       }
+
        /**
         * Run all deferred updates immediately if there are no DB writes active
         *
diff --git a/includes/deferred/TransactionRoundAwareUpdate.php b/includes/deferred/TransactionRoundAwareUpdate.php
new file mode 100644 (file)
index 0000000..74303f5
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * Deferrable update that specifies whether it must run outside of any explicit
+ * LBFactory transaction round or must run inside of a round owned by doUpdate().
+ *
+ * @since 1.34
+ */
+interface TransactionRoundAwareUpdate {
+       /** @var int No transaction round should be used */
+       const TRX_ROUND_ABSENT = 1;
+       /** @var int A transaction round owned by self::doUpdate should be used */
+       const TRX_ROUND_PRESENT = 2;
+
+       /**
+        * @return int One of the class TRX_ROUND_* constants
+        */
+       public function getTransactionRoundRequirement();
+}
index a32d4a0..5732ca0 100644 (file)
@@ -5,7 +5,9 @@
  *
  * @since 1.31
  */
-class TransactionRoundDefiningUpdate implements DeferrableUpdate, DeferrableCallback {
+class TransactionRoundDefiningUpdate
+       implements DeferrableUpdate, DeferrableCallback, TransactionRoundAwareUpdate
+{
        /** @var callable|null */
        private $callback;
        /** @var string */
@@ -27,4 +29,12 @@ class TransactionRoundDefiningUpdate implements DeferrableUpdate, DeferrableCall
        public function getOrigin() {
                return $this->fname;
        }
+
+       /**
+        * @return int One of the class TRX_ROUND_* constants
+        * @since 1.34
+        */
+       final public function getTransactionRoundRequirement() {
+               return self::TRX_ROUND_ABSENT;
+       }
 }
index a219452..4c798f0 100644 (file)
@@ -49,7 +49,7 @@ abstract class DatabaseInstaller {
        /**
         * @var string Set by subclasses
         */
-       protected static $notMiniumumVerisonMessage;
+       protected static $notMinimumVerisonMessage;
 
        /**
         * The database connection.
@@ -82,7 +82,7 @@ abstract class DatabaseInstaller {
        public static function meetsMinimumRequirement( $serverVersion ) {
                if ( version_compare( $serverVersion, static::$minimumVersion ) < 0 ) {
                        return Status::newFatal(
-                               static::$notMiniumumVerisonMessage, static::$minimumVersion, $serverVersion
+                               static::$notMinimumVerisonMessage, $serverVersion, static::$minimumVersion
                        );
                }
 
index 6d62c43..45d6539 100644 (file)
@@ -52,7 +52,7 @@ class MssqlInstaller extends DatabaseInstaller {
        // SQL Server 2005 RTM
        // @todo Are SQL Express version numbers different?)
        public static $minimumVersion = '9.00.1399';
-       protected static $notMiniumumVerisonMessage = 'config-mssql-old';
+       protected static $notMinimumVerisonMessage = 'config-mssql-old';
 
        // These are schema-level privs
        // Note: the web user will be created will full permissions if possible, this permission
index 74924d0..6837eb8 100644 (file)
@@ -51,7 +51,7 @@ class MysqlInstaller extends DatabaseInstaller {
        public $supportedEngines = [ 'InnoDB', 'MyISAM' ];
 
        public static $minimumVersion = '5.5.8';
-       protected static $notMiniumumVerisonMessage = 'config-mysql-old';
+       protected static $notMinimumVerisonMessage = 'config-mysql-old';
 
        public $webUserPrivs = [
                'DELETE',
index 659a1d7..644eec1 100644 (file)
@@ -47,7 +47,7 @@ class OracleInstaller extends DatabaseInstaller {
        ];
 
        public static $minimumVersion = '9.0.1'; // 9iR1
-       protected static $notMiniumumVerisonMessage = 'config-oracle-old';
+       protected static $notMinimumVerisonMessage = 'config-oracle-old';
 
        protected $connError = null;
 
index 21b6f39..a1a8061 100644 (file)
@@ -47,7 +47,7 @@ class PostgresInstaller extends DatabaseInstaller {
        ];
 
        public static $minimumVersion = '9.2';
-       protected static $notMiniumumVerisonMessage = 'config-postgres-old';
+       protected static $notMinimumVerisonMessage = 'config-postgres-old';
        public $maxRoleSearchDepth = 5;
 
        protected $pgConns = [];
index 7d2898c..37d9153 100644 (file)
@@ -34,7 +34,7 @@ use Wikimedia\Rdbms\DBConnectionError;
 class SqliteInstaller extends DatabaseInstaller {
 
        public static $minimumVersion = '3.8.0';
-       protected static $notMiniumumVerisonMessage = 'config-outdated-sqlite';
+       protected static $notMinimumVerisonMessage = 'config-outdated-sqlite';
 
        /**
         * @var DatabaseSqlite
index d2f1dbc..2f98d53 100644 (file)
@@ -103,7 +103,9 @@ abstract class Job implements RunnableJob {
 
                                return $job;
                        } else {
-                               throw new InvalidArgumentException( "Could instantiate job '$command': bad spec!" );
+                               throw new InvalidArgumentException(
+                                       "Could not instantiate job '$command': bad spec!"
+                               );
                        }
                }
 
index b1c805b..a0b6e07 100644 (file)
@@ -280,8 +280,7 @@ class RefreshLinksJob extends Job {
                        // Carry over cause so the update can do extra logging
                        'causeAction' => $this->params['causeAction'],
                        'causeAgent' => $this->params['causeAgent'],
-                       'defer' => false,
-                       'transactionTicket' => $ticket,
+                       'transactionTicket' => $ticket
                ];
                if ( !empty( $this->params['triggeringUser'] ) ) {
                        $userInfo = $this->params['triggeringUser'];
index fa454c8..88bc049 100644 (file)
@@ -30,7 +30,10 @@ use Wikimedia\WaitConditionLoop;
 use BagOStuff;
 
 /**
- * Class for ensuring a consistent ordering of events as seen by the user, despite replication.
+ * Helper class for mitigating DB replication lag in order to provide "session consistency"
+ *
+ * This helps to ensure a consistent ordering of events as seen by an client
+ *
  * Kind of like Hawking's [[Chronology Protection Agency]].
  */
 class ChronologyProtector implements LoggerAwareInterface {
@@ -82,7 +85,7 @@ class ChronologyProtector implements LoggerAwareInterface {
                if ( isset( $client['clientId'] ) ) {
                        $this->clientId = $client['clientId'];
                } else {
-                       $this->clientId = strlen( $secret )
+                       $this->clientId = ( $secret != '' )
                                ? hash_hmac( 'md5', $client['ip'] . "\n" . $client['agent'], $secret )
                                : md5( $client['ip'] . "\n" . $client['agent'] );
                }
@@ -127,44 +130,46 @@ class ChronologyProtector implements LoggerAwareInterface {
        }
 
        /**
-        * Initialise a ILoadBalancer to give it appropriate chronology protection.
+        * Apply the "session consistency" DB replication position to a new ILoadBalancer
         *
-        * If the stash has a previous master position recorded, this will try to
-        * make sure that the next query to a replica DB of that master will see changes up
+        * If the stash has a previous master position recorded, this will try to make
+        * sure that the next query to a replica DB of that master will see changes up
         * to that position by delaying execution. The delay may timeout and allow stale
         * data if no non-lagged replica DBs are available.
         *
+        * This method should only be called from LBFactory.
+        *
         * @param ILoadBalancer $lb
         * @return void
         */
-       public function initLB( ILoadBalancer $lb ) {
-               if ( !$this->enabled || $lb->getServerCount() <= 1 ) {
-                       return; // non-replicated setup or disabled
+       public function applySessionReplicationPosition( ILoadBalancer $lb ) {
+               if ( !$this->enabled ) {
+                       return; // disabled
                }
 
-               $this->initPositions();
-
                $masterName = $lb->getServerName( $lb->getWriterIndex() );
-               if (
-                       isset( $this->startupPositions[$masterName] ) &&
-                       $this->startupPositions[$masterName] instanceof DBMasterPos
-               ) {
-                       $pos = $this->startupPositions[$masterName];
-                       $this->logger->debug( __METHOD__ . ": LB for '$masterName' set to pos $pos\n" );
+               $startupPositions = $this->getStartupMasterPositions();
+
+               $pos = $startupPositions[$masterName] ?? null;
+               if ( $pos instanceof DBMasterPos ) {
+                       $this->logger->debug( __METHOD__ . ": pos for DB '$masterName' set to '$pos'\n" );
                        $lb->waitFor( $pos );
                }
        }
 
        /**
-        * Notify the ChronologyProtector that the ILoadBalancer is about to shut
-        * down. Saves replication positions.
+        * Save the "session consistency" DB replication position for an end-of-life ILoadBalancer
+        *
+        * This saves the replication position of the master DB if this request made writes to it.
+        *
+        * This method should only be called from LBFactory.
         *
         * @param ILoadBalancer $lb
         * @return void
         */
-       public function shutdownLB( ILoadBalancer $lb ) {
+       public function storeSessionReplicationPosition( ILoadBalancer $lb ) {
                if ( !$this->enabled ) {
-                       return; // not enabled
+                       return; // disabled
                } elseif ( !$lb->hasOrMadeRecentMasterChanges( INF ) ) {
                        // Only save the position if writes have been done on the connection
                        return;
@@ -209,10 +214,13 @@ class ChronologyProtector implements LoggerAwareInterface {
                }
 
                if ( $this->shutdownPositions === [] ) {
+                       $this->logger->debug( __METHOD__ . ": no master positions to save\n" );
+
                        return []; // nothing to save
                }
 
-               $this->logger->debug( __METHOD__ . ": saving master pos for " .
+               $this->logger->debug(
+                       __METHOD__ . ": saving master pos for " .
                        implode( ', ', array_keys( $this->shutdownPositions ) ) . "\n"
                );
 
@@ -282,12 +290,14 @@ class ChronologyProtector implements LoggerAwareInterface {
        /**
         * Load in previous master positions for the client
         */
-       protected function initPositions() {
+       protected function getStartupMasterPositions() {
                if ( $this->initialized ) {
-                       return;
+                       return $this->startupPositions;
                }
 
                $this->initialized = true;
+               $this->logger->debug( __METHOD__ . ": client ID is {$this->clientId} (read)\n" );
+
                if ( $this->wait ) {
                        // If there is an expectation to see master positions from a certain write
                        // index or higher, then block until it appears, or until a timeout is reached.
@@ -344,6 +354,8 @@ class ChronologyProtector implements LoggerAwareInterface {
                        $this->startupPositions = [];
                        $this->logger->debug( __METHOD__ . ": key is {$this->key} (unread)\n" );
                }
+
+               return $this->startupPositions;
        }
 
        /**
index bf10053..8608a7d 100644 (file)
@@ -511,7 +511,7 @@ abstract class LBFactory implements ILBFactory {
                        [
                                'ip' => $this->requestInfo['IPAddress'],
                                'agent' => $this->requestInfo['UserAgent'],
-                               'clientId' => $this->requestInfo['ChronologyClientId']
+                               'clientId' => $this->requestInfo['ChronologyClientId'] ?: null
                        ],
                        $this->requestInfo['ChronologyPositionIndex'],
                        $this->secret
@@ -549,7 +549,7 @@ abstract class LBFactory implements ILBFactory {
        ) {
                // Record all the master positions needed
                $this->forEachLB( function ( ILoadBalancer $lb ) use ( $cp ) {
-                       $cp->shutdownLB( $lb );
+                       $cp->storeSessionReplicationPosition( $lb );
                } );
                // Write them to the persistent stash. Try to do something useful by running $work
                // while ChronologyProtector waits for the stash write to replicate to all DCs.
@@ -603,7 +603,7 @@ abstract class LBFactory implements ILBFactory {
                        'chronologyCallback' => function ( ILoadBalancer $lb ) {
                                // Defer ChronologyProtector construction in case setRequestInfo() ends up
                                // being called later (but before the first connection attempt) (T192611)
-                               $this->getChronologyProtector()->initLB( $lb );
+                               $this->getChronologyProtector()->applySessionReplicationPosition( $lb );
                        },
                        'roundStage' => $initStage
                ];
index b18088f..1ba6d99 100644 (file)
@@ -496,18 +496,6 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        }
                }
 
-               // Stuff from Language::getExtraUserToggles()
-               // FIXME is this dead code? $extraUserToggles doesn't seem to be defined for any language
-               $toggles = $this->contLang->getExtraUserToggles();
-
-               foreach ( $toggles as $toggle ) {
-                       $defaultPreferences[$toggle] = [
-                               'type' => 'toggle',
-                               'section' => 'personal/i18n',
-                               'label-message' => "tog-$toggle",
-                       ];
-               }
-
                // show a preview of the old signature first
                $oldsigWikiText = MediaWikiServices::getInstance()->getParser()->preSaveTransform(
                        '~~~',
index ca311d9..66a4edf 100644 (file)
@@ -504,7 +504,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                                        'md_skin' => $vary,
                                        'md_deps' => $deps,
                                ],
-                               [ 'md_module', 'md_skin' ],
+                               [ [ 'md_module', 'md_skin' ] ],
                                [
                                        'md_deps' => $deps,
                                ],
index 4e541c9..8c6ad2d 100644 (file)
@@ -45,7 +45,7 @@ class SpecialBlockList extends SpecialPage {
                $this->outputHeader();
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'ipblocklist' ) );
-               $out->addModuleStyles( [ 'mediawiki.special', 'mediawiki.special.blocklist' ] );
+               $out->addModuleStyles( [ 'mediawiki.special' ] );
 
                $request = $this->getRequest();
                $par = $request->getVal( 'ip', $par );
index ed83aaf..49f26ad 100644 (file)
@@ -314,14 +314,14 @@ class SpecialSearch extends SpecialPage {
                        return;
                }
 
-               $search = $this->getSearchEngine();
-               $search->setFeatureData( 'rewrite', $this->runSuggestion );
-               $search->setLimitOffset( $this->limit, $this->offset );
-               $search->setNamespaces( $this->namespaces );
-               $search->setSort( $this->sort );
-               $search->prefix = $this->mPrefix;
-
-               Hooks::run( 'SpecialSearchSetupEngine', [ $this, $this->profile, $search ] );
+               $engine = $this->getSearchEngine();
+               $engine->setFeatureData( 'rewrite', $this->runSuggestion );
+               $engine->setLimitOffset( $this->limit, $this->offset );
+               $engine->setNamespaces( $this->namespaces );
+               $engine->setSort( $this->sort );
+               $engine->prefix = $this->mPrefix;
+
+               Hooks::run( 'SpecialSearchSetupEngine', [ $this, $this->profile, $engine ] );
                if ( !Hooks::run( 'SpecialSearchResultsPrepend', [ $this, $out, $term ] ) ) {
                        # Hook requested termination
                        return;
@@ -329,17 +329,17 @@ class SpecialSearch extends SpecialPage {
 
                $title = Title::newFromText( $term );
                $showSuggestion = $title === null || !$title->isKnown();
-               $search->setShowSuggestion( $showSuggestion );
+               $engine->setShowSuggestion( $showSuggestion );
 
-               $rewritten = $search->replacePrefixes( $term );
+               $rewritten = $engine->replacePrefixes( $term );
                if ( $rewritten !== $term ) {
                        wfDeprecated( 'SearchEngine::replacePrefixes() (overridden by ' .
-                                                 get_class( $search ) . ')', '1.32' );
+                                                 get_class( $engine ) . ')', '1.32' );
                }
 
                // fetch search results
-               $titleMatches = $search->searchTitle( $rewritten );
-               $textMatches = $search->searchText( $rewritten );
+               $titleMatches = $engine->searchTitle( $rewritten );
+               $textMatches = $engine->searchText( $rewritten );
 
                $textStatus = null;
                if ( $textMatches instanceof Status ) {
@@ -357,7 +357,7 @@ class SpecialSearch extends SpecialPage {
                        $textMatchesNum = $textMatches->numRows();
                        $numTextMatches = $textMatches->getTotalHits();
                        if ( $textMatchesNum > 0 ) {
-                               $search->augmentSearchResults( $textMatches );
+                               $engine->augmentSearchResults( $textMatches );
                        }
                }
                $num = $titleMatchesNum + $textMatchesNum;
@@ -418,14 +418,14 @@ class SpecialSearch extends SpecialPage {
                $mainResultWidget = new FullSearchResultWidget( $this, $linkRenderer );
 
                // Default (null) on. Can be explicitly disabled.
-               if ( $search->getFeatureData( 'enable-new-crossproject-page' ) !== false ) {
+               if ( $engine->getFeatureData( 'enable-new-crossproject-page' ) !== false ) {
                        $sidebarResultWidget = new InterwikiSearchResultWidget( $this, $linkRenderer );
                        $sidebarResultsWidget = new InterwikiSearchResultSetWidget(
                                $this,
                                $sidebarResultWidget,
                                $linkRenderer,
                                MediaWikiServices::getInstance()->getInterwikiLookup(),
-                               $search->getFeatureData( 'show-multimedia-search-results' )
+                               $engine->getFeatureData( 'show-multimedia-search-results' )
                        );
                } else {
                        $sidebarResultWidget = new SimpleSearchResultWidget( $this, $linkRenderer );
index 8120417..6facda1 100644 (file)
@@ -188,8 +188,8 @@ class AllMessagesTablePager extends TablePager {
                                ( $asc && ( $key < $offset || !$offset ) || !$asc && $key > $offset ) &&
                                ( ( $this->prefix && preg_match( $this->prefix, $key ) ) || $this->prefix === false )
                        ) {
-                               $actual = wfMessage( $key )->inLanguage( $this->lang )->plain();
-                               $default = wfMessage( $key )->inLanguage( $this->lang )->useDatabase( false )->plain();
+                               $actual = $this->msg( $key )->inLanguage( $this->lang )->plain();
+                               $default = $this->msg( $key )->inLanguage( $this->lang )->useDatabase( false )->plain();
                                $result->result[] = [
                                        'am_title' => $key,
                                        'am_actual' => $actual,
index 2262fa7..6c8b19e 100644 (file)
@@ -814,7 +814,8 @@ class Language {
         * @return array
         */
        public function getExtraUserToggles() {
-               return (array)self::$dataCache->getItem( $this->mCode, 'extraUserToggles' );
+               wfDeprecated( __METHOD__, '1.34' );
+               return [];
        }
 
        /**
index 70e707b..5411616 100644 (file)
        "perfcached": "البيانات التالية مختزنة وقد لا تكون محدثة. {{PLURAL:$1||نتيجة واحدة|نتيجتان|$1 نتائج|$1 نتيجة}} على الأكثر {{PLURAL:$1||مختزنة|مختزنتان|مختزنة}}.",
        "perfcachedts": "البيانات التالية مختزنة وكان آخر تحديث لها في $1. {{PLURAL:$4||نتيجة واحدة|نتيجتان|$4 نتائج|$4 نتيجة}} على الأكثر {{PLURAL:$4||مختزنة|مختزنتان|مختزنة}}.",
        "querypage-no-updates": "التحديثات لهذه الصفحة معطلة حاليا.\nالبيانات هنا لن يتم تحديثها حاليا.",
-       "viewsource": "اعرض Ø§Ù\84Ù\85صدر",
+       "viewsource": "عرض المصدر",
        "viewsource-title": "إظهار مصدر $1",
        "actionthrottled": "لا يمكن عمل المزيد من هذا الفعل",
        "actionthrottledtext": "كإجراء ضد السبام، أنت ممنوع من إجراء هذا الفعل عدد كبير من المرات في فترة زمنية قصيرة، ولقد تجاوزت هذا الحد.\nمن فضلك حاول مرة ثانية خلال عدة دقائق.",
index 9739c49..50ec4d8 100644 (file)
        "youhavenewmessagesmulti": "لديك رسائل جديدة في $1",
        "editsection": "عدل",
        "editold": "عدل",
-       "viewsourceold": "اعرض Ø§Ù\84Ù\85صدر",
+       "viewsourceold": "عرض المصدر",
        "editlink": "عدل",
-       "viewsourcelink": "اعرض Ø§Ù\84Ù\85صدر",
+       "viewsourcelink": "عرض المصدر",
        "editsectionhint": "عدل القسم: $1",
        "toc": "محتويات",
        "showtoc": "أظهر",
        "perfcached": "البيانات التالية مخبأة و قد لا تكون محدثة. {{PLURAL:$1||نتيجة واحدة|نتيجتان|$1 نتائج|$1 نتيجة}} على الأكثر {{PLURAL:$1||مخبّأة|مخبّأتان|مخبّأة}}.",
        "perfcachedts": "البيانات التالية مخزنة، وكان آخر تحديث لها في $1. العدد الأقصى للنتائج المخزنة هو {{PLURAL:$4||نتيجة واحدة|نتيجتان|$4 نتائج|$4 نتيجة}}.",
        "querypage-no-updates": "تحديثات هذه الصفحة معطلة حاليا.\nالبيانات هنا لن يتم تحديثها حاليا.",
-       "viewsource": "اعرض Ø§Ù\84Ù\85صدر",
+       "viewsource": "عرض المصدر",
        "viewsource-title": "عرض مصدر $1",
        "actionthrottled": "تم كبح الفعل",
        "actionthrottledtext": "احترازًا من الإساء، يُحظر إجراء هذا الفعل مرات كثيرة في فترةٍ زمنية قصيرة، ولقد تجاوزت هذا الحد.\nمن فضلك حاول مجددًا بعد عدة دقائق.",
        "rcfilters-liveupdates-button-title-on": "إيقاف التحديثات الحية",
        "rcfilters-liveupdates-button-title-off": "عرض التغييرات الجديدة فور حدوثها",
        "rcfilters-watchlist-markseen-button": "اعتبر كل التغييرات منظورة",
-       "rcfilters-watchlist-edit-watchlist-button": "تعدÙ\8aل قائمة الصفحات المراقبة",
+       "rcfilters-watchlist-edit-watchlist-button": "عدل قائمة الصفحات المراقبة",
        "rcfilters-watchlist-showupdated": "التغييرات للصفحات التي لم تزرها منذ حدوث التغييرات تكون <strong>بالخط العريض</strong>، مع علامات صلبة.",
        "rcfilters-preference-label": "استخدم واجهة غير جافا سكريبت",
        "rcfilters-preference-help": "يحمل أحدث التغييرات دون وظيفة مرشحات البحث أو تسليط الضوء.",
        "mw-widgets-abandonedit-discard": "تجاهل التعديلات",
        "mw-widgets-abandonedit-keep": "مواصلة التعديل",
        "mw-widgets-abandonedit-title": "هل أنت متأكد؟",
+       "mw-widgets-copytextlayout-copy": "نسخ",
+       "mw-widgets-copytextlayout-copy-fail": "فشل النسخ إلى الحافظة.",
+       "mw-widgets-copytextlayout-copy-success": "نسخ إلى الحافظة.",
        "mw-widgets-dateinput-no-date": "لا تاريخ تم اختياره",
        "mw-widgets-mediasearch-input-placeholder": "البحث عن ملفات",
        "mw-widgets-mediasearch-noresults": "لم يتم العثور على نتائج.",
index 24cc9d5..d44793f 100644 (file)
@@ -95,7 +95,7 @@
        "february": "ফেব্ৰুৱাৰী",
        "march": "মাৰ্চ",
        "april": "এপ্ৰিল",
-       "may_long": "মে'",
+       "may_long": "May",
        "june": "জুন",
        "july": "জুলাই",
        "august": "আগষ্ট",
        "february-gen": "ফেব্ৰুৱাৰী",
        "march-gen": "মাৰ্চ",
        "april-gen": "এপ্ৰিল",
-       "may-gen": "মে’",
+       "may-gen": "May",
        "june-gen": "জুন",
        "july-gen": "জুলাই",
        "august-gen": "আগষ্ট",
        "feb": "ফেব্ৰুৱাৰী:",
        "mar": "মাৰ্চ",
        "apr": "এপ্ৰিল",
-       "may": "মে'",
+       "may": "May",
        "jun": "জুন",
        "jul": "জুলাই",
        "aug": "আগষ্ট",
        "february-date": "ফেব্ৰুৱাৰী $1",
        "march-date": "মাৰ্চ $1",
        "april-date": "এপ্ৰিল $1",
-       "may-date": "মে' $1",
+       "may-date": "May $1",
        "june-date": "জুন $1",
        "july-date": "জুলাই $1",
        "august-date": "আগষ্ট $1",
        "recentchanges-legend-plusminus": "(''±১২৩'')",
        "rcfilters-legend-heading": "<strong>সংক্ষিপ্ত ৰূপৰ তালিকা:</strong>",
        "rcfilters-other-review-tools": "আন পুনৰীক্ষণ সঁজুলি",
+       "rcfilters-activefilters": "সক্ৰিয় পৰিস্ৰাৱক",
+       "rcfilters-activefilters-hide": "লুকুৱাওক",
        "rcfilters-quickfilters": "সঞ্চিত পৰিস্ৰাৱক",
        "rcfilters-quickfilters-placeholder-title": "এতিয়ালৈকে কোনো ছেকনী সাঁচি থোৱা নাই",
        "rcfilters-quickfilters-placeholder-description": "আপোনাৰ ছেকনীৰ ছেটিংছ সাঁচি থ'বলৈ আৰু পাছত সেয়া ব্যৱহাৰ কৰিবলৈ তলত থকা সক্ৰিয় পৰিস্ৰাৱক ক্ষেত্ৰৰ বুক্‌মাৰ্ক চিহ্নটো ক্লিক কৰক।",
        "api-error-unknownerror": "অজ্ঞাত ত্ৰুটি: \"$1\"।",
        "duration-seconds": "$1 {{PLURAL:$1|ছেকেণ্ড|ছেকেণ্ড}}",
        "duration-minutes": "$1 {{PLURAL:$1|মিনিট|মিনিট}}",
-       "duration-hours": "$1 {{PLURAL:$1|à¦\98নà§\8dà¦\9fা|à¦\98ন্টা}}",
+       "duration-hours": "$1 {{PLURAL:$1|à¦\98ণà§\8dà¦\9fা|à¦\98ণ্টা}}",
        "duration-days": "$1 {{PLURAL:$1|দিন|দিন}}",
        "duration-weeks": "{{PLURAL:$1|সপ্তাহ|সপ্তাহ}}",
        "duration-years": "$1 {{PLURAL:$1|বছৰ|বছৰ}}",
index 2bd0bca..e6122fc 100644 (file)
        "accmailtitle": "Parol göndərildi.",
        "accmailtext": "[[User talk:$1|$1]] üçün təsadüfi yolla yaradılmış parol $2 ünvanına göndərildi.\nHesabınıza daxil olduqdan sonra, parolunuzu ''[[Special:ChangePassword|parolu dəyiş]]'' səhifəsində dəyişdirə bilərsiniz.",
        "newarticle": "(Yeni)",
-       "newarticletext": "Mövcud olmayan səhifəyə olan keçidi izlədiniz. Aşağıdakı sahəyə məzmununu yazaraq bu səhifəni '''siz''' yarada bilərsiniz. (əlavə məlumat üçün [$1 kömək səhifəsinə] baxın). Əgər bu səhifəyə səhvən gəlmisinizsə sadəcə olaraq brauzerin '''geri''' düyməsinə vurun.",
+       "newarticletext": "Siz mövcud olmayan səhifənin keçidini klikləmisiniz. \nSəhifəni yaratmaq üçün aşağıdakı sahəyə mətn pəncərəsini istifadə edin (ətraflı [$1 kömək səhifəsinə] baxın).\nƏgər bu səhifəyə səhvən gəlmisinizsə, o halda brauzerin '''geri''' düyməsinə basın.",
        "anontalkpagetext": "----\n<em>Bu səhifə qeydiyyatdan keçməmiş və ya daxil olmamış anonim istifadəçiyə aid müzakirə səhifəsidir.</em>\nOna görə bu istifadəçini rəqəmlərdən ibarət IP ünvanı ilə müəyyən etmək məcburiyyətindəyik.\nBelə IP ünvan bir neçə fərd tərəfindən istifadədə ola bilər.\nƏgər siz anonim istifadəçisinizsə və bu mesajın sizə aid olmadığını düşünürsünüzsə, onda [[Special:CreateAccount|qeydiyyatdan keçin]] və ya [[Special:UserLogin|daxil olun]] ki, digər anonim istifadəçilərlə qarışıqlıq yaşamayasınız.",
        "noarticletext": "Hal-hazırda bu səhifə boşdur. Başqa səhifələrdə eyni adda səhifəni [[Special:Search/{{PAGENAME}}|axtara]], əlaqəli qeydlərə\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} baxa] və ya [{{fullurl:{{FULLPAGENAME}}|action=edit}} bu adda səhifəni yarada]</span> bilərsiniz.",
        "noarticletext-nopermission": "Hal-hazırda bu səhifə boşdur. Başqa səhifələrdə eyni adlı səhifəni [[Special:Search/{{PAGENAME}}| axtara]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} əlaqəli qeydlərə baxa] və ya səhifəni [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə edə bilərsiniz]</span>, lakin sizin bu məqaləni yaratmaq hüququnuz yoxdur.",
        "searchrelated": "əlaqəli",
        "searchall": "bütün",
        "showingresults": "Aşağıda #'''$2''' ilə başlayan {{PLURAL:$1|'''$1'''-ə qədər}} nəticə göstərilib.",
+       "search-showingresults": "{{PLURAL:$4|<strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 – $2</strong> of <strong>$3</strong>}}",
        "search-nonefound": "Sorğunuza uyğun nəticə tapılmadı.",
        "powersearch-legend": "Təkmil axtarış",
        "powersearch-ns": "Ad aralığında axtar:",
        "invert": "Seçilən xaricindəkiləri",
        "tooltip-invert": "Seçilmiş ad fəzasında (və ya göstərilmiş uyğunluqlarda olan adlar) olan səhifələrdəki dəyişiklikləri gizlətmək üçün bura işarə edin",
        "namespace_association": "Əlaqəli ad sahəsi",
+       "tooltip-namespace_association": "Seçilən ad sahəsi ilə əlaqəli müzakirə və ya mövzu adını da daxil etmək üçün bu qutuyu yoxlayın",
        "blanknamespace": "(Ana)",
        "contributions": "{{GENDER:$1|İstifadəçinin}} fəaliyyəti",
        "contributions-title": "$1 istifadəçi fəaliyyətləri",
        "tooltip-pt-mycontris": "{{GENDER:|Sizin}} töhfələrinizin siyahısı",
        "tooltip-pt-login": "Daxil olmanız tövsiyə olunur, amma bu məcburi tələb deyil.",
        "tooltip-pt-logout": "Sistemdən çıx",
+       "tooltip-pt-createaccount": "Hesab yaratmaq və daxil olmaq üçün təşviq olunursunuz; Ancaq məcburi deyil",
        "tooltip-ca-talk": "Məqalə haqqındə müzakirə edib, münasibətivi bildir",
        "tooltip-ca-edit": "Bu səhifəni redaktə et",
        "tooltip-ca-addsection": "Yeni bölmə yarat",
        "tags": "Mümkün dəyişiklik etiketləri",
        "tag-filter": "[[Special:Tags|Etiket]] süzgəci:",
        "tag-filter-submit": "Filtrlər",
+       "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Teq|Teqlər}}]]: $2",
        "tag-mw-contentmodelchange": "məzmunun maketinin dəyişilməsi",
        "tags-title": "Etiketlər",
        "tags-tag": "Etiket adı",
index a8cf5bd..031f284 100644 (file)
        "december-date": "Desember $1",
        "period-am": "AM",
        "period-pm": "PM",
-       "pagecategories": "{{PLURAL:$1|golongan}}",
+       "pagecategories": "{{PLURAL:$1|Kategori}}",
        "category_header": "lembar ring golongan \"$1\"",
        "subcategories": "sub golongan",
        "category-media-header": "lembar ring golongan \"$1\"",
        "noindex-category": "Lembar sane nenten maindeks",
        "broken-file-category": "Suratan sane ngelah pranala usak",
        "about": "Indik",
+       "article": "Kaca daging",
        "newwindow": "(bukak ring jendela anyar)",
        "cancel": "Buwung",
+       "moredotdotdot": "Lianan...",
        "mypage": "Kaca",
-       "mytalk": "Babaosan",
+       "mytalk": "Pabligbagan",
        "anontalk": "Wicara",
-       "navigation": "Pengarah",
+       "navigation": "Navigasi",
        "and": "&#32;miwah",
        "faq": "FAQ (pitaken sane jagi katakonang)",
        "actions": "Parilaksana",
-       "namespaces": "Genah pesengan",
-       "variants": "kawentenan sane lianan",
+       "namespaces": "Genah peséngan",
+       "variants": "Varian",
        "navigation-heading": "Menu navigasi",
        "errorpagetitle": "kaluputan",
        "returnto": "mabalik ring $1",
-       "tagline": "Saka {{SITENAME}}",
-       "help": "Tulung",
+       "tagline": "Saking {{SITENAME}}",
+       "help": "Wantuan",
        "help-mediawiki": "Pitulung MediaWiki",
        "search": "Rereh",
        "searchbutton": "Rereh",
-       "searcharticle": "lanturang",
+       "searcharticle": "Rereh",
        "history": "sejarah pupulan",
        "history_short": "kawentenan sane lawas",
        "history_small": "babad",
-       "printableversion": "kawentenan lian sane macetak",
+       "printableversion": "Vérsi citak",
        "permalink": "Pranala ajeg",
-       "view": "cingakin",
-       "view-foreign": "Edengang ring $1",
-       "edit": "Becikang",
-       "create": "Ngae",
+       "print": "Citak",
+       "view": "Cingak",
+       "view-foreign": "Cingak ring $1",
+       "edit": "Uah",
+       "create": "Karyanin",
        "delete": "Apus",
        "protect": "Nyaga",
        "protect_change": "gentos",
        "newpage": "Lembar Anyar",
-       "talkpagelinktext": "babaosan",
+       "talkpagelinktext": "pabligbagan",
        "specialpage": "Lembar sane kautamayang",
-       "personaltools": "pekakas pribadi",
-       "talk": "Rembug",
-       "views": "Pekantenan",
+       "personaltools": "Pekakas praragan",
+       "talk": "Pabligbagan",
+       "views": "Pakantenan",
        "toolbox": "Pekakas",
+       "imagepage": "Cingak kaca berkas",
+       "templatepage": "Cingak kaca citakan",
        "viewhelppage": "cingak lembar pamitutlung",
+       "categorypage": "Cingak kaca kategori",
        "otherlanguages": "Basa tiosan",
        "redirectedfrom": "(kaalihang saking $1)",
-       "lastmodifiedat": "lembar puniki kaping untat kaubah rikala  $2, $1",
-       "jumpto": "lanturang ke:",
-       "jumptonavigation": "pengarah",
-       "jumptosearch": "Rereh",
+       "lastmodifiedat": "Kaca puniki kaping untat kaubah rikala  $2, $1",
+       "jumpto": "Lanturang ka:",
+       "jumptonavigation": "navigasi",
+       "jumptosearch": "rereh",
        "aboutsite": "Indik {{SITENAME}}",
-       "aboutpage": "Project:indik",
+       "aboutpage": "Project:Indik",
        "copyrightpage": "{{ns:project}}:hak cipta",
        "currentevents": "kawentenane mangkin",
        "currentevents-url": "Project:kawentenane mangkin",
        "disclaimers": "Tulak",
-       "disclaimerpage": "Project:Pengelidan lumrah",
-       "edithelp": "pamitulung panguwahan",
+       "disclaimerpage": "Project:Tulak lumrah",
+       "edithelp": "Wantuan indik nguwah",
        "helppage-top-gethelp": "Tulung",
-       "mainpage": "Laman Utama",
-       "mainpage-description": "Lembar Utama",
-       "portal": "Pintu nuju sekha",
-       "portal-url": "Project:pamedal sekha",
-       "privacy": "Awig-awig genah praragan",
-       "privacypage": "Project:kawicaksanan tanpaiket",
+       "mainpage": "Kaca Utama",
+       "mainpage-description": "Kaca utama",
+       "portal": "Kori sekaa",
+       "portal-url": "Project:Kori sekaa",
+       "privacy": "Awig-awig indik data praragan",
+       "privacypage": "Project:Awig-awig indik data praragan",
        "ok": "OK",
-       "retrievedfrom": "kapolihang saking \"$1\"",
+       "retrievedfrom": "Kapolihang saking \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|ida dane maduwe}} $1 ($2)",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|You have}} $1 ring {{PLURAL:$3|another user|$3 users}} ($2).",
        "youhavenewmessagesmanyusers": "Ida dane ngelah $1 saking liyane ($2).",
-       "editsection": "obah",
-       "editold": "mecikang",
-       "viewsourceold": "cingak witnyane",
-       "editlink": "mecikang",
-       "viewsourcelink": "cingak witnyane",
-       "editsectionhint": "Obah papalihan: $1",
-       "toc": "kepahan dagingnyane",
+       "editsection": "uah",
+       "editold": "uah",
+       "viewsourceold": "cingak wit",
+       "editlink": "uah",
+       "viewsourcelink": "cingak wit",
+       "editsectionhint": "Uah pahan: $1",
+       "toc": "Daging",
        "showtoc": "edengang",
        "hidetoc": "engkebang",
        "collapsible-expand": "buka",
        "confirmable-no": "Nénten",
        "site-atom-feed": "$1 \"atom feed\"",
        "page-atom-feed": "$1 \"atom feed\"",
-       "red-link-title": "$1 (laman ten wénten)",
+       "red-link-title": "$1 (kaca nénten wénten)",
        "nstab-main": "Kaca",
        "nstab-user": "sane nganggo",
        "nstab-special": "lembar sane kautamayang",
        "nstab-template": "templat",
        "nstab-help": "lembar pamitutlung",
        "nstab-category": "golongan",
-       "mainpage-nstab": "Laman utama",
+       "mainpage-nstab": "Kaca utama",
        "nosuchspecialpage": "Ten wenten lembar spesial",
        "error": "kaluputan",
        "databaseerror": "Database kaluputan",
        "missingarticle-rev": "(pabenahan#:$1)",
        "badtitle": "murda sane nenten manut",
        "badtitletext": "Judul halaman sane katagih nenten patut, kosong, atau judul antarbahasa atau antarwiki yang salah sambung.\n\nmurda lembar sane kaarsa nenten sida kaedengang, kosong, utawi murda murda antarbasa utawi antarwiki sane iwang",
-       "viewsource": "cingak witnyane",
-       "viewsourcetext": "Ida dane dados ningalin lan kopi sumber saking suratan puniki",
+       "viewsource": "Cingak wit",
+       "viewsource-title": "Cingak wit saking $1",
+       "viewsourcetext": "Ida dane dados nyingakin miwah nurun wit kaca puniki.",
        "yourname": "pesengan penganggen",
        "userlogin-yourname": "Penganggen",
        "userlogin-yourname-ph": "Isi Kruna sandi ida dane",
        "notloggedin": "Konden masuk log",
        "userlogin-noaccount": "Durung madue akun?",
        "userlogin-joinproject": "Indik {{SITENAME}}",
-       "createaccount": "ngajuang akun anyar",
+       "createaccount": "Karyanin akun",
+       "userlogin-helplink2": "Wantuan indik ngranjing log",
+       "createacct-submit": "Karyanin akun ida dané",
+       "createacct-benefit-body1": "{{PLURAL:$1|uahan}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|kaca}}",
        "mailmypassword": "nyumu ngaryanin kruna sandi",
        "loginlanguagelabel": "Basa: $1",
        "pt-login": "Ngranjing log",
        "pt-login-button": "Ngranjing log",
-       "pt-createaccount": "Ngajuang akun anyar",
-       "pt-userlogout": "Medal Log",
+       "pt-createaccount": "Karyanin akun",
+       "pt-userlogout": "Medal log",
        "botpasswords-label-create": "Ngae",
        "botpasswords-label-cancel": "Buungan",
        "botpasswords-label-delete": "Apus",
        "sig_tip": "tanda tangan ida dane sareng tanda waktu",
        "hr_tip": "garis horizontal",
        "summary": "pamicutet",
-       "minoredit": "niki panguwahan kidik",
+       "minoredit": "Puniki uahan alit",
        "watchthis": "tinjo lembar puniki",
        "savearticle": "simpen lembar",
+       "publishpage": "Terbitang kaca",
+       "publishpage-start": "Terbitang kaca…",
        "preview": "tayangan sadurungnyane",
        "showpreview": "cingak sane lintang",
-       "showdiff": "Cingak pagentosan",
+       "showdiff": "Cingak uahan",
        "anoneditwarning": "<strong>Pingetan:</strong> Ida dané nénten kacatet ngranjing. Alamat IP ida dané jagi kacatet ring sejarah (indik sané dumunan) ring lembar puniki. Yening ida dane <strong>[$1 log in]</strong> utawi <strong>[$2 create an account]</strong>, your edits will be attributed to your username, along with other benefits.",
-       "loginreqlink": "Ngranjing log",
+       "loginreqlink": "ngranjing log",
        "newarticle": "(Anyar)",
        "newarticletext": "ida dane ngiring pranala nuju lembar sane durung wenten. yening jagi ngaryanang lembar punika, ketik daging lembar ring kotak sane wenten ring beten puniki. (cingak [$1 lembar wantuan] anggen wacana salanturnyane). yening ida dane nenten nyelapang neked ring lembar puniki, klik tombol \"back\" ring \"penjelajah web\" ida dane.",
        "noarticletext": "mangkin nenten wenten teks ring lembar puniki. ida dane prasida [[Special:Search/{{PAGENAME}}|ngrereh murda nganggen lembar puniki]] ring lembar-lembar sane lianan, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ngrereh log sane mapaiketan], utawi [{{fullurl:{{FULLPAGENAME}}|action=edit}} nguwah lembar puniki]</span>.",
        "noarticletext-nopermission": "mangkin nenten wenten teks ring lembar puniki. ida dane prasida [[Special:Search/{{PAGENAME}}|ngarereh murda anggen lembar puniki]] ring lembar-lembar sane lianan, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ngarereh log sane mapaiketan], utawi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ngubah lembar puniki]</span>.",
        "previewnote": "\"elingang yening puniki wantah sane lintang.\" Panguwahan ida dane durung kasimpen!",
-       "editing": "panguwahan $1",
+       "editing": "Nguwahin $1",
+       "creating": "Makarya $1",
        "editingsection": "nguwah $1 (bagian)",
        "templatesused": "{{PLURAL:$1|Templat}} sane kaanggen ring lembar niki:",
        "template-protected": "nyayubang",
        "permissionserrorstext-withaction": "ida dané nénten madué kuasa ngranjing anggén $2, riantukan {{PLURAL:$1|alasan}} ring sor puniki:",
        "recreate-moveddeleted-warn": "\"pingetan\" ida dane ngawe malih lembar sane naenin maapus.'''\n\nmangda kayunin malih napike pantes lanturang suntingan ida dane. puniki log pengapusan lan pangisidan saking lembar puniki:",
        "moveddeleted-notice": "Lembar puniki sampun kaapus.\nAnggen pewarah, proteksi, lan pengisidan log saking lembar puniki cingakin pustaka beten.",
+       "postedit-confirmation-created": "Kacanyané sampun kakaryanin.",
        "content-model-wikitext": "tulisan wiki",
        "post-expand-template-inclusion-warning": "pinget: ukuran templat sane keanggen kalangkung ageng. wenten templat sane kacampahang",
        "post-expand-template-inclusion-category": "lembar sane maukuran templat sane nglangkungin wates",
        "post-expand-template-argument-warning": "\"peminget\" lembar puniki madaging kiranglangkungnyane siki argumen templat anggen ukuran ekspansi sane kaliwat ageng. argumen-argumen punika sampun kacampahang.",
        "post-expand-template-argument-category": "lembar sane medaging argumen templat sane kacampahang",
-       "viewpagelogs": "cingak log ring lembar puniki",
+       "viewpagelogs": "Cingak log saking kaca puniki",
        "currentrev-asof": "pabecikan sane anyar ring pinanggal$1",
        "revisionasof": "ngabecikang per $1",
        "revision-info": "Panguwahan per $1 olih {{GENDER:$6|$2}}$7",
        "previousrevision": "← pabenahan sane dumun",
-       "nextrevision": "panguwahan salanturnyane→",
-       "currentrevisionlink": "panguwahan mangkin",
+       "nextrevision": "Uahan salanturnyané →",
+       "currentrevisionlink": "Uahan sané mangkin",
        "cur": "mangkin",
        "last": "sadurung",
        "histlegend": "pilih kalih tombol radio lantur pecik tombol \"bandingang\" anggen ngebandingang indik lianan. klik siki tanggal anggen nyingak indik lianan lembar ring pinanggal punika.<br />(skr)= binanne saking indik lianan sane mangkin, (untat) = binanne saking indik lianan sane dumunan, '''k''' = panguwahan alit, '''b''' = panguwahan bot, → = panguwahan kepahan, ← = reringkesan otomatis",
        "history-feed-item-nocomment": "$1 ring $2",
        "rev-delundel": "gentos pangatonan",
        "revdel-restore": "gentos pangatonan",
+       "pagehist": "Babad kaca",
+       "mergehistory-from": "Kaca wit:",
        "revertmerge": "tansida nyarengin",
        "history-title": "sajer panguwahan saking $1",
-       "lineno": "baris$1",
+       "lineno": "Carik $1:",
        "compareselectedversions": "bandingang penguwahan sane kapilih",
        "editundo": "nguliang",
        "searchresults": "asil pangrereh",
        "searchresults-title": "asil pangrereh anggen \"$1\"",
        "prevn": "{{PLURAL:$1|$1}} sadurungne",
        "nextn": "{{PLURAL:$1|$1}} selanturnyane",
+       "prev-page": "kaca sadurungnyané",
        "prevn-title": "$1 {{PLURAL:$1|asil}} sadurunge",
        "nextn-title": "$1 {{PLURAL:$1|asil}} selanturnyane",
        "shown-title": "ngantenang $1{{PLURAL:$1|asil}} sabilang lembar",
-       "viewprevnext": "cingak ($1 {{int:pipe-separator}}$2)($3)",
+       "viewprevnext": "Cingak ($1 {{int:pipe-separator}}$2)($3)",
        "searchmenu-exists": "wenten lembar sane mamurda \"[[:$1]]\" ring wiki puniki. {{PLURAL:$2|0=| cingakin taler asil rerehan lianan sane kapolihang}}",
        "searchmenu-new": "<strong> ngawi lembar \"[[:$1]] ring wiki puniki </ strong>! {{{{PLURAL:$2|}}| 0 = | cingak teler lembar sane kapolihang ring pangreregan | cingak taler asil pangrerehan sane kapolihang}}",
        "searchprofile-articles": "lembar puniki",
        "searchprofile-images": "multimedia",
-       "searchprofile-everything": "samian",
+       "searchprofile-everything": "Samian",
        "searchprofile-advanced": "lanturane",
        "searchprofile-articles-tooltip": "ngarereh ring $1",
        "searchprofile-images-tooltip": "pangrereh ring pupulan",
        "search-result-size": "$1 ({{PLURAL:$2|1 kruna|$2 kruna}})",
        "search-result-category-size": "{{PLURAL:$1|1 krama|$1 krama}}({{PLURAL:$2|1  subgolongan|$2 subgolongan}}, {{PLURAL:$3|1 pupulan|$3 pupulan}})",
        "search-redirect": "(panglikuan $1)",
-       "search-section": "(kepahan$1)",
+       "search-section": "(pahan $1)",
        "search-suggest": "minab sane kearsaang $1",
        "searchrelated": "paiketan",
        "searchall": "samian",
        "search-nonefound": "nenten wenten asil sane caklek ring arsa",
        "mypreferences": "Preferensi",
+       "prefs-user-pages": "Kaca panganggén",
        "youremail": "E-mail",
        "yourrealname": "pesengan sujati",
        "prefs-help-email": "alamat email sane mawatek mamilih, nanging ngamerluang anggen nyumunin sandi yening ida dane lali",
        "prefs-help-email-others": "ida dane prasida milih anggen ngalugrain anak lianan ngubungin ida dane majalaran lembar penganggen utawi pangraos nenten ja perlu ngagah indik padewekan ida dane",
+       "group-bot": "Bot",
+       "grouppage-bot": "{{ns:project}}:Bot",
+       "right-edit": "Uah kaca",
        "right-writeapi": "nganggén API sasuratan",
        "newuserlogpage": "log penganggo anyar",
-       "action-edit": "benahang lembar puniki",
+       "action-read": "wacén kaca puniki",
+       "action-edit": "uah kaca puniki",
+       "action-createpage": "karyanin kaca puniki",
+       "action-createaccount": "karyanin akun panganggén puniki",
        "nchanges": "$1{{PLURAL:$1|panguwahan|uwah-uwahan}}",
        "enhancedrc-history": "babad",
-       "recentchanges": "Pagentosan anyar",
+       "recentchanges": "Uahan anyar",
        "recentchanges-legend": "pilihan panguwahan sane anyar",
        "recentchanges-feed-description": "molihang pagentosan anyar ring wiki ring \"umpan\" puniki",
-       "recentchanges-label-newpage": "panguwahan puniki ngaryanin lembar anyar",
-       "recentchanges-label-minor": "niki panguwahan kidik",
+       "recentchanges-label-newpage": "Uahan puniki makarya kaca anyar",
+       "recentchanges-label-minor": "Punika uahan alit",
        "recentchanges-label-bot": "penguwahan puniki kalaksanayang antuk bot",
-       "recentchanges-label-unpatrolled": "panguwahan puniki durung kapatroli",
+       "recentchanges-label-unpatrolled": "Uahan puniki durung kapatroli",
+       "rcfilters-filter-minor-label": "Uahan alit",
+       "rcfilters-filter-major-label": "Uahan tan alit",
+       "rcfilters-filter-pageedits-label": "Uahan kaca",
        "rcnotefrom": "Ring beten puniki inggih punika {{PLURAL:$5|panguwahan}} saking <strong>$3, $4</strong> (kaedengang ngantos <strong>$1</strong> panguwahan).",
        "rclistfrom": "edengang  penguwahan sane anyar wit saking $3 $2",
-       "rcshowhideminor": "$1 uwahan kidik",
+       "rcshowhideminor": "$1 uahan alit",
        "rcshowhideminor-show": "Edengang",
        "rcshowhideminor-hide": "Engkebang",
        "rcshowhidebots": "$1 bot",
        "rcshowhideanons-show": "Edengang",
        "rcshowhideanons-hide": "Engkebang",
        "rcshowhidepatr": "$1 suntingan sane kapatroli",
-       "rcshowhidemine": "$1 uwahan titiang",
+       "rcshowhidemine": "$1 uahan titiang",
        "rcshowhidemine-show": "Edengang",
        "rcshowhidemine-hide": "Engkebang",
        "rclinks": "Edengang untat $1 gentosan anyar $2 dina kaping untat",
        "hist": "kawentenan sane lian",
        "hide": "engkebang",
        "show": "edengang",
-       "minoreditletter": "M",
-       "newpageletter": "n",
-       "boteditletter": "B",
-       "rc-change-size-new": "$1 {{PLURAL:$1|bita|bita}} sasampun kaobahin",
+       "minoreditletter": "a",
+       "newpageletter": "A",
+       "boteditletter": "b",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bita|bita}} sasampun kauwah",
        "rc-enhanced-expand": "edengang rerincian",
        "rc-enhanced-hide": "engkebang rerincian",
+       "rc-old-title": "witnyané kakaryanin pinaka \"$1\"",
        "recentchangeslinked": "pangentos sane wenten paiketane",
        "recentchangeslinked-toolbox": "pangentos sane wenten paiketane",
        "recentchangeslinked-title": "panguwahan sane mapaiketan ring $1",
        "nolinkstoimage": "Nenten wenten lembar sane medue pranala ring pupulan puniki",
        "sharedupload-desc-here": "pupulan puniki mawit saking $1 lan minab kaanggen olih proyek-proyek sane lianan. Deskripsi saking [$2 lebar deskripsinyane] kaarahin ring ungkur puniki",
        "upload-disallowed-here": "Ida dane tusing ngidang numpuk suratan pukini.",
-       "randompage": "lembar acak",
+       "randompage": "Kaca napi kémanten",
        "statistics": "Statistik",
+       "statistics-articles": "Kaca daging",
+       "brokenredirects-edit": "uah",
        "nbytes": "$1{{PLURAL:$1|bit}}",
        "nmembers": "$1 {{PLURAL:$1|krama}}",
-       "prefixindex": "samian lembar anggen pangater",
+       "prefixindex": "Makasami kaca sané mapangater",
+       "protectedpages-page": "Kaca",
+       "listusers": "Bacakan panganggén",
+       "usereditcount": "$1 {{PLURAL:$1|uahan}}",
        "usercreated": "{{GENDER:$3|kakaryanin}} ring $1 galah $2",
-       "newpages": "lembar anyar",
+       "newpages": "Kaca anyar",
        "move": "kisidang",
        "pager-newer-n": "{{PLURAL:$1|1 lewih anyar|$1 lewih anyar}}",
        "pager-older-n": "{{PLURAL:$1|1 lewih suwe|$1 lewih anyar}}",
        "booksources": "pawiwitan buku",
-       "booksources-search-legend": "rereh ring sumber buku",
+       "booksources-search-legend": "Rereh wit buku",
        "booksources-search": "Rereh",
-       "log": "log",
-       "allpages": "samian lembar",
-       "allarticles": "samian lembar",
+       "log": "Log",
+       "allpages": "Makasami kaca",
+       "allarticles": "Makasami kaca",
        "allpagessubmit": "lanturang",
        "categories": "Golongan",
        "linksearch-line": "$1 masambung saking $2",
        "emailuser": "email sane nganggo niki",
        "watchlist": "kepahan peninjoan",
        "mywatchlist": "kepahan peninjoan",
-       "watchlistfor2": "anggen $1 $2",
+       "watchlistfor2": "Anggén $1 $2",
        "watch": "cingak",
        "unwatch": "tan sida maninjo",
        "watchlist-details": "{{PLURAL:$1|$1 lembar}} ring paninjoan ida dane, nenten sareng lembar wacana.",
-       "wlshowlast": "edengang $1 jam $2 dina kaping untat",
+       "wlshowlast": "Cingak $1 jam $2 rahina sané lintang",
+       "wlshowhideminor": "uahan alit",
        "watchlist-options": "milih kepahan peninjo",
        "actioncomplete": "pelaksanan sampun wusan",
        "actionfailed": "pelaksana luput",
        "dellogpage": "log pangapus",
        "rollbacklink": "mabalik",
+       "changecontentmodel-title-label": "Murda kaca",
        "protectlogpage": "log penyaga",
        "protectedarticle": "nyaga \"[[$1]]\"",
-       "protect-default": "Izinkan mekejang",
-       "restriction-edit": "Becikang",
+       "protect-default": "Lugra makasami panganggén",
+       "restriction-edit": "Uah",
        "undeletelink": "cingak/uliang",
        "undeleteviewlink": "cingak",
        "namespace": "Genah pesengan",
        "sp-contributions-blocklog": "log pemblokiran",
        "sp-contributions-uploads": "unggahang",
        "sp-contributions-logs": "log",
-       "sp-contributions-talk": "babaosan",
+       "sp-contributions-talk": "pabligbagan",
        "sp-contributions-search": "rereh anggen kawigunanne",
        "sp-contributions-username": "Alamat IP utawi pesengan panganggo:",
        "sp-contributions-toponly": "tampilang wantah panguwahan sane anyar",
        "sp-contributions-newonly": "Tampilang wantah panguwahan sane anyar",
        "sp-contributions-submit": "rereh",
-       "whatlinkshere": "Pranala balik",
+       "whatlinkshere": "Pranala iriki",
        "whatlinkshere-title": "lembar-lembar sane maduwe pranala kaping \"$1\"",
-       "whatlinkshere-page": "lembar",
+       "whatlinkshere-page": "Kaca:",
        "linkshere": "lembar puniki maduwe pranala ke '''$2'''",
        "nolinkshere": "lembar puniki maduwe pranala ke '''$2'''",
        "isredirect": "lembar pangalihan",
        "whatlinkshere-hideimages": "$1 pranala pupulan",
        "whatlinkshere-filters": "Panyaring",
        "ipboptions": "2 jam:2 hours,1 dina:1 day,3 dina:3 days,1 minggu:1 week,2 minggu:2 weeks,1 sasih:1 month,3 sasih:3 months,6 sasih:6 months,1 taun:1 year,tanpa wates:infinite",
+       "ipb-pages-label": "Kaca",
        "ipblocklist": "ngempetin sane nganggo",
+       "blocklist-nousertalk": "tan prasida nguahin kaca pabligbagan praragan",
+       "blocklist-editing-page": "kaca",
        "blocklink": "ngempetin",
        "unblocklink": "ngicalang kaempetan",
        "change-blocklink": "gentosin empetin",
-       "contribslink": "haturan",
+       "contribslink": "kontribusi",
        "blocklogpage": "log pemblokiran",
        "blocklogentry": "mlokir [[$1]] anggen pangwates galah $2$3",
        "block-log-flags-nocreate": "ngawe akun kaicalang",
        "allmessagesdefault": "teks lingga",
        "thumbnail-more": "ngedenang",
        "thumbnail_error": "luput ngaryanin bentuk cenik $1",
+       "import-interwiki-sourcepage": "Kaca wit:",
        "tooltip-pt-userpage": "Lembar sane {{GENDER:|kaanggen ida dane}}",
        "tooltip-pt-mytalk": "Laman bebaosan {{GENDER:|Ida dané}}",
        "tooltip-pt-preferences": "Preferensi {{GENDER:|Ida dane}}",
        "tooltip-pt-watchlist": "kepahan-kepahan lembar sane katinjo titiang",
        "tooltip-pt-mycontris": "Kepahan-kepahan kawigunan {{GENDER:|Ida dane}}",
-       "tooltip-pt-login": "ida dané kaaturang ngranjing log, nanging nénten kaswadarmayang",
+       "tooltip-pt-login": "Ida dané kaaptiang mangda ngranjing log, yadiastun nénten wajib",
        "tooltip-pt-logout": "medal saking Log",
-       "tooltip-pt-createaccount": "ragané mangda makarya akun miwah ngranjing log: yadiastun nénten kawajibang",
-       "tooltip-ca-talk": "pabligbagan indik dagingnyane",
-       "tooltip-ca-edit": "Sunting kaca iki. Nganggen tombol pratayang sadurunge nyimpen.",
+       "tooltip-pt-createaccount": "Ida dané kaaptiang mangda makarya akun miwah ngranjing log; yadiastun nénten wajib",
+       "tooltip-ca-talk": "Pabligbagan indik kaca madaging",
+       "tooltip-ca-edit": "Uah kaca puniki",
        "tooltip-ca-addsection": "nyumunin kepahan anyar",
-       "tooltip-ca-viewsource": "lembar puniki kasayubang. ida dane wantah prasida nyingakin witnyane",
-       "tooltip-ca-history": "pabenahang sadurungnyane saking lembar puniki",
+       "tooltip-ca-viewsource": "Kaca puniki kasayubang.\nIda dane wantah prasida nyingakin witnyane",
+       "tooltip-ca-history": "Uahan sadurungnyané saking kaca puniki",
        "tooltip-ca-protect": "jaga lembar puniki",
        "tooltip-ca-delete": "benahang lembar puniki",
        "tooltip-ca-move": "magingsir saking lembar niki",
        "tooltip-ca-watch": "imbuhin lembar niki ring daftar paninjoan ida dane",
        "tooltip-ca-unwatch": "apus lembar niki ring daftar paninjoan ida dane",
-       "tooltip-search": "rereh ring {{SITENAME}} puniki",
-       "tooltip-search-go": "rereh lembar anggen adan sane pateh sekadi puniki yening wenten",
-       "tooltip-search-fulltext": "rereh lembar sane maduwe wacana sekadi puniki",
-       "tooltip-p-logo": "cingakin lembar utama",
+       "tooltip-search": "Rereh ring {{SITENAME}}",
+       "tooltip-search-go": "Rereh kaca antuk wasta sané pateh sakadi puniki yéning wénten",
+       "tooltip-search-fulltext": "Rereh kaca sané madaging suratan puniki",
+       "tooltip-p-logo": "Cingakin kaca utama",
        "tooltip-n-mainpage": "nuju lembar sane utama",
-       "tooltip-n-mainpage-description": "nuju lembar sane utama",
-       "tooltip-n-portal": "indik proyek, napi sane prasida kalaksanayang, ring dija antuk ngarereh indik-indik",
+       "tooltip-n-mainpage-description": "Cingakin kaca utama",
+       "tooltip-n-portal": "Indik proyék, sané prasida kalaksanayang, genah ngrereh wantuan",
        "tooltip-n-currentevents": "molihang warta indik kawentenan kawentenan sane pinih anyar",
-       "tooltip-n-recentchanges": "(.....) gentosan anyar ring wiki",
-       "tooltip-n-randompage": "edengang polah-palih lembar",
-       "tooltip-n-help": "genah anggen ngarereh",
-       "tooltip-t-whatlinkshere": "kepahan sami lembar wiki sane maduwe pranala nuju lembar puniki",
+       "tooltip-n-recentchanges": "Bacakan uahan anyar ring wiki",
+       "tooltip-n-randompage": "Cihnayang kaca napi kémanten",
+       "tooltip-n-help": "Genah ngrereh wantuan",
+       "tooltip-t-whatlinkshere": "Bacakan makasami kaca ring wiki sané nuju iriki",
        "tooltip-t-recentchangeslinked": "Pagentosan anyar lembar sane maduwe pranala nuju lembar puniki",
        "tooltip-feed-atom": "\"atom feed\" anggen lembar puniki",
        "tooltip-t-contributions": "Daptar kepahan kawigunan {{GENDER:$1|penganggo niki}}",
        "tooltip-t-emailuser": "Ngirim surel majeng ring {{GENDER:$1|penganggo puniki}}",
        "tooltip-t-upload": "ngunggahang file",
-       "tooltip-t-specialpages": "Kepahan sami lembar istimewa",
-       "tooltip-t-print": "kawentenan lian sane macetak ring lembar puniki",
+       "tooltip-t-specialpages": "Bacakan makasami kaca kusus",
+       "tooltip-t-print": "Vérsi citak kaca puniki",
        "tooltip-t-permalink": "Pranala ajeg kaanggen ngubah lembar puniki",
-       "tooltip-ca-nstab-main": "cingak dagingnyane lembar puniki",
-       "tooltip-ca-nstab-user": "cingak lembar penganggo",
+       "tooltip-ca-nstab-main": "Cingak kaca daging",
+       "tooltip-ca-nstab-user": "Cingak kaca panganggo",
        "tooltip-ca-nstab-special": "puniki lembar sane pinih utama sane nenten prasida kauwah",
-       "tooltip-ca-nstab-project": "cingak dagingnyane lembar puniki",
-       "tooltip-ca-nstab-image": "cingak lembar berkas",
-       "tooltip-ca-nstab-template": "cingak templat",
+       "tooltip-ca-nstab-project": "Cingak kaca proyek",
+       "tooltip-ca-nstab-image": "Cingak kaca berkas",
+       "tooltip-ca-nstab-template": "Cingak citakan",
        "tooltip-ca-nstab-help": "cingak lembar pamitutlung",
-       "tooltip-ca-nstab-category": "cingak lembar kategori",
+       "tooltip-ca-nstab-category": "Cingak kaca kategori",
        "tooltip-minoredit": "pingetin puniki dados panguwahan kidik",
        "tooltip-save": "Nyimpen pagentosan ida dane",
        "tooltip-preview": "Pagentosan sane dumun duwen ida dane, mangda anggen niki sadurung jagi nyimpen!",
        "tooltip-undo": "\"nguliang\" ngabuwungin jagi ngabecikang niki lan ngagah kotak mecikang ngangge mode pratayang. dasar ipun prasida kaimbuhin ring kotak pamicutet",
        "tooltip-summary": "ngalebuang silih sinunggil ringkesan",
        "simpleantispam-label": "Pamariksa anti-spam.\nPuniki <strong>wenten</strong> kaisi!",
-       "pageinfo-header-edits": "Babad becikang",
+       "pageinfo-header-edits": "Uah babad",
        "pageinfo-display-title": "Edengang judul",
        "pageinfo-article-id": "ID Halaman",
-       "pageinfo-toolboxlink": "Katérangan lembar",
-       "previousdiff": "← Benahin sadurungnyane",
-       "nextdiff": "panguwahan sane pinih anyar →",
+       "pageinfo-robot-index": "Kalugra",
+       "pageinfo-robot-noindex": "Tan kalugra",
+       "pageinfo-toolboxlink": "Inpormasi kaca",
+       "pageinfo-contentpage-yes": "Inggih",
+       "previousdiff": "← Uahan sadurungnyané",
+       "nextdiff": "Uahan sané pinih anyar →",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|kaca}}",
        "file-info-size": "$1x$2 piksel, ukuran pupulan: $3, tipe MIME:$4",
        "file-nohires": "tan kasayagaang ukuran sane lewih ageng",
        "svg-long-desc": "pupulan SVG, nominal $1 × $2 piksel, geden pupulan: $3",
        "metadata-fields": "bidang metadata gambar sane kacantumang ring pesen puniki jagi kalebuang ring tampilan lembar gambar rikala tabel metadata kacenikang.\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",
        "namespacesall": "samian",
        "monthsall": "samian",
-       "watchlisttools-view": "edengang panguwahan sane mapaiket",
-       "watchlisttools-edit": "edengang lan uwahin kepangan paninjo",
-       "watchlisttools-raw": "uwah kepahan paninjo mentah",
+       "imgmultipagenext": "kaca salanturnyané →",
+       "imgmultigoto": "Nuju kaca $1",
+       "table_pager_next": "Kaca salanturnyané",
+       "table_pager_prev": "Kaca sadurungnyané",
+       "watchlisttools-view": "Cingak uahan sane relevan",
+       "watchlisttools-edit": "Cingak miwah uah bacakan pantauan",
+       "watchlisttools-raw": "Uah kepahan paninjo mentah",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|bebaosan]])",
        "duplicate-defaultsort": "pingetan: sereg pangurutan lingga \"$2\" nyampahang sereg pangurutan lingga sadurunge \"$1\"",
-       "specialpages": "lembar melulu",
+       "version-specialpages": "Kaca kusus",
+       "specialpages": "Kaca kusus",
        "external_image_whitelist": "#banggiang baris niki sapunapi kawentenanne<pre>\n#anggen fragmen akspresi reguler (wantah kepahan ring kekelaih//) ring sor puniki\n#fragmen-fragmen puniki jagi kaadungang sareng URL saking gambar-gambar eksternal (sane kasambungang langsung)\n#fragmen sane adung jagi katampilang dados gambar, sisanne wantah dados pranala kewanten\n#baris sane kakawitin antuk # jagi kadadosang baris komentar\n#niki nenten ngabinayang aksara ageng lan alit\n#genahang samian fragmen ekspresi reguler ring sor baris puniki. banggiang baris niki sapunapi kawentennane</pre>",
        "tag-filter": "filter [[Special:Tags|tag]]:",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Tag}}]]: $2",
        "tags-active-yes": "Inggih",
+       "tags-active-no": "Nénten",
+       "tags-edit": "uah",
+       "compare-page2": "Kaca 2",
        "logentry-newusers-create": "$1 {{GENDER:$2|makarya}} akun sané nuénang",
-       "searchsuggest-search": "Rereh ring {{SITENAME}}"
+       "logentry-newusers-autocreate": "Akun panganggén $1 {{GENDER:$2|kakaryanin}} otomatis",
+       "searchsuggest-search": "Rereh ring {{SITENAME}}",
+       "duration-days": "$1 {{PLURAL:$1|rahina}}",
+       "pagelanguage": "Uah basa ring kaca",
+       "pagelang-nonexistent-page": "Kaca $1 nénten wénten."
 }
index 8bcf065..8ee51ef 100644 (file)
        "mw-widgets-abandonedit-discard": "Скасаваць зьмены",
        "mw-widgets-abandonedit-keep": "Працягваць рэдагаваньне",
        "mw-widgets-abandonedit-title": "Вы ўпэўненыя?",
+       "mw-widgets-copytextlayout-copy": "Скапіяваць",
+       "mw-widgets-copytextlayout-copy-fail": "Капіяваньне ў буфэр абмену не атрымалася.",
+       "mw-widgets-copytextlayout-copy-success": "Скапіявана ў буфэр абмену.",
        "mw-widgets-dateinput-no-date": "Дата не абраная",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
index fa47f8c..fe1c4d6 100644 (file)
        "virus-scanfailed": "escaneig fallit (codi $1)",
        "virus-unknownscanner": "antivirus desconegut:",
        "logouttext": "'''Heu finalitzat la sessió.'''\n\nTingueu en compte que, fins que buideu la memòria cau del navegador, algunes pàgines poden continuar mostrant-se com si encara estiguéssiu en una sessió.",
+       "logging-out-notify": "S'està finalitzant la sessió, espereu.",
+       "logout-failed": "Ara no es pot finalitzar la sessió: $1",
        "cannotlogoutnow-title": "Ara no es pot finalitzar la sessió",
        "cannotlogoutnow-text": "No es pot finalitzar la sessió quan s'utilitza $1.",
        "welcomeuser": "Benvingut, $1!",
        "timezonelegend": "Fus horari:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Utilitza l'hora per defecte del wiki ($1)",
-       "timezoneuseoffset": "Altres (especifiqueu la diferència)",
+       "timezoneuseoffset": "Altres (especifiqueu la diferència horària a sota)",
        "timezone-useoffset-placeholder": "Valors d'exemple: «-07:00» o «01:00»",
        "servertime": "Hora del servidor:",
        "guesstimezone": "Omple-ho des del navegador",
        "userrights-expiry-othertime": "Altre temps:",
        "userrights-expiry-options": "1 dia:1 day,1 setmana:1 week,1 mes:1 month,3 mesos:3 months,6 mesos:6 months,1 any:1 year",
        "userrights-invalid-expiry": "La data d'expiració per al grup «$1» no és vàlida.",
+       "userrights-expiry-in-past": "La data de venciment del grup «$1» és en el passat.",
        "userrights-conflict": "Conflicte de canvis dels permisos d'usuari. Reviseu i confirmeu els canvis.",
        "group": "Grup:",
        "group-user": "Usuaris",
        "right-reupload-own": "Carregar al damunt d'un fitxer que havia carregat el propi usuari",
        "right-reupload-shared": "Sobreescriure localment fitxers presents al repositori multimèdia compartit",
        "right-upload_by_url": "Carregar un fitxer des de l'adreça URL",
-       "right-purge": "Purgar la memòria cau del lloc web sense pàgina de confirmació",
+       "right-purge": "Purgar la memòria cau de lloc d'una pàgina",
        "right-autoconfirmed": "Modificar pàgines semiprotegides",
        "right-bot": "Ésser tractat com a procés automatitzat",
        "right-nominornewtalk": "Que les modificacions menors que facin en pàgines de discussió d'usuari no generin l'avís de nous missatges",
        "action-changetags": "afegeix i elimina etiquetes a les revisions i les entrades de registre individuals",
        "action-deletechangetags": "eliminar etiquetes des de la base de dades",
        "action-purge": "purga la pàgina",
+       "action-editinterface": "editar la interfície d'usuari",
+       "action-unblockself": "desblocar-se un mateix",
        "nchanges": "$1 {{PLURAL:$1|canvi|canvis}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|des de la darrera visita}}",
        "enhancedrc-history": "historial",
        "rcfilters-savedqueries-already-saved": "Ja s'han desat aquests filtres. Canvieu els vostres paràmetres per crear un filtre desat nou.",
        "rcfilters-restore-default-filters": "Restaura els filtres per defecte",
        "rcfilters-clear-all-filters": "Esborra tots els filtres",
-       "rcfilters-show-new-changes": "Mostra els nous canvis",
+       "rcfilters-show-new-changes": "Mostra els canvis nous des del $1",
        "rcfilters-search-placeholder": "Filtra els canvis recents (utilitzeu el menú o cerqueu el nom del filtre)",
        "rcfilters-invalid-filter": "Filtre no vàlid",
        "rcfilters-empty-filter": "No hi ha cap filtre actiu. Es mostren totes les contribucions.",
        "uploadstash-bad-path-bad-format": "La clau «$1» no està en un format adequat.",
        "uploadstash-file-not-found-no-thumb": "No s'ha pogut obtenir una miniatura.",
        "uploadstash-file-not-found-no-local-path": "No hi ha cap camí local per a l'element escalat.",
+       "uploadstash-file-not-found-no-object": "No s'ha pogut crear l'objecte del fitxer local per a la miniatura.",
+       "uploadstash-file-not-found-no-remote-thumb": "Ha fallat la recuperació de la miniatura: $1\nURL = $2",
        "uploadstash-file-not-found-missing-content-type": "Manca una capçalera de tipus de contingut.",
        "uploadstash-file-not-found-not-exists": "No es pot trobar el camí, o bé no és un fitxer pla.",
        "uploadstash-file-too-large": "No es pot servir un fitxer més gran de $1 bytes.",
        "protectedtitles-submit": "Mostra els títols",
        "listusers": "Llista d'usuaris",
        "listusers-editsonly": "Mostra només usuaris amb edicions",
+       "listusers-temporarygroupsonly": "Mostra només els usuaris en els grups d'usuaris temporals",
        "listusers-creationsort": "Ordena per data de creació",
        "listusers-desc": "Ordena en ordre descendent",
        "usereditcount": "$1 {{PLURAL:$1|modificació|modificacions}}",
        "deleting-backlinks-warning": "<strong>Atenció:</strong>\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|Altres pàgines]] enllacen aquí o inclouen la pàgina que esteu a punt de suprimir.",
        "rollback": "Reverteix edicions",
        "rollback-confirmation-confirm": "Confirmeu:",
+       "rollback-confirmation-yes": "Reverteix",
        "rollback-confirmation-no": "Cancel·la",
        "rollbacklink": "Reverteix",
        "rollbacklinkcount": "reverteix $1 {{PLURAL:$1|edició|edicions}}",
        "blocklist-addressblocks": "Amaga blocatges d'una sola IP",
        "blocklist-type": "Tipus:",
        "blocklist-type-opt-all": "Tot",
+       "blocklist-type-opt-sitewide": "A tot el lloc web",
        "blocklist-type-opt-partial": "Parcial",
        "blocklist-rangeblocks": "Amaga els blocatges de rang",
        "blocklist-timestamp": "Marca horària",
        "blocklink": "bloca",
        "unblocklink": "desbloca",
        "change-blocklink": "canvia el blocatge",
+       "empty-username": "(nom d'usuari no disponible)",
        "contribslink": "contribucions",
        "emaillink": "correu electrònic",
        "autoblocker": "Se us ha blocat automàticament perquè la vostra adreça IP ha estat recentment utilitzada per l'usuari ''[[User:$1|$1]]''.\nEl motiu del blocatge de $1 és: «$2».",
        "mw-widgets-abandonedit-discard": "Descarta les edicions",
        "mw-widgets-abandonedit-keep": "Continua editant",
        "mw-widgets-abandonedit-title": "N'esteu segur?",
+       "mw-widgets-copytextlayout-copy": "Copia",
+       "mw-widgets-copytextlayout-copy-fail": "Ha fallat la còpia al portaretalls.",
+       "mw-widgets-copytextlayout-copy-success": "S'ha copiat al portaretalls.",
        "mw-widgets-dateinput-no-date": "No s'ha seleccionat cap data",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
index e919277..939e795 100644 (file)
        "confirmdeletetext": "Хьо гӀерта агӀо я файл дӀаяккха '''дехар до''', дӀаяккхале хьалха хьажа [[{{MediaWiki:Policy-url}}|кхуза]].",
        "actioncomplete": "Кхочушдина",
        "actionfailed": "Кхочушъ цадина",
-       "deletedtext": "«$1» дӀаяьккхина яра.\nХьажа. $2 хьажарна оцу тӀаьхьара дӀаяхначара могӀаме.",
+       "deletedtext": "«$1» дӀаяьккхина.\nХьажа. $2 хьажарна оцу тӀаьхьара дӀаяьхначера могӀаме.",
        "dellogpage": "ДӀадаьхнарш долу тéптар",
        "dellogpagetext": "Лахахь гойтуш ю тӀаьххьара дӀаяьхнарш.",
        "deletionlog": "дӀадаьхнарш долу тéптар",
index 0c15d1f..dcf3aaf 100644 (file)
@@ -97,7 +97,8 @@
                        "Kurt Jansson",
                        "McDutchie",
                        "Johanna Strodt (WMDE)",
-                       "Andi-3"
+                       "Andi-3",
+                       "1233qwer1234qwer4"
                ]
        },
        "tog-underline": "Links unterstreichen:",
        "mw-widgets-abandonedit-discard": "Bearbeitungen verwerfen",
        "mw-widgets-abandonedit-keep": "Weiter bearbeiten",
        "mw-widgets-abandonedit-title": "Bist du sicher?",
+       "mw-widgets-copytextlayout-copy": "Kopieren",
+       "mw-widgets-copytextlayout-copy-fail": "Der Text konnte nicht in die Zwischenablage kopiert werden.",
        "mw-widgets-dateinput-no-date": "Kein Datum ausgewählt",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
index 6d425cf..0dd4600 100644 (file)
        "group-autoconfirmed": "Karberê otomatikraştbiyayeyi",
        "group-bot": "Boti",
        "group-sysop": "İdarekari",
-       "group-interface-admin": "İdarekarê namnişani",
+       "group-interface-admin": "İdarekarê interfacey",
        "group-bureaucrat": "Buroqrati",
        "group-suppress": "Pawıteri",
        "group-all": "(pêro)",
        "group-autoconfirmed-member": "{{GENDER:$1|Karberê otomatikraştbiyayeyi}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|İdarekar}}",
-       "group-interface-admin-member": "{{GENDER:$1|idarekarê namnişani}}",
+       "group-interface-admin-member": "{{GENDER:$1|idarekarê interfacey }}",
        "group-bureaucrat-member": "{{GENDER:$1|buroqrat}}",
        "group-suppress-member": "{{GENDER:$1|Temaşekar}}",
        "grouppage-user": "{{ns:project}}:Karberi",
        "grouppage-autoconfirmed": "{{ns:project}}:Karberê otomatikraştbiyayeyi",
        "grouppage-bot": "{{ns:project}}:Boti",
        "grouppage-sysop": "{{ns:project}}:İdarekeri",
-       "grouppage-interface-admin": "{{ns:project}}:İdarekarê namnişani",
+       "grouppage-interface-admin": "{{ns:project}}:İdarekarê interfacey",
        "grouppage-bureaucrat": "{{ns:project}}:Burokrati",
        "grouppage-suppress": "{{ns:project}}:Teftişkar",
        "right-read": "Pera bıwané",
        "listusers-blocked": "(kılit biyo)",
        "activeusers": "Lista karberanê aktifan",
        "activeusers-intro": "Ena yew lista karberê ke $1 {{PLURAL:$1|roc|rocan}} ra tepiya iştirak kerdo inan motneno.",
-       "activeusers-count": "Peyni  {{PLURAL:$3|roc de|$3 rocan de}} $1  {{PLURAL:$1|hereket kerdo|hereketi kerdê}}",
+       "activeusers-count": "{{PLURAL:$3|roce de|$3 rocan de}} '''$1'''  {{PLURAL:$1|iştirak kerdo|iştiraki kerdê}}",
        "activeusers-from": "Enê karberi ra tepya bımocne:",
        "activeusers-noresult": "Karberi nêdiyayê.",
        "activeusers-submit": "Karberanê aktivan bıasene",
        "mw-widgets-abandonedit-discard": "Vurnayışan vece",
        "mw-widgets-abandonedit-keep": "Vurnayışi rê dewam ke",
        "mw-widgets-abandonedit-title": "Vac welay?",
+       "mw-widgets-copytextlayout-copy": "Kopya",
        "mw-widgets-dateinput-no-date": "Tarix nêweçiniya",
        "mw-widgets-dateinput-placeholder-day": "SSSS-AA-RR",
        "mw-widgets-dateinput-placeholder-month": "SSSS-AA",
index 2acc89c..f81f616 100644 (file)
        "action-editmyusercss": "redakti proprajn CSS-dosierojn",
        "action-editmyuserjson": "redakti proprajn JSON-dosierojn",
        "action-editmyuserjs": "redakti proprajn JavaScript-dosierojn",
+       "action-hideuser": "forbari uzantnomon, kaŝante ĝin de la publiko",
        "action-unblockself": "malforbari oni mem",
        "nchanges": "$1 {{PLURAL:$1|ŝanĝo|ŝanĝoj}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ekde lasta vizito}}",
        "rcfilters-filterlist-feedbacklink": "Diru al ni kion vi opinias pri tiuj (novaj) filtraj iloj.",
        "rcfilters-highlightbutton-title": "Emfazi rezultojn",
        "rcfilters-highlightmenu-title": "Elekti koloron",
+       "rcfilters-highlightmenu-help": "Elekti koloron por emfazi ĉi tiun econ",
        "rcfilters-filterlist-noresults": "Neniuj filtriloj troviĝis",
        "rcfilters-filtergroup-authorship": "Redakta aŭtoreco",
        "rcfilters-filter-editsbyself-label": "Viaj redaktoj",
        "uploadstash-bad-path-unknown-type": "Nekonata tipo \"$1\".",
        "uploadstash-bad-path-unrecognized-thumb-name": "Nerekonita miniatura nomo.",
        "uploadstash-bad-path-bad-format": "Ŝlosilo \"$1\" ne estas valide aranĝita",
+       "uploadstash-file-not-found-no-thumb": "Ne povis akiri miniaturon.",
        "uploadstash-no-extension": "Dosiersufikso estas nula.",
        "uploadstash-zero-length": "Longo de dosiero estas nul.",
        "invalid-chunk-offset": "Malvalida deŝovo de dosierpeco",
        "pageswithprop-legend": "Paĝoj kun paĝa atributo",
        "pageswithprop-text": "Ĉi tiu paĝo listigas paĝoj kiu uzas iajn paĝajn ecojn.",
        "pageswithprop-prop": "Nomo de la atributo:",
+       "pageswithprop-reverse": "Ordigi male",
+       "pageswithprop-sortbyvalue": "Ordigi laŭ valoro de eco",
        "pageswithprop-submit": "Ek",
        "pageswithprop-prophidden-long": "trajta valoro de longa teksto kaŝita  ($1)",
        "pageswithprop-prophidden-binary": "duuma trajta valoro kaŝita ($1)",
        "ipb-blocklist": "Vidi ekzistantajn forbarojn",
        "ipb-blocklist-contribs": "Kontribuoj de {{GENDER:$1|$1}}",
        "ipb-blocklist-duration-left": "$1 restas",
+       "block-actions": "Forbarotaj agoj:",
        "block-expiry": "Blokdaŭro",
+       "block-options": "Pliaj opcioj:",
        "block-prevent-edit": "Redaktado",
        "block-reason": "Kialo:",
        "block-target": "Uzantnomo aŭ IP-adreso:",
        "unblocked-id": "Forbaro $1 estas forigita.",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] estis malforbarita.",
        "blocklist": "Forbaritaj uzantoj",
+       "autoblocklist": "Aŭtomataj forbaroj",
        "autoblocklist-submit": "Serĉi",
        "ipblocklist": "Forbaritaj uzantoj",
        "ipblocklist-legend": "Trovi forbaritan uzanton.",
        "group-bot.css": "/* La jena CSS sole influos robotojn. */",
        "group-sysop.css": "/* La jena CSS sole influos administrantojn. */",
        "group-bureaucrat.css": "/* La jena CSS sole influos burokratojn. */",
+       "common.json": "/* Ajna JSON ĉi tie ŝargiĝos por ĉiuj uzantoj dum ĉiuj paĝo-akiroj. */",
        "common.js": "/* La jena Ĝavaskripto ŝargiĝos por ĉiaj uzantoj ĉe ĉiu paĝoŝargado. */",
        "group-autoconfirmed.js": "/* La jena Ĝavaskripto sole ŝargiĝos por auxtokonfirmataj uzantoj. */",
        "group-bot.js": "/* La jena Ĝavaskripto sole ŝargiĝos por robotoj. */",
        "newimages-newbies": "Montri nur kotribuojn de novaj kontoj",
        "newimages-showbots": "Montri alŝutojn per robotoj",
        "newimages-hidepatrolled": "Malvidigi la patrolitajn alŝutitojn",
+       "newimages-mediatype": "Dosiertipo de aŭdvidaĵo:",
        "noimages": "Nenio videbla.",
        "gallery-slideshow-toggle": "Baskuligi miniaturojn",
        "ilsubmit": "Serĉi",
        "confirm-unwatch-top": "Ĉu forigi tiun ĉi paĝon el via atentaro?",
        "confirm-rollback-button": "Bone",
        "confirm-rollback-top": "Malfaru redaktojn al ĉi tiu paĝo?",
+       "confirm-mcrrestore-title": "Malforigi version",
        "confirm-mcrundo-title": "Malfari ŝanĝon",
        "mcrundofailed": "Malfaro malsukcesis",
        "quotation-marks": "„$1“",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Etikedo|Etikedoj}}]]: $2",
        "tag-mw-contentmodelchange": "ŝanĝo de enhavomodelo",
        "tag-mw-contentmodelchange-description": "Redaktoj kiuj [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel ŝanĝas la enhavmodelon] de paĝo",
+       "tag-mw-new-redirect": "Nova alidrektilo",
+       "tag-mw-removed-redirect": "Forigis alidirektilon",
+       "tag-mw-changed-redirect-target": "Ŝanĝis celon de alidirektilon",
        "tag-mw-replace": "Anstataŭiginta",
        "tag-mw-rollback": "Amasmalfari",
        "tag-mw-undo": "Malfari",
        "compare-title-not-exists": "La titolo kiun vi specifis ne ekzistas.",
        "compare-revision-not-exists": "La revizio kiun vi specifis ne ekzistas.",
        "diff-form": "Malsamoj",
+       "diff-form-revid": "Redakta identigilo de diferenco",
        "diff-form-submit": "Montri diferencojn",
        "permanentlink": "Konstanta ligilo",
        "permanentlink-revid": "Identigilo de revizio",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bitoko|bitokoj}}",
        "limitreport-expansiondepth": "Plej alta profundeco de etendo",
        "limitreport-expensivefunctioncount": "Nombro de kostaj sintaks-analizilaj funkcioj",
+       "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|bajto|bajtoj}}",
        "expandtemplates": "Ŝablonetendilo",
        "expand_templates_intro": "Ĉi tiu speciala paĝo prenas vikitekston kaj rikure etendas ĉiujn ŝablonojn en ĝi.\nĜi etendas ankaŭ sintaksajn funkciojn kiel\n<code><nowiki>{{</nowiki>#language:…}}</code> kaj variablojn kiel\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nFakte, ĝi etendas preskaŭ ĉion en duoblaj krampoj.",
        "expand_templates_title": "Kunteksta titolo, por {{FULLPAGENAME}}, ktp.:",
        "mw-widgets-abandonedit-discard": "Forĵeti redaktojn",
        "mw-widgets-abandonedit-keep": "Redakti plu",
        "mw-widgets-abandonedit-title": "Ĉu vi certas?",
+       "mw-widgets-copytextlayout-copy": "Kopii",
+       "mw-widgets-copytextlayout-copy-fail": "Kopiado en tondujon malsukcesis.",
+       "mw-widgets-copytextlayout-copy-success": "Kopiita en tondujon.",
        "mw-widgets-dateinput-no-date": "Neniu dato elektita",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "passwordpolicies-policies": "Politiko",
        "passwordpolicies-policy-minimalpasswordlength": "Pasvortoj devas esti longaj almenaŭ  $1 {{PLURAL:$1|1 signon|$1 signojn}}.",
        "passwordpolicies-policy-passwordcannotmatchusername": "La pasvorto ne povas esti la sama kiel la uzantnomo",
+       "passwordpolicies-policy-passwordcannotbepopular": "Pasvorto ne povas esti {{PLURAL:$1|la plej populara pasvorto|en la listo de $1 popularaj pasvortoj}}",
+       "passwordpolicies-policy-passwordnotinlargeblacklist": "Pasvorto ne povas esti unu el la cent mil plej popularaj pasvortoj",
        "passwordpolicies-policyflag-forcechange": "devas ŝanĝi dum ensaluto",
        "passwordpolicies-policyflag-suggestchangeonlogin": "sugesti ŝanĝadon dum ensaluto",
        "userlogout-continue": "Se vi vola elsaluti, bonvolu  [$1 iri al la elsaluta paĝo].",
index aacefc9..b3cacfc 100644 (file)
                        "Jorge Ubilla",
                        "Marcelo9987",
                        "Cuatro Remos",
-                       "Ryo567"
+                       "Ryo567",
+                       "Agusbou2015"
                ]
        },
        "tog-underline": "Enlaces a subrayar:",
        "action-changetags": "agregar y quitar etiquetas arbitrarias a revisiones individuales y entradas del registro",
        "action-deletechangetags": "eliminar etiquetas de la base de datos",
        "action-purge": "purgar esta página",
+       "action-apihighlimits": "usar límites más altos en peticiones a través de la API",
+       "action-autoconfirmed": "no resultar afectado por los límites de frecuencia de edición para las IP",
        "action-bigdelete": "eliminar las páginas con historiales grandes",
+       "action-blockemail": "bloquear a un usuario para que no pueda mandar correos electrónicos",
        "action-bot": "ser tratado como un proceso automatizado",
        "action-editprotected": "Editar páginas protegidas como «{{int:protect-level-sysop}}»",
        "action-editsemiprotected": "Editar páginas protegidas como «{{int:protect-level-autoconfirmed}}»",
        "action-hideuser": "bloquear un nombre de usuario, haciéndolo invisible",
        "action-ipblock-exempt": "evitar bloques de IP, autobloqueos y bloqueos a distancia",
        "action-unblockself": "desbloquearse a sí mismo",
+       "action-noratelimit": "no resultar afectado por los límites de frecuencia de edición",
        "action-reupload-own": "sobrescribir archivos existentes subidos por uno mismo",
+       "action-nominornewtalk": "no accionar el aviso de mensajes nuevos al realizar ediciones menores en páginas de discusión",
+       "action-markbotedits": "marcar las reversiones como ediciones de un bot",
+       "action-patrolmarks": "ver las marcas de verificación de cambios recientes",
+       "action-override-export-depth": "exportar páginas, incluidas aquellas enlazadas hasta una profundidad de 5",
        "action-suppressredirect": "no crear redirecciones de las páginas al trasladarlas",
        "nchanges": "$1 {{PLURAL:$1|cambio|cambios}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde la última visita}}",
        "confirm-unwatch-top": "¿Quitar esta página de tu lista de seguimiento?",
        "confirm-rollback-button": "Aceptar",
        "confirm-rollback-top": "¿Revertir las ediciones en esta página?",
+       "confirm-rollback-bottom": "Esta operación revertirá inmediatamente los cambios seleccionados a esta página.",
        "confirm-mcrrestore-title": "Restaurar la revisión",
        "confirm-mcrundo-title": "Deshacer un cambio",
        "mcrundofailed": "Error al deshacer",
        "mw-widgets-abandonedit-discard": "Descartar ediciones",
        "mw-widgets-abandonedit-keep": "Continuar editando",
        "mw-widgets-abandonedit-title": "¿Seguro?",
+       "mw-widgets-copytextlayout-copy": "Copiar",
        "mw-widgets-dateinput-no-date": "Ninguna fecha seleccionada",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
index 12f9368..137815f 100644 (file)
        "botpasswords-needs-reset": "گذرواژهٔ رباتی برای ربات «$2» و {{GENDER:$1|کاربر}} «$1» باید از نو تنظیم شود.",
        "botpasswords-locked": "حساب شما قفل شده است و با گذرواژه رباتی نمی‌توانید وارد شوید",
        "resetpass_forbidden": "نمی‌توان گذرواژه‌ها را تغییر داد",
-       "resetpass_forbidden-reason": "نمی‌توانید گذرواژه‌ها را تغییر داد: $1",
+       "resetpass_forbidden-reason": "نمی‌توان گذرواژه‌ها را تغییر داد: $1",
        "resetpass-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
        "resetpass-submit-loggedin": "تغییر گذرواژه",
        "resetpass-submit-cancel": "لغو",
-       "resetpass-wrong-oldpass": "گذرواژهٔ موقت یا اخیر نامعتبر.\nممکن است که شما همینک گذرواژه‌تان را تغییر داده باشید یا درخواست یک گذرواژهٔ موقت تازه کرده باشید.",
+       "resetpass-wrong-oldpass": "گذرواژهٔ موقت یا فعلی نامعتبر.\nممکن است که شما همینک گذرواژه‌تان را تغییر داده باشید یا درخواست یک گذرواژهٔ موقت تازه کرده باشید.",
        "resetpass-recycled": "لطفاً رمز عبور خود را به چیز دیگری غیر از رمز عبور فعلی تنظیم کنید.",
        "resetpass-temp-emailed": "شما با یک کد ایمیل شدهٔ موقت وارد شده‌اید.\nبرای پایان ورود، شما باید رمز عبور جدیدی اینجا وارد کنید:",
        "resetpass-temp-password": "گذرواژهٔ موقت:",
        "mw-widgets-abandonedit-discard": "چشم‌پوشی از ویرایش‌ها",
        "mw-widgets-abandonedit-keep": "ادامه دادن به ویرایش",
        "mw-widgets-abandonedit-title": "آیا مطمئن هستید؟",
+       "mw-widgets-copytextlayout-copy": "رونوشت",
        "mw-widgets-dateinput-no-date": "هیچ داده‌ای انتخاب نشده",
        "mw-widgets-mediasearch-input-placeholder": "جستجو برای رسانه‌ها",
        "mw-widgets-mediasearch-noresults": "هیچ نتیجه‌ای پیدا نشد.",
index eda37f9..60d818b 100644 (file)
        "uncategorized-categories-exceptionlist": "# Contient une liste de catégories, qui ne devraient pas être mentionnées sur Spécial:UncategorizedCategories. Une par ligne, en commençant par \"*\". Les lignes qui commencent avec un autre caractère (y compris les espaces) sont ignorées. Utilisez \"#\" pour les commentaires.",
        "unusedcategories": "Catégories inutilisées",
        "unusedimages": "Fichiers orphelins",
-       "wantedcategories": "Catégories les plus demandées",
+       "wantedcategories": "Catégories demandées",
        "wantedpages": "Pages les plus demandées",
        "wantedpages-summary": "Liste des pages inexistantes ayant le plus de liens vers elles, en excluant les pages n’ayant que des redirections pointant vers elles. Pour avoir une liste des pages inexistantes qui ont des redirections pointant vers elles, voyez [[{{#special:BrokenRedirects}}|la liste des redirections cassées]].",
        "wantedpages-badtitle": "Titre invalide dans les résultats : $1",
        "mw-widgets-abandonedit-discard": "Annuler les modifications",
        "mw-widgets-abandonedit-keep": "Continuer à modifier",
        "mw-widgets-abandonedit-title": "Êtes-vous sûr ?",
+       "mw-widgets-copytextlayout-copy": "Copier",
+       "mw-widgets-copytextlayout-copy-fail": "Échec de copie vers le presse-papiers.",
+       "mw-widgets-copytextlayout-copy-success": "Copié dans le presse-papiers.",
        "mw-widgets-dateinput-no-date": "Aucune date sélectionnée",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-JJ",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
index 9b14ac1..ffb3639 100644 (file)
@@ -61,7 +61,7 @@
        "tog-watchlisthidepatrolled": "Markearre feroarings op myn folchlist ferskûlje",
        "tog-watchlisthidecategorization": "Kategorisearjen fan siden ferbergje yn 'e folchlist",
        "tog-ccmeonemails": "Stjoer my in kopy fan e-mails dy't ik nei oare meidoggers stjoer",
-       "tog-diffonly": "Side-ynhâld dy't feroare wurdt net sjen litte",
+       "tog-diffonly": "Under ferskillen de sideynhâld net sjen litte",
        "tog-showhiddencats": "Ferburgen kategoryen werjaan",
        "tog-norollbackdiff": "Gjin ferskillen sjen litte nei it útfieren fan weromdraaien",
        "tog-useeditwarning": "My warskôgje at ik in bewurkingsside mei net-bewarre wizigings ferlit",
        "pt-userlogout": "Ofmelde",
        "changepassword": "Wachtwurd feroarje",
        "resetpass_announce": "Jo binne oanmeld mei in tydlike koade dy't jo per e-mail tastjoerd is. Fier in nij wachtwurd yn om it oanmelden ôf te meitsjen.",
-       "resetpass_header": "Wachtwurd feroarje",
+       "resetpass_header": "Akkountwachtwurd feroarje",
        "oldpassword": "Ald wachtwurd",
        "newpassword": "Nij wachtwurd",
        "retypenew": "Nij wachtwurd (nochris)",
        "copyrightwarning2": "Al jo bydragen oan {{SITENAME}} kinne bewurke, feroare of fuorthelle wurde troch oare meidoggers.\nAs jo net wolle dat jo teksten yngeand oanpast wurde troch oaren, set se hjir dan net.<br />\nJo sizze ek ta dat jo de oarspronklike auteur binne fan dit materiaal, of dat jo it kopiearre hawwe út in boarne yn it publike domein, of in soartgelikense frije boarne (sjuch $1 foar details).\n'''BRUK GJIN MATERIAAL DAT BESKERME WURDT TROCH AUTEURSRJOCHT, OF JO MOATTE DER TASTIMMING FOAR HAWWE!'''",
        "longpageerror": "<strong>Flater: de tekst dy't jo tafoege hawwe is {{PLURAL:$1|ien kilobyte|$1 kilobytes}} grut, wat grutter is as it maksimum fan {{PLURAL:$2|ien kilobyte|$2 kilobytes}}.</strong>\nBewarjen is net mûglik.'''",
        "readonlywarning": "<strong>Warskôging: De databank is skoattele foar ûnderhâld, dat jo kinne jo bewurkings op dit stuit net fêstlizze.</strong>\nJo soene jo tekst knippe en plakke kinne nei in tekstbestân, en bewarje foar letter.\n\nDe systeembehearder dy't it skoattele hat joech dizze taljochting: $1",
-       "protectedpagewarning": "<strong>Warskôging: Dizze side is beskerme, dat allinne meidoggers mei beheardersrjochten it bewurkje kinne.</strong>\nDe lêste lochrigel is hjirûnder jûn as referinsje:",
-       "semiprotectedpagewarning": "<strong>Opmerking:</strong> Dizze side is befeilige en kin allinne troch registrearre meidoggers bewurke wurde.",
+       "protectedpagewarning": "<strong>Warskôging: Dizze side is befeilige, dat allinne meidoggers mei beheardersrjochten it bewurkje kinne.</strong>\nDe lêste lochrigel is hjirûnder jûn as referinsje:",
+       "semiprotectedpagewarning": "<strong>Opmerking:</strong> Dizze side is befeilige, dat allinne autobefêstige meidoggers it bewurkje kinne.\nDe lêste lochrigel is hjirûnder jûn as referinsje:",
        "cascadeprotectedwarning": "<strong>Warskôging:</strong> Dizze side is skoattele sadat allinnich behearders de side wizigje kinne, om't der in ûnderdiel útmakket fan de neikommende {{PLURAL:$1|side|siden}}, dy't skoattele binne mei de \"ûnderlizzende siden\" opsje ynskeakele:",
        "titleprotectedwarning": "<strong>Warskôging: Dizze side is befeilige. Der binne [[Special:ListGroupRights|spesjale rjochten]] nedich om dizze side meitsje te kinnen.</strong>\nDe lêste lochrigel stiet hjirûnder:",
        "templatesused": "{{PLURAL:$1|Berjocht|Berjochten}} brûkt op dizze side:",
        "restoreprefs": "Alle standertynstellings weromsette (yn alle parten)",
        "prefs-editing": "Bewurkjen",
        "searchresultshead": "Sykje",
-       "stub-threshold": "Drompel foar markearring <a href=\"#\" class=\"stub\">stobbe</a> (bytes):",
+       "stub-threshold": "Drompel foar opmaak fan stobbe-keppelings ($1):",
+       "stub-threshold-sample-link": "eksimpel",
        "stub-threshold-disabled": "Utskeakele",
        "recentchangesdays": "Sichtber tal dagen yn Koartlyn feroare:",
        "recentchangesdays-max": "Maksimum $1 {{PLURAL:$1|dei|dagen}}",
        "username": "{{GENDER:$1|Meidochnamme}}:",
        "prefs-memberingroups": "{{GENDER:$2|Lid}} fan {{PLURAL:$1|groep|groepen}}:",
        "prefs-memberingroups-type": "$1",
+       "prefs-registration": "Ynskriuwingsdatum:",
        "prefs-registration-date-time": "$1",
-       "yourrealname": "Jo wiere namme:",
+       "yourrealname": "Wiere namme:",
        "yourlanguage": "Taal:",
        "yournick": "Nije sinjatuer:",
        "badsig": "Unjildige sinjatuer yn koadefoarm.\nKontrolearje de HTML-tags.",
        "gender-female": "Sy bewurke siden",
        "prefs-help-gender": "Kar: dit wurdt troch de programmatuer brûkt om de goeie oansprekfoarm te kiezen.\nDizze ynformaasje is foar oare meidoggers te sjen.",
        "email": "E-mail",
-       "prefs-help-realname": "Echte namme is net ferplicht; as jo dy opjouwe kin dy namme brûkt wurde om jo erkenning te jaan foar jo wurk.",
+       "prefs-help-realname": "Wiere namme is gjin ferplichting; as jo dy opjouwe kin dy namme brûkt wurde om jo erkenning te jaan foar jo wurk.",
        "prefs-help-email": "In e-mailadres hoecht net, mar is al nedich foar it op 'e nij oanmeitsjen fan jo wachtwurd, at jo dat ferjitte.",
        "prefs-help-email-required": "Hjir is in e-mailadres foar nedich.",
        "prefs-info": "Basisynformaasje",
        "userrights-irreversible-marker": "$1*",
        "group": "Groep:",
        "group-user": "Meidoggers",
-       "group-autoconfirmed": "befêstige meidoggers",
+       "group-autoconfirmed": "Autobefêstige meidoggers",
        "group-bot": "Bots",
        "group-sysop": "Behearders",
+       "group-interface-admin": "Omjouwingsbehearders",
        "group-bureaucrat": "Rjochtenútfurders",
        "group-suppress": "tasichthâlders",
        "group-all": "(eltsenien)",
-       "group-user-member": "{{GENDER:$1|meidogger}}",
-       "group-autoconfirmed-member": "{{GENDER:$1|registrearre meidogger}}",
+       "group-user-member": "{{GENDER:$1|meidogger|meidochster}}",
+       "group-autoconfirmed-member": "autobefêstige {{GENDER:$1|meidogger|meidochster}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
-       "group-sysop-member": "{{GENDER:$1|behearder}}",
-       "group-bureaucrat-member": "{{GENDER:$1|rjochtenútfurder}}",
+       "group-sysop-member": "{{GENDER:$1|behearder|behearster}}",
+       "group-interface-admin-member": "omjouwings{{GENDER:$1|behearder|behearster}}",
+       "group-bureaucrat-member": "{{GENDER:$1|rjochtenútfurder|rjochtenútfurdster}}",
        "group-suppress-member": "{{GENDER:$1|tasichthâlder}}",
        "grouppage-user": "{{ns:project}}:Meidoggers",
-       "grouppage-autoconfirmed": "{{ns:project}}:Registrearre meidoggers",
+       "grouppage-autoconfirmed": "{{ns:project}}:Autobefêstige meidoggers",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Behearders",
+       "grouppage-interface-admin": "{{ns:project}}:Omjouwingsbehearders",
        "grouppage-bureaucrat": "{{ns:project}}:Rjochtenútfurders",
        "grouppage-suppress": "{{ns:project}}:Tafersjoch",
        "right-read": "Siden sjen",
        "right-block": "Oare meidoggers de mûglikheid ta bewurkjen ôfnimme",
        "right-blockemail": "In meidogger it rjocht ta it ferstjoeren fan e-mail ôfnimme",
        "right-hideuser": "In meidochnamme foar oare meidoggers ferskûlje",
-       "right-ipblock-exempt": "IP-blokkades út 'e wei gean",
+       "right-ipblock-exempt": "IP-, IP-rige- en auto-blokkades út 'e wei gean",
        "right-protect": "Befeiligingsnivo's feroarje en beskerme siden bewurkje",
        "right-editprotected": "Befeilige siden bewurkje (sûnder cascading-befeiliging)",
        "right-editinterface": "Meidoggersinterface bewurkje",
        "rcfilters-savedqueries-already-saved": "Dizze filters wurde al bewarre. Feroarje jo ynstellings om in nij filter bewarje te kinnen.",
        "rcfilters-restore-default-filters": "Standertfilters werombringe",
        "rcfilters-clear-all-filters": "Alle filters wiskje",
-       "rcfilters-show-new-changes": "Nijste feroarings besjen",
+       "rcfilters-show-new-changes": "Nije feroarings sûnt $1 besjen",
        "rcfilters-search-placeholder": "Feroarings filterje (brûk it menu of sykje op filternamme)",
        "rcfilters-empty-filter": "Gjin aktive filters. Alle bydragen wurde werjûn.",
        "rcfilters-filterlist-feedbacklink": "Lit ús hearre wat jo fan dit filterark fine",
        "delete_and_move_text": "== Wiskjen nedich ==\nDe doelside \"[[:$1]]\" is der al.\nMoat dy wiske wurde om plak te meitsjen foar it werneamen?",
        "delete_and_move_confirm": "Ja, wiskje de side",
        "delete_and_move_reason": "Wiske en meitsje plak foar it werneamen fan \"[[$1]]\"",
+       "protectedpagemovewarning": "<strong>Warskôging: Dizze side is befeilige, dat allinne meidoggers mei beheardersrjochten it omneame kinne.</strong>\nDe lêste lochrigel is hjirûnder jûn as referinsje:",
+       "semiprotectedpagemovewarning": "<strong>Opmerking:</strong> Dizze side is befeilige, dat allinne autobefêstige meidoggers it omneame kinne.\nDe lêste lochrigel is hjirûnder jûn as referinsje:",
        "export": "Eksportearje",
        "exportall": "Alle siden eksportearje",
        "export-submit": "Eksportearje",
index cee2cc1..3f05b24 100644 (file)
@@ -39,7 +39,8 @@
                        "שמזן",
                        "Uziel302",
                        "Strayblues",
-                       "דויד־תמר"
+                       "דויד־תמר",
+                       "Steeve815"
                ]
        },
        "tog-underline": "סימון קישורים בקו תחתי:",
        "mw-widgets-abandonedit-discard": "ביטול העריכות",
        "mw-widgets-abandonedit-keep": "המשך עריכה",
        "mw-widgets-abandonedit-title": "בטוח?",
+       "mw-widgets-copytextlayout-copy": "העתק",
+       "mw-widgets-copytextlayout-copy-fail": "ההעתקה ללוח נכשלה.",
+       "mw-widgets-copytextlayout-copy-success": "הועתק ללוח.",
        "mw-widgets-dateinput-no-date": "לא נבחר תאריך",
        "mw-widgets-mediasearch-input-placeholder": "חיפוש מדיה",
        "mw-widgets-mediasearch-noresults": "לא נמצאו תוצאות.",
index 5c71b05..f4628c6 100644 (file)
        "lastmodifiedatby": "Ova stranica posljednji je put uređena u $2, dana $1 a uređivao/la je $3.",
        "othercontribs": "Temelji se na radu $1.",
        "others": "drugih",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|suradnik|suradnica}}|suradnici}} $1",
+       "siteusers": "{{PLURAL:$2|1={{GENDER:$1|suradnika|suradnice}}|suradnica i suradnika}} na projektu {{SITENAME}} $1",
        "anonusers": "{{SITENAME}} {{PLURAL:$2|anonimni suradnik|anonimni suradnici}} $1",
        "creditspage": "Autori stranice",
        "nocredits": "Za ovu stranicu nema podataka o autorima.",
index a45cdec..545260c 100644 (file)
        "laggedslavemode": "'''Figyelem:''' Ez a lap nem feltétlenül tartalmazza a legfrissebb változtatásokat!",
        "readonly": "Az adatbázis le van zárva",
        "enterlockreason": "Add meg a lezárás okát, valamint egy becslést, hogy mikor lesz a lezárásnak vége",
-       "readonlytext": "A wiki adatbázisa ideiglenesen le van zárva (valószínűleg adatbázis-karbantartás miatt). A lezárás időtartama alatt a lapok nem szerkeszthetők, és új szócikkek sem hozhatók létre, az oldalakat azonban lehet böngészni.\n\nAz rendszeradminisztrátor, aki lezárta az adatbázist, az alábbi indoklást adta: $1",
+       "readonlytext": "A wiki adatbázisa ideiglenesen le van zárva (valószínűleg adatbázis-karbantartás miatt). A lezárás időtartama alatt a lapok nem szerkeszthetők, és új szócikk sem hozható létre, az oldalakat azonban lehet böngészni.\n\nAz a rendszer-adminisztrátor, aki lezárta az adatbázist, az alábbi indoklást adta: $1",
        "missing-article": "Az adatbázisban nem található meg a(z) „$1” című lap szövege $2.\n\nEnnek az oka általában az, hogy egy olyan lapra vonatkozó linket követtél, amelyet már töröltek.\n\nHa ez nem így van, lehet, hogy hibát találtál a szoftverben.\nJelezd ezt egy [[Special:ListUsers/sysop|adminiszttrátornak]] az URL megadásával.",
        "missingarticle-rev": "(változat azonosítója: $1)",
        "missingarticle-diff": "(eltérés: $1, $2)",
        "viewsource": "Lapforrás",
        "viewsource-title": "$1 forrásának megtekintése",
        "actionthrottled": "Művelet megszakítva",
-       "actionthrottledtext": "A visszaélések elleni védekezés miatt nem végezheted el a műveletet túl sokszor egy adott időn belül, és te átlépted a megengedett határt. Próbálkozz újra néhány perc múlva.",
+       "actionthrottledtext": "A visszaélések elleni védekezés miatt nem végezhető el a művelet túl sokszor egy adott időn belül, és te átlépted a beállított határt. Próbálkozz újra néhány perc múlva.",
        "protectedpagetext": "Ez egy védett lap, így nem végezhető rajta szerkesztés és más művelet.",
        "viewsourcetext": "Megtekintheted és másolhatod a lap forrását.",
        "viewyourtext": "Megtekintheted és kimásolhatod a <strong>saját szerkesztéseidet</strong> az alábbi lapra.",
        "virus-scanfailed": "az ellenőrzés nem sikerült (hibakód: $1)",
        "virus-unknownscanner": "ismeretlen antivírus:",
        "logouttext": "'''Sikeresen kijelentkeztél.'''\n\nLehetséges, hogy néhány oldalon továbbra is azt látod, be vagy jelentkezve, mindaddig, amíg nem üríted a böngésződ gyorsítótárát.",
+       "logging-out-notify": "Épp kijelentkezel, kérlek várj.",
+       "logout-failed": "Jelenleg nem tudsz kijelentkezni: $1",
        "cannotlogoutnow-title": "Nem lehet most kijelentkezni",
        "cannotlogoutnow-text": "A kijelentkezés nem lehetséges $1 használatakor.",
        "welcomeuser": "Üdvözlünk, $1!",
        "mw-widgets-abandonedit-discard": "Változtatások elvetése",
        "mw-widgets-abandonedit-keep": "Szerkesztés folytatása",
        "mw-widgets-abandonedit-title": "Biztos vagy benne?",
+       "mw-widgets-copytextlayout-copy": "Másolás",
+       "mw-widgets-copytextlayout-copy-fail": "A vágólapra másolás nem sikerült.",
+       "mw-widgets-copytextlayout-copy-success": "Vágólapra másolva.",
        "mw-widgets-dateinput-no-date": "Nincs kiválasztott dátum",
        "mw-widgets-dateinput-placeholder-day": "ÉÉÉÉ-HH-NN",
        "mw-widgets-dateinput-placeholder-month": "ÉÉÉÉ-HH",
index b9d7a2f..06418e2 100644 (file)
        "tag-mw-contentmodelchange-description": "Redakturi qui [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel modifikas la modelo di kontenajo] di ula pagino",
        "tag-mw-new-redirect": "Nova ridirekto",
        "tag-mw-blank-description": "Redakturi qui efacas pagini",
+       "tag-mw-replace": "Remplasita",
        "tag-mw-replace-description": "Redakturi qui removas plua kam 90% de la kontenajo di ula pagino",
        "tag-mw-rollback": "Volvar addope",
        "tags-title": "Etiketi",
index 3f4d276..f311e75 100644 (file)
        "mw-widgets-abandonedit-discard": "Ignora modifiche",
        "mw-widgets-abandonedit-keep": "Continuare a modificare",
        "mw-widgets-abandonedit-title": "Sei sicuro?",
+       "mw-widgets-copytextlayout-copy": "Copia",
        "mw-widgets-dateinput-no-date": "Nessuna data selezionata",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-GG",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
index 82a4ccc..9b5a53f 100644 (file)
        "mw-widgets-abandonedit-discard": "編集内容を破棄",
        "mw-widgets-abandonedit-keep": "編集を続行",
        "mw-widgets-abandonedit-title": "本当によろしいですか?",
+       "mw-widgets-copytextlayout-copy": "コピー",
+       "mw-widgets-copytextlayout-copy-success": "クリップボードにコピーされました。",
        "mw-widgets-dateinput-no-date": "日付が選択されていません",
        "mw-widgets-dateinput-placeholder-day": "YYYY-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "YYYY-MM",
index 3e40e6f..a3e81b2 100644 (file)
        "mw-widgets-abandonedit-discard": "편집 버리기",
        "mw-widgets-abandonedit-keep": "편집 계속",
        "mw-widgets-abandonedit-title": "확실합니까?",
+       "mw-widgets-copytextlayout-copy": "복사",
+       "mw-widgets-copytextlayout-copy-fail": "클리보드에 복사하는데 실패했습니다.",
+       "mw-widgets-copytextlayout-copy-success": "클리보드에 복사했습니다.",
        "mw-widgets-dateinput-no-date": "선택된 날짜 없음",
        "mw-widgets-mediasearch-input-placeholder": "미디어 검색",
        "mw-widgets-mediasearch-noresults": "결과가 없습니다.",
index 58e076a..c275c29 100644 (file)
        "mw-widgets-abandonedit-discard": "Ännerungen ignoréieren",
        "mw-widgets-abandonedit-keep": "Virufuere mat Änneren",
        "mw-widgets-abandonedit-title": "Sidd Dir sécher?",
+       "mw-widgets-copytextlayout-copy": "Kopéieren",
        "mw-widgets-dateinput-no-date": "Keen Datum erausgesicht",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
index 7d8daae..d404d89 100644 (file)
        "mw-widgets-abandonedit-discard": "Atsisakyti pakeitimų",
        "mw-widgets-abandonedit-keep": "Tęsti redagavimą",
        "mw-widgets-abandonedit-title": "Esate tikri?",
+       "mw-widgets-copytextlayout-copy": "Kopijuoti",
        "mw-widgets-dateinput-no-date": "Nepasirinkta data",
        "mw-widgets-mediasearch-input-placeholder": "Ieškoti medijų",
        "mw-widgets-mediasearch-noresults": "Rezultatų nerasta.",
index 63b0040..263abd6 100644 (file)
        "title-invalid-characters": "Pieprasītais lapas nosaukums satur nederīgus simbolus: \"$1\".",
        "title-invalid-magic-tilde": "Pieprasītās lapas nosaukums satur nederīgu maģiskās tildes virkni (<nowiki>~~~</nowiki>).",
        "title-invalid-leading-colon": "Pieprasītās lapas nosaukums satur neatļautu kolu tā sākumā.",
-       "perfcached": "Šie dati ir no servera kešatmiņas un var būt novecojuši. Kešatmiņā ir {{PLURAL:$1|pieejami|pieejams|pieejami}} ne vairāk kā {{PLURAL:$1|$1 rezultāti|viens rezultāts|$1 rezultāti}}.",
-       "perfcachedts": "Šie dati ir no servera kešatmiņas (''cache''), kas pēdējo reizi bija atjaunota $1. Kešatmiņā {{PLURAL:$4|pieejami|pieejams|pieejami}} ne vairāk kā {{PLURAL:$4|$4 rezultāti|viens rezultāts|$4 rezultāti}}.",
+       "perfcached": "Šie dati ir no kešatmiņas un var būt novecojuši. Kešatmiņā ir {{PLURAL:$1|pieejami|pieejams|pieejami}} ne vairāk kā {{PLURAL:$1|$1 rezultāti|$ rezultāts|$1 rezultāti}}.",
+       "perfcachedts": "Šie dati ir no kešatmiņas, kas pēdējo reizi tika atjaunināta $1. Kešatmiņā {{PLURAL:$4|pieejami|pieejams|pieejami}} ne vairāk kā {{PLURAL:$4|$4 rezultāti|$4 rezultāts|$4 rezultāti}}.",
        "querypage-no-updates": "Šīs lapas atjaunošana pagaidām ir atslēgta. Te esošie dati tuvākajā laikā netiks atjaunoti.",
        "viewsource": "Aplūkot kodu",
        "viewsource-title": "Apskatīt $1 izejas kodu",
        "mw-widgets-abandonedit-discard": "Atmest labojumus",
        "mw-widgets-abandonedit-keep": "Turpināt labošanu",
        "mw-widgets-abandonedit-title": "Vai esi pārliecināts?",
+       "mw-widgets-copytextlayout-copy": "Kopēt",
        "mw-widgets-dateinput-no-date": "Nav izvēlēts datums",
        "mw-widgets-mediasearch-noresults": "Nav atrasts neviens rezultāts.",
        "mw-widgets-titleinput-description-new-page": "lapa vēl nepastāv",
index 82bc6cb..5fd2caf 100644 (file)
        "mw-widgets-abandonedit-discard": "Отфрли уредувања",
        "mw-widgets-abandonedit-keep": "Продолжи со уредување",
        "mw-widgets-abandonedit-title": "Дали сте сигурни?",
+       "mw-widgets-copytextlayout-copy": "Копирај",
+       "mw-widgets-copytextlayout-copy-fail": "Не успав да ископирам во меѓускладот.",
+       "mw-widgets-copytextlayout-copy-success": "Ископирано во меѓускладот.",
        "mw-widgets-dateinput-no-date": "Нема избрано датум",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
index 0272ac0..dadcf9f 100644 (file)
        "mw-widgets-abandonedit-discard": "တည်းဖြတ်မှုများကို စွန့်လွတ်ရန်",
        "mw-widgets-abandonedit-keep": "တည်းဖြတ်ခြင်းကို ဆက်လုပ်ရန်",
        "mw-widgets-abandonedit-title": "သေချာပါသလား",
+       "mw-widgets-copytextlayout-copy": "မိတ္တူကူး",
        "mw-widgets-dateinput-no-date": "ရက်စွဲ ရွေးမထားပါ",
        "mw-widgets-mediasearch-input-placeholder": "မီဒီယာအတွက် ရှာဖွေရန်",
        "mw-widgets-mediasearch-noresults": "မည်သည့်ရလဒ်မျှ မရပါ",
index 9abf62c..be6185a 100644 (file)
        "mw-widgets-abandonedit-discard": "Wijzigingen niet opslaan",
        "mw-widgets-abandonedit-keep": "Doorgaan met bewerken",
        "mw-widgets-abandonedit-title": "Weet u het zeker?",
+       "mw-widgets-copytextlayout-copy": "Kopiëren",
+       "mw-widgets-copytextlayout-copy-fail": "Kon niet naar het klembord kopieren.",
+       "mw-widgets-copytextlayout-copy-success": "De tekst is gekopieerd naar het klembord.",
        "mw-widgets-dateinput-no-date": "Geen datum geselecteerd",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
index 4ba091c..98ff0f3 100644 (file)
        "tog-hidecategorization": "ߞߐߜߍ ߟߎ߬ ߦߌߟߡߊߦߊߟߌ ߢߡߊߘߏ߲߰",
        "tog-numberheadings": "ߕߍ߰ߟߌ ߡߐ߬ߟߐ߲ ߠߎ߬ ߝߙߍߕߍ߫ ߞߍ߲ߖߘߍߡߊߓߟߏߡߊ߬",
        "tog-editondblclick": "ߞߏߜߍ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫ ߛߐ߲߬ߞߌ߲߬ߠߌ߲߬ߞߏ ߝߌ߬ߟߊ߬ ߟߊ߫",
+       "tog-oldsig": "ߌ ߟߊ߫ ߕߋ߲߭ߕߋ߲߭ ߞߟߊ߬ߣߐ߮",
+       "tog-watchlisthideown": "ߒ ߠߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬ ߢߡߊߘߏ߲߰ ߜߋ߬ߟߎ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫.",
+       "tog-watchlisthidebots": "ߓߏߕ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬ ߢߡߊߘߏ߲߰ ߜߋ߬ߟߎ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫.",
+       "tog-watchlisthideminor": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߘߋ߬ߣߍ߲ ߠߎ߬ ߢߡߊߘߏ߲߰ ߜߋ߬ߟߎ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫.",
+       "tog-showhiddencats": "ߦߌߟߡߊ߫ ߢߡߊߘߏ߲߰ߣߍ߲ ߦߌ߬ߘߊ߬",
        "underline-always": "ߕߎ߬ߡߊ߬ ߓߍ߯",
        "underline-never": "ߡߎ߰ߡߍ߫",
        "sunday": "ߞߊ߯ߙߌߟߏ߲",
@@ -81,6 +86,8 @@
        "october-date": "ߞߏ߲ߓߌߕߌ߮$1",
        "november-date": "ߣߍߣߍߓߊ$1",
        "december-date": "ߞߏߟߌ߲ߞߏߟߌ߲$1",
+       "period-am": "ߖ.ߢ",
+       "period-pm": "ߖ.ߞ",
        "pagecategories": "{{PLURAL:$1|ߦߌߟߡߊ|ߦߌߟߡߊ ߟߎ߬}}",
        "category_header": "ߦߌߟߡߊ ߞߐߜߍ ߟߎ߬ $1",
        "subcategories": "ߝߊ߬ߓߏ߲߬ ߘߋ߬ߣߍ߲ ߠߎ߬",
        "protect_change": "ߊ߬ ߡߊߦߟߍ߬ߡߊ߲߫",
        "unprotect": "ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ ߡߊߝߊ߬ߟߋ߲߬ߠߌ",
        "newpage": "ߘߐߜߍ߫ ߞߎߘߊ",
-       "talkpagelinktext": "ß\9eß\8eß¡ß\8aß«",
+       "talkpagelinktext": "ߢß\8aß\9dß\90ß\9eߣß\8d",
        "specialpage": "ߞߐߜߍ߫ ߞߙߍߞߙߍߣߍ߲",
        "personaltools": "ߘߎ߲߬ߘߎ߬ߡߊ߬ ߖߐ߯ߙߊ߲ ߠߎ߬",
        "talk": "ߓߊ߬ߘߏ߬ߓߊ߬ߘߌߦߊ",
        "views": "ߦߌ߬ߘߊ߬ߟߌ",
        "toolbox": "ߖߐ߯ߙߊ߲ ߠߎ߬",
+       "tool-link-userrights": "{{GENDER:$1|ߟߊ߬ߓߊ߰ߙߊ߬}} ߞߙߎ ߡߊߦߟߍ߬ߡߊ߲߬",
        "tool-link-emailuser": "ߢߎߡߍߙߋ߲ߞߏ߲ߘߏ߫ ߟߊߕߊ߯ {{GENDER:$1|ߟߊߓߊ߯ߙߟߊ ߣߌ߲߬ ߡߊ߬ }}",
        "imagepage": "ߞߐߕߐ߮ ߞߐߜߍ ߘߐߜߍ߫",
        "mediawikipage": "ߗߋߛߓߍ ߞߐߜߍ ߘߐߜߍ߫",
        "helppage-top-gethelp": "ߘߍ߬ߡߍ߲߬ߠߌ",
        "mainpage": "ߓߏ߬ߟߏ߲߬ߘߊ",
        "mainpage-description": "ߓߏ߬ߟߏ߲߬ߘߊ",
-       "policy-url": "Projet:ߞߎ߬ߙߎ߲߬ߘߎ",
+       "policy-url": "Project: ߞߎ߬ߙߎ߲߬ߘߎ",
        "portal": "ߘߍ߬ߘߊ ߘߏ߲߬ߘߊ߬ߓߊ",
        "portal-url": "Project:ߘߍ߬ߘߊ ߟߎ߬ ߘߏ߲߬ߘߊ",
        "privacy": "ߘߎ߲߬ߘߎ߬ߡߊ߬ ߓߘߍߓߘߍߟߌ",
        "privacypage": "Project:ߘߎ߲߬ߘߎ߬ߡߊ߬ ߓߘߍ߬ߓߘߍ߬ߟߌ",
+       "badaccess": "ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߝߎ߬ߕߎ߲߬ߕߌ",
        "ok": "ߏ߬ߞߍ߫",
        "retrievedfrom": "ߊ߬ ߟߊߛߐ߬ߘߐ߲߫ ߦߊ߲߬ \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|ߌ ߓߘߊ߫ ߗߋߛߓߍ߫ ߞߎߘߊ ߛߐ߬ߘߐ߲߬$1  $2 }}",
        "nosuchspecialpage": "ߘߐߜߍ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲߬ ߛߎ߮ ߏ߬ ߝߋ߲߫ ߕߍ߫ ߦߊ߲߬",
        "nospecialpagetext": "<strong>ߊߟߎ߫ ߓߘߊ߫ ߞߐߜߍ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߘߏ߫ ߢߌߣߌ߲߫ ߡߍ߲ ߕߺߴߦߋ߲߬.</strong>\nߞߐߜߍ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲߫ ߓߘߍ߬ߡߊ ߟߎ߬ ߛߙߍߘߍ ߦߋ߫ ߢߌ߲߬ ߠߋ߫ ߞߊ߲߬ [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "ߝߎ߬ߕߎ߲߬ߕߌ",
+       "databaseerror-query": "ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ $1",
+       "databaseerror-function": "ߗߋߘߊ $1",
        "databaseerror-error": "ߝߎ߬ߕߎ߲߬ߕߌ: $1",
        "internalerror": "ߞߣߐߟߊߘߐ߫ ߝߎߕߎ߲ߕߌ",
        "internalerror_info": "ߞߣߐߟߊߘߐ߫ ߝߎ߬ߕߎ߲߬ߕߌ: $1",
        "filecopyerror": "ߊ߬ ߕߍ߫ ߣߊ߬ ߛߐ߲߬ ߠߊ߫ ߞߐߕߐ߮ $1 ߓߊߦߟߍ߬ߡߊ߲߬ ߠ ߦߊ߲߬ߊ߫ $2",
        "filerenameerror": "ߞߐߕߐ߮ \"$1\" ߕߍ߫ ߛߐ߲߬ ߓߊߦߟߍ߬ߡߊ߲߬ ߠߊ߫ ߦߊ߲߬  \"$2\".",
+       "filedeleteerror": "ߞߐߕߐ߮ ߕߴߛߋ߫ ߖߏ߰ߛߌ߬ ߟߊ߫  \"$1\"",
+       "filenotfound": "ߌ ߕߍ߫ ߣߊ߬ ߞߐߕߐ߮  \"$1\" ߛߐ߬ߘߐ߲߬ ߠߊ߫.",
+       "cannotdelete-title": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߞߐߜߍ ߖߏ߬ߛߌ߬ ߟߊ߫  \"$1\"",
        "badtitle": "ߞߎ߲߬ߕߐ߰ ߖߎ߮",
        "badtitletext": "ߞߐߜߍ߫ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ߣߍ߲ ߞߎ߲߬ߕߐ߮ ߓߍ߲߬ߣߍ߲߬ ߕߍ߫߸ ߊ߬ ߘߐߞߏߟߏ߲ ߦߋ߫߸ ߥߟߊ߫ ߞߊ߲ ߠߎ߬ ߣߌ߫ ߢߐ߲߯ߕߍ߫ ߛߘߌ߬ߜߋ߲ ߓߍ߲߬ߓߊߟߌ ߤߊߡߊ߲߫ ߥߞߌ ߟߎ߬ ߕߍ߫ ߛߘߌ߬ߜߋ߲.\nߛߓߍߘߋ߲߫ ߞߋߟߋ߲߫ ߥߟߊ߫ ߛߌߦߊߡߊ߲ ߠߎ߬ ߟߋ߬ ߦߋ߫ ߞߍ߫ ߟߴߊ߬ ߘߐ߫߸ ߡߍ߲ ߠߎ߬ ߕߴߛߋ߫ ߞߍ߫ ߟߊ߫ ߞߎ߲߬ߕߐ߯ ߘߌ߫.",
        "viewsource": "ߊ߬ ߛߎ߲ ߘߐߜߍ߫",
        "viewsource-title": "ߣߌ߲߬ $1 ߛߎ߲ ߘߐߜߍ߫",
        "viewsourcetext": "ߌ ߘߌ߫ ߛߋ߫ ߞߐߜߍ ߣߌ߲߬ ߛߎ߲ ߦߋ߫ ߟߊ߫߸ ߞߵߊ߬ ߓߊߓߌ߬ߟߊ߬",
+       "ns-specialprotected": "ߘߐߜߍ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߕߍ߫ ߛߐ߲߬ ߡߊߦߟߍ߬ߡߊ߲߬ ߠߊ߫.",
+       "titleprotected": "ߞߎ߲߬ߕߐ߮ ߣߌ߲߬ ߓߘߊ߫ ߟߊߞߊ߲ߘߊ߫ ߛߌ߲ߘߟߌ ߡߊ߬  [[User:$1|$1]] ߓߟߏ߫.\nߞߎ߲߭ ߡߍ߲ ߦߴߏ߬ ߟߊ߫߸ ߏ߬ ߦߋ߫ <em>$2</em>.",
+       "filereadonlyerror": "ߞߐߕߐ߮ \"$1\" ߕߍ߫ ߛߐ߲߬ ߡߊߦߟߍ߬ߡߊ߲߬ ߠߊ߫߸ ߞߵߊ߬ ߡߊߛߐ߬ߘߐ߲߬ ߞߐߕߐ߮ ߟߊߡߙߊ߬ ߦߙߐ  \"$2\" ߦߋ߫ ߞߊ߬ߙߊ߲ ߘߐߙߐ߲߫ ߝߊ߬ߘߌ ߟߋ߬ ߘߐ߫.\n\nߞߊ߲ߞߋ ߟߊߓߊ߯ߙߟߊ ߡߍ߲ ߣߵߊ߬ ߛߐ߰ ߟߊ߫߸ ߏ߬ ߓߘߊ߫ ߘߊ߲߬ߕߍ߰ߟߌ ߘߏ߫ ߞߍ߫: \"$3\".",
        "invalidtitle": "ߞߎ߲߬ߕߐ߮ ߓߍ߲߬ߓߊߟߌ",
        "exception-nologin": "ߌ ߜߊ߲߬ߞߎ߲߬ߣߍ߲߬ ߕߍ߫",
+       "virus-unknownscanner": "ߢߐߛߌߙߋ߲ߞߟߊ߬ ߡߊߟߐ߲ߓߊߟߌ",
+       "logout-failed": "ߌ ߕߍߣߊ߬ ߛߋ߫ ߟߴߌ ߜߊ߲߬ߞߎ߬ߣߍ߲ ߓߐ߫ ߟߊ߫ ߕߊ߲߫ $1",
+       "cannotlogoutnow-title": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߴߌ ߜߊ߲߬ߞߎ߬ߣߍ߲ ߓߐ߫ ߟߊ߫ ߕߊ߲߫",
+       "cannotlogoutnow-text": "ߜߊ߲߬ߞߎ߲߬ߓߐ߬ߟߌ ߕߍ߫ ߛߐ߲߬ ߞߍ߫ ߟߊ߫ ߞߵߌ߬ ߕߴߊ߬ ߟߊߓߊ߯ߙߊ ߞߊ߲߬ $1",
+       "welcomeuser": "ߌ ߣߌ߫ ߛߣߍ߫ $1߹",
        "yourname": "ߟߊߓߊ߯ߙߊߟߊߕߐ߮:",
        "userlogin-yourname": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ߬ ߕߐ߮",
        "userlogin-yourname-ph": "ߌ ߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ߬ ߕߐ߮ ߟߊߘߏ߲߬",
        "createacct-yourpasswordagain": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߛߊ߬ߦߌ߬",
        "createacct-yourpasswordagain-ph": "ߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߠߊߘߏ߲߬ ߕߎ߲߯",
        "userlogin-remembermypassword": "ߒ ߜߊ߲߬ߞߎ߲߬ߣߍ߲ ߕߏ߫ ߞߘߊߎ߫",
+       "userlogin-signwithsecure": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲߬ ߟߊߞߊ߲ߘߊߣߍ߲ ߠߊߓߊ߯ߙߊ߫",
+       "cannotlogin-title": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߴߌ ߜߊ߲߬ߞߎ߲߬ ߠߊ߫",
+       "cannotlogin-text": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߕߍ߫ ߣߊ߬ ߓߍ߲߬ ߠߊ߫",
+       "cannotloginnow-title": "ߌ ߕߍ߫ ߛߴߌ ߜߊ߲߬ߞߎ߲߬ ߠߊ߫ ߕߊ߲߫",
+       "cannotloginnow-text": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߕߍ߫ ߣߊ߬ ߓߍ߲߬ ߠߊ߫ ߞߵߌ ߕߴߊ߬ ߟߊߓߊ߯ߙߊ ߞߊ߲߬ $1",
+       "cannotcreateaccount-title": "ߖߊ߬ߕߋ߬ߘߊ ߕߍ߫ ߣߊ߬ ߛߐ߲߬ ߠߊ߫ ߛߌ߲ߘߌ߫ ߟߊ߫",
+       "yourdomainname": "ߌ ߟߊ߫ ߡߊ߬ߘߎ߮:",
+       "password-change-forbidden": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬ ߠߊ߫ ߥߞߌ ߣߌ߲߬ ߞߊ߲߬.",
        "login": "ߌ ߜߊ߲߬ߞߎ߲߬",
+       "login-security": "ߌ ߡߊߟߐ߲ߕߐ߮ ߝߛߍ߬ߝߛߍ߬",
        "nav-login-createaccount": "ߌ ߜߊ߲߬ߞߎ߲߬/ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߟߊߞߊ߬",
        "logout": "ߌ ߜߊ߲߬ߞߎ߲߬ ߓߐ߫",
        "userlogout": "ߌ ߜߊ߲߬ߞߎ߲߬ߣߍ߲ ߓߐ߫",
+       "notloggedin": "ߌ ߜߊ߲߬ߞߎ߲߬ߣߍ߲߬ ߕߍ߫",
        "userlogin-noaccount": "ߖߊ߬ߕߋ߬ߘߊ߬ ߕߴߌ ߓߟߏ߫ ߓߊ߬؟",
        "userlogin-joinproject": "ߘߏ߫ ߟߊߞߊ߬ {{SITENAME}}",
        "createaccount": "ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߟߊߞߊ߬",
        "userlogin-resetpassword-link": "ߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߘߊ߫ ߓߐ߫ ߌ ߞߣߐ߫؟",
        "userlogin-helplink2": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߘߍ߬ߡߍ߲߬ߠߌ߲",
+       "userlogin-loggedin": "ߌ ߓߘߊ߫ ߓߊ߲߫ ߌ ߜߊ߲߬ߞߎ߲߬ ߠߊ߫ ߣߌ߲߬ ߠߊ߫ {{GENDER:$1|$1}}.\nߘߎ߰ߟߊ߬ߘߐ߫ ߖߙߎߡߎ߲ ߣߌ߲߬ ߠߊߓߊ߯ߙߊ߫߸ ߞߵߌ ߜߊ߲߬ߞߎ߲߬ ߕߐ߯ ߜߘߍ߫ ߟߊ߫.",
+       "userlogin-reauth": "ߌ ߦߴߌ ߜߊ߲߬ߞߎ߲߬ ߞߎߘߊ߫ ߘߌ߫ ߞߵߊ߬ ߝߛߍ߬ߝߛߍ߬ ߣߴߌ ߟߋ ߟߋ߬ ߦߋ߫ {{GENDER:$1|$1}} ߘߌ߫.",
        "userlogin-createanother": "ߖߊ߬ߕߋ߬ߘߊ߬ ߞߎߘߊ߫ ߛߌ߲ߘߌ߫",
+       "createacct-emailrequired": "ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߛߊ߲߬ߓߊ߬ߕߐ߮",
        "createacct-emailoptional": "ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ",
        "createacct-email-ph": "ߌ ߟߊ߫ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߟߊߘߏ߲߬",
+       "createacct-another-email-ph": "ߢߎߡߍ",
+       "createaccountmail": "ߓߍ߲߬ߛߋ߲߬ߡߊ߬ ߕߊߡߌ߲ߞߊ߲ ߕߎ߬ߡߊ߬ߞߎ߲߬ߡߊ ߟߊߓߊ߯ߙߊ߫ ߞߊ߬ ߓߊ߲߫ ߞߵߊ߬ ߗߋ߫ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߡߊ߬.",
+       "createaccountmail-help": "ߊ߬ ߕߍ߫ ߛߐ߲߬ ߠߊߓߊ߯ߙߊ߫ ߟߊ߫߸ ߞߊ߬ ߡߐ߰ ߜߘߍ߫ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߛߌ߲ߘߌ߫߸ ߣߴߌ ߡߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߞߊ߬ߙߊ߲߬.",
        "createacct-reason-ph": "ߡߎ߲߬ߠߊ߫ ߌ ߦߋ߫ ߖߊ߬ߕߋ߬ߘߊ߰ ߜߘߍ߫ ߛߌ߲ߘߌ߫ ߟߊ߫",
        "createacct-submit": "ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߘߊߦߟߍ߬",
        "createacct-another-submit": "ߖߊ߬ߕߋߘߊ ߛߌ߲ߘߌ߫",
+       "createacct-continue-submit": "ߖߊ߬ߕߋ߬ߘߊ ߛߌ߲ߘߟߌ ߘߊߓߊ߲߫",
+       "createacct-another-continue-submit": "ߖߊ߬ߕߋ߬ߘߊ ߛߌ߲ߘߟߌ ߘߊߓߊ߲߫",
        "createacct-benefit-heading": "{{SITENAME}} ߛߌ߲ߘߌߣߍ߲߫ ߦߴߌ ߢߐ߲߭ ߡߐ߱ ߟߎ߬ ߟߋ߬ ߓߟߏ߫",
        "createacct-benefit-body1": "{{PLURAL:$1|ߊ߬ ߡߊߦߟߍ߬ߡߊ߲߬|ߊ߬ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߬}}",
        "createacct-benefit-body2": "$1 {{PLURAL:$1|ߘߐߜߍ|ߞߐߜߍ ߟߎ߬}}",
        "createacct-benefit-body3": "ߕߊ߬ߡߌ߲߬ߣߍ߲߬ ߞߎߘߊ {{PLURAL:$1|ߓߟߏߓߌߟߊߢߐ߲߮ߞߊ߲ߠߊ|ߓߟߏߓߌߟߊߢߐ߲߮ߞߊ߲ߠߊ ߟߎ߬}}",
+       "badretype": "ߌ ߣߊ߬ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߍ߲ ߠߊߘߏ߲߬ ߠߊ߫߸ ߏ߬ ߡߊ߫ ߕߊ߬ߡߌ߲߬.",
+       "usernameinprogress": "ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߛߌ߲ߘߌ ߦߴߌ ߘߐ߫ ߟߊ߬ߓߊ߰ߙߊ߬ ߕߐ߮ ߣߌ߲߬ ߠߊ߫߸ ߊ߬ ߘߏ߲߬ ߓߘߊ߫ ߖߊ߲߬ߝߊ߬. ߡߊ߬ߞߐ߬ߣߐ߲߬ߠߌ߲ ߞߍ߫ ߖߊ߰ߣߌ߲߬.",
+       "userexists": "ߟߊ߬ߓߊ߰ߙߊ߬ ߕߐ߮ ߟߊߘߏ߲߬ߣߍ߲ ߣߌ߲߬ ߓߘߊ߫ ߓߊ߲߫ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫.\nߕߐ߯ ߜߘߍ߫ ߛߎߥߊ߲ߘߌ߫ ߖߊ߰ߣߌ߲߬.",
+       "loginerror": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߝߎ߬ߕߎ߲߬ߕߌ",
+       "createacct-error": "ߖߊ߬ߕߋ߬ߘߊ߰ ߟߊ߬ߞߊ ߝߎ߬ߕߎ߲߬ߕߌ",
+       "createaccounterror": "ߖߊ߬ߕߋ߬ߘߊ߬ ߕߍ߫ ߣߊ߬ ߛߐ߲߬ ߠߊ߫ ߛߌ߲ߘߌ߫ ߟߊ߫: $1",
+       "nouserspecified": "ߌ ߞߊߞߊ߲߫ ߞߊ߬ ߕߐ߯ ߟߊߓߊ߯ߙߕߊ߫ ߞߋߟߋ߲߫ ߡߊߕߍ߰",
+       "login-userblocked": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ ߓߊ߬ߟߊ߲߬ߣߍ߲߫ ߠߋ߫. ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߠߊߘߌ߬ߢߍ߬ߣߍ߲߬ ߕߍ߫.",
+       "wrongpassword": "ߟߊ߬ߓߊ߰ߙߊ߬ ߕߐ߮ ߓߍ߲߬ ߣߍ߲߬ ߕߍ߫ ߥߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߠߊߘߏ߲߬ߣߍ߲.\nߖߊ߰ߣߌ߲߬ ߌ ߦߴߊ߬ ߡߊߝߍߣߍ߲߫ ߕߎ߲߯.",
+       "wrongpasswordempty": "ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߠߊߘߏ߲߬ߣߍ߲ ߘߐߞߏߟߏ߲ ߠߋ߬ ߕߘߍ߬.\nߊ߬ ߡߊߝߍߣߍ߲߫ ߌ ߞߐ߫ ߖߊ߰ߣߌ߲߬.",
+       "passwordtooshort": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߞߊߣߊ߬ ߘߛߍ߫ {{PLURAL:$1|ߛߓߍߘߋ߲|ߛߓߍߘߋ߲ ߠߎ߬$1}} ߘߐ߫.",
+       "passwordtoolong": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊ߲߫ ߞߊ߲߫ ߞߊ߬ ߖߊ߲߰ߧߊ߬ {{PLURAL:$1|ߛߓߍߘߋ߲ ߁|$1 ߛߓߍߘߋ߲ ߠߎ߬}}.",
+       "passwordtoopopular": " ߝߘߏ߬ߓߊ߬ ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߡߊߟߐ߲ߣߍ߲ ߠߎ߬ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߟߊߓߊ߯ߙߊߊ߫ ߟߊ߫. ߌ ߦߋ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߜߘߍ߫ ߛߎߥߊ߲ߘߌ߫ ߖߊ߰ߣߌ߲߬ ߡߍ߲ ߡߊߟߐ߲߫ ߜߏߡߊ߲߫.",
+       "passwordinlargeblacklist": "ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߠߊߘߏ߲߬ߣߍ߲ ߦߋ߫ ߝߘߏ߬ߓߊ߬ ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߡߊߟߐ߲ߣߍ߲ߓߊ ߟߎ߬ ߛߙߍߘߍ ߟߋ߬ ߘߐ߫.\nߖߊ߰ߣߌ߲߬ ߌ ߦߋ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߦߙߋߞߋ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫.",
+       "mailmypassword": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߦߟߍ߬ߡߊ߲߬",
+       "passwordremindertitle": "{{SITENAME}} ߕߊ߬ߡߌ߲߬ߞߊ߲ ߕߎ߬ߡߊ߬ߞߎ߲߬ߡߊ ߞߎߘߊ",
+       "emailauthenticated": "ߌ ߟߊ߫ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߟߊߛߙߋߦߊ߫ ߘߊ߫ $3 $2 ߟߊ߫",
        "loginlanguagelabel": "ߞߊ߲ $1",
        "pt-login": "ߌ ߜߊ߲߬ߞߎ߲߬",
        "pt-login-button": "ߌ ߜߊ߲߬ߞߎ߲߬",
        "newpassword": "ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ",
        "retypenew": "ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ ߡߊߛߊ߬ߦߌ߬",
        "resetpass_submit": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߠߊߘߏ߲߬ ߞߵߌ ߜߊ߲߬ߞߎ߲߬",
+       "botpasswords-label-appid": "ߓߏߕ ߕߐ߮:",
+       "botpasswords-label-create": "ߊ߬ ߛߌ߲ߘߌ߫",
+       "botpasswords-label-cancel": "ߊ߬ ߘߐߛߊ߬",
+       "botpasswords-label-delete": "ߊ߬ ߖߏ߬ߛߌ߬",
+       "botpasswords-label-resetpassword": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߦߟߍ߬ߡߊ߲߬",
+       "resetpass_forbidden": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߕߴߛߋ߫ ߡߊߝߊ߬ߘߋ߲߬ ߠߊ߫.",
+       "resetpass_forbidden-reason": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߕߴߛߋ߫ ߡߊߝߊ߬ߟߋ߲߬ ߠߊ߫: $1",
+       "resetpass-no-info": "ߌ ߦߴߌ ߜߊ߲߬ߞߎ߲߬ ߡߎߣߎ߲߬ ߞߣߊ߬ ߕߏ߫ ߞߐߜߍ ߣߌ߲߬ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫.",
+       "resetpass-submit-loggedin": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬",
+       "resetpass-submit-cancel": "ߊ߬ ߘߐߛߊ߬",
+       "resetpass-temp-password": "ߕߊߡߌ߲ߞߊ߲ ߕߎ߬ߡߊ߬ߞߎ߲߬ߡߊ",
        "passwordreset": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߦߟߍ߬ߡߊ߲߬",
+       "changeemail-oldemail": "ߕߋ߲߭ߕߋ߲߭ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ",
+       "changeemail-newemail": "ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ߫ ߞߎߘߊ",
+       "changeemail-password": "ߌ ߟߊ߫ {{SITENAME}} ߕߊ߬ߡߌ߲߬ߞߊ߲",
        "bold_sample": "ߛߓߍߘߋ߲߫ ߞߎ߲ߓߊ",
        "bold_tip": "ߛߓߍߘߋ߲߫ ߞߎ߲ߓߊ",
        "italic_sample": "ߛߓߍߟߌ߫ ߡߊߖߍ߲߬ߞߍ߬ߣߍ߲",
        "minoredit": "ߣߌ߲߬ ߦߋ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߘߋ߬ߣߍ߲ ߘߏ߫ ߟߋ߬ ߘߌ߫",
        "watchthis": "ߘߐߜߍ ߣߌ߲߬ ߘߐߜߍ߫",
        "savearticle": "ߊ߬ ߟߊߞߎ߲߬ߘߎ߬",
+       "savechanges": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߊߞߎ߲߬ߘߎ߬",
+       "publishpage": "ߞߐߜߍ ߟߊߥߊ߲߬ߞߊ߲߬",
+       "publishchanges": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߊߥߊ߲߬ߞߊ߬",
        "savearticle-start": "ߞߐߜߍ ߟߊߞߎ߲߬ߘߎ߬",
        "savechanges-start": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߊߞߎ߲߬ߘߎ߬",
+       "publishpage-start": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߊߥߊ߲߬ߞߊ߬",
+       "publishchanges-start": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߊߥߊ߲߬ߞߊ߬",
        "preview": "ߊ߬ ߘߐߜߍ߫ ߡߎߣߎ߲߬",
        "showpreview": "ߢߍߦߋߟߌ ߘߐߜߍ߫",
        "showdiff": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ ߠߎ߫ ߦߌ߬ߘߊ߬",
+       "blankarticle": "<strong>ߖߊ߲߬ߓߌ߬ߟߊ߬ߟߌ</strong> ߌ ߦߋ߫ ߞߐߜߍ ߡߍ߲ ߛߌ߲ߘߌ ߞߊ߲߬ ߣߌ߲߬߸ ߊ߬ ߘߐߞߏߟߏ߲ ߠߋ߬.\nߣߴߌ ߞߊ߬  \"$1\" ߛߐ߲߬ߞߌ߲߫ ߡߎ߬ߕߎ߲߬߸ ߞߐߜߍ ߘߌ߫ ߛߌ߲ߘߌ߫ ߞߵߊ߬ ߕߘߍ߬ ߞߣߐߘߐ ߛߎ߯-ߎ߯-ߛߎ߫ ߕߴߊ߬ ߞߣߐ߫.",
        "anoneditwarning": "<strong>Warning:</strong> ߌ ߜߊ߲߬ߞߎ߲߬ߣߍ߲߬ ߕߍ߫.ߌ ߓߊ߯ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߛߎ߯-ߎ߯-ߛߎ߫ ߞߍ߫߸ ߌ ߟߊ߫ IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߘߌ߫ ߞߍ߫ ߦߋߕߊ ߘߌ߫.ߣߴߌ ߞߊ߬ ߜߊ߲߬ߞߎ߲߬ߠߌ߲߬ ߖߐ߲ߖߐ߲ ߞߍ߫ ߕߎ߬ߡߊ ߡߍ߲ <strong>[$1 log in]</strong> or <strong>[$2 create an account]</strong> ߌ ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߣߍ߲ ߠߎ߬ ߘߌ߫ ߓߌ߬ߟߊ߬ ߌ ߜߊ߲߬ߞߎ߲߬ ߕߐ߮ ߟߊ߫߸ ߊ߬ ߣߌ߫ ߣߝߊ߬ ߜߘߍ߫ ߟߎ߫.",
        "anonpreviewwarning": "<em>ߌ ߜߊ߲߬ߞߎ߲߬ߣߍ߲߬ ߕߍ߫. ߟߊ߬ߞߎ߲߬ߘߎ߬ߟߌ ߘߴߌ ߟߊ߫ IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߟߊߡߙߊ߬ ߞߐߜߍ ߣߌ߲߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߘߐ߬ߝߐ ߘߐ߫</em>",
        "blockedtext": "<strong>ߌ ߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ ߕߐ߮ ߥߟߊ߫ IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߓߘߊ߫ ߓߊ߬ߟߊ߲߬߸</strong>\n\nߌ ߓߊ߬ߟߊ߲߬ߣߍ߲߬ ߦߋ߫ $1 ߟߋ߬ ߓߟߏ߫.\nߞߎ߲߭ ߡߍ߲ ߦߴߊ߬ ߟ߫ߊ߫ <em>$2</em>.\n\n•ߓߊ߬ߟߊ߲߬ߠߌ߲ ߘߊߡߌ߬ߣߊ: $8\n•ߓߊ߬ߟߊ߲߬ߠߌ߲ ߛߕߊ ߝߊ: $6\n•ߓߊ߬ߟߊ߲߬ߠߌ߲ ߘߊ߬ߟߎ: $7 \n\nߌ ߘߌ߫ ߛߋ߫ ߗߋߛߓߍ ߗߋ߫ ߟߊ߫ $1 ߡߊ߬ ߥߟߊ߫ ߡߐ߰ ߜߘߍ߫ \n[[{{MediaWiki:Grouppage-sysop}}|administrator]] ߞߊ߬ ߘߊߘߐߖߊߥߏ ߞߍ߫ ߓߊ߬ߟߊ߲߬ߠߌ߲ ߞߊ߲߬.\nߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫  \"{{int:emailuser}}\" ߟߊߓߊ߯ߙߊ߫ ߟߊ߫߸ ߟߊ߬ߓߊ߰ߙߊ߬ߢߊ߬ ߖߐ߲ߖߐ߲ ߡߍ߲ ߦߋ߫ ߦߋ߲߬߸ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ߫ ߖߐ߲ߖߐ߲߫ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߘߏ߫ ߦߴߌ ߟߊ߫ [[Special:Preferences|account preferences]] ߘߐ߫߸ ߊ߬ ߣߴߌ ߡߊ߫ ߓߊ߬ߟߊ߲߬ ߊ߬ ߟߊߓߊ߯ߙߊ ߞߏߛߐ߲߬ ߘߋ߫. ߌ ߟߊ߫ IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߦߋ߫ $3 ߟߋ߬ ߘߌ߫ ߕߊ߲߬߸ ߊ߬ ߣߴߌ ߟߊ߫ ߛߊ߲߬ߓߊ߬ߕߐ߮ ߓߊ߬ߟߊ߲߬ߣߍ߲ ߦߋ߫ #$5 ߟߋ߬ ߘߌ߫.\nߖߊ߰ߣߌ߲߬ ߌ ߦߋ߫ ߛߊ߲ߝߍ߫ ߝߊߙߊ߲ߝߊ߯ߛߌ ߣߌ߲߬ ߓߍ߯ ߟߊߘߏ߲߬ ߌ ߟߊ߫ ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ ߘߐ߫.",
        "loginreqlink": "ߌ ߜߊ߲߬ߞߎ߲߬",
+       "newarticle": "(ߞߎߘߊ)",
        "newarticletext": "ߌ ߓߘߊ߫ ߛߘߌ߬ߜߋ߲ ߘߏ߫ ߟߊߓߊ߬ߕߏ߬ ߞߐߜߍ ߘߏ߫ ߘߐ߫߸ ߡߍ߲ ߕߴߦߋ߲߬ ߡߎߣߎ߲߬.\nߣߵߌ ߦߴߊ߬ ߝߍ߫ ߞߊ߬ ߞߐߜߍ ߘߏ߫ ߟߊߘߊ߲߫߸ ߛߓߍߟߌ ߘߊߡߌ߬ߣߊ߬ ߘߎ߰ߟߊ߬ߘߐ߫ ߞߏ߲ߘߏ ߘߐ߫ (ߞߊ߬ [$1 ߘߍ߬ߡߍ߲߬ߠߌ߲ ߞߐߜߍ] ߦߋ߫߸ ߖߐ߲߬ߛߊ߬ ߌ ߘߌ߫ ߞߌ߬ߓߊ߬ߙߏ߬ ߖߐ߲ߖߐ߲ ߛߐ߬ߘߐ߲߬). ߣߵߌ ߘߏ߲߬ ߞߍ߫ ߘߊ߫ ߦߊ߲߬ ߝߎ߬ߕߎ߲߬ߕߌ߬ ߓߟߏߡߊ߬߸ ߌ ߟߊ߫ ߛߏ߲߯ߓߊߟߊ߲ <strong>back</strong> ߛߐ߲߬ߞߌ߲߫.",
        "anontalkpagetext": "----\n<em>ߓߊ߬ߘߏ߬ ߞߐߜߍ ߣߌ߲߬ ߦߋ߫ ߟߊߓߊ߯ߙߟߊ߫ ߟߐ߲ߓߊߟߌ ߟߋ߬ ߓߟߏ߫ ߡߍ߲ ߡߊ߫ ߖߊ߬ߕߋ߬ߘߊ߬ ߛߌ߲ߘߌ߫ ߡߎߣߎ߲߬ ߥߟߴߊ߬ ߕߍ߫ ߖߊ߬ߕߋ߬ߘߊ ߏ߬ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫;</em>\nߏ߬ ߞߏߛߐ߲߬ ߊ߲ ߞߊ߫ ߞߊ߲߫ ߞߵߊ߬ ߟߊ߫ ߓߡ (ߓߟߐߟߐ ߡߛߍ߬ߞߍ߬ߡߛߍߞߍ) ߛߊ߲߬ߓߊ߬ߕߐ߮ ߟߊߓߊ߯ߙߴߊ߬ ߡߊߟߐ߲߫ ߞߊߡߊ߬߸ ߟߊߓߊ߯ߙߟߊ߫ ߛߌߦߊߡߊ߲߫ ߓߴߛߋ߫ ߞߊ߬ ߘߍ߬ ߓߡ ߛߊ߲߬ߓߊ߬ߕߐ߮ ߣߌ߲߬ ߢߐ߲߰ ߠߊ߫.\nߣߴߌ ߞߍ߫ ߘߊ߫ ߟߊߓߊ߯ߙߟߊ߫ ߡߊߝߟߌ߬ߣߍ߲߫ ߘߌ߫ ߞߵߊ߬ ߛߏ߬ߓߌ߬ ߞߏ߫ ߌ ߟߊ߫ ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߕߴߌ ߕߊ߫ ߘߌ߫ ߊ߬ ߘߌ߫ ߟߐ߬ ߌ ߡߊ߬ ߌߞߘߐ߫߸ ߌ ߖߏ߫ ߞߊ߬ [[Special:CreateAccount|ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߘߊߦߟߍ߬]] ߥߟߊ߫ [[Special:UserLogin|ߞߊ߬ ߘߏ߲߬ߕߐ߰ߟߊ߬ߘߏ߲ ߞߍ߫]] ߖߐ߲߬ߛߊ߫ ߟߏ߲ߘߐ߬ ߓߊߛߌ߯ߓߊߟߌߦߊ ߘߌ߫ ߡߟߊ߫ ߟߊߓߊ߯ߙߟߊ߫ ߡߊߟߐ߲ߓߊߟߌ߫ ߜߘߍ ߟߎ߬ ߓߟߏ߫.",
        "noarticletext": "ߛߓߍߟߌ߫ ߛߌ߫ ߕߍ߫ ߞߐߜߍ ߣߌ߲߭ ߞߊ߲߬ ߕߋ߲߫. ߌ ߘߌ߫ ߛߋ߫ ߞߐߜߍ ߣߌ߲߬ \n [[Special:Search/{{PAGENAME}}|search for this page title]] ߕߐ߮ ߢߌߣߌ߲߫ ߠߊ߫ ߞߐߜߍ ߕߐ߭ ߟߎ߬ ߘߐ߫߸  \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} create this page]</span>.",
        "cur": "ߞߍߞߎߘߊ",
        "next": "ߢߍߕߊ",
        "last": "ߢߍߕߊ",
+       "page_first": "ߝߟߐ",
+       "page_last": "ߟߊ߬ߓߊ߲",
        "histlegend": "ߝߘߏ߬ߢߐ߲߰ߡߊ ߡߊߡߌ߬ߘߊ: ߓߊߓߌߟߊߟߌ߫ ߞߏ߲ߘߏ ߡߊߡߌ߬ߘߊ߬ ߟߊߢߐ߲߯ߡߊ߫ ߞߊߡߊ߬߸ ߊ߬ ߣߌ߫ ߞߊ߬ ߟߊߢߐ߲߯ߡߊ߫ ߞߘߎ ߛߐ߲߬ߞߌ߲߫ ߊ߬ ߣߌ߫ ߓߊ߫ ߡߊߡߌ߬ߣߊ߬ߣߍ߲ ߕߍ߫ ߥߟߊ߫ ߞߎ߬ߘߎ ߡߍ߲ ߦߋ߫ ߘߎ߰ߟߊ߫. < br/> Legend: ({{int: cur}}) = ߓߐߢߐ߲߯ߡߊ ߡߍ߲ ߦߋ߫ ߕߋ߲߬ߕߋ߲߬ ߓߊ ߟߊ߫߸ ({{int: ߟߊߓߊ߲}}) = ߓߐߢߐ߲߯ߡߊ ߡߍ߲ ߦߋ߫ ߓߊ߫ ߕߊ߬ߡߌ߲߬ߣߍ߲ ߝߍ߬߸ {{int: ߢߟߊߞߎߘߦߊ߫ ߞߏߘߋߞߏߘߋ}} = ߛߊߞߍߟߌ߫ ߝߕߌߣߍ߲߫.",
        "history-fieldset-title": "ߣߐ߬ߡߊ߬ߛߊߦߌ߲ ߠߎ߬ ߛߍ߲ߛߍ߲߫",
        "histfirst": "ߞߘߐ߬ߡߊ߲ ߠߎ߬",
index 45e0bac..c795371 100644 (file)
        "mw-widgets-abandonedit-discard": "Porzuć zmiany",
        "mw-widgets-abandonedit-keep": "Kontynuuj edycję",
        "mw-widgets-abandonedit-title": "Na pewno?",
+       "mw-widgets-copytextlayout-copy": "Skopiuj",
+       "mw-widgets-copytextlayout-copy-fail": "Kopiowanie do schowka nie powiodło się.",
+       "mw-widgets-copytextlayout-copy-success": "Skopiowano do schowka.",
        "mw-widgets-dateinput-no-date": "Nie wybrano daty",
        "mw-widgets-dateinput-placeholder-day": "RRRR-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "RRRR-MM",
index e911b3c..3f2b4b0 100644 (file)
        "mw-widgets-abandonedit-discard": "Descartar edições",
        "mw-widgets-abandonedit-keep": "Continuar editando",
        "mw-widgets-abandonedit-title": "Tem certeza?",
+       "mw-widgets-copytextlayout-copy": "Copiar",
+       "mw-widgets-copytextlayout-copy-fail": "Falha ao copiar para a área de transferência.",
+       "mw-widgets-copytextlayout-copy-success": "Copiado para a área de transferência.",
        "mw-widgets-dateinput-no-date": "Nenhuma data selecionada",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
index ab6e350..2154ada 100644 (file)
        "mw-widgets-abandonedit-discard": "Descartar edições",
        "mw-widgets-abandonedit-keep": "Continuar a editar",
        "mw-widgets-abandonedit-title": "Tem a certeza?",
+       "mw-widgets-copytextlayout-copy": "Copiar",
        "mw-widgets-dateinput-no-date": "Não foi selecionada nenhuma data",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
index 683e975..44ef8b0 100644 (file)
        "mw-widgets-abandonedit-title": "Title of the dialog shown when the user tries to leave the editor without saving their changes.\n\nFollowed by the following buttons:\n* {{msg-mw|mw-widgets-abandonedit-discard}}\n* {{msg-mw|mw-widgets-abandonedit-keep}}\n{{Identical|Are you sure?}}",
        "mw-widgets-copytextlayout-copy": "Label of button to copy text to clipboard.",
        "mw-widgets-copytextlayout-copy-fail": "Message shown when copying to clipboard failed.",
-       "mw-widgets-copytextlayout-copy-success": "Message shown when copying to clipboard failed.",
+       "mw-widgets-copytextlayout-copy-success": "Message shown when copying to clipboard worked.",
        "mw-widgets-dateinput-no-date": "Label of a date input field when no date has been selected.",
        "mw-widgets-dateinput-placeholder-day": "[[File:DateInputWidget active, empty.png|frame|Screenshot]]\nPlaceholder displayed in a date input field when it's empty, representing a date format with 4 digits for year, 2 digits for month, and 2 digits for day, separated with hyphens. This should be uppercase, if possible, and must not include any additional explanations. If there is no good way to translate it, make this message blank.",
        "mw-widgets-dateinput-placeholder-month": "Placeholder displayed in a date input field when it's empty, representing a date format with 4 digits for year and 2 digits for month, separated with hyphens (without a day). This should be uppercase, if possible, and must not include any additional explanations. If there is no good way to translate it, make this message blank.",
index f65f312..c60aecb 100644 (file)
        "mw-widgets-abandonedit-discard": "Scitte le cangiaminde",
        "mw-widgets-abandonedit-keep": "Condinue a cangià",
        "mw-widgets-abandonedit-title": "Sì secure?",
+       "mw-widgets-copytextlayout-copy": "Copie",
+       "mw-widgets-copytextlayout-copy-success": "Copiate jndr'à l'appunde",
        "mw-widgets-dateinput-no-date": "Nisciune date scacchiate",
        "mw-widgets-mediasearch-input-placeholder": "Cirche le media",
        "mw-widgets-mediasearch-noresults": "Nisciune resultate acchiate.",
index e5c8899..7687584 100644 (file)
                        "Edward Chernenko",
                        "Romanko Mikhail",
                        "Diralik",
-                       "1233qwer1234qwer4"
+                       "1233qwer1234qwer4",
+                       "Саша Волохов"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "mw-widgets-abandonedit-discard": "Отменить правки",
        "mw-widgets-abandonedit-keep": "Продолжить редактирование",
        "mw-widgets-abandonedit-title": "Вы уверены?",
+       "mw-widgets-copytextlayout-copy": "Скопировать",
+       "mw-widgets-copytextlayout-copy-fail": "Не удалось скопировать данные в буфер обмена.",
+       "mw-widgets-copytextlayout-copy-success": "Скопировано в буфер обмена.",
        "mw-widgets-dateinput-no-date": "Дата не выбрана",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
index 6eda32b..ae331b9 100644 (file)
        "disclaimerpage": "Project:Avertèntzias generales",
        "edithelp": "Agiudu pro su càmbiu o s'iscritura",
        "helppage-top-gethelp": "Agiudu",
-       "mainpage": "Pàgina Base",
+       "mainpage": "Pàgina printzipale",
        "mainpage-description": "Pàgina printzipale",
        "policy-url": "Project:Polìticas",
        "portal": "Portale comunidade",
index 597c591..cb440a0 100644 (file)
        "logentry-upload-overwrite": "$1 نے $3 دا نواں نسخہ {{GENDER:$2|اپلوڈ کیتا}}",
        "searchsuggest-search": "ڳولو",
        "duration-days": "$1 {{PLURAL:$1|ݙینہ}}",
+       "mw-widgets-copytextlayout-copy": "نقل کرو",
        "mw-widgets-titlesmultiselect-placeholder": "ٻیا شامل کرو۔۔۔",
        "randomrootpage": "بے ترتيب بنیادی ورقہ"
 }
index c0f8f55..767546d 100644 (file)
        "mw-widgets-abandonedit-discard": "Zavrzi urejanja",
        "mw-widgets-abandonedit-keep": "Nadaljuj z urejanjem",
        "mw-widgets-abandonedit-title": "Ste prepričani?",
+       "mw-widgets-copytextlayout-copy": "Kopiraj",
+       "mw-widgets-copytextlayout-copy-fail": "Kopiranje v odložišče je spodletelo.",
+       "mw-widgets-copytextlayout-copy-success": "Kopirano v odložišče.",
        "mw-widgets-dateinput-no-date": "Datum ni izbran",
        "mw-widgets-dateinput-placeholder-day": "LLLL-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "LLLL-MM",
index 0a2da29..071b97e 100644 (file)
        "lastmodifiedatby": "Ovu stranicu je poslednji put {{GENDER:$4|uredio|uredila|uredio}} $3, na datum $1 u $2 č.",
        "othercontribs": "Zasnovano na radu korisnika $1.",
        "others": "drugi",
-       "siteusers": "{{PLURAL:$2|1={{GENDER:$1|suradnika|suradnice}}|suradnica i suradnika}} na projektu {{SITENAME}} $1",
+       "siteusers": "{{PLURAL:$2|1={{GENDER:$1|korisnik|korisnica}}|korisnici}} na projektu {{SITENAME}} $1",
        "anonusers": "{{PLURAL:$2|anoniman korisnik|anonimni korisnici}} na projektu {{SITENAME}} $1",
        "creditspage": "Autori stranice",
        "nocredits": "Ne postoje podaci o autoru ove stranice.",
        "feedback-thanks": "Hvala! Vaša povratna informacija je postavljena na stranicu „[$2 $1]“.",
        "feedback-thanks-title": "Hvala vam!",
        "feedback-useragent": "Korisnički agent:",
-       "searchsuggest-search": "Pretraga",
+       "searchsuggest-search": "Pretraga projekta {{SITENAME}}",
        "searchsuggest-containing": "sadrži…",
        "api-error-badtoken": "Unutrašnja greška: loš token.",
        "api-error-emptypage": "Pravljenje novih praznih stranica nije dozvoljeno.",
index 886e81f..99cfe94 100644 (file)
        "special-characters-title-endash": "ఎన్ డాష్",
        "special-characters-title-emdash": "ఎమ్ డాష్",
        "special-characters-title-minus": "మైనస్ గుర్తు",
+       "mw-widgets-copytextlayout-copy": "కాపీచేయి",
        "mw-widgets-dateinput-no-date": "ఏ తేదీనీ ఎంచుకోలేదు",
        "mw-widgets-mediasearch-input-placeholder": "మీడియా కోసం వెతకండి",
        "mw-widgets-mediasearch-noresults": "ఫలితాలేమీ దొరకలేదు.",
index 2b2d98b..9ef0dbb 100644 (file)
        "mw-widgets-abandonedit-discard": "ทิ้งการแก้ไข",
        "mw-widgets-abandonedit-keep": "แก้ไขต่อ",
        "mw-widgets-abandonedit-title": "คุณแน่ใจหรือไม่",
+       "mw-widgets-copytextlayout-copy": "คัดลอก",
        "mw-widgets-dateinput-no-date": "ไม่เลือกวันที่",
        "mw-widgets-mediasearch-input-placeholder": "ค้นหาสื่อ",
        "mw-widgets-mediasearch-noresults": "ไม่พบผลลัพธ์",
index b3f6ced..8c05555 100644 (file)
        "mw-widgets-abandonedit-discard": "Покинути редагування",
        "mw-widgets-abandonedit-keep": "Продовжити редагування",
        "mw-widgets-abandonedit-title": "Ви впевнені?",
+       "mw-widgets-copytextlayout-copy": "Копіювати",
+       "mw-widgets-copytextlayout-copy-fail": "Не вдалося скопіювати до буфера обміну.",
+       "mw-widgets-copytextlayout-copy-success": "Скопійовано в буфер обміну.",
        "mw-widgets-dateinput-no-date": "Дати не вибрано",
        "mw-widgets-dateinput-placeholder-day": "РРРР-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "РРРР-ММ",
index 8829b5a..09e0caa 100644 (file)
        "savechanges": "Oʻzgarishlarni saqlash",
        "publishpage": "Sahifani chop etish",
        "publishchanges": "Oʻzgarishlarni chop etish",
+       "savearticle-start": "Sahifa saqlanmoqda...",
+       "savechanges-start": "O‘zgarishlar saqlanmoqda...",
        "preview": "Ko‘rib chiqish",
        "showpreview": "Koʻrib chiqish",
        "showdiff": "Kiritilgan o‘zgarishlar",
        "special-characters-title-emdash": "uzun tire",
        "special-characters-title-minus": "minus belgisi",
        "mw-widgets-abandonedit": "Siz haqiqatdan ham oʻzgarishlarni saqlamasdan koʻrish tartibiga oʻtishni xohlaysizmi?",
+       "mw-widgets-abandonedit-discard": "Tahrirlarni bekor qilish",
+       "mw-widgets-abandonedit-keep": "Tahrirlashni davom ettirish",
+       "mw-widgets-abandonedit-title": "Ishonchingiz komilmi?",
        "log-action-filter-block": "Chetlatish turi:",
        "log-action-filter-rights": "Huquqlarni oʻzgartirish turi:",
        "log-action-filter-all": "Barchasi",
index d0115ea..666b28f 100644 (file)
@@ -37,13 +37,6 @@ $digitTransformTable = null;
  */
 $separatorTransformTable = null;
 
-/**
- * Extra user preferences, which will be shown in Special:Preferences as
- * checkboxes. Extra settings in derived languages will automatically be
- * appended to the array of the fallback languages.
- */
-$extraUserToggles = [];
-
 /**
  * URLs do not specify their encoding. UTF-8 is used by default, but if the
  * URL is not a valid UTF-8 sequence, we have to try to guess what the real
index e681a04..bb41a91 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Benchmark for Squid purge.
+ * Benchmark for CDN purge.
  *
  * 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
 require_once __DIR__ . '/Benchmarker.php';
 
 /**
- * Maintenance script that benchmarks Squid purge.
+ * Maintenance script that benchmarks CDN purge.
  *
  * @ingroup Benchmark
  */
 class BenchmarkPurge extends Benchmarker {
        public function __construct() {
                parent::__construct();
-               $this->addDescription( 'Benchmark the Squid purge functions.' );
+               $this->addDescription( 'Benchmark the CDN purge functions.' );
        }
 
        public function execute() {
-               global $wgUseSquid, $wgSquidServers;
-               if ( !$wgUseSquid ) {
-                       $this->fatalError( "Squid purge benchmark doesn't do much without squid support on." );
+               global $wgUseCdn, $wgCdnServers;
+
+               if ( !$wgUseCdn ) {
+                       $this->error( "CDN purge benchmark doesn't do much without CDN support on." );
                } else {
-                       $this->output( "There are " . count( $wgSquidServers ) . " defined squid servers:\n" );
+                       $this->output( "There are " . count( $wgCdnServers ) . " defined CDN servers:\n" );
                        if ( $this->hasOption( 'count' ) ) {
                                $lengths = [ intval( $this->getOption( 'count' ) ) ];
                        } else {
@@ -47,7 +48,7 @@ class BenchmarkPurge extends Benchmarker {
                        }
                        foreach ( $lengths as $length ) {
                                $urls = $this->randomUrlList( $length );
-                               $trial = $this->benchSquid( $urls );
+                               $trial = $this->benchCdn( $urls );
                                $this->output( $trial . "\n" );
                        }
                }
@@ -55,12 +56,12 @@ class BenchmarkPurge extends Benchmarker {
 
        /**
         * Run a bunch of URLs through CdnCacheUpdate::purge()
-        * to benchmark Squid response times.
+        * to benchmark CDN response times.
         * @param array $urls A bunch of URLs to purge
         * @param int $trials How many times to run the test?
         * @return string
         */
-       private function benchSquid( $urls, $trials = 1 ) {
+       private function benchCdn( $urls, $trials = 1 ) {
                $start = microtime( true );
                for ( $i = 0; $i < $trials; $i++ ) {
                        CdnCacheUpdate::purge( $urls );
index 81fb5e3..8f47b16 100644 (file)
@@ -136,9 +136,9 @@ class PurgeChangedPages extends Maintenance {
                                }
                        }
 
-                       // Send batch of purge requests out to squids
-                       $squid = new CdnCacheUpdate( $urls, count( $urls ) );
-                       $squid->doUpdate();
+                       // Send batch of purge requests out to CDN servers
+                       $cdn = new CdnCacheUpdate( $urls, count( $urls ) );
+                       $cdn->doUpdate();
 
                        if ( $this->hasOption( 'sleep-per-batch' ) ) {
                                // sleep-per-batch is milliseconds, usleep wants micro seconds.
index 16a62f4..d558c47 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Send purge requests for listed pages to squid
+ * Send purge requests for listed pages to CDN
  *
  * 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
 require_once __DIR__ . '/Maintenance.php';
 
 /**
- * Maintenance script that sends purge requests for listed pages to squid.
+ * Maintenance script that sends purge requests for listed pages to CDN.
  *
  * @ingroup Maintenance
  */
 class PurgeList extends Maintenance {
        public function __construct() {
                parent::__construct();
-               $this->addDescription( 'Send purge requests for listed pages to squid' );
+               $this->addDescription( 'Send purge requests for listed pages to CDN' );
                $this->addOption( 'purge', 'Whether to update page_touched.', false, false );
                $this->addOption( 'namespace', 'Namespace number', false, true );
                $this->addOption( 'all', 'Purge all pages', false, false );
@@ -120,7 +120,7 @@ class PurgeList extends Maintenance {
 
        /**
         * Helper to purge an array of $urls
-        * @param array $urls List of URLS to purge from squids
+        * @param array $urls List of URLS to purge from CDNs
         */
        private function sendPurgeRequest( $urls ) {
                if ( $this->hasOption( 'delay' ) ) {
index bd3281a..15ec62d 100644 (file)
@@ -36,7 +36,7 @@ if ( $wgRequest->getVal( 'ctype' ) == 'application/xml' ) {
 $response = $wgRequest->response();
 $response->header( "Content-type: $ctype" );
 
-// Set an Expires header so that squid can cache it for a short time
+// Set an Expires header so that CDN can cache it for a short time
 // Short enough so that the sysadmin barely notices when $wgSitename is changed
 $expiryTime = 600; # 10 minutes
 $response->header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + $expiryTime ) . ' GMT' );
index 1b8cffb..483e374 100644 (file)
@@ -2027,6 +2027,7 @@ return [
                        'resources/src/mediawiki.special/userrights.css',
                        'resources/src/mediawiki.special/watchlist.css',
                        'resources/src/mediawiki.special/block.less',
+                       'resources/src/mediawiki.special/blocklist.less',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -2129,10 +2130,6 @@ return [
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
-       'mediawiki.special.blocklist' => [
-               'styles' => 'resources/src/mediawiki.special/blocklist.less',
-               'targets' => [ 'desktop', 'mobile' ],
-       ],
        'mediawiki.special.changecredentials.js' => [
                'scripts' => 'resources/src/mediawiki.special.changecredentials.js',
                'dependencies' => [
index afc6bb5..ebd9f1d 100644 (file)
@@ -526,9 +526,9 @@ class OutputPageTest extends MediaWikiTestCase {
                                function ( $op ) {
                                        $op->getContext()->setUser( $this->getTestUser()->getUser() );
                                } ],
-                       'After Squid expiry' =>
+                       'After CDN expiry' =>
                                [ $lastModified, $lastModified, false,
-                                       [ 'UseSquid' => true, 'SquidMaxage' => 3599 ] ],
+                                       [ 'UseCdn' => true, 'CdnMaxAge' => 3599 ] ],
                        'Hook allows cache use' =>
                                [ $lastModified + 1, $lastModified, true, [],
                                function ( $op, $that ) {
@@ -2225,7 +2225,7 @@ class OutputPageTest extends MediaWikiTestCase {
        }
 
        public function provideAdaptCdnTTL() {
-               global $wgSquidMaxage;
+               global $wgCdnMaxAge;
                $now = time();
                self::$fakeTime = $now;
                return [
@@ -2234,7 +2234,7 @@ class OutputPageTest extends MediaWikiTestCase {
                        'Five minutes from now' => [ [ $now + 300 ], IExpiringStore::TTL_MINUTE ],
                        'Five minutes ago, initial maxage four minutes' =>
                                [ [ $now - 300 ], 270, [ 'initialMaxage' => 240 ] ],
-                       'A very long time ago' => [ [ $now - 1000000000 ], $wgSquidMaxage ],
+                       'A very long time ago' => [ [ $now - 1000000000 ], $wgCdnMaxAge ],
                        'Initial maxage zero' => [ [ $now - 300 ], 270, [ 'initialMaxage' => 0 ] ],
 
                        'false' => [ [ false ], IExpiringStore::TTL_MINUTE ],
index cda5660..0d5c59b 100644 (file)
@@ -391,7 +391,7 @@ class WebRequestTest extends MediaWikiTestCase {
         * @dataProvider provideGetIP
         * @covers WebRequest::getIP
         */
-       public function testGetIP( $expected, $input, $squid, $xffList, $private, $description ) {
+       public function testGetIP( $expected, $input, $cdn, $xffList, $private, $description ) {
                $this->setServerVars( $input );
                $this->setMwGlobals( [
                        'wgUsePrivateIPs' => $private,
@@ -405,7 +405,7 @@ class WebRequestTest extends MediaWikiTestCase {
                        ]
                ] );
 
-               $this->setService( 'ProxyLookup', new ProxyLookup( [], $squid ) );
+               $this->setService( 'ProxyLookup', new ProxyLookup( [], $cdn ) );
 
                $request = new WebRequest();
                $result = $request->getIP();
@@ -587,8 +587,8 @@ class WebRequestTest extends MediaWikiTestCase {
        public function testGetIpLackOfRemoteAddrThrowAnException() {
                // ensure that local install state doesn't interfere with test
                $this->setMwGlobals( [
-                       'wgSquidServersNoPurge' => [],
-                       'wgSquidServers' => [],
+                       'wgCdnServers' => [],
+                       'wgCdnServersNoPurge' => [],
                        'wgUsePrivateIPs' => false,
                        'wgHooks' => [],
                ] );
index 9cb84e2..a5518a1 100644 (file)
@@ -490,7 +490,7 @@ class ApiMainTest extends ApiTestCase {
         * @param int $status Expected response status
         * @param array $options Array of options:
         *   post => true Request is a POST
-        *   cdn => true CDN is enabled ($wgUseSquid)
+        *   cdn => true CDN is enabled ($wgUseCdn)
         */
        public function testCheckConditionalRequestHeaders(
                $headers, $conditions, $status, $options = []
@@ -508,7 +508,7 @@ class ApiMainTest extends ApiTestCase {
                $priv->mInternalMode = false;
 
                if ( !empty( $options['cdn'] ) ) {
-                       $this->setMwGlobals( 'wgUseSquid', true );
+                       $this->setMwGlobals( 'wgUseCdn', true );
                }
 
                // Can't do this in TestSetup.php because Setup.php will override it
@@ -531,7 +531,7 @@ class ApiMainTest extends ApiTestCase {
        }
 
        public static function provideCheckConditionalRequestHeaders() {
-               global $wgSquidMaxage;
+               global $wgCdnMaxAge;
                $now = time();
 
                return [
@@ -614,15 +614,15 @@ class ApiMainTest extends ApiTestCase {
                                [ [ 'If-Modified-Since' => 'a potato' ],
                                        [ 'last-modified' => wfTimestamp( TS_MW, $now - 1 ) ], 200 ],
 
-                       // Anything before $wgSquidMaxage seconds ago should be considered
+                       // Anything before $wgCdnMaxAge seconds ago should be considered
                        // expired.
                        'If-Modified-Since with CDN post-expiry' =>
-                               [ [ 'If-Modified-Since' => wfTimestamp( TS_RFC2822, $now - $wgSquidMaxage * 2 ) ],
-                                       [ 'last-modified' => wfTimestamp( TS_MW, $now - $wgSquidMaxage * 3 ) ],
+                               [ [ 'If-Modified-Since' => wfTimestamp( TS_RFC2822, $now - $wgCdnMaxAge * 2 ) ],
+                                       [ 'last-modified' => wfTimestamp( TS_MW, $now - $wgCdnMaxAge * 3 ) ],
                                        200, [ 'cdn' => true ] ],
                        'If-Modified-Since with CDN pre-expiry' =>
-                               [ [ 'If-Modified-Since' => wfTimestamp( TS_RFC2822, $now - $wgSquidMaxage / 2 ) ],
-                                       [ 'last-modified' => wfTimestamp( TS_MW, $now - $wgSquidMaxage * 3 ) ],
+                               [ [ 'If-Modified-Since' => wfTimestamp( TS_RFC2822, $now - $wgCdnMaxAge / 2 ) ],
+                                       [ 'last-modified' => wfTimestamp( TS_MW, $now - $wgCdnMaxAge * 3 ) ],
                                        304, [ 'cdn' => true ] ],
                ];
        }
index 106a13b..f7007e7 100644 (file)
@@ -356,11 +356,11 @@ class LBFactoryTest extends MediaWikiTestCase {
                $mockDB2->expects( $this->exactly( 1 ) )->method( 'lastDoneWrites' );
 
                // Nothing to wait for on first HTTP request start
-               $cp->initLB( $lb1 );
-               $cp->initLB( $lb2 );
+               $cp->applySessionReplicationPosition( $lb1 );
+               $cp->applySessionReplicationPosition( $lb2 );
                // Record positions in stash on first HTTP request end
-               $cp->shutdownLB( $lb1 );
-               $cp->shutdownLB( $lb2 );
+               $cp->storeSessionReplicationPosition( $lb1 );
+               $cp->storeSessionReplicationPosition( $lb2 );
                $cpIndex = null;
                $cp->shutdown( null, 'sync', $cpIndex );
 
@@ -395,11 +395,11 @@ class LBFactoryTest extends MediaWikiTestCase {
                );
 
                // Wait for last positions to be reached on second HTTP request start
-               $cp->initLB( $lb1 );
-               $cp->initLB( $lb2 );
+               $cp->applySessionReplicationPosition( $lb1 );
+               $cp->applySessionReplicationPosition( $lb2 );
                // Shutdown (nothing to record)
-               $cp->shutdownLB( $lb1 );
-               $cp->shutdownLB( $lb2 );
+               $cp->storeSessionReplicationPosition( $lb1 );
+               $cp->storeSessionReplicationPosition( $lb2 );
                $cpIndex = null;
                $cp->shutdown( null, 'sync', $cpIndex );
 
index 3662c26..b377c63 100644 (file)
@@ -8,8 +8,8 @@ class DeferredUpdatesTest extends MediaWikiTestCase {
         * @covers DeferredUpdates::addUpdate
         * @covers DeferredUpdates::push
         * @covers DeferredUpdates::doUpdates
-        * @covers DeferredUpdates::execute
-        * @covers DeferredUpdates::runUpdate
+        * @covers DeferredUpdates::handleUpdateQueue
+        * @covers DeferredUpdates::attemptUpdate
         */
        public function testAddAndRun() {
                $update = $this->getMockBuilder( DeferrableUpdate::class )
@@ -92,7 +92,7 @@ class DeferredUpdatesTest extends MediaWikiTestCase {
 
        /**
         * @covers DeferredUpdates::doUpdates
-        * @covers DeferredUpdates::execute
+        * @covers DeferredUpdates::handleUpdateQueue
         * @covers DeferredUpdates::addUpdate
         */
        public function testDoUpdatesWeb() {
@@ -189,7 +189,7 @@ class DeferredUpdatesTest extends MediaWikiTestCase {
 
        /**
         * @covers DeferredUpdates::doUpdates
-        * @covers DeferredUpdates::execute
+        * @covers DeferredUpdates::handleUpdateQueue
         * @covers DeferredUpdates::addUpdate
         */
        public function testDoUpdatesCLI() {
@@ -263,7 +263,7 @@ class DeferredUpdatesTest extends MediaWikiTestCase {
 
        /**
         * @covers DeferredUpdates::doUpdates
-        * @covers DeferredUpdates::execute
+        * @covers DeferredUpdates::handleUpdateQueue
         * @covers DeferredUpdates::addUpdate
         */
        public function testPresendAddOnPostsendRun() {
@@ -295,7 +295,7 @@ class DeferredUpdatesTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers DeferredUpdates::runUpdate
+        * @covers DeferredUpdates::attemptUpdate
         */
        public function testRunUpdateTransactionScope() {
                $this->setMwGlobals( 'wgCommandLineMode', false );
@@ -315,7 +315,7 @@ class DeferredUpdatesTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers DeferredUpdates::runUpdate
+        * @covers DeferredUpdates::attemptUpdate
         * @covers TransactionRoundDefiningUpdate::getOrigin
         */
        public function testRunOuterScopeUpdate() {
@@ -326,10 +326,10 @@ class DeferredUpdatesTest extends MediaWikiTestCase {
 
                $ran = 0;
                DeferredUpdates::addUpdate( new TransactionRoundDefiningUpdate(
-                       function () use ( &$ran, $lbFactory ) {
-                               $ran++;
-                               $this->assertFalse( $lbFactory->hasTransactionRound(), 'No transaction' );
-                       } )
+                               function () use ( &$ran, $lbFactory ) {
+                                       $ran++;
+                                       $this->assertFalse( $lbFactory->hasTransactionRound(), 'No transaction' );
+                               } )
                );
                DeferredUpdates::doUpdates();
 
diff --git a/tests/phpunit/includes/libs/rdbms/ChronologyProtectorTest.php b/tests/phpunit/includes/libs/rdbms/ChronologyProtectorTest.php
new file mode 100644 (file)
index 0000000..5901bc1
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * Holds tests for ChronologyProtector abstract MediaWiki class.
+ *
+ * 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
+ */
+
+use Wikimedia\Rdbms\ChronologyProtector;
+
+/**
+ * @group Database
+ * @covers \Wikimedia\Rdbms\ChronologyProtector::__construct
+ * @covers \Wikimedia\Rdbms\ChronologyProtector::getClientId
+ */
+class ChronologyProtectorTest extends PHPUnit\Framework\TestCase {
+       /**
+        * @dataProvider clientIdProvider
+        * @param array $client
+        * @param string $secret
+        * @param string $expectedId
+        */
+       public function testClientId( array $client, $secret, $expectedId ) {
+               $bag = new HashBagOStuff();
+               $cp = new ChronologyProtector( $bag, $client, null, $secret );
+
+               $this->assertEquals( $expectedId, $cp->getClientId() );
+       }
+
+       public function clientIdProvider() {
+               return [
+                       [
+                               [
+                                       'ip' => '127.0.0.1',
+                                       'agent' => "Totally-Not-FireFox"
+                               ],
+                               '',
+                               '45e93a9c215c031d38b7c42d8e4700ca',
+                       ],
+                       [
+                               [
+                                       'ip' => '127.0.0.7',
+                                       'agent' => "Totally-Not-FireFox"
+                               ],
+                               '',
+                               'b1d604117b51746c35c3df9f293c84dc'
+                       ],
+                       [
+                               [
+                                       'ip' => '127.0.0.1',
+                                       'agent' => "Totally-FireFox"
+                               ],
+                               '',
+                               '731b4e06a65e2346b497fc811571c4d7'
+                       ],
+                       [
+                               [
+                                       'ip' => '127.0.0.1',
+                                       'agent' => "Totally-Not-FireFox"
+                               ],
+                               'secret',
+                               'defff51ded73cd901253d874c9b2077d'
+                       ]
+               ];
+       }
+}
index 7032909..43dd5d4 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -272,7 +272,7 @@ function wfStreamThumb( array $params ) {
 
        // For 404 handled thumbnails, we only use the base name of the URI
        // for the thumb params and the parent directory for the source file name.
-       // Check that the zone relative path matches up so squid caches won't pick
+       // Check that the zone relative path matches up so CDN caches won't pick
        // up thumbs that would not be purged on source file deletion (T36231).
        if ( $rel404 !== null ) { // thumbnail was handled via 404
                if ( rawurldecode( $rel404 ) === $img->getThumbRel( $thumbName ) ) {