Merge "SiteStats: Avoid deprecated wfMemcKey()"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 26 May 2017 23:04:35 +0000 (23:04 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 26 May 2017 23:04:35 +0000 (23:04 +0000)
45 files changed:
RELEASE-NOTES-1.30
includes/OutputPage.php
includes/WebStart.php
includes/api/i18n/es.json
includes/api/i18n/he.json
includes/api/i18n/hu.json
includes/api/i18n/ko.json
includes/api/i18n/pt.json
includes/api/i18n/zh-hans.json
includes/cache/MessageCache.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/page/WikiPage.php
languages/data/Names.php
languages/i18n/ast.json
languages/i18n/atj.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/bs.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/fa.json
languages/i18n/fr.json
languages/i18n/fy.json
languages/i18n/id.json
languages/i18n/lij.json
languages/i18n/my.json
languages/i18n/qqq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/tr.json
maintenance/backupPrefetch.inc
maintenance/dumpTextPass.php
maintenance/rebuildrecentchanges.php
resources/Resources.php
resources/src/jquery/jquery.makeCollapsible.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListItemWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListWidget.less
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListItemWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js

index 9ff7e97..e61277a 100644 (file)
@@ -32,6 +32,10 @@ production.
   X-Content-Dimensions header for originals that contain the media's dimensions
   as page ranges keyed by dimensions.
 
+=== Languages updated in 1.30 ===
+
+* Support for kbp (Kabɩyɛ / Kabiyè) was added.
+
 === External library changes in 1.30 ===
 
 ==== Upgraded external libraries ====
index c739b30..e22f42c 100644 (file)
@@ -3644,10 +3644,21 @@ class OutputPage extends ContextSource {
                        [ 'name' => 'ResourceLoaderDynamicStyles', 'content' => '' ]
                );
 
+               $separateReq = [ 'site.styles', 'user.styles' ];
                foreach ( $this->rlExemptStyleModules as $group => $moduleNames ) {
-                       $chunks[] = $this->makeResourceLoaderLink( $moduleNames,
+                       // Combinable modules
+                       $chunks[] = $this->makeResourceLoaderLink(
+                               array_diff( $moduleNames, $separateReq ),
                                ResourceLoaderModule::TYPE_STYLES
                        );
+
+                       foreach ( array_intersect( $moduleNames, $separateReq ) as $name ) {
+                               // These require their own dedicated request in order to support "@import"
+                               // syntax, which is incompatible with concatenation. (T147667, T37562)
+                               $chunks[] = $this->makeResourceLoaderLink( $name,
+                                       ResourceLoaderModule::TYPE_STYLES
+                               );
+                       }
                }
 
                return self::combineWrappedStrings( array_merge( $chunks, $append ) );
index 15804c7..e281b6f 100644 (file)
@@ -1,12 +1,11 @@
 <?php
 /**
  * This does the initial set up for a web request.
- * It does some security checks, starts the profiler and loads the
- * configuration, and optionally loads Setup.php depending on whether
- * MW_NO_SETUP is defined.
  *
- * Setup.php (if loaded) then sets up GlobalFunctions, the AutoLoader,
- * and the configuration globals.
+ * It does some security checks, loads autoloaders, constants, and
+ * global functions, starts the profiler, loads the configuration,
+ * and loads Setup.php, which loads extensions using the extension
+ * registration system and initializes the application's global state.
  *
  * 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
index 6503020..3244801 100644 (file)
        "apihelp-query+search-param-limit": "Cuántas páginas en total se devolverán.",
        "apihelp-query+search-param-interwiki": "Incluir resultados interwiki en la búsqueda, si es posible.",
        "apihelp-query+search-param-backend": "Qué servidor de búsqueda utilizar, si no es el servidor por defecto.",
-       "apihelp-query+search-param-enablerewrites": "Habilita la reescritura de consultas internas. Algunos servidores de búsqueda pueden reescribir la consulta a una que considere que da mejores resultados, por ejemplo, corrigiendo las faltas ortográficas.",
+       "apihelp-query+search-param-enablerewrites": "Habilitar la reescritura de consultas internas. Algunos servidores de búsqueda pueden reescribir la consulta a una que considere que da mejores resultados, por ejemplo, corrigiendo las faltas ortográficas.",
        "apihelp-query+search-example-simple": "Buscar <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Buscar <kbd>meaning</kbd> en los textos.",
        "apihelp-query+search-example-generator": "Obtener información acerca de las páginas devueltas por una búsqueda de <kbd>meaning</kbd>.",
index 7613b84..b6a5b09 100644 (file)
        "apihelp-parse-param-preview": "לפענח במצב תצוגה מקדימה.",
        "apihelp-parse-param-sectionpreview": "לפענח במצב תצוגה מקדימה של פסקה (מדליק גם את מצב תצוגה מקדימה).",
        "apihelp-parse-param-disabletoc": "להשמיט את תוכן העניינים בפלט.",
+       "apihelp-parse-param-useskin": "להחיל את העיצוב שנבחר לפלט המפענח. יכול להשפיע על המאפיינים הבאים: <kbd dir=\"ltr\">langlinks</kbd>, <kbd dir=\"ltr\">headitems</kbd>, <kbd dir=\"ltr\">modules</kbd>, <kbd dir=\"ltr\">jsconfigvars</kbd>, <kbd dir=\"ltr\">indicators</kbd>.",
        "apihelp-parse-param-contentformat": "תסדיר הסדרת תוכן שישמש לטקסט הקלט. תקף רק עם $1text.",
        "apihelp-parse-param-contentmodel": "מודל התוכן של טקסט הקלט. אם זה מושמט, יש לציין את $1title והערך ההתחלתי יהיה המודל של הכותרת שצוינה. תקין רק כאשר משמש עם $1text.",
        "apihelp-parse-example-page": "לפענח דף.",
        "apihelp-query+search-param-limit": "כמה דפים להחזיר בסך הכול.",
        "apihelp-query+search-param-interwiki": "לכלול תוצאות בינוויקי בחיפוש, אם זמין.",
        "apihelp-query+search-param-backend": "באיזה שרת חיפוש להשתמש אם לא בבררת המחדל.",
-       "apihelp-query+search-param-enablerewrites": "×\94פע×\9cת ×©×\9bת×\95×\91 ×©×\90×\99×\9cת×\95ת ×¤× ×\99×\9e×\99. ×©×¨×ª×\99 ×\97×\99פ×\95ש ×\90×\97×\93×\99×\9d ×\99×\9b×\95×\9c×\99×\9d ×\9cש×\9bת×\91 ×\90ת ×\94ש×\90×\99×\9cת×\94 ×\9cצ×\95ר×\94 ×©×\9c×\93עת×\9d × ×\95תנת ×ª×\95צ×\90×\95ת ×\98×\95×\91×\95ת ×\99×\95תר, ×\9c×\9eש×\9c תיקון שגיאות כתיב.",
+       "apihelp-query+search-param-enablerewrites": "×\94פע×\9cת ×©×\9bת×\95×\91 ×©×\90×\99×\9cת×\95ת ×¤× ×\99×\9e×\99. ×©×¨×ª×\99 ×\97×\99פ×\95ש ×\90×\97×\93×\99×\9d ×\99×\9b×\95×\9c×\99×\9d ×\9cש×\9bת×\91 ×\90ת ×\94ש×\90×\99×\9cת×\94 ×\9cצ×\95ר×\94 ×\90×\97רת ×©× ×\97ש×\91ת ×\9c×\9b×\96×\90ת ×©×\9eספקת ×ª×\95צ×\90×\95ת ×\98×\95×\91×\95ת ×\99×\95תר, ×\9c×\9eש×\9c ×\91×\90×\9eצע×\95ת תיקון שגיאות כתיב.",
        "apihelp-query+search-example-simple": "חיפוש <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "חיפוש טקסטים עבור <kbd>meaning</kbd>.",
        "apihelp-query+search-example-generator": "קבלת מידע על הדף עבור שמוחזרים מחיפוש אחרי <kbd>meaning</kbd>.",
index 250ec2f..a41df90 100644 (file)
        "apihelp-query+backlinks-param-redirect": "Ha a hivatkozó lap átirányítás, az arra hivatkozó lapok keresése szintén. A maximális limit feleződik.",
        "apihelp-query+backlinks-example-simple": "A <kbd>Main Page</kbd> lapra mutató hivatkozások keresése.",
        "apihelp-query+backlinks-example-generator": "Információk lekérése a <kbd>Main Page</kbd>-re hivatkozó lapokról.",
+       "apihelp-query+blocks-description": "Az összes blokkolt felhasználó és IP-cím listázása.",
+       "apihelp-query+blocks-param-start": "A listázás kezdő időbélyege.",
+       "apihelp-query+blocks-param-end": "A lista végét jelentő időbélyeg.",
+       "apihelp-query+blocks-param-ids": "A listázandó blokkok blokkazonosítói (opcionális).",
+       "apihelp-query+blocks-param-users": "A keresendő felhasználók (opcionális).",
+       "apihelp-query+blocks-param-ip": "Minden erre az IP-címre vagy CIDR tartományra vonatkozó blokk listázása, a tartományblokkokat is beleértve. Nem használható együtt a <var>$3users</var> paraméterrel. A CIDR tartományok maximális szélessége IPv4 esetén /$1, IPv6 esetén /$2.",
+       "apihelp-query+blocks-param-limit": "A listázandó blokkok maximális száma.",
+       "apihelp-query+blocks-param-prop": "Lekérendő tulajdonságok:",
+       "apihelp-query+blocks-paramvalue-prop-id": "A blokk azonosítója.",
+       "apihelp-query+blocks-paramvalue-prop-user": "A blokkolt felhasználó felhasználóneve.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "A blokkolt felhasználó felhasználóazonosítója.",
+       "apihelp-query+blocks-paramvalue-prop-by": "A blokkoló felhasználó felhasználóneve.",
+       "apihelp-query+blocks-paramvalue-prop-byid": "A blokkoló felhasználó felhasználóazonosítója.",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "A blokkolás időbélyege.",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "A blokk lejáratának időbélyege.",
+       "apihelp-query+blocks-paramvalue-prop-reason": "A blokk indoklása.",
+       "apihelp-query+blocks-paramvalue-prop-range": "A blokk által érintett IP-címek tartománya.",
+       "apihelp-query+blocks-param-show": "Csak a megadott feltételeknek megfelelő elemek megjelenítése.\nPéldául csak IP-címek végtelen blokkjainak megjelenítéséhez állítsd <kbd>$1show=ip|!temp</kbd> értékre.",
+       "apihelp-query+blocks-example-simple": "Blokkok listázása.",
+       "apihelp-query+blocks-example-users": "<kbd>Alice</kbd> és <kbd>Bob</kbd> blokkjainak listázása.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Mód|Módok}}: $2",
        "apihelp-query+imageinfo-paramvalue-prop-sha1": "SHA-1 hash hozzáadása a fájlhoz.",
        "apihelp-query+imageinfo-paramvalue-prop-mime": "MIME-típus hozzáadása a fájlhoz.",
index ed9511f..3391708 100644 (file)
        "apihelp-parse-param-preview": "미리 보기 모드에서 구문 분석을 합니다.",
        "apihelp-parse-param-sectionpreview": "문단 미리 보기 모드에서 구문 분석을 합니다. (미리 보기 모드도 활성화함)",
        "apihelp-parse-param-disabletoc": "출력에서 목차를 제외합니다.",
+       "apihelp-parse-param-useskin": "선택한 스킨을 파서 출력에 적용합니다. 다음의 속성에 영향을 줄 수 있습니다: <kbd>langlinks</kbd>, <kbd>headitems</kbd>, <kbd>modules</kbd>, <kbd>jsconfigvars</kbd>, <kbd>indicators</kbd>.",
        "apihelp-parse-example-page": "페이지의 구문을 분석합니다.",
        "apihelp-parse-example-text": "위키텍스트의 구문을 분석합니다.",
        "apihelp-parse-example-summary": "요약을 구문 분석합니다.",
index 24d0246..36f92c3 100644 (file)
        "api-help-authmanagerhelper-returnurl": "O URL de retorno para processos de autenticação por terceiros tem de ser absoluto. É obrigatório fornecer este URL ou <var>$1continue</var>.\n\nTipicamente, após receber uma resposta <samp>REDIRECT</samp>, abrirá um ''browser'' ou uma ''web view'' para o URL <samp>redirecttarget</samp> especificado, para dar lugar ao processo de autenticação por terceiros. Quando esse processo terminar, a terceira entidade encaminhará o ''browser'' ou a ''web view'' para este URL. Deve extrair do URL quaisquer parâmetros de consulta ou de POST, e passá-los como um pedido <var>$1continue</var> a este módulo da API.",
        "api-help-authmanagerhelper-continue": "Este pedido é uma continuação após uma resposta anterior com o valor <samp>UI</samp> ou <samp>REDIRECT</samp>. É obrigatório fornecer este parâmetro ou o parâmetro <var>$1returnurl</var>.",
        "api-help-authmanagerhelper-additional-params": "Este módulo aceita parâmetros adicionais, dependendo dos pedidos de autenticação disponíveis. Use <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> com <kbd>amirequestsfor=$1</kbd> (ou uma resposta anterior deste módulo, se aplicável) para determinar os pedidos disponíveis e os campos que estes utilizam.",
+       "apierror-allimages-redirect": "Usar <kbd>gaifilterredir=nonredirects</kbd> em vez de <var>redirects</var> ao utilizar <kbd>allimages</kbd> como gerador.",
+       "apierror-allpages-generator-redirects": "Usar <kbd>gapfilterredir=nonredirects</kbd> em vez de <var>redirects</var> ao utilizar <kbd>allpages</kbd> como gerador.",
+       "apierror-badgenerator-notgenerator": "O módulo <kbd>$1</kbd> não pode ser usado como gerador.",
+       "apierror-badgenerator-unknown": "<kbd>generator=$1</kbd> desconhecido.",
+       "apierror-badip": "O parâmetro IP não é válido.",
+       "apierror-badmd5": "A chave MD5 fornecida estava incorreta.",
+       "apierror-badmodule-badsubmodule": "O módulo <kbd>$1</kbd> não tem um submódulo \"$2\".",
+       "apierror-badmodule-nosubmodules": "O módulo <kbd>$1</kbd> não tem submódulos.",
+       "apierror-badparameter": "Valor inválido para o parâmetro <var>$1</var>.",
+       "apierror-badquery": "Consulta inválida.",
+       "apierror-badtimestamp": "Valor inválido \"$2\" para o parâmetro de data e hora <var>$1</var>.",
+       "apierror-badtoken": "Chave CSRF inválida.",
+       "apierror-badupload": "O parâmetro para carregamento de ficheiros <var>$1</var> não é um carregamento de ficheiro; verifique que usou <code>multipart/form-data</code> no seu POST e inclua um nome de ficheiro no cabeçalho <code>Content-Disposition</code>.",
+       "apierror-badurl": "Valor inválido \"$2\" para o parâmetro <var>$1</var> do URL.",
+       "apierror-baduser": "Valor inválido \"$2\" para o parâmetro de utilizador <var>$1</var>.",
+       "apierror-badvalue-notmultivalue": "O separador de valores múltiplos U+001F só pode ser usado em parâmetros de valores múltiplos.",
        "api-credits-header": "Créditos",
        "api-credits": "Programadores da API:\n* Yuri Astrakhan (criador, programador principal, set 2006–set 2007)\n* Roan Kattouw (programador principal, set 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch (programador principal, 2013–presente)\n\nPode enviar os seus comentários, sugestões e perguntas para o endereço mediawiki-api@lists.wikimedia.org, ou reportar quaisquer defeitos que encontre em https://phabricator.wikimedia.org/."
 }
index 5f82a78..45cf709 100644 (file)
        "apihelp-parse-param-preview": "在预览模式下解析。",
        "apihelp-parse-param-sectionpreview": "在段落预览模式下解析(同时要启用预览模式)。",
        "apihelp-parse-param-disabletoc": "在输出中省略目录。",
+       "apihelp-parse-param-useskin": "为解析器输出应用选择的皮肤。会影响以下属性:<kbd>langlinks</kbd>、<kbd>headitems</kbd>、<kbd>modules</kbd>、<kbd>jsconfigvars</kbd>和<kbd>indicators</kbd>。",
        "apihelp-parse-param-contentformat": "用于输入文本的内容序列化格式。只当与$1text一起使用时有效。",
        "apihelp-parse-param-contentmodel": "输入文本的内容模型。如果省略,$1title必须指定,并且默认将为指定标题的模型。只当与$1text一起使用时有效。",
        "apihelp-parse-example-page": "解析一个页面。",
index 8f88ee9..ad1fffb 100644 (file)
@@ -220,7 +220,7 @@ class MessageCache {
         * @return array|bool The cache array, or false if not in cache.
         */
        protected function getLocalCache( $code ) {
-               $cacheKey = wfMemcKey( __CLASS__, $code );
+               $cacheKey = $this->srvCache->makeKey( __CLASS__, $code );
 
                return $this->srvCache->get( $cacheKey );
        }
@@ -232,7 +232,7 @@ class MessageCache {
         * @param array $cache The cache array
         */
        protected function saveToLocalCache( $code, $cache ) {
-               $cacheKey = wfMemcKey( __CLASS__, $code );
+               $cacheKey = $this->srvCache->makeKey( __CLASS__, $code );
                $this->srvCache->set( $cacheKey, $cache );
        }
 
@@ -308,7 +308,7 @@ class MessageCache {
                }
 
                if ( !$success ) {
-                       $cacheKey = wfMemcKey( 'messages', $code ); # Key in memc for messages
+                       $cacheKey = $this->clusterCache->makeKey( 'messages', $code ); # Key in memc for messages
                        # Try the global cache. If it is empty, try to acquire a lock. If
                        # the lock can't be acquired, wait for the other thread to finish
                        # and then try the global cache a second time.
@@ -402,7 +402,7 @@ class MessageCache {
        protected function loadFromDBWithLock( $code, array &$where, $mode = null ) {
                # If cache updates on all levels fail, give up on message overrides.
                # This is to avoid easy site outages; see $saveSuccess comments below.
-               $statusKey = wfMemcKey( 'messages', $code, 'status' );
+               $statusKey = $this->clusterCache->makeKey( 'messages', $code, 'status' );
                $status = $this->clusterCache->get( $statusKey );
                if ( $status === 'error' ) {
                        $where[] = "could not load; method is still globally disabled";
@@ -416,7 +416,7 @@ class MessageCache {
                # This lock is non-blocking so stale cache can quickly be used.
                # Note that load() will call a blocking getReentrantScopedLock()
                # after this if it really need to wait for any current thread.
-               $cacheKey = wfMemcKey( 'messages', $code );
+               $cacheKey = $this->clusterCache->makeKey( 'messages', $code );
                $scopedLock = $this->getReentrantScopedLock( $cacheKey, 0 );
                if ( !$scopedLock ) {
                        $where[] = 'could not acquire main lock';
@@ -596,7 +596,9 @@ class MessageCache {
                        function () use ( $title, $msg, $code ) {
                                global $wgContLang, $wgMaxMsgCacheEntrySize;
                                // Allow one caller at a time to avoid race conditions
-                               $scopedLock = $this->getReentrantScopedLock( wfMemcKey( 'messages', $code ) );
+                               $scopedLock = $this->getReentrantScopedLock(
+                                       $this->clusterCache->makeKey( 'messages', $code )
+                               );
                                if ( !$scopedLock ) {
                                        LoggerFactory::getInstance( 'MessageCache' )->error(
                                                __METHOD__ . ': could not acquire lock to update {title} ({code})',
@@ -628,7 +630,7 @@ class MessageCache {
 
                                // Relay the purge. Touching this check key expires cache contents
                                // and local cache (APC) validation hash across all datacenters.
-                               $this->wanCache->touchCheckKey( wfMemcKey( 'messages', $code ) );
+                               $this->wanCache->touchCheckKey( $this->wanCache->makeKey( 'messages', $code ) );
                                // Also delete cached sidebar... just in case it is affected
                                // @TODO: shouldn't this be $code === $wgLanguageCode?
                                if ( $code === 'en' ) {
@@ -639,7 +641,7 @@ class MessageCache {
                                        $codes = [ $code ];
                                }
                                foreach ( $codes as $code ) {
-                                       $this->wanCache->delete( wfMemcKey( 'sidebar', $code ) );
+                                       $this->wanCache->delete( $this->wanCache->makeKey( 'sidebar', $code ) );
                                }
 
                                // Purge the message in the message blob store
@@ -684,7 +686,7 @@ class MessageCache {
         */
        protected function saveToCaches( array $cache, $dest, $code = false ) {
                if ( $dest === 'all' ) {
-                       $cacheKey = wfMemcKey( 'messages', $code );
+                       $cacheKey = $this->clusterCache->makeKey( 'messages', $code );
                        $success = $this->clusterCache->set( $cacheKey, $cache );
                        $this->setValidationHash( $code, $cache );
                } else {
@@ -707,7 +709,7 @@ class MessageCache {
                $value = $this->wanCache->get(
                        $this->wanCache->makeKey( 'messages', $code, 'hash', 'v1' ),
                        $curTTL,
-                       [ wfMemcKey( 'messages', $code ) ]
+                       [ $this->wanCache->makeKey( 'messages', $code ) ]
                );
 
                if ( $value ) {
@@ -1212,7 +1214,7 @@ class MessageCache {
                $langs = Language::fetchLanguageNames( null, 'mw' );
                foreach ( array_keys( $langs ) as $code ) {
                        # Global and local caches
-                       $this->wanCache->touchCheckKey( wfMemcKey( 'messages', $code ) );
+                       $this->wanCache->touchCheckKey( $this->wanCache->makeKey( 'messages', $code ) );
                }
 
                $this->mLoadedLanguages = [];
index f0a439a..cb1be95 100644 (file)
@@ -97,6 +97,8 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        private $callbackDepth = 0;
        /** @var mixed[] Temporary warm-up cache */
        private $warmupCache = [];
+       /** @var integer Key fetched */
+       private $warmupKeyMisses = 0;
 
        /** Max time expected to pass between delete() and DB commit finishing */
        const MAX_COMMIT_DELAY = 3;
@@ -298,10 +300,13 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                if ( $this->warmupCache ) {
                        $wrappedValues = array_intersect_key( $this->warmupCache, array_flip( $keysGet ) );
                        $keysGet = array_diff( $keysGet, array_keys( $wrappedValues ) ); // keys left to fetch
+                       $this->warmupKeyMisses += count( $keysGet );
                } else {
                        $wrappedValues = [];
                }
-               $wrappedValues += $this->cache->getMulti( $keysGet );
+               if ( $keysGet ) {
+                       $wrappedValues += $this->cache->getMulti( $keysGet );
+               }
                // Time used to compare/init "check" keys (derived after getMulti() to be pessimistic)
                $now = microtime( true );
 
@@ -1073,7 +1078,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *         // Time-to-live (in seconds)
         *         $cache::TTL_DAY,
         *         // Function that derives the new key value
-        *         return function ( $id, $oldValue, &$ttl, array &$setOpts ) {
+        *         function ( $id, $oldValue, &$ttl, array &$setOpts ) {
         *             $dbr = wfGetDB( DB_REPLICA );
         *             // Account for any snapshot/replica DB lag
         *             $setOpts += Database::getCacheSetOptions( $dbr );
@@ -1103,22 +1108,34 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        final public function getMultiWithSetCallback(
                ArrayIterator $keyedIds, $ttl, callable $callback, array $opts = []
        ) {
-               $keysWarmUp = iterator_to_array( $keyedIds, true );
                $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : [];
+
+               $keysWarmUp = [];
+               // Get all the value keys to fetch...
+               foreach ( $keyedIds as $key => $id ) {
+                       $keysWarmUp[] = self::VALUE_KEY_PREFIX . $key;
+               }
+               // Get all the check keys to fetch...
                foreach ( $checkKeys as $i => $checkKeyOrKeys ) {
                        if ( is_int( $i ) ) {
-                               $keysWarmUp[] = $checkKeyOrKeys;
+                               // Single check key that applies to all value keys
+                               $keysWarmUp[] = self::TIME_KEY_PREFIX . $checkKeyOrKeys;
                        } else {
-                               $keysWarmUp = array_merge( $keysWarmUp, $checkKeyOrKeys );
+                               // List of check keys that apply to value key $i
+                               $keysWarmUp = array_merge(
+                                       $keysWarmUp,
+                                       self::prefixCacheKeys( $checkKeyOrKeys, self::TIME_KEY_PREFIX )
+                               );
                        }
                }
 
                $this->warmupCache = $this->cache->getMulti( $keysWarmUp );
                $this->warmupCache += array_fill_keys( $keysWarmUp, false );
+               $this->warmupKeyMisses = 0;
 
                // Wrap $callback to match the getWithSetCallback() format while passing $id to $callback
                $id = null;
-               $func = function ( $oldValue, &$ttl, array $setOpts, $oldAsOf ) use ( $callback, &$id ) {
+               $func = function ( $oldValue, &$ttl, array &$setOpts, $oldAsOf ) use ( $callback, &$id ) {
                        return $callback( $id, $oldValue, $ttl, $setOpts, $oldAsOf );
                };
 
@@ -1316,6 +1333,14 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                return (int)min( $maxTTL, max( $minTTL, $factor * $age ) );
        }
 
+       /**
+        * @return integer Number of warmup key cache misses last round
+        * @since 1.30
+        */
+       public function getWarmupKeyMisses() {
+               return $this->warmupKeyMisses;
+       }
+
        /**
         * Do the actual async bus purge of a key
         *
index f84ffa9..2fe275b 100644 (file)
@@ -776,7 +776,7 @@ __INDEXATTR__;
                $safeseq = str_replace( "'", "''", $seqName );
                $res = $this->query( "SELECT nextval('$safeseq')" );
                $row = $this->fetchRow( $res );
-               $this->mInsertId = $row[0];
+               $this->mInsertId = is_null( $row[0] ) ? null : (int)$row[0];
 
                return $this->mInsertId;
        }
index a687900..5f8da15 100644 (file)
@@ -1177,7 +1177,7 @@ class WikiPage implements Page, IDBAccessObject {
                );
 
                if ( $dbw->affectedRows() > 0 ) {
-                       $newid = $pageId ?: $dbw->insertId();
+                       $newid = $pageId ? (int)$pageId : $dbw->insertId();
                        $this->mId = $newid;
                        $this->mTitle->resetArticleID( $newid );
 
index d1715d2..76ced3e 100644 (file)
@@ -222,6 +222,7 @@ class Names {
                'kab' => 'Taqbaylit', # Kabyle
                'kbd' => 'Адыгэбзэ', # Kabardian
                'kbd-cyrl' => 'Адыгэбзэ', # Kabardian (Cyrillic)
+               'kbp' => 'Kabɩyɛ', # Kabiyè
                'kg' => 'Kongo', # Kongo, (FIXME!) should probaly be KiKongo or KiKoongo
                'khw' => 'کھوار', # Khowar
                'ki' => 'Gĩkũyũ', # Gikuyu
index 298a0cc..9477067 100644 (file)
        "recentchanges-submit": "Amosar",
        "rcfilters-activefilters": "Filtros activos",
        "rcfilters-quickfilters": "Enllaces rápidos",
+       "rcfilters-quickfilters-placeholder": "Guarda la configuración favorita de la ferramienta pa volver a usala sero.",
        "rcfilters-savedqueries-defaultlabel": "Filtros guardaos",
        "rcfilters-savedqueries-rename": "Renomar",
        "rcfilters-savedqueries-setdefault": "Guardar como predeterminao",
-       "rcfilters-savedqueries-unsetdefault": "Desactivar predeterminao",
+       "rcfilters-savedqueries-unsetdefault": "Quitar predeterminao",
        "rcfilters-savedqueries-remove": "Desaniciar",
        "rcfilters-savedqueries-new-name-label": "Nome",
        "rcfilters-savedqueries-apply-label": "Crear enllaz rápidu",
        "mw-widgets-titleinput-description-redirect": "redirixir a $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Amestar una categoría...",
        "mw-widgets-usersmultiselect-placeholder": "Amestar más...",
+       "date-range-from": "Dende la data:",
+       "date-range-to": "Ata la data:",
        "sessionmanager-tie": "Nun puen combinase dellos tipos de solicitú d'identificación: $1.",
        "sessionprovider-generic": "sesiones $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesiones basaes en cookies",
        "rawhtml-notallowed": "Les etiquetes &lt;html&gt; nun pueden usase fuera de les páxines normales.",
        "gotointerwiki": "Dexando {{SITENAME}}",
        "gotointerwiki-invalid": "El títulu especificáu nun ye válidu.",
-       "gotointerwiki-external": "Tas a piques de dexar {{SITENAME}} pa visitar [[$2]], que ye un sitiu web distintu.\n\n[$1 Fai click equí pa siguir a $1].",
+       "gotointerwiki-external": "Tas a piques de dexar {{SITENAME}} pa visitar [[$2]], que ye un sitiu web distintu.\n\n'''[$1 Siguir a $1]'''",
        "undelete-cantedit": "Nun puedes desfacer el borráu d'esta páxina porque nun tienes permisu pa editala.",
        "undelete-cantcreate": "Nun puedes desfacer el borráu d'esta páxina porque nun existe nenguna páxina con esti nome y nun tienes permisu pa creala."
 }
index cdc89b5..28e82c2 100644 (file)
@@ -11,6 +11,8 @@
                        "Catrope"
                ]
        },
+       "underline-always": "Mocak",
+       "underline-never": "Nama wiskat",
        "sunday": "manactakaniwon",
        "monday": "ockorkananiwon",
        "tuesday": "nicw kicikaw",
@@ -73,6 +75,8 @@
        "october-date": "Namekosi pisimw $1",
        "november-date": "Atikamekw pisimw $1",
        "december-date": "Pitcipipon pisimw $1",
+       "period-am": "E pwamici apita kicikak",
+       "period-pm": "E ickwa apita kicikak",
        "pagecategories": "{{PLURAL:$1|Ka ici arimotcikatek|Ka ici arimotcikateki}}",
        "category_header": "Masinahikana ka ici arimotcikateki \"$1\"",
        "subcategories": "Awocamec ke ici arimotcikateki",
@@ -92,6 +96,8 @@
        "and": "&#32;kaie",
        "qbbrowse": "Nantowepaha",
        "qbedit": "Meckotcita",
+       "qbpageoptions": "Nohwe paskickwemakan",
+       "qbmyoptions": "Nipaskickwemakana",
        "namespaces": "Ka ici masinasotcik",
        "variants": "Pitoc",
        "navigation-heading": "Matcecikinikana",
index 649d68c..27c3f7d 100644 (file)
        "rcfilters-typeofchange-conflicts-hideminor": "Гэты фільтар тыпаў зьменаў канфліктуе зь фільтрам «Дробныя праўкі». Некаторыя тыпы зьменаў ня могуць быць вызначаныя як «дробныя».",
        "rcfilters-filtergroup-lastRevision": "Цяперашняя вэрсія",
        "rcfilters-filter-lastrevision-label": "Апошняя вэрсія",
+       "rcfilters-filter-lastrevision-description": "Апошняя зьмена на старонцы.",
        "rcnotefrom": "Ніжэй {{PLURAL:$5|знаходзіцца зьмена|знаходзяцца зьмены}} з <strong>$4 $3</strong> (да <strong>$1</strong> на старонку).",
        "rclistfromreset": "Скінуць выбар даты",
        "rclistfrom": "Паказаць зьмены з $2 $3",
index 6eb3d4f..ccdb1f2 100644 (file)
        "anonpreviewwarning": "Внимание: Не сте влезли в системата. Ако съхраните редакцията си, тя ще бъде записана в историята на страницата с вашият IP-адрес.",
        "missingsummary": "'''Напомняне:''' Не е въведено кратко описание на промените. При повторно натискане на бутона „Съхраняване“, редакцията ще бъде съхранена без резюме.",
        "missingcommenttext": "По-долу въведете вашето съобщение.",
-       "missingcommentheader": "<strong>Напомняне:</strong> Не е въведено заглавие на коментара.\nПри повторно натискане на „$1“, редакцията ще бъде записана без такова.",
+       "missingcommentheader": "<strong>Напомняне:</strong> Не е въведено заглавие на коментара.\nПри повторно натискане на „$1“, редакцията ще бъде записана без коментар.",
        "summary-preview": "Предварителен преглед на резюмето:",
        "subject-preview": "Предварителен преглед на заглавието:",
        "previewerrortext": "Възникна грешка при опита за преглед на промените.",
        "noarticletext": "Понастоящем няма текст на тази страница. Можете да [[Special:Search/{{PAGENAME}}|потърсите за заглавието на страницата]] в други страници, да <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} потърсите в съответните дневници] или [{{fullurl:{{FULLPAGENAME}}|action=edit}} да я създадете]</span>.",
        "noarticletext-nopermission": "Понастоящем в тази страница няма текст.\nМожете да [[Special:Search/{{PAGENAME}}|потърсите заглавието на тази страница ]] в други страници или да <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} потърсите в съответните дневници]</span>, но нямате права да създадете тази страница.",
        "missing-revision": "Версия #$1 на страницата „{{FULLPAGENAME}}“ не съществува.\n\nТова обикновено се дължи на препратка от историята на страницата, която е била изтрита.\nПодробности могат да бъдат открити в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневника на изтриванията].",
-       "userpage-userdoesnotexist": "Ð\9dÑ\8fма Ñ\80егиÑ\81Ñ\82Ñ\80иÑ\80ана Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елÑ\81ка Ñ\81меÑ\82ка Ð·Ð° â\80\9e$1â\80\9c. Ð\98зиÑ\81ква Ñ\81е Ð¿Ð¾Ñ\82вÑ\8aÑ\80ждение, Ñ\87е Ð¶ÐµÐ»Ð°ÐµÑ\82е Ð´Ð° Ñ\81Ñ\8aздадеÑ\82е/Ñ\80едакÑ\82иÑ\80аÑ\82е Ñ\82ази Ñ\81Ñ\82Ñ\80аниÑ\86а?",
+       "userpage-userdoesnotexist": "Ð\9dÑ\8fма Ñ\80егиÑ\81Ñ\82Ñ\80иÑ\80ана Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елÑ\81ка Ñ\81меÑ\82ка Ð·Ð° â\80\9e$1â\80\9c. Ð\9cолÑ\8f Ð¿Ð¾Ñ\82вÑ\8aÑ\80деÑ\82е, Ñ\87е Ð¶ÐµÐ»Ð°ÐµÑ\82е Ð´Ð° Ñ\81Ñ\8aздадеÑ\82е/Ñ\80едакÑ\82иÑ\80аÑ\82е Ñ\82ази Ñ\81Ñ\82Ñ\80аниÑ\86а.",
        "userpage-userdoesnotexist-view": "Не е регистрирана потребителска сметка на име „$1“.",
        "blocked-notice-logextract": "В момента този потребител е блокиран.\nПо-долу за справка е показан последният запис от Дневника на блокиранията:",
        "clearyourcache": "<strong>Забележка:</strong> За да се видят промените, необходимо е след съхраняване на страницата, кешът на браузъра да бъде изтрит.\n* <strong>Firefox / Safari:</strong> Задържа се клавиш <em>Shift</em> и се щраква върху <em>Презареждане</em> (<em>Reload</em>) или чрез клавишната комбинация <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> за Mac);\n* <strong>Google Chrome:</strong> клавишна комбинация <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> за Mac)\n* <strong>Internet Explorer:</strong> Задържа се клавиш <em>Ctrl</em> и се щраква върху <em>Refresh</em> или чрез клавишната комбинация <em>Ctrl-F5</em>;\n* <strong>Opera:</strong> кешът се изчиства през менюто <em>Tools → Settings</em> (<em>Opera → Preferences</em> за Mac) след което <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "unblocked-id": "Блок № $1 беше премахнат",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] е отблокиран.",
        "blocklist": "Блокирани потребители",
+       "autoblocklist": "Автоматични блокирания",
+       "autoblocklist-submit": "Търсене",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Локално автоматично блокиране|Локални автоматични блокирания}}",
+       "autoblocklist-empty": "Списъкът на автоматичните блокирания е празен.",
        "ipblocklist": "Блокирани потребители",
        "ipblocklist-legend": "Търсене на блокиран потребител",
        "blocklist-userblocks": "Скриване на блокирани потребителски сметки",
        "pageinfo-header-properties": "Характеристики на страницата",
        "pageinfo-display-title": "Показвано заглавие",
        "pageinfo-default-sort": "Ключ за сортиране по подразбиране",
-       "pageinfo-length": "Ð\93олемина на страницата (в байтове)",
+       "pageinfo-length": "РазмеÑ\80 на страницата (в байтове)",
        "pageinfo-article-id": "Номер на страницата",
        "pageinfo-language": "Език на съдържанието на страницата",
        "pageinfo-language-change": "промяна",
index 9e37a64..1d63110 100644 (file)
        "rawhtml-notallowed": "&lt;html&gt; ট্যাগ স্বাভাবিক পৃষ্ঠাগুলির বাহিরে ব্যবহার করা যাবে না।",
        "gotointerwiki": "{{SITENAME}} ছেড়ে যাচ্ছেন",
        "gotointerwiki-invalid": "নিদিষ্টকৃত শিরোনামটি অবৈধ ছিল।",
-       "gotointerwiki-external": "আপনি [[$2]] পরিদর্শন করতে {{SITENAME}} ছাড়তে চলেছেন যা একটি ভিন্ন ওয়েবসাইট।\n\n[$1 $1-এ অবিরত থাকতে এখানে ক্লিক করুন]।",
+       "gotointerwiki-external": "আপনি [[$2]] পরিদর্শন করতে {{SITENAME}} ছাড়তে চলেছেন যা একটি ভিন্ন ওয়েবসাইট।\n\n'''[$1 $1-এ চলুন]'''",
        "undelete-cantedit": "আপনি এই পাতাটি ফিরিয়ে আনতে পারবেন না কারণ আপনার এই পাতাটি সম্পাদনা করার অনুমতি নেই।",
        "undelete-cantcreate": "আপনি এই পাতাটি ফিরিয়ে আনতে পারবেন না কারণ এই নামে কোন পাতা বিদ্যমান নেই ও আপনার এই পাতাটি তৈরি করার অনুমতি নেই।"
 }
index d56a376..a5d58aa 100644 (file)
@@ -25,7 +25,8 @@
                        "Semso98",
                        "Matma Rex",
                        "Сербијана",
-                       "Asmen"
+                       "Asmen",
+                       "Obsuser"
                ]
        },
        "tog-underline": "Podvlačenje linkova:",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}",
        "limitreport-ppvisitednodes": "Broj predprocesiranih posjećenih nodova",
        "limitreport-ppgeneratednodes": "Broj predprocesiranih generiranih nodova",
-       "limitreport-postexpandincludesize": "Nakon proširenja navedi i veličinu",
+       "limitreport-postexpandincludesize": "Uključena veličina nakon proširenja",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
-       "limitreport-templateargumentsize": "Veličina stavke šablona",
+       "limitreport-templateargumentsize": "Veličina argumenata šablona",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
        "limitreport-expansiondepth": "Najveća dubina proširenja",
-       "limitreport-expensivefunctioncount": "Broj funkcije ekspenzivnog analizatora",
+       "limitreport-expensivefunctioncount": "Broj složenih funkcija raščlanjivača",
        "expandtemplates": "Proširi šablone",
        "expand_templates_intro": "Ova posebna stranica uzima neki tekst i proširuje sve šablone u njemu rekurzivno.\nOna također proširuje parserske funkcije poput\n<code><nowiki>{{</nowiki>#language:…}}</code> i varijable poput\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. U principu proširuje gotovo sve između dvostrukih zagrada.",
        "expand_templates_title": "Naslov konteksta, za {{FULLPAGENAME}} itd.:",
index cc60432..22f2745 100644 (file)
        "recentchanges-submit": "Show",
        "rcfilters-activefilters": "Active filters",
        "rcfilters-quickfilters": "Quick links",
-       "rcfilters-quickfilters-placeholder": "Save your favorite tool settings to re-use them later.",
+       "rcfilters-quickfilters-placeholder-title": "No links saved yet",
+       "rcfilters-quickfilters-placeholder-description": "To save your filter settings and reuse them later, click the bookmark icon in the Active Filter area, below.",
        "rcfilters-savedqueries-defaultlabel": "Saved filters",
        "rcfilters-savedqueries-rename": "Rename",
        "rcfilters-savedqueries-setdefault": "Set as default",
index 598d953..91a72a9 100644 (file)
        "rcfilters-savedqueries-defaultlabel": "Filtros guardados",
        "rcfilters-savedqueries-rename": "Cambiar nombre",
        "rcfilters-savedqueries-setdefault": "Activar por defecto",
-       "rcfilters-savedqueries-unsetdefault": "Desactivar por defecto",
+       "rcfilters-savedqueries-unsetdefault": "Eliminar por defecto",
        "rcfilters-savedqueries-remove": "Eliminar",
        "rcfilters-savedqueries-new-name-label": "Nombre",
        "rcfilters-savedqueries-apply-label": "Crear enlace rápido",
        "rawhtml-notallowed": "No se pueden emplear las etiquetas &lt;html&gt; si no es en las páginas normales.",
        "gotointerwiki": "Salir de {{SITENAME}}",
        "gotointerwiki-invalid": "El título especificado no es válido.",
-       "gotointerwiki-external": "Estás a punto de abandonar {{SITENAME}} para visitar [[$2]], un sitio web separado.\n\n[$1 Continuar a $1].",
+       "gotointerwiki-external": "Estás a punto de abandonar {{SITENAME}} para visitar [[$2]], un sitio web diferente.\n\n'''[$1 Continuar a $1]'''",
        "undelete-cantedit": "No puedes deshacer el borrado de esta página porque no tienes permisos para editarla.",
        "undelete-cantcreate": "No puedes deshacer el borrado de esta página porque no existe ninguna página con este nombre y no tienes permisos para crearla."
 }
index 25e90e2..fd286e3 100644 (file)
        "recentchanges-submit": "نمایش",
        "rcfilters-activefilters": "پالایه‌های فعال",
        "rcfilters-quickfilters": "پیوندهای سریع",
+       "rcfilters-quickfilters-placeholder": "تنظیمات ابزار مورد علاقه‌تان را برای استفاده مجدد در زمانی دیگر، ذخیره کنید.",
        "rcfilters-savedqueries-defaultlabel": "پالایه‌های ذخیره‌شده",
        "rcfilters-savedqueries-rename": "تغییر نام",
        "rcfilters-savedqueries-setdefault": "تنظیم به عنوان پیش‌فرض",
-       "rcfilters-savedqueries-unsetdefault": "بÙ\87 Ø¯Ø± Ø¢Ù\88ردÙ\86 از پیش‌فرض",
+       "rcfilters-savedqueries-unsetdefault": "حذÙ\81 از پیش‌فرض",
        "rcfilters-savedqueries-remove": "حذف",
        "rcfilters-savedqueries-new-name-label": "نام",
        "rcfilters-savedqueries-apply-label": "ایجاد پیوند سریع",
        "mw-widgets-titleinput-description-redirect": "تغییر مسیر به $1",
        "mw-widgets-categoryselector-add-category-placeholder": "در حال افزودن رده ...",
        "mw-widgets-usersmultiselect-placeholder": "افزودن بیشتر...",
+       "date-range-from": "از تاریخ:",
+       "date-range-to": "تا تاریخ:",
        "sessionmanager-tie": "نمی‌توان چندین نوع درخواست هویت‌سنجی را ترکیب کرد: $1.",
        "sessionprovider-generic": "$1 فصل",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "فصل‌های کوکی‌محور",
        "pageid": "شناسهٔ صفحهٔ $1",
        "rawhtml-notallowed": "برچسب‌های &lt;html&gt; را نمی‌توان خارج از صفحه‌های معمولی استفاده کرد.",
        "gotointerwiki": "در حال ترک {{SITENAME}}",
-       "gotointerwiki-invalid": "عÙ\86Ù\88اÙ\86 Ù\85شخص Ø´Ø¯Ù\87 Ù\86اÙ\85جاز Ø¨Ù\88د.",
-       "gotointerwiki-external": "شما در حال ترک {{SITENAME}} هستید تا [[$2]] را ببینید که یک وب‌گاه مجزا است.\n\n[$1 اینجا کلیک کنید تا به $1 بروید]",
+       "gotointerwiki-invalid": "عÙ\86Ù\88اÙ\86 Ù\85شخص Ø´Ø¯Ù\87 Ù\86اÙ\85جاز Ø§Ø³Øª.",
+       "gotointerwiki-external": "شما در حال ترک {{SITENAME}} هستید تا [[$2]] را ببینید که یک وب‌گاه مجزا است.\n\n'''[$1 ادامه تا $1]'''",
        "undelete-cantedit": "شما نمی‌توانید این صفحه را احیا کنید چون مجاز به ویرایش این صفحه نیستید.",
        "undelete-cantcreate": "شما نمی‌توانید این صفحه را احیا کنید چرا که صفحه‌ای به این نام همینک وجود ندارد و شما مجاز به ساختن آن نیستید."
 }
index f06dc25..a42f9ea 100644 (file)
        "confirmrecreate": "L’utilisat{{GENDER:$1|eur|rice}} [[User:$1|$1]] ([[User talk:$1|Discussion]]) a supprimé cette page, alors que vous aviez commencé à la modifier, pour le motif suivant :\n: <em>$2</em>\nVeuillez confirmer que vous désirez réellement recréer cette page.",
        "confirmrecreate-noreason": "L’utilisat{{GENDER:$1|eur|rice}} [[User:$1|$1]] ([[User talk:$1|Discussion]]) a supprimé cette page, alors que vous aviez commencé à la modifier. Veuillez confirmer que vous désirez réellement recréer cette page.",
        "recreate": "Recréer",
-       "confirm-purge-title": "Détruire cette page",
+       "confirm-purge-title": "Purger cette page",
        "confirm_purge_button": "Confirmer",
        "confirm-purge-top": "Voulez-vous rafraîchir cette page (purger le cache) ?",
        "confirm-purge-bottom": "Purger une page l’efface du cache et force sa dernière version à être affichée.",
index 7c09f8d..09762bf 100644 (file)
        "privacypage": "Project:Privacybelied",
        "badaccess": "Gjin tastimming",
        "badaccess-group0": "Jo hawwe gjin rjochten om de frege hanneling út te fieren.",
-       "badaccess-groups": "De frege hanneling is foarbehâlden oan brûkers yn {{PLURAL:$2|'e groep|ien fan de groepen}}: $1.",
+       "badaccess-groups": "De frege hanneling is foarbehâlden oan meidoggers yn {{PLURAL:$2|'e groep|ien fan de groepen}}: $1.",
        "versionrequired": "Ferzje $1 fan MediaWiki is eask",
        "versionrequiredtext": "Ferzje $1 fan MediaWiki is eask om dizze side te brûken. Mear ynfo is beskikber op 'e side [[Special:Version|softwareferzje]].",
        "ok": "OK",
        "preview": "Oerlêze",
        "showpreview": "Earst oerlêze",
        "showdiff": "Wizigings",
-       "anoneditwarning": "<strong>Warskôging:</strong> Jo binne net oanmeld. By it fêstlizzen wurdt jo ynternetadres opnaam yn de sideskiednis.",
+       "anoneditwarning": "<strong>Warskôging:</strong> Jo binne net oanmeld. By it fêstlizzen wurdt jo ynternetadres opnaam yn de sideskiednis. At jo <strong>[$1 oanmelde]</strong> of <strong>[$2 in akkount oanmeitsje]</strong> ferskine jo bewurkingen ûnder jo meidochnamme, njonken oare foardielen.",
        "missingsummary": "<strong>Tink derom:</strong> Jo hawwe gjin gearfetting jûn foar jo bewurking.\nAs jo nochris op ''Side opslaan'' klikke wurdt de bewurking sûnder gearfetting opslein.",
        "missingcommenttext": "Set jo opmerking beleaven hjir ûnder.",
        "missingcommentheader": "<strong>Tink derom:</strong> Jo hawwe gjin ûnderwerp/kop foar dizze opmerking opjûn.\ns jo op 'e nij op \"opslaan\" klikke, wurdt jo feroaring sûnder in ûnderwerp/kop opslein.",
        "accmailtext": "Samar in wachtwurd foar [[User talk:$1|$1]] is ferstjoerd nei $2. It kin wizige wurde op 'e side \n<em>[[Special:ChangePassword|Wachtwurd feroarje]]</em> nei oanmelden.",
        "newarticle": "(Nij)",
        "newarticletext": "Jo hawwe in keppeling folge nei in side dêr't noch gjin tekst op stiet.\nOm sels tekst te meistjsen kinne jo dy gewoan yntype in dit bewurkingsfjild\n([$1 Mear ynformaasje oer bewurkjen].)\nOars kinne jo tebek mei de tebek-knop fan jo blêder.",
-       "anontalkpagetext": "----''Dit is de oerlisside fan in ûnbekende meidogger; in meidogger dy't him/har net oanmeld hat. Om't der gjin namme bekend is, wurdt it ynternet-adres brûkt om oan te jaan wa. Mar faak is it sa dat sa'n adres net altyd troch deselde persoan brûkt wurdt. As jo it idee hawwe dat jo as ûnbekende meidogger opmerkings foar in oar krije, dan kinne jo jo [[Special:CreateAccount|registrearje]], of jo [[Special:UserLogin|oanmelde]]. Fan in oanmelde meidogger is it ynternet-adres net sichtber, en as oanmelde meidogger krije jo allinnich opmerkings dy't foar josels bedoeld binne.''",
+       "anontalkpagetext": "----\n<em>Dit is de oerlisside fan in ûnbekende meidogger; in meidogger dy't him/har net oanmeld hat.</em>\nOm't der gjin namme bekend is, wurdt it ynternet-adres brûkt om oan te jaan om wa't it giet.\nMar faak is it sa dat sa'n adres net altyd troch deselde persoan brûkt wurdt.\nAs jo it idee hawwe dat jo as ûnbekende meidogger opmerkings foar in oar krije, dan kinne jo jo [[Special:CreateAccount|registrearje]], of jo [[Special:UserLogin|oanmelde]]. Fan in oanmelde meidogger is it ynternet-adres net sichtber, en as oanmelde meidogger krije jo allinnich opmerkings dy't foar josels bedoeld binne.",
        "noarticletext": "Der stjit noch gjin tekst op dizze side. Jo kinne\n[[Special:Search/{{PAGENAME}}|hjirboppe nei dy tekst sykje]], of [{{fullurl:{{FULLPAGENAME}}|action=edit}} de side skriuwe].",
        "userpage-userdoesnotexist": "Jo bewurkje in brûkersside fan in brûker dy't net bestiet (brûker \"<nowiki>$1</nowiki>\").\nKontrolearje oft jo dizze side wol oanmeitsje/bewurkje wolle.",
        "clearyourcache": "<strong>Opmerking:</strong> Nei it fêstlizzen kin it nedich wêze de oerslach fan dyn blêder te leegjen foardat de wizigings te sjen binne.\n* <strong>Firefox / Safari:</strong> Hâld <em>Shift</em> yntreaun wylst jo op <em>Dizze side fernije</em> klikke, of typ <em>Ctrl-F5</em> of <em>Ctrl-R</em> (<em>⌘-R</em> op in Mac)\n* <strong>Google Chrome:</strong> Typ <em>CTRL-Shift-R</em> (<em>⌘-Shift-R</em> op in Mac)\n* <strong>Internet Explorer:</strong> Hâld <em>Ctrl</em> yntreaun wylst jo <em>Vernieuwen'' klikke of typ <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Leegje jo cache yn <em>Extra → Voorkeuren</em>",
        "timezoneregion-europe": "Jeropa",
        "timezoneregion-indian": "Yndyske Oseaan",
        "timezoneregion-pacific": "Stille Oseaan",
-       "allowemail": "Lit my ek netpost fan oare meidoggers krije",
+       "allowemail": "Lit my ek e-mail fan oare meidoggers ûntfange",
        "prefs-searchoptions": "Sykje",
        "prefs-namespaces": "Nammeromten",
        "default": "standert",
        "rollbacklink": "feroaring werom sette",
        "rollbackfailed": "Feroaring werom sette net slagge",
        "cantrollback": "Dizze feroaring kin net werom setten wurde, om't der mar ien skriuwer is.",
-       "alreadyrolled": "Kin de feroaring fan [[:$1]]\ntroch [[User:$2|$2]] ([[User talk:$2|Oerlis]]) net werom sette;\nin oar hat de feroaring werom set, of oars wat oan de side feroare.\n\nDe lêste feroaring wie fan [[User:$3|$3]] ([[User talk:$3|Oerlis]]).",
+       "alreadyrolled": "Kin de feroaring fan [[:$1]] troch [[User:$2|$2]] ([[User talk:$2|oerlis]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) net werom sette;\nin oar hat de feroaring werom set, of oars wat oan de side feroare.\n\nDe lêste feroaring wie fan [[User:$3|$3]] ([[User talk:$3|oerlis]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "De gearfetting wie: <em>$1</em>.",
        "revertpage": "Bewurkings fan [[Special:Contributions/$2|$2]] ([[User talk:$2|Oerlis]]) werom set ta de ferzje fan [[User:$1|$1]]",
        "rollback-success": "Feroarings werom set fan $1; werom set nei de lêste ferzje fan $2.",
        "undelete-show-file-submit": "Ja",
        "namespace": "Nammeromte:",
        "invert": "Seleksje útsein",
-       "blanknamespace": "(Haadnammerûmte)",
+       "blanknamespace": "(Ensyklopedy)",
        "contributions": "{{GENDER:$1|Meidogger}}-bydragen",
        "contributions-title": "Bydragen fan $1",
        "mycontris": "Bydragen",
        "ipbsubmit": "Slút dizze meidogger út",
        "ipbother": "In oare tiid:",
        "ipboptions": "2 oeren:2 hours,1 dei:1 day,3 dagen:3 days,1 wike:1 week,2 wiken:2 weeks,1 moanne:1 month,3 moanne:3 months,6 moanne:6 months,1 jier:1 year,ûnbeheind:infinite",
-       "badipaddress": "Gjin jildige IP-adres",
+       "badipaddress": "Gjin jildich IP-adres",
        "blockipsuccesssub": "Utsluting slagge",
        "blockipsuccesstext": "Meidogger [[Special:Contributions/$1|$1]] is útsletten.<br />\n(List fan [[Special:BlockList|útslette meidoggers]].)",
        "ipb-unblock-addr": "Lit $1 yn",
        "allmessagesname": "Namme",
        "allmessagesdefault": "Standerttekst",
        "allmessagescurrent": "Tekst yn de nijste ferzje",
-       "allmessagestext": "Dit is in list fan alle systeemberjochten beskikber yn de MediaWiki-nammeromte.\nSjoch: [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation], [https://translatewiki.net translatewiki.net].",
+       "allmessagestext": "Dit is in list fan alle systeemberjochten beskikber yn de MediaWiki-nammeromte.\nSjoch [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] en [https://translatewiki.net translatewiki.net] at jo bydrage wolle oan de basisoersettings fan MediaWiki.",
        "allmessages-filter-legend": "Filter",
        "allmessages-filter-all": "Alle",
        "allmessages-language": "Taal:",
index 3d89afe..73398af 100644 (file)
@@ -52,7 +52,8 @@
                        "Irus",
                        "Presidenvolksraad",
                        "Hidayatsrf",
-                       "MF-Warburg"
+                       "MF-Warburg",
+                       "Rachmat04"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
index 2798367..c0aa4ee 100644 (file)
        "post-expand-template-argument-warning": "'''Atençión:''' sta pàgina a contegne un ò ciù argomenti di template che son tròppo gràndi pe êse espansi. Sti argomenti no saiàn fæti védde.",
        "post-expand-template-argument-category": "Pàgine con di template che ghe mancàn di argoménti",
        "parser-template-loop-warning": "Rilevou loop do template: [[$1]]",
+       "template-loop-category": "Paggine con di template che se reciamman da lô",
+       "template-loop-category-desc": "A paggina a conten un template ch'o se reciamma da lê, saiv'a dî un template into quæ gh'è incruzo o template mæximo.",
        "parser-template-recursion-depth-warning": "Limmite de ricorscion into template superòu($1)",
        "language-converter-depth-warning": "Limmite de profonditæ do convertitô de lengoa superòu ($1)",
        "node-count-exceeded-category": "Paggine dovve l'è superòu o nummero di groppi.",
        "page_first": "primma",
        "page_last": "ûrtima",
        "histlegend": "Confronto tra verscioîn: selession-a e cascette corispondenti a-e verscioîn dexidiæ e schissa Invio oppû o pomello da basso.\n\nLegenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a verscion precedente, '''m''' = modiffica minô",
-       "history-fieldset-title": "Véddi a stöia",
-       "history-show-deleted": "Sôlo scancelæ",
+       "history-fieldset-title": "Çerca de verscioin",
+       "history-show-deleted": "Solo verscioin scassæ",
        "histfirst": "primma",
        "histlast": "urtima",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "search-file-match": "(corrispondença into contegnuo do file)",
        "search-suggest": "Fòscia ti voéivi: $1",
        "search-rewritten": "Mostro i risultæ pe $1. Atrimenti, çerca $2.",
-       "search-interwiki-caption": "Progetti fræ",
+       "search-interwiki-caption": "Risultæ da-i progetti fræ",
        "search-interwiki-default": "Risultæ da $1:",
        "search-interwiki-more": "(atro)",
+       "search-interwiki-more-results": "atri risultæ",
        "search-relatedarticle": "corelæ",
        "searchrelated": "corelæ",
        "searchall": "tùtti",
        "youremail": "Indirìsso email:",
        "username": "{{GENDER:$1|Nomme utente}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|do gruppo|di gruppi}}:",
+       "group-membership-link-with-expiry": "$1 (scin a $2)",
        "prefs-registration": "Dæta de registraçion:",
        "yourrealname": "Nomme vêo:",
        "yourlanguage": "Léngoa:",
        "prefs-help-prefershttps": "Questa preferença a l'aviâ effetto da-o proscimo accesso.",
        "prefswarning-warning": "T'hæ fæto de modiffiche a-e teu preferense che no son ancon stæte sarvæ.\nSe ti sciorti da sta paggina sensa sciaccâ \"$1\" e preferense no saian agiornæ.",
        "prefs-tabs-navigation-hint": "Suggeimento: ti peu deuviâ i pomelli co-a freccia scinistra e drita pe navegâ tra e schede inta lista de schede.",
-       "userrights": "Manezzo di driti di utenti",
+       "userrights": "Driti utente",
        "userrights-lookup-user": "Seleçion-a un utente",
        "userrights-user-editname": "Scrivi o teu nomme utente:",
        "editusergroup": "Carrega groppi utente",
        "editinguser": "Apreuvo a cangiâ i driti de l'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Vixualizaçion di driti de l'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modiffica i gruppi di utenti",
-       "userrights-viewusergroup": "Vixualizza groppi utente",
+       "userrights-editusergroup": "Modiffica groppi {{GENDER:$1|utente}}",
+       "userrights-viewusergroup": "Vixualizza groppi {{GENDER:$1|utente}}",
        "saveusergroups": "Sarva groppi {{GENDER:$1|utente}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro impliçito de:",
-       "userrights-groups-help": "L'è poscibile modificâ i groppi de st'utente:\n* Una casella marcâ voeu dî che l'utente o l'è inte quello groppo.\n* Una casella smarcâ voeu dî che l'utente o no l'è inte quello groppo.\n* O scimbolo * o voeu dî che no ti poeu smarcâ o groppo una votta che ti l'hæ azonto (ò viçeversa).",
+       "userrights-groups-help": "L'è poscibile modificâ i groppi de st'utente:\n* Una casella marcâ voeu dî che l'utente o l'è inte quello groppo.\n* Una casella smarcâ voeu dî che l'utente o no l'è inte quello groppo.\n* O scimbolo * o voeu dî che no ti poeu smarcâ o groppo una votta che ti l'hæ azonto (ò viçeversa).\n* O scimbolo # o l'indica che ti poeu solo portâ inderê a dæta da descheita de l'inscriçion a questo groppo; no l'è poscibbile portala avanti",
        "userrights-reason": "Raxon:",
        "userrights-no-interwiki": "No ti g'hæ i permissi pe modificâ i driti di utenti insce di atre wiki.",
        "userrights-nodatabase": "O database $1 o no l'esiste ò o no l'è un database locale.",
        "userrights-expiry-current": "O descazze o $1",
        "userrights-expiry-none": "O no descazze",
        "userrights-expiry": "O descazze:",
+       "userrights-expiry-existing": "Scadença attoale: $2, $3",
+       "userrights-expiry-othertime": "Atra duata:",
+       "userrights-expiry-options": "1 giorno:1 day,1 setteman-a:1 week,1 meise:1 month,3 meixi:3 months,6 meixi:6 months,1 anno:1 year",
+       "userrights-invalid-expiry": "A scadença pe-o groppo \"$1\" a no l'è vallida",
+       "userrights-expiry-in-past": "A scadença pe-o groppo \"$1\" a l'è za passâ.",
+       "userrights-cannot-shorten-expiry": "No ti poeu antiçipâ a descheita de l'inscriçion a-o groppo \"$1\". Soltanto i utenti co-o permisso de azonze e rimoeuve questo groppo poeuan antiçipâ e descheite.",
        "userrights-conflict": "Conflito de modiffica di driti utente! Pe piaxei controlla e conferma e teu modiffiche.",
        "group": "Gruppo:",
        "group-user": "Ûtenti",
        "action-upload_by_url": "caregâ sto file da un addreçço URL",
        "action-writeapi": "deuviâ l'API in scrittua",
        "action-delete": "scassâ 'sta paggina",
-       "action-deleterevision": "scassâ sta verscion",
-       "action-deletedhistory": "vixualizzâ a cronologia scassâ de sta pagina",
+       "action-deleterevision": "scassâ verscioin",
+       "action-deletelogentry": "scassâ e voxe de registro",
+       "action-deletedhistory": "vixualizzâ a cronologia scassâ de 'na paggina",
+       "action-deletedtext": "vixualizâ o testo de verscioin scassæ",
        "action-browsearchive": "çercâ paggine scassæ",
-       "action-undelete": "Recuppera sta paggina",
-       "action-suppressrevision": "rivedde e ripristinâ e modiffiche ascose",
+       "action-undelete": "recuperâ paggine",
+       "action-suppressrevision": "rivedde e ripristinâ e verscioin ascose",
        "action-suppressionlog": "vedde questo registro privou",
        "action-block": "bloccâ st'utente in scrittua",
        "action-protect": "modificâ i livelli de proteçion pe questa pagina",
        "action-userrights-interwiki": "modificâ i driti di utenti insce di atre wiki",
        "action-siteadmin": "broccâ e sbroccâ o database",
        "action-sendemail": "mandâ di e-mail",
+       "action-editmyoptions": "modificâ e proppie preferençe",
        "action-editmywatchlist": "modificâ a to lista di öservæ",
        "action-viewmywatchlist": "vedde i to öservæ speçiali",
        "action-viewmyprivateinfo": "vedde i proppi dæti personali",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veddi e [[Special:NewPages|neuve paggine]])",
        "recentchanges-submit": "Fanni vedde",
+       "rcfilters-activefilters": "Filtri attivi",
+       "rcfilters-quickfilters": "Inganci rappidi",
+       "rcfilters-quickfilters-placeholder": "Sarva e to impostaçioin prefeie pe riutilizâle doppo.",
+       "rcfilters-savedqueries-defaultlabel": "Filtri sarvæ",
+       "rcfilters-savedqueries-rename": "Rinommina",
+       "rcfilters-savedqueries-setdefault": "Imposta comme predefinio",
+       "rcfilters-savedqueries-unsetdefault": "Rimoeuvi comme predefinio",
+       "rcfilters-savedqueries-remove": "Leva",
+       "rcfilters-savedqueries-new-name-label": "Nomme",
+       "rcfilters-savedqueries-apply-label": "Crea ingancio rappido",
+       "rcfilters-savedqueries-cancel-label": "Anulla",
+       "rcfilters-savedqueries-add-new-title": "Sarva filtri comme ingancio rappido",
+       "rcfilters-restore-default-filters": "Ripristina i filtri predefinii",
+       "rcfilters-clear-all-filters": "Netezza tutti i filtri",
+       "rcfilters-search-placeholder": "Filtra i urtime modiffiche (navega ò comença a digitâ)",
+       "rcfilters-invalid-filter": "Filtro non vallido",
+       "rcfilters-empty-filter": "Nisciun filtro attivo. Se ghe vedde tutti i contributi.",
        "rcfilters-filterlist-title": "Filtri",
        "rcfilters-filterlist-whatsthis": "Cos'o l'è sto chì?",
        "rcfilters-filterlist-feedbacklink": "Lascia un commento in sciâ noeuva fonçionalitæ sperimentale",
        "rcfilters-filterlist-noresults": "Nisciun filtro atrovou",
        "rcfilters-noresults-conflict": "Nisciun risultou trovou percose i critei de çerchia son in conflito",
        "rcfilters-state-message-subset": "Sto filtro chì o no g'ha effetto percose i so risultæ son incluxi con quelli  {{PLURAL:$2|do seguente filtro ciu ampio|di  seguenti filtri ciu ampi}} (proeuva a evidençiâli pe distinguili): $1",
+       "rcfilters-state-message-fullcoverage": "A seleçion de tutti i filtri inte 'n groppo l'è comme no seleçionâne manc'un, coscì che sto filtro o no fa effetto. O groppo o l'includde: $1",
+       "rcfilters-filtergroup-registration": "Registraçion utente",
+       "rcfilters-filter-registered-label": "Registrou",
+       "rcfilters-filter-unregistered-label": "Non registrou",
+       "rcfilters-filtergroup-authorship": "Aotô do contributo",
+       "rcfilters-filter-editsbyself-label": "E to modiffiche",
+       "rcfilters-filter-editsbyself-description": "I to contributi.",
+       "rcfilters-filter-editsbyother-label": "E modiffiche di atri",
+       "rcfilters-filter-editsbyother-description": "Tutte e modiffiche sarvo e to.",
+       "rcfilters-filtergroup-userExpLevel": "Livello d'esperiença (solo pe i utenti registræ)",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Noeuvi utenti",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Meno de 10 modiffiche e 4 giorni d'attivitæ.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Utenti con esperiença",
+       "rcfilters-filter-user-experience-level-experienced-description": "Ciù de 30 giorni d'attivitæ e 500 modiffiche.",
+       "rcfilters-filtergroup-automated": "Contributi aotomattichi",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Modiffiche effettoæ da strumenti aotomattichi.",
+       "rcfilters-filter-humans-label": "Umoen (non bot)",
+       "rcfilters-filter-humans-description": "Modiffiche effettoæ da di contributoî umoen.",
+       "rcfilters-filtergroup-reviewstatus": "Stato da revixon",
+       "rcfilters-filter-patrolled-label": "Veificæ",
+       "rcfilters-filter-patrolled-description": "Modiffiche contrassegnæ comme veificæ.",
+       "rcfilters-filter-unpatrolled-label": "Non veificæ",
+       "rcfilters-filter-unpatrolled-description": "Modiffiche non contrassegnæ comme veificæ.",
+       "rcfilters-filtergroup-significance": "Scignificou",
+       "rcfilters-filter-minor-label": "Cangiamenti menoî",
+       "rcfilters-filter-minor-description": "Modiffiche che l'aoto o l'ha indicou comme minoî.",
+       "rcfilters-filter-major-label": "Cangiamenti non menoî",
+       "rcfilters-filter-watchlist-watched-label": "Sotta oservaçion",
+       "rcfilters-filtergroup-changetype": "Tipo de modiffica",
+       "rcfilters-filter-pageedits-label": "Modiffiche a-e paggine",
+       "rcfilters-filter-newpages-label": "Creaçioin de paggine",
+       "rcfilters-filter-logactions-description": "Açioin aministrative, creaçioin utençe, eliminaçioin paggine, caregamenti....",
+       "rcfilters-filtergroup-lastRevision": "Urtima revixon",
+       "rcfilters-filter-lastrevision-label": "Urtima revixon",
+       "rcfilters-filter-lastrevision-description": "I urtime modiffiche a 'na paggina.",
+       "rcfilters-filter-previousrevision-label": "Verscioin precedente",
        "rcnotefrom": "Chì sotta gh'è {{PLURAL:$5|o cangiamento|i cangiamenti}} a partî da <strong>$3, $4</strong> (scin a '''$1''').",
        "rclistfrom": "Fanni vedde e modiffiche apportæ partindo da $3 $2",
        "rcshowhideminor": "$1 cangiaménti minoî",
        "apisandbox-sending-request": "Invio recesta de API...",
        "apisandbox-loading-results": "Riceçion di risultæ de API in corso...",
        "apisandbox-results-error": "S'è veificou un errô durante o caregamento da risposta a l'interrogaçion API: $1",
+       "apisandbox-request-selectformat-label": "Mostra i dæti recesti comme:",
        "apisandbox-request-url-label": "URL de recesta:",
        "apisandbox-request-time": "Tempo richiesto: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Correzi token e reinvia",
        "magiclink-tracking-rfc-desc": "Sta paggina a l'adoeuevia di inganci maggichi RFC. Amia [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] insce comme ezeguî a migraçion.",
        "magiclink-tracking-pmid": "Paggine ch'adoeuvian di inganci maggichi PMID",
        "magiclink-tracking-pmid-desc": "Sta paggina a l'adoeuvia dio inganci maggichi PMID. Amia [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sciu comme exeguî a migraçion.",
+       "magiclink-tracking-isbn": "Paggine ch'adoeuvian di inganci maggichi ISBN",
+       "magiclink-tracking-isbn-desc": "Sta paggina a l'adoeuvia di inganci maggichi ISBN. Amia [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sciu comme exeguî a migraçion.",
        "specialloguserlabel": "Açion effettuâ da:",
        "speciallogtitlelabel": "Açion effettuâ sciu (tittolo da paggina ò {{ns:user}}:Nomme utente):",
        "log": "Log",
        "activeusers-intro": "Questo o l'è un elenco di utenti ch'han avuo quarche tipo d'attivitæ da $1 {{PLURAL:$1|giorno|giorni}} a questa parte.",
        "activeusers-count": "$1 {{PLURAL:$1|açion|açioin}} {{PLURAL:$3|inte l'urtimo giorno|inti urtimi $3 giorni}}",
        "activeusers-from": "Mostra i utenti a partî da:",
+       "activeusers-groups": "Vixualizza i utenti ch'apartegnan a di groppi:",
+       "activeusers-excludegroups": "Escluddi i utenti ch'apartegnan a di groppi:",
        "activeusers-noresult": "Nisciun utente o risponde a-i critei impostæ.",
        "activeusers-submit": "Mostra utenti attivi",
        "listgrouprights": "Driti do groppo utente",
        "emailccsubject": "Coppia do messaggio inviou a $1: $2",
        "emailsent": "E-mail spedïa",
        "emailsenttext": "A teu e-mail a l'è stæta spedïa.",
-       "emailuserfooter": "Questa email a l'è stæta {{GENDER:$1|inviâ}} da $1 a {{GENDER:$2|$2}} a traverso a fonçion \"{{int:emailuser}}\" insce {{SITENAME}}.",
+       "emailuserfooter": "Questa email a l'è stæta {{GENDER:$1|inviâ}} da $1 a {{GENDER:$2|$2}} a traverso a fonçion \"{{int:emailuser}}\" insce {{SITENAME}}. Se {{GENDER:$2|ti ghe rispondi}}, a to email de risposta a saiâ spedia direttamente {{GENDER:$1|a-o|a-a}} mittente originâ, rivelando{{GENDER:$1|ghe}} o {{GENDER:$2|to}} adresso de posta elettronica.",
        "usermessage-summary": "Messaggio de scistema",
        "usermessage-editor": "Messaggê de scistema",
        "watchlist": "Sotta osservassion",
index 884d21d..f10cdb6 100644 (file)
        "post-expand-template-argument-warning": "'''သတိပေးချက် -''' ဤစာမျက်နှာတွင် ပမာဏအားဖြင့် ကြီးမားကျယ်ပြန့်သော template argument တစ်ခုပါဝင်သည်။\nယင်း arguments များကို ဖယ်ထုတ်လိုက်သည်။",
        "post-expand-template-argument-category": "ဖယ်ထုတ်ထားသော template arguments များပါဝင်သည့် စာမျက်နှာများ",
        "parser-template-loop-warning": "တမ်းပလိတ်များ လှည့်ပတ်ဆက်စပ် နေသည်ကို တွေ့ရသည်။ [[$1]]",
-       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ဆွေးနွေး]]) ၏ $1 ပြင်ဆင်ချက် $1 ကို ပြန်လည်ပယ်ဖျက်လိုက်သည်",
+       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ဆွေးနွေး]]) ၏ တည်းဖြတ်မူ $1 ကို ပြန်လည်ပယ်ဖျက်လိုက်သည်",
        "viewpagelogs": "ဤစာမျက်နှာအတွက် မှတ်တမ်းများကို ကြည့်ရန်",
        "nohistory": "ဤစာမျက်နှာတွင် တည်းဖြတ်မှု ရာဇဝင်မရှိပါ",
        "currentrev": "နောက်ဆုံးမူ",
index 694ef74..3c9791e 100644 (file)
        "recentchanges-submit": "Label for submit button in [[Special:RecentChanges]]\n{{Identical|Show}}",
        "rcfilters-activefilters": "Title for the filters selection showing the active filters.",
        "rcfilters-quickfilters": "Label for the button that opens the quick filters menu in [[Special:RecentChanges]]",
-       "rcfilters-quickfilters-placeholder": "Text shown in the quick filters menu on [[Special:RecentChanges]] if the user has not saved any quick filters.",
+       "rcfilters-quickfilters-placeholder-title": "Title for the text shown in the quick filters menu on [[Special:RecentChanges]] if the user has not saved any quick filters.",
+       "rcfilters-quickfilters-placeholder-description": "Description for the text shown in the quick filters menu on [[Special:RecentChanges]] if the user has not saved any quick filters.",
        "rcfilters-savedqueries-defaultlabel": "Default name for saving a new set of quick filters [[Special:RecentChanges]]",
        "rcfilters-savedqueries-rename": "Label for the menu option that edits a quick filter in [[Special:RecentChanges]]\n{{Identical|Rename}}",
        "rcfilters-savedqueries-setdefault": "Label for the menu option that sets a quick filter as default in [[Special:RecentChanges]]",
index aed37e7..8358378 100644 (file)
        "duration-centuries": "$1 {{PLURAL:$1|век|века|векова}}",
        "duration-millennia": "$1 {{PLURAL:$1|миленијум|миленијума|миленијума}}",
        "rotate-comment": "Слика је ротирана за $1° у смеру казаљке на сату",
+       "limitreport-title": "Подаци профилисања анализатора:",
+       "limitreport-cputime": "Време коришћења CPU",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|секунда|секунд|секунди}}",
        "limitreport-walltime": "Коришћење у реалном времену",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|секунда|секунди}}",
+       "limitreport-ppvisitednodes": "Број предпроцесираних посећених нодова",
+       "limitreport-ppgeneratednodes": "Број предпроцесираних генерисаних нодова",
+       "limitreport-postexpandincludesize": "Укључена величина након проширења",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|бајт|бајта|бајтова}}",
+       "limitreport-templateargumentsize": "Величина аргумената шаблона",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|бајт|бајта|бајтова}}",
+       "limitreport-expansiondepth": "Највећа дубина проширења",
+       "limitreport-expensivefunctioncount": "Број „скупих” функција анализатора",
        "expandtemplates": "Замена шаблона",
        "expand_templates_intro": "Ова посебна страница узима текст и мења све шаблоне у њему рекурзивно.\nТакође мења функције парсера као што је <code><nowiki>{{</nowiki>#language:…}}</code> и променљиве као што је <code><nowiki>{{</nowiki>CURRENTDAY}}</code>. \nЗаправо практично све што се налази између витичастих заграда.",
        "expand_templates_title": "Назив контекста; за {{СТРАНИЦА}} итд.:",
index 6e0f085..6204632 100644 (file)
@@ -25,7 +25,8 @@
                        "Matma Rex",
                        "Mega Aleksandar",
                        "Asmen",
-                       "Obsuser"
+                       "Obsuser",
+                       "Zoranzoki21"
                ]
        },
        "tog-underline": "Podvlačenje veza:",
        "toolbox": "Alatke",
        "tool-link-userrights": "Promeni {{GENDER:$1|korisnik}} grupe",
        "tool-link-userrights-readonly": "Prikaži {{GENDER:$1|korisnik}} grupe",
-       "tool-link-emailuser": "Pošalji imejl",
+       "tool-link-emailuser": "Pošalji imejl {{GENDER:$1|korisniku|korisnici}}",
        "userpage": "Pogledaj korisničku stranicu",
        "projectpage": "Pogledaj stranicu projekta",
        "imagepage": "Pogledaj stranicu datoteke",
        "duration-centuries": "$1 {{PLURAL:$1|vek|veka|vekova}}",
        "duration-millennia": "$1 {{PLURAL:$1|milenijum|milenijuma|milenijuma}}",
        "rotate-comment": "Slika je rotirana za $1° u smeru kazaljke na satu",
+       "limitreport-title": "Podaci profilisanja analizatora:",
+       "limitreport-cputime": "Vreme korišćenja CPU",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|sekunda|sekund|sekundi}}",
+       "limitreport-walltime": "Korišćenje u realnom vremenu",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|sekund|sekunde|sekundi}}",
+       "limitreport-ppvisitednodes": "Broj predprocesiranih posećenih nodova",
+       "limitreport-ppgeneratednodes": "Broj predprocesiranih generisanih nodova",
+       "limitreport-postexpandincludesize": "Uključena veličina nakon proširenja",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
+       "limitreport-templateargumentsize": "Veličina argumenata šablona",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
+       "limitreport-expansiondepth": "Najveća dubina proširenja",
+       "limitreport-expensivefunctioncount": "Broj „skupih” funkcija analizatora",
        "expandtemplates": "Zamena šablona",
        "expand_templates_intro": "Ova posebna stranica uzima tekst i menja sve šablone u njemu rekurzivno.\nTakođe menja funkcije parsera kao što je <code><nowiki>{{</nowiki>#language:…}}</code> i promenljive kao što je <code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nZapravo praktično sve što se nalazi između vitičastih zagrada.",
        "expand_templates_title": "Naziv konteksta; za {{STRANICA}} itd.:",
index 800b4d4..ba31f03 100644 (file)
@@ -94,7 +94,8 @@
                        "1917 Ekim Devrimi",
                        "Asmen",
                        "Stephanecbisson",
-                       "Alerque"
+                       "Alerque",
+                       "Bulgu"
                ]
        },
        "tog-underline": "Bağlantıların altını çizme:",
        "invalid-content-data": "Geçersiz içerik verisi",
        "content-not-allowed-here": "\"$1\" içeriğine, [[$2]] sayfasında izin verilmemekte.",
        "editwarning-warning": "Bu sayfadan ayrılmak yaptığınız herhangi bir değişikliği kaybetmenize sebep olabilir.\nEğer giriş yaptıysanız, bu uyarıyı, tercihlerinizin \"{{int:prefs-editing}}\" bölümünde devre dışı bırakabilirsiniz.",
+       "editpage-invalidcontentmodel-text": "\"$1\" içerik modeli desteklenmemektedir.",
        "editpage-notsupportedcontentformat-title": "İçerik biçimi desteklenmiyor",
        "editpage-notsupportedcontentformat-text": "$1 içerik biçimi $2 içerik modeli tarafından desteklenmiyor.",
        "content-model-wikitext": "vikimetin",
        "userrights-nodatabase": "$1 veritabanı mevcut veya bölgesel değil",
        "userrights-changeable-col": "Değiştirebildiğiniz gruplar",
        "userrights-unchangeable-col": "Değiştiremediğiniz gruplar",
-       "userrights-expiry-current": "$2 günü saat $3 itibarıyla sona eriyor",
+       "userrights-expiry-current": "$1 tarihi itibarıyla sona eriyor",
        "userrights-expiry-none": "Süresiz",
        "userrights-expiry": "Bitiş:",
        "userrights-expiry-existing": "Mevcut bitiş süresi: $2 $3",
        "addedwatchtext": "\"[[:$1]]\" sayfası [[Special:Watchlist|izleme listenize]] eklenmiştir.\nBundan sonra, bu sayfaya ve ilgili tartışma sayfasına yapılacak değişiklikler burada listelenecek.",
        "addedwatchtext-short": "\"$1\" sayfası izleme listenize eklendi.",
        "removewatch": "İzleme listesinden kaldır",
-       "removedwatchtext": "\"[[:$1]]\" sayfası [[Special:Watchlist|izleme listenizden]] silinmiştir.",
+       "removedwatchtext": "\"[[:$1]]\" sayfası, tartışma sayfası ile birlikte [[Special:Watchlist|izleme listenizden]] silinmiştir.",
        "removedwatchtext-short": "\"$1\" sayfası izleme listenizden çıkarıldı.",
        "watch": "izle",
        "watchthispage": "Sayfayı izle",
        "undeletepagetext": "Aşağıdaki {{PLURAL:$1|sayfa|$1 sayfa}} silinmiştir ama hala arşivdedir ve geri getirilebilir.\nArşiv düzenli olarak temizlenebilir.",
        "undelete-fieldset-title": "Revizyonları geri yükle",
        "undeleteextrahelp": "Sayfanın tüm geçmişini geri getirmek için onay kutularını boş bırakarak '''''{{int:undeletebtn}}''''' tuşuna tıklayın.\nSayfanın geçmişini ayrı ayrı getirmek için geri getirmek istediğiniz değişikliklerin onay kutularını seçip '''''{{int:undeletebtn}}''''' tuşuna tıklayın.",
-       "undeleterevisions": "$1 {{PLURAL:$1|revizyon|revizyon}} arşivlendi",
+       "undeleterevisions": "$1 revizyon silindi",
        "undeletehistory": "Eğer sayfayı geri getirirseniz, tüm revizyonlar geçmişe geri getirilecektir.\nSilindikten sonra aynı isimle yeni bir sayfa oluşturulmuşsa, geri gelen revizyonlar varolan sayfanın geçmişinde görünecektir.",
        "undeleterevdel": "Eğer üst sayfada sonuçlanacaksa ya da dosya revizyonu kısmen silinmiş ise, silmeyi geri alma uygulanamaz.\nBöyle durumlarda, en yeni silinen revizyonu seçmemeli ya da gizlemesini kaldırmalısınız.",
        "undeletehistorynoadmin": "Bu madde silinmiştir. Silinme sebebi ve silinme öncesinde maddeyi düzenleyen kullanıcıların detayları aşağıdaki özette verilmiştir. Bu silinmiş sürümlerin metinleri ise sadece hizmetliler tarafından görülebilir.",
        "tooltip-pt-watchlist": "Değişiklikler için izlemeye aldığınız sayfaların listesi",
        "tooltip-pt-mycontris": "{{GENDER:|Katkılarınızın}} listesi",
        "tooltip-pt-anoncontribs": "Bu IP adresinden yapılmış değişiklikler listesi",
-       "tooltip-pt-login": "Oturum açmanız tavsiye edilmektedir; ancak bu zorunda değildir",
+       "tooltip-pt-login": "Oturum açmanız tavsiye edilmektedir; ancak bu zorunlu değildir",
        "tooltip-pt-logout": "Sistemden çık",
        "tooltip-pt-createaccount": "Bir hesap oluşturup oturum açmanız tavsiye edilmektedir ancak bu zorunlu değildir",
        "tooltip-ca-talk": "İçerik ile ilgili tartışma",
        "scarytranscludefailed-httpstatus": "[$1 için şablon alımı başarısız oldu: HTTP $2]",
        "scarytranscludetoolong": "[URL çok uzun]",
        "deletedwhileediting": "'''Uyarı''': Bu sayfa siz değişiklik yapmaya başladıktan sonra silinmiş!",
-       "confirmrecreate": "Bu sayfayı [[User:$1|$1]] ([[User talk:$1|mesaj]]) kullanıcısı siz sayfada değişiklik yaparken silmiştir, nedeni:\n: ''$2''\nSayfayı baştan açmak isityorsanız, lütfen onaylayın.",
+       "confirmrecreate": "Bu sayfayı [[User:$1|$1]] ([[User talk:$1|mesaj]]) kullanıcısı siz sayfada değişiklik yaparken silmiştir, nedeni:\n: ''$2''\nSayfayı baştan açmak istiyorsanız, lütfen onaylayın.",
        "confirmrecreate-noreason": "[[User:$1|$1]] ([[User talk:$1|mesaj]]) adlı kullanıcı, siz değişiklik yapmaya başladıktan sonra bu sayfayı sildi. Lütfen bu sayfayı gerçekten yeniden oluşturmak istediğinizi onaylayın.",
        "recreate": "Canlandır",
        "unit-pixel": "px",
        "mw-widgets-mediasearch-noresults": "Sonuç bulunamadı.",
        "mw-widgets-titleinput-description-new-page": "sayfa henüz mevcut değil",
        "mw-widgets-titleinput-description-redirect": "$1'e yönlendirildi",
+       "mw-widgets-categoryselector-add-category-placeholder": "Bir kategori ekle...",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "çerez tabanlı oturumlar",
        "sessionprovider-nocookies": "Çerezler devre dışı olabilir. Çerkezlerin aktif olduğuna emin olun ve yeniden başlatin.",
        "randomrootpage": "Rastgele kök sayfası",
index 265800e..6a2d3bf 100644 (file)
@@ -40,6 +40,7 @@
  * @ingroup Maintenance
  */
 class BaseDump {
+       /** @var XMLReader */
        protected $reader = null;
        protected $atEnd = false;
        protected $atPageEnd = false;
index 581f0d7..c6e9aad 100644 (file)
@@ -33,7 +33,12 @@ use Wikimedia\Rdbms\IMaintainableDatabase;
  * @ingroup Maintenance
  */
 class TextPassDumper extends BackupDumper {
+       /** @var BaseDump */
        public $prefetch = null;
+       /** @var string|bool */
+       private $thisPage;
+       /** @var string|bool */
+       private $thisRev;
 
        // when we spend more than maxTimeAllowed seconds on this run, we continue
        // processing until we write out the next complete page, then save output file(s),
@@ -583,8 +588,7 @@ TEXT
                                if ( $text === false && isset( $this->prefetch ) && $prefetchNotTried ) {
                                        $prefetchNotTried = false;
                                        $tryIsPrefetch = true;
-                                       $text = $this->prefetch->prefetch( intval( $this->thisPage ),
-                                               intval( $this->thisRev ) );
+                                       $text = $this->prefetch->prefetch( (int)$this->thisPage, (int)$this->thisRev );
 
                                        if ( $text === null ) {
                                                $text = false;
index 458dacf..142a4e5 100644 (file)
@@ -24,6 +24,7 @@
  */
 
 require_once __DIR__ . '/Maintenance.php';
+use MediaWiki\MediaWikiServices;
 
 /**
  * Maintenance script that rebuilds recent changes from scratch.
@@ -478,15 +479,16 @@ class RebuildRecentchanges extends Maintenance {
        }
 
        /**
-        * Purge cached feeds in $messageMemc
+        * Purge cached feeds in $wanCache
         */
        private function purgeFeeds() {
-               global $wgFeedClasses, $messageMemc;
+               global $wgFeedClasses;
 
                $this->output( "Deleting feed timestamps.\n" );
 
+               $wanCache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                foreach ( $wgFeedClasses as $feed => $className ) {
-                       $messageMemc->delete( wfMemcKey( 'rcfeed', $feed, 'timestamp' ) ); # Good enough for now.
+                       $wanCache->delete( $wanCache->makeKey( 'rcfeed', $feed, 'timestamp' ) ); # Good enough for now.
                }
        }
 }
index 4237639..d100078 100644 (file)
@@ -1685,6 +1685,7 @@ return [
        'mediawiki.page.watch.ajax' => [
                'scripts' => 'resources/src/mediawiki/page/watch.js',
                'dependencies' => [
+                       'mediawiki.page.startup',
                        'mediawiki.api.watch',
                        'mediawiki.notify',
                        'mediawiki.util',
@@ -1804,7 +1805,8 @@ return [
                'messages' => [
                        'rcfilters-activefilters',
                        'rcfilters-quickfilters',
-                       'rcfilters-quickfilters-placeholder',
+                       'rcfilters-quickfilters-placeholder-title',
+                       'rcfilters-quickfilters-placeholder-description',
                        'rcfilters-savedqueries-defaultlabel',
                        'rcfilters-savedqueries-rename',
                        'rcfilters-savedqueries-setdefault',
index 9d3df8c..ac4a392 100644 (file)
                if ( e ) {
                        if (
                                e.type === 'click' &&
-                               e.target.nodeName.toLowerCase() === 'a'
+                               e.target.nodeName.toLowerCase() === 'a' &&
+                               $( e.target ).attr( 'href' )
                        ) {
                                // Don't fire if a link was clicked (for premade togglers)
                                return;
index 66ceb64..fb0b93b 100644 (file)
@@ -1,5 +1,5 @@
 .mw-rcfilters-ui-savedLinksListItemWidget {
-       padding: 0.5em;
+       padding: 0.2em 0.7em;
 
        &:hover {
                // Mimicking optionWidget styles
                vertical-align: middle;
        }
 
-       &:not( .oo-ui-iconElement ) .oo-ui-iconElement-icon {
-               // The iconElement-icon class still appears when we
-               // have an empty icon, and we need it to pretend to
-               // be there so the text has the same alignment as
-               // text next to a visible icon. #ThanksOOUI
-               width: 1.875em;
-               height: 1.875em;
+       .oo-ui-iconElement-icon {
+               // Since we made the rows narrower (height smaller than usual)
+               // then the icon needs to be slightly smaller as well, so that
+               // when we toggle 'default' the icon doesn't bounce the option
+               // height up a little
+               width: 1.7em;
+               height: 1.7em;
        }
 
        &-icon span {
@@ -38,6 +38,7 @@
                overflow: hidden;
                cursor: pointer;
                margin-left: 0.5px;
+               color: #36c; // Accent50;
        }
 
        &-icon,
index 5bda034..716ed03 100644 (file)
@@ -6,6 +6,11 @@
        }
 
        &-placeholder {
+               &-title {
+                       font-weight: bold;
+                       margin-bottom: 1em;
+               }
+
                // Extra specificity needed to override OOUI rule that sets white-space: nowrap;
                // on labels inside options
                &.oo-ui-optionWidget .oo-ui-labelElement-label {
 
                .oo-ui-iconElement-icon {
                        opacity: 0.5;
+                       // Override OOUI option widget rules for icons
+                       // we want the icon to appear at the top near the
+                       // title, not in the middle of the multiline option
+                       top: 0.7em !important; /* stylelint-disable-line declaration-no-important */
+                       height: inherit !important; /* stylelint-disable-line declaration-no-important */
                }
        }
 }
index 44b48b8..acda29e 100644 (file)
                                                $( '<div>' )
                                                        .addClass( 'mw-rcfilters-ui-row' )
                                                        .append(
-                                                               $( '<div>' )
-                                                                       .addClass( 'mw-rcfilters-ui-cell' )
-                                                                       .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget-icon' )
-                                                                       .append( this.$icon ),
                                                                $( '<div>' )
                                                                        .addClass( 'mw-rcfilters-ui-cell' )
                                                                        .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget-content' )
                                                                                this.editInput.$element,
                                                                                this.saveButton.$element
                                                                        ),
+                                                               $( '<div>' )
+                                                                       .addClass( 'mw-rcfilters-ui-cell' )
+                                                                       .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget-icon' )
+                                                                       .append( this.$icon ),
                                                                this.popupButton.$element
                                                                        .addClass( 'mw-rcfilters-ui-cell' )
                                                        )
 
                        this.editInput.toggle( isEdit );
                        this.$label.toggleClass( 'oo-ui-element-hidden', isEdit );
+                       this.$icon.toggleClass( 'oo-ui-element-hidden', isEdit );
                        this.popupButton.toggle( !isEdit );
                        this.saveButton.toggle( isEdit );
 
index 91c05b2..8c021d0 100644 (file)
         * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
         */
        mw.rcfilters.ui.SavedLinksListWidget = function MwRcfiltersUiSavedLinksListWidget( controller, model, config ) {
+               var $labelNoEntries = $( '<div>' )
+                       .append(
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-savedLinksListWidget-placeholder-title' )
+                                       .text( mw.msg( 'rcfilters-quickfilters-placeholder-title' ) ),
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-savedLinksListWidget-placeholder-description' )
+                                       .text( mw.msg( 'rcfilters-quickfilters-placeholder-description' ) )
+                       );
+
                config = config || {};
 
                // Parent
@@ -22,7 +32,7 @@
 
                this.placeholderItem = new OO.ui.DecoratedOptionWidget( {
                        classes: [ 'mw-rcfilters-ui-savedLinksListWidget-placeholder' ],
-                       label: mw.msg( 'rcfilters-quickfilters-placeholder' ),
+                       label: $labelNoEntries,
                        icon: 'unClip'
                } );
                // The only reason we're using "ButtonGroupWidget" here is that
index cedb623..32fa468 100644 (file)
@@ -372,8 +372,10 @@ class OutputPageTest extends MediaWikiTestCase {
                                        'user' => [ 'user.styles', 'example.user' ],
                                ],
                                '<meta name="ResourceLoaderDynamicStyles" content=""/>' . "\n" .
-                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=example.site.a%2Cb%7Csite.styles&amp;only=styles&amp;skin=fallback"/>' . "\n" .
-                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=example.user%7Cuser.styles&amp;only=styles&amp;skin=fallback&amp;version=17f1vjw"/>',
+                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=example.site.a%2Cb&amp;only=styles&amp;skin=fallback"/>' . "\n" .
+                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=site.styles&amp;only=styles&amp;skin=fallback"/>' . "\n" .
+                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=example.user&amp;only=styles&amp;skin=fallback&amp;version=0a56zyi"/>' . "\n" .
+                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=user.styles&amp;only=styles&amp;skin=fallback&amp;version=1e9z0ox"/>',
                        ],
                        // @codingStandardsIgnoreEnd Generic.Files.LineLength
                ];
index 72effd7..dcb0986 100644 (file)
@@ -310,10 +310,12 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase  {
                        $keyedIds, 30, $genFunc, [ 'lowTTL' => 0, 'lockTSE' => 5, ] + $extOpts );
                $this->assertEquals( $value, $v[$keyB], "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value regenerated" );
+               $this->assertEquals( 0, $cache->getWarmupKeyMisses(), "Keys warmed yet in process cache" );
                $v = $cache->getMultiWithSetCallback(
                        $keyedIds, 30, $genFunc, [ 'lowTTL' => 0, 'lockTSE' => 5, ] + $extOpts );
                $this->assertEquals( $value, $v[$keyB], "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value not regenerated" );
+               $this->assertEquals( 0, $cache->getWarmupKeyMisses(), "Keys warmed in process cache" );
 
                $priorTime = microtime( true );
                usleep( 1 );
index d460401..ea5ca8d 100644 (file)
@@ -103,7 +103,7 @@ class TextPassDumperDatabaseTest extends DumpTestCase {
                // increasing
                $this->assertEquals(
                        [ $this->pageId2, $this->pageId3, $this->pageId4 ],
-                       [ $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ],
+                       [ $this->pageId1 + 1, $this->pageId1 + 2, $this->pageId1 + 3 ],
                        "Page ids increasing without holes" );
        }
 
index 44a2305..53d29cf 100644 (file)
                var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible">' +
                                        '<div class="mw-collapsible-toggle">' +
-                                               'Toggle <a href="#">toggle</a> toggle <b>toggle</b>' +
+                                               'Toggle <a href="#top">toggle</a> toggle <b>toggle</b>' +
                                        '</div>' +
                                        '<div class="mw-collapsible-content">' + loremIpsum + '</div>' +
                                '</div>',
                assert.assertTrue( $content.is( ':hidden' ), 'click event on non-link inside toggle toggles content' );
        } );
 
+       QUnit.test( 'click on non-link inside toggler counts as trigger', function ( assert ) {
+               var $collapsible = prepareCollapsible(
+                               '<div class="mw-collapsible">' +
+                                       '<div class="mw-collapsible-toggle">' +
+                                               'Toggle <a>toggle</a> toggle <b>toggle</b>' +
+                                       '</div>' +
+                                       '<div class="mw-collapsible-content">' + loremIpsum + '</div>' +
+                               '</div>',
+                               { instantHide: true }
+                       ),
+                       $content = $collapsible.find( '.mw-collapsible-content' );
+
+               $collapsible.find( '.mw-collapsible-toggle a' ).trigger( 'click' );
+               assert.assertTrue( $content.is( ':hidden' ), 'click event on link (with no href) inside toggle toggles content' );
+       } );
+
        QUnit.test( 'collapse/expand text (data-collapsetext, data-expandtext)', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible" data-collapsetext="Collapse me!" data-expandtext="Expand me!">' +