Merge "resourceloader: Use WAN cache for validateScriptFile cache"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 4 Nov 2015 01:19:57 +0000 (01:19 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 4 Nov 2015 01:19:57 +0000 (01:19 +0000)
65 files changed:
autoload.php
composer.json
includes/Defines.php
includes/Linker.php
includes/MediaWiki.php
includes/WebResponse.php
includes/api/ApiBase.php
includes/api/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiExpandTemplates.php
includes/api/ApiMove.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiProtect.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiUpload.php
includes/api/ApiWatch.php
includes/api/i18n/gl.json
includes/api/i18n/it.json
includes/api/i18n/ru.json
includes/context/ContextSource.php
includes/context/DerivativeContext.php
includes/context/IContextSource.php
includes/context/RequestContext.php
includes/htmlform/OOUIHTMLForm.php
includes/installer/i18n/gl.json
includes/libs/Timing.php [new file with mode: 0644]
includes/page/WikiPage.php
includes/search/SearchOracle.php
includes/search/SearchPostgres.php
includes/specials/SpecialChangePassword.php
languages/i18n/be-tarask.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/it.json
languages/i18n/km.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/olo.json
languages/i18n/ru.json
languages/i18n/sah.json
languages/i18n/sd.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/tyv.json
languages/i18n/uz.json
maintenance/backupTextPass.inc
resources/lib/oojs-ui/i18n/hy.json
resources/lib/oojs-ui/i18n/jv.json
resources/lib/oojs-ui/i18n/lb.json
resources/lib/oojs-ui/i18n/lt.json
resources/lib/oojs-ui/i18n/pt-br.json
resources/lib/oojs-ui/oojs-ui-apex-noimages.css
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-mediawiki-noimages.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui.js
resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.js
tests/phpunit/includes/libs/TimingTest.php [new file with mode: 0644]

index 6c792e2..1c3bf20 100644 (file)
@@ -1253,6 +1253,7 @@ $wgAutoloadLocalClasses = array(
        'TidyUpBug37714' => __DIR__ . '/maintenance/tidyUpBug37714.php',
        'TiffHandler' => __DIR__ . '/includes/media/Tiff.php',
        'TimestampException' => __DIR__ . '/includes/exception/TimestampException.php',
+       'Timing' => __DIR__ . '/includes/libs/Timing.php',
        'Title' => __DIR__ . '/includes/Title.php',
        'TitleArray' => __DIR__ . '/includes/TitleArray.php',
        'TitleArrayFromResult' => __DIR__ . '/includes/TitleArrayFromResult.php',
index 553ec44..78c23ce 100644 (file)
@@ -21,7 +21,7 @@
                "ext-iconv": "*",
                "liuggio/statsd-php-client": "1.0.16",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.13.0",
+               "oojs/oojs-ui": "0.13.1",
                "oyejorge/less.php": "1.7.0.9",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
index b8a0ec0..9a6950e 100644 (file)
@@ -181,7 +181,7 @@ define( 'EDIT_UPDATE', 2 );
 define( 'EDIT_MINOR', 4 );
 define( 'EDIT_SUPPRESS_RC', 8 );
 define( 'EDIT_FORCE_BOT', 16 );
-define( 'EDIT_DEFER_UPDATES', 32 );
+define( 'EDIT_DEFER_UPDATES', 32 ); // Unused since 1.27
 define( 'EDIT_AUTOSUMMARY', 64 );
 /**@}*/
 
index 842d276..b5e7e2f 100644 (file)
@@ -1464,17 +1464,19 @@ class Linker {
                                        $linkText = $text;
                                        $linkTarget = Linker::normalizeSubpageLink( $title, $match[1], $linkText );
 
-                                       $target = Title::newFromText( $linkTarget );
-                                       if ( $target ) {
-                                               if ( $target->getText() == '' && !$target->isExternal()
-                                                       && !$local && $title
-                                               ) {
-                                                       $newTarget = clone $title;
-                                                       $newTarget->setFragment( '#' . $target->getFragment() );
-                                                       $target = $newTarget;
-                                               }
+                                       if ( $linkTarget !== null ) {
+                                               $target = Title::newFromText( $linkTarget );
+                                               if ( $target ) {
+                                                       if ( $target->getText() == '' && !$target->isExternal()
+                                                               && !$local && $title
+                                                       ) {
+                                                               $newTarget = clone $title;
+                                                               $newTarget->setFragment( '#' . $target->getFragment() );
+                                                               $target = $newTarget;
+                                                       }
 
-                                               $thelink = Linker::makeCommentLink( $target, $linkText . $inside, $wikiId ) . $trail;
+                                                       $thelink = Linker::makeCommentLink( $target, $linkText . $inside, $wikiId ) . $trail;
+                                               }
                                        }
                                }
                                if ( $thelink ) {
index 676108c..d048b57 100644 (file)
@@ -531,6 +531,9 @@ class MediaWiki {
         * @since 1.26
         */
        public function doPostOutputShutdown( $mode = 'normal' ) {
+               $timing = $this->context->getTiming();
+               $timing->mark( 'requestShutdown' );
+
                // Show visible profiling data if enabled (which cannot be post-send)
                Profiler::instance()->logDataPageOutputOnly();
 
index bb7682d..26fb20f 100644 (file)
@@ -136,6 +136,19 @@ class WebResponse {
                                $options['httpOnly'] );
                }
        }
+
+       /**
+        * Unset a browser cookie.
+        * This sets the cookie with an empty value and an expiry set to a time in the past,
+        * which will cause the browser to remove any cookie with the given name, domain and
+        * path from its cookie store. Options other than these (and prefix) have no effect.
+        * @param string $name Cookie name
+        * @param array $options Cookie options, see {@link setCookie()}
+        * @since 1.27
+        */
+       public function clearCookie( $name, $options = array() ) {
+               $this->setCookie( $name, '', time() - 31536000 /* 1 year */, $options );
+       }
 }
 
 /**
index 1465543..4f9a94d 100644 (file)
@@ -986,6 +986,17 @@ abstract class ApiBase extends ContextSource {
                        // Set a warning if a deprecated parameter has been passed
                        if ( $deprecated && $value !== false ) {
                                $this->setWarning( "The $encParamName parameter has been deprecated." );
+
+                               $feature = $encParamName;
+                               $m = $this;
+                               while ( !$m->isMain() ) {
+                                       $p = $m->getParent();
+                                       $name = $m->getModuleName();
+                                       $param = $p->encodeParamName( $p->getModuleManager()->getModuleGroup( $name ) );
+                                       $feature = "{$param}={$name}&{$feature}";
+                                       $m = $p;
+                               }
+                               $this->logFeatureUsage( $feature );
                        }
                } elseif ( $required ) {
                        $this->dieUsageMsg( array( 'missingparam', $paramName ) );
index bfd841f..edcee86 100644 (file)
@@ -88,10 +88,8 @@ class ApiDelete extends ApiBase {
 
                // Deprecated parameters
                if ( $params['watch'] ) {
-                       $this->logFeatureUsage( 'action=delete&watch' );
                        $watch = 'watch';
                } elseif ( $params['unwatch'] ) {
-                       $this->logFeatureUsage( 'action=delete&unwatch' );
                        $watch = 'unwatch';
                } else {
                        $watch = $params['watchlist'];
index 2f1c01c..90d976a 100644 (file)
@@ -349,10 +349,8 @@ class ApiEditPage extends ApiBase {
 
                // Deprecated parameters
                if ( $params['watch'] ) {
-                       $this->logFeatureUsage( 'action=edit&watch' );
                        $watch = true;
                } elseif ( $params['unwatch'] ) {
-                       $this->logFeatureUsage( 'action=edit&unwatch' );
                        $watch = false;
                }
 
index 6112534..8a63070 100644 (file)
@@ -80,10 +80,6 @@ class ApiExpandTemplates extends ApiBase {
                $retval = array();
 
                if ( isset( $prop['parsetree'] ) || $params['generatexml'] ) {
-                       if ( !isset( $prop['parsetree'] ) ) {
-                               $this->logFeatureUsage( 'action=expandtemplates&generatexml' );
-                       }
-
                        $wgParser->startExternalParse( $title_obj, $options, Parser::OT_PREPROCESS );
                        $dom = $wgParser->preprocessToDom( $params['text'] );
                        if ( is_callable( array( $dom, 'saveXML' ) ) ) {
index 60fd426..c38457e 100644 (file)
@@ -130,10 +130,8 @@ class ApiMove extends ApiBase {
                        $watch = $params['watchlist'];
                } elseif ( $params['watch'] ) {
                        $watch = 'watch';
-                       $this->logFeatureUsage( 'action=move&watch' );
                } elseif ( $params['unwatch'] ) {
                        $watch = 'unwatch';
-                       $this->logFeatureUsage( 'action=move&unwatch' );
                }
 
                // Watch pages
index 2ab37ad..a9ddc6b 100644 (file)
@@ -52,7 +52,6 @@ class ApiParamInfo extends ApiBase {
                }
 
                if ( is_array( $params['querymodules'] ) ) {
-                       $this->logFeatureUsage( 'action=paraminfo&querymodules' );
                        $queryModules = $params['querymodules'];
                        foreach ( $queryModules as $m ) {
                                $modules[] = 'query+' . $m;
@@ -62,7 +61,6 @@ class ApiParamInfo extends ApiBase {
                }
 
                if ( is_array( $params['formatmodules'] ) ) {
-                       $this->logFeatureUsage( 'action=paraminfo&formatmodules' );
                        $formatModules = $params['formatmodules'];
                        foreach ( $formatModules as $m ) {
                                $modules[] = $m;
@@ -109,12 +107,10 @@ class ApiParamInfo extends ApiBase {
                }
 
                if ( $params['mainmodule'] ) {
-                       $this->logFeatureUsage( 'action=paraminfo&mainmodule' );
                        $res['mainmodule'] = $this->getModuleInfo( $this->getMain() );
                }
 
                if ( $params['pagesetmodule'] ) {
-                       $this->logFeatureUsage( 'action=paraminfo&pagesetmodule' );
                        $pageSet = new ApiPageSet( $this->getMain()->getModuleManager()->getModule( 'query' ) );
                        $res['pagesetmodule'] = $this->getModuleInfo( $pageSet );
                        unset( $res['pagesetmodule']['name'] );
index fcab9be..1b2efa5 100644 (file)
@@ -427,9 +427,6 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['parsetree'] ) || $params['generatexml'] ) {
-                       if ( !isset( $prop['parsetree'] ) ) {
-                               $this->logFeatureUsage( 'action=parse&generatexml' );
-                       }
                        if ( $this->content->getModel() != CONTENT_MODEL_WIKITEXT ) {
                                $this->dieUsage( "parsetree is only supported for wikitext content", "notwikitext" );
                        }
index c07aaca..22bd29c 100644 (file)
@@ -101,9 +101,6 @@ class ApiProtect extends ApiBase {
 
                $cascade = $params['cascade'];
 
-               if ( $params['watch'] ) {
-                       $this->logFeatureUsage( 'action=protect&watch' );
-               }
                $watch = $params['watch'] ? 'watch' : $params['watchlist'];
                $this->setWatch( $watch, $titleObj, 'watchdefault' );
 
index 6dcfe0e..af40423 100644 (file)
@@ -158,9 +158,6 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                        }
                                        $startsortkey = pack( 'H*', $params['starthexsortkey'] );
                                } else {
-                                       if ( $params['startsortkey'] !== null ) {
-                                               $this->logFeatureUsage( 'list=categorymembers&cmstartsortkey' );
-                                       }
                                        $startsortkey = $params['startsortkey'];
                                }
                                if ( $params['endsortkeyprefix'] !== null ) {
@@ -171,9 +168,6 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                        }
                                        $endsortkey = pack( 'H*', $params['endhexsortkey'] );
                                } else {
-                                       if ( $params['endsortkey'] !== null ) {
-                                               $this->logFeatureUsage( 'list=categorymembers&cmendsortkey' );
-                                       }
                                        $endsortkey = $params['endsortkey'];
                                }
 
index 82619cc..7123138 100644 (file)
@@ -51,7 +51,6 @@ class ApiQueryIWLinks extends ApiQueryBase {
                // Handle deprecated param
                $this->requireMaxOneParameter( $params, 'url', 'prop' );
                if ( $params['url'] ) {
-                       $this->logFeatureUsage( 'prop=iwlinks&iwurl' );
                        $prop = array( 'url' => 1 );
                }
 
index 899a382..f964c7a 100644 (file)
@@ -50,7 +50,6 @@ class ApiQueryLangLinks extends ApiQueryBase {
                // Handle deprecated param
                $this->requireMaxOneParameter( $params, 'url', 'prop' );
                if ( $params['url'] ) {
-                       $this->logFeatureUsage( 'prop=langlinks&llurl' );
                        $prop = array( 'url' => 1 );
                }
 
index e553d12..c7dbfb8 100644 (file)
@@ -130,10 +130,6 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
                        $this->requireMaxOneParameter( $params, 'filterredir', 'redirect' );
                }
 
-               if ( $params['redirect'] ) {
-                       $this->logFeatureUsage( "list=random&rnredirect=" );
-               }
-
                if ( isset( $params['continue'] ) ) {
                        $cont = explode( '|', $params['continue'] );
                        $this->dieContinueUsageIf( count( $cont ) != 4 );
index ebc5c2e..0c5d5f3 100644 (file)
@@ -276,9 +276,6 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        }
                }
                if ( $this->fld_parsetree || ( $this->fld_content && $this->generateXML ) ) {
-                       if ( !$this->fld_parsetree ) {
-                               $this->logFeatureUsage( 'action=query&prop=revisions+base&generatexml' );
-                       }
                        if ( $content ) {
                                if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
                                        $t = $content->getNativeData(); # note: don't set $text
index 0a75961..229e158 100644 (file)
@@ -47,7 +47,6 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
 
                // Alias sessionkey to filekey, but give an existing filekey precedence.
                if ( !$params['filekey'] && $params['sessionkey'] ) {
-                       $this->logFeatureUsage( 'prop=stashimageinfo&siisessionkey' );
                        $params['filekey'] = $params['sessionkey'];
                }
 
index e303094..1ef0f35 100644 (file)
@@ -224,7 +224,6 @@ class ApiQueryContributions extends ApiQueryBase {
 
                $show = $this->params['show'];
                if ( $this->params['toponly'] ) { // deprecated/old param
-                       $this->logFeatureUsage( 'list=usercontribs&uctoponly' );
                        $show[] = 'top';
                }
                if ( !is_null( $show ) ) {
index 5e13e98..5f34701 100644 (file)
@@ -53,7 +53,6 @@ class ApiUpload extends ApiBase {
 
                // Copy the session key to the file key, for backward compatibility.
                if ( !$this->mParams['filekey'] && $this->mParams['sessionkey'] ) {
-                       $this->logFeatureUsage( 'action=upload&sessionkey' );
                        $this->mParams['filekey'] = $this->mParams['sessionkey'];
                }
 
@@ -730,7 +729,6 @@ class ApiUpload extends ApiBase {
 
                // Deprecated parameters
                if ( $this->mParams['watch'] ) {
-                       $this->logFeatureUsage( 'action=upload&watch' );
                        $watch = true;
                }
 
index 85d051d..9eb5f2a 100644 (file)
@@ -85,7 +85,6 @@ class ApiWatch extends ApiBase {
                                );
                        }
 
-                       $this->logFeatureUsage( 'action=watch&title' );
                        $title = Title::newFromText( $params['title'] );
                        if ( !$title || !$title->isWatchable() ) {
                                $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
index 074593f..fd561d9 100644 (file)
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Engade información do rexistro cando sexa axeitado.",
        "apihelp-query+watchlist-param-show": "Só mostrar elementos que cumpran esos criterios. Por exemplo, para ver só edicións menores feitas por usuarios conectados, activar $1show=minor|!anon.",
        "apihelp-query+watchlist-param-type": "Que tipos de cambios mostrar:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "Edicións comúns a páxinas.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Cambios externos.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Creacións de páxinas.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Entradas do rexistro",
        "apihelp-query+watchlist-param-owner": "Usado con $1token para acceder á lista de páxinas de vixiancia doutro usuario.",
        "apihelp-query+watchlist-param-token": "Identificador de seguridade (dispoñible nas [[Special:Preferences#mw-prefsection-watchlist|preferencias]] de usuario) para permitir o acceso a outros á súa páxina de vixiancia.",
        "apihelp-query+watchlist-example-simple": "Listar a última revisión das páxinas recentemente modificadas da lista de vixiancia do usuario actual.",
index c1123d2..312e7ea 100644 (file)
        "apihelp-feedrecentchanges-param-hidebots": "Nascondi le modifiche apportate da bot.",
        "apihelp-feedrecentchanges-param-hideanons": "Nascondi le modifiche fatte da utenti anonimi.",
        "apihelp-feedrecentchanges-param-hideliu": "Nascondi le modifiche apportate dagli utenti registrati.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Nascondi modifiche verificate.",
        "apihelp-feedrecentchanges-param-hidemyself": "Nasconde le modifiche effettuate dall'utente attuale.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Filtra per etichetta.",
+       "apihelp-feedrecentchanges-param-target": "Mostra solo le modifiche alle pagine collegate da questa pagina.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Mostra solo le modifiche alle pagine collegate a quella specificata.",
        "apihelp-feedrecentchanges-example-simple": "Mostra le ultime modifiche.",
        "apihelp-feedrecentchanges-example-30days": "Mostra le modifiche degli ultimi 30 giorni.",
+       "apihelp-feedwatchlist-param-linktosections": "Collega direttamente alla sezione modificata, se possibile.",
+       "apihelp-filerevert-description": "Ripristina un file ad una versione precedente.",
+       "apihelp-filerevert-param-filename": "Nome del file di destinazione, senza il prefisso 'File:'.",
+       "apihelp-filerevert-example-revert": "Ripristina <kbd>Wiki.png</kbd> alla versione del <kbd>2011-03-05T15:27:40Z</kbd>.",
+       "apihelp-imagerotate-description": "Ruota una o più immagini.",
+       "apihelp-imagerotate-param-rotation": "Gradi di rotazione dell'immagine in senso orario.",
+       "apihelp-imagerotate-example-simple": "Ruota <kbd>File:Example.png</kbd> di <kbd>90</kbd> gradi.",
+       "apihelp-imagerotate-example-generator": "Ruota tutte le immagini in <kbd>Category:Flip</kbd> di <kbd>180</kbd> gradi.",
+       "apihelp-import-param-summary": "Oggetto dell'importazione.",
+       "apihelp-import-param-xml": "File XML caricato.",
+       "apihelp-import-param-interwikisource": "Per importazioni interwiki: wiki da cui importare.",
+       "apihelp-import-param-interwikipage": "Per importazioni interwiki: pagina da importare.",
+       "apihelp-import-param-fullhistory": "Per importazioni interwiki: importa l'intera cronologia, non solo la versione attuale.",
+       "apihelp-import-param-templates": "Per importazioni interwiki: importa anche tutti i template inclusi.",
+       "apihelp-import-example-import": "Importa [[meta:Help:ParserFunctions]] nel namespace 100 con cronologia completa.",
        "apihelp-login-param-name": "Nome utente.",
        "apihelp-login-param-password": "Password.",
        "apihelp-login-param-domain": "Dominio (opzionale).",
index 134ca2c..766da01 100644 (file)
@@ -79,6 +79,8 @@
        "apihelp-edit-param-redirect": "Автоматически разрешать редиректы.",
        "apihelp-edit-param-contentformat": "Формат сериализации содержимого, используемый для ввода текста.",
        "apihelp-edit-example-edit": "Редактировать страницу",
+       "apihelp-edit-example-prepend": "Добавить магическое слово <kbd>_&#95;NOTOC_&#95;</kbd> в начало страницы.",
+       "apihelp-edit-example-undo": "Отменить изменения с 13579 по 13585 с добавлением автоматического описания правки.",
        "apihelp-emailuser-description": "Письмо участнику",
        "apihelp-emailuser-param-target": "Адресат электронного письма",
        "apihelp-emailuser-param-subject": "Заголовок темы.",
index caf5afa..a8850fc 100644 (file)
@@ -152,6 +152,16 @@ abstract class ContextSource implements IContextSource {
                return $this->getContext()->getSkin();
        }
 
+       /**
+        * Get the Timing object
+        *
+        * @since 1.27
+        * @return Timing
+        */
+       public function getTiming() {
+               return $this->getContext()->getTiming();
+       }
+
        /**
         * Get the Stats object
         *
index 09c3939..1b881e4 100644 (file)
@@ -72,6 +72,11 @@ class DerivativeContext extends ContextSource implements MutableContext {
         */
        private $stats;
 
+       /**
+        * @var Timing
+        */
+       private $timing;
+
        /**
         * Constructor
         * @param IContextSource $context Context to inherit from
@@ -115,6 +120,19 @@ class DerivativeContext extends ContextSource implements MutableContext {
                }
        }
 
+       /**
+        * Get the timing object
+        *
+        * @return Timing
+        */
+       public function getTiming() {
+               if ( !is_null( $this->timing ) ) {
+                       return $this->timing;
+               } else {
+                       return $this->getContext()->getTiming();
+               }
+       }
+
        /**
         * Set the WebRequest object
         *
index 58bf5d9..750389d 100644 (file)
@@ -131,6 +131,14 @@ interface IContextSource {
         */
        public function getStats();
 
+       /**
+        * Get the timing object
+        *
+        * @since 1.27
+        * @return Timing
+        */
+       public function getTiming();
+
        /**
         * Get a Message object with context set.  See wfMessage for parameters.
         *
index 42a2aee..4f8e65d 100644 (file)
@@ -66,6 +66,11 @@ class RequestContext implements IContextSource, MutableContext {
         */
        private $stats;
 
+       /**
+        * @var Timing
+        */
+       private $timing;
+
        /**
         * @var Config
         */
@@ -139,6 +144,18 @@ class RequestContext implements IContextSource, MutableContext {
                return $this->stats;
        }
 
+       /**
+        * Get the timing object
+        *
+        * @return Timing
+        */
+       public function getTiming() {
+               if ( $this->timing === null ) {
+                       $this->timing = new Timing();
+               }
+               return $this->timing;
+       }
+
        /**
         * Set the Title object
         *
index 60f02a1..d328ecc 100644 (file)
@@ -160,7 +160,12 @@ class OOUIHTMLForm extends HTMLForm {
                                $msg = $error;
                                $error = array();
                        }
-                       $error = $this->msg( $msg, $error )->parse();
+                       // if the error is already a message object, don't use it as a message key
+                       if ( !$msg instanceof Message ) {
+                               $error = $this->msg( $msg, $error )->parse();
+                       } else {
+                               $error = $msg->parse();
+                       }
                        $error = new OOUI\HtmlSnippet( $error );
                }
 
index 544b852..643a370 100644 (file)
        "config-nofile": "Non se puido atopar o ficheiro \"$1\". Se cadra, foi borrado.",
        "config-extension-link": "Sabía que o seu wiki soporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensións]?\n\nPode explorar as [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensións por categoría] ou a [//www.mediawiki.org/wiki/Extension_Matrix matriz de extensións] para ollar a lista completa de extensións.",
        "mainpagetext": "<strong>MediaWiki instalouse correctamente.</strong>",
-       "mainpagedocfooter": "Consulte a [//meta.wikimedia.org/wiki/Help:Contents guía de usuario] para obter máis información sobre como usar o software wiki.\n\n== Primeiros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista das opcións de configuración]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas máis frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localice MediaWiki á súa lingua]"
+       "mainpagedocfooter": "Consulte a [//meta.wikimedia.org/wiki/Help:Contents guía de usuario] para obter máis información sobre como usar o software wiki.\n\n== Primeiros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista das opcións de configuración]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas máis frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localice MediaWiki á súa lingua]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprenda como combater a publicidade na súa wiki]"
 }
diff --git a/includes/libs/Timing.php b/includes/libs/Timing.php
new file mode 100644 (file)
index 0000000..653227e
--- /dev/null
@@ -0,0 +1,168 @@
+<?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
+ */
+
+/**
+ * An interface to help developers measure the performance of their applications.
+ * This interface closely matches the W3C's User Timing specification.
+ * The key differences are:
+ *
+ * - The reference point for all measurements which do not explicitly specify
+ *   a start time is $_SERVER['REQUEST_TIME_FLOAT'], not navigationStart.
+ * - Successive calls to mark() and measure() with the same entry name cause
+ *   the previous entry to be overwritten. This ensures that there is a 1:1
+ *   mapping between names and entries.
+ * - Because there is a 1:1 mapping, instead of getEntriesByName(), we have
+ *   getEntryByName().
+ *
+ * The in-line documentation incorporates content from the User Timing Specification
+ * http://www.w3.org/TR/user-timing/
+ * Copyright © 2013 World Wide Web Consortium, (MIT, ERCIM, Keio, Beihang).
+ * http://www.w3.org/Consortium/Legal/2015/doc-license
+ *
+ * @since 1.27
+ */
+class Timing {
+
+       /** @var array[] */
+       private $entries = array();
+
+       public function __construct() {
+               $this->clearMarks();
+       }
+
+       /**
+        * Store a timestamp with the associated name (a "mark")
+        *
+        * @param string $markName The name associated with the timestamp.
+        *  If there already exists an entry by that name, it is overwritten.
+        * @return array The mark that has been created.
+        */
+       public function mark( $markName ) {
+               $this->entries[$markName] = array(
+                       'name'      => $markName,
+                       'entryType' => 'mark',
+                       'startTime' => microtime( true ),
+                       'duration'  => 0,
+               );
+               return $this->entries[$markName];
+       }
+
+       /**
+        * @param string $markName The name of the mark that should
+        *  be cleared. If not specified, all marks will be cleared.
+        */
+       public function clearMarks( $markName = null ) {
+               if ( $markName !== null ) {
+                       unset( $this->entries[$markName] );
+               } else {
+                       $this->entries = array(
+                               'requestStart' => array(
+                                       'name'      => 'requestStart',
+                                       'entryType' => 'mark',
+                                       'startTime' => isset( $_SERVER['REQUEST_TIME_FLOAT'] )
+                                               ? $_SERVER['REQUEST_TIME_FLOAT']
+                                               : $_SERVER['REQUEST_TIME'],
+                                       'duration'  => 0,
+                               ),
+                       );
+               }
+       }
+
+       /**
+        * This method stores the duration between two marks along with
+        * the associated name (a "measure").
+        *
+        * If neither the startMark nor the endMark argument is specified,
+        * measure() will store the duration from $_SERVER['REQUEST_TIME_FLOAT'] to
+        * the current time.
+        * If the startMark argument is specified, but the endMark argument is not
+        * specified, measure() will store the duration from the most recent
+        * occurrence of the start mark to the current time.
+        * If both the startMark and endMark arguments are specified, measure()
+        * will store the duration from the most recent occurrence of the start
+        * mark to the most recent occurrence of the end mark.
+        *
+        * @param string $measureName
+        * @param string $startMark
+        * @param string $endMark
+        * @return array The measure that has been created.
+        */
+       public function measure( $measureName, $startMark = 'requestStart', $endMark = null ) {
+               $start = $this->getEntryByName( $startMark );
+               $startTime = $start['startTime'];
+
+               if ( $endMark ) {
+                       $end = $this->getEntryByName( $endMark );
+                       $endTime = $end['startTime'];
+               } else {
+                       $endTime = microtime( true );
+               }
+
+               $this->entries[$measureName] = array(
+                       'name'      => $measureName,
+                       'entryType' => 'measure',
+                       'startTime' => $startTime,
+                       'duration'  => $endTime - $startTime,
+               );
+
+               return $this->entries[$measureName];
+       }
+
+       /**
+        * Sort entries in chronological order with respect to startTime.
+        */
+       private function sortEntries() {
+               uasort( $this->entries, function ( $a, $b ) {
+                       return 10000 * ( $a['startTime'] - $b['startTime'] );
+               } );
+       }
+
+       /**
+        * @return array[] All entries in chronological order.
+        */
+       public function getEntries() {
+               $this->sortEntries();
+               return $this->entries;
+       }
+
+       /**
+        * @param string $entryType
+        * @return array[] Entries (in chronological order) that have the same value
+        *  for the entryType attribute as the $entryType parameter.
+        */
+       public function getEntriesByType( $entryType ) {
+               $this->sortEntries();
+               $entries = array();
+               foreach ( $this->entries as $entry ) {
+                       if ( $entry['entryType'] === $entryType ) {
+                               $entries[] = $entry;
+                       }
+               }
+               return $entries;
+       }
+
+       /**
+        * @param string $name
+        * @return array|null Entry named $name or null if it does not exist.
+        */
+       public function getEntryByName( $name ) {
+               return isset( $this->entries[$name] ) ? $this->entries[$name] : null;
+       }
+}
index e71c0ec..2d5cb78 100644 (file)
@@ -1242,7 +1242,7 @@ class WikiPage implements Page, IDBAccessObject {
         *   Giving 0 indicates the new page flag should be set on.
         * @param bool $lastRevIsRedirect If given, will optimize adding and
         *   removing rows in redirect table.
-        * @return bool True on success, false on failure
+        * @return bool Success; false if the page row was missing or page_latest changed
         */
        public function updateRevisionOn( $dbw, $revision, $lastRevision = null,
                $lastRevIsRedirect = null
@@ -1804,29 +1804,37 @@ class WikiPage implements Page, IDBAccessObject {
                        $changed = !$content->equals( $old_content );
 
                        if ( $changed ) {
-                               $dbw->begin( __METHOD__ );
-
                                $prepStatus = $content->prepareSave( $this, $flags, $oldid, $user );
                                $status->merge( $prepStatus );
 
                                if ( !$status->isOK() ) {
-                                       $dbw->rollback( __METHOD__ );
+                                       return $status;
+                               }
+
+                               $dbw->begin( __METHOD__ );
+                               // Get the latest page_latest value while locking it.
+                               // Do a CAS style check to see if it's the same as when this method
+                               // started. If it changed then bail out before touching the DB.
+                               $latestNow = $this->lock();
+                               if ( $latestNow != $oldid ) {
+                                       $dbw->commit( __METHOD__ );
+                                       // Page updated or deleted in the mean time
+                                       $status->fatal( 'edit-conflict' );
 
                                        return $status;
                                }
-                               $revisionId = $revision->insertOn( $dbw );
 
-                               // Update page.
-                               // We check for conflicts by comparing $oldid with the current latest revision ID.
-                               $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
+                               // At this point we are now comitted to returning an OK
+                               // status unless some DB query error or other exception comes up.
+                               // This way callers don't have to call rollback() if $status is bad
+                               // unless they actually try to catch exceptions (which is rare).
 
-                               if ( !$ok ) {
-                                       // Belated edit conflict! Run away!!
-                                       $status->fatal( 'edit-conflict' );
+                               $revisionId = $revision->insertOn( $dbw );
 
+                               // Update page_latest and friends to reflect the new revision
+                               if ( !$this->updateRevisionOn( $dbw, $revision, null, $oldIsRedirect ) ) {
                                        $dbw->rollback( __METHOD__ );
-
-                                       return $status;
+                                       throw new MWException( "Failed to update page row to use new revision." );
                                }
 
                                Hooks::run( 'NewRevisionFromEditComplete',
@@ -1876,30 +1884,28 @@ class WikiPage implements Page, IDBAccessObject {
                        // Create new article
                        $status->value['new'] = true;
 
-                       $dbw->begin( __METHOD__ );
-
                        $prepStatus = $content->prepareSave( $this, $flags, $oldid, $user );
                        $status->merge( $prepStatus );
-
                        if ( !$status->isOK() ) {
-                               $dbw->rollback( __METHOD__ );
-
                                return $status;
                        }
 
-                       $status->merge( $prepStatus );
+                       $dbw->begin( __METHOD__ );
 
-                       // Add the page record; stake our claim on this title!
-                       // This will return false if the article already exists
+                       // Add the page record unless one already exists for the title
                        $newid = $this->insertOn( $dbw );
-
                        if ( $newid === false ) {
-                               $dbw->rollback( __METHOD__ );
+                               $dbw->commit( __METHOD__ ); // nothing inserted
                                $status->fatal( 'edit-already-exists' );
 
-                               return $status;
+                               return $status; // nothing done
                        }
 
+                       // At this point we are now comitted to returning an OK
+                       // status unless some DB query error or other exception comes up.
+                       // This way callers don't have to call rollback() if $status is bad
+                       // unless they actually try to catch exceptions (which is rare).
+
                        // Save the revision text...
                        $revision = new Revision( array(
                                'page'       => $newid,
@@ -1924,7 +1930,10 @@ class WikiPage implements Page, IDBAccessObject {
                        }
 
                        // Update the page record with revision data
-                       $this->updateRevisionOn( $dbw, $revision, 0 );
+                       if ( !$this->updateRevisionOn( $dbw, $revision, 0 ) ) {
+                               $dbw->rollback( __METHOD__ );
+                               throw new MWException( "Failed to update page row to use new revision." );
+                       }
 
                        Hooks::run( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
 
index 5821148..6dad342 100644 (file)
@@ -191,8 +191,7 @@ class SearchOracle extends SearchDatabase {
                                        foreach ( $temp_terms as $t ) {
                                                $searchon .= ( $terms[1] == '-' ? ' ~' : ' & ' ) . $this->escapeTerm( $t );
                                        }
-                               }
-                               else {
+                               } else {
                                        $searchon .= ( $terms[1] == '-' ? ' ~' : ' & ' ) . $this->escapeTerm( $terms[2] );
                                }
                                if ( !empty( $terms[3] ) ) {
index 60c4249..649ef4f 100644 (file)
@@ -84,14 +84,11 @@ class SearchPostgres extends SearchDatabase {
                                }
                                if ( strtolower( $terms[2] ) === 'and' ) {
                                        $searchstring .= ' & ';
-                               }
-                               elseif ( strtolower( $terms[2] ) === 'or' || $terms[2] === '|' ) {
+                               } elseif ( strtolower( $terms[2] ) === 'or' || $terms[2] === '|' ) {
                                        $searchstring .= ' | ';
-                               }
-                               elseif ( strtolower( $terms[2] ) === 'not' ) {
+                               } elseif ( strtolower( $terms[2] ) === 'not' ) {
                                        $searchstring .= ' & !';
-                               }
-                               else {
+                               } else {
                                        $searchstring .= " & $terms[2]";
                                }
                        }
@@ -147,8 +144,7 @@ class SearchPostgres extends SearchDatabase {
                        $query = "SELECT page_id, page_namespace, page_title, 0 AS score " .
                                "FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
                                "AND r.rev_text_id = c.old_id AND 1=0";
-               }
-               else {
+               } else {
                        $m = array();
                        if ( preg_match_all( "/'([^']+)'/", $top, $m, PREG_SET_ORDER ) ) {
                                foreach ( $m as $terms ) {
@@ -157,9 +153,9 @@ class SearchPostgres extends SearchDatabase {
                        }
 
                        $query = "SELECT page_id, page_namespace, page_title, " .
-                       "ts_rank($fulltext, to_tsquery($searchstring), 5) AS score " .
-                       "FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
-                       "AND r.rev_text_id = c.old_id AND $fulltext @@ to_tsquery($searchstring)";
+                               "ts_rank($fulltext, to_tsquery($searchstring), 5) AS score " .
+                               "FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
+                               "AND r.rev_text_id = c.old_id AND $fulltext @@ to_tsquery($searchstring)";
                }
 
                # # Namespaces - defaults to 0
index df68b12..91ac4e0 100644 (file)
@@ -190,20 +190,16 @@ class SpecialChangePassword extends FormSpecialPage {
                        return true;
                }
 
-               try {
-                       $this->mUserName = $request->getVal( 'wpName', $this->getUser()->getName() );
-                       $this->mDomain = $wgAuth->getDomain();
+               $this->mUserName = $request->getVal( 'wpName', $this->getUser()->getName() );
+               $this->mDomain = $wgAuth->getDomain();
 
-                       if ( !$wgAuth->allowPasswordChange() ) {
-                               throw new ErrorPageError( 'changepassword', 'resetpass_forbidden' );
-                       }
+               if ( !$wgAuth->allowPasswordChange() ) {
+                       throw new ErrorPageError( 'changepassword', 'resetpass_forbidden' );
+               }
 
-                       $this->attemptReset( $data['Password'], $data['NewPassword'], $data['Retype'] );
+               $status = $this->attemptReset( $data['Password'], $data['NewPassword'], $data['Retype'] );
 
-                       return true;
-               } catch ( PasswordError $e ) {
-                       return $e->getMessage();
-               }
+               return $status;
        }
 
        public function onSuccess() {
@@ -231,10 +227,14 @@ class SpecialChangePassword extends FormSpecialPage {
        }
 
        /**
-        * @param string $oldpass
-        * @param string $newpass
-        * @param string $retype
-        * @throws PasswordError When cannot set the new password because requirements not met.
+        * Checks the new password if it meets the requirements for passwords and set
+        * it as a current password, otherwise set the passed Status object to fatal
+        * and doesn't change anything
+        *
+        * @param string $oldpass The current (temporary) password.
+        * @param string $newpass The password to set.
+        * @param string $retype The string of the retype password field to check with newpass
+        * @return Status
         */
        protected function attemptReset( $oldpass, $newpass, $retype ) {
                $isSelf = ( $this->mUserName === $this->getUser()->getName() );
@@ -245,33 +245,32 @@ class SpecialChangePassword extends FormSpecialPage {
                }
 
                if ( !$user || $user->isAnon() ) {
-                       throw new PasswordError( $this->msg( 'nosuchusershort', $this->mUserName )->text() );
+                       return Status::newFatal( $this->msg( 'nosuchusershort', $this->mUserName ) );
                }
 
                if ( $newpass !== $retype ) {
                        Hooks::run( 'PrefsPasswordAudit', array( $user, $newpass, 'badretype' ) );
-                       throw new PasswordError( $this->msg( 'badretype' )->text() );
+                       return Status::newFatal( $this->msg( 'badretype' ) );
                }
 
                $throttleCount = LoginForm::incLoginThrottle( $this->mUserName );
                if ( $throttleCount === true ) {
                        $lang = $this->getLanguage();
                        $throttleInfo = $this->getConfig()->get( 'PasswordAttemptThrottle' );
-                       throw new PasswordError( $this->msg( 'changepassword-throttled' )
+                       return Status::newFatal( $this->msg( 'changepassword-throttled' )
                                ->params( $lang->formatDuration( $throttleInfo['seconds'] ) )
-                               ->text()
                        );
                }
 
                // @todo Make these separate messages, since the message is written for both cases
                if ( !$user->checkTemporaryPassword( $oldpass ) && !$user->checkPassword( $oldpass ) ) {
                        Hooks::run( 'PrefsPasswordAudit', array( $user, $newpass, 'wrongpassword' ) );
-                       throw new PasswordError( $this->msg( 'resetpass-wrong-oldpass' )->text() );
+                       return Status::newFatal( $this->msg( 'resetpass-wrong-oldpass' ) );
                }
 
                // User is resetting their password to their old password
                if ( $oldpass === $newpass ) {
-                       throw new PasswordError( $this->msg( 'resetpass-recycled' )->text() );
+                       return Status::newFatal( $this->msg( 'resetpass-recycled' ) );
                }
 
                // Do AbortChangePassword after checking mOldpass, so we don't leak information
@@ -279,7 +278,7 @@ class SpecialChangePassword extends FormSpecialPage {
                $abortMsg = 'resetpass-abort-generic';
                if ( !Hooks::run( 'AbortChangePassword', array( $user, $oldpass, $newpass, &$abortMsg ) ) ) {
                        Hooks::run( 'PrefsPasswordAudit', array( $user, $newpass, 'abortreset' ) );
-                       throw new PasswordError( $this->msg( $abortMsg )->text() );
+                       return Status::newFatal( $this->msg( $abortMsg ) );
                }
 
                // Please reset throttle for successful logins, thanks!
@@ -292,7 +291,7 @@ class SpecialChangePassword extends FormSpecialPage {
                        Hooks::run( 'PrefsPasswordAudit', array( $user, $newpass, 'success' ) );
                } catch ( PasswordError $e ) {
                        Hooks::run( 'PrefsPasswordAudit', array( $user, $newpass, 'error' ) );
-                       throw new PasswordError( $e->getMessage() );
+                       return Status::newFatal( new RawMessage( $e->getMessage() ) );
                }
 
                if ( $isSelf ) {
@@ -303,6 +302,7 @@ class SpecialChangePassword extends FormSpecialPage {
                }
                $user->saveSettings();
                $this->resetPasswordExpiration( $user );
+               return Status::newGood();
        }
 
        public function requiresUnblock() {
@@ -336,4 +336,8 @@ class SpecialChangePassword extends FormSpecialPage {
                        __METHOD__
                );
        }
+
+       protected function getDisplayFormat() {
+               return 'ooui';
+       }
 }
index 6368e8f..812b7f9 100644 (file)
        "htmlform-cloner-delete": "Выдаліць",
        "htmlform-cloner-required": "Патрабуецца як мінімум яшчэ адно значэньне.",
        "htmlform-title-badnamespace": "[[:$1]] знаходзіцца не ў прасторы назваў «{{ns:$2}}».",
+       "htmlform-title-not-creatable": "«$1» — немагчымы загаловак для старонкі",
        "htmlform-user-not-exists": "<strong>$1</strong> не існуе.",
        "htmlform-user-not-valid": "<strong>$1</strong> — некарэктнае імя карыстальніка.",
        "sqlite-has-fts": "$1 з падтрымкай поўнатэкстнага пошуку",
index 3890845..0f268be 100644 (file)
        "search-category": "(catégorie $1)",
        "search-file-match": "(correspond au contenu du fichier)",
        "search-suggest": "Essayez avec cette orthographe : $1",
-       "search-rewritten": "Affiche les résultats pour $1. Recherchez à sa place pour $2.",
+       "search-rewritten": "Résultats affichés pour $1. Rechercher $2 à la place.",
        "search-interwiki-caption": "Projets frères",
        "search-interwiki-default": "Résultats de $1 :",
        "search-interwiki-more": "(plus)",
index 26d1d26..3e3d27d 100644 (file)
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Por que crea outra conta?",
-       "createacct-captcha": "Comprobación de seguridade",
-       "createacct-imgcaptcha-ph": "Insira o texto que ve enriba",
        "createacct-submit": "Crear a conta",
        "createacct-another-submit": "Crear conta",
        "createacct-benefit-heading": "Xente coma vostede elabora {{SITENAME}}.",
        "showingresultsinrange": "{{PLURAL:$1|Móstrase <strong>1</strong> resultado|Móstranse <strong>$1</strong> resultados}}, comezando polo número <strong>$2</strong> e rematando polo número <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultado <strong>$1</strong> de <strong>$3</strong>|Resultados do <strong>$1</strong> ao <strong>$2</strong>, dun total de <strong>$3</strong>}}",
        "search-nonefound": "Non se atopou ningún resultado que coincidise coa procura.",
+       "search-nonefound-thiswiki": "Non hai resultados que cumpran os criterios de busca neste sitio.",
        "powersearch-legend": "Busca avanzada",
        "powersearch-ns": "Procurar nos espazos de nomes:",
        "powersearch-togglelabel": "Seleccionar:",
index f3cab6b..cfd4844 100644 (file)
@@ -91,7 +91,8 @@
                        "Statix64",
                        "CassiodoroVicinetti",
                        "Bultro",
-                       "Oggioniale"
+                       "Oggioniale",
+                       "Wim b"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "passwordreset-capture-help": "Se si seleziona questa casella, l'indirizzo e-mail (con la password temporanea), verrà mostrato a voi, oltre ad essere inviato all'utente.",
        "passwordreset-email": "Indirizzo email:",
        "passwordreset-emailtitle": "Dettagli dell'utente su {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Qualcuno (probabilmente tu, con indirizzo IP $1) ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:\n\n$2\n\n{{PLURAL:$3|Questa password temporanea scadrà|Queste password temporanee scadranno}} dopo {{PLURAL:$5|un giorno|$5 giorni}}.\nDovresti accedere e scegliere una nuova password ora. \n\nSe non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare al utilizzare la tua vecchia password.",
+       "passwordreset-emailtext-ip": "Qualcuno (probabilmente tu, con indirizzo IP $1) ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:\n\n$2\n\n{{PLURAL:$3|Questa password temporanea scadrà|Queste password temporanee scadranno}} dopo {{PLURAL:$5|un giorno|$5 giorni}}.\nDovresti accedere e scegliere una nuova password ora. \n\nSe non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare ad utilizzare la tua vecchia password.",
        "passwordreset-emailtext-user": "L'utente $1 di {{SITENAME}} ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:\n\n$2\n\n{{PLURAL:$3|Questa password temporanea scadrà|Queste password temporanee scadranno}} dopo {{PLURAL:$5|un giorno|$5 giorni}}.\nDovresti accedere e scegliere una nuova password ora. \n\nSe non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare al utilizzare la tua vecchia password.",
        "passwordreset-emailelement": "Nome utente: \n$1\n\nPassword temporanea: \n$2",
        "passwordreset-emailsent": "Se questo è un indirizzo di posta elettronica registrato per la tua utenza, allora verrà inviata una email per reimpostare la password.",
index af5b715..2a957a0 100644 (file)
        "viewsource": "មើល​កូដ",
        "viewsource-title": "មើលកូដរបស់ $1",
        "actionthrottled": "សកម្មភាពត្រូវបានកម្រិត",
-       "actionthrottledtext": "ក្រោមវិធានការប្រឆាំងស្ប៉ាម​ អ្នកត្រូវបាន​គេកំហិតមិនឱ្យ​ធ្វើសកម្មភាពនេះ​ច្រើនដងពេកទេ​ក្នុងរយៈពេលខ្លីមួយ។\n\nសូមព្យាយាមម្ដងទៀតក្នុងរយៈពេលប៉ុន្មាននាទីទៀត។",
+       "actionthrottledtext": "ក្រោមវិធានការប្រឆាំងស្ប៉ាម​ អ្នកត្រូវបាន​គេកំហិតមិនឱ្យ​ធ្វើសកម្មភាពនេះ​ច្រើនដងពេកទេ​ក្នុងរយៈពេលខ្លីមួយ តែអ្នកបានធ្វើលើសចំនួនកំហិត។\n\nសូមព្យាយាមម្ដងទៀតក្នុងរយៈពេលប៉ុន្មាននាទីទៀត។",
        "protectedpagetext": "ទំព័រនេះបានត្រូវការពារមិនឱ្យកែប្រែ​ឬធ្វើសកម្មភាពផ្សេងទៀតលើវា។",
        "viewsourcetext": "អ្នកអាចមើលនិងចម្លងកូដរបស់ទំព័រនេះ។",
        "viewyourtext": "អ្នកអាចមើលនិងចម្លងកូដរបស់<strong>ការកែប្រែរបស់អ្នក</strong>មកកាន់ទំព័រនេះ។",
        "passwordreset-emailtext-ip": "មាននរណាម្នាក់ (ប្រហែលជាខ្លួនអ្នកផ្ទាល់, មកពីអាស័យដ្ឋាន IP $1) បានស្នើសុំស្ដារពាក្យសម្ងាត់របស់អ្នកសម្រាប់ {{SITENAME}} ($4)។ {{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះ\nមានជាប់ទាក់ទិននឹងអាសយដ្ឋានអ៊ីមែលនេះ៖\n\n$2\n\n{{PLURAL:$3|ពាក្យសម្ងាត់បណ្ដោះអាសន្ននេះ|ពាក្យសម្ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។\nយកល្អអ្នកគួរតែកត់ឈ្មោះចូលរួចជ្រើសរើសពាក្យសម្ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ \nឬប្រសិនបើអ្នកនឹកឃើញពាក្យសម្ងាត់ដើមរបស់អ្នក ហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ\nបំភ្លេចអំពីសារមួយនេះ ហើយបន្តប្រើប្រាស់ពាក្យសម្ងាត់ចាស់របស់អ្នកទៅបានហើយ។",
        "passwordreset-emailtext-user": "អ្នកប្រើប្រាស់ $1 នៅក្នុង {{SITENAME}} បានស្នើសុំស្ដារពាក្យសម្ងាត់របស់អ្នកនៅក្នុង {{SITENAME}} ($4)។\n {{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះមានជាប់ទាក់ទិននឹងអាសយដ្ឋានអ៊ីមែលនេះ៖\n\n$2\n\n{{PLURAL:$3|ពាក្យសម្ងាត់បណ្ដោះអាសន្ននេះ|ពាក្យសម្ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។\nយកល្អអ្នកគួរតែកត់ឈ្មោះចូលរួចជ្រើសរើសពាក្យសម្ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ \nឬប្រសិនបើអ្នកនឹកឃើញពាក្យសម្ងាត់ដើមរបស់អ្នក ហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ\nបំភ្លេចអំពីសារមួយនេះ ហើយបន្តប្រើប្រាស់ពាក្យសម្ងាត់ចាស់របស់អ្នកទៅបានហើយ។",
        "passwordreset-emailelement": "អត្តនាម៖ \n$1\n\nពាក្យសម្ងាត់បណ្ដោះអាសន្ន៖ \n$2",
-       "passwordreset-emailsent": "á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9fá\9f\92á\9e\8aá\9e¶á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\98á\9e½á\9e\99á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\89á\9e¾á\9e\91á\9f\85á\9e á\9e¾á\9e\99។",
+       "passwordreset-emailsent": "á\9e\94á\9e¾á\9e\9fá\9e·á\9e\93á\9e\87á\9e¶á\9e\93á\9f\81á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\8aá\9f\82á\9e\9bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\85á\9e»á\9f\87á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\82á\9e\8eá\9e\93á\9e¸á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80 á\9e\93á\9f\84á\9f\87á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\9fá\9f\92á\9e\8aá\9e¶á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\98á\9e½á\9e\99á\9e\93á\9e¹á\9e\84á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\89á\9e¾á\9e\91á\9f\85។",
        "passwordreset-emailsent-capture": "អ៊ីមែលស្ដារពាក្យសម្ងាត់មួយដូចបង្ហាញខាងក្រោមត្រូវបានផ្ញើទៅហើយ។",
        "passwordreset-emailerror-capture": "អ៊ីមែលស្ដារពាក្យសម្ងាត់មួយដូចបង្ហាញខាងក្រោមត្រូវបានបង្កើតហើយ ប៉ុន្តែការផ្ញើទៅកាន់ {{GENDER:$2|អ្នកប្រើប្រាស់}}មិនបានសំរេចទេ៖ $1",
-       "changeemail": "ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែល",
-       "changeemail-header": "á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9fá\9f\86á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\82á\9e\8eá\9e\93á\9e¸á\9e\93á\9f\81á\9f\87",
+       "changeemail": "á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e¬á\9e\9bá\9e»á\9e\94á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9b",
+       "changeemail-header": "á\9e\9fá\9e¼á\9e\98á\9e\94á\9f\86á\9e\96á\9f\81á\9e\89á\9e\9fá\9f\86á\9e\8eá\9e»á\9f\86á\9e\94á\9f\82á\9e\94á\9e\94á\9e\91á\9e\93á\9f\81á\9f\87á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9f\94 á\9e\94á\9e¾á\9e\9fá\9e·á\9e\93á\9e\87á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80á\9e\85á\9e\84á\9f\8bá\9e\9bá\9e»á\9e\94á\9e\80á\9e¶á\9e\9aá\9e\8fá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\96á\9e¸á\9e\82á\9e\8eá\9e\93á\9e¸á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80 á\9e\9fá\9e¼á\9e\98á\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\94á\9f\92á\9e\9aá\9e¡á\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e\90á\9f\92á\9e\98á\9e¸á\9e¢á\9f\84á\9e\99á\9e\93á\9f\85á\9e\91á\9f\86á\9e\93á\9f\81á\9e\9aá\9e\96á\9f\81á\9e\9bá\9e\9fá\9e\98á\9f\92á\9e\9aá\9f\81á\9e\85á\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\9fá\9f\86á\9e\8eá\9e»á\9f\86á\9e\94á\9f\82á\9e\94á\9e\94á\9e\91á\9f\94",
        "changeemail-no-info": "អ្នក​ចាំបាច់​ត្រូវតែ​កត់ឈ្មោះចូល ដើម្បី​ចូលទៅកាន់​ទំព័រ​នេះ​ដោយផ្ទាល់​។",
        "changeemail-oldemail": "អាសយដ្ឋានអ៊ីមែលបច្ចុប្បន្ន៖",
        "changeemail-newemail": "អាសយដ្ឋានអ៊ីមែលថ្មី៖",
        "upload-form-label-infoform-description": "ការ​ពិពណ៌នា",
        "upload-form-label-usage-title": "បម្រើបម្រាស់",
        "upload-form-label-usage-filename": "ឈ្មោះឯកសារ",
+       "foreign-structured-upload-form-label-own-work": "នេះជាការងារផ្ទាល់ខ្លួនរបស់ខ្ញុំ",
+       "foreign-structured-upload-form-label-infoform-categories": "ចំណាត់ថ្នាក់ក្រុម",
+       "foreign-structured-upload-form-label-infoform-date": "កាលបរិច្ឆេទ",
        "backend-fail-notexists": "គ្មានឯកសារ \"$1\" ទេ។",
        "backend-fail-notsame": "ឯកសារដែលមិនដូចគ្នាបេះបិទមួយមានរួចហើយនៅ \"$1\"។",
        "backend-fail-delete": "មិនអាចលុបឯកសារ \"$1\" បានទេ។",
        "cant-move-to-user-page": "អ្នកគ្មានការអនុញ្ញាតអោយប្ដូរទីតាំងទំព័រមួយទៅកាន់ទំព័រអ្នកប្រើប្រាស់មួយទេ (លើកលែងតែទៅកាន់ទំព័ររងមួយ)។",
        "cant-move-category-page": "អ្នកមិនត្រូវបាន​អនុញ្ញាត​ឱ្យ​ប្តូរទីតាំងទំព័រចំណាត់ថ្នាក់ក្រុម​ទេ។",
        "cant-move-to-category-page": "អ្នកគ្មានការអនុញ្ញាតអោយប្ដូរទីតាំងទំព័រមួយទៅកាន់ទំព័រចំណាត់ថ្នាក់ក្រុមមួយទេ។",
-       "newtitle": "á\9e\91á\9f\85á\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84á\9e\90á\9f\92á\9e\98á\9e¸á\9f\96",
+       "newtitle": "ចំណងជើងថ្មី៖",
        "move-watch": "តាមដានទំព័រនេះ",
        "movepagebtn": "ប្ដូរទីតាំង",
        "pagemovedsub": "ប្ដូរទីតាំងដោយជោគជ័យ",
        "tooltip-ca-nstab-main": "មើលទំព័រមាតិកា",
        "tooltip-ca-nstab-user": "មើលទំព័រអ្នកប្រើប្រាស់",
        "tooltip-ca-nstab-media": "មើលទំព័រមេឌា",
-       "tooltip-ca-nstab-special": "á\9e\93á\9f\81á\9f\87á\9e\87á\9e¶á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\9fá\9f\81á\9e\9fâ\80\8bá\9f\94 á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87បានទេ។",
+       "tooltip-ca-nstab-special": "á\9e\93á\9f\81á\9f\87á\9e\87á\9e¶á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\9fá\9f\81á\9e\9fâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82បានទេ។",
        "tooltip-ca-nstab-project": "មើលទំព័រគម្រោង",
        "tooltip-ca-nstab-image": "មើលទំព័រ​ឯកសារ",
        "tooltip-ca-nstab-mediawiki": "មើលសាររបស់ប្រព័ន្ធ",
index e5f6352..f927cfc 100644 (file)
        "site-atom-feed": "$1 ऍटम रसद (Atom Feed)",
        "page-rss-feed": "\"$1\" आर.एस.एस.रसद (RSS Feed)",
        "page-atom-feed": "\"$1\" ऍटम रसद (Atom Feed)",
-       "feed-atom": "ॲटम",
+       "feed-atom": "à¤\85à¥\85टम",
        "feed-rss": "आर.एस.एस.",
        "red-link-title": "$1 (पान अस्तित्वात नाही)",
        "sort-descending": "उतरत्या क्रमाने लावा",
        "resettokens-no-tokens": "पुनर्स्थापित करण्यासाठी कोणतीही ओळखचिन्हे नाहीत.",
        "resettokens-tokens": "ओळखचिन्हे:",
        "resettokens-token-label": "$1 (सद्य मुल्य: $2)",
-       "resettokens-watchlist-token": "[[Special:Watchlist|à¤\86पलà¥\8dया à¤¨à¤¿à¤°à¥\80à¤\95à¥\8dषणसà¥\82à¤\9aà¥\80तà¥\80ल à¤ªà¤¾à¤¨à¤¾à¤\82मधà¥\80ल à¤¬à¤¦à¤²à¤¾à¤\9aा]] à¤µà¥\87ब à¤°à¤¸à¤¦ à¤¬à¤¿à¤²à¥\8dला (ॲटम/आरएसएस)",
+       "resettokens-watchlist-token": "[[Special:Watchlist|à¤\86पलà¥\8dया à¤¨à¤¿à¤°à¥\80à¤\95à¥\8dषणसà¥\82à¤\9aà¥\80तà¥\80ल à¤ªà¤¾à¤¨à¤¾à¤\82मधà¥\80ल à¤¬à¤¦à¤²à¤¾à¤\9aा]] à¤µà¥\87ब à¤°à¤¸à¤¦ à¤¬à¤¿à¤²à¥\8dला (à¤\85à¥\85टम/आरएसएस)",
        "resettokens-done": "ओळखचिन्हे पुनर्स्थापन.",
        "resettokens-resetbutton": "निवडलेली ओळखचिन्हे पुनर्स्थापित करा",
        "bold_sample": "ठळक मजकूर",
        "accmailtitle": "परवलीचा शब्द पाठविण्यात आलेला आहे.",
        "accmailtext": "[[User talk:$1|$1]] यांसाठी अनियतक्रमाने निर्मित केलेला परवलीचा शब्द $2 यांना पाठवण्यात आला आहे.\n\nया नवीन खात्यासाठीचा परवलीचा शब्द,सनोंद-प्रवेश घेतल्यावर [[Special:ChangePassword|परवलीचा शब्द बदला]] येथे बदलता येईल.",
        "newarticle": "(नवीन लेख)",
-       "newarticletext": "à¤\86पण à¤¸à¤§à¥\8dया à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¸à¤²à¥\87लà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\8dया à¤¦à¥\81वà¥\8dयाà¤\9aा à¤®à¤¾à¤\97à¥\8bवा à¤\98à¥\87त à¤\86ला à¤\86हात.\nहà¥\87 à¤ªà¤¾à¤¨ à¤¤à¤¯à¤¾à¤° à¤\95रणà¥\8dयासाठà¥\80,खालील पेटीत टंकन करणे सुरु करा(अधिक माहितीसाठी [$1 साहाय्य पान] बघा).\n\nजर आपण येथे चुकून आला असाल तर ब्राउझरच्या  <strong>परत</strong>(बॅक) कळीवर टिचकी द्या.",
+       "newarticletext": "à¤\86पण à¤¸à¤§à¥\8dया à¤\85सà¥\8dतितà¥\8dतà¥\8dवात à¤¨à¤¸à¤²à¥\87लà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\8dया à¤¦à¥\81वà¥\8dयाà¤\9aा à¤®à¤¾à¤\97à¥\8bवा à¤\98à¥\87त à¤\86ला à¤\86हात.\nहà¥\87 à¤ªà¤¾à¤¨ à¤¨à¤µà¥\8dयानà¥\87 à¤¤à¤¯à¤¾à¤° à¤\95रणà¥\8dयासाठà¥\80 खालील पेटीत टंकन करणे सुरु करा(अधिक माहितीसाठी [$1 साहाय्य पान] बघा).\n\nजर आपण येथे चुकून आला असाल तर ब्राउझरच्या  <strong>परत</strong>(बॅक) कळीवर टिचकी द्या.",
        "anontalkpagetext": "---- ''हे चर्चापान अशा अज्ञात सदस्यासाठी आहे, ज्यांनी खाते तयार केलेले नाही किंवा त्याचा वापर करत नाहीत. त्यांच्या ओळखीसाठी आम्ही आंतरजाल अंकपत्ता वापरतो आहोत. असा अंकपत्ता बऱ्याच लोकांचा एकच असू शकतो. जर आपण अज्ञात सदस्य असाल आणि आपल्याला काही अप्रासंगिक संदेश मिळाला असेल तर कृपया [[Special:UserLogin| खाते तयार करा]] किंवा [[Special:UserLogin/signup|सनोंद-प्रवेश करा]] ज्यामुळे, पुढे असे गैरसमज होणार नाहीत.''",
        "noarticletext": "या लेखात सध्या काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये या [[Special:Search/{{PAGENAME}}| मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} इतर नोंदी शोधा],\nकिंवा हा लेख [{{fullurl:{{FULLPAGENAME}}|action=edit}} लिहू शकता]</span>.",
        "noarticletext-nopermission": "सध्या या लेखात  काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये [[Special:Search/{{PAGENAME}}| या मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAME}}}}आपण या लेखाच्या इतर नोंदी शोधा]</span>,परंतु, आपणास हा लेख लिहीण्याची परवानगी देण्यात येउ शकत नाही.",
        "showingresultsinrange": "खाली #<strong>$2</strong> ते #<strong>$3</strong> पर्यंतच्या कक्षेतील {{PLURAL:$1|<strong>१</strong> निकाल दाखविला आहे|<strong>$1</strong> निकाल दाखविले आहेत}}.",
        "search-showingresults": "{{PLURAL:$4|Result <strong>$1</strong> of <strong>$3</strong>|निकाल <strong>$3</strong> चे<strong>$1 - $2</strong>}}",
        "search-nonefound": "दिलेल्या पृच्छेशी जुळणारे निकाल नाहीत.",
+       "search-nonefound-thiswiki": "या संकेतस्थळावर,दिलेल्या पृच्छेशी जुळणारे निकाल मिळाले नाही.",
        "powersearch-legend": "प्रगत शोध",
        "powersearch-ns": "नामविश्वांमध्ये शोधा:",
        "powersearch-togglelabel": "तपासा:",
index 8847169..1109eef 100644 (file)
@@ -27,6 +27,7 @@
        "tog-hideminor": "Sembunyikan suntingan kecil daripada perubahan terkini",
        "tog-hidepatrolled": "Sembunyikan suntingan yang telah dironda daripada perubahan terkini",
        "tog-newpageshidepatrolled": "Sorokkan laman yang telah dironda daripada senarai laman baru",
+       "tog-hidecategorization": "Sorokkan pengkategorian laman",
        "tog-extendwatchlist": "Kembangkan senarai pantau untuk memaparkan semua perubahan, bukan hanya yang terkini",
        "tog-usenewrc": "Kumpulkan perubahan mengikut laman dalam perubahan terkini dan senarai pantau",
        "tog-numberheadings": "Nomborkan tajuk secara automatik",
@@ -56,6 +57,7 @@
        "tog-watchlisthideliu": "Sembunyikan suntingan oleh pengguna yang telah log masuk daripada senarai pantau",
        "tog-watchlisthideanons": "Sembunyikan suntingan oleh pengguna tanpa nama daripada senarai pantau",
        "tog-watchlisthidepatrolled": "Sembunyikan suntingan yang telah dironda daripada senarai pantau",
+       "tog-watchlisthidecategorization": "Sorokkan pengkategorian laman",
        "tog-ccmeonemails": "Kirimkan saya salinan e-mel yang saya hantar kepada pengguna lain",
        "tog-diffonly": "Jangan tunjukkan kandungan laman di bawah perbezaan",
        "tog-showhiddencats": "Tunjukkan kategori tersembunyi",
        "nstab-template": "Templat",
        "nstab-help": "Laman bantuan",
        "nstab-category": "Kategori",
+       "mainpage-nstab": "Laman utama",
        "nosuchaction": "Tindakan tidak dikenali",
        "nosuchactiontext": "Tindakan yang dinyatakan dalam URL ini tidak sah. Anda mungkin telah menaip URL yang salah atau mengikuti pautan yang tidak sah. Ini juga mungkin bererti terdapat pepijat dalam perisian yang digunakan oleh {{SITENAME}}.",
        "nosuchspecialpage": "Laman khas tidak wujud",
        "createaccountreason": "Sebab:",
        "createacct-reason": "Sebab",
        "createacct-reason-ph": "Mengapa anda membuka satu lagi akaun",
-       "createacct-captcha": "Pemeriksaan sekuriti",
-       "createacct-imgcaptcha-ph": "Isikan teks yang anda lihat di atas",
        "createacct-submit": "Wujudkan akaun anda",
        "createacct-another-submit": "Buka akaun baru",
        "createacct-benefit-heading": "{{SITENAME}} dijayakan oleh orang ramai seperti anda.",
        "prefs-watchlist-token": "Token senarai pantau:",
        "prefs-misc": "Pelbagai",
        "prefs-resetpass": "Tukar kata laluan",
-       "prefs-changeemail": "Tukar E-mel",
+       "prefs-changeemail": "Tukar atau padamkan alamat e-mel",
        "prefs-setemail": "Tetapkan alamat e-mel",
        "prefs-email": "Pilihan e-mel",
        "prefs-rendering": "Penampilan",
        "columns": "Lajur:",
        "searchresultshead": "Cari",
        "stub-threshold": "Ambang bagi pemformatan <a href=\"#\" class=\"stub\">pautan ke rencana ringkas</a> (bait):",
+       "stub-threshold-sample-link": "contoh",
        "stub-threshold-disabled": "Dimatikan",
        "recentchangesdays": "Bilangan hari dalam perubahan terkini:",
        "recentchangesdays-max": "(had $1 hari)",
        "rcshowhidemine": "$1 suntingan saya",
        "rcshowhidemine-show": "Paparkan",
        "rcshowhidemine-hide": "Sorokkan",
+       "rcshowhidecategorization-show": "Paparkan",
+       "rcshowhidecategorization-hide": "Sorokkan",
        "rclinks": "Paparkan $1 perubahan terakhir sejak $2 hari yang lalu<br />$3",
        "diff": "beza",
        "hist": "sej",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 pemantau]",
        "rc_categories": "Hadkan kepada kategori (asingkan dengan \"|\")",
-       "rc_categories_any": "Semua",
+       "rc_categories_any": "Mana-mana yang terpilih",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 bait selepas perubahan",
        "newsectionsummary": "/* $1 */ bahagian baru",
        "recentchangeslinked-summary": "Laman khas ini menyenaraikan perubahan terkini bagi laman-laman yang dipaut. Laman-laman yang terdapat dalam senarai pantau anda ditandakan dengan '''teks tebal'''.",
        "recentchangeslinked-page": "Nama laman:",
        "recentchangeslinked-to": "Paparkan perubahan pada laman yang mengandungi pautan ke laman yang diberikan",
+       "recentchanges-page-added-to-category": "[[:$1]] ditambahkan kepada kategori",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] dan {{PLURAL:$2|satu|$2}} lagi halaman ditambahkan kepada kategori",
+       "recentchanges-page-removed-from-category": "[[:$1]] digugurkan dari kategori",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] dan {{PLURAL:$2|satu|$2}} lagi halaman digugurkan dari kategori",
+       "autochange-username": "Perubahan automatik MediaWiki",
        "upload": "Muat naik fail",
        "uploadbtn": "Muat naik fail",
        "reuploaddesc": "Kembali ke borang muat naik",
        "upload-too-many-redirects": "URL ini mengandungi terlalu banyak lencongan",
        "upload-http-error": "Berlaku ralat HTTP: $1",
        "upload-copy-upload-invalid-domain": "Muat naik salin tidak terdapat dari domain ini.",
+       "foreign-structured-upload-form-label-own-work": "Ini ialah karya saya sendiri",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategori",
+       "foreign-structured-upload-form-label-infoform-date": "Tarikh",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Anda mungkin juga mahu mencuba [[Special:Upload|laman muat naik yang asal]].",
        "backend-fail-stream": "Fail $1 tidak dapat distrimkan.",
        "backend-fail-backup": "Fail $1 tidak dapat disandarkan.",
        "backend-fail-notexists": "Fail $1 tidak wujud.",
        "cant-move-to-user-page": "Anda tidak mempunyai keizinan untuk memindahkan sesebuah laman ke mana-mana laman pengguna (kecuali sebagai sublamannya sahaja).",
        "cant-move-category-page": "Anda tidak mempunyai kebenaran untuk memindah laman-laman kategori.",
        "cant-move-to-category-page": "Anda tidak mempunyai kebenaran untuk memindah sebuah laman ke sebuah laman kategori.",
-       "newtitle": "Ke tajuk baru:",
+       "newtitle": "Tajuk baru:",
        "move-watch": "Pantau laman ini",
        "movepagebtn": "Pindahkan laman",
        "pagemovedsub": "Pemindahan berjaya",
        "tooltip-ca-nstab-main": "Lihat laman kandungan",
        "tooltip-ca-nstab-user": "Lihat laman pengguna",
        "tooltip-ca-nstab-media": "Lihat laman media",
-       "tooltip-ca-nstab-special": "Ini adalah sebuah laman khas, anda tidak boleh menyunting laman ini secara terus.",
+       "tooltip-ca-nstab-special": "Ini adalah laman khas yang tidak boleh disunting.",
        "tooltip-ca-nstab-project": "Lihat laman projek",
        "tooltip-ca-nstab-image": "Lihat laman imej",
        "tooltip-ca-nstab-mediawiki": "Lihat pesanan sistem",
        "spam_reverting": "Membalikkan kepada versi terakhir yang tidak mengandungi pautan ke $1",
        "spam_blanking": "Mengosongkan semua semakan yang mengandungi pautan ke $1",
        "spam_deleting": "Menghapuskan semua semakan yang mengandungi pautan ke $1",
-       "simpleantispam-label": "Pemeriksaan anti-spam.\n'''JANGAN''' isi ruangan ini!",
+       "simpleantispam-label": "Pemeriksaan anti-spam.\n<strong>Jangan</strong> isi ruangan ini!",
        "pageinfo-title": "Maklumat untuk \"$1\"",
        "pageinfo-not-current": "Maaf, maklumat ini tidak dapat disediakan untuk semakan lama.",
        "pageinfo-header-basic": "Maklumat asas",
        "pageinfo-robot-index": "Dibenarkan",
        "pageinfo-robot-noindex": "Tidak dibenarkan",
        "pageinfo-watchers": "Bilangan pemantau halaman",
+       "pageinfo-visiting-watchers": "Bilangan penonton laman yang melawat suntingan terkini",
        "pageinfo-few-watchers": "Kurang daripada $1 orang pemantau",
        "pageinfo-redirects-name": "Jumlah lencongan ke laman ini",
        "pageinfo-subpages-name": "Subhalaman untuk halaman ini",
        "version-libraries": "Perpustakaan terpasang",
        "version-libraries-library": "Perpustakaan",
        "version-libraries-version": "Versi",
+       "version-libraries-license": "Lesen",
+       "version-libraries-description": "Keterangan",
+       "version-libraries-authors": "Pengarang",
        "redirect": "Lencongkan mengikut ID fail, pengguna, halaman atau semakan",
        "redirect-legend": "Lencongkan ke fail atau halaman",
        "redirect-summary": "Halaman khas ini melencong kepada fail (dengan nama fail), halaman (dengan ID semakan atau ID halaman) atau halaman pengguna (dengan ID pengguna berangka). Penggunaan: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], atau [[{{#Special:Redirect}}/user/101]].",
index 8df9450..67d007d 100644 (file)
@@ -26,7 +26,7 @@
        "tog-previewonfirst": "Ozuta ezikačondu kerras, ku edituičendu zavoditah",
        "tog-enotifwatchlistpages": "Työnnä minule sähköpoštu minun valvondulistal olijoin sivuloin kohenduksis",
        "tog-enotifusertalkpages": "Työnnä minule sähköpoštu minun paginsivun muutoksis",
-       "tog-enotifminoredits": "Ilmoita minule pienisgi korjavuksis sähköpoštale",
+       "tog-enotifminoredits": "Ilmoita minule pienisgi kohenduksis sähköpoštale",
        "tog-enotifrevealaddr": "Näytä minun sähköpoštuadressii muile lähetettylöis ilmoituksis",
        "tog-shownumberswatching": "Ozuta tädä sivuu tarkailevien käyttäjien miäriä",
        "tog-oldsig": "Nygöine allekirjutus:",
        "and": "&#32;da",
        "qbfind": "Eči",
        "qbbrowse": "Livua",
-       "qbedit": "Korjata",
+       "qbedit": "Kohendele",
        "qbpageoptions": "Tämä sivu",
        "qbmyoptions": "Minun sivut",
        "faq": "PKK",
        "view": "Kačo",
        "view-foreign": "Kačo saital $1",
        "edit": "Kohendele",
-       "edit-local": "Edituiče paikallistu kuvavustu",
+       "edit-local": "Kohendele paikallistu kuvavustu",
        "create": "Luaji",
        "create-local": "Ližiä paikalline kuvavus",
        "editthispage": "Kohendele tädä sivuu",
        "currentevents-url": "Project:Aijankohtazet tapahtumat",
        "disclaimers": "Kieldävymine vastuos",
        "disclaimerpage": "Project:Vastuos kieldävymine",
-       "edithelp": "Abu korjuamizeh",
+       "edithelp": "Abu kohendelemizeh",
        "helppage-top-gethelp": "Kyzy abuu",
        "mainpage": "Piäsivu",
        "mainpage-description": "Piäsivu",
        "userpage-userdoesnotexist-view": "Käyttäitunnustu ”$1” ei ole registruittu.",
        "updated": "(Päivitetty)",
        "continue-editing": "Mene edituičendualovehele",
-       "editing": "Edituijah sivuu $1",
+       "editing": "Kohendellah sivuu $1",
        "creating": "Luajitah sivuu \"$1\"",
-       "editingsection": "Korjuandu $1 (alalugu)",
+       "editingsection": "Kohendellah $1 (alalugu)",
        "editingcomment": "Edituijah $1 (uuzi sektsii)",
        "yourtext": "Sinun tekstu",
        "yourdiff": "Erot",
        "powersearch-toggleall": "Kai",
        "powersearch-togglenone": "Nimidä",
        "mypreferences": "Azetukset",
-       "prefs-edits": "Edituičendoi kaikkiedah:",
+       "prefs-edits": "Kohenduksii kaikkiedah:",
        "prefs-skin": "Kettu",
        "prefs-user-pages": "Käyttäisivut",
        "prefs-watchlist": "Valvondulistu",
        "group-user": "Käyttäjät",
        "group-all": "(kai)",
        "right-read": "Lugie sivuloi",
-       "right-edit": "Edituija sivuloi",
+       "right-edit": "Kohendella sivuloi",
        "right-createpage": "Luadie sivuloi (kudamat ei olla paginsivuloi)",
        "right-createtalk": "Luadie paginsivuloi",
        "right-createaccount": "Luadie uuzii käyttäitunnuksii",
        "recentchanges": "Uvvet kohendukset",
        "recentchanges-legend": "Tuorehien muutoksien azetukset",
        "recentchanges-summary": "Jällitä kaikkii jälgimäzet muutokset wikih täl sivul.",
-       "recentchanges-label-newpage": "Tämä korjavus on johtanuh uvven sivun luadimizeh",
+       "recentchanges-label-newpage": "Tämä kohendus on johtanuh uvven sivun luadimizeh",
        "recentchanges-label-minor": "Tämä on pieni kohendus",
-       "recentchanges-label-bot": "Tämän muutoksen on luadinuh bot",
+       "recentchanges-label-bot": "Tämän kohenduksen on luadinuh bot",
        "recentchanges-label-unpatrolled": "Tädä korjuandua vie ei ole tarkistettu",
        "recentchanges-label-plusminus": "Sivu on kazvanuh [] baital",
        "recentchanges-legend-heading": "'''Legendu:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kačo sežo [[Special:NewPages|uuzien sivuloin listu]])",
        "rclistfrom": "Ozuta jälgimäzet muutokset algajen $2, $3",
-       "rcshowhideminor": "$1 pienet muutokset",
+       "rcshowhideminor": "$1 pienet kohendukset",
        "rcshowhideminor-show": "Ozuta",
        "rcshowhideminor-hide": "Peitä",
        "rcshowhidebots": "$1 botat",
        "tooltip-t-permalink": "Pyzyi linki tämän sivun versieh",
        "tooltip-ca-nstab-main": "Kačo piäsivun sizäldö",
        "tooltip-ca-nstab-user": "Ozuta käyttäisivu",
-       "tooltip-ca-nstab-special": "Tämä on erikoine sivu, sidä ei voi korjata",
+       "tooltip-ca-nstab-special": "Tämä on erikoine sivu, sidä ei voi kohendella",
        "tooltip-ca-nstab-project": "Ozuta projektusivu",
        "tooltip-ca-nstab-image": "Kačo failan sivu",
        "tooltip-ca-nstab-template": "Ozuta šablon",
index 183c3cb..9108a2c 100644 (file)
        "eauthentsent": "На указанный адрес электронной почты отправлено письмо. \nЧтобы получать письма в дальнейшем, следуйте изложенным там инструкциям для подтверждения, что этот адрес действительно принадлежит вам.",
        "throttled-mailpassword": "Функция напоминания пароля уже использовалась в течение {{PLURAL:$1|1=последнего часа|последних $1 часов}}.\nДля предотвращения злоупотреблений, разрешено запрашивать не более одного напоминания {{PLURAL:$1|за $1 час|за $1 часов|за $1 часа|1=в час}}.",
        "mailerror": "Ошибка при отправке почты: $1",
-       "acct_creation_throttle_hit": "За сутки с вашего IP-адреса {{PLURAL:$1|была создана $1 учётная запись участника|было создано $1 учётных записей участников|1=уже была создана учётная запись участника}}, что является пределом для данного отрезка времени.\nТаким образом, пользователи, обладающие данным IP-адресом, в данный момент больше не могут создавать новых учётных записей.",
+       "acct_creation_throttle_hit": "За сутки с вашего IP-адреса {{PLURAL:$1|была создана $1 учётная запись|было создано $1 учётных записей|были созданы $1 учётных записи|1=уже была создана учётная запись}} — это предельное количество для данного отрезка времени.\nВ результате, пользователи с этим IP-адресом в данный момент больше не могут создавать новых учётных записей.",
        "emailauthenticated": "Ваш адрес электронной почты подтверждён $2 в $3.",
        "emailnotauthenticated": "Ваш адрес электронной почты ещё не был подтверждён.\nПисьма не будут отправляться ни для одной из следующий функций.",
        "noemailprefs": "Адрес электронной почты не был указан, функции вики-движка по работе с эл. почтой отключены.",
        "resetpass-abort-generic": "Изменение пароля было прервано расширением.",
        "resetpass-expired": "Срок действия вашего пароля истёк. Пожалуйста, установите новый пароль для входа в систему.",
        "resetpass-expired-soft": "Срок действия вашего пароля истёк, и теперь он должен быть изменён. Пожалуйста, выберите новый пароль или нажмите «{{int:resetpass-submit-cancel}}», чтобы изменить его позже.",
-       "resetpass-validity-soft": "Ð\92аÑ\88 Ð¿Ð°Ñ\80олÑ\8c Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð½ÐµÐºÐ¾Ñ\80Ñ\80екÑ\82нÑ\8bм: $1\n\nПожалуйста, выберите новый пароль или нажмите «{{int:resetpass-submit-cancel}}», чтобы сбросить его позже.",
+       "resetpass-validity-soft": "Ð\97адан Ð½ÐµÐºÐ¾Ñ\80Ñ\80екÑ\82нÑ\8bй Ð¿Ð°Ñ\80олÑ\8c: $1\n\nПожалуйста, выберите новый пароль или нажмите «{{int:resetpass-submit-cancel}}», чтобы сбросить его позже.",
        "passwordreset": "Сброс пароля",
        "passwordreset-text-one": "Заполните эту форму, чтобы сбросить свой пароль.",
        "passwordreset-text-many": "{{PLURAL:$1|Заполните одно из полей для получения временного пароля по электронной почте.}}",
        "permissionserrors": "Ошибка прав доступа",
        "permissionserrorstext": "У вас нет прав на выполнение этой операции по {{PLURAL:$1|1=следующей причине|следующим причинам}}:",
        "permissionserrorstext-withaction": "У вас нет прав на $2 по {{PLURAL:$1|1=следующей причине|следующим причинам}}:",
-       "contentmodelediterror": "Ð\92Ñ\8b Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c Ñ\8dÑ\82Ñ\83 Ð²ÐµÑ\80Ñ\81иÑ\8e, Ð¿Ð¾Ñ\81колÑ\8cкÑ\83 ÐµÑ\91 Ð¼Ð¾Ð´ÐµÐ»Ñ\8cÑ\8e Ñ\81одеÑ\80жимого Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f <code>$1</code>, Ð° Ñ\82екÑ\83Ñ\89аÑ\8f Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Ñ\81одеÑ\80жимого страницы — <code>$2</code>.",
+       "contentmodelediterror": "Ð\92Ñ\8b Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c Ñ\8dÑ\82Ñ\83 Ð²ÐµÑ\80Ñ\81иÑ\8e, Ð¿Ð¾Ñ\81колÑ\8cкÑ\83 Ð¼Ð¾Ð´ÐµÐ»Ñ\8c ÐµÑ\91 Ñ\81одеÑ\80жаниÑ\8f â\80\94 <code>$1</code>, Ð° Ñ\82екÑ\83Ñ\89аÑ\8f Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Ñ\81одеÑ\80жаниÑ\8f страницы — <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Внимание. Вы пытаетесь воссоздать страницу, которая ранее удалялась.'''\n\nПроверьте, действительно ли вам нужно воссоздавать эту страницу.\nНиже приведены журналы удалений и переименований этой страницы.",
        "moveddeleted-notice": "Эта страница была удалена.\nДля справки ниже показаны соответствующие записи из журналов удалений и переименований.",
        "moveddeleted-notice-recent": "К сожалению, эта страница была недавно удалена (в течение последних 24 часов).\nНиже для справки приведены журналы удаления и перемещения для этой страницы.",
index c65111a..aefe408 100644 (file)
        "htmlform-cloner-create": "Өссө эп",
        "htmlform-cloner-delete": "Сот",
        "htmlform-cloner-required": "Саатар биирин толоруохтаах эбиккин.",
+       "htmlform-title-badnamespace": "[[:$1]] бу аат далыгар киирбэт эбит «{{ns:$2}}».",
        "htmlform-title-not-creatable": "«$1» оҥоһуллар сирэй аата буолбатах",
        "htmlform-title-not-exists": "[[:$1]] суох.",
        "htmlform-user-not-exists": "<strong>$1</strong> суох.",
+       "htmlform-user-not-valid": "<strong>$1</strong> — маннык аат сатаммат.",
        "sqlite-has-fts": "$1 толору тиэкистээх көрдөөһүнү өйүүр",
        "sqlite-no-fts": "$1 толору тиэкистээх көрдөөһүнү өйөөбөт",
        "logentry-delete-delete": "$3 сирэйи $1 соппут",
        "revdelete-uname-unhid": "кыттааччы аата көстөр буолбут",
        "revdelete-restricted": "хааччахтааһын администраатардарга сыһыаннаах",
        "revdelete-unrestricted": "хааччахтааһын админстраатардартан уһулунна",
+       "logentry-block-block": "$1 маннык болдьоххо $5 $6 {{GENDER:$4|$3}} {{GENDER:$2|хааччахтаабыт}}",
        "logentry-block-unblock": "$1 {{GENDER:$2|хааччаҕын суох гыммыт}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 хааччах болдьоҕун {{GENDER:$4|$3}} манныкка $5 $6 {{GENDER:$2|уларыппыт}}",
        "logentry-suppress-block": "$1 маннык болдьоххо $5 $6 {{GENDER:$4|$3}} {{GENDER:$2|хааччаҕын суох гыммыт}}",
        "logentry-suppress-reblock": "$1 хааччах болдьоҕун {{GENDER:$4|$3}} манныкка $5 $6 {{GENDER:$2|уларыппыт}}",
+       "logentry-import-upload": "$1 {{GENDER:$2|киллэрбит}} $3 билэни хачайдыыр ньыманнан",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|киллэрбит}} $3 атын биикиттэн",
+       "logentry-merge-merge": "$1 {{GENDER:$2|холбообут}} мантан $3 манна $4 ($5 диэри торумнара)",
        "logentry-move-move": "$1 $3 сирэй аатын маннык $4 уларыппыт",
        "logentry-move-move-noredirect": "$3 сирэй аатын $1 маннык $4 уларыппыт, утаарыы-сирэй хаалларбатах",
        "logentry-move-move_redir": "$3 сирэйи $1 диэн кыттааччы манныкка $4  уларыппыт (утаарыы үрдүнэн)",
        "logentry-newusers-create2": "$3 кыттааччы аатын $1 бэлиэтээтэ",
        "logentry-newusers-byemail": "$3 бэлиэ-ааты $1 оҥорбут, киирии тыла электрон почтанан ыытыллыбыт",
        "logentry-newusers-autocreate": "$1 бэлиэ-аат аптамаатынан бэлиэтэннэ",
+       "logentry-protect-move_prot": "$1 көмүскэл нарылааһынан мантан $4 манна $3 {{GENDER:$2|көһөрбүт}}",
+       "logentry-protect-unprotect": "$1 мантан $3 көмүскэли {{GENDER:$2|суох гыммыт}}",
        "logentry-protect-protect": "$1 {{GENDER:$2|көмүскээтэ}} $3 $4",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|көмүскээбит}} $3 $4 [каскаадынан]",
        "logentry-protect-modify": "$1 {{GENDER:$2|уларыппыт}}: $3 $4 көмүскэлин таһымын",
index 76fbc93..ad674a7 100644 (file)
        "noname": "توهان جو ڄاڻايل يُوزرنانءُ ناقابل ڪار آهي.",
        "loginsuccesstitle": "لاگ اِن ڪامياب",
        "loginsuccess": "'''هاڻي توهان {{SITENAME}} تي بطور \"$1\" لاگ اِن ٿيل آهيو.'''",
-       "nosuchuser": "\"$1\" نالي سان ڪو بہ يوزر نہ آهي. يُوزرنانءُ، ننڍن وڏن اکرن ۾ امتياز ڪري ٿو. هِجي چڪاسيو، يا نئون کاتو کوليو.",
+       "nosuchuser": "\"$1\" نالي سان ڪو بہ يوزر نہ آهي.  \"$1\".\n ننڍن وڏن اکرن ۾ امتياز ڪرڻ لازمي آهي. \nهِجي چڪاسيو،يا [[Special:UserLogin/signup|نئون کاتو تخليق ڪريو]]",
        "nosuchusershort": "\"$1\" نالي ڪو بہ يُوزر ناهي.\nهِجي جي پڪ ڪندا.",
        "nouserspecified": "توهان کي ڪو يوزرنانءُ ڄاڻائڻو پوندو.",
        "login-userblocked": "هيءُ يُوزر بندشيل آهي. لاگ اِن جي اجازت نہ ٿي ڏجي.",
        "passwordtooshort": "ڳجھي لفظ گھٽ ۾ گھٽ  {{PLURAL:$1|1 اکر|$1 اکرَن}} تي ٻڌل هوڻ گھرجي.",
        "passwordtoolong": "ڳجھو لفظ {{PLURAL:$1|1 اکر|$1 اکرن}} کان وڏو نہ ٿو ٿي سگھي.",
        "password-name-match": "توهان جو ڳجھو لفظ توهان جي يوزرنانءُ کان مختلف هجڻ گھرجي.",
-       "mailmypassword": "ڳجھو لفظ برق ٽپاليو",
+       "mailmypassword": "ڳجھو لفظ ٻيهر ترتيب ڪريو",
        "passwordremindertitle": "{{SITENAME}} لاءِ نئون عارضي ڳجھو لفظ",
        "passwordremindertext": "ڪنهن (شايد توهان آءِ پي پتي $1 تان) اسان کي {{SITENAME}} ($4) لاءِ نئون ڳجھو لفظ اماڻڻ جي گھُرَ ڪئي.\n\nهاڻي يوزر \"$2\" لاءِ ڳجھو لفظ \"$3\" آهي. توهان کي هينئر ئي لاگ اِن ٿي پنهنجو ڳجھو لفظ تبديل ڪرڻ گھرجي.\n\nجيڪڏهن اها گھُرَ اوهان نه ڪئي هئي، يا هاڻي اوهان کي پنهنجو ڳجھو لفظ ياد اچي ويو آهي ۽ توهان ان کي تبديل ڪرڻ نه ٿا چاهيو، ته توهان هن نياپي کي نظر انداز ڪندي پنهنجو پراڻو ڳجھو لفظ ئي استعمال ڪري سگھو ٿا.",
        "noemail": "يُوزر \"$1\" جي ڪو به برق ٽپال پتو درج ٿيل ناهي.",
        "cannotchangeemail": "هن وڪيءَ تي کاتيدار جو برق ٽپال پتو بدلائي نہ ٿو سگھجي.",
        "emaildisabled": "هيءَ سرزمين برق ٽپال اماڻي نہ ٿي سگھي.",
        "accountcreated": "کاتو کلي چڪو",
-       "accountcreatedtext": "$1 نالي يوزر کاتو کلي چڪو آھي.",
+       "accountcreatedtext": "يوزر کاتو [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) جي لاءِ تخليق ٿي چڪو آهي.",
        "createaccount-title": "{{SITENAME}} تي کاتو کولڻ",
        "login-throttled": "توهان تازو ئي لاگ اِن ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
        "login-abort-generic": "توهان جو لاگ اِن ناڪام ويو.",
index 578e39f..9243be5 100644 (file)
@@ -28,7 +28,8 @@
                        "Nemo bis",
                        "Aktron",
                        "Srdjan m",
-                       "Macofe"
+                       "Macofe",
+                       "Сербијана"
                ]
        },
        "tog-underline": "Подвлачење веза:",
        "category-media-header": "Датотеке у категорији „$1“",
        "category-empty": "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ова категорија тренутно не садржи странице или датотеке.''</div>",
        "hidden-categories": "{{PLURAL:$1|Сакривена категорија|Сакривене категорије}}",
-       "hidden-category-category": "СакÑ\80ивене ÐºÐ°Ñ\82егоÑ\80иÑ\98е",
+       "hidden-category-category": "Скривене категорије",
        "category-subcat-count": "{{PLURAL:$2|1=Ова категорија садржи само следећу поткатегорију.|Ова категорија има {{PLURAL:$1|1=следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}, од укупно $2.}}",
        "category-subcat-count-limited": "Ова категорија садржи {{PLURAL:$1|следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}.",
        "category-article-count": "{{PLURAL:$2|1=Ова категорија садржи само следећу страницу.|{{PLURAL:$1|Следећа страница је|Следеће $1 странице су|Следећих $1 страница је}} у овој категорији, од укупно $2.}}",
        "protectedpagewarning": "<strong>Упозорење: ова страница је заштићена, тако да само администратори могу да је мењају.</strong>\nПоследњи запис у дневнику је приказан испод:",
        "semiprotectedpagewarning": "'''Напомена:''' ова страница је заштићена, тако да само регистровани корисници могу да је уређују.\nПоследњи запис у дневнику је приказан испод:",
        "cascadeprotectedwarning": "<strong>Упозорење:</strong> ова страница је заштићена тако да је могу уређивати само администратори, јер је она укључена у {{PLURAL:$1|следећу страницу која је|следеће странице које су}} заштићене „преносивом“ заштитом:",
-       "titleprotectedwarning": "'''Упозорење: ова страница је заштићена тако да је могу направити само корисници [[Special:ListGroupRights|с одређеним правима]].'''",
+       "titleprotectedwarning": "<strong>Упозорење: ову страницу могу направити само корисници [[Special:ListGroupRights|с одређеним правима]].</strong>\nИспод су наведени последњи записи у дневнику:",
        "templatesused": "{{PLURAL:$1|Шаблон|Шаблони}} на овој страници:",
        "templatesusedpreview": "{{PLURAL:$1|Шаблон|Шаблони}} у овом прегледу:",
        "templatesusedsection": "{{PLURAL:$1|Шаблон|Шаблони}} у овом одељку:",
        "permissionserrors": "Грешка у дозволи",
        "permissionserrorstext": "Немате овлашћење за ову радњу из {{PLURAL:$1|1=следећег|следећих}} разлога:",
        "permissionserrorstext-withaction": "Немате дозволу за $2 из {{PLURAL:$1|следећег|следећих}} разлога:",
-       "recreate-moveddeleted-warn": "'''Упозорење: поново правите страницу која је претходно обрисана.'''\n\nРазмотрите да ли је прикладно да наставите с уређивањем ове странице.\nОвде је наведена историја брисања и премештања с образложењем:",
+       "recreate-moveddeleted-warn": "<strong>Упозорење: поново правите страницу која је претходно обрисана.</strong>\n\nРазмотрите да ли је прикладно да наставите с уређивањем ове странице.\nОвде је наведена историја брисања и премештања с образложењем:",
        "moveddeleted-notice": "Ова страница је обрисана.\nИсторија њеног брисања и премештања налази се испод:",
        "moveddeleted-notice-recent": "Жао нам је, ова страница је недавно обрисана (у последњих 24 сата).\nОвде је наведена историја брисања и премештања с образложењем.",
        "log-fulllog": "Погледај целу историју",
        "revdelete-selected-text": "{{PLURAL:$1|Изабрана измена|Изабране измене}} [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Изабрана верзија датотеке|Изабране верзије датотеке}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Изабрана ставка у историји|Изабране ставке у историји}}:",
-       "revdelete-text-text": "Избрисане измене ће и даље бити видљиве у историји странице, али делови њиховог садржаја неће бити јавно доступну.",
-       "revdelete-text-file": "Избрисане верзије датотеке ће и даље бити видљиве у историји датотеке, али делови њиховог садржаја неће бити јавно доступну.",
-       "logdelete-text": "Избрисани уноси у дневницима ће и даље бити видљиви у дневницима, али делови њиховог садржаја неће бити јавно доступну.",
+       "revdelete-text-text": "Избрисане измене ће и даље бити видљиве у историји странице, али делови њиховог садржаја неће бити јавно доступни.",
+       "revdelete-text-file": "Избрисане верзије датотеке ће и даље бити видљиве у историји датотеке, али делови њиховог садржаја неће бити јавно доступни.",
+       "logdelete-text": "Избрисани уноси у дневницима ће и даље бити видљиви у дневницима, али делови њиховог садржаја неће бити јавно доступни.",
        "revdelete-text-others": "Остали администратори ће и даље моћи да приступе скривеном садржају и врате га, осим ако се поставе додатна ограничења.",
        "revdelete-confirm": "Потврдите да намеравате ово урадити, да разумете последице и да то чините у складу с [[{{MediaWiki:Policy-url}}|правилима]].",
        "revdelete-suppress-text": "Сакривање измена би требало користити <strong>само</strong> у следећим случајевима:\n* злонамерни или погрдни подаци\n* неприкладни лични подаци\n*: <em>кућна адреса и број телефона, број кредитне картице, ЈМБГ итд.</em>",
index 6890e79..9c3bc40 100644 (file)
@@ -19,7 +19,8 @@
                        "아라",
                        "Nemo bis",
                        "Srdjan m",
-                       "Macofe"
+                       "Macofe",
+                       "Сербијана"
                ]
        },
        "tog-underline": "Podvlačenje veza:",
        "category-media-header": "Datoteke u kategoriji „$1“",
        "category-empty": "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ova kategorija trenutno ne sadrži stranice ili datoteke.''</div>",
        "hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}}",
-       "hidden-category-category": "Sakrivene kategorije",
+       "hidden-category-category": "Skrivene kategorije",
        "category-subcat-count": "{{PLURAL:$2|1=Ova kategorija sadrži samo sledeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|1=sledeću potkategoriju|sledeće $1 potkategorije|sledećih $1 potkategorija}}, od ukupno $2.}}",
        "category-subcat-count-limited": "Ova kategorija sadrži {{PLURAL:$1|sledeću potkategoriju|sledeće $1 potkategorije|sledećih $1 potkategorija}}.",
        "category-article-count": "{{PLURAL:$2|1=Ova kategorija sadrži samo sledeću stranicu.|{{PLURAL:$1|Sledeća stranica je|Sledeće $1 stranice su|Sledećih $1 stranica je}} u ovoj kategoriji, od ukupno $2.}}",
        "protectedpagewarning": "<strong>Upozorenje: ova stranica je zaštićena, tako da samo administratori mogu da je menjaju.</strong>\nPoslednji zapis u dnevniku je prikazan ispod:",
        "semiprotectedpagewarning": "'''Napomena:''' ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je uređuju.\nPoslednji zapis u dnevniku je prikazan ispod:",
        "cascadeprotectedwarning": "<strong>Upozorenje:</strong> ova stranica je zaštićena tako da je mogu uređivati samo administratori, jer je ona uključena u {{PLURAL:$1|sledeću stranicu koja je|sledeće stranice koje su}} zaštićene „prenosivom“ zaštitom:",
-       "titleprotectedwarning": "'''Upozorenje: ova stranica je zaštićena tako da je mogu napraviti samo korisnici [[Special:ListGroupRights|s određenim pravima]].'''",
+       "titleprotectedwarning": "<strong>Upozorenje: ovu stranicu mogu napraviti samo korisnici [[Special:ListGroupRights|s određenim pravima]].</strong>\nIspod su navedeni poslednji zapisi u dnevniku:",
        "templatesused": "{{PLURAL:$1|Šablon|Šabloni}} na ovoj stranici:",
        "templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} u ovom pregledu:",
        "templatesusedsection": "{{PLURAL:$1|Šablon|Šabloni}} u ovom odeljku:",
        "revdelete-selected-text": "{{PLURAL:$1|Izabrana izmena|Izabrane izmene}} [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Izabrana verzija datoteke|Izabrane verzije datoteke}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Izabrana stavka u istoriji|Izabrane stavke u istoriji}}:",
-       "revdelete-text-text": "Izbrisane izmene će i dalje biti vidljive u istoriji stranice, ali delovi njihovog sadržaja neće biti javno dostupnu.",
-       "revdelete-text-file": "Izbrisane verzije datoteke će i dalje biti vidljive u istoriji datoteke, ali delovi njihovog sadržaja neće biti javno dostupnu.",
-       "logdelete-text": "Izbrisani unosi u dnevnicima će i dalje biti vidljivi u dnevnicima, ali delovi njihovog sadržaja neće biti javno dostupnu.",
+       "revdelete-text-text": "Izbrisane izmene će i dalje biti vidljive u istoriji stranice, ali delovi njihovog sadržaja neće biti javno dostupni.",
+       "revdelete-text-file": "Izbrisane verzije datoteke će i dalje biti vidljive u istoriji datoteke, ali delovi njihovog sadržaja neće biti javno dostupni.",
+       "logdelete-text": "Izbrisani unosi u dnevnicima će i dalje biti vidljivi u dnevnicima, ali delovi njihovog sadržaja neće biti javno dostupni.",
        "revdelete-text-others": "Ostali administratori će i dalje moći da pristupe skrivenom sadržaju i vrate ga, osim ako se postave dodatna ograničenja.",
        "revdelete-confirm": "Potvrdite da nameravate ovo uraditi, da razumete posledice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "revdelete-suppress-text": "Sakrivanje izmena bi trebalo koristiti <strong>samo</strong> u sledećim slučajevima:\n* zlonamerni ili pogrdni podaci\n* neprikladni lični podaci\n*: <em>kućna adresa i broj telefona, broj kreditne kartice, JMBG itd.</em>",
        "pageinfo-recent-edits": "Broj skorašnjih izmena (u poslednjih $1)",
        "pageinfo-recent-authors": "Broj skorašnjih zasebnih autora",
        "pageinfo-magic-words": "{{PLURAL:$1|Magična reč|Magične reči}} ($1)",
-       "pageinfo-hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Skrivena kategorija|Skrivene kategorije}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Uključeni šablon|Uključeni šabloni}} ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|Stranica|Stranice}} uključene u ($1)",
        "pageinfo-toolboxlink": "Podaci o stranici",
index 4f12c93..57ac62a 100644 (file)
@@ -8,7 +8,8 @@
                        "Sborsody",
                        "friends at tyvawiki.org",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Монгуш Салим"
                ]
        },
        "tog-underline": "Холбааны шыяры:",
        "underline-never": "Кажан-даа",
        "underline-default": "Кештиң азы веб-браузерниң ниити үнези",
        "editfont-default": "Веб-браузерниң ниити үнези",
-       "sunday": "Улуг хүн",
+       "sunday": "Улуг-хүн",
        "monday": "Бир дугаар хүн",
        "tuesday": "Ийи дугаар хүн",
        "wednesday": "Үш дугаар хүн",
        "thursday": "Дөрт дугаар хүн",
        "friday": "Беш дугаар хүн",
-       "saturday": "ЧаÑ\80Ñ\82Ñ\8bк Ñ\83лÑ\83г хүн",
+       "saturday": "Ð\90лдÑ\8b Ð´Ñ\83гааÑ\80 хүн",
        "sun": "Улуг-хүн",
        "mon": "Пн",
        "tue": "Вт",
        "thu": "Чт",
        "fri": "Пт",
        "sat": "Сб",
-       "january": "Бир ай",
-       "february": "ийи ай",
-       "march": "Үш ай",
-       "april": "Ð\94Ó©Ñ\80Ñ\82 Ð°Ð¹",
-       "may_long": "Ð\91еÑ\88 ай",
-       "june": "Ð\90лдÑ\8b Ð°Ð¹",
-       "july": "Чеди Ð°Ð¹",
-       "august": "СеÑ\81 Ð°Ð¹",
-       "september": "Тос ай",
-       "october": "Ð\9eн Ð°Ð¹",
-       "november": "Ð\9eн Ð±Ð¸Ñ\80 Ð°Ð¹",
-       "december": "Ð\9eн Ð¸Ð¹Ð¸ Ð°Ð¹",
+       "january": "январь",
+       "february": "февраль",
+       "march": "март",
+       "april": "апÑ\80елÑ\8c",
+       "may_long": "май",
+       "june": "иÑ\8eнÑ\8c",
+       "july": "иÑ\8eлÑ\8c",
+       "august": "авгÑ\83Ñ\81Ñ\82",
+       "september": "сентябрь",
+       "october": "окÑ\82Ñ\8fбÑ\80Ñ\8c",
+       "november": "ноÑ\8fбÑ\80Ñ\8c",
+       "december": "декабÑ\80Ñ\8c",
        "january-gen": "Бир айның",
-       "february-gen": "Ð\98йи Ð°Ð¹Ð½Ñ\8bÒ£",
+       "february-gen": "ФевÑ\80алÑ\8c",
        "march-gen": "Үш айның",
        "april-gen": "Дөрт айның",
        "may-gen": "Беш айның",
        "october-gen": "Он айның",
        "november-gen": "Он бир айның",
        "december-gen": "Он ийи айның",
-       "jan": "1 ай",
-       "feb": "2 ай",
-       "mar": "3 ай",
-       "apr": "4 ай",
-       "may": "ай",
-       "jun": "6 ай",
-       "jul": "7 ай",
-       "aug": "8 ай",
-       "sep": "9 ай",
-       "oct": "10 ай",
-       "nov": "11 ай",
-       "dec": "12 ай",
-       "pagecategories": "{{PLURAL:$1|Ð\90ңгÑ\8bлал}}",
-       "category_header": "«$1» Ð´ÐµÐ¿ Ð±Ó©Ð»Ò¯ÐºÑ\82Ò¯ң арыннары",
+       "jan": "январь",
+       "feb": "фев",
+       "mar": "март",
+       "apr": "апрель",
+       "may": "май",
+       "jun": "июнь",
+       "jul": "июль",
+       "aug": "август",
+       "sep": "сентябрь",
+       "oct": "октябрь",
+       "nov": "ноябрь",
+       "dec": "декабрь",
+       "pagecategories": "{{PLURAL:$1|Ð\9aаÑ\82егоÑ\80иÑ\8f\9aаÑ\82егоÑ\80иÑ\8fлаÑ\80}}",
+       "category_header": "«$1» ÐºÐ°Ñ\82егоÑ\80иÑ\8fнÑ\8bң арыннары",
        "subcategories": "Адаккы бөлүктер",
        "category-media-header": "«$1» деп бөлүкте файлдар",
        "category-empty": "''Амгы бо бөлүкте медиа база арыннар чок.''",
-       "hidden-categories": "{{PLURAL:$1|1=ЧажÑ\8bÑ\82 Ð°Ò£Ð³Ñ\8bлал|ЧажÑ\8bÑ\82 Ð°Ò£Ð³Ñ\8bлалдар}}",
+       "hidden-categories": "{{PLURAL:$1|1=Ð\9aөзүлбеÑ\81 ÐºÐ°Ñ\82егоÑ\80иÑ\8f\9aөзүлбеÑ\81 ÐºÐ°Ñ\82егоÑ\80иÑ\8fлар}}",
        "hidden-category-category": "Чажыт бөлүктер",
-       "category-subcat-count": "{{PLURAL:$2|1=Ð\91о Ð°Ò£Ð³Ñ\8bлал Ñ\87үгле Ð´Ð°Ñ\80аазÑ\8bнда Ð°Ò£Ð³Ñ\8bламнÑ\8bг.|Ð\91о Ð°Ò£Ð³Ñ\8bлалдÑ\8bÒ£ Ñ\88Ñ\83пÑ\82Ñ\83 $2 Ð°Ò£Ð³Ñ\8bламнаÑ\80нÑ\8bÒ£ Ð°Ñ\80азÑ\8bндан Ð´Ð°Ñ\80аазÑ\8bнда $1 Ð°Ò£Ð³Ñ\8bламнÑ\8b ÐºÓ©Ñ\80гүÑ\81кен.}}",
+       "category-subcat-count": "{{PLURAL:$2|1=Ð\91о ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\87үгле Ð´Ð°Ñ\80аазÑ\8bнда Ð¸Ñ\88Ñ\82ики ÐºÐ°Ñ\82егоÑ\80иÑ\8fлÑ\8bг.|Ð\91о ÐºÐ°Ñ\82егоÑ\80иÑ\8fда Ð±Ð°Ñ\80-ла $2 Ð¸Ñ\88Ñ\82ики ÐºÐ°Ñ\82егоÑ\80иÑ\8fлаÑ\80нÑ\8bÒ£ $1 Ð´ÐµÐ¿ Ð¸Ñ\88Ñ\82ики ÐºÐ°Ñ\82егоÑ\80иÑ\8fзÑ\8b ÐºÓ©Ñ\81Ñ\82үп Ñ\82Ñ\83Ñ\80аÑ\80.}}",
        "category-subcat-count-limited": "Бо аңгылал {{PLURAL:$1|1=бир|$1}} аңгыламныг.",
-       "category-article-count": "{{PLURAL:$2|1=Ð\91о Ð°Ò£Ð³Ñ\8bлал Ñ\87үгле Ð´Ð°Ñ\80аазÑ\8bнда Ð°Ñ\80Ñ\8bннаÑ\80лÑ\8bг.|Ð\91о Ð°Ò£Ð³Ñ\8bлалдÑ\8bÒ£ Ñ\88Ñ\83пÑ\82Ñ\83 $2 Ð°Ñ\80Ñ\8bннаÑ\80Ñ\8bнÑ\8bÒ£ Ð°Ñ\80азÑ\8bндан Ð´Ð°Ñ\80аазÑ\8bнда $1 Ð°Ñ\80Ñ\8bнÑ\8bн көргүскен.}}",
-       "category-file-count": "{{PLURAL:$2|1=Ð\91о Ð±Ó©Ð»Ò¯Ðº Ñ\87үгле Ñ\87аңгÑ\8bÑ\81 Ñ\84айлдÑ\8bг.|Ð\91о Ð±Ó©Ð»Ò¯ÐºÑ\82Ò¯Ò£ Ð½Ð¸Ð¸Ñ\82и $2 файлының $1 файлын көргүскен.}}",
+       "category-article-count": "{{PLURAL:$2|1=Ð\91о ÐºÐ°Ñ\82егоÑ\80иÑ\8fда Ñ\87үгле Ñ\87аңгÑ\8bÑ\81 Ð°Ñ\80Ñ\8bн Ð±Ð°Ñ\80.|Ук ÐºÐ°Ñ\82егоÑ\80иÑ\8fда Ð±Ð°Ñ\80 $2 Ð°Ñ\80Ñ\8bннаÑ\80Ñ\8bнÑ\8bÒ£ Ð°Ñ\80азÑ\8bндан}} |{{PLURAL:$1 Ð°Ñ\80Ñ\8bннÑ\8b ÐºÓ©Ñ\80гүÑ\81кен| $1 Ð°Ñ\80Ñ\8bннаÑ\80нÑ\8b көргүскен.}}",
+       "category-file-count": "{{PLURAL:$2|1=Ð\91о ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\87үгле Ñ\87аңгÑ\8bÑ\81 Ñ\84айлдÑ\8bг.|Ð\91о ÐºÐ°Ñ\82егоÑ\80иÑ\8fнÑ\8bÒ£ Ñ\88Ñ\83пÑ\82Ñ\83 $2 файлының $1 файлын көргүскен.}}",
        "listingcontinuesabbrev": "(уланчы)",
        "noindex-category": "Индекстелбес арынар",
        "broken-file-category": "Ажылдавайн турар файл-шөлүлгелиг арыннар",
        "about": "Дугайында",
        "article": "Допчу арын",
-       "newwindow": "(чаа көзенээ ажыытынар)",
-       "cancel": "СокÑ\81ааÑ\80Ñ\8b",
+       "newwindow": "(чаа көзенекке)",
+       "cancel": "ЫнÑ\87анмаÑ\81",
        "moredotdotdot": "Артык...",
        "mypage": "Арын",
        "mytalk": "Чугаа",
        "faqpage": "Project:БлСА",
        "actions": "Кылыглар",
        "namespaces": "Аттар делгемнери",
-       "variants": "Бир янзы",
+       "variants": "Янзы-хевирлери",
+       "navigation-heading": "Навигация менюзу",
        "errorpagetitle": "Алдаг",
        "returnto": "«$1» деп арынже эглири.",
-       "tagline": "{{SITENAME}} деп веб-сайттан",
+       "tagline": "{{SITENAME}} сайттан",
        "help": "Дуза",
-       "search": "Диле",
+       "search": "Дилээр",
        "searchbutton": "Дилээр",
        "go": "Баары",
-       "searcharticle": "Ð\9aÒ¯Ò¯cедиÑ\80и",
+       "searcharticle": "Че-ве",
        "history": "Арынның төөгүзү",
        "history_short": "Төөгү",
-       "printableversion": "СаазÑ\8bнга Ò¯Ð½Ð´Ò¯Ñ\80еÑ\80ин ÐºÓ©Ó©Ñ\80Ò¯",
-       "permalink": "ТÑ\83Ñ\80Ñ\83м Ð°Ð¹Ñ\82Ñ\8bг",
+       "printableversion": "Ð\9fаÑ\80лап Ò¯Ð½Ð´Ò¯Ñ\80еÑ\80 Ñ\8fнзÑ\8bзÑ\8b",
+       "permalink": "Ð\94окÑ\82аамал Ñ\88өлүлге",
        "print": "Саазынга үндүрер",
-       "view": "Көөрү",
+       "view": "Көөр",
+       "view-foreign": "$1 сайттан көөр",
        "edit": "Эдер",
        "create": "Чогаадыры",
+       "create-local": "Кызыы тайылбыр немээр",
        "editthispage": "Бо арынны өскертири",
        "create-this-page": "Бо арынны чогаадыры",
        "delete": "Ыраары",
        "unprotectthispage": "Бо арынның камгалалын өскертири",
        "newpage": "Чаа арын",
        "talkpage": "Бо арын дугайында чугаалажыры",
-       "talkpagelinktext": "Чугаа",
+       "talkpagelinktext": "Чугаалажып сайгарар",
        "specialpage": "Тускай арын",
        "personaltools": "Хууда херекселдер",
        "articlepage": "Допчу арынны көөрү",
-       "talk": "ЧÑ\83гаа",
-       "views": "Көрүүшкүннери",
+       "talk": "СайгаÑ\80Ñ\8bлга",
+       "views": "Көрүлделер",
        "toolbox": "Херекселдер",
        "userpage": "Ажыглакчының арынын көөрү",
        "projectpage": "Төлевилелдиң арынын көөрү",
        "categorypage": "Бөлүктүң арынын көөрү",
        "viewtalkpage": "Чугааны көөрү",
        "otherlanguages": "Өске дылдарга",
-       "redirectedfrom": "($1 шигленген)",
+       "redirectedfrom": "($1 катап чоруткан)",
        "redirectpagesub": "шигледир арын",
-       "lastmodifiedat": "Бо арын сөөлгү катап $1, $2 өскерилген.",
+       "lastmodifiedat": "Бо арын сөөлгү катап $1-ның хүнүнде, $2 турда өскерилген.",
        "protectedpage": "Камгалаган арын",
        "jumpto": "Шилчиир:",
        "jumptonavigation": "навигация",
-       "jumptosearch": "дилээри",
+       "jumptosearch": "дилээр",
        "pool-errorunknown": "Билбес алдаг",
        "aboutsite": "{{SITENAME}} дугайында",
        "aboutpage": "Project:Дугайында",
-       "copyrightpage": "{{ns:project}}:ЧогаалÑ\87Ñ\8bнÑ\8bң эргелери",
+       "copyrightpage": "{{ns:project}}:авÑ\82оÑ\80нÑ\83ң эргелери",
        "currentevents": "Амгы үеде болуушкуннар",
        "currentevents-url": "Project:Амгы үеде болуушкуннар",
-       "disclaimers": "Ð\90жÑ\8bглааÑ\80 Ñ\85аÑ\80Ñ\8bÑ\81аалгазÑ\8bн Ñ\87Ó©Ñ\80Ñ\87Ò¯Ò¯Ñ\80Ò¯ (ойÑ\82алааÑ\80Ñ\8b)",
-       "disclaimerpage": "Project:Ð\90жÑ\8bглааÑ\80 Ñ\85аÑ\80Ñ\8bÑ\81аалгазÑ\8bн Ð¾Ð¹Ñ\82алааÑ\80Ñ\8b",
+       "disclaimers": "ХаÑ\80Ñ\8bÑ\8bÑ\81алгадан Ð¾Ð¹Ñ\82алал",
+       "disclaimerpage": "Project:ХаÑ\80Ñ\8bÑ\8bÑ\81алгадан Ð¾Ð¹Ñ\82алааÑ\88кÑ\8bн",
        "edithelp": "Эдеринге дуза",
-       "mainpage": "Ð\9aол Ð\90рын",
-       "mainpage-description": "Ð\9aол Ð\90рын",
+       "mainpage": "Ð\9aол Ð°рын",
+       "mainpage-description": "Ð\9aол Ð°рын",
        "policy-url": "Project:Чурум",
-       "portal": "Ниитилел хаалгазы",
-       "portal-url": "Project:Ниитилел хаалгазы",
-       "privacy": "Ð\90кÑ\82Ñ\8bг Ð±үзүрел дугуржулгазы",
-       "privacypage": "Project:Ð\90кÑ\82Ñ\8bг Ð±үзүрел дугуржулгазы",
+       "portal": "Ниитилелдиң порталы",
+       "portal-url": "Project:Ниитилелдиң порталы",
+       "privacy": "Ð\91үзүрел дугуржулгазы",
+       "privacypage": "Project:Ð\91үзүрел дугуржулгазы",
        "badaccess": "Алдаг:Эргеңер чок.",
        "versionrequired": "МедиаВикиниң $1 үндүреризи херек",
        "ok": "Чөп",
-       "retrievedfrom": "«$1» деп адрестен парлаттынган",
+       "retrievedfrom": "Дөзү - «$1»",
        "youhavenewmessages": "Силерде $1 ($2) бар.",
        "youhavenewmessagesmulti": "«$1» деп арында силерге чаа чагаалар бар.",
        "editsection": "эдер",
        "editold": "эдер",
        "viewsourceold": "дөзү кодун көөрү",
        "editlink": "эдер",
-       "viewsourcelink": "дөзү кодун көөрү",
-       "editsectionhint": "«$1» деп салбырны эдер",
+       "viewsourcelink": "Үндезин кодту көөр",
+       "editsectionhint": "«$1» салбырны эдер",
        "toc": "Допчузу",
        "showtoc": "көргүзери",
        "hidetoc": "чажырары",
        "feedlinks": "Агым:",
        "feed-invalid": "Бижидилгениң агым хевири багай-дыр.",
        "site-rss-feed": "$1 RSS Медээ Агымы",
-       "site-atom-feed": "$1 Atom Медээ Агымы",
+       "site-atom-feed": "$1 Atom-лента",
        "page-rss-feed": "«$1» RSS Медээ Агымы",
        "page-atom-feed": "«$1» Atom Медээ Агымы",
-       "red-link-title": "$1 (арны чок)",
+       "red-link-title": "$1 (арын чок)",
        "nstab-main": "Арын",
        "nstab-user": "Ажыглакчының арыны",
        "nstab-media": "Медиа арыны",
-       "nstab-special": "ТÑ\83Ñ\81кай арын",
+       "nstab-special": "Ð\90лбан-Ñ\85аакÑ\87Ñ\8bÑ\82 арын",
        "nstab-project": "Төлевилел дугайында",
        "nstab-image": "Файл",
        "nstab-mediawiki": "Чагаа",
        "nstab-template": "Майык",
        "nstab-help": "Дуза",
-       "nstab-category": "Аңгылал",
+       "nstab-category": "Категория",
+       "mainpage-nstab": "Кол арын",
        "nosuchaction": "Ындыг кылыг чок",
        "nosuchspecialpage": "Ындыг тускай арын чок",
        "error": "Алдаг",
        "internalerror_info": "Иштики алдаг: $1",
        "badtitle": "Багай ат",
        "badtitletext": "Негеттинип турар арын ады меге, куруг, чок болза өске дылда азы интервикиде ады шын эвес айыттынган.\n\nАттарга ажыглавас ужурлуг демдектер, үжүктер бары чадапчок.",
-       "viewsource": "Ð\94өзүн ÐºÓ©Ó©Ñ\80Ò¯",
+       "viewsource": "Ð\9aÓ©Ñ\80үлде",
        "actionthrottled": "Шеглээн дүрген",
        "exception-nologin": "Кирбес",
        "welcomeuser": "Кирип моорлаңар, %s!",
        "yourname": "Aжыглакчының ады",
+       "userlogin-yourname": "Бүрүткел ат",
+       "userlogin-yourname-ph": "Бүрүткедир адыңар киириңер",
        "yourpassword": "Чажыт сөс",
+       "userlogin-yourpassword": "Пароль",
        "yourpasswordagain": "Чажыт сөзүңерни катап бижиңер:",
        "remembermypassword": "Мени бо компьютерде сактып алыры ($1 {{PLURAL:$1|1=хүн|хүн}}ге чедир)",
        "login": "Кирери",
        "accountcreatedtext": "«$1» деп ажыглакчының бүрүткел бижиини бүдүрген.",
        "login-abort-generic": "Системаже таптыг эвес кирип тур силер",
        "loginlanguagelabel": "Дыл: $1",
+       "pt-login": "Кирер",
+       "pt-createaccount": "Бүрүткел бижик кылыр",
        "pt-userlogout": "Үнер",
        "php-mail-error-unknown": "PHP-ниң mail() ажыл-чорудулгазында билбес алдаг бар.",
        "changepassword": "Чажыт сөстү өскертири",
        "passwordreset-email": "Э-чагааның адреси:",
        "passwordreset-emailelement": "Ажыглакчы ады: \n$1\n\nТүр чажыт сөс: \n$2",
        "changeemail": "Э-чагааның адресин өскертири",
+       "changeemail-header": "Бүрүткел бижиктиң э-чагааның адресин өскертири",
        "changeemail-oldemail": "Амгы э-чагааның адреси:",
        "changeemail-newemail": "Чаа э-чагааның адреси:",
        "changeemail-none": "(чок)",
        "changeemail-submit": "Э-чагааны өскертири",
-       "bold_sample": "Кара сөзүглел",
-       "bold_tip": "Кара сөзүглел",
-       "italic_sample": "Ð\98йлендиÑ\80еÑ\80 Ñ\81өзүглел",
-       "italic_tip": "Курсив бижик",
-       "link_sample": "ХолбаанÑ\8bң ады",
-       "link_tip": "Ð\98Ñ\88Ñ\82ики Ñ\85олбаа",
+       "bold_sample": "семис үжүк",
+       "bold_tip": "семис үжүк",
+       "italic_sample": "кÑ\83Ñ\80Ñ\81ив Ñ\85евиÑ\80",
+       "italic_tip": "Курсив хевир",
+       "link_sample": "Шөлүлгениң ады",
+       "link_tip": "Ð\98Ñ\88Ñ\82ики Ñ\88өлүлге",
        "extlink_sample": "http://www.example.com холбааның ады",
-       "extlink_tip": "Ð\94аÑ\88Ñ\82Ñ\8bкÑ\8b Ñ\85олбаа (\"http://\" Ñ\87үве Ñ\81акÑ\82Ñ\8bп Ð°Ð»Ñ\8bр)",
-       "headline_sample": "Ð\9aÑ\8bÑ\80Ñ\8bкÑ\8b сөзүглели",
-       "headline_tip": "2-ги деңнелдиг кырыкы ады",
-       "nowiki_sample": "Форматтаваан сөзүглелини бээр салыры",
-       "nowiki_tip": "Вики форматтаарын херекке албас",
+       "extlink_tip": "Ð\94аÑ\88Ñ\82Ñ\8bкÑ\8b Ñ\88өлүлге (\"http://\" Ð¿Ñ\80еÑ\84икÑ\81 Ð´Ñ\83гайÑ\8bнда Ñ\83Ñ\82паңар)",
+       "headline_sample": "Эге Ð°Ñ\82Ñ\82Ñ\8bÒ£ сөзүглели",
+       "headline_tip": "2-ги деңнелдиң эге ады",
+       "nowiki_sample": "Форматтавас сөзүглелди бээр салыңар",
+       "nowiki_tip": "Вики-форматтаашкын кылбас",
        "image_sample": "Чижек.jpg",
-       "image_tip": "Киир туткан файл",
+       "image_tip": "Киирген файл",
        "media_sample": "Чижек.ogg",
-       "media_tip": "Файлдың холбаазы",
-       "sig_tip": "Шак-биле Ñ\85ол Ò¯Ð¶Ò¯Ò£ÐµÑ\80",
+       "media_tip": "Файлче шөлүлге",
+       "sig_tip": "ХолÑ\83ңаÑ\80 Ò¯Ð¶Ò¯Ò¯, Ò¯Ðµ-Ñ\88агÑ\8b",
        "hr_tip": "Доора шугум (көвей ажыглаваңар)",
        "summary": "Түңнел:",
        "subject": "Кол сөс:",
        "minoredit": "Бо эдилге бичии-дир",
-       "watchthis": "Бо арынны хайгаараары",
-       "savearticle": "Арын шыгжаар",
+       "watchthis": "Бо арынны хайгаараар",
+       "savearticle": "Арынны шыгжаар",
        "preview": "Чижеглей көөрү",
-       "showpreview": "Чижеглей ÐºÓ©Ó©Ñ\80Ò¯",
-       "showdiff": "Өскерлиишкиннерни көргүзери",
-       "anoneditwarning": "<strong>Кичээңгейлиг!</strong> Силер сайтче кирип албаан силер. Чаартылгалар киирер болзуңарза, Силерниң IP-адрезиңер чүүлдүң төөгүзүнге көстүп кээр. Кажан сайтче <strong>[$1 шолаңар-биле кире бээриңерге]</strong> азы <strong>[$2 чаа шола чаяап алырыңарга]</strong>, эдилгеңерни шолаңар-биле холбаап каар база Силерге ажыктыг тускай херекселдер тыптып келир.",
+       "showpreview": "Чижек ÐºÓ©Ñ\80үлде",
+       "showdiff": "Кииртинген эдилгелер",
+       "anoneditwarning": "<strong> Кичээңгейлиг! </strong> Сайтта бүрүткеттинмээн-дир силер. Кандыг-даа бол эдилгелер киирер болзуңарза, IP-адрезиңер хөйге көскү болур. Сайтче <strong>[$1 кире бээр азы]</strong> азы <strong>[$2 бүрүткеттинип алыр] болзуңарза, эдилгелер силерниң адыңар-биле холбаалыг апаар, силерге өске-даа эптиг аргаларлыг тыптып кээр.",
        "missingcommenttext": "Тайылбырни адаанда чогаадыңар.",
        "summary-preview": "Түңнелдү чижеглей көөрү:",
        "subject-preview": "Кол сөс чижеглей көөрү:",
        "blockednoreason": "чылдагаан чок",
        "nosuchsectiontitle": "Бо салбыр чок",
-       "loginreqlink": "кирери",
+       "loginreqlink": "кирер",
        "accmailtitle": "Чажыт сөс чоргустунган.",
        "accmailtext": "A randomly generated password for [[User talk:$1|$1]] has been sent to $2.\n\nThe password for this new account can be changed on the ''[[Special:ChangePassword|change password]]'' page upon logging in.",
        "newarticle": "(Чаа)",
        "newarticletext": "Амдыызында чаяатынмаан арынче шөлүглеп шилчий бердиңер.\nОну чаяарда адакы көзенекке сөзүглелден таналап киириңер ([$1 тайылбыр арынын] тода көрүңер).. \nМаңаа алдаг аайы-биле шилчий берген болзуңарза, браузериңерниң \"дедир\"  деп таназын базыптыңар.",
        "noarticletext": "Амдыызында ук арында сөзүглел чок.\nОл дилеп турар [[Special:Search/{{PAGENAME}}|арыныңар дугайында өске чүүлдерге бижээнин тып аап]] болур силер,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналдар аразынга айытканын көрүп болур силер] азы '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} шак ындыг аттыг арын чаяап болур силер]'''</span>.,",
-       "noarticletext-nopermission": "Ð\90мдÑ\8bÑ\8bзÑ\8bнда Ñ\83к Ð°Ñ\80Ñ\8bнда Ñ\81өзүглел Ñ\87ок.\nÐ\9eл Ð´Ð¸Ð»ÐµÐ¿ Ñ\82Ñ\83Ñ\80аÑ\80 [[Special:Search/{{PAGENAME}}|аÑ\80Ñ\8bнÑ\8bңаÑ\80 Ð´Ñ\83гайÑ\8bнда Ó©Ñ\81ке Ñ\87үүлдеÑ\80ге Ð±Ð¸Ð¶Ñ\8dÑ\8dнин Ñ\82Ñ\8bп Ð°Ð°Ð¿]] Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\81илеÑ\80, Ð°Ð·Ñ\8b\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ð¶Ñ\83Ñ\80налдаÑ\80 Ð°Ñ\80азÑ\8bнга Ð°Ð¹Ñ\8bÑ\82канÑ\8bн ÐºÓ©Ñ\80үп Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\81илеÑ\80]. Ð¨Ð°Ðº Ñ\8bндÑ\8bг Ñ\83к Ð°Ñ\80Ñ\8bн Ñ\87аÑ\8fаÑ\80 Ñ\87Ó©Ñ\88пÑ\8dÑ\8dÑ\80елиңеÑ\80 чок.",
+       "noarticletext-nopermission": "Ð\90мгÑ\8b Ò¯ÐµÐ´Ðµ Ð±Ð¾ Ð°Ñ\80Ñ\8bнда Ñ\81өзүглел Ñ\87ок. Ð£Ðº Ð°Ñ\82Ñ\82Ñ\8b Ó©Ñ\81ке Ð°Ñ\80Ñ\8bннаÑ\80дан Ñ\82Ñ\8bп Ð°Ð¿, Ð°Ð·Ñ\8b [[Special:Search/{{PAGENAME}}|аÑ\80Ñ\8bнÑ\8bңаÑ\80 Ð´Ñ\83гайÑ\8bнда Ó©Ñ\81ке Ñ\87үүлдеÑ\80ге Ð±Ð¸Ð¶Ñ\8dÑ\8dнин Ñ\82Ñ\8bп Ð°Ð¿]] Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\81илеÑ\80, Ð°Ð·Ñ\8b\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ð´ÐµÐ¿Ñ\82еÑ\80леÑ\80де Ñ\87огÑ\83Ñ\83Ñ\80 Ð±Ð¸Ð¶Ð¸ÐºÑ\82еÑ\80ни Ñ\82Ñ\8bп Ð°Ð¿ Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\81илеÑ\80]. Ð£Ðº Ð°Ñ\80Ñ\8bннÑ\8b ÐºÑ\8bлÑ\8bÑ\80 Ñ\87өпÑ\88Ñ\8dÑ\8dÑ\80ел Ñ\81илеÑ\80де чок.",
        "userpage-userdoesnotexist": "«<nowiki>$1</nowiki>» деп ажыглакчы is not registered.\nPlease check if you want to create/edit this page.",
        "userpage-userdoesnotexist-view": "«$1» деп ажыглакчы not registered.",
        "note": "'''Тайылбыр:'''",
        "editingcomment": "«$1» деп арынны өскертип турар (чаа салбыр)",
        "yourtext": "Силерниң сөзүглелиңер",
        "yourdiff": "Ылгалдар",
-       "templatesused": "Ð\91о Ð°Ñ\80Ñ\8bнда Ð°Ð¶Ñ\8bглаан {{PLURAL:$1|1=Ð\9cайÑ\8bк|Ð\9cайыктар}}:",
+       "templatesused": "Ð\91о Ð°Ñ\80Ñ\8bнда Ð°Ð¶Ñ\8bглап Ñ\82Ñ\83Ñ\80аÑ\80{{PLURAL:$1|1=майÑ\8bк|майыктар}}:",
        "template-protected": "(камгалаан)",
-       "template-semiprotected": "(Ñ\87еÑ\82пеÑ\81 ÐºÐ°Ð¼Ð³Ð°Ð»Ð°Ð°Ð½)",
-       "hiddencategories": "Бо арын {{PLURAL:$1|$1 чажыт бөлүкке}} хамааржыр:",
-       "permissionserrorstext-withaction": "Мында «'''$2'''» силерниң эргеңер чок, {{PLURAL:$1|1=чылдагааны|чылдагааннары}}:",
+       "template-semiprotected": "(Ñ\87аÑ\80Ñ\82Ñ\8bк-Ñ\87амдÑ\8bÑ\8bзÑ\8b ÐºÐ°Ð¼Ð³Ð°Ð»Ð°Ð»Ð´Ñ\8bг)",
+       "hiddencategories": "Бо арын{{PLURAL:$1|$1 көзүлбес категорияга|$1 көзүлбес категорияларга|1=бир көзүлбес категорияга}} хамааржыр:",
+       "permissionserrorstext-withaction": "{{PLURAL:$1|1=дараазында чылдагаан-биле|дараазында чылдагааннар-биле}} $2-ни ажыглаар эрге силерде чок:",
        "recreate-moveddeleted-warn": "'''Кичээңейлиг. Ооң мурнунда казыттынган арынны катап тургузар деп тур Силер.'''\n\nОл арынны катап тургузары шынап-ла чугула бе, боданыңар.\nБо адаанда ол арынның казыышкыннар болгаш өскээр адалгалар журналдарын көргүскен.",
        "moveddeleted-notice": "Бо арын ап каавыткан.\nАдаанда ап каавыткан биле өскээр адаан бижиктер шынзылгазын көргүскен.",
        "post-expand-template-inclusion-warning": "Сагындырыг: Кошкан майыктарның ниити хемчээли дендии улуг.\nЧамдык майыктар коштунмаан боор.",
        "currentrev-asof": "Амгы $1 үениң бижээни",
        "revisionasof": "$1 версиязы",
        "revision-info": "$2 киржикчиниң $1 хүнүнде киирилдези",
-       "previousrevision": "←Артык эрги үндүрери",
+       "previousrevision": "←Амдыы арын",
        "nextrevision": "Артык чаа үндүрери→",
        "currentrevisionlink": "Амгы үе үндүрери",
        "cur": "амгы",
        "next": "дараазында",
-       "last": "эрткен",
+       "last": "амдыы",
        "page_first": "бирги",
        "page_last": "сөөлгү",
        "histlegend": "Версиялар шилиири: деңнээр дээн арыныңар версияларын имнеңеш, бээр базыптыңар '''{{int:compare-submit}}'''.<br />\nТайылбыр: '''({{int:cur}})''' — амгы версиядан ылгавыр; '''({{int:last}})''' — эрткен версиядан ылгавыр;  '''{{int:minoreditletter}}''' — биче өскерилгелер.",
        "history-title": "«$1» деп арынның эдилге төөгүзү",
        "lineno": "Одуруг $1:",
        "compareselectedversions": "Шилип алган хевирлери деңнээри",
-       "editundo": "чөрчүүрү",
-       "searchresults": "ТүңнелдеÑ\80",
-       "searchresults-title": "«$1» Ð´ÐµÐ¿ Ð´Ð¸Ð»Ðµ",
-       "prevn": "эрткен {{PLURAL:$1|$1}}",
+       "editundo": "ойталаар",
+       "searchresults": "Ð\94илÑ\8dÑ\8dÑ\88кинниң Ñ\82үңнелдеÑ\80и",
+       "searchresults-title": "«$1» Ð´Ð¸Ð»Ñ\8dÑ\8dÑ\80",
+       "prevn": "амдыы {{PLURAL:$1|$1}}",
        "nextn": "дараазында {{PLURAL:$1|$1}}",
        "prevn-title": "Эрткен $1 {{PLURAL:$1|1=бижик|бижик}}",
        "nextn-title": "Дараазында $1 {{PLURAL:$1|1=бижик|бижик}}",
-       "shown-title": "Арынга $1 {{PLURAL:$1|түңнел}} көргүзер",
-       "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) көөрү",
+       "shown-title": "Арынга $1 {{PLURAL:$1|бижикти, бижиктерни, бижиктерин}} көргүзер",
+       "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) көөр",
        "searchmenu-exists": "'''Бо викиде \"[[:$1]]\" деп арын бар.'''",
-       "searchmenu-new": "'''Бо викиде «[[:$1]]» арынны чогаадыры'''",
+       "searchmenu-new": "Бо вики-төлевилелге «[[:$1]]» деп арынны кылыр.{{PLURAL:$2|0=|Ол ышкаш дилээшкиниңерниң түңнелинде тывылган арынны база көрүңер.|Ол ышкаш дилээшкиниңерниң түңнелдерин база көрүңер.}}",
        "searchprofile-articles": "үндезин арыннар",
        "searchprofile-images": "Мультимедиа",
-       "searchprofile-everything": "Ð\91үгүде",
-       "searchprofile-advanced": "Ð\9aалбайÑ\82Ñ\8bÑ\80",
+       "searchprofile-everything": "каÑ\8fа-даа",
+       "searchprofile-advanced": "Ð\94елгеÑ\80еңгей",
        "searchprofile-articles-tooltip": "$1 иштинден дилээри",
        "searchprofile-images-tooltip": "Файлдар дилээри",
-       "searchprofile-everything-tooltip": "Шупту арыннардан дилээри (сумележиишкиннерден база)",
+       "searchprofile-everything-tooltip": "Шупту арыннардан дилээр (сайгаржылга арыннарындан база)",
        "searchprofile-advanced-tooltip": "Айыткан аттар делгемнеринден дилээри",
-       "search-result-size": "$1 ({{PLURAL:$2|$2 сөс}})",
+       "search-result-size": "$1 ({{PLURAL:$2|$2 сөс|$2 сөстер|$2}})",
        "search-result-category-size": "{{PLURAL:$1|1=1 кежигүүн|$1 кежигүүн}} ({{PLURAL:$2|1=1 аңгылам|$2 аңгылам}}, {{PLURAL:$3|1=1 файл|$3 файл}})",
-       "search-redirect": "($1-н Ñ\88иглелге)",
+       "search-redirect": "($1-ден Ñ\8dде Ñ\87оÑ\80Ñ\83дÑ\83г)",
        "search-section": "(«$1» деп салбыр)",
        "search-suggest": "Силер «$1» деп бодадыңар чадавас",
        "search-interwiki-more": "(артык)",
        "searchrelated": "холбаалыг",
        "searchall": "шупту",
-       "search-nonefound": "Ð\90йÑ\8bÑ\82кан Ð½ÐµÐ³ÐµÐ»Ð´ÐµÐ½Ð¸Ò£ Ñ\82үңнели Ñ\87ок",
+       "search-nonefound": "Ð\90йÑ\8bÑ\82кан Ð½ÐµÐ³ÐµÐ»Ð´ÐµÐ³Ðµ Ð´Ò¯Ð³Ð¶Ò¯Ñ\80 Ñ\87Ò¯Ò¯-даа Ñ\82Ñ\8bвÑ\8bлбаан.",
        "powersearch-ns": "Аттар делгемнеринден дилээри:",
        "powersearch-toggleall": "Шупту",
        "preferences": "Шилилгелер",
        "right-createaccount": "Чаа бүрүткел бижиктерин бүдүрери",
        "right-move": "Арыннарны шимчээри",
        "right-movefile": "Файлдарны шимчээри",
+       "right-writeapi": "API-ни бижикке ажыглаары",
        "right-editusercssjs": "Өске ажыглакчыларның CSS база Javascript файлдарын өскертири.",
        "right-editusercss": "Өске ажыглакчыларның CSS файлдарын өскертири.",
        "right-edituserjs": "Өске ажыглакчыларның JavaScript файлдарын өскертири.",
-       "newuserlogpage": "Чаа Ð°Ð¶Ñ\8bглакÑ\87Ñ\8b ÐºÑ\8bÑ\80Ñ\8bнда Ð¶Ñ\83Ñ\80нал",
+       "newuserlogpage": "Ð\9aиÑ\80жикÑ\87илеÑ\80 Ð±Ò¯Ñ\80Ò¯Ñ\82кÑ\8dÑ\8dÑ\80 Ð´ÐµÐ¿Ñ\82еÑ\80",
        "action-read": "бо арынны номчууру",
        "action-edit": "бо арынның эдилгези",
        "action-createpage": "арыннарны чогаадыры",
        "action-movefile": "бо файлды шимчээри",
        "action-sendemail": "э-чагаалар чорудары",
        "nchanges": "$1 {{PLURAL:$1|өскерлиишкин}}",
-       "recentchanges": "Ð\90мгÑ\8b Ó©Ñ\81кеÑ\80лииÑ\88киннер",
-       "recentchanges-legend": "Ð\90мгÑ\8b Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80ниң Ñ\8dдиглеÑ\80и",
-       "recentchanges-summary": "Ð\91о Ð°Ð³Ñ\8bмда Ð²Ð¸ÐºÐ¸Ð½Ð¸Ò£ Ñ\81өөлгү Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80ин ÐºÓ©Ó©Ñ\80Ò¯.",
+       "recentchanges": "Чаа Ñ\8dдилгелер",
+       "recentchanges-legend": "Чаа Ñ\8dдилгелеÑ\80ни Ð°Ð°Ð¹Ð»Ð°Ð°Ñ\80",
+       "recentchanges-summary": "Ð\9cооң Ð°Ð´Ð°Ð°Ð½Ð´Ð° Ð°Ñ\80Ñ\8bннаÑ\80да Ñ\81өөлгү Ó©Ñ\81кеÑ\80илгелеÑ\80ни Ò¯Ðµ-Ñ\88ак Ð°Ð°Ð¹Ñ\8b-биле Ñ\87изелеп Ñ\87Ñ\8bÑ\81кааган.",
        "recentchanges-feed-description": "Бо агымда викиниң сөөлгү өскерлиишкиннерин көөрү.",
-       "recentchanges-label-newpage": "Бо өскерлиишкин чаа арынны чогааткан.",
-       "recentchanges-label-minor": "Ð\91о Ó©Ñ\81кеÑ\80лииÑ\88кин Ð±Ð¸Ñ\87ии",
+       "recentchanges-label-newpage": "Бо эдилге-биле чаа арын кылдынган.",
+       "recentchanges-label-minor": "УлÑ\83г Ñ\8dвеÑ\81 Ó©Ñ\81кеÑ\80Ñ\82илге-диÑ\80",
        "recentchanges-label-bot": "Бо эдилгени робот күүсеткен.",
-       "recentchanges-label-unpatrolled": "Бо өскертилге истетинмээн (патрульдаттынмаан)",
+       "recentchanges-label-unpatrolled": "Бо эдилгени кым-даа хайгаараваан",
        "recentchanges-label-plusminus": "Арынның сөзүглели бердинген түң байт-биле өскерилген",
-       "recentchanges-legend-newpage": "$1 — чаа арын",
+       "recentchanges-legend-newpage": " $1 — чаа арыннар даңзызы",
        "rcnotefrom": "<strong>$2</strong> үеде <strong>$1</strong> чедир өскертилгелерни санаан.",
-       "rclistfrom": "$3 $2 тура чаа өскерилгелерни көргүзер",
-       "rcshowhideminor": "Бичии өскерлиишкиннерни $1",
+       "rclistfrom": "$3 $2 тура өскерилгелерни көргүзер",
+       "rcshowhideminor": "$1 биче эдилгелер",
        "rcshowhideminor-show": "көргүзер",
        "rcshowhideminor-hide": "чажырар",
        "rcshowhidebots": "Роботтарны $1",
-       "rcshowhideliu": "Кирген киржикчилерни $1",
+       "rcshowhidebots-show": "Көргүзер",
+       "rcshowhideliu": "бүрүткеттинген киржикчилер $1",
        "rcshowhideliu-show": "көргүзер",
-       "rcshowhideliu-hide": "чажырар",
-       "rcshowhideanons": "Адыжок киржикчилерни $1",
+       "rcshowhideliu-hide": "Чажырар",
+       "rcshowhideanons": "Ады билдинмес киржикчилер $1",
        "rcshowhideanons-show": "көргүзер",
        "rcshowhideanons-hide": "чажырар",
        "rcshowhidepatr": "истээн өскерлиишкиннерни $1",
        "rcshowhidepatr-show": "көргүзер",
        "rcshowhidepatr-hide": "чажырар",
-       "rcshowhidemine": "Эдиглеримни $1",
+       "rcshowhidemine": "$1 боттуң эдилгелери",
        "rcshowhidemine-show": "көргүзер",
        "rcshowhidemine-hide": "чажырар",
-       "rclinks": "Сөөлгү $2 Ñ\85үн Ð¸Ñ\88Ñ\82инде Ð±Ð¾Ð»Ð³Ð°Ð½ $1 өскерлиишкиннерни көргүзер<br />$3",
+       "rclinks": "ЧооккÑ\83 $2 Ñ\85үн Ð¸Ñ\88Ñ\82инде Ñ\81өөлгү $1 өскерлиишкиннерни көргүзер<br />$3",
        "diff": "ылгал",
        "hist": "төөгү",
        "hide": "Чажырар",
        "newpageletter": "Ч",
        "boteditletter": "р",
        "number_of_watching_users_pageview": "[$1 хайгаараар {{PLURAL:$1|ажыглакчы}}]",
+       "rc-change-size-new": "Өскертилге соонда хемчээли:$1 {{PLURAL:$1|байт}}",
        "newsectionsummary": "/* $1 */ чаа салбыр",
        "rc-enhanced-expand": "Тодаларны көргүзери (JavaScript херек)",
        "rc-enhanced-hide": "Тодаларны чажырары",
-       "recentchangeslinked": "ХамааÑ\80Ñ\8bÑ\88кан өскерилгелер",
-       "recentchangeslinked-toolbox": "ХамааÑ\80Ñ\8bÑ\88кан өскерилгелер",
-       "recentchangeslinked-title": "«$1» деп арынга хамаарыштырган өскерлиишкиннер",
+       "recentchangeslinked": "ТÑ\83дÑ\83Ñ\88 өскерилгелер",
+       "recentchangeslinked-toolbox": "ТÑ\83дÑ\83Ñ\88 өскерилгелер",
+       "recentchangeslinked-title": "«$1» деп арынга кошкан эдилгелер",
        "recentchangeslinked-summary": "Айыткан арынның (азы айыткан аңгылалга хамаарышкан) шөлүлүглериниң чедер арыннарнының чаа өскерилгер даңзызы.\n[[Special:Watchlist|Силерниң хайгаарал даңзызынче]] кирип турар арыннарны '''ылгап каан'''.",
        "recentchangeslinked-page": "Арынның ады:",
-       "recentchangeslinked-to": "Ð\90йÑ\8bÑ\82кан Ð°Ñ\80Ñ\8bнÑ\87е Ñ\88өлүп Ñ\82Ñ\83Ñ\80аÑ\80 Ð°Ñ\80Ñ\8bннаÑ\80га өскерилгелерни көргүзер",
-       "upload": "Файл чүдүрер",
+       "recentchangeslinked-to": "Ð\90йÑ\8bÑ\82кан Ð°Ñ\80Ñ\8bнÑ\87е Ñ\88өлүп Ñ\82Ñ\83Ñ\80аÑ\80 Ð°Ñ\80Ñ\8bннаÑ\80да өскерилгелерни көргүзер",
+       "upload": "Файлды киир чүдүрер",
        "uploadbtn": "Файлды салыры",
        "uploadnologin": "Кирбес",
        "uploaderror": "Кииреринге алдаг",
        "upload-misc-error": "Билбес кииреринге алдаг",
        "http-read-error": "HTTP-биле номчуур алдаг.",
        "license": "Хоойлужудары:",
-       "license-header": "ХоойлÑ\83жÑ\83дары",
+       "license-header": "Ð\9bиÑ\86ензиÑ\8fлаары",
        "imgfile": "файл",
        "listfiles": "Файл даңзызы",
        "listfiles_name": "Ат",
        "listfiles_count": "Үндүрерилер",
        "file-anchor-link": "Файл",
        "filehist": "Файлдың төөгүзү",
-       "filehist-help": "Ð\9eл Ò¯ÐµÐ´Ðµ Ñ\84айлдÑ\8bÒ£ ÐºÓ©Ñ\81Ñ\82Ò¯Ñ\80үн ÐºÓ©Ó©Ñ\80де, Ð´Ð°Ñ\82а/үеже Ð±Ð°Ð·Ñ\8bпÑ\82Ñ\8bңар.",
+       "filehist-help": "Ð\90й-Ñ\85үн/үе-Ñ\88акÑ\87е Ð±Ð°Ð·Ñ\8bпкаÑ\88, Ñ\84айлдÑ\8bÒ£ Ñ\8bнÑ\87ан ÐºÐ°Ð½Ð´Ñ\8bг Ñ\82Ñ\83Ñ\80ганÑ\8bн ÐºÓ©Ñ\80үңер.",
        "filehist-deleteall": "шуптуну ырадыры",
        "filehist-deleteone": "ырадыры",
        "filehist-revert": "эгидип тургузары",
        "filehist-current": "амгы",
-       "filehist-datetime": "Ай, Хүн/Шак",
-       "filehist-thumb": "Ð\91иÑ\87ии Ñ\87Ñ\83Ñ\80Ñ\83мал",
-       "filehist-thumbtext": "$1 Ñ\85амааÑ\80жÑ\8bÑ\80 Ñ\85евиÑ\80иниң Ð±Ð¸Ñ\87е Ñ\87Ñ\83Ñ\80Ñ\83малÑ\8b (миниаÑ\82Ñ\8eÑ\80азÑ\8b)",
-       "filehist-user": "Ð\90жÑ\8bглакÑ\87Ñ\8b",
+       "filehist-datetime": "Ай-хүн/Үе-шак",
+       "filehist-thumb": "Ынай Ñ\87Ñ\83Ñ\80Ñ\83к",
+       "filehist-thumbtext": "$1 Ñ\8fнзÑ\8bзÑ\8bнга Ñ\8bнай Ñ\87Ñ\83Ñ\80Ñ\83к",
+       "filehist-user": "Ð\9aиÑ\80жикÑ\87и",
        "filehist-dimensions": "Хемчээлдери",
        "filehist-filesize": "Файл хемчээли",
        "filehist-comment": "Тайылбыр",
        "imagelinks": "Файлдың ажыглаашкыны",
-       "linkstoimage": "Ð\91еÑ\80динген Ñ\84айлÑ\87е Ð´Ð°Ñ\80аазÑ\8bнда {{PLURAL:$1|1=аÑ\80Ñ\8bн Ñ\88өлүдүп Ñ\82Ñ\83Ñ\80|$1 Ð°Ñ\80Ñ\8bн Ñ\88өлүдүп Ñ\82Ñ\83Ñ\80}}:",
+       "linkstoimage": "Ð\94аÑ\80аазÑ\8bнда {{PLURAL:$1|1=аÑ\80Ñ\8bн|$1 Ð°Ñ\80Ñ\8bннаÑ\80нÑ\8bÒ£ Ñ\88өлүлгези Ñ\84айл}}:",
        "nolinkstoimage": "Бердинген файлче шөлүп турар арыннар чок.",
-       "sharedupload-desc-here": "Моон $1 алган файл өске төлевилелдерге ажыглаттынып болур.\nОоң [$2 допчу тайылбыр арынындан] медеглели адаанда бердинген.",
+       "sharedupload-desc-here": "Моон $1 алган файл өске төлевилелдерге база ажыглаттынып болур.\nОоң [$2 тайылбыр арнындан] медээни адаанда киирген.",
+       "upload-disallowed-here": "Бо файлды эде бижидип шыдавас силер.",
        "filerevert": "$1 эгидип тургузары",
        "filerevert-legend": "Файлды эгидип тургузары",
        "filerevert-comment": "Чылдагаан:",
        "unwatchedpages": "Хайгаарабас арыннар",
        "unusedtemplates": "Ажыглаан эвес майыктар",
        "unusedtemplateswlh": "өске холбаалар",
-       "randompage": "Душ арын",
+       "randompage": "Дужа-келби таварышкан арын",
        "statistics": "Статистика",
        "statistics-pages": "Арыннар",
        "brokenredirects-edit": "өскертири",
        "nbytes": "$1 {{PLURAL:$1|байт}}",
        "ncategories": "$1 {{PLURAL:$1|аңгылал}}",
        "nlinks": "$1 {{PLURAL:$1|холбаа}}",
-       "nmembers": "$1 {{PLURAL:$1|кежигүн}}",
+       "nmembers": "$1 {{PLURAL:$1|кежигүн|кежигүннер}}",
        "nrevisions": "$1 {{PLURAL:$1|үндүрери}}",
        "specialpage-empty": "Бо илеткелдиң түңнели чок.",
        "lonelypages": "Чааскаан арыннар",
        "move": "Шимчээри",
        "movethispage": "Бо арынны шимчээри",
        "pager-newer-n": "{{PLURAL:$1|артык чаа}}",
-       "pager-older-n": "{{PLURAL:$1|аÑ\80Ñ\82Ñ\8bк Ñ\8dÑ\81ки}}",
+       "pager-older-n": "{{PLURAL:$1|аÑ\80Ñ\82Ñ\8bк Ñ\8dÑ\80ги}}",
        "booksources": "Номнарның үнген дөзү",
        "booksources-search-legend": "Номнуң медээлерин дилээри",
        "specialloguserlabel": "Күүседикчи:",
        "speciallogtitlelabel": "Target (aтка азы ажыглакчыга):",
-       "log": "Ð\96Ñ\83Ñ\80налдар",
+       "log": "Ð\94епÑ\82еÑ\80лер",
        "allpages": "Шупту арыннар",
        "nextpage": "Дараазында арын ($1)",
        "prevpage": "Эрткен арын ($1)",
        "allarticles": "Шупту арыннар",
-       "allpagessubmit": "Ð\9aÒ¯Ò¯cедиÑ\80и",
+       "allpagessubmit": "Че-ве",
        "categories": "Аңгылалдар",
        "sp-deletedcontributions-contribs": "дадывыр",
        "linksearch": "Даштыкы холбааларга дилээри",
        "namespace": "Аттар делгеми:",
        "invert": "Шилээнин аңдарар. (Обратить выбранное)",
        "blanknamespace": "(Кол)",
-       "contributions": "{{GENDER:$1|Ð\90жÑ\8bглакÑ\87Ñ\8bнÑ\8bÒ£}} Ñ\81алÑ\8bÑ\8bÑ\88кÑ\8bннаÑ\80Ñ\8b",
+       "contributions": "{{GENDER:$1|киÑ\80жикÑ\87иниң}} Ò¯Ð»Ò¯Ò¯",
        "contributions-title": "«$1» деп ажыглакчының салыышкыннары",
        "mycontris": "Дадывыр",
        "contribsub2": "$1 ($2)",
        "isredirect": "шиглидер арын",
        "istemplate": "киирткен арыннар",
        "isimage": "файлдың холбаазы",
-       "whatlinkshere-prev": "{{PLURAL:$1|1=эрткен|эрткен $1}}",
+       "whatlinkshere-prev": "{{PLURAL:$1|1= амдыы|амдыы $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|1=дараазында|дараазында $1}}",
        "whatlinkshere-links": "← холбаалар",
        "whatlinkshere-hideredirs": "$1-че шиглиглер",
        "blocklist-reason": "Чылдагаан",
        "ipblocklist-submit": "Дилээр",
        "infiniteblock": "кезээ-мөңгеде",
-       "blocklink": "кÑ\8bзÑ\8bгааÑ\80лааÑ\80Ñ\8b",
+       "blocklink": "доÑ\81Ñ\82Ñ\83Ñ\80аÑ\80",
        "unblocklink": "ажыдып хостаар",
        "change-blocklink": "кызыгаарлаашкынны өскертири",
-       "contribslink": "дадывыр",
+       "contribslink": "үлүг",
        "blocklogpage": "Кызыгаарлаашкынның журналы",
        "blocklogentry": ", [[$1]] $2 дургузунда кызыгаарлаттынган: $3",
        "block-log-flags-anononly": "чүгле адыжок киржикчилер",
        "unlockbtn": "Медээ шыгжамырын ажыттынар",
        "move-page": "«$1» деп арынны шимчээри",
        "move-page-legend": "Арынны шимчээр",
-       "movearticle": "Бо арынны шимчээри:",
        "newtitle": "Чаа ат:",
        "move-watch": "Бо арынны хайгаараары",
        "movepagebtn": "Арынны шимчээри",
        "tooltip-pt-preferences": "Силерниң шилилгеңер",
        "tooltip-pt-watchlist": "Карактап (хынап) турар өскертилгелерге хамааржыр арыннарның даңзызы",
        "tooltip-pt-mycontris": "Силерниң салыышкыннарыңарның даңзызы",
-       "tooltip-pt-login": "Ð\9cаңаа Ñ\81иÑ\81Ñ\82емаже ÐºÐ¸Ð¸Ñ\80 Ð±Ò¯Ñ\80Ò¯Ñ\82кенип Ð±Ð¾Ð»Ñ\83Ñ\80, Ñ\8bнÑ\87алза-даа Ð¾Ð» албан эвес.",
+       "tooltip-pt-login": "Ð\9cаңаа Ñ\81иÑ\81Ñ\82емага Ð±Ò¯Ñ\80Ò¯Ñ\82кедип Ð°Ð¿ Ð±Ð¾Ð»Ñ\83Ñ\80, Ñ\87огÑ\83м албан эвес.",
        "tooltip-pt-logout": "Үнери",
-       "tooltip-ca-talk": "Бо арын дугайында чыгаалажыры",
-       "tooltip-ca-edit": "Ук арынны эдип болур силер. Эдилгеңер бижидерин бертинде чижеглей көөрүн утпаңар.",
-       "tooltip-ca-addsection": "Чаа салбыр чаяар",
-       "tooltip-ca-viewsource": "Бо арын камгалаттырган.\nДөзү кодун көрүп болур силер.",
-       "tooltip-ca-history": "Арынның мурнуку өскерлиишкиннери",
+       "tooltip-pt-createaccount": "Албан эвес-даа болза, бүрүткел бижикти кылгаш, системаже кирерин силерге саналдап тур бис.",
+       "tooltip-ca-talk": "Кол арынны сайгарары",
+       "tooltip-ca-edit": "Бо арынны эдер",
+       "tooltip-ca-addsection": "Чаа салбыр кылыр",
+       "tooltip-ca-viewsource": "Бо арынны өскертилгелерден камгалап каан, чогум ону көрүп, ооң үндезин кодун хоолгалап ап болур силер.",
+       "tooltip-ca-history": "Арынның өскерлиишкиннериниң дептери",
        "tooltip-ca-protect": "Бо арынны камгалаары",
        "tooltip-ca-delete": "Бо арынны ырадыры",
        "tooltip-ca-move": "Бо арынны шимчээри",
-       "tooltip-ca-watch": "СилеÑ\80ниң Ñ\85айгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bзÑ\8bнга Ð±Ð¾ Ð°Ñ\80Ñ\8bннÑ\8b Ð½ÐµÐ¼ÐµÑ\80елÑ\8dÑ\8dÑ\80и",
+       "tooltip-ca-watch": "Ð\91о Ð°Ñ\80Ñ\8bннÑ\8b Ñ\85айгааÑ\80алÑ\8bңаÑ\80 Ð´Ð°Ò£Ð·Ñ\8bзÑ\8bнÑ\87е Ð½ÐµÐ¼Ñ\8dÑ\8dÑ\80",
        "tooltip-ca-unwatch": "Силерниң хайгаарал даңзызындан бо арынны ырадыры",
-       "tooltip-search": "{{grammar:locative|{{SITENAME}}}} дилээри",
-       "tooltip-search-go": "Шак Ñ\8bндÑ\8bг Ð°Ñ\82Ñ\82Ñ\8bг Ð°Ñ\80Ñ\8bнÑ\87е Ñ\89илчиир",
-       "tooltip-search-fulltext": "Ð\91о Ð±Ð¸Ð¶Ð¸ÐºÐµ Ð°Ñ\80Ñ\8bннаÑ\80дан Ð´Ð¸Ð»Ñ\8dÑ\8dÑ\80и",
-       "tooltip-p-logo": "Ð\9aол Ð\90Ñ\80Ñ\8bн",
-       "tooltip-n-mainpage": "Ð\9aол Ð\90рынче шилчиир",
-       "tooltip-n-mainpage-description": "Ð\9aол Ð\90Ñ\80Ñ\8bнÑ\87е ÐºÐ¸Ñ\80еÑ\80и",
-       "tooltip-n-portal": "Төлевилел Ð´Ñ\8bгайÑ\8bнда, Ñ\87үнү ÐºÑ\8bлÑ\8bп Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\81илеÑ\80, ÐºÐ°Ð¹Ð´Ð° Ñ\87Ò¯Ò¯ Ñ\87Ñ\8bдарыл",
-       "tooltip-n-currentevents": "Ам болуп турар таварылгалар даңзызы",
-       "tooltip-n-recentchanges": "Ð\92икиниң Ñ\8dниÑ\80 Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80и",
-       "tooltip-n-randompage": "Душ арынны көөрү",
-       "tooltip-n-help": "Төлевилелдиң Ñ\82айÑ\8bлбÑ\8bÑ\80Ñ\8b Â«{{SITENAME}}»",
-       "tooltip-t-whatlinkshere": "Ð\91үгү Ð¼Ð°Ò£Ð°Ð° Ñ\88өлүÑ\82ген Ð²Ð¸ÐºÐ¸ арыннарның даңзызы",
-       "tooltip-t-recentchangeslinked": "Бо арындан шөлүткен өске арыннарның сөөлгү өскерлиишкиннери",
+       "tooltip-search": "{{grammar:locative|{{SITENAME}}}} дилээр",
+       "tooltip-search-go": "Шак Ñ\8bндÑ\8bг Ð°Ñ\82Ñ\82Ñ\8bг Ð°Ñ\80Ñ\8bнÑ\87е Ñ\88илчиир",
+       "tooltip-search-fulltext": "Ð\90йÑ\8bÑ\82Ñ\82Ñ\8bнган Ñ\81өзүглелдиг Ð°Ñ\80Ñ\8bннаÑ\80нÑ\8b Ð´Ð¸Ð»Ñ\8dÑ\8dÑ\80",
+       "tooltip-p-logo": "Ð\9aол Ð°Ñ\80Ñ\8bнÑ\87е ÐºÐ¸Ñ\80еÑ\80",
+       "tooltip-n-mainpage": "Ð\9aол Ð°рынче шилчиир",
+       "tooltip-n-mainpage-description": "Ð\9aол Ð°Ñ\80Ñ\8bнÑ\87е ÐºÐ¸Ñ\80еÑ\80",
+       "tooltip-n-portal": "Төлевилел Ð´Ñ\83гайÑ\8bнда, Ð¼Ð°Ò£Ð°Ð°  Ñ\87үнү ÐºÑ\8bлÑ\8bп Ð±Ð¾Ð»Ñ\83Ñ\80Ñ\83л, Ð¾Ð» Ñ\8bÑ\88каÑ\88 ÐºÐ°Ð¹Ð´Ð° Ñ\87Ò¯Ò¯ Ð±арыл",
+       "tooltip-n-currentevents": "Амгы болуушкуннар дугайында медээ",
+       "tooltip-n-recentchanges": "Ð\92икиниң Ñ\81өөлгү Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80 Ð´Ð°Ò£Ð·Ñ\8bзÑ\8b",
+       "tooltip-n-randompage": "Дужа-келби таварышкан арынны көөр",
+       "tooltip-n-help": "ШÑ\8bнзÑ\8bлга Ð°Ð¿ Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\87еÑ\80",
+       "tooltip-t-whatlinkshere": "Ук Ð°Ñ\80Ñ\8bнÑ\87е Ñ\88өлүлгелиг Ñ\88Ñ\83пÑ\82Ñ\83 арыннарның даңзызы",
+       "tooltip-t-recentchangeslinked": "Бо арындан шөлүлгелиг арыннарында сөөлгү өскерилгелер",
        "tooltip-feed-rss": "Бо арының РСС медээ агымы",
        "tooltip-feed-atom": "Бо арының Атом медээ агымы",
        "tooltip-t-contributions": "Бо ажыглакчының салыышкыннарының даңзазын көөрү.",
        "tooltip-t-emailuser": "Бо ажыглакчыга э-чагааны чорудаары",
-       "tooltip-t-upload": "Файлдарны киирери",
-       "tooltip-t-specialpages": "ШÑ\83пÑ\82Ñ\83 Ñ\82Ñ\83Ñ\81кай арыннар даңзызы",
-       "tooltip-t-print": "Бо арынның парлаттынар хевири",
-       "tooltip-t-permalink": "Ук арынның амгы янзызының турум айтыы",
-       "tooltip-ca-nstab-main": "Ð\94опÑ\87Ñ\8b Ð°Ñ\80Ñ\8bнÑ\8bн ÐºÓ©Ó©Ñ\80Ò¯",
+       "tooltip-t-upload": "Файлдарны киир чүдүрери",
+       "tooltip-t-specialpages": "Ð\90лбан-Ñ\85аакÑ\87Ñ\8bÑ\82 арыннар даңзызы",
+       "tooltip-t-print": "Бо арынның парлап үндүрер янзызы",
+       "tooltip-t-permalink": "Ук арынның амгы янзызының доктаамал шөлүлгези",
+       "tooltip-ca-nstab-main": "Ð\9aол Ð°Ñ\80Ñ\8bннÑ\8b ÐºÓ©Ó©Ñ\80",
        "tooltip-ca-nstab-user": "Ажыглакчының арынын көөрү",
        "tooltip-ca-nstab-media": "Медиа арынын көөрү",
-       "tooltip-ca-nstab-special": "Ð\91о Ð±Ó©Ð»Ð³Ñ\8dÑ\8dÑ\82 Ð°Ñ\80Ñ\8bн-дÑ\8bÑ\80 (Ñ\81лÑ\83жебнаÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а), Ð¾Ð¾Ò£ эдери болдунмас.",
+       "tooltip-ca-nstab-special": "Ð\91о Ð°Ð»Ð±Ð°Ð½-Ñ\85аакÑ\87Ñ\8bÑ\82 Ð°Ñ\80Ñ\8bн-дÑ\8bÑ\80, Ð¾Ð½Ñ\83 эдери болдунмас.",
        "tooltip-ca-nstab-project": "Төлевилелдиң арынын көөрү",
-       "tooltip-ca-nstab-image": "Файлдың арынын көөрү",
+       "tooltip-ca-nstab-image": "Файлдың арны",
        "tooltip-ca-nstab-template": "Майыкты көөрү",
        "tooltip-ca-nstab-help": "Дуза арынын көөрү",
-       "tooltip-ca-nstab-category": "Ð\90ңгÑ\8bлалдÑ\8bÒ£ Ð°Ñ\80Ñ\8bнÑ\8bн ÐºÓ©Ó©Ñ\80Ò¯",
+       "tooltip-ca-nstab-category": "Ð\9aаÑ\82егоÑ\80иÑ\8f Ð°Ñ\80нÑ\8b",
        "tooltip-minoredit": "Бо өскертилгени \"биче\" деп демдеглээр",
-       "tooltip-save": "СилеÑ\80ниң Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80иңеÑ\80ни Ñ\88Ñ\8bгжааÑ\80Ñ\8b",
-       "tooltip-preview": "ШÑ\8bгжааÑ\80 Ð¼Ñ\83Ñ\80нÑ\83нда Ñ\81илеÑ\80ниң Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80ин Ñ\87ижеглеп ÐºÓ©Ñ\80ем!",
-       "tooltip-diff": "Бо сөзүглелге хамаарыштыр кандыг өскертилгелерни кылган Силер - ону көргүзер.",
+       "tooltip-save": "ЭдилгелеÑ\80иңеÑ\80ни Ñ\88Ñ\8bгжап Ð°Ñ\80Ñ\82Ñ\82Ñ\8bÑ\80аÑ\80",
+       "tooltip-preview": "Ð\90Ñ\80Ñ\8bннÑ\8bÒ£ Ñ\87ижек ÐºÓ©Ñ\80үлдези: Ñ\88Ñ\8bгжааÑ\80 Ð±ÐµÑ\82инде Ð¾Ð½Ñ\83 Ð°Ð¶Ñ\8bглааÑ\80 Ñ\81илеÑ\80!",
+       "tooltip-diff": "Үндезин сөзүглелге хамаарыштыр кылдынган өскерлиишкиннерни көргүзер.",
        "tooltip-compareselectedversions": "Бо арынның шилиттинген ийи хевиринниң ылгалын көөр.",
        "tooltip-watch": "Силерниң хайгаарал даңзызынга бо арынны немерелээри",
        "tooltip-rollback": "Сөөлгү киржикчиниң өскерилгелерин чаңгыс баскаш, ойталаар",
        "tooltip-undo": "Киирген эдигни казааш, ойталалдың чылдагаанын айтыр аргалыг мурнай көргүзүүн көргүзер.",
-       "tooltip-summary": "Кысказы-биле бижиңер",
+       "tooltip-summary": "Кыска тайылбырны киириңер",
        "anonymous": "{{grammar:genitive|{{SITENAME}}}} адыжок {{PLURAL:$1|киржикчизи}}",
+       "simpleantispam-label": "Спам-га удур хыналда.\nМону <strong>долдуруңар </strong>долдурбаңар",
        "pageinfo-title": "«$1» дугайында",
        "pageinfo-header-basic": "Кол медээлел",
        "pageinfo-toolboxlink": "Арын дугайында",
        "file-info-size-pages": "$1 × $2 пикcелдер, файл хемчээли: $3, MIME хевири: $4, $5 {{PLURAL:$5|1=арын|арын}}",
        "file-nohires": "Оон улуг хевири чок",
        "svg-long-desc": "SVG файл, $1 x $2 пиксел, файл хемчээли: $3",
-       "show-big-image": "Улуг чурумал",
+       "show-big-image": "Үндезин файл",
        "show-big-image-size": "$1 × $2 пиксел",
        "newimages-legend": "Шүүрү",
        "noimages": "Nothing to see.",
        "ago": "$1 бурунгаар",
        "bad_image_list": "Формады мындыг боор ужурлуг:\n\nЧүгле даңзының идегеттери (элементилери) санатынар боор (* деп демдектен эгелээн одуруглар).\nОдуругнуң бирги шөлүдүү салдынмас чурумалче шөлүдүг болуру албан.\nОл-ла одуругнуң арткан шөлүдүглери онзагай кылдыр азы чурумал капсырып болур чүүлдер кылдыр санаттынар.",
        "metadata": "Чурумал дугайында медээлер",
-       "metadata-help": "Бо файл немелде данныйларлыг:санныг камералар азы сканнерлер дугайында медеглел. Файл чаяанының соонда эдидип турган болза, чамдык параметрлери амгы чурумалга меге кылдыр хамааржып болур.",
+       "metadata-help": "Бо файлда цифралыг камераларның болгаш сканерлерниң немеп каары немелде медээлер бар. Файлды кылган соонда эдип турган болза, ооң чамдык параметрлери ооң амгы чуруунга дүүшпес бооп болур.",
        "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-orientation": "Кадрның ориентациязы",
+       "exif-xresolution": "доора разрешение",
+       "exif-yresolution": "узун дургаар разрешение",
+       "exif-datetime": "Файлды өскерткен ай-хүн, үе-шак",
        "exif-imagedescription": "Чурумалдың ады",
+       "exif-make": "Камераның бүдүрүкчүзү",
+       "exif-model": "Камераның модели",
        "exif-artist": "Чогаадыкчы",
+       "exif-colorspace": "Өңнер девискээри",
        "exif-usercomment": "Ажыглакчының тайылбырлары",
+       "exif-datetimeoriginal": "Шын ай-хүн болгаш үе-шак",
        "exif-jpegfilecomment": "JPEG фалй тайылбыры",
        "exif-headline": "Баш ат",
        "exif-languagecode": "Дыл",
        "compare-submit": "Дөмейлээри",
        "htmlform-submit": "Күүcедири",
        "htmlform-selectorother-other": "Өске",
+       "logentry-delete-delete": "$1 {{GENDER:$2|арынны баладып каапкан}} $3",
        "rightsnone": "(чок)",
        "feedback-cancel": "Соксаары",
        "feedback-message": "Чагаа:",
        "feedback-subject": "Кол сөс:",
-       "searchsuggest-search": "Ð\94илÑ\8dÑ\8dÑ\88кин",
+       "searchsuggest-search": "Ð\94илÑ\8dÑ\8dÑ\80",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунда}}",
        "duration-minutes": "$1 {{PLURAL:$1|минут|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|шак|шак}}",
index 0592cb5..7d705e2 100644 (file)
        "enhancedrc-history": "tarix",
        "recentchanges": "Yangi oʻzgarishlar",
        "recentchanges-legend": "Yangi oʻzgarishlar moslamalari",
-       "recentchanges-summary": "Bu sahifada siz {{SITENAME}}da sodir boʻlgan soʻnggi oʻzgarishlarni koʻrishingiz mumkin.",
+       "recentchanges-summary": "Bu sahifada {{SITENAME}} loyihasida sodir boʻlgan soʻnggi oʻzgarishlarni koʻrishingiz mumkin.",
        "recentchanges-noresult": "Koʻrsatilgan muddatga va shartlarga oid oʻzgarishlar topilmadi.",
        "recentchanges-feed-description": "Vikida mazkur oqimdagi oxirgi oʻzgarishlarni kuzatish",
        "recentchanges-label-newpage": "Bu tahrir orqali yangi sahifa yaratilgan",
        "undeleteinvert": "Tanlash tartibini almashtirish",
        "undeletecomment": "Sababi:",
        "undeletedrevisions": "{{PLURAL:$1|1 ta oʻzgarish|$1 ta tahrirlar}} tiklandi",
-       "undeletedfiles": "$1 ta fayl tiklandi",
+       "undeletedfiles": "{{PLURAL:$1|Bitta fayl|$1 ta fayl}} tiklandi",
        "undelete-search-title": "O'chirilgan sahifalarni qidirish",
        "undelete-search-box": "O'chirilgan sahifalarni qidirish",
        "undelete-search-prefix": "Bundan boshlangan sahifalarni koʻrsatish:",
index 0ed584c..0562333 100644 (file)
@@ -899,11 +899,9 @@ class TextPassDumper extends BackupDumper {
                        } elseif ( $this->state == "page" ) {
                                $this->thisPage .= $data;
                        }
-               }
-               elseif ( $this->lastName == "model" ) {
+               } elseif ( $this->lastName == "model" ) {
                        $this->thisRevModel .= $data;
-               }
-               elseif ( $this->lastName == "format" ) {
+               } elseif ( $this->lastName == "format" ) {
                        $this->thisRevFormat .= $data;
                }
 
index c2b45a8..2cd688e 100644 (file)
@@ -19,6 +19,8 @@
        "ooui-dialog-process-dismiss": "Փակել",
        "ooui-dialog-process-retry": "Կրկին փորձել",
        "ooui-dialog-process-continue": "Շարունակել",
+       "ooui-selectfile-button-select": "Ընտրել նիշք",
        "ooui-selectfile-not-supported": "Ֆայլի ընտրությունը չի պաշտպանվում",
-       "ooui-selectfile-placeholder": "Ֆայլն ընտրված չէ"
+       "ooui-selectfile-placeholder": "Ֆայլն ընտրված չէ",
+       "ooui-selectfile-dragdrop-placeholder": "Ֆայլը գցել այստե"
 }
index 677b1c3..1024d2a 100644 (file)
@@ -4,14 +4,15 @@
                        "Gleki",
                        "NoiX180",
                        "Pras",
-                       "Jadinegara"
+                       "Jadinegara",
+                       "Meursault2004"
                ]
        },
        "ooui-outline-control-move-down": "Pindhahaken butir mangandhap",
-       "ooui-outline-control-move-up": "Pindhah kara mêndhuwur",
+       "ooui-outline-control-move-up": "Pindhah kara menyang dhuwur",
        "ooui-outline-control-remove": "Busak kara",
-       "ooui-toolbar-more": "Mênèh",
-       "ooui-toolgroup-expand": "Mênèh",
+       "ooui-toolbar-more": "Manèh",
+       "ooui-toolgroup-expand": "Manèh",
        "ooui-toolgroup-collapse": "Suda",
        "ooui-dialog-message-accept": "Oké",
        "ooui-dialog-message-reject": "Batal",
@@ -19,6 +20,6 @@
        "ooui-dialog-process-dismiss": "Tutup",
        "ooui-dialog-process-retry": "Jajal manèh",
        "ooui-dialog-process-continue": "Tutug",
-       "ooui-selectfile-not-supported": "Pilihan bêrkas ora disokong",
-       "ooui-selectfile-placeholder": "Ora ana bêrkas sing kapilih"
+       "ooui-selectfile-not-supported": "Pilihan berkas ora disokong",
+       "ooui-selectfile-placeholder": "Ora ana berkas sing kapilih"
 }
index 39bc670..fad4c1c 100644 (file)
@@ -23,6 +23,7 @@
        "ooui-dialog-process-retry": "Nach eng Kéier probéieren",
        "ooui-dialog-process-continue": "Virufueren",
        "ooui-selectfile-button-select": "E Fichier eraussichen",
+       "ooui-selectfile-not-supported": "D'Eraussiche vu Fichiere gëtt net ënnerstëtzt.",
        "ooui-selectfile-placeholder": "Et ass kee Fichier erausgesicht",
        "ooui-selectfile-dragdrop-placeholder": "Fichier hei ofleeën"
 }
index fbd22d0..86c6d64 100644 (file)
@@ -9,7 +9,7 @@
        },
        "ooui-outline-control-move-down": "Perkelti elementą žemyn",
        "ooui-outline-control-move-up": "Perkelti elementą aukštyn",
-       "ooui-outline-control-remove": "Šalinti elementus",
+       "ooui-outline-control-remove": "Šalinti įrašą",
        "ooui-toolbar-more": "Daugiau",
        "ooui-toolgroup-expand": "Daugiau",
        "ooui-toolgroup-collapse": "Mažiau",
index bcc31e0..fc29962 100644 (file)
@@ -26,6 +26,8 @@
        "ooui-dialog-process-dismiss": "Dispensar",
        "ooui-dialog-process-retry": "Tentar novamente",
        "ooui-dialog-process-continue": "Continuar",
+       "ooui-selectfile-button-select": "Selecionar um arquivo",
        "ooui-selectfile-not-supported": "O selecionamento de arquivos não é suportado",
-       "ooui-selectfile-placeholder": "Nenhum arquivo selecionado"
+       "ooui-selectfile-placeholder": "Nenhum arquivo selecionado",
+       "ooui-selectfile-dragdrop-placeholder": "Arraste o arquivo para cá"
 }
index 131413e..9abc847 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.13.0
+ * OOjs UI v0.13.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-27T17:53:00Z
+ * Date: 2015-11-03T21:42:28Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
 .oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
        background-color: transparent;
 }
-.oo-ui-textInputWidget-icon {
-       width: 2em;
-}
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
        outline: none;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
        width: 1.875em;
+       max-height: 2.375em;
        margin-left: 0.3em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement input,
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
        width: 0.9375em;
+       max-height: 2.375em;
        margin-right: 0.775em;
 }
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
index 3158bfe..00a0966 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.13.0
+ * OOjs UI v0.13.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-27T17:52:51Z
+ * Date: 2015-11-03T21:42:20Z
  */
 /**
  * @class
index 96ba45c..fdb06e5 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.13.0
+ * OOjs UI v0.13.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-27T17:53:00Z
+ * Date: 2015-11-03T21:42:28Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
 .oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
        background-color: transparent;
 }
-.oo-ui-textInputWidget-icon {
-       width: 2em;
-}
 .oo-ui-textInputWidget.oo-ui-widget-enabled input,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea {
        -webkit-transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
 .oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
        left: 0;
        width: 1.875em;
+       max-height: 2.375em;
        margin-left: 0.5em;
        height: 100%;
        background-position: right center;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
        width: 0.9375em;
+       max-height: 2.375em;
        margin: 0 0.775em;
        height: 100%;
 }
        margin-right: 2.0875em;
 }
 .oo-ui-textInputWidget-labelPosition-before.oo-ui-iconElement > .oo-ui-labelElement-label {
-       margin-right: 2.475em;
+       margin-left: 2.475em;
 }
 .oo-ui-menuSelectWidget {
        position: absolute;
index 95e8b47..d9a17a2 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.13.0
+ * OOjs UI v0.13.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-27T17:52:51Z
+ * Date: 2015-11-03T21:42:20Z
  */
 /**
  * @class
index fbffe09..b4dc48c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.13.0
+ * OOjs UI v0.13.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-27T17:52:51Z
+ * Date: 2015-11-03T21:42:20Z
  */
 ( function ( OO ) {
 
@@ -1289,17 +1289,25 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
                        }
                }
        } );
+       // allow widgets to reuse parts of the DOM
+       data = cls.static.reusePreInfuseDOM( $elem[ 0 ], data );
        // pick up dynamic state, like focus, value of form inputs, scroll position, etc.
-       state = cls.static.gatherPreInfuseState( $elem, data );
+       state = cls.static.gatherPreInfuseState( $elem[ 0 ], data );
+       // rebuild widget
        // jscs:disable requireCapitalizedConstructors
-       obj = new cls( data ); // rebuild widget
+       obj = new cls( data );
+       // jscs:enable requireCapitalizedConstructors
        // now replace old DOM with this new DOM.
        if ( top ) {
-               $elem.replaceWith( obj.$element );
-               // This element is now gone from the DOM, but if anyone is holding a reference to it,
-               // let's allow them to OO.ui.infuse() it and do what they expect (T105828).
-               // Do not use jQuery.data(), as using it on detached nodes leaks memory in 1.x line by design.
-               $elem[ 0 ].oouiInfused = obj;
+               // An efficient constructor might be able to reuse the entire DOM tree of the original element,
+               // so only mutate the DOM if we need to.
+               if ( $elem[ 0 ] !== obj.$element[ 0 ] ) {
+                       $elem.replaceWith( obj.$element );
+                       // This element is now gone from the DOM, but if anyone is holding a reference to it,
+                       // let's allow them to OO.ui.infuse() it and do what they expect (T105828).
+                       // Do not use jQuery.data(), as using it on detached nodes leaks memory in 1.x line by design.
+                       $elem[ 0 ].oouiInfused = obj;
+               }
                top.resolve();
        }
        obj.$element.data( 'ooui-infused', obj );
@@ -1310,6 +1318,22 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
        return obj;
 };
 
+/**
+ * Pick out parts of `node`'s DOM to be reused when infusing a widget.
+ *
+ * This method **must not** make any changes to the DOM, only find interesting pieces and add them
+ * to `config` (which should then be returned). Actual DOM juggling should then be done by the
+ * constructor, which will be given the enhanced config.
+ *
+ * @protected
+ * @param {HTMLElement} node
+ * @param {Object} config
+ * @return {Object}
+ */
+OO.ui.Element.static.reusePreInfuseDOM = function ( node, config ) {
+       return config;
+};
+
 /**
  * Gather the dynamic state (focus, value of form inputs, scroll position, etc.) of a HTML DOM node
  * (and its children) that represent an Element of the same class and the given configuration,
@@ -9021,7 +9045,7 @@ OO.ui.ProcessDialog.prototype.getTeardownProcess = function ( data ) {
  * @throws {Error} An error is thrown if no widget is specified
  */
 OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
-       var hasInputWidget, div, i;
+       var hasInputWidget, div;
 
        // Allow passing positional parameters inside the config object
        if ( OO.isPlainObject( fieldWidget ) && config === undefined ) {
@@ -9048,8 +9072,8 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
 
        // Properties
        this.fieldWidget = fieldWidget;
-       this.errors = config.errors || [];
-       this.notices = config.notices || [];
+       this.errors = [];
+       this.notices = [];
        this.$field = $( '<div>' );
        this.$messages = $( '<ul>' );
        this.$body = $( '<' + ( hasInputWidget ? 'label' : 'div' ) + '>' );
@@ -9085,9 +9109,6 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        this.$element
                .addClass( 'oo-ui-fieldLayout' )
                .append( this.$help, this.$body );
-       if ( this.errors.length || this.notices.length ) {
-               this.$element.append( this.$messages );
-       }
        this.$body.addClass( 'oo-ui-fieldLayout-body' );
        this.$messages.addClass( 'oo-ui-fieldLayout-messages' );
        this.$field
@@ -9095,13 +9116,8 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
                .toggleClass( 'oo-ui-fieldLayout-disable', this.fieldWidget.isDisabled() )
                .append( this.fieldWidget.$element );
 
-       for ( i = 0; i < this.notices.length; i++ ) {
-               this.$messages.append( this.makeMessage( 'notice', this.notices[ i ] ) );
-       }
-       for ( i = 0; i < this.errors.length; i++ ) {
-               this.$messages.append( this.makeMessage( 'error', this.errors[ i ] ) );
-       }
-
+       this.setErrors( config.errors || [] );
+       this.setNotices( config.notices || [] );
        this.setAlignment( config.align );
 };
 
@@ -9144,6 +9160,7 @@ OO.ui.FieldLayout.prototype.getField = function () {
 };
 
 /**
+ * @protected
  * @param {string} kind 'error' or 'notice'
  * @param {string|OO.ui.HtmlSnippet} text
  * @return {jQuery}
@@ -9199,6 +9216,56 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
        return this;
 };
 
+/**
+ * Set the list of error messages.
+ *
+ * @param {Array} errors Error messages about the widget, which will be displayed below the widget.
+ *  The array may contain strings or OO.ui.HtmlSnippet instances.
+ * @chainable
+ */
+OO.ui.FieldLayout.prototype.setErrors = function ( errors ) {
+       this.errors = errors.slice();
+       this.updateMessages();
+       return this;
+};
+
+/**
+ * Set the list of notice messages.
+ *
+ * @param {Array} notices Notices about the widget, which will be displayed below the widget.
+ *  The array may contain strings or OO.ui.HtmlSnippet instances.
+ * @chainable
+ */
+OO.ui.FieldLayout.prototype.setNotices = function ( notices ) {
+       this.notices = notices.slice();
+       this.updateMessages();
+       return this;
+};
+
+/**
+ * Update the rendering of error and notice messages.
+ *
+ * @private
+ */
+OO.ui.FieldLayout.prototype.updateMessages = function () {
+       var i;
+       this.$messages.empty();
+
+       if ( this.errors.length || this.notices.length ) {
+               this.$body.after( this.$messages );
+       } else {
+               this.$messages.remove();
+               return;
+       }
+
+       for ( i = 0; i < this.notices.length; i++ ) {
+               this.$messages.append( this.makeMessage( 'notice', this.notices[ i ] ) );
+       }
+       for ( i = 0; i < this.errors.length; i++ ) {
+               this.$messages.append( this.makeMessage( 'error', this.errors[ i ] ) );
+       }
+};
+
 /**
  * ActionFieldLayouts are used with OO.ui.FieldsetLayout. The layout consists of a field-widget, a button,
  * and an optional label and/or help text. The field-widget (e.g., a {@link OO.ui.TextInputWidget TextInputWidget}),
@@ -14569,7 +14636,7 @@ OO.ui.IndicatorWidget.static.tagName = 'span';
  * @param {Object} [config] Configuration options
  * @cfg {string} [name=''] The value of the input’s HTML `name` attribute.
  * @cfg {string} [value=''] The value of the input.
- * @cfg {string} [accessKey=''] The access key of the input.
+ * @cfg {string} [dir] The directionality of the input (ltr/rtl).
  * @cfg {Function} [inputFilter] The name of an input filter function. Input filters modify the value of an input
  *  before it is accepted.
  */
@@ -14604,6 +14671,9 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) {
                .append( this.$input );
        this.setValue( config.value );
        this.setAccessKey( config.accessKey );
+       if ( config.dir ) {
+               this.setDir( config.dir );
+       }
 };
 
 /* Setup */
@@ -14620,16 +14690,24 @@ OO.ui.InputWidget.static.supportsSimpleLabel = true;
 
 /* Static Methods */
 
+/**
+ * @inheritdoc
+ */
+OO.ui.InputWidget.static.reusePreInfuseDOM = function ( node, config ) {
+       config = OO.ui.InputWidget.parent.static.reusePreInfuseDOM( node, config );
+       // Reusing $input lets browsers preserve inputted values across page reloads (T114134)
+       config.$input = $( node ).find( '.oo-ui-inputWidget-input' );
+       return config;
+};
+
 /**
  * @inheritdoc
  */
 OO.ui.InputWidget.static.gatherPreInfuseState = function ( node, config ) {
-       var
-               state = OO.ui.InputWidget.parent.static.gatherPreInfuseState( node, config ),
-               $input = state.$input || $( node ).find( '.oo-ui-inputWidget-input' );
-       state.value = $input.val();
+       var state = OO.ui.InputWidget.parent.static.gatherPreInfuseState( node, config );
+       state.value = config.$input.val();
        // Might be better in TabIndexedElement, but it's awkward to do there because mixins are awkward
-       state.focus = $input.is( ':focus' );
+       state.focus = config.$input.is( ':focus' );
        return state;
 };
 
@@ -14655,8 +14733,9 @@ OO.ui.InputWidget.static.gatherPreInfuseState = function ( node, config ) {
  * @param {Object} config Configuration options
  * @return {jQuery} Input element
  */
-OO.ui.InputWidget.prototype.getInputElement = function () {
-       return $( '<input>' );
+OO.ui.InputWidget.prototype.getInputElement = function ( config ) {
+       // See #reusePreInfuseDOM about config.$input
+       return config.$input || $( '<input>' );
 };
 
 /**
@@ -14691,13 +14770,26 @@ OO.ui.InputWidget.prototype.getValue = function () {
 };
 
 /**
- * Set the direction of the input, either RTL (right-to-left) or LTR (left-to-right).
+ * Set the directionality of the input, either RTL (right-to-left) or LTR (left-to-right).
  *
- * @param {boolean} isRTL
- * Direction is right-to-left
+ * @deprecated since v0.13.1, use #setDir directly
+ * @param {boolean} isRTL Directionality is right-to-left
+ * @chainable
  */
 OO.ui.InputWidget.prototype.setRTL = function ( isRTL ) {
-       this.$input.prop( 'dir', isRTL ? 'rtl' : 'ltr' );
+       this.setDir( isRTL ? 'rtl' : 'ltr' );
+       return this;
+};
+
+/**
+ * Set the directionality of the input.
+ *
+ * @param {string} dir Text directionality: 'ltr', 'rtl' or 'auto'
+ * @chainable
+ */
+OO.ui.InputWidget.prototype.setDir = function ( dir ) {
+       this.$input.prop( 'dir', dir );
+       return this;
 };
 
 /**
@@ -14906,9 +14998,12 @@ OO.ui.ButtonInputWidget.static.supportsSimpleLabel = false;
  * @protected
  */
 OO.ui.ButtonInputWidget.prototype.getInputElement = function ( config ) {
-       var type = [ 'button', 'submit', 'reset' ].indexOf( config.type ) !== -1 ?
-               config.type :
-               'button';
+       var type;
+       // See InputWidget#reusePreInfuseDOM about config.$input
+       if ( config.$input ) {
+               return config.$input.empty();
+       }
+       type = [ 'button', 'submit', 'reset' ].indexOf( config.type ) !== -1 ? config.type : 'button';
        return $( '<' + ( config.useInputTag ? 'input' : 'button' ) + ' type="' + type + '">' );
 };
 
@@ -15022,11 +15117,8 @@ OO.inheritClass( OO.ui.CheckboxInputWidget, OO.ui.InputWidget );
  * @inheritdoc
  */
 OO.ui.CheckboxInputWidget.static.gatherPreInfuseState = function ( node, config ) {
-       var
-               state = OO.ui.CheckboxInputWidget.parent.static.gatherPreInfuseState( node, config ),
-               $input = $( node ).find( '.oo-ui-inputWidget-input' );
-       state.$input = $input; // shortcut for performance, used in InputWidget
-       state.checked = $input.prop( 'checked' );
+       var state = OO.ui.CheckboxInputWidget.parent.static.gatherPreInfuseState( node, config );
+       state.checked = config.$input.prop( 'checked' );
        return state;
 };
 
@@ -15162,7 +15254,11 @@ OO.mixinClass( OO.ui.DropdownInputWidget, OO.ui.mixin.TitledElement );
  * @inheritdoc
  * @protected
  */
-OO.ui.DropdownInputWidget.prototype.getInputElement = function () {
+OO.ui.DropdownInputWidget.prototype.getInputElement = function ( config ) {
+       // See InputWidget#reusePreInfuseDOM about config.$input
+       if ( config.$input ) {
+               return config.$input.addClass( 'oo-ui-element-hidden' );
+       }
        return $( '<input type="hidden">' );
 };
 
@@ -15313,11 +15409,8 @@ OO.inheritClass( OO.ui.RadioInputWidget, OO.ui.InputWidget );
  * @inheritdoc
  */
 OO.ui.RadioInputWidget.static.gatherPreInfuseState = function ( node, config ) {
-       var
-               state = OO.ui.RadioInputWidget.parent.static.gatherPreInfuseState( node, config ),
-               $input = $( node ).find( '.oo-ui-inputWidget-input' );
-       state.$input = $input; // shortcut for performance, used in InputWidget
-       state.checked = $input.prop( 'checked' );
+       var state = OO.ui.RadioInputWidget.parent.static.gatherPreInfuseState( node, config );
+       state.checked = config.$input.prop( 'checked' );
        return state;
 };
 
@@ -15604,6 +15697,7 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        this.maxRows = config.maxRows || Math.max( 2 * ( this.minRows || 0 ), 10 );
        this.validate = null;
        this.styleHeight = null;
+       this.scrollWidth = null;
 
        // Clone for resizing
        if ( this.autosize ) {
@@ -15696,12 +15790,9 @@ OO.ui.TextInputWidget.static.validationPatterns = {
  * @inheritdoc
  */
 OO.ui.TextInputWidget.static.gatherPreInfuseState = function ( node, config ) {
-       var
-               state = OO.ui.TextInputWidget.parent.static.gatherPreInfuseState( node, config ),
-               $input = $( node ).find( '.oo-ui-inputWidget-input' );
-       state.$input = $input; // shortcut for performance, used in InputWidget
+       var state = OO.ui.TextInputWidget.parent.static.gatherPreInfuseState( node, config );
        if ( config.multiline ) {
-               state.scrollTop = $input.scrollTop();
+               state.scrollTop = config.$input.scrollTop();
        }
        return state;
 };
@@ -15914,47 +16005,67 @@ OO.ui.TextInputWidget.prototype.installParentChangeDetector = function () {
  * @fires resize
  */
 OO.ui.TextInputWidget.prototype.adjustSize = function () {
-       var scrollHeight, innerHeight, outerHeight, maxInnerHeight, measurementError, idealHeight, newHeight;
-
-       if ( this.multiline && this.autosize && this.$input.val() !== this.valCache ) {
-               this.$clone
-                       .val( this.$input.val() )
-                       .attr( 'rows', this.minRows )
-                       // Set inline height property to 0 to measure scroll height
-                       .css( 'height', 0 );
-
-               this.$clone.removeClass( 'oo-ui-element-hidden' );
-
-               this.valCache = this.$input.val();
-
-               scrollHeight = this.$clone[ 0 ].scrollHeight;
-
-               // Remove inline height property to measure natural heights
-               this.$clone.css( 'height', '' );
-               innerHeight = this.$clone.innerHeight();
-               outerHeight = this.$clone.outerHeight();
-
-               // Measure max rows height
-               this.$clone
-                       .attr( 'rows', this.maxRows )
-                       .css( 'height', 'auto' )
-                       .val( '' );
-               maxInnerHeight = this.$clone.innerHeight();
-
-               // Difference between reported innerHeight and scrollHeight with no scrollbars present
-               // Equals 1 on Blink-based browsers and 0 everywhere else
-               measurementError = maxInnerHeight - this.$clone[ 0 ].scrollHeight;
-               idealHeight = Math.min( maxInnerHeight, scrollHeight + measurementError );
-
-               this.$clone.addClass( 'oo-ui-element-hidden' );
-
-               // Only apply inline height when expansion beyond natural height is needed
-               // Use the difference between the inner and outer height as a buffer
-               newHeight = idealHeight > innerHeight ? idealHeight + ( outerHeight - innerHeight ) : '';
-               if ( newHeight !== this.styleHeight ) {
-                       this.$input.css( 'height', newHeight );
-                       this.styleHeight = newHeight;
-                       this.emit( 'resize' );
+       var scrollHeight, innerHeight, outerHeight, maxInnerHeight, measurementError,
+               idealHeight, newHeight, scrollWidth, property;
+
+       if ( this.multiline && this.$input.val() !== this.valCache ) {
+               if ( this.autosize ) {
+                       this.$clone
+                               .val( this.$input.val() )
+                               .attr( 'rows', this.minRows )
+                               // Set inline height property to 0 to measure scroll height
+                               .css( 'height', 0 );
+
+                       this.$clone.removeClass( 'oo-ui-element-hidden' );
+
+                       this.valCache = this.$input.val();
+
+                       scrollHeight = this.$clone[ 0 ].scrollHeight;
+
+                       // Remove inline height property to measure natural heights
+                       this.$clone.css( 'height', '' );
+                       innerHeight = this.$clone.innerHeight();
+                       outerHeight = this.$clone.outerHeight();
+
+                       // Measure max rows height
+                       this.$clone
+                               .attr( 'rows', this.maxRows )
+                               .css( 'height', 'auto' )
+                               .val( '' );
+                       maxInnerHeight = this.$clone.innerHeight();
+
+                       // Difference between reported innerHeight and scrollHeight with no scrollbars present
+                       // Equals 1 on Blink-based browsers and 0 everywhere else
+                       measurementError = maxInnerHeight - this.$clone[ 0 ].scrollHeight;
+                       idealHeight = Math.min( maxInnerHeight, scrollHeight + measurementError );
+
+                       this.$clone.addClass( 'oo-ui-element-hidden' );
+
+                       // Only apply inline height when expansion beyond natural height is needed
+                       // Use the difference between the inner and outer height as a buffer
+                       newHeight = idealHeight > innerHeight ? idealHeight + ( outerHeight - innerHeight ) : '';
+                       if ( newHeight !== this.styleHeight ) {
+                               this.$input.css( 'height', newHeight );
+                               this.styleHeight = newHeight;
+                               this.emit( 'resize' );
+                       }
+               }
+               scrollWidth = this.$input[ 0 ].offsetWidth - this.$input[ 0 ].clientWidth;
+               if ( scrollWidth !== this.scrollWidth ) {
+                       property = this.$element.css( 'direction' ) === 'rtl' ? 'left' : 'right';
+                       // Reset
+                       this.$label.css( { right: '', left: '' } );
+                       this.$indicator.css( { right: '', left: '' } );
+
+                       if ( scrollWidth ) {
+                               this.$indicator.css( property, scrollWidth );
+                               if ( this.labelPosition === 'after' ) {
+                                       this.$label.css( property, scrollWidth );
+                               }
+                       }
+
+                       this.scrollWidth = scrollWidth;
+                       this.positionLabel();
                }
        }
        return this;
@@ -16221,6 +16332,9 @@ OO.ui.TextInputWidget.prototype.updatePosition = function () {
                .toggleClass( 'oo-ui-textInputWidget-labelPosition-after', !!this.label && after )
                .toggleClass( 'oo-ui-textInputWidget-labelPosition-before', !!this.label && !after );
 
+       this.valCache = null;
+       this.scrollWidth = null;
+       this.adjustSize();
        this.positionLabel();
 
        return this;
@@ -16267,7 +16381,7 @@ OO.ui.TextInputWidget.prototype.positionLabel = function () {
        rtl = this.$element.css( 'direction' ) === 'rtl';
        property = after === rtl ? 'padding-left' : 'padding-right';
 
-       this.$input.css( property, this.$label.outerWidth( true ) );
+       this.$input.css( property, this.$label.outerWidth( true ) + ( after ? this.scrollWidth : 0 ) );
 
        return this;
 };
index 0c6c15e..ddae9b1 100644 (file)
 
        OO.inheritClass( mw.widgets.ComplexTitleInputWidget, OO.ui.Widget );
 
+       /* Static Methods */
+       /*jshint -W024*/
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.ComplexTitleInputWidget.static.reusePreInfuseDOM = function ( node, config ) {
+               config = mw.widgets.ComplexTitleInputWidget.parent.static.reusePreInfuseDOM( node, config );
+               config.namespace = mw.widgets.NamespaceInputWidget.static.reusePreInfuseDOM(
+                       $( node ).find( '.mw-widget-namespaceInputWidget' ),
+                       config.namespace
+               );
+               config.title = mw.widgets.TitleInputWidget.static.reusePreInfuseDOM(
+                       $( node ).find( '.mw-widget-titleInputWidget' ),
+                       config.title
+               );
+               return config;
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.ComplexTitleInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+               var state = mw.widgets.ComplexTitleInputWidget.parent.static.gatherPreInfuseState( node, config );
+               state.namespace = mw.widgets.NamespaceInputWidget.static.gatherPreInfuseState(
+                       $( node ).find( '.mw-widget-namespaceInputWidget' ),
+                       config.namespace
+               );
+               state.title = mw.widgets.TitleInputWidget.static.gatherPreInfuseState(
+                       $( node ).find( '.mw-widget-titleInputWidget' ),
+                       config.title
+               );
+               return state;
+       };
+
+       /*jshint +W024*/
+
        /* Methods */
 
        /**
                this.title.setNamespace( Number( this.namespace.getValue() ) );
        };
 
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.ComplexTitleInputWidget.prototype.restorePreInfuseState = function ( state ) {
+               mw.widgets.ComplexTitleInputWidget.parent.prototype.restorePreInfuseState.call( this, state );
+               this.namespace.restorePreInfuseState( state.namespace );
+               this.title.restorePreInfuseState( state.title );
+       };
+
 }( jQuery, mediaWiki ) );
diff --git a/tests/phpunit/includes/libs/TimingTest.php b/tests/phpunit/includes/libs/TimingTest.php
new file mode 100644 (file)
index 0000000..93e9d6b
--- /dev/null
@@ -0,0 +1,111 @@
+<?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 Ori Livneh <ori@wikimedia.org>
+ */
+
+class TimingTest extends PHPUnit_Framework_TestCase {
+
+       /**
+        * @covers Timing::clearMarks
+        * @covers Timing::getEntries
+        */
+       public function testClearMarks() {
+               $timing = new Timing;
+               $this->assertCount( 1, $timing->getEntries() );
+
+               $timing->mark( 'a' );
+               $timing->mark( 'b' );
+               $this->assertCount( 3, $timing->getEntries() );
+
+               $timing->clearMarks( 'a' );
+               $this->assertNull( $timing->getEntryByName( 'a' ) );
+               $this->assertNotNull( $timing->getEntryByName( 'b' ) );
+
+               $timing->clearMarks();
+               $this->assertCount( 1, $timing->getEntries() );
+       }
+
+       /**
+        * @covers Timing::mark
+        * @covers Timing::getEntryByName
+        */
+       public function testMark() {
+               $timing = new Timing;
+               $timing->mark( 'a' );
+
+               $entry = $timing->getEntryByName( 'a' );
+               $this->assertEquals( 'a', $entry['name'] );
+               $this->assertEquals( 'mark', $entry['entryType'] );
+               $this->assertArrayHasKey( 'startTime', $entry );
+               $this->assertEquals( 0, $entry['duration'] );
+
+               $timing->mark( 'a' );
+               $newEntry = $timing->getEntryByName( 'a' );
+               $this->assertGreaterThan( $entry['startTime'], $newEntry['startTime'] );
+       }
+
+       /**
+        * @covers Timing::measure
+        */
+       public function testMeasure() {
+               $timing = new Timing;
+
+               $timing->mark( 'a' );
+               $a = $timing->getEntryByName( 'a' );
+
+               $timing->mark( 'b' );
+               $b = $timing->getEntryByName( 'b' );
+
+               $timing->measure( 'a_to_b', 'a', 'b' );
+
+               $entry = $timing->getEntryByName( 'a_to_b' );
+               $this->assertEquals( 'a_to_b', $entry['name'] );
+               $this->assertEquals( 'measure', $entry['entryType'] );
+               $this->assertEquals( $a['startTime'], $entry['startTime'] );
+               $this->assertEquals( $b['startTime'] - $a['startTime'], $entry['duration'] );
+       }
+
+       /**
+        * @covers Timing::getEntriesByType
+        */
+       public function testGetEntriesByType() {
+               $timing = new Timing;
+
+               $timing->mark( 'mark_a' );
+               usleep( 100 );
+               $timing->mark( 'mark_b' );
+               usleep( 100 );
+               $timing->mark( 'mark_c' );
+
+               $timing->measure( 'measure_a', 'mark_a', 'mark_b' );
+               $timing->measure( 'measure_b', 'mark_b', 'mark_c' );
+
+               $marks = array_map( function ( $entry ) {
+                       return $entry['name'];
+               }, $timing->getEntriesByType( 'mark' ) );
+
+               $this->assertEquals( array( 'requestStart', 'mark_a', 'mark_b', 'mark_c' ), $marks );
+
+               $measures = array_map( function ( $entry ) {
+                       return $entry['name'];
+               }, $timing->getEntriesByType( 'measure' ) );
+
+               $this->assertEquals( array( 'measure_a', 'measure_b' ), $measures );
+       }
+}