Merge "Avoid direct DatabaseSqlite constructor use in tests"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 28 Apr 2015 08:27:11 +0000 (08:27 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 28 Apr 2015 08:27:11 +0000 (08:27 +0000)
62 files changed:
api.php
autoload.php
img_auth.php
includes/DefaultSettings.php
includes/MediaWiki.php
includes/Title.php
includes/User.php
includes/api/ApiFeedRecentChanges.php
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/es.json
includes/api/i18n/gl.json
includes/changetags/ChangeTags.php
includes/content/ContentHandler.php
includes/db/LoadMonitor.php
includes/eventrelayer/EventRelayer.php [deleted file]
includes/eventrelayer/EventRelayerMCRD.php [deleted file]
includes/filerepo/LocalRepo.php
includes/installer/i18n/fo.json
includes/installer/i18n/tr.json
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobRunner.php
includes/libs/eventrelayer/EventRelayer.php [new file with mode: 0755]
includes/libs/eventrelayer/EventRelayerMCRD.php [new file with mode: 0755]
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/WANObjectCache.php [new file with mode: 0755]
includes/objectcache/ObjectCache.php
includes/objectcache/WANObjectCache.php [deleted file]
includes/profiler/TransactionProfiler.php
includes/specials/SpecialRecentchanges.php
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bs.json
languages/i18n/cv.json
languages/i18n/de.json
languages/i18n/egl.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/gu.json
languages/i18n/hy.json
languages/i18n/ka.json
languages/i18n/khw.json
languages/i18n/ku-latn.json
languages/i18n/la.json
languages/i18n/mt.json
languages/i18n/nds-nl.json
languages/i18n/pms.json
languages/i18n/qu.json
languages/i18n/sa.json
languages/i18n/sk.json
languages/i18n/ta.json
languages/i18n/tr.json
languages/i18n/ur.json
languages/i18n/vo.json
languages/i18n/xmf.json
maintenance/Maintenance.php
maintenance/benchmarks/benchmarkHooks.php
maintenance/language/checkLanguage.inc
maintenance/language/languages.inc
maintenance/refreshLinks.php
opensearch_desc.php
thumb.php

diff --git a/api.php b/api.php
index ea2f60a..7775158 100644 (file)
--- a/api.php
+++ b/api.php
@@ -75,7 +75,7 @@ try {
        $processor = new ApiMain( RequestContext::getMain(), $wgEnableWriteAPI );
 
        // Last chance hook before executing the API
-       wfRunHooks( 'ApiBeforeMain', array( &$processor ) );
+       Hooks::run( 'ApiBeforeMain', array( &$processor ) );
        if ( !$processor instanceof ApiMain ) {
                throw new MWException( 'ApiBeforeMain hook set $processor to a non-ApiMain class' );
        }
index 71bc7b2..81ee8b1 100644 (file)
@@ -382,9 +382,9 @@ $wgAutoloadLocalClasses = array(
        'EnqueueJob' => __DIR__ . '/includes/jobqueue/jobs/EnqueueJob.php',
        'EraseArchivedFile' => __DIR__ . '/maintenance/eraseArchivedFile.php',
        'ErrorPageError' => __DIR__ . '/includes/exception/ErrorPageError.php',
-       'EventRelayer' => __DIR__ . '/includes/eventrelayer/EventRelayer.php',
-       'EventRelayerMCRD' => __DIR__ . '/includes/eventrelayer/EventRelayerMCRD.php',
-       'EventRelayerNull' => __DIR__ . '/includes/eventrelayer/EventRelayer.php',
+       'EventRelayer' => __DIR__ . '/includes/libs/eventrelayer/EventRelayer.php',
+       'EventRelayerMCRD' => __DIR__ . '/includes/libs/eventrelayer/EventRelayerMCRD.php',
+       'EventRelayerNull' => __DIR__ . '/includes/libs/eventrelayer/EventRelayer.php',
        'Exif' => __DIR__ . '/includes/media/Exif.php',
        'ExifBitmapHandler' => __DIR__ . '/includes/media/ExifBitmap.php',
        'ExplodeIterator' => __DIR__ . '/includes/libs/ExplodeIterator.php',
@@ -1316,7 +1316,7 @@ $wgAutoloadLocalClasses = array(
        'ViewAction' => __DIR__ . '/includes/actions/ViewAction.php',
        'VirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/VirtualRESTService.php',
        'VirtualRESTServiceClient' => __DIR__ . '/includes/libs/virtualrest/VirtualRESTServiceClient.php',
-       'WANObjectCache' => __DIR__ . '/includes/objectcache/WANObjectCache.php',
+       'WANObjectCache' => __DIR__ . '/includes/libs/objectcache/WANObjectCache.php',
        'WaitForSlave' => __DIR__ . '/maintenance/waitForSlave.php',
        'WantedCategoriesPage' => __DIR__ . '/includes/specials/SpecialWantedcategories.php',
        'WantedFilesPage' => __DIR__ . '/includes/specials/SpecialWantedfiles.php',
index f44cac0..22fd401 100644 (file)
@@ -151,7 +151,7 @@ function wfImageAuthMain() {
                // Run hook for extension authorization plugins
                /** @var $result array */
                $result = null;
-               if ( !wfRunHooks( 'ImgAuthBeforeStream', array( &$title, &$path, &$name, &$result ) ) ) {
+               if ( !Hooks::run( 'ImgAuthBeforeStream', array( &$title, &$path, &$name, &$result ) ) ) {
                        wfForbidden( $result[0], $result[1], array_slice( $result, 2 ) );
                        return;
                }
index 2145d8a..28bead7 100644 (file)
@@ -2148,11 +2148,13 @@ $wgObjectCaches = array(
  * cache with a relayer of type EventRelayerNull.
  *
  * The options are:
+ *   - false:            Configure the cache using $wgMainCacheType, without using
+ *                       a relayer (only matters if there are multiple data-centers)
  *   - CACHE_NONE:       Do not cache
  *   - (other):          A string may be used which identifies a cache
  *                       configuration in $wgWANObjectCaches.
  */
-$wgMainWANCache = CACHE_NONE;
+$wgMainWANCache = false;
 
 /**
  * Advanced WAN object cache configuration.
@@ -5295,6 +5297,21 @@ $wgDebugDumpSql = false;
  */
 $wgDebugDumpSqlLength = 500;
 
+/**
+ * Performance expectations for DB usage
+ *
+ * @since 1.26
+ */
+$wgTrxProfilerLimits = array(
+       // Basic GET and POST requests
+       'GET'  => array( 'masterConns' => 0, 'writes' => 0, 'readQueryTime' => 5 ),
+       'POST' => array( 'maxAffected' => 500, 'readQueryTime' => 5, 'writeQueryTime' => 1 ),
+       // Background job runner
+       'JobRunner' => array( 'maxAffected' => 500, 'readQueryTime' => 30, 'writeQueryTime' => 5 ),
+       // Command-line scripts
+       'Maintenance' => array( 'maxAffected' => 1000, 'writeQueryTime' => 5 )
+);
+
 /**
  * Map of string log group names to log destinations.
  *
index ec2f40f..d0e81cf 100644 (file)
@@ -457,7 +457,7 @@ class MediaWiki {
        }
 
        private function main() {
-               global $wgTitle;
+               global $wgTitle, $wgTrxProfilerLimits;
 
                $request = $this->context->getRequest();
 
@@ -489,10 +489,9 @@ class MediaWiki {
                if ( !$request->wasPosted()
                        && in_array( $action, array( 'view', 'edit', 'history' ) )
                ) {
-                       $trxProfiler->setExpectation( 'masterConns', 0, __METHOD__ );
-                       $trxProfiler->setExpectation( 'writes', 0, __METHOD__ );
+                       $trxProfiler->setExpectations( $wgTrxProfilerLimits['GET'], __METHOD__ );
                } else {
-                       $trxProfiler->setExpectation( 'maxAffected', 500, __METHOD__ );
+                       $trxProfiler->setExpectations( $wgTrxProfilerLimits['POST'], __METHOD__ );
                }
 
                // If the user has forceHTTPS set to true, or if the user
index b0df15f..7e2b39e 100644 (file)
@@ -940,7 +940,6 @@ class Title {
        /**
         * Get the page's content model id, see the CONTENT_MODEL_XXX constants.
         *
-        * @throws MWException
         * @param int $flags A bit field; may be Title::GAID_FOR_UPDATE to select for update
         * @return string Content model id
         */
@@ -955,10 +954,6 @@ class Title {
                        $this->mContentModel = ContentHandler::getDefaultModelFor( $this );
                }
 
-               if ( !$this->mContentModel ) {
-                       throw new MWException( 'Failed to determine content model!' );
-               }
-
                return $this->mContentModel;
        }
 
index c3d4a65..921d604 100644 (file)
@@ -2252,8 +2252,6 @@ class User implements IDBAccessObject {
         *   page. Ignored if null or !$val.
         */
        public function setNewtalk( $val, $curRev = null ) {
-               global $wgMemc;
-
                if ( wfReadOnly() ) {
                        return;
                }
@@ -2275,12 +2273,6 @@ class User implements IDBAccessObject {
                        $changed = $this->deleteNewtalk( $field, $id );
                }
 
-               if ( $this->isAnon() ) {
-                       // Anons have a separate memcached space, since
-                       // user records aren't kept for them.
-                       $key = wfMemcKey( 'newtalk', 'ip', $id );
-                       $wgMemc->set( $key, $val ? 1 : 0, 1800 );
-               }
                if ( $changed ) {
                        $this->invalidateCache();
                }
index d452bbd..d24112c 100644 (file)
@@ -66,9 +66,17 @@ class ApiFeedRecentChanges extends ApiBase {
 
                $formatter = $this->getFeedObject( $feedFormat, $specialClass );
 
-               // Everything is passed implicitly via $wgRequest… :(
-               // The row-getting functionality should maybe be factored out of ChangesListSpecialPage too…
+               // Parameters are passed via the request in the context… :(
+               $context = new DerivativeContext( $this );
+               $context->setRequest( new DerivativeRequest(
+                       $this->getRequest(),
+                       $this->params,
+                       $this->getRequest()->wasPosted()
+               ) );
+
+               // The row-getting functionality should be factored out of ChangesListSpecialPage too…
                $rc = new $specialClass();
+               $rc->setContext( $context );
                $rows = $rc->getRows();
 
                $feedItems = $rows ? ChangesFeed::buildItems( $rows ) : array();
index 0f96f6c..4e80b9b 100644 (file)
        "apihelp-help-example-help": "Nápověda k samotnému modulu nápovědy",
        "apihelp-help-example-query": "Nápověda pro dva podmoduly query",
        "apihelp-imagerotate-description": "Otočit jeden nebo více obrázků.",
-       "apihelp-imagerotate-example-generator": "Otočte všechny obrázky v <kbd>Category:Flip</kbd> o <kbd>180</kbd> stupňů.",
+       "apihelp-imagerotate-example-generator": "Otočit všechny obrázky v <kbd>Category:Flip</kbd> o <kbd>180</kbd> stupňů.",
        "apihelp-import-param-summary": "Import shrnutí.",
        "apihelp-import-param-xml": "Nahraný XML soubor.",
        "apihelp-import-param-rootpage": "Importovat jako podstránku k této stránce.",
index 760fe53..1e2bb0b 100644 (file)
@@ -9,7 +9,8 @@
                        "Giftpflanze",
                        "Macofe",
                        "Se4598",
-                       "Purodha"
+                       "Purodha",
+                       "Andreasburmeister"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page/de|Dokumentation]]\n* [[mw:API:FAQ/de|Häufig gestellte Fragen]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fehlerberichte und Anfragen]\n</div>\n<strong>Status:</strong> Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, allerdings ist die API in aktiver Entwicklung und kann sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste], um über Aktualisierungen informiert zu werden.\n\n<strong>Fehlerhafte Anfragen:</strong> Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ gesendet. Der Wert des Headers und der Fehlercode werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe [[mw:API:Errors_and_warnings|API: Fehler und Warnungen]].",
        "apihelp-import-param-interwikipage": "Für Interwiki-Importe: zu importierende Seite.",
        "apihelp-import-param-fullhistory": "Für Interwiki-Importe: importiere die komplette Versionsgeschichte, nicht nur die aktuelle Version.",
        "apihelp-import-param-templates": "Für Interwiki-Importe: importiere auch alle eingebundenen Vorlagen.",
-       "apihelp-import-param-namespace": "Importiere in diesen Namensraum. Überschreibt den Parameter <kbd>$1rootpage</kbd>.",
+       "apihelp-import-param-namespace": "In diesen Namensraum importieren. Überschreibt den Parameter <kbd>$1rootpage</kbd>.",
        "apihelp-import-param-rootpage": "Als Unterseite dieser Seite importieren. Wird ignoriert, falls der Parameter <kbd>$1namespace</kbd> angegeben ist.",
        "apihelp-import-example-import": "Importiere [[meta:Help:Parserfunctions]] mit der kompletten Versionsgeschichte in den Namensraum 100.",
        "apihelp-login-description": "Anmelden und Authentifizierungs-Cookies beziehen.\n\nFalls das Anmelden erfolgreich war, werden die benötigten Cookies im Header der HTTP-Antwort des Servers übermittelt. Bei fehlgeschlagenen Anmeldeversuchen können weitere Versuche gedrosselt werden, um automatische Passwortermittlungsattacken zu verhinden.",
        "apihelp-rsd-description": "Ein RSD-Schema (Really Simple Discovery) exportieren.",
        "apihelp-rsd-example-simple": "Das RSD-Schema exportieren",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "An allen beobachteten Seiten arbeiten.",
+       "apihelp-tag-param-reason": "Grund für die Änderung.",
        "apihelp-unblock-description": "Einen Benutzer freigeben.",
        "apihelp-unblock-param-reason": "Grund für die Freigabe.",
        "apihelp-unblock-example-id": "Sperrkennung #<kbd>105</kbd> freigeben.",
        "api-help-flag-writerights": "Dieses Modul erfordert Schreibrechte.",
        "api-help-flag-mustbeposted": "Dieses Modul akzeptiert nur POST-Anfragen.",
        "api-help-flag-generator": "Dieses Modul kann als Generator verwendet werden.",
+       "api-help-source": "Quelle: $1",
+       "api-help-source-unknown": "Quelle: <span class=\"apihelp-unknown\">unbekannt</span>",
+       "api-help-license": "Lizenz: [[$1|$2]]",
+       "api-help-license-noname": "Lizenz: [[$1|Siehe Link]]",
+       "api-help-license-unknown": "Lizenz: <span class=\"apihelp-unknown\">unbekannt</span>",
        "api-help-parameters": "{{PLURAL:$1|Parameter}}:",
        "api-help-param-deprecated": "Veraltet.",
        "api-help-param-required": "Dieser Parameter ist erforderlich.",
+       "api-help-datatypes-header": "Datentypen",
        "api-help-param-list": "{{PLURAL:$1|1=Ein Wert|2=Werte (mit <kbd>{{!}}</kbd> trennen)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Muss leer sein|Kann leer sein oder $2}}",
        "api-help-param-limit": "Nicht mehr als $1 erlaubt.",
index f42f549..d514f60 100644 (file)
@@ -6,7 +6,8 @@
                        "Alan",
                        "Fitoschido",
                        "JasterTDC",
-                       "Edslov"
+                       "Edslov",
+                       "Carlos Cristia"
                ]
        },
        "apihelp-main-param-action": "Qué acción se realizará.",
        "apihelp-block-param-reblock": "Si la cuenta ya está bloqueada, sobrescribir el bloqueo existente.",
        "apihelp-block-param-watchuser": "Vigilar las páginas de usuario y de discusión del usuario o de la dirección IP.",
        "apihelp-compare-param-fromtitle": "Primer título para comparar",
+       "apihelp-compare-param-fromrev": "Primera revisión para comparar.",
+       "apihelp-compare-param-totitle": "Segundo título para comparar.",
+       "apihelp-compare-param-toid": "Segunda página de IDENTIFICACIÓN para comparar.",
+       "apihelp-compare-param-torev": "Segunda revisión para comparar.",
        "apihelp-createaccount-description": "Crear una nueva cuenta de usuario.",
        "apihelp-createaccount-param-name": "Nombre de usuario.",
        "apihelp-createaccount-param-email": "Dirección de correo electrónico del usuario (opcional).",
@@ -64,6 +69,7 @@
        "apihelp-feedrecentchanges-param-feedformat": "El formato del canal.",
        "apihelp-feedrecentchanges-param-invert": "Todos los espacios de nombres menos el que está seleccionado.",
        "apihelp-feedrecentchanges-param-associated": "Incluir el espacio de nombres asociado (discusión o principal).",
+       "apihelp-feedrecentchanges-param-days": "Días a los que limitar los resultados.",
        "apihelp-feedrecentchanges-param-limit": "Número máximo de resultados que devolver.",
        "apihelp-feedrecentchanges-param-from": "Mostrar los cambios realizados a partir de entonces.",
        "apihelp-feedrecentchanges-param-hideminor": "Ocultar cambios menores.",
index a872f13..9bb8245 100644 (file)
        "apihelp-query+deletedrevs-param-excludeuser": "Non listar revisións deste usuario.",
        "apihelp-query+deletedrevs-param-namespace": "Só listar páxinas neste espazo de nomes.",
        "apihelp-query+deletedrevs-param-limit": "Máximo número de revisións a listar.",
+       "apihelp-query+deletedrevs-param-prop": "Que propiedades devolver:\n;revid:Engade o identificador de modificación da modificación borrada.\n;parentid:Engade o identificador de modificación da versión anterior da páxina.\n;user:Engade o usuario que fixo esa modificación.\n;userid:Engade o identificador de usuario que fixo esa modificación.\n;comment:Engade o comentario da modificación.\n;parsedcomment:Engade o comentario analizado da modificación.\n;minor:Indica se a modificación é menor.\n;len:Engade a lonxitude (bytes) da modificación.\n;sha1:Engade o SHA-1 (base 16) da modificación.\n;content:Engade o contido da modificación.\n;token:<span class=\"apihelp-deprecated\">Obsoleto.</span> Devolve o identificador da modificación.\n;tags:Etiquetas da modificación.",
        "apihelp-query+deletedrevs-example-mode1": "Listar as últimas revisións borradas das páxinas <kbd>Main Page</kbd> e <kbd>Talk:Main Page</kbd>, con contido (modo 1).",
        "apihelp-query+deletedrevs-example-mode2": "Listar as últimas 50 contribucións borradas de <kbd>Bob</kbd> (modo 2).",
        "apihelp-query+deletedrevs-example-mode3-main": "Listar as primeiras 50 revisións borradas no espazo de nomes principal (modo 3)",
        "apihelp-query+pagepropnames-example-simple": "Obter os dez primeiros nomes de propiedade.",
        "apihelp-query+pageprops-description": "Obter varias propiedades definidas no contido da páxina.",
        "apihelp-query+pageprops-param-prop": "Listar só esas propiedades. Útil para verificar se unha páxina concreta usa unha propiedade de páxina determinada.",
-       "apihelp-query+pageprops-example-simple": "Obter as propiedades para <kbd>Category:Foo</kbd>.",
+       "apihelp-query+pageprops-example-simple": "Obter as propiedades para as páxinas <kbd>Main Page</kbd> e <kbd>MediaWiki</kbd>",
        "apihelp-query+pageswithprop-description": "Mostrar a lista de páxinas que empregan unha propiedade determinada.",
        "apihelp-query+pageswithprop-param-propname": "Propiedade de páxina pola que enumerar as páxinas.",
        "apihelp-query+pageswithprop-param-prop": "Que información incluír:\n;ids:Engade o ID da páxina.\n;title:Engade o título e o ID do espazo de nomes da páxina.\n;value:Engade o valor da propiedade da páxina.",
index 43f957c..cf33484 100644 (file)
@@ -382,8 +382,9 @@ class ChangeTags {
         * @return Status
         * @since 1.25
         */
-       public static function addTagsAccompanyingChangeWithChecks( array $tags,
-               $rc_id, $rev_id, $log_id, $params, User $user ) {
+       public static function addTagsAccompanyingChangeWithChecks(
+               array $tags, $rc_id, $rev_id, $log_id, $params, User $user
+       ) {
 
                // are we allowed to do this?
                $result = self::canAddTagsAccompanyingChange( $tags, $user );
@@ -393,7 +394,7 @@ class ChangeTags {
                }
 
                // do it!
-               self::addTags( $tagsToAdd, $rc_id, $rev_id, $log_id, $params );
+               self::addTags( $tags, $rc_id, $rev_id, $log_id, $params );
 
                return Status::newGood( true );
        }
index 9c2435a..f8d0879 100644 (file)
@@ -629,7 +629,7 @@ abstract class ContentHandler {
 
                // hook: get difference engine
                $differenceEngine = null;
-               if ( !wfRunHooks( 'GetDifferenceEngine',
+               if ( !Hooks::run( 'GetDifferenceEngine',
                        array( $context, $old, $new, $refreshCache, $unhide, &$differenceEngine )
                ) ) {
                        return $differenceEngine;
index 91840dd..3d853cb 100644 (file)
@@ -115,10 +115,10 @@ class LoadMonitorMySQL implements LoadMonitor {
                }
 
                # Cache key missing or expired
-               if ( $cache->add( "$memcKey:lock", 1, 10 ) ) {
+               if ( $cache->lock( $memcKey, 0, 10 ) ) {
                        # Let this process alone update the cache value
                        $unlocker = new ScopedCallback( function () use ( $cache, $memcKey ) {
-                               $cache->delete( $memcKey );
+                               $cache->unlock( $memcKey );
                        } );
                } elseif ( is_array( $times ) ) {
                        # Could not acquire lock but an old cache exists, so use it
diff --git a/includes/eventrelayer/EventRelayer.php b/includes/eventrelayer/EventRelayer.php
deleted file mode 100755 (executable)
index a3d214f..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Aaron Schulz
- */
-
-/**
- * Base class for reliable event relays
- */
-abstract class EventRelayer {
-       /**
-        * @param array $params
-        */
-       public function __construct( array $params ) {}
-
-       /**
-        * @param string $channel
-        * @param array $event Event data map
-        * @return bool Success
-        */
-       final public function notify( $channel, $event ) {
-               return $this->doNotify( $channel, array( $event ) );
-       }
-
-       /**
-        * @param string $channel
-        * @param array $events List of event data maps
-        * @return bool Success
-        */
-       final public function notifyMulti( $channel, $events ) {
-               return $this->doNotify( $channel, $events );
-       }
-
-       /**
-        * @param string $channel
-        * @param array $events List of event data maps
-        * @return bool Success
-        */
-       abstract protected function doNotify( $channel, array $events );
-}
-
-/**
- * No-op class for publishing messages into a PubSub system
- */
-class EventRelayerNull extends EventRelayer {
-       public function doNotify( $channel, array $events ) {
-               return true;
-       }
-}
diff --git a/includes/eventrelayer/EventRelayerMCRD.php b/includes/eventrelayer/EventRelayerMCRD.php
deleted file mode 100755 (executable)
index 1e8b2a4..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Aaron Schulz
- */
-
-/**
- * Relayed that uses the mcrelaypushd server
- */
-class EventRelayerMCRD extends EventRelayer {
-       /** @var MultiHttpClient */
-       protected $http;
-       /** @var string */
-       protected $baseUrl;
-
-       /**
-        * Additional params include 'mcrdConfig', which is a map of:
-        *   - url : The base URL of the service (without paths)
-        * @param array $params
-        */
-       public function __construct( array $params ) {
-               parent::__construct( $params );
-
-               $this->baseUrl = $params['mcrdConfig']['url'];
-
-               $httpConfig = isset( $params['httpConfig'] ) ? $params['httpConfig'] : array();
-               if ( !isset( $httpConfig['connTimeout'] ) ) {
-                       $httpConfig['connTimeout'] = 1;
-               }
-               if ( !isset( $httpConfig['reqTimeout'] ) ) {
-                       $httpConfig['reqTimeout'] = .25;
-               }
-
-               $this->http = new MultiHttpClient( $httpConfig );
-       }
-
-       protected function doNotify( $channel, array $events ) {
-               if ( !count( $events ) ) {
-                       return true;
-               }
-
-               $response = $this->http->run( array(
-                       'url'     => "{$this->baseUrl}/relayer/api/v1.0/" . rawurlencode( $channel ),
-                       'method'  => 'POST',
-                       'body'    => json_encode( array( 'events' => $events ) ),
-                       'headers' => array( 'content-type' => 'application/json' )
-               ) );
-
-               return $response['code'] == 201;
-       }
-}
index 926fd0b..e7e4c75 100644 (file)
@@ -90,7 +90,7 @@ class LocalRepo extends FileRepo {
                foreach ( $storageKeys as $key ) {
                        $hashPath = $this->getDeletedHashPath( $key );
                        $path = "$root/$hashPath$key";
-                       $dbw->begin( __METHOD__ );
+                       $dbw->startAtomic( __METHOD__ );
                        // Check for usage in deleted/hidden files and preemptively
                        // lock the key to avoid any future use until we are finished.
                        $deleted = $this->deletedFileHasKey( $key, 'lock' );
@@ -106,7 +106,7 @@ class LocalRepo extends FileRepo {
                                wfDebug( __METHOD__ . ": $key still in use\n" );
                                $status->successCount++;
                        }
-                       $dbw->commit( __METHOD__ );
+                       $dbw->endAtomic( __METHOD__ );
                }
 
                return $status;
index d40c45a..0a147d2 100644 (file)
        "config-help-restart": "Ynskir tú at sletta øll goymd dáta sum tú hevur skrivað og byrja umaftur at installera?",
        "config-restart": "Ja, byrja umaftur",
        "config-env-php": "PHP $1 er innstallerað.",
-       "config-env-php-toolow": "PHP $1 er installerað.\nMen, MediaWiki krevur PHP $2 ella hægri.",
+       "config-env-hhvm": "HHVM $1 er lagt inn.",
+       "config-unicode-using-intl": "Brúkar [http://pecl.php.net/intl intl PECL ískoytið] til Unicode normalisering.",
+       "config-unicode-pure-php-warning": "<strong>Ávaring:</strong> [http://pecl.php.net/intl intl PECL ískoytið] er ikki tøkt at handfara Unicode normalisering, fellur aftur til eina spakuligari reina-PHP verkseting.\nUm tú koyrir eina netsíðu við høgari ferðslu, so eigur tú at lesa eitt sindur um [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalisering].",
+       "config-unicode-update-warning": "<strong>Ávaring:</strong> Tann innlagda versjónin av Unicode normalisering wrapper nýtir eina eldri versjón av [http://site.icu-project.org/ bókasavninum hjá ICU verkætlanini].\nTú eigur at [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations fremja uppstigning] um tú stúrir fyri at nýta Unicode.",
+       "config-diff3-bad": "GNU diff3 ikki funnið.",
+       "config-git": "Fann Git version control forritið: <code>$1</code>.",
+       "config-git-bad": "Git version control forritið varð ikki funnið.",
+       "config-imagemagick": "Fann ImageMagick: <code>$1</code>.\nTað at velja smámynd verður gjørt virkið um tú aktiverar møgulleikan at leggja myndir út.",
+       "config-using-server": "Brúkar servaranavnið \"<nowiki>$1</nowiki>\".",
+       "config-using-uri": "Nýtir servara URL \"<nowiki>$1$2</nowiki>\".",
+       "config-db-type": "Slag av dátugrunni:",
+       "config-db-host": "Dátugrunn vertur:",
+       "config-db-username": "Dátugrunn brúkaranavn:",
+       "config-db-password": "Dátugrunn loyniorð:",
        "mainpagetext": "'''Innlegging av Wiki-ritbúnaði væleydnað.'''"
 }
index e9b05cf..5ebf803 100644 (file)
@@ -8,7 +8,9 @@
                        "Trncmvsr",
                        "Sayginer",
                        "Trockya",
-                       "Aşilleus"
+                       "Aşilleus",
+                       "Nighteagle2000",
+                       "Sadrettin"
                ]
        },
        "config-desc": "MediaWiki yükleyicisi",
@@ -53,7 +55,7 @@
        "config-env-good": "Ortam kontrol edildi.\nMediaWiki'yi kurabilirsiniz.",
        "config-env-bad": "Ortam kontrol edildi.\nMediaWiki'yi kuramazsınız.",
        "config-env-php": "PHP $1 kurulu.",
-       "config-unicode-using-utf8": "Unikod normalleştirmesi için Brion Vibber'in utf8_normalize.so kullanılıyor.",
+       "config-env-hhvm": "HHVM $1 kuruldu",
        "config-unicode-using-intl": "Unikod normalleştirmesi için [http://pecl.php.net/intl intl PECL uzantısı] kullanılıyor.",
        "config-xml-bad": "PHP 'nin XML modülü eksik.\nMediaWiki bu modüldeki fonksiyonlara ihtiyaç duyar ve şimdiki kurulumda çalışmayacaktır.\nMandrake kullanıyorsanız php-xml paketini yükleyin.",
        "config-pcre-old": "<strong>Ağır hata:</strong> PCRE $1 veya daha üst versiyon gerekli.\nSizin PHP kurulumunuz PCRE $2 ile bağlı.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Daha fazla bilgi].",
@@ -90,6 +92,7 @@
        "config-pg-test-error": "Veritabanıyla bağlantı kurulamıyor ''' $1 ''':$2",
        "config-sqlite-dir": "SQLite veri dizini",
        "config-oracle-def-ts": "Varsayılan tablo alanı:",
+       "config-type-mssql": "Microsoft SQL Server",
        "config-header-mysql": "MySQL ayarları",
        "config-header-postgres": "PostgreSQL ayarları",
        "config-header-sqlite": "SQLite ayarları",
        "config-advanced-settings": "Gelişmiş yapılandırma",
        "config-memcached-servers": "Memcached sunucuları:",
        "config-extensions": "Uzantılar",
+       "config-skins": "Görünümler",
        "config-install-step-done": "Yapıldı",
        "config-install-step-failed": "Başarısız",
        "config-install-database": "Veritabanı ayarlama",
index 320b1b1..b1b650b 100644 (file)
@@ -29,7 +29,6 @@
  */
 class JobQueueDB extends JobQueue {
        const CACHE_TTL_SHORT = 30; // integer; seconds to cache info without re-validating
-       const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
        const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed
        const MAX_JOB_RANDOM = 2147483647; // integer; 2^31 - 1, used for job_random
        const MAX_OFFSET = 255; // integer; maximum number of rows to skip
@@ -71,15 +70,6 @@ class JobQueueDB extends JobQueue {
         * @return bool
         */
        protected function doIsEmpty() {
-               $key = $this->getCacheKey( 'empty' );
-
-               $isEmpty = $this->cache->get( $key );
-               if ( $isEmpty === 'true' ) {
-                       return true;
-               } elseif ( $isEmpty === 'false' ) {
-                       return false;
-               }
-
                $dbr = $this->getSlaveDB();
                try {
                        $found = $dbr->selectField( // unclaimed job
@@ -88,7 +78,6 @@ class JobQueueDB extends JobQueue {
                } catch ( DBError $e ) {
                        $this->throwDBException( $e );
                }
-               $this->cache->add( $key, $found ? 'false' : 'true', self::CACHE_TTL_LONG );
 
                return !$found;
        }
@@ -272,8 +261,6 @@ class JobQueueDB extends JobQueue {
                        $dbw->commit( $method );
                }
 
-               $this->cache->set( $this->getCacheKey( 'empty' ), 'false', JobQueueDB::CACHE_TTL_LONG );
-
                return;
        }
 
@@ -282,10 +269,6 @@ class JobQueueDB extends JobQueue {
         * @return Job|bool
         */
        protected function doPop() {
-               if ( $this->cache->get( $this->getCacheKey( 'empty' ) ) === 'true' ) {
-                       return false; // queue is empty
-               }
-
                $dbw = $this->getMasterDB();
                try {
                        $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
@@ -308,7 +291,6 @@ class JobQueueDB extends JobQueue {
                                }
                                // Check if we found a row to reserve...
                                if ( !$row ) {
-                                       $this->cache->set( $this->getCacheKey( 'empty' ), 'true', self::CACHE_TTL_LONG );
                                        break; // nothing to do
                                }
                                JobQueue::incrStats( 'job-pop', $this->type );
@@ -569,7 +551,7 @@ class JobQueueDB extends JobQueue {
         * @return void
         */
        protected function doFlushCaches() {
-               foreach ( array( 'empty', 'size', 'acquiredcount' ) as $type ) {
+               foreach ( array( 'size', 'acquiredcount' ) as $type ) {
                        $this->cache->delete( $this->getCacheKey( $type ) );
                }
        }
@@ -680,8 +662,6 @@ class JobQueueDB extends JobQueue {
                                        $affected = $dbw->affectedRows();
                                        $count += $affected;
                                        JobQueue::incrStats( 'job-recycle', $this->type, $affected );
-                                       // The tasks recycled jobs or release delayed jobs into the queue
-                                       $this->cache->set( $this->getCacheKey( 'empty' ), 'false', self::CACHE_TTL_LONG );
                                        $this->aggr->notifyQueueNonEmpty( $this->wiki, $this->type );
                                }
                        }
index 2311ea2..4d3da8a 100644 (file)
@@ -89,7 +89,7 @@ class JobRunner implements LoggerAwareInterface {
         * @return array Summary response that can easily be JSON serialized
         */
        public function run( array $options ) {
-               global $wgJobClasses;
+               global $wgJobClasses, $wgTrxProfilerLimits;
 
                $response = array( 'jobs' => array(), 'reached' => 'none-ready' );
 
@@ -121,7 +121,7 @@ class JobRunner implements LoggerAwareInterface {
                // Catch huge single updates that lead to slave lag
                $trxProfiler = Profiler::instance()->getTransactionProfiler();
                $trxProfiler->setLogger( LoggerFactory::getInstance( 'DBPerformance' ) );
-               $trxProfiler->setExpectation( 'maxAffected', 500, __METHOD__ );
+               $trxProfiler->setExpectations( $wgTrxProfilerLimits['JobRunner'], __METHOD__ );
 
                // Bail out if there is too much DB lag.
                // This check should not block as we want to try other wiki queues.
diff --git a/includes/libs/eventrelayer/EventRelayer.php b/includes/libs/eventrelayer/EventRelayer.php
new file mode 100755 (executable)
index 0000000..a3d214f
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Base class for reliable event relays
+ */
+abstract class EventRelayer {
+       /**
+        * @param array $params
+        */
+       public function __construct( array $params ) {}
+
+       /**
+        * @param string $channel
+        * @param array $event Event data map
+        * @return bool Success
+        */
+       final public function notify( $channel, $event ) {
+               return $this->doNotify( $channel, array( $event ) );
+       }
+
+       /**
+        * @param string $channel
+        * @param array $events List of event data maps
+        * @return bool Success
+        */
+       final public function notifyMulti( $channel, $events ) {
+               return $this->doNotify( $channel, $events );
+       }
+
+       /**
+        * @param string $channel
+        * @param array $events List of event data maps
+        * @return bool Success
+        */
+       abstract protected function doNotify( $channel, array $events );
+}
+
+/**
+ * No-op class for publishing messages into a PubSub system
+ */
+class EventRelayerNull extends EventRelayer {
+       public function doNotify( $channel, array $events ) {
+               return true;
+       }
+}
diff --git a/includes/libs/eventrelayer/EventRelayerMCRD.php b/includes/libs/eventrelayer/EventRelayerMCRD.php
new file mode 100755 (executable)
index 0000000..1e8b2a4
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Relayed that uses the mcrelaypushd server
+ */
+class EventRelayerMCRD extends EventRelayer {
+       /** @var MultiHttpClient */
+       protected $http;
+       /** @var string */
+       protected $baseUrl;
+
+       /**
+        * Additional params include 'mcrdConfig', which is a map of:
+        *   - url : The base URL of the service (without paths)
+        * @param array $params
+        */
+       public function __construct( array $params ) {
+               parent::__construct( $params );
+
+               $this->baseUrl = $params['mcrdConfig']['url'];
+
+               $httpConfig = isset( $params['httpConfig'] ) ? $params['httpConfig'] : array();
+               if ( !isset( $httpConfig['connTimeout'] ) ) {
+                       $httpConfig['connTimeout'] = 1;
+               }
+               if ( !isset( $httpConfig['reqTimeout'] ) ) {
+                       $httpConfig['reqTimeout'] = .25;
+               }
+
+               $this->http = new MultiHttpClient( $httpConfig );
+       }
+
+       protected function doNotify( $channel, array $events ) {
+               if ( !count( $events ) ) {
+                       return true;
+               }
+
+               $response = $this->http->run( array(
+                       'url'     => "{$this->baseUrl}/relayer/api/v1.0/" . rawurlencode( $channel ),
+                       'method'  => 'POST',
+                       'body'    => json_encode( array( 'events' => $events ) ),
+                       'headers' => array( 'content-type' => 'application/json' )
+               ) );
+
+               return $response['code'] == 201;
+       }
+}
index 5447ee7..16f6034 100644 (file)
@@ -119,10 +119,11 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
         * @return bool Success
+        * @throws InvalidArgumentException
         */
        public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
                if ( !is_callable( $callback ) ) {
-                       throw new Exception( "Got invalid callback." );
+                       throw new InvalidArgumentException( "Got invalid callback." );
                }
 
                return $this->mergeViaLock( $key, $callback, $exptime, $attempts );
@@ -166,6 +167,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * @param mixed $value
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @return bool Success
+        * @throws Exception
         */
        protected function cas( $casToken, $key, $value, $exptime = 0 ) {
                throw new Exception( "CAS is not implemented in " . __CLASS__ );
@@ -205,7 +207,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
 
        /**
         * @param string $key
-        * @param int $timeout Lock wait timeout [optional]
+        * @param int $timeout Lock wait timeout; 0 for non-blocking [optional]
         * @param int $expiry Lock expiry [optional]
         * @return bool Success
         */
diff --git a/includes/libs/objectcache/WANObjectCache.php b/includes/libs/objectcache/WANObjectCache.php
new file mode 100755 (executable)
index 0000000..be62d1a
--- /dev/null
@@ -0,0 +1,600 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ * @author Aaron Schulz
+ */
+
+/**
+ * Multi-datacenter aware caching interface
+ *
+ * All operations go to the local cache, except the delete()
+ * and touchCheckKey(), which broadcast to all clusters.
+ * This class is intended for caching data from primary stores.
+ * If the get() method does not return a value, then the caller
+ * should query the new value and backfill the cache using set().
+ * When the source data changes, the delete() method should be called.
+ * Since delete() is expensive, it should be avoided. One can do so if:
+ *   - a) The object cached is immutable; or
+ *   - b) Validity is checked against the source after get(); or
+ *   - c) Using a modest TTL is reasonably correct and performant
+ * Consider using getWithSetCallback() instead of the get()/set() cycle.
+ *
+ * Instances of this class must be configured to point to a valid
+ * PubSub endpoint, and there must be listeners on the cache servers
+ * that subscribe to the endpoint and update the caches.
+ *
+ * Broadcasted operations like delete() and touchCheckKey() are done
+ * synchronously in the local cluster, but are relayed asynchronously.
+ * This means that callers in other datacenters will see older values
+ * for a however many milliseconds the datacenters are apart. As with
+ * any cache, this should not be relied on for cases where reads are
+ * used to determine writes to source (e.g. non-cache) data stores.
+ *
+ * All values are wrapped in metadata arrays. Keys use a "WANCache:" prefix
+ * to avoid collisions with keys that are not wrapped as metadata arrays. The
+ * prefixes are as follows:
+ *   - a) "WANCache:v" : used for regular value keys
+ *   - b) "WANCache:s" : used for temporarily storing values of tombstoned keys
+ *   - c) "WANCache:t" : used for storing timestamp "check" keys
+ *
+ * @ingroup Cache
+ * @since 1.26
+ */
+class WANObjectCache {
+       /** @var BagOStuff The local cluster cache */
+       protected $cache;
+       /** @var string Cache pool name */
+       protected $pool;
+       /** @var EventRelayer */
+       protected $relayer;
+
+       /** @var int */
+       protected $lastRelayError = self::ERR_NONE;
+
+       /** Seconds to tombstone keys on delete() */
+       const HOLDOFF_TTL = 10;
+       /** Seconds to keep dependency purge keys around */
+       const CHECK_KEY_TTL = 31536000; // 1 year
+       /** Seconds to keep lock keys around */
+       const LOCK_TTL = 5;
+
+       /** Cache format version number */
+       const VERSION = 1;
+
+       /** Fields of value holder arrays */
+       const FLD_VERSION = 0;
+       const FLD_VALUE = 1;
+       const FLD_TTL = 2;
+       const FLD_TIME = 3;
+
+       /** Possible values for getLastError() */
+       const ERR_NONE = 0; // no error
+       const ERR_NO_RESPONSE = 1; // no response
+       const ERR_UNREACHABLE = 2; // can't connect
+       const ERR_UNEXPECTED = 3; // response gave some error
+       const ERR_RELAY = 4; // relay broadcast failed
+
+       const VALUE_KEY_PREFIX = 'WANCache:v:';
+       const STASH_KEY_PREFIX = 'WANCache:s:';
+       const TIME_KEY_PREFIX = 'WANCache:t:';
+
+       const PURGE_VAL_PREFIX = 'PURGED:';
+
+       /**
+        * @param array $params
+        *   - cache   : BagOStuff object
+        *   - pool    : pool name
+        *   - relayer : EventRelayer object
+        */
+       public function __construct( array $params ) {
+               $this->cache = $params['cache'];
+               $this->pool = $params['pool'];
+               $this->relayer = $params['relayer'];
+       }
+
+       /**
+        * Fetch the value of a key from cache
+        *
+        * If passed in, $curTTL is set to the remaining TTL (current time left):
+        *   - a) INF; if the key exists and has no TTL
+        *   - b) float (>=0); if the key exists and has a TTL
+        *   - c) float (<0); if the key is tombstoned or expired by $checkKeys
+        *   - d) null; if the key does not exist and is not tombstoned
+        *
+        * If a key is tombstoned, $curTTL will reflect the time since delete().
+        *
+        * The timestamp of $key will be checked against the last-purge timestamp
+        * of each of $checkKeys. Those $checkKeys not in cache will have the last-purge
+        * initialized to the current timestamp. If any of $checkKeys have a timestamp
+        * greater than that of $key, then $curTTL will reflect how long ago $key
+        * became invalid. Callers can use $curTTL to know when the value is stale.
+        * The $checkKeys parameter allow mass invalidations by updating a single key:
+        *   - a) Each "check" key represents "last purged" of some source data
+        *   - b) Callers pass in relevant "check" keys as $checkKeys in get()
+        *   - c) When the source data that "check" keys represent changes,
+        *        the touchCheckKey() method is called on them
+        *
+        * For keys that are hot/expensive, consider using getWithSetCallback() instead.
+        *
+        * @param string $key Cache key
+        * @param mixed $curTTL Approximate TTL left on the key if present [returned]
+        * @param array $checkKeys List of "check" keys
+        * @return mixed Value of cache key or false on failure
+        */
+       final public function get( $key, &$curTTL = null, array $checkKeys = array() ) {
+               $curTTLs = array();
+               $values = $this->getMulti( array( $key ), $curTTLs, $checkKeys );
+               $curTTL = isset( $curTTLs[$key] ) ? $curTTLs[$key] : null;
+
+               return isset( $values[$key] ) ? $values[$key] : false;
+       }
+
+       /**
+        * Fetch the value of several keys from cache
+        *
+        * @see WANObjectCache::get()
+        *
+        * @param array $keys List of cache keys
+        * @param array $curTTLs Map of (key => approximate TTL left) for existing keys [returned]
+        * @param array $checkKeys List of "check" keys
+        * @return array Map of (key => value) for keys that exist
+        */
+       final public function getMulti(
+               array $keys, &$curTTLs = array(), array $checkKeys = array()
+       ) {
+               $result = array();
+               $curTTLs = array();
+
+               $vPrefixLen = strlen( self::VALUE_KEY_PREFIX );
+               $valueKeys = self::prefixCacheKeys( $keys, self::VALUE_KEY_PREFIX );
+               $checkKeys = self::prefixCacheKeys( $checkKeys, self::TIME_KEY_PREFIX );
+
+               // Fetch all of the raw values
+               $wrappedValues = $this->cache->getMulti( array_merge( $valueKeys, $checkKeys ) );
+               $now = microtime( true );
+
+               // Get/initialize the timestamp of all the "check" keys
+               $checkKeyTimes = array();
+               foreach ( $checkKeys as $checkKey ) {
+                       $timestamp = isset( $wrappedValues[$checkKey] )
+                               ? self::parsePurgeValue( $wrappedValues[$checkKey] )
+                               : false;
+                       if ( !is_float( $timestamp ) ) {
+                               // Key is not set or invalid; regenerate
+                               $this->cache->add( $checkKey,
+                                       self::PURGE_VAL_PREFIX . $now, self::CHECK_KEY_TTL );
+                               $timestamp = $now;
+                       }
+
+                       $checkKeyTimes[] = $timestamp;
+               }
+
+               // Get the main cache value for each key and validate them
+               foreach ( $valueKeys as $vKey ) {
+                       if ( !isset( $wrappedValues[$vKey] ) ) {
+                               continue; // not found
+                       }
+
+                       $key = substr( $vKey, $vPrefixLen ); // unprefix
+
+                       list( $value, $curTTL ) = $this->unwrap( $wrappedValues[$vKey], $now );
+                       if ( $value !== false ) {
+                               $result[$key] = $value;
+                               foreach ( $checkKeyTimes as $checkKeyTime ) {
+                                       // Force dependant keys to be invalid for a while after purging
+                                       // to reduce race conditions involving stale data getting cached
+                                       $safeTimestamp = $checkKeyTime + self::HOLDOFF_TTL;
+                                       if ( $safeTimestamp >= $wrappedValues[$vKey][self::FLD_TIME] ) {
+                                               $curTTL = min( $curTTL, $checkKeyTime - $now );
+                                       }
+                               }
+                       }
+
+                       $curTTLs[$key] = $curTTL;
+               }
+
+               return $result;
+       }
+
+       /**
+        * Set the value of a key from cache
+        *
+        * Simply calling this method when source data changes is not valid because
+        * the changes do not replicate to the other WAN sites. In that case, delete()
+        * should be used instead. This method is intended for use on cache misses.
+        *
+        * @param string $key Cache key
+        * @param mixed $value
+        * @param integer $ttl Seconds to live [0=forever]
+        * @return bool Success
+        */
+       final public function set( $key, $value, $ttl = 0 ) {
+               $key = self::VALUE_KEY_PREFIX . $key;
+               $wrapped = $this->wrap( $value, $ttl );
+
+               $func = function ( $cache, $key, $cWrapped ) use ( $wrapped ) {
+                       return ( is_string( $cWrapped ) )
+                               ? false // key is tombstoned; do nothing
+                               : $wrapped;
+               };
+
+               return $this->cache->merge( $key, $func, $ttl, 1 );
+       }
+
+       /**
+        * Purge a key from all clusters
+        *
+        * This instantiates a hold-off period where the key cannot be
+        * written to avoid race conditions where dependent keys get updated
+        * with a stale value (e.g. from a DB slave).
+        *
+        * This should only be called when the underlying data (being cached)
+        * changes in a significant way. If called twice on the same key, then
+        * the last TTL takes precedence.
+        *
+        * @param string $key Cache key
+        * @param integer $ttl How long to block writes to the key [seconds]
+        * @return bool True if the item was purged or not found, false on failure
+        */
+       final public function delete( $key, $ttl = self::HOLDOFF_TTL ) {
+               $key = self::VALUE_KEY_PREFIX . $key;
+               // Update the local cluster immediately
+               $ok = $this->cache->set( $key, self::PURGE_VAL_PREFIX . microtime( true ), $ttl );
+               // Publish the purge to all clusters
+               return $this->relayPurge( $key, $ttl ) && $ok;
+       }
+
+       /**
+        * Fetch the value of a timestamp "check" key
+        *
+        * @param string $key
+        * @return float|bool TS_UNIX timestamp of the key; false if not present
+        */
+       final public function getCheckKeyTime( $key ) {
+               return self::parsePurgeValue( $this->cache->get( self::TIME_KEY_PREFIX . $key ) );
+       }
+
+       /**
+        * Purge a "check" key from all clusters, invalidating keys that use it
+        *
+        * This should only be called when the underlying data (being cached)
+        * changes in a significant way, and it is impractical to call delete()
+        * on all keys that should be changed. When get() is called on those
+        * keys, the relevant "check" keys must be supplied for this to work.
+        *
+        * The "check" key essentially represents a last-modified field.
+        * It is set in the future a few seconds when this is called, to
+        * avoid race conditions where dependent keys get updated with a
+        * stale value (e.g. from a DB slave).
+        *
+        * @see WANObjectCache::get()
+        *
+        * @param string $key Cache key
+        * @return bool True if the item was purged or not found, false on failure
+        */
+       final public function touchCheckKey( $key ) {
+               $key = self::TIME_KEY_PREFIX . $key;
+               // Update the local cluster immediately
+               $ok = $this->cache->set( $key,
+                       self::PURGE_VAL_PREFIX . microtime( true ), self::CHECK_KEY_TTL );
+               // Publish the purge to all clusters
+               return $this->relayPurge( $key, self::CHECK_KEY_TTL ) && $ok;
+       }
+
+       /**
+        * Method to fetch/regenerate cache keys
+        *
+        * On cache miss, the key will be set to the callback result.
+        * The callback function returns the new value given the current
+        * value (false if not present). If false is returned, then nothing
+        * will be saved to cache.
+        *
+        * Most callers should ignore the current value, but it can be used
+        * to maintain "most recent X" values that come from time or sequence
+        * based source data, provided that the "as of" id/time is tracked.
+        *
+        * Usage of $checkKeys is the same as with get().
+        *
+        * The simplest way to avoid stampedes for hot keys is to use
+        * the 'lockTSE' option in $opts. If cache purges are needed, also:
+        *   a) Pass $key into $checkKeys
+        *   b) Use touchCheckKey( $key ) instead of delete( $key )
+        * Following this pattern lets the old cache be used until a
+        * single thread updates it as needed. Also consider tweaking
+        * the 'lowTTL' parameter.
+        *
+        * Example usage:
+        * <code>
+        *     $key = wfMemcKey( 'cat-recent-actions', $catId );
+        *     // Function that derives the new key value given the old value
+        *     $callback = function( $cValue ) { ... };
+        *     // Get the key value from cache or from source on cache miss;
+        *     // try to only let one cluster thread manage doing cache updates
+        *     $opts = array( 'lockTSE' => 5, 'lowTTL' => 10 );
+        *     $value = $cache->getWithSetCallback( $key, $callback, 60, array(), $opts );
+        * </code>
+        *
+        * Example usage:
+        * <code>
+        *     $key = wfMemcKey( 'cat-state', $catId );
+        *     // The "check" keys that represent things the value depends on;
+        *     // Calling touchCheckKey() on them invalidates "cat-state"
+        *     $checkKeys = array(
+        *         wfMemcKey( 'water-bowls', $houseId ),
+        *         wfMemcKey( 'food-bowls', $houseId ),
+        *         wfMemcKey( 'people-present', $houseId )
+        *     );
+        *     // Function that derives the new key value
+        *     $callback = function() { ... };
+        *     // Get the key value from cache or from source on cache miss;
+        *     // try to only let one cluster thread manage doing cache updates
+        *     $opts = array( 'lockTSE' => 5, 'lowTTL' => 10 );
+        *     $value = $cache->getWithSetCallback( $key, $callback, 60, $checkKeys, $opts );
+        * </code>
+        *
+        * @see WANObjectCache::get()
+        *
+        * @param string $key Cache key
+        * @param callable $callback Value generation function
+        * @param integer $ttl Seconds to live when the key is updated [0=forever]
+        * @param array $checkKeys List of "check" keys
+        * @param array $opts Options map:
+        *   - lowTTL  : consider pre-emptive updates when the current TTL (sec)
+        *               of the key is less than this. It becomes more likely
+        *               over time, becoming a certainty once the key is expired.
+        *   - lockTSE : if the key is tombstoned or expired less (by $checkKeys)
+        *               than this many seconds ago, then try to have a single
+        *               thread handle cache regeneration at any given time.
+        *               Other threads will try to use stale values if possible.
+        *   - tempTTL : when 'lockTSE' is set, this determines the TTL of the temp
+        *               key used to cache values while a key is tombstoned.
+        *               This avoids excessive regeneration of hot keys on delete() but
+        *               may result in stale values.
+        * @return mixed Value to use for the key
+        */
+       final public function getWithSetCallback(
+               $key, $callback, $ttl, array $checkKeys = array(), array $opts = array()
+       ) {
+               $lowTTL = isset( $opts['lowTTL'] ) ? $opts['lowTTL'] : min( 10, $ttl );
+               $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : -1;
+               $tempTTL = isset( $opts['tempTTL'] ) ? $opts['tempTTL'] : 5;
+
+               // Get the current key value
+               $curTTL = null;
+               $cValue = $this->get( $key, $curTTL, $checkKeys ); // current value
+               $value = $cValue; // return value
+
+               // Determine if a regeneration is desired
+               if ( $value !== false && $curTTL > 0 && !$this->worthRefresh( $curTTL, $lowTTL ) ) {
+                       return $value;
+               }
+
+               if ( !is_callable( $callback ) ) {
+                       throw new InvalidArgumentException( "Invalid cache miss callback provided." );
+               }
+
+               // Assume a key is hot if requested soon after invalidation
+               $isHot = ( $curTTL !== null && $curTTL <= 0 && abs( $curTTL ) <= $lockTSE );
+               $isTombstone = ( $curTTL !== null && $value === false );
+
+               $locked = false;
+               if ( $isHot || $isTombstone ) {
+                       // Acquire a cluster-local non-blocking lock
+                       if ( $this->cache->lock( $key, 0, self::LOCK_TTL ) ) {
+                               // Lock acquired; this thread should update the key
+                               $locked = true;
+                       } elseif ( $value !== false ) {
+                               // If it cannot be acquired; then the stale value can be used
+                               return $value;
+                       } else {
+                               // Either another thread has the lock or the lock failed.
+                               // Use the stash value, which is likely from the prior thread.
+                               $value = $this->cache->get( self::STASH_KEY_PREFIX . $key );
+                               // Regenerate on timeout or if the other thread failed
+                               if ( $value !== false ) {
+                                       return $value;
+                               }
+                       }
+               }
+
+               // Generate the new value from the callback...
+               $value = call_user_func( $callback, $cValue );
+               // When delete() is called, writes are write-holed by the tombstone,
+               // so use a special stash key to pass the new value around threads.
+               if ( $value !== false && ( $isHot || $isTombstone ) ) {
+                       $this->cache->set( self::STASH_KEY_PREFIX . $key, $value, $tempTTL );
+               }
+
+               if ( $locked ) {
+                       $this->cache->unlock( $key );
+               }
+
+               if ( $value !== false ) {
+                       // Update the cache; this will fail if the key is tombstoned
+                       $this->set( $key, $value, $ttl );
+               }
+
+               return $value;
+       }
+
+       /**
+        * Get the "last error" registered; clearLastError() should be called manually
+        * @return int ERR_* constant for the "last error" registry
+        */
+       final public function getLastError() {
+               if ( $this->lastRelayError ) {
+                       // If the cache and the relayer failed, focus on the later.
+                       // An update not making it to the relayer means it won't show up
+                       // in other DCs (nor will consistent re-hashing see up-to-date values).
+                       // On the other hand, if just the cache update failed, then it should
+                       // eventually be applied by the relayer.
+                       return $this->lastRelayError;
+               }
+
+               $code = $this->cache->getLastError();
+               switch ( $code ) {
+                       case BagOStuff::ERR_NONE:
+                               return self::ERR_NONE;
+                       case BagOStuff::ERR_NO_RESPONSE:
+                               return self::ERR_NO_RESPONSE;
+                       case BagOStuff::ERR_UNREACHABLE:
+                               return self::ERR_UNREACHABLE;
+                       default:
+                               return self::ERR_UNEXPECTED;
+               }
+       }
+
+       /**
+        * Clear the "last error" registry
+        */
+       final public function clearLastError() {
+               $this->cache->clearLastError();
+               $this->lastRelayError = self::ERR_NONE;
+       }
+
+       /**
+        * Do the actual async bus purge of a key
+        *
+        * This must set the key to "PURGED:<UNIX timestamp>"
+        *
+        * @param string $key Cache key
+        * @param integer $ttl How long to keep the tombstone [seconds]
+        * @return bool Success
+        */
+       protected function relayPurge( $key, $ttl ) {
+               $event = $this->cache->modifySimpleRelayEvent( array(
+                       'cmd' => 'set',
+                       'key' => $key,
+                       'val' => 'PURGED:$UNIXTIME$',
+                       'ttl' => max( $ttl, 1 ),
+                       'sbt' => true, // substitute $UNIXTIME$ with actual microtime
+               ) );
+
+               $ok = $this->relayer->notify( "{$this->pool}:purge", $event );
+               if ( !$ok ) {
+                       $this->lastRelayError = self::ERR_RELAY;
+               }
+
+               return $ok;
+       }
+
+       /**
+        * Check if a key should be regenerated (using random probability)
+        *
+        * This returns false if $curTTL >= $lowTTL. Otherwise, the chance
+        * of returning true increases steadily from 0% to 100% as the $curTTL
+        * moves from $lowTTL to 0 seconds. This handles widely varying
+        * levels of cache access traffic.
+        *
+        * @param float|INF $curTTL Approximate TTL left on the key if present
+        * @param float $lowTTL Consider a refresh when $curTTL is less than this
+        * @return bool
+        */
+       protected function worthRefresh( $curTTL, $lowTTL ) {
+               if ( $curTTL >= $lowTTL ) {
+                       return false;
+               } elseif ( $curTTL <= 0 ) {
+                       return true;
+               }
+
+               $chance = ( 1 - $curTTL / $lowTTL );
+
+               return mt_rand( 1, 1e9 ) <= 1e9 * $chance;
+       }
+
+       /**
+        * Do not use this method outside WANObjectCache
+        *
+        * @param mixed $value
+        * @param integer $ttl [0=forever]
+        * @return string
+        */
+       protected function wrap( $value, $ttl ) {
+               return array(
+                       self::FLD_VERSION => self::VERSION,
+                       self::FLD_VALUE => $value,
+                       self::FLD_TTL => $ttl,
+                       self::FLD_TIME => microtime( true )
+               );
+       }
+
+       /**
+        * Do not use this method outside WANObjectCache
+        *
+        * @param array|string|bool $wrapped
+        * @param float $now Unix Current timestamp (preferrable pre-query)
+        * @return array (mixed; false if absent/invalid, current time left)
+        */
+       protected function unwrap( $wrapped, $now ) {
+               // Check if the value is a tombstone
+               $purgeTimestamp = self::parsePurgeValue( $wrapped );
+               if ( is_float( $purgeTimestamp ) ) {
+                       // Purged values should always have a negative current $ttl
+                       $curTTL = min( -0.000001, $purgeTimestamp - $now );
+                       return array( false, $curTTL );
+               }
+
+               if ( !is_array( $wrapped ) // not found
+                       || !isset( $wrapped[self::FLD_VERSION] ) // wrong format
+                       || $wrapped[self::FLD_VERSION] !== self::VERSION // wrong version
+               ) {
+                       return array( false, null );
+               }
+
+               if ( $wrapped[self::FLD_TTL] > 0 ) {
+                       // Get the approximate time left on the key
+                       $age = $now - $wrapped[self::FLD_TIME];
+                       $curTTL = max( $wrapped[self::FLD_TTL] - $age, 0.0 );
+               } else {
+                       // Key had no TTL, so the time left is unbounded
+                       $curTTL = INF;
+               }
+
+               return array( $wrapped[self::FLD_VALUE], $curTTL );
+       }
+
+       /**
+        * @param array $keys
+        * @param string $prefix
+        * @return string[]
+        */
+       protected static function prefixCacheKeys( array $keys, $prefix ) {
+               $res = array();
+               foreach ( $keys as $key ) {
+                       $res[] = $prefix . $key;
+               }
+
+               return $res;
+       }
+
+       /**
+        * @param string $value String like "PURGED:<timestamp>"
+        * @return float|bool UNIX timestamp or false on failure
+        */
+       protected static function parsePurgeValue( $value ) {
+               $m = array();
+               if ( is_string( $value ) &&
+                       preg_match( '/^' . self::PURGE_VAL_PREFIX . '([^:]+)$/', $value, $m )
+               ) {
+                       return (float)$m[1];
+               } else {
+                       return false;
+               }
+       }
+}
index 301336f..5da22f0 100644 (file)
@@ -57,6 +57,7 @@ class ObjectCache {
         * @param string $id
         *
         * @return WANObjectCache
+        * @since 1.26
         */
        static function getWANInstance( $id ) {
                if ( isset( self::$wanInstances[$id] ) ) {
@@ -196,6 +197,7 @@ class ObjectCache {
         *
         * @throws MWException
         * @return WANObjectCache
+        * @since 1.26
         */
        static function newWANCacheFromId( $id ) {
                global $wgWANObjectCaches;
@@ -213,4 +215,16 @@ class ObjectCache {
 
                return new $class( $params );
        }
+
+       /**
+        * Get the main WAN cache object
+        *
+        * @return WANObjectCache
+        * @since 1.26
+        */
+       static function getMainWANInstance() {
+               global $wgMainWANCache;
+
+               return self::getWANInstance( $wgMainWANCache );
+       }
 }
diff --git a/includes/objectcache/WANObjectCache.php b/includes/objectcache/WANObjectCache.php
deleted file mode 100755 (executable)
index 6e5cad6..0000000
+++ /dev/null
@@ -1,600 +0,0 @@
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Cache
- * @author Aaron Schulz
- */
-
-/**
- * Multi-datacenter aware caching interface
- *
- * All operations go to the local cache, except the delete()
- * and touchCheckKey(), which broadcast to all clusters.
- * This class is intended for caching data from primary stores.
- * If the get() method does not return a value, then the caller
- * should query the new value and backfill the cache using set().
- * When the source data changes, the delete() method should be called.
- * Since delete() is expensive, it should be avoided. One can do so if:
- *   - a) The object cached is immutable; or
- *   - b) Validity is checked against the source after get(); or
- *   - c) Using a modest TTL is reasonably correct and performant
- * Consider using getWithSetCallback() instead of the get()/set() cycle.
- *
- * Instances of this class must be configured to point to a valid
- * PubSub endpoint, and there must be listeners on the cache servers
- * that subscribe to the endpoint and update the caches.
- *
- * Broadcasted operations like delete() and touchCheckKey() are done
- * synchronously in the local cluster, but are relayed asynchronously.
- * This means that callers in other datacenters will see older values
- * for a however many milliseconds the datacenters are apart. As with
- * any cache, this should not be relied on for cases where reads are
- * used to determine writes to source (e.g. non-cache) data stores.
- *
- * All values are wrapped in metadata arrays. Keys use a "WANCache:" prefix
- * to avoid collisions with keys that are not wrapped as metadata arrays. The
- * prefixes are as follows:
- *   - a) "WANCache:v" : used for regular value keys
- *   - b) "WANCache:s" : used for temporarily storing values of tombstoned keys
- *   - c) "WANCache:t" : used for storing timestamp "check" keys
- *
- * @ingroup Cache
- * @since 1.26
- */
-class WANObjectCache {
-       /** @var BagOStuff The local cluster cache */
-       protected $cache;
-       /** @var string Cache pool name */
-       protected $pool;
-       /** @var EventRelayer */
-       protected $relayer;
-
-       /** @var int */
-       protected $lastRelayError = self::ERR_NONE;
-
-       /** Seconds to tombstone keys on delete() */
-       const HOLDOFF_TTL = 10;
-       /** Seconds to keep dependency purge keys around */
-       const CHECK_KEY_TTL = 31536000; // 1 year
-       /** Seconds to keep lock keys around */
-       const LOCK_TTL = 5;
-
-       /** Cache format version number */
-       const VERSION = 1;
-
-       /** Fields of value holder arrays */
-       const FLD_VERSION = 0;
-       const FLD_VALUE = 1;
-       const FLD_TTL = 2;
-       const FLD_TIME = 3;
-
-       /** Possible values for getLastError() */
-       const ERR_NONE = 0; // no error
-       const ERR_NO_RESPONSE = 1; // no response
-       const ERR_UNREACHABLE = 2; // can't connect
-       const ERR_UNEXPECTED = 3; // response gave some error
-       const ERR_RELAY = 4; // relay broadcast failed
-
-       const VALUE_KEY_PREFIX = 'WANCache:v:';
-       const STASH_KEY_PREFIX = 'WANCache:s:';
-       const TIME_KEY_PREFIX = 'WANCache:t:';
-
-       const PURGE_VAL_PREFIX = 'PURGED:';
-
-       /**
-        * @param array $params
-        *   - cache   : BagOStuff object
-        *   - pool    : pool name
-        *   - relayer : EventRelayer object
-        */
-       public function __construct( array $params ) {
-               $this->cache = $params['cache'];
-               $this->pool = $params['pool'];
-               $this->relayer = $params['relayer'];
-       }
-
-       /**
-        * Fetch the value of a key from cache
-        *
-        * If passed in, $curTTL is set to the remaining TTL (current time left):
-        *   - a) INF; if the key exists and has no TTL
-        *   - b) float (>=0); if the key exists and has a TTL
-        *   - c) float (<0); if the key is tombstoned or expired by $checkKeys
-        *   - d) null; if the key does not exist and is not tombstoned
-        *
-        * If a key is tombstoned, $curTTL will reflect the time since delete().
-        *
-        * The timestamp of $key will be checked against the last-purge timestamp
-        * of each of $checkKeys. Those $checkKeys not in cache will have the last-purge
-        * initialized to the current timestamp. If any of $checkKeys have a timestamp
-        * greater than that of $key, then $curTTL will reflect how long ago $key
-        * became invalid. Callers can use $curTTL to know when the value is stale.
-        * The $checkKeys parameter allow mass invalidations by updating a single key:
-        *   - a) Each "check" key represents "last purged" of some source data
-        *   - b) Callers pass in relevant "check" keys as $checkKeys in get()
-        *   - c) When the source data that "check" keys represent changes,
-        *        the touchCheckKey() method is called on them
-        *
-        * For keys that are hot/expensive, consider using getWithSetCallback() instead.
-        *
-        * @param string $key Cache key
-        * @param mixed $curTTL Approximate TTL left on the key if present [returned]
-        * @param array $checkKeys List of "check" keys
-        * @return mixed Value of cache key or false on failure
-        */
-       final public function get( $key, &$curTTL = null, array $checkKeys = array() ) {
-               $curTTLs = array();
-               $values = $this->getMulti( array( $key ), $curTTLs, $checkKeys );
-               $curTTL = isset( $curTTLs[$key] ) ? $curTTLs[$key] : null;
-
-               return isset( $values[$key] ) ? $values[$key] : false;
-       }
-
-       /**
-        * Fetch the value of several keys from cache
-        *
-        * @see WANObjectCache::get()
-        *
-        * @param array $keys List of cache keys
-        * @param array $curTTLs Map of (key => approximate TTL left) for existing keys [returned]
-        * @param array $checkKeys List of "check" keys
-        * @return array Map of (key => value) for keys that exist
-        */
-       final public function getMulti(
-               array $keys, &$curTTLs = array(), array $checkKeys = array()
-       ) {
-               $result = array();
-               $curTTLs = array();
-
-               $vPrefixLen = strlen( self::VALUE_KEY_PREFIX );
-               $valueKeys = self::prefixCacheKeys( $keys, self::VALUE_KEY_PREFIX );
-               $checkKeys = self::prefixCacheKeys( $checkKeys, self::TIME_KEY_PREFIX );
-
-               // Fetch all of the raw values
-               $wrappedValues = $this->cache->getMulti( array_merge( $valueKeys, $checkKeys ) );
-               $now = microtime( true );
-
-               // Get/initialize the timestamp of all the "check" keys
-               $checkKeyTimes = array();
-               foreach ( $checkKeys as $checkKey ) {
-                       $timestamp = isset( $wrappedValues[$checkKey] )
-                               ? self::parsePurgeValue( $wrappedValues[$checkKey] )
-                               : false;
-                       if ( !is_float( $timestamp ) ) {
-                               // Key is not set or invalid; regenerate
-                               $this->cache->add( $checkKey,
-                                       self::PURGE_VAL_PREFIX . $now, self::CHECK_KEY_TTL );
-                               $timestamp = $now;
-                       }
-
-                       $checkKeyTimes[] = $timestamp;
-               }
-
-               // Get the main cache value for each key and validate them
-               foreach ( $valueKeys as $vKey ) {
-                       if ( !isset( $wrappedValues[$vKey] ) ) {
-                               continue; // not found
-                       }
-
-                       $key = substr( $vKey, $vPrefixLen ); // unprefix
-
-                       list( $value, $curTTL ) = $this->unwrap( $wrappedValues[$vKey], $now );
-                       if ( $value !== false ) {
-                               $result[$key] = $value;
-                               foreach ( $checkKeyTimes as $checkKeyTime ) {
-                                       // Force dependant keys to be invalid for a while after purging
-                                       // to reduce race conditions involving stale data getting cached
-                                       $safeTimestamp = $checkKeyTime + self::HOLDOFF_TTL;
-                                       if ( $safeTimestamp >= $wrappedValues[$vKey][self::FLD_TIME] ) {
-                                               $curTTL = min( $curTTL, $checkKeyTime - $now );
-                                       }
-                               }
-                       }
-
-                       $curTTLs[$key] = $curTTL;
-               }
-
-               return $result;
-       }
-
-       /**
-        * Set the value of a key from cache
-        *
-        * Simply calling this method when source data changes is not valid because
-        * the changes do not replicate to the other WAN sites. In that case, delete()
-        * should be used instead. This method is intended for use on cache misses.
-        *
-        * @param string $key Cache key
-        * @param mixed $value
-        * @param integer $ttl Seconds to live [0=forever]
-        * @return bool Success
-        */
-       final public function set( $key, $value, $ttl = 0 ) {
-               $key = self::VALUE_KEY_PREFIX . $key;
-               $wrapped = $this->wrap( $value, $ttl );
-
-               $func = function ( $cache, $key, $cWrapped ) use ( $wrapped ) {
-                       return ( is_string( $cWrapped ) )
-                               ? false // key is tombstoned; do nothing
-                               : $wrapped;
-               };
-
-               return $this->cache->merge( $key, $func, $ttl, 1 );
-       }
-
-       /**
-        * Purge a key from all clusters
-        *
-        * This instantiates a hold-off period where the key cannot be
-        * written to avoid race conditions where dependent keys get updated
-        * with a stale value (e.g. from a DB slave).
-        *
-        * This should only be called when the underlying data (being cached)
-        * changes in a significant way. If called twice on the same key, then
-        * the last TTL takes precedence.
-        *
-        * @param string $key Cache key
-        * @param integer $ttl How long to block writes to the key [seconds]
-        * @return bool True if the item was purged or not found, false on failure
-        */
-       final public function delete( $key, $ttl = self::HOLDOFF_TTL ) {
-               $key = self::VALUE_KEY_PREFIX . $key;
-               // Update the local cluster immediately
-               $ok = $this->cache->set( $key, self::PURGE_VAL_PREFIX . microtime( true ), $ttl );
-               // Publish the purge to all clusters
-               return $this->relayPurge( $key, $ttl ) && $ok;
-       }
-
-       /**
-        * Fetch the value of a timestamp "check" key
-        *
-        * @param string $key
-        * @return float|bool TS_UNIX timestamp of the key; false if not present
-        */
-       final public function getCheckKeyTime( $key ) {
-               return self::parsePurgeValue( $this->cache->get( self::TIME_KEY_PREFIX . $key ) );
-       }
-
-       /**
-        * Purge a "check" key from all clusters, invalidating keys that use it
-        *
-        * This should only be called when the underlying data (being cached)
-        * changes in a significant way, and it is impractical to call delete()
-        * on all keys that should be changed. When get() is called on those
-        * keys, the relevant "check" keys must be supplied for this to work.
-        *
-        * The "check" key essentially represents a last-modified field.
-        * It is set in the future a few seconds when this is called, to
-        * avoid race conditions where dependent keys get updated with a
-        * stale value (e.g. from a DB slave).
-        *
-        * @see WANObjectCache::get()
-        *
-        * @param string $key Cache key
-        * @return bool True if the item was purged or not found, false on failure
-        */
-       final public function touchCheckKey( $key ) {
-               $key = self::TIME_KEY_PREFIX . $key;
-               // Update the local cluster immediately
-               $ok = $this->cache->set( $key,
-                       self::PURGE_VAL_PREFIX . microtime( true ), self::CHECK_KEY_TTL );
-               // Publish the purge to all clusters
-               return $this->relayPurge( $key, self::CHECK_KEY_TTL ) && $ok;
-       }
-
-       /**
-        * Method to fetch/regenerate cache keys
-        *
-        * On cache miss, the key will be set to the callback result.
-        * The callback function returns the new value given the current
-        * value (false if not present). If false is returned, then nothing
-        * will be saved to cache.
-        *
-        * Most callers should ignore the current value, but it can be used
-        * to maintain "most recent X" values that come from time or sequence
-        * based source data, provided that the "as of" id/time is tracked.
-        *
-        * Usage of $checkKeys is the same as with get().
-        *
-        * The simplest way to avoid stampedes for hot keys is to use
-        * the 'lockTSE' option in $opts. If cache purges are needed, also:
-        *   a) Pass $key into $checkKeys
-        *   b) Use touchCheckKey( $key ) instead of delete( $key )
-        * Following this pattern lets the old cache be used until a
-        * single thread updates it as needed. Also consider tweaking
-        * the 'lowTTL' parameter.
-        *
-        * Example usage:
-        * <code>
-        *     $key = wfMemcKey( 'cat-recent-actions', $catId );
-        *     // Function that derives the new key value given the old value
-        *     $callback = function( $cValue ) { ... };
-        *     // Get the key value from cache or from source on cache miss;
-        *     // try to only let one cluster thread manage doing cache updates
-        *     $opts = array( 'lockTSE' => 5, 'lowTTL' => 10 );
-        *     $value = $cache->getWithSetCallback( $key, $callback, 60, array(), $opts );
-        * </code>
-        *
-        * Example usage:
-        * <code>
-        *     $key = wfMemcKey( 'cat-state', $catId );
-        *     // The "check" keys that represent things the value depends on;
-        *     // Calling touchCheckKey() on them invalidates "cat-state"
-        *     $checkKeys = array(
-        *         wfMemcKey( 'water-bowls', $houseId ),
-        *         wfMemcKey( 'food-bowls', $houseId ),
-        *         wfMemcKey( 'people-present', $houseId )
-        *     );
-        *     // Function that derives the new key value
-        *     $callback = function() { ... };
-        *     // Get the key value from cache or from source on cache miss;
-        *     // try to only let one cluster thread manage doing cache updates
-        *     $opts = array( 'lockTSE' => 5, 'lowTTL' => 10 );
-        *     $value = $cache->getWithSetCallback( $key, $callback, 60, $checkKeys, $opts );
-        * </code>
-        *
-        * @see WANObjectCache::get()
-        *
-        * @param string $key Cache key
-        * @param callable $callback Value generation function
-        * @param integer $ttl Seconds to live when the key is updated [0=forever]
-        * @param array $checkKeys List of "check" keys
-        * @param array $opts Options map:
-        *   - lowTTL  : consider pre-emptive updates when the current TTL (sec)
-        *               of the key is less than this. It becomes more likely
-        *               over time, becoming a certainty once the key is expired.
-        *   - lockTSE : if the key is tombstoned or expired less (by $checkKeys)
-        *               than this many seconds ago, then try to have a single
-        *               thread handle cache regeneration at any given time.
-        *               Other threads will try to use stale values if possible.
-        *   - tempTTL : when 'lockTSE' is set, this determines the TTL of the temp
-        *               key used to cache values while a key is tombstoned.
-        *               This avoids excessive regeneration of hot keys on delete() but
-        *               may result in stale values.
-        * @return mixed Value to use for the key
-        */
-       final public function getWithSetCallback(
-               $key, $callback, $ttl, array $checkKeys = array(), array $opts = array()
-       ) {
-               $lowTTL = isset( $opts['lowTTL'] ) ? $opts['lowTTL'] : min( 10, $ttl );
-               $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : -1;
-               $tempTTL = isset( $opts['tempTTL'] ) ? $opts['tempTTL'] : 5;
-
-               // Get the current key value
-               $curTTL = null;
-               $cValue = $this->get( $key, $curTTL, $checkKeys ); // current value
-               $value = $cValue; // return value
-
-               // Determine if a regeneration is desired
-               if ( $value !== false && $curTTL > 0 && !$this->worthRefresh( $curTTL, $lowTTL ) ) {
-                       return $value;
-               }
-
-               if ( !is_callable( $callback ) ) {
-                       throw new InvalidArgumentException( "Invalid cache miss callback provided." );
-               }
-
-               // Assume a key is hot if requested soon after invalidation
-               $isHot = ( $curTTL !== null && $curTTL <= 0 && abs( $curTTL ) <= $lockTSE );
-               $isTombstone = ( $curTTL !== null && $value === false );
-
-               $locked = false;
-               if ( $isHot || $isTombstone ) {
-                       // Acquire a cluster-local non-blocking lock
-                       if ( $this->cache->lock( $key, 0, self::LOCK_TTL ) ) {
-                               // Lock acquired; this thread should update the key
-                               $locked = true;
-                       } elseif ( $value !== false ) {
-                               // If it cannot be acquired; then the stale value can be used
-                               return $value;
-                       } else {
-                               // Either another thread has the lock or the lock failed.
-                               // Use the stash value, which is likely from the prior thread.
-                               $value = $this->cache->get( self::STASH_KEY_PREFIX . $key );
-                               // Regenerate on timeout or if the other thread failed
-                               if ( $value !== false ) {
-                                       return $value;
-                               }
-                       }
-               }
-
-               // Generate the new value from the callback...
-               $value = call_user_func( $callback, $cValue );
-               // When delete() is called, writes are write-holed by the tombstone,
-               // so use a special stash key to pass the new value around threads.
-               if ( $value !== false && ( $isHot || $isTombstone ) ) {
-                       $this->cache->set( self::STASH_KEY_PREFIX . $key, $value, $tempTTL );
-               }
-
-               if ( $locked ) {
-                       $this->cache->unlock( $key );
-               }
-
-               if ( $value !== false ) {
-                       // Update the cache; this will fail if the key is tombstoned
-                       $this->set( $key, $value, $ttl );
-               }
-
-               return $value;
-       }
-
-       /**
-        * Get the "last error" registered; clearLastError() should be called manually
-        * @return int ERR_* constant for the "last error" registry
-        */
-       final public function getLastError() {
-               if ( $this->lastRelayError ) {
-                       // If the cache and the relayer failed, focus on the later.
-                       // An update not making it to the relayer means it won't show up
-                       // in other DCs (nor will consistent re-hashing see up-to-date values).
-                       // On the other hand, if just the cache update failed, then it should
-                       // eventually be applied by the relayer.
-                       return $this->lastRelayError;
-               }
-
-               $code = $this->cache->getLastError();
-               switch ( $code ) {
-                       case BagOStuff::ERR_NONE:
-                               return self::ERR_NONE;
-                       case BagOStuff::ERR_NO_RESPONSE:
-                               return self::ERR_NO_RESPONSE;
-                       case BagOStuff::ERR_UNREACHABLE:
-                               return self::ERR_UNREACHABLE;
-                       default:
-                               return self::ERR_UNEXPECTED;
-               }
-       }
-
-       /**
-        * Clear the "last error" registry
-        */
-       final public function clearLastError() {
-               $this->cache->clearLastError();
-               $this->lastRelayError = self::ERR_NONE;
-       }
-
-       /**
-        * Do the actual async bus purge of a key
-        *
-        * This must set the key to "PURGED:<UNIX timestamp>"
-        *
-        * @param string $key Cache key
-        * @param integer $ttl How long to keep the tombstone [seconds]
-        * @return bool Success
-        */
-       protected function relayPurge( $key, $ttl ) {
-               $event = $this->cache->modifySimpleRelayEvent( array(
-                       'cmd' => 'set',
-                       'key' => $key,
-                       'val' => 'PURGED:$UNIXTIME$',
-                       'ttl' => max( $ttl, 1 ),
-                       'sbt' => true, // substitute $UNIXTIME$ with actual microtime
-               ) );
-
-               $ok = $this->relayer->notify( "{$this->pool}:purge", $event );
-               if ( !$ok ) {
-                       $this->lastRelayError = self::ERR_RELAY;
-               }
-
-               return $ok;
-       }
-
-       /**
-        * Check if a key should be regenerated (using random probability)
-        *
-        * This returns false if $curTTL >= $lowTTL. Otherwise, the chance
-        * of returning true increases steadily from 0% to 100% as the $curTTL
-        * moves from $lowTTL to 0 seconds. This handles widely varying
-        * levels of cache access traffic.
-        *
-        * @param float|INF $curTTL Approximate TTL left on the key if present
-        * @param float $lowTTL Consider a refresh when $curTTL is less than this
-        * @return bool
-        */
-       protected function worthRefresh( $curTTL, $lowTTL ) {
-               if ( $curTTL >= $lowTTL ) {
-                       return false;
-               } elseif ( $curTTL <= 0 ) {
-                       return true;
-               }
-
-               $chance = ( 1 - $curTTL / $lowTTL );
-
-               return mt_rand( 1, 1e9 ) <= 1e9 * $chance;
-       }
-
-       /**
-        * Do not use this method outside WANObjectCache
-        *
-        * @param mixed $value
-        * @param integer $ttl [0=forever]
-        * @return string
-        */
-       protected function wrap( $value, $ttl ) {
-               return array(
-                       self::FLD_VERSION => self::VERSION,
-                       self::FLD_VALUE => $value,
-                       self::FLD_TTL => $ttl,
-                       self::FLD_TIME => microtime( true )
-               );
-       }
-
-       /**
-        * Do not use this method outside WANObjectCache
-        *
-        * @param array|string|bool $wrapped
-        * @param float $now Unix Current timestamp (preferrable pre-query)
-        * @return array (mixed; false if absent/invalid, current time left)
-        */
-       protected function unwrap( $wrapped, $now ) {
-               // Check if the value is a tombstone
-               $purgeTimestamp = self::parsePurgeValue( $wrapped );
-               if ( is_float( $purgeTimestamp ) ) {
-                       // Purged values should always have a negative current $ttl
-                       $curTTL = min( -0.000001, $purgeTimestamp - $now );
-                       return array( false, $curTTL );
-               }
-
-               if ( !is_array( $wrapped ) // not found
-                       || !isset( $wrapped[self::FLD_VERSION] ) // wrong format
-                       || $wrapped[self::FLD_VERSION] !== self::VERSION // wrong version
-               ) {
-                       return array( false, null );
-               }
-
-               if ( $wrapped[self::FLD_TTL] > 0 ) {
-                       // Get the approximate time left on the key
-                       $age = $now - $wrapped[self::FLD_TIME];
-                       $curTTL = max( $wrapped[self::FLD_TTL] - $age, 0.0 );
-               } else {
-                       // Key had no TTL, so the time left is unbounded
-                       $curTTL = INF;
-               }
-
-               return array( $wrapped[self::FLD_VALUE], $curTTL );
-       }
-
-       /**
-        * @param array $keys
-        * @param string $prefix
-        * @return string
-        */
-       protected static function prefixCacheKeys( array $keys, $prefix ) {
-               $res = array();
-               foreach ( $keys as $key ) {
-                       $res[] = $prefix . $key;
-               }
-
-               return $res;
-       }
-
-       /**
-        * @param string $value String like "PURGED:<timestamp>"
-        * @return float|bool UNIX timestamp or false on failure
-        */
-       protected static function parsePurgeValue( $value ) {
-               $m = array();
-               if ( is_string( $value ) &&
-                       preg_match( '/^' . self::PURGE_VAL_PREFIX . '([^:]+)$/', $value, $m )
-               ) {
-                       return (float)$m[1];
-               } else {
-                       return false;
-               }
-       }
-}
index f02d66f..5f2a57a 100644 (file)
@@ -25,6 +25,7 @@
 use Psr\Log\LoggerInterface;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\NullLogger;
+
 /**
  * Helper class that detects high-contention DB queries via profiling calls
  *
@@ -52,11 +53,13 @@ class TransactionProfiler implements LoggerAwareInterface {
        );
        /** @var array */
        protected $expect = array(
-               'writes'      => INF,
-               'queries'     => INF,
-               'conns'       => INF,
-               'masterConns' => INF,
-               'maxAffected' => INF
+               'writes'         => INF,
+               'queries'        => INF,
+               'conns'          => INF,
+               'masterConns'    => INF,
+               'maxAffected'    => INF,
+               'readQueryTime'  => INF,
+               'writeQueryTime' => INF,
        );
        /** @var array */
        protected $expectBy = array();
@@ -77,7 +80,7 @@ class TransactionProfiler implements LoggerAwareInterface {
        /**
         * Set performance expectations
         *
-        * With conflicting expect, the most specific ones will be used
+        * With conflicting expectations, the most narrow ones will be used
         *
         * @param string $event (writes,queries,conns,mConns)
         * @param integer $value Maximum count of the event
@@ -93,6 +96,21 @@ class TransactionProfiler implements LoggerAwareInterface {
                }
        }
 
+       /**
+        * Set multiple performance expectations
+        *
+        * With conflicting expectations, the most narrow ones will be used
+        *
+        * @param array $expects Map of (event => limit)
+        * @param $fname
+        * @since 1.26
+        */
+       public function setExpectations( array $expects, $fname ) {
+               foreach ( $expects as $event => $value ) {
+                       $this->setExpectation( $event, $value, $fname );
+               }
+       }
+
        /**
         * Reset performance expectations and hit counters
         *
@@ -170,7 +188,8 @@ class TransactionProfiler implements LoggerAwareInterface {
                $elapsed = ( $eTime - $sTime );
 
                if ( $isWrite && $n > $this->expect['maxAffected'] ) {
-                       $this->logger->info( "Query affected $n row(s):\n" . $query . "\n" . wfBacktrace( true ) );
+                       $this->logger->info( "Query affected $n row(s):\n" . $query . "\n" .
+                               wfBacktrace( true ) );
                }
 
                // Report when too many writes/queries happen...
@@ -180,6 +199,13 @@ class TransactionProfiler implements LoggerAwareInterface {
                if ( $isWrite && $this->hits['writes']++ == $this->expect['writes'] ) {
                        $this->reportExpectationViolated( 'writes', $query );
                }
+               // Report slow queries...
+               if ( !$isWrite && $elapsed > $this->expect['readQueryTime'] ) {
+                       $this->reportExpectationViolated( 'readQueryTime', $query );
+               }
+               if ( $isWrite && $elapsed > $this->expect['writeQueryTime'] ) {
+                       $this->reportExpectationViolated( 'writeQueryTime', $query );
+               }
 
                if ( !$this->dbTrxHoldingLocks ) {
                        // Short-circuit
@@ -268,7 +294,8 @@ class TransactionProfiler implements LoggerAwareInterface {
                $n = $this->expect[$expect];
                $by = $this->expectBy[$expect];
                $this->logger->info(
-                       "[{$wgRequest->getMethod()}] Expectation ($expect <= $n) by $by not met:\n$query\n" . wfBacktrace( true )
+                       "[{$wgRequest->getMethod()}] Expectation ($expect <= $n) by $by not met:\n$query\n" .
+                       wfBacktrace( true )
                );
        }
 }
index 1387988..7dc1158 100644 (file)
@@ -233,14 +233,21 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        return false;
                }
 
-               // rc_new is not an ENUM, but adding a redundant rc_new IN (0,1) gives mysql enough
-               // knowledge to use an index merge if it wants (it may use some other index though).
+               // array_merge() is used intentionally here so that hooks can, should
+               // they so desire, override the ORDER BY / LIMIT condition(s); prior to
+               // MediaWiki 1.26 this used to use the plus operator instead, which meant
+               // that extensions weren't able to change these conditions
+               $query_options = array_merge( array(
+                       'ORDER BY' => 'rc_timestamp DESC',
+                       'LIMIT' => $opts['limit'] ), $query_options );
                $rows = $dbr->select(
                        $tables,
                        $fields,
+                       // rc_new is not an ENUM, but adding a redundant rc_new IN (0,1) gives mysql enough
+                       // knowledge to use an index merge if it wants (it may use some other index though).
                        $conds + array( 'rc_new' => array( 0, 1 ) ),
                        __METHOD__,
-                       array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $opts['limit'] ) + $query_options,
+                       $query_options,
                        $join_conds
                );
 
index 1583472..3b9ab74 100644 (file)
        "showpreview": "Як будзе",
        "showdiff": "Розніца",
        "blankarticle": "<strong>Увага:</strong> Вы ствараеце пустую старонку.\nКалі вы націсніце \"{{int:savearticle}}\" яшчэ раз, будзе створана старонка без аніякага зместу.",
-       "anoneditwarning": "Вы не ўвайшлі ў сістэму. Таму, калі вы запішаце старонку, у яе гісторыю трапіць ваш адрас IP.",
+       "anoneditwarning": "<strong>Увага!</strong> Вы не аўтарызаваліся на сайце. Ваш IP-адрас будзе публічна бачным, калі вы будзеце ўносіць любыя праўкі. Калі вы <strong>[$1 ўвойдзеце]</strong> ці <strong>[$2 створыце ўліковы запіс]</strong>, праўкі замест гэтага будуць звязаны з вашым імем карыстальніка, а таксама ў вас з'явяцца іншыя перавагі.",
        "anonpreviewwarning": "''Вы не прайшлі ідэнтыфікацыю Захаванне будзе запісана з вашым IP адрасам у гісторыі правак гэтай старонкі.''",
        "missingsummary": "<strong>Нагадваем:</strong> вы не ўпісалі тлумачэння для сваёй праўкі. Калі націснуць \"{{int:savearticle}}\" яшчэ раз, праўка будзе замацавана без тлумачэння.",
        "missingcommenttext": "Калі ласка, увядзіце ніжэй каментарый.",
        "searchall": "усе",
        "showingresults": "Ніжэй паказаны да {{PLURAL:$1|'''$1''' выніку|'''$1''' вынікаў}}, пачынаючы з нумару '''$2'''.",
        "showingresultsinrange": "Ніжэй паказаны да {{PLURAL:$1|<strong>1</strong> выніку|<strong>$1</strong> вынікаў}} у дыяпазоне ад #<strong>$2</strong> да #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Вынік <strong>$1</strong> з <strong>$3</strong>|Вынікі <strong>$1 — $2</strong> з <strong>$3</strong>}}",
        "search-nonefound": "Нічога не было знойдзена.",
        "powersearch-legend": "Падрабязны пошук",
        "powersearch-ns": "Шукаць у прасторах назваў:",
        "querypage-disabled": "Гэта адмысловая старонка адключана для павышэння прадукцыйнасці.",
        "booksources": "Кнігі",
        "booksources-search-legend": "Знайсці, дзе купіць кнігі",
+       "booksources-search": "Пошук",
        "booksources-text": "Ніжэй паказаны пералік спасылак на іншыя сеціўныя пляцоўкі, якія прадаюць новыя і б/у кнігі, і, магчыма, маюць больш звестак пра кнігі, якіх вы шукаеце:",
        "booksources-invalid-isbn": "Гэты ISBN не выглядае правільным; праверце правільнасць капіравання з арыгіналу.",
        "specialloguserlabel": "Выканаўца:",
        "tooltip-pt-mycontris": "Пералік вашага ўкладу",
        "tooltip-pt-login": "Уваходзіць у сістэму неабавязкова, але вас вельмі запрашаюць гэтак зрабіць.",
        "tooltip-pt-logout": "Выйсці з сістэмы",
+       "tooltip-pt-createaccount": "Вам прапануецца стварыць уліковы запіс і ўвайсці ў сістэму, але гэта не абавязкова",
        "tooltip-ca-talk": "Размовы пра змест гэтай старонкі",
        "tooltip-ca-edit": "Старонку можна правіць. Перш чым запісаць свае змены, паглядзіце на вынік, націснуўшы кнопку папярэдняга прагляду.",
        "tooltip-ca-addsection": "Дадаць новы раздзел",
index 6b1ea42..ea997d2 100644 (file)
        "preview": "Предварителен преглед",
        "showpreview": "Предварителен преглед",
        "showdiff": "Показване на промените",
-       "anoneditwarning": "'''Внимание:''' Не сте влезли в системата. В историята на страницата ще бъде записан вашият IP-адрес.",
+       "anoneditwarning": "<strong>Внимание:</strong> Не сте влезли в системата. Ако направите редакция IP-адресът Ви ще бъде публично видим. Ако <strong>[$1 влезете]</strong> или си <strong>[$2 създадете акаунт]</strong>, редакциите Ви ще бъдат свързани с потребителското Ви име, заедно с други преимущества.",
        "anonpreviewwarning": "Внимание: Не сте влезли в системата. Ако съхраните редакцията си, тя ще бъде записана в историята на страницата с вашият IP-адрес.",
        "missingsummary": "'''Напомняне:''' Не е въведено кратко описание на промените. При повторно натискане на бутона „Съхраняване“, редакцията ще бъде съхранена без резюме.",
        "missingcommenttext": "По-долу въведете вашето съобщение.",
        "tooltip-pt-mycontris": "Списък на вашите приноси",
        "tooltip-pt-login": "Насърчаваме ви да влезете, въпреки че не е задължително.",
        "tooltip-pt-logout": "Излизане от {{SITENAME}}",
+       "tooltip-pt-createaccount": "Насърчаваме Ви да си създадете сметка и да влезете, въпреки че не е задължително.",
        "tooltip-ca-talk": "Беседа относно страницата",
        "tooltip-ca-edit": "Можете да редактирате страницата. Използвайте бутона за предварителен преглед преди да съхраните.",
        "tooltip-ca-addsection": "Започване на нов раздел",
index 71e0108..cc56895 100644 (file)
        "searchrelated": "povezano",
        "searchall": "sve",
        "showingresults": "Dolje {{PLURAL:$1|je prikazan '''1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}} počev od '''$2'''.",
+       "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1 - $2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Nisu pronađeni rezultati koji odgovaraju upitu.",
        "powersearch-legend": "Napredna pretraga",
        "powersearch-ns": "Pretraga u imenskim prostorima:",
index 7280b9c..12d9cea 100644 (file)
        "search-result-size": "$1 ({{PLURAL:$2|1 сăмах|$2 сăмах}})",
        "search-category": "(категори $1)",
        "search-interwiki-caption": "Тăван проектсем",
+       "search-interwiki-more": "(тата)",
        "search-relatedarticle": "Çыхăнă",
        "searchrelated": "çыхăнă",
        "showingresults": "Аяларах эсир <strong>$2</strong> пуçласа кăтартнă <strong>$1</strong> йĕркене куратăр.",
        "tooltip-watch": "Çак страницăна пăхса тăмаллисем шутне хуш",
        "tooltip-summary": "Кĕскĕн ăнлантарса парăр",
        "anonymous": "{{GRAMMAR:genitive|{{SITENAME}}}} анонимлă хутшăнакансем",
-       "lastmodifiedatby": "Ку страницăна юлашки хут $2, $1 вăхăтра $3 хутшăнакан улăштарнă.",
+       "siteuser": "{{SITENAME}} усă куракан $1",
+       "lastmodifiedatby": "Ку страницăна юлашки хут $2, $1 вăхăтра $3 улăштарнă.",
        "othercontribs": "$1 ĕçĕ çинче никĕсленнĕ.",
        "others": "ыттисем",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|усă куракан|усă куракансем}} $1",
        "creditspage": "Пархатарлăх",
        "spambot_username": "MediaWiki спамран тасатни",
        "pageinfo-title": "\"$1\" çинчен",
index e21e5e7..e827d01 100644 (file)
                        "✓",
                        "XenonX3",
                        "Brackenheim",
-                       "Robby"
+                       "Robby",
+                       "Andreasburmeister"
                ]
        },
        "tog-underline": "Links unterstreichen:",
        "tog-hideminor": "Kleine Änderungen in den „Letzten Änderungen“ ausblenden",
        "tog-hidepatrolled": "Kontrollierte Änderungen in den „Letzten Änderungen“ ausblenden",
        "tog-newpageshidepatrolled": "Kontrollierte Seiten bei den „Neuen Seiten“ ausblenden",
-       "tog-extendwatchlist": "Alle, und nicht nur die aktuellsten Änderungen in der Beobachtungsliste anzeigen",
+       "tog-extendwatchlist": "In der Beobachtungsliste alle Änderungen anzeigen, nicht nur die aktuellsten",
        "tog-usenewrc": "Änderungen auf „Letzte Änderungen“ und der Beobachtungsliste nach Seite gruppieren",
        "tog-numberheadings": "Überschriften automatisch nummerieren",
        "tog-showtoolbar": "Bearbeiten-Werkzeugleiste anzeigen",
index 41587f4..77f0a36 100644 (file)
        "history-feed-description": "Stòria 'd la pàgina in sém a cól sî ché",
        "history-feed-item-nocomment": "$1 al $2",
        "history-feed-empty": "La pàgina serchêda l'an gh'é mìa; la pré èser stēda scanşlêda dal sît o gh'é stê cambiê nòm. Verifichêr cun [[Special:Search|pàgina 'd sèirca]] se gh'é dal pàgini nōvi.",
+       "history-edit-tags": "Mudéfica 'l j etichèti dal versiòun sgnêdi",
        "rev-deleted-comment": "(argumèint ed la mudéfica armôs)",
        "rev-deleted-user": "(nòm utèint armôs)",
        "rev-deleted-event": "(particulêr dal log armôs)",
        "backend-fail-create": "An n'é mìa pusébil fêr al file \"$1\".",
        "backend-fail-maxsize": "L'é impusébil fêr al file \"$1\" perché l'é pió grôs ed {{PLURAL:$2|un|$2}} byte.",
        "backend-fail-readonly": "Al prugrâma 'd memôria \"$1\" adèsa a 's pōl sōl lēzer. La ragiòun dêda l'é: \"$2\".",
+       "backend-fail-synced": "Al file \"$1\" l'é in un stêt mìa lôgich cun al sistēma 'd la memôria intêrna.",
+       "backend-fail-connect": "Impusébil coleghêres al sistēma 'd memôria \"$1\".",
+       "backend-fail-internal": "É sucès un erōr mìa cgnusû int al sistēma  ed memôria \"$1\".",
+       "backend-fail-contenttype": "Impusébil stabilîr al gèner di file 'd archiviêr in \"$1\".",
+       "backend-fail-batchsize": "Al sistēma 'd memōria l'à dê  un totêl ed \"$1\" 'd {{PLURAL:$1|operazione|operasiòun}} 'd archévi; al lémit l' é 'd \"$2\"  'd {{PLURAL:$2|operazione|operasiòun}}.",
+       "backend-fail-usable": "Impusébil lēzer o scréver al file \"$1\" a câşva ed dirét insuficînt o a mânca l'indirés al  sistēma di file/spâsi insuficînt.",
        "license": "Licèinsa:",
        "license-header": "Licèinsa",
        "nolicense": "Nisóna licèinsa sgnêda",
index ce80478..319c398 100644 (file)
        "preview": "Forskoðan",
        "showpreview": "Forskoðan",
        "showdiff": "Sýn broytingar",
-       "anoneditwarning": "'''Ávaring:''' Tú hevur ikki ritað inn.\nTín IP-adressa verður goymd í rættisøguni fyri hesa síðuna.",
+       "anoneditwarning": "<strong>Ávaring:</strong> Tú ert ikki innritað/ur. Tín IP adressa verður alment sjónlig um tú gert rættingar. Um tú <strong>[$1 ritar inn]</strong> ella <strong>[$2 upprættar eina konto]</strong>, so verða tínar rættingar ognaðar tínum brúkaranavni, umframt aðrir fyrimunir.",
        "anonpreviewwarning": "''Tú ert ikki innritað/ur. Um tú goymir nú, so verður tín IP adressa goymd í rættingar søguni hjá hesi síðu. ''",
        "missingsummary": "'''Áminning:''' Tú hevur ikki givið nakran rættingar samandrátt.\nUm tú trýstir á \"{{int:savearticle}}\" enn einaferð, so verða tínar rættingar goymdar uttan samandrátt.",
        "missingcommenttext": "Vinarliga skriva eina viðmerking niðanfyri.",
        "showhideselectedversions": "Vís/fjal valdu versjónir",
        "editundo": "afturstilla",
        "diff-empty": "(Ongin munur)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Ein millumliggjandi broyting|$1 millumliggjandi broytingar}} av sama brúkara ikki víst/ar)",
        "diff-multi-manyusers": "({{PLURAL:$1|Ein versjón sum liggur ímillum|$1 versjónir sum liggja ímillum}} skrivaðar av meira enn $2 {{PLURAL:$2|brúkara|brúkarum}} ikki víst)",
        "searchresults": "Leitúrslit",
        "searchresults-title": "Leiti úrslit fyri \"$1\"",
        "searchall": "alt",
        "showingresults": "Niðanfyri standa upp til {{PLURAL:$1|'''$1''' úrslit, sum byrjar|'''$1''' úrslit, sum byrja}} við #<b>$2</b>.",
        "showingresultsinrange": "Niðanfyri verða víst upp til {{PLURAL:$1|<strong>1</strong> úrslit|<strong>$1</strong> úrslit}} í økinum #<strong>$2</strong> til #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Úrslit <strong>$1</strong> av <strong>$3</strong>|Úrslit <strong>$1 - $2</strong> av <strong>$3</strong>}}",
        "search-nonefound": "Leitingin gav onki úrslit.",
        "powersearch-legend": "Víðkað leitan",
        "powersearch-ns": "Leita í navnaøkinum:",
        "undelete-show-file-submit": "Ja",
        "namespace": "Navnarúm:",
        "invert": "Umvend val",
+       "tooltip-invert": "Set kross í henda rútin fyri at fjala broytingar á síðum ið hoyra til tað valda navnarúmið (og tilhoyrandi navnarúm, um krossur er settur í)",
        "namespace_association": "Tilknýtt navnarúm",
        "tooltip-namespace_association": "Set kross í henda kassan soleiðis at kjak- ella evnisnavnarúm, sum hava samband við tað valda navnarúmið, eisini vera tikin við",
        "blanknamespace": "(Greinir)",
        "import-interwiki-history": "Avrita alla versjónssøguna fyri hesa síðu",
        "import-interwiki-templates": "Tak allar fyrimyndir við",
        "import-interwiki-submit": "Innflyta",
-       "import-interwiki-namespace": "Innflyt til navnarúm:",
        "import-upload-filename": "Fílunavn",
        "import-comment": "Viðmerking:",
        "importtext": "Útflyt fíluna frá kelduwiki'ini við at nýta [[Special:Export|útflutningstólið]].\nGoym hana á tínari teldu og legg hana so út her.",
        "tooltip-pt-mycontris": "Yvirlit yvir títt íkast",
        "tooltip-pt-login": "Vit mæla til at tú ritar inn, tað er tó ikki eitt krav.",
        "tooltip-pt-logout": "Rita út",
+       "tooltip-pt-createaccount": "Vit mæla tær til at upprætta eina konto, tað er tó ikki eitt krav.",
        "tooltip-ca-talk": "Kjak um innihaldssíðuna",
        "tooltip-ca-edit": "Tú kanst broyta hesa síðuna. Vinarliga nýt forskoðanarknøttin áðrenn tú goymir.",
        "tooltip-ca-addsection": "Byrja eitt nýtt brot",
        "exif-imagewidth": "Breidd",
        "exif-imagelength": "Hædd",
        "exif-bitspersample": "Bits per komponent",
+       "exif-orientation": "Rætningur",
+       "exif-xresolution": "Vatnrøtt upploysn",
+       "exif-yresolution": "Loddrøtt upploysn",
+       "exif-datetime": "Broytingartíð",
+       "exif-make": "Framleiðari av myndatólinum",
        "exif-model": "Slag av myndatóli",
+       "exif-software": "Forrit brúkt",
        "exif-artist": "Rithøvundur",
        "exif-copyright": "Upphavsrætt haldari",
+       "exif-exifversion": "Exif versión",
+       "exif-colorspace": "Litrúm",
        "exif-usercomment": "Viðmerkingar frá brúkarum",
+       "exif-datetimeoriginal": "Nær myndin bleiv tikin",
+       "exif-datetimedigitized": "Tíðspunkt fyri talgildan",
        "exif-exposuretime-format": "$1 sek ($2)",
        "exif-flash": "Blits",
        "exif-jpegfilecomment": "JPEG-fíluviðmerking",
        "external_image_whitelist": "↓  #Lat hesa linjuna vera júst sum hon er<pre>\n#Skriva partar av vanligum orðingum (bert partin sum er ímillum //) niðanfyri\n#Hesar verða samanbornar við URL'ar á eksternum (hotlinkaðum) myndum\n#Tey sum passa saman verða víst sum myndir, í øðrum lagi verður bert ein slóð til myndina víst\n#Linjur sum byrja við # verða viðfarin sum viðmerkingar\n#Hetta er ikki følsamt fyri stórir og lítlir bókstavir\n\n#Skriva allar vanligar málberingar omanfyri hesa linju. Lat hesa linjuna verða júst sum hon er</pre>",
        "tag-filter": "[[Special:Tags|Tag]] filtur:",
        "tag-filter-submit": "Filtur",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Merki|Merkir}}]]: $2)",
        "tags-title": "Lyklaorð",
        "tags-edit": "rætta",
        "tags-hitcount": "$1 {{PLURAL:$1|broyting|broytingar}}",
        "compare-rev1": "Versjón 1",
        "compare-rev2": "Versjón 2",
        "compare-submit": "Samanber",
+       "logentry-delete-delete": "$1 {{GENDER:$2|slettaði}} síðuna $3",
+       "logentry-move-move": "$1 {{GENDER:$2|flutti}} síðuna $3 til $4",
        "logentry-newusers-create": "Brúkarakonta $1 varð {{GENDER:$2|upprættað}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|legði út}} $3",
        "rightsnone": "(ongin)",
        "revdelete-summary": "yvirlit yvir broytingar",
        "searchsuggest-search": "Leita",
index ab28352..356cf0c 100644 (file)
        "tags-apply-not-allowed-one": "La balise « $1 » n’est pas autorisée à être appliquée manuellement.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|La balise suivante n’est pas autorisée à être appliquée|Les balises suivantes ne sont pas autorisées à être appliquées}} manuellement : $1",
        "tags-update-no-permission": "Vous n’avez pas le droit d’ajouter ou de supprimer des balises de modification des révisions individuelles ou des entrées de journal.",
+       "tags-update-add-not-allowed-one": "La balise « $1 » ne peut pas être ajoutée manuellement.",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|La balise suivante ne peut pas être ajoutée|Les balises suivantes ne peuvent pas être ajoutées}} manuellement : $1",
+       "tags-update-remove-not-allowed-one": "La balise « $1 » ne peut pas être enlevée.",
+       "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|La balise suivante ne peut pas être enlevée|Les balises suivantes ne peuvent pas être enlevées}} manuellement : $1",
+       "tags-edit-title": "Modifier les balises",
+       "tags-edit-manage-link": "Gérer les balises",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Révision sélectionnée|Révisions sélectionnées}} de [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Événement de journal sélectionné|Événements de journal sélectionnés}} :",
        "tags-edit-existing-tags-none": "\"Aucun\"",
        "tags-edit-reason": "Motif :",
        "tags-edit-success": "Les modifications ont été appliquées avec succès.",
index 981caf4..73a4c04 100644 (file)
        "pool-errorunknown": "અજ્ઞાત ત્રુટિ",
        "poolcounter-usage-error": "વપરાશ ક્ષતિ: $1",
        "aboutsite": "{{SITENAME}} વિષે",
-       "aboutpage": "પ્રોજેક્ટ:વિષે",
+       "aboutpage": "Project:વિષે",
        "copyright": "અલગથી ઉલ્લેખ ન કરાયો હોય ત્યાં સુધી માહિતી $1 હેઠળ ઉપલબ્ધ છે.",
        "copyrightpage": "{{ns:project}}:પ્રકાશનાધિકાર",
        "currentevents": "વર્તમાન ઘટનાઓ",
        "currentevents-url": "Project:વર્તમાન ઘટનાઓ",
        "disclaimers": "દાવેદારી ઇનકાર",
-       "disclaimerpage": "પ્રોજેક્ટ:સામાન્ય દાવેદારી ઇનકાર",
+       "disclaimerpage": "Project:સર્વસાધારણ દાવેદારી ઇનકાર",
        "edithelp": "ફેરફારો માટે મદદ",
        "mainpage": "મુખપૃષ્ઠ",
        "mainpage-description": "મુખપૃષ્ઠ",
        "policy-url": "Project:નીતિ",
        "portal": "સમાજ મુખપૃષ્ઠ",
-       "portal-url": "પ્રોજેક્ટ:સમાજ મુખપૃષ્ઠ",
+       "portal-url": "Project:સમાજ મુખપૃષ્ઠ",
        "privacy": "ગોપનિયતા નીતિ",
        "privacypage": "Project:ગોપનિયતા નીતિ",
        "badaccess": "પરવાનગીની ખામી",
        "searchrelated": "શોધ સંબંધિત",
        "searchall": "બધા",
        "showingresults": " {{PLURAL:$1|'''1''' પરિણામ|'''$1''' પરિણામો}} સુધી #'''$2''' થી શરૂ  કરી",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>નું પરિણામ <strong>$1</strong>|<strong>$3</strong>નાં પરિણામો <strong>$1 - $2</strong>}}",
        "search-nonefound": "તમે આપેલી માહિતી ને મળતાં આવતાં કોઈ પરિણામો નથી",
        "powersearch-legend": "વધુ પર્યાયો સાથે શોધો",
        "powersearch-ns": "નામસ્થળોમાં શોધો:",
        "tooltip-pt-mycontris": "તમારા યોગદાનની યાદી",
        "tooltip-pt-login": "આપને પ્રવેશ કરવા ભલામણ કરવામાં આવે છે, જોકે તે આવશ્યક નથી",
        "tooltip-pt-logout": "બહાર નીકળો",
-       "tooltip-pt-createaccount": "તમનà«\87 àª\96ાતà«\81àª\82 àª¬àª¨àª¾àªµà«\80નà«\87 àªªà«\8dરવà«\87શ àª\95રવા àª®àª¾àª\9fà«\87 àª\86મàª\82તà«\8dરણ àª\9bà«\87; àª¤à«\87મ àª\95રવà«\81àª\82 àª\9cà«\8bàª\95à«\87, àª\9cરà«\82રà«\80 àª¨àª¥à«\80.",
+       "tooltip-pt-createaccount": "તમનà«\87 àª\96ાતà«\81àª\82 àª¬àª¨àª¾àªµà«\80નà«\87 àªªà«\8dરવà«\87શ àª\95રવા àª®àª¾àª\9fà«\87 àª\86મàª\82તà«\8dરણ àª\9bà«\87; àª¤à«\87મ àª\95રવà«\81àª\82 àª\9cà«\8bàª\95à«\87, àª\86વશà«\8dયàª\95 àª¨àª¥à«\80",
        "tooltip-ca-talk": "અનુક્રમણિકાનાં પાના વિષે ચર્ચા",
        "tooltip-ca-edit": "આપ આ પાનામાં ફેરફાર કરી શકો છો, કાર્ય સુરક્ષિત કરતાં પહેલાં 'ઝલક' બટન ઉપર ક્લિક કરીને જોઇ લેશો",
        "tooltip-ca-addsection": "ચર્ચાનો નવો મુદ્દો ઉમેરો.",
        "tooltip-ca-nstab-main": "સૂચિ વાળું પાનુ જુઓ",
        "tooltip-ca-nstab-user": "સભ્યનું પાનું જુઓ",
        "tooltip-ca-nstab-media": "મિડિયાનું પાનું જુઓ",
-       "tooltip-ca-nstab-special": "àª\86 àª\96ાસ àªªàª¾àª¨à«\81àª\82 àª\9bà«\87, àª¤àª®à«\87 àª¤à«\87માàª\82 àª«à«\87રફાર àª¨àª¾ àª\95રà«\80 àª¶àª\95à«\8b",
+       "tooltip-ca-nstab-special": "àª\86 àª\96ાસ àªªàª¾àª¨à«\81àª\82 àª\9bà«\87, àª¤àª®à«\87 àª¤à«\87માàª\82 àª«à«\87રફાર àª\95રà«\80 àª¶àª\95શà«\8b àª¨àª¹à«\80",
        "tooltip-ca-nstab-project": "પરિયોજનાનું પાનું જુવો",
        "tooltip-ca-nstab-image": "ફાઇલ વિષેનું પાનું જુઓ",
        "tooltip-ca-nstab-mediawiki": "તંત્ર સંદેશ જુઓ",
        "show-big-image": "મૂળભુત ફાઇલ",
        "show-big-image-preview": "આ મહાવરા દ્રશ્યનું માપ: $1.",
        "show-big-image-other": "અન્ય {{PLURAL:$2|આવર્તન|આવર્તનો}}: $1.",
-       "show-big-image-size": "$1 Ã\97 $2 àªªà«\80àª\95à«\8dસલ",
+       "show-big-image-size": "$1 Ã\97 $2 àªªàª¿àª\95à«\8dસà«\87લ",
        "file-info-gif-looped": "આવર્તન  (લુપ)",
        "file-info-gif-frames": " $1 {{PLURAL:$1|છબી|છબીઓ}}",
        "file-info-png-looped": "આવર્તન",
index 7f532c9..dc8d70f 100644 (file)
@@ -19,7 +19,9 @@
                        "아라",
                        "Lilitik22",
                        "GrigorGB",
-                       "Աշոտ1997"
+                       "Աշոտ1997",
+                       "GeoO",
+                       "Դավիթ Սարոյան"
                ]
        },
        "tog-underline": "ընդգծել հղումները՝",
        "edit": "Խմբագրել",
        "edit-local": "Խմբագրել տեղական նկարագրությունը",
        "create": "Ստեղծել",
+       "create-local": "Ավելացնել տեղային նկարագիր",
        "editthispage": "Խմբագրել այս էջը",
        "create-this-page": "Ստեղծել այս էջը",
        "delete": "Ջնջել",
        "createaccount-text": "Ինչ-որ մեկը ստեղծել է «$2» անվանմամբ մասնակցային հաշիվ «$3» գաղտնաբառով {{SITENAME}} ($4) նախագծում՝ նշելով ձեր էլ-հասցեն։ Ձեզ անհրաժեշտ է մտնել համակարգ և փոխել գաղտնաբառը։\n\nԿարող եք անտեսել այս հաղորդագրությունը, եթե հաշիվը ստեղծվել է սխալմամբ։",
        "login-throttled": "Դուք կատարել եք չափից շատ մուտքի փորձ։\nԽնդրում ենք սպասել որոշ ժամանակ կրկին փորձելուց առաջ։",
        "loginlanguagelabel": "Լեզու՝ $1",
-       "pt-login": "Õ\84Õ¿Õ¶ել",
+       "pt-login": "Õ\84Õ¸Ö\82Õ¿Ö\84 Õ£Õ¸Ö\80Õ®ել",
        "pt-login-button": "Մտնել",
-       "pt-createaccount": "Õ\8dÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ« հաշիվ",
+       "pt-createaccount": "Õ\8dÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ¡ÕµÕ«Õ¶ հաշիվ",
        "pt-userlogout": "Դուրս գալ",
        "php-mail-error-unknown": "Անհայտ սխալ PHP-ի mail() ֆունկցիայում",
        "user-mail-no-addy": "Փորձվեց ուղարկել էլ․ նամակ առանց էլ․ հասցեի։",
        "preview": "Նախադիտում",
        "showpreview": "Նախադիտել",
        "showdiff": "Կատարված փոփոխությունները",
-       "anoneditwarning": "'''Ուշադրություն.''' Դուք չեք մտել համակարգ։\nՁեր IP հասցեն կգրանցվի այս էջի խմբագրումների պատմության մեջ։",
+       "anoneditwarning": "<strong>Ուշադրություն,</strong> Դուք չեք մտել համակարգ։ Ցանկացած խմբագրման դեպքում Ձեր IP հասցեն կդառնա բոլորին տեսանելի։ Եթե դուք <strong>[$1 մուտք գործեք]</strong> կամ <strong>[$2 ստեղծեք մասնակցային հաշիվ]</strong>, Ձեր կատարած խմբագրումները կկավեն Ձեր մասնակցային անվան հետ և Դուք կունենաք այլ առավելություններ։",
        "anonpreviewwarning": "<em>Դուք չեք մտել համակարգ։\nՀիշելով Ձեր կատարած խմբագրումը, այն կպահանվի Ձեր IP հասցեի հետ միասին այս էջի խմբագրումների պատմության մեջ։</em>",
        "missingsummary": "'''Հիշեցում.''' Դուք չեք տվել խմբագրման ամփոփում։ «Հիշել» կոճակի կրկնակի մատնահարման դեպքում փոփոխությունները կհիշվեն առանց ամփոփման։",
        "missingcommenttext": "Խնդրում ենք մեկնաբանություն ավելացնել ստորև։",
        "newarticletext": "Դուք հղվել եք դեռևս գոյություն չունեցող էջի։ \nՆոր էջ ստեղծելու համար ստորև գտնվող խմբագրման դաշտում ավելացրեք տեքստ, այնուհետև սեղմեք '''Հիշել էջը''' (այցելեք [$1 օգնության էջը]՝ մանրամասն տեղեկությունների համար)։ \n\nԵթե դուք սխալմամբ եք այստեղ հայտնվել, ապա սեղմեք ձեր դիտարկչի '''հետ''' (back) կոճակը։",
        "anontalkpagetext": "----\n''Այս քննարկման էջը պատկանում է անանուն մասնակցին, որը դեռ չի ստեղծել մասնակցային հաշիվ կամ չի մտել համակարգ մասնակցի անունով։''\nԱյդ իսկ պատճառով օգտագործվում է թվային IP-հասցեն։\nՆման IP-հասցեից կարող են օգտվել մի քանի մասնակիցներ։\nԵթե դուք անանուն մասնակից եք, բայց կարծում եք, որ ուրիշներին վերաբերող դիտողությունները արվում են ձեր հասցեով, ապա խնդրում ենք պարզապես [[Special:UserLogin/signup|գրանցվել]] կամ [[Special:UserLogin|մտնել համակարգ]], որպեսզի հետագայում ձեզ չշփոթեն այլ անանուն մասնակիցների հետ։",
        "noarticletext": "Ներկայումս այս էջում որևէ տեքստ չկա։\nԴուք կարող եք [[Special:Search/{{PAGENAME}}|որոնել այս անվանումը]] այլ էջերում, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} որոնել համապատասխան տեղեկամատյանները] կամ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ստեղծել նոր էջ այս անվանմամբ]</span>։",
-       "noarticletext-nopermission": "Ներկայումս այս էջում որևէ տեքստ չկա։\nԴուք կարող եք [[Special:Search/{{PAGENAME}}|որոնել այս անվանունը]] այլ էջերում կամ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} որոնել այն տեղեկամատյաններում]</span>։",
+       "noarticletext-nopermission": "Ներկայումս այս էջում որևէ տեքստ չկա։\nԴուք կարող եք [[Special:Search/{{PAGENAME}}|որոնել այս անվանունը]] այլ էջերում կամ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} որոնել այն տեղեկամատյաններում]</span>։ Դուք չունեք թույլտվություն ստեղծել այս էջը։",
        "userpage-userdoesnotexist": "«<nowiki>$1</nowiki>» անվանմամբ մասնակից գոյություն չունի։\nԽնդրում ենք հավաստիանալ նրանում, թե արդյոք ուզում եք ստեղծել/խմբագրել այս էջը։",
        "userpage-userdoesnotexist-view": "«$1» անվանմամբ գրանցված մասնակից չկա։",
        "blocked-notice-logextract": "Այս մասնակիցը ներկա պահին արգելափակված է։\nՍտորև ներկայացված է արգելափակման տեղեկամատյանի վերջին գրառումը.",
        "token_suffix_mismatch": "'''Ձեր խմբագրումը մերժվել է, քանի որ ձեր օգտագործած ծրագիրը աղավաղել է կետադրության նշանները խմբագրման դաշտում։ Խմբագրումը մերժվել է էջի տեքստի խաթարումը կանխելու նպատակով։ Սա երբեմն պայմանավորված է սխալներ պարունակող անանվանեցնող վեբ-փոխարինորդ (proxy) ծառայության օգտագործմամբ։'''",
        "editing": "Խմբագրվում է՝ $1 էջը",
        "creating": "Ստեղծվում է՝ $1 էջը",
-       "editingsection": "Խմբագրվում է՝ $1 էջի (բաժինը)",
+       "editingsection": "Խմբագրվում է $1 բաժինը",
        "editingcomment": "Խմբագրվում է՝ $1 էջի (նոր բաժինը)",
        "editconflict": "Խմբագրման ընդհարում. $1",
        "explainconflict": "Մեկ այլ մասնակից փոփոխել է այս տեքստը ձեր խմբագրման ընթացքում։\nՎերին խմբագրման դաշտում ընդգրկված է ընթացիկ տեքստը, որն ենթակա է հիշման։\nՁեր խմբագրումներով տեքստը գտնվում է ստորին դաշտում։\nՈրպեսզի ձեր փոփոխությունները հիշվեն, միաձուլեք դրանք վերին տեքստի մեջ։\n«{{int:savearticle}}» կոճակին սեղմելով կհիշվի '''միայն''' վերևվի դաշտի տեքստը:",
        "nextn": "հաջորդ {{PLURAL:$1|$1}}",
        "prevn-title": "Նախկին $1 {{PLURAL:$1|արդյունքը|արդյունքները}}",
        "nextn-title": "Հաջորդ $1 {{PLURAL:$1|արդյունքը|արդյունքները}}",
+       "shown-title": "Յուրաքանչյուր էջում ցույց տալ $1 {{PLURAL:$1|գրառում|գրառումներ}}",
        "viewprevnext": "Դիտել ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Այս վիքիում, գոյություն ունի \"[[:$1]]\" անվանումով էջը։'''",
-       "searchmenu-new": "'''Ստեղծե՛լ \"[[:$1]]\" էջը այս վիքիում'''",
+       "searchmenu-new": "<strong>Ստեղծել «[[:$1]]» էջը այս վիքիում։</strong> {{PLURAL:$2|0=|Տես նաև քո որոնած բառով գտնված էջը|Տես նաև որոնման արդյունքները։}}",
        "searchprofile-articles": "Հիմնական էջեր",
        "searchprofile-images": "Մուլտիմեդիա",
        "searchprofile-everything": "Ամենուրեք",
        "searchrelated": "հարակից",
        "searchall": "բոլոր",
        "showingresults": "Ստորև բերված է մինչև {{PLURAL:$1|'''1''' արդյունք|'''$1''' արդյունք}}՝ սկսած №&nbsp;<strong>$2</strong>-ից։",
+       "search-showingresults": "{{PLURAL:$4|<strong>$1</strong> արդյունք <strong>$3</strong>-ից|<strong>$1 - $2</strong> արդյունքներ <strong>$3</strong>-ից}}",
        "search-nonefound": "Որոնմանը համապատասխանող արդյունքներ չեն գտնվել։",
        "powersearch-legend": "Ընդլայնված որոնում",
        "powersearch-ns": "Որոնել անվանատարածքում.",
        "recentchanges-label-bot": "Այս խմբագրումը կատարվել է բոտի կողմից",
        "recentchanges-label-unpatrolled": "Այս խմբագրումը դեռ չի պարեկվել",
        "recentchanges-label-plusminus": "Էջի չափսը փոփոխվեց այսքան բայթով",
+       "recentchanges-legend-heading": "'''Լեգենդ՝'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (տես նաև՝  [[Special:NewPages|նոր էջերի ցանկ]])",
        "rcnotefrom": "Ստորև բերված են փոփոխությունները սկսած՝ '''$2''' (մինչև՝ '''$1''')։",
        "rclistfrom": "Ցույց տալ նոր փոփոխությունները սկսած $3 $2",
        "undelete-show-file-submit": "Այո",
        "namespace": "Անվանատարածք.",
        "invert": "Շրջել ընտրությունը",
+       "tooltip-invert": "Նշեք` տվյալ անվանատարածքի և կից անվանատարածքների (եթե նշված է) էջերի փոփոխությունները թաքցնելու համար։",
        "namespace_association": "Կից անվանատարածք",
+       "tooltip-namespace_association": "Նշեք տվյալ անվանատարածքի հետ կապված քննարկումների անվանատարածքը նույնպես ներառելու համար։",
        "blanknamespace": "(Գլխավոր)",
        "contributions": "{{GENDER:$1|Մասնակցի}} ներդրում",
        "contributions-title": "$1 մասնակցի ներդրումը",
        "nolinkshere-ns": "Ընտրված անվանատարածքում '''[[:$1]]''' էջին հղվող էջեր չկան։",
        "isredirect": "վերահղման էջ",
        "istemplate": "ներառում",
-       "isimage": "պատկերի հղումներ",
+       "isimage": "ֆայլի հղում",
        "whatlinkshere-prev": "{{PLURAL:$1|նախորդ|նախորդ $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|հաջորդ|հաջորդ $1}}",
        "whatlinkshere-links": "← հղումներ",
        "tooltip-pt-mycontris": "Ձեր ներդրումների ցանկը",
        "tooltip-pt-login": "Կոչ ենք անում մտնել համակարգ, սակայն դա պարտադիր չէ",
        "tooltip-pt-logout": "Դուրս գալ համակարգից",
+       "tooltip-pt-createaccount": "Խորհուրդ է տրվում ստեղծել մասնակցային հաշիվ և մուտք գործել համակարգ, սակայն դա անելը պարտադիր չէ։",
        "tooltip-ca-talk": "Քննարկումներ այս էջի բովանդակության մասին",
        "tooltip-ca-edit": "Դուք կարող էք խմբագրել այս էջը։ Խնդրում ենք օգտագործել նախադիտման կոճակը հիշելուց առաջ։",
        "tooltip-ca-addsection": "Ստեղծել նոր բաժին",
        "svg-long-desc": "SVG-նիշք, անվանապես $1 × $2 փիքսել, նիշքի չափը՝ $3",
        "show-big-image": "Սկզբնական նիշք",
        "show-big-image-preview": "Նախադիտման չափ՝ $1։",
+       "show-big-image-other": "Այլ {{PLURAL:$2|1=թույլտվություն|թույլտվությաններ}}: $1.",
        "show-big-image-size": "$1 × $2 պիքսել",
        "newimages": "Նոր նիշքերի սրահ",
        "imagelisttext": "Ստորև բերված է '''$1''' {{PLURAL:$1|նիշքի}} ցանկ՝ դասավորված ըստ $2։",
        "metadata-help": "Նիշքը պարունակում է ընդարձակ տվյալները, հավանաբար ավելացված թվային լուսանկարչական ապարատի կամ սկաների կողմից, որոնք օգտագործվել են նկարը ստեղծելու կամ թվայնացնելու համար։\nԵթե նիշքը ձևափոխվել է ստեղծումից ի վեր, ապա որոշ տվյալները կարող են չհամապատասխանել ձևափոխված նիշքին։",
        "metadata-expand": "Ցուց տալ ընդարձակ տվյալները",
        "metadata-collapse": "Թաքցնել ընդարձակ տվյլաները",
-       "metadata-fields": "EXIF Õ´Õ¥Õ¿Õ¡Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö\80Õ« Õ¡ÕµÕ¶ Õ¤Õ¡Õ·Õ¿Õ¥Ö\80Õ¨, Õ¸Ö\80Õ¸Õ¶Ö\84 Õ¶Õ·Õ¾Õ¡Õ® Õ¥Õ¶Ö\84 Õ¡ÕµÕ½ Õ¸Ö\82Õ²Õ¥Ö\80Õ±Õ« Õ´Õ¥Õ», Õ¯Ö\81Õ¸Ö\82Ö\81Õ¡Õ¤Ö\80Õ¾Õ¥Õ¶ ÕºÕ¡Õ¿Õ¯Õ¥Ö\80Õ« Õ§Õ»Õ¸Ö\82Õ¶ Õ¬Õ¼Õ¸Ö\82Õ©ÕµÕ¡Õ´Õ¢։ Այլ տվյալները լռությամբ կթաքցվեն։\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",
+       "metadata-fields": "EXIF Õ´Õ¥Õ¿Õ¡Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö\80Õ« Õ¡ÕµÕ¶ Õ¤Õ¡Õ·Õ¿Õ¥Ö\80Õ¨, Õ¸Ö\80Õ¸Õ¶Ö\84 Õ¶Õ·Õ¾Õ¡Õ® Õ¥Õ¶Ö\84 Õ¡ÕµÕ½ Õ¸Ö\82Õ²Õ¥Ö\80Õ±Õ« Õ´Õ¥Õ», Õ¯Ö\81Õ¸Ö\82Ö\81Õ¡Õ¤Ö\80Õ¾Õ¥Õ¶ ÕºÕ¡Õ¿Õ¯Õ¥Ö\80Õ« Õ§Õ»Õ¸Ö\82Õ´, Õ¥Ö\80Õ¢ Õ´Õ¥Õ¿Õ¡Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö\80Õ« Õ¡Õ²ÕµÕ¸Ö\82Õ½Õ¡Õ¯Õ¨ Õ®Õ¡Õ¬Õ¾Õ¡Õ® Õ§։ Այլ տվյալները լռությամբ կթաքցվեն։\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",
        "exif-imagewidth": "Լայնք",
        "exif-imagelength": "Բարձրություն",
        "exif-orientation": "Դիրք",
        "exif-xresolution": "Հորիզոնական կետաչափ",
        "exif-yresolution": "Ուղղահայաց կետաչափ",
+       "exif-datetime": "Ֆայի փոփոխման ամսաթիվը և ժամանակը",
        "exif-make": "Խցիկի արտադրող",
        "exif-model": "Խցիկի մոդել",
        "exif-software": "Օգտագործված ծրագիր",
        "dberr-problems": "Այս կայքում առաջացել են տեխնիկական խնդիրներ։ Հայցում ենք ձեր ներողությունը։",
        "dberr-again": "Փորձեք մի քանի րոպե սպասել և վերաբեռնել էջը։",
        "htmlform-submit": " \nՀաշվել",
-       "logentry-delete-delete": "$1 ջնջեց էջը $3",
+       "logentry-delete-delete": "$1 {{GENDER:$2|ջնջեց}} $3 էջը",
        "logentry-delete-restore": "$1 վերականգնեց էջը $3",
        "logentry-delete-event": "$1 փոխեց տեղեկամատյանի {{PLURAL:$5|1 գրանցման|$5 գրանցումների}} տեսանելությունը $3-ում. $4",
        "logentry-delete-revision": "$1 փոխեց {{PLURAL:$5|1 խմբագրման|$5 խմբագրումների}} տեսանելությունը $3 էջում. $4",
index edd544b..5bad88d 100644 (file)
        "history-feed-empty": "თქვენს მიერ მოძიებული გვერდი არ არსებობს.\nშესაძლოა იგი წაშლილ იქნა ვიკიდან, ან მისი სათაური შეიცვალა.\nსცადეთ [[Special:Search|searching on the wiki]] მსგავსი გვერდების სანახავად.",
        "rev-deleted-comment": "(რეზიუმე წაიშალა)",
        "rev-deleted-user": "(მომხმარებლის სახელი წაიშალა)",
-       "rev-deleted-event": "(á\83\9fá\83£á\83 á\83\9cá\83\90á\83\9aá\83\98á\83¡ á\83©á\83\90á\83\9cá\83\90á\83¬á\83\94á\83 ი წაშლილია)",
+       "rev-deleted-event": "(á\83\9fá\83£á\83 á\83\9cá\83\90á\83\9aá\83\98á\83¡ á\83\93á\83\94á\83¢á\83\90á\83\9aá\83\94á\83\91ი წაშლილია)",
        "rev-deleted-user-contribs": "[მომხმარებლის სახელი ან IP დამალულია. რეაქტირება ასევე დამალულია]",
        "rev-deleted-text-permission": "გვერდის ეს ჩასწორება '''წაიშალა'''.\nგანმარტება შესაძლოა მოცემული იყოს [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} წაშლათა ჟურნალში].",
        "rev-deleted-text-unhide": "გვერდის ეს ვერსია '''წაიშალა'''.\nახსნა-განმარტება მოცემულია [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} წაშლის ჟურნალში].\nსურვილის შემთხვევაში თქვენ შეგიძლიათ [$1 იხილოთ აღნიშნული ვერსია].",
        "revdelete-legend": "შეზღუდვის დაყენება",
        "revdelete-hide-text": "შეცვლილი ტექსტი",
        "revdelete-hide-image": "ფაილის შინაარსის დამალვა",
-       "revdelete-hide-name": "á\83\93á\83\90á\83\9bá\83\90á\83\9aá\83\94á\83\97 á\83\9bá\83\9dá\83¥á\83\9bá\83\94á\83\93á\83\94á\83\91á\83\90 á\83\93á\83\90 á\83\9bá\83\98á\83¡á\83\98 á\83\9dá\83\91á\83\98á\83\94á\83¥á\83¢ი",
+       "revdelete-hide-name": "á\83\93á\83\90á\83\9bá\83\90á\83\9aá\83\94á\83\97 á\83¡á\83\90á\83\9bá\83\98á\83\96á\83\9cá\83\94 á\83\93á\83\90 á\83\9eá\83\90á\83 á\83\90á\83\9bá\83\94á\83¢á\83 á\83\94á\83\91ი",
        "revdelete-hide-comment": "რედაქტირების კომენტარი",
        "revdelete-hide-user": "რედაქტორის მომხმარებლის სახელი/IP-მისამართი",
        "revdelete-hide-restricted": "დამალეთ მონაცემები ადმინისტრატორთაგან",
        "search-result-category-size": "{{PLURAL:$1|$1 ელემენტი|$1 ელემენტი|$1 ელემენტები}} ({{PLURAL:$2|$2 ქვეკატეგორია|$2 ქვეკატეგორიები|$2 ქვეკატეგორიები}}, {{PLURAL:$3|$3 ფაილი|$3 ფაილი|$3 ფაილი}})",
        "search-redirect": "(გადამისამართება $1)",
        "search-section": "(სექცია $1)",
+       "search-category": "(კატეგორია $1)",
        "search-file-match": "(ემთხვევა ფაილის შინაარსს)",
        "search-suggest": "ხომ არ იგულისხმეთ: $1?",
        "search-interwiki-caption": "დობილი პროექტები",
        "gender-female": "ის (მდედრობითი) არედაქტირებს ვიკი-გვერდებს",
        "prefs-help-gender": "ამ პარამეტრის დაყენება არასავალდებულოა.\nპროგრამული უზრუნველყოფა ამ ინფორმაციას იყენებს მხოლოდ სწორი გრამატიკული სქესით მომართვისათვის.\nეს ინფორმაცია საჯარო იქნება ყველასათვის.",
        "email": "ელ. ფოსტა",
-       "prefs-help-realname": "á\83\9cá\83\90á\83\9bá\83\93á\83\95á\83\98á\83\9aá\83\98 á\83¡á\83\90á\83®á\83\94á\83\9aá\83\98á\83¡ á\83\9bá\83\98á\83\97á\83\98á\83\97á\83\94á\83\91á\83\90 á\83\90á\83£á\83ªá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\9aá\83\98 á\83\90á\83  á\83\90á\83 á\83\98á\83¡, á\83\9bá\83\90á\83\92á\83 á\83\90á\83\9b á\83\97á\83£ á\83\9bá\83\98á\83£á\83\97á\83\98á\83\97á\83\94á\83\91á\83\97 á\83\98á\83¡ á\83\92á\83\90á\83\9bá\83\9dá\83§á\83\94á\83\9cá\83\94á\83\91á\83£á\83\9aá\83\98 á\83\98á\83¥á\83\9cá\83\94á\83\91á\83\90 á\83\97á\83¥á\83\95á\83\94á\83\9cá\83\98 á\83\9cá\83\90á\83\9bá\83£á\83¨á\83\94á\83\95á\83 á\83\98á\83¡ á\83\90á\83¦á\83¡á\83\90á\83\9cá\83\98á\83¨á\83\9cá\83\90á\83\95á\83\90á\83\93.",
+       "prefs-help-realname": "á\83\9cá\83\90á\83\9bá\83\93á\83\95á\83\98á\83\9aá\83\98 á\83¡á\83\90á\83®á\83\94á\83\9aá\83\98á\83¡ á\83\9bá\83\98á\83\97á\83\98á\83\97á\83\94á\83\91á\83\90 á\83\9cá\83\94á\83\91á\83\90á\83§á\83\9dá\83¤á\83\9aá\83\9dá\83\91á\83\98á\83\97á\83\98á\83\90.\ná\83\97á\83£ á\83\97á\83¥á\83\95á\83\94á\83\9c á\83\9bá\83\90á\83¡ á\83\9bá\83\98á\83£á\83\97á\83\98á\83\97á\83\94á\83\91á\83\97 á\83\98á\83¡ á\83¨á\83\94á\83¡á\83\90á\83«á\83\9aá\83\9dá\83\90 á\83\97á\83¥á\83\95á\83\94á\83\9cá\83\98 á\83\9cá\83\90á\83\9bá\83£á\83¨á\83\94á\83\95á\83 á\83\98á\83¡ á\83\90á\83¦á\83¡á\83\90á\83\9cá\83\98á\83¨á\83\9cá\83\90á\83\95á\83\90á\83\93 á\83\98á\83¥á\83\9cá\83\90á\83¡ á\83\92á\83\90á\83\9bá\83\9dá\83§á\83\94á\83\9cá\83\94á\83\91á\83£á\83\9aá\83\98.",
        "prefs-help-email": "ელ. ფოსტის მისამართი არ არის სავალდებულო, მაგრამ მისი მითითება იძლევა ახალი პაროლის გამოგზავნის საშუალებას თქვენი პაროლის დავიწყების შემთხვევაში.",
        "prefs-help-email-others": "ის აგრეთვე მისცემს საშუალებას სხვა მომხმარებლებს, დაგიკავშირდნენ თქვენს პირად გვერდზე მითითებული ბმულის მეშვეობით. თქვენი ელ. ფოსტის მისამართი არ იქნება გამხელილი, როდესაც სხვა მომხმარებლები დაგიკავშირდებიან.",
        "prefs-help-email-required": "თქვენი ელ-ფოსტის მისამართი აუცილებელია.",
        "wlheader-enotif": "ელ.ფოსტით შეტყობინება ჩართულია.",
        "wlheader-showupdated": "თქვენი ბოლო ვიზიტის შემდეგ შეცვლილი გვერდები, აღნიშნულია '''მუქად'''.",
        "wlnote": "ქვემოთ {{PLURAL:$1|ნაჩვენებია ბოლო ცვლილება|ნაჩვენებია ბოლო '''$1''' ცვლილება}} უკანასკნელი {{PLURAL:$2|საათის|'''$2''' საათის}} მანძილზე, $3, $4 მდგომარეობით.",
-       "wlshowlast": "á\83\90á\83©á\83\95á\83\94á\83\9cá\83\94 á\83\91á\83\9dá\83\9aá\83\9d $1 á\83¡á\83\90á\83\90á\83\97á\83\98á\83¡ $2 á\83\93á\83¦á\83\98á\83¡",
+       "wlshowlast": "á\83\91á\83\9dá\83\9aá\83\9d $1 á\83¡á\83\90á\83\90á\83\97á\83\98á\83¡ $2 á\83\93á\83¦á\83\98á\83¡ á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91á\83\90",
        "watchlist-options": "კონტროლის სიის პარამეტრები",
        "watching": "კონტროლებადი...",
        "unwatching": "არაკონტროლირებადი...",
        "thumbnail_gd-library": "ბიბლიოთეკა GD-ს არასწორი კონფიგურაცია: $1 ფუნქცია არ არის აღმოჩენილი",
        "thumbnail_image-missing": "სავარაუდოდ $1 ფაილი არ არსებობს",
        "import": "გვერდების იმპორტი",
-       "importinterwiki": "á\83¢á\83 á\83\90á\83\9cá\83¡á\83\95á\83\98á\83\99á\83\98 იმპორტი",
+       "importinterwiki": "á\83¡á\83®á\83\95á\83\90 á\83\95á\83\98á\83\99á\83\98á\83\93á\83\90á\83\9c იმპორტი",
        "import-interwiki-text": "წარმოადგინეთ ვიკი და იმპორტირებადი გვერდის სახელი.\nცვლილებათა რიცხვები და ავტორთა სახელები შენნარჩუნდება.\nტრანსვიკი იმპორტის ყველა ოპერაცია რეგისტრირდება [[Special:Log/import|სპეციალურ ჟურნალში]].",
+       "import-interwiki-sourcewiki": "წყაროს ვიკი:",
+       "import-interwiki-sourcepage": "წყაროს გვერდი:",
        "import-interwiki-history": "ამ გვერდის ცვლილებათა ისტორიის კოპირება.",
        "import-interwiki-templates": "ყველა თარგის ჩართვა",
        "import-interwiki-submit": "იმპორტირება",
        "import-rootpage-nosubpage": "სახელტა სივრცეში მითითებულ ძირეულ გვერდში „$1“ ქვეგვერდები დაუშვებელია.",
        "importlogpage": "იმპორტის ჟურნალი",
        "importlogpagetext": "ადმინისტრატორთა მიერ გვერდების იმპორტირება  ცვლილებების ჩათვლით სხვა ვიკიდან.",
-       "import-logentry-upload-detail": "$1 ცვლილება",
-       "import-logentry-interwiki-detail": "$1 ცვლილება $2-დან",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|ვერსია|ვერსია}} იმპორტირებულია",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|ვერსია|ვერსია}} იმპორტირებულია $2-დან",
        "javascripttest": "JavaScript-ის ტესტირება",
        "javascripttest-pagetext-noframework": "ეს გვერდი დარეგისტრირებულია JavaScript-ის ტესტების გასაშვებად.",
        "javascripttest-pagetext-unknownframework": "„$1-ის“ ტესტირების უცნობი გარემო.",
        "autosumm-replace": "შინაარსი შეიცვალა „$1“-ით",
        "autoredircomment": "გადამისამართება [[$1]]-ზე",
        "autosumm-new": "ახალი გვერდი: $1",
+       "autosumm-newblank": "ცარიელი გვერდი შეიქმნა",
        "size-bytes": "$1 ბ",
        "size-kilobytes": "$1 კბ",
        "size-megabytes": "$1 მბ",
        "duplicate-defaultsort": "'''ყურადღება.'''სორტირების გასაღებს «$2»-ს გააჭრის წინა გასაღებს «$1»-ს.",
        "version": "ვერსია",
        "version-extensions": "დაყენებული გაფართოებები",
-       "version-skins": "á\83\98á\83\94á\83 á\83¡á\83\90á\83®á\83\94",
+       "version-skins": "á\83\93á\83\90á\83§á\83\94á\83\9cá\83\94á\83\91á\83£á\83\9aá\83\98 á\83\97á\83\94á\83\9bá\83\94á\83\91á\83\98",
        "version-specialpages": "სპეციალური გვერდები",
        "version-parserhooks": "სინტაქსური ანალიზატორის ჰუკები",
        "version-variables": "ცვალებადი",
        "tags-deactivate-title": "ტეგის დეაქტივაცია",
        "tags-deactivate-reason": "მიზეზი:",
        "tags-deactivate-submit": "დეაქტივაცია",
+       "tags-edit-reason": "მიზეზი:",
        "comparepages": "გვერდების შედარება",
        "compare-page1": "1 გვერდი",
        "compare-page2": "2 გვერდი",
        "compare-revision-not-exists": "თქვენ მიერ მითითებული ვერსია არ არსებობს.",
        "dberr-problems": "ბოდიში! საიტზე დროებითი ტექნიკური პრობლემებია",
        "dberr-again": "ეცადეთ რამდენიმე წუთით დაცდა და ამ გვერდის გადატვირთვა",
-       "dberr-info": "ვერ მოხერხდა ინფორმაციის $1 სერვერთან დაკავშირება",
-       "dberr-info-hidden": "(á\83\9bá\83\9dá\83\9cá\83\90á\83ªá\83\94á\83\9bá\83\97á\83\90 á\83\91á\83\90á\83\96á\83\98á\83¡ á\83¡á\83\94á\83 á\83\95á\83\94á\83 á\83\97á\83\90á\83\9c á\83\93á\83\90á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\94á\83\91á\83\90 á\83¨á\83\94á\83£á\83«á\83\9aá\83\94á\83\91á\83\94á\83\9aá\83\98á\83\90)",
+       "dberr-info": "(მონაცემთა ბაზებთან კავშირი არ არის: $1)",
+       "dberr-info-hidden": "(á\83\9bá\83\9dá\83\9cá\83\90á\83ªá\83\94á\83\9bá\83\97á\83\90 á\83\91á\83\90á\83\96á\83\94á\83\91á\83\97á\83\90á\83\9c á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\98 á\83\90á\83  á\83\90á\83 á\83\98á\83¡)",
        "dberr-usegoogle": "ამ დროს კი  შეგიძლიათ Google-ით ძიება",
        "dberr-outofdate": "გაითვალისწინეთ, რომ თქვენი კონტენტის ინდექსები შეიძლება შეუსაბამო იყოს",
        "dberr-cachederror": "ეს არის მოთხოვნილი გვერდის კეშირებული ვერსია, და შესაძლება მოძველდა.",
        "rightsnone": "(არცერთი)",
        "revdelete-summary": "ცვლილებების აღწერა",
        "feedback-adding": "თქვენი შეფასების შენახვა...",
+       "feedback-back": "უკან",
        "feedback-bugcheck": "კარგია! გთხოვთ, კიდევ ერთხელ შეამოწმეთ, ხომ არ არის აქ რომელიმე უკვე [$1 ნაცნობი შეცდომა].",
        "feedback-bugnew": "მე შევამოწმე. ახალი შეცდომის შეტყობინება",
        "feedback-bugornote": "თუ თქვენ მზად ხართ დეტალურად აღწეროთ ტექნიკური პრობლემა, გთხოვთ, [$1 შეგვატყობინეთ შეცდომის შესახებ].\nწინააღმდეგ შემთხვევაში თქვენ შეგიძლიათ ისარგებლოთ ამ მარტივი ფორმით. თქვენი კომენტარი დაემატება  „[$3 $2]“ გვერდზე თქვენი მომხმარებლის სახელთან და გამოყენებულ ბრაუზერთან ერთად.",
        "feedback-cancel": "გაუქმება",
        "feedback-close": "გაკეთდა",
+       "feedback-error-title": "შეცდომა",
        "feedback-error1": "შეცდომა. API-ს მოულოდნელი რეზულტატი.",
        "feedback-error2": "შეცდომა: რედაქტირება ვერ განხორციელდა",
        "feedback-error3": "შეცდომა. არ არის API-ს პასუხი .",
        "feedback-subject": "თემა:",
        "feedback-submit": "მიღება",
        "feedback-thanks": "გმადლობთ! თქვენი შეფასება განთავსებულია „[$2 $1]“ გვერდზე.",
+       "feedback-thanks-title": "გმადლობთ!",
        "searchsuggest-search": "ძიება",
        "searchsuggest-containing": "შეიცავს...",
        "api-error-badaccess-groups": "თქვენ არ გაქვთ ამ ვიკიში ფაილების ატვირთვის უფლება.",
        "log-description-pagelang": "ეს არის გვერდის ენის ცვლილებების ჟურნალი",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (ჩართულია)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''გამორთულია''')",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 ბაიტი|$1 ბაიტი}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME-ტიპი",
+       "mediastatistics-table-extensions": "შესაძლო გაფართოებები",
+       "mediastatistics-table-count": "ფაილების რაოდენობა",
+       "mediastatistics-header-unknown": "უცნობი",
+       "mediastatistics-header-audio": "აუდიო",
+       "mediastatistics-header-video": "ვიდეოები",
+       "mediastatistics-header-office": "ოფისი",
+       "mediastatistics-header-text": "ტექსტური",
+       "json-error-syntax": "სინტაქსის შეცდომა",
        "headline-anchor-title": "ბმული ამ სექციაზე",
        "special-characters-group-latin": "ლათინური",
        "special-characters-group-latinextended": "ლათინური გაფართოება",
index 4c4a69c..e06f053 100644 (file)
        "yourtext": "تہ تحریر",
        "storedversion": "ذخیرہ شدہ نظرثانی",
        "yourdiff": "تضادات",
-       "templatesused": "ھیہ صفحا استعمال باک {{PLURAL:$1|سانچہ|سانچہ}}:",
+       "templatesused": "ھیہ صفحہا استعمال باک {{PLURAL:$1|سانچہ|سانچا}}:",
        "templatesusedpreview": " ھیہ پیش منظرا مستعمل {{PLURAL:$1|سانچہ|سانچے}}:",
        "template-protected": "(محفوظ شدہ)",
        "template-semiprotected": "(نیم محفوظ)",
        "enhancedrc-history": "تاریخچہ",
        "recentchanges": "تازہ تبدیلی",
        "recentchanges-legend": "حالیہ تبدیلیان اختیارات",
-       "recentchanges-summary": "ھیہ صفحا کھوار ویکیپیڈیا باک تازہ تریں تبدیلیان مشاہدہ کورے",
+       "recentchanges-summary": "ھیہ صفحا ویکیپیڈیا باک تازہ تریں تبدیلیان لوڑے",
        "recentchanges-feed-description": "کھوارا ترجمہ",
        "recentchanges-label-newpage": "ھیہ ترمیم نوغ صفحہ تخلیق آریر",
        "recentchanges-label-minor": "ھیہ ای معمولی ترمیم شیر",
        "pageinfo-toolboxlink": "معلومات صفحہ",
        "previousdiff": " ← پرانو تدوین",
        "nextdiff": "صفحہو نم:",
-       "file-info-size": "$1 × $2 پکسلز, فل سایز: $3, MIME ٹایپ: $4",
-       "file-nohires": "ھموغاری لوٹ ریزولیوشن دستیاب نیکی.",
+       "file-info-size": "$1 × $2 پکسلز, فل سائز: $3, MIME ٹائپ: $4",
+       "file-nohires": "ھموغاری لوٹ ریزولیوشن موجود نیکی.",
        "svg-long-desc": "SVG فایل, nominally $1 × $2 پکسلز, فایل سایز: $3",
        "show-big-image": "اصل فائل",
        "show-big-image-preview": "ھیہ نمائشو حجم:$1",
index 685597b..e375144 100644 (file)
@@ -31,7 +31,7 @@
        "tog-watchcreations": "Rûpelên min çêkirin, têxe nav lîsteya min a şopandinê",
        "tog-watchdefault": "Rûpelên min guhertin, têxe nav lîsteya min a şopandinê",
        "tog-watchmoves": "Rûpelên min navê wan guhertin, têxe nav lîsteya min a şopandinê",
-       "tog-watchdeletion": "Rûpelên min jêbirin, têxe nav lîsteya min a şopandinê",
+       "tog-watchdeletion": "Rûpel û dosyeyên min jêbirin, têxe nav lîsteya min a şopandinê",
        "tog-minordefault": "Her guhertinekê weke guhertineke biçûk nîşan bide",
        "tog-previewontop": "Pêşdîtina gotarê li jorî cihê guherandinê nîşan bide",
        "tog-previewonfirst": "Li cem guherandinê hertim yekemîn pêşdîtinê nîşan bide",
@@ -42,7 +42,7 @@
        "tog-shownumberswatching": "Nîşan bide, çiqas bikarhêner dişopînin",
        "tog-oldsig": "Pêşdîtina îmzeya heye:",
        "tog-fancysig": "Di îmzeyê de girêdana otomatîk a bikarhêner betal bike",
-       "tog-uselivepreview": "Pêşdîtina \"zindî\" bi kar bîne (JavaScript pêwîst e) (ceribandinî)",
+       "tog-uselivepreview": "Pêşdîtina \"zindî\" bi kar bîne",
        "tog-forceeditsummary": "Hinga kurteyeke vala hate tomarkirin min agahdar bike",
        "tog-watchlisthideown": "Guherandinên min ji lîsteya şopandinê veşêre",
        "tog-watchlisthidebots": "Guherandinên bot'an ji lîsteya şopandinê veşêre",
        "jumpto": "Here cem:",
        "jumptonavigation": "navîgasyon",
        "jumptosearch": "lêgerîn",
-       "view-pool-error": "Bibore, server niha zêde barkirî ne. Gelek bikarhêner niha hewl didin ku vê rûpelê bibînin. Ji kerema xwe kêlîkekê bisekine, berî ku tu dîsa hewl bidî rûpelê bibînî.",
+       "view-pool-error": "Bibore, server niha zêde barkirî ne. Gelek bikarhêner niha hewl didin ku vê rûpelê bibînin. Ji kerema xwe kêlîkekê bisekine, berî ku tu dîsa hewl bidî rûpelê bibînî.\n\n$1",
        "pool-errorunknown": "Çewtiyeke nenas",
        "poolcounter-usage-error": "Çewtîyê bikaranînê: $1",
        "aboutsite": "Der barê {{SITENAME}} de",
        "createacct-emailoptional": "E-name",
        "createacct-email-ph": "E-nameya xwe binivîse",
        "createacct-another-email-ph": "E-nameya xwe têkeve",
-       "createaccountmail": "Use a temporary random password and send it to the email address specified below",
+       "createaccountmail": "Şîfreyek ji bo ji bo demeke kin bikarbînin û ji navnîşana hatiye diyarkirin re e-nameyek bişînin.",
        "createacct-realname": "Navê te ya rast (Ko tu bixwazi bikeve, pêdivî nîne)",
        "createaccountreason": "Sedem:",
        "createacct-reason": "Sedem",
+       "createacct-reason-ph": "Çima hesabek din çedikîy",
+       "createacct-captcha": "Kontrola asayîşê",
        "createacct-imgcaptcha-ph": "Nivîsa ku tu li jor dibînî binivîse",
        "createacct-submit": "Hesabê xwe biafirîne",
+       "createacct-another-submit": "Hesabek din çeke",
        "createacct-benefit-body2": "{{PLURAL:$1|rûpel}}",
        "badretype": "Her du şîfreyên ku te nivîsîn li hevdu nayên.",
        "userexists": "Ev navî bikarhênerî berê tê bikaranîn. Xêra xwe navekî din dake.",
        "throttled-mailpassword": "Berî {{PLURAL:$1|saetekê|$1 saetan}} şîfreyeke nû hate xwestin. Ji bo şaşbûn bi vê fonksiyonê çênebin, serê her {{PLURAL:$1|saetekê|$1 saetan}} tenê şîfreyeke nû dikare were xwestin.",
        "mailerror": "Şaşbûnek li cem şandina e-nameyekê: $1",
        "acct_creation_throttle_hit": "Bibexşe! Te hesabê bikarhêneriyê $1 vekiriye. Tu êdî nikarî hesabên din vekî.",
-       "emailauthenticated": "Adresa e-nameya te hate naskirin: $1.",
-       "emailnotauthenticated": "Adresa e-nameyan yê te hên nehatîye naskirin. Fonksyonên e-nameyan piştî naskirina te dikarin ji te werin kirin.",
+       "emailauthenticated": "Adresa e-nameya te ji $2 $3ê hate rastandin.",
+       "emailnotauthenticated": "Adresa e-nameya te hêj nehatîye naskirin. Fonksyonên e-nameyan piştî naskirina te dikarin ji te werin kirin.",
        "noemailprefs": "'''Te hên adresa e-nameyan nenivîsandîye''', fonksyonên e-nameyan hên ji te ra ne tên qebûlkirin.",
        "emailconfirmlink": "E-Mail adresê xwe nasbike",
        "invalidemailaddress": "Adresa e-nameyan yê te ne tê qebûlkirin, ji ber ku formata xwe qedexe ye (belkî nîşanên qedexe). Xêra xwe adreseka serrast binivisîne ya vê derê vala bêle.",
+       "emaildisabled": "Ev sîte e-nameya nikara bişîne.",
        "accountcreated": "Hesab hate çêkirin",
        "accountcreatedtext": "Hesabê bikarhêneran ji $1 ra hate çêkirin.",
        "createaccount-title": "Çêkirina hesabekî ji {{SITENAME}}",
        "revdelete-hide-image": "Naveroka pelê veşêre",
        "revdelete-hide-name": "Çalakî û hedefê veşêre",
        "revdelete-hide-comment": "Nivîsandinê kurte yê guherandinê veşêre",
-       "revdelete-hide-user": "Navê bikarhêner/IP'yê veşêre",
+       "revdelete-hide-user": "Navê edîtorê/Navnîşanê IP'ye",
        "revdelete-hide-restricted": "Ev qebûlkirinan ji koordînatoran ra ye jî û ev rûpela tê girtin",
        "revdelete-radio-same": "(neguherîne)",
-       "revdelete-radio-set": "Erê",
-       "revdelete-radio-unset": "Na",
+       "revdelete-radio-set": "Hatîye veşartin",
+       "revdelete-radio-unset": "Xuya",
        "revdelete-suppress": "Sedema jêbirinê ji rêveberan re jî veşêre",
        "revdelete-log": "Sedem",
        "revdel-restore": "xuyakirinê biguherîne",
        "search-external": "Lêgerrîna derveyî",
        "searchdisabled": "<p>Tu dikarî li {{SITENAME}} bi Google an Yahoo! bigere. Têbînî: Dibe ku encamen lêgerîne ne yên herî nû ne.\n</p>",
        "preferences": "Tercîhên min",
-       "mypreferences": "Tercihên min",
+       "mypreferences": "Hevyazên min",
        "prefs-edits": "Hejmarê guherandinan:",
        "prefs-skin": "Pêste",
        "skin-preview": "Pêşdîtin",
        "timezoneregion-indian": "Okyanûsa Hindî",
        "timezoneregion-pacific": "Okyanûsa Mezin",
        "allowemail": "Ji bikarhênerên dî e-nameyan qebûl bike",
-       "prefs-searchoptions": "Tercihên lêgerînê",
+       "prefs-searchoptions": "Lê bigere",
        "prefs-namespaces": "Valahiyên nav",
        "default": "asayî",
        "prefs-files": "Dosya",
        "badsig": "Îmzeya ne derbasdar! Li HTML binêre ka sedema şaşbûnê çiye.",
        "badsiglength": "Navê te zêde dirêj e; pêwîst e di bin {{PLURAL:$1|nîşanekê|nîşanan}} de be.",
        "yourgender": "Zayend:",
-       "gender-unknown": "Veşartî",
+       "gender-unknown": "Ez negotin çêtir dibinim",
        "gender-male": "Ew rûpelên wîkiyê diguherîne",
        "gender-female": "Mê",
        "email": "E-name",
        "prefs-signature": "Îmze",
        "prefs-dateformat": "Formata dîrokê",
        "prefs-timeoffset": "Cudahiya demê",
-       "prefs-advancedediting": "Vebijarkên berfireh",
+       "prefs-advancedediting": "Vebijarkên gelemperî",
        "prefs-editor": "Edîtor",
        "prefs-preview": "Pêşdîtin",
        "prefs-advancedrc": "Vebijarkên berfireh",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|bikarhênerek|$1 bikarhêner}} vê rûpelê {{PLURAL:$1|dişopîne|dişopînin}}.]",
        "rc_categories_any": "Hîç",
        "newsectionsummary": "/* $1 */ beşeke nû",
-       "rc-enhanced-expand": "Hûragahiyan nîşan bide (JavaScript pêdivî ye)",
+       "rc-enhanced-expand": "Hûragahiyan nîşan bide",
        "rc-enhanced-hide": "Kitûmatan veşêre",
        "recentchangeslinked": "Guherandinên têkilîdar",
        "recentchangeslinked-feed": "Guherandinên peywend",
        "uploadbtn": "Wêneyekî bar bike",
        "reuploaddesc": "Barkirinê biskîne û dîsa here rûpela barkirinê.",
        "uploadnologin": "Xwe tomar nekir",
-       "uploadnologintext": "Ji bo barkirina wêneyan divê ku tu [[Special:UserLogin|têkevî]].",
+       "uploadnologintext": "Ji kerema xwe re ji bo barkirina dosyeyan $1 dake.",
        "uploaderror": "Çewtiya barkirinê",
        "upload-recreate-warning": "'''Agahdarî: Peleke bi vî navî hatiye jêbirin an jî raguhestin.'''",
        "uploadtext": "Berê tu wêneyên nû bar bikî, ji bo dîtin an vedîtina wêneyên ku ji xwe hene binêre: [[Special:FileList|lîsteya wêneyên barkirî]]. Herwisa wêneyên ku hatine barkirin an jî jê birin li vir dikarî bibînî: [[Special:Log/upload|reşahîya barkirîyan]].\n\nYek ji lînkên jêr ji bo bikarhînana wêne an file'ê di gotarê de bikar bihîne:\n'''<nowiki>[[</nowiki>{{ns:file}}:File.jpg<nowiki>]]</nowiki>''',\n'''<nowiki>[[</nowiki>{{ns:file}}:File.png|alt text<nowiki>]]</nowiki>''',\nanjî ji bo file'ên dengî '''<nowiki>[[</nowiki>{{ns:media}}:File.ogg<nowiki>]]</nowiki>'''",
        "contributions-title": "Beşdariyên ji bo $1",
        "mycontris": "Beşdariyên min",
        "contribsub2": "Ji bo $1 ($2)",
-       "uctop": "(ser)",
+       "uctop": "(rojane)",
        "month": "Ji meha (û zûtir):",
        "year": "Ji sala (û zûtir):",
        "sp-contributions-newbies": "Tenê beşdariyên bikarhênerên nû nîşan bide",
        "confirmemail_loggedin": "Navnîşana te ya E-Nameyê hate qebûlkirin.",
        "confirmemail_body": "Kesek, dibê tu, bi IP adressê $1, xwe li {{SITENAME}} bi vê navnîşana e-name tomar kir (\"$2\") .\n\nEger ev rast qeydkirinê te ye û di dixwazî bikaranîna e-nama ji te ra çêbibe li {{SITENAME}}, li vê lînkê bitikîne:\n\n$3\n\nLê eger ev *ne* tu bû, li lînkê netikîne. Ev e-nameya di rojê $4 da netê qebûlkirin.",
        "scarytranscludefailed": "[Anîna şablona $1 biserneket; biborîne]",
-       "scarytranscludetoolong": "[URL zêde dirêj e; bibore]",
+       "scarytranscludetoolong": "[URL zêde dirêj e]",
        "deletedwhileediting": "'''Hişyarî:''' Piştî te dest bi guherandinê kir ev rûpel hate jêbirin!",
        "confirmrecreate": "Piştî te dest bi guherandinê kir, bikarhêner [[User:$1|$1]] ([[User talk:$1|gotûbêj]]) ev rûpel jê bir. Sedema jêbirinê ev bû:\n: ''$2''\nJi kerema xwe zanibe ku tu bi rastî dixwazî vê rûpelê dîsa çêkî.",
        "recreate": "Dîsa çêke",
        "table_pager_first": "Rûpela pêşîn",
        "table_pager_last": "Rûpela dawî",
        "table_pager_limit_submit": "Here",
-       "autosumm-blank": "Rûpel hate vala kirin",
+       "autosumm-blank": "Rûpel hat vala kirin",
        "autosumm-replace": "'$1' ket şûna rûpelê.",
        "autoredircomment": "Ji bo [[$1]] hate beralîkirin",
        "autosumm-new": "Rûpela nû: \"$1\"",
        "version-specialpages": "Rûpelên taybet",
        "version-other": "yên din",
        "version-version": "($1)",
-       "version-license": "Destûr",
+       "version-license": "Lîsansa MediaWiki",
        "version-software-product": "Berhem",
        "version-software-version": "Guherto",
        "version-entrypoints-header-url": "URL",
        "specialpages": "Rûpelên taybet",
        "specialpages-note": "* Rûpelên taybetî ji her kesan ra\n* <strong class=\"mw-specialpagerestricted\">Rûpelên taybetî ji bikarhêneran bi mafên zêdetir ra</strong>",
        "specialpages-group-other": "Rûpelên taybetî yên din",
-       "specialpages-group-login": "Têkeve",
+       "specialpages-group-login": "Têkeve / hesabekî nû çêke",
        "specialpages-group-changes": "Guherandinên dawî û têketin",
        "specialpages-group-media": "Nameyên medyayan û barkirinan",
        "specialpages-group-users": "Bikarhêner û maf",
index 9d887ec..979b2fb 100644 (file)
        "tooltip-pt-mycontris": "Index conlationum tuarum",
        "tooltip-pt-login": "Te conventum aperire hortamur, non autem requisitum",
        "tooltip-pt-logout": "Conventum concludere",
-       "tooltip-pt-createaccount": "Hortamur ut conventum crees, sed non est necesse.",
+       "tooltip-pt-createaccount": "Hortamur ut conventum crees, sed non est necesse",
        "tooltip-ca-talk": "Disputatio de hac pagina",
        "tooltip-ca-edit": "Hanc paginam recensere potes. Quaesumus praevisum inspice antequam servas.",
        "tooltip-ca-addsection": "Novam partem creare",
index 3c55d64..8cba53c 100644 (file)
        "currentrev": "Reviżjoni kurrenti",
        "currentrev-asof": "Reviżjoni kurrenti ta' $1",
        "revisionasof": "Reviżjoni ta' $1",
-       "revision-info": "Reviżjoni ta' $1 minn $2",
+       "revision-info": "Reviżjoni ta' $1 minn {{GENDER:$6|$2}}$7",
        "previousrevision": "←Reviżjoni eqdem",
        "nextrevision": "Reviżjoni iġded→",
        "currentrevisionlink": "Reviżjoni kurrenti",
        "compareselectedversions": "Qabbel il-verżjonijiet magħżula",
        "showhideselectedversions": "Uri/aħbi reviżjonijiet magħżula",
        "editundo": "ħassar",
+       "diff-multi-sameuser": "(Mhux qed {{PLURAL:$1|tintwera r-reviżjoni intermedja|jintwerew $1 r-reviżjonijiet intermedji}} mill-istess awtur})",
        "diff-multi-manyusers": "(Mhux qed {{PLURAL:$1|tintwera reviżjoni intermedja|jintwerew $1 reviżjonijit intermedji}} mingħand iktar minn $2 {{PLURAL:$2|utent|$2 utenti}})",
        "searchresults": "Riżultat tat-tfittxija",
        "searchresults-title": "Riżultati tat-tfittxija għal \"$1\"",
        "shown-title": "Uri {{PLURAL:$1|riżultat|$1 riżultati}} kull paġna",
        "viewprevnext": "Ara ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Hemm paġna bl-isem ta' \"[[:$1]]\" fuq din il-wiki'''",
-       "searchmenu-new": "'''Oħloq il-paġna \"[[:$1]]\" fuq din il-wiki!'''",
+       "searchmenu-new": "<strong>Oħloq il-paġna \"[[:$1]]\" fuq din il-wiki!</strong> \n{{PLURAL:$2|0=|Ara wkoll l-paġna li sibt bit-tfittxija tiegħek.|Ara wkoll ir-riżultati li sibt.}}",
        "searchprofile-articles": "Paġni ta' kontenut",
        "searchprofile-images": "Multimedja",
        "searchprofile-everything": "Kollox",
        "searchrelated": "relatati",
        "searchall": "kollha",
        "showingresults": "Hawn taħt ġie inkluż massimu ta' {{PLURAL:$1|riżultat '''1''' li jibda|'''$1''' riżultat li jibdew}} bin-numru '''$2'''.",
+       "search-showingresults": "{{PLURAL:$4|Riżultat <strong>$1</strong> ta' <strong>$3</strong>|Riżultati <strong>$1 - $2</strong> ta' <strong>$3</strong>}}",
        "search-nonefound": "It-tfittxija ma tat l-ebda riżultat.",
        "powersearch-legend": "Tfittxija avvanzata",
        "powersearch-ns": "Fittex fl-ispazju tal-isem:",
        "action-siteadmin": "timblokka jew tiżblokka d-databażi",
        "action-sendemail": "ibgħat l-ittri-e",
        "nchanges": "{{PLURAL:$1|modifika $1 |$1 modifiki}}",
+       "enhancedrc-history": "kronoloġija",
        "recentchanges": "Tibdil riċenti",
        "recentchanges-legend": "Opzjonijiet tat-tibdil riċenti",
        "recentchanges-summary": "Din il-paġna turi l-modifiki l-aktar riċenti għal kontenut tas-sit.",
        "recentchanges-label-bot": "Din il-modifika ġiet effettwata minn bot",
        "recentchanges-label-unpatrolled": "Din il-modifika għadha ma ġietx verifikata",
        "recentchanges-label-plusminus": "Id-daqs tal-paġna nbidel b'dan in-numru ta' bytes",
+       "recentchanges-legend-heading": "'''Leġenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ara wkoll il-[[Special:NewPages|lista tal-paġni l-ġodda]])",
        "rcnotefrom": "Ħawn taħt jinsabu l-modifiki minn '''$2''' (sa '''$1''').",
        "rclistfrom": "Uri l-modifiki ġodda li jibdew minn $3 $2",
        "rcshowhideminor": "$1 modifiki żgħar",
        "rcshowhideminor-show": "Uri",
+       "rcshowhideminor-hide": "Aħbi",
        "rcshowhidebots": "$1 bot",
        "rcshowhidebots-show": "Uri",
-       "rcshowhideliu": "Utenti reġistrati: $1",
+       "rcshowhidebots-hide": "Aħbi",
+       "rcshowhideliu": "$1 utenti reġistrati",
        "rcshowhideliu-show": "Uri",
+       "rcshowhideliu-hide": "Aħbi",
        "rcshowhideanons": "Utenti anonimi: $1",
        "rcshowhideanons-show": "Uri",
+       "rcshowhideanons-hide": "Aħbi",
        "rcshowhidepatr": "$1 modifiki kontrollati",
        "rcshowhidepatr-show": "Uri",
        "rcshowhidemine": "$1 modifiki tiegħi",
        "rcshowhidemine-show": "Uri",
+       "rcshowhidemine-hide": "Aħbi",
        "rclinks": "Uri l-aħħar $1 modifiki fl-aħħar $2 ġranet<br />$3",
        "diff": "diff",
        "hist": "kron",
        "delete-warning-toobig": "Din il-paġna għandha kronoloġija ta' modifikar kbira, l-fuq minn $1 {{PLURAL:$1|reviżjoni|reviżjonijiet}}.\nTħassara tista' toħloq problema ta' funżjoni fid-database ta' {{SITENAME}}; moħħok hemm.",
        "rollback": "Ħassar il-modifiki",
        "rollbacklink": "rollback",
+       "rollbacklinkcount": "Erġa' lura $1 {{PLURAL:$1|modifika|modifiki}}",
        "rollbackfailed": "Rollback ma ħadmitx",
        "cantrollback": "Impossibli tħassar il-modifiki; l-utent li wettaqhom huwa l-unika li għamel kontributi lil din il-paġna.",
        "alreadyrolled": "Mhuwiex possibbli li tneħħi l-modifiki ta' [[User:$2|$2]] ([[User talk:$2|diskussjoni]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) fil-paġna [[:$1]]; utent ieħor diġà immodifika din il-paġna jew inkella reġġa' lura.\n\nL-iktar modifika riċenti fuq dil-paġna saret minn [[User:$3|$3]] ([[User talk:$3|diskussjoni]]).",
        "import-interwiki-history": "Kopja l-verżjonijiet tal-kronoloġija kollha għal din il-paġna",
        "import-interwiki-templates": "Inkludi l-mudelli kollha",
        "import-interwiki-submit": "Importa",
-       "import-interwiki-namespace": "Ittrasferixxi l-paġni fl-ispazju tal-isem:",
        "import-upload-filename": "Isem tal-fajl:",
        "import-comment": "Kumment:",
        "importtext": "Jekk jogħġbok esporta l-fajl mis-sit wiki tal-oriġini bil-funzjoni [[Special:Export|funzjoni ta' esportazzjoni]], salvah fuq id-diska tiegħek u imbagħad tellgħu hawn.",
        "tooltip-pt-mycontris": "Lista tal-kontribuzzjonijiet tiegħek",
        "tooltip-pt-login": "Ir-reġistrazzjoni hija mħeġġa, għalkemm mhijiex obbligatorja",
        "tooltip-pt-logout": "Oħroġ (illogja 'l barra)",
+       "tooltip-pt-createaccount": "Nagħtuk parir toħloq kont u tidħol fih; però dan mhux obligatorju.",
        "tooltip-ca-talk": "Diskussjoni dwar il-kontenut tal-paġna",
        "tooltip-ca-edit": "Tista' timmodifika din il-paġna. Jekk jogħġbok uża l-buttuna tad-dehra proviżorja qabel ma ssalva l-modifiki.",
        "tooltip-ca-addsection": "Ibda sezzjoni ġdida",
        "spam_reverting": "Erġa' lura għall-aħħar verżjoni li m'għandiex link għal $1",
        "spam_blanking": "Paġna svojtjata, kull verżjoni kellu link għal $1",
        "spam_deleting": "Paġna mħassra, ir-reviżjonijiet kollha kellhom ħoloq lejn $1",
+       "simpleantispam-label": "Konroll anti-spam.\n<strong>TIMLIHIEX</strong> din!",
        "pageinfo-title": "Informazzjoni għal \"$1\"",
        "pageinfo-not-current": "Jiddispjaċina, imma huwa impossibbli li tingħata informazzjoni fuq reviżjonijiet qodma.",
        "pageinfo-header-basic": "Informazzjoni bażika",
        "file-info-size-pages": "$1 × $2 pixels, daqs tal-fajl: $3, tip MIME: $4, $5 {{PLURAL:$5|paġna|paġni}}",
        "file-nohires": "Mhux disponibli verżjonijiet b'risoluzzjoni akbar.",
        "svg-long-desc": "Fajl fil-format SVG, dimensjoni nominali $1 × $2 pixel, dimensjoni tal-fajl: $3",
-       "show-big-image": "Verżjoni b'risoluzzjoni sħiħa",
+       "show-big-image": "Fajl oriġinali",
        "show-big-image-preview": "Daqs tad-dehra proviżorja: $1.",
        "show-big-image-other": "{{PLURAL:$2|Riżoluzzjoni|Riżoluzzjonijiet}} oħra: $1",
        "show-big-image-size": "$1 × $2 pixels",
        "tags": "Tikketti ta' modifika validi",
        "tag-filter": "Iffilitra skont it-[[Special:Tags|tikketta]]:",
        "tag-filter-submit": "Filtru",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
        "tags-title": "Tikketti",
        "tags-intro": "Din il-paġna telenka t-tikketti li s-softwer jista' jassoċja ma' modifika u t-tifsira tagħhom.",
        "tags-tag": "Isem tat-tikketta",
        "htmlform-selectorother-other": "Oħrajn",
        "sqlite-has-fts": "$1 bil-possibilità ta' tfittxija kompluta fit-test",
        "sqlite-no-fts": "$1 mingħajr il-possibilità ta' tfittxija kompluta fit-test",
-       "logentry-delete-delete": "$1 ħassar il-paġna $3",
+       "logentry-delete-delete": "$1 {{GENDER:$2|ħassar|ħassret}} il-paġna $3",
        "logentry-delete-restore": "$1 reġġa' lura l-paġna $3",
        "logentry-delete-event": "$1 biddel il-viżibilità ta' {{PLURAL:$5|azzjoni tar-reġistru|$5 azzjonijiet tar-reġistru}} ta' $3: $4",
        "revdelete-content-hid": "kontenut moħbi",
        "revdelete-uname-unhid": "isem tal-utent muri mill-ġdid",
        "revdelete-restricted": "limiti applikati 'l amministraturi",
        "revdelete-unrestricted": "neħħi l-limiti 'l amministraturi",
-       "logentry-move-move": "$1 mexxa l-paġna $3 għal $4",
+       "logentry-move-move": "$1 {{GENDER:$2|mexxa l|mexxiet il}}-paġna $3 għal $4",
        "logentry-move-move-noredirect": "$1 mexxa l-paġna $3 għal $4 mingħajr ma ħalla rindirizz",
        "logentry-move-move_redir": "$1 mexxa l-paġna $3 għal $4 fuq rindrizz",
        "logentry-move-move_redir-noredirect": "$1 mexxa l-paġna $3 għal $4 fuq rindirizz mingħajr ma ħalla rindirizz",
        "logentry-newusers-newusers": "Il-kont $1 ġie maħluq",
-       "logentry-newusers-create": "Il-kont $1 ġie maħluq",
+       "logentry-newusers-create": "Inħoloq il-kont $1",
        "logentry-newusers-create2": "Il-kont $3 ġie maħluq minn $1",
        "logentry-newusers-autocreate": "Il-kont $1 ġie maħluq awtomatikament",
        "logentry-rights-rights": "$1 {{GENDER:$2|biddel|biddlet}} is-sħubija ta' $3 minn $4 għal $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|biddel|biddlet}} is-sħubija fil-gruppi ta' $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|ġie|ġiet}} awtomatikament {{GENDER:$2|promoss|promossa}} minn $4 għal $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|tella'|tellgħet}} $3",
        "rightsnone": "(xejn)",
        "revdelete-summary": "Taqsira tal-modifika",
        "feedback-bugcheck": "Tajjeb ħafna! Ivverifika li mhux diġà fost id-[$1 difetti magħrufa].",
index 640e2c2..cadd5a7 100644 (file)
        "preview": "Naokieken",
        "showpreview": "Bewarking naokieken",
        "showdiff": "Verschil bekieken",
-       "anoneditwarning": "'''Waorschuwing:''' je bin niet an-emeld.\nJoew IP-adres zal op-esleugen wörden a'j wiezigingen op disse zied anbrengen.",
+       "anoneditwarning": "<strong>Waorschuwing:</strong> je bin niet an-emeld.\nJoew IP-adres zal op-esleugen wörden a'j wiezigingen op disse zied anbrengen. A'j je eigen <strong>[$1 anmelden]</strong> of <strong>[$2 inschrieven]</strong> dan koemen joew bewarkingen onder joew gebrukersnaam te staon, samen mit aandere veurdelen.",
        "anonpreviewwarning": "''Je bin niet an-emeld.''\n''Deur de bewarking op te slaon wörden joew IP-adres op-esleugen in de ziedgeschiedenisse.''",
        "missingsummary": "'''Herinnering:''' je hebben gien samenvatting op-egeven veur de bewarking. A'j noen weer op ''Opslaon'' klikken wörden de bewarking zonder samenvatting op-esleugen.",
        "missingcommenttext": "Plaots joew opmarking hieronder.",
        "showhideselectedversions": "Ekeuzen versies bekieken/verbargen",
        "editundo": "weerummedreien",
        "diff-empty": "(Gien verschil)",
+       "diff-multi-sameuser": "({{PLURAL:$1|n Tussenliggende versie|$1 tussenliggende versies}} deur de zelfde gebruker is verbörgen)",
        "diff-multi-manyusers": "($1 tussenliggende {{PLURAL:$1|versie|versies}} deur meer as $2 {{PLURAL:$2|gebruker|gebrukers}} niet weeregeven)",
        "difference-missing-revision": "{{PLURAL:$2|Eén versie|$2 versies}} van disse verschillen ($1) {{PLURAL:$2|is|bin}} niet evunnen.\n\nDit kömp meestentieds deur t volgen van n verouwerde verwiezing naor n zied die vortedaon is.\nWaorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} vortdologboek].",
        "searchresults": "Zeukresultaoten",
        "searchrelated": "verwaant",
        "searchall": "alles",
        "showingresults": "Hieronder {{PLURAL:$1|steet '''1''' resultaot|staon '''$1''' resultaoten}}  <b>$1</b> vanaof nummer <b>$2</b>.",
+       "search-showingresults": "{{PLURAL:$4|Resultaot <strong>$1</strong> van <strong>$2</strong>|Resultaoten <strong>$1 - $2</strong> van <strong>$3</strong>}}",
        "search-nonefound": "Der bin gien resultaoten veur de zeukopdrachte.",
        "powersearch-legend": "Uutgebreid zeuken",
        "powersearch-ns": "Zeuken in naamruumten:",
        "recentchanges-label-bot": "Disse bewarking is uutevoerd deur n bot",
        "recentchanges-label-unpatrolled": "Disse bewarking is nog niet nao-ekeken",
        "recentchanges-label-plusminus": "Disse ziedgrootte is mit dit antal bytes ewiezigd",
+       "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zie oek de [[Special:NewPages|lieste mit nieje ziejen]])",
        "rcnotefrom": "Dit bin de wiezigingen sinds <strong>$2</strong> (maximum van <strong>$1</strong> wiezigingen).",
        "rclistfrom": "Bekiek wiezigingen vanaof $3 $2",
        "querypage-disabled": "Disse spesiale zied is uutezet um prestasieredens.",
        "booksources": "Boekinformasie",
        "booksources-search-legend": "Zeuk informasie over n boek",
+       "booksources-search": "Zeuken",
        "booksources-text": "Hieronder steet n lieste mit verwiezingen naor aandere websteeën die nieje of wat ouwere boeken verkopen, en daor hebben ze warschienlik meer informasie over t boek da'j zeuken:",
        "booksources-invalid-isbn": "De op-egeven ISBN klop niet; kiek effen nao o'j gien fout emaakt hebben bie de invoer.",
        "specialloguserlabel": "Uutvoerende gebruker:",
        "import-interwiki-history": "Kopieer de hele geschiedenisse veur disse zied",
        "import-interwiki-templates": "Alle mallen opnemen",
        "import-interwiki-submit": "Invoeren",
-       "import-interwiki-namespace": "Doelnaamruumte:",
-       "import-interwiki-rootpage": "Baosiszied veur doel (opsioneel):",
        "import-upload-filename": "Bestaandsnaam:",
        "import-comment": "Opmarkingen:",
        "importtext": "Gebruuk de [[Special:Export|uutvoerfunksie]] in de wiki waor de informasie vandaon kömp.\nSlao t op joew eigen systeem op, en stuur t daornao hier op.",
        "tooltip-pt-mycontris": "Liest van oew biejdraegen",
        "tooltip-pt-login": "Iej wördt van harte oetneugd um oe an te melden as gebroeker, mer t is nich verplicht",
        "tooltip-pt-logout": "Ofmaelden",
+       "tooltip-pt-createaccount": "Schrief je eigen veural in en meld je an, mer t is niet verplicht.",
        "tooltip-ca-talk": "Loat n oaverlegtekst oaver disse ziede zeen",
        "tooltip-ca-edit": "Bewaerk disse ziede",
        "tooltip-ca-addsection": "Niej oonderwaerp tovogen",
        "logentry-rights-rights": "$1 {{GENDER:$2|hef}} groepslidmaotschap veur $3 ewiezigd van $4 naor $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|hef}} t groepslidmaotschap ewiezigd veur $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|is}} automaties bevorderd van $4 tot $5",
+       "logentry-upload-upload": "$1 hef $3 {{GENDER:$2|op-estuurd}}",
        "rightsnone": "(gien)",
        "revdelete-summary": "samenvatting bewarken",
        "feedback-adding": "Joew kommentaar wörden op de zied ezet...",
index 04b979d..849d72c 100644 (file)
        "history-feed-description": "Stòria dla pàgina ansima a sto sit-sì",
        "history-feed-item-nocomment": "$1 al $2",
        "history-feed-empty": "La pàgina che a l'ha ciamà a-i é pa; a podrìa esse stàita scancelà da 'nt ël sit, ò pura tramudà a n'àutr nòm.\n\nChe a verìfica con la [[Special:Search|pàgina d'arserca]] se a-i fusso mai dj'àutre pàgine che a podèisso andeje bin.",
+       "history-edit-tags": "Modifiché le tichëtte dle revision selessionà",
        "rev-deleted-comment": "(resumé dla modìfica gavà)",
        "rev-deleted-user": "(stranòm gavà)",
        "rev-deleted-event": "(detaj dël registr gavà)",
        "rev-showdeleted": "Mostra",
        "revisiondelete": "Scancela/disdëscancela revision",
        "revdelete-nooldid-title": "Version nen spessificà",
-       "revdelete-nooldid-text": "A l'ha nen spessificà na version ëd la pàgina për aplicheje costa fonsion, la version spessificà a esist pa, o a preuva a stërmé la version corenta.",
+       "revdelete-nooldid-text": "A l'ha nen spessificà na version ëd la pàgina për aplicheje costa fonsion, la version spessificà a esist pa, opura a l'é an camin ch'a preuva a stërmé la version corenta.",
        "revdelete-no-file": "L'archivi sërcà a-i é pa.",
        "revdelete-show-file-confirm": "É-lo sigur ëd vorèj vëdde na vërsion scancelà dl'archivi \"<nowiki>$1</nowiki>\" da $2 a $3?",
        "revdelete-show-file-submit": "Bò!",
        "right-sendemail": "Mandé un mëssagi an pòsta eletrònica a j'àutri utent",
        "right-passwordreset": "Vëdde ij mëssagi ëd pòsta eletrònica ëd riampostassion dle ciav",
        "right-managechangetags": "Creé e dëscancelé dle [[Special:Tags|tichëtte]] da la base ëd dàit",
+       "right-applychangetags": "Apliché [[Special:Tags|le tichëtte]] con soe pròpie modìfiche",
+       "right-changetags": "Gionté e gavé dle [[Special:Tags|tichëtte]] qualsëssìa an s'dle revision andividuaj e dle vos d'argistr",
        "newuserlogpage": "Registr dla creassion dj'utent",
        "newuserlogpagetext": "Sossì a l'é un registr andova ch'as marco le creassion dj'utent.",
        "rightslog": "Argistr dij drit ëd j'utent",
        "action-editmyprivateinfo": "modifiché soe anformassion përsonaj",
        "action-editcontentmodel": "modifiché ël model ëd contnù ëd na pàgina",
        "action-managechangetags": "creé e dëscancelé dle tichëtte da la base ëd dàit",
+       "action-applychangetags": "apliché le tichëtte con soe modìfiche",
+       "action-changetags": "gionté e gavé dle tichëtte qualsëssìa an s'dle revision andividuaj e dle vos d'argistr",
        "nchanges": "$1 {{PLURAL:$1|modìfica|modìfiche}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|da l'ùltima visita}}",
        "enhancedrc-history": "stòria",
        "listfiles-delete": "scancelé",
        "listfiles-summary": "Sta pàgina special-sì a smon tuti j'archivi ch'a son ëstàit carià.",
        "listfiles_search_for": "Arserché un nòm d'archivi multimojen:",
+       "listfiles-userdoesnotexist": "Ël cont utent «$1» a l'é nen argistrà.",
        "imgfile": "archivi",
        "listfiles": "Lista d'archivi",
        "listfiles_thumb": "Miniadura",
        "logempty": "Pa gnun element parèj che a sia trovasse ant ij registr.",
        "log-title-wildcard": "Sërché ant ij tìtoj ch'as anandio për",
        "showhideselectedlogentries": "Smon-e/stërmé le vos ëd registr selessionà",
+       "log-edit-tags": "Modiché le tichëtte dle vos d'argistr selessionà",
        "allpages": "Tute le pàgine",
        "nextpage": "Pàgina che a-i ven ($1)",
        "prevpage": "Pàgina anans ($1)",
        "import-interwiki-history": "Copié tute le revision ëd la stòria ëd costa pàgina",
        "import-interwiki-templates": "Anserì tùit jë stamp",
        "import-interwiki-submit": "Amporté",
-       "import-interwiki-namespace": "Spassi nominal ëd destinassion:",
-       "import-interwiki-rootpage": "Pàgina prinsipal ëd destinassion (opsional):",
+       "import-mapping-default": "Amporté ant le locassion ëstàndard",
+       "import-mapping-namespace": "Amporté vers në spassi nominal:",
+       "import-mapping-subpage": "Amporté coma sot-pàgine ëd costa pàgina:",
        "import-upload-filename": "Nòm ëd l'archivi:",
        "import-comment": "Oget:",
        "importtext": "Për piasì, che as espòrta l'archivi da 'nt la sorgiss wiki ën dovrand l'[[Special:Export|utiss d'esportassion]]. \nChe as lo salva ansima a sò ordinator e peui che a lo caria ambelessì.",
        "pageinfo-protect-cascading-yes": "É!",
        "pageinfo-protect-cascading-from": "Le protession a son a cascada da",
        "pageinfo-category-info": "Anformassion an sla categorìa",
+       "pageinfo-category-total": "Nùmer total ëd mèmber",
        "pageinfo-category-pages": "Nùmer ëd pàgine",
        "pageinfo-category-subcats": "Nùmer ëd sot-categorìe",
        "pageinfo-category-files": "Nùmer d'archivi",
        "patrol-log-page": "Registr dij contròj",
        "patrol-log-header": "Cost-sì a l'é un registr ëd le revision controlà.",
        "log-show-hide-patrol": "$1 registr verificà",
+       "log-show-hide-tag": "tichëtta d'argistr $1",
        "deletedrevision": "Veja version scancelà $1",
        "filedeleteerror-short": "Eror ën scanceland l'archivi: $1",
        "filedeleteerror-long": "A-i son ësta-ie dj'eror ën scanceland l'archivi:\n\n$1",
        "tags-deactivate-reason": "Rason:",
        "tags-deactivate-not-allowed": "A l'é nen possìbil disativé la tichëtta «$1».",
        "tags-deactivate-submit": "Disativé",
+       "tags-apply-no-permission": "A l'ha nen ël drit d'apliché dle tichëtte ëd modìfica ansema a soe modìfiche.",
+       "tags-apply-not-allowed-one": "La tichëtta «$1» a peul nen esse aplicà a man.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|La tichëtta sì-dapress a peul|Le tichëtte sì dapress a peulo}} nen esse aplicà a man: $1",
+       "tags-update-no-permission": "A l'ha nen ël drit ëd gionté o gavé dle tichëtte ëd modìfica da dle revision andividuaj o dle vos d'argistr.",
+       "tags-update-add-not-allowed-one": "La tichëtta «$1» a peul nen esse giontà a man.",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|La tichëtta sì-dapress a peul|Le tichëtte sì-dapress a peulo}} nen esse giontà a man: $1",
+       "tags-update-remove-not-allowed-one": "La tichëtta «$1» a peul nen esse gavà.",
+       "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|La tichëtta sì-dapress a peul|Le tichëtte sì-dapress a peulo}} pa esse gavà a man: $1",
        "comparepages": "Confronté dle pàgine",
        "compare-page1": "Pàgina 1",
        "compare-page2": "Pàgina 2",
index d91d094..8d4a1e8 100644 (file)
        "querypage-disabled": "Kay sapaq p'anqamanqa ama nisqam allinta llamk'anapaq.",
        "booksources": "Liwrukunapi pukyukuna",
        "booksources-search-legend": "Liwrukunapi pukyukunata maskay",
+       "booksources-search": "Maskay",
        "booksources-text": "Kay qatiqpiqa huk llika tiyaykunaman t'inkikunatam rikunki, musuq icha mawk'a liwrukunata qhatuq, maskasqayki liwrukunamantachá astawan willaq:",
        "booksources-invalid-isbn": "ISBN huchhaqa manachá allinchu; pantasqata llanchiriy qallariy qillqamanta iskaychamuspa.",
        "specialloguserlabel": "Rurapuq:",
        "import-interwiki-history": "Kay p'anqapaq tukuy wiñay kawsaynintinta iskaychay",
        "import-interwiki-templates": "Tukuy plantillakunapas",
        "import-interwiki-submit": "Hawamanta chaskiy",
-       "import-interwiki-namespace": "Kay suti k'itiman churay:",
-       "import-interwiki-rootpage": "Taripana saphi p'anqa (akllanalla):",
        "import-upload-filename": "Willañiqip sutin:",
        "import-comment": "Willayniyki:",
        "importtext": "Ama hina kaspa, willañiqita qallariy wikimanta [[Special:Export|hawaman quna llamk'anawan]] hawaman quy antañiqiqniykipi waqaychaspa, chaymantataq kaypi churkuy.",
        "tooltip-pt-mycontris": "Llamk'apusqaykikuna",
        "tooltip-pt-login": "Kallpachaykiku yaykunaykiqa allinmi nispa, mana manu kanayki kaptinpas",
        "tooltip-pt-logout": "Llamk'apuy tiyaymanta lluqsiy",
+       "tooltip-pt-createaccount": "Rakiquna kamarispayki yaykunaykiqa allinchá kanman, hinaspapas ruranayki manam tiyanchu.",
        "tooltip-ca-talk": "Qillqasqap samiqninmanta rimanakuna p'anqa",
        "tooltip-ca-edit": "Kay p'anqata llamk'apuytam atinki. Ama hina kaspa, manaraq waqaychaspa ñawpaqta qhawarillay.",
        "tooltip-ca-addsection": "Musuq rakita qallariy",
index d89cf62..a275987 100644 (file)
        "querypage-disabled": "समाचरणकारणेन एतद्विशेषपुटं निष्क्रियम् ।",
        "booksources": "ग्रन्थस्रोतः",
        "booksources-search-legend": "ग्रन्थस्रोतः अन्विष्यताम्",
+       "booksources-search": "अन्विष्यताम्",
        "booksources-text": "अधस्था आवली नूतनप्राचीनपुस्तकानां विक्रयकेन्द्रस्य अनुबन्धान् सूचयति । यत्र ते  आवश्यकाः अन्यविषयाः अपि उपलभ्याः ।",
        "booksources-invalid-isbn": "दत्तं ISBN मान्यम् इति  न भाति । मूलस्रोततः प्रतिकृतीः कर्तुं परिशीलयतु ।",
        "specialloguserlabel": "आचारी :",
        "revdelete-uname-unhid": "योजकस्य नाम न लोपितम्",
        "revdelete-restricted": "प्रबन्धकानां प्रतिबन्धनानि आरोपितानि",
        "revdelete-unrestricted": "प्रबन्धकानां प्रतिबन्धनानि निष्कासितानि",
-       "logentry-move-move": "$1 इति प्रयोक्त्रा $3 इत्येतत् $4 इत्येतत् प्रति चालितम्",
+       "logentry-move-move": "$1 {{GENDER:$2|moved}} $3 पुटं $4 प्रति चालितम्",
        "logentry-move-move-noredirect": "$1 इति प्रयोक्त्रा $3 इति पृष्ठम् $4 इत्येतत् प्रति चालितं, अनुप्रेषणेन विना",
        "logentry-move-move_redir": "↓\n$1 इत्यनेन $3 इति पृष्ठम् $4 इत्येतत् प्रति चालितं, अनुप्रेषणम् अतिक्रम्य",
        "logentry-move-move_redir-noredirect": "$1 इति प्रयोक्त्रा $3 इति पृष्ठं $4 इत्येतत् प्रति चालितम्, अनुप्रेषणम् अतिक्रम्य, अनुप्रेषणमोचनेन च विना।",
        "logentry-rights-rights": "$1 इत्ययं $3 इत्यस्य समूहसदस्यतां $4 इत्यतः परिवर्त्य $5 इत्यकरोत्",
        "logentry-rights-rights-legacy": "$1, $3 इत्यस्मै समूहसदस्यतां पर्यवर्तयत्",
        "logentry-rights-autopromote": "$1 इत्ययं स्वचालितरूपेण $4 इत्यतः $5 इति यावत् पदोन्नतः",
-       "logentry-upload-upload": "$1 इत्यनेन $3 इत्येषा सञ्चिका उपारोहता ।",
+       "logentry-upload-upload": "$1 {{GENDER:$2|निवेशितम्}} $3",
        "rightsnone": "(कतम)",
        "revdelete-summary": "सम्पादनसांक्षेपिक",
        "feedback-adding": "पृष्ठे प्रतिस्पन्दः योजनीयः ...",
index 44ea089..89fd920 100644 (file)
@@ -57,7 +57,7 @@
        "tog-shownumberswatching": "Zobraziť počet používateľov sledujúcich stránku",
        "tog-oldsig": "Súčasný podpis:",
        "tog-fancysig": "Považovať podpisy za wikitext (bez automatických odkazov)",
-       "tog-uselivepreview": "Používať živý náhľad (experimentálna funkcia)",
+       "tog-uselivepreview": "Používať živý náhľad",
        "tog-forceeditsummary": "Upozoriť ma, keď nevyplním zhrnutie úprav",
        "tog-watchlisthideown": "Skryť moje úpravy zo zoznamu sledovaných",
        "tog-watchlisthidebots": "Skryť úpravy botov zo zoznamu sledovaných",
        "pool-queuefull": "Front je plný",
        "pool-errorunknown": "Neznáma chyba",
        "pool-servererror": "Služba riadiaca prístup k serverom nieje dostupná ($1).",
+       "poolcounter-usage-error": "Chyba použitia: $1",
        "aboutsite": "O {{GRAMMAR:lokál|{{SITENAME}}}}",
        "aboutpage": "Project:Úvod",
        "copyright": "Obsah je dostupný pod $1, pokiaľ nie je uvedené inak.",
        "disclaimers": "Vylúčenie zodpovednosti",
        "disclaimerpage": "Project:Vylúčenie zodpovednosti",
        "edithelp": "Ako upravovať stránku",
+       "helppage-top-gethelp": "Pomoc",
        "mainpage": "Hlavná stránka",
        "mainpage-description": "Hlavná stránka",
        "policy-url": "Project:Zásady a smernice",
        "readonly_lag": "Databáza bola automaticky zamknutá pokým záložné databázové servery nedoženú hlavný server",
        "internalerror": "Vnútorná chyba",
        "internalerror_info": "Vnútorná chyba: $1",
+       "internalerror-fatal-exception": "Kritická výnimka typu „$1“",
        "filecopyerror": "Nebolo možné skopírovať súbor „$1“ na „$2“.",
        "filerenameerror": "Nebolo možné premenovať súbor „$1“ na „$2“.",
        "filedeleteerror": "Nebolo možné vymazať súbor „$1“.",
        "directorycreateerror": "Nebolo možné vytvoriť adresár „$1“.",
+       "directoryreadonlyerror": "Adresár \"$1\" je iba na čítanie.",
+       "directorynotreadableerror": "Adresár \"$1\" sa nedá čítať.",
        "filenotfound": "Nebolo možné nájsť súbor „$1“.",
        "unexpected": "Neočakávaná hodnota: „$1“=„$2“.",
        "formerror": "Chyba: nepodarilo sa odoslať formulár",
        "viewyourtext": "Môžete si prehliadnuť a skopírovať zdrojový kód <strong>vašich úprav</strong> tejto stránky:",
        "protectedinterface": "Táto stránka poskytuje text používateľského rozhrania tejto wiki a je zamknutá, aby sa predišlo jej zneužitiu.\nAk chcete pridať alebo zmeniť preklady pre všetky wiki, prosím, použite [//translatewiki.net/ translatewiki.net], projekt lokalizácie MediaWiki.",
        "editinginterface": "'''Upozornenie:''' Upravujete stránku, ktorá poskytuje text používateľského rozhrania.\nZmeny tejto stránky ovplyvnia vzhľad používateľského rozhrania ostatným používateľom.\nAk chcete pridať alebo zmeniť preklady pre všetky wiki, prosím, použite [//translatewiki.net/ translatewiki.net], projekt lokalizácie MediaWiki.",
+       "translateinterface": "Na pridanie a zmeny prekladov pre všetky wiki použite [//translatewiki.net/ translatewiki.net], projekt na lokalizáciu MediaWiki.",
        "cascadeprotected": "Táto stránka bola zamknutá proti úpravám, pretože je použitá na {{PLURAL:$1|nasledovnej stránke, ktorá je zamknutá|nasledovných stránkach, ktoré sú zamknuté}} voľbou „kaskádového zamknutia“:\n$2",
        "namespaceprotected": "Nemáte povolenie upravovať stránky v mennom priestore '''$1'''.",
        "customcssprotected": "Nemáte právo upravovať túto CSS stránku, pretože obsahuje osobné nastavenie iného používateľa.",
index 6e015f6..2cf534f 100644 (file)
        "otherlanguages": "மற்ற மொழிகளில்",
        "redirectedfrom": "($1 இலிருந்து வழிமாற்றப்பட்டது)",
        "redirectpagesub": "பக்கவழிமாற்றுப் பக்கம்",
+       "redirectto": "வழிமாற்றவும்:",
        "lastmodifiedat": "இப்பக்கம் கடைசியாக $1, $2 மணிக்குத் திருத்தப்பட்டது.",
        "viewcount": "இப்பக்கம் {{PLURAL:$1|ஒரு முறை|$1 முறைகள்}} அணுகப்பட்டது.",
        "protectedpage": "காக்கப்பட்ட பக்கம்",
        "suspicious-userlogout": "உங்கள் விடுபதிகை கோரிக்கை மறுக்கப்பட்டது ஏனென்றால் அது அறுபட்ட உலாவி அல்லது மாற்று இடைக்கிடங்கியால் அனுப்பப்பட்டுள்ளது.",
        "createacct-another-realname-tip": "உண்மையான பெயர் கட்டாயமற்றது.\nநீங்கள் இதை கொடுத்தால் உங்கள் ஆக்கங்களுக்கான உரிமையளிப்புகளின் போது இது பயன்படும்.",
        "pt-login": "புகுபதிகை",
+       "pt-login-button": "புகுபதிகை",
        "pt-createaccount": "புதிய கணக்கை உருவாக்கவும்",
        "pt-userlogout": "விடுபதிகை",
        "php-mail-error-unknown": "PHP 's mail() செயல்பாட்டில் அறியப்படாத பிழை.",
        "preview": "முன்தோற்றம்",
        "showpreview": "முன்தோற்றம் காட்டு",
        "showdiff": "மாற்றங்களைக் காட்டு",
-       "anoneditwarning": "'''எச்சரிக்கை:''' நீங்கள் புகுபதிகை செய்யவில்லை.\nஉங்கள் ஐ.பி. முகவரி இப்பக்கத்தின் தொகுப்பு வரலாற்றில் பதிவு செய்யப்படும்.",
+       "anoneditwarning": "<strong>எச்சரிக்கை:</strong> நீங்கள் புகுபதிகை செய்யவில்லை. நீங்கள் தொகுத்தால் உங்கள் ஐ.பி. முகவரி எல்லோருக்கும் தெரியும்படி இருக்கும். நீங்கள் <strong>[$1 புகுபதிகை செய்தாலோ]</strong> அல்லது <strong>[$2 புதிய கணக்கு உருவாக்கினாலோ]</strong>, பிற பயன்களோடு நீங்கள் செய்யும் தொகுப்புகள் உங்கள் பயனர் பெயரோடு தொடர்புப்படுத்திக்காட்டப்படும்.",
        "anonpreviewwarning": "நீங்கள் புகுபதிகை செய்யவில்லை. இந்த பக்கத்தை சேமித்தால் உஙகள் ஐ.பி. முகவரி இதன் வரலாற்றுப் பக்கத்தில் பதிவாகும்.",
        "missingsummary": "'''நினைவூட்டல்:''' நீர் தொகுப்புச் சுருக்கமொன்றைக் கொடுக்கவில்லை.\nஇன்னொரு முறை பக்கத்தை சேமி என்பதை அழுத்தினால் உங்கள் தொகுப்பு சுருக்கமெதுவுமில்லாமல் சேமிக்கப்படும்.",
        "missingcommenttext": "கீழே சுருக்கமொன்றக் குறிப்பிடவும்.",
        "currentrev": "நடைமுறையிலுள்ள திருத்தம்",
        "currentrev-asof": "$1 இல் கடைசித் திருத்தம்",
        "revisionasof": "$1 இல் நிலவும் திருத்தம்",
-       "revision-info": "$2 பயனரால் செய்யப்பட்ட $1 அன்றிருந்தவாரான திருத்தம்",
+       "revision-info": "{{GENDER:$6|$2}} பயனரால் செய்யப்பட்ட $1 அன்றிருந்தவாரான திருத்தம்$7",
        "previousrevision": "←முந்தைய தொகுப்பு",
        "nextrevision": "புதிய தொகுப்பு→",
        "currentrevisionlink": "நடப்பிலுள்ள திருத்தம்",
        "shown-title": "ஒரு பக்கத்திற்கு $1 {{PLURAL:$1|முடிவு|முடிவுகள்}} காட்டவும்",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) பக்கங்களைப் பார்.",
        "searchmenu-exists": "'''\"[[:$1]]\" என்னும் பெயருடைய பக்கம் இந்த விக்கியில் உள்ளது'''",
-       "searchmenu-new": "'''\"[[:$1]]\" பக்கத்தை இந்த விக்கியில் உருவாக்கவும்!'''",
+       "searchmenu-new": "<strong>\"[[:$1]]\" பக்கத்தை இந்த விக்கியில் உருவாக்கவும்!</strong> {{PLURAL:$2|0=|உங்கள் தேடல் மூலம் கண்டுபிடிக்கப்பட்டப்பக்கத்தைக் காண்க.| தேடல் முடிவுகளை காண்க.}}",
        "searchprofile-articles": "உள்ளடக்கப் பக்கங்களின் பட்டியல்",
        "searchprofile-images": "பல்லூடகம்",
        "searchprofile-everything": "எல்லாம்\n\nஅத்தனையும்",
        "rcnotefrom": "கீழே காணப்படுவது '''$2''' இலிருந்து செய்யப்பட்ட மாற்றங்களாகும் ('''$1''' வரைக் காட்டப்பட்டுள்ளது).",
        "rclistfrom": "$3 $2 தொடக்கம் செய்யப்பட்ட புதிய மாற்றங்களைக் காட்டவும்",
        "rcshowhideminor": "சிறிய தொகுப்புகளை $1",
+       "rcshowhideminor-show": "காட்டு",
        "rcshowhideminor-hide": "மறை",
        "rcshowhidebots": "தானியங்கிகளை $1",
        "rcshowhidebots-show": "காட்டு",
+       "rcshowhidebots-hide": "மறை",
        "rcshowhideliu": "$1 பதிவு செய்துள்ள பயனர்கள்",
        "rcshowhideliu-hide": "மறை",
        "rcshowhideanons": "அடையாளம் காட்டாத பயனர்களை $1",
+       "rcshowhideanons-show": "காட்டு",
        "rcshowhideanons-hide": "மறை",
        "rcshowhidepatr": "$1 கவனிக்கப்பட்ட தொகுப்புக்கள்",
        "rcshowhidemine": "என் தொகுப்புகளை $1",
+       "rcshowhidemine-show": "காட்டு",
        "rcshowhidemine-hide": "மறை",
        "rclinks": "கடைசி $2 நாட்களில் கடைசி $1 மாற்றங்களைக் காட்டு.<br />$3",
        "diff": "வேறுபாடு",
        "revdelete-uname-unhid": "பயனர் பெயர் மறைக்கப்பட்டது நீக்கப்பட்டுள்ளது.",
        "revdelete-restricted": "நிர்வாகிகளுக்கு கட்டுப்பாடுகள் விதிக்கப்பட்டது",
        "revdelete-unrestricted": "நிர்வாகிகளின் கட்டுப்பாடுகள் நீக்கப்பட்டது",
-       "logentry-move-move": "$1 à®ªà®¯à®©à®°à®¾à®²à¯\8d $3, $4 à®\8eனà¯\8dà®± à®¤à®²à¯\88பà¯\8dபà¯\81à®\95à¯\8dà®\95à¯\81 à®¨à®\95à®°à¯\8dதà¯\8dதபà¯\8dபà®\9fà¯\8dà®\9fà¯\81ளà¯\8dளதà¯\81.",
+       "logentry-move-move": "$1 à®ªà®\95à¯\8dà®\95à®®à¯\8d $3-à®\90 $4à®\95à¯\8dà®\95à¯\81 {{GENDER:$2|நà®\95à®°à¯\8dதà¯\8dதினாரà¯\8d}}",
        "logentry-move-move-noredirect": "$1, $3 பக்கத்தை $4 என்ற தலைப்புக்கு வழிமாற்று இன்றி நகர்த்தியுள்ளார்",
        "logentry-move-move_redir": "$1 பக்கம் $3 ஐ $4 க்கு முன்னிருந்த வழிமாற்றின் மேலாக நகர்த்தியுள்ளார்",
        "logentry-move-move_redir-noredirect": "$1 பக்கம் $3 ஐ $4 க்கு முன்னிருந்த வழிமாற்றின் மேலாக, இன்னொரு வழிமாற்றின்றி நகர்த்தியுள்ளார்",
        "logentry-patrol-patrol": "பக்கம் $3 இன்  திருத்தம் $4 ஐ  $1 பார்வையிட்டுக் குறிக்கப்பட்டது. .",
        "logentry-patrol-patrol-auto": "தானாக  பக்கம்  $3  ன் பரிசீலனை  $4   ஆனது ரோந்து செய்யப்பட்டது என $1 குறியிடப்பட்டது. .",
        "logentry-newusers-newusers": "பயனர் கணக்கு $1 உருவாக்கப்பட்டது",
-       "logentry-newusers-create": "$1 à®\92à®°à¯\81 à®ªà¯\81திய à®ªà®¯à®©à®°à¯\8d à®\95ணà®\95à¯\8dà®\95à¯\88 à®\89à®°à¯\81வாà®\95à¯\8dà®\95ியà¯\81ளà¯\8dளாரà¯\8d.",
+       "logentry-newusers-create": "$1 à®ªà¯\81திய à®ªà®¯à®©à®°à¯\8d à®\95ணà®\95à¯\8dà®\95à¯\81 à®\89à®°à¯\81வாà®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9fà¯\81ளà¯\8dளதà¯\81.",
        "logentry-newusers-create2": "$3 பயனர் கணக்கினை $1 உருவாக்கினார்",
        "logentry-newusers-autocreate": "பயனர் கணக்கு $1 தானாக உருவாக்கப்பட்டது",
+       "logentry-upload-upload": "$1 $3ஐ {{GENDER:$2|பதிவேற்றினார்}}",
        "rightsnone": "(எதுவுமில்லை)",
        "revdelete-summary": "தொகுப்பு சுருக்கத்தை",
        "feedback-adding": "பக்கத்தில் கருத்தைச் சேர்க்கிறது...",
index 9e3cf8f..e0f722b 100644 (file)
        "listgrouprights-namespaceprotection-namespace": "Ad alanı",
        "listgrouprights-namespaceprotection-restrictedto": "Kullanıcının değişiklik yapmasına izin veren hak(lar)",
        "trackingcategories": "Eşleşen kategoriler",
+       "trackingcategories-msg": "İzleme kategorisi",
        "trackingcategories-name": "Mesaj Duvarı",
        "broken-file-category-desc": "Sayfa bozuk dosya bağlantısı (mevcut olmayan bir dosyayı kullanmaya çalışan bağlantı) içeriyor.",
        "trackingcategories-nodesc": "Açıklama yok.",
        "tags-manage-no-permission": "Yeni sayfalar oluşturmaya yetkiniz yok.",
        "tags-create-heading": "Yeni bir öge oluştur",
        "tags-create-explanation": "Varsayılan olarak, Yeni oluşturulan etiketlerin hazır hale getirilmesi kullanıcılar ve botlar tarafından yapılacaktır.",
-       "tags-create-tag-name": "Etiket adı",
+       "tags-create-tag-name": "Etiket adı:",
        "tags-create-reason": "Neden:",
        "tags-create-submit": "Oluştur",
        "tags-create-no-name": "Etik adı belirtmeniz gerekiyor",
        "tags-delete-title": "Etiketi Sil",
+       "tags-delete-reason": "Gerekçe:",
+       "tags-activate-title": "Aktif etiket",
        "tags-activate-reason": "Neden:",
        "tags-activate-submit": "Etkinleştir",
+       "tags-deactivate-title": "Aktif olmayan etiket",
+       "tags-deactivate-submit": "Aktif değil",
+       "tags-edit-title": "Etiketleri düzenle",
+       "tags-edit-manage-link": "Etiketleri yönet",
        "tags-edit-existing-tags": "Mevcut etiketler:",
-       "tags-edit-existing-tags-none": "\"Yok\"",
-       "tags-edit-new-tags": "Yeni görev:",
+       "tags-edit-existing-tags-none": "\"Hiçbiri\"",
+       "tags-edit-new-tags": "Yeni etiketler:",
        "tags-edit-add": "Bu etiketleri ekleyin:",
+       "tags-edit-remove-all-tags": "(tüm etiketleri kaldır)",
        "tags-edit-reason": "Neden:",
        "tags-edit-none-selected": "Eklemek ya da çıkarmak için en az bir etiketi seçin lütfen.",
        "comparepages": "Sayfaları karşılaştır",
index 7ffa15f..1acc3f1 100644 (file)
@@ -22,7 +22,8 @@
                        "Calak",
                        "عرفان ارشد",
                        "Obaid Raza",
-                       "عثمان خان شاہ"
+                       "عثمان خان شاہ",
+                       "Syedalinaqinaqvi"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "badarticleerror": "اس صفحہ پر یہ عمل انجام نہیں دیا جاسکتا۔",
        "cannotdelete": "صفحہ یا ملف $1 کو حذف نہیں کیا جاسکتا.\nہوسکتا ہے کہ اسے پہلے ہی کسی نے حذف کردیا ہو.",
        "cannotdelete-title": "صفحہ ھذف نہیں کیا جا سکتا \"$1\"",
+       "delete-hook-aborted": "حذف شدگی روک دی گئی\nوضاحت نہیں کی گئی",
        "badtitle": "خراب عنوان",
        "badtitletext": "درخواست شدہ صفحہ کا عنوان ناقص، خالی، یا کوئی غلط ربط شدہ بین لسانی یا بین ویکی عنوان ہے.\nشاید اِس میں ایک یا زیادہ ایسے حروف موجود ہوں جو عنوانات میں استعمال نہیں ہوسکتے.",
        "perfcached": "ذیلی ڈیٹا ابطن شدہ (cached) ہے اور اِس کے پُرانے ہونے کا امکان ہے. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
        "gotaccountlink": "داخل ہوجائیے",
        "userlogin-resetlink": "داخلِ نوشتہ ہونے کی تفاصیل بھول گئے ہیں؟",
        "userlogin-resetpassword-link": "کلمہ شناخت بھول گئے؟",
-       "userlogin-helplink2": "داخل ہو کر ہمارا مدد کریں",
+       "userlogin-helplink2": "داخل ہو کر ہماری مدد کریں",
        "createacct-emailrequired": "ای میل پتہ",
        "createacct-emailoptional": "ای میل ایڈریس (اختیاری)",
        "createacct-email-ph": "اپنا برقی پتہ لکھیں",
        "lineno": "لکیر $1:",
        "compareselectedversions": "منتخب متـن کا موازنہ",
        "editundo": "استرجع",
+       "diff-multi-sameuser": "({{PLURAL: $ 1 | ایک متوسط نظرثانی | $ 1 کئی متوسط نظرثانیاں}}ایک ہی صارف کی جانب سے نہیں دکھائی گئی)",
        "searchresults": "تلاش کا نتیجہ",
        "searchresults-title": "نتائجِ تلاش برائے \"$1\"",
        "notextmatches": "کوئی بھی مماثل متن موجود نہیں",
index d51a5fc..fa2a4d7 100644 (file)
        "createaccountmail": "me pot leäktronik",
        "createaccountreason": "Kod:",
        "createacct-reason": "Kod",
+       "createacct-imgcaptcha-ph": "Penolöd vödemi, keli logol löpo",
        "createacct-submit": "Jafön kali olik",
        "createacct-benefit-body1": "{{PLURAL:$1|redakam|redakams}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pad|pads}}",
        "shown-title": "Jonön {{PLURAL:$1|sukaseki|sukasekis}} $1 a pad",
        "viewprevnext": "Logön padis ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Dabinon pad labü nem: \"[[:$1]]\" su vük at'''",
-       "searchmenu-new": "'''Jafolös padi: \"[[:$1]]\" su vük at!'''",
+       "searchmenu-new": "<strong>Jafolös padi: \"[[:$1]]\" su vük at!</strong> {{PLURAL:$2|0=|Logolös i padi me suk olik petuvöli.|Logolös i sukasekis petuvöl.}}",
        "searchprofile-articles": "Ninädapads",
        "searchprofile-images": "Mödamedäd",
        "searchprofile-everything": "Valikos",
        "delete-warning-toobig": "Pad at labon jenotemi lunik: {{PLURAL:$1|revid|revids}} plu $1.\nPrudö! Moükam onik ba osäkädükon jäfidi nünodema: {{SITENAME}}.",
        "rollback": "Sädunön redakamis",
        "rollbacklink": "sädunön vali",
+       "rollbacklinkcount": "sädunön {{PLURAL:$1|redakami|redakamis}} $1",
        "rollbackfailed": "Sädunam no eplöpon",
        "cantrollback": "Redakam no kanon pasädunön; keblünan lätik binon lautan teik pada at.",
        "alreadyrolled": "No eplöpos ad sädunön redakami lätik pada: [[:$1]] fa geban: [[User:$2|$2]] ([[User talk:$2|Bespikapad]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); ek ya eredakon oni ud esädunon redakami ona.\n\nRedakam lätik päjenükon fa geban: [[User:$3|$3]] ([[User talk:$3|Bespikapad]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "import-interwiki-history": "Kopiedön fomamis valik jenotema pada at",
        "import-interwiki-templates": "Keninükön samafomotis valik",
        "import-interwiki-submit": "Nüveigön",
-       "import-interwiki-namespace": "Ini nemaspad:",
        "import-upload-filename": "Ragivanem:",
        "import-comment": "Küpet:",
        "importtext": "Seveigolös ragivi se fonätavük me [[Special:Export|stum seveiga]].\nDakipolös oni su nünöm olik e löpükolös oni isio.",
        "expand_templates_ok": "Baiced",
        "expand_templates_remove_comments": "Moükön küpetis",
        "expand_templates_generate_xml": "Jonön bimi: XML",
-       "expand_templates_preview": "Büologed"
+       "expand_templates_preview": "Büologed",
+       "special-characters-group-ipa": "LFB",
+       "special-characters-group-greek": "Grikänapük"
 }
index 6b95e78..4ee3935 100644 (file)
@@ -12,7 +12,8 @@
                        "Malafaya",
                        "Reedy",
                        "გიორგიმელა",
-                       "아라"
+                       "아라",
+                       "Silovan"
                ]
        },
        "tog-underline": "რცხუეფიშ ათოღაზუა:",
@@ -34,7 +35,7 @@
        "monday": "თუთაშხა",
        "tuesday": "თახაშხა",
        "wednesday": "ჯუმაშხა",
-       "thursday": "ცაშხა",
+       "thursday": "á\83ªá\83\90á\83\90á\83¨á\83®á\83\90",
        "friday": "ობიშხა",
        "saturday": "შურიშხა",
        "sun": "ჟაშ.",
@@ -56,7 +57,7 @@
        "october": "გჷმათუთა",
        "november": "გერგობათუთა",
        "december": "ქირსეთუთა",
-       "january-gen": "ღურთუთა",
+       "january-gen": "ღურთუთა",
        "february-gen": "ფურთუთაშ",
        "march-gen": "მელახიშ",
        "april-gen": "პირელიშ",
        "actions": "მოქმედალეფი",
        "namespaces": "ჯოხოეფიშ ოფირჩა",
        "variants": "ვარიანტეფი",
+       "navigation-heading": "ნავიგაციაშ მენიუ",
        "errorpagetitle": "ჩილათა",
        "returnto": "დირთი $1-შა",
        "tagline": "{{SITENAME}} ხასჷლაშე",
        "searchbutton": "გორუა",
        "go": "სტატია",
        "searcharticle": "გინულა",
-       "history": "á\83®á\83\90á\83¡á\83\98ლაშ ისტორია",
+       "history": "á\83®á\83\90á\83¡á\83·ლაშ ისტორია",
        "history_short": "ისტორია",
        "printableversion": "ობეშტალი ვერსია",
        "permalink": "პერმანენტული რცხუ",
        "print": "დობეშტი",
+       "view": "ძირაფა",
+       "view-foreign": "ქოძირით $1-ის",
        "edit": "რედაქტირაფა",
        "create": "დორსხუაფა",
+       "create-local": "ლოკალურ ეჭარუაშ გეძინა",
        "editthispage": "ხასჷლაშ რედაქტირაფა",
        "delete": "ლასუა",
        "deletethispage": "დოლასი თე ხასჷლა",
        "personaltools": "პერსონალური ხეჭკუდეფი",
        "talk": "სხუნუა",
        "views": "ძირაფეფი",
-       "toolbox": "á\83\98á\83\9cá\83¡á\83¢á\83 á\83£á\83\9bá\83\94á\83\9cá\83¢ეფი",
+       "toolbox": "á\83®á\83\94á\83­á\83\99á\83£á\83\93ეფი",
        "otherlanguages": "შხვა ნინეფს",
        "redirectedfrom": "(გინოწურაფილი რე $1-შე)",
        "redirectpagesub": "ხასჷლაშა გინოწურაფა",
-       "lastmodifiedat": "თე ხასილაქ ეკონიას გეახალუ $2-ს, $1-ის.",
+       "redirectto": "გინოღალა:",
+       "lastmodifiedat": "თე ხასჷლაქ ეკონიას გეახალუ $2-ს, $1-ის.",
        "jumpto": "გეგნორთი:",
        "jumptonavigation": "ნავიგაცია",
        "jumptosearch": "გორუა",
        "viewsource": "ქოძირი წყუ",
        "viewsourcetext": "თქვა შეილებუნა ქოძირათ თე ხასჷლაშ დაჭყაფური ფაილი დო ქუდარსხუათ თიშ მანგი:",
        "yourname": "მახვარებუშ ჯოხო:",
+       "userlogin-yourname": "მახვარებუშ ჯოხო",
+       "userlogin-yourname-ph": "გენშიონით თქვანი მოხვარებუშ ჯოხო",
        "yourpassword": "პაროლი",
+       "userlogin-yourpassword": "პაროლი",
        "yourpasswordagain": "კჷნე გეკორობით პაროლი:",
        "remembermypassword": "ქჷგიშინი ჩქიმი მიშულა თე ბრაუზერს (მაქსიმუმ $1 დღას)",
        "yourdomainname": "თქვან დომენ",
        "gotaccount": "უკვე რეგისტრირებული რეთო? '''$1'''",
        "gotaccountlink": "მინულა",
        "userlogin-resetlink": "გუგოჭყორდესო მიშაულარო საჭირო ინფორმაციაქ?",
+       "createacct-captcha": "თხილუაშ კონტროლი",
        "loginsuccess": "'''ასე მიშულირ რეთ {{SITENAME}}-ს მუჭოთ \"$1\".'''",
        "nouserspecified": "საჭირო რე მახვარებუშ ჯოხოშ მიშაჭარუა.",
        "mailmypassword": "ახალ პაროლიშ მოჯღონა",
        "noemail": "\"$1\" მახვარებუშ ელ-ფოშტა წურაფილი ვარე.",
        "loginlanguagelabel": "ნინა: $1",
+       "pt-login": "მიშულა",
+       "pt-createaccount": "ანგარიშიშ გონწყუმა",
+       "pt-userlogout": "გიშულა",
        "bold_sample": "რუმე ტექსტი",
        "bold_tip": "რუმე ტექსტ",
        "italic_sample": "ელართელი ტექსტი",
        "subject": "თემა/დუდლანდარი:",
        "minoredit": "თენა რე ჭიჭე რედაქტირაფა",
        "watchthis": "თე ხასჷლაშ კონტროლი",
-       "savearticle": "á\83\93á\83\9dá\83©á\83\95á\83\98 á\83®á\83\90á\83¡á\83\98ლა",
+       "savearticle": "á\83\93á\83\9dá\83©á\83\95á\83\98 á\83®á\83\90á\83¡á\83·ლა",
        "preview": "გიწოთოლორაფა",
        "showpreview": "ქაძირე გიწოთოლორაფა",
        "showdiff": "თირაფეფიშ ძირაფა",
-       "anoneditwarning": "'''á\83\92á\83£á\83 á\83\98 á\83\92á\83£á\83©á\83\98á\83\97:''' á\83\97á\83¥á\83\95á\83\90 á\83\95á\83\90á\83 á\83\94á\83\97 á\83 á\83\94á\83\92á\83\98á\83¡á\83¢á\83 á\83\98á\83 á\83\94á\83\91á\83£ლი. თქვან IP ოწურაფუ ინოჭარილი იჸი თე ხასჷლაშ რედაქტირაფაშ ისტორიას.",
+       "anoneditwarning": "'''á\83\92á\83£á\83 á\83\98 á\83\92á\83£á\83©á\83\98á\83\97:''' á\83\97á\83¥á\83\95á\83\90 á\83\95á\83\90á\83 á\83\94á\83\97 á\83 á\83\94á\83\92á\83\98á\83¡á\83¢á\83 á\83\98á\83 á\83\90á\83¤á\83\98ლი. თქვან IP ოწურაფუ ინოჭარილი იჸი თე ხასჷლაშ რედაქტირაფაშ ისტორიას.",
        "summary-preview": "რეზიუმეშ გიწოთოლორაფა",
        "blockedtext": "'''თქვან მახვარებუშ ჯოხო ვარა IP მიოწურაფუქ ბლოკირქ იჸუ. '''\n\nბლოკირაფა ღოლუ $-ქ.\nსამანჯელო წუმორინაფილქ იჸუ გეჸვენჯიქ: ''$2''.\n\n* ბლოკუაშ დაჭყაფური: $8\n* ბლოკიშ ვადაშ გულა ბორჯი: $6\n* ბლოკირქ იჸუ: $7\n\nშეილებუნა დეკავშირათ $1-ს ვარა ნამთინე შხვა [[{{MediaWiki:Grouppage-sysop}}|ადმინისტრატორს]] ბლოკუაშ კილასხუნალო.\nგეთოლწონით, ნამდა თქვა ვაგუმგარინენა ფუნქცია: ''მახვარებუშა ელ-ფოშტაშ ჯღონუა'', ვაგაფუნა მეღანკილი მოქმენდი ელ-ფოშტაშ მიოწურაფუ თქვანი [[Special:Preferences|ანგარიშიშ კონფიგურაციას]], ვარა დობლოკუაშ გეშა თე ფუნქციაშ გუმორინაფაშ ნება მიდაღალირ გაფუნა და.\nთქვან ასეიან IP მიოწურაფუ რე $3, დო ბლოკიშ იდენტიფიკატორი #$5.\nრთხიინთ ქიმიოღანკათ თე მუნაჩემეფშე ნამდგაიჸინი (ვარა ჟირხოლო) თქვან კორესპონდენციას.",
+       "loginreqlink": "მიშულა",
        "newarticle": "(ახალ)",
        "newarticletext": "თქვა გეყ’უნელ რეთ ხასილაშ რცხის, ნამუთ დიო ვა რე დორცხუაფილ.\nხასილაშ დარცხუაფალო გემიშეყ’ონით ტექსტ თუდონ ოჭკორიეშა. (ქოძირით[$1 მოხვარაშ ხასილა] უმოს ინფორმაციაშო).\nთე ხასილას ჩილათირო მოხვადით–და, ქიგუნჭირით თქვან ბრაუზერიშ კონჭის '''უკახალე'''.\"",
        "noarticletext": "ასე თე ხასილას ტექსტ ვა რე. \nთქვა შეილებუნა [[Special:Search/{{PAGENAME}}|გორათ ათე ხასილაშ ჯოხო]] შხვა ხასილეფს,\n<span class=\\\"plainlinks\\\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} დოგორათ მეხუჯაფილ ჟურნალეფ],\nვარა [{{fullurl:{{FULLPAGENAME}}|action=edit}} დიჭყათ ათე ხასილაშ რედაქტირაფა]</span>.",
        "lineno": "ღოზი $1:",
        "compareselectedversions": "გიშაგორილ ვერსიეფიშ მეზიმაფა",
        "editundo": "გოუქვაფა",
-       "searchresults": "გორუაშ მოღალირობეფ",
-       "searchresults-title": "\"$1\"–იშ გორუაშ მოღალირობეფ",
+       "searchresults": "გორუაშ მოღალირობეფ",
+       "searchresults-title": "\"$1\"–იშ გორუაშ მოღალირობეფ",
        "notextmatches": "ნამთინ ხასილაშ ტექსტი ვა უხუჯანს",
        "prevn": "წოხლენ $1",
        "nextn": "უკულიან {{PLURAL:$1|$1}}",
        "searchprofile-advanced": "გაუჯგუშებული",
        "searchprofile-articles-tooltip": "დოგორი $1-ს",
        "searchprofile-images-tooltip": "დოგორი ფაილეფი",
-       "searchprofile-everything-tooltip": "á\83\92á\83\9dá\83 á\83£á\83\90 á\83\90á\83 á\83«á\83\9d á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90á\83¡ (á\83\9dá\83©á\83\98á\83\94á\83\91á\83\94á\83\9aá\83\98 á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83\98á\83¨ á\83\9bá\83\94á\83\99á\83\9dá\83 á\83\9dá\83ªá\83®á\83\98á\83\9aო)",
+       "searchprofile-everything-tooltip": "á\83\90á\83 á\83«á\83\9d á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¡ á\83\92á\83\9dá\83 á\83£á\83\90 (á\83\9dá\83¡á\83®á\83£á\83\9cá\83£á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83\98á\83¨á\83\90á\83\9bო)",
        "searchprofile-advanced-tooltip": "გორუა მახვარებუშ გენჭყილ ჯოხოეფიშ ოფირჩას",
        "search-result-size": "$1 ({{PLURAL:$2|1 ზიტყვა|$2 ზიტყვეფ}})",
        "search-result-category-size": "{{PLURAL:$1|1 მაკათური|$1 მაკათური}} ({{PLURAL:$2|1 გიმენკატეგორია|$2 გიმენკატეგორია}}, {{PLURAL:$3|1 ფაილი|$3 ფაილეფი}})",
        "search-interwiki-more": "(უმოს)",
        "searchrelated": "მათანგეფ",
        "searchall": "არძო",
+       "search-showingresults": "{{PLURAL:$4|მოღალირობა <strong>$1</strong> შე <strong>$3</strong>|მოღალირობა <strong>$1 - $2</strong> შე <strong>$3</strong>}}",
        "search-nonefound": "თქვანი მოგორაფილიშ მუთუნნერ მანგი მოღალუქ ვეძირჷ.",
        "powersearch-legend": "გოძინელ გორუა",
        "powersearch-ns": "დოგორ ჯოხოეფიშ ოფირჩას:",
        "rightslog": "მახვარებუშ ნებეფიშ ჟურნალ",
        "action-edit": "თე ხასილაშ რედაქტირაფა",
        "nchanges": "$1 {{PLURAL:$1|თირაფა|თირაფეფ}}",
+       "enhancedrc-history": "ისტორია",
        "recentchanges": "ასეიანი თირაფეფი",
        "recentchanges-legend": "ასერდენ თირაფეფიშ ოფციეფ",
        "recentchanges-summary": "თე ხასჷლას ქაძირი ვიკიშა მიშაღალირ არძოშ უახალაშ თირაფეფი.",
        "recentchanges-label-minor": "თენა რე ციქა რედაქტირაფა",
        "recentchanges-label-bot": "თე რედაქტირაფა ბოტიშ ნაღოლემი რე",
        "recentchanges-label-unpatrolled": "თე რედაქტირაფა დიო ხოლო ვა რე პატრულირაფირი",
+       "recentchanges-label-plusminus": "თირაფეფიშ ზჷმა ბაიტეფს",
+       "recentchanges-legend-heading": "'''ლეგენდა:'''",
        "rcnotefrom": "თუდო მოჸუნაფილიე თირაფეფ, ”’$2””-შე (ძირაფილიე ”’$1”’)",
        "rclistfrom": "ახალ თირაფეფიშ ძირაფა დოჭყაფილ $3 $2-შე",
-       "rcshowhideminor": "$1 ჭიჭე რედაქტირაფეფ",
+       "rcshowhideminor": "$1 ჭიჭე რედაქტირაფეფი",
+       "rcshowhideminor-hide": "ტყობინაფა",
        "rcshowhidebots": "ბოტეფიშ  $1",
+       "rcshowhidebots-show": "ძირაფა",
        "rcshowhideliu": "$1 მიშულირ მახვარებუეფ",
-       "rcshowhideanons": "$1 ანონიმურ მახვარებუეფ",
+       "rcshowhideliu-hide": "ტყობინაფა",
+       "rcshowhideanons": "$1 ანონიმურ მახვარებუეფი",
+       "rcshowhideanons-hide": "ტყობინაფა",
        "rcshowhidepatr": "გოკონტროლაფირ თირაფეფიშ $1",
        "rcshowhidemine": "ჩქიმ რედაქტირაფეფიშ $1",
+       "rcshowhidemine-hide": "ტყობინაფა",
        "rclinks": "ეკონია $2 დღას ღოლამირ ეკონია $1 თირაფეფიშ ძირაფა <br />$3",
        "diff": "შხვანერობა",
        "hist": "ისტ.",
        "minoreditletter": "ჭ.რ.",
        "newpageletter": "ახ.",
        "boteditletter": "ბ",
+       "rc-change-size-new": "ზჷმა თირუაშ უკული რე: {{PLURAL:$1|ბაიტი|ბაიტი}}",
        "rc-enhanced-expand": "დეტალეფიშ ძირაფა (ითხინს ჯავასქრიფთის)",
        "rc-enhanced-hide": "დეტალეფიშ ტყობინაფა",
        "recentchangeslinked": "აკოხვალამირ თირაფეფ",
        "recentchangeslinked-feed": "აკოხვალამირ თირაფეფ",
-       "recentchangeslinked-toolbox": "აკოხვალამირ თირაფეფ",
+       "recentchangeslinked-toolbox": "აკოხვალამირ თირაფეფ",
        "recentchangeslinked-title": "\"$1\"-შა მებუნაფილ თირაფეფი",
-       "recentchangeslinked-summary": "á\83\97á\83\94á\83\9cá\83\90 á\83 á\83\94 á\83\9bá\83\94á\83¬á\83£á\83 á\83\90á\83¤á\83\98á\83\9aá\83\98 á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90á\83¬á\83\99á\83£á\83\9bá\83\90 (á\83\95á\83\90á\83 á\83\90 á\83\9bá\83\94á\83¬á\83£á\83 á\83\90á\83¤á\83\98á\83\9aá\83\98 á\83\99á\83\90á\83¢á\83\94á\83\92á\83\9dá\83 á\83\98á\83\90á\83¨ á\83\9bá\83\90á\83\99á\83\90á\83\97á\83£á\83 á\83\94á\83¤á\83¬á\83\99á\83£á\83\9bá\83\90) á\83\92á\83\98á\83\9cá\83\9dá\83 á\83ªá\83®á\83£á\83\90á\83¤á\83\98á\83\9aá\83\98 á\83®á\83\90á\83¡á\83\98á\83\9aá\83\94á\83¤á\83¡ á\83\94á\83\99á\83\9dá\83\9cá\83\98á\83\90 á\83\91á\83\9dá\83 á\83¯á\83\98á\83¡ á\83¦á\83\9dá\83\9aá\83\90á\83\9bá\83\98á\83 á\83\98 á\83\97á\83\98á\83 á\83\90á\83¤á\83\94á\83¤á\83\98á\83¨ á\83\94á\83 á\83\99á\83\94á\83\91á\83£á\83\9a. á\83®á\83\90á\83¡á\83\98á\83\9aá\83\94á\83¤á\83\98 [[Special:Watchlist|your watchlist]] á\83\92á\83\98მორთილი რე '''ფსქელას'''.\"",
+       "recentchangeslinked-summary": "á\83\97á\83\94á\83\9cá\83\90 á\83 á\83\94 á\83\9bá\83\94á\83¬á\83£á\83 á\83\90á\83¤á\83\98á\83\9aá\83\98 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¬á\83\99á\83·á\83\9bá\83\90 (á\83\95á\83\90á\83 á\83\90 á\83\9bá\83\94á\83¬á\83£á\83 á\83\90á\83¤á\83\98á\83\9aá\83\98 á\83\99á\83\90á\83¢á\83\94á\83\92á\83\9dá\83 á\83\98á\83\90á\83¨ á\83\9bá\83\90á\83\99á\83\90á\83\97á\83£á\83 á\83\94á\83¤á\83¬á\83\99á\83·á\83\9bá\83\90) á\83\9bá\83\94á\83 á\83¡á\83®á\83£á\83\90á\83¤á\83\98á\83\9aá\83\98 á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83¡ á\83\94á\83\99á\83\9dá\83\9cá\83\98á\83\90 á\83\91á\83\9dá\83 á\83¯á\83\98á\83¡ á\83¦á\83\9dá\83\9aá\83\90á\83\9bá\83\98á\83 á\83\98 á\83\97á\83\98á\83 á\83\90á\83¤á\83\94á\83¤á\83\98á\83¨ á\83\94á\83 á\83\99á\83\94á\83\91á\83£á\83\9aá\83\98. á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83\98 [[Special:Watchlist|á\83\97á\83¥á\83\95á\83\90á\83\9cá\83\98 á\83\99á\83\9dá\83\9cá\83¢á\83 á\83\9dá\83\9aá\83\98á\83¨ á\83\94á\83 á\83\99á\83\94á\83\91á\83£á\83\9aá\83¡]] á\83\92á\83·მორთილი რე '''ფსქელას'''.\"",
        "recentchangeslinked-page": "ხასილაშ ჯოხო:",
        "recentchangeslinked-to": "მანგიერო ქაძირე ათე ხასილაშა მერცხილ ხასილეფშა მიშაღალირ თირაფეფ",
        "upload": "ფაილიშ ეხარგუა",
        "filehist": "ფაილიშ ისტორია",
        "filehist-help": "ქიგუნჭირით რიცხვის/ბორჯის თიშო, ნამდა ქოძირათ ფაილი თი რედაქციათ, მუ რედაქციას თი რიცხვის/ბორჯის რდუნ.",
        "filehist-revert": "დართინე",
-       "filehist-current": "მიმალ",
-       "filehist-datetime": "á\83 á\83\98á\83ªá\83®á\83\95á\83\98/ბორჯი",
+       "filehist-current": "მიმალ",
+       "filehist-datetime": "á\83 á\83\98á\83ªá\83®á\83£/ბორჯი",
        "filehist-thumb": "ჭკუდი",
        "filehist-thumbtext": "ჭკუდი $1-შო რსებულ ვერსიაშო",
        "filehist-user": "მახვარებუ",
-       "filehist-dimensions": "განზომილებეფ",
+       "filehist-dimensions": "განზომილებეფ",
        "filehist-filesize": "ფაილიშ ზომა",
-       "filehist-comment": "კომენტარ",
+       "filehist-comment": "კომენტარ",
        "imagelinks": "ფაილი გჷმორინაფილი რე",
        "linkstoimage": "გეყ’ვენჯი {{PLURAL:$1|ხასილა|ხასილეფ}} მერცხილ რე თე ფაილშა",
-       "nolinkstoimage": "á\83\95á\83\90 á\83 á\83\94 á\83\97á\83\94 á\83¤á\83\90á\83\98á\83\9aá\83¬á\83\99á\83£á\83\9bá\83\90 á\83\9bá\83\94á\83 á\83¡á\83®á\83\98á\83\9a á\83®á\83\90á\83¡á\83\98á\83\9aá\83\94á\83¤.",
+       "nolinkstoimage": "á\83\95á\83\90 á\83 á\83\94 á\83\97á\83\94 á\83¤á\83\90á\83\98á\83\9aá\83¬á\83\99á\83·á\83\9bá\83\90 á\83\9bá\83\94á\83 á\83¡á\83®á\83\98á\83\9aá\83\98 á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83\98.",
        "sharedupload": "თე ფაილ რე $1-შე დო შილებე თენა შხვა პროექტეფც ხოლო გიმირინაუფუდასინ",
        "sharedupload-desc-here": "თე ფაილი რე $1-შე დო შილებე გჷმორნაფილქ იჸუას შხვა პროექტეფს. თეშ ეჭარუა [$2 ფაილიშ ეჭარუაშ ხასჷლა] თუდოლე რე მოჩამილი.",
        "uploadnewversion-linktext": "გეშახარგე ათე ფაილიშ ახალ ვერსია",
+       "upload-disallowed-here": "თქვა ვა შეილებუნა თე ფაილიშ გჷნოჭაუა.",
        "mimesearch": "MIME გორუა",
-       "randompage": "á\83\9cá\83\90á\83\9bá\83\93á\83\92á\83\90á\83 á\83\94á\83\9c á\83®á\83\90á\83¡á\83\98ლა",
+       "randompage": "á\83\9cá\83\90á\83\9bá\83\93á\83\92á\83\90á\83 á\83\94á\83\9c á\83®á\83\90á\83¡á\83·ლა",
        "statistics": "სტატისტიკა",
        "withoutinterwiki": "ხასილეფ ნინაშ რსხილეფიშ გარეშე",
        "nbytes": "$1 ბაიტი",
        "shortpages": "ჭიჭე ხასილეფ",
        "longpages": "გინძე ხასილეფ",
        "usercreated": "{{GENDER:$3|დირსხუ}} $2-ის $1-ს",
-       "newpages": "á\83\90á\83®á\83\90á\83\9a á\83®á\83\90á\83¡á\83\98á\83\9aá\83\94á\83¤",
+       "newpages": "á\83\90á\83®á\83\90á\83\9a á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83\98",
        "ancientpages": "ჯვეშ ხასილეფ",
        "move": "გინოღალა",
        "movethispage": "თე გვერდიშ გინოღალა",
        "pager-newer-n": "{{PLURAL:$1|უახალაშ 1|უახალაშ $1}}",
        "pager-older-n": "{{PLURAL:$1|უმოს ჯვეში 1|უმოს ჯვეში $1}}",
-       "booksources": "წინგიშ წყუეფ",
+       "booksources": "წინგიშ წყუეფ",
        "booksources-search-legend": "წიგნიშ წყუშ გორუა",
        "specialloguserlabel": "მახვარებუ:",
        "speciallogtitlelabel": "სათაურ:",
-       "log": "ჟურნალეფ",
+       "log": "ჟურნალეფ",
        "all-logs-page": "ირ ჟურნალ",
        "allpages": "არძა ხასილა",
        "nextpage": "უკულ ხასილა ($1)",
        "undeleteviewlink": "ძირაფა",
        "undelete-search-submit": "გორუა",
        "namespace": "ჯოხოეფიშ ოფირჩა:",
-       "invert": "á\83\90á\83 á\83«á\83\90, á\83\9bá\83\94á\83¦á\83\90á\83\9cá\83\99á\83\98á\83\9aá\83\98á\83¨ á\83\92á\83£á\83\9bá\83\9dá\83 á\83\99á\83\94á\83\91á\83£á\83\9aá\83\9d",
+       "invert": "á\83\90á\83 á\83«á\83\9d, á\83\9bá\83\94á\83 á\83©á\83¥á\83\98á\83\9cá\83\94á\83\9aá\83\98á\83¨ á\83\9bá\83\9dá\83®",
        "blanknamespace": "(დუდ)",
        "contributions": "მახვარებუშ მიშაღალირ თია",
        "contributions-title": "$1-შა მახვარებუშ მიშაღალირ თია",
        "sp-contributions-username": "IP მიოწურაფუ ვარა მახვარებუშ ჯოხო:",
        "sp-contributions-toponly": "ქაძირი ხვალე ეკონია რევიზიეფი რენ ფერი რედაქტირაფეფი",
        "sp-contributions-submit": "გორუა",
-       "whatlinkshere": "á\83¡á\83\9dá\83\95á\83 á\83\94á\83¨á\83\94 á\83 á\83\94 á\83\97á\83\94 á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90 á\83¬á\83£á\83 á\83\90á\83¤á\83\98á\83\9a",
-       "whatlinkshere-title": "á\83®á\83\90á\83¡á\83\98á\83\9aá\83\94á\83¤, ნამუთ გინორცხილ რე $1-შა",
+       "whatlinkshere": "á\83¡á\83\9dá\83\95á\83 á\83\94á\83¨á\83\94 á\83 á\83\94 á\83\97á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90 á\83¬á\83£á\83 á\83\90á\83¤á\83\98á\83\9aá\83\98",
+       "whatlinkshere-title": "á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83\98, ნამუთ გინორცხილ რე $1-შა",
        "whatlinkshere-page": "ხასჷლა:",
        "linkshere": "გეყ’ვენჯ ხასილეფ გინარცხუაფუ '''[[:$1]]'''-ეფს",
        "nolinkshere": "ნამთინ ხასილა ვა რე გინორცხილ '''[[:$1]]'''-შა.",
-       "isredirect": "á\83\92á\83\98á\83\9cá\83\9dá\83¬á\83£á\83 á\83\90á\83¤á\83\90á\83¨ á\83®á\83\90á\83¡á\83\98ლა",
+       "isredirect": "á\83\92á\83\98á\83\9cá\83\9dá\83¬á\83£á\83 á\83\90á\83¤á\83\90á\83¨ á\83®á\83\90á\83¡á\83·ლა",
        "istemplate": "ტრანსკლუზია",
        "isimage": "ფაილიშ რცხი",
        "whatlinkshere-prev": "{{PLURAL:$1|წოხოლენ|წოხოლენ $1}}",
        "blocklink": "ბლოკირაფა",
        "unblocklink": "ბლოკიშ მონწყუმა",
        "change-blocklink": "ბლოკიშ თირუა",
-       "contribslink": "ნახანდ",
+       "contribslink": "ნახანდ",
        "blocklogpage": "ბლოკირეფიშ ერკებულ",
        "blocklogentry": "ბლოკირ რე [[$1]] ბლოკირაფაშ ვადაშ ათე გულა ბორჯით: $2 $3.",
        "unblocklogentry": "$1-შა ბლოკიშ მონწყუმა",
        "movelogpage": "ორეგისტრაციე ჟურნალიშ გინოღალა",
        "movereason": "სამანჯელი:",
        "revertmove": "გოუქვაფა",
-       "export": "á\83®á\83\90á\83¡á\83\98á\83\9aá\83\94á\83¤á\83\98á\83¨ á\83\94á\83¥á\83¡á\83\9eá\83\9dá\83 á\83¢",
+       "export": "á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83\98á\83¨ á\83\94á\83¥á\83¡á\83\9eá\83\9dá\83 á\83¢á\83\98",
        "allmessages": "ირ სისტემურ შეტყვინაფა",
        "allmessagesname": "ჯოხო",
        "allmessagesdefault": "შატყვინაფაშ სტანდარტულ ტექსტი",
        "thumbnail-more": "მორდი",
        "thumbnail_error": "ესკიზიშ ქიმინუაშ ჩილათა: $1",
        "importlogpage": "იმპორტიშ ჟურნალ",
-       "tooltip-pt-userpage": "á\83\97á\83¥á\83\95á\83\90á\83\9cá\83\98 á\83\9bá\83\90á\83®á\83\95á\83\90á\83 á\83\94á\83\91á\83£á\83¨ á\83®á\83\90á\83¡á\83\98ლა",
+       "tooltip-pt-userpage": "á\83\97á\83¥á\83\95á\83\90á\83\9cá\83\98 á\83\9bá\83\90á\83®á\83\95á\83\90á\83 á\83\94á\83\91á\83£á\83¨ á\83®á\83\90á\83¡á\83·ლა",
        "tooltip-pt-mytalk": "თქვანი სხუნუაშ ხასილა",
        "tooltip-pt-preferences": "ჩქიმ კონფიგურაციეფ",
        "tooltip-pt-watchlist": "ხასილეფიშ ერკებულ, ნამუთუშ მონიტორინგის ორთუთ თირაფაშ მიზანით",
        "tooltip-pt-mycontris": "თქვანი მიშნაღელ თიეფიშ ერკებულ",
-       "tooltip-pt-login": "á\83¯á\83\92á\83\98á\83  á\83\98á\83¸á\83\98 á\83\92á\83\94á\83\9bá\83¨á\83£á\83 á\83\97á\83£â\80\93á\83\93á\83\90, á\83\9bá\83\90á\83 á\83\90 á\83\97á\83\94á\83\9cá\83\90 á\83\95á\83\90 á\83 á\83\94 á\83¡á\83\90á\83\95á\83\90á\83\9aá\83\93á\83\94á\83\91á\83£á\83\9aო",
+       "tooltip-pt-login": "á\83¯á\83\92á\83\98á\83  á\83\98á\83¸á\83\98 á\83\92á\83\94á\83\9bá\83¨á\83£á\83 á\83\97á\83£â\80\93á\83\93á\83\90, á\83\9bá\83\90á\83 á\83\90 á\83\97á\83\94á\83\9cá\83\90 á\83\95á\83\90 á\83 á\83\94 á\83£á\83ªá\83\98ო",
        "tooltip-pt-logout": "გიშულა",
-       "tooltip-ca-talk": "დინორეშ ხასილაშ სხუნუა",
-       "tooltip-ca-edit": "თქვა შეილებნა თე ხასილაშ რედაქტირაფა. რთხინთ, გეუნჭირით გიწოთოლორაფაშ კონჭის სოიშახ ხასილას ჩუანდათინ",
+       "tooltip-pt-createaccount": "ჩქი გიზალუთ, გონწყათ ანგარიში დაო გენშართათ სისტემაშა; მარა თენა ვა რე უციო",
+       "tooltip-ca-talk": "დინორეშ ხასჷლაშ სხუნუა",
+       "tooltip-ca-edit": "თქვა შეილებნა თე ხასჷლაშ რედაქტირაფა. რთხინთ, გეუნჭირით გიწოთოლორაფაშ კონჭის სოიშახ ხასჷლას ჩუანდათინ",
        "tooltip-ca-addsection": "ქიდიჭყით ახალ სექცია",
-       "tooltip-ca-viewsource": "á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90 á\83\97á\83®á\83\98á\83\9aá\83\94á\83  რე. \nშეგილებუნა ძირათ თეშ წყუ.",
-       "tooltip-ca-history": "á\83\97á\83\94 á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90á\83¨á\83\90 á\83\9bá\83\98á\83¨á\83\90á\83¦á\83\90á\83\9aá\83\98á\83  á\83\97á\83\98á\83 á\83\90á\83¤á\83\94á\83¤",
+       "tooltip-ca-viewsource": "á\83\97á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90 á\83\97á\83®á\83\98á\83\9aá\83\94á\83 á\83\98 რე. \nშეგილებუნა ძირათ თეშ წყუ.",
+       "tooltip-ca-history": "á\83\97á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¨á\83\90 á\83\9bá\83\98á\83¨á\83\90á\83¦á\83\90á\83\9aá\83\98á\83 á\83\98 á\83\97á\83\98á\83 á\83\90á\83¤á\83\94á\83¤á\83\98",
        "tooltip-ca-protect": "ხასილაშ თხილუა",
        "tooltip-ca-delete": "თე ხასილაშ ლასუა",
        "tooltip-ca-move": "გეგნიღი თე ხასილა",
-       "tooltip-ca-watch": "á\83\97á\83\94 á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90á\83¨ á\83\92á\83\94á\83«á\83\98á\83\9cá\83\90 á\83\97á\83¥á\83\95á\83\90á\83\9c á\83\99á\83\9dá\83\9cá\83¢á\83 á\83\9dá\83\9aá\83\98á\83 á\83\94á\83\91á\83£á\83\9a á\83®á\83\90á\83¡á\83\98ლეფიშ ერკებულშა",
+       "tooltip-ca-watch": "á\83\97á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¨ á\83\92á\83\94á\83«á\83\98á\83\9cá\83\90 á\83\97á\83¥á\83\95á\83\90á\83\9c á\83\99á\83\9dá\83\9cá\83¢á\83 á\83\9dá\83\9aá\83\98á\83 á\83\94á\83\91á\83£á\83\9aá\83\98 á\83®á\83\90á\83¡á\83·ლეფიშ ერკებულშა",
        "tooltip-ca-unwatch": "მონწყით თე ხასილა თქვან კონტროლებულ ხასილეფიშ ერკებულშე",
        "tooltip-search": "გორუა {{SITENAME}}",
        "tooltip-search-go": "გეგნორთი წორას ათე ჯოხოშ ხასილაშა შურო ქო რენ-და",
        "tooltip-search-fulltext": "დოგორი ხასილეფი, ნამუთ თე ტექსტის იკათუანან",
        "tooltip-p-logo": "დუდხასჷლაშ ძირაფა",
-       "tooltip-n-mainpage": "დუდ ხასილაშ ძირაფა",
+       "tooltip-n-mainpage": "დუდხასჷლაშ ძირაფა",
        "tooltip-n-mainpage-description": "დუდ ხასილაშა გინოზოჯუა",
        "tooltip-n-portal": "პროექტიშენი, მუშ ქიმინუა შეილებუნა, სოდე შილებე გორათინ",
-       "tooltip-n-currentevents": "á\83\93á\83\9dá\83\92á\83\9dá\83 á\83\98á\83\97 á\83 á\83¡á\83£á\83\9aá\83\98 á\83\98á\83\9cá\83¤á\83\9dá\83 á\83\9bá\83\90á\83ªá\83\98á\83\90 á\83\90á\83¡á\83\94á\83\98á\83\90á\83\9c á\83\9bá\83\9dá\83\9aá\83\98á\83\9cá\83\94á\83¤á\83\98á\83¨á\83\94á\83\9c",
-       "tooltip-n-recentchanges": "ვიკიშა ეკონია ბორჯის მიშაღალირ თირაფეფიშ ერკებულ",
+       "tooltip-n-currentevents": "á\83\93á\83\9dá\83\92á\83\9dá\83 á\83\98á\83\97 á\83 á\83¡á\83£á\83\9aá\83\98 á\83\98á\83\9cá\83¤á\83\9dá\83 á\83\9bá\83\90á\83ªá\83\98á\83\90 á\83\90á\83¡á\83\94á\83\98á\83\90á\83\9c á\83\9bá\83\9dá\83\9aá\83\98á\83\9cá\83\94á\83¤á\83¨á\83\94á\83\9cá\83\98",
+       "tooltip-n-recentchanges": "ვიკიშა ეკონია ბორჯის მიშაღალირი თირაფეფიშ ერკებული",
        "tooltip-n-randompage": "ქუმოძირ ნამუდგარდასინ ხასილა",
        "tooltip-n-help": "\"ხასილა, სოდეთ გარკვიენთინ",
        "tooltip-t-whatlinkshere": "არძო ვიკი ხასილაშ ერკებულ, ნამუდგა თაქ იწურუანსინ",
-       "tooltip-t-recentchangeslinked": "á\83\97á\83\94 á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90á\83¬á\83\99á\83£á\83\9bá\83\90 á\83\92á\83\98á\83\9cá\83\9dá\83 á\83ªá\83®á\83\98á\83\9aá\83\98 á\83®á\83\90á\83¡á\83\98á\83\9aá\83\94á\83¤á\83¨á\83\90 á\83\90á\83¡á\83\94á\83 á\83\93á\83\94 á\83\9bá\83\98á\83¨á\83\90á\83¦á\83\90á\83\9aá\83\98á\83  თირაფეფი",
+       "tooltip-t-recentchangeslinked": "á\83\97á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¬á\83\99á\83·á\83\9bá\83\90 á\83\9bá\83\94á\83 á\83¡á\83®á\83\98á\83\9aá\83\98 á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83¨á\83\90 á\83\90á\83¡á\83\94á\83 á\83\93á\83\94 á\83\9bá\83\98á\83¨á\83\90á\83¦á\83\90á\83\9aá\83\98á\83 á\83\98 თირაფეფი",
        "tooltip-feed-rss": "მოჩამილი ხასილაშ RSS არხიშ ტრანსლაცია",
        "tooltip-feed-atom": "ათე ხასილაშ ატომ არხიშ ტრანსლაცია",
        "tooltip-t-contributions": "თე მახვარებუშ მიშაღალირ თიაშ ერკებულიშ ძირაფა",
        "tooltip-t-emailuser": "მიდუჯღონით ელ.ფოშტა ათე მახვარებუს",
        "tooltip-t-upload": "გეხარგე ფაილი",
-       "tooltip-t-specialpages": "á\83\90á\83 á\83«á\83\9d á\83¡á\83\9eá\83\94á\83ªá\83\98á\83\90á\83\9aá\83£á\83  á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90á\83¨ á\83\94á\83 á\83\99á\83\94á\83\91á\83£á\83\9a",
-       "tooltip-t-print": "á\83\97á\83\94 á\83®á\83\90á\83¡á\83\98ლაშ ობეშტალი ვერსია",
+       "tooltip-t-specialpages": "á\83\90á\83 á\83«á\83\9d á\83¡á\83\9eá\83\94á\83ªá\83\98á\83\90á\83\9aá\83£á\83  á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¨ á\83\94á\83 á\83\99á\83\94á\83\91á\83£á\83\9aá\83\98",
+       "tooltip-t-print": "á\83\97á\83\94 á\83®á\83\90á\83¡á\83·ლაშ ობეშტალი ვერსია",
        "tooltip-t-permalink": "პერმანენტულ რცხი ხასილაშ თე ვერსიაშა",
-       "tooltip-ca-nstab-main": "á\83\93á\83\98á\83\9cá\83\9dá\83 á\83\94á\83¨ á\83®á\83\90á\83¡á\83\98ლაშ ძირაფა",
-       "tooltip-ca-nstab-user": "á\83\9bá\83\90á\83®á\83\95á\83\90á\83 á\83\94á\83\91á\83£á\83¨ á\83®á\83\90á\83¡á\83\98ლაშ ძირაფა",
-       "tooltip-ca-nstab-special": "á\83\97á\83¥á\83\95á\83\90 á\83\90á\83¡á\83\94 á\83 á\83\94á\83\97 á\83¡á\83\9eá\83\94á\83ªá\83\98á\83\90á\83\9aá\83£á\83  á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90á\83¡, á\83\97á\83¥á\83\95á\83\90 á\83\95á\83\90 á\83¨á\83\94á\83\98á\83\9aá\83\94á\83\91á\83£á\83\9cá\83\90 á\83\90á\83\97á\83\94 á\83®á\83\90á\83¡á\83\98ლაშ რედაქტირაფა",
+       "tooltip-ca-nstab-main": "á\83\93á\83\98á\83\9cá\83\9dá\83 á\83\94á\83¨ á\83®á\83\90á\83¡á\83·ლაშ ძირაფა",
+       "tooltip-ca-nstab-user": "á\83\9bá\83\90á\83®á\83\95á\83\90á\83 á\83\94á\83\91á\83£á\83¨ á\83®á\83\90á\83¡á\83·ლაშ ძირაფა",
+       "tooltip-ca-nstab-special": "á\83\97á\83¥á\83\95á\83\90 á\83\90á\83¡á\83\94 á\83 á\83\94á\83\97 á\83¡á\83\9eá\83\94á\83ªá\83\98á\83\90á\83\9aá\83£á\83  á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¡, á\83\97á\83¥á\83\95á\83\90 á\83\95á\83\90 á\83¨á\83\94á\83\98á\83\9aá\83\94á\83\91á\83£á\83\9cá\83\90 á\83\90á\83\97á\83\94 á\83®á\83\90á\83¡á\83·ლაშ რედაქტირაფა",
        "tooltip-ca-nstab-project": "პროექტიშ ხასილაშ ძირაფა",
-       "tooltip-ca-nstab-image": "á\83¤á\83\90á\83\98á\83\9aá\83\98á\83¨ á\83®á\83\90á\83¡á\83\98ლაშ ძირაფა",
+       "tooltip-ca-nstab-image": "á\83¤á\83\90á\83\98á\83\9aá\83\98á\83¨ á\83®á\83\90á\83¡á\83·ლაშ ძირაფა",
        "tooltip-ca-nstab-template": "თანგიშ ძირაფა",
        "tooltip-ca-nstab-help": "ქოძირეთ დახვარებაშ გვერდ",
        "tooltip-ca-nstab-category": "ხასილაშ კატეგორიაშ ძირაფა",
        "tooltip-rollback": "\"დორთინა\" ათე ხასილაშა ეკონია გინმახანდეშ ნაღოლემ თირაფას(ეფს) გოუქვენს ართ გენჭირათ",
        "tooltip-undo": "\"გოუქვაფა\" მიშაღალირ თირაფეფს გოუქვენს დო გუთმონწყუნს რედაქტირაფაშ ფორმას გიწოთოლორაფაშ რეჟიმს. თენა შესაძლებლობას ირძენს რეზიუმეს სამანჯელქ იყ’უას დაკონკრეტებულქინ.",
        "tooltip-summary": "კუნტა რეზიუმეშ მიშაჸონაფა",
+       "simpleantispam-label": "სპამიშ სააწმარენჯო შემოწმაფა.\nთენა '''ვა''' შეამსათ!",
+       "pageinfo-toolboxlink": "ხასჷლაშ ინფორმაცია",
        "previousdiff": "← წოხოლენი თირაფეფ",
        "nextdiff": "უახალაშ თირაფა →",
        "file-info-size": "$1 × $2 პიქსელ, ფაილიშ ზომა: $3, MIME ტიპ: $4",
        "file-nohires": " უმოს მაღალ გიშაგორანჯალა ვა რე შელებუან.",
        "svg-long-desc": "SVG ფაილ, ნომინალურო $1 × $2 პიქსელ, ფაილიშ ზიმა: $3",
        "show-big-image": "რსული გიშაგორანჯალა",
+       "show-big-image-preview": "ზჷმა გიწოთოლორაფაშ ბორჯის: $1.",
+       "show-big-image-size": "$1 × $2 პიქსელი",
        "newimages": "ახალ სურათეფ",
        "ilsubmit": "გორუა",
        "bad_image_list": "ფორმატ რე უკულიანიშნერო:\\n\\n ხვალე ერკებულშე გიშნაგორეფ (ლაწკარეფ, ნამუთ იჭყაფუ *-ით) ისხუნუ.\nლაწკარიშ პირველ რცხი ოკო რდას რცხი გლახა ფაილშა.\nკინ თი ლაწკარს რინელ ნამდგაინ უკულიან რცხი კილესხუნუ მუჭოთ გიმნარკეში, ნამუთ ნიშნენს  ხასილეფს, სოდგა ფაილეფ შილებე რდას ღოზეფს შკას დინოხუნაფილ.",
-       "metadata": "á\83\9bá\83\94á\83¢á\83\90á\83\9bá\83\9dá\83©á\83\90á\83\9bá\83\98á\83\9aá\83\9dá\83¤á\83\94á\83¤",
+       "metadata": "á\83\9bá\83\94á\83¢á\83\90á\83\9bá\83£á\83\9cá\83\90á\83©á\83\94á\83\9bá\83\94á\83¤á\83\98",
        "metadata-help": "თე ფაილს ოხოლუ გეძინელ ინფორმაცია, ნამუთ ოეგებიეთ თი ციფრულ კამერაშე ვარა სკანერშე რე გეძინელ, ნამუთ რდუ გუმორინაფილ თე ფაილიშ ოქიმინჯალო ვარა დაციფრებელო. ფაილიშ ორიგინალ თირელ ქორენ-და, შილებე კანკალე დეტალ ვა გიშაძირუანდას ფაილშა მიშაღალირ თირაფეფს.",
        "metadata-expand": "დეტალეფიშ გოძინელ ძირაფა",
        "metadata-collapse": "გოძინელ დეტალეფიშ ტყობინაფა",
        "metadata-fields": "ათე მესიჯის შინაფილ მეტა მოჩამილოფეფიშ ოფირჩეფ ეკოროცხილ იჸი ნახანტიშ ხასილაშ დისფლეის მუჟამსით მეტა მოჩამილოფეფიშ ერკებულ იჸი გითოფაჩილინ \nშხვეფ, მუჭოთ წესინ, ტყობინაფილ იყ’ი.\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",
        "exif-imagewidth": "სიგანე",
        "exif-imagelength": "სიმაღალე",
+       "exif-datetime": "ფაილიშ თირუაშ რიცხუ დო ბორჯი",
+       "exif-software": "გჷმორინაფილი პროგრამა",
+       "exif-exifversion": "ვერსია Exif",
+       "exif-colorspace": "ფერეფიშ პალიტრა",
+       "exif-orientation-1": "ნორმალური",
        "namespacesall": "არძა",
        "monthsall": "არძა",
        "watchlisttools-view": "მერცხილ თირაფეფიშ ძირაფა",
        "watchlisttools-edit": "ოკონტროლებელ ხასილეფიშ ძირაფა დო რედაქტირაფა",
        "watchlisttools-raw": "კონტროლიშ ერკებულიშ რედაქტირაფა ტექსტიშ ფორმატის",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|სხუნუა]])",
        "duplicate-defaultsort": "''გური ქუჩით:''' სტანდარტული დანწყუალაშ კილა \"$2\"-შო გინარჯგინანს ორდონი დონწყუალაშ კილა \"$1\"-ს.",
        "version": "ვერსია",
        "specialpages": "გჷშაკერძაფილი ხასჷლეფი",
        "external_image_whitelist": "\"#ქჷდიტე თე ღოზი კოკობო მუჭო რენ თეში<pre>\n#ქინახუნე რეგულარული გამოსახულებაშ ფრაგმენტეფი (თი ნაწილი ნამუთ თეშ // შქას ინოდოხოდ) თუდოლე\n#თენეფი მეზჷმაფილ იჸე გალენ (hotlinked) სურათეფიშ URL-ეფშა.\n#ნამუთ მიორენ თინა სურათეფო გაგშარჩქინდჷ, ვარ-და ხვალე სურათიშ რცხუ ირწყებედასიი.\n#ღოზეფი #-თ დოჭყაფილი კომენტარო რე მერჩქინელი.\n#თენა გჷნაფულენს ასოეფიშ რეგისტრის.\n\n#ქინახუნე არძო regex ფრაგმენტეფი თე ღოზიშ ჟი. ქჷდიტე თე ღოზი კოკობო მუჭო რენ თეში</pre>\"",
        "tag-filter": "[[Special:Tags|ხინტკეფიშ]] ტკიბირი:",
-       "searchsuggest-search": "გორუა"
+       "logentry-delete-delete": "მოხვარებუქ $1 {{GENDER:$2|დოლასუ}} ხასჷლა: „$3“",
+       "searchsuggest-search": "გორუა",
+       "special-characters-group-ipa": "IPA"
 }
index f97f6dc..50b8a01 100644 (file)
@@ -603,7 +603,7 @@ abstract class Maintenance {
         * Activate the profiler (assuming $wgProfiler is set)
         */
        protected function activateProfiler() {
-               global $wgProfiler;
+               global $wgProfiler, $wgTrxProfilerLimits;
 
                $output = $this->getOption( 'profiler' );
                if ( $output && is_array( $wgProfiler ) && isset( $wgProfiler['class'] ) ) {
@@ -617,8 +617,7 @@ abstract class Maintenance {
 
                $trxProfiler = Profiler::instance()->getTransactionProfiler();
                $trxProfiler->setLogger( LoggerFactory::getInstance( 'DBPerformance' ) );
-               # Catch huge single updates that lead to slave lag
-               $trxProfiler->setExpectation( 'maxAffected', 1000, __METHOD__ );
+               $trxProfiler->setExpectations( $wgTrxProfilerLimits['Maintenance'], __METHOD__ );
        }
 
        /**
index fb25b9d..1446871 100644 (file)
@@ -66,7 +66,7 @@ class BenchmarkHooks extends Benchmarker {
        private function benchHooks( $trials = 10 ) {
                $start = microtime( true );
                for ( $i = 0; $i < $trials; $i++ ) {
-                       wfRunHooks( 'Test' );
+                       Hooks::run( 'Test' );
                }
                $delta = microtime( true ) - $start;
                $pertrial = $delta / $trials;
index 990f258..0c3ea67 100644 (file)
@@ -339,7 +339,7 @@ ENDS;
 
                $blacklist = $checkBlacklist;
 
-               wfRunHooks( 'LocalisationChecksBlacklist', array( &$blacklist ) );
+               Hooks::run( 'LocalisationChecksBlacklist', array( &$blacklist ) );
 
                return $blacklist;
        }
index fb496cb..9affb9e 100644 (file)
@@ -63,7 +63,7 @@ class Languages {
         * files in the languages directory.
         */
        function __construct() {
-               wfRunHooks( 'LocalisationIgnoredOptionalMessages',
+               Hooks::run( 'LocalisationIgnoredOptionalMessages',
                        array( &$this->mIgnoredMessages, &$this->mOptionalMessages ) );
 
                $this->mLanguages = array_keys( Language::fetchLanguageNames( null, 'mwfile' ) );
index e1b6ac6..5d311ad 100644 (file)
@@ -83,7 +83,7 @@ class RefreshLinks extends Maintenance {
                }
 
                // Give extensions a chance to optimize settings
-               wfRunHooks( 'MaintenanceRefreshLinksInit', array( $this ) );
+               Hooks::run( 'MaintenanceRefreshLinksInit', array( $this ) );
 
                # Don't generate extension images (e.g. Timeline)
                $wgParser->clearTagHooks();
index 5e5e35d..0b56972 100644 (file)
@@ -94,7 +94,7 @@ foreach ( $wgOpenSearchTemplates as $type => $template ) {
 
 // Allow hooks to override the suggestion URL settings in a more
 // general way than overriding the whole search engine...
-wfRunHooks( 'OpenSearchUrls', array( &$urls ) );
+Hooks::run( 'OpenSearchUrls', array( &$urls ) );
 
 foreach ( $urls as $attribs ) {
        print Xml::element( 'Url', $attribs );
index 2ea3f07..2079a64 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -502,7 +502,7 @@ function wfExtractThumbParams( $file, $params ) {
        unset( $params['thumbName'] );
 
        // Do the hook first for older extensions that rely on it.
-       if ( !wfRunHooks( 'ExtractThumbParameters', array( $thumbname, &$params ) ) ) {
+       if ( !Hooks::run( 'ExtractThumbParameters', array( $thumbname, &$params ) ) ) {
                // Check hooks if parameters can be extracted
                // Hooks return false if they manage to *resolve* the parameters
                // This hook should be considered deprecated