Merge "Make ChangeTag use NameTableStore for change_tag_def table"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 18 Jun 2018 15:37:20 +0000 (15:37 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 18 Jun 2018 15:37:20 +0000 (15:37 +0000)
109 files changed:
RELEASE-NOTES-1.32
autoload.php
docs/hooks.txt
includes/Category.php
includes/DefaultSettings.php
includes/OutputPage.php
includes/Storage/NameTableStore.php
includes/Title.php
includes/api/ApiPageSet.php
includes/api/ApiParse.php
includes/api/i18n/ar.json
includes/api/i18n/de.json
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/it.json
includes/api/i18n/ko.json
includes/api/i18n/pl.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/api/i18n/ru.json
includes/api/i18n/zh-hans.json
includes/auth/AuthManager.php
includes/cache/LinkCache.php
includes/deferred/LinksDeletionUpdate.php
includes/installer/i18n/eu.json
includes/libs/MultiHttpClient.php
includes/libs/stats/BufferingStatsdDataFactory.php
includes/page/WikiPage.php
includes/parser/CoreParserFunctions.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/resourceloader/ResourceLoaderClientHtml.php
includes/services/ServiceContainer.php
includes/skins/Skin.php
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/btm.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/fr.json
languages/i18n/gcr.json
languages/i18n/he.json
languages/i18n/hu.json
languages/i18n/inh.json
languages/i18n/it.json
languages/i18n/ko.json
languages/i18n/ku-latn.json
languages/i18n/kum.json
languages/i18n/lb.json
languages/i18n/lt.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/nap.json
languages/i18n/nl.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ru.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sv.json
languages/i18n/tet.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/ur.json
languages/i18n/vi.json
languages/i18n/war.json
languages/i18n/yi.json
languages/i18n/zgh.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/populateChangeTagDef.php [new file with mode: 0644]
maintenance/refreshLinks.php
maintenance/resources/update-oojs.sh
package.json
resources/Resources.php
resources/lib/oojs/README.md
resources/lib/oojs/oojs.jquery.js
resources/src/jquery.tablesorter/jquery.tablesorter.less
resources/src/jquery/jquery.tablesorter.styles.less [deleted file]
resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js
resources/src/mediawiki.special.contributions.js
resources/src/mediawiki/mediawiki.base.js
resources/src/mediawiki/mediawiki.js
tests/parser/ParserTestRunner.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/Storage/RevisionStoreDbTestBase.php
tests/phpunit/includes/TitleMethodsTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/resourceloader/MessageBlobStoreTest.php
tests/phpunit/maintenance/populateChangeTagDefTest.php [new file with mode: 0644]

index 731f874..6e82321 100644 (file)
@@ -165,6 +165,7 @@ because of Phabricator reports.
   use 'EditPageGetCheckboxesDefinition' instead.
 * Linker::getLinkColour() and DummyLinker::getLinkColour(), deprecated since
   1.28, were removed. LinkRenderer::getLinkClasses() should be used instead.
+* Skin::doEditSectionLink requires type Language for optional parameter $lang.
 
 === Deprecations in 1.32 ===
 * Use of a StartProfiler.php file is deprecated in favour of placing
index ac1ac18..6b1f981 100644 (file)
@@ -1103,6 +1103,7 @@ $wgAutoloadLocalClasses = [
        'PopulateArchiveRevId' => __DIR__ . '/maintenance/populateArchiveRevId.php',
        'PopulateBacklinkNamespace' => __DIR__ . '/maintenance/populateBacklinkNamespace.php',
        'PopulateCategory' => __DIR__ . '/maintenance/populateCategory.php',
+       'PopulateChangeTagDef' => __DIR__ . '/maintenance/populateChangeTagDef.php',
        'PopulateContentModel' => __DIR__ . '/maintenance/populateContentModel.php',
        'PopulateExternallinksIndex60' => __DIR__ . '/maintenance/populateExternallinksIndex60.php',
        'PopulateFilearchiveSha1' => __DIR__ . '/maintenance/populateFilearchiveSha1.php',
index 48b76bb..d9b2c3e 100644 (file)
@@ -232,7 +232,7 @@ wfRunHooks must be used, which was deprecated in MediaWiki 1.25.
 Note that hook parameters are passed in an array; this is a necessary
 inconvenience to make it possible to pass reference values (that can be changed)
 into the hook code. Also note that earlier versions of wfRunHooks took a
-variable number of arguments; the [] calling protocol came about after
+variable number of arguments; the array calling protocol came about after
 MediaWiki 1.4rc1.
 
 ==Events and parameters==
index 2cf44b8..41ecc65 100644 (file)
@@ -48,7 +48,7 @@ class Category {
 
        /**
         * Set up all member variables using a database query.
-        * @param int $mode
+        * @param int $mode One of (Category::LOAD_ONLY, Category::LAZY_INIT_ROW)
         * @throws MWException
         * @return bool True on success, false on failure.
         */
index 02cbc2f..70c4d01 100644 (file)
@@ -4731,10 +4731,10 @@ $wgPasswordDefault = 'pbkdf2';
  * $wgPasswordConfig['bcrypt-peppered'] = [
  *     'class' => EncryptedPassword::class,
  *     'underlying' => 'bcrypt',
- *     'secrets' => [],
- *     'cipher' => MCRYPT_RIJNDAEL_256,
- *     'mode' => MCRYPT_MODE_CBC,
- *     'cost' => 5,
+ *     'secrets' => [
+ *         hash( 'sha256', 'secret', true ),
+ *     ],
+ *     'cipher' => 'aes-256-cbc',
  * ];
  * @endcode
  *
index 405be1d..0b2ba40 100644 (file)
@@ -1364,7 +1364,8 @@ class OutputPage extends ContextSource {
                );
 
                # Add the results to the link cache
-               $lb->addResultToCache( LinkCache::singleton(), $res );
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
+               $lb->addResultToCache( $linkCache, $res );
 
                return $res;
        }
index 505ab4c..1982d02 100644 (file)
@@ -352,14 +352,9 @@ class NameTableStore {
 
                $dbw = $this->getDBConnection( DB_MASTER );
 
-               $insertFields = [ $this->nameField => $name ];
-               if ( $this->insertCallback !== null ) {
-                       $insertFields = call_user_func( $this->insertCallback, $insertFields );
-               }
-
                $dbw->insert(
                        $this->table,
-                       $insertFields,
+                       $this->getFieldsToStore( $name ),
                        __METHOD__,
                        [ 'IGNORE' ]
                );
@@ -374,4 +369,16 @@ class NameTableStore {
                return $dbw->insertId();
        }
 
+       /**
+        * @param string $name
+        * @return array
+        */
+       private function getFieldsToStore( $name ) {
+               $fields = [ $this->nameField => $name ];
+               if ( $this->insertCallback !== null ) {
+                       $fields = call_user_func( $this->insertCallback, $fields );
+               }
+               return $fields;
+       }
+
 }
index 91d8de4..f6e5912 100644 (file)
@@ -979,7 +979,7 @@ class Title implements LinkTarget {
                        && ( !$this->mContentModel || $flags === self::GAID_FOR_UPDATE )
                        && $this->getArticleID( $flags )
                ) {
-                       $linkCache = LinkCache::singleton();
+                       $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                        $linkCache->addLinkObj( $this ); # in case we already had an article ID
                        $this->mContentModel = $linkCache->getGoodLinkFieldObj( $this, 'model' );
                }
@@ -3433,7 +3433,7 @@ class Title implements LinkTarget {
                        $this->mArticleID = 0;
                        return $this->mArticleID;
                }
-               $linkCache = LinkCache::singleton();
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                if ( $flags & self::GAID_FOR_UPDATE ) {
                        $oldUpdate = $linkCache->forUpdate( true );
                        $linkCache->clearLink( $this );
@@ -3463,7 +3463,7 @@ class Title implements LinkTarget {
                        return $this->mRedirect;
                }
 
-               $linkCache = LinkCache::singleton();
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                $linkCache->addLinkObj( $this ); # in case we already had an article ID
                $cached = $linkCache->getGoodLinkFieldObj( $this, 'redirect' );
                if ( $cached === null ) {
@@ -3497,7 +3497,7 @@ class Title implements LinkTarget {
                        $this->mLength = 0;
                        return $this->mLength;
                }
-               $linkCache = LinkCache::singleton();
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                $linkCache->addLinkObj( $this ); # in case we already had an article ID
                $cached = $linkCache->getGoodLinkFieldObj( $this, 'length' );
                if ( $cached === null ) {
@@ -3525,7 +3525,7 @@ class Title implements LinkTarget {
                        $this->mLatestID = 0;
                        return $this->mLatestID;
                }
-               $linkCache = LinkCache::singleton();
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                $linkCache->addLinkObj( $this ); # in case we already had an article ID
                $cached = $linkCache->getGoodLinkFieldObj( $this, 'revision' );
                if ( $cached === null ) {
@@ -3550,7 +3550,7 @@ class Title implements LinkTarget {
         * @param int $newid The new Article ID
         */
        public function resetArticleID( $newid ) {
-               $linkCache = LinkCache::singleton();
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                $linkCache->clearLink( $this );
 
                if ( $newid === false ) {
@@ -3572,7 +3572,7 @@ class Title implements LinkTarget {
        }
 
        public static function clearCaches() {
-               $linkCache = LinkCache::singleton();
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                $linkCache->clear();
 
                $titleCache = self::getTitleCache();
@@ -3676,7 +3676,7 @@ class Title implements LinkTarget {
 
                $retVal = [];
                if ( $res->numRows() ) {
-                       $linkCache = LinkCache::singleton();
+                       $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                        foreach ( $res as $row ) {
                                $titleObj = self::makeTitle( $row->page_namespace, $row->page_title );
                                if ( $titleObj ) {
@@ -3744,7 +3744,7 @@ class Title implements LinkTarget {
                );
 
                $retVal = [];
-               $linkCache = LinkCache::singleton();
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                foreach ( $res as $row ) {
                        if ( $row->page_id ) {
                                $titleObj = self::newFromRow( $row );
@@ -4943,7 +4943,7 @@ class Title implements LinkTarget {
                // check, if the page language could be saved in the database, and if so and
                // the value is not requested already, lookup the page language using LinkCache
                if ( $wgPageLanguageUseDB && $this->mDbPageLanguage === false ) {
-                       $linkCache = LinkCache::singleton();
+                       $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                        $linkCache->addLinkObj( $this );
                        $this->mDbPageLanguage = $linkCache->getGoodLinkFieldObj( $this, 'lang' );
                }
@@ -4983,7 +4983,7 @@ class Title implements LinkTarget {
                        $langObj = $contentHandler->getPageLanguage( $this );
                        $this->mPageLanguage = [ $langObj->getCode(), $wgLanguageCode ];
                } else {
-                       $langObj = wfGetLangObj( $this->mPageLanguage[0] );
+                       $langObj = Language::factory( $this->mPageLanguage[0] );
                }
 
                return $langObj;
index 48303a5..515ebc5 100644 (file)
@@ -771,7 +771,8 @@ class ApiPageSet extends ApiBase {
                // Store Title object in various data structures
                $title = Title::newFromRow( $row );
 
-               LinkCache::singleton()->addGoodLinkObjFromRow( $title, $row );
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
+               $linkCache->addGoodLinkObjFromRow( $title, $row );
 
                $pageId = intval( $row->page_id );
                $this->mAllPages[$row->page_namespace][$row->page_title] = $pageId;
@@ -904,7 +905,7 @@ class ApiPageSet extends ApiBase {
                        // Any items left in the $remaining list are added as missing
                        if ( $processTitles ) {
                                // The remaining titles in $remaining are non-existent pages
-                               $linkCache = LinkCache::singleton();
+                               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                                foreach ( $remaining as $ns => $dbkeys ) {
                                        foreach ( array_keys( $dbkeys ) as $dbkey ) {
                                                $title = Title::makeTitle( $ns, $dbkey );
index 096122d..3a60471 100644 (file)
@@ -697,7 +697,7 @@ class ApiParse extends ApiBase {
                        $hiddencats[$row->page_title] = isset( $row->pp_propname );
                }
 
-               $linkCache = LinkCache::singleton();
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
 
                foreach ( $links as $link => $sortkey ) {
                        $entry = [];
index f19ee11..349383f 100644 (file)
        "apihelp-query+filearchive-paramvalue-prop-archivename": "يضيف اسم ملف إصدار الأرشيف للإصدارات غير الأحدث.",
        "apihelp-query+filearchive-example-simple": "عرض قائمة بجميع الملفات المحذوفة.",
        "apihelp-query+filerepoinfo-summary": "إرجاع معلومات التعريف حول مستودعات الصور المكونة في الويكي.",
+       "apihelp-query+filerepoinfo-param-prop": "أي خصائص المستودع يمكن الحصول عليها (قد يكون هناك المزيد متاح في بعض الويكيات): \n;apiurl:مسار إلى API المستودع ، مفيد للحصول على معلومات الصورة من المضيف.\n;name: مفتاح المستودع، يُستخدَم على سبيل المثال في قيم عودة <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> و[[Special:ApiHelp/query+imageinfo|معلومات الصورة]].",
+       "apihelp-query+filerepoinfo-example-simple": "الحصول على معلومات حول مستودعات الملفات.",
+       "apihelp-query+fileusage-summary": "ابحث عن كل الصفحات التي تستخدم الملفات المعطاة.",
        "apihelp-query+fileusage-param-prop": "أي الخصائص للحصول عليها.",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "معرف الصفحة لكل صفحة.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "عنوان كل صفحة.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "علم إذا كانت الصفحة تحويلة.",
+       "apihelp-query+fileusage-param-namespace": "إدراج الصفحات في هذا النطاق فقط.",
+       "apihelp-query+fileusage-param-limit": "كم العدد للعودة.",
+       "apihelp-query+fileusage-param-show": "إظهار العناصر التي تستوفي هذه المعايير فقط:\n;تحويلة: عرض التحويلات فقط.\n;غير تحويلة:إظهار غير التحويلات فقط.",
+       "apihelp-query+fileusage-example-simple": "احصل على قائمة الصفحات التي تستخدم [[:File:Example.jpg]].",
+       "apihelp-query+fileusage-example-generator": "احصل على معلومات حول الصفحات التي تستخدم [[:File:Example.jpg]].",
+       "apihelp-query+imageinfo-summary": "يعرض معلومات الملف وسجل الرفع.",
+       "apihelp-query+imageinfo-param-prop": "أي المعلومات عن الصورة للحصول عليها",
        "apihelp-query+imageinfo-paramvalue-prop-timestamp": "يضيف الطابع الزمني للنسخة المرفوعة.",
+       "apihelp-query+imageinfo-paramvalue-prop-user": "يضيف المستخدم الذي رفع كل إصدار من الملف.",
        "apihelp-query+imageinfo-paramvalue-prop-userid": "إضافة هوية المستخدم الذي قام بتحميل كل إصدار ملف.",
+       "apihelp-query+imageinfo-paramvalue-prop-comment": "تعليق على الإصدار.",
+       "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "تحليل التعليق على النسخة.",
+       "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "يضيف العنوان الأساسي للملف.",
+       "apihelp-query+imageinfo-paramvalue-prop-url": "يعطي مسارا للملف وصفحة الوصف.",
+       "apihelp-query+imageinfo-paramvalue-prop-size": "يضيف حجم الملف بالبايت والطول والعرض وعدد الصفحات (عند قابلية التطبيق).",
        "apihelp-query+imageinfo-paramvalue-prop-dimensions": "الاسم المستعار للحجم.",
+       "apihelp-query+imageinfo-paramvalue-prop-sha1": "يضيف تجزئة SHA-1 للملف.",
+       "apihelp-query+imageinfo-paramvalue-prop-mime": "يضيف نوع MIME للملف.",
+       "apihelp-query+imageinfo-paramvalue-prop-thumbmime": "يضيف نوع MIME للصورة المصغرة (يتطلب مسار ووسيط $1urlwidth).",
+       "apihelp-query+imageinfo-paramvalue-prop-mediatype": "يضيف نوع الوسائط للملف.",
+       "apihelp-query+imageinfo-paramvalue-prop-metadata": "يسرد بيانات تعريف Exif لإصدار الملف.",
+       "apihelp-query+imageinfo-paramvalue-prop-commonmetadata": "يسرد بيانات التعريف العامة لصيغة الملف لإصدار الملف.",
+       "apihelp-query+imageinfo-paramvalue-prop-extmetadata": "يسرد البيانات الوصفية المنسقة من مصادر متعددة، النتائج بتنسيق HTML.",
+       "apihelp-query+imageinfo-paramvalue-prop-archivename": "يضيف اسم ملف إصدار الأرشيف للإصدارات غير الأحدث.",
+       "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "يضيف عمق البت للإصدار.",
+       "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "تُستخدَم من قبل صفحة Special:Upload للحصول على معلومات حول ملف موجود، غير مخصص للاستخدام خارج نواة ميدياويكي.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "يضيف ما إذا كان الملف موجودا في [[MediaWiki:Bad image list]]",
+       "apihelp-query+imageinfo-param-limit": "عدد مراجعات الملفات ليتم إرجاعها لكل ملف.",
+       "apihelp-query+imageinfo-param-start": "الطابع الزمني لبدء الإدراج منه.",
+       "apihelp-query+imageinfo-param-end": "الطابع الزمني لإيقاف الإدراج فيه.",
+       "apihelp-query+imageinfo-param-urlwidth": "إذا تم تعيين $2prop=url، فسيتم إرجاع مسار صورة مقسمة إلى هذا العرض،\nلأسباب تتعلق بالأداء في حالة استخدام هذا الخيار; لن يتم عرض أكثر من $1 من الصور المقاسة.",
+       "apihelp-query+imageinfo-param-urlheight": "على غرار $1urlwidth.",
+       "apihelp-query+imageinfo-param-metadataversion": "إصدار البيانات الوصفية لاستخدامه، إذا تم تحديد <kbd>latest</kbd>، استخدم أحدث إصدار، الافتراضي <kbd>1</kbd> للتوافق مع الإصدارات السابقة.",
+       "apihelp-query+imageinfo-param-extmetadatalanguage": "أية لغة لجلب extmetadata بها، هذا يؤثر على كل الترجمة التي يتم جلبها، إذا كانت متعددة متاحة، وكذلك كيفية تنسيق أشياء مثل الأرقام والقيم المختلفة.",
+       "apihelp-query+imageinfo-param-extmetadatamultilang": "إذا كانت ترجمات خاصية extmetadata متاحة، فاجلبها كلها.",
+       "apihelp-query+imageinfo-param-extmetadatafilter": "إذا كان محددا وغير فارغ، فسيتم إرجاع هذه المفاتيح فقط لـ$1prop=extmetadata.",
+       "apihelp-query+imageinfo-param-urlparam": "سلسلة وسيط خاصة بالمعالج، على سبيل المثال، قد تستخدم ملفات PDF <kbd>page15-100px</kbd>، يجب استخدام <var>$1urlwidth</var> وأن يكون متسقا مع <var>$1urlparam</var>.",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "إذا تم تعيين<kbd>$2prop=badfile</kbd> ، فهذا هو عنوان الصفحة المستخدم عند تقييم [[MediaWiki:Bad image list]]",
+       "apihelp-query+imageinfo-param-localonly": "ابحث فقط عن الملفات في المستودع المحلي.",
+       "apihelp-query+imageinfo-example-simple": "إحضار معلومات حول الإصدار الحالي من [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+imageinfo-example-dated": "إحضار معلومات حول إصدارات [[:File:Test.jpg]] من عام 2008 وما بعده.",
+       "apihelp-query+images-summary": "يعرض جميع الملفات المضمنة في الصفحات المعينة.",
+       "apihelp-query+images-param-limit": "كم عدد الملفات للعودة.",
+       "apihelp-query+images-param-images": "إدراج هذه الملفات فقط، مفيد للتحقق ما إذا كانت صفحة معينة تحتوي على ملف معين.",
        "apihelp-query+images-param-dir": "الاتجاه للإدراج فيه.",
+       "apihelp-query+images-example-simple": "احصل على قائمة بالملفات المستخدمة في [[Main Page]].",
+       "apihelp-query+images-example-generator": "الحصول على معلومات حول جميع الملفات المستخدمة في [[Main Page]].",
+       "apihelp-query+imageusage-summary": "ابحث عن كل الصفحات التي تستخدم عنوان الصورة المعين.",
        "apihelp-query+imageusage-param-title": "عنوان للبحث، لا يمكن استخدامه مع <var>$1pageid</var",
        "apihelp-query+imageusage-param-pageid": "معرف صفحة للبحث، لا يمكن استخدامه مع <var>$1title</var>.",
        "apihelp-query+imageusage-param-namespace": "النطاق للتعداد.",
        "apihelp-query+imageusage-param-dir": "الاتجاه للإدراج فيه.",
+       "apihelp-query+imageusage-param-filterredir": "كيفية التصفية للتحويلات، إذا تم ضبطه على <kbd>nonredirects</kbd> عند تمكين <var>$1redirect</var>، فسيتم تطبيق هذا على المستوى الثاني فقط.",
+       "apihelp-query+imageusage-param-limit": "كم عدد الصفحات التي سيتم إرجاعها، إذا تم تمكين <var>$1redirect</var> ، فسيتم تطبيق الحد الأقصى على كل مستوى بشكل منفصل (مما يعني أنه قد يتم إرجاع ما يصل إلى * <var>$1limit</var> نتائج).",
+       "apihelp-query+imageusage-param-redirect": "إذا كان ربط الصفحة تحويلة، فابحث عن جميع الصفحات التي تصل لتلك التحويلة أيضا، الحد الأقصى هو النصف.",
+       "apihelp-query+imageusage-example-simple": "عرض الصفحات التي تستخدم [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+imageusage-example-generator": "احصل على معلومات حول الصفحات التي تستخدم [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+info-summary": "الحصول على معلومات الصفحة الأساسية.",
+       "apihelp-query+info-param-prop": "أي الخصائص الإضافية للحصول عليها:",
+       "apihelp-query+info-paramvalue-prop-protection": "إدراج مستوى الحماية لكل صفحة.",
+       "apihelp-query+info-paramvalue-prop-talkid": "معرف الصفحة لصفحة النقاش لكل صفحة غير النقاش.",
+       "apihelp-query+info-paramvalue-prop-watched": "أدرج حالة المراقبة لكل صفحة.",
+       "apihelp-query+info-paramvalue-prop-watchers": "عدد المراقبين، إذا كان مسموحا.",
        "apihelp-query+iwbacklinks-param-limit": "كم عدد مجموع الصفحات للعودة.",
        "apihelp-query+iwbacklinks-param-prop": "أي الخصائص للحصول عليها.",
        "apihelp-query+iwbacklinks-param-dir": "الاتجاه للإدراج فيه.",
        "apihelp-query+links-param-dir": "الاتجاه للإدراج فيه.",
        "apihelp-query+linkshere-summary": "ابحث عن جميع الصفحات الموصولة للصفحة المحددة.",
        "apihelp-query+linkshere-param-prop": "أي الخصائص للحصول عليها.",
+       "apihelp-query+linkshere-param-limit": "كم العدد للعودة.",
        "apihelp-query+logevents-param-prop": "أي الخصائص للحصول عليها.",
        "apihelp-query+logevents-param-start": "الطابع الزمني لبدء العد منه.",
        "apihelp-query+pageswithprop-param-prop": "أية قطعة من المعلومات لتضمينها:",
        "apihelp-query+tags-param-prop": "أي الخصائص للحصول عليها.",
        "apihelp-query+templates-param-dir": "الاتجاه للإدراج فيه.",
        "apihelp-query+transcludedin-param-prop": "أي الخصائص للحصول عليها.",
+       "apihelp-query+transcludedin-param-limit": "كم العدد للعودة.",
        "apihelp-query+usercontribs-paramvalue-prop-title": "يضيف معرف عنوان ونطاق الصفحة.",
        "apihelp-query+usercontribs-param-tag": "إدراج المراجعات الموسومة بهذ الوسم فقط.",
        "apihelp-query+userinfo-param-prop": "أية قطعة من المعلومات لتضمينها:",
index 13d392e..d0e9f1a 100644 (file)
        "apihelp-query+search-paramvalue-prop-wordcount": "Ergänzt den Wortzähler der Seite.",
        "apihelp-query+search-paramvalue-prop-extensiondata": "Ergänzt zusätzliche von Erweiterungen erzeugte Daten.",
        "apihelp-query+search-param-limit": "Wie viele Seiten insgesamt zurückgegeben werden sollen.",
+       "apihelp-query+search-param-sort": "Legt die Sortierreihenfolge der zurückgegebenen Ergebnisse fest.",
        "apihelp-query+search-example-simple": "Nach <kbd>meaning</kbd> suchen.",
        "apihelp-query+search-example-text": "Texte nach <kbd>meaning</kbd> durchsuchen.",
        "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "Liste von Spezialseiten-Aliasse.",
index 37ee993..323a784 100644 (file)
        "apihelp-query+search-param-interwiki": "Inclure les résultats interwiki dans la recherche, s’ils sont disponibles.",
        "apihelp-query+search-param-backend": "Quel serveur de recherche utiliser, si ce n’est pas celui par défaut.",
        "apihelp-query+search-param-enablerewrites": "Activer la réécriture interne de la requête. Les serveurs de recherche peuvent réécrire la requête en une autre qui est censée donner de meilleurs résultats, par exemple en corrigeant les erreurs d’orthographe.",
+       "apihelp-query+search-param-sort": "Fixe l’ordre de tri des résultats renvoyés.",
        "apihelp-query+search-example-simple": "Rechercher <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Rechercher des textes pour <kbd>meaning</kbd>.",
        "apihelp-query+search-example-generator": "Obtenir les informations sur les pages renvoyées par une recherche de <kbd>meaning</kbd>.",
index b53c052..057adc0 100644 (file)
        "apihelp-query+search-param-interwiki": "לכלול תוצאות בינוויקי בחיפוש, אם זמין.",
        "apihelp-query+search-param-backend": "באיזה שרת חיפוש להשתמש אם לא בבררת המחדל.",
        "apihelp-query+search-param-enablerewrites": "הפעלת שכתוב שאילתות פנימי. שרתי חיפוש אחדים יכולים לשכתב את השאילתה לצורה אחרת שנחשבת לכזאת שמספקת תוצאות טובות יותר, למשל באמצעות תיקון שגיאות כתיב.",
+       "apihelp-query+search-param-sort": "קביעת סדר המיון של התוצאות המוחזרות.",
        "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 575715f..2bcaef1 100644 (file)
        "apihelp-query+search-paramvalue-prop-score": "Ignorato.",
        "apihelp-query+search-paramvalue-prop-hasrelated": "Ignorato.",
        "apihelp-query+search-param-limit": "Quante pagine totali restituire.",
+       "apihelp-query+search-param-sort": "Imposta l'ordinamento dei risultati restituiti.",
        "apihelp-query+siteinfo-param-prop": "Quali informazioni ottenere:",
        "apihelp-query+siteinfo-paramvalue-prop-statistics": "Restituisce le statistiche del sito.",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "Restituisci librerie installate sul wiki.",
index f88bd90..c36b065 100644 (file)
        "apihelp-query+search-paramvalue-prop-timestamp": "문서가 마지막으로 편집된 시기의 타임스탬프를 추가합니다.",
        "apihelp-query+search-paramvalue-prop-score": "무시됨.",
        "apihelp-query+search-paramvalue-prop-hasrelated": "무시됨.",
+       "apihelp-query+search-param-sort": "반환된 결과의 정렬 순서를 설정합니다.",
        "apihelp-query+search-example-simple": "<kbd>meaning</kbd>을 검색합니다.",
        "apihelp-query+search-example-text": "<kbd>meaning</kbd>의 텍스트를 검색합니다.",
        "apihelp-query+siteinfo-summary": "사이트의 전반적인 정보를 반환합니다.",
index 9d43533..9b4ac5f 100644 (file)
        "apihelp-query+search-paramvalue-prop-hasrelated": "Zignorowano",
        "apihelp-query+search-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+search-param-interwiki": "Dołączaj wyniki wyszukiwań interwiki w wyszukiwarce, jeśli możliwe.",
+       "apihelp-query+search-param-sort": "Ustaw porządek sortowania zwracanych wyników.",
        "apihelp-query+search-example-simple": "Szukaj <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-paramvalue-prop-general": "Ogólne informacje o systemie.",
        "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Lista zarejestrowanych przestrzeni nazw i ich nazwy kanoniczne.",
index 65c3cff..c177d2e 100644 (file)
        "apihelp-query+search-param-interwiki": "Inclua resultados de interwiki na pesquisa, se disponível.",
        "apihelp-query+search-param-backend": "Qual o backend de pesquisa a ser usado, se não for o padrão.",
        "apihelp-query+search-param-enablerewrites": "Habilita a reescrita de consulta interna. Alguns backends de pesquisa podem reescrever a consulta em outro que é pensado para fornecer melhores resultados, por exemplo, corrigindo erros de ortografia.",
+       "apihelp-query+search-param-sort": "Definir o ordenamento dos resultados devolvidos.",
        "apihelp-query+search-example-simple": "Procurar por <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Procurar textos para <kbd>meaning</kbd>.",
        "apihelp-query+search-example-generator": "Obter informações da página sobre as páginas retornadas para uma pesquisa por <kbd>meaning</kbd>.",
index 68eda63..3240c66 100644 (file)
        "apihelp-query+search-param-interwiki": "Incluir resultados interwikis na pesquisa, se disponíveis.",
        "apihelp-query+search-param-backend": "O servidor de pesquisas a ser usado, se diferente do servidor padrão.",
        "apihelp-query+search-param-enablerewrites": "Ativar a reescrita da pesquisa interna. Alguns motores de pesquisa podem reescrever a pesquisa substituindo-a por outra que consideram que dará melhores resultados, por exemplo, por corrigir erros de ortografia.",
+       "apihelp-query+search-param-sort": "Definir o ordenamento dos resultados devolvidos.",
        "apihelp-query+search-example-simple": "Pesquisar <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Pesquisar <kbd>meaning</kbd> nos textos.",
        "apihelp-query+search-example-generator": "Obter informação sobre as páginas devolvidas por uma pesquisa do termo <kbd>meaning</kbd>.",
index 91aac43..e04f090 100644 (file)
        "apihelp-query+search-param-interwiki": "Включить результаты из других вики, если доступны.",
        "apihelp-query+search-param-backend": "Какой поисковый движок использовать, если не стандартный.",
        "apihelp-query+search-param-enablerewrites": "Разрешить редактирование запроса. Некоторые поисковые движки могут отредактировать запрос, например, исправив опечатку, если посчитают, что это приведёт к лучшим результатам.",
+       "apihelp-query+search-param-sort": "Задаёт порядок сортировки возвращаемых результатов.",
        "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 85d3982..818f717 100644 (file)
        "apihelp-query+search-param-interwiki": "搜索结果中包含跨wiki结果,如果可用。",
        "apihelp-query+search-param-backend": "要使用的搜索后端,如果没有则为默认。",
        "apihelp-query+search-param-enablerewrites": "启用内部查询重写。一些搜索后端可以重写查询到另一个被认为能提供更好结果的位置,例如纠正拼写错误。",
+       "apihelp-query+search-param-sort": "设置返回结果的排序。",
        "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 161dd56..3260ce4 100644 (file)
@@ -771,7 +771,12 @@ class AuthManager implements LoggerAwareInterface {
                        $status = self::SEC_FAIL;
                }
 
-               $this->logger->info( __METHOD__ . ": $operation is $status" );
+               $this->logger->info( __METHOD__ . ": $operation is $status for '{user}'",
+                       [
+                               'user' => $session->getUser()->getName(),
+                               'clientip' => $this->getRequest()->getIP(),
+                       ]
+               );
 
                return $status;
        }
index 2d08895..7cbb86f 100644 (file)
@@ -321,7 +321,7 @@ class LinkCache {
         */
        public function invalidateTitle( LinkTarget $title ) {
                if ( $this->isCacheable( $title ) ) {
-                       $cache = ObjectCache::getMainWANInstance();
+                       $cache = $this->wanCache;
                        $cache->delete(
                                $cache->makeKey( 'page', $title->getNamespace(), sha1( $title->getDBkey() ) )
                        );
index 3c86d11..9f6257c 100644 (file)
@@ -90,6 +90,7 @@ class LinksDeletionUpdate extends DataUpdate implements EnqueueableDataUpdate {
                foreach ( $catBatches as $catBatch ) {
                        $this->page->updateCategoryCounts( [], $catBatch, $id );
                        if ( count( $catBatches ) > 1 ) {
+                               // Only sacrifice atomicity if necessary due to size
                                $lbFactory->commitAndWaitForReplication(
                                        __METHOD__, $this->ticket, [ 'domain' => $dbw->getDomainID() ]
                                );
@@ -98,19 +99,10 @@ class LinksDeletionUpdate extends DataUpdate implements EnqueueableDataUpdate {
 
                // Refresh counts on categories that should be empty now
                if ( $title->getNamespace() === NS_CATEGORY ) {
-                       $row = $dbw->selectRow(
-                               'category',
-                               [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
-                               [ 'cat_title' => $title->getDBkey(), 'cat_pages <= 100' ],
-                               __METHOD__
-                       );
-                       if ( $row ) {
-                               $cat = Category::newFromRow( $row, $title );
-                               // T166757: do the update after the main job DB commit
-                               DeferredUpdates::addCallableUpdate( function () use ( $cat ) {
-                                       $cat->refreshCounts();
-                               } );
-                       }
+                       // T166757: do the update after the main job DB commit
+                       DeferredUpdates::addCallableUpdate( function () use ( $title ) {
+                               $this->refreshCategoryIfEmpty( $title );
+                       } );
                }
 
                $this->batchDeleteByPK(
@@ -195,6 +187,35 @@ class LinksDeletionUpdate extends DataUpdate implements EnqueueableDataUpdate {
                ScopedCallback::consume( $scopedLock );
        }
 
+       /**
+        * @param Title $title
+        */
+       private function refreshCategoryIfEmpty( Title $title ) {
+               $dbw = $this->getDB();
+
+               $row = $dbw->selectRow(
+                       'category',
+                       [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
+                       [ 'cat_title' => $title->getDBkey(), 'cat_pages <= 100' ],
+                       __METHOD__
+               );
+
+               if ( !$row ) {
+                       return; // nothing to delete
+               }
+
+               $cat = Category::newFromRow( $row, $title );
+               $hasLink = $dbw->selectField(
+                       'categorylinks',
+                       '1',
+                       [ 'cl_to' => $title->getDBkey() ],
+                       __METHOD__
+               );
+               if ( !$hasLink ) {
+                       $cat->refreshCounts(); // delete the category table entry
+               }
+       }
+
        private function batchDeleteByPK( $table, array $conds, array $pk, $bSize ) {
                $services = MediaWikiServices::getInstance();
                $lbFactory = $services->getDBLoadBalancerFactory();
index f840b49..719478e 100644 (file)
@@ -5,7 +5,8 @@
                        "පසිඳු කාවින්ද",
                        "Subi",
                        "Sator",
-                       "Mikel Ibaiba"
+                       "Mikel Ibaiba",
+                       "Fitoschido"
                ]
        },
        "config-desc": "MediaWiki instalatzailea",
        "config-install-done-path": "<strong>Zorionak!</strong>\nMediaWiki instalatu duzu.\n\nInstalatzaileak sortu egin du <code>LocalSettings.php</code>\nZure konfigurazio guztia dauka.\n\nDeskargatu egin behar duzu eta jarri <code>$4</code> -ean . Deskarga automakikoki hasiko da.\n\nEz badizu deskargatzeko aukerarik eman, edo kantzalatu egin baduzu, hurrengo linkean klikatu berrabiatzeko:\n\n$3\n\n<strong>Oharra:</strong> Instalazio prozesuatik ateratzen bazara konfigurazio artxikoa deskargatu barik, gero ez da egongo eskuragarri.\n\nBehin hori eginda, <strong>[$2 enter your wiki]</strong> ahal duzu.",
        "config-install-success": "MediaWiki arrakastaz instalatu da. Orain <$1$2> bisitatu dezakezu zure wikia ikusteko.\nGalderarik izanez gero, begiratu gure maiztasunez egiten diren galderen zerrenda:\n<https://www.mediawiki.org/wiki/Manual:FAQ> edo erabili orrialde honi lotuta dauden laguntza foroetako bat.",
        "config-download-localsettings": "Jaitsi <code>LocalSettings.php</code>",
-       "config-help": "Laguntza",
+       "config-help": "laguntza",
        "config-help-tooltip": "sakatu zabaltzeko",
        "config-nofile": "Ezin da \"$1\" fitxategia aurkitu. Ezabatua izan da?",
        "config-extension-link": "Ba al zenekien wikiak [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions] onartzen dituela?\n\nArakatu [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category] edo [https://www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] ikusi ahal izateko luzapenen zerrenda.",
index cb60b01..20ddf72 100644 (file)
@@ -50,9 +50,9 @@ class MultiHttpClient implements LoggerAwareInterface {
        protected $multiHandle = null; // curl_multi handle
        /** @var string|null SSL certificates path */
        protected $caBundlePath;
-       /** @var int */
+       /** @var float */
        protected $connTimeout = 10;
-       /** @var int */
+       /** @var float */
        protected $reqTimeout = 300;
        /** @var bool */
        protected $usePipelining = false;
@@ -65,6 +65,11 @@ class MultiHttpClient implements LoggerAwareInterface {
        /** @var LoggerInterface */
        protected $logger;
 
+       // In PHP 7 due to https://bugs.php.net/bug.php?id=76480 the request/connect
+       // timeouts are periodically polled instead of being accurately respected.
+       // The select timeout is set to the minimum timeout multiplied by this factor.
+       const TIMEOUT_ACCURACY_FACTOR = 0.1;
+
        /**
         * @param array $options
         *   - connTimeout     : default connection timeout (seconds)
@@ -148,6 +153,8 @@ class MultiHttpClient implements LoggerAwareInterface {
        public function runMulti( array $reqs, array $opts = [] ) {
                $chm = $this->getCurlMulti();
 
+               $selectTimeout = $this->getSelectTimeout( $opts );
+
                // Normalize $reqs and add all of the required cURL handles...
                $handles = [];
                foreach ( $reqs as $index => &$req ) {
@@ -224,7 +231,7 @@ class MultiHttpClient implements LoggerAwareInterface {
                                } while ( $mrc == CURLM_CALL_MULTI_PERFORM );
                                // Wait (if possible) for available work...
                                if ( $active > 0 && $mrc == CURLM_OK ) {
-                                       if ( curl_multi_select( $chm, 10 ) == -1 ) {
+                                       if ( curl_multi_select( $chm, $selectTimeout ) == -1 ) {
                                                // PHP bug 63411; https://curl.haxx.se/libcurl/c/curl_multi_fdset.html
                                                usleep( 5000 ); // 5ms
                                        }
@@ -285,11 +292,11 @@ class MultiHttpClient implements LoggerAwareInterface {
        protected function getCurlHandle( array &$req, array $opts = [] ) {
                $ch = curl_init();
 
-               curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT,
-                       $opts['connTimeout'] ?? $this->connTimeout );
+               curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT_MS,
+                       ( $opts['connTimeout'] ?? $this->connTimeout ) * 1000 );
                curl_setopt( $ch, CURLOPT_PROXY, $req['proxy'] ?? $this->proxy );
-               curl_setopt( $ch, CURLOPT_TIMEOUT,
-                       $opts['reqTimeout'] ?? $this->reqTimeout );
+               curl_setopt( $ch, CURLOPT_TIMEOUT_MS,
+                       ( $opts['reqTimeout'] ?? $this->reqTimeout ) * 1000 );
                curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
                curl_setopt( $ch, CURLOPT_MAXREDIRS, 4 );
                curl_setopt( $ch, CURLOPT_HEADER, 0 );
@@ -410,6 +417,28 @@ class MultiHttpClient implements LoggerAwareInterface {
                return $ch;
        }
 
+       /**
+        * Get a suitable select timeout for the given options.
+        *
+        * @param array $opts
+        * @return float
+        */
+       private function getSelectTimeout( $opts ) {
+               $connTimeout = $opts['connTimeout'] ?? $this->connTimeout;
+               $reqTimeout = $opts['reqTimeout'] ?? $this->reqTimeout;
+               $timeouts = array_filter( [ $connTimeout, $reqTimeout ] );
+               if ( count( $timeouts ) === 0 ) {
+                       return 1;
+               }
+
+               $selectTimeout = min( $timeouts ) * self::TIMEOUT_ACCURACY_FACTOR;
+               // Minimum 10us for sanity
+               if ( $selectTimeout < 10e-6 ) {
+                       $selectTimeout = 10e-6;
+               }
+               return $selectTimeout;
+       }
+
        /**
         * @return resource
         * @throws Exception
index 06915b2..5ef0135 100644 (file)
@@ -92,10 +92,11 @@ class BufferingStatsdDataFactory extends StatsdDataFactory implements IBuffering
        }
 
        /**
-        * @deprecated Use getData()
+        * @deprecated since 1.30 Use getData() instead
         * @return StatsdData[]
         */
        public function getBuffer() {
+               wfDeprecated( __METHOD__, '1.30' );
                return $this->buffer;
        }
 
@@ -103,6 +104,10 @@ class BufferingStatsdDataFactory extends StatsdDataFactory implements IBuffering
                return !empty( $this->buffer );
        }
 
+       /**
+        * @since 1.30
+        * @return StatsdData[]
+        */
        public function getData() {
                return $this->buffer;
        }
index 24a7059..5bbdb6c 100644 (file)
@@ -527,7 +527,7 @@ class WikiPage implements Page, IDBAccessObject {
         *          the master DB using SELECT FOR UPDATE
         */
        public function loadFromRow( $data, $from ) {
-               $lc = LinkCache::singleton();
+               $lc = MediaWikiServices::getInstance()->getLinkCache();
                $lc->clearLink( $this->mTitle );
 
                if ( $data ) {
@@ -1367,7 +1367,8 @@ class WikiPage implements Page, IDBAccessObject {
                        $this->mLatest = $revision->getId();
                        $this->mIsRedirect = (bool)$rt;
                        // Update the LinkCache.
-                       LinkCache::singleton()->addGoodLinkObj(
+                       $linkCache = MediaWikiServices::getInstance()->getLinkCache();
+                       $linkCache->addGoodLinkObj(
                                $this->getId(),
                                $this->mTitle,
                                $len,
index 42d5db7..99ca07a 100644 (file)
@@ -1162,7 +1162,7 @@ class CoreParserFunctions {
                }
 
                // Check the link cache, maybe something already looked it up.
-               $linkCache = LinkCache::singleton();
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                $pdbk = $t->getPrefixedDBkey();
                $id = $linkCache->getGoodLinkID( $pdbk );
                if ( $id != 0 ) {
index 1d722c2..939fe73 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Parser
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @ingroup Parser
  */
@@ -283,7 +285,7 @@ class LinkHolderArray {
                global $wgContLang;
 
                $colours = [];
-               $linkCache = LinkCache::singleton();
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                $output = $this->parent->getOutput();
                $linkRenderer = $this->parent->getLinkRenderer();
 
@@ -451,7 +453,7 @@ class LinkHolderArray {
                $linkBatch = new LinkBatch();
                $variantMap = []; // maps $pdbkey_Variant => $keys (of link holders)
                $output = $this->parent->getOutput();
-               $linkCache = LinkCache::singleton();
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                $titlesToBeConverted = '';
                $titlesAttrs = [];
 
index 38bc95e..a1b3064 100644 (file)
@@ -3635,7 +3635,7 @@ class Parser {
                        $rev_id = $rev ? $rev->getId() : 0;
                        # If there is no current revision, there is no page
                        if ( $id === false && !$rev ) {
-                               $linkCache = LinkCache::singleton();
+                               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                                $linkCache->addBadLinkObj( $title );
                        }
 
index 20bd599..5959281 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  * @ingroup Parser
  */
+
+use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
 
 /**
@@ -1386,11 +1388,12 @@ class ParserOptions {
                        };
                end( $wgHooks['TitleExists'] );
                $key = key( $wgHooks['TitleExists'] );
-               LinkCache::singleton()->clearBadLink( $title->getPrefixedDBkey() );
-               return new ScopedCallback( function () use ( $title, $key ) {
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
+               $linkCache->clearBadLink( $title->getPrefixedDBkey() );
+               return new ScopedCallback( function () use ( $title, $key, $linkCache ) {
                        global $wgHooks;
                        unset( $wgHooks['TitleExists'][$key] );
-                       LinkCache::singleton()->clearLink( $title );
+                       $linkCache->clearLink( $title );
                } );
        }
 }
index 265d151..ed1dd19 100644 (file)
@@ -314,7 +314,7 @@ class ParserOutput extends CacheTime {
                                        return $skin->doEditSectionLink( $editsectionPage,
                                                $editsectionSection,
                                                $editsectionContent,
-                                               $wgLang->getCode()
+                                               $wgLang
                                        );
                                },
                                $text
index b9ff732..20faf8b 100644 (file)
@@ -95,7 +95,6 @@ class ResourceLoaderClientHtml {
        /**
         * Ensure the styles of one or more modules are loaded.
         *
-        * @deprecated since 1.28
         * @param array $modules Array of module names
         */
        public function setModuleStyles( array $modules ) {
index c98b7da..5ea49ee 100644 (file)
@@ -356,9 +356,10 @@ class ServiceContainer implements DestructibleService {
        private function createService( $name ) {
                if ( isset( $this->serviceInstantiators[$name] ) ) {
                        $service = ( $this->serviceInstantiators[$name] )(
-                               $this, ...$this->extraInstantiationParams
+                               $this,
+                               ...$this->extraInstantiationParams
                        );
-                       // NOTE: when adding more wiring logic here, make sure copyWiring() is kept in sync!
+                       // NOTE: when adding more wiring logic here, make sure importWiring() is kept in sync!
                } else {
                        throw new NoSuchServiceException( $name );
                }
index 55d3462..60b7022 100644 (file)
@@ -220,7 +220,6 @@ abstract class Skin extends ContextSource {
                // Preload jquery.tablesorter for mediawiki.page.ready
                if ( strpos( $out->getHTML(), 'sortable' ) !== false ) {
                        $modules['content'][] = 'jquery.tablesorter';
-                       $modules['styles']['content'][] = 'jquery.tablesorter.styles';
                }
 
                // Preload jquery.makeCollapsible for mediawiki.page.ready
@@ -1613,14 +1612,15 @@ abstract class Skin extends ContextSource {
         *   to be included in the link, like "&section=$section"
         * @param string $tooltip The tooltip to use for the link: will be escaped
         *   and wrapped in the 'editsectionhint' message
-        * @param string $lang Language code
+        * @param Language|null $lang Language object, defaults to user interface language
         * @return string HTML to use for edit link
         */
-       public function doEditSectionLink( Title $nt, $section, $tooltip = null, $lang = false ) {
+       public function doEditSectionLink( Title $nt, $section, $tooltip = null, Language $lang = null ) {
                // HTML generated here should probably have userlangattributes
                // added to it for LTR text on RTL pages
 
-               $lang = wfGetLangObj( $lang );
+               global $wgLang;
+               $lang = $lang ?: $wgLang;
 
                $attribs = [];
                if ( !is_null( $tooltip ) ) {
index a8761fb..8f9b163 100644 (file)
        "resetpass-submit-loggedin": "تغيير كلمة السر",
        "resetpass-submit-cancel": "إلغاء",
        "resetpass-wrong-oldpass": "كلمة سر حالية أو مؤقتة غير صحيحة.\nربما تكون غيرت كلمة السر الخاصة بك بنجاح أو طلبت كلمة سر مؤقتة جديدة.",
-       "resetpass-recycled": "اÙ\84رجاء Ø¥Ø¹Ø§Ø¯Ø© ØªØ¹Ù\8aÙ\8aÙ\86 كلمة السر الخاصة بك إلى تركيبة أخرى غير كلمة السر الحالية.",
+       "resetpass-recycled": "اÙ\84رجاء ØªØºÙ\8aÙ\8aر كلمة السر الخاصة بك إلى تركيبة أخرى غير كلمة السر الحالية.",
        "resetpass-temp-emailed": "أنت مسجل الدخول حالياً بتركيبة مرسلة عبر البريد الإلكتروني. لإكمال عملية تسجيل الدخول‘ يجب إعادة تعيين كلمة السر هنا:",
        "resetpass-temp-password": "كلمة سر مؤقتة:",
        "resetpass-abort-generic": "منعت مُلحقة إتمام صيرورة تغيير كلمة السّر.",
        "resetpass-expired": "انتهت مدة صلاحية كلمة السر الخاصة بك. الرجاء تعيين كلمة سر جديدة لتسجيل الدخول.",
-       "resetpass-expired-soft": "انتهت مدة صلاحية كلمة السر الخاصة بك. الرجاء تعيين كلمة سر جديدة الآن أو النقر على زر إلغاء لإعادة تعيين كلمة السر لاحقاً.",
+       "resetpass-expired-soft": "انتهت مدة صلاحية كلمة السر الخاصة بك; الرجاء تغيير كلمة سر جديدة الآن أو النقر على زر إلغاء لإعادة تعيين كلمة السر لاحقاً.",
        "resetpass-validity-soft": "كلمة السر الخاصة بك غير صالحة :  $1 \n\nرجاءا اختر كلمة سر جديدة الآن، أو انقر فوق \"{{int:authprovider-resetpass-skip-label}}\" لتغييرها في وقت لاحق.",
        "passwordreset": "إعادة ضبط كلمة السر",
        "passwordreset-text-one": "أكمل هذا النموذج لإعادة ضبط كلمة السر الخاصة بك.",
        "rcfilters-other-review-tools": "أدوات مراجعة أخرى",
        "rcfilters-group-results-by-page": "جمع النتائج حسب الصفحة",
        "rcfilters-activefilters": "المرشحات النشطة",
+       "rcfilters-activefilters-hide": "إخفاء",
+       "rcfilters-activefilters-show": "عرض",
        "rcfilters-advancedfilters": "مرشحات متقدمة",
        "rcfilters-limit-title": "النتائج للعرض",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|تغيير|تغييرات}}، $2",
        "rcfilters-savedqueries-rename": "أعد التسمية",
        "rcfilters-savedqueries-setdefault": "حفظ كقيمة افتراضية",
        "rcfilters-savedqueries-unsetdefault": "إزالة القيمة الافتراضية",
-       "rcfilters-savedqueries-remove": "أزÙ\84",
+       "rcfilters-savedqueries-remove": "حذÙ\81",
        "rcfilters-savedqueries-new-name-label": "الاسم",
        "rcfilters-savedqueries-new-name-placeholder": "صف الغرض من المرشح",
        "rcfilters-savedqueries-apply-label": "أنشئ مرشحا",
        "rcfilters-empty-filter": "لا مرشحات فعالة. كل المساهمات معروضة.",
        "rcfilters-filterlist-title": "مرشحات",
        "rcfilters-filterlist-whatsthis": "كيف تعمل هذه؟",
-       "rcfilters-filterlist-feedbacklink": "أخبرنا ما رأيك حول هذه المرشحات (الجديدة)",
+       "rcfilters-filterlist-feedbacklink": "أخبرنا ما رأيك حول هذه المرشحات",
        "rcfilters-highlightbutton-title": "التعليم على النتائج",
        "rcfilters-highlightmenu-title": "اختر لونًا",
        "rcfilters-highlightmenu-help": "اختر لونا للتعليم على هذه الخاصية",
index 823b09f..4f4aa01 100644 (file)
        "resetpass-submit-loggedin": "Camudar la contraseña",
        "resetpass-submit-cancel": "Encaboxar",
        "resetpass-wrong-oldpass": "Contraseña temporal o actual inválida.\nSeique yá camudaras la contraseña o que pidieras una nueva contraseña temporal.",
-       "resetpass-recycled": "Por favor, cambie la so contraseña por otra distinta de la actual.",
+       "resetpass-recycled": "Por favor, cambia la contraseña por otra distinta de la actual.",
        "resetpass-temp-emailed": "Anició sesión con un códigu temporal unviáu per corréu electrónicu.\nPa completar l'aniciu de sesión, tien de definir una nueva contraseña equí:",
        "resetpass-temp-password": "Contraseña temporal:",
        "resetpass-abort-generic": "Una estensión encaboxó'l cambiu de la contraseña.",
        "resetpass-expired": "La so contraseña caducó. Defina una nueva contraseña p'aniciar sesión.",
-       "resetpass-expired-soft": "La contraseña caducó y precisa reaniciase. Escueye agora una contraseña nueva, o pulsia «{{int:authprovider-resetpass-skip-label}}» pa reaniciala sero.",
-       "resetpass-validity-soft": "La contraseña nun ye válida: $1\n\nEscueye agora una contraseña nueva, o pulsia «{{int:authprovider-resetpass-skip-label}}» pa reaniciala sero.",
+       "resetpass-expired-soft": "La contraseña caducó y precisa cambiase. Escueye agora una contraseña nueva, o pulsia «{{int:authprovider-resetpass-skip-label}}» pa cambiala sero.",
+       "resetpass-validity-soft": "La contraseña nun ye válida: $1\n\nEscueye agora una contraseña nueva, o pulsia «{{int:authprovider-resetpass-skip-label}}» pa cambiala sero.",
        "passwordreset": "Reaniciar contraseña",
        "passwordreset-text-one": "Complete esti formulariu pa reaniciar la contraseña.",
        "passwordreset-text-many": "{{PLURAL:$1|Rellene unu de los campos pa recibir una contraseña temporal per corréu.}}",
        "rcfilters-other-review-tools": "Otres ferramientes de revisión",
        "rcfilters-group-results-by-page": "Agrupar resultancies per páxina",
        "rcfilters-activefilters": "Filtros activos",
+       "rcfilters-activefilters-hide": "Tapecer",
+       "rcfilters-activefilters-show": "Amosar",
        "rcfilters-advancedfilters": "Filtros avanzaos",
        "rcfilters-limit-title": "Resultancies qu'amosar",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|cambiu|$1 cambios}}, $2",
        "rcfilters-empty-filter": "Nun hai filtros activos. Amuésense toles contribuciones.",
        "rcfilters-filterlist-title": "Filtros",
        "rcfilters-filterlist-whatsthis": "¿Como funciona esto?",
-       "rcfilters-filterlist-feedbacklink": "Dinos lo que pienses sobre estes (nueves) ferramientes de filtriáu",
+       "rcfilters-filterlist-feedbacklink": "Dinos lo que pienses sobre estes ferramientes de filtriáu",
        "rcfilters-highlightbutton-title": "Resaltar resultaos",
        "rcfilters-highlightmenu-title": "Seleiciona un color",
        "rcfilters-highlightmenu-help": "Seleiciona un color pa resaltar esta propiedá",
        "rcfilters-watchlist-showupdated": "Los cambeos fechos en páxines que nun visitasti desque se ficieron apaecen en <strong>negrina</strong>, con marcadores sólidos.",
        "rcfilters-preference-label": "Tapecer la versión meyorada de Cambios recién",
        "rcfilters-preference-help": "Revierte'l rediseñu de la interfaz de 2017 y toles ferramientes añadíes d'entós aquí.",
+       "rcfilters-watchlist-preference-label": "Tapecer la versión ameyorada de la Llista de siguimientu",
+       "rcfilters-watchlist-preference-help": "Desfai el rediseñu de la interfaz de 2017 y toles ferramientes añadíes d'entós acá.",
        "rcfilters-filter-showlinkedfrom-label": "Amosar los cambios nes páxines enllazaes dende",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Páxines enllazaes dende</strong> la páxina seleicionada",
        "rcfilters-filter-showlinkedto-label": "Amosar los cambios nes páxines qu'enllacen a",
index cd958cf..1a43e95 100644 (file)
        "resetpass-abort-generic": "Зьмяненьне паролю было скасаванае пашырэньнем.",
        "resetpass-expired": "Тэрмін дзеяньня вашага паролю скончыўся. Калі ласка, пазначце новы пароль для ўваходу ў сыстэму.",
        "resetpass-expired-soft": "Тэрмін дзеяньня вашага паролю скончыўся і ён патрабуе замены. Калі ласка, абярыце новы пароль цяпер або націсьніце «{{int:authprovider-resetpass-skip-label}}», каб зьмяніць яго пазьней.",
-       "resetpass-validity-soft": "Ваш пароль зьяўляецца некарэктным: $1\n\nКалі ласка, абярыце зараз новы пароль або націсьніце «{{int:authprovider-resetpass-skip-label}}», каб скінуць яго пазьней.",
+       "resetpass-validity-soft": "Ваш пароль зьяўляецца некарэктным: $1\n\nКалі ласка, абярыце цяпер новы пароль або націсьніце «{{int:authprovider-resetpass-skip-label}}», каб зьмяніць яго пазьней.",
        "passwordreset": "Ачыстка паролю",
        "passwordreset-text-one": "Запоўніце гэтую форму, каб атрымаць часовы пароль электроннай поштай.",
        "passwordreset-text-many": "{{PLURAL:$1|Запоўніце адно з палёў, каб атрымаць часовы пароль праз электронную пошту.}}",
        "rcfilters-empty-filter": "Няма актыўных фільтраў. Паказаны ўвесь унёсак.",
        "rcfilters-filterlist-title": "Фільтры",
        "rcfilters-filterlist-whatsthis": "Як гэта працуе?",
-       "rcfilters-filterlist-feedbacklink": "Раскажыце нам, што вы думаеце пра гэтыя (новыя) фільтры",
+       "rcfilters-filterlist-feedbacklink": "Раскажыце нам, што вы думаеце пра гэтыя інструмэнты фільтраў",
        "rcfilters-highlightbutton-title": "Вылучыць вынікі",
        "rcfilters-highlightmenu-title": "Абярыце колер",
        "rcfilters-highlightmenu-help": "Абярыце колер для вылучэньня гэтай уласьцівасьці",
        "filename-tooshort": "Назва файлу занадта кароткая.",
        "filetype-banned": "Гэты тып файлу забаронены.",
        "verification-error": "Гэты файл не прайшоў праверку.",
-       "hookaborted": "Ð\9fÑ\80апанаванаÑ\8f Ð\92амÑ\96 Ð·Ñ\8cмена Ð±Ñ\8bла Ð°Ð´Ñ\85Ñ\96ленаÑ\8f Ð°Ð¿Ñ\80аÑ\86оÑ\9eÑ\88Ñ\87Ñ\8bкам Ð¿Ð°Ñ\88Ñ\8bÑ\80Ñ\8dнÑ\8cнÑ\8f.",
-       "illegal-filename": "Недазволеная назва файла.",
-       "overwrite": "Замена існуючага файла забароненая.",
+       "hookaborted": "Ð\9fÑ\80апанаванаÑ\8f Ð²Ð°Ð¼Ñ\96 Ð·Ñ\8cмена Ð±Ñ\8bла Ð°Ð´Ñ\85Ñ\96ленаÑ\8f Ð¿Ð°Ñ\88Ñ\8bÑ\80Ñ\8dнÑ\8cнем.",
+       "illegal-filename": "Недазволеная назва файлу.",
+       "overwrite": "Замена існага файлу забароненая.",
        "unknown-error": "Узьнікла невядомая памылка.",
        "tmp-create-error": "Немагчыма стварыць часовы файл.",
        "tmp-write-error": "Памылка запісу часовага файла.",
index f8c87a1..44f4040 100644 (file)
        "listduplicatedfiles": "Пералік дублікатных файлаў",
        "listduplicatedfiles-summary": "Гэта пералік файлаў, у якіх найноўшая версія файла ўяўляе сабою копію апошняй версіі якога-небудзь іншага файла. Улічваюцца толькі лакальныя файлы.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] мае [[$3|{{PLURAL:$2|дублікат|$2 дублікаты|$2 дублікатаў}}]].",
-       "unusedtemplates": "ШаблонÑ\8b, Ñ\8fкÑ\96Ñ\8f Ð½Ðµ Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82аны",
+       "unusedtemplates": "Ð\9dевÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8bÑ\8f Ñ\88аблоны",
        "unusedtemplatestext": "Тут пералічаныя ўсе старонкі ў прасторы назваў {{ns:template}}, якія не ўкладзеныя ў іншыя старонкі.\nПамятайце, што трэба правяраць спасылкі на шаблоны перад тым, як выдаляць іх.",
        "unusedtemplateswlh": "іншыя спасылкі",
        "randompage": "Выпадковая старонка",
index db59cc7..503f7ec 100644 (file)
        "rcfilters-other-review-tools": "অন্যান্য পর্যালোচনা সরঞ্জাম",
        "rcfilters-group-results-by-page": "পাতা অনুযায়ী দলের ফলাফল",
        "rcfilters-activefilters": "সক্রিয় ছাঁকনিসমূহ",
+       "rcfilters-activefilters-hide": "লুকান",
+       "rcfilters-activefilters-show": "দেখান",
        "rcfilters-advancedfilters": "উন্নত ছাঁকনি",
        "rcfilters-limit-title": "যেসব ফলাফল দেখাবে",
        "rcfilters-limit-and-date-label": "$1টি {{PLURAL:$1|পরিবর্তন}}, $2",
        "rcfilters-savedqueries-rename": "নামান্তর",
        "rcfilters-savedqueries-setdefault": "পূর্ব-নির্ধারিত হিসেবে নির্ধারন করুন",
        "rcfilters-savedqueries-unsetdefault": "পূর্ব-নির্ধারিত হিসেবে নির্ধারন সরান",
-       "rcfilters-savedqueries-remove": "সরান",
+       "rcfilters-savedqueries-remove": "à¦\85পসারণ",
        "rcfilters-savedqueries-new-name-label": "নাম",
        "rcfilters-savedqueries-new-name-placeholder": "ছাঁকনির উদ্দেশ্য বর্ণনা করুন",
        "rcfilters-savedqueries-apply-label": "ছাঁকনি তৈরি করুন",
        "rcfilters-empty-filter": "কোনো সক্রিয় ফিল্টার নেই। সমস্ত অবদান দেখানো হয়েছে।",
        "rcfilters-filterlist-title": "ছাঁকনি",
        "rcfilters-filterlist-whatsthis": "এগুলি কিভাবে কাজ করে?",
-       "rcfilters-filterlist-feedbacklink": "আপনি এই (নতুন) ছাঁকন সরঞ্জাম সম্পর্কে কি মনে করেন তা আমাদের বলুন",
+       "rcfilters-filterlist-feedbacklink": "আপনি এই ছাঁকন সরঞ্জাম সম্পর্কে কি মনে করেন তা আমাদের বলুন",
        "rcfilters-highlightbutton-title": "ফলাফলে আলোকপাত করুন",
        "rcfilters-highlightmenu-title": "একটি রং নির্বাচন করুন",
        "rcfilters-highlightmenu-help": "এই বৈশিষ্ট্যটিতে আলোকপাত করতে একটি রঙ নির্বাচন করুন",
index 073b2ce..d93159b 100644 (file)
        "savechanges": "Enrollañ ar c'hemmoù",
        "publishpage": "Embann ar bajenn",
        "publishchanges": "Embann ar c'hemmoù",
+       "savearticle-start": "Enrollañ ar bajenn...",
+       "savechanges-start": "Enrollañ ar c'hemmoù...",
+       "publishpage-start": "Embann ar bajenn...",
+       "publishchanges-start": "Embann ar c'hemmoù",
        "preview": "Rakwelet",
        "showpreview": "Rakwelet",
        "showdiff": "Diskouez ar c'hemmoù",
        "prefs-dateformat": "Furmad an deiziadoù",
        "prefs-timeoffset": "Linkadur eur",
        "prefs-advancedediting": "Dibarzhioù araokaet",
+       "prefs-developertools": "Ostilhoù diorren",
        "prefs-editor": "Aozer",
        "prefs-preview": "Rakwelet",
        "prefs-advancedrc": "Dibarzhioù araokaet",
+       "prefs-opt-out": "Nac'hañ ar c'hemmoù",
        "prefs-advancedrendering": "Dibarzhioù araokaet",
        "prefs-advancedsearchoptions": "Dibarzhioù araokaet",
        "prefs-advancedwatchlist": "Dibarzhioù araokaet",
        "prefs-diffs": "Diforc'hioù",
        "prefs-help-prefershttps": "Efediñ a ray an dibarzh-mañ kentañ gwech ma kevreoc'h.",
        "prefswarning-warning": "Kemmet eo bet ho penndibaboù ganeoc'h, met enrollet n'int ket bet avat.\nMar kuitait ar bajenn-mañ hep klikañ war \"$1\" ne vo ket nevesaet ho penndibaboù",
-       "prefs-tabs-navigation-hint": "Titourig : Gallout a rit implijout an touchennoù bir kleiz ha bir dehoù evit merdeiñ etre an ivinelloù e roll an ivinelloù.",
+       "prefs-tabs-navigation-hint": "Titourig : Gallout a rit implijout an touchennoù bir kleiz ha bir dehou evit merdeiñ etre an ivinelloù e roll an ivinelloù.",
        "userrights": "Gwirioù an implijer",
        "userrights-lookup-user": "Diuzañ un implijer",
        "userrights-user-editname": "Lakait un anv implijer :",
        "apisandbox-dynamic-error-exists": "Bez' ez eus c'hoazh eus un arventenn anvet \"$1\".",
        "apisandbox-deprecated-parameters": "Arventennoù dispredet",
        "apisandbox-fetch-token": "Leuniañ emgefre ar jedouer",
+       "apisandbox-add-multi": "Ouzhpennañ",
        "apisandbox-submit-invalid-fields-title": "Direizh eo maeziennoù zo",
        "apisandbox-submit-invalid-fields-message": "Reizhit ar maeziennoù merket ha klaskit en-dro.",
        "apisandbox-results": "Disoc'hoù",
        "newimages-user": "Chomlec'h IP pe anv implijer",
        "newimages-showbots": "Diskouez an ezporzhiadennoù graet gant robotoù",
        "newimages-hidepatrolled": "Kuzhat ar enporzhiadennoù gwiriet",
+       "newimages-mediatype": "Doare media :",
        "noimages": "Netra da welet.",
        "gallery-slideshow-toggle": "Gwintañ ar munudoù",
        "ilsubmit": "Klask",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Dikedenn|Tikedenn}}]] : $2)",
        "tag-mw-contentmodelchange": "cheñch ar patrom danvez",
        "tag-mw-contentmodelchange-description": "KEmmoù a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel cheñch patrom danvez] ur bajenn",
+       "tag-mw-new-redirect": "Adkas nevez",
        "tag-mw-undo": "Dizober",
        "tags-title": "Tikedennoù",
        "tags-intro": "Rollañ a ra ar bajenn-mañ an tikedennoù a c'hall ar meziant implijout da verkañ kemmoù hag o zalvoudegezh.",
        "undelete-cantedit": "N'hallit ket diziverkañ ar bajenn-mañ rak n'oc'h ket aotreet da gemmañ anezhi.",
        "undelete-cantcreate": "N'hallit ket diziverkañ ar bajenn-mañ rak n'eus pajenn ebet gant an anv-mañ ha n'oc'h ket aotreet da grouiñ ar bajenn-mañ.",
        "pagedata-title": "Roadennoù ar bajenn",
-       "pagedata-bad-title": "Titl direizh : $1."
+       "pagedata-bad-title": "Titl direizh : $1.",
+       "passwordpolicies-group": "Strollad",
+       "passwordpolicies-policies": "Politikerezh"
 }
index 3c31bf0..6800d66 100644 (file)
        "moredotdotdot": "Lainna...",
        "morenotlisted": "Daftar on mungkin inda singkop",
        "mypage": "Alaman",
-       "mytalk": "Dokon",
+       "mytalk": "Obar",
        "anontalk": "Obar",
        "navigation": "Navigasi",
        "and": "&#32;dot",
        "create-local": "Baen deskripsi lokal",
        "delete": "Apus",
        "newpage": "Alaman baru",
-       "talkpagelinktext": "Dokon",
+       "talkpagelinktext": "obar",
        "personaltools": "Alat pribadi",
        "talk": "Marpokat",
        "views": "Sise",
        "rcshowhidemine-show": "Patidaon",
        "rcshowhidemine-hide": "Bunion",
        "rclinks": "Patidaon sude $1 parubaan $2 ari",
-       "diff": "diff",
-       "hist": "hist",
+       "diff": "beda",
+       "hist": "versi",
        "hide": "Bunion",
        "show": "Alaman pamake",
        "minoreditletter": "m",
        "listgrouprights-members": "(daftar anggota)",
        "emailuser": "Email ni pamake on",
        "usermessage-editor": "Tona ni sistem",
-       "watchlist": "Pamataan",
-       "mywatchlist": "Pamatai",
+       "watchlist": "Daftar Pamataan",
+       "mywatchlist": "Daftar pamataan",
        "watchlistfor2": "Tu $1 $2",
        "watch": "Pamatai",
        "unwatch": "Inda ipamatai",
        "sp-contributions-blocklog": "Log blokir",
        "sp-contributions-uploads": "Unggah",
        "sp-contributions-logs": "Log",
-       "sp-contributions-talk": "Dokon",
+       "sp-contributions-talk": "obar",
        "sp-contributions-search": "Jalaki kontribusi",
        "sp-contributions-username": "Alama IP Pangguna",
        "sp-contributions-toponly": "Umna patidaon editan revisi parpudi",
index fdadfc5..5dac858 100644 (file)
        "resetpass-submit-loggedin": "Canvia la contrasenya",
        "resetpass-submit-cancel": "Cancel·la",
        "resetpass-wrong-oldpass": "Contrasenya actual o temporal no vàlida.\nDeveu haver canviat la vostra contrasenya o demanat una nova contrasenya temporal.",
-       "resetpass-recycled": "Restabliu la contrasenya amb un text diferent que el de la contrasenya actual.",
+       "resetpass-recycled": "Canvieu la contrasenya amb un text diferent que el de la contrasenya actual.",
        "resetpass-temp-emailed": "Heu iniciat una sessió amb un codi temporal enviat per correu.\nPer completar l'inici de sessió heu de definir una contrasenya nova a continuació:",
        "resetpass-temp-password": "Contrasenya temporal:",
        "resetpass-abort-generic": "Una extensió ha interromput el canvi de contrasenya.",
        "resetpass-expired": "La contrasenya ha vençut. Definiu una contrasenya nova per iniciar la sessió.",
-       "resetpass-expired-soft": "La contrasenya ha vençut i cal restablir-la. Trieu una contrasenya nova ara, o feu clic a «{{int:authprovider-resetpass-skip-label}}» per a restablir-la més endavant.",
-       "resetpass-validity-soft": "La contrasenya no és vàlida: $1\n\nTrieu una nova contrasenya ara o cliqueu \"{{int:authprovider-resetpass-skip-label}}\" per a restablir-la més endavant.",
+       "resetpass-expired-soft": "La contrasenya ha vençut i cal canviar-la. Trieu una contrasenya nova ara, o feu clic a «{{int:authprovider-resetpass-skip-label}}» per a canviar-la més endavant.",
+       "resetpass-validity-soft": "La contrasenya no és vàlida: $1\n\nTrieu una nova contrasenya ara o cliqueu \"{{int:authprovider-resetpass-skip-label}}\" per a canviar-la més endavant.",
        "passwordreset": "Restablir contrasenya",
        "passwordreset-text-one": "Cal completar aquest formulari per reiniciar la contrasenya",
        "passwordreset-text-many": "{{PLURAL:$1|Ompliu un dels camps per a rebre una contrasenya temporal al vostre correu electrònic.}}",
        "rcfilters-other-review-tools": "Altres eines de supervisió",
        "rcfilters-group-results-by-page": "Agrupa els resultats per pàgina",
        "rcfilters-activefilters": "Filtres actius",
+       "rcfilters-activefilters-hide": "Amaga",
+       "rcfilters-activefilters-show": "Mostra",
        "rcfilters-advancedfilters": "Filtres avançats",
        "rcfilters-limit-title": "Resultats a mostrar",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|canvi|canvis}}, $2",
        "rcfilters-empty-filter": "No hi ha cap filtre actiu. Es mostren totes les contribucions.",
        "rcfilters-filterlist-title": "Filtres",
        "rcfilters-filterlist-whatsthis": "Com funciona això?",
-       "rcfilters-filterlist-feedbacklink": "Comenta'ns què et semblen aquestes (noves) eines per filtrar",
+       "rcfilters-filterlist-feedbacklink": "Comenteu-nos què us semblen aquestes eines de filtratge",
        "rcfilters-highlightbutton-title": "Ressalta els resultats",
        "rcfilters-highlightmenu-title": "Selecciona un color",
        "rcfilters-highlightmenu-help": "Seleccioneu un color per ressaltar la propietat",
        "rcfilters-filtergroup-reviewstatus": "Estat de revisió",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "No patrullat",
        "rcfilters-filter-reviewstatus-manual-label": "Patrullat manualment",
+       "rcfilters-filter-reviewstatus-auto-label": "Autopatrullat",
        "rcfilters-filtergroup-significance": "Significació",
        "rcfilters-filter-minor-label": "Modificacions menors",
        "rcfilters-filter-minor-description": "Modificacions que l'autor va etiquetar com a menors.",
        "rcfilters-watchlist-edit-watchlist-button": "Editeu la vostra llista de pàgines seguides",
        "rcfilters-watchlist-showupdated": "Els canvis fets en pàgines que no heu visitat des que s'efectuaren apareixen en <strong>negreta</strong> amb un punt sòlid al costat.",
        "rcfilters-preference-label": "Amaga la versió millorada de Canvis recents",
+       "rcfilters-filter-showlinkedfrom-label": "Mostra els canvis en les pàgines enllaçades des de",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Pàgines enllaçades des de</strong> la pàgina seleccionada",
        "rcfilters-filter-showlinkedto-label": "Mostra els canvis a les pàgines que enllacin a",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Pàgines que enllacen a</strong> la pàgina seleccionada",
        "rcfilters-target-page-placeholder": "Escriviu el nom d’una pàgina (o d’una categoria)",
        "dellogpage": "Registre de supressions",
        "dellogpagetext": "Davall hi ha una llista dels esborraments més recents.",
        "deletionlog": "registre de supressions",
+       "log-name-create": "Registre de creació de pàgines",
        "reverted": "Invertit amb una revisió anterior",
        "deletecomment": "Motiu:",
        "deleteotherreason": "Motiu diferent o addicional:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetes}}]]: $2)",
        "tag-mw-contentmodelchange": "canvi de model de contingut",
        "tag-mw-new-redirect": "Redirecció nova",
+       "tag-mw-removed-redirect": "Redirecció suprimida",
+       "tag-mw-changed-redirect-target": "La destinació de la redirecció ha canviat",
        "tag-mw-blank": "Buidament",
+       "tag-mw-blank-description": "Modificacions que blanquegen una pàgina",
        "tag-mw-replace": "Substitució",
+       "tag-mw-undo": "Desfés",
        "tags-title": "Etiquetes",
        "tags-intro": "Aquesta pàgina llista les etiquetes amb què el programari pot marcar una modificació, i el seu significat.",
        "tags-tag": "Nom de l'etiqueta",
        "compare-title-not-exists": "El títol que heu especificat no existeix.",
        "compare-revision-not-exists": "La revisió que heu especificat no existeix.",
        "diff-form": "Diferències",
+       "diff-form-oldid": "ID de la revisió antiga (opcional)",
        "diff-form-submit": "Mostra les diferències",
        "permanentlink": "Enllaç permanent",
        "permanentlink-revid": "ID de la revisó",
index b703394..0f2f3fc 100644 (file)
        "dellogpage": "ДӀадаьхнарш долу тéптар",
        "dellogpagetext": "Лахахь гойтуш ю тӀаьххьара дӀаяьхнарш.",
        "deletionlog": "дӀадаьхнарш долу тéптар",
+       "log-name-create": "АгӀонаш кхолларан тептар",
+       "log-description-create": "Лахахь гойтуш ю тӀаьххьара кхоьллина агӀонаш.",
+       "logentry-create-create": "$1 {{GENDER:$2|кхоьллина}} $3 агӀо",
        "deletecomment": "Бахьана:",
        "deleteotherreason": "Кхин бахьана/тӀетохар:",
        "deletereasonotherlist": "Кхин бахьана",
index 8cb2b8f..ef417f5 100644 (file)
        "special-characters-group-khmer": "خمێری",
        "mw-widgets-usersmultiselect-placeholder": "زیادکردن...",
        "log-action-filter-block": "جۆری بلۆک:",
+       "log-action-filter-contentmodel": "جۆری گۆڕینی مۆدێلی ناوەڕۆک:",
        "log-action-filter-all": "ھەموو",
        "log-action-filter-upload-upload": "بارکردنی نوێ",
        "authmanager-email-label": "ئیمەیڵ"
index 788a416..4997046 100644 (file)
        "rcfilters-other-review-tools": "Další kontrolní nástroje",
        "rcfilters-group-results-by-page": "Seskupit výsledky podle stránky",
        "rcfilters-activefilters": "Aktivní filtry",
+       "rcfilters-activefilters-hide": "Skrýt",
+       "rcfilters-activefilters-show": "Zobrazit",
        "rcfilters-advancedfilters": "Pokročilé filtry",
        "rcfilters-limit-title": "Zobrazené výsledky",
        "rcfilters-limit-and-date-label": "{{PLURAL:$1|Jedna změna|$1 změny|$1 změn}}, $2",
        "rcfilters-savedqueries-rename": "Přejmenovat",
        "rcfilters-savedqueries-setdefault": "Nastavit jako výchozí",
        "rcfilters-savedqueries-unsetdefault": "Nemít jako výchozí",
-       "rcfilters-savedqueries-remove": "Odstranit",
+       "rcfilters-savedqueries-remove": "Smazat",
        "rcfilters-savedqueries-new-name-label": "Název",
        "rcfilters-savedqueries-new-name-placeholder": "Popište účel filtru",
        "rcfilters-savedqueries-apply-label": "Vytvořit filtr",
        "rcfilters-empty-filter": "Žádné aktivní filtry. Zobrazeny jsou všechny příspěvky.",
        "rcfilters-filterlist-title": "Filtry",
        "rcfilters-filterlist-whatsthis": "Jak to funguje?",
-       "rcfilters-filterlist-feedbacklink": "Řekněte nám, co si myslíte o těchto (nových) filtrech",
+       "rcfilters-filterlist-feedbacklink": "Sdělte nám svůj názor na tyto filtrovací nástroje",
        "rcfilters-highlightbutton-title": "Zvýraznit výsledky",
        "rcfilters-highlightmenu-title": "Vybrat barvu",
        "rcfilters-highlightmenu-help": "Vyberte barvu pro zvýraznění této vlastnosti",
        "rcfilters-watchlist-showupdated": "Změny stránek, které jste od provedení změn nenavštívili, jsou zobrazeny <strong>tučně</strong> s vyplněnou značkou.",
        "rcfilters-preference-label": "Skrýt vylepšenou verzi posledních změn",
        "rcfilters-preference-help": "Zruší novou podobu rozhraní zavedenou v roce 2017 a všechny nástroje přidané od té doby.",
+       "rcfilters-watchlist-preference-label": "Skrýt vylepšenou verzi sledovaných stránek",
+       "rcfilters-watchlist-preference-help": "Zruší novou podobu rozhraní zavedenou v roce 2017 a všechny nástroje přidané od té doby.",
        "rcfilters-filter-showlinkedfrom-label": "Zobrazit změny stránek, na které se odkazuje",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Stránky odkazované z</strong> vybrané stránky",
        "rcfilters-filter-showlinkedto-label": "Zobrazit změny stránek, které sem odkazují",
        "whatlinkshere": "Odkazuje sem",
        "whatlinkshere-title": "Stránky odkazující na „$1“",
        "whatlinkshere-page": "Strana:",
-       "linkshere": "Na <strong>$1</strong> odkazují tyto stránky:",
-       "nolinkshere": "Žádná stránka na <strong>$1</strong> neodkazuje.",
-       "nolinkshere-ns": "Ve zvoleném jmenném prostoru na <strong>$1</strong> neodkazuje žádná stránka.",
+       "linkshere": "Na <strong>$2</strong> odkazují tyto stránky:",
+       "nolinkshere": "Žádná stránka na <strong>$2</strong> neodkazuje.",
+       "nolinkshere-ns": "Ve zvoleném jmenném prostoru na <strong>$2</strong> neodkazuje žádná stránka.",
        "isredirect": "přesměrování",
        "istemplate": "vložení",
        "isimage": "vložení souboru",
index 1936b0e..cab15ae 100644 (file)
        "resetpass-submit-loggedin": "Passwort ändern",
        "resetpass-submit-cancel": "Abbrechen",
        "resetpass-wrong-oldpass": "Ungültiges temporäres oder aktuelles Passwort.\nMöglicherweise hast du dein Passwort bereits geändert oder ein neues temporäres Passwort beantragt.",
-       "resetpass-recycled": "Bitte setze dein Passwort auf ein anderes Passwort als dein aktuelles fest.",
+       "resetpass-recycled": "Bitte ändere dein Passwort auf ein anderes als dein aktuelles.",
        "resetpass-temp-emailed": "Du hast dich mit einem temporären E-Mail-Code angemeldet.\nUm die Anmeldung abzuschließen, musst du jetzt ein neues Passwort festlegen:",
        "resetpass-temp-password": "Temporäres Passwort:",
        "resetpass-abort-generic": "Die Passwortänderung wurde durch eine Erweiterung abgebrochen.",
        "resetpass-expired": "Dein Passwort ist abgelaufen. Bitte lege ein neues Passwort zur Anmeldung fest.",
-       "resetpass-expired-soft": "Dein Passwort ist abgelaufen und muss zurückgesetzt werden. Bitte wähle jetzt ein neues Passwort aus oder klicke auf „{{int:authprovider-resetpass-skip-label}}“, um es später zurückzusetzen.",
-       "resetpass-validity-soft": "Dein Passwort ist ungültig: $1\n\nBitte wähle jetzt ein neues Passwort oder klicke auf „{{int:authprovider-resetpass-skip-label}}“, um es später zurückzusetzen.",
+       "resetpass-expired-soft": "Dein Passwort ist abgelaufen und muss geändert werden. Bitte wähle jetzt ein neues Passwort aus oder klicke auf „{{int:authprovider-resetpass-skip-label}}“, um es später zu ändern.",
+       "resetpass-validity-soft": "Dein Passwort ist ungültig: $1\n\nBitte wähle jetzt ein neues Passwort aus oder klicke auf „{{int:authprovider-resetpass-skip-label}}“, um es später zu ändern.",
        "passwordreset": "Passwort zurücksetzen",
        "passwordreset-text-one": "Fülle dieses Formular aus, um ein temporäres Passwort per E-Mail zu erhalten.",
        "passwordreset-text-many": "{{PLURAL:$1|Fülle eines der Felder aus, um ein temporäres Passwort per E-Mail zugesandt zu bekommen.}}",
        "rcfilters-other-review-tools": "Andere Überprüfungswerkzeuge",
        "rcfilters-group-results-by-page": "Ergebnisse nach Seite gruppieren",
        "rcfilters-activefilters": "Aktive Filter",
+       "rcfilters-activefilters-hide": "Ausblenden",
+       "rcfilters-activefilters-show": "Anzeigen",
        "rcfilters-advancedfilters": "Erweiterte Filter",
        "rcfilters-limit-title": "Anzuzeigende Ergebnisse",
        "rcfilters-limit-and-date-label": "{{PLURAL:$1|Eine Änderung|$1 Änderungen}}, $2",
        "rcfilters-savedqueries-rename": "Umbenennen",
        "rcfilters-savedqueries-setdefault": "Als Standard festlegen",
        "rcfilters-savedqueries-unsetdefault": "Als Standard entfernen",
-       "rcfilters-savedqueries-remove": "Entfernen",
+       "rcfilters-savedqueries-remove": "Löschen",
        "rcfilters-savedqueries-new-name-label": "Name",
        "rcfilters-savedqueries-new-name-placeholder": "Beschreibe den Zweck des Filters",
        "rcfilters-savedqueries-apply-label": "Filter erstellen",
        "rcfilters-empty-filter": "Keine aktiven Filter. Es werden alle Beiträge angezeigt.",
        "rcfilters-filterlist-title": "Filter",
        "rcfilters-filterlist-whatsthis": "Wie funktioniert das?",
-       "rcfilters-filterlist-feedbacklink": "Erzähle uns, was du über diese (neuen) Filterwerkzeuge denkst.",
+       "rcfilters-filterlist-feedbacklink": "Erzähle uns, was du über diese Filterwerkzeuge denkst.",
        "rcfilters-highlightbutton-title": "Ergebnisse hervorheben",
        "rcfilters-highlightmenu-title": "Eine Farbe auswählen",
        "rcfilters-highlightmenu-help": "Eine Farbe auswählen, um diese Eigenschaft hervorzuheben.",
index a4655a1..86a05f0 100644 (file)
        "rcfilters-other-review-tools": "Other review tools",
        "rcfilters-group-results-by-page": "Group results by page",
        "rcfilters-activefilters": "Active filters",
+       "rcfilters-activefilters-hide": "Hide",
+       "rcfilters-activefilters-show": "Show",
        "rcfilters-advancedfilters": "Advanced filters",
        "rcfilters-limit-title": "Results to show",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|change|changes}}, $2",
index 376baca..939e850 100644 (file)
        "resetpass-abort-generic": "Una extensión ha cancelado el cambio de la contraseña.",
        "resetpass-expired": "Tu contraseña ha caducado. Por favor, establece una nueva contraseña para iniciar sesión.",
        "resetpass-expired-soft": "Tu contraseña ha caducado, por lo que debes restablecerla. Cámbiala ahora por una nueva, o haz clic en \"{{int:authprovider-resetpass-skip-label}}\" para restablecerla más adelante.",
-       "resetpass-validity-soft": "Tu contraseña no es válida: $1\n\nCámbiala ahora por una nueva, o haz clic en \"{{int:authprovider-resetpass-skip-label}}\" para cambiarla más tarde.",
+       "resetpass-validity-soft": "La contraseña no es válida: $1\n\nCámbiala ahora por una nueva, o bien, pulsa en «{{int:authprovider-resetpass-skip-label}}» para cambiarla más tarde.",
        "passwordreset": "Restablecer contraseña",
        "passwordreset-text-one": "Completa este formulario para recibir una contraseña temporal por correo electrónico.",
        "passwordreset-text-many": "{{PLURAL:$1|Rellena uno de los campos para recibir una contraseña temporal por correo electrónico.}}",
        "rcfilters-other-review-tools": "Otras herramientas de revisión",
        "rcfilters-group-results-by-page": "Agrupar resultados por página",
        "rcfilters-activefilters": "Filtros activos",
+       "rcfilters-activefilters-hide": "Ocultar",
+       "rcfilters-activefilters-show": "Mostrar",
        "rcfilters-advancedfilters": "Filtros avanzados",
        "rcfilters-limit-title": "Resultados que mostrar",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|cambio|cambios}}, $2",
index d5590ef..a81a622 100644 (file)
                        "Vexthedorito",
                        "Djiboun",
                        "Pols12",
-                       "KATRINE1992"
+                       "KATRINE1992",
+                       "Friday83260"
                ]
        },
        "tog-underline": "Soulignement des liens :",
        "resetpass-submit-loggedin": "Changer de mot de passe",
        "resetpass-submit-cancel": "Annuler",
        "resetpass-wrong-oldpass": "Mot de passe actuel ou temporaire invalide.\nVous avez peut-être déjà changé votre mot de passe ou demandé un nouveau mot de passe temporaire.",
-       "resetpass-recycled": "Veuillez réinitialiser votre mot de passe à quelque chose d’autre que l’actuel.",
+       "resetpass-recycled": "Veuillez modifier votre mot de passe à quelque chose d’autre que l’actuel.",
        "resetpass-temp-emailed": "Vous êtes connecté{{GENDER:||e}} avec un code temporaire fourni par courriel.\nPour terminer la connexion, vous devez fournir un nouveau mot de passe ici :",
        "resetpass-temp-password": "Mot de passe temporaire :",
        "resetpass-abort-generic": "La modification du mot de passe a été annulée par une extension.",
        "resetpass-expired": "Votre mot de passe a expiré. Veuillez en fournir un nouveau pour vous connecter.",
-       "resetpass-expired-soft": "Votre mot de passe a expiré, et doit être réinitialisé. Veuillez en choisir un nouveau maintenant ou cliquer sur « {{int:authprovider-resetpass-skip-label}} » pour le faire plus tard.",
-       "resetpass-validity-soft": "Votre mot de passe n’est pas valide : $1\n\nVeuillez choisir un nouveau mot de passe maintenant, ou cliquez sur « {{int:authprovider-resetpass-skip-label}} » pour le réinitialiser plus tard.",
+       "resetpass-expired-soft": "Votre mot de passe a expiré, et doit être modifié. Veuillez en choisir un nouveau maintenant ou cliquer sur « {{int:authprovider-resetpass-skip-label}} » pour le faire plus tard.",
+       "resetpass-validity-soft": "Votre mot de passe n’est pas valide : $1\n\nVeuillez choisir un nouveau mot de passe maintenant, ou cliquez sur « {{int:authprovider-resetpass-skip-label}} » pour le modifier plus tard.",
        "passwordreset": "Réinitialisation du mot de passe",
        "passwordreset-text-one": "Remplissez ce formulaire pour réinitialiser votre mot de passe.",
        "passwordreset-text-many": "{{PLURAL:$1|Remplissez un des champs pour recevoir un mot de passe temporaire par courriel.}}",
        "rcfilters-other-review-tools": "Autres outils de relecture",
        "rcfilters-group-results-by-page": "Grouper les résultats par page",
        "rcfilters-activefilters": "Filtres actifs",
+       "rcfilters-activefilters-hide": "Masquer",
+       "rcfilters-activefilters-show": "Afficher",
        "rcfilters-advancedfilters": "Filtres avancés",
        "rcfilters-limit-title": "Résultats à afficher",
        "rcfilters-limit-and-date-label": "$1 modification{{PLURAL:$1||s}}, $2",
        "rcfilters-empty-filter": "Aucun filtre actif. Toutes les contributions sont affichées.",
        "rcfilters-filterlist-title": "Filtres",
        "rcfilters-filterlist-whatsthis": "Comment ça marche ?",
-       "rcfilters-filterlist-feedbacklink": "Nous dire ce que vous pensez de ces (nouveaux) outils de filtrage",
+       "rcfilters-filterlist-feedbacklink": "Dites nous ce que vous pensez de ces outils de filtrage",
        "rcfilters-highlightbutton-title": "Mettre en valeur les résultats",
        "rcfilters-highlightmenu-title": "Choisir une couleur",
        "rcfilters-highlightmenu-help": "Sélectionner une couleur pour mettre en évidence cette propriété",
index af46666..86f3dd2 100644 (file)
        "nstab-category": "Katégori",
        "mainpage-nstab": "Paj prensipal",
        "nosuchaction": "Aksyon enkonèt",
-       "nosuchactiontext": "Aksyon-an spésifyé andan URL-a sa envalid.\nZòt pitèt mal antré URL-a ou swivi roun lyen éroné.\nLi pé égalman endiké oun anomali andan logisyèl itilizé pa {{SITENAME}}.",
+       "nosuchactiontext": "Aksyon-an èspésifyé annan URL-a sa envalid.\nZòt pitèt mal antré URL-a oben swivi roun lyen éroné.\nLi pouvé égalman endiké oun anomali andan logisyèl itilizé pa {{SITENAME}}.",
        "nosuchspecialpage": "Paj èspésyal inègzistant",
        "nospecialpagetext": "<strong>Zòt doumandé oun paj èspésyal ki pa ka ègzisté.</strong>\n\nOun lis dé paj èspésyal valid ka trouvé so kò asou [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Érò",
        "databaseerror": "Érò di baz di doné",
-       "databaseerror-text": "Oun érò di rékèt di baz di doné aparèt.\nSala pé provini di roun anomali annan lojisyèl-a.",
+       "databaseerror-text": "Oun érò di rékèt di baz di doné aparèt.\nSala pouvé provini di roun anomali annan lojisyèl-a.",
        "databaseerror-textcl": "Oun érò di rékèt di baz di doné aparèt.",
        "databaseerror-query": "Rékèt : $1",
        "databaseerror-function": "Fonksyon : $1",
        "delete-hook-aborted": "Souprésyon anilé pa roun ègstansyon.\nPyès èksplikasyon té bay.",
        "no-null-revision": "Enposib di kréyé roun nouvèl révizyon vid pou paj-a « $1 »",
        "badtitle": "Movè tit",
-       "badtitletext": "Tit di paj doumandé pa valid, vid, ou mal formé si a roun tit entèr-lanng ou entèr-projè.\nI ka kontni pitèt oun ou plizyò karaktèr ki pa pé sa itilizé andan tit-ya.",
+       "badtitletext": "Tit di paj doumandé pa valid, vid, oben mal fòrmé si a roun tit entèr-lanng oben entèr-projè.\nI ka kontni pitèt oun oben plizyò karaktèr ki pa pouvé fika itilizé annan tit-ya.",
        "title-invalid-empty": "Tit di paj doumandé sa vid oben ka kontni sèlman non-an di roun lèspas di non.",
        "title-invalid-utf8": "Tit di paj doumandé ka kontni roun sékans UTF-8 envalid.",
        "title-invalid-interwiki": "Paj sib ka kontni roun lyen interwiki ki nou pa pouvé itilizé annan tit-ya.",
        "createacct-email-ph": "Zòt adrès di kouryé",
        "createacct-another-email-ph": "Antré adrès-a di kouryé",
        "createaccountmail": "Itilizé roun mo di pas aléyatwar tanporèr é voyé li pou adrès-a di kouryé spésifyé",
-       "createaccountmail-help": "Pé sa itilizé pou kréyé roun kont pou rounòt moun san konèt mo di pas.",
+       "createaccountmail-help": "Pouvé fika itilizé pou kréyé roun kont pou rounòt moun san konèt mo di pas-a.",
        "createacct-realname": "Non réyèl (fakiltatif)",
        "createacct-reason": "Motif",
        "createacct-reason-ph": "Poukisa zòt kréyé rounòt kont",
        "blockedtext": "<strong>Zòt kont itilizatò oben zòt adrès IP bloké.</strong>\n\nBlokaj té éfèktchwé pa $1.\nRézon-an évoké sa swivant : <em>$2</em>.\n\n* Koumansman di blokaj : $8\n* Èspirasyon di blokaj : $6\n* Kont bloké : $7.\n\nZòt pé kontakté $1 oben rounòt [[{{MediaWiki:Grouppage-sysop}}|administratò]] pou an diskité.\nZòt pa pouvé itilizé fonksyon-an « {{int:emailuser}} » rounso si oun adrès di kouryé valid sa èspésifyé andan zòt [[Special:Preferences|préférans]] é rounso si sa fonksyonalité pa bloké.\nZòt adrès IP atchwèl sa $3 é zòt idantifyan di blokaj sa $5.\nSouplé, enkli tout détay-ya lasou'l annan chakin dé rékèt ki zòt ké fè.",
        "loginreqlink": "konèkté so kò",
        "newarticletext": "Zòt té ka swiv roun lyen vèr roun paj ki pa ka ègzisté òkò. \nAtò di kréyé sa paj, antré zòt tèks annan bwat ki aprè (zòt pé konsilté [$1 paj d'èd-a] pou plis enfòrmasyon).\nSi zòt pa rivé{{GENDER:|}} isi pa éròr, kliké asou bouton <strong>Routour</strong> di zòt navigatò.",
-       "anontalkpagetext": "----\n<em>Zòt asou paj di diskisyon di oun itilizatò anonim ki pa òkò kréyé di kont ou ki pa ka an itilizé</em>.\nPou sa rézon, nou divèt itilizé so adrès IP pou idantifyé li.\nOun adrès IP pé sa partajé pa plizyò itilizatò.\nSi zòt roun itiliza{{GENDER:|ò|ris}} anonim é si zòt ka kontasté ki dé koumantèr ki pa ka konsèrné zòt sa adrèsé à zòt, zòt pé [[Special:CreateAccount|kréyé roun kont]] ou [[Special:UserLogin|konèkté zòt kò]] atò di évité tout konfizyon fitir ké ròt kontribitò anonim.",
+       "anontalkpagetext": "----\n<em>Zòt asou paj di diskisyon di roun itilizatò anonim ki pa òkò kréyé di kont ou ki pa ka an itilizé</em>.\nPou sa rézon, nou divèt itilizé so adrès IP pou idantifyé li.\nOun adrès IP pé sa partajé pa plizyò itilizatò.\nSi zòt roun itiliza{{GENDER:|ò|ris}} anonim é si zòt ka kontasté ki dé koumantèr ki pa ka konsèrné zòt sa adrèsé à zòt, zòt pouvé [[Special:CreateAccount|kréyé roun kont]] oben [[Special:UserLogin|konèkté zòt kò]] atò di évité tout konfizyon fitir ké ròt kontribitò anonim.",
        "noarticletext": "I pa gen atchwèlman pyès tèks asou sa paj.\nZòt pouvé [[Special:Search/{{PAGENAME}}|lansé oun sasé asou sa tit]] annan ròt paj-ya,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sasé annan opérasyon lyé]\noben [{{fullurl:{{FULLPAGENAME}}|action=edit}} kréyé sa paj]</span>.",
        "noarticletext-nopermission": "I pa gen atchwèlman pyès tèks asou sa paj.\nZòt pouvé [[Special:Search/{{PAGENAME}}|fè roun sasé asou sa tit]] andan ròt paj-ya,\noben <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|paj={{FULLPAGENAMEE}}}} sasé annan journal asosyé]</span>, mè zòt pa gen pèrmisyon di kréyé sa paj.",
        "userpage-userdoesnotexist-view": "Kont itilizatò-a « $1 » pa anréjistré.",
        "linkstoimage-more": "Plis {{PLURAL:$1|di roun paj ka itilizé|di $1 paj ka itilizé}} sa fiché.\nLis swivant ka afiché sèlman {{PLURAL:$1|pronmyé paj-a ki ka itilizé|$1 pronmyé paj-ya ki ka itilizé}} sa fiché.\nOun [[Special:WhatLinksHere/$2|lis konplèt]] sa disponib.",
        "nolinkstoimage": "Pyès paj pa ka itilizé sa fiché.",
        "linkstoimage-redirect": "$1 (roudirèksyon di fiché) $2",
-       "sharedupload-desc-here": "Sa fiché ka provini di $1. Li pé sa itilizé pa dé ròt projè.\nSo dèskripsyon asou so [$2 paj di dèskripsyon] sa afiché anba.",
+       "sharedupload-desc-here": "Sa fiché ka provini di $1. Li pouvé fika itilizé pa ròt projè.\nSo dèskripsyon asou so [$2 paj di dèskripsyon] sa afiché anba.",
        "filepage-nofile": "Pyès fiché di sa non ka ègzisté.",
        "upload-disallowed-here": "Zòt pa pouvé ranplasé sa fiché.",
        "randompage": "Paj o azò",
        "speciallogtitlelabel": "Sib (tit ou {{ns:user}}:non di itilizatò) :",
        "log": "Journal d’opérasyon",
        "all-logs-page": "Tout journal piblik",
-       "alllogstext": "Afichaj konbiné di tout journal disponib asou {{SITENAME}}.\nZòt pé pèrsobalizé afichaj an sélèksyonan tip di journal, non di itilizatò ou paj-a konserné (sa dé dannyé sa sansib à lakas).",
+       "alllogstext": "Afichaj konbiné di tout journal disponib asou {{SITENAME}}.\nZòt pouvé pèrsonalizé afichaj an sélèksyonnan tip di journal, non di itilizatò oben paj-a ki konsèrné (sa Dé dannyé sa sansib à lakas).",
        "logempty": "Pyès opérasyon korèspondant andan journal-ya.",
        "allpages": "Tout paj-ya",
        "allarticles": "Tout paj-ya",
        "show-big-image-other": "{{PLURAL:$2|Ròt rézolisyon}} : $1.",
        "show-big-image-size": "$1 × $2 piksèl",
        "metadata": "Métadoné",
-       "metadata-help": "Sa fiché ka kontni dé enfòrmasyon siplémantèr, probabman ajouté pa aparèy foto nimèrik ou nimérizò itilizé pou kréyé. \nSi fiché té modifyé dipi so léta orijinal, serten détay pa pé rouflété antyèrman imaj modifyé-a.",
+       "metadata-help": "Sa fiché ka kontni dé enfòrmasyon siplémantèr, probabman ajouté pa aparèy foto nimèrik-a oben nimérizò-a ki itilizé pou kréyé. \nSi fiché-a té modifyé dipi so léta orijinal, sèrten détay pa pouvé rouflété antchèrman imaj-a ki modifyé.",
        "metadata-fields": "Chan di métadoné d'imaj listé andan sa mésaj ké sa enkli andan paj di dèskripsyon di imaj-a lò tab-a di métadoné ké sa rédjwit. Ròt chan ké sa kaché pa défo.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-orientation": "Oryantasyon",
        "exif-xresolution": "Rézolisyon orizontal",
index cc40528..93ad441 100644 (file)
        "resetpass-submit-loggedin": "שינוי הסיסמה",
        "resetpass-submit-cancel": "ביטול",
        "resetpass-wrong-oldpass": "הסיסמה הזמנית או הנוכחית אינה תקינה.\nייתכן שכבר שינית את סיסמתך או שכבר ביקשת סיסמה זמנית חדשה.",
-       "resetpass-recycled": "×\99ש ×\9c×\90פס ×\90ת ×\94ס×\99ס×\9e×\94 ×\9cס×\99ס×\9e×\94 ×\94ש×\95× ×\94 ×\9eס×\99×\9eסתך הנוכחית.",
+       "resetpass-recycled": "×\99ש ×\9cשנ×\95ת ×\90ת ×\94ס×\99ס×\9e×\94 ×\9cס×\99ס×\9e×\94 ×\94ש×\95× ×\94 ×\9eס×\99ס×\9eתך הנוכחית.",
        "resetpass-temp-emailed": "נכנסת באמצעות סיסמה זמנית שנשלחה {{GENDER:|אליך|אלייך}} בדוא\"ל.\nכדי לסיים את הכניסה, יש להגדיר כאן סיסמה חדשה:",
        "resetpass-temp-password": "סיסמה זמנית:",
        "resetpass-abort-generic": "שינוי הסיסמה בוטל על־ידי הרחבה.",
        "resetpass-expired": "סיסמתך פקעה. נא להגדיר סיסמה חדשה כדי להיכנס.",
-       "resetpass-expired-soft": "×\94ס×\99ס×\9e×\94 ×©×\9c×\9a ×¤×§×¢×\94, ×\95צר×\99×\9a ×\9c×\90פס ×\90×\95ת×\94. ×\99ש ×\9c×\91×\97×\95ר ×¡×\99ס×\9e×\94 ×\97×\93ש×\94 ×\9bעת, ×\90×\95 ×\9c×\9c×\97×\95×¥ ×¢×\9c \"{{int:authprovider-resetpass-skip-label}}\" ×\9b×\93×\99 ×\9c×\90פס אותה מאוחר יותר.",
-       "resetpass-validity-soft": "×\94ס×\99ס×\9e×\94 ×©×\9c×\9a ×\90×\99× ×\94 ×ª×§×\99× ×\94: $1\n\n×\99ש ×\9c×\91×\97×\95ר ×¡×\99ס×\9e×\94 ×\97×\93ש×\94 ×\9bעת ×\90×\95 ×\9c×\9c×\97×\95×¥ ×¢×\9c \"{{int:authprovider-resetpass-skip-label}}\" ×\9b×\93×\99 ×\9c×\90פס את הסיסמה מאוחר יותר.",
+       "resetpass-expired-soft": "×\94ס×\99ס×\9e×\94 ×©×\9c×\9a ×¤×§×¢×\94, ×\95צר×\99×\9a ×\9cשנ×\95ת ×\90×\95ת×\94. ×\99ש ×\9c×\91×\97×\95ר ×¡×\99ס×\9e×\94 ×\97×\93ש×\94 ×\9bעת, ×\90×\95 ×\9c×\9c×\97×\95×¥ ×¢×\9c \"{{int:authprovider-resetpass-skip-label}}\" ×\9b×\93×\99 ×\9cשנ×\95ת אותה מאוחר יותר.",
+       "resetpass-validity-soft": "×\94ס×\99ס×\9e×\94 ×©×\9c×\9a ×\90×\99× ×\94 ×ª×§×\99× ×\94: $1\n\n×\99ש ×\9c×\91×\97×\95ר ×¡×\99ס×\9e×\94 ×\97×\93ש×\94 ×\9bעת ×\90×\95 ×\9c×\9c×\97×\95×¥ ×¢×\9c \"{{int:authprovider-resetpass-skip-label}}\" ×\9b×\93×\99 ×\9cשנ×\95ת את הסיסמה מאוחר יותר.",
        "passwordreset": "איפוס סיסמה",
        "passwordreset-text-one": "יש למלא טופס זה כדי לקבל סיסמה זמנית בדוא\"ל.",
        "passwordreset-text-many": "{{PLURAL:$1||יש למלא אחד מהשדות הבאים כדי לקבל סיסמה זמנית בדוא\"ל.}}",
        "rcfilters-other-review-tools": "כלי סקירה אחרים",
        "rcfilters-group-results-by-page": "חלוקה התוצאות לקבוצות לפי דף",
        "rcfilters-activefilters": "מסננים פעילים",
+       "rcfilters-activefilters-hide": "הסתרה",
+       "rcfilters-activefilters-show": "הצגה",
        "rcfilters-advancedfilters": "מסננים מתקדמים",
        "rcfilters-limit-title": "כמה תוצאות להראות",
        "rcfilters-limit-and-date-label": "{{PLURAL:$1|שינוי אחד|$1 שינויים}}, $2",
        "rcfilters-savedqueries-rename": "שינוי שם",
        "rcfilters-savedqueries-setdefault": "הגדרה כברירת מחדל",
        "rcfilters-savedqueries-unsetdefault": "ביטול הגדרה כברירת מחדל",
-       "rcfilters-savedqueries-remove": "×\94סרה",
+       "rcfilters-savedqueries-remove": "×\9e×\97×\99קה",
        "rcfilters-savedqueries-new-name-label": "שם",
        "rcfilters-savedqueries-new-name-placeholder": "תיאור מטרת המסנן",
        "rcfilters-savedqueries-apply-label": "יצירת המסנן",
        "rcfilters-empty-filter": "אין מסננים פעילים. כל התרומות מוצגות.",
        "rcfilters-filterlist-title": "מסננים",
        "rcfilters-filterlist-whatsthis": "איך הם עובדים?",
-       "rcfilters-filterlist-feedbacklink": "באפשרותך לספר לנו מה דעתך על כלי הסינון (החדשים) האלה",
+       "rcfilters-filterlist-feedbacklink": "באפשרותך לספר לנו מה דעתך על כלי הסינון האלה",
        "rcfilters-highlightbutton-title": "הבלטת התוצאות",
        "rcfilters-highlightmenu-title": "בחירת צבע",
        "rcfilters-highlightmenu-help": "בחירת צבע להבלטת מאפיין זה",
        "markedaspatrolled": "השינוי סומן כבדוק",
        "markedaspatrolledtext": "הגרסה שבחרת בדף [[:$1]] סומנה כבדוקה.",
        "rcpatroldisabled": "אפשרות סימון השינויים כבדוקים מבוטלת",
-       "rcpatroldisabledtext": "ת×\9b×\95נת ×¡×\99×\9e×\95×\9f ×©×\99× ×\95×\99×\99×\9d ×\9b×\91×\93×\95ק×\99×\9d ×\91×\93×£ ×\94ש×\99× ×\95×\99×\99×\9d ×\94×\90×\97ר×\95× ×\99×\9d ×\91×\95×\98×\9c×\94.",
+       "rcpatroldisabledtext": "ת×\9b×\95נת ×¡×\99×\9e×\95×\9f ×\94ש×\99× ×\95×\99×\99×\9d ×\9b×\91×\93×\95ק×\99×\9d ×\91×\93×£ ×\94ש×\99× ×\95×\99×\99×\9d ×\94×\90×\97ר×\95× ×\99×\9d ×\9e×\91×\95×\98×\9cת ×\9bר×\92×¢.",
        "markedaspatrollederror": "לא ניתן לסמן כבדוק",
        "markedaspatrollederrortext": "יש לציין גרסה שברצונך לסמן כבדוקה.",
-       "markedaspatrollederror-noautopatrol": "×\90×\99× ×\9a ×\9e×\95רש×\94 לסמן שינויים של עצמך כבדוקים.",
+       "markedaspatrollederror-noautopatrol": "×\90×\99×\9f ×\91×\90פשר×\95ת×\9a לסמן שינויים של עצמך כבדוקים.",
        "markedaspatrollednotify": "שינוי זה בדף \"$1\" סומן כבדוק.",
        "markedaspatrollederrornotify": "סימון השינוי כבדוק נכשל.",
        "patrol-log-page": "יומן שינויים בדוקים",
        "file-info-png-looped": "בלולאה",
        "file-info-png-repeat": "מוצג {{PLURAL:$1|פעם אחת|פעמיים|$1 פעמים}}",
        "file-info-png-frames": "{{PLURAL:$1|תמונה אחת|$1 תמונות}}",
-       "file-no-thumb-animation": "'''לתשומת לבך: בשל מגבלות טכניות, תמונות ממוזערות של הקובץ הזה לא תהיינה מונפשות.'''",
-       "file-no-thumb-animation-gif": "'''לתשומת לבך: בשל מגבלות טכניות, תמונות ממוזערות של תמונות GIF בעלות רזולוציה גבוהה כמו זאת לא תהיינה מונפשות.'''",
+       "file-no-thumb-animation": "<strong>לתשומת לבך: בשל מגבלות טכניות, תמונות ממוזערות של הקובץ הזה לא תהיינה מונפשות.</strong>",
+       "file-no-thumb-animation-gif": "<strong>לתשומת לבך: בשל מגבלות טכניות, תמונות ממוזערות של תמונות GIF בעלות רזולוציה גבוהה כמו זאת לא תהיינה מונפשות.</strong>",
        "newimages": "גלריית קבצים חדשים",
        "imagelisttext": "להלן רשימה של {{PLURAL:$1|קובץ אחד|$1 קבצים}}, ממוינים $2:",
        "newimages-summary": "דף מיוחד זה מציג את הקבצים האחרונים שהועלו.",
-       "newimages-legend": "×\9eסנן",
+       "newimages-legend": "ס×\99× ×\95ן",
        "newimages-label": "שם הקובץ (או חלק ממנו):",
        "newimages-user": "כתובת IP או שם משתמש",
        "newimages-newbies": "הצגת תרומות של משתמשים חדשים בלבד",
        "bydate": "לפי תאריך",
        "sp-newimages-showfrom": "הצגת קבצים חדשים החל מ־$2, $1",
        "seconds-abbrev": "{{PLURAL:$1|שנייה|$1 שניות}}",
-       "minutes-abbrev": "{{PLURAL:$1|דקה|$1 דק'}}",
+       "minutes-abbrev": "{{PLURAL:$1|דקה|$1 דקות}}",
        "hours-abbrev": "{{PLURAL:$1|שעה|שעתיים|$1 שעות}}",
        "days-abbrev": "{{PLURAL:$1|יום|יומיים|$1 ימים}}",
        "seconds": "{{PLURAL:$1|שנייה|$1 שניות}}",
index 97b169e..0279925 100644 (file)
        "rcfilters-savedqueries-rename": "Átnevezés",
        "rcfilters-savedqueries-setdefault": "Beállítás alapértelmezettként",
        "rcfilters-savedqueries-unsetdefault": "Eltávolítás, mint alapértelmezés",
-       "rcfilters-savedqueries-remove": "Eltávolítás",
+       "rcfilters-savedqueries-remove": "Törlés",
        "rcfilters-savedqueries-new-name-label": "Név",
        "rcfilters-savedqueries-new-name-placeholder": "Írd le a szűrő célját.",
        "rcfilters-savedqueries-apply-label": "Gyors hivatkozás létrehozása",
        "rcfilters-empty-filter": "Nincs aktív szűrő. Minden közreműködés látható.",
        "rcfilters-filterlist-title": "Szűrők",
        "rcfilters-filterlist-whatsthis": "Hogy működnek?",
-       "rcfilters-filterlist-feedbacklink": "Mond el nekünk, mit gondolsz az (új) szűrőkről",
+       "rcfilters-filterlist-feedbacklink": "Mond el nekünk, mit gondolsz ezekről a szűrőkről",
        "rcfilters-highlightbutton-title": "Kiemelt találatok",
        "rcfilters-highlightmenu-title": "Válassz egy színt",
        "rcfilters-highlightmenu-help": "Válassz színt ennek a tulajdonságnak kijelöléséhez",
index cd15ef6..eb19921 100644 (file)
        "enotif_reset": "Белгалъе еррига оагӀонаш бӀаргтехача санна",
        "enotif_impersonal_salutation": "{{grammar:genitive|{{SITENAME}}}} – доакъашхо",
        "deletepage": "ДIаяккха оагIув",
+       "excontent": "чудар: «$1»",
+       "excontentauthor": "чухьнахьадар: «$1», цу оагIон цаI марка воаца автор ва [[Special:Contributions/$2|$2]] ([[User talk:$2|дувцара оагIув]])",
        "delete-confirm": "$1 — дӀаяккхар",
        "delete-legend": "ДӀаяккхар",
        "confirmdeletetext": "Оаш дIадийхад бIарчча дIадаккхар оагIон а (е сурта), цун деррига хувцара истори а. '''Дехар да''', бакъде шоай из бокъонца де безам болаш долга а, из дича хургдар кхеташ долга а, из дар укх [[{{MediaWiki:Policy-url}}|бокъонашца]] долга.",
        "restriction-move": "ЦIи хувцаp",
        "restriction-create": "Хьакхоллар",
        "restriction-upload": "Доттар",
+       "undeletepage": "ДӀаяьхача оагӀонашка хьажар а уж меттаоттаяр а",
        "undeletelink": "бIаргтоха/юхадаккха",
        "undeleteviewlink": "хьажа",
+       "undeletedpage": "'''Меттаоттаяьй оагӀув «$1».'''\n\nТIехьарча хана дӀаяьха а юхаметтаоттаяь а хиннача оагIонашка хьажара духьа хьадела [[Special:Log/delete|тептар]].",
        "undelete-search-submit": "Хьалáха",
        "namespace": "ЦIерий моттигаш:",
        "invert": "Хержар юхадаккха",
        "movelogpage": "ЦӀераш хувцара тептар",
        "movereason": "Бахьан:",
        "revertmove": "юха",
+       "delete_and_move_reason": "ДӀаяьккхай укх оагIон «[[$1]]» цӀи хувцара духьа",
        "export": "Оагӏоний экспорт",
        "allmessagesname": "Хоам",
        "allmessagesdefault": "Массаза йола текст",
index 9227202..ba7817e 100644 (file)
        "resetpass-submit-loggedin": "Cambia password",
        "resetpass-submit-cancel": "Annulla",
        "resetpass-wrong-oldpass": "Password temporanea o attuale non valida.\nLa password potrebbe essere stata già modificata, oppure potrebbe essere stata richiesta una nuova password temporanea.",
-       "resetpass-recycled": "Si prega di reimpostare con una password diversa dalla password attuale.",
+       "resetpass-recycled": "Si prega di modificare la tua password con una diversa da quella attuale.",
        "resetpass-temp-emailed": "L'accesso è stato effettuato con un codice temporaneo, inviato via email. Per completare la registrazione, è necessario impostare una nuova password qui:",
        "resetpass-temp-password": "Password temporanea:",
        "resetpass-abort-generic": "La modifica della password è stata interrotta da un'estensione.",
        "resetpass-expired": "La password è scaduta. Si prega di impostare una nuova password per effettuare l'accesso.",
-       "resetpass-expired-soft": "La tua password è scaduta e deve essere reimpostata. Si prega di scegliere una nuova password o fare clic su \"{{int:authprovider-resetpass-skip-label}}\" per reimpostarla successivamente.",
-       "resetpass-validity-soft": "La tua password non è valida: $1\n\nSi prega di scegliere una nuova password o fare clic su \"{{int:authprovider-resetpass-skip-label}}\" per reimpostarla successivamente.",
+       "resetpass-expired-soft": "La tua password è scaduta e deve essere modificata. Si prega di scegliere una nuova password o fare clic su \"{{int:authprovider-resetpass-skip-label}}\" per modificarla successivamente.",
+       "resetpass-validity-soft": "La tua password non è valida: $1\n\nSi prega di scegliere una nuova password o fare clic su \"{{int:authprovider-resetpass-skip-label}}\" per modificarla successivamente.",
        "passwordreset": "Reimposta password",
        "passwordreset-text-one": "Compila questo modulo per reimpostare la tua password.",
        "passwordreset-text-many": "{{PLURAL:$1|Compila uno dei campi per ricevere una password temporanea tramite email.}}",
        "rcfilters-savedqueries-rename": "Rinomina",
        "rcfilters-savedqueries-setdefault": "Imposta come predefinito",
        "rcfilters-savedqueries-unsetdefault": "Rimuovi come predefinito",
-       "rcfilters-savedqueries-remove": "Rimuovi",
+       "rcfilters-savedqueries-remove": "Cancella",
        "rcfilters-savedqueries-new-name-label": "Nome",
        "rcfilters-savedqueries-new-name-placeholder": "Descrivi lo scopo del filtro",
        "rcfilters-savedqueries-apply-label": "Crea filtro",
        "rcfilters-empty-filter": "Nessun filtro attivo. Sono mostrati tutti i contributi.",
        "rcfilters-filterlist-title": "Filtri",
        "rcfilters-filterlist-whatsthis": "Come funzionano?",
-       "rcfilters-filterlist-feedbacklink": "Dicci cosa ne pensi su questi (nuovi) strumenti di filtraggio",
+       "rcfilters-filterlist-feedbacklink": "Dicci cosa ne pensi su questi strumenti di filtraggio",
        "rcfilters-highlightbutton-title": "Evidenzia risultati",
        "rcfilters-highlightmenu-title": "Seleziona un colore",
        "rcfilters-highlightmenu-help": "Seleziona un colore per evidenziare questa proprietà",
index dfb44c5..49e810c 100644 (file)
        "resetpass-submit-loggedin": "비밀번호 바꾸기",
        "resetpass-submit-cancel": "취소",
        "resetpass-wrong-oldpass": "비밀번호가 잘못되었거나 현재의 비밀번호와 같습니다.\n이미 비밀번호를 바꾸었거나 새 임시 비밀번호를 요청했을 수 있습니다.",
-       "resetpass-recycled": "현재 비밀번호와 다른 비밀번호로 재설정해주세요.",
+       "resetpass-recycled": "현재 비밀번호와 다른 비밀번호로 변경해주세요.",
        "resetpass-temp-emailed": "임시 이메일 코드로 로그인되어 있습니다.\n로그인을 마치려면, 여기서 새 비밀번호를 설정해야 합니다:",
        "resetpass-temp-password": "임시 비밀번호:",
        "resetpass-abort-generic": "비밀번호 바꾸기가 확장 기능에 의해 중단되었습니다.",
        "resetpass-expired": "비밀번호가 만료되었습니다. 로그인하려면 새 비밀번호를 설정해야 합니다.",
-       "resetpass-expired-soft": "비밀번호가 만료되어 재설정해야 합니다. 지금 새로운 비밀번호를 선택하거나, \"{{int:authprovider-resetpass-skip-label}}\"를 클릭하고 나중에 재설정해주세요.",
-       "resetpass-validity-soft": "귀하의 비밀번호는 유효하지 않습니다: $1\n\n새로운 비밀번호를 지금 설정하거나, \"{{int:authprovider-resetpass-skip-label}}\"을 눌러 나중에 재설정하세요.",
+       "resetpass-expired-soft": "비밀번호가 만료되어 변경해야 합니다. 지금 새로운 비밀번호를 선택하거나, \"{{int:authprovider-resetpass-skip-label}}\"를 클릭하고 나중에 재설정해주세요.",
+       "resetpass-validity-soft": "귀하의 비밀번호는 유효하지 않습니다: $1\n\n새로운 비밀번호를 지금 설정하거나, \"{{int:authprovider-resetpass-skip-label}}\"을 눌러 나중에 변경하세요.",
        "passwordreset": "비밀번호 재설정",
        "passwordreset-text-one": "이메일을 통해 임시 비밀번호를 받으려면 이 양식을 채우세요.",
        "passwordreset-text-many": "{{PLURAL:$1|이메일을 통해 임시 비밀번호를 받으려면 필드 중 하나를 채우세요.}}",
        "rcfilters-other-review-tools": "다른 검토 도구",
        "rcfilters-group-results-by-page": "문서별로 묶음",
        "rcfilters-activefilters": "사용 중인 필터",
+       "rcfilters-activefilters-hide": "숨기기",
+       "rcfilters-activefilters-show": "보이기",
        "rcfilters-advancedfilters": "고급 필터",
        "rcfilters-limit-title": "표시할 결과 수",
        "rcfilters-limit-and-date-label": "{{PLURAL:$1|변경사항}} $1개, $2",
        "rcfilters-savedqueries-rename": "이름 바꾸기",
        "rcfilters-savedqueries-setdefault": "기본값으로 설정",
        "rcfilters-savedqueries-unsetdefault": "기본값으로 제거",
-       "rcfilters-savedqueries-remove": "ì \9cê±°",
+       "rcfilters-savedqueries-remove": "ì\82­ì \9c",
        "rcfilters-savedqueries-new-name-label": "이름",
        "rcfilters-savedqueries-new-name-placeholder": "필터의 목적을 설명하세요",
        "rcfilters-savedqueries-apply-label": "필터 만들기",
        "rcfilters-empty-filter": "활성화된 필터가 없습니다. 모든 기여가 표시됩니다.",
        "rcfilters-filterlist-title": "필터",
        "rcfilters-filterlist-whatsthis": "이것들이 어떻게 동작합니까?",
-       "rcfilters-filterlist-feedbacklink": "이 (새로운) 필터 도구에 대한 의견을 주세요",
+       "rcfilters-filterlist-feedbacklink": "이 필터 도구에 대한 의견을 주세요",
        "rcfilters-highlightbutton-title": "결과 강조",
        "rcfilters-highlightmenu-title": "색 선택",
        "rcfilters-highlightmenu-help": "이 속성을 강조할 색을 선택하십시오",
index 1438232..d194391 100644 (file)
@@ -21,7 +21,8 @@
                        "Matma Rex",
                        "Stryn",
                        "Cûndûllah el-Kurdî",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Kur"
                ]
        },
        "tog-underline": "Xetekê di bin girêdanê de çêke:",
        "resetpass_forbidden": "Şîfre nikarin werin guhertin",
        "resetpass-submit-loggedin": "Şîfreyê biguherîne",
        "resetpass-submit-cancel": "Betal bike",
+       "resetpass-recycled": "Ji kerema xwe şîfreya xwe ya mewcûd biguherîne şîfreyeke din.",
        "resetpass-temp-password": "Şîfreya demkî:",
        "resetpass-expired": "Wextê şîfreya te derbas bû. Ji kerema xwe re\nji bo têketinê şîfreyek nû çêke.",
-       "resetpass-expired-soft": "Wextê şîfreya te derbas bû û hewceye ko be guhertin. Ji kerema xwe re şîfreyek nû çêke an jî ji bo paşî çêkî li \"{{int:authprovider-resetpass-skip-label}}\" bitikîne.",
-       "resetpass-validity-soft": "Şîfreya te derbasdar nîne: $1\n\nJi kerema xwe re şîfreyek nû çêke an jî ji bo paşî çêkî li \"{{int:authprovider-resetpass-skip-label}}\" bitikîne.",
+       "resetpass-expired-soft": "Mideta şîfreya te xelas bûye û divê bê guhertin. Ji kerema xwe re şîfreyeke nû çêbike an jî ji bo ku paşiyê biguherîne li \"{{int:authprovider-resetpass-skip-label}}\" bitikîne.",
+       "resetpass-validity-soft": "Şîfreya te ne derbasdar e: $1\n\nJi kerema xwe re şîfreyek nû çêke an jî ji bo paşiyê biguherîne li \"{{int:authprovider-resetpass-skip-label}}\" bitikîne.",
        "passwordreset": "Şîfreyê nû bike",
        "passwordreset-text-one": "Ji bo ji nû ve sazkirina şîfreyê vê formê dagire.",
        "passwordreset-username": "Navê bikarhêner:",
        "recentchanges-submit": "Nîşan bide",
        "rcfilters-legend-heading": "<strong>Lîsteya kurtenavan:</strong>",
        "rcfilters-activefilters": "Parzûnên çalak",
+       "rcfilters-activefilters-hide": "Veşêre",
+       "rcfilters-activefilters-show": "Nîşan bide",
        "rcfilters-days-show-days": "{{PLURAL:$1|rojek|$1 roj}}",
        "rcfilters-days-show-hours": "{{PLURAL:$1|saetek|$1 saet}}",
        "rcfilters-quickfilters": "Parzûnên tomarkirî",
        "rcfilters-savedqueries-new-name-label": "Nav",
        "rcfilters-savedqueries-cancel-label": "Betal bike",
        "rcfilters-filterlist-title": "Parzûn",
+       "rcfilters-filterlist-feedbacklink": "Ji me re biêje ka tu li ser van alavên fîltrekirinê çi difikirî.",
        "rcfilters-filter-editsbyself-label": "Guhêrandinên ji aliyê te",
        "rcfilters-filter-editsbyother-label": "Guherandinên ji aliyên kesên din",
        "rcfilters-filter-bots-label": "Bot",
        "whatlinkshere-title": "Rûpelên ku yê berve \"$1\" tên",
        "whatlinkshere-page": "Rûpel:",
        "linkshere": "Ev rûpel tên ser vê rûpelê '''$2''':",
-       "nolinkshere": "Ne ji rûpelekê lînk tên ser '''$2'''.",
+       "nolinkshere": "Girêdan bo <strong>$2</strong> nehat dîtin.",
        "nolinkshere-ns": "Ne lînkek berve '''$2''' di vê namespace'a da tê.",
        "isredirect": "rûpelê beralî bike",
        "istemplate": "tê bikaranîn",
index cb6a15f..4ec03ed 100644 (file)
        "showpreview": "Ингкъарав",
        "showdiff": "Тюзлевлени гёрсетмек",
        "anoneditwarning": "<strong>Тергев:</strong> Сен гириш этмединг. Тюзлевлер этсенг сени IP адресинг публикли гёрюнер. Эгер <strong>[$1 гириш]</strong> яда <strong>[$2 къайыт]</strong> этсенг, тюзлевлеринг сени ортакъчы аты булан гьисап этилер, оьзге пайдалардан да къайры.",
-       "blockedtext": "Сени ÐºÑ\8aоллавÑ\87Ñ\83 Ð°Ñ\82Ñ\8bнг Ñ\8fда IP Ð°Ð´Ñ\80еÑ\81инг ÐºÑ\8aамалгÑ\8aан Ñ\8dди.''\n\nÐ\9aÑ\8aамав Ñ\8dÑ\82ген $1 ($2).\nСебеп Ð±ÐµÑ\80илген: ''$3'.\n\n* Ð\9aÑ\8aамав Ð±Ð°Ñ\88ладÑ\8b: $4\n* Ð\9aÑ\8aамав Ð±Ð¸Ñ\82е: $5\n* Ð\9aÑ\8aамавнÑ\83 Ð¼Ñ\83Ñ\80адÑ\8b: $7\n\n$1 Ð±Ñ\83лан Ñ\8fда ÐºÑ\8aайÑ\81Ñ\8b Ð¾Ñ\8cзге [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80]] Ð±Ñ\83лан ÐºÑ\8aаÑ\82нап ÐºÑ\8aамавнÑ\83 Ð³Ñ\8cакÑ\8aÑ\8bнда Ñ\81Ñ\91йлеÑ\88меге Ð±Ð¾Ð»Ð°Ñ\81ан.\nТеÑ\80геп ÐºÑ\8aой, Ñ\81ени [[Special:Preferences|Ñ\8dнÑ\87или ÐºÑ\8eйлемлеÑ\80ингде]] e-mail Ð°Ð´Ñ\80еÑ\81инг Ñ\82Ñ\8eз Ð±ÐµÑ\80мединг Ð±Ñ\83Ñ\81а Ñ\8fда Ð³ÐµÑ\80Ñ\82и Ñ\8dÑ\82мединг Ð±Ñ\83Ñ\81а, Ñ\8fда ÐºÑ\8aамав Ñ\88аÑ\80Ñ\82лагÑ\8aа Ð¼Ð°ÐºÑ\82Ñ\83п Ñ\8fзÑ\8bвÑ\83нÑ\83 ÐºÑ\8aадагÑ\8aа Ð³Ð¸Ñ\80е Ð±Ñ\83Ñ\81а, \"кÑ\8aоллавÑ\87Ñ\83гÑ\8aа Ð¼Ð°ÐºÑ\82Ñ\83п\" Ñ\84Ñ\83нкÑ\86иÑ\8fнÑ\8b ÐºÑ\8aоллап Ð±Ð¾Ð»Ð¼Ð°Ñ\81Ñ\81ан.\nСени IP Ð°Ð´Ñ\80еÑ\81инг â\80\94 $3, ÐºÑ\8aамавнÑ\83 Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80Ñ\83 â\80\94 $5. Ð¢Ð¸Ð»ÐµÐ², Ð±Ñ\83 Ð¼Ð°Ñ\8aлÑ\8eмаÑ\82ланÑ\8b Ð±Ð°Ñ\80Ñ\8b Ñ\82алаплаÑ\80Ñ\8bнга Ð³Ð¸Ð¹Ð¸Ñ\80.",
+       "blockedtext": "Къамав этген $1 ($2).\nСебеп берилген: ''$3'.\n\n* Къамав башлады: $4\n* Къамав бите: $5\n* Къамавну мурады: $7\n\n$1 булан яда къайсы оьзге [[{{MediaWiki:Grouppage-sysop}}|администратор]] булан къатнап къамавну гьакъында сёйлешмеге боласан.\nТергеп къой, сени [[Special:Preferences|энчили кюйлемлерингде]] e-mail адресинг тюз бермединг буса яда герти этмединг буса, яда къамав шартлагъа мактуп язывуну къадагъа гире буса, \"къоллавчугъа мактуп\" функцияны къоллап болмассан.\nСени IP адресинг — $3, къамавну идентификатору — $5. Тилев, бу маълюматланы бары талапларынга гийир.",
        "loginreqlink": "гирмек",
        "newarticle": "(Янгы)",
        "newarticletext": "Сен гьалиде яратылмагъан сагьифагъа гёчдинг.\nБу сагьифаны яратмакъ учун, тюбюндеги къутугъунда язып башлагъыз (артыкъ маълюмат учун [$1 кёмек сагьифагъа] къара).\nЯнгылыш этип бери гёчген бусанг, сени браузеринг <strong>артгъа</strong> тюймесине бас.",
        "recentchangeslinked-feed": "Байлавлу тюзлевлер",
        "recentchangeslinked-toolbox": "Байлавлу тюзлевлер",
        "recentchangeslinked-title": "\"$1\" сагьифагъа байлавлу тюзлевлер",
-       "recentchangeslinked-summary": "Ð\91Ñ\83 Ñ\81агÑ\8cиÑ\84агÑ\8aа Ð±Ð°Ð¹Ð»Ð°Ð²Ð»Ñ\83 Ñ\82Ñ\8eзлевлеÑ\80и Ð±Ñ\83лан Ñ\81агÑ\8cиÑ\84аланÑ\8b, Ñ\8fда Ð¾ Ñ\81агÑ\8cиÑ\84адан Ð±Ð°Ð¹Ð»Ð°Ð²Ð»Ñ\83ланÑ\8b Ð³Ñ\91Ñ\80мек Ñ\83Ñ\87Ñ\83н атын яз. (Категорияны ортакъчаларын гёрмек учун Category:Категорияны атын яз). Сени [[Special:Watchlist|Гьызарлав тизменгдеги]] алышынывлар <strong>къалын</strong> гьарплылар.",
+       "recentchangeslinked-summary": "СагÑ\8cиÑ\84агÑ\8aа Ñ\8fда Ñ\81агÑ\8cиÑ\84адан Ð±Ð°Ð¹Ð»Ð°Ð²Ð»Ñ\83 Ñ\81агÑ\8cиÑ\84алаÑ\80да Ñ\82Ñ\8eзлевлеÑ\80ин Ð³Ñ\91Ñ\80мек Ñ\83Ñ\87Ñ\83н Ð¾Ð½Ñ\83 атын яз. (Категорияны ортакъчаларын гёрмек учун Category:Категорияны атын яз). Сени [[Special:Watchlist|Гьызарлав тизменгдеги]] алышынывлар <strong>къалын</strong> гьарплылар.",
        "recentchangeslinked-page": "Сагьифаны аты:",
        "recentchangeslinked-to": "Къайта, бу сагьифагъа байлавлу сагьифаланы алышынывларын гёрсетмек",
        "upload": "Сапламны юклемек",
        "sp-contributions-toponly": "Янгыз ахырынчы тюрню тюзлевлерин гёрсетмек",
        "sp-contributions-newonly": "Янгыз сагьифа яратыв деген тюзлевлени гёрсетмек",
        "sp-contributions-submit": "Излев",
-       "whatlinkshere": "Ð\9cÑ\83нда байланылгъан",
+       "whatlinkshere": "Ð\91еÑ\80и байланылгъан",
        "whatlinkshere-title": "\"$1\" бетге байлангъан сагьифалар",
        "whatlinkshere-page": "Сагьифа:",
        "linkshere": "Гелеген сагьифалар бугъар байлавлу <strong>$2</strong>:",
index 089614a..74001ee 100644 (file)
        "resetpass-temp-password": "Temporäert Passwuert:",
        "resetpass-abort-generic": "D'Ännere vum Passwuert gouf duerch eng Erweiderung ofgebrach.",
        "resetpass-expired": "Äert Passwuert ass ofgelaf. Gitt w.e.g. en neit Passwuert u fir Iech anzeloggen.",
-       "resetpass-expired-soft": "Äert Passwuert ass ofgelaf a muss zeréckgesat. Sicht w.e.g. elo en neit Passwuert eraus oder klickt  \"{{int:authprovider-resetpass-skip-label}}\" fir et spéider zeréckzesetzen.",
-       "resetpass-validity-soft": "Ärt Passwuert ass net valabel: $1",
+       "resetpass-expired-soft": "Äert Passwuert ass ofgelaf a muss geännert ginn. Sicht w.e.g. elo en neit Passwuert eraus oder klickt  \"{{int:authprovider-resetpass-skip-label}}\" fir et spéider z'änneren.",
+       "resetpass-validity-soft": "Äert Passwuert ass net valabel: $1\n\nWielt elo en neit Passwuert oder klickt op \"{{int:authprovider-resetpass-skip-label}}\" fir et méi spéit z'änneren.",
        "passwordreset": "Passwuert zrécksetzen",
        "passwordreset-text-one": "Fëllt dëse Formulaire aus fir Äert Passwuert zréckzesetzen.",
        "passwordreset-text-many": "{{PLURAL:$1|Fëllt eent vun de Felder aus fir en temporäert Passwuert per E-Mail ze kréien.}}",
        "rcfilters-other-review-tools": "Aner Méiglechkeete fir z'iwwerliesen",
        "rcfilters-group-results-by-page": "Resultater no de Säite gruppéieren",
        "rcfilters-activefilters": "Aktiv Filteren",
+       "rcfilters-activefilters-hide": "Verstoppen",
+       "rcfilters-activefilters-show": "Weisen",
        "rcfilters-advancedfilters": "Erweidert Filteren",
        "rcfilters-limit-title": "Resultater fir ze weisen",
        "rcfilters-limit-and-date-label": "{{PLURAL:$1|Eng Ännerung|$1 Ännerungen}}, $2",
        "rcfilters-savedqueries-rename": "Ëmbenennen",
        "rcfilters-savedqueries-setdefault": "Als Standard festleeën",
        "rcfilters-savedqueries-unsetdefault": "Als Standard ewechhuelen",
-       "rcfilters-savedqueries-remove": "Ewechhuelen",
+       "rcfilters-savedqueries-remove": "Läschen",
        "rcfilters-savedqueries-new-name-label": "Numm",
        "rcfilters-savedqueries-new-name-placeholder": "Den Zweck vum Filter beschreiwen",
        "rcfilters-savedqueries-apply-label": "Filter uleeën",
        "rcfilters-empty-filter": "Keen aktive Filter. All Kontributioune gi gewisen.",
        "rcfilters-filterlist-title": "Filteren",
        "rcfilters-filterlist-whatsthis": "Wéi geet dat?",
-       "rcfilters-filterlist-feedbacklink": "Sot eis wat Dir vun dësen (neien) Filterméiglechkeeten haalt",
+       "rcfilters-filterlist-feedbacklink": "Sot eis wat Dir vun dësen Filterméiglechkeeten haalt",
        "rcfilters-highlightbutton-title": "Resultater ervirhiewen",
        "rcfilters-highlightmenu-title": "Eng Faarf eraussichen",
        "rcfilters-highlightmenu-help": "Sicht eng Faarf eraus fir dës Eegenschaft ervirzehiewen.",
index cbd0118..5b2b669 100644 (file)
        "subject-preview": "Temos peržiūra:",
        "previewerrortext": "Įvyko klaida bandant peržiūrėti jūsų pakeitimus.",
        "blockedtitle": "Naudotojas yra užblokuotas",
-       "blockedtext": "'''Jūsų naudotojo vardas arba IP adresas yra užblokuotas.'''\n\nUžblokavo $1. Nurodyta priežastis yra ''$2''.\n\n* Blokavimo pradžia: $8\n* Blokavimo pabaiga: $6\n* Užblokuotasis: $7\n\nJūs galite susisiekti su $1 arba kuriuo nors kitu [[{{MediaWiki:Grouppage-sysop}}|administratoriumi]] ir aptarti neaiškumus dėl blokavimo.\nAtkreipkite dėmesį, kad negalėsite naudotis funkcija „Rašyti laišką šiam naudotojui“, jei nesate užsiregistravę ir pateikę galiojančio el. pašto adreso naudotojo paskyros [[Special:Preferences|nustatymuose]], arba, jei jums užblokuotas šios funkcijos naudojimas.\nJūsų IP adresas yra $3, o blokavimo ID yra #$5.\nPrašome nurodyti vieną iš jų ar abu, kai kreipiatės dėl blokavimo.",
+       "blockedtext": "'''Jūsų naudotojo vardas arba IP adresas yra užblokuotas.'''\n\nUžblokavo $1. Nurodyta priežastis yra ''$2''.\n\n* Blokavimo pradžia: $8\n* Blokavimo pabaiga: $6\n* Užblokuotasis: $7\n\nJūs galite susisiekti su $1 arba kuriuo nors kitu [[{{MediaWiki:Grouppage-sysop}}|administratoriumi]] ir aptarti neaiškumus dėl blokavimo.\nAtkreipkite dėmesį, kad negalėsite naudotis funkcija „{{int:emailuser}}“, jei nesate užsiregistravę ir pateikę galiojančio el. pašto adreso naudotojo paskyros [[Special:Preferences|nustatymuose]], arba, jei jums užblokuotas šios funkcijos naudojimas.\nJūsų IP adresas yra $3, o blokavimo ID yra #$5.\nPrašome nurodyti vieną iš jų ar abu, kai kreipiatės dėl blokavimo.",
        "autoblockedtext": "Jūsų IP adresas buvo automatiškai užblokuotas, nes jį naudojo kitas naudotojas, kurį užblokavo $1.\nNurodyta priežastis yra ši:\n\n:''$2''\n\n* Blokavimo pradžia: $8\n* Blokavimo pabaiga: $6\n* Numatomas blokavimo laikas: $7\n\nJūs galite susisiekti su $1 arba kitu [[{{MediaWiki:Grouppage-sysop}}|administratoriumi]], kad aptartumėte neaiškumus dėl blokavimo.\n\nJūs negalite naudotis funkcija „Rašyti laišką šiam naudotojui“, jei nesate nurodę tikro el. pašto adreso savo [[Special:Preferences|naudotojo nustatymuose]]. Taip pat Jūs negalite naudotis šia funkcija, jei Jums užblokuotas jos naudojimas.\n\nJūsų IP adresas yra $3, blokavimo ID yra $5.\nPrašome nurodyti šiuos duomenis visais atvejais, kai kreipiatės dėl blokavimo.",
        "blockednoreason": "priežastis nenurodyta",
        "whitelistedittext": "Jūs turite $1, kad redaguotumėte puslapius.",
index eecf9e5..6337ea4 100644 (file)
        "redirectedfrom": "(tonga teto avy amin'ny $1)",
        "redirectpagesub": "Pejy fihodinana",
        "redirectto": "Mihodina mankany:",
-       "lastmodifiedat": "Voaova farany tamin'ny $1 amin'ny $2 ity pejy ity<br />",
+       "lastmodifiedat": "Voaova farany tamin'ny $1 amin'ny $2 ity pejy ity.",
        "viewcount": "voastsidika in-$1 ity pejy ity.{{PLURAL:}}",
        "protectedpage": "Pejy voaaro",
        "jumpto": "Hanketo:",
        "nosuchusershort": "Tsy misy mpikambana hoe \"$1\". Hamarino ny tsipelina.",
        "nouserspecified": "Tsy maintsy mampiditra solonanarana ianao.",
        "login-userblocked": "Voasakana io mpikambana io. Fidirana tsy nahazoan-dalana.",
-       "wrongpassword": "Diso ny tenimiafina. Manandrama tenimiafina hafa azafady.",
+       "wrongpassword": "Diso ny tenimiafina. \nAndramo indray azafady.",
        "wrongpasswordempty": "Tsy nampiditra tenimiafina ianao, azafady mba avereno indray.",
        "passwordtooshort": "{{PLURAL:}}Fohy loatra io tenimiafina io.\nFarafahakeliny tokony hisy litera $1 ny tenimiafina.",
        "passwordtoolong": "Tsy azo atao ho lava noho ny soratra {{PLURAL:$1|iray|$1}} ny tenimiafina.",
-       "passwordtoopopular": "Tsy azo ampiasana ny tenimiafina ampiasaina matetika. Misafidiana tenimiafina manokana kokoa.",
+       "passwordtoopopular": "Tsy azo ampiasana ny tenimiafina ampiasaina matetika. Misafidiana tenimiafina sarotra vinavinaina kokoa.",
        "password-name-match": "Tsy maintsy samihafa ny solonanaranao sy ny tenimiafinao tompoko.",
        "password-login-forbidden": "Norarana ny fampiasana io anaram-pikambana ary io tenimiafina io.",
        "mailmypassword": "Hamerina ny tenimiafina",
        "passwordremindertitle": "Fampatsiahivana tenimiafina avy amin'i {{SITENAME}}",
-       "passwordremindertext": "Nisy olona, izay ianao ihany angamba, avy tamin'ny adiresy IP $1, nangataka\nny handefasanay tenimiafina vaovao ho an'ny sehatra {{SITENAME}} ao amin'ny\n$4.\nLasa \"$3\" ankehitriny ny tenimiafin'i \"$2\"\nAfaka miditra ary ianao ankehitriny ary manova ny tenimiafinao.\nLany andro anatin'ny $5 andro ny tenimiafinao\n\nRaha olon-kafa io nangataka io, na tadidinao ihany ny tenimiafinao taloha ka\ntsy irinao hovana intsony, dia fafao fotsiny ity hafatra ity dia ilay\ntenimiafina taloha ihany no ampiasao.{{PLURAL:}}",
+       "passwordremindertext": "Nisy olona (avy amin'ny adiresy IP $1) nangataka tenimiafina vaovao ho an'i {{SITENAME}} ($4). Noforonina ny tenimiafina vonjimaika ho an'ny mpikambana \"$2\" ary natao ho \"$3\". Raha ny finiavanao no nahatonga  izany, dia mila miditra ianao ary misafidy tenimiafina vaovao dien'izao.\nHitsahatra afaka {{PLURAL:$5|iray andro|$5 andro}} ny tenimiafinao.\n\nRaha olon-kafa no nanao ity hataka ity, na efa tadidinao indray ny tenimiafinao ka tsy te-hanova azy intsony, dia azonao tsy raharahiana ity hafatra ity ary azonao ampiasaina ilay tenimiafinao taloha.",
        "noemail": "Tsy nanome adiresy imailaka i \"$1\".",
        "noemailcreate": "Tsy maintsy misy ny adiresy imailaka ho atsofokao",
        "passwordsent": "Nandefasana tenimiafina vaovao any amin'ny adiresy imailak'i \"$1\".\nAzafady midira rehefa voarainao io imailaka io.",
        "botpasswords-insert-failed": "Tsy afaka nanampy ny anarana rôbô \"$1\". Tsy efa nampiana ve ilay izy?",
        "botpasswords-update-failed": "Tsy afaka nanavao ny anarana rôbô \"$1\". Nofafàna ve ilay izy?",
        "botpasswords-created-title": "Noforonina ilay tenimiafina rôbô",
-       "botpasswords-created-body": "Noforonina ny tenimiafina rôbô \"$1\" an'ny mpikambana \"$2\".",
+       "botpasswords-created-body": "Noforonina ny tenimiafina rôbô \"$1\"{{GENDER:$2|}} an'ny mpikambana \"$2\".",
        "botpasswords-updated-title": "Nohavaozina ny tenimiafina rôbô",
-       "botpasswords-updated-body": "Nohavaozina ny tenimiafina rôbô \"$1\" an'ny mpikambana \"$2\".",
+       "botpasswords-updated-body": "Nohavaozina ny tenimiafina rôbô \"$1\" an'ny mpikambana \"$2\"{{GENDER:$2|}}.",
        "botpasswords-deleted-title": "Nofafàna ny tenimiafina rôbô",
-       "botpasswords-deleted-body": "Nofafàna ny tenimiafina rôbô \"$1\" an'ny mpikambana \"$2\".",
-       "botpasswords-newpassword": "Ny tenimiafina idirana amin'i <strong>$1</strong> dia <strong>$2</strong>. <em>Raiketo ilay izy ho an'ny fampiasàna any aoriana any.</em>",
+       "botpasswords-deleted-body": "Nofafàna ny tenimiafina rôbô \"$1\" an'ny mpikambana \"$2{{GENDER:$2|}}\".",
+       "botpasswords-newpassword": "Ny tenimiafina hidirana amin'i <strong>$1</strong> dia <strong>$2</strong>. <em>Raiketo izany ho fampatsiahivana ho an'ny ho avy</em><br>(Ho an'ny rôbô taloha izay mila ny anaram-pidirana mitovy amin'ny anaram-pikambana dia azonao ampiasaina ho anaram-pikambana i <strong>$3</strong> ary niy tenimiafina <strong>$4</strong>.)",
        "botpasswords-no-provider": "Tsy afaka antsoina ny BotPasswordsSessionProvider.",
        "botpasswords-restriction-failed": "Manakana ity fidirana ity ny fepetra mifehy ny tenimiafina rôbô.",
        "resetpass_forbidden": "Tsy afaka ovaina ny tenimiafina",
        "resetpass-submit-loggedin": "Ovay ny tenimiafina",
        "resetpass-submit-cancel": "Aoka ihany",
        "resetpass-wrong-oldpass": "Tsy izy ny tenimiafinao (ankehitriny na vonjimaika)\nMety efa nanova tenimiafina na nangataka hahazo tenimiafina vonjimaika angamba ianao.",
-       "resetpass-recycled": "Avereno amy zavatra hafa nohon'ny tenimiafinao ankehitriny ny tenimiafinao.",
+       "resetpass-recycled": "Ovay ho zavatra samihafa amin'ny tenimiafinao ankehitriny ny tenimiafinao.",
        "resetpass-temp-emailed": "Niditra tamin'ny alalan'ny tenimiafina vonjimaika nalefa mailaka ianao.\nMba hamaranana ny fidirana, dia tsy maintsy mampiditra tenimiafina vaovao eto ianao :",
        "resetpass-temp-password": "Tenimiafina miserana :",
        "resetpass-abort-generic": "Nosakanan'ny itatra (extension) iray ny fanovana tenimiafina.",
        "resetpass-expired": "Efa nitsahatra ny tenimiafinao. Mampidira tenimiafina vaovao hahafahanao miditra.",
-       "resetpass-expired-soft": "Efa nitsahatra ny tenimiafinao, ary tsy maintsy averina ilay izy. Safidio avy hatrany ny tenimiafina, na tsindrio \"{{int:authprovider-resetpass-skip-label}}\" raha tsy hanao izany androany",
-       "resetpass-validity-soft": "Tsy ekena ny tenimiafinao : $1\n\nTenimiafina vaovao fidiana, na tsindrio \"{{int:authprovider-resetpass-skip-label}}\" raha hamerina azy amin'ny fotoana hafa.",
+       "resetpass-expired-soft": "Efa nitsahatra ny tanimiafinao ka mila ovaina. Misafidiana tenimiafina vaovao dien'izao, na tsindrio \"{{int:authprovider-resetpass-skip-label}}\" raha hanova azy amin'ny fotoana hafa.",
+       "resetpass-validity-soft": "Tsy ekena ny tenimiafinao : $1\n\nMisafidiana tenimiafina vaovao izao, na tsindrio  \"{{int:authprovider-resetpass-skip-label}}\" raha te-hanova azy any aoriana.",
        "passwordreset": "Famafana ary famerenana ny tenimiafina",
        "passwordreset-text-one": "Fenoy ity fôrmiolera ity mba hamerenana ny tenimiafinao",
        "passwordreset-text-many": "{{PLURAL:$1|Fenoy ny saha mba hahazoanao tenimiafina vonjimaika.}}",
        "passwordreset-emailtext-ip": "Nisy olona (izay mety ianao, avy amin'ny adiresy IP $1) nangataka ny hamerina ny tenimiafin'ny kaontim-pikambany ho an'i {{SITENAME}} ($4). Mampiasa ity adiresy mailaka ity {{PLURAL:$3|ity kaontim-pikambana mpikambana io|ireo kaontim-mpikambana ireo}}:\n\n$2\n\nHitsahatra afaka $5 andro {{PLURAL:$3|io tenimiafina io|ireo tenimiafina ireo}}.\nTokony miditra ianao ary mifidy tenimiafina vaovao. Raha misy olon-kafa nanao ity hataka ity, na efa tadidinao indray ilay tenimiafinao taloha, ary raha tsy tia hanova azy intsony, azonao tsy raharahiana ity hafatra ity ary mitohy mampiasa ny tenimiafinao taloha.",
        "passwordreset-emailtext-user": "Nisy mpikambana mitondra anarana $1 eo amin'i {{SITENAME}} nangataka fampatsiahivana mikasika ny kaontinao eo amin'i {{SITENAME}} ($4). Manana io adiresy imailaka {{PLURAL:$3|io kaontim-pikambana io|ireo kaontim-pikambana ireo}} :\n\n$2\n\nHitsahatra afaka {{PLURAL:$5|iray|$5}} andro {{PLURAL:$3|io|ireo}} tenimiafina {{PLURAL:$3|io|ireo}}. Mila miditra dien'izao ianao izao ary mifidy tenimiafina vaovao. Raha tsy avy aminao ity hataka ity na efa nahatadidy ny tenimiafinao taloha ianao, ary raha tsy tianao hovaina intsony ilay tenimiafinao, dia azonao tsy raharahiana ity hafatra ity ary mampiasa ny tenimiafinao taloha.",
        "passwordreset-emailelement": "Anaram-pikambana : \n$1\n\nTenimiafina miserana : \n$2",
-       "passwordreset-emailsentemail": "Lasa ny mailaka famerenana tenimiafina.",
+       "passwordreset-emailsentemail": "Raha miaraka amin'ny kaontinao ity adiresy mailaka ity, dia ho alefa ny mailaka famerenan-tenimiafina.",
        "passwordreset-nocaller": "Mila manitsy mpiantso",
        "passwordreset-nosuchcaller": "Tsy misy ilay mpiantso: $1",
        "passwordreset-invalidemail": "Adiresy mailaka tsy azo raisina",
        "preview": "Topi-maso",
        "showpreview": "Asehoy aloha",
        "showdiff": "Asehoy ny fiovana",
-       "blankarticle": "<strong>Tandremo:</strong> Fotsy ny pejy tianao hoforonina.\nRaha manindry an'i \"$1\" indray ianao dia hoforonina tsy hisy vontoatiny na inona na innona ilay pejy.",
+       "blankarticle": "<strong>Tandremo:</strong> Fotsy ny pejy tianao hoforonina.\nRaha manindry an'i \"$1\" indray ianao dia hoforonina tsy hisy vontoatiny na inona na inona ilay pejy.",
        "anoneditwarning": "<strong>Fampitandremana :</strong> Tsy niditra tamin'ny kaontinao ianao. Ho hitan'ny vahoaka ny adiresy IP-nao raha manova inona na inona ianao. Raha <strong>[$1 miditra amin'ny kaontinao]</strong> ianao dia ho anisan'ny tombontsoa anananao ny fanaovana ny fiovana amin'ny solonanaranao.",
        "anonpreviewwarning": "''Tsy niditra ianao. Hampitahiry ny adiresy IP anao ao amin'ny tantaram-panovan'ity pejy ity ny fitehirizana ny fanovana.''",
        "missingsummary": "'''Hafatra fampantsiahivana''' : tsy mbola nanome ny ambangovangom-panovanao ianao.\nRaha mbola tsindriano fanindroany eo amin'ny bokotra $1, ho voatahiry tsy fanambarana ny fanovanao.",
        "missingcommenttext": "Ampidiro ny ambangovangony azafady.",
-       "missingcommentheader": "'''Fampahatsiahivana :''' Tsy nampiditra lohateny amin'ity resaka ity ianao.\nRaha tsindrianao indray eo amin'ny « {{MediaWiki:Savearticle}} » ho voatahiry tsy misy lohateny ny fanovananao.",
-       "summary-preview": "Topi-maso n'ilay ambangovangony :",
-       "subject-preview": "Topi maso ny lazaina :",
+       "missingcommentheader": "<strong>Fampatsiahivana: </strong> Tsy nampiditra lohahevitra ho an'ity hafatra ity ianao. Raha tsindrianao fanindroany \"$1\" dia ho tehirizina tsy misy lohahevitra ny hafatrao.",
+       "summary-preview": "Topi-mason'ny ambangovangom-panovana :",
+       "subject-preview": "Topi-mason-dohahevitra:",
        "previewerrortext": "Nisy hadisoana nitranga tamin'ny fanandramana namoaka topi-mason'ny fanovanao",
        "blockedtitle": "Mpikambana voasakana",
-       "blockedtext": "'''Voasakana ny solonanaranao na ny adiresy IP anao.'''\n\nNataon'i $1 ny fisakanana.\nNy antony : ''$2''.\n\n* Fanombohan'ilay fisakanana : $8\n* Farany : $6\n* Kaonty voasakana : $7.\n\nAfaka antsoinao i $1 na [[{{MediaWiki:Grouppage-sysop}}|ny mpandrindra]] mba hiresaka mombamomba n'izany.\nAfaka andefasanao imailaka ra nampiditra ny adiresy imailakanao ianao ao anatin'ny [[Special:Preferences|mombamombanao]].\n'''$3''' ny adiresy IP-nao ary ny ''identifiant de blocage''-nao dia #$5.\nAsio ao anaty ny fangatahanao io adiresy io.",
-       "autoblockedtext": "Voasakana ny adiresy IP anareo satria nampiasain'ny olon-kafa io adiresy ampiasainao io. Ary voasakan'i $1 ilay olona nampiasa ny adiresinao.<br />\nIty ny antony navoakany\n\n:''$2''\n\n* nanomboka tamin'ny $8 ilay fisakanana\n* Amin'ny $6 ilay fisakanana no mijanona\n* $7 no anaran'ilay kaonty voasakana\n\nAfaka antsoinao i $1 na miantso ny [[{{MediaWiki:Grouppage-sysop}}|mpandrindra]] mba hiresaka momba ny fanakananao.\n\nJereo koa fa tsy afaka mampiasa ny asa ''emailuser'' ianao ra tsy nanometraka ny adiresy imailakao anatin'ny [[Special:Preferences|safidinao]]. Jereo koa ra tsy nesorinao ny asa ''emailuser''.\n\n$3 izao ny adiresinao, ary ny isa ny fisakananai dia $5.\nSoraty ireo fanoroana ireo anatin'ny fangatahana ataonao.",
+       "blockedtext": "<strong>Voasakana ny adiresy IP-nao na ny anaram-pikambanao.</strong>\n\nI $1 no nanao ny sakana.\nNy antony nomeny dia <em>$2</em>.\n\n* Fiantombohan'ny sakana: $8\n* Fitsaharan'ny sakana: $6\n* Ny iriana ho sakanana: $7\n\nAzonao atao ny mifandray amin'i $1 na [[{{MediaWiki:Grouppage-sysop}}|mpandrindra]] hafa raha mila miady hevitra momba ny sakana.\nTsy afaka mampiasa ny fahafahana \"{{int:emailuser}}\" ianao raha tsy nanome adiresy azo anoratana anao ao amin'ny [[Special:Preferences|safidin'ny kaontinao]] ary koa raha tsy nosakanana tsy afaka mampiasa azy ianao.\nNy adiresy IP-nao dia $3 ary ny ID ny sakana dia #$5.\nSoraty avokoa ireo antsipirihany eo ambony ireo anatin'ny hataka izay ataonao.",
+       "autoblockedtext": "<strong>Voasakana ny adiresy IP-nao satria nampiasaim-pikambana hafa izay nosakanan'i $1 ilay izy.</strong>\n\n\nNy antony nomeny dia:\n:<em>$2</em>.\n\n* Fiantombohan'ny sakana: $8\n* Fitsaharan'ny sakana: $6\n* Ny iriana ho sakanana: $7\n\nAzonao atao ny mifandray amin'i $1 na [[{{MediaWiki:Grouppage-sysop}}|mpandrindra]] hafa raha mila miady hevitra momba ny sakana.\nTsy afaka mampiasa ny fahafahana \"{{int:emailuser}}\" ianao raha tsy nanome adiresy azo anoratana anao ao amin'ny [[Special:Preferences|safidin'ny kaontinao]] ary koa raha tsy nosakanana tsy afaka mampiasa azy ianao.\nNy adiresy IP-nao dia $3 ary ny ID ny sakana dia #$5.\nSoraty avokoa ireo antsipirihany eo ambony ireo anatin'ny hataka izay ataonao.",
        "blockednoreason": "tsy nisy antony nomeny",
        "whitelistedittext": "Mila $1 aloha ianao vao afaka manova/mamorona pejy eto amin'ity wiki ity.",
        "confirmedittext": "Tsy maintsy marihina ny adiresy imailakao aloha no manova pejy.\nAmpidiro sy Checkeo ny adiresy imailakao amin'ny [[Special:Preferences|safidinao]].",
        "permissionserrorstext": "Tsy afaka manao ilay aza nangatahanao ianao noho ny antony {{PLURAL:$1||maro}} manaraka :",
        "permissionserrorstext-withaction": "{{PLURAL:$1|Tsy manana alalàna ianao|Tsy manana alalàna ianao}} $2. Io ny antony ($2):",
        "recreate-moveddeleted-warn": "'''Tandremo''' : Mamerina pejy efa voafafa ianareo.'''\n\nMarino raha tsara tohizana ny fanovana eto amin'ity pejy ity. Ny laogim-pamafana sy ny famindran-toerana dia eo ambany :",
-       "moveddeleted-notice": "Voafafa ity pejy ity.\nEo ambany eo any laogin'ny famindran-toerana sy ny famafana ho an'ny antsipirihany.",
+       "moveddeleted-notice": "Voafafa ity pejy ity.\nAseho ho  fampatsiahivana eo ambany eo any laogin'ny famindran-toerana sy ny famafana.",
        "log-fulllog": "Hijery ny laogy manontolo",
        "edit-hook-aborted": "Tsy nety ny fanovàna\nTsy nanome antony",
        "edit-gone-missing": "Tsy afaka natao update ilay pejy.\nMety voafafa angamba izy.",
        "page_first": "voalohany",
        "page_last": "farany",
        "histlegend": "Safidim-pahasamihafana: Mariho ireo bokotra radiôn'ny versiona mba hampitahàna azy ireo  ary tsindrony ilay bokotra amin'ny faran'ny pejy: <strong>({{int:cur}})</strong> = fampitahana amin'ny versiona farany indrindra, <strong>({{int:last}})</strong> = fahasamihafana amin'ny versiona farany nialoha ity, <strong>{{int:minoreditletter}}</strong> = fiovana madinika.",
-       "history-fieldset-title": "Karohy ny tantara",
+       "history-fieldset-title": "Hikaroka tantara",
        "history-show-deleted": "Voafafa ihany",
        "histfirst": "antitra indrindra",
        "histlast": "vaovao indrindra",
        "rcshowhidecategorization": "$1 ny fisokajiam-pejy",
        "rcshowhidecategorization-show": "Aseho",
        "rcshowhidecategorization-hide": "Afenina",
-       "rclinks": "Asehoy ny $1 niova farany tato anatin'ny $2 andro",
+       "rclinks": "Haneho ny fiovana $1 farany tanatin'ny andro $2 farany",
        "diff": "Fampitahana",
        "hist": "tant.",
        "hide": "Afeno",
        "recentchangeslinked-feed": "Novaina",
        "recentchangeslinked-toolbox": "Novaina",
        "recentchangeslinked-title": "Fanaraha-maso ny pejy miarak'amin'ny « $1 »",
-       "recentchangeslinked-summary": "Mampiseho ny fanovàna vao haingana ity pejy manokana ity. Voasoratra amin'ny '''sora-matavy''' ny lohaten'ny [[Special:Watchlist|pejy arahinao-maso]].",
+       "recentchangeslinked-summary": "Mampiseho ny fanovàna vao haingana ity pejy manokana ity. Voasoratra amin'ny '''sora-matavy''' ny lohaten'ny [[Special:Watchlist|pejy arahinao-maso]] dia hiseho amin'ny <strong>sora-baventy</strong>.",
        "recentchangeslinked-page": "anaram-pejy :",
        "recentchangeslinked-to": "Ampisehoy ny fanovàn'ny pejy misy rohy makany amin'ny pejy fa tsy atao mivadika",
        "recentchanges-page-added-to-category": "Nampiana tamin'ny sokajy [[:$1]]",
        "revdelete-restricted": "nametraka fanerena ho an'ny mpandrindra",
        "revdelete-unrestricted": "fanerena nesorina tamin'ny mpandrindra",
        "logentry-move-move": "nanova ny anaran'i $3 ho $4 i $1",
+       "logentry-move-move-noredirect": "$1{{GENDER:$2|}} dia namindra ny pejy $3 ho $4 fa tsy namela fihodinana",
        "logentry-newusers-newusers": "{{GENDER:$2|Noforonina}} ny kaontim-pikambana $1",
        "logentry-newusers-create": "{{GENDER:$2|Noforonina}} ny kaontim-pikambana $1",
        "logentry-newusers-create2": "{{GENDER:$2|Noforonin}}'i $1 ny kaomtim-pikambana $3",
index 387dcb9..6283381 100644 (file)
        "resetpass-temp-password": "Привремена лозинка:",
        "resetpass-abort-generic": "Смената на лозинката е откажана од додаток.",
        "resetpass-expired": "Лозинката ви е истечена. Задајте нова лозинка за да се најавите.",
-       "resetpass-expired-soft": "Лозинката ви е истечена и ќе мора да зададете друга. Изберете ја сега, или пак стиснете на „{{int:authprovider-resetpass-skip-label}}“ за да ја зададете подоцна.",
-       "resetpass-validity-soft": "Лозинката ви е неважечка: $1\n\nИзберете друга сега, или пак стиснете на „{{int:authprovider-resetpass-skip-label}}“ за да ја зададете подоцна.",
+       "resetpass-expired-soft": "Лозинката ви е истечена и ќе мора да ја смените. Изберете ја сега, или пак стиснете на „{{int:authprovider-resetpass-skip-label}}“ за да ја смените подоцна.",
+       "resetpass-validity-soft": "Лозинката ви е неважечка: $1\n\nИзберете друга сега, или пак стиснете на „{{int:authprovider-resetpass-skip-label}}“ за да ја смените подоцна.",
        "passwordreset": "Менување на лозинка",
        "passwordreset-text-one": "Пополнете го образецов за да ја измените лозинката.",
        "passwordreset-text-many": "{{PLURAL:$1|Пополнете едно од полињата за добиете привремена лозинка по е-пошта.}}",
        "rcfilters-other-review-tools": "Други алатки за проверка",
        "rcfilters-group-results-by-page": "Групен исход по страница",
        "rcfilters-activefilters": "Активни филтри",
+       "rcfilters-activefilters-hide": "Скриј",
+       "rcfilters-activefilters-show": "Прикажи",
        "rcfilters-advancedfilters": "Напредни филтри",
        "rcfilters-limit-title": "Ставки за приказ",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|промена|промени}}, $2",
        "rcfilters-savedqueries-rename": "Преименувај",
        "rcfilters-savedqueries-setdefault": "Задај како основно",
        "rcfilters-savedqueries-unsetdefault": "Отстрани од основно",
-       "rcfilters-savedqueries-remove": "Ð\9eÑ\82Ñ\81Ñ\82Ñ\80ани",
+       "rcfilters-savedqueries-remove": "Ð\98збÑ\80иÑ\88и",
        "rcfilters-savedqueries-new-name-label": "Назив",
        "rcfilters-savedqueries-new-name-placeholder": "Опишете ја намената на филтерот",
        "rcfilters-savedqueries-apply-label": "Создај филтер",
        "rcfilters-empty-filter": "Нема активни филтри. Прикажани се сите придонеси.",
        "rcfilters-filterlist-title": "Филтри",
        "rcfilters-filterlist-whatsthis": "Како работи ова?",
-       "rcfilters-filterlist-feedbacklink": "Дајте ни ваше мислење за овие (нови) филтерски алатки",
+       "rcfilters-filterlist-feedbacklink": "Дајте ни ваше мислење за овие филтерски алатки",
        "rcfilters-highlightbutton-title": "Истакнување на исход",
        "rcfilters-highlightmenu-title": "Изберете боја",
        "rcfilters-highlightmenu-help": "Изберете боја за да го истакнете ова својство",
index 9b2f488..61b733b 100644 (file)
        "rcfilters-savedqueries-rename": "പേരുമാറ്റുക",
        "rcfilters-savedqueries-setdefault": "സ്വതേയുള്ളതാക്കുക",
        "rcfilters-savedqueries-unsetdefault": "സ്വതേയുള്ളതെന്നത് ഒഴിവാക്കുക",
-       "rcfilters-savedqueries-remove": "à´¨àµ\80à´\95àµ\8dà´\95à´\82 à´\9aàµ\86à´¯àµ\8dà´¯ുക",
+       "rcfilters-savedqueries-remove": "മായàµ\8dà´\95àµ\8dà´\95ുക",
        "rcfilters-savedqueries-new-name-label": "പേര്‌",
        "rcfilters-savedqueries-new-name-placeholder": "അരിപ്പയുടെ ഉപയോഗം വിവരിക്കുക",
        "rcfilters-savedqueries-apply-label": "അരിപ്പ സൃഷ്ടിക്കുക",
        "deadendpages": "അന്തർ വിക്കി കണ്ണിയാൽ ബന്ധിപ്പിക്കപ്പെടാത്ത താളുകൾ",
        "deadendpagestext": "താഴെക്കാണുന്ന താളുകളിൽനിന്ന് {{SITENAME}} സം‌രംഭത്തിലെ മറ്റൊരു താളിലേയ്ക്കും കണ്ണി ചേർത്തിട്ടില്ല.",
        "protectedpages": "സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്ന താളുകൾ",
+       "protectedpages-filters": "അരിപ്പകൾ:",
        "protectedpages-indef": "അനന്തകാലത്തേയ്ക്ക് സംരക്ഷിക്കപ്പെട്ടവ മാത്രം",
        "protectedpages-summary": "ഇപ്പോൾ നിലവിലുള്ള സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ള താളുകളുടെ പട്ടിക ഈ താളിൽ കാണാം. സൃഷ്ടിക്കുന്നതിൽ നിന്നും സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ള തലക്കെട്ടുകൾക്കായി [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] കാണുക.",
        "protectedpages-cascade": "നിർഝരിത സംരക്ഷണങ്ങൾ മാത്രം",
        "pagedata-title": "താൾ വിവരങ്ങൾ",
        "pagedata-not-acceptable": "ഒത്തുപോവുന്ന ഫോർമാറ്റ് കണ്ടെത്താനായില്ല. പിന്തുണയുള്ള മൈം തരങ്ങൾ: $1",
        "pagedata-bad-title": "അസാധുവായ തലക്കെട്ട്: $1.",
+       "unregistered-user-config": "സുരക്ഷാകാരണങ്ങളാൽ രജിസ്റ്റർ ചെയ്യാത്ത ഉപയോക്താക്കൾക്ക് ജാവാസ്ക്രിപ്റ്റ്, സി.എസ്.എസ്., ജെസൺ ഉപയോക്തൃ ഉപതാളുകൾ എടുക്കാൻ കഴിയില്ല.",
+       "passwordpolicies": "രഹസ്യവാക്ക് നയങ്ങൾ",
+       "passwordpolicies-summary": "ഉപയോക്തൃ ഗണത്തിനായി ഈ വിക്കിയിൽ നടപ്പിലുള്ള രഹസ്യവാക്ക് നയങ്ങളുടെ പട്ടികയാണ് ഇത്.",
        "passwordpolicies-group": "ഗണം",
        "passwordpolicies-policies": "നയങ്ങൾ",
        "passwordpolicies-policy-minimalpasswordlength": "രഹസ്യവാക്ക് കുറഞ്ഞത് {{PLURAL:$1|ഒരു അക്ഷരം|$1 അക്ഷരങ്ങൾ}} നീളമുള്ളതാവണം.",
        "passwordpolicies-policy-minimumpasswordlengthtologin": "പ്രവേശിക്കാനായി രഹസ്യവാക്ക് കുറഞ്ഞത് {{PLURAL:$1|ഒരു അക്ഷരം|$1 അക്ഷരങ്ങൾ}} നീളമുള്ളതാവണം.",
-       "passwordpolicies-policy-passwordcannotmatchusername": "ഉപയോക്തൃനാമം തന്നെ രഹസ്യവാക്ക് ആകാൻ പാടില്ല"
+       "passwordpolicies-policy-passwordcannotmatchusername": "ഉപയോക്തൃനാമം തന്നെ രഹസ്യവാക്ക് ആകാൻ പാടില്ല",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "രഹസ്യവാക്ക് കരിമ്പട്ടികയിൽ ഉള്ള രഹസ്യവാക്കുകൾക്ക് സമാനമാകരുത്",
+       "passwordpolicies-policy-maximalpasswordlength": "രഹസ്യവാക്കിന് കുറഞ്ഞത് $1 {{PLURAL:$1|അക്ഷരം|അക്ഷരങ്ങൾ}} നീളമുണ്ടാവണം",
+       "passwordpolicies-policy-passwordcannotbepopular": "രഹസ്യവാക്ക് {{PLURAL:$1|പ്രചുരപ്രചാരത്തിൽ ഉള്ളത്|പ്രചുരപ്രചാരത്തിലുള്ള $1 രഹസ്യവാക്കുകളുടെ പട്ടികയിൽ ഉള്ളത്}} ആകരുത്."
 }
index fb977f9..2061b18 100644 (file)
        "ipbother": "N'ata durata:",
        "ipboptions": "2 ore:2 hours,1 juorno:1 day,3 juorne:3 days,1 semmana:1 week,2 semmane:2 weeks,1 mese:1 month,3 mise:3 months,6 mise:6 months,1 anno:1 year,infinito:infinite",
        "ipbhidename": "Annascunne 'o nomme utente d' 'a lista 'e cagnamiente e l'ati liste",
-       "ipbwatchuser": "Fà vedé 'a paggena utente e le chiacchieriate 'e st'utente",
+       "ipbwatchuser": "Fà vedé 'a paggena utente e 'e chiacchieriate 'e chist'utente",
        "ipb-disableusertalk": "Nun permettere a st'utente edità 'a paggena 'e chiacchiera d' 'a soja pe' tramente ch'e bloccato",
        "ipb-change-block": "Fremma n'ata vota ll'utente cu ste mpustaziune",
        "ipb-confirm": "Cunferma 'o blocco",
        "version-poweredby-credits": "Sta wiki funziona pe' bbìa 'e <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
        "version-poweredby-others": "ati",
        "version-poweredby-translators": "tradutture 'e translatewiki.net",
-       "version-credits-summary": "Nuje vulessemo tené a mmente 'e perzune ccà abbascio pe' purtà rispetto a 'e cuntribbute 'e lloro ncopp'a [[Special:Version|MediaWiki]].",
+       "version-credits-summary": "Nuje vulessemo tené a mmente 'e perzune ccà abbascio pe purtà rispetto a 'e cuntribbute 'e lloro ncopp'a [[Special:Version|MediaWiki]].",
        "version-license-info": "MediaWiki è nu software libbero; vuje 'o putite redestribbuì e/o cagnà sott' 'e termine d' 'a licienza GNU GPL ('a Licienza Pubbreca Generale) comme pubbrecata d' 'a Free Software Foundation; o pure 'a verziona 2 d' 'a Licienza, o pure (comme vulite vuje) 'a n'ata verziona cchiù nnova.\n\nMediaWiki è destribbuita c' 'a speranza d'essere utile, ma SENZA NISCIUNA GARANZIA; senza manco 'a garanzia p' 'a CUMMERCIABBELETÀ O IDONIETÀ PE' NU SCOPO PARTICULARE. Iate a vedé 'a GNU GPL pe' n'avé cchiù nfurmaziune.\n\nAvísseve 'a ricevere [{{SERVER}}{{SCRIPTPATH}}/COPYING na copia d' 'a Licienza GNU GPL] cu stu prugramma; si nò, scrivete â Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html liggite sta paggena ncopp' 'a l'Internet].",
        "version-software": "Software installato",
        "version-software-product": "Prodotto",
index e03fb95..f91ed5b 100644 (file)
        "rcfilters-other-review-tools": "Andere controlehulpmiddelen",
        "rcfilters-group-results-by-page": "Resultaten per pagina groeperen",
        "rcfilters-activefilters": "Actieve filters",
+       "rcfilters-activefilters-hide": "Verbergen",
+       "rcfilters-activefilters-show": "Weergeven",
        "rcfilters-advancedfilters": "Geavanceerde filters",
        "rcfilters-limit-title": "Resultaten om te tonen",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|wijziging|wijzigingen}}, $2",
        "rcfilters-empty-filter": "Geen actieve filters. Alle bijdragen worden weergegeven.",
        "rcfilters-filterlist-title": "Filters",
        "rcfilters-filterlist-whatsthis": "Hoe werkt dit?",
-       "rcfilters-filterlist-feedbacklink": "Laat ons weten wat u denkt over deze (nieuwe) filterhulpmiddelen",
+       "rcfilters-filterlist-feedbacklink": "Laat ons weten wat u denkt over deze filterhulpmiddelen",
        "rcfilters-highlightbutton-title": "Resultaten markeren",
        "rcfilters-highlightmenu-title": "Kies een kleur",
        "rcfilters-highlightmenu-help": "Selecteer een kleur om deze eigenschap uit te lichten",
index c6225ac..45fe433 100644 (file)
        "resetpass-temp-password": "Tymczasowe hasło:",
        "resetpass-abort-generic": "Zmiana hasła została przerwana przez rozszerzenie.",
        "resetpass-expired": "Twoje hasło wygasło. Proszę ustawić nowe hasło do logowania.",
-       "resetpass-expired-soft": "Twoje hasło wygasło i musi zostać zresetowane. Proszę wybrać nowe hasło albo kliknąć na „{{int:authprovider-resetpass-skip-label}}”, aby zresetować je później.",
-       "resetpass-validity-soft": "Twoje hasło jest niepoprawne: $1\n\nWybierz teraz nowe hasło albo kliknij „{{int:authprovider-resetpass-skip-label}}”, aby zresetować je później.",
+       "resetpass-expired-soft": "Twoje hasło wygasło i musi zostać zmienione. Wybierz nowe hasło albo kliknij na „{{int:authprovider-resetpass-skip-label}}”, aby zmienić je później.",
+       "resetpass-validity-soft": "Twoje hasło jest niepoprawne: $1\n\nWybierz nowe hasło albo kliknij „{{int:authprovider-resetpass-skip-label}}”, aby zmienić je później.",
        "passwordreset": "Wyczyść hasło",
        "passwordreset-text-one": "Wypełnij ten formularz, aby otrzymać tymczasowe hasło na email.",
        "passwordreset-text-many": "{{PLURAL:$1|Wypełnij jedno z poniższych pól, aby otrzymać tymczasowe hasło przez e-mail.}}",
        "rcfilters-other-review-tools": "Inne narzędzia do sprawdzania",
        "rcfilters-group-results-by-page": "Grupuj wyniki według stron",
        "rcfilters-activefilters": "Aktywne filtry",
+       "rcfilters-activefilters-hide": "Ukryj",
+       "rcfilters-activefilters-show": "Pokaż",
        "rcfilters-advancedfilters": "Zaawansowane filtry",
        "rcfilters-limit-title": "Wyników do pokazania",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|zmiana|zmiany|zmian}}, $2",
        "rcfilters-empty-filter": "Brak aktywnych filtrów. Wyświetlane są wszystkie zmiany.",
        "rcfilters-filterlist-title": "Filtry",
        "rcfilters-filterlist-whatsthis": "Jak to działa?",
-       "rcfilters-filterlist-feedbacklink": "Napisz co sądzisz o tych nowych narzędziach filtrowania",
+       "rcfilters-filterlist-feedbacklink": "Napisz nam, co sądzisz o tych narzędziach filtrowania",
        "rcfilters-highlightbutton-title": "Podświetl wyniki",
        "rcfilters-highlightmenu-title": "Wybierz kolor",
        "rcfilters-highlightmenu-help": "Wybierz kolor, aby podświetlić tę właściwość",
index 3f5a2e7..726c303 100644 (file)
        "page_first": "prima",
        "page_last": "ùltima",
        "histlegend": "Confront antra version diferente: che as selession-a le casele dle version che a veul e peui che a sgnaca ël boton për anandié ël process.<br />\nLegenda: (cor) = diferense con la version corenta,\n(prim) = diferense con la version prima, c = modìfica cita",
-       "history-fieldset-title": "Varda la cronologìa",
+       "history-fieldset-title": "Sërché dle revision",
        "history-show-deleted": "Mach ëscancelà",
        "histfirst": "ij pì vej",
        "histlast": "ij pì recent",
        "searchprofile-advanced-tooltip": "Sërché ant jë spassi nominaj përsonalisà",
        "search-result-size": "$1 ({{PLURAL:$2|un|$2}} mòt)",
        "search-result-category-size": "{{PLURAL:$1|1 mèmber|$1 mèmber}} ({{PLURAL:$2|1 sot-categorìa|$2 sot-categorìe}}, {{PLURAL:$3|1 archivi|$3 archivi}})",
-       "search-redirect": "(ridiression $1)",
+       "search-redirect": "(ridiression da $1)",
        "search-section": "(session $1)",
        "search-category": "(categorìa $1)",
        "search-file-match": "(a corëspond al contnù d'archivi)",
        "recentchangeslinked-feed": "Modìfiche colegà",
        "recentchangeslinked-toolbox": "Modìfiche colegà",
        "recentchangeslinked-title": "Modìfiche ch'a-i intro con \"$1\"",
-       "recentchangeslinked-summary": "Costa a l'é na lista ëd modìfiche fàite da pòch a pàgine colegà a cola spessificà (o a mèmber ëd na categorìa spessificà).\nLe pàgine dzora a [[Special:Watchlist|la lista ëd lòn ch'as ten sot-euj]] a resto marcà an '''grassèt'''.",
+       "recentchangeslinked-summary": "Scrive un nòm ëd na pàgina për vëdde ij cangiament an s'ëd pàgine colegà vers o da cola pàgina. (Për vëdde ij mèmber ëd na categorìa, ch'a scriva {{ns:category}}:Nòm ëd categorìa). Ij cangiament a dle pàgine dla [[Special:Watchlist|ròba ch'as ten sot-euj]] a son an <strong>grassèt</strong>.",
        "recentchangeslinked-page": "Nòm ëd la pàgina:",
        "recentchangeslinked-to": "Mostré nopà le modìfiche a le pàgine colegà a cola dàita",
        "upload": "Carié n'archivi",
        "booksources-text": "Ambelessì sota a-i é na lista d'àotri sit che a vendo dij lìber neuv e dë sconda man, e che a peulo ëdcò smon-e dj'anformassion rësgoard ai test che a l'é antramentr che a sërca:",
        "booksources-invalid-isbn": "L'ISBN dàit a smija che a sia pa vàlid; ch'a contròla s'a-i é n'eror an copiand da la sorgiss original.",
        "specialloguserlabel": "Esecutor:",
-       "speciallogtitlelabel": "Obietiv (tìtol o utent):",
+       "speciallogtitlelabel": "Obietiv (tìtol o {{ns:user}}:stranòm ëd l'utent):",
        "log": "Registr",
        "all-logs-page": "Tùit ij registr pùblich",
        "alllogstext": "Visualisassion combinà ëd tùit ij registr ëd {{SITENAME}}.\nA peul arstrenze la visualisassion an selessionand la sòrt ëd registr, lë stranòm utent (sensìbil a majùscol/minùscol), e la pàgina anteressà (sensìbil a majùscol/minùscol).",
        "unwatchthispage": "Chité-lì ëd ten-e sossì sot-euj",
        "notanarticle": "Sòn a l'é pa n'artìcol",
        "notvisiblerev": "La revision a l'é stàita scancelà",
-       "watchlist-details": "A l'é dëmentrè ch'as ten sot-euj {{PLURAL:$1|$1 pàgina|$1 pàgine}}, nen contand an manera separà cole ëd discussion.",
+       "watchlist-details": "La lista 'd lòn ch'as ten sot-euj {{PLURAL:$1|$1 pàgina|$1 pàgine}}, nen contand an manera separà cole ëd discussion.",
        "wlheader-enotif": "La notìfica për pòsta eletrònica a l'é abilità.",
        "wlheader-showupdated": "Le pàgine che a son ëstàite modificà da quand che a l'é passaje ansima l'ùltima vira a resto marcà an '''grassèt'''",
        "wlnote": "Ambelessì sota a-i {{PLURAL:$1|é l'ùltima modìfica|son j'ùltime <strong>$1</strong> modìfiche}} ant {{PLURAL:$2|l'ùltima ora|j'ùltime <strong>$2</strong> ore}}, a parte da $3, $4.",
        "whatlinkshere-hideredirs": "$1 ridiression",
        "whatlinkshere-hidetrans": "$1 anclusion",
        "whatlinkshere-hidelinks": "$1 anliure",
-       "whatlinkshere-hideimages": "$1 j'archivi lijà",
+       "whatlinkshere-hideimages": "$1 liure da archivi",
        "whatlinkshere-filters": "Filtr",
        "autoblockid": "Blocagi automàtich #$1",
        "block": "Bloché l'utent",
        "tooltip-feed-rss": "Fluss RSS për costa pàgina",
        "tooltip-feed-atom": "Fluss Atom për costa pàgina.",
        "tooltip-t-contributions": "Vardé la lista dle contribussion ëd {{GENDER:$1|cost utent}}",
-       "tooltip-t-emailuser": "Mandeje un mëssagi ëd pòsta a st'utent",
+       "tooltip-t-emailuser": "Mandé 'n mëssaggi ëd pòsta eletrònica a {{GENDER:$1|cost|cost}} utent",
        "tooltip-t-info": "Pi d'anformassio su costa pàgina",
        "tooltip-t-upload": "Carié n'archivi ëd figure ò son.",
        "tooltip-t-specialpages": "Lista ëd tute le pàgine speciaj.",
        "version-libraries": "Biblioteche anstalà",
        "version-libraries-library": "Biblioteca",
        "version-libraries-version": "Version",
-       "redirect": "Ridirigiù da archivi, utent, pàgina o ID ëd revision",
+       "redirect": "Ridiression për ID d'archivi, utent, pàgina, revision o argistr",
        "redirect-summary": "Costa pàgina special a ponta a n'archivi (dàit ël nòm dl'archivi), na pàgina (dàit n'ID ëd revision o n'ID ëd pàgina) o na pàgina d'utent (dàit n'identificativ numérich a l'utent). Usagi: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Andé",
        "redirect-lookup": "Arserca:",
        "feedback-thanks": "Mersì! Sò coment a l'é stàit publicà an sla pàgina \"[$2 $1]\".",
        "feedback-thanks-title": "Mersì!",
        "feedback-useragent": "Agent d'utent:",
-       "searchsuggest-search": "Arserché",
+       "searchsuggest-search": "Sërca an {{SITENAME}}",
        "searchsuggest-containing": "contenent ...",
        "api-error-badtoken": "Eror antern: sìmbol pa bon.",
        "api-error-emptypage": "La creassion ëd pàgine neuve veujde a l'é nen përmëttùa.",
index ca356b6..a77ff2d 100644 (file)
        "resetpass-submit-loggedin": "Alterar senha",
        "resetpass-submit-cancel": "Cancelar",
        "resetpass-wrong-oldpass": "Senha temporária ou atual inválida.\nVocê pode já ter alterado com sucesso a sua senha, ou solicitado uma nova senha temporária.",
-       "resetpass-recycled": "Por favor, redefina sua nova senha para uma diferente da atual.",
+       "resetpass-recycled": "Por favor, altere sua senha para algo diferente da sua senha atual.",
        "resetpass-temp-emailed": "Você está autenticado com o código temporário enviado. Para finalizar a autenticação, você deve inserir uma nova senha aqui:",
        "resetpass-temp-password": "Senha temporária:",
        "resetpass-abort-generic": "Uma extensão cancelou a alteração da senha.",
        "resetpass-expired": "Sua senha expirou. Por favor insira uma nova senha para autenticar-se.",
-       "resetpass-expired-soft": "Sua senha expirou e necessita ser resetada. Por favor escolha uma nova agora, ou clique \"{{int:authprovider-resetpass-skip-label}}\" para resetar mais tarde.",
-       "resetpass-validity-soft": "Sua senha não é válida: $1\n\nPor favor escolha uma nova senha agora, ou clique \"{{int:authprovider-resetpass-skip-label}}\" para redefini-la mais tarde.",
+       "resetpass-expired-soft": "Sua senha expirou e precisa ser alterada. Escolha uma nova senha agora ou clique em \"{{int:authprovider-resetpass-skip-label}}\" para alterá-la mais tarde.",
+       "resetpass-validity-soft": "Sua senha não é válida: $1\n\nPor favor escolha uma nova senha agora, ou clique \"{{int:authprovider-resetpass-skip-label}}\" para mudar depois.",
        "passwordreset": "Redefinir senha",
        "passwordreset-text-one": "Complete este formulário para trocar sua senha.",
        "passwordreset-text-many": "{{PLURAL:$1|Preencha um dos campos para trocar sua senha.}}",
        "prefs-help-gender": "A configuração dessa preferência é opcional.\nO ''software'' utiliza seu valor para tratar e mencionar você a outros usando o gênero gramatical adequado.\nEssa informação será pública.",
        "email": "E-mail",
        "prefs-help-realname": "O fornecimento de seu nome verdadeiro é opcional.\nCaso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu trabalho.",
-       "prefs-help-email": "O endereço de correio eletrônico é opcional, mas será necessário para recriar sua senha caso esqueça a antiga.",
+       "prefs-help-email": "O endereço de e-mail é opcional, mas será necessário para recriar sua senha caso esqueça a antiga.",
        "prefs-help-email-others": "Você também pode optar por permitir que outros entrem em contato com você através de sua página de usuário ou de discussão sem ter de revelar seus dados pessoais.",
        "prefs-help-email-required": "O endereço de e-mail é requerido.",
        "prefs-info": "Informações básicas",
        "rcfilters-other-review-tools": " Outras ferramentas de revisão:",
        "rcfilters-group-results-by-page": "Agrupar resultado por página",
        "rcfilters-activefilters": "Filtros ativos",
+       "rcfilters-activefilters-hide": "Ocultar",
+       "rcfilters-activefilters-show": "Exibir",
        "rcfilters-advancedfilters": "Filtros avançados",
        "rcfilters-limit-title": "Resultados para mostrar",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|mudança|mudanças}}, $2",
        "rcfilters-savedqueries-rename": "Renomear",
        "rcfilters-savedqueries-setdefault": "Definir como padrão",
        "rcfilters-savedqueries-unsetdefault": "Remover como padrão",
-       "rcfilters-savedqueries-remove": "Remover",
+       "rcfilters-savedqueries-remove": "Excluir",
        "rcfilters-savedqueries-new-name-label": "Nome",
        "rcfilters-savedqueries-new-name-placeholder": "Descreva a finalidade do filtro",
        "rcfilters-savedqueries-apply-label": "Criar filtro",
        "rcfilters-empty-filter": "Nenhum filtro ativo. Todas as contribuições são mostradas.",
        "rcfilters-filterlist-title": "Filtros",
        "rcfilters-filterlist-whatsthis": "Como funcionam estes?",
-       "rcfilters-filterlist-feedbacklink": "Diga-nos o que você pensa sobre estas (novas) ferramentas de filtragem",
+       "rcfilters-filterlist-feedbacklink": "Conte-nos o que você pensa sobre essas ferramentas de filtragem",
        "rcfilters-highlightbutton-title": "Destacar resultados",
        "rcfilters-highlightmenu-title": "Selecione uma cor",
        "rcfilters-highlightmenu-help": "Selecione uma cor para realçar esta propriedade",
        "rcfilters-watchlist-showupdated": "As alterações nas páginas que você não visitou desde as mudanças ocorridas estão em <strong>negrito</strong>, com marcadores sólidos.",
        "rcfilters-preference-label": "Ocultar a versão melhorada das Mudanças Recentes",
        "rcfilters-preference-help": "Reverte o redesenho da interface de 2017 e todas as ferramentas adicionadas na altura e desde então.",
+       "rcfilters-watchlist-preference-label": "Ocultar a versão melhorada das páginas vigiadas",
+       "rcfilters-watchlist-preference-help": "Reverte o redesenho da interface em 2017 e todas as ferramentas adicionadas nessa altura e desde então.",
        "rcfilters-filter-showlinkedfrom-label": "Mostrar alterações nas páginas ligadas de",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Páginas ligadas da</strong> página selecionada",
        "rcfilters-filter-showlinkedto-label": "Mostrar alterações nas páginas que ligam para",
        "dellogpage": "Registro de eliminações",
        "dellogpagetext": "Abaixo uma lista das eliminações mais recentes.",
        "deletionlog": "registro de eliminações",
+       "log-name-create": "Registo de criação de páginas",
+       "log-description-create": "Encontra abaixo uma lista das criações de páginas mais recentes.",
+       "logentry-create-create": "$1 {{GENDER:$2|criou}} a página $3",
        "reverted": "Revertido para versão anterior",
        "deletecomment": "Motivo:",
        "deleteotherreason": "Justificativa adicional:",
        "sp-contributions-newbies-title": "Contribuições de contas novas",
        "sp-contributions-blocklog": "registro de bloqueios",
        "sp-contributions-suppresslog": "Contribuições de {{GENDER:$1|usuário}} suprimidas",
-       "sp-contributions-deleted": "contribuições eliminadas",
+       "sp-contributions-deleted": "{{GENDER:$1|contribuições}} eliminadas",
        "sp-contributions-uploads": "envios",
        "sp-contributions-logs": "registros",
        "sp-contributions-talk": "discussão",
-       "sp-contributions-userrights": "gerenciamento de privilégios",
+       "sp-contributions-userrights": "{{GENDER:$1|gestão}} dos privilégios",
        "sp-contributions-blocked-notice": "Este usuário atualmente está bloqueado. O registro de bloqueio mais recente é fornecido abaixo para referência:",
        "sp-contributions-blocked-notice-anon": "Este endereço IP encontra-se bloqueado.\nSegue, para referência, a entrada mais recente no registro de bloqueios:",
        "sp-contributions-search": "Navegar pelas contribuições",
        "rawhtml-notallowed": "As tags &lt;html&gt; não podem ser usadas fora das páginas normais.",
        "gotointerwiki": "Saindo {{SITENAME}}",
        "gotointerwiki-invalid": "O título especificado é inválido.",
-       "gotointerwiki-external": "Você está prestes a sair {{SITENAME}} para visitar [[$2]] que é um website separado.\n\n[$1 Continuar para $1].",
+       "gotointerwiki-external": "Você está prestes a sair {{SITENAME}} para visitar [[$2]] que é um website separado.\n\n'''[$1 Continuar para $1]'''",
        "undelete-cantedit": "Você não pode restaurar esta página, porque você não está autorizado a editar esta página.",
        "undelete-cantcreate": "Você não pode restaurar esta página, pois não há uma página com este nome e você não está autorizado a criar esta página.",
        "pagedata-title": "Dados de página",
index cb216ce..eed76f1 100644 (file)
        "resetpass-submit-loggedin": "Alterar palavra-passe",
        "resetpass-submit-cancel": "Cancelar",
        "resetpass-wrong-oldpass": "Palavra-passe temporária ou atual inválida.\nPode ter já alterado a sua palavra-passe ou solicitado uma nova palavra-passe temporária.",
-       "resetpass-recycled": "Redefina a sua palavra-passe para uma diferente da atual, por favor.",
+       "resetpass-recycled": "Altere a sua palavra-passe para uma diferente da atual, por favor.",
        "resetpass-temp-emailed": "Iniciou a sessão com um código temporário.\nPara completar a autenticação, tem de definir uma palavra-passe nova aqui:",
        "resetpass-temp-password": "Palavra-passe temporária:",
        "resetpass-abort-generic": "A alteração da palavra-passe foi cancelada por uma extensão.",
        "resetpass-expired": "A sua palavra-passe expirou. Por favor, defina uma nova para iniciar a sessão.",
-       "resetpass-expired-soft": "A sua palavra-passe expirou e tem de ser redefinida. Escolha uma nova agora ou clique \"{{int:authprovider-resetpass-skip-label}}\" para redefini-la mais tarde.",
-       "resetpass-validity-soft": "A sua palavra-passe não é válida: $1\n\nPor favor, escolha uma nova palavra-passe agora, ou clique em \"{{int:authprovider-resetpass-skip-label}}\" para redefini-la mais tarde.",
+       "resetpass-expired-soft": "A sua palavra-passe expirou e tem de ser alterada. Escolha uma nova agora ou clique \"{{int:authprovider-resetpass-skip-label}}\" para alterá-la mais tarde.",
+       "resetpass-validity-soft": "A sua palavra-passe não é válida: $1\n\nEscolha uma palavra-passe nova agora, ou clique em \"{{int:authprovider-resetpass-skip-label}}\" para alterá-la mais tarde, por favor.",
        "passwordreset": "Redefinir palavra-passe",
        "passwordreset-text-one": "Preencha este formulário para receber uma palavra-passe temporária por correio eletrónico.",
        "passwordreset-text-many": "{{PLURAL:$1|Preencha um dos campos para receber uma palavra-passe temporária por correio eletrónico.}}",
        "rcfilters-other-review-tools": "Outras ferramentas de revisão",
        "rcfilters-group-results-by-page": "Agrupar resultados por página",
        "rcfilters-activefilters": "Filtros ativos",
+       "rcfilters-activefilters-hide": "Ocultar",
+       "rcfilters-activefilters-show": "Mostrar",
        "rcfilters-advancedfilters": "Filtros avançados",
        "rcfilters-limit-title": "Resultados a mostrar",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|mudança|mudanças}}, $2",
        "rcfilters-savedqueries-rename": "Alterar o nome",
        "rcfilters-savedqueries-setdefault": "Ativar por padrão",
        "rcfilters-savedqueries-unsetdefault": "Remover por padrão",
-       "rcfilters-savedqueries-remove": "Remover",
+       "rcfilters-savedqueries-remove": "Eliminar",
        "rcfilters-savedqueries-new-name-label": "Nome",
        "rcfilters-savedqueries-new-name-placeholder": "Descreve o propósito do filtro",
        "rcfilters-savedqueries-apply-label": "Criar filtro",
        "rcfilters-empty-filter": "Não há filtros ativos. São mostradas todas as contribuições.",
        "rcfilters-filterlist-title": "Filtros",
        "rcfilters-filterlist-whatsthis": "Como é que funcionam?",
-       "rcfilters-filterlist-feedbacklink": "Diga-nos o que acha das (novas) ferramentas de filtragem",
+       "rcfilters-filterlist-feedbacklink": "Diga-nos o que acha destas ferramentas de filtragem",
        "rcfilters-highlightbutton-title": "Realçar resultados",
        "rcfilters-highlightmenu-title": "Selecionar uma cor",
        "rcfilters-highlightmenu-help": "Selecione uma cor para realçar esta propriedade",
index 94ffcf6..0b92009 100644 (file)
        "rcfilters-other-review-tools": "Used as a heading for the community collection of other links on [[Special:RecentChanges]] when RCFilters are enabled.",
        "rcfilters-group-results-by-page": "A label for the checkbox describing whether the results in [[Special:RecentChanges]] are grouped by page when RCFilters are enabled.",
        "rcfilters-activefilters": "{{doc-important|Translations of this message should not more than 3 cm long, otherwise it will make bad user experiences for potential mobile users.}}\nTitle for the filters selection showing the active filters.",
+       "rcfilters-activefilters-hide": "Label for the button that hides the active filters list and dropdown in [[Special:RecentChanges]].\n{{Identical|Hide}}",
+       "rcfilters-activefilters-show": "Label for the button that shows the active filters list and dropdown in [[Special:RecentChanges]].\n{{Identical|Show}}",
        "rcfilters-advancedfilters": "Title for the buttons allowing the user to switch to the various advanced filters views.",
        "rcfilters-limit-title": "Title for the options to change the number of results shown.",
        "rcfilters-limit-and-date-label": "Title for the button that opens the operation to control how many results to show and in which time period to search. \n\nParameters: $1 - Number of results shown\n\n$2 - Time period to search. One of {{msg-mw|rcfilters-days-title}} or {{msg-mw|rcfilters-hours-title}} is used as $2\n{{Identical|Change}}",
index 2b86286..69d6cb6 100644 (file)
        "rcfilters-empty-filter": "Нет активных фильтров. Показываются все правки.",
        "rcfilters-filterlist-title": "Фильтры",
        "rcfilters-filterlist-whatsthis": "Как это работает?",
-       "rcfilters-filterlist-feedbacklink": "Расскажите нам, что вы думаете об этих (новых) инструментах фильтрации",
+       "rcfilters-filterlist-feedbacklink": "Расскажите нам, что вы думаете об этих инструментах фильтрации",
        "rcfilters-highlightbutton-title": "Выделить результаты",
        "rcfilters-highlightmenu-title": "Выберите цвет",
        "rcfilters-highlightmenu-help": "Выберите цвет, чтобы подсветить это свойство",
index 82a500a..69a38b4 100644 (file)
        "savechanges": "Uložiť zmeny",
        "publishpage": "Publikovať stránku",
        "publishchanges": "Publikovať zmeny",
+       "publishchanges-start": "Zverejniť zmeny…",
        "preview": "Náhľad",
        "showpreview": "Zobraziť náhľad",
        "showdiff": "Zobraziť rozdiely",
index 57fa71e..f80a5b5 100644 (file)
        "resetpass-submit-loggedin": "Spremenite geslo",
        "resetpass-submit-cancel": "Prekliči",
        "resetpass-wrong-oldpass": "Neveljavno začasno ali trenutno geslo.\nMorda ste že spremenili geslo ali pa ste zahtevali novo začasno geslo.",
-       "resetpass-recycled": "Prosimo, ponastavite svoje geslo na nekaj drugega kot svoje trenutno geslo.",
+       "resetpass-recycled": "Prosimo, spremenite svoje geslo na nekaj drugega kot svoje trenutno geslo.",
        "resetpass-temp-emailed": "Trenutno ste prijavljeni z začasno kodo, poslano z e-pošto. Za zaključitev prijave morate tukaj nastaviti novo geslo:",
        "resetpass-temp-password": "Začasno geslo:",
        "resetpass-abort-generic": "Razširitev je prekinila spremembo gesla.",
        "resetpass-expired": "Vaše geslo je poteklo. Prosimo, nastavite novo geslo za prijavo.",
-       "resetpass-expired-soft": "Vaše geslo je poteklo in ga morate ponastaviti. Prosimo, izberite novo geslo zdaj ali kliknite »{{int:authprovider-resetpass-skip-label}}«, da ga ponastavite pozneje.",
-       "resetpass-validity-soft": "Vaše geslo ni veljavno: $1\n\nProsimo, izberite novo geslo zdaj ali kliknite »{{int:authprovider-resetpass-skip-label}}«, da ga ponastavite pozneje.",
+       "resetpass-expired-soft": "Vaše geslo je poteklo in ga morate spremeniti. Prosimo, izberite novo geslo zdaj ali kliknite »{{int:authprovider-resetpass-skip-label}}«, da ga spremenite pozneje.",
+       "resetpass-validity-soft": "Vaše geslo ni veljavno: $1\n\nProsimo, izberite novo geslo zdaj ali kliknite »{{int:authprovider-resetpass-skip-label}}«, da ga spremenite pozneje.",
        "passwordreset": "Ponastavitev gesla",
        "passwordreset-text-one": "Da ponastavite svoje geslo, izpolnite naslednji obrazec.",
        "passwordreset-text-many": "{{PLURAL:$1|Da po e-pošti prejmete začasno geslo, izpolnite eno od polj.}}",
        "rcfilters-other-review-tools": "Druga orodja za pregled",
        "rcfilters-group-results-by-page": "Združi rezultate po strani",
        "rcfilters-activefilters": "Dejavni filtri",
+       "rcfilters-activefilters-hide": "Skrij",
+       "rcfilters-activefilters-show": "Prikaži",
        "rcfilters-advancedfilters": "Napredni filtri",
        "rcfilters-limit-title": "Rezultati za prikaz",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb}}, $2",
        "rcfilters-savedqueries-rename": "Preimenuj",
        "rcfilters-savedqueries-setdefault": "Nastavi kot privzeto",
        "rcfilters-savedqueries-unsetdefault": "Odstrani kot privzeto",
-       "rcfilters-savedqueries-remove": "Odstrani",
+       "rcfilters-savedqueries-remove": "Izbriši",
        "rcfilters-savedqueries-new-name-label": "Ime",
        "rcfilters-savedqueries-new-name-placeholder": "Opišite namen filtra",
        "rcfilters-savedqueries-apply-label": "Ustvari filter",
        "rcfilters-empty-filter": "Ni dejavnih filtrov. Prikazani so vsi prispevki.",
        "rcfilters-filterlist-title": "Filtri",
        "rcfilters-filterlist-whatsthis": "Kako to deluje?",
-       "rcfilters-filterlist-feedbacklink": "Povejte nam, kaj menite o teh (novih) orodjih za filtriranje",
+       "rcfilters-filterlist-feedbacklink": "Povejte nam, kaj menite o teh orodjih za filtriranje",
        "rcfilters-highlightbutton-title": "Označi rezultate",
        "rcfilters-highlightmenu-title": "Izberite barvo",
        "rcfilters-highlightmenu-help": "Izberite barvo za označitev te lastnosti",
index b634673..5435e1d 100644 (file)
        "tags": "Важеће ознаке измена",
        "tag-filter": "Филтер за [[Special:Tags|ознаке]]:",
        "tag-filter-submit": "Филтрирај",
-       "tag-list-wrapper": "([[Special:Tags|$1 {{PLURAL:$1|ознака|ознаке|ознака}}]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ознака|ознаке}}]]: $2)",
        "tag-mw-contentmodelchange": "промена модела садржаја",
        "tag-mw-contentmodelchange-description": "Измене које мењају модел садржаја странице",
        "tag-mw-new-redirect": "ново преусмерење",
        "tag-mw-removed-redirect-description": "Измене које мењају постојеће преусмерење у страницу без преусмерења",
        "tag-mw-changed-redirect-target": "промењено одредиште преусмерења",
        "tag-mw-changed-redirect-target-description": "Измене које мењају одредиште преусмерења",
-       "tag-mw-blank": "Страница испражњена",
+       "tag-mw-blank": "страница испражњена",
        "tag-mw-blank-description": "Измене које бришу читав садржај странице",
-       "tag-mw-replace": "Уклоњена већина текста",
+       "tag-mw-replace": "уклоњена већина текста",
        "tag-mw-replace-description": "Измене које уклањају више од 90% садржаја странице",
        "tag-mw-rollback": "враћање",
        "tag-mw-rollback-description": "Измене које враћају страницу на претходне измене",
index fbb0b5a..a571177 100644 (file)
        "rcfilters-savedqueries-rename": "Döp om",
        "rcfilters-savedqueries-setdefault": "Ange som standard",
        "rcfilters-savedqueries-unsetdefault": "Ta bort som standard",
-       "rcfilters-savedqueries-remove": "Ta bort",
+       "rcfilters-savedqueries-remove": "Radera",
        "rcfilters-savedqueries-new-name-label": "Namn",
        "rcfilters-savedqueries-new-name-placeholder": "Beskriv syftet med filtret",
        "rcfilters-savedqueries-apply-label": "Skapa filter",
        "rcfilters-empty-filter": "Inga aktiva filter. Alla bidrag visas.",
        "rcfilters-filterlist-title": "Filter",
        "rcfilters-filterlist-whatsthis": "Hur fungerar dessa?",
-       "rcfilters-filterlist-feedbacklink": "Berätta vad du tycker om dessa (nya) filtreringsverktyg",
+       "rcfilters-filterlist-feedbacklink": "Berätta vad du tycker om dessa filtreringsverktyg",
        "rcfilters-highlightbutton-title": "Markera resultat",
        "rcfilters-highlightmenu-title": "Välj en färg",
        "rcfilters-highlightmenu-help": "Välj en färg att markera denna egenskap",
        "exif-copyrighted-false": "Upphovsrättsstatus inte angivet",
        "exif-photometricinterpretation-0": "Svartvitt (vit är 0)",
        "exif-photometricinterpretation-1": "Svart och vit (svart är 0)",
+       "exif-photometricinterpretation-3": "Palett",
+       "exif-photometricinterpretation-4": "Genomskinlighetsmask",
+       "exif-photometricinterpretation-5": "Separerad (förmodligen CMYK)",
        "exif-unknowndate": "Okänt datum",
        "exif-orientation-1": "Normal",
        "exif-orientation-2": "Spegelvänd horisontellt",
index 9f36f6c..8c7b63a 100644 (file)
@@ -5,7 +5,8 @@
                        "Nemo bis",
                        "Reedy",
                        "아라",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Raphael Merx"
                ]
        },
        "tog-underline": "Subliña ligasaun sira:",
        "recentchanges-label-newpage": "Pájina foun",
        "recentchanges-label-minor": "Ne'e mudansa ki'ik",
        "recentchanges-label-bot": "Edita husi prosesu automátiku (\"bot\")",
+       "rcfilters-activefilters-hide": "Subar",
+       "rcfilters-activefilters-show": "Hatudu",
+       "rcfilters-savedqueries-remove": "Hapus",
        "rcshowhideminor": "$1 muda ki-ki'ik",
        "rcshowhideminor-show": "Hatudu",
        "rcshowhidebots": "$1 bot sira",
index c10b50b..45c0836 100644 (file)
        "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...",
+       "mw-widgets-usersmultiselect-placeholder": "Daha fazla ekle...",
        "date-range-from": "Şu tarihten:",
        "date-range-to": "Bu güne kadar:",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "çerez tabanlı oturumlar",
index 97b7b83..ba46946 100644 (file)
@@ -55,7 +55,7 @@
        "tog-enotifwatchlistpages": "Күзәтү исемлегемдәге бит яки файл үзгәртелү турында электрон почтага хәбәр җибәрелсен",
        "tog-enotifusertalkpages": "Бәхәс битем үзгәртелү турында электрон почтага хәбәр җибәрелсен",
        "tog-enotifminoredits": "Кече үзгәртүләр турында да электрон почтага хәбәр җибәрелсен",
-       "tog-enotifrevealaddr": "Ð¥Ó\99бÓ\99Ñ\80лÓ\99Ñ\80дÓ\99 e-mail адресым күрсәтелсен",
+       "tog-enotifrevealaddr": "Ð¥Ó\99бÓ\99Ñ\80намÓ\99дÓ\99 Ð¼Ð¸Ð½ÐµÐ¼ Ð¿Ð¾Ñ\87Ñ\82а адресым күрсәтелсен",
        "tog-shownumberswatching": "Битне күзәтү исемлекләренә өстәгән кулланучылар санын күрсәтелсен",
        "tog-oldsig": "Хәзерге имзагыз:",
        "tog-fancysig": "Имзаның шәхси вики-билгеләмәсе (автоматик сылтамасыз)",
        "rcfilters-savedqueries-add-new-title": "Хәзерге фильтр көйләнмәләрен саклау",
        "rcfilters-clear-all-filters": "Барлык филтерләрне чистарту",
        "rcfilters-search-placeholder": "Фильтрланы соңгы үзгәртү (карау яисә кертүне башлау)",
-       "rcfilters-filterlist-feedbacklink": "Әлеге (яңа) фильтрлау кораллары турында турында фикер калдырыгыз",
+       "rcfilters-filterlist-feedbacklink": "Әлеге фильтрлау кораллары турында турында фикер калдырыгыз",
        "rcfilters-filtergroup-authorship": "Үзгәртүләрнең авторлыгы",
        "rcfilters-filter-editsbyself-label": "Сезнең үзгәртүләр",
        "rcfilters-filter-editsbyself-description": "Сезнең кертемегез.",
index b3216a6..65c4cc8 100644 (file)
@@ -37,7 +37,8 @@
                        "Zainab Meher",
                        "Sayam Asjad",
                        "Abdulq",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Dcljr"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "enotif_subject_moved": "{{SITENAME}} میں صفحہ $1 کو $2 نے {{GENDER:$2|منتقل کیا}}",
        "enotif_subject_restored": "{{SITENAME}} میں صفحہ $1 کو $2 نے {{GENDER:$2|بحال کیا}}",
        "enotif_subject_changed": "{{SITENAME}} کے صفحہ $1 میں $2 نے {{GENDER:$2|تبدیلی کی}}",
-       "enotif_body_intro_deleted": "{{SITENAME}} میں صفحہ $1 کو بتاریخ $PAGEEDITDATE صارف $2 نے {{GENDER:$2|حذف کر دیا}} ہے، ملاحظہ فرمائیں $3۔",
+       "enotif_body_intro_deleted": "{{SITENAME}} میں صفحہ $1 کو بتاریخ $PAGEEDITDATE صارف $2 نے {{GENDER:$2|حذف کر دیا}} ہے، ملاحظہ فرمائیں $3 ۔",
        "enotif_body_intro_created": "{{SITENAME}} میں صفحہ $1 کو بتاریخ $PAGEEDITDATE صارف $2 نے {{GENDER:$2|تخلیق کیا}}، موجودہ نسخہ دیکھنے کے لیے $3 ملاحظہ فرمائیں۔",
        "enotif_body_intro_moved": "{{SITENAME}} میں صفحہ $1 کو بتاریخ $PAGEEDITDATE صارف $2 نے {{GENDER:$2|منتقل کر دیا}} ہے، موجودہ نسخہ دیکھنے کے لیے $3 ملاحظہ فرمائیں۔",
        "enotif_body_intro_restored": "{{SITENAME}} میں صفحہ $1 کو بتاریخ $PAGEEDITDATE صارف $2 نے {{GENDER:$2|بحال کیا}}، موجودہ نسخہ دیکھنے کے لیے $3 ملاحظہ فرمائیں۔",
index bad9d86..a05f234 100644 (file)
        "rcfilters-savedqueries-rename": "Đổi tên",
        "rcfilters-savedqueries-setdefault": "Đặt làm mặc định",
        "rcfilters-savedqueries-unsetdefault": "Loại bỏ mặc định",
-       "rcfilters-savedqueries-remove": "Loại bỏ",
+       "rcfilters-savedqueries-remove": "Xóa",
        "rcfilters-savedqueries-new-name-label": "Tên",
        "rcfilters-savedqueries-new-name-placeholder": "Miêu tả mục đích của bộ lọc",
        "rcfilters-savedqueries-apply-label": "Tạo bộ lọc",
        "rcfilters-empty-filter": "Không có bộ lọc hiện hành. Tất cả các đóng góp được hiển thị.",
        "rcfilters-filterlist-title": "Bộ lọc",
        "rcfilters-filterlist-whatsthis": "Chúng hoạt động làm sao?",
-       "rcfilters-filterlist-feedbacklink": "Cho chúng tôi biết bạn cảm thấy sao về các công cụ bộ lọc mới này",
+       "rcfilters-filterlist-feedbacklink": "Hãy cho chúng tôi biết bạn cảm thấy sao về các công cụ bộ lọc này",
        "rcfilters-highlightbutton-title": "Làm nổi bật kết quả",
        "rcfilters-highlightmenu-title": "Chọn màu",
        "rcfilters-highlightmenu-help": "Chọn màu để làm nổi bật thuộc tính này",
        "dellogpage": "Nhật trình xóa",
        "dellogpagetext": "Dưới đây là danh sách các trang bị xóa gần đây nhất.",
        "deletionlog": "nhật trình xóa",
+       "logentry-create-create": "$1 {{GENDER:$2|đã tạo}} trang $3",
        "reverted": "Đã hồi phục một phiên bản cũ",
        "deletecomment": "Lý do:",
        "deleteotherreason": "Lý do khác/bổ sung:",
index bbff36b..7f670e1 100644 (file)
        "recentchangeslinked-feed": "Mga may kalabotan nga binag-o",
        "recentchangeslinked-toolbox": "Mga may kalabotan nga binag-o",
        "recentchangeslinked-title": "Mga pagbag-o kasumpay ha ''$1''",
-       "recentchangeslinked-summary": "Ini nga taramdan hin pagbag-o nga lab-as nga hinimo ha mga pakli nga nakasumpay tikang a naka-specifico nga pakli (o ha api han uska specifico nga kaarangay).\nMga pakli ha [[Special:Watchlist|imo angay timan-an]] in naka-'''bold'''.",
+       "recentchangeslinked-summary": "Ibutang an ngaran han pakli basi maipakita an mga pakli nga nakasumapy pakadto o pakadi hinin nga pakli. (Basi makit-an an mga api hini nga kaarangay, ibutang an {{ns:category}}:Ngaran han kaarangay). An mga binalyuan ha mga pakli ha [[Special:Watchlist|your Watchlist]] nakasurat nga <strong>madakmol</strong>.",
        "recentchangeslinked-page": "Ngaran han pakli:",
        "recentchangeslinked-to": "Igpakita lugod an mga pagbabag-o han mga pakli nga nahisumpay ha ginhatag nga pakli",
        "upload": "Pagkarga hin file",
index edde6a1..fa87948 100644 (file)
        "resetpass-submit-loggedin": "טוישן פאסווארט",
        "resetpass-submit-cancel": "אַנולירן",
        "resetpass-wrong-oldpass": "אומגילטיג צײַטווײַליק אדער לויפֿיק פאַסווארט.\nאיר האט מעגלעך שוין געטוישט אייער פאַסווארט אדער געבעטן א נײַ  צײַטווײַליק פאַסווארט.",
-       "resetpass-recycled": "×\96ײַ×\98 ×\90×\96×\95×\99 ×\92×\95×\98 ×©×\98×¢×\98×\9c ×\90×\99רע ×¤×\90ס×\95×\95×\90ר×\98 ×¦×\95 ×¢×¤×¢×¡ ×\90× ×\93ערש ×¤×\95× ×¢×\9d ×\9c×\95×\99פ×\99ק×\9f ×¤×\90ס×\95×\95×\90רט.",
+       "resetpass-recycled": "×\96×\99×\99×\98 ×\90Ö·×\96×\95×\99 ×\92×\95×\98, ×\91×\99×\99×\98 ×\90×\99×\99ער ×¤Ö¼×\90ַס×\95×\95×\90ָר×\98 ×\90×\95×\99×£ ×¢×¤Ö¼×¢×¡ ×\90Ö·× ×\93ערש ×¤×\95×\9f ×\9c×\95×\99פ×\99ק×\9f ×¤Ö¼×\90ַס×\95×\95×\90Ö¸רט.",
        "resetpass-temp-emailed": "איר האט זיך ארי לאגירת מיט א פראוויזארישן קאד געשיקט דורכן ע־פאסט. כדי שליסן דאס ארײַנלאגירן, דארט איר שטעלן א נײַ פאסווארט דא.",
        "resetpass-temp-password": "צײַטווייליק פאַסווארט:",
        "resetpass-abort-generic": "פאסווארט ענדערונג איז מבוטל געווארן דורך א פארברייטערונג.",
        "resetpass-expired": "אירע פאסווארט איז אויסגעגאנגען. זײַט אזוי גוט שטעלט א נײַ פאסווארט כדי ארײַנלאגירן.",
-       "resetpass-expired-soft": "×\90ײַער ×¤×\90ס×\95×\95×\90ר×\98 ×\90×\99×\96 ×\90×\95×\99ס×\92×¢×\92×\90× ×\92×¢×\9f ×\90×\95×\9f ×\93×\90רף ×\95×\95ער×\9f ×¦×\95ר×\99ק×\92עש×\98×¢×\9c×\98. ×\96ײַ×\98 ×\90×\96×\95×\99 ×\92×\95×\98 ×§×\9c×\95×\99×\91×\98 ×\90 × ×²Ö· ×¤×\90ס×\95×\95×\90ר×\98 ×\90צ×\99× ×\93, ×\90×\93ער ×§×\9c×\99ק×\98 \"{{int:authprovider-resetpass-skip-label}}\" ×\9b×\93×\99 ×¢×¡ ×¦×\95ר×\99קש×\98×¢×\9c×\9f ×©×¤עטער.",
-       "resetpass-validity-soft": "×\90ײַער ×¤×\90ס×\95×\95×\90ר×\98 ×\90×\99×\96 × ×\99ש×\98 ×\92×\99×\9c×\98×\99ק: $1\n\n×\96ײַ×\98 ×\90×\96×\95×\99 ×\92×\95×\98 ×§×\9c×\95×\99×\91×\98 ×\90 × ×²Ö· ×¤×\90ס×\95×\95×\90ר×\98 ×\90צ×\99× ×\93, ×\90×\93ער ×§×\9c×\99ק×\98 \"{{int:authprovider-resetpass-skip-label}}\" ×\9b×\93×\99 ×¢×¡ ×¦×\95ר×\99קש×\98×¢×\9c×\9f ×©×¤עטער.",
+       "resetpass-expired-soft": "×\90×\99×\99ער ×¤Ö¼×\90ַס×\95×\95×\90ָר×\98 ×\90×\99×\96 ×\90×\95×\99ס×\92×¢×\92×\90Ö·× ×\92×¢×\9f ×\90×\95×\9f ×\93×\90ַרף ×¦×\95ר×\99ק×\92עש×\98×¢×\9c×\98 ×\95×\95ער×\9f. ×\96×\99×\99×\98 ×\90Ö·×\96×\95×\99 ×\92×\95×\98, ×§×\9c×\99×\99×\91×\98 ×\90Ö· × ×\99×\99 ×¤Ö¼×\90ַס×\95×\95×\90ָר×\98 ×\90ַצ×\99× ×\93, ×\90Ö¸×\93ער ×§×\9c×\99ק×\98 \"{{int:authprovider-resetpass-skip-label}}\" ×\9b×\93×\99 ×¦×\95 ×\91×\99×\99×\98×\9f ×¢×¡ ×©×¤Ö¼עטער.",
+       "resetpass-validity-soft": "×\90×\99×\99ער ×¤Ö¼×\90ַס×\95×\95×\90ָר×\98 ×\90×\99×\96 × ×\99×\98 ×\92×\99×\9c×\98×\99ק: $1\n\n×\96×\99×\99×\98 ×\90Ö·×\96×\95×\99 ×\92×\95×\98 ×§×\9c×\99×\99×\91×\98 ×\90Ö· × ×\99×\99 ×¤Ö¼×\90ַס×\95×\95×\90ָר×\98 ×\90ַצ×\99× ×\93, ×\90Ö¸×\93ער ×§×\9c×\99ק×\98 \"{{int:authprovider-resetpass-skip-label}}\" ×\9b×\93×\99 ×¦×\95 ×\91×\99×\99×\98×\9f ×¢×¡ ×©×¤Ö¼עטער.",
        "passwordreset": "צוריקשטעלן פאַסווארט",
        "passwordreset-text-one": "דערגאַנצט די פאָרעם צוריקצושטעלן אײַער פאַסווארט.",
        "passwordreset-text-many": "{{PLURAL:$1|דערגאַנצט איינע פֿון די פֿעלדער כדי צו באקומען א פראוויזאריש פאַסווארט דור כן פאסט.}}",
        "rcfilters-savedqueries-defaultlabel": "אױפֿגעהיטענע פֿילטערס",
        "rcfilters-savedqueries-rename": "ענדערן נאמען",
        "rcfilters-savedqueries-setdefault": "האלטן ווי גרונט",
-       "rcfilters-savedqueries-remove": "×\90ר×\90פנע×\9e×¢ן",
+       "rcfilters-savedqueries-remove": "×\90×\95×\99ס×\9eעקן",
        "rcfilters-savedqueries-new-name-label": "נאָמען",
        "rcfilters-savedqueries-apply-label": "שאפן פילטער",
        "rcfilters-savedqueries-cancel-label": "אַנולירן",
        "rcfilters-empty-filter": "קיין אַקטיווע פילטערס. אלע ביישטייערונגען געוויזן.",
        "rcfilters-filterlist-title": "פֿילטערס",
        "rcfilters-filterlist-whatsthis": "ווי ארבעט דאס?",
+       "rcfilters-filterlist-feedbacklink": "זאָגט אונדז וואָס איז אייער מיינונג בנוגע פילטער אינסטרומענטן",
        "rcfilters-highlightbutton-title": "ארויסשטאַרצן רעזולטאַטן",
        "rcfilters-highlightmenu-title": "אויסקלויבן א קאליר",
        "rcfilters-filterlist-noresults": "קיין פֿילטערס נישט געטראפֿן",
        "log-action-filter-protect-unprotect": "אראפנעמען שיץ",
        "authmanager-userdoesnotexist": "באניצער קאנטע \"$1\" איז נישט איינגעשריבן.",
        "authmanager-realname-label": "עכטער נאָמען",
+       "authprovider-resetpass-skip-label": "איבערהיפן",
        "revid": "רעוויזיע $1"
 }
index 297bd33..2ed7c43 100644 (file)
        "search-section": "(ⴰⵙⴱⴹⵓ $1)",
        "search-suggest": "ⵉⵙ ⵜⵅⵙⴷ ⴰⴷ ⵜⵉⵏⵉⴷ: $1",
        "search-interwiki-more": "(ⵓⴳⴳⴰⵔ)",
-       "searchall": "ⴰⴽⴽ",
+       "searchall": "âµ\8eâ´°âµ\95âµ\95â´°",
        "search-nonefound": "ⵓⵔ ⵍⵍⵉⵏⵜ ⵜⵢⴰⴼⵓⵜⵉⵏ ⵉⵎⵙⴰⵙⴰⵏ ⴷ ⵓⵙⵓⵜⵔ.",
+       "powersearch-toggleall": "ⵎⴰⵕⵕⴰ",
        "mypreferences": "ⵉⵙⵎⵏⵢⵉⴼⵏ",
        "prefs-watchlist-days": "ⵓⵙⵙⴰⵏ ⵜⵓⵙⴽⵏⵉⵏ ⴳ ⵓⵎⵓⵖ ⵓⵙⵎⵓⵇⵇⵍ",
        "recentchangesdays": "ⵓⵙⵙⴰⵏ ⵜⵓⵙⴽⵏⵉⵏ ⴳ ⵉⵙⵏⴼⵉⵍⵏ ⵉⵎⴳⴳⵓⵔⴰ",
        "prefs-signature": "ⴰⵙⴳⵎⴹ",
        "userrights-reason": "ⵜⴰⵎⵏⵜⵉⵍⵜ:",
        "group-sysop": "ⵉⵏⵎⵀⴰⵍⵏ",
+       "group-all": "(ⵎⴰⵕⵕⴰ)",
        "right-edit": "ⵙⵏⴼⵍ ⵜⴰⵙⵏⵉⵡⵉⵏ",
        "right-upload": "ⵙⴽⵜⵔ ⵉⴼⴰⵢⵍⵓⵜⵏ",
        "right-upload_by_url": "ⵙⴽⵜⵔ ⴰⴼⴰⵢⵍⵓ ⵙⴳ URL",
        "booksources-search-legend": "ⵔⵣⵓ ⵅⴼ ⵉⴷⵍⵉⵙⵏ ⵏ ⵓⵙⴰⴳⵎ",
        "booksources-search": "ⵔⵣⵓ",
        "log": "ⵉⵣⵎⵎⴻⵎⵏ",
+       "checkbox-all": "ⵎⴰⵕⵕⴰ",
        "allpages": "ⵎⴰⵕⵕⴰ ⵜⴰⵙⵏⵉⵡⵉⵏ",
        "allarticles": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴽⴽ",
        "allpagessubmit": "ⴷⴷⵓ",
        "categories": "ⵉⵙⵎⵉⵍⵏ",
        "sp-deletedcontributions-contribs": "ⵜⵓⵎⵓⵜⵉⵏ",
        "listgrouprights-members": "ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵉⴳⵎⴰⵎⵏ",
+       "emailmessage": "ⵜⵓⵣⵉⵏⵜ:",
        "usermessage-editor": "ⵓⴷⵓⵙ ⵏ ⵓⵎⵢⴰⵣⴰⵏ",
        "watchlist": "ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
        "mywatchlist": "ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
        "delete_and_move_confirm": "ⵢⴰⵀ, ⴽⴽⵙ ⵜⴰⵙⵏⴰ",
        "export": "ⵙⵙⵓⴼⵖ ⵜⴰⵙⵏⵉⵡⵉⵏ",
        "allmessagesname": "ⵉⵙⵎ",
+       "allmessages-filter-all": "ⵎⴰⵕⵕⴰ",
        "allmessages-language": "ⵜⵓⵜⵍⴰⵢⵜ:",
        "allmessages-filter-translate": "ⵙⵙⵓⵖⵍ",
        "thumbnail-more": "ⵙⵙⵉⵎⵖⵓⵔ",
        "watchlisttools-clear": "ⵙⴼⴹ ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
        "watchlisttools-view": "ⵙⴽⵏ ⵉⵙⵏⵉⴼⵉⵍⵏ ⴷ ⵢⵓⵙⴰⵏ",
        "watchlisttools-edit": "ⵥⵕ ⴷ ⵜⵙⵏⴼⵍⴷ ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
+       "version-poweredby-translators": "ⵉⵎⵙⵖⵓⵍⵏ ⵏ translatewiki.net",
        "redirect-submit": "ⴷⴷⵓ",
        "redirect-value": "ⴰⵣⴰⵍ",
        "redirect-user": "ID ⵏ ⵓⵎⵙⵙⵎⵔⵙ",
        "logentry-newusers-create": "{{GENDER:$2|ⵉⵙⵏⴼⵍ ⵓⵏⵙⵙⵎⵔⵙ|ⵜⵙⵏⴼⵍ ⵜⵏⵙⵙⵎⵔⵙⵜ}} $1 ⴰⵎⵉⴹⴰⵏ ⵏⵙ",
        "logentry-upload-upload": "{{GENDER:$2|ⵉⵙⴽⵜⵔ|ⵜⵙⴽⵜⵔ}} $1 $3",
        "rightsnone": "(ⵓⵍⴰ ⵢⴰⵏ)",
+       "feedback-message": "ⵜⵓⵣⵉⵏⵜ:",
        "feedback-thanks-title": "ⵜⴰⵏⵎⵎⵉⵔⵜ!",
        "searchsuggest-search": "ⵔⵣⵓ ⴳ {{SITENAME}}",
        "duration-days": "$1 ⵏ {{PLURAL:$1|ⵡⴰⵙⵙ|ⵡⵓⵙⵙⴰⵏ}}",
index 5bb1a43..0bc666c 100644 (file)
        "resetpass-submit-loggedin": "更改密码",
        "resetpass-submit-cancel": "取消",
        "resetpass-wrong-oldpass": "临时密码或当前密码无效。您可能已经更改了您的密码,或者请求了新的临时密码。",
-       "resetpass-recycled": "请重置您的密码为与当前密码不同的密码。",
+       "resetpass-recycled": "请更改您的密码为与当前密码不同的密码。",
        "resetpass-temp-emailed": "您使用了通过电子邮件发送的临时密码登录。要完成登录,您必须在此设置一个新密码:",
        "resetpass-temp-password": "临时密码:",
        "resetpass-abort-generic": "密码更改已经被扩展程序中止。",
        "resetpass-expired": "您的密码已经到期。请设置新登录密码。",
-       "resetpass-expired-soft": "您的密码已经到期,需要重置。请现在更换新密码,或单击“{{int:authprovider-resetpass-skip-label}}”以稍后重置。",
-       "resetpass-validity-soft": "您的密码无效:$1\n\n请选择一个新密码,或单击“{{int:authprovider-resetpass-skip-label}}”以稍后重置。",
+       "resetpass-expired-soft": "您的密码已经到期,需要更改。请现在更换新密码,或单击“{{int:authprovider-resetpass-skip-label}}”以稍后更改。",
+       "resetpass-validity-soft": "您的密码无效:$1\n\n请选择一个新密码,或单击“{{int:authprovider-resetpass-skip-label}}”以稍后更改。",
        "passwordreset": "重置密码",
        "passwordreset-text-one": "请完成此表单来通过电子邮件接收临时密码。",
        "passwordreset-text-many": "{{PLURAL:$1|填写其中一个字段以通过电子邮件接收临时密码。}}",
        "rcfilters-other-review-tools": "其他复核工具",
        "rcfilters-group-results-by-page": "按页面分组结果",
        "rcfilters-activefilters": "应用的过滤器",
+       "rcfilters-activefilters-hide": "隐藏",
+       "rcfilters-activefilters-show": "显示",
        "rcfilters-advancedfilters": "高级过滤器",
        "rcfilters-limit-title": "要显示的结果",
        "rcfilters-limit-and-date-label": "$1次{{PLURAL:$1|更改}},$2",
        "rcfilters-savedqueries-rename": "重命名",
        "rcfilters-savedqueries-setdefault": "设置为默认",
        "rcfilters-savedqueries-unsetdefault": "移除为默认",
-       "rcfilters-savedqueries-remove": "除",
+       "rcfilters-savedqueries-remove": "除",
        "rcfilters-savedqueries-new-name-label": "名称",
        "rcfilters-savedqueries-new-name-placeholder": "描述过滤器目的",
        "rcfilters-savedqueries-apply-label": "创建过滤器",
        "rcfilters-empty-filter": "没有应用的过滤器。所有贡献都已显示。",
        "rcfilters-filterlist-title": "过滤器",
        "rcfilters-filterlist-whatsthis": "这些是怎样工作的?",
-       "rcfilters-filterlist-feedbacklink": "告诉我们您对这些(新)过滤工具有什么想法",
+       "rcfilters-filterlist-feedbacklink": "告诉我们您对这些过滤工具有什么想法",
        "rcfilters-highlightbutton-title": "高亮结果",
        "rcfilters-highlightmenu-title": "选择颜色",
        "rcfilters-highlightmenu-help": "选择颜色来高亮该属性",
index 40d7f2b..626a454 100644 (file)
        "resetpass-submit-loggedin": "變更密碼",
        "resetpass-submit-cancel": "取消",
        "resetpass-wrong-oldpass": "無效的臨時或現有密碼。\n您可能已經變更了密碼,或者已經請求一個新的臨時密碼。",
-       "resetpass-recycled": "請重設您的密碼為一個與目前不同的密碼。",
+       "resetpass-recycled": "請將您的密碼更改成與目前內容不同的密碼。",
        "resetpass-temp-emailed": "您使用臨時電子郵件傳送的密碼登入。\n要完成登入,您必須在這裡設定一個新密碼:",
        "resetpass-temp-password": "臨時密碼:",
        "resetpass-abort-generic": "擴充套件已中止了變更密碼的操作。",
        "resetpass-expired": "您的密碼已過期。請設定一個新的密碼以登入。",
-       "resetpass-expired-soft": "您的密碼已過期,需要重新設定。請現在設定您的新密碼,或點選 \"{{int:authprovider-resetpass-skip-label}}\" 稍後再重設。",
-       "resetpass-validity-soft": "您的密碼無效:$1 \n\n請現在設定您的新密碼,或點選 \"{{int:authprovider-resetpass-skip-label}}\" 稍後再重設。",
+       "resetpass-expired-soft": "您的密碼已過期,需要作出更改。請現在設定您的新密碼,或點選 \"{{int:authprovider-resetpass-skip-label}}\" 來事後更改。",
+       "resetpass-validity-soft": "您的密碼無效:$1 \n\n請現在設定您的新密碼,或點選 \"{{int:authprovider-resetpass-skip-label}}\" 來事後更改。",
        "passwordreset": "重新設定密碼",
        "passwordreset-text-one": "完成此表單,透過電子郵件傳送臨時密碼以重新設定您的密碼。",
        "passwordreset-text-many": "{{PLURAL:$1|填寫其中一個欄位以透過電子郵件接收臨時密碼。}}",
        "rcfilters-other-review-tools": "其他檢閱工具",
        "rcfilters-group-results-by-page": "按頁面分組結果",
        "rcfilters-activefilters": "使用的篩選器",
+       "rcfilters-activefilters-hide": "隱藏",
+       "rcfilters-activefilters-show": "顯示",
        "rcfilters-advancedfilters": "進階查詢條件",
        "rcfilters-limit-title": "要顯示的結果",
        "rcfilters-limit-and-date-label": "$1次{{PLURAL:$1|變更}},$2",
        "rcfilters-savedqueries-rename": "重新命名",
        "rcfilters-savedqueries-setdefault": "設為預設",
        "rcfilters-savedqueries-unsetdefault": "取消設為預設",
-       "rcfilters-savedqueries-remove": "除",
+       "rcfilters-savedqueries-remove": "除",
        "rcfilters-savedqueries-new-name-label": "名稱",
        "rcfilters-savedqueries-new-name-placeholder": "說明查詢條件的用途",
        "rcfilters-savedqueries-apply-label": "建立查詢條件",
        "rcfilters-empty-filter": "沒有使用中的過濾條件。已顯示所有的貢獻。",
        "rcfilters-filterlist-title": "過濾條件",
        "rcfilters-filterlist-whatsthis": "這些是怎樣工作的?",
-       "rcfilters-filterlist-feedbacklink": "告訴我們您對這些(新)過濾工具有什麼想法",
+       "rcfilters-filterlist-feedbacklink": "告訴我們您對這些過濾工具有什麼想法",
        "rcfilters-highlightbutton-title": "明顯標示結果",
        "rcfilters-highlightmenu-title": "選擇顏色",
        "rcfilters-highlightmenu-help": "選擇要明顯標示此屬性的色彩",
diff --git a/maintenance/populateChangeTagDef.php b/maintenance/populateChangeTagDef.php
new file mode 100644 (file)
index 0000000..c815d8d
--- /dev/null
@@ -0,0 +1,192 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Populate and improve accuracy of change_tag_def statistics.
+ *
+ * @ingroup Maintenance
+ */
+class PopulateChangeTagDef extends Maintenance {
+       /** @var Wikimedia\Rdbms\LBFactory */
+       protected $lbFactory;
+
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription( 'Populate and improve accuracy of change_tag_def statistics' );
+               $this->addOption( 'dry-run', 'Print debug info instead of actually deleting' );
+               $this->setBatchSize( 1000 );
+               $this->addOption(
+                       'sleep',
+                       'Sleep time (in seconds) between every batch',
+                       false,
+                       true
+               );
+               $this->lbFactory = MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+       }
+
+       public function execute() {
+               global $wgChangeTagsSchemaMigrationStage;
+               $this->setBatchSize( $this->getOption( 'batch-size', $this->getBatchSize() ) );
+
+               $this->countDown( 5 );
+               if ( $wgChangeTagsSchemaMigrationStage < MIGRATION_NEW ) {
+                       $this->updateCountTag();
+                       $this->backpopulateChangeTagId();
+               } else {
+                       $this->updateCountTagId();
+               }
+
+               // TODO: Implement
+               // $this->cleanZeroCountRows();
+       }
+
+       private function updateCountTagId() {
+               $dbr = $this->lbFactory->getMainLB()->getConnection( DB_REPLICA );
+
+               // This query can be pretty expensive, don't run it on master
+               $res = $dbr->select(
+                       'change_tag',
+                       [ 'ct_tag_id', 'hitcount' => 'count(*)' ],
+                       [],
+                       __METHOD__,
+                       [ 'GROUP BY' => 'ct_tag_id' ]
+               );
+
+               $dbw = $this->lbFactory->getMainLB()->getConnection( DB_MASTER );
+
+               foreach ( $res as $row ) {
+                       if ( !$row->ct_tag_id ) {
+                               continue;
+                       }
+
+                       if ( $this->hasOption( 'dry-run' ) ) {
+                               $this->output( 'This row will be updated: ' . implode( ', ', $row ) . "\n" );
+                               continue;
+                       }
+
+                       $dbw->update(
+                               'change_tag_def',
+                               [ 'ctd_count' => $row->hitcount ],
+                               [ 'ctd_id' => $row->ct_tag_id ],
+                               __METHOD__
+                       );
+               }
+               $this->lbFactory->waitForReplication();
+       }
+
+       private function updateCountTag() {
+               $dbr = $this->lbFactory->getMainLB()->getConnection( DB_REPLICA );
+
+               // This query can be pretty expensive, don't run it on master
+               $res = $dbr->select(
+                       'change_tag',
+                       [ 'ct_tag', 'hitcount' => 'count(*)' ],
+                       [],
+                       __METHOD__,
+                       [ 'GROUP BY' => 'ct_tag' ]
+               );
+
+               $dbw = $this->lbFactory->getMainLB()->getConnection( DB_MASTER );
+
+               foreach ( $res as $row ) {
+                       // Hygiene check
+                       if ( !$row->ct_tag ) {
+                               continue;
+                       }
+
+                       if ( $this->hasOption( 'dry-run' ) ) {
+                               $this->output( 'This row will be updated: ' . $row->ct_tag . $row->hitcount . "\n" );
+                               continue;
+                       }
+
+                       $dbw->upsert(
+                               'change_tag_def',
+                               [
+                                       'ctd_name' => $row->ct_tag,
+                                       'ctd_user_defined' => 0,
+                                       'ctd_count' => $row->hitcount
+                               ],
+                               [ 'ctd_name' ],
+                               [ 'ctd_count' => $row->hitcount ],
+                               __METHOD__
+                       );
+               }
+               $this->lbFactory->waitForReplication();
+       }
+
+       private function backpopulateChangeTagId() {
+               $dbr = $this->lbFactory->getMainLB()->getConnection( DB_REPLICA );
+               $changeTagDefs = $dbr->select(
+                       'change_tag_def',
+                       [ 'ctd_name', 'ctd_id' ],
+                       [],
+                       __METHOD__
+               );
+
+               foreach ( $changeTagDefs as $row ) {
+                       $this->backpopulateChangeTagPerTag( $row->ctd_name, $row->ctd_id );
+               }
+       }
+
+       private function backpopulateChangeTagPerTag( $tagName, $tagId ) {
+               $dbr = $this->lbFactory->getMainLB()->getConnection( DB_REPLICA );
+               $dbw = $this->lbFactory->getMainLB()->getConnection( DB_MASTER );
+               $sleep = (int)$this->getOption( 'sleep', 10 );
+               $lastId = 0;
+               while ( true ) {
+                       // Given that indexes might not be there, it's better to use replica
+                       $ids = $dbr->selectFieldValues(
+                               'change_tag',
+                               'ct_id',
+                               [ 'ct_tag' => $tagName, 'ct_tag_id' => null, 'ct_id > ' . $lastId ],
+                               __METHOD__,
+                               [ 'LIMIT' => $this->getBatchSize() ]
+                       );
+
+                       if ( !$ids ) {
+                               break;
+                       }
+                       $lastId = end( $ids );
+
+                       if ( $this->hasOption( 'dry-run' ) ) {
+                               $this->output(
+                                       "These ids will be changed to have \"{$tagId}\" as tag id: " . implode( ', ', $ids ) . "\n"
+                               );
+                               continue;
+                       }
+
+                       $dbw->update(
+                               'change_tag',
+                               [ 'ct_tag_id' => $tagId ],
+                               [ 'ct_id' => $ids ],
+                               __METHOD__
+                       );
+
+                       $this->lbFactory->waitForReplication();
+                       if ( $sleep > 0 ) {
+                               sleep( $sleep );
+                       }
+               }
+       }
+
+}
+
+$maintClass = PopulateChangeTagDef::class;
+require_once RUN_MAINTENANCE_IF_MAIN;
index 49f1cd1..9ca4e98 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IDatabase;
 
 require_once __DIR__ . '/Maintenance.php';
@@ -258,7 +259,7 @@ class RefreshLinks extends Maintenance {
        public static function fixLinksFromArticle( $id, $ns = false ) {
                $page = WikiPage::newFromID( $id );
 
-               LinkCache::singleton()->clear();
+               MediaWikiServices::getInstance()->getLinkCache()->clear();
 
                if ( $page === null ) {
                        return;
index f99bb7d..fd7b860 100755 (executable)
@@ -38,9 +38,9 @@ fi
 
 # Copy file(s)
 rsync --force ./node_modules/oojs/dist/oojs.jquery.js "$REPO_DIR/$TARGET_DIR"
-rsync --force ./node_modules/oojs/dist/AUTHORS.txt "$REPO_DIR/$TARGET_DIR"
-rsync --force ./node_modules/oojs/dist/LICENSE-MIT "$REPO_DIR/$TARGET_DIR"
-rsync --force ./node_modules/oojs/dist/README.md "$REPO_DIR/$TARGET_DIR"
+rsync --force ./node_modules/oojs/AUTHORS.txt "$REPO_DIR/$TARGET_DIR"
+rsync --force ./node_modules/oojs/LICENSE-MIT "$REPO_DIR/$TARGET_DIR"
+rsync --force ./node_modules/oojs/README.md "$REPO_DIR/$TARGET_DIR"
 
 # Clean up temporary area
 rm -rf "$NPM_DIR"
index 36328e0..45533aa 100644 (file)
     "eslint": "4.9.0",
     "eslint-config-wikimedia": "0.5.0",
     "eslint-plugin-qunit": "3.2.1",
-    "grunt": "1.0.1",
+    "grunt": "1.0.3",
     "grunt-banana-checker": "0.6.0",
     "grunt-contrib-copy": "1.0.0",
-    "grunt-contrib-watch": "1.0.1",
+    "grunt-contrib-watch": "1.1.0",
     "grunt-eslint": "20.1.0",
     "grunt-jsonlint": "1.1.0",
     "grunt-karma": "2.0.0",
index 93ef4b1..69e9a2b 100644 (file)
@@ -321,17 +321,10 @@ return [
                'styles' => 'resources/src/jquery.tablesorter/jquery.tablesorter.less',
                'messages' => [ 'sort-descending', 'sort-ascending' ],
                'dependencies' => [
-                       'jquery.tablesorter.styles',
                        'mediawiki.RegExp',
                        'mediawiki.language.months',
                ],
        ],
-       'jquery.tablesorter.styles' => [
-               'targets' => [ 'desktop', 'mobile' ],
-               'styles' => [
-                       'resources/src/jquery/jquery.tablesorter.styles.less',
-               ],
-       ],
        'jquery.textSelection' => [
                'scripts' => 'resources/src/jquery/jquery.textSelection.js',
                'dependencies' => 'jquery.client',
@@ -1894,6 +1887,8 @@ return [
                'messages' => [
                        'rcfilters-tag-remove',
                        'rcfilters-activefilters',
+                       'rcfilters-activefilters-hide',
+                       'rcfilters-activefilters-show',
                        'rcfilters-advancedfilters',
                        'rcfilters-group-results-by-page',
                        'rcfilters-limit-title',
index ec14576..b99230a 100644 (file)
@@ -71,7 +71,7 @@ $ git remote update
 $ git checkout -B release -t origin/master
 
 # Ensure tests pass
-$ npm install && npm test
+$ npm install-test
 
 # Avoid using "npm version patch" because that creates
 # both a commit and a tag, and we shouldn't tag until after
index b51c5d1..3f400cd 100644 (file)
@@ -1,17 +1,18 @@
 /*!
- * OOjs v2.2.0 optimised for jQuery
+ * OOjs v2.2.2 optimised for jQuery
  * https://www.mediawiki.org/wiki/OOjs
  *
  * Copyright 2011-2018 OOjs Team and other contributors.
  * Released under the MIT license
  * https://oojs.mit-license.org
  *
- * Date: 2018-04-03T19:45:13Z
+ * Date: 2018-06-14T20:13:14Z
  */
 ( function ( global ) {
 
 'use strict';
 
+/* exported toString */
 var
        /**
         * Namespace for all classes, static methods and static properties.
@@ -21,8 +22,6 @@ var
        oo = {},
        // Optimisation: Local reference to Object.prototype.hasOwnProperty
        hasOwn = oo.hasOwnProperty,
-       // Marking this as "exported" doesn't work when parserOptions.sourceType is module
-       // eslint-disable-next-line no-unused-vars
        toString = oo.toString;
 
 /* Class Methods */
index 3bea471..ce24b0d 100644 (file)
@@ -8,10 +8,7 @@ table.jquery-tablesorter {
                cursor: pointer;
                background-repeat: no-repeat;
                background-position: center right;
-               // Note: To avoid reflows, a padding is set in
-               // the jquery.tableSorter.styles module as a render blocking style.
-               // Please do not add any CSS rules here that impact the positioning of the element
-               // e.g. padding, margin, position or float.
+               padding-right: 21px;
        }
 
        th.headerSortUp {
diff --git a/resources/src/jquery/jquery.tablesorter.styles.less b/resources/src/jquery/jquery.tablesorter.styles.less
deleted file mode 100644 (file)
index eda939d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-.client-js {
-       // Reserve space for table sortable controls
-       table.sortable > thead > tr > th:not( .unsortable ) {
-               padding-right: 21px;
-       }
-}
index d81df65..4f9e43a 100644 (file)
         * e.g.
         *
         *        $.fn.msg = mediaWiki.jqueryMsg.getPlugin( options );
-        *        var userlink = $( '<a>' ).click( function () { alert( "hello!!" ) } );
-        *        $( 'p#headline' ).msg( 'hello-user', userlink );
+        *        var $userlink = $( '<a>' ).click( function () { alert( "hello!!" ) } );
+        *        $( 'p#headline' ).msg( 'hello-user', $userlink );
         *
         * N.B. replacements are variadic arguments or an array in second parameter. In other words:
         *    somefunction( a, b, c, d )
         * @return {jQuery}
         */
        mw.Message.prototype.parseDom = ( function () {
-               var reusableParent = $( '<div>' );
+               var $wrapper = $( '<div>' );
                return function () {
-                       return reusableParent.msg( this.key, this.parameters ).contents().detach();
+                       return $wrapper.msg( this.key, this.parameters ).contents().detach();
                };
        }() );
 
index 148e37b..83ca2bd 100644 (file)
                border-bottom: 0;
                background-color: @colorGray15;
                border-radius: 2px 2px 0 0;
-               padding: 0.6em;
+               padding: 0 0.6em 0.6em 0.6em;
                margin-top: 1em;
                line-height: normal;
        }
 
+       &-collapsed {
+               // Taking from the handle, since border-bottom is set on the
+               // filters view which is hidden when collapsed
+               border-bottom: 1px solid @colorGray10;
+
+               &.mw-rcfilters-ui-filterTagMultiselectWidget.oo-ui-widget-enabled .oo-ui-tagMultiselectWidget-handle {
+                       padding-bottom: 0;
+                       padding-top: 0;
+               }
+
+               .mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-hideshow {
+                       border-left: 1px solid @colorGray10;
+               }
+
+               &.oo-ui-tagMultiselectWidget-outlined {
+                       width: unset;
+                       max-width: 100%;
+               }
+
+               // Hide inner elements
+               .mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-filters,
+               .mw-rcfilters-ui-filterTagMultiselectWidget-views {
+                       display: none;
+               }
+       }
+
        .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled &-animate.oo-ui-tagMultiselectWidget-handle {
                .transition( background-color 500ms ease-out );
        }
                background-color: @background-color-primary;
        }
 
+       &-hideshowButton.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+               // Override the OOUI default for buttons
+               font-weight: normal;
+       }
+
        &-wrapper {
-               .mw-rcfilters-ui-table {
-                       margin-top: 0.3em;
+               &-top {
+                       display: flex;
+                       flex-wrap: nowrap;
+                       justify-content: space-between;
+               }
+
+               &-title {
+                       padding: 0.6em 0; // Same top padding as the handle
+                       white-space: nowrap;
+                       min-width: 0; // This has to be here to enable the text truncation
+                       overflow: hidden;
+                       text-overflow: ellipsis;
+               }
+
+               &-hideshow {
+                       margin-left: 0.5em;
+                       padding-left: 0.5em;
                }
 
                &-content {
                        &-title {
                                font-weight: bold;
                                color: @colorGray5;
+                               white-space: nowrap;
                        }
 
                        &-savedQueryTitle {
                                color: @colorGray2;
+                               padding-left: 1em;
                                font-weight: bold;
                                vertical-align: top;
-                               margin-left: 1em;
-                               width: ~'calc( 100% - 10em )';
                                overflow: hidden;
                                text-overflow: ellipsis;
                                white-space: nowrap;
index 953df5b..5df7032 100644 (file)
                        classes: [ 'mw-rcfilters-ui-filterTagMultiselectWidget-resetButton' ]
                } );
 
+               this.hideShowButton = new OO.ui.ButtonWidget( {
+                       framed: false,
+                       flags: [ 'progressive' ],
+                       label: mw.msg( 'rcfilters-activefilters-hide' ),
+                       classes: [ 'mw-rcfilters-ui-filterTagMultiselectWidget-hideshowButton' ]
+               } );
+               this.collapsed = false;
+
                if ( !mw.user.isAnon() ) {
                        this.saveQueryButton = new mw.rcfilters.ui.SaveFiltersPopupButtonWidget(
                                this.controller,
 
                // Events
                this.resetButton.connect( this, { click: 'onResetButtonClick' } );
+               this.hideShowButton.connect( this, { click: 'onHideShowButtonClick' } );
                // Stop propagation for mousedown, so that the widget doesn't
                // trigger the focus on the input and scrolls up when we click the reset button
                this.resetButton.$element.on( 'mousedown', function ( e ) { e.stopPropagation(); } );
+               this.hideShowButton.$element.on( 'mousedown', function ( e ) { e.stopPropagation(); } );
                this.model.connect( this, {
                        initialize: 'onModelInitialize',
                        update: 'onModelUpdate',
                                .append(
                                        $( '<div>' )
                                                .addClass( 'mw-rcfilters-ui-row' )
+                                               .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-views' )
                                                .append(
                                                        $( '<div>' )
                                                                .addClass( 'mw-rcfilters-ui-cell' )
 
                // Build the content
                $contentWrapper.append(
-                       title.$element,
-                       this.savedQueryTitle.$element,
                        $( '<div>' )
-                               .addClass( 'mw-rcfilters-ui-table' )
+                               .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-top' )
                                .append(
-                                       rcFiltersRow
-                               )
+                                       $( '<div>' )
+                                               .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-title' )
+                                               .append(
+                                                       title.$element,
+                                                       this.savedQueryTitle.$element
+                                               ),
+                                       $( '<div>' )
+                                               .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-hideshow' )
+                                               .append(
+                                                       this.hideShowButton.$element
+                                               )
+                               ),
+                       $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-table' )
+                               .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-filters' )
+                               .append( rcFiltersRow )
                );
 
                // Initialize
         * @inheritdoc
         */
        mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onMouseDown = function ( e ) {
-               if ( !this.isDisabled() && e.which === OO.ui.MouseButtons.LEFT ) {
+               if ( !this.collapsed && !this.isDisabled() && e.which === OO.ui.MouseButtons.LEFT ) {
                        this.menu.toggle();
 
                        return false;
                }
        };
 
+       /**
+        * Respond to hide/show button click
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onHideShowButtonClick = function () {
+               this.toggleCollapsed();
+       };
+
+       /**
+        * Toggle the collapsed state of the filters widget
+        *
+        * @param {boolean} isCollapsed Widget is collapsed
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.toggleCollapsed = function ( isCollapsed ) {
+               isCollapsed = isCollapsed === undefined ? !this.collapsed : !!isCollapsed;
+
+               if ( this.collapsed !== isCollapsed ) {
+                       this.collapsed = isCollapsed;
+
+                       if ( isCollapsed ) {
+                               // If we are collapsing, close the menu, in case it was open
+                               // We should make sure the menu closes before the rest of the elements
+                               // are hidden, otherwise there is an unknown error in jQuery as ooui
+                               // sets and unsets properties on the input (which is hidden at that point)
+                               this.menu.toggle( false );
+                       }
+                       this.input.setDisabled( isCollapsed );
+                       this.hideShowButton.setLabel( mw.msg(
+                               isCollapsed ? 'rcfilters-activefilters-show' : 'rcfilters-activefilters-hide'
+                       ) );
+
+                       this.$element.toggleClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-collapsed', isCollapsed );
+               }
+       };
+
        /**
         * Reevaluate the restore state for the widget between setting to defaults and clearing all filters
         */
index f65a257..6558bda 100644 (file)
@@ -1,12 +1,38 @@
 ( function ( mw, $ ) {
+
+       // Return a promise that is resolved when the element is blurred (loses focus).
+       // If it already is blurred, resolved immediately.
+       function whenBlurred( $elem ) {
+               var deferred = $.Deferred();
+               if ( $elem.is( ':focus' ) ) {
+                       $elem.one( 'blur', deferred.resolve );
+               } else {
+                       deferred.resolve();
+               }
+               return deferred.promise();
+       }
+
        $( function () {
-               var startInput = mw.widgets.DateInputWidget.static.infuse( 'mw-date-start' ),
-                       endInput = mw.widgets.DateInputWidget.static.infuse( 'mw-date-end' );
+               var startReady, endReady;
+
+               // Do not infuse the date input while it has user focus.
+               // This is especially important on Firefox, where hiding the native date input while the native
+               // date picker is open will cause the date picker to remain visible (but non-functional), but
+               // not replacing the interface while the user is working with it is probably a good idea anyway.
+               startReady = whenBlurred( $( '#mw-date-start .oo-ui-inputWidget-input' ) ).then( function () {
+                       return mw.widgets.DateInputWidget.static.infuse( 'mw-date-start' );
+               } );
+               endReady = whenBlurred( $( '#mw-date-end .oo-ui-inputWidget-input' ) ).then( function () {
+                       return mw.widgets.DateInputWidget.static.infuse( 'mw-date-end' );
+               } );
 
-               startInput.on( 'deactivate', function ( userSelected ) {
-                       if ( userSelected ) {
-                               endInput.focus();
-                       }
+               $.when( startReady, endReady ).then( function ( startInput, endInput ) {
+                       startInput.on( 'deactivate', function ( userSelected ) {
+                               if ( userSelected ) {
+                                       endInput.focus();
+                               }
+                       } );
                } );
        } );
+
 }( mediaWiki, jQuery ) );
index 43ee202..9683570 100644 (file)
 ( function () {
        'use strict';
 
-       var slice = Array.prototype.slice;
+       var slice = Array.prototype.slice,
+               mwLoaderTrack = mw.track,
+               trackCallbacks = $.Callbacks( 'memory' ),
+               trackHandlers = [],
+               hasOwn = Object.prototype.hasOwnProperty;
 
        /**
         * Object constructor for messages.
        mw.msg = function () {
                return mw.message.apply( mw.message, arguments ).toString();
        };
+
+       /**
+        * Track an analytic event.
+        *
+        * This method provides a generic means for MediaWiki JavaScript code to capture state
+        * information for analysis. Each logged event specifies a string topic name that describes
+        * the kind of event that it is. Topic names consist of dot-separated path components,
+        * arranged from most general to most specific. Each path component should have a clear and
+        * well-defined purpose.
+        *
+        * Data handlers are registered via `mw.trackSubscribe`, and receive the full set of
+        * events that match their subcription, including those that fired before the handler was
+        * bound.
+        *
+        * @param {string} topic Topic name
+        * @param {Object} [data] Data describing the event, encoded as an object
+        */
+       mw.track = function ( topic, data ) {
+               mwLoaderTrack( topic, data );
+               trackCallbacks.fire( mw.trackQueue );
+       };
+
+       /**
+        * Register a handler for subset of analytic events, specified by topic.
+        *
+        * Handlers will be called once for each tracked event, including any events that fired before the
+        * handler was registered; 'this' is set to a plain object with a 'timeStamp' property indicating
+        * the exact time at which the event fired, a string 'topic' property naming the event, and a
+        * 'data' property which is an object of event-specific data. The event topic and event data are
+        * also passed to the callback as the first and second arguments, respectively.
+        *
+        * @param {string} topic Handle events whose name starts with this string prefix
+        * @param {Function} callback Handler to call for each matching tracked event
+        * @param {string} callback.topic
+        * @param {Object} [callback.data]
+        */
+       mw.trackSubscribe = function ( topic, callback ) {
+               var seen = 0;
+               function handler( trackQueue ) {
+                       var event;
+                       for ( ; seen < trackQueue.length; seen++ ) {
+                               event = trackQueue[ seen ];
+                               if ( event.topic.indexOf( topic ) === 0 ) {
+                                       callback.call( event, event.topic, event.data );
+                               }
+                       }
+               }
+
+               trackHandlers.push( [ handler, callback ] );
+
+               trackCallbacks.add( handler );
+       };
+
+       /**
+        * Stop handling events for a particular handler
+        *
+        * @param {Function} callback
+        */
+       mw.trackUnsubscribe = function ( callback ) {
+               trackHandlers = trackHandlers.filter( function ( fns ) {
+                       if ( fns[ 1 ] === callback ) {
+                               trackCallbacks.remove( fns[ 0 ] );
+                               // Ensure the tuple is removed to avoid holding on to closures
+                               return false;
+                       }
+                       return true;
+               } );
+       };
+
+       // Fire events from before track() triggred fire()
+       trackCallbacks.fire( mw.trackQueue );
+
+       /**
+        * Registry and firing of events.
+        *
+        * MediaWiki has various interface components that are extended, enhanced
+        * or manipulated in some other way by extensions, gadgets and even
+        * in core itself.
+        *
+        * This framework helps streamlining the timing of when these other
+        * code paths fire their plugins (instead of using document-ready,
+        * which can and should be limited to firing only once).
+        *
+        * Features like navigating to other wiki pages, previewing an edit
+        * and editing itself – without a refresh – can then retrigger these
+        * hooks accordingly to ensure everything still works as expected.
+        *
+        * Example usage:
+        *
+        *     mw.hook( 'wikipage.content' ).add( fn ).remove( fn );
+        *     mw.hook( 'wikipage.content' ).fire( $content );
+        *
+        * Handlers can be added and fired for arbitrary event names at any time. The same
+        * event can be fired multiple times. The last run of an event is memorized
+        * (similar to `$(document).ready` and `$.Deferred().done`).
+        * This means if an event is fired, and a handler added afterwards, the added
+        * function will be fired right away with the last given event data.
+        *
+        * Like Deferreds and Promises, the mw.hook object is both detachable and chainable.
+        * Thus allowing flexible use and optimal maintainability and authority control.
+        * You can pass around the `add` and/or `fire` method to another piece of code
+        * without it having to know the event name (or `mw.hook` for that matter).
+        *
+        *     var h = mw.hook( 'bar.ready' );
+        *     new mw.Foo( .. ).fetch( { callback: h.fire } );
+        *
+        * Note: Events are documented with an underscore instead of a dot in the event
+        * name due to jsduck not supporting dots in that position.
+        *
+        * @class mw.hook
+        */
+       mw.hook = ( function () {
+               var lists = {};
+
+               /**
+                * Create an instance of mw.hook.
+                *
+                * @method hook
+                * @member mw
+                * @param {string} name Name of hook.
+                * @return {mw.hook}
+                */
+               return function ( name ) {
+                       var list = hasOwn.call( lists, name ) ?
+                               lists[ name ] :
+                               lists[ name ] = $.Callbacks( 'memory' );
+
+                       return {
+                               /**
+                                * Register a hook handler
+                                *
+                                * @param {...Function} handler Function to bind.
+                                * @chainable
+                                */
+                               add: list.add,
+
+                               /**
+                                * Unregister a hook handler
+                                *
+                                * @param {...Function} handler Function to unbind.
+                                * @chainable
+                                */
+                               remove: list.remove,
+
+                               /**
+                                * Run a hook.
+                                *
+                                * @param {...Mixed} data
+                                * @return {mw.hook}
+                                * @chainable
+                                */
+                               fire: function () {
+                                       return list.fireWith.call( this, null, slice.call( arguments ) );
+                               }
+                       };
+               };
+       }() );
+
+       /**
+        * HTML construction helper functions
+        *
+        *     @example
+        *
+        *     var Html, output;
+        *
+        *     Html = mw.html;
+        *     output = Html.element( 'div', {}, new Html.Raw(
+        *         Html.element( 'img', { src: '<' } )
+        *     ) );
+        *     mw.log( output ); // <div><img src="&lt;"/></div>
+        *
+        * @class mw.html
+        * @singleton
+        */
+       mw.html = ( function () {
+               function escapeCallback( s ) {
+                       switch ( s ) {
+                               case '\'':
+                                       return '&#039;';
+                               case '"':
+                                       return '&quot;';
+                               case '<':
+                                       return '&lt;';
+                               case '>':
+                                       return '&gt;';
+                               case '&':
+                                       return '&amp;';
+                       }
+               }
+
+               return {
+                       /**
+                        * Escape a string for HTML.
+                        *
+                        * Converts special characters to HTML entities.
+                        *
+                        *     mw.html.escape( '< > \' & "' );
+                        *     // Returns &lt; &gt; &#039; &amp; &quot;
+                        *
+                        * @param {string} s The string to escape
+                        * @return {string} HTML
+                        */
+                       escape: function ( s ) {
+                               return s.replace( /['"<>&]/g, escapeCallback );
+                       },
+
+                       /**
+                        * Create an HTML element string, with safe escaping.
+                        *
+                        * @param {string} name The tag name.
+                        * @param {Object} [attrs] An object with members mapping element names to values
+                        * @param {string|mw.html.Raw|mw.html.Cdata|null} [contents=null] The contents of the element.
+                        *
+                        *  - string: Text to be escaped.
+                        *  - null: The element is treated as void with short closing form, e.g. `<br/>`.
+                        *  - this.Raw: The raw value is directly included.
+                        *  - this.Cdata: The raw value is directly included. An exception is
+                        *    thrown if it contains any illegal ETAGO delimiter.
+                        *    See <https://www.w3.org/TR/html401/appendix/notes.html#h-B.3.2>.
+                        * @return {string} HTML
+                        */
+                       element: function ( name, attrs, contents ) {
+                               var v, attrName, s = '<' + name;
+
+                               if ( attrs ) {
+                                       for ( attrName in attrs ) {
+                                               v = attrs[ attrName ];
+                                               // Convert name=true, to name=name
+                                               if ( v === true ) {
+                                                       v = attrName;
+                                                       // Skip name=false
+                                               } else if ( v === false ) {
+                                                       continue;
+                                               }
+                                               s += ' ' + attrName + '="' + this.escape( String( v ) ) + '"';
+                                       }
+                               }
+                               if ( contents === undefined || contents === null ) {
+                                       // Self close tag
+                                       s += '/>';
+                                       return s;
+                               }
+                               // Regular open tag
+                               s += '>';
+                               switch ( typeof contents ) {
+                                       case 'string':
+                                               // Escaped
+                                               s += this.escape( contents );
+                                               break;
+                                       case 'number':
+                                       case 'boolean':
+                                               // Convert to string
+                                               s += String( contents );
+                                               break;
+                                       default:
+                                               if ( contents instanceof this.Raw ) {
+                                                       // Raw HTML inclusion
+                                                       s += contents.value;
+                                               } else if ( contents instanceof this.Cdata ) {
+                                                       // CDATA
+                                                       if ( /<\/[a-zA-z]/.test( contents.value ) ) {
+                                                               throw new Error( 'mw.html.element: Illegal end tag found in CDATA' );
+                                                       }
+                                                       s += contents.value;
+                                               } else {
+                                                       throw new Error( 'mw.html.element: Invalid type of contents' );
+                                               }
+                               }
+                               s += '</' + name + '>';
+                               return s;
+                       },
+
+                       /**
+                        * Wrapper object for raw HTML passed to mw.html.element().
+                        *
+                        * @class mw.html.Raw
+                        * @constructor
+                        * @param {string} value
+                        */
+                       Raw: function ( value ) {
+                               this.value = value;
+                       },
+
+                       /**
+                        * Wrapper object for CDATA element contents passed to mw.html.element()
+                        *
+                        * @class mw.html.Cdata
+                        * @constructor
+                        * @param {string} value
+                        */
+                       Cdata: function ( value ) {
+                               this.value = value;
+                       }
+               };
+       }() );
 }() );
index 9d34bf1..7d40ce7 100644 (file)
@@ -13,9 +13,6 @@
 
        var mw, StringSet, log,
                hasOwn = Object.prototype.hasOwnProperty,
-               slice = Array.prototype.slice,
-               trackCallbacks = $.Callbacks( 'memory' ),
-               trackHandlers = [],
                trackQueue = [];
 
        /**
                );
        }
 
+       /**
+        * Log a message to window.console, if possible.
+        *
+        * Useful to force logging of some errors that are otherwise hard to detect (i.e., this logs
+        * also in production mode). Gets console references in each invocation instead of caching the
+        * reference, so that debugging tools loaded later are supported (e.g. Firebug Lite in IE).
+        *
+        * @private
+        * @param {string} topic Stream name passed by mw.track
+        * @param {Object} data Data passed by mw.track
+        * @param {Error} [data.exception]
+        * @param {string} data.source Error source
+        * @param {string} [data.module] Name of module which caused the error
+        */
+       function logError( topic, data ) {
+               /* eslint-disable no-console */
+               var msg,
+                       e = data.exception,
+                       source = data.source,
+                       module = data.module,
+                       console = window.console;
+
+               if ( console && console.log ) {
+                       msg = ( e ? 'Exception' : 'Error' ) + ' in ' + source;
+                       if ( module ) {
+                               msg += ' in module ' + module;
+                       }
+                       msg += ( e ? ':' : '.' );
+                       console.log( msg );
+
+                       // If we have an exception object, log it to the warning channel to trigger
+                       // proper stacktraces in browsers that support it.
+                       if ( e && console.warn ) {
+                               console.warn( e );
+                       }
+               }
+               /* eslint-enable no-console */
+       }
+
        /**
         * Create an object that can be read from or written to via methods that allow
         * interaction both with single and multiple properties at once.
                }() ),
 
                /**
-                * Track an analytic event.
-                *
-                * This method provides a generic means for MediaWiki JavaScript code to capture state
-                * information for analysis. Each logged event specifies a string topic name that describes
-                * the kind of event that it is. Topic names consist of dot-separated path components,
-                * arranged from most general to most specific. Each path component should have a clear and
-                * well-defined purpose.
+                * List of all analytic events emitted so far.
                 *
-                * Data handlers are registered via `mw.trackSubscribe`, and receive the full set of
-                * events that match their subcription, including those that fired before the handler was
-                * bound.
-                *
-                * @param {string} topic Topic name
-                * @param {Object} [data] Data describing the event, encoded as an object
+                * @private
+                * @property {Array}
                 */
+               trackQueue: trackQueue,
+
                track: function ( topic, data ) {
                        trackQueue.push( { topic: topic, timeStamp: mw.now(), data: data } );
-                       trackCallbacks.fire( trackQueue );
-               },
-
-               /**
-                * Register a handler for subset of analytic events, specified by topic.
-                *
-                * Handlers will be called once for each tracked event, including any events that fired before the
-                * handler was registered; 'this' is set to a plain object with a 'timeStamp' property indicating
-                * the exact time at which the event fired, a string 'topic' property naming the event, and a
-                * 'data' property which is an object of event-specific data. The event topic and event data are
-                * also passed to the callback as the first and second arguments, respectively.
-                *
-                * @param {string} topic Handle events whose name starts with this string prefix
-                * @param {Function} callback Handler to call for each matching tracked event
-                * @param {string} callback.topic
-                * @param {Object} [callback.data]
-                */
-               trackSubscribe: function ( topic, callback ) {
-                       var seen = 0;
-                       function handler( trackQueue ) {
-                               var event;
-                               for ( ; seen < trackQueue.length; seen++ ) {
-                                       event = trackQueue[ seen ];
-                                       if ( event.topic.indexOf( topic ) === 0 ) {
-                                               callback.call( event, event.topic, event.data );
-                                       }
-                               }
-                       }
-
-                       trackHandlers.push( [ handler, callback ] );
-
-                       trackCallbacks.add( handler );
+                       // The base module extends this method to fire events here
                },
 
                /**
-                * Stop handling events for a particular handler
+                * Track an early error event via mw.track and send it to the window console.
                 *
-                * @param {Function} callback
+                * @private
+                * @param {string} topic Topic name
+                * @param {Object} data Data describing the event, encoded as an object; see mw#logError
                 */
-               trackUnsubscribe: function ( callback ) {
-                       trackHandlers = trackHandlers.filter( function ( fns ) {
-                               if ( fns[ 1 ] === callback ) {
-                                       trackCallbacks.remove( fns[ 0 ] );
-                                       // Ensure the tuple is removed to avoid holding on to closures
-                                       return false;
-                               }
-                               return true;
-                       } );
+               trackError: function ( topic, data ) {
+                       mw.track( topic, data );
+                       logError( topic, data );
                },
 
                // Expose Map constructor
                                                } catch ( e ) {
                                                        // A user-defined callback raised an exception.
                                                        // Swallow it to protect our state machine!
-                                                       mw.track( 'resourceloader.exception', { exception: e, module: module, source: 'load-callback' } );
+                                                       mw.trackError( 'resourceloader.exception', {
+                                                               exception: e,
+                                                               module: module,
+                                                               source: 'load-callback'
+                                                       } );
                                                }
                                        }
                                }
                                                // This module is unknown or has unknown dependencies.
                                                // Undo any incomplete resolutions made and keep going.
                                                resolved = saved;
-                                               mw.track( 'resourceloader.exception', {
+                                               mw.trackError( 'resourceloader.exception', {
                                                        exception: err,
                                                        source: 'resolve'
                                                } );
                                                } else if ( typeof script === 'function' ) {
                                                        // Pass jQuery twice so that the signature of the closure which wraps
                                                        // the script can bind both '$' and 'jQuery'.
-                                                       script( $, $, mw.loader.require, registry[ module ].module );
+                                                       script( window.$, window.$, mw.loader.require, registry[ module ].module );
                                                        markModuleReady();
 
                                                } else if ( typeof script === 'string' ) {
                                                // Use mw.track instead of mw.log because these errors are common in production mode
                                                // (e.g. undefined variable), and mw.log is only enabled in debug mode.
                                                registry[ module ].state = 'error';
-                                               mw.track( 'resourceloader.exception', { exception: e, module: module, source: 'module-execute' } );
+                                               mw.trackError( 'resourceloader.exception', {
+                                                       exception: e, module:
+                                                       module, source: 'module-execute'
+                                               } );
                                                handlePending( module );
                                        }
                                };
                                                        // risks and clear everything in this cache.
                                                        mw.loader.store.clear();
 
-                                                       mw.track( 'resourceloader.exception', { exception: err, source: 'store-eval' } );
+                                                       mw.trackError( 'resourceloader.exception', {
+                                                               exception: err,
+                                                               source: 'store-eval'
+                                                       } );
                                                        // Re-add the failed ones that are still pending back to the batch
                                                        failed = sourceModules.filter( function ( module ) {
                                                                return registry[ module ].state === 'loading';
                                                                return;
                                                        }
                                                } catch ( e ) {
-                                                       mw.track( 'resourceloader.exception', { exception: e, source: 'store-localstorage-init' } );
+                                                       mw.trackError( 'resourceloader.exception', {
+                                                               exception: e,
+                                                               source: 'store-localstorage-init'
+                                                       } );
                                                }
 
                                                if ( raw === undefined ) {
                                                        // This regex should never match under sane conditions.
                                                        if ( /^\s*\(/.test( args[ 1 ] ) ) {
                                                                args[ 1 ] = 'function' + args[ 1 ];
-                                                               mw.track( 'resourceloader.assert', { source: 'bug-T59567' } );
+                                                               mw.trackError( 'resourceloader.assert', { source: 'bug-T59567' } );
                                                        }
                                                } catch ( e ) {
-                                                       mw.track( 'resourceloader.exception', { exception: e, source: 'store-localstorage-json' } );
+                                                       mw.trackError( 'resourceloader.exception', {
+                                                               exception: e,
+                                                               source: 'store-localstorage-json'
+                                                       } );
                                                        return false;
                                                }
 
                                                                data = JSON.stringify( mw.loader.store );
                                                                localStorage.setItem( key, data );
                                                        } catch ( e ) {
-                                                               mw.track( 'resourceloader.exception', { exception: e, source: 'store-localstorage-update' } );
+                                                               mw.trackError( 'resourceloader.exception', {
+                                                                       exception: e,
+                                                                       source: 'store-localstorage-update'
+                                                               } );
                                                        }
 
                                                        hasPendingWrite = false;
                        };
                }() ),
 
-               /**
-                * HTML construction helper functions
-                *
-                *     @example
-                *
-                *     var Html, output;
-                *
-                *     Html = mw.html;
-                *     output = Html.element( 'div', {}, new Html.Raw(
-                *         Html.element( 'img', { src: '<' } )
-                *     ) );
-                *     mw.log( output ); // <div><img src="&lt;"/></div>
-                *
-                * @class mw.html
-                * @singleton
-                */
-               html: ( function () {
-                       function escapeCallback( s ) {
-                               switch ( s ) {
-                                       case '\'':
-                                               return '&#039;';
-                                       case '"':
-                                               return '&quot;';
-                                       case '<':
-                                               return '&lt;';
-                                       case '>':
-                                               return '&gt;';
-                                       case '&':
-                                               return '&amp;';
-                               }
-                       }
-
-                       return {
-                               /**
-                                * Escape a string for HTML.
-                                *
-                                * Converts special characters to HTML entities.
-                                *
-                                *     mw.html.escape( '< > \' & "' );
-                                *     // Returns &lt; &gt; &#039; &amp; &quot;
-                                *
-                                * @param {string} s The string to escape
-                                * @return {string} HTML
-                                */
-                               escape: function ( s ) {
-                                       return s.replace( /['"<>&]/g, escapeCallback );
-                               },
-
-                               /**
-                                * Create an HTML element string, with safe escaping.
-                                *
-                                * @param {string} name The tag name.
-                                * @param {Object} [attrs] An object with members mapping element names to values
-                                * @param {string|mw.html.Raw|mw.html.Cdata|null} [contents=null] The contents of the element.
-                                *
-                                *  - string: Text to be escaped.
-                                *  - null: The element is treated as void with short closing form, e.g. `<br/>`.
-                                *  - this.Raw: The raw value is directly included.
-                                *  - this.Cdata: The raw value is directly included. An exception is
-                                *    thrown if it contains any illegal ETAGO delimiter.
-                                *    See <https://www.w3.org/TR/html401/appendix/notes.html#h-B.3.2>.
-                                * @return {string} HTML
-                                */
-                               element: function ( name, attrs, contents ) {
-                                       var v, attrName, s = '<' + name;
-
-                                       if ( attrs ) {
-                                               for ( attrName in attrs ) {
-                                                       v = attrs[ attrName ];
-                                                       // Convert name=true, to name=name
-                                                       if ( v === true ) {
-                                                               v = attrName;
-                                                       // Skip name=false
-                                                       } else if ( v === false ) {
-                                                               continue;
-                                                       }
-                                                       s += ' ' + attrName + '="' + this.escape( String( v ) ) + '"';
-                                               }
-                                       }
-                                       if ( contents === undefined || contents === null ) {
-                                               // Self close tag
-                                               s += '/>';
-                                               return s;
-                                       }
-                                       // Regular open tag
-                                       s += '>';
-                                       switch ( typeof contents ) {
-                                               case 'string':
-                                                       // Escaped
-                                                       s += this.escape( contents );
-                                                       break;
-                                               case 'number':
-                                               case 'boolean':
-                                                       // Convert to string
-                                                       s += String( contents );
-                                                       break;
-                                               default:
-                                                       if ( contents instanceof this.Raw ) {
-                                                               // Raw HTML inclusion
-                                                               s += contents.value;
-                                                       } else if ( contents instanceof this.Cdata ) {
-                                                               // CDATA
-                                                               if ( /<\/[a-zA-z]/.test( contents.value ) ) {
-                                                                       throw new Error( 'mw.html.element: Illegal end tag found in CDATA' );
-                                                               }
-                                                               s += contents.value;
-                                                       } else {
-                                                               throw new Error( 'mw.html.element: Invalid type of contents' );
-                                                       }
-                                       }
-                                       s += '</' + name + '>';
-                                       return s;
-                               },
-
-                               /**
-                                * Wrapper object for raw HTML passed to mw.html.element().
-                                *
-                                * @class mw.html.Raw
-                                * @constructor
-                                * @param {string} value
-                                */
-                               Raw: function ( value ) {
-                                       this.value = value;
-                               },
-
-                               /**
-                                * Wrapper object for CDATA element contents passed to mw.html.element()
-                                *
-                                * @class mw.html.Cdata
-                                * @constructor
-                                * @param {string} value
-                                */
-                               Cdata: function ( value ) {
-                                       this.value = value;
-                               }
-                       };
-               }() ),
-
                // Skeleton user object, extended by the 'mediawiki.user' module.
                /**
                 * @class mw.user
                },
 
                // OOUI widgets specific to MediaWiki
-               widgets: {},
+               widgets: {}
 
-               /**
-                * Registry and firing of events.
-                *
-                * MediaWiki has various interface components that are extended, enhanced
-                * or manipulated in some other way by extensions, gadgets and even
-                * in core itself.
-                *
-                * This framework helps streamlining the timing of when these other
-                * code paths fire their plugins (instead of using document-ready,
-                * which can and should be limited to firing only once).
-                *
-                * Features like navigating to other wiki pages, previewing an edit
-                * and editing itself – without a refresh – can then retrigger these
-                * hooks accordingly to ensure everything still works as expected.
-                *
-                * Example usage:
-                *
-                *     mw.hook( 'wikipage.content' ).add( fn ).remove( fn );
-                *     mw.hook( 'wikipage.content' ).fire( $content );
-                *
-                * Handlers can be added and fired for arbitrary event names at any time. The same
-                * event can be fired multiple times. The last run of an event is memorized
-                * (similar to `$(document).ready` and `$.Deferred().done`).
-                * This means if an event is fired, and a handler added afterwards, the added
-                * function will be fired right away with the last given event data.
-                *
-                * Like Deferreds and Promises, the mw.hook object is both detachable and chainable.
-                * Thus allowing flexible use and optimal maintainability and authority control.
-                * You can pass around the `add` and/or `fire` method to another piece of code
-                * without it having to know the event name (or `mw.hook` for that matter).
-                *
-                *     var h = mw.hook( 'bar.ready' );
-                *     new mw.Foo( .. ).fetch( { callback: h.fire } );
-                *
-                * Note: Events are documented with an underscore instead of a dot in the event
-                * name due to jsduck not supporting dots in that position.
-                *
-                * @class mw.hook
-                */
-               hook: ( function () {
-                       var lists = {};
-
-                       /**
-                        * Create an instance of mw.hook.
-                        *
-                        * @method hook
-                        * @member mw
-                        * @param {string} name Name of hook.
-                        * @return {mw.hook}
-                        */
-                       return function ( name ) {
-                               var list = hasOwn.call( lists, name ) ?
-                                       lists[ name ] :
-                                       lists[ name ] = $.Callbacks( 'memory' );
-
-                               return {
-                                       /**
-                                        * Register a hook handler
-                                        *
-                                        * @param {...Function} handler Function to bind.
-                                        * @chainable
-                                        */
-                                       add: list.add,
-
-                                       /**
-                                        * Unregister a hook handler
-                                        *
-                                        * @param {...Function} handler Function to unbind.
-                                        * @chainable
-                                        */
-                                       remove: list.remove,
-
-                                       /**
-                                        * Run a hook.
-                                        *
-                                        * @param {...Mixed} data
-                                        * @return {mw.hook}
-                                        * @chainable
-                                        */
-                                       fire: function () {
-                                               return list.fireWith.call( this, null, slice.call( arguments ) );
-                                       }
-                               };
-                       };
-               }() )
        };
 
        // Alias $j to jQuery for backwards compatibility
        // @deprecated since 1.23 Use $ or jQuery instead
        mw.log.deprecate( window, '$j', $, 'Use $ or jQuery instead.' );
 
-       /**
-        * Log a message to window.console, if possible.
-        *
-        * Useful to force logging of some errors that are otherwise hard to detect (i.e., this logs
-        * also in production mode). Gets console references in each invocation instead of caching the
-        * reference, so that debugging tools loaded later are supported (e.g. Firebug Lite in IE).
-        *
-        * @private
-        * @param {string} topic Stream name passed by mw.track
-        * @param {Object} data Data passed by mw.track
-        * @param {Error} [data.exception]
-        * @param {string} data.source Error source
-        * @param {string} [data.module] Name of module which caused the error
-        */
-       function logError( topic, data ) {
-               /* eslint-disable no-console */
-               var msg,
-                       e = data.exception,
-                       source = data.source,
-                       module = data.module,
-                       console = window.console;
-
-               if ( console && console.log ) {
-                       msg = ( e ? 'Exception' : 'Error' ) + ' in ' + source;
-                       if ( module ) {
-                               msg += ' in module ' + module;
-                       }
-                       msg += ( e ? ':' : '.' );
-                       console.log( msg );
-
-                       // If we have an exception object, log it to the warning channel to trigger
-                       // proper stacktraces in browsers that support it.
-                       if ( e && console.warn ) {
-                               console.warn( e );
-                       }
-               }
-               /* eslint-enable no-console */
-       }
-
-       // Subscribe to error streams
-       mw.trackSubscribe( 'resourceloader.exception', logError );
-       mw.trackSubscribe( 'resourceloader.assert', logError );
-
        // Attach to window and globally alias
        window.mw = window.mediaWiki = mw;
 }( jQuery ) );
index 97175da..60a5881 100644 (file)
@@ -1281,7 +1281,7 @@ class ParserTestRunner {
 
                // Wipe some DB query result caches on setup and teardown
                $reset = function () {
-                       LinkCache::singleton()->clear();
+                       MediaWikiServices::getInstance()->getLinkCache()->clear();
 
                        // Clear the message cache
                        MessageCache::singleton()->clear();
index e2f9834..4140c23 100644 (file)
@@ -1540,7 +1540,7 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                        if ( $tbl === 'page' ) {
                                // Forget about the pages since they don't
                                // exist in the DB.
-                               LinkCache::singleton()->clear();
+                               MediaWikiServices::getInstance()->getLinkCache()->clear();
                        }
                }
        }
@@ -1657,7 +1657,7 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                                if ( $tbl === 'page' ) {
                                        // Forget about the pages since they don't
                                        // exist in the DB.
-                                       LinkCache::singleton()->clear();
+                                       MediaWikiServices::getInstance()->getLinkCache()->clear();
                                }
                        }
 
index 763a3e7..110f032 100644 (file)
@@ -274,7 +274,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $this->assertEquals( $r1->getSha1(), $r2->getSha1() );
                $this->assertEquals( $r1->getSize(), $r2->getSize() );
                $this->assertEquals( $r1->getPageId(), $r2->getPageId() );
-               $this->assertEquals( $r1->getSlotRoles(), $r2->getSlotRoles() );
+               $this->assertArrayEqualsIgnoringIntKeyOrder( $r1->getSlotRoles(), $r2->getSlotRoles() );
                $this->assertEquals( $r1->getWikiId(), $r2->getWikiId() );
                $this->assertEquals( $r1->isMinor(), $r2->isMinor() );
                foreach ( $r1->getSlotRoles() as $role ) {
index 4032b3a..e898c63 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group ContentHandler
  * @group Database
@@ -353,7 +355,7 @@ class TitleMethodsTest extends MediaWikiLangTestCase {
         * @covers Title::clearCaches
         */
        public function testClearCaches() {
-               $linkCache = LinkCache::singleton();
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
 
                $title1 = Title::newFromText( 'Foo' );
                $linkCache->addGoodLinkObj( 23, $title1 );
index c81a078..f9ffeae 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group Database
  * @group Title
@@ -674,7 +676,7 @@ class TitleTest extends MediaWikiTestCase {
         */
        public function testExists() {
                $title = Title::makeTitle( NS_PROJECT, 'New page' );
-               $linkCache = LinkCache::singleton();
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
 
                $article = new Article( $title );
                $page = $article->getPage();
index 309b7b1..9a1c90f 100644 (file)
@@ -101,7 +101,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
         */
        public function testGetForTitle( $title, $expectedContentModel ) {
                $title = Title::newFromText( $title );
-               LinkCache::singleton()->addBadLinkObj( $title );
+               MediaWikiServices::getInstance()->getLinkCache()->addBadLinkObj( $title );
                $handler = ContentHandler::getForTitle( $title );
                $this->assertEquals( $expectedContentModel, $handler->getModelID() );
        }
@@ -158,7 +158,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
        public function testGetPageLanguage( $title, $expected ) {
                if ( is_string( $title ) ) {
                        $title = Title::newFromText( $title );
-                       LinkCache::singleton()->addBadLinkObj( $title );
+                       MediaWikiServices::getInstance()->getLinkCache()->addBadLinkObj( $title );
                }
 
                $expected = wfGetLangObj( $expected );
@@ -308,7 +308,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $expectedModelId, $expectedNativeData, $shouldFail
        ) {
                $title = Title::newFromText( $title );
-               LinkCache::singleton()->addBadLinkObj( $title );
+               MediaWikiServices::getInstance()->getLinkCache()->addBadLinkObj( $title );
                try {
                        $content = ContentHandler::makeContent( $data, $title, $modelId, $format );
 
index fa4d804..58e6d7d 100644 (file)
@@ -26,8 +26,12 @@ class MessageBlobStoreTest extends PHPUnit\Framework\TestCase {
                $this->wanCache->expects( $this->any() )
                        ->method( 'makePurgeValue' )
                        ->will( $this->returnCallback( function ( $timestamp, $holdoff ) {
-                               // Disable holdoff as it messes with testing
-                               return WANObjectCache::PURGE_VAL_PREFIX . (float)$timestamp . ':0';
+                               // Disable holdoff as it messes with testing. Aside from a 0-second holdoff,
+                               // make sure that "time" passes between getMulti() check init and the set()
+                               // in recacheMessageBlob(). This especially matters for Windows clocks.
+                               $ts = (float)$timestamp - 0.0001;
+
+                               return WANObjectCache::PURGE_VAL_PREFIX . $ts . ':0';
                        } ) );
        }
 
@@ -197,12 +201,16 @@ class MessageBlobStoreTest extends PHPUnit\Framework\TestCase {
                        ->method( 'fetchMessage' )
                        ->will( $this->onConsecutiveCalls( 'First', 'Second' ) );
 
+               $now = microtime( true );
+               $this->wanCache->setMockTime( $now );
+
                $blob = $blobStore->getBlob( $module, 'en' );
                $this->assertEquals( '{"example":"First"}', $blob, 'Generated blob' );
 
                $blob = $blobStore->getBlob( $module, 'en' );
                $this->assertEquals( '{"example":"First"}', $blob, 'Cache-hit' );
 
+               $now += 1;
                $blobStore->clear();
 
                $blob = $blobStore->getBlob( $module, 'en' );
diff --git a/tests/phpunit/maintenance/populateChangeTagDefTest.php b/tests/phpunit/maintenance/populateChangeTagDefTest.php
new file mode 100644 (file)
index 0000000..719b46b
--- /dev/null
@@ -0,0 +1,286 @@
+<?php
+
+namespace MediaWiki\Tests\Maintenance;
+
+use PopulateChangeTagDef;
+
+/**
+ * @group Database
+ * @covers PopulateChangeTagDef
+ */
+class PopulateChangeTagDefTest extends MaintenanceBaseTestCase {
+
+       public function getMaintenanceClass() {
+               return PopulateChangeTagDef::class;
+       }
+
+       public function setUp() {
+               parent::setUp();
+               $this->tablesUsed = [ 'change_tag', 'change_tag_def' ];
+
+               $this->cleanChangeTagTables();
+               $this->insertChangeTagData();
+       }
+
+       private function cleanChangeTagTables() {
+               wfGetDB( DB_MASTER )->delete( 'change_tag', '*' );
+               wfGetDB( DB_MASTER )->delete( 'change_tag_def', '*' );
+       }
+
+       private function insertChangeTagData() {
+               $changeTags = [];
+
+               $changeTags[] = [
+                       'ct_rc_id' => 1234,
+                       'ct_tag' => 'One Tag',
+               ];
+
+               $changeTags[] = [
+                       'ct_rc_id' => 1235,
+                       'ct_tag' => 'Two Tags',
+               ];
+
+               $changeTags[] = [
+                       'ct_log_id' => 1236,
+                       'ct_tag' => 'Two Tags',
+               ];
+
+               $changeTags[] = [
+                       'ct_rev_id' => 1237,
+                       'ct_tag' => 'Three Tags',
+               ];
+
+               $changeTags[] = [
+                       'ct_rc_id' => 1238,
+                       'ct_tag' => 'Three Tags',
+               ];
+
+               $changeTags[] = [
+                       'ct_log_id' => 1239,
+                       'ct_tag' => 'Three Tags',
+               ];
+
+               wfGetDB( DB_MASTER )->insert( 'change_tag', $changeTags );
+       }
+
+       public function testRun() {
+               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
+               $this->maintenance->loadWithArgv( [ '--sleep', '0' ] );
+
+               $this->maintenance->execute();
+
+               $changeTagDefRows = [
+                       (object)[
+                               'ctd_name' => 'One Tag',
+                               'ctd_count' => 1,
+                       ],
+                       (object)[
+                               'ctd_name' => 'Two Tags',
+                               'ctd_count' => 2,
+                       ],
+                       (object)[
+                               'ctd_name' => 'Three Tags',
+                               'ctd_count' => 3,
+                       ],
+               ];
+
+               $actualChangeTagDefs = wfGetDB( DB_REPLICA )->select(
+                       [ 'change_tag_def' ],
+                       [ 'ctd_name', 'ctd_count' ],
+                       [],
+                       __METHOD__,
+                       [ 'ORDER BY' => 'ctd_count' ]
+               );
+
+               $this->assertEquals( $changeTagDefRows, iterator_to_array( $actualChangeTagDefs, false ) );
+
+               // Check if change_tag is also backpopulated
+               $actualChangeTags = wfGetDB( DB_REPLICA )->select(
+                       [ 'change_tag', 'change_tag_def' ],
+                       [ 'ct_tag', 'ct_tag_id', 'ctd_count' ],
+                       [],
+                       __METHOD__,
+                       [],
+                       [ 'change_tag_def' => [ 'LEFT JOIN', 'ct_tag_id=ctd_id' ] ]
+               );
+               $mapping = [
+                       'One Tag' => 1,
+                       'Two Tags' => 2,
+                       'Three Tags' => 3
+               ];
+               foreach ( $actualChangeTags as $row ) {
+                       $this->assertNotNull( $row->ct_tag_id );
+                       $this->assertEquals( $row->ctd_count, $mapping[$row->ct_tag] );
+               }
+       }
+
+       public function testRunUpdateHitCountMigrationNew() {
+               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_NEW );
+               $changeTagDefBadRows = [
+                       [
+                               'ctd_name' => 'One Tag',
+                               'ctd_user_defined' => 0,
+                               'ctd_count' => 50,
+                       ],
+                       [
+                               'ctd_name' => 'Two Tags',
+                               'ctd_user_defined' => 0,
+                               'ctd_count' => 4,
+                       ],
+                       [
+                               'ctd_name' => 'Three Tags',
+                               'ctd_user_defined' => 0,
+                               'ctd_count' => 3,
+                       ],
+               ];
+               wfGetDB( DB_MASTER )->insert(
+                       'change_tag_def',
+                       $changeTagDefBadRows
+               );
+
+               $mapping = [
+                       'One Tag' => 1,
+                       'Two Tags' => 2,
+                       'Three Tags' => 3
+               ];
+               foreach ( $mapping as $tagName => $tagId ) {
+                       wfGetDB( DB_MASTER )->update(
+                               'change_tag',
+                               [ 'ct_tag_id' => $tagId ],
+                               [ 'ct_tag' => $tagName ]
+                       );
+               }
+
+               $this->maintenance->loadWithArgv( [ '--sleep', '0' ] );
+
+               $this->maintenance->execute();
+
+               $changeTagDefRows = [
+                       (object)[
+                               'ctd_name' => 'One Tag',
+                               'ctd_count' => 1,
+                       ],
+                       (object)[
+                               'ctd_name' => 'Two Tags',
+                               'ctd_count' => 2,
+                       ],
+                       (object)[
+                               'ctd_name' => 'Three Tags',
+                               'ctd_count' => 3,
+                       ],
+               ];
+
+               $actualChangeTagDefs = wfGetDB( DB_REPLICA )->select(
+                       [ 'change_tag_def' ],
+                       [ 'ctd_name', 'ctd_count' ],
+                       [],
+                       __METHOD__,
+                       [ 'ORDER BY' => 'ctd_count' ]
+               );
+
+               $this->assertEquals( $changeTagDefRows, iterator_to_array( $actualChangeTagDefs, false ) );
+       }
+
+       public function testRunUpdateHitCountMigrationWriteBoth() {
+               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
+               $changeTagDefBadRows = [
+                       [
+                               'ctd_name' => 'One Tag',
+                               'ctd_user_defined' => 0,
+                               'ctd_count' => 50,
+                       ],
+                       [
+                               'ctd_name' => 'Two Tags',
+                               'ctd_user_defined' => 0,
+                               'ctd_count' => 4,
+                       ],
+                       [
+                               'ctd_name' => 'Three Tags',
+                               'ctd_user_defined' => 0,
+                               'ctd_count' => 3,
+                       ],
+               ];
+               wfGetDB( DB_MASTER )->insert(
+                       'change_tag_def',
+                       $changeTagDefBadRows
+               );
+
+               $this->maintenance->loadWithArgv( [ '--sleep', '0' ] );
+
+               $this->maintenance->execute();
+
+               $changeTagDefRows = [
+                       (object)[
+                               'ctd_name' => 'One Tag',
+                               'ctd_count' => 1,
+                       ],
+                       (object)[
+                               'ctd_name' => 'Two Tags',
+                               'ctd_count' => 2,
+                       ],
+                       (object)[
+                               'ctd_name' => 'Three Tags',
+                               'ctd_count' => 3,
+                       ],
+               ];
+
+               $actualChangeTagDefs = wfGetDB( DB_REPLICA )->select(
+                       [ 'change_tag_def' ],
+                       [ 'ctd_name', 'ctd_count' ],
+                       [],
+                       __METHOD__,
+                       [ 'ORDER BY' => 'ctd_count' ]
+               );
+
+               $this->assertEquals( $changeTagDefRows, iterator_to_array( $actualChangeTagDefs, false ) );
+       }
+
+       public function testDryRunMigrationNew() {
+               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_NEW );
+               $this->maintenance->loadWithArgv( [ '--dry-run', '--sleep', '0' ] );
+
+               $this->maintenance->execute();
+
+               $actualChangeTagDefs = wfGetDB( DB_REPLICA )->select(
+                       [ 'change_tag_def' ],
+                       [ 'ctd_id', 'ctd_name' ]
+               );
+
+               $this->assertEquals( [], iterator_to_array( $actualChangeTagDefs, false ) );
+
+               $actualChangeTags = wfGetDB( DB_REPLICA )->select(
+                       [ 'change_tag' ],
+                       [ 'ct_tag_id', 'ct_tag' ]
+               );
+
+               foreach ( $actualChangeTags as $row ) {
+                       $this->assertNull( $row->ct_tag_id );
+                       $this->assertNotNull( $row->ct_tag );
+               }
+       }
+
+       public function testDryRunMigrationWriteBoth() {
+               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
+               $this->maintenance->loadWithArgv( [ '--dry-run', '--sleep', '0' ] );
+
+               $this->maintenance->execute();
+
+               $actualChangeTagDefs = wfGetDB( DB_REPLICA )->select(
+                       [ 'change_tag_def' ],
+                       [ 'ctd_id', 'ctd_name' ]
+               );
+
+               $this->assertEquals( [], iterator_to_array( $actualChangeTagDefs, false ) );
+
+               $actualChangeTags = wfGetDB( DB_REPLICA )->select(
+                       [ 'change_tag' ],
+                       [ 'ct_tag_id', 'ct_tag' ]
+               );
+
+               foreach ( $actualChangeTags as $row ) {
+                       $this->assertNull( $row->ct_tag_id );
+                       $this->assertNotNull( $row->ct_tag );
+               }
+       }
+
+}