Merge "Include block ID in unblock log"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 20 Dec 2018 17:07:05 +0000 (17:07 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 20 Dec 2018 17:07:05 +0000 (17:07 +0000)
81 files changed:
.travis.yml
RELEASE-NOTES-1.33
composer.json
docs/hooks.txt
includes/DefaultSettings.php
includes/Message.php
includes/Title.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiComparePages.php
includes/api/ApiDelete.php
includes/api/ApiErrorFormatter.php
includes/api/ApiMain.php
includes/api/i18n/ar.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/auth/AuthManager.php
includes/changes/ChangesList.php
includes/changes/OldChangesList.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlUpdater.php
includes/installer/OracleUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/i18n/br.json
includes/installer/i18n/diq.json
includes/installer/i18n/ja.json
includes/installer/i18n/sr-ec.json
includes/libs/rdbms/field/SQLiteField.php
includes/profiler/ProfilerExcimer.php
includes/shell/Command.php
includes/specials/pagers/AllMessagesTablePager.php
includes/user/BotPassword.php
languages/i18n/bg.json
languages/i18n/br.json
languages/i18n/ca.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/da.json
languages/i18n/diq.json
languages/i18n/en.json
languages/i18n/io.json
languages/i18n/ml.json
languages/i18n/nb.json
languages/i18n/pt-br.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/shn.json
languages/i18n/sr-ec.json
languages/i18n/sv.json
languages/i18n/tl.json
languages/i18n/zh-hant.json
maintenance/archives/patch-change_tag-indexes.sql
maintenance/archives/patch-tag_summary-ts_id.sql [deleted file]
maintenance/archives/patch-tag_summary-ts_log_id-unsigned.sql [deleted file]
maintenance/archives/patch-tag_summary-ts_rev_id-unsigned.sql [deleted file]
maintenance/archives/patch-tag_summary.sql [deleted file]
maintenance/archives/patch-valid_tag.sql [deleted file]
maintenance/mssql/archives/patch-tag_summary-ts_id.sql [deleted file]
maintenance/mssql/archives/patch-user_groups-ug_expiry.sql
maintenance/mssql/tables.sql
maintenance/oracle/archives/patch-tag_summary-ts_id.sql [deleted file]
maintenance/oracle/tables.sql
maintenance/postgres/archives/patch-tag_summary.sql [deleted file]
maintenance/postgres/archives/patch-valid_tag.sql [deleted file]
maintenance/postgres/tables.sql
maintenance/sqlite/archives/patch-tag_summary-ts_id.sql [deleted file]
maintenance/tables.sql
resources/src/mediawiki.htmlform.ooui.styles.less
resources/src/mediawiki.special/special.css
tests/phpunit/includes/MagicWordFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiComparePagesTest.php
tests/phpunit/includes/api/ApiDeleteTest.php
tests/phpunit/includes/api/ApiErrorFormatterTest.php
tests/phpunit/includes/changetags/ChangeTagsTest.php

index 4260c46..3be6531 100644 (file)
@@ -34,6 +34,8 @@ matrix:
   include:
     # On Trusty, mysql user 'travis' doesn't have create database rights
     # Postgres has no user called 'root'.
+    - env: dbtype=mysql dbuser=root
+      php: 7.3
     - env: dbtype=mysql dbuser=root
       php: 7.2
     - env: dbtype=mysql dbuser=root
@@ -50,6 +52,7 @@ matrix:
     - env: dbtype=mysql dbuser=root
       php: hhvm-3.18
   allow_failures:
+    - php: 7.3
     - php: hhvm-3.18
     - php: hhvm-3.21
     - php: hhvm-3.24
index 1ab9d4e..ce95bd6 100644 (file)
@@ -37,6 +37,8 @@ production.
 * (T96041) __EXPECTUNUSEDCATEGORY__ on a category page causes the category
   to be hidden on Special:UnusedCategories.
 * Add PasswordPolicy to check the password isn't in the large blacklist.
+* The AuthManagerLoginAuthenticateAudit hook has a new parameter for
+  additional information about the authentication event.
 * …
 
 === External library changes in 1.33 ===
@@ -53,6 +55,9 @@ production.
 ==== Changed external libraries ====
 * Updated wikimedia/xmp-reader from 0.6.0 to 0.6.1.
 * Updated wikimedia/scoped-callback from 2.0.0 to 3.0.0.
+* Updated wikimedia/ip-set from 1.2.0 to 2.0.0.
+  * The deprecated IPSet\IPSet alias was removed, Wikimedia\IPSet must be
+    used instead.
 * …
 
 ==== Removed external libraries ====
@@ -70,7 +75,9 @@ production.
     exceptions will now include the "Wikimedia\Rdbms\" prefix in the class name.
   * The code including an exception class name is deprecated. In the future,
     all internal errors will use code "internal_api_error".
-* …
+* (T212356) When using action=delete on pages with many revisions, the module
+  may return a boolean-true 'scheduled' and no 'logid'. This signifies that the
+  deletion will be processed via the job queue.
 
 === Action API internal changes in 1.33 ===
 * A number of deprecated methods for API documentation, intended for overriding
index 08b0e01..1157333 100644 (file)
@@ -44,7 +44,7 @@
                "wikimedia/cldr-plural-rule-parser": "1.0.0",
                "wikimedia/composer-merge-plugin": "1.4.1",
                "wikimedia/html-formatter": "1.0.2",
-               "wikimedia/ip-set": "1.2.0",
+               "wikimedia/ip-set": "2.0.0",
                "wikimedia/less.php": "1.8.0",
                "wikimedia/object-factory": "1.0.0",
                "wikimedia/password-blacklist": "0.1.4",
index a7ff453..28065fc 100644 (file)
@@ -786,7 +786,11 @@ $response: The MediaWiki\Auth\AuthenticationResponse in either a PASS or FAIL
 $user: The User object being authenticated against, or null if authentication
   failed before getting that far.
 $username: A guess at the user name being authenticated, or null if we can't
-  even determine that.
+  even determine that. When $user is not null, it can be in the form of
+  <username>@<more info> (e.g. for bot passwords).
+$extraData: An array (string => string) with extra information, intended to be
+  added to log contexts. Fields it might include:
+  - appId: the application ID, only if the login was with a bot password
 
 'AuthPluginAutoCreate': DEPRECATED since 1.27! Use the 'LocalUserCreated' hook
 instead. Called when creating a local account for an user logged in from an
index 2f1efbf..36b4d1e 100644 (file)
@@ -5820,6 +5820,7 @@ $wgGrantPermissions['editmycssjs']['editmyuserjson'] = true;
 $wgGrantPermissions['editmycssjs']['editmyuserjs'] = true;
 
 $wgGrantPermissions['editmyoptions']['editmyoptions'] = true;
+$wgGrantPermissions['editmyoptions']['editmyuserjson'] = true;
 
 $wgGrantPermissions['editinterface'] = $wgGrantPermissions['editpage'];
 $wgGrantPermissions['editinterface']['editinterface'] = true;
index 15d9786..4049e11 100644 (file)
@@ -289,7 +289,6 @@ class Message implements MessageSpecifier, Serializable {
                        'parameters' => $this->parameters,
                        'format' => $this->format,
                        'useDatabase' => $this->useDatabase,
-                       'title' => $this->title,
                        'titlestr' => $this->title ? $this->title->getFullText() : null,
                ] );
        }
index 55c5cd9..155bee1 100644 (file)
@@ -3276,9 +3276,13 @@ class Title implements LinkTarget {
         * indicating who can move or edit the page from the page table, (pre 1.10) rows.
         * Edit and move sections are separated by a colon
         * Example: "edit=autoconfirmed,sysop:move=sysop"
+        * @param bool $readLatest When true, skip replicas and read from the master DB.
         */
-       public function loadRestrictionsFromRows( $rows, $oldFashionedRestrictions = null ) {
-               $dbr = wfGetDB( DB_REPLICA );
+       public function loadRestrictionsFromRows(
+               $rows, $oldFashionedRestrictions = null, $readLatest = false
+       ) {
+               $whichDb = $readLatest ? DB_MASTER : DB_REPLICA;
+               $dbr = wfGetDB( $whichDb );
 
                $restrictionTypes = $this->getRestrictionTypes();
 
@@ -3348,9 +3352,10 @@ class Title implements LinkTarget {
         * indicating who can move or edit the page from the page table, (pre 1.10) rows.
         * Edit and move sections are separated by a colon
         * Example: "edit=autoconfirmed,sysop:move=sysop"
+        * @param bool $readLatest When true, skip replicas and read from the master DB.
         */
-       public function loadRestrictions( $oldFashionedRestrictions = null ) {
-               if ( $this->mRestrictionsLoaded ) {
+       public function loadRestrictions( $oldFashionedRestrictions = null, $readLatest = false ) {
+               if ( $this->mRestrictionsLoaded && !$readLatest ) {
                        return;
                }
 
@@ -3360,10 +3365,11 @@ class Title implements LinkTarget {
                        $fname = __METHOD__;
                        $rows = $cache->getWithSetCallback(
                                // Page protections always leave a new null revision
-                               $cache->makeKey( 'page-restrictions', $id, $this->getLatestRevID() ),
+                               $cache->makeKey( 'page-restrictions', $id, $this->getLatestRevID(), $readLatest ),
                                $cache::TTL_DAY,
-                               function ( $curValue, &$ttl, array &$setOpts ) use ( $fname ) {
-                                       $dbr = wfGetDB( DB_REPLICA );
+                               function ( $curValue, &$ttl, array &$setOpts ) use ( $fname, $readLatest ) {
+                                       $whichDb = $readLatest ? DB_MASTER : DB_REPLICA;
+                                       $dbr = wfGetDB( $whichDb );
 
                                        $setOpts += Database::getCacheSetOptions( $dbr );
 
@@ -3378,7 +3384,7 @@ class Title implements LinkTarget {
                                }
                        );
 
-                       $this->loadRestrictionsFromRows( $rows, $oldFashionedRestrictions );
+                       $this->loadRestrictionsFromRows( $rows, $oldFashionedRestrictions, $readLatest );
                } else {
                        $title_protection = $this->getTitleProtectionInternal();
 
index d29131b..1efd747 100644 (file)
@@ -1949,9 +1949,14 @@ abstract class ApiBase extends ContextSource {
         * @since 1.29
         * @param StatusValue $status
         * @param string[] $types 'warning' and/or 'error'
+        * @param string[] $filter Message keys to filter out (since 1.33)
         */
-       public function addMessagesFromStatus( StatusValue $status, $types = [ 'warning', 'error' ] ) {
-               $this->getErrorFormatter()->addMessagesFromStatus( $this->getModulePath(), $status, $types );
+       public function addMessagesFromStatus(
+               StatusValue $status, $types = [ 'warning', 'error' ], array $filter = []
+       ) {
+               $this->getErrorFormatter()->addMessagesFromStatus(
+                       $this->getModulePath(), $status, $types, $filter
+               );
        }
 
        /**
index 8976626..ed3d01c 100644 (file)
@@ -61,7 +61,7 @@ class ApiBlock extends ApiBase {
                                $editingRestriction = 'partial';
                        }
 
-                       $pageRestrictions = implode( "\n", $params['pagerestrictions'] );
+                       $pageRestrictions = implode( "\n", (array)$params['pagerestrictions'] );
                }
 
                if ( $params['userid'] !== null ) {
index f688346..4ba30ab 100644 (file)
@@ -74,16 +74,48 @@ class ApiComparePages extends ApiBase {
                        switch ( $params['torelative'] ) {
                                case 'prev':
                                        // Swap 'from' and 'to'
-                                       list( $toRev, $toRelRev2, $toValsRev ) = [ $fromRev, $fromRelRev, $fromValsRev ];
-                                       $fromRev = $this->revisionStore->getPreviousRevision( $fromRelRev );
+                                       list( $toRev, $toRelRev, $toValsRev ) = [ $fromRev, $fromRelRev, $fromValsRev ];
+                                       $fromRev = $this->revisionStore->getPreviousRevision( $toRelRev );
                                        $fromRelRev = $fromRev;
                                        $fromValsRev = $fromRev;
+                                       if ( !$fromRev ) {
+                                               $title = Title::newFromLinkTarget( $toRelRev->getPageAsLinkTarget() );
+                                               $this->addWarning( [
+                                                       'apiwarn-compare-no-prev',
+                                                       wfEscapeWikiText( $title->getPrefixedText() ),
+                                                       $toRelRev->getId()
+                                               ] );
+
+                                               // (T203433) Create an empty dummy revision as the "previous".
+                                               // The main slot has to exist, the rest will be handled by DifferenceEngine.
+                                               $fromRev = $this->revisionStore->newMutableRevisionFromArray( [
+                                                       'title' => $title ?: Title::makeTitle( NS_SPECIAL, 'Badtitle/' . __METHOD__ )
+                                               ] );
+                                               $fromRev->setContent(
+                                                       SlotRecord::MAIN,
+                                                       $toRelRev->getContent( SlotRecord::MAIN, RevisionRecord::RAW )
+                                                               ->getContentHandler()
+                                                               ->makeEmptyContent()
+                                               );
+                                       }
                                        break;
 
                                case 'next':
                                        $toRev = $this->revisionStore->getNextRevision( $fromRelRev );
                                        $toRelRev = $toRev;
                                        $toValsRev = $toRev;
+                                       if ( !$toRev ) {
+                                               $title = Title::newFromLinkTarget( $fromRelRev->getPageAsLinkTarget() );
+                                               $this->addWarning( [
+                                                       'apiwarn-compare-no-next',
+                                                       wfEscapeWikiText( $title->getPrefixedText() ),
+                                                       $fromRelRev->getId()
+                                               ] );
+
+                                               // (T203433) The web UI treats "next" as "cur" in this case.
+                                               // Avoid repeating metadata by making a MutableRevisionRecord with no changes.
+                                               $toRev = MutableRevisionRecord::newFromParentRevision( $fromRelRev );
+                                       }
                                        break;
 
                                case 'cur':
@@ -103,10 +135,12 @@ class ApiComparePages extends ApiBase {
                        list( $toRev, $toRelRev, $toValsRev ) = $this->getDiffRevision( 'to', $params );
                }
 
-               // Handle missing from or to revisions
+               // Handle missing from or to revisions (should never happen)
+               // @codeCoverageIgnoreStart
                if ( !$fromRev || !$toRev ) {
                        $this->dieWithError( 'apierror-baddiff' );
                }
+               // @codeCoverageIgnoreEnd
 
                // Handle revdel
                if ( !$fromRev->audienceCan(
index ec857b7..7e8041d 100644 (file)
@@ -75,9 +75,10 @@ class ApiDelete extends ApiBase {
                        $status = self::delete( $pageObj, $user, $reason, $params['tags'] );
                }
 
-               if ( !$status->isGood() ) {
+               if ( !$status->isOk() ) {
                        $this->dieStatus( $status );
                }
+               $this->addMessagesFromStatus( $status, [ 'warning' ], [ 'delete-scheduled' ] );
 
                // Deprecated parameters
                if ( $params['watch'] ) {
@@ -92,8 +93,14 @@ class ApiDelete extends ApiBase {
                $r = [
                        'title' => $titleObj->getPrefixedText(),
                        'reason' => $reason,
-                       'logid' => $status->value
                ];
+               if ( $status->hasMessage( 'delete-scheduled' ) ) {
+                       $r['scheduled'] = true;
+               }
+               if ( $status->value !== null ) {
+                       // Scheduled deletions don't currently have a log entry available at this point
+                       $r['logid'] = $status->value;
+               }
                $this->getResult()->addValue( null, $this->getModuleName(), $r );
        }
 
index a37ecc2..9669464 100644 (file)
@@ -153,9 +153,10 @@ class ApiErrorFormatter {
         * @param string|null $modulePath
         * @param StatusValue $status
         * @param string[]|string $types 'warning' and/or 'error'
+        * @param string[] $filter Messages to filter out (since 1.33)
         */
        public function addMessagesFromStatus(
-               $modulePath, StatusValue $status, $types = [ 'warning', 'error' ]
+               $modulePath, StatusValue $status, $types = [ 'warning', 'error' ], array $filter = []
        ) {
                if ( $status->isGood() || !$status->getErrors() ) {
                        return;
@@ -178,7 +179,9 @@ class ApiErrorFormatter {
                                ->inLanguage( $this->lang )
                                ->title( $this->getDummyTitle() )
                                ->useDatabase( $this->useDB );
-                       $this->addWarningOrError( $tag, $modulePath, $msg );
+                       if ( !in_array( $msg->getKey(), $filter, true ) ) {
+                               $this->addWarningOrError( $tag, $modulePath, $msg );
+                       }
                }
        }
 
index bc76f8f..3cc3407 100644 (file)
@@ -829,6 +829,7 @@ class ApiMain extends ApiBase {
                        'dnt',
                        'origin',
                        /* MediaWiki whitelist */
+                       'user-agent',
                        'api-user-agent',
                ] );
                foreach ( $requestedHeaders as $rHeader ) {
index 17c95be..518a4fa 100644 (file)
        "apiwarn-badurlparam": "تعذر تحليل <var>$1urlparam</var> لـ$2، باستخدام العرض والطول فقط.",
        "apiwarn-badutf8": "تحتوي القيمة التي تم تمريرها لـ<var>$1</var> على بيانات غير صالحة أو غير طبيعية، يجب أن تكون البيانات النصية صالحة، NFC-normalized Unicode بدون أحرف تحكم C0 غير HT (\\t) وLF (\\n) وCR (\\r).",
        "apiwarn-checktoken-percentencoding": "تحقق من أن الرموز مثل \"+\" في الرمز المميز يتم ترميزها بشكل صحيح في المسار.",
+       "apiwarn-compare-no-next": "المراجعة $2 هي أحدث مراجعة من $1، ولا توجد مراجعة لـ<kbd>torelative=next</kbd>  للمقارنة بها.",
+       "apiwarn-compare-no-prev": "المراجعة $2 هي أقدم مراجعة من $1، ولا توجد مراجعة لـ<kbd>torelative=next</kbd>  للمقارنة بها.",
        "apiwarn-compare-nocontentmodel": "لا يمكن تحديد نموذج محتوى، على افتراض $1.",
        "apiwarn-deprecation-deletedrevs": "تم إيقاف <kbd>list=deletedrevs</kbd>; الرجاء استخدام <kbd>prop=deletedrevisions</kbd> or <kbd>list=alldeletedrevisions</kbd> بدلا من ذلك.",
        "apiwarn-deprecation-httpsexpected": "HTTP المستخدمة عند توقع HTTPS.",
index 8643135..f626d2b 100644 (file)
        "apierror-unknownerror-nocode": "Unbekannter Fehler.",
        "apierror-unknownerror": "Unbekannter Fehler: „$1“.",
        "apierror-unknownformat": "Nicht erkanntes Format „$1“.",
+       "apiwarn-compare-no-next": "Die Version $2 ist die aktuelle Version von $1. Es gibt keine zu vergleichende Version für <kbd>torelative=next</kbd>.",
+       "apiwarn-compare-no-prev": "Die Version $2 ist die aktuelle Version von $1. Es gibt keine zu vergleichende Version für <kbd>torelative=prev</kbd>.",
        "apiwarn-deprecation-missingparam": "Da <var>$1</var> nicht angegeben wurde, wurde ein veraltetes Format für die Ausgabe verwendet. Dieses Format ist veraltet und in Zukunft wird immer das neue Format benutzt.",
        "apiwarn-ignoring-invalid-templated-value": "Ignorieren des Wertes <kbd>$2</kbd> in <var>$1</var> bei der Verarbeitung von Vorlagenparametern.",
        "apiwarn-invalidcategory": "„$1“ ist keine Kategorie.",
index 9b74c5e..8f5ba8d 100644 (file)
        "apiwarn-badurlparam": "Could not parse <var>$1urlparam</var> for $2. Using only width and height.",
        "apiwarn-badutf8": "The value passed for <var>$1</var> contains invalid or non-normalized data. Textual data should be valid, NFC-normalized Unicode without C0 control characters other than HT (\\t), LF (\\n), and CR (\\r).",
        "apiwarn-checktoken-percentencoding": "Check that symbols such as \"+\" in the token are properly percent-encoded in the URL.",
+       "apiwarn-compare-no-next": "Revision $2 is the latest revision of $1, there is no revision for <kbd>torelative=next</kbd> to compare to.",
+       "apiwarn-compare-no-prev": "Revision $2 is the earliest revision of $1, there is no revision for <kbd>torelative=prev</kbd> to compare to.",
        "apiwarn-compare-nocontentmodel": "No content model could be determined, assuming $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> has been deprecated. Please use <kbd>prop=deletedrevisions</kbd> or <kbd>list=alldeletedrevisions</kbd> instead.",
        "apiwarn-deprecation-httpsexpected": "HTTP used when HTTPS was expected.",
index 5d453b4..6801faa 100644 (file)
        "apiwarn-badurlparam": "Impossible d'analyser <var>$1urlparam</var> pour $2. En utilisant seulement la largeur et la hauteur.",
        "apiwarn-badutf8": "La valeur passée pour <var>$1</var> contient des données non valides ou non normalisées. Les données textuelles doivent être de l’Unicode valide normalisé en NFC sans caractères de contrôle c0 autres que HT (\\t), LF (\\n) et CR (\\r).",
        "apiwarn-checktoken-percentencoding": "Vérifier que les symboles tels que \"+\" dans le jeton sont correctement  codés avec des pourcents dans l'URL.",
+       "apiwarn-compare-no-next": "La version $2 est la dernière version de $1, il n'existe pas de version <kbd>torelative=next</kbd> à comparer.",
+       "apiwarn-compare-no-prev": "La version $2 est la plus ancienne de $1, il n'existe pas de version <kbd>torelative=prev</kbd> à comparer.",
        "apiwarn-compare-nocontentmodel": "Aucun modèle de contenu n’a pu être déterminé, $1 est supposé.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> est devenu désuet. Veuillez utiliser <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd> à la place.",
        "apiwarn-deprecation-httpsexpected": "HTTP est utilisé alors que HTTPS est attendu.",
index 3370d73..94ee481 100644 (file)
@@ -49,6 +49,8 @@
        "apihelp-block-param-reblock": "אם המשתמש כבר חסום, לדרוס את החסימה הנוכחית.",
        "apihelp-block-param-watchuser": "לעקוב אחרי דף המשתמש ודף השיחה של המשתמש או של כתובת ה־IP.",
        "apihelp-block-param-tags": "תגי שינוי שיחולו על העיול ביומן החסימה.",
+       "apihelp-block-param-partial": "חסימת משתמש מעריכת דפים או מרחבי שם מסוימים ולא מכל האתר.",
+       "apihelp-block-param-pagerestrictions": "רשימת כותרות שהמשתמש ייחסם מלערוך. חל רק כאשר \"partial\" מוגדל ל־true.",
        "apihelp-block-example-ip-simple": "חסימת כתובת ה־IP‏ <kbd>192.0.2.5</kbd> לשלושה ימים עם הסיבה <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "חסימת המשתמש <kbd>Vandal</kbd> ללא הגבלת זמן עם הסיבה <kbd>Vandalism</kbd>, ומניעת יצירת חשבונות חדשים ושליחת דוא\"ל.",
        "apihelp-changeauthenticationdata-summary": "שינוי נתוני אימות עבור המשתמש הנוכחי.",
        "apihelp-compare-param-fromtitle": "כותרת ראשונה להשוואה.",
        "apihelp-compare-param-fromid": "מס׳ זיהוי של הדף הראשון להשוואה.",
        "apihelp-compare-param-fromrev": "גרסה ראשונה להשוואה.",
-       "apihelp-compare-param-frompst": "לעשות התמרה לפני שמירה ב־<var>fromtext</var>.",
-       "apihelp-compare-param-fromtext": "להשתמש בטקסט הזה במקום תוכן הגרסה שהוגדרה על־ידי <var dir=\"ltr\">fromtitle</var>, <var dir=\"ltr\">fromid</var> או <var dir=\"ltr\">fromrev</var>.",
-       "apihelp-compare-param-fromcontentmodel": "מודל התוכן של <var>fromtext</var>. אם זה לא סופק, ייעשה ניחוש על סמך פרמטרים אחרים.",
-       "apihelp-compare-param-fromcontentformat": "תסדיר הסדרת תוכן של <var>fromtext</var>.",
+       "apihelp-compare-param-frompst": "לעשות התמרה לפני שמירה ב־<var>romtext-&#x7B;slot}</var>.",
+       "apihelp-compare-param-fromslots": "דריסת תוכן הגרסה שצוינה ב־<var>fromtitle</var>, ב־<var>fromid</var>, או ב־<var>fromrev</var>.\n\nהפרמטר הזה מציין את המשבצות שישונו. יש להשתמש ב־<var>fromtext-&#x7B;slot}</var>, ב־<var>fromcontentmodel-&#x7B;slot}</var>, וב־<var>fromcontentformat-&#x7B;slot}</var> לציון תוכן עבור כל משבצת.",
+       "apihelp-compare-param-fromtext-{slot}": "הטקסט של המשבצת שמצוינת. אם זה מושמט, המשבצת מוּסרת מהגרסה.",
+       "apihelp-compare-param-fromsection-{slot}": "כאשר <var>fromtext-&#x7B;slot}</var> הוא התוכן של פסקה אחת, זהו מספר הפסקה. הוא ימוזג לתוך הגרסה שמצוינת ב־<var>fromtitle</var>, ב־<var>fromid</var>, או ב־<var>fromrev</var> כמו בעריכת פסקה.",
+       "apihelp-compare-param-fromcontentmodel-{slot}": "מודל התוכן של <var>fromtext-&#x7B;slot}</var>. אם זה לא סופק, זה ינוחש לפי הפרמטרים האחרים.",
+       "apihelp-compare-param-fromcontentformat-{slot}": "תסדיר להסדרת תוכן של <var>fromtext-&#x7B;slot}</var>.",
+       "apihelp-compare-param-fromtext": "יש לציין <kbd>fromslots=main</kbd> ולהשתמש ב־<var>fromtext-main</var> במקום זה.",
+       "apihelp-compare-param-fromcontentmodel": "יש לציין <kbd>fromslots=main</kbd> ולהשתמש ב־<var>fromcontentmodel-main</var> במקום זה.",
+       "apihelp-compare-param-fromcontentformat": "יש לציין <kbd>fromslots=main</kbd> ולהשתמש ב־<var>fromcontentformat-main</var> במקום זה.",
        "apihelp-compare-param-fromsection": "יש להשתמש רק בפסקה שצוינה בתוכן של הפרמטר 'from'.",
        "apihelp-compare-param-totitle": "כותרת שנייה להשוואה.",
        "apihelp-compare-param-toid": "מס׳ מזהה של הדף השני להשוואה.",
        "apihelp-compare-param-torev": "גרסה שנייה להשוואה.",
        "apihelp-compare-param-torelative": "להשתמש בגרסה יחסית לגרסה שהוסקה מ<var dir=\"ltr\">fromtitle</var>, <var dir=\"ltr\">fromid</var> או <var dir=\"ltr\">fromrev</var>. לכל אפשריות ה־\"to\" האחרות לא תהיה השפעה.",
        "apihelp-compare-param-topst": "לעשות התמרה לפני שמירה ב־<var>totext</var>.",
-       "apihelp-compare-param-totext": "להשתמש בטקסט הזה במקום התוכן של הגרסה שהוגדר ב־<var dir=\"ltr\">totitle</var>, <var dir=\"ltr\">toid</var> or <var dir=\"ltr\">torev</var>.",
-       "apihelp-compare-param-tocontentmodel": "מודל התוכן של <var>totext</var>. אם זה לא סופק, ייעשה ניחוש על סמך פרמטרים אחרים.",
-       "apihelp-compare-param-tocontentformat": "תסדיר הסדרת תוכן של <var>fromtext</var>.",
+       "apihelp-compare-param-toslots": "דריסת תוכן הגרסה שצוינה ב־<var>totitle</var>, ב־<var>toid</var>, או ב־<var>torev</var>.\n\nהפרמטר הזה מציין את המשבצות שישונו. יש להשתמש ב־<var>totext-&#x7B;slot}</var>, ב־<var>tocontentmodel-&#x7B;slot}</var>, וב־<var>tocontentformat-&#x7B;slot}</var> לציון תוכן עבור כל משבצת.",
+       "apihelp-compare-param-totext-{slot}": "הטקסט של המשבצת שמצוינת. אם זה מושמט, המשבצת מוּסרת מהגרסה.",
+       "apihelp-compare-param-tosection-{slot}": "כאשר <var>totext-&#x7B;slot}</var> הוא התוכן של פסקה אחת, זהו מספר הפסקה. הוא ימוזג לתוך הגרסה שמצוינת ב־<var>totitle</var>, ב־<var>toid</var>, או ב־<var>torev</var> כמו בעריכת פסקה.",
+       "apihelp-compare-param-tocontentmodel-{slot}": "מודל התוכן של <var>totext-&#x7B;slot}</var>. אם זה לא סופק, זה ינוחש לפי הפרמטרים האחרים.",
+       "apihelp-compare-param-tocontentformat-{slot}": "תסדיר להסדרת תוכן של <var>totext-&#x7B;slot}</var>.",
+       "apihelp-compare-param-totext": "יש לציין <kbd>toslots=main</kbd> ולהשתמש ב־<var>totext-main</var> במקום זה.",
+       "apihelp-compare-param-tocontentmodel": "יש לציין <kbd>toslots=main</kbd> ולהשתמש ב־<var>tocontentmodel-main</var> במקום זה.",
+       "apihelp-compare-param-tocontentformat": "יש לציין <kbd>toslots=main</kbd> ולהשתמש ב־<var>tocontentformat-main</var> במקום זה.",
        "apihelp-compare-param-tosection": "יש להשתמש רק בפסקה שצוינה בתוכן של הפרמטר 'to'.",
        "apihelp-compare-param-prop": "אילו פריטי מידע לקבל.",
        "apihelp-compare-paramvalue-prop-diff": "ה־HTML של ההשוואה.",
        "apihelp-compare-paramvalue-prop-comment": "התקציר על גרסאות ה־\"from\" וה־\"to\".",
        "apihelp-compare-paramvalue-prop-parsedcomment": "התקציר המפוענח על גרסאות ה־\"from\" וה־\"to\".",
        "apihelp-compare-paramvalue-prop-size": "הגודל של גרסאות ה־\"from\" וה־\"to\".",
+       "apihelp-compare-param-slots": "החזרת השוואות פרטניו למשבצות האלה, ולא השוואה אחת משולבת לכל המשבצות.",
        "apihelp-compare-example-1": "יצירת תיעוד שינוי בין גרסה 1 ל־2.",
        "apihelp-createaccount-summary": "יצירת חשבון משתמש חדש.",
        "apihelp-createaccount-param-preservestate": "אם <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> החזיר true עבור <samp>hasprimarypreservedstate</samp>, בקשות שמסומנות בתור <samp>primary-required</samp> אמורות להיות מושמטות. אם מוחזר ערך לא ריק ל־<samp>preservedusername</samp>, שם המשתמש הזה ישמש לפרמטר <var>username</var>.",
        "apihelp-query+blocks-paramvalue-prop-reason": "הוספת הסיבה שניתנה לחסימה.",
        "apihelp-query+blocks-paramvalue-prop-range": "הוספת טווח כתובות ה־IP שהחסימה משפיעה עליהן.",
        "apihelp-query+blocks-paramvalue-prop-flags": "מתייג את ההחרמה (autoblock‏, anononly, וכו'.).",
+       "apihelp-query+blocks-paramvalue-prop-restrictions": "הוספת הגבלות החסימה החלקית אם החסימה אינה לכל האתר.",
        "apihelp-query+blocks-param-show": "להציג רק פריטים שמתאימים לאמות המידה האלו.\nלמשל, כדי לראות רק חסימות ללא לצמיתות על כתובות IP יש להגדיר <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "רשימת חסימות.",
        "apihelp-query+blocks-example-users": "רשימת חסימות של המשתמשים <kbd>Alice</kbd> ו־<kbd>Bob</kbd>.",
        "apihelp-query+info-paramvalue-prop-notificationtimestamp": "חותם־זמן של הודעת רשימת מעקב של כל דף.",
        "apihelp-query+info-paramvalue-prop-subjectid": "מזהה הדף של הדף העיקרי של כל דף שיחה.",
        "apihelp-query+info-paramvalue-prop-url": "נותן URL מלא, URL לעריכה ו־URL קנוני לכל דף.",
-       "apihelp-query+info-paramvalue-prop-readable": "×\94×\90×\9d ×\94×\9eשת×\9eש ×\99×\9b×\95×\9c ×\9c×\94צ×\99×\92 ×\93×£ זה.",
+       "apihelp-query+info-paramvalue-prop-readable": "×\94×\90×\9d ×\94×\9eשת×\9eש ×\99×\9b×\95×\9c ×\9cקר×\95×\90 ×\90ת ×\94×\93×£ ×\94×\96×\94. ×\99ש ×\9c×\94שת×\9eש ×\91Ö¾<kbd>intestactions=read</kbd> ×\91×\9eק×\95×\9d זה.",
        "apihelp-query+info-paramvalue-prop-preload": "נותן את הטקסט שמוחזר על־ידי EditFormPreloadText.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "נותן את האופן שבה שם הדף באמת מוצג.",
        "apihelp-query+info-paramvalue-prop-varianttitles": "כותרת התצוגה בכל הגרסאות של שפת התוכן של האתר.",
        "apihelp-query+info-param-testactions": "בדיקה האם המשתמש הנוכחי יכול לבצע פעולות מסוימות על הדף.",
+       "apihelp-query+info-param-testactionsdetail": "רמת פירוט של <var>$1testactions</var>. יש להשתמש בפרמטרים <var>errorformat</var> ו־<var>errorlang</var> של [[Special:ApiHelp/main|המודול הראשי]] כדי לשלוט בתסדיר את ההודעות המוחזרות.",
+       "apihelp-query+info-paramvalue-testactionsdetail-boolean": "החזרת ערך בוליאני עבור כל פעולה.",
+       "apihelp-query+info-paramvalue-testactionsdetail-full": "החזרת הודעות שמתארות למה הפעולה אינה מותרת, או מערך ריק אם היא מותרת.",
+       "apihelp-query+info-paramvalue-testactionsdetail-quick": "כמו <kbd>full</kbd>, אבל בלי בדיקות יקרות.",
        "apihelp-query+info-param-token": "להשתמש ב־[[Special:ApiHelp/query+tokens|action=query&meta=tokens]] במקום.",
        "apihelp-query+info-example-simple": "קבלת מידע על הדף <kbd>Main Page</kbd>",
        "apihelp-query+info-example-protection": "קבלת מידע כללי ומידע על הגנה של הדף <kbd>Main Page</kbd>.",
        "apihelp-json-param-callback": "אם זה צוין, עוטף את הפלט לתוך קריאת פונקציה נתונה. למען הבטיחות, כל הנתונים הייחודיים למשתמש יוגבלו.",
        "apihelp-json-param-utf8": "אם זה צוין, רוב התווים שאינם ASCII (אבל לא כולם) יקודדו בתור UTF-8 במקום להתחלף בסדרות חילוף הקסדצימליות. זאת בררת המחדל אם הערך של <var>formatversion</var> הוא לא <kbd>1</kbd>.",
        "apihelp-json-param-ascii": "אם זה צוין, לקודד את כל מה שאינו ASCII בסדרות חילוף הקסדצימליות. זאת בררת המחדל כש־<var>formatversion</var> היא <kbd>1</kbd>.",
-       "apihelp-json-param-formatversion": "תסדיר הפלט:\n;1:תסדיר עם תאימות אחורה (ערכים בוליאניים בסגנון XML, מפתחות <samp>*</samp> לצומתי תוכן, וכו').\n;2:תסדיר מודרני ניסיוני. הפרטים יכולים להשתנות!\n;latest:להשתמש בתסדיר החדש ביותר (כרגע <kbd>2</kbd>), יכול להשתנות ללא התראה.",
+       "apihelp-json-param-formatversion": "תסדיר הפלט:\n;1:תסדיר עם תאימות אחורה (ערכים בוליאניים בסגנון XML, מפתחות <samp>*</samp> לצומתי תוכן, וכו').\n;2:תסדיר מודרני.\n;latest:להשתמש בתסדיר החדש ביותר (כרגע <kbd>2</kbd>), יכול להשתנות ללא התראה.",
        "apihelp-jsonfm-summary": "לפלוט נתונים בתסדיר JSON (עם הדפסה יפה ב־HTML).",
        "apihelp-none-summary": "לא לפלוט שום דבר.",
        "apihelp-php-summary": "לפלוט נתונים בתסדיר PHP מוסדר.",
-       "apihelp-php-param-formatversion": "תסדיר הפלט:\n;1:תסדיר עם תאימות אחורה (ערכים בוליאניים בסגנון XML, מפתחות <samp>*</samp> לצומתי תוכן, וכו').\n;2:תסדיר מודרני ניסיוני. הפרטים יכולים להשתנות!\n;latest:להשתמש בתסדיר החדש ביותר (כרגע <kbd>2</kbd>), יכול להשתנות ללא התראה.",
+       "apihelp-php-param-formatversion": "תסדיר הפלט:\n;1:תסדיר עם תאימות אחורה (ערכים בוליאניים בסגנון XML, מפתחות <samp>*</samp> לצומתי תוכן, וכו').\n;2:תסדיר מודרני.\n;latest:להשתמש בתסדיר החדש ביותר (כרגע <kbd>2</kbd>), יכול להשתנות ללא התראה.",
        "apihelp-phpfm-summary": "לפלוט נתונים בתסדיר PHP מוסדר (עם הדפסה יפה ב־HTML).",
        "apihelp-rawfm-summary": "לפלוט את הנתונים, כולל אלמנטים לניפוי שגיאות, בתסדיר JSON (עם הדפסה יפה ב־HTML).",
        "apihelp-xml-summary": "לפלוט נתונים בתסדיר XML.",
        "apierror-assertnameduserfailed": "הבדיקה שהמשתמש הוא \"$1\" נכשלה.",
        "apierror-assertuserfailed": "הבדיקה שהמשתמש נכנס לחשבון נכשלה.",
        "apierror-autoblocked": "כתובת ה־IP שלך נחסמה אוטומטית, כי היא שימשה משתמש חסום.",
+       "apierror-bad-badfilecontexttitle": "כותרת בלתי־תקינה בפרמטר <var>$1badfilecontexttitle</var>.",
        "apierror-badconfig-resulttoosmall": "הערך של <code dir=\"ltr\">$wgAPIMaxResultSize</code> בוויקי הזה קטן מלהחזיק מידע בסיסי על תוצאה.",
        "apierror-badcontinue": "פרמטר continue בלתי־תקין. יש להעביר את הערך המקורי שהחזירה השאילתה הקודמת.",
        "apierror-baddiff": "לא ניתן לאחזר את ההשוואה. גרסה אחת לא קיימת או ששתיהן לא קיימות, או שאין לך הרשאה להציג אותן.",
        "apierror-bad-watchlist-token": "סופק אסימון רשימת מעקב בלתי־תקין. נא להשתמש באסימון תקין ב־[[Special:Preferences]].",
        "apierror-blockedfrommail": "נחסמת משליחת דוא״ל.",
        "apierror-blocked": "נחסמת מעריכה.",
+       "apierror-blocked-partial": "נחסמת מעריכת הדף הזה.",
        "apierror-botsnotsupported": "הממשק הזה לא נתמך עבור בוטים.",
        "apierror-cannot-async-upload-file": "הפרמטרים  <var>async</var> ו־<var>file</var> אינם יכולים להיות משולבים. אם ברצונך לבצע עיבוד אסינכרוני של הקובץ המועלה שלך, יש להעלות אותו תחילה לסליק (באמצעות הפרמטר <var>stash</var>) ואז לפרסם את הקובץ המוסלק באופן אסינכרוני (באמצעות <var>filekey</var> ו־<var>async</var>).",
        "apierror-cannotreauthenticate": "הפעולה הזאת אינה זמינה, כי הזהות שלך לא יכולה להיות מאומתת.",
        "apierror-changeauth-norequest": "יצירת בקשת השינוי נכשלה.",
        "apierror-chunk-too-small": "גודל הפלח המזערי הוא {{PLURAL:$1|בית אחד|$1 בתים}} בשביל פלחים לא סופיים.",
        "apierror-cidrtoobroad": "טווחי CIDR של $1 שרחבים יותר מ־/$2 אינם קבילים.",
+       "apierror-compare-maintextrequired": "הפרמטר <var>$1text-main</var> נדרש כאשר <var>$1slots</var> מכיל <kbd>main</kbd> (לא ניתן למחוק את המשבצת הראשית).",
        "apierror-compare-no-title": "לא ניתן לעשות התמרה לפני שמירה ללא כותרת. נא לנסות לציין <var>fromtitle</var> או <var>totitle</var>.",
        "apierror-compare-nosuchfromsection": "הפסקה $1 אינה קיימת בתוכן של 'from'.",
        "apierror-compare-nosuchtosection": "הפסקה $1 אינה קיימת בתוכן של 'to'.",
+       "apierror-compare-nofromrevision": "אין גרסת \"from\". יש לציין <var>fromrev</var>‏, <var>fromtitle</var>, או <var>fromid</var>.",
+       "apierror-compare-notext": "הפרמטר <var>$1</var> אינו יכול לשמש ללא <var>$2</var>.",
+       "apierror-compare-notorevision": "אין גרסת \"to\". יש לציין <var>torev</var>‏, <var>totitle</var>, או <var>toid</var>.",
+       "apierror-compare-relative-to-deleted": "לא ניתן להשתמש ב־<kbd>torelative=$1</kbd> יחסית לגרסה מחוקה.",
        "apierror-compare-relative-to-nothing": "אין גרסת \"from\" עבור <var>torelative</var> שתהיה יחסית.",
        "apierror-contentserializationexception": "הסדרת התוכן נכשלה: $1",
        "apierror-contenttoobig": "התוכן שסיפקת חורג מגודל הערך המרבי של {{PLURAL:$1|קילובייט אחד|$1 קילובייטים}}.",
        "apierror-invalidexpiry": "זמן תפוגה בלתי־תקין \"$1\".",
        "apierror-invalid-file-key": "לא מפתח קובץ תקין.",
        "apierror-invalidlang": "קוד שפה בלתי־תקין לפרמטר <var>$1</var>.",
+       "apierror-invalidmethod": "שיטת HTTP בלתי־תקינה. נא לשקול להשתמש ב־GET או ב־POST.",
        "apierror-invalidoldimage": "הפרמטר <var>oldimage</var> נשלח בתסדיר בלתי־תקין.",
        "apierror-invalidparammix-cannotusewith": "הפרמטר <kbd>$1</kbd> אינו יכול לשמש עם <kbd>$2</kbd>.",
        "apierror-invalidparammix-mustusewith": "הפרמטר <kbd>$1</kbd> יכול לשמש רק עם <kbd>$2</kbd>.",
        "apierror-mimesearchdisabled": "חיפוש MIME כבוי במצב קמצן.",
        "apierror-missingcontent-pageid": "תוכן חסר עבור מזהה הדף $1.",
        "apierror-missingcontent-revid": "תוכן חסר עבור מזהה הגרסה $1.",
+       "apierror-missingcontent-revid-role": "תוכן חסר כבור מזהה גרסה $1 לתפקיד $2.",
        "apierror-missingparam-at-least-one-of": "דרוש {{PLURAL:$2|הפרמטר|לפחות אחד מהפרמטרים}} $1.",
        "apierror-missingparam-one-of": "דרוש {{PLURAL:$2|הפרמטר|אחד מהפרמטרים}} $1.",
        "apierror-missingparam": "הפרמטר <var>$1</var> צריך להיות מוגדר.",
        "apiwarn-badurlparam": "לא היה אפשר לפענח את <var>$1urlparam</var> עבור $2. משתמשים רק ב־width ו־height.",
        "apiwarn-badutf8": "הערך שהועבר ל־<var>$1</var> מכיל נתונים בלתי־תקינים או בלתי־מנורמלים. נתונים טקסט אמורים להיות תקינים, מנורמלי NFC וללא תווי בקרה C0 למעט <span dir=\"ltr\">HT (\\t)</span>&rlm;, <span dir=\"ltr\">LF (\\n)</span>&rlm; ו־<span dir=\"ltr\">CR (\\r)</span>.",
        "apiwarn-checktoken-percentencoding": "נא לבדוק שסימנים כמו \"+\" באסימון מקודדים עם אחוזים בצורה נכונה ב־URL.",
+       "apiwarn-compare-no-next": "הגרסה $2 היא הגרסה האחרונה של $1, אין גרסה עבור <kbd>torelative=next</kbd> להשוואה.",
+       "apiwarn-compare-no-prev": "הגרסה $2 היא הגרסה המוקדמת ביותר של $1, אין גרסה עבור <kbd>torelative=prev</kbd> להשוואה.",
        "apiwarn-compare-nocontentmodel": "לא היה אפשר לקבוע את מודל התוכן, נניח שזה $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> הוצהר בתור מיושן. נא להשתמש ב־ <kbd>prop=deletedrevisions</kbd> או ב־<kbd>list=alldeletedrevisions</kbd> במקום זה.",
        "apiwarn-deprecation-httpsexpected": "משמש HTTP כשהיה צפוי HTTPS.",
index b3c26ce..1af3ce9 100644 (file)
        "apiwarn-badurlparam": "Não foi possível analisar <var>$1urlparam</var> por $2. Usando apenas largura e altura.",
        "apiwarn-badutf8": "O valor passado para <var>$1</var> contém dados inválidos ou não normalizados. Os dados textuais devem ser válidos, NFC-normalizado Unicode sem caracteres de controle C0 diferentes de HT (\\t), LF (\\n) e CR (\\r).",
        "apiwarn-checktoken-percentencoding": "Verificar se os símbolos, como \"+\" no token, estão codificados corretamente na URL.",
+       "apiwarn-compare-no-next": "A revisão $2 é a revisão mais recente de $1, não há nenhuma revisão seguinte para comparar com <kbd>torelative=next</kbd>.",
+       "apiwarn-compare-no-prev": "A revisão $2 é a revisão mais antiga de $1, não há nenhuma revisão anterior para comparar com <kbd>torelative=prev</kbd>.",
        "apiwarn-compare-nocontentmodel": "Nenhum modelo de conteúdo pode ser determinado, assumindo $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> foi depreciado. Por favor, use <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd> em vez.",
        "apiwarn-deprecation-httpsexpected": "HTTP usado quando o HTTPS era esperado.",
index a609992..0dbff88 100644 (file)
        "apiwarn-badurlparam": "Não foi possível analisar <var>$1urlparam</var> para $2. Serão utilizadas somente a largura e a altura.",
        "apiwarn-badutf8": "O valor passado para <var>$1</var> contém dados inválidos ou não normalizados. Os dados textuais devem estar em formato Unicode válido, normalizado em NFC, sem caracteres de controlo C0 exceto HT (\\t), LF (\\n) e CR (\\r).",
        "apiwarn-checktoken-percentencoding": "Verifique que símbolos como \"+\" na chave estão devidamente codificados com percentagem no URL.",
+       "apiwarn-compare-no-next": "A revisão $2 é a revisão mais recente de $1, não há nenhuma revisão seguinte para comparar com <kbd>torelative=next</kbd>.",
+       "apiwarn-compare-no-prev": "A revisão $2 é a revisão mais antiga de $1, não há nenhuma revisão anterior para comparar com <kbd>torelative=prev</kbd>.",
        "apiwarn-compare-nocontentmodel": "Não foi possível determinar nenhum modelo de conteúdo; será assumido $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> foi descontinuado. Em substituição, use <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd>, por favor.",
        "apiwarn-deprecation-httpsexpected": "Foi usado HTTP quando era esperado HTTPS.",
index b33f44a..6437adf 100644 (file)
        "apiwarn-badurlparam": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".\n* $2 - Image title.",
        "apiwarn-badutf8": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n{{doc-important|Do not translate \"\\t\", \"\\n\", and \"\\r\"}}",
        "apiwarn-checktoken-percentencoding": "{{doc-apierror}}",
+       "apiwarn-compare-no-next": "{{doc-apierror}}\n\nParameters:\n* $1 - Title of the page.\n* $2 - Revision ID.",
+       "apiwarn-compare-no-prev": "{{doc-apierror}}\n\nParameters:\n* $1 - Title of the page.\n* $2 - Revision ID.",
        "apiwarn-compare-nocontentmodel": "{{doc-apierror}}\n\nParameters:\n* $1 - Content model being assumed.",
        "apiwarn-deprecation-deletedrevs": "{{doc-apierror}}",
        "apiwarn-deprecation-httpsexpected": "{{doc-apierror}}",
index aae5a83..e82f2b8 100644 (file)
@@ -336,7 +336,7 @@ class AuthManager implements LoggerAwareInterface {
                        $this->setSessionDataForUser( $user );
                        $this->callMethodOnProviders( 7, 'postAuthentication', [ $user, $ret ] );
                        $session->remove( 'AuthManager::authnState' );
-                       \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $ret, $user, $user->getName() ] );
+                       \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $ret, $user, $user->getName(), [] ] );
                        return $ret;
                }
 
@@ -352,7 +352,7 @@ class AuthManager implements LoggerAwareInterface {
                                $this->callMethodOnProviders( 7, 'postAuthentication',
                                        [ User::newFromName( $guessUserName ) ?: null, $ret ]
                                );
-                               \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $ret, null, $guessUserName ] );
+                               \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $ret, null, $guessUserName, [] ] );
                                return $ret;
                        }
                }
@@ -468,7 +468,7 @@ class AuthManager implements LoggerAwareInterface {
                                                                [ User::newFromName( $guessUserName ) ?: null, $res ]
                                                        );
                                                        $session->remove( 'AuthManager::authnState' );
-                                                       \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $res, null, $guessUserName ] );
+                                                       \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $res, null, $guessUserName, [] ] );
                                                        return $res;
                                                case AuthenticationResponse::ABSTAIN;
                                                        // Continue loop
@@ -534,7 +534,7 @@ class AuthManager implements LoggerAwareInterface {
                                                        [ User::newFromName( $guessUserName ) ?: null, $res ]
                                                );
                                                $session->remove( 'AuthManager::authnState' );
-                                               \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $res, null, $guessUserName ] );
+                                               \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $res, null, $guessUserName, [] ] );
                                                return $res;
                                        case AuthenticationResponse::REDIRECT;
                                        case AuthenticationResponse::UI;
@@ -625,7 +625,7 @@ class AuthManager implements LoggerAwareInterface {
                                        );
                                        $this->callMethodOnProviders( 7, 'postAuthentication', [ $user, $ret ] );
                                        $session->remove( 'AuthManager::authnState' );
-                                       \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $ret, $user, $user->getName() ] );
+                                       \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $ret, $user, $user->getName(), [] ] );
                                        return $ret;
                                }
                        }
@@ -658,7 +658,7 @@ class AuthManager implements LoggerAwareInterface {
                                                $this->logger->debug( "Login failed in secondary authentication by $id" );
                                                $this->callMethodOnProviders( 7, 'postAuthentication', [ $user, $res ] );
                                                $session->remove( 'AuthManager::authnState' );
-                                               \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $res, $user, $user->getName() ] );
+                                               \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $res, $user, $user->getName(), [] ] );
                                                return $res;
                                        case AuthenticationResponse::REDIRECT;
                                        case AuthenticationResponse::UI;
@@ -694,7 +694,7 @@ class AuthManager implements LoggerAwareInterface {
                        $this->callMethodOnProviders( 7, 'postAuthentication', [ $user, $ret ] );
                        $session->remove( 'AuthManager::authnState' );
                        $this->removeAuthenticationSessionData( null );
-                       \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $ret, $user, $user->getName() ] );
+                       \Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $ret, $user, $user->getName(), [] ] );
                        return $ret;
                } catch ( \Exception $ex ) {
                        $session->remove( 'AuthManager::authnState' );
index b1dff14..a39568b 100644 (file)
@@ -454,11 +454,9 @@ class ChangesList extends ContextSource {
                        );
                }
                if ( $rc->mAttribs['rc_type'] == RC_CATEGORIZE ) {
-                       $diffhist = $diffLink . $this->message['pipe-separator'] . $this->message['hist'];
+                       $histLink = $this->message['hist'];
                } else {
-                       $diffhist = $diffLink . $this->message['pipe-separator'];
-                       # History link
-                       $diffhist .= $this->linkRenderer->makeKnownLink(
+                       $histLink = $this->linkRenderer->makeKnownLink(
                                $rc->getTitle(),
                                new HtmlArmor( $this->message['hist'] ),
                                [ 'class' => 'mw-changeslist-history' ],
@@ -469,9 +467,11 @@ class ChangesList extends ContextSource {
                        );
                }
 
-               // @todo FIXME: Hard coded ". .". Is there a message for this? Should there be?
-               $s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() .
-                       ' <span class="mw-changeslist-separator">. .</span> ';
+               $s .= Html::rawElement( 'div', [ 'class' => 'mw-changeslist-links' ],
+                               Html::rawElement( 'span', [], $diffLink ) .
+                               Html::rawElement( 'span', [], $histLink )
+                       ) .
+                       ' <span class="mw-changeslist-separator"></span> ';
        }
 
        /**
@@ -535,7 +535,7 @@ class ChangesList extends ContextSource {
                        htmlspecialchars( $this->getLanguage()->userTime(
                                $rc->mAttribs['rc_timestamp'],
                                $this->getUser()
-                       ) ) . '</span> <span class="mw-changeslist-separator">. .</span> ';
+                       ) ) . '</span> <span class="mw-changeslist-separator"></span> ';
        }
 
        /**
index a26f5b6..c15701b 100644 (file)
@@ -121,7 +121,7 @@ class OldChangesList extends ChangesList {
                if ( $this->getConfig()->get( 'RCShowChangedSize' ) ) {
                        $cd = $this->formatCharacterDifference( $rc );
                        if ( $cd !== '' ) {
-                               $html .= $cd . '  <span class="mw-changeslist-separator">. .</span> ';
+                               $html .= $cd . '  <span class="mw-changeslist-separator"></span> ';
                        }
                }
 
index db4cbdf..2f1c0f3 100644 (file)
@@ -95,7 +95,6 @@ class MssqlUpdater extends DatabaseUpdater {
                        [ 'addIndex', 'recentchanges', 'rc_name_type_patrolled_timestamp',
                                'patch-add-rc_name_type_patrolled_timestamp_index.sql' ],
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
-                       [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
 
                        // 1.29
                        [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
@@ -155,6 +154,8 @@ class MssqlUpdater extends DatabaseUpdater {
 
                        // 1.33
                        [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
+                       [ 'dropTable', 'valid_tag' ],
+                       [ 'dropTable', 'tag_summary' ],
                ];
        }
 
index 532ccb0..f7362cb 100644 (file)
@@ -158,8 +158,6 @@ class MysqlUpdater extends DatabaseUpdater {
 
                        // 1.15
                        [ 'addTable', 'change_tag', 'patch-change_tag.sql' ],
-                       [ 'addTable', 'tag_summary', 'patch-tag_summary.sql' ],
-                       [ 'addTable', 'valid_tag', 'patch-valid_tag.sql' ],
 
                        // 1.16
                        [ 'addTable', 'user_properties', 'patch-user_properties.sql' ],
@@ -169,7 +167,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'doLogUsertextPopulation' ],
                        [ 'doLogSearchPopulation' ],
                        [ 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ],
-                       [ 'addIndex', 'tag_summary', 'tag_summary_rc_id', 'patch-change_tag-indexes.sql' ],
+                       [ 'dropIndex', 'change_tag', 'ct_rc_id', 'patch-change_tag-indexes.sql' ],
                        [ 'addField', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ],
                        [ 'doUpdateMimeMinorField' ],
 
@@ -288,7 +286,6 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'doRevisionPageRevIndexNonUnique' ],
                        [ 'doNonUniquePlTlIl' ],
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
-                       [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
                        [ 'modifyField', 'recentchanges', 'rc_ip', 'patch-rc_ip_modify.sql' ],
                        [ 'addIndex', 'archive', 'usertext_timestamp', 'patch-rename-ar_usertext_timestamp.sql' ],
 
@@ -375,6 +372,8 @@ class MysqlUpdater extends DatabaseUpdater {
 
                        // 1,33
                        [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
+                       [ 'dropTable', 'valid_tag' ],
+                       [ 'dropTable', 'tag_summary' ],
                ];
        }
 
@@ -1179,8 +1178,6 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'table' => 'change_tag', 'field' => 'ct_log_id' ],
                        [ 'table' => 'change_tag', 'field' => 'ct_rev_id' ],
                        [ 'table' => 'page_restrictions', 'field' => 'pr_user' ],
-                       [ 'table' => 'tag_summary', 'field' => 'ts_log_id' ],
-                       [ 'table' => 'tag_summary', 'field' => 'ts_rev_id' ],
                        [ 'table' => 'user_newtalk', 'field' => 'user_id' ],
                        [ 'table' => 'user_properties', 'field' => 'up_user' ],
                ];
index 19c4cfe..e9be744 100644 (file)
@@ -117,7 +117,6 @@ class OracleUpdater extends DatabaseUpdater {
                        [ 'addIndex', 'recentchanges', 'rc_name_type_patrolled_timestamp',
                                'patch-add-rc_name_type_patrolled_timestamp_index.sql' ],
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
-                       [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
 
                        // 1.29
                        [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
@@ -166,6 +165,8 @@ class OracleUpdater extends DatabaseUpdater {
 
                        // 1.33
                        [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
+                       [ 'dropTable', 'valid_tag' ],
+                       [ 'dropTable', 'tag_summary' ],
 
                        // KEEP THIS AT THE BOTTOM!!
                        [ 'doRebuildDuplicateFunction' ],
index 9ddc85a..7c0d3e3 100644 (file)
@@ -71,7 +71,6 @@ class PostgresUpdater extends DatabaseUpdater {
                        [ 'addSequence', 'externallinks', false, 'externallinks_el_id_seq' ],
                        [ 'addSequence', 'watchlist', false, 'watchlist_wl_id_seq' ],
                        [ 'addSequence', 'change_tag', false, 'change_tag_ct_id_seq' ],
-                       [ 'addSequence', 'tag_summary', false, 'tag_summary_ts_id_seq' ],
 
                        # new tables
                        [ 'addTable', 'category', 'patch-category.sql' ],
@@ -84,8 +83,6 @@ class PostgresUpdater extends DatabaseUpdater {
                        [ 'addTable', 'redirect', 'patch-redirect.sql' ],
                        [ 'addTable', 'updatelog', 'patch-updatelog.sql' ],
                        [ 'addTable', 'change_tag', 'patch-change_tag.sql' ],
-                       [ 'addTable', 'tag_summary', 'patch-tag_summary.sql' ],
-                       [ 'addTable', 'valid_tag', 'patch-valid_tag.sql' ],
                        [ 'addTable', 'user_properties', 'patch-user_properties.sql' ],
                        [ 'addTable', 'log_search', 'patch-log_search.sql' ],
                        [ 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ],
@@ -443,8 +440,6 @@ class PostgresUpdater extends DatabaseUpdater {
                                '( rc_namespace, rc_type, rc_patrolled, rc_timestamp )' ],
                        [ 'addPgField', 'change_tag', 'ct_id',
                                "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('change_tag_ct_id_seq')" ],
-                       [ 'addPgField', 'tag_summary', 'ts_id',
-                               "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('tag_summary_ts_id_seq')" ],
 
                        // 1.29
                        [ 'addPgField', 'externallinks', 'el_index_60', "BYTEA NOT NULL DEFAULT ''" ],
@@ -567,7 +562,6 @@ class PostgresUpdater extends DatabaseUpdater {
                        [ 'setSequenceOwner', 'job', 'job_id', 'job_job_id_seq' ],
                        [ 'setSequenceOwner', 'category', 'cat_id', 'category_cat_id_seq' ],
                        [ 'setSequenceOwner', 'change_tag', 'ct_id', 'change_tag_ct_id_seq' ],
-                       [ 'setSequenceOwner', 'tag_summary', 'ts_id', 'tag_summary_ts_id_seq' ],
                        [ 'setSequenceOwner', 'sites', 'site_id', 'sites_site_id_seq' ],
 
                        // 1.32
@@ -604,6 +598,8 @@ class PostgresUpdater extends DatabaseUpdater {
 
                        // 1.33
                        [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
+                       [ 'dropTable', 'valid_tag' ],
+                       [ 'dropTable', 'tag_summary' ],
                ];
        }
 
index 2f39912..1d99b87 100644 (file)
@@ -43,8 +43,6 @@ class SqliteUpdater extends DatabaseUpdater {
 
                        // 1.15
                        [ 'addTable', 'change_tag', 'patch-change_tag.sql' ],
-                       [ 'addTable', 'tag_summary', 'patch-tag_summary.sql' ],
-                       [ 'addTable', 'valid_tag', 'patch-valid_tag.sql' ],
 
                        // 1.16
                        [ 'addTable', 'user_properties', 'patch-user_properties.sql' ],
@@ -54,7 +52,7 @@ class SqliteUpdater extends DatabaseUpdater {
                        [ 'doLogUsertextPopulation' ],
                        [ 'doLogSearchPopulation' ],
                        [ 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ],
-                       [ 'addIndex', 'tag_summary', 'tag_summary_rc_id', 'patch-change_tag-indexes.sql' ],
+                       [ 'dropIndex', 'change_tag', 'ct_rc_id', 'patch-change_tag-indexes.sql' ],
                        [ 'addField', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ],
                        [ 'sqliteSetupSearchindex' ],
 
@@ -157,7 +155,6 @@ class SqliteUpdater extends DatabaseUpdater {
                        [ 'addIndex', 'recentchanges', 'rc_name_type_patrolled_timestamp',
                                'patch-add-rc_name_type_patrolled_timestamp_index.sql' ],
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
-                       [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
 
                        // 1.29
                        [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
@@ -242,6 +239,8 @@ class SqliteUpdater extends DatabaseUpdater {
 
                        // 1.33
                        [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
+                       [ 'dropTable', 'valid_tag' ],
+                       [ 'dropTable', 'tag_summary' ],
                ];
        }
 
index b612a8b..876ed53 100644 (file)
        "config-skins-help": "Kavet eo bet ar gwiskadurioù renablet a-us en ho kavlec'h <code>./skins</code>. Ret eo deoc'h gweredekaat unan da nebeutañ, ha dibab an hini dre ziouer.",
        "config-skins-use-as-default": "Implijout ar gwiskadur-mañ dre ziouer",
        "config-skins-missing": "N'eus bet kavet gwiskadur ebet : ober a raio MediaWiki gant unan dre ziouer betek ma vo staliet reoù a zegouezh.",
-       "config-skins-must-enable-some": "Ret eo deoc'h dibab da nebautañ ur gwiskadur da weredekaat.",
+       "config-skins-must-enable-some": "Ret eo deoc'h dibab ur gwiskadur da weredekaat da nebeutañ.",
        "config-skins-must-enable-default": "Ar gwiskadur dre ziouer dibabet a rank bezañ gweredekaet.",
        "config-install-alreadydone": "'''Diwallit''': Staliet hoc'h eus MediaWiki dija war a seblant hag emaoc'h o klask e staliañ c'hoazh.\nKit d'ar bajenn war-lerc'h, mar plij.",
        "config-install-begin": "Pa vo bet pouezet ganeoc'h war \"{{int:config-continue}}\"  e krogo staliadur MediaWiki.\nPouezit war \"{{int:config-back}}\" mar fell deoc'h cheñch tra pe dra.",
index 159b66e..7d3077f 100644 (file)
@@ -83,7 +83,7 @@
        "config-logo": "URL'ey Logoy:",
        "config-extensions": "Olekeni",
        "config-skins": "Temey",
-       "config-install-step-done": "qeyd ke",
+       "config-install-step-done": "temam",
        "config-install-step-failed": "ebe ser nêkewt",
        "config-install-schema": "Şema dek",
        "config-install-pg-commit": "Vırnayışa cemaati",
index 955b4f4..1a64890 100644 (file)
@@ -24,7 +24,8 @@
                        "Suchichi02",
                        "Omotecho",
                        "Yusuke1109",
-                       "Aefgh39622"
+                       "Aefgh39622",
+                       "Tomri5"
                ]
        },
        "config-desc": "MediaWiki のインストーラー",
        "config-db-host-oracle": "データベース TNS:",
        "config-db-host-oracle-help": "有効な[http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm ローカル接続名]を入力してください。tnsnames.ora ファイルは、このインストール先から参照できる場所に置いてください。<br />ご使用中のクライアント ライブラリが 10g 以降の場合、[http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect] ネーミング メソッドを使用できます。",
        "config-db-wiki-settings": "このウィキの識別情報",
-       "config-db-name": "ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹å\90\8d (ã\83\8fã\82¤ã\83\95ã\83³ã\81¯ä¸\8dè¦\81):",
+       "config-db-name": "ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹å\90\8d (ã\83\8fã\82¤ã\83\95ã\83³ã\81¯ä½¿ç\94¨ä¸\8då\8f¯):",
        "config-db-name-help": "このウィキを識別する名前を入力してください。\n空白を含めることはできません。\n\n共有ウェブホストを利用している場合、ホスティングプロバイダーが特定の使用可能なデータベース名を提供するか、あるいは管理パネルからデータベースを作成できるようにしているでしょう。",
        "config-db-name-oracle": "データベースのスキーマ:",
        "config-db-account-oracle-warn": "バックエンドのデータベースとして Oracle をインストールする場合、3つのシナリオが考えられます。\n\nデータベース用のアカウントをインストールのプロセス途中で作成したい場合、インストールに使うデータベース用のアカウントしては SYSDBAロール付きのアカウントを指定し、ウェブアクセス用アカウントには必要なログイン情報を指定してください。あるいは、ウェブアクセス用のアカウントを手動で作成して、そのアカウント(スキーマオブジェクトの作成のパーミッションを要求する場合)だけを使うか、二つの異なるアカウントを用意して一つは特権を付与できるもの、もう一つをウェブアクセス用の制限アカウントとしてください。\n\n要求された特権でアカウントを作成するスクリプトは、このインストール環境では、\"maintenance/oracle/\" にあります。制限アカウントを使用することは、デフォルトアカウントでのすべてのメンテナンス特権を無効にすることにご注意ください。",
index 2fb5ba4..618e5c9 100644 (file)
@@ -28,8 +28,8 @@
        "config-no-session": "Ваши подаци о сесији су изгубљени!\nПроверите датотеку php.ini и уверите се да је параметар <code>session.save_path</code> постављен на одговарајући директоријум.",
        "config-your-language": "Ваш језик:",
        "config-your-language-help": "Изаберите језик који желите да користите током процеса инсталације.",
-       "config-wiki-language": "Wiki језик:",
-       "config-wiki-language-help": "Изаберите језик на ком ће wiki бити претежно написан.",
+       "config-wiki-language": "Вики језик:",
+       "config-wiki-language-help": "Изаберите језик на ком ће вики бити претежно написан.",
        "config-back": "← Назад",
        "config-continue": "Настави →",
        "config-page-language": "Језик",
@@ -46,7 +46,7 @@
        "config-page-releasenotes": "Напомене о издању",
        "config-page-copying": "Копирање",
        "config-page-upgradedoc": "Надоградња",
-       "config-page-existingwiki": "Постојећи wiki",
+       "config-page-existingwiki": "Постојећи вики",
        "config-help-restart": "Желите ли да обришете све сачуване податке које сте унели и поново покренете процес инсталације?",
        "config-restart": "Да, покрени поново",
        "config-welcome": "=== Провера окружења ===\nСада ће се извршити основна провера како би се утврдило да ли је ово окружење погодно за MediaWiki инсталацију.\nНе заборавите да укључите ове информације ако тражите подршку како завршити инсталацију.",
@@ -82,9 +82,9 @@
        "config-db-type": "Тип базе података:",
        "config-db-host": "Хост базе података",
        "config-db-host-oracle": "TNS базе података:",
-       "config-db-wiki-settings": "Идентификуј овај wiki",
+       "config-db-wiki-settings": "Идентификуј овај вики",
        "config-db-name": "Име базе података (без цртица):",
-       "config-db-name-help": "Одаберите име које идентификује ваш wiki.\nОно не треба да садржи размаке.\n\nАко користите дељени веб-хостинг, ваш добављач услуге хостинга ће вам дати одређено име базе података за коришћење или ће вас пустити да правите базе података путем контролне табле.",
+       "config-db-name-help": "Одаберите име које идентификује ваш вики.\nОно не треба да садржи размаке.\n\nАко користите дељени веб-хостинг, ваш добављач услуге хостинга ће вам дати одређено име базе података за коришћење или ће вас пустити да правите базе података путем контролне табле.",
        "config-db-name-oracle": "Шема базе података:",
        "config-db-install-account": "Кориснички налог за инсталацију",
        "config-db-username": "Корисничко име базе података:",
        "config-db-sys-user-exists-oracle": "Кориснички налог „$1” већ постоји. SYSDBA се само може користити за отварање новог налога!",
        "config-postgres-old": "Неопходан је PostgreSQL $1 или новији. Ви имате $2.",
        "config-mssql-old": "Неопходан је Microsoft SQL Server $1 или новији. Ви имате $2.",
-       "config-sqlite-name-help": "Одаберите име које идентификује ваш wiki.\nНе користите размаке или цртице.\nОво ће се користити за име датотеке SQLite података.",
+       "config-sqlite-name-help": "Одаберите име које идентификује ваш вики.\nНе користите размаке или цртице.\nОво ће се користити за име датотеке SQLite података.",
        "config-sqlite-mkdir-error": "Грешка при прављењу директоријума са подацима „$1”.\nПроверите локацију, па покушајте поново.",
        "config-sqlite-dir-unwritable": "Није могуће уписати у директоријум „$1”.\nПромените му дозволе, тако да веб-сервер може да уписује у њему, па покушајте поново.",
        "config-sqlite-connection-error": "$1.\n\nПроверите директоријум са подацима и име базе података испод, па покушајте поново.",
        "config-sqlite-fts3-downgrade": "PHP-у недостаје FTS3 подршка, поништавање надоградње табела.",
        "config-can-upgrade": "Постоје MediaWiki табеле у овој бази података.\nДа бисте их надоградили на MediaWiki $1, кликните на <strong>Настави</strong>.",
        "config-upgrade-error": "Дошло је до грешке при надоградњи MediaWiki табела у бази података.\n\nЗа више информација, погледајте евиденцију изнад, да бисте покушали поново, кликните на <strong>Настави</strong>.",
-       "config-upgrade-done": "Надоградња је завршена.\n\nСада можете да [$1 почнете да користите свој wiki].\n\nАко желите да поново генеришете датотеку <code>LocalSettings.php</code>, кликните на дугме испод.\nОво се <strong>не препоручује</strong> осим ако имате проблеме са wiki-јем.",
-       "config-upgrade-done-no-regenerate": "Надоградња је завршена.\n\nСада можете да [$1 почнете да користите свој wiki].",
+       "config-upgrade-done": "Надоградња је завршена.\n\nСада можете да [$1 почнете да користите свој вики].\n\nАко желите да поново генеришете датотеку <code>LocalSettings.php</code>, кликните на дугме испод.\nОво се <strong>не препоручује</strong> осим ако имате проблеме са викијем.",
+       "config-upgrade-done-no-regenerate": "Надоградња је завршена.\n\nСада можете да [$1 почнете да користите свој вики].",
        "config-regenerate": "Регенериши LocalSettings.php →",
        "config-show-table-status": "Упит <code>SHOW TABLE STATUS</code> није успео!",
        "config-unknown-collation": "<strong>Упозорење:</strong> База података користи непрепозната правила поређења.",
        "config-db-web-account": "Налог базе података за веб-приступ",
-       "config-db-web-help": "Изаберите кориснички име и лозинку коју ће веб-сервер користити за повезивање са сервером базе података, током свакодневног рада на wiki-ју.",
+       "config-db-web-help": "Изаберите кориснички име и лозинку коју ће веб-сервер користити за повезивање са сервером базе података, током свакодневног рада на викију.",
        "config-db-web-account-same": "Користи исти налог као и за инсталацију",
        "config-db-web-create": "Отвори налог ако већ не постоји.",
        "config-db-web-no-create-privs": "Налог који сте навели за инсталацију нема довољне привилегије да отвори налог.\nНалог који овде наведете већ мора да постоји.",
        "config-mssql-auth": "Тип потврде идентитета:",
        "config-mssql-sqlauth": "SQL Server потврда идентитета",
        "config-mssql-windowsauth": "Windows потврда идентитета",
-       "config-site-name": "Име wiki-ја:",
+       "config-site-name": "Име викија:",
        "config-site-name-help": "Ово ће се појавити у насловној траци прегледача и на разним другим местима.",
-       "config-site-name-blank": "Унесите име сајта.",
+       "config-site-name-blank": "Унесите име локације.",
        "config-project-namespace": "Именски простор пројекта:",
        "config-ns-generic": "Пројекат",
-       "config-ns-site-name": "Исти као wiki име: $1",
+       "config-ns-site-name": "Исти као вики име: $1",
        "config-ns-other": "Друго (наведите)",
        "config-ns-other-default": "MyWiki",
        "config-ns-invalid": "Наведени именски простор „<nowiki>$1</nowiki>” није важећи.\nНаведите други именски простор пројекта.",
        "config-admin-name": "Ваше корисничко име:",
        "config-admin-password": "Лозинка:",
        "config-admin-password-confirm": "Поновите лозинку:",
-       "config-admin-help": "Овде унесите жељено корисничко име; на пример, „Александар Живковић”.\nОво име ћете користити за пријаву на wiki.",
+       "config-admin-help": "Овде унесите жељено корисничко име; на пример, „Александар Живковић”.\nОво име ћете користити за пријаву на вики.",
        "config-admin-name-blank": "Унесите корисничко име администратора.",
        "config-admin-name-invalid": "Наведено корисничко име „<nowiki>$1</nowiki>” није важеће.\nНаведите друго.",
        "config-admin-password-blank": "Унесите лозинку за налог администратора.",
        "config-subscribe": "Претплатите се на [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release announcements дописну листу].",
        "config-subscribe-noemail": "Покушали сте да се претплатите на дописну листу за објаве о новим издањима без пружања адресе е-поште.\nПружите адресу е-поште ако желите да се претплатите на њу.",
        "config-pingback": "Дели податке о овој инсталацији са MediaWiki програмерима.",
-       "config-almost-done": "Скоро сте готови!\nСада можете прескочити преосталу конфигурацију и одмах инсталирати wiki.",
+       "config-almost-done": "Скоро сте готови!\nСада можете прескочити преосталу конфигурацију и одмах инсталирати вики.",
        "config-optional-continue": "Постави ми још питања.",
-       "config-optional-skip": "Већ ми је досадно, само инсталирај wiki.",
+       "config-optional-skip": "Већ ми је досадно, само инсталирај вики.",
        "config-profile": "Профил корисничких група:",
-       "config-profile-wiki": "Отворен wiki",
+       "config-profile-wiki": "Отворен вики",
        "config-profile-no-anon": "Неопходно је отворити налог",
        "config-profile-fishbowl": "Само овлашћени уредници",
-       "config-profile-private": "Приватан wiki",
-       "config-profile-help": "Wiki-ји најбоље функционишу када дозвољавате што више корисника да уређују како је то могуће.\nУ MediaWiki-ју, лако је прегледати недавне промене и вратити сваку штету коју почине наивни или злонамерни корисници.\n\nМеђутим, многи су пронашли MediaWiki да је користан у широкој разноликости улога, а понекад није лако уверити се у све предности начина wiki-ја.\nТако да имате избор.\n\nМодел <strong>{{int:config-profile-wiki}}</strong> дозвољава свима да уређују, без пријављивања.\nWiki-ји са <strong>{{int:config-profile-no-anon}}</strong> пружају додатну одговорност, али може спречити случајне доприносе.\n\n<strong>{{int:config-profile-fishbowl}}</strong> сценарио дозвољава одобреним корисницима да уређују, али сви могу видети странице, укључујући историју.\n<strong>{{int:config-profile-private}}</strong> само дозвољава одобреним корисницима да виде странице, са истом групом дозвољеном да уређује.\n\nСложене конфигурације корисничких права су доступне након инсталације, погледајте [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights одговарајући ручни унос].",
+       "config-profile-private": "Приватан вики",
+       "config-profile-help": "Викији најбоље функционишу када дозвољавате што више корисника да уређују како је то могуће.\nУ MediaWiki-ју, лако је прегледати недавне промене и вратити сваку штету коју почине наивни или злонамерни корисници.\n\nМеђутим, многи су пронашли MediaWiki да је користан у широкој разноликости улога, а понекад није лако уверити се у све предности начина викија.\nТако да имате избор.\n\nМодел <strong>{{int:config-profile-wiki}}</strong> дозвољава свима да уређују, без пријављивања.\nВикији са <strong>{{int:config-profile-no-anon}}</strong> пружају додатну одговорност, али може спречити случајне доприносе.\n\n<strong>{{int:config-profile-fishbowl}}</strong> сценарио дозвољава одобреним корисницима да уређују, али сви могу видети странице, укључујући историју.\n<strong>{{int:config-profile-private}}</strong> само дозвољава одобреним корисницима да виде странице, са истом групом дозвољеном да уређује.\n\nСложене конфигурације корисничких права су доступне након инсталације, погледајте [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights одговарајући ручни унос].",
        "config-license": "Ауторска права и лиценца:",
        "config-license-none": "Без подножја за лиценцу",
        "config-license-cc-by-sa": "Creative Commons Ауторство-Делити под истим условима",
        "config-cc-not-chosen": "Одаберите коју Creative Commons лиценцу желите и кликните на „настави”.",
        "config-advanced-settings": "Напредна конфигурација",
        "config-cache-options": "Подешавања за кеширање објекта:",
-       "config-cache-none": "Нема кеширања (функционалност није уклоњена, али брзина може утицати на веће wiki сајтове)",
+       "config-cache-none": "Нема кеширања (функционалност није уклоњена, али брзина може утицати на веће вики локације)",
        "config-cache-accel": "Кеширање PHP објекта (APC, APCu or WinCache)",
        "config-cache-memcached": "Користи Memcached (захтева додатно подешавање и конфигурацију)",
        "config-memcached-servers": "Memcached сервери:",
        "config-install-mainpage-exists": "Главна страна већ постоји, прескакање",
        "config-install-extension-tables": "Прављење табела за омогућене додатке",
        "config-install-mainpage-failed": "Није могуће уметнути главну страну: $1",
-       "config-install-done": "<strong>Честитамо!</strong>\nИнсталирали сте MediaWiki.\n\nИнсталациони програм је генерисао датотеку <code>LocalSettings.php</code>.\nОна садржи сву вашу конфигурацију.\n\nМораћете да је преузмете и ставите у базу ваше wiki инсталације (исти директоријум као index.php). Преузимање би аутоматски требало почети.\n\nАко преузимање није понуђено, или ако га откажете, можете поново покренути преузимање тако што ћете кликнути на доленаведену везу:\n\n$3\n\n<strong>Напомена:</strong> Ако то одмах не урадите, ова генерисана конфигурациона датотека неће вам бити доступна касније ако изађете из инсталације без преузимања.\n\nКада је то учињено, можете да <strong>[$2 посетите свој wiki]</strong>.",
-       "config-install-done-path": "<strong>Честитамо!</strong>\nИнсталирали сте MediaWiki.\n\nИнсталациони програм је генерисао датотеку <code>LocalSettings.php</code>.\nОна садржи сву вашу конфигурацију.\n\nМораћете да је преузмете и ставите у <code>$4</code>. Преузимање би аутоматски требало почети.\n\nАко преузимање није понуђено, или ако га откажете, можете поново покренути преузимање тако што ћете кликнути на доленаведену везу:\n\n$3\n\n<strong>Напомена:</strong> Ако то одмах не урадите, ова генерисана конфигурациона датотека неће вам бити доступна касније ако изађете из инсталације без преузимања.\n\nКада је то учињено, можете да <strong>[$2 посетите свој wiki]</strong>.",
-       "config-install-success": "MediaWiki је успешно инсталиран. Сада можете посетити <$1$2> да бисте видели свој wiki.\nАко имате питања, погледајте нашу листу често постављаних питања: <https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ> или користите један од форума за подршку који су повезани на тој страници.",
+       "config-install-done": "<strong>Честитамо!</strong>\nИнсталирали сте MediaWiki.\n\nИнсталациони програм је генерисао датотеку <code>LocalSettings.php</code>.\nОна садржи сву вашу конфигурацију.\n\nМораћете да је преузмете и ставите у базу ваше вики инсталације (исти директоријум као index.php). Преузимање би аутоматски требало почети.\n\nАко преузимање није понуђено, или ако га откажете, можете поново покренути преузимање тако што ћете кликнути на доленаведену везу:\n\n$3\n\n<strong>Напомена:</strong> Ако то одмах не урадите, ова генерисана конфигурациона датотека неће вам бити доступна касније ако изађете из инсталације без преузимања.\n\nКада је то учињено, можете да <strong>[$2 посетите свој вики]</strong>.",
+       "config-install-done-path": "<strong>Честитамо!</strong>\nИнсталирали сте MediaWiki.\n\nИнсталациони програм је генерисао датотеку <code>LocalSettings.php</code>.\nОна садржи сву вашу конфигурацију.\n\nМораћете да је преузмете и ставите у <code>$4</code>. Преузимање би аутоматски требало почети.\n\nАко преузимање није понуђено, или ако га откажете, можете поново покренути преузимање тако што ћете кликнути на доленаведену везу:\n\n$3\n\n<strong>Напомена:</strong> Ако то одмах не урадите, ова генерисана конфигурациона датотека неће вам бити доступна касније ако изађете из инсталације без преузимања.\n\nКада је то учињено, можете да <strong>[$2 посетите свој вики]</strong>.",
+       "config-install-success": "MediaWiki је успешно инсталиран. Сада можете посетити <$1$2> да бисте видели свој вики.\nАко имате питања, погледајте нашу листу често постављаних питања: <https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ> или користите један од форума за подршку који су повезани на тој страници.",
        "config-download-localsettings": "Преузми датотеку <code>LocalSettings.php</code>",
        "config-help": "помоћ",
        "config-help-tooltip": "кликните да бисте проширили",
        "config-nofile": "Није могуће пронаћи датотеку „$1”. Није ли избрисана?",
-       "config-extension-link": "Јесте ли знали да ваш wiki подржава [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions додатке]?\n\nМожете их прегледати [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category по категорији].",
+       "config-extension-link": "Јесте ли знали да ваш вики подржава [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions додатке]?\n\nМожете их прегледати [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category по категорији].",
        "config-skins-screenshots": "„$1” (снимци екрана: $2)",
        "config-skins-screenshot": "$1 ($2)",
        "config-extensions-requires": "$1 (захтева $2)",
        "config-extension-not-found": "Није могуће пронаћи датотеку регистрације за додатак „$1”",
        "config-extension-dependency": "Дошло је до грешке зависности при инсталирању додатка „$1”: $2",
        "mainpagetext": "<strong>MediaWiki је инсталиран.</strong>",
-       "mainpagedocfooter": "Погледајте [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Водич за кориснике] за информације о томе како користити wiki софтвер.\n\n== Увод ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Листа поставки конфигурације]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki ЧПП]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о MediaWiki издањима]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научите како да се борите против непожељног садржаја на свом wiki-ју]"
+       "mainpagedocfooter": "Погледајте [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Водич за кориснике] за информације о томе како користити вики софтвер.\n\n== Увод ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Листа поставки конфигурације]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki ЧПП]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о MediaWiki издањима]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научите како да се борите против непожељног садржаја на свом викију]"
 }
index 39f8f01..fdf96fe 100644 (file)
@@ -21,8 +21,8 @@ class SQLiteField implements Field {
        function defaultValue() {
                if ( is_string( $this->info->dflt_value ) ) {
                        // Typically quoted
-                       if ( preg_match( '/^\'(.*)\'$', $this->info->dflt_value ) ) {
-                               return str_replace( "''", "'", $this->info->dflt_value );
+                       if ( preg_match( '/^\'(.*)\'$/', $this->info->dflt_value, $matches ) ) {
+                               return str_replace( "''", "'", $matches[1] );
                        }
                }
 
index 776136f..20f9a78 100644 (file)
@@ -5,24 +5,40 @@ class ProfilerExcimer extends Profiler {
        private $realProf;
        private $period;
 
+       /**
+        * @param array $params Associative array of parameters:
+        *    - period: The sampling period
+        *    - maxDepth: The maximum stack depth collected
+        *    - cpuProfiler: A pre-started ExcimerProfiler instance for CPU
+        *      profiling of the entire request including configuration.
+        *    - realProfiler: A pre-started ExcimerProfiler instance for wall
+        *      clock profiling of the entire request.
+        */
        public function __construct( array $params = [] ) {
                parent::__construct( $params );
 
                $this->period = $params['period'] ?? 0.01;
                $maxDepth = $params['maxDepth'] ?? 100;
 
-               $this->cpuProf = new ExcimerProfiler;
-               $this->cpuProf->setEventType( EXCIMER_CPU );
-               $this->cpuProf->setPeriod( $this->period );
-               $this->cpuProf->setMaxDepth( $maxDepth );
-
-               $this->realProf = new ExcimerProfiler;
-               $this->realProf->setEventType( EXCIMER_REAL );
-               $this->realProf->setPeriod( $this->period );
-               $this->realProf->setMaxDepth( $maxDepth );
+               if ( isset( $params['cpuProfiler'] ) ) {
+                       $this->cpuProf = $params['cpuProfiler'];
+               } else {
+                       $this->cpuProf = new ExcimerProfiler;
+                       $this->cpuProf->setEventType( EXCIMER_CPU );
+                       $this->cpuProf->setPeriod( $this->period );
+                       $this->cpuProf->setMaxDepth( $maxDepth );
+                       $this->cpuProf->start();
+               }
 
-               $this->cpuProf->start();
-               $this->realProf->start();
+               if ( isset( $params['realProfiler'] ) ) {
+                       $this->realProf = $params['realProfiler'];
+               } else {
+                       $this->realProf = new ExcimerProfiler;
+                       $this->realProf->setEventType( EXCIMER_REAL );
+                       $this->realProf->setPeriod( $this->period );
+                       $this->realProf->setMaxDepth( $maxDepth );
+                       $this->realProf->start();
+               }
        }
 
        public function scopedProfileIn( $section ) {
index 1154e05..2afc548 100644 (file)
@@ -433,8 +433,9 @@ class Command {
                        // TODO replace with clear_last_error when requirements are bumped to PHP7
                        set_error_handler( function () {
                        }, 0 );
-                       // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged
-                       @trigger_error( '' );
+                       \MediaWiki\suppressWarnings();
+                       trigger_error( '' );
+                       \MediaWiki\restoreWarnings();
                        restore_error_handler();
 
                        $readPipes = array_filter( $pipes, function ( $fd ) use ( $desc ) {
index 18c1d70..8363e56 100644 (file)
@@ -295,7 +295,11 @@ class AllMessagesTablePager extends TablePager {
                                <th>" .
                $this->msg( 'allmessagescurrent' )->escaped() .
                "</th>
-                       </tr></thead><tbody>\n";
+                       </tr></thead>\n";
+       }
+
+       function getEndBody() {
+               return Html::closeElement( 'table' );
        }
 
        function formatValue( $field, $value ) {
@@ -352,18 +356,18 @@ class AllMessagesTablePager extends TablePager {
 
                // But if there's a customised message, add that too.
                if ( $row->am_customised ) {
-                       $s .= Xml::openElement( 'tr', $this->getRowAttrs( $row, true ) );
+                       $s .= Html::openElement( 'tr', $this->getRowAttrs( $row, true ) );
                        $formatted = strval( $this->formatValue( 'am_actual', $row->am_actual ) );
 
                        if ( $formatted === '' ) {
                                $formatted = "\u{00A0}";
                        }
 
-                       $s .= Xml::tags( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted )
-                               . "</tr>\n";
+                       $s .= Html::element( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted )
+                               . Html::closeElement( 'tr' );
                }
 
-               return $s;
+               return Html::rawElement( 'tbody', [], $s );
        }
 
        function getRowAttrs( $row ) {
index 187c0a9..b83c209 100644 (file)
@@ -459,14 +459,14 @@ class BotPassword implements IDBAccessObject {
                // Split name into name+appId
                $sep = self::getSeparator();
                if ( strpos( $username, $sep ) === false ) {
-                       return self::loginHook( $username, Status::newFatal( 'botpasswords-invalid-name', $sep ) );
+                       return self::loginHook( $username, null, Status::newFatal( 'botpasswords-invalid-name', $sep ) );
                }
                list( $name, $appId ) = explode( $sep, $username, 2 );
 
                // Find the named user
                $user = User::newFromName( $name );
                if ( !$user || $user->isAnon() ) {
-                       return self::loginHook( $user ?: $name, Status::newFatal( 'nosuchuser', $name ) );
+                       return self::loginHook( $user ?: $name, null, Status::newFatal( 'nosuchuser', $name ) );
                }
 
                if ( $user->isLocked() ) {
@@ -483,39 +483,39 @@ class BotPassword implements IDBAccessObject {
                        $result = $throttle->increase( $user->getName(), $request->getIP(), __METHOD__ );
                        if ( $result ) {
                                $msg = wfMessage( 'login-throttled' )->durationParams( $result['wait'] );
-                               return self::loginHook( $user, Status::newFatal( $msg ) );
+                               return self::loginHook( $user, null, Status::newFatal( $msg ) );
                        }
                }
 
                // Get the bot password
                $bp = self::newFromUser( $user, $appId );
                if ( !$bp ) {
-                       return self::loginHook( $user, Status::newFatal( 'botpasswords-not-exist', $name, $appId ) );
+                       return self::loginHook( $user, $bp,
+                               Status::newFatal( 'botpasswords-not-exist', $name, $appId ) );
                }
 
                // Check restrictions
                $status = $bp->getRestrictions()->check( $request );
                if ( !$status->isOK() ) {
-                       return self::loginHook( $user, Status::newFatal( 'botpasswords-restriction-failed' ) );
+                       return self::loginHook( $user, $bp, Status::newFatal( 'botpasswords-restriction-failed' ) );
                }
 
                // Check the password
                $passwordObj = $bp->getPassword();
                if ( $passwordObj instanceof InvalidPassword ) {
-                       return self::loginHook( $user, Status::newFatal( 'botpasswords-needs-reset', $name, $appId ) );
+                       return self::loginHook( $user, $bp,
+                               Status::newFatal( 'botpasswords-needs-reset', $name, $appId ) );
                }
                if ( !$passwordObj->equals( $password ) ) {
-                       return self::loginHook( $user, Status::newFatal( 'wrongpassword' ) );
+                       return self::loginHook( $user, $bp, Status::newFatal( 'wrongpassword' ) );
                }
 
                // Ok! Create the session.
                if ( $throttle ) {
                        $throttle->clear( $user->getName(), $request->getIP() );
                }
-               return self::loginHook(
-                       $user,
-                       Status::newGood( $provider->newSessionForRequest( $user, $bp, $request ) )
-               );
+               return self::loginHook( $user, $bp,
+                       Status::newGood( $provider->newSessionForRequest( $user, $bp, $request ) ) );
        }
 
        /**
@@ -525,12 +525,17 @@ class BotPassword implements IDBAccessObject {
         * AuthManager, call the AuthManagerLoginAuthenticateAudit hook.
         *
         * @param User|string $user User being logged in
+        * @param BotPassword|null $bp Bot sub-account, if it can be identified
         * @param Status $status Login status
         * @return Status The passed-in status
         */
-       private static function loginHook( $user, Status $status ) {
+       private static function loginHook( $user, $bp, Status $status ) {
+               $extraData = [];
                if ( $user instanceof User ) {
                        $name = $user->getName();
+                       if ( $bp ) {
+                               $extraData['appId'] = $name . self::getSeparator() . $bp->getAppId();
+                       }
                } else {
                        $name = $user;
                        $user = null;
@@ -541,7 +546,7 @@ class BotPassword implements IDBAccessObject {
                } else {
                        $response = AuthenticationResponse::newFail( $status->getMessage() );
                }
-               Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $response, $user, $name ] );
+               Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $response, $user, $name, $extraData ] );
 
                return $status;
        }
index 3bded91..c5fed42 100644 (file)
        "prefs-advancedwatchlist": "Разширени настройки",
        "prefs-displayrc": "Настройки за показване на списъка",
        "prefs-displaywatchlist": "Видими настройки",
+       "prefs-changesrc": "Показвани промени",
        "prefs-tokenwatchlist": "Маркер",
        "prefs-diffs": "Разлики",
        "prefs-help-prefershttps": "Това предпочитание ще бъде активирано при следващото влизане.",
index a0da5b4..7819758 100644 (file)
        "ns-specialprotected": "N'haller ket kemmañ ar pajennoù en esaouenn anv {{ns:special}}.",
        "titleprotected": "Gwarezet eo bet an titl-mañ p'eo bet krouet gant [[User:$1|$1]].\nSetu amañ perak <em>$2</em>.",
        "filereadonlyerror": "Dibosupl kemmañ ar restr \"$1\" abalamour m'emañ ar c'havlec'h restroù \"$2\" e mod lenn nemetken.\n\n\"$3\" eo an abeg roet gant merour ar reizhiad en deus prennet anezhi.",
+       "invalidtitle": "Titl direizh",
        "invalidtitle-knownnamespace": "Titl direizh gant an esaouenn anv \"$2\" hag an destenn \"$3\"",
        "invalidtitle-unknownnamespace": "Titl direizh gant an niverenn esaouenn anv $1 hag an destenn \"$2\" dianav",
        "exception-nologin": "N'oc'h ket kevreet",
        "subject-preview": "Rakwelet an danvez :",
        "previewerrortext": "C'hoarvezet ez eus ur fazi e-ser klask rakwelet ho kemmoù",
        "blockedtitle": "Implijer stanket",
-       "blockedtext": "'''Stanket eo bet ho kont implijer pe ho chomlec'h IP'''\n\nGant $1 eo bet graet.\nSetu an abeg evit se : ''$2''.\n\n* Stanket adalek : $8\n* Stanket betek : $6\n* Pad ar stankadenn : $7\n\nGallout a rit mont e darempred gant $1 pe gant unan eus ar [[{{MediaWiki:Grouppage-sysop}}|verourien]] all evit eskemm ganto war se. N'hallit implijout an arc'hwel 'kas ur postel d'an implijer-mañ' nemet ma'z eus bet spisaet ganeoc'h ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù kont]] ha ma n'eo ket bet stanket.\n$3 eo ho chomlec'h IP, ha #$5 eo niverenn an identelezh stanket.\nMerkit anezho en ho koulennoù bep tro.",
+       "blockedtext": "<strong>Stanket eo bet ho kont implijer pe ho chomlec'h IP</strong>\n\nGant $1 eo bet graet.\nSetu an abeg evit se : <em>$2</em>.\n\n* Stanket adalek : $8\n* Stanket betek : $6\n* Kont stanket : $7\n\nGallout a rit mont e darempred gant $1 pe gant unan eus ar [[{{MediaWiki:Grouppage-sysop}}|verourien]] all evit eskemm ganto war se. N'hallit implijout an arc'hwel ''{{int:emailuser}} nemet ma'z eus bet spisaet ganeoc'h ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù kont]] ha ma n'eo ket bet stanket.\n$3 eo ho chomlec'h IP, ha #$5 eo niverenn an identelezh stanket.\nMerkit anezho en ho koulennoù bep tro.",
        "autoblockedtext": "Stanket eo bet ho chomlec'h IP ent emgefreek rak implijet e veze gant un implijer all bet stanket gant $1.\nSetu aze an abeg :\n\n: ''$2''\n\n* Deroù ar stankadenn : $8\n* Termen ar stankadenn : $6\n* Kont stanket : $7\n\nGallout a rit mont e darempred gant $1 pe gant unan eus ar\n[[{{MediaWiki:Grouppage-sysop}}|verourien]] all ma kavit abeg er stankadenn.\n\nNotennit mat ne c'hallot implijout an dibarzh \"kas ur postel d'an implijer\" nemet ma'z eus bet merket ganeoc'h ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù implijer]] ha ma n'eo ket bet stanket ivez.\n\n$3 eo ho chomlec'h IP evit poent ha #$5 ho niverenn stankadenn.\nMerkit mat an titouroù-se war kement goulenn savet ganeoc'h.\n\n$5 eo ho niverenn stankadenn. Merkit mat an niverenn-se pa rit goulennoù.",
        "systemblockedtext": "Stanket eo bet hoc'h anv implijer pe ho chomlec'h IP ent emgefre gant MediaWiki.\nSetu perak :\n\n:<em>$2</em>\n\n* Deroù ar stankadenn : $8\n* Termen ar stankadenn : $6\n* Hinienn a sell ar stankadenn outi : $7\n\n$3 eo ho chomlec'h IP diouzhtu.\nMerkit mat ar munudoù skrivet a-us er c'hlemmoù a c'halljec'h ober.",
        "blockednoreason": "n'eus bet roet abeg ebet",
        "diff-paragraph-moved-toold": "Ar rannbennad azo bet fiñvet. Klikit evit mont davet al lec'hiadur gozh.",
        "difference-missing-revision": "!!{{PLURAL:$2|Un adweladur|$2 adweladurioù}} eus an disheñvelder ($1) {{PLURAL:$2|n'eo ket bet kavet|n'int ket bet adkavet}}.\n\nC'hoarvezout a ra peurliesañ pa vez heuliet ul liamm disheñvel dispredet war-zu ur bajenn zo bet dilamet.\nGallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} renabl an dilamadurioù].",
        "searchresults": "Disoc'hoù enklask",
+       "search-filter-title-prefix-reset": "Klask an holl bajennoù",
        "searchresults-title": "Disoc'hoù klask evit \"$1\"",
        "titlematches": "Klotadurioù gant an titloù",
        "textmatches": "Klotadurioù en testennoù",
        "prefs-watchlist-edits": "Niver a gemmoù da ziskouez er roll evezhiañ astennet :",
        "prefs-watchlist-edits-max": "Niver brasañ : 1000",
        "prefs-watchlist-token": "Jedouer evit ar roll evezhiañ :",
+       "prefs-watchlist-managetokens": "Merañ ar jedoueroù",
        "prefs-misc": "Penndibaboù liesseurt",
        "prefs-resetpass": "Cheñch ar ger-tremen",
        "prefs-changeemail": "Cheñch ar chomlec'h postel pe dilemel anezhañ",
        "right-edituserjs": "Kemmañ restroù JS implijerien all",
        "right-editmyusercss": "Aozañ ho restroù implijer CSS deoc'h-c'hwi",
        "right-editmyuserjson": "Aozañ ho restroù implijer JSON deoc'h-c'hwi",
-       "right-editmyuserjs": "Aoazañ ho restroù JavaScript implijer deoc'h-c'hwi",
+       "right-editmyuserjs": "Aozañ ho restroù JavaScript implijer deoc'h-c'hwi",
        "right-viewmywatchlist": "Gwelet ho roll-evezhiañ deoc'h-c'hwi",
        "right-editmywatchlist": "Kemmañ ho roll evezhiañ deoc'h-c'hwi. Notit mat e vo c'hoazh ouzhpennet pajennoù hep ar gwir-mañ gant obererezhioù zo.",
        "right-viewmyprivateinfo": "Gwelet ho roadennoù prevez deoc'h-c'hwi (da sk. chomlec'h postel, anv gwirion)",
        "recentchangeslinked-feed": "Heuliañ ar pajennoù liammet",
        "recentchangeslinked-toolbox": "Heuliañ ar pajennoù liammet",
        "recentchangeslinked-title": "Kemmoù a denn da \"$1\"",
-       "recentchangeslinked-summary": "Merkañ anv ur bajenn evit gwelet ar c'hemmoù war ar pajennoù liammet da pe adalek ar bajenn-se (evit gwelet izili ur rummad bennak, skrivañ Rummad:anv ar rummad).\nE <strong>tev</strong> emañ kemmoù ar pajennoù zo war ho [[Special:Watchlist|roll evezhiañ]].",
+       "recentchangeslinked-summary": "Merkañ anv ur bajenn evit gwelet ar c'hemmoù war ar pajennoù liammet da pe adalek ar bajenn-se (evit gwelet izili ur rummad bennak, skrivañ {{ns:category}}:Anv ar rummad).\nE <strong>tev</strong> emañ kemmoù ar pajennoù zo war ho [[Special:Watchlist|roll evezhiañ]].",
        "recentchangeslinked-page": "Anv ar bajenn :",
        "recentchangeslinked-to": "Diskouez ar c'hemmoù war-du ar pajennoù liammet kentoc'h eget re ar bajenn lakaet",
        "recentchanges-page-added-to-category": "[[:$1]] ouzhpennet d'ar rummad",
        "filehist-filesize": "Ment ar restr",
        "filehist-comment": "Notenn",
        "imagelinks": "Implij ar restr",
-       "linkstoimage": "Liammet eo {{PLURAL:$1|ar bajenn-mañ|an $1 pajenn-mañ}} ouzh ar restr-mañ :",
-       "linkstoimage-more": "Ouzhpenn $1 {{PLURAL:$1|bajenn zo liammet ouzh|pajenn zo liammet ouzh}} ar restr-mañ.\nNe laka ar roll-mañ war wel nemet {{PLURAL:$1|ar bajenn gentañ liammet ouzh|an $1 pajenn gentañ liammet ouzh}} ar rest-mañ.\nUr [[Special:WhatLinksHere/$2|roll klok]] a c'haller da gaout.",
-       "nolinkstoimage": "N'eus liamm ebet war-du ar skeudenn-mañ war pajenn ebet.",
+       "linkstoimage": "Implijout a ra {{PLURAL:$1|ar bajenn da heul|an $1 pajenn da heul}} ar restr-mañ :",
+       "linkstoimage-more": "Ouzhpenn $1 {{PLURAL:$1|bajenn zo liammet ouzh|pajenn zo liammet ouzh}} ar restr-mañ.\nNe ziskwel ar roll-mañ nemet {{PLURAL:$1|ar bajenn gentañ|an $1 pajenn gentañ}} a implij ar restr-mañ.\nUr [[Special:WhatLinksHere/$2|roll klok]] a c'haller da gaout.",
+       "nolinkstoimage": "Pajenn ebet ne implij ar restr-mañ.",
        "morelinkstoimage": "Gwelet [[Special:WhatLinksHere/$1|liammoù ouzhpenn]] war-du ar restr-mañ.",
        "linkstoimage-redirect": "$1 (adkas restr) $2",
        "duplicatesoffile": "Un eil eus ar restr-mañ eo {{PLURAL:$1|ar restr da-heul|ar restroù da-heul}}, ([[Special:FileDuplicateSearch/$2|evit gouzout hiroc'h]]) :",
        "deadendpages": "Pajennoù dall (hep liamm diabarzh)",
        "deadendpagestext": "Ar pajennoù da-heul n'int ket liammet ouzh pajenn ebet all eus {{SITENAME}}.",
        "protectedpages": "Pajennoù gwarezet",
+       "protectedpages-filters": "Siloù :",
        "protectedpages-indef": "Gwarezoù da badout hepken",
        "protectedpages-summary": "Rollañ a ra ar bajenn-mañ ar pajennoù zo gwarezet evit ar mare. Evit kaout roll ar pajennoù n'haller ket krouiñ, sellet ouzh [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Gwarez dre skalierad hepken",
        "ipb-disableusertalk": "Mirout ouzh an implijer-mañ da implijout e bajenn gaozeal dezhañ e-unan e-keit hag emañ stanket",
        "ipb-change-block": "Adstankañ an implijer-mañ gant an hevelep arventennoù",
        "ipb-confirm": "Kadarnaat ar stankadenn",
+       "ipb-type-label": "Seurt",
+       "ipb-pages-label": "Pajennoù",
        "badipaddress": "Kamm eo ar chomlec'h IP.",
        "blockipsuccesssub": "Stankadenn deuet da benn vat",
        "blockipsuccesstext": "Stanket eo bet [[Special:Contributions/$1|$1]].<br />\nSellit ouzh [[Special:BlockList|roll ar chomlec'hioù IP ha kontoù stanket]] evit gwiriañ ar stankadennoù.",
        "createaccountblock": "Harzet eo ar c'hrouiñ kontoù",
        "emailblock": "Postel stanket",
        "blocklist-nousertalk": "n'hall ket kemmañ e bajenn gaozeal dezhañ e-unan",
+       "blocklist-editing": "O kemmañ",
+       "blocklist-editing-sitewide": "o kemmañ (al lec'hienn a-bezh)",
        "ipblocklist-empty": "Goullo eo roll ar stankadennoù.",
        "ipblocklist-no-results": "An anv implijer pe ar chomlec'h IP goulennet n'eo ket stanket anezhañ.",
        "blocklink": "stankañ",
        "pageinfo-display-title": "Titl diskwelet",
        "pageinfo-default-sort": "Alc'hwez rummañ dre ziouer",
        "pageinfo-length": "Ment ar bajenn (en oktedoù)",
+       "pageinfo-namespace": "Esaouenn anv",
        "pageinfo-article-id": "Niverenn ar bajenn",
        "pageinfo-language": "Yezh ar bajenn",
        "pageinfo-language-change": "kemmañ",
        "confirm-unwatch-top": "Lemel ar bajenn-mañ a-ziwar ho roll evezhiañ",
        "confirm-rollback-button": "Mat eo",
        "confirm-rollback-top": "Disteurel ar c'hemmoù graet er bajenn-mañ ?",
+       "confirm-mcrundo-title": "Dizober ur c'hemm",
+       "mcrundofailed": "Dizober c'hwitet",
+       "mcrundo-missingparam": "Arventennoù rekis d'ar reked a vank.",
        "quotation-marks": "« $1 »",
        "imgmultipageprev": "← pajenn gent",
        "imgmultipagenext": "pajenn war-lerc'h →",
        "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-removed-redirect": "Nullañ an adkas",
+       "tag-mw-blank": "Goullonderiñ",
+       "tag-mw-replace": "Erlerc'hiet",
+       "tag-mw-rollback": "Dizober",
        "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.",
        "mw-widgets-titleinput-description-redirect": "adkas war-zu $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Ouzhpennañ ur rummad...",
        "mw-widgets-usersmultiselect-placeholder": "Ouzhpennañ muioc'h...",
+       "mw-widgets-titlesmultiselect-placeholder": "Ouzhpennañ muioc'h...",
        "date-range-from": "Adalek deiziañ an :",
        "date-range-to": "Betek deiziad an :",
        "sessionmanager-tie": "N'hallet ket kevrediñ meur a seurt reked dilesañ : $1.",
index 07a93b2..28cec09 100644 (file)
        "accmailtext": "S'ha enviat una contrasenya aleatòria a $2 per a {{GENDER:$1|l'usuari|la usuària}} [[User talk:$1|$1]].\n\nLa contrasenya per aquest nou compte pot ser canviada a la pàgina de ''[[Special:ChangePassword|canvi de contrasenya]]'' un cop connectat.",
        "newarticle": "(Nou)",
        "newarticletext": "Heu seguit un enllaç a una pàgina que encara no existeix.\nPer a crear-la, comenceu a escriure en l'espai de sota\n(vegeu l'[$1 ajuda] per a més informació).\nSi sou ací per error, simplement cliqueu al botó «Enrere» del vostre navegador.",
-       "anontalkpagetext": "----\n<em>Aquesta és la pàgina de discussió d'un usuari anònim que encara no ha creat un compte o que no fa servir el seu nom registrat. Per tant, hem de fer servir la seua adreça IP numèrica per a identificar-lo. Una adreça IP pot ser compartida per diversos usuaris. Si sou un usuari anònim i trobeu que us han adreçat comentaris no apropiats, [[Special:CreateAccount|creeu un compte]] o [[Special:UserLogin|inicieu sessió]] per a evitar futures confusions amb altres usuaris anònims.",
+       "anontalkpagetext": "----\n<em>Aquesta és la pàgina de discussió d'un usuari anònim que encara no ha creat un compte o que no fa servir el seu nom registrat.</em>\nPer tant, hem de fer servir l'adreça IP numèrica per a identificar-lo. \nUna adreça IP pot ser compartida per diversos usuaris. \nSi sou un usuari anònim i trobeu que us han adreçat comentaris no apropiats, [[Special:CreateAccount|creeu un compte]] o [[Special:UserLogin|inicieu sessió]] per a evitar futures confusions amb altres usuaris anònims.",
        "noarticletext": "Actualment no hi ha text en aquesta pàgina.\nPodeu [[Special:Search/{{PAGENAME}}|cercar aquest títol]] en altres pàgines,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar en els registres]\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear-la ara]</span>.",
        "noarticletext-nopermission": "Actualment no hi ha text en aquesta pàgina.\nPodeu [[Special:Search/{{PAGENAME}}|cercar aquest títol]] en altres pàgines o bé <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar en els registres relacionats]</span>, però no teniu permisos per crear la pàgina.",
        "missing-revision": "La revisió núm. $1 de la pàgina anomenada «{{FULLPAGENAME}}» no existeix.\n\nNormalment això ocorre quan seguiu un enllaç d’historial desactualitzat que apunta a una pàgina que s’ha suprimit.\nPodeu trobar detalls en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registre de supressions].",
        "uploadstash-zero-length": "El fitxer té mida zero.",
        "invalid-chunk-offset": "El desplaçament del fragment no és vàlid",
        "img-auth-accessdenied": "Accés denegat",
-       "img-auth-nopathinfo": "Hi manca PATH_INFO.\nEl servidor no està configurat per passar aquesta informació.\nPot estar basat en CGI i no ser compatible amb img_auth.\nConsulteu https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "Hi manca la informació del camí.\nCal configurar el servidor per passar les variables REQUEST_URI i/o PATH_INFO.\nConsulteu https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "No s'ha trobat la ruta sol·licitada al directori de càrrega configurat.",
        "img-auth-badtitle": "No s'ha pogut construir un títol vàlid a partir de \"$1\".",
        "img-auth-nologinnWL": "No has iniciat sessió i \"$1\" no està a la llista blanca.",
index eda44b8..eb3c68e 100644 (file)
        "recentchangescount": "ژمارەی گۆڕانکارییەکان کە نیشان ئەدرێن لە حاڵەتی دیفاڵت:",
        "prefs-help-recentchangescount": "زۆرترین ژمارە: ١٠٠٠",
        "prefs-help-watchlist-token2": "ئەمە کلیلێکی تایبەتیی پێڕستی چاودێرییەکەتە. ھەرکەسێک بیزانێت دەتوانێت پێڕستی چاودێرییەکەت ببینێت، بۆیە لای خۆت بیپارێزە.\nئەگەر پێویستی کرد، [[Special:ResetTokens|دەتوانیت بیگۆڕیت]].",
+       "prefs-help-tokenmanagement": "دەتوانیت کلیلی نهێنی هەژمارەکەت ببینیت و بگۆڕیت، کە پێڕستی چاودێریتی پێ دەبینرێت. هەرکەسێک ئەم کلیلە بزانێت دەتوانێت پێڕستی چاودێریت ببینێت، بۆیە مەیدە بە کەس.",
        "savedprefs": "ھەڵبژاردەکانت پاشەکەوت کران",
        "savedrights": "گرووپەکانی بەکارھێنەر بۆ $1 پاشەکەوت کران.",
        "timezonelegend": "ناوچەی کاتی:",
        "prefs-advancedwatchlist": "هەڵبژاردە پێشکەوتووەکان",
        "prefs-displayrc": "ھەڵبژاردەکانی نیشاندان",
        "prefs-displaywatchlist": "ھەڵبژاردەکانی نیشاندان",
+       "prefs-changesrc": "ئەو گۆڕانکارییانەی نیشان دەدرێن",
+       "prefs-changeswatchlist": "ئەو گۆڕانکارییانەی نیشان دەدرێن",
+       "prefs-pageswatchlist": "پەڕە چاودێریکراوەکان",
        "prefs-tokenwatchlist": "نیشانە",
        "prefs-diffs": "جیاوازییەکان",
        "prefs-help-prefershttps": "بەکارخستنی ئەم تایبەتمەندییە کاریگەری لەسەر چوونەژوورەوەی داھاتووت دروست دەکات",
        "changecontentmodel-reason-label": "هۆکار:",
        "changecontentmodel-submit": "گۆڕین",
        "log-name-contentmodel": "لۆگی گۆڕینی مۆدێلی ناوەڕۆک",
+       "logentry-contentmodel-new": "$1 پەڕەی $3ی بە مۆدێلی ناوەڕۆکی نابنچینەیی «$5» دروست کرد.",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|مۆدێلی}} ناوەڕۆکی پەڕەی $3ی لە «$4» گۆڕی بە «$5»",
        "logentry-contentmodel-change-revertlink": "گەڕاندنەوە",
        "logentry-contentmodel-change-revert": "گەڕاندنەوە",
index d0cf811..27dda1b 100644 (file)
        "mcrundofailed": "Vrácení editace zpět se nezdařilo",
        "mcrundo-missingparam": "V požadavku chybí povinné parametry.",
        "mcrundo-changed": "Od chvíle, kdy jste si prohlédli rozdíl, se stránka změnila. Zkontrolujte prosím novou změnu.",
+       "mcrundo-parse-failed": "Nepodařilo se analyzovat novou revizi: $1",
        "ellipsis": "…",
        "percent": "$1&#160;%",
        "quotation-marks": "„$1“",
index b703ffc..0596435 100644 (file)
@@ -70,7 +70,8 @@
                        "Saederup92",
                        "Fitoschido",
                        "Jorn Ari",
-                       "Fnielsen"
+                       "Fnielsen",
+                       "Weblars"
                ]
        },
        "tog-underline": "Understreg henvisninger:",
        "prefs-editwatchlist-clear": "Ryd din overvågningsliste",
        "prefs-watchlist-days": "Antal dage der skal vises i overvågningslisten:",
        "prefs-watchlist-days-max": "Højst $1 {{PLURAL:$1|dag|dage}}",
-       "prefs-watchlist-edits": "Maksimalt antal redigeringer der vises i overvågningsliste:",
+       "prefs-watchlist-edits": "Maksimalt antal redigeringer der vises i overvågningslisten:",
        "prefs-watchlist-edits-max": "Maks. 1000",
-       "prefs-watchlist-token": "Overvågningslistenøgle:",
+       "prefs-watchlist-token": "Nøgle til overvågningsliste:",
+       "prefs-watchlist-managetokens": "Håndtér nøgler",
        "prefs-misc": "Forskelligt",
        "prefs-resetpass": "Skift adgangskode",
        "prefs-changeemail": "Skift eller fjern e-mailadresse",
        "stub-threshold-disabled": "Deaktiveret",
        "recentchangesdays": "Antal dage som skal vises i seneste ændringer:",
        "recentchangesdays-max": "(maks. $1 {{PLURAL:$1|dag|dage}})",
-       "recentchangescount": "Antal redigeringer som skal vises som standard i sidste ændringer, sidehistorikker og logger:",
+       "recentchangescount": "Antal redigeringer der som standard vises i seneste ændringer, sidehistorikker og logger:",
        "prefs-help-recentchangescount": "Maksimalt antal: 1000",
        "prefs-help-watchlist-token2": "Dette er den hemmelige nøgle til web-feed af din overvågningsliste.\nHvis andre kender den, vil man være i stand til at læse din overvågningsliste, så del den ikke.\n[[Special:ResetTokens|Klik her]] hvis du har brug at nulstille den.",
+       "prefs-help-tokenmanagement": "Du kan se og nulstille den hemmelige nøgle for din konto som kan få tilgang til din overvågningsliste via feeds. Alle som har nøglen vil kunne læse din overvågningsliste, så del den derfor ikke.",
        "savedprefs": "Dine indstillinger er blevet gemt.",
        "savedrights": "Brugergrupperne for {{GENDER:$1|$1}} er blevet gemt.",
        "timezonelegend": "Tidszone:",
        "prefs-changesrc": "Ændringer vist",
        "prefs-changeswatchlist": "Ændringer vist",
        "prefs-pageswatchlist": "Overvågede sider",
-       "prefs-tokenwatchlist": "Mærke",
+       "prefs-tokenwatchlist": "Nøgle",
        "prefs-diffs": "Forskelle",
        "prefs-help-prefershttps": "Denne indstilling træder i kraft næste gang du logger på.",
        "prefswarning-warning": "Du har foretaget ændringer af dine indstillinger, som ikke er gemt endnu.\nHvis du forlader denne side uden at klikke \"$1\", vil dine indstillinger ikke blive opdateret.",
        "rcfilters-watchlist-showupdated": "Ændringer til sider du ikke har besøgt siden ændringerne blev gjort vises med <strong>fed</strong>, med faste markører.",
        "rcfilters-preference-label": "Brug grænsefladesnittet uden JavaScript",
        "rcfilters-watchlist-preference-label": "Brug grænsefladesnittet uden JavaScript",
+       "rcfilters-watchlist-preference-help": "Indlæser overvågningslisten uden mulighed for søgning med filter eller fremhævelse.",
        "rcfilters-filter-showlinkedto-label": "Vis ændringer på sider der linker til",
        "rcfilters-target-page-placeholder": "Indtast et sidenavn (eller en kategori)",
        "rcnotefrom": "Nedenfor er op til '''$1''' {{PLURAL:$5|ændring|ændringer}} siden '''$2''' vist.",
        "tags-delete": "slet",
        "tags-activate": "aktiver",
        "tags-deactivate": "deaktiver",
-       "tags-hitcount": "{{PLURAL:$1|en ændring|$1 ændringer}}",
+       "tags-hitcount": "{{PLURAL:$1|1 ændring|$1 ændringer}}",
        "tags-create-heading": "Opret et nyt mærke",
        "tags-create-explanation": "Som standard vil nye mærker blive gjort tilgængelige for brugere og robotter.",
        "tags-create-tag-name": "Mærkenavn:",
index 62d7c70..9c7505d 100644 (file)
        "subject": "Mewzu:",
        "minoredit": "No yew vırnayışo werdiyo",
        "watchthis": "Şıma bewnê ena perre",
-       "savearticle": "Perre qeyd ke",
+       "savearticle": "Pele qeyd ke",
        "savechanges": "Vırnayışan qeyd kerê",
        "publishpage": "Riperri bare ke",
        "publishchanges": "Vırnayışan qeyd ke",
        "explainconflict": "Wexta ke şıma pel vurneyene yewna ten zi pel vurna.\nNuşteyo corin; halê pelo nıkayin mocneno.\nVurnayişê şıma cêr de mocya ( musya).\nVurnayişanê peyinan şıma gani qayd bıkeri.\nWexta ke şıma butonê \"$1\" tıkna '''teyna''' nuşteyo corin qayd beno.",
        "yourtext": "nuşteyê şıma",
        "storedversion": "Nuşteyo qaydbiyaye",
-       "editingold": "'''İqaz: Şıma ena perre sera yew çım ra viyarnayışê kıhani vırnenê.'''\nEger şıma ey qeyd kerê, pêro vırnayışê ke çım ra viyarnayış ra heta ewro biy, ê benê vıni.",
+       "editingold": "'''İqaz: Şıma ena pele sera yew çım ra viyarnayışê kıhani vurnenê.'''\nEger şıma ey qeyd kerê, pêro vurnayışê ke çımraviyarnayış ra heta ewro biy, ê benê vıni.",
        "yourdiff": "pêverronayiş",
        "copyrightwarning": "'''Recay iqazi:'''Sitey {{SITENAME}} ra iştıraki pêro umışiya $2 zerre deyo (teferuatan rê $1 bıvênê).\n\nİştırakê şıma, şıma qayıl niyê ke yewna merdımi kerpeyina bıvurnê ya zi yewna cayi ra vıla kerê ke, iştırakiştıraq = iştırak. mekewê.<br />\nFına zi qayılê ke iştıraq kewê, şıma qayılê ke şar vaco eno nuşte fılan kesi nusnayo ya zi meqemanê resmiyan ra zanayışê cı û malumatê cı esto / cayanê xoseran ra gırewtışi rê şıma garanti danê. '''Tiya de şıma werê telifi ra ke mısade nêgırewto, eserê cı tiya vıla mekerê! '''",
        "copyrightwarning2": "Ney bızanê ke nuşteyê ke şıma ruşnenê (şawenê) keyepela {{SITENAME}} herkes eşkeno nê nuşteyanê şıma ser kay bıkero. Eke şıma qayil niyê kes bıvurno, nuşteyanê xo meerzê ita. <br />\nWexto ke şıma nuşteyi zi erzenê ita; şıma gani teahud bıdê koti ra ardo (qandê teferuati ra referans: $1).",
        "protectedtitles": "Sernameyê pawıteyi",
        "protectedtitlesempty": "pê ney parametreyan sernuşteyê pawite çinê",
        "protectedtitles-submit": "Sereki bımotne",
-       "listusers": "Listeyê Karberan",
+       "listusers": "Lista karberan",
        "listusers-editsonly": "Teyna karberanê vırnayış kerdoğan bımotne",
        "listusers-creationsort": "goreyê wextê vıraştışi rêz ker",
        "listusers-desc": "Kemeyen rézed ratn",
        "feedback-bugnew": "Mı kontrol kı. Xetay newi xeber kı.",
        "feedback-bugornote": "Jew mersela teferruato teknik esta şıma reca malumatê şıma hazıro se [ $1  jew xırab rapor] bıvinê.Zewbi zi, formê cerê xo rê şenê karfiyê. Vatışê xo pela da \"[ $3  $2 ]\", namey karber dê xoya piya u wasteriya karfiye.",
        "feedback-cancel": "Peyd kı",
-       "feedback-close": "Biya star",
+       "feedback-close": "Temam",
        "feedback-error1": "Xeta: APIi ra peyniyê nêşınasiyay",
        "feedback-error2": "Xeta: Timar kerdış nebı",
        "feedback-error3": "Xeta: API ra cewab çıno",
index 7a1cd1a..62d7d7b 100644 (file)
        "grant-delete": "Delete pages, revisions, and log entries",
        "grant-editinterface": "Edit the MediaWiki namespace and sitewide/user JSON",
        "grant-editmycssjs": "Edit your user CSS/JSON/JavaScript",
-       "grant-editmyoptions": "Edit your user preferences",
+       "grant-editmyoptions": "Edit your user preferences and JSON configuration",
        "grant-editmywatchlist": "Edit your watchlist",
        "grant-editsiteconfig": "Edit sitewide and user CSS/JS",
        "grant-editpage": "Edit existing pages",
index f1338df..7618bb1 100644 (file)
        "sp-contributions-logs": "registrari",
        "sp-contributions-talk": "diskutez",
        "sp-contributions-userrights": "yuri dil {{GENDER:$1|uzero}} pri administrado",
+       "sp-contributions-blocked-notice": "Ca uzero nun esas blokusata.\nVu povas vidar la lasta etiketo pri blokuso adinfre:",
        "sp-contributions-blocked-notice-anon": "Ica IP-adreso esas nune blokusita.\nLa maxim recenta etiketo pri blokuso esas videbla adinfre, por refero:",
        "sp-contributions-search": "Serchar kontributadi",
        "sp-contributions-username": "IP-adreso od uzantonomo:",
index e2f48aa..130888a 100644 (file)
        "returnto": "$1 എന്ന താളിലേക്ക് മടങ്ങുക.",
        "tagline": "{{SITENAME}} സംരംഭത്തിൽ നിന്ന്",
        "help": "സഹായം",
+       "help-mediawiki": "മീഡിയവിക്കി സംബന്ധിച്ച സഹായം",
        "search": "തിരയൂ",
        "search-ignored-headings": " #<!-- ഈ വരി ഇതേ പോലെ വിടുക --> <pre>\n# തിരച്ചിലിൽ അവഗണിക്കപ്പെടുന്ന തലക്കെട്ടുകൾ.\n# താളിന്റെ തലക്കെട്ടുകളുടെ സൂചികവത്കരണം നടന്നാലുടൻ ഇവിടെ വരുത്തുന്ന മാറ്റങ്ങൾ ഫലത്തിൽ വരുന്നതാണ്.\n# ശൂന്യമായ തിരുത്ത് ചെയ്ത് താൾ വീണ്ടും സൂചികാവത്കരിക്കാവുന്നതാണ്.\n# എഴുത്തുരീതി ഇനി കൊടുക്കുന്നു:\n#   * \"#\" അക്ഷരത്തിൽ തുടങ്ങി വരിയുടെ അവസാനം വരെയുള്ള എന്തും സൂചനാക്കുറിപ്പ് ആയിരിക്കും.\n#   * ശൂന്യമല്ലാത്ത ഓരോ വരിയും അക്ഷരവ്യത്യാസമില്ലാതെ അവഗണിക്കപ്പെടാനുള്ള തലക്കെട്ടായിരിക്കും\nഅവലംബം\nപുറത്തേക്കുള്ള കണ്ണികൾ\nഇതും കാണുക\n #</pre> <!-- ഈ വരി ഇതേ പോലെ വിടുക-->",
        "searchbutton": "തിരയൂ",
        "badarticleerror": "താങ്കൾ ചെയ്യാനുദ്ദേശിക്കുന്നത് ഈ താളിൽ സാദ്ധ്യമല്ല",
        "cannotdelete": "\"$1\" എന്ന താൾ അഥവാ പ്രമാണം നീക്കം ചെയ്യാൻ കഴിഞ്ഞില്ല.\nഅതു മിക്കവാറും മറ്റാരെങ്കിലും നീക്കം ചെയ്തിട്ടുണ്ടാവാം.",
        "cannotdelete-title": "\"$1\" എന്ന താൾ മായ്ക്കാൻ കഴിയില്ല",
+       "delete-scheduled": "\"$1\" താൾ മായ്ക്കാൻ നിശ്ചയിച്ചിരിക്കുന്നു.\nദയവായി കാത്തിരിക്കുക.",
        "delete-hook-aborted": "മായ്ക്കൽ കൊളുത്തിനാൽ റദ്ദാക്കിയിരിക്കുന്നു.\nവിശദീകരണമൊന്നും നൽകിയിട്ടില്ല.",
        "no-null-revision": "\"$1\" എന്ന താളിന് പുതിയ ശൂന്യമായ മാറ്റമുള്ള നാൾപ്പതിപ്പ് സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല",
        "badtitle": "അസാധുവായ തലക്കെട്ട്",
        "cascadeprotected": "\"നിർഝരിത\" (cascading) സൗകര്യം ഉപയോഗിച്ച് തിരുത്തൽ നടത്തുന്നതിനു സം‌രക്ഷണം ഏർപ്പെടുത്തിയിട്ടുള്ള {{PLURAL:$1|താഴെ കൊടുത്തിട്ടുള്ള താളിന്റെ|താഴെ കൊടുത്തിട്ടുള്ള താളുകളുടെ}} ഭാഗമാണ്‌ ഈ താൾ. അതിനാൽ ഈ താൾ തിരുത്താൻ സാധിക്കില്ല:\n$2",
        "namespaceprotected": "'''$1''' നാമമേഖലയിലുള്ള താളുകൾ തിരുത്താൻ താങ്കൾക്ക് അനുവാദമില്ല.",
        "customcssprotected": "ഈ സി.എസ്.എസ്. താളിൽ മറ്റൊരു ഉപയോക്താവിന്റെ സ്വകാര്യസജ്ജീകരണങ്ങൾ ഉൾക്കൊള്ളുന്നു, അതിനാൽ താങ്കൾക്ക് ഈ താൾ തിരുത്താൻ അനുവാദമില്ല.",
+       "customjsonprotected": "ഈ ജെസൺ താളിൽ മറ്റൊരു ഉപയോക്താവിന്റെ സ്വകാര്യസജ്ജീകരണങ്ങൾ ഉൾക്കൊള്ളുന്നു, അതിനാൽ താങ്കൾക്ക് ഈ താൾ തിരുത്താൻ അനുവാദമില്ല.",
        "customjsprotected": "ഈ ജാവാസ്ക്രിപ്റ്റ് താളിൽ മറ്റൊരു ഉപയോക്താവിന്റെ സ്വകാര്യസജ്ജീകരണങ്ങൾ ഉൾക്കൊള്ളുന്നു, അതിനാൽ താങ്കൾക്ക് ഈ താൾ തിരുത്താൻ അനുവാദമില്ല.",
+       "sitecssprotected": "എല്ലാ സന്ദർശകരേയും ബാധിക്കാനിടയുള്ളതിനാൽ ഈ സി.എസ്.എസ്. താൾ തിരുത്താൻ താങ്കൾക്ക് അനുമതി ഇല്ല.",
+       "sitejsonprotected": "എല്ലാ സന്ദർശകരേയും ബാധിക്കാനിടയുള്ളതിനാൽ ഈ ജെസൺ താൾ തിരുത്താൻ താങ്കൾക്ക് അനുമതി ഇല്ല.",
+       "sitejsprotected": "എല്ലാ സന്ദർശകരേയും ബാധിക്കാനിടയുള്ളതിനാൽ ഈ ജാവാസ്ക്രിപ്റ്റ് താൾ തിരുത്താൻ താങ്കൾക്ക് അനുമതി ഇല്ല.",
        "mycustomcssprotected": "ഈ സി.എസ്.എസ്.  താൾ തിരുത്താനുള്ള അനുമതി താങ്കൾക്കില്ല.",
+       "mycustomjsonprotected": "ഈ ജെസൺ താൾ തിരുത്താനുള്ള അനുമതി താങ്കൾക്കില്ല.",
        "mycustomjsprotected": "ഈ ജാവാസ്ക്രിപ്റ്റ് താൾ തിരുത്താനുള്ള അനുമതി താങ്കൾക്കില്ല.",
        "myprivateinfoprotected": "താങ്കൾക്ക് സ്വന്തം സ്വകാര്യവിവരങ്ങൾ തിരുത്താനുള്ള അനുമതിയില്ല.",
        "mypreferencesprotected": "താങ്കൾക്ക് സ്വന്തം ക്രമീകരണങ്ങൾ തിരുത്താനുള്ള അനുമതിയില്ല.",
        "passwordtooshort": "രഹസ്യവാക്കിൽ കുറഞ്ഞതു {{PLURAL:$1|ഒരു അക്ഷരം|$1 അക്ഷരങ്ങൾ}} ഉണ്ടായിരിക്കണം.",
        "passwordtoolong": "രഹസ്യവാക്കിൽ പരമാവധി {{PLURAL:$1|ഒരു അക്ഷരം|$1 അക്ഷരങ്ങൾ}} മാത്രമേ പാടുള്ളു.",
        "passwordtoopopular": "പരക്കെ ഉപയോഗിക്കുന്ന രഹസ്യവാക്കുകൾ ഉപയോഗിക്കരുത്. ദയവായി ഊഹിച്ചെടുക്കാൻ ബുദ്ധിമുട്ടുള്ള രഹസ്യവാക്ക് തിരഞ്ഞെടുക്കുക.",
+       "passwordinlargeblacklist": "വളരെ സാധാരണമായി ഉപയോഗിക്കപ്പെടുന്ന രഹസ്യവാക്കുകളുടെ പട്ടികയിൽ പെട്ട രഹസ്യവാക്കാണ് നൽകിയത്. ദയവായി ഒരു അനന്യമായ രഹസ്യവാക്ക് തിരഞ്ഞെടുക്കുക.",
        "password-name-match": "താങ്കളുടെ രഹസ്യവാക്ക് ഉപയോക്തൃനാമത്തിൽ നിന്നും വ്യത്യസ്തമായിരിക്കണം.",
        "password-login-forbidden": "ഈ ഉപയോക്തൃനാമത്തിന്റെയും രഹസ്യവാക്കിന്റെയും ഉപയോഗം നിരോധിച്ചിരിക്കുന്നു.",
        "mailmypassword": "രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക",
        "changepassword-throttled": "കുറഞ്ഞ സമയത്തിനുള്ളിൽ താങ്കൾ നിരവധി തവണ പ്രവേശിക്കാൻ ശ്രമിച്ചിരിക്കുന്നു.\nവീണ്ടും ശ്രമിക്കുന്നതിനു മുമ്പ് ദയവായി $1 കാത്തിരിക്കുക.",
        "botpasswords": "യന്ത്രത്തിനുള്ള രഹസ്യവാക്കുകൾ",
        "botpasswords-disabled": "യാന്ത്രിക രഹസ്യവാക്കുകൾ അനുവദനീയമല്ല.",
+       "botpasswords-label-needsreset": "(രഹസ്യവാക്ക് പുനഃസജ്ജീകരിക്കേണ്ടതുണ്ട്)",
        "botpasswords-label-appid": "യന്ത്രത്തിന്റെ പേര്:",
        "botpasswords-label-create": "സൃഷ്ടിക്കുക",
        "botpasswords-label-update": "പുതുക്കുക",
        "passwordreset-emailsentemail": "താങ്കളുടെ അംഗത്വത്തിന് നൽകിയിട്ടുള്ള ഇമെയിൽ വിലാസം ഇതാണെങ്കിൽ,  രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയക്കുന്നതാണ്.",
        "passwordreset-emailsentusername": "ഈ ഉപയോക്തൃനാമത്തിന് ഒരു ഇമെയിൽ വിലാസം ചേർത്തിട്ടുണ്ടെങ്കിൽ,  രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയക്കുന്നതാണ്.",
        "passwordreset-invalidemail": "അസാധുവായ ഇമെയിൽ വിലാസം",
+       "passwordreset-nodata": "ഉപയോക്തൃനാമമോ ഇമെയിൽ വിലാസമോ നൽകിയിട്ടില്ല",
        "changeemail": "ഇമെയിൽ വിലാസം മാറ്റുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക",
        "changeemail-header": "താങ്കളുടെ ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്താൻ ഈ ഫോം പൂരിപ്പിച്ചു നൽകുക.താങ്കളുടെ അംഗത്വവുമായി ഏതെങ്കിലുമൊരു ഇമെയിൽ വിലാസത്തിനുള്ള ബന്ധം ഒഴിവാക്കാൻ ഫോം പൂരിപ്പിക്കുമ്പോൾ പുതിയ ഇമെയിൽ വിലാസത്തിനുള്ള ഭാഗം ഒഴിച്ചിടുക.",
        "changeemail-no-info": "ഈ താൾ നേരിട്ടു കാണുന്നതിന് താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കണം.",
        "subject-preview": "വിഷയം എങ്ങനെയുണ്ടെന്ന് കാണുക:",
        "previewerrortext": "താങ്കളുടെ മാറ്റങ്ങൾ എങ്ങനെയുണ്ടെന്ന് കാണാൻ ശ്രമിച്ചപ്പോൾ പിഴവുണ്ടായി.",
        "blockedtitle": "ഉപയോക്താവിനെ തടഞ്ഞിരിക്കുന്നു",
+       "blocked-email-user": "<strong>ഇമെയിൽ അയക്കുന്നതിൽ നിന്നും താങ്കളുടെ ഉപയോക്തൃനാമത്തെ തടഞ്ഞിരിക്കുന്നു. ഈ വിക്കിയിലെ മറ്റ് താളുകൾ താങ്കൾക്ക് തിരുത്താവുന്നതാണ്.</strong> [[Special:MyContributions|അംഗത്വത്തിന്റെ സംഭാവനകളിൽ]] ഈ തടയലിന്റെ പൂർണ്ണവിവരങ്ങൾ താങ്കൾക്ക് കാണാവുന്നതാണ്.\n\nതടയൽ നടപ്പിലാക്കിയത് $1 ആണ്.\n\nനൽകിയിട്ടുള്ള കാരണം <em>$2</em> എന്നാണ്.\n\n* തടയൽ തുടങ്ങിയത്: $8\n* തടയൽ അവസാനിക്കുന്നത്: $6\n* തടയാൻ ഉദ്ദേശിച്ചത്: $7\n* തടയൽ ഐ.ഡി. #$5",
+       "blockedtext-partial": "<strong>താങ്കളുടെ ഉപയോക്തൃനാമത്തെ അല്ലെങ്കിൽ ഐ.പി. വിലാസത്തെ ഈ താളിൽ മാറ്റങ്ങൾ വരുത്തുന്നതിൽ നിന്നും തടഞ്ഞിരിക്കുന്നു. ഈ വിക്കിയിലെ മറ്റ് താളുകൾ താങ്കൾക്ക് തിരുത്താവുന്നതാണ്.</strong> [[Special:MyContributions|അംഗത്വത്തിന്റെ സംഭാവനകളിൽ]] ഈ തടയലിന്റെ പൂർണ്ണവിവരങ്ങൾ താങ്കൾക്ക് കാണാവുന്നതാണ്.\n\nതടയൽ നടപ്പിലാക്കിയത് $1 ആണ്.\n\nനൽകിയിട്ടുള്ള കാരണം <em>$2</em> എന്നാണ്.\n\n* തടയൽ തുടങ്ങിയത്: $8\n* തടയൽ അവസാനിക്കുന്നത്: $6\n* തടയാൻ ഉദ്ദേശിച്ചത്: $7\n* തടയൽ ഐ.ഡി. #$5",
        "blockedtext": "<strong>താങ്കളുടെ ഉപയോക്തൃനാമത്തേയോ താങ്കൾ ഇപ്പോൾ ലോഗിൻ ചെയ്തിട്ടുള്ള ഐ.പി. വിലാസത്തേയോ ഈ വിക്കി തിരുത്തുന്നതിൽ നിന്നു തടഞ്ഞിരിക്കുന്നു</strong>\n\n$1 ആണ് ഈ തടയൽ നടത്തിയത്. <em>$2</em> എന്നതാണു് അതിനു രേഖപ്പെടുത്തിയിട്ടുള്ള കാരണം.\n\n* തടയലിന്റെ തുടക്കം: $8\n* തടയലിന്റെ കാലാവധി: $6\n* തടയപ്പെട്ട ഉപയോക്താവ്: $7\n\nഈ തടയലിനെ പറ്റി ചർച്ച ചെയ്യാൻ താങ്കൾക്ക് $1 എന്ന ഉപയോക്താവിനേയോ മറ്റ് [[{{MediaWiki:Grouppage-sysop}}|കാര്യനിർവാഹകരെയോ]] സമീപിക്കാവുന്നതാണ്. [[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളിൽ]] താങ്കൾ സാധുവായ ഇമെയിൽ വിലാസം കൊടുത്തിട്ടുണ്ടെങ്കിൽ, അതു അയക്കുന്നതിൽ നിന്നു താങ്കൾ തടയപ്പെട്ടിട്ടില്ലെങ്കിൽ, \"{{int:emailuser}}\" എന്ന സം‌വിധാനം ഉപയോഗിച്ച് താങ്കൾക്ക് മറ്റുപയോക്താക്കളുമായി ബന്ധപ്പെടാം. താങ്കളുടെ നിലവിലുള്ള ഐ.പി. വിലാസം $3 ഉം, താങ്കളുടെ തടയൽ ഐ.ഡി. #$5 ഉം ആണ്. ഇവ രണ്ടും താങ്കൾ കാര്യനിർവാഹകനെ ബന്ധപ്പെടുമ്പോൾ ചേർക്കുക.",
        "autoblockedtext": "താങ്കളുടെ ഐ.പി. വിലാസം സ്വയം തടയപ്പെട്ടിരിക്കുന്നു, മറ്റൊരു ഉപയോക്താവ് ഉപയോഗിച്ച കാരണത്താൽ $1 എന്ന കാര്യനിർവാഹകനാണ് തടഞ്ഞുവെച്ചത്.\nഇതിനു കാരണമായി നൽകിയിട്ടുള്ളത്:\n\n:<em>$2</em>\n\n* തടയൽ തുടങ്ങിയത്: $8\n* തടയൽ അവസാനിക്കുന്നത്: $6\n* തടയാൻ ഉദ്ദേശിച്ചത്: $7\n\nഈ തടയലിനെ കുറിച്ച് ചർച്ച ചെയ്യാൻ താങ്കൾക്കു $1 എന്ന കാര്യനിവാഹകനേയോ മറ്റു [[{{MediaWiki:Grouppage-sysop}}|കാര്യനിർവാഹകരെയോ]] ബന്ധപ്പെടാവുന്നതാണ്.\n\nശ്രദ്ധിക്കുക [[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളിൽ]] സാധുവായ ഇമെയിൽ വിലാസം രേഖപ്പെടുത്താതിരിക്കുകയോ, അത് ഉപയോഗിക്കുന്നതിൽ നിന്ന് താങ്കളെ തടയുകയോ ചെയ്തിട്ടുണ്ടെങ്കിൽ \"{{int:emailuser}}\" എന്ന സം‌വിധാനം പ്രവർത്തന രഹിതമായിരിക്കും.\n\nതാങ്കളുടെ നിലവിലുള്ള ഐ.പി. വിലാസം $3 ആണ്, താങ്കളുടെ തടയലിന്റെ ഐ.ഡി. #$5 ആകുന്നു.\nദയവായി മുകളിൽ കൊടുത്തിരിക്കുന്ന വിവരങ്ങളെല്ലാം താങ്കൾ നടത്തുന്ന അന്വേഷണങ്ങളിൽ ഉൾപ്പെടുത്തുവാൻ ശ്രദ്ധിക്കുക.",
        "systemblockedtext": "താങ്കളുടെ ഉപയോക്തൃനാമം അല്ലെങ്കിൽ ഐ.പി. വിലാസം മീഡിയവിക്കി സ്വയം തടഞ്ഞിരിക്കുന്നു.\nതടയാനുള്ള കാരണം:\n\n:<em>$2</em>\n\n* തടയൽ തുടങ്ങിയത്: $8\n* തടയൽ കാലഹരണപ്പെടുന്നത്: $6\n* തടയാനുദ്ദേശിച്ചയാൾ: $7\n\nതാങ്കളുടെ നിലവിലെ ഐ.പി. വിലാസം $3 ആണ്.\nതാങ്കൾക്കെന്തെങ്കിലും ചോദ്യങ്ങളുണ്ടെങ്കിൽ മുകളിലെ എല്ലാ വിവരങ്ങളും ഉൾപ്പെടുത്തുക.",
        "editpage-invalidcontentmodel-title": "ഉള്ളടക്ക രീതി പിന്തുണയ്ക്കുന്നില്ല",
        "editpage-notsupportedcontentformat-title": "ഉള്ളടക്ക ഫോർമാറ്റ് പിന്തുണയ്ക്കുന്നില്ല",
        "editpage-notsupportedcontentformat-text": "ഉള്ളടക്കത്തിന്റെ ഫോർമാറ്റ് ആയ $1 ഉള്ളടക്ക രീതിയായ $2 പിന്തുണയ്ക്കുന്നില്ല.",
+       "slot-name-main": "മുഖ്യം",
        "content-model-wikitext": "വിക്കിഎഴുത്ത്",
        "content-model-text": "വെറും എഴുത്ത്",
        "content-model-javascript": "ജാവാസ്ക്രിപ്റ്റ്",
        "timezonelegend": "സമയ മേഖല:",
        "localtime": "പ്രാദേശിക സമയം:",
        "timezoneuseserverdefault": "വിക്കിയിൽ സ്വതേയുള്ളത് ഉപയോഗിക്കുക ($1)",
-       "timezoneuseoffset": "മറ്റുള്ളത് (എന്താണെന്നു നൽകുക)",
+       "timezoneuseoffset": "മറ്റുള്ളവ (എന്താണ് വ്യത്യാസമെന്ന് നൽകുക)",
+       "timezone-useoffset-placeholder": "ഉദാഹരണമായിട്ടുള്ള വിലകൾ: \"-07:00\" അല്ലെങ്കിൽ \"01:00\"",
        "servertime": "സെർവർ സമയം:",
        "guesstimezone": "സമയവ്യത്യാസം ബ്രൗസറിൽ നിന്നും ശേഖരിക്കൂ",
        "timezoneregion-africa": "ആഫ്രിക്ക",
        "grant-group-high-volume": "ഉയർന്ന തോതിലുള്ള പ്രവൃത്തികൾ നടത്തുക",
        "grant-group-customization": "ഇച്ഛാനുസരണമാക്കലുകളും ക്രമീകരണങ്ങളും",
        "grant-group-administration": "കാര്യനിർവ്വാഹക ജോലികൾ നടത്തുക",
+       "grant-group-private-information": "താങ്കളെക്കുറിച്ചുള്ള സ്വകാര്യവിവരങ്ങൾ എടുക്കുന്നു",
        "grant-group-other": "വിവിധ പ്രവൃത്തികൾ",
        "grant-blockusers": "ഉപയോക്താക്കളെ തടയുക, തടയൽ നീക്കുക",
        "grant-createaccount": "അംഗത്വങ്ങൾ സൃഷ്ടിക്കുക",
        "rcfilters-watchlist-edit-watchlist-button": "താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക തിരുത്തുക",
        "rcfilters-watchlist-showupdated": "മാറ്റങ്ങൾ ഉണ്ടായ ശേഷം താങ്കൾ സന്ദർശിക്കാത്ത താളുകളിലെ മാറ്റങ്ങൾ, തളിക അടയാളത്തോടൊപ്പം <strong>കടുപ്പിച്ച്</strong> കാണിച്ചിരിക്കുന്നു.",
        "rcfilters-preference-label": "ജാവാസ്ക്രിപ്റ്റ്-രഹിത സമ്പർക്കമുഖം ഉപയോഗിക്കുക",
-       "rcfilters-preference-help": "à´\85à´°à´¿à´ªàµ\8dà´ªà´\95à´³ും പ്രമുഖമാക്കിക്കാട്ടൽ സൗകര്യവും ഇല്ലാതെ സമീപകാലമാറ്റങ്ങൾ എടുക്കുക",
+       "rcfilters-preference-help": "à´\85à´°à´¿à´ªàµ\8dà´ªà´\95ൾ à´¤à´¿à´°à´¯à´²ും പ്രമുഖമാക്കിക്കാട്ടൽ സൗകര്യവും ഇല്ലാതെ സമീപകാലമാറ്റങ്ങൾ എടുക്കുക",
        "rcfilters-watchlist-preference-label": "ജാവാസ്ക്രിപ്റ്റ്-രഹിത സമ്പർക്കമുഖം ഉപയോഗിക്കുക",
-       "rcfilters-watchlist-preference-help": "à´\85à´°à´¿à´ªàµ\8dà´ªà´\95à´³ും പ്രമുഖമാക്കിക്കാട്ടൽ സൗകര്യവും ഇല്ലാതെ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക എടുക്കുക.",
+       "rcfilters-watchlist-preference-help": "à´\85à´°à´¿à´ªàµ\8dà´ªà´\95ൾ à´¤à´¿à´°à´¯à´²ും പ്രമുഖമാക്കിക്കാട്ടൽ സൗകര്യവും ഇല്ലാതെ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക എടുക്കുക.",
        "rcfilters-filter-showlinkedfrom-label": "കണ്ണി ചേർക്കപ്പെട്ട താളുകളിലെ മാറ്റങ്ങൾ കാണിക്കുക",
        "rcfilters-filter-showlinkedfrom-option-label": "തിരഞ്ഞെടുത്ത താളിൽ <strong>കണ്ണി ചേർക്കപ്പെട്ട താളുകൾ</strong>",
        "rcfilters-filter-showlinkedto-label": "കണ്ണി ചേർക്കപ്പെട്ട താളുകളിലെ മാറ്റങ്ങൾ കാണിക്കുക",
        "protectedtitles-submit": "തലക്കെട്ടുകൾ പ്രദർശിപ്പിക്കുക",
        "listusers": "ഉപയോക്താക്കളുടെ പട്ടിക",
        "listusers-editsonly": "തിരുത്തുകൾ ചെയ്തിട്ടുള്ള ഉപയോക്താക്കളെ മാത്രം കാണിക്കുക",
+       "listusers-temporarygroupsonly": "താത്കാലിക ഉപയോക്തൃസംഘങ്ങളിലുള്ള ഉപയോക്താക്കളെ മാത്രം പ്രദർശിപ്പിക്കുക",
        "listusers-creationsort": "സൃഷ്ടിക്കപ്പെട്ട തീയതി അനുസരിച്ച് ക്രമീകരിക്കുക",
        "listusers-desc": "അവരോഹണക്രമത്തിൽ ആക്കുക",
        "usereditcount": "{{PLURAL:$1|ഒരു തിരുത്തൽ|$1 തിരുത്തലുകൾ}}",
        "listgrouprights-namespaceprotection-namespace": "നാമമേഖല",
        "listgrouprights-namespaceprotection-restrictedto": "ഉപയോക്താവിന് ഉപയോഗിക്കാവുന്ന അവകാശം (അവകാശങ്ങൾ)",
        "listgrants": "അനുമതികൾ",
+       "listgrants-summary": "ഉപയോക്തൃ അവകാശങ്ങളുമായി ബന്ധപ്പെടുത്തിയുള്ള അനുമതികളുടെ പട്ടികയാണ് ഇനിക്കൊടുക്കുന്നത്. ഉപയോക്താക്കൾക്ക് ലഭ്യമായ അനുമതികൾ വീണ്ടും പരിമിതപ്പെടുത്തി, തങ്ങൾക്ക് വേണ്ടി ആപ്ലിക്കേഷനുകൾ പ്രവർത്തിപ്പിക്കാൻ ഉപയോക്താക്കൾക്ക് കഴിയുന്നതാണ്. ഒരു ഉപയോക്താവിന് വേണ്ടി പ്രവർത്തിക്കുന്ന ആപ്ലിക്കേഷന് ഉപയോക്താവിന് ലഭ്യമല്ലാത്ത ഒരു ഉപയോക്തൃ അവകാശം ഉപയോഗിക്കാൻ കഴിയുന്നതല്ല.\nവ്യക്തിഗത അവകാശങ്ങളെ കുറിച്ച് [[{{MediaWiki:Listgrouprights-helppage}}|അധിക വിവരങ്ങൾ]] ലഭ്യമായേക്കാവുന്നതാണ്.",
        "listgrants-grant": "അനുമതി",
        "listgrants-rights": "അവകാശങ്ങൾ",
        "trackingcategories": "പിന്തുടരൽ വർഗ്ഗങ്ങൾ",
        "pageinfo-display-title": "പ്രദർശിപ്പിക്കേണ്ട തലക്കെട്ട്",
        "pageinfo-default-sort": "സ്വതേയുള്ള ക്രമപ്പെടുത്തൽ ചാവി",
        "pageinfo-length": "താളിന്റെ നീളം (ബൈറ്റിൽ)",
+       "pageinfo-namespace": "നാമമേഖല",
        "pageinfo-article-id": "താളിന്റെ ഐ.ഡി.",
        "pageinfo-language": "താളിന്റെ ഉള്ളടക്കത്തിന്റെ ഭാഷ",
        "pageinfo-language-change": "മാറ്റുക",
        "version-specialpages": "പ്രത്യേക താളുകൾ",
        "version-parserhooks": "പാഴ്‌സർ കൊളുത്തുകൾ",
        "version-variables": "ചരങ്ങൾ",
+       "version-editors": "എഡിറ്റർമാർ",
        "version-antispam": "പാഴെഴുത്ത് തടയൽ",
        "version-other": "മറ്റുള്ളവ",
        "version-mediahandlers": "മീഡിയ കൈകാര്യോപകരണങ്ങൾ",
        "redirect-file": "പ്രമാണത്തിന്റെ പേര്",
        "redirect-logid": "രേഖയുടെ ഐ.ഡി.",
        "redirect-not-exists": "വില കണ്ടെത്താൻ കഴിഞ്ഞില്ല",
+       "redirect-not-numeric": "വില അക്കത്തിലല്ല",
        "fileduplicatesearch": "ഒരേ പ്രമാണത്തിന്റെ പലപകർപ്പുകളുണ്ടോയെന്നു തിരയുക",
        "fileduplicatesearch-summary": "ഒരേ പ്രമാണം തന്നെ വിവിധ പേരിലുണ്ടോയെന്നു ഹാഷ് വാല്യൂവധിഷ്ഠിതമായി തിരയുക.",
        "fileduplicatesearch-filename": "പ്രമാണത്തിന്റെ പേര്:",
        "log-action-filter-delete": "മായ്ക്കലിന്റെ തരം:",
        "log-action-filter-import": "ഇറക്കുമതിയുടെ തരം:",
        "log-action-filter-move": "മാറ്റലിന്റെ തരം:",
+       "log-action-filter-newusers": "അംഗത്വസൃഷ്ടിയുടെ തരം:",
+       "log-action-filter-patrol": "റോന്തുചുറ്റലിന്റെ തരം:",
+       "log-action-filter-protect": "സംരക്ഷണത്തിന്റെ തരം:",
+       "log-action-filter-rights": "അവകാശമാറ്റത്തിന്റെ തരം:",
+       "log-action-filter-suppress": "ഒതുക്കലിന്റെ തരം:",
+       "log-action-filter-upload": "അപ്‌ലോഡിന്റെ തരം:",
        "log-action-filter-all": "എല്ലാം",
        "log-action-filter-block-block": "തടയൽ",
        "log-action-filter-block-reblock": "തടയലിൽ വരുത്തുന്ന മാറ്റം",
        "log-action-filter-delete-revision": "നാൾപ്പതിപ്പ് മായ്ക്കൽ",
        "log-action-filter-import-interwiki": "ട്രാൻസ്‌‌വിക്കി ഇറക്കുമതി",
        "log-action-filter-import-upload": "എക്സ്.എം.എൽ. അപ്‌ലോഡ് വഴിയുള്ള ഇറക്കുമതി",
+       "log-action-filter-managetags-create": "ടാഗ് സൃഷ്ടി",
        "log-action-filter-protect-protect": "സംരക്ഷണം",
        "log-action-filter-protect-unprotect": "സംരക്ഷണമൊഴിവാക്കൽ",
        "log-action-filter-protect-move_prot": "സംരക്ഷണം മാറ്റി",
index 3d3386b..c541d98 100644 (file)
@@ -52,7 +52,8 @@
                        "Telaneo",
                        "Jon Harald Søby",
                        "Fitoschido",
-                       "Orf3us"
+                       "Orf3us",
+                       "Pyscowicz"
                ]
        },
        "tog-underline": "Strek under lenker:",
index 0680b30..916aa1c 100644 (file)
        "hidden-category-category": "Categorias ocultas",
        "category-subcat-count": "{{PLURAL:$2|Esta categoria possui apenas a seguinte subcategoria.|Esta categoria possui {{PLURAL:$1|a seguinte subcategoria|as seguintes $1 subcategorias}}, de um total de $2.}}",
        "category-subcat-count-limited": "Esta categoria possui {{PLURAL:$1|a seguinte subcategoria|as $1 subcategorias a seguir}}.",
-       "category-article-count": "{{PLURAL:$2|Esta categoria contém apenas a seguinte página.|{{PLURA:$1|A seguinte página pertence|As seguintes $1 páginas pertencem}} a esta categoria, de um total de $2.}}",
+       "category-article-count": "{{PLURAL:$2|Esta categoria contém apenas a seguinte página.|{{PLURAL:$1|A seguinte página pertence|As seguintes $1 páginas pertencem}} a esta categoria, de um total de $2.}}",
        "category-article-count-limited": "Esta categoria possui {{PLURAL:$1|a seguinte página|as $1 páginas a seguir}}.",
        "category-file-count": "{{PLURAL:$2|Esta categoria possui apenas o seguinte arquivo.|Esta categoria possui {{PLURAL:$1|o seguinte arquivo|os $1 arquivos a seguir}}, de um total de $2.}}",
        "category-file-count-limited": "Esta categoria possui {{PLURAL:$1|um arquivo|$1 arquivos}}.",
index 8b75c88..cb67002 100644 (file)
        "changepassword-success": "'A password toje ha state cangiate!",
        "changepassword-throttled": "Tu è pruvate 'nu sacche de vote a trasè.\nPe piacere aspitte $1 apprime de pruvà arrete.",
        "botpasswords": "Password d'u bot",
+       "botpasswords-summary": "<em>Passuord bot</em> permette l'ause a 'nu cunde ausanne le API, senze ausà le credenziale de accesse prengepàle. Le deritte de l'utende disponibbele quanne se ave trasute cu 'na passuord bot ponne essere limitate.\n\nCe non ge canusce 'u mutive purcé puè fa sta cose, allore probbabbilmende non ge l'ha fà. Nisciune t'addà cercà de generà 'na passuord bot pe pò darle a otre crestiane.",
        "botpasswords-disabled": "Le passuord bot so disabbilitate.",
        "botpasswords-no-central-id": "Pe ausà 'na passuor bot, a trasè a 'nu utende cendralizzate.",
        "botpasswords-existing": "Passuord de le bot esistende",
        "usercssyoucanpreview": "'''Conziglie:''' Ause 'u buttone \"{{int:showpreview}}\" pe condrollà 'u CSS nuève apprime de reggistrà.",
        "userjsyoucanpreview": "'''Conziglie:''' Ause 'u buttone \"{{int:showpreview}}\" pe condrollà 'u JavaScript nuève apprime de reggistrà.",
        "usercsspreview": "'''Arrecuerdete ca tu ste vide sulamende in andeprime 'u CSS tue.'''\n'''Non g'à state angore reggistrete ninde!'''",
+       "userjsonpreview": "<strong>Arrecuerdete ca tu ste teste/'ndruche sulamende in andeprime 'a configurazione JSON tue.\nNon g'à state angore reggistrete ninde!</strong>",
        "userjspreview": "'''Arrecuerdete ca tu ste vide/teste sulamende in andeprime 'u JavaScript tue.'''\n'''Non g'à state angore reggistrete ninde!'''",
        "sitecsspreview": "'''Arrecuerdete ca tu ste vide sulamende in andeprime 'u CSS tune.'''\n'''Non g'à state angore reggistrate ninde!'''",
+       "sitejsonpreview": "<strong>Arrecuerdete ca tu ste 'ndruche sulamende in andeprime 'a configurazione JSON tue.\nNon g'à state angore reggistrete ninde!</strong>",
        "sitejspreview": "'''Arrecuerdete ca tu ste vide sulamende in andeprime 'u codece JavaScript tune.'''\n'''Non g'à state angore reggistrate ninde!'''",
        "userinvalidconfigtitle": "<strong>Attenziò:</strong> Non ge stè 'nu skin \"$1\".\nArrecuerdete ca jndr'à le file personalizzete .css, .json e .js s'ause scrivere le titele cu le lettere piccenne, pe esembie {{ns:user}}:Foo/vector.css è diverse da {{ns:user}}:Foo/Vector.css.",
        "updated": "(Cangiete)",
index b596aa8..b494400 100644 (file)
        "showingresultsinrange": "Ниже показано до {{PLURAL:$1|<strong>1</strong> результата|<strong>$1</strong> результата|<strong>$1</strong> результатов}} в диапазоне от <strong>$2</strong> до <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|1=Результат <strong>$1</strong> из <strong>$3</strong>|Результаты <strong>$1—$2</strong> из <strong>$3</strong>}}",
        "search-nonefound": "Соответствий запросу не найдено.",
-       "search-nonefound-thiswiki": "Нет результатов, соответствующих запросу на этом сайте.",
+       "search-nonefound-thiswiki": "Нет результатов, соответствующих запросу, на этом сайте.",
        "powersearch-legend": "Расширенный поиск",
        "powersearch-ns": "Поиск в пространствах имён:",
        "powersearch-togglelabel": "Отметить:",
index 1677159..6d0794e 100644 (file)
        "pool-servererror": "ဢၼ်ပဵၼ်ၼႃႈၵၢၼ် တူဝ်ဢၢၼ်ႇၼွင်ၼၼ်ႉ မၼ်းဢမ်ႇႁဵတ်းၵၢၼ် ($1).",
        "poolcounter-usage-error": "ၵၢၼ်ၸႂ်ႉၸိုဝ်း ၽိတ်းပိူင်ႈ: $1",
        "aboutsite": "လွင်ႈ​တၢင်း {{SITENAME}}",
-       "aboutpage": "Project: လွင်ႈဝႅပ်ႉသႆႉ",
+       "aboutpage": "Project:လွင်ႈဝႅပ်ႉသၢႆႉ",
        "copyright": "ၸိူဝ်းၶဝ်ႈပႃးဝႆႉၼႆႉ မၼ်းတေၸၢင်ႈၸႂ်ႉလႆႈ ၵႃႈတီႈ ဝႂ် $1",
        "copyrightpage": "{{ns:project}}:သုၼ်ႇထုတ်ႇ",
        "currentevents": "ၵၢၼ်ႁဵတ်းသၢင်ႈယၢမ်းလဵဝ်",
index f037a93..76e7bd6 100644 (file)
        "tog-minordefault": "Подразумевано означавај све измене као мање",
        "tog-previewontop": "Прикажи претпреглед пре оквира за уређивање",
        "tog-previewonfirst": "Прикажи претпреглед при првој измени",
-       "tog-enotifwatchlistpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ð¸Ð¼ÐµÑ\98л када се промени страница или датотека са мог списка надгледања",
-       "tog-enotifusertalkpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ð¸Ð¼ÐµÑ\98л кад се промени моја корисничка страница за разговор",
-       "tog-enotifminoredits": "ТакоÑ\92е Ð¼Ð¸ Ð¿Ð¾Ñ\88аÑ\99и Ð¸Ð¼ÐµÑ\98л код мањих измена страница и датотека",
-       "tog-enotifrevealaddr": "Ð\9eÑ\82кÑ\80иÑ\98 Ð¼Ð¾Ñ\98Ñ\83 Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83 Ñ\83 Ð¸Ð¼ÐµÑ\98ловима Ð¾Ð±Ð°Ð²ÐµÑ\88Ñ\82еÑ\9aа",
+       "tog-enotifwatchlistpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ðµ-поÑ\80Ñ\83кÑ\83 када се промени страница или датотека са мог списка надгледања",
+       "tog-enotifusertalkpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ðµ-поÑ\80Ñ\83кÑ\83 кад се промени моја корисничка страница за разговор",
+       "tog-enotifminoredits": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ðµ-поÑ\80Ñ\83кÑ\83 Ð¸ код мањих измена страница и датотека",
+       "tog-enotifrevealaddr": "Ð\9eÑ\82кÑ\80иÑ\98 Ð¼Ð¾Ñ\98Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е Ñ\83 Ðµ-поÑ\80Ñ\83кама Ð·Ð° Ð¾Ð±Ð°Ð²ÐµÑ\88Ñ\82аваÑ\9aе",
        "tog-shownumberswatching": "Прикажи број корисника који надгледају",
        "tog-oldsig": "Ваш постојећи потпис:",
        "tog-fancysig": "Сматрај потпис као викитекст (без аутоматског повезивања)",
@@ -80,7 +80,7 @@
        "tog-watchlisthideanons": "Сакриј измене анонимних корисника са списка надгледања",
        "tog-watchlisthidepatrolled": "Сакриј патролиране измене са списка надгледања",
        "tog-watchlisthidecategorization": "Сакриј категоризацију страница",
-       "tog-ccmeonemails": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ ÐºÐ¾Ð¿Ð¸Ñ\98е Ð¸Ð¼ÐµÑ\98лова које пошаљем другим корисницима",
+       "tog-ccmeonemails": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ ÐºÐ¾Ð¿Ð¸Ñ\98е Ðµ-поÑ\80Ñ\83ка које пошаљем другим корисницима",
        "tog-diffonly": "Не приказуј садржај странице испод разлика",
        "tog-showhiddencats": "Прикажи скривене категорије",
        "tog-norollbackdiff": "Не приказуј разлику након извршеног враћања",
        "toolbox": "Алатке",
        "tool-link-userrights": "Промена {{GENDER:$1|корисничких}} група",
        "tool-link-userrights-readonly": "Приказ {{GENDER:$1|корисничких}} група",
-       "tool-link-emailuser": "СлаÑ\9aе Ð¸Ð¼ÐµÑ\98ла {{GENDER:$1|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ници}}",
+       "tool-link-emailuser": "СлаÑ\9aе Ðµ-поÑ\80Ñ\83ке {{GENDER:$1|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ниÑ\86и|коÑ\80иÑ\81никÑ\83/ци}}",
        "imagepage": "Прикажи страницу датотеке",
        "mediawikipage": "Прикажи страницу поруке",
        "templatepage": "Прикажи страницу шаблона",
        "protectedpagetext": "Ова страница је закључана за измене и друге радње.",
        "viewsourcetext": "Можете да видите и копирате извор ове странице.",
        "viewyourtext": "Можете да видите и копирате извор <strong>ваших измена</strong> на овој страници.",
-       "protectedinterface": "Ова страница садржи текст интерфејса за софтвер на овом викију и заштићена је ради спречавања злоупотребе.\nДа бисте додали или променили преводе било којег викија, посетите [https://translatewiki.net/ translatewiki.net], пројекат за локализацију Медијавикија.",
-       "editinginterface": "<strong>Упозорење:</strong> уређујете страницу која се користи за приказивање текста корисничког окружења.\nИзмене на овој страници ће утицати на све кориснике овог викија.",
+       "protectedinterface": "Ова страница обезбеђује текст интерфејса за софтвер на овом викију и заштићена је ради спречавања злоупотребе.\nДа бисте додали или променили преводе свих викија, посетите [https://translatewiki.net/ translatewiki.net], пројекат за локализацију MediaWiki-ја.",
+       "editinginterface": "<strong>Упозорење:</strong> Уређујете страницу која се користи за обезбеђивање текста интерфејса за софтвер.\nПромене на овој страници утицаће на изглед корисничког интерфејса других корисника овог викија.",
        "translateinterface": "Да бисте додали или променили преводе за све викије, посетите [https://translatewiki.net/ translatewiki.net], пројекат за локализацију Медијавикија.",
        "cascadeprotected": "Ова страница је закључана јер садржи {{PLURAL:$1|следећу страницу која је заштићена|следеће странице које су заштићене}} „преносивом“ заштитом:\n$2",
        "namespaceprotected": "Немате дозволу да уређујете странице у именском простору: <strong>$1</strong>.",
        "userlogin-loggedin": "Већ сте пријављени као {{GENDER:$1|$1}}.\nКористите доњи образац да бисте се пријавили као други корисник.",
        "userlogin-reauth": "Морате да се поново пријавите да бисте верификовали да сте {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Отвори још један налог",
-       "createacct-emailrequired": "Ð\98меÑ\98л-адÑ\80еÑ\81а",
-       "createacct-emailoptional": "Ð\98меÑ\98л-адÑ\80еÑ\81а (опционално)",
-       "createacct-email-ph": "УнеÑ\81иÑ\82е Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83",
-       "createacct-another-email-ph": "УнеÑ\81иÑ\82е Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83",
-       "createaccountmail": "Ð\9aоÑ\80иÑ\81Ñ\82и Ð¿Ñ\80ивÑ\80еменÑ\83, Ð½Ð°Ñ\81Ñ\83миÑ\87нÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð¸ Ð¿Ð¾Ñ\88аÑ\99и Ñ\98е Ð½Ð° Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ\83 Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83",
+       "createacct-emailrequired": "Ð\90дÑ\80еÑ\81а Ðµ-поÑ\88Ñ\82е",
+       "createacct-emailoptional": "Ð\90дÑ\80еÑ\81а Ðµ-поÑ\88Ñ\82е (опционално)",
+       "createacct-email-ph": "УнеÑ\81иÑ\82е Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е",
+       "createacct-another-email-ph": "УнеÑ\81иÑ\82е Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е",
+       "createaccountmail": "Ð\9aоÑ\80иÑ\81Ñ\82и Ð¿Ñ\80ивÑ\80еменÑ\83, Ð½Ð°Ñ\81Ñ\83миÑ\87нÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð¸ Ð¿Ð¾Ñ\88аÑ\99и Ñ\98е Ð½Ð° Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е",
        "createaccountmail-help": "Може се користити да се некоме отвори налог без сазнања лозинке.",
        "createacct-realname": "Право име (опционално)",
        "createacct-reason": "Разлог",
        "mailmypassword": "Ресетуј лозинку",
        "passwordremindertitle": "Нова привремена лозинка за {{GRAMMAR:акузатив|{{SITENAME}}}}",
        "passwordremindertext": "Неко са IP адресе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).\nСтворена је привремена лозинка за {{GENDER:$2|корисника|корисницу|корисника}} $2 која гласи $3.\nУколико је ово ваш захтев, сада се пријавите и поставите нову лозинку.\nПривремена лозинка истиче за {{PLURAL:$5|један дан|$5 дана}}.\n\nАко је неко други затражио промену лозинке, или сте се сетили ваше лозинке и не желите да је мењате, занемарите ову поруку.",
-       "noemail": "Не постоји имејл-адреса за {{GENDER:$1|корисника|корисницу}} $1.",
-       "noemailcreate": "Ð\9cоÑ\80аÑ\82е Ð´Ð° Ð½Ð°Ð²ÐµÐ´ÐµÑ\82е Ð²Ð°Ð¶ÐµÑ\9bÑ\83 Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83.",
+       "noemail": "{{GENDER:$1|Корисник „$1” није навео|Корисница „$1” није навела|Корисник/ца „$1” није навео/ла}} адресу е-поште.",
+       "noemailcreate": "Ð\9cоÑ\80аÑ\82е Ð´Ð° Ð½Ð°Ð²ÐµÐ´ÐµÑ\82е Ð²Ð°Ð¶ÐµÑ\9bÑ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е.",
        "passwordsent": "Нова лозинка је послата на имејл-адресу {{GENDER:$1|корисника|кориснице}} $1.\nПоново се пријавите након што је примите.",
        "blocked-mailpassword": "Уређивање са ваше IP адресе је блокирано. Ради спречавања злоупотребе, забрањена је и функција враћања лозинке са ње.",
        "eauthentsent": "Имејл о потврди је послат на наведену имејл-адресу.\nПре било којих других слања имејлова на налог, мораћете пратити упутства у имејлу да бисте потврдили да је налог заиста ваш.",
        "throttled-mailpassword": "Порука за промену лозинке је послата у {{PLURAL:$1|1=последњих сат времена|последња $1 сата|последњих $1 сати}}.\nДа бисмо спречили злоупотребу, подсетник шаљемо само једном у року од {{PLURAL:$1|1=сат времена|$1 сата|$1 сати}}.",
        "mailerror": "Грешка при слању поруке: $1",
-       "acct_creation_throttle_hit": "Ð\9fоÑ\81еÑ\82иоÑ\86и Ð¾Ð²Ð¾Ð³ Ð²Ð¸ÐºÐ¸Ñ\98а ÐºÐ¾Ñ\98и ÐºÐ¾Ñ\80иÑ\81Ñ\82е Ð²Ð°Ñ\88Ñ\83 IP Ð°Ð´Ñ\80еÑ\81Ñ\83 Ñ\81Ñ\83 Ð²ÐµÑ\9b Ð¾Ñ\82воÑ\80или {{PLURAL:$1|1=Ñ\98едан Ð½Ð°Ð»Ð¾Ð³|$1 Ð½Ð°Ð»Ð¾Ð³Ð°}} Ð¿Ñ\80еÑ\82Ñ\85одни $2, Ñ\88Ñ\82о Ñ\98е Ð½Ð°Ñ\98веÑ\9bи Ð´Ð¾Ð·Ð²Ð¾Ñ\99ени Ð±Ñ\80оÑ\98 Ñ\83 Ñ\82ом Ð²Ñ\80еменÑ\81ком Ð¿ÐµÑ\80иодÑ\83.\nÐ\97бог Ñ\82ога Ð¿Ð¾Ñ\81еÑ\82иоÑ\86и Ñ\81 Ð¾Ð²Ðµ IP Ð°Ð´Ñ\80еÑ\81е Ñ\82Ñ\80енÑ\83Ñ\82но Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ð¾Ñ\82воÑ\80ити више налога.",
+       "acct_creation_throttle_hit": "Ð\9fоÑ\81еÑ\82иоÑ\86и Ð¾Ð²Ð¾Ð³ Ð²Ð¸ÐºÐ¸Ñ\98а ÐºÐ¾Ñ\98и ÐºÐ¾Ñ\80иÑ\81Ñ\82е Ð²Ð°Ñ\88Ñ\83 IP Ð°Ð´Ñ\80еÑ\81Ñ\83 Ñ\81Ñ\83 Ð¾Ñ\82воÑ\80или {{PLURAL:$1|1=Ñ\98едан Ð½Ð°Ð»Ð¾Ð³|$1 Ð½Ð°Ð»Ð¾Ð³Ð°}} Ñ\83 Ð¿Ñ\80еÑ\82Ñ\85одниÑ\85 $2, Ñ\88Ñ\82о Ñ\98е Ð½Ð°Ñ\98веÑ\9bа Ð´Ð¾Ð·Ð²Ð¾Ñ\99ена Ð²Ñ\80едноÑ\81Ñ\82 Ñ\83 Ð¾Ð²Ð¾Ð¼ Ð²Ñ\80еменÑ\81ком Ð¿ÐµÑ\80иодÑ\83.\nÐ\9aао Ñ\80езÑ\83лÑ\82аÑ\82 Ñ\82ога, Ñ\82и Ð¿Ð¾Ñ\81еÑ\82иоÑ\86и Ñ\82Ñ\80енÑ\83Ñ\82но Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ð¾Ñ\82ваÑ\80ати више налога.",
        "emailauthenticated": "Ваша имејл-адреса је потврђена на дан $2 у $3 ч.",
        "emailnotauthenticated": "Ваша имејл-адреса још није потврђена.\nНиједан имејл неће да буде послат ни у једном од следећих случајева.",
        "noemailprefs": "Наведите имејл-адресу у подешавањима за оспособљавање ових функција.",
        "emailconfirmlink": "Потврдите своју имејл-адресу",
        "invalidemailaddress": "Имејл-адреса не може да буде прихваћена јер је у неважећем облику.\nУнесите исправну адресу или оставите празно поље.",
-       "cannotchangeemail": "Ð\9dа Ð¾Ð²Ð¾Ð¼ Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 Ð½Ð¸Ñ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80омениÑ\82и Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81е Ð½Ð°Ð»Ð¾Ð³Ð°.",
+       "cannotchangeemail": "Ð\90дÑ\80еÑ\81е Ðµ-поÑ\88Ñ\82е Ð½Ð°Ð»Ð¾Ð³Ð° Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ñ\81е Ð¿Ñ\80омениÑ\82и Ð½Ð° Ð¾Ð²Ð¾Ð¼ Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83.",
        "emaildisabled": "Овај сајт не може да шаље имејлове.",
        "accountcreated": "Налог је отворен",
        "accountcreatedtext": "Кориснички налог [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) је отворен.",
        "createaccount-text": "Неко је отворио налог са вашом имејл-адресом на пројекту {{SITENAME}} ($4) под именом „$2“ и са лозинком „$3“.\nОдмах требате да се пријавите и промените своју лозинку.\n\nМожете да занемарите ову поруку, ако је овај налог отворен грешком.",
        "login-throttled": "Превише пута сте покушали да се пријавите.\nСачекајте $1 пре него што покушате поново.",
        "login-abort-generic": "Неуспешна пријава – прекинуто",
-       "login-migrated-generic": "Ваш налог је мигриран и ваше корисничко више не постоји на овом викију.",
+       "login-migrated-generic": "Ваш налог је мигриран. Ваше корисничко више не постоји на овом викију.",
        "loginlanguagelabel": "Језик: $1",
        "suspicious-userlogout": "Ваш захтев за одјаву је одбијен јер изгледа да га је послао покварени прегледач или кеширани прокси.",
        "createacct-another-realname-tip": "Право име је опционално.\nАко одаберете да га наведете, биће коришћено за приписивање вашег рада.",
        "changeemail-no-info": "Морате бити пријављени да бисте приступили овој страници.",
        "changeemail-oldemail": "Актуелна имејл-адреса:",
        "changeemail-newemail": "Нова имејл-адреса:",
-       "changeemail-newemail-help": "Ово поље треба да оставите празно ако желите да уклоните своју имејл-адресу. Нећете бити у могућности да ресетујете заборављену лозинку и нећете примати имејлове са овог викија ако је имејл-адреса уклоњена.",
+       "changeemail-newemail-help": "Ово поље треба да оставите празно ако желите да уклоните адресу е-поште. Нећете бити у могућности да ресетујете заборављену лозинку и нећете примати е-поруке са овог викија ако је адреса е-поште уклоњена.",
        "changeemail-none": "(ништа)",
        "changeemail-password": "Ваша лозинка за пројекат {{SITENAME}}:",
        "changeemail-submit": "Промени имејл",
        "headline_sample": "Текст наслова",
        "headline_tip": "Поднаслов (ниво 2)",
        "nowiki_sample": "Овде уметните необликован текст",
-       "nowiki_tip": "Занемари вики-обликовање",
+       "nowiki_tip": "Занемари вики обликовање",
        "image_sample": "Пример.jpg",
        "image_tip": "Уграђивање датотеке",
        "media_sample": "Пример.ogg",
        "recentchanges-timeout": "Ова претрага је истекла. Можда желите да покушате другачије параметре претраге.",
        "recentchanges-network": "Због техничког проблема, није могуће учитати резултате. Покушајте да освежите страницу.",
        "recentchanges-notargetpage": "Унесите име странице изнад да бисте видели промене сродне с овом страницом",
-       "recentchanges-feed-description": "Ð\9fÑ\80аÑ\82иÑ\82е Ð½Ð°Ñ\98Ñ\81коÑ\80иÑ\98е промене на викију у овом фиду.",
+       "recentchanges-feed-description": "Ð\9fÑ\80аÑ\82иÑ\82е Ð½ÐµÐ´Ð°Ð²Ð½е промене на викију у овом фиду.",
        "recentchanges-label-newpage": "Нова страница",
        "recentchanges-label-minor": "Мања измена",
        "recentchanges-label-bot": "Ботовска измена",
        "upload-options": "Опције отпремања",
        "watchthisupload": "Надгледај ову датотеку",
        "filewasdeleted": "Датотека са овим именом је раније оптремљена и након тога избрисана.\nТребате да проверите $1 пре него што наставите са њеним поновним оптремањем.",
-       "filename-thumb-name": "Ово изгледа као назив сличице. Молимо вас да не отпремате сличице на исти вики. У супротном, молимо вас, поправите име датотеке тако да је корисније и нема префикс сличице.",
+       "filename-thumb-name": "Ово изгледа као наслов сличице. Не отпремајте сличице на исти вики. У супротном, поправите име датотеке тако да је корисније и нема префикс сличице.",
        "filename-bad-prefix": "Назив датотеке коју шаљете почиње са <strong>„$1“</strong>, а њега обично додељују дигитални фотоапарати.\nИзаберите назив датотеке који описује њен садржај.",
        "filename-prefix-blacklist": " #<!-- оставите овај ред онаквим какав јесте --> <pre>\n# Синтакса је следећа:\n#   * Све од тарабе па до краја реда је коментар\n#   * Сваки ред означава префикс типичних назива датотека које додељивају дигитални апарати\nCIMG # Касио\nDSC_ # Никон\nDSCF # Фуџи\nDSCN # Никон\nDUW # неки мобилни телефони\nIMG # опште\nJD # Џеноптик\nMGP # Пентакс\nPICT # разно\n #</pre> <!-- оставите овај ред онаквим какав јесте -->",
        "upload-proto-error": "Неважећи протокол",
        "upload-too-many-redirects": "Адреса садржи превише преусмерења",
        "upload-http-error": "Дошло је до HTTP грешке: $1",
        "upload-copy-upload-invalid-domain": "Примерци отпремања нису доступни на овом домену.",
-       "upload-dialog-disabled": "Ð\9fоÑ\81Ñ\82авÑ\99аÑ\9aе Ð´Ð°Ñ\82оÑ\82ека Ð¿Ð¾Ð¼Ð¾Ñ\9bÑ\83 Ð¾Ð²Ð¾Ð³ Ð´Ð¸Ñ\98алога Ñ\98е Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bено на овом викију.",
+       "upload-dialog-disabled": "Ð\9eÑ\82пÑ\80емаÑ\9aа Ð´Ð°Ñ\82оÑ\82ека ÐºÐ¾Ñ\80иÑ\88Ñ\9bеÑ\9aем Ð¾Ð²Ð¾Ð³ Ð´Ð¸Ñ\98алога Ñ\81Ñ\83 Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bена на овом викију.",
        "upload-dialog-title": "Отпремање датотеке",
        "upload-dialog-button-cancel": "Откажи",
        "upload-dialog-button-back": "Назад",
        "lockmanager-fail-closelock": "Није могуће затворити катанац за „$1”.",
        "lockmanager-fail-deletelock": "Није могуће избрисати катанац за „$1”.",
        "lockmanager-fail-acquirelock": "Није могуће стећи катанац за „$1”.",
-       "lockmanager-fail-openlock": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82воÑ\80им ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9c. Ð£Ð²ÐµÑ\80иÑ\82е Ñ\81е Ð´Ð° Ñ\98е Ð²Ð°Ñ\88 Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\98Ñ\83м Ð·Ð° Ð¾Ñ\82пÑ\80емаÑ\9aе Ð¸Ñ\81пÑ\80авно ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80иÑ\81ан Ð¸ Ð´Ð° Ð²Ð°Ñ\88 Ð²ÐµÐ±-Ñ\81еÑ\80веÑ\80 Ð¸Ð¼Ð° Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð´Ð° Ð¿Ð¸Ñ\88е у том директоријуму. Погледајте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory за више информација.",
+       "lockmanager-fail-openlock": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\82воÑ\80иÑ\82и ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9d. Ð£Ð²ÐµÑ\80иÑ\82е Ñ\81е Ð´Ð° Ñ\98е Ð²Ð°Ñ\88 Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\98Ñ\83м Ð·Ð° Ð¾Ñ\82пÑ\80емаÑ\9aе Ð¸Ñ\81пÑ\80авно ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80иÑ\81ан Ð¸ Ð´Ð° Ð²Ð°Ñ\88 Ð²ÐµÐ±-Ñ\81еÑ\80веÑ\80 Ð¸Ð¼Ð° Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð´Ð° Ñ\83пиÑ\81Ñ\83Ñ\98е у том директоријуму. Погледајте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory за више информација.",
        "lockmanager-fail-releaselock": "Није могуће ослободити катанац за „$1”.",
        "lockmanager-fail-db-bucket": "Није могуће контактирати са довољно катанаца у канти $1.",
        "lockmanager-fail-db-release": "Није могуће ослободити катанце у бази података $1.",
        "zip-bad": "Датотека је оштећена или је нечитљива ZIP датотека.\nБезбедносна провера не може да се изврши како треба.",
        "zip-unsupported": "Датотека је формата ZIP који користи функције ZIP које Медијавики не подржава.\nНе може се правилно проверити у вези безбедности.",
        "uploadstash": "Отпремање низа датотека",
-       "uploadstash-summary": "Ова страница пружа приступ датотекама које су отпремљене или се отпремају, али још нису објављене. Ове датотеке нису видљиве никоме, осим кориснику који их је отпремио.",
+       "uploadstash-summary": "Ова страница пружа приступ датотекама које су отпремљене или су у процесу отпремања, али још нису објављене на вики. Ове датотеке нису видљиве никоме, осим кориснику који их је отпремио.",
        "uploadstash-clear": "Обриши низ датотека",
        "uploadstash-nofiles": "Немате сакривене датотеке.",
        "uploadstash-badtoken": "Извршавање ове радње није успело, разлог томе може бити истек времена за уређивање. Покушајте поново.",
        "version-license-not-found": "За овај додатак није пронађена информација о лиценци.",
        "version-credits-title": "Заслуге за $1",
        "version-credits-not-found": "За овај додатак није пронађена информација о заслугама.",
-       "version-poweredby-credits": "Овај вики покреће '''[https://www.mediawiki.org/ Медијавики]''', ауторска права © 2001-$1 $2.",
+       "version-poweredby-credits": "Овај вики покреће <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, ауторска права © 2001-$1 $2.",
        "version-poweredby-others": "остали",
        "version-poweredby-translators": "translatewiki.net преводиоци",
        "version-credits-summary": "Желели бисмо да захвалимо следећим људима на њиховом доприносу [[Special:Version|Медијавикији]].",
index 8217afb..6ef0b47 100644 (file)
        "accmailtext": "Ett slumpgenererat lösenord för [[User talk:$1|$1]] har skickats till $2. Det kan ändras på sidan ''[[Special:ChangePassword|ändra lösenord]]'' när du loggar in.",
        "newarticle": "(Ny)",
        "newarticletext": "Du har klickat på en länk till en sida som inte finns ännu. För att skapa sidan, börja att skriva i fältet nedan (du kan läsa mer på [$1 hjälpsidan]). Om du kom hit av misstag kan du bara trycka på <strong>tillbaka</strong>-knappen i din webbläsare.",
-       "anontalkpagetext": "----<em>Detta är diskussionssidan för en anonym användare som inte ännu skapat ett konto, eller som inte använder det.</em>\nDärför måste vi använda den numeriska IP-adressen för att identifiera honom/henne.\nEn sådan IP-adress kan delas av flera användare.\nOm du är en anonym användare och känner att irrelevanta kommentarer har riktats mot dig, vänligen [[Special:CreateAccount|skapa ett konto]] eller [[Special:UserLogin|logga in]] för att undvika framtida förväxlingar med andra anonyma användare.",
+       "anontalkpagetext": "----<em>Detta är diskussionssidan för en anonym användare som inte ännu skapat ett konto, eller som inte använder det.</em>\nDärför måste vi använda den numeriska IP-adressen för att identifiera användaren.\nEn sådan IP-adress kan delas av flera användare.\nOm du är en anonym användare och känner att irrelevanta kommentarer har riktats mot dig, vänligen [[Special:CreateAccount|skapa ett konto]] eller [[Special:UserLogin|logga in]] för att undvika framtida förväxlingar med andra anonyma användare.",
        "noarticletext": "Det finns just nu ingen text på denna sida.\nDu kan [[Special:Search/{{PAGENAME}}|söka efter denna sidtitel]] på andra sidor, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i relaterade loggar], eller [{{fullurl:{{FULLPAGENAME}}|action=edit}} skapa denna sida]</span>.",
        "noarticletext-nopermission": "Det finns för tillfället ingen text på denna sida.\nDu kan [[Special:Search/{{PAGENAME}}|söka efter denna sidas titel]] på andra sidor,\neller <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i relaterade loggar]</span> men du har inte behörighet att skapa sidan.",
        "missing-revision": "Version #$1 av sidan med namnet \"{{FULLPAGENAME}}\" finns inte.\n\nDetta orsakas vanligen genom att en gammal historiklänk följts till en sida som har raderats.\nDetaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
index eec84ac..b56f9cc 100644 (file)
        "login-userblocked": "Hinarang ang tagagamit na ito.  Hindi pinahihintulutan ang paglalagda.",
        "wrongpassword": "Mali ang ipinasok na password o pangalan ng tagagamit.\nPakisubok muli.",
        "wrongpasswordempty": "Walang laman ang ipinasok na password.\nPakisubok muli.",
-       "passwordtooshort": "Ang mga password ay dapat mayroong {{PLURAL:$1|1 panitik|$1 panitik}} (karakter).",
+       "passwordtooshort": "Ang mga password ay kailangan di bababa sa $1 karakter.",
        "passwordtoolong": "Ang mga password ay hindi maaaring mas mahaba sa {{PLURAL:$1|1 panitik|$1 panitik}}.",
        "passwordtoopopular": "Hindi maaaring gamitin ang mga piniling pangkaraniwang password. Mangyaring pumili ng higit na natatanging password na mahirap hulaan.",
        "password-name-match": "Dapat magkaiba ang password mo sa bansag o username mo.",
index 8a36055..e05f1b4 100644 (file)
        "prefs-email": "電子郵件選項",
        "prefs-rendering": "外觀",
        "saveprefs": "儲存",
-       "restoreprefs": "還原所有預設設定 (所有項目)",
+       "restoreprefs": "還原所有預設設定(所有項目)",
        "prefs-editing": "編輯",
        "searchresultshead": "搜尋",
        "stub-threshold": "短頁面連結格式門檻值 ($1):",
        "rollback-missingparam": "請求缺少必要參數。",
        "rollback-missingrevision": "無法載入修訂資料。",
        "cantrollback": "無法還原編輯;\n此頁面的最後貢獻者是唯一的作者。",
-       "alreadyrolled": "無法還原由 [[User:$2|$2]] ([[User talk:$2|對話]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]] 所作的最後一次編輯 [[:$1]],已有其他人編輯或還原了該頁面。\n\n最後一次編輯該頁面的使用者是 [[User:$3|$3]] ([[User talk:$3|對話]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。",
+       "alreadyrolled": "無法還原由[[User:$2|$2]]([[User talk:$2|對話]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])所作的最後一次編輯[[:$1]],已有其他人編輯或還原了該頁面。\n\n最後一次編輯該頁面的使用者是[[User:$3|$3]]([[User talk:$3|對話]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。",
        "editcomment": "編輯摘要為:<em>$1</em>。",
        "revertpage": "已還原[[Special:Contributions/$2|$2]]([[User talk:$2|對話]])的編輯為最後由[[User:$1|$1]]所修訂的版本",
        "revertpage-nouser": "已還原隱藏使用者的編輯為最後 {{GENDER:$1|[[User:$1|$1]]}} 修訂的版本",
        "blocklog-showsuppresslog": "此使用者先前被封鎖並且隱藏過。\n以下為禁止顯示紀錄以供參考:",
        "blocklogentry": "已封鎖 [[$1]] 的期限至 $2 $3",
        "reblock-logentry": "變更 [[$1]] 的封鎖設定,到期時間為 $2 $3",
-       "blocklogtext": "此為使用者的封鎖及取消封鎖動作的記錄。未列出自動封鎖的IP位址。請參考[[Special:BlockList|封鎖清單]]中的目前正在作業的阻止與封鎖。",
+       "blocklogtext": "此為使用者的封鎖及取消封鎖動作的記錄。未列出自動封鎖的IP位址。請參考[[Special:BlockList|封鎖清單]]中的目前正在運作的阻止與封鎖。",
        "unblocklogentry": "已解除封鎖 $1",
        "block-log-flags-anononly": "僅限匿名使用者",
        "block-log-flags-nocreate": "停用帳號建立",
index 9f8d8f8..9c7bc00 100644 (file)
@@ -7,15 +7,7 @@ DROP INDEX ct_log_id ON /*_*/change_tag;
 DROP INDEX ct_rev_id ON /*_*/change_tag;
 DROP INDEX ct_tag ON /*_*/change_tag;
 
-DROP INDEX ts_rc_id ON /*_*/tag_summary;
-DROP INDEX ts_log_id ON /*_*/tag_summary;
-DROP INDEX ts_rev_id ON /*_*/tag_summary;
-
 CREATE UNIQUE INDEX /*i*/change_tag_rc_tag ON /*_*/change_tag (ct_rc_id,ct_tag);
 CREATE UNIQUE INDEX /*i*/change_tag_log_tag ON /*_*/change_tag (ct_log_id,ct_tag);
 CREATE UNIQUE INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag (ct_rev_id,ct_tag);
 CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
-
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
diff --git a/maintenance/archives/patch-tag_summary-ts_id.sql b/maintenance/archives/patch-tag_summary-ts_id.sql
deleted file mode 100644 (file)
index 66fa72e..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
--- Primary key in tag_summary table
-
-ALTER TABLE /*$wgDBprefix*/tag_summary
-       ADD COLUMN ts_id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
-       ADD PRIMARY KEY (ts_id);
diff --git a/maintenance/archives/patch-tag_summary-ts_log_id-unsigned.sql b/maintenance/archives/patch-tag_summary-ts_log_id-unsigned.sql
deleted file mode 100644 (file)
index 617073d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE /*_*/tag_summary MODIFY ts_log_id int unsigned NULL;
\ No newline at end of file
diff --git a/maintenance/archives/patch-tag_summary-ts_rev_id-unsigned.sql b/maintenance/archives/patch-tag_summary-ts_rev_id-unsigned.sql
deleted file mode 100644 (file)
index e6a5bcd..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE /*_*/tag_summary MODIFY ts_rev_id int unsigned NULL;
\ No newline at end of file
diff --git a/maintenance/archives/patch-tag_summary.sql b/maintenance/archives/patch-tag_summary.sql
deleted file mode 100644 (file)
index a81b368..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
--- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT that only works on MySQL 4.1+
--- Andrew Garrett, 2009-01
-CREATE TABLE /*_*/tag_summary (
-       ts_rc_id int NULL,
-       ts_log_id int NULL,
-       ts_rev_id int NULL,
-       ts_tags BLOB NOT NULL
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
diff --git a/maintenance/archives/patch-valid_tag.sql b/maintenance/archives/patch-valid_tag.sql
deleted file mode 100644 (file)
index 994a5d5..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
--- Andrew Garrett, 2009-01
-CREATE TABLE /*_*/valid_tag (
-       vt_tag varchar(255) NOT NULL PRIMARY KEY
-) /*$wgDBTableOptions*/;
diff --git a/maintenance/mssql/archives/patch-tag_summary-ts_id.sql b/maintenance/mssql/archives/patch-tag_summary-ts_id.sql
deleted file mode 100644 (file)
index d62bd35..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
--- Primary key in tag_summary table
-
-ALTER TABLE /*_*/tag_summary ADD ts_id INT IDENTITY;
-ALTER TABLE /*_*/tag_summary ADD CONSTRAINT pk_tag_summary PRIMARY KEY(ts_id)
index 371d80b..4bafc8b 100644 (file)
@@ -1,6 +1,6 @@
 -- Primary key and expiry column in user_groups table
 
 DROP INDEX IF EXISTS /*i*/ug_user_group ON /*_*/user_groups;
-ALTER TABLE /*_*/tag_summary ADD CONSTRAINT pk_user_groups PRIMARY KEY(ug_user, ug_group);
-ALTER TABLE /*_*/tag_summary ADD ug_expiry varchar(14) DEFAULT NULL;
+ALTER TABLE /*_*/user_groups ADD CONSTRAINT pk_user_groups PRIMARY KEY(ug_user, ug_group);
+ALTER TABLE /*_*/user_groups ADD ug_expiry varchar(14) DEFAULT NULL;
 CREATE INDEX /*i*/ug_expiry ON /*_*/user_groups(ug_expiry);
index fd2fae7..4ecc6db 100644 (file)
@@ -1411,29 +1411,6 @@ CREATE UNIQUE INDEX /*i*/change_tag_rev_tag_id ON /*_*/change_tag (ct_rev_id,ct_
 -- Covering index, so we can pull all the info only out of the index.
 CREATE INDEX /*i*/change_tag_tag_id_id ON /*_*/change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
 
--- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT
--- that only works on MySQL 4.1+
-CREATE TABLE /*_*/tag_summary (
-  ts_id int NOT NULL PRIMARY KEY IDENTITY,
-  -- RCID for the change
-  ts_rc_id int NULL REFERENCES /*_*/recentchanges(rc_id),
-  -- LOGID for the change
-  ts_log_id int NULL REFERENCES /*_*/logging(log_id),
-  -- REVID for the change
-  ts_rev_id int NULL REFERENCES /*_*/revision(rev_id),
-  -- Comma-separated list of tags
-  ts_tags nvarchar(max) NOT NULL
-);
-
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
-
-
-CREATE TABLE /*_*/valid_tag (
-  vt_tag nvarchar(255) NOT NULL PRIMARY KEY
-);
-
 -- Table for storing localisation data
 CREATE TABLE /*_*/l10n_cache (
   -- Language code
diff --git a/maintenance/oracle/archives/patch-tag_summary-ts_id.sql b/maintenance/oracle/archives/patch-tag_summary-ts_id.sql
deleted file mode 100644 (file)
index 91c3338..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.tag_summary ADD (
-ts_id NUMBER NOT NULL,
-);
-ALTER TABLE &mw_prefix.tag_summary ADD CONSTRAINT &mw_prefix.tag_summary_pk PRIMARY KEY (ts_id);
index 4c36fe1..2c20fff 100644 (file)
@@ -946,23 +946,6 @@ CREATE UNIQUE INDEX &mw_prefix.change_tag_u06 ON &mw_prefix.change_tag (ct_rev_i
 
 CREATE INDEX &mw_prefix.change_tag_i02 ON &mw_prefix.change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
 
-CREATE TABLE &mw_prefix.tag_summary (
-  ts_id NUMBER NOT NULL,
-  ts_rc_id NUMBER NULL,
-  ts_log_id NUMBER NULL,
-  ts_rev_id NUMBER NULL,
-  ts_tags BLOB NOT NULL
-);
-ALTER TABLE &mw_prefix.tag_summary ADD CONSTRAINT &mw_prefix.tag_summary_pk PRIMARY KEY (ts_id);
-CREATE UNIQUE INDEX &mw_prefix.tag_summary_u01 ON &mw_prefix.tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX &mw_prefix.tag_summary_u02 ON &mw_prefix.tag_summary (ts_log_id);
-CREATE UNIQUE INDEX &mw_prefix.tag_summary_u03 ON &mw_prefix.tag_summary (ts_rev_id);
-
-CREATE TABLE &mw_prefix.valid_tag (
-  vt_tag VARCHAR2(255) NOT NULL
-);
-ALTER TABLE &mw_prefix.valid_tag ADD CONSTRAINT &mw_prefix.valid_tag_pk PRIMARY KEY (vt_tag);
-
 -- This table is not used unless profiling is turned on
 --CREATE TABLE &mw_prefix.profiling (
 --  pf_count   NUMBER          DEFAULT 0 NOT NULL,
diff --git a/maintenance/postgres/archives/patch-tag_summary.sql b/maintenance/postgres/archives/patch-tag_summary.sql
deleted file mode 100644 (file)
index 49e05e7..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-CREATE TABLE tag_summary (
-  ts_rc_id   INTEGER      NULL,
-  ts_log_id  INTEGER      NULL,
-  ts_rev_id  INTEGER      NULL,
-  ts_tags    TEXT     NOT NULL
-);
-CREATE UNIQUE INDEX tag_summary_rc_id ON tag_summary(ts_rc_id);
-CREATE UNIQUE INDEX tag_summary_log_id ON tag_summary(ts_log_id);
-CREATE UNIQUE INDEX tag_summary_rev_id ON tag_summary(ts_rev_id);
diff --git a/maintenance/postgres/archives/patch-valid_tag.sql b/maintenance/postgres/archives/patch-valid_tag.sql
deleted file mode 100644 (file)
index 98575c6..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-CREATE TABLE valid_tag (
-  vt_tag TEXT NOT NULL PRIMARY KEY
-);
index 02d018c..b6858c5 100644 (file)
@@ -28,7 +28,6 @@ DROP SEQUENCE IF EXISTS archive_ar_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS externallinks_el_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS sites_site_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS change_tag_ct_id_seq CASCADE;
-DROP SEQUENCE IF EXISTS tag_summary_ts_id_seq CASCADE;
 DROP FUNCTION IF EXISTS page_deleted() CASCADE;
 DROP FUNCTION IF EXISTS ts2_page_title() CASCADE;
 DROP FUNCTION IF EXISTS ts2_page_text() CASCADE;
@@ -812,23 +811,6 @@ CREATE UNIQUE INDEX change_tag_rev_tag_id ON change_tag(ct_rev_id,ct_tag_id);
 
 CREATE INDEX change_tag_tag_id_id ON change_tag(ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
 
-CREATE SEQUENCE tag_summary_ts_id_seq;
-CREATE TABLE tag_summary (
-  ts_id      INTEGER  NOT NULL  PRIMARY KEY DEFAULT nextval('tag_summary_ts_id_seq'),
-  ts_rc_id   INTEGER      NULL,
-  ts_log_id  INTEGER      NULL,
-  ts_rev_id  INTEGER      NULL,
-  ts_tags    TEXT     NOT NULL
-);
-ALTER SEQUENCE tag_summary_ts_id_seq OWNED BY tag_summary.ts_id;
-CREATE UNIQUE INDEX tag_summary_rc_id ON tag_summary(ts_rc_id);
-CREATE UNIQUE INDEX tag_summary_log_id ON tag_summary(ts_log_id);
-CREATE UNIQUE INDEX tag_summary_rev_id ON tag_summary(ts_rev_id);
-
-CREATE TABLE valid_tag (
-  vt_tag TEXT NOT NULL PRIMARY KEY
-);
-
 CREATE TABLE user_properties (
   up_user     INTEGER      NULL  REFERENCES mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
   up_property TEXT     NOT NULL,
diff --git a/maintenance/sqlite/archives/patch-tag_summary-ts_id.sql b/maintenance/sqlite/archives/patch-tag_summary-ts_id.sql
deleted file mode 100644 (file)
index b6a1202..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-DROP TABLE IF EXISTS /*_*/tag_summary_tmp;
-
-CREATE TABLE /*$wgDBprefix*/tag_summary_tmp (
-  ts_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  ts_rc_id int NULL,
-  ts_log_id int NULL,
-  ts_rev_id int NULL,
-  ts_tags blob NOT NULL
-);
-
-INSERT OR IGNORE INTO /*_*/tag_summary_tmp (
-    ts_rc_id, ts_log_id, ts_rev_id, ts_tags )
-    SELECT
-    ts_rc_id, ts_log_id, ts_rev_id, ts_tags
-    FROM /*_*/tag_summary;
-
-DROP TABLE /*_*/tag_summary;
-
-ALTER TABLE /*_*/tag_summary_tmp RENAME TO /*_*/tag_summary;
-
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
index 72db8c3..83ba4e2 100644 (file)
@@ -1859,28 +1859,6 @@ CREATE UNIQUE INDEX /*i*/change_tag_rev_tag_id ON /*_*/change_tag (ct_rev_id,ct_
 -- Covering index, so we can pull all the info only out of the index.
 CREATE INDEX /*i*/change_tag_tag_id_id ON /*_*/change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
 
--- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT
--- that only works on MySQL 4.1+
-CREATE TABLE /*_*/tag_summary (
-  ts_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  -- RCID for the change
-  ts_rc_id int NULL,
-  -- LOGID for the change
-  ts_log_id int unsigned NULL,
-  -- REVID for the change
-  ts_rev_id int unsigned NULL,
-  -- Comma-separated list of tags
-  ts_tags blob NOT NULL
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
-
-
-CREATE TABLE /*_*/valid_tag (
-  vt_tag varchar(255) NOT NULL PRIMARY KEY
-) /*$wgDBTableOptions*/;
 
 -- Table for storing localisation data
 CREATE TABLE /*_*/l10n_cache (
index 8f1d563..18fb4a2 100644 (file)
@@ -87,6 +87,8 @@
        margin-right: @ooui-spacing-medium;
 }
 
+// First selector is flatlist specific
+.mw-htmlform-field-HTMLMultiSelectField.oo-ui-fieldLayout,
 .mw-htmlform-ooui .htmlform-tip,
 .mw-htmlform-ooui .mw-htmlform-submit-buttons {
        margin-top: @ooui-spacing-medium;
index cb05793..cb996f3 100644 (file)
@@ -1,9 +1,16 @@
 /* Special:AllMessages */
+#mw-allmessagestable tbody:hover td {
+       /* Duplicate of `.mw-datatable tr:hover td` from shared.css,
+        * so that it also applies when hovering a lower cell
+        * within the same rowspan */
+       background-color: #eaf3ff;
+}
+
 #mw-allmessagestable .am_default {
        background-color: #fcffc4;
 }
 
-#mw-allmessagestable tr:hover .am_default {
+#mw-allmessagestable tbody:hover .am_default {
        background-color: #faff90;
 }
 
@@ -11,7 +18,7 @@
        background-color: #e2ffe2;
 }
 
-#mw-allmessagestable tr:hover + tr .am_actual {
+#mw-allmessagestable tbody:hover .am_actual {
        background-color: #b1ffb1;
 }
 
diff --git a/tests/phpunit/includes/MagicWordFactoryTest.php b/tests/phpunit/includes/MagicWordFactoryTest.php
new file mode 100644 (file)
index 0000000..63ca139
--- /dev/null
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * @covers \MagicWordFactory
+ *
+ * @author Derick N. Alangi
+ */
+class MagicWordFactoryTest extends MediaWikiTestCase {
+       private function makeMagicWordFactory( Language $contLang = null ) {
+               if ( $contLang === null ) {
+                       return new MagicWordFactory( Language::factory( 'en' ) );
+               }
+               return new MagicWordFactory( $contLang );
+       }
+
+       public function testGetContentLanguage() {
+               $contLang = Language::factory( 'en' );
+
+               $magicWordFactory = $this->makeMagicWordFactory( $contLang );
+               $magicWordContLang = $magicWordFactory->getContentLanguage();
+
+               $this->assertSame( $contLang, $magicWordContLang );
+       }
+
+       public function testGetMagicWord() {
+               $magicWordIdValid = 'pageid';
+               $magicWordFactory = $this->makeMagicWordFactory();
+               $mwActual = $magicWordFactory->get( $magicWordIdValid );
+               $contLang = $magicWordFactory->getContentLanguage();
+               $expected = new MagicWord( $magicWordIdValid, [ 'PAGEID' ], false, $contLang );
+
+               $this->assertEquals( $expected, $mwActual );
+       }
+
+       public function testGetInvalidMagicWord() {
+               $magicWordFactory = $this->makeMagicWordFactory();
+
+               $this->setExpectedException( MWException::class );
+               \Wikimedia\suppressWarnings();
+               try {
+                       $magicWordFactory->get( 'invalid magic word' );
+               } finally {
+                       \Wikimedia\restoreWarnings();
+               }
+       }
+
+       public function testGetVariableIDs() {
+               $magicWordFactory = $this->makeMagicWordFactory();
+               $varIds = $magicWordFactory->getVariableIDs();
+
+               $this->assertInternalType( 'array', $varIds );
+               $this->assertNotEmpty( $varIds );
+               $this->assertContainsOnly( 'string', $varIds );
+       }
+
+       public function testGetSubstIDs() {
+               $magicWordFactory = $this->makeMagicWordFactory();
+               $substIds = $magicWordFactory->getSubstIDs();
+
+               $this->assertInternalType( 'array', $substIds );
+               $this->assertNotEmpty( $substIds );
+               $this->assertContainsOnly( 'string', $substIds );
+       }
+
+       /**
+        * Test both valid and invalid caching hints paths
+        */
+       public function testGetCacheTTL() {
+               $magicWordFactory = $this->makeMagicWordFactory();
+               $actual = $magicWordFactory->getCacheTTL( 'localday' );
+
+               $this->assertSame( 3600, $actual );
+
+               $actual = $magicWordFactory->getCacheTTL( 'currentmonth' );
+               $this->assertSame( 86400, $actual );
+
+               $actual = $magicWordFactory->getCacheTTL( 'invalid' );
+               $this->assertSame( -1, $actual );
+       }
+
+       public function testGetDoubleUnderscoreArray() {
+               $magicWordFactory = $this->makeMagicWordFactory();
+               $actual = $magicWordFactory->getDoubleUnderscoreArray();
+
+               $this->assertInstanceOf( MagicWordArray::class, $actual );
+       }
+}
index e229f0c..feafdef 100644 (file)
@@ -215,6 +215,19 @@ class ApiBlockTest extends ApiTestCase {
                $this->doBlock( [ 'expiry' => '' ] );
        }
 
+       public function testBlockWithoutRestrictions() {
+               $this->setMwGlobals( [
+                       'wgEnablePartialBlocks' => true,
+               ] );
+
+               $this->doBlock();
+
+               $block = Block::newFromTarget( $this->mUser->getName() );
+
+               $this->assertTrue( $block->isSitewide() );
+               $this->assertCount( 0, $block->getRestrictions() );
+       }
+
        public function testBlockWithRestrictions() {
                $this->setMwGlobals( [
                        'wgEnablePartialBlocks' => true,
index e8cd342..7bab542 100644 (file)
@@ -553,6 +553,62 @@ class ApiComparePagesTest extends ApiTestCase {
                                        ]
                                ],
                        ],
+                       'Relative diff, no prev' => [
+                               [
+                                       'fromrev' => '{{REPL:revA1}}',
+                                       'torelative' => 'prev',
+                                       'prop' => 'ids|rel|diff|title|user|comment',
+                               ],
+                               [
+                                       'warnings' => [
+                                               [
+                                                       'code' => 'compare-no-prev',
+                                                       'module' => 'compare',
+                                               ],
+                                       ],
+                                       'compare' => [
+                                               'toid' => '{{REPL:pageA}}',
+                                               'torevid' => '{{REPL:revA1}}',
+                                               'tons' => 0,
+                                               'totitle' => 'ApiComparePagesTest A',
+                                               'touser' => '{{REPL:creator}}',
+                                               'touserid' => '{{REPL:creatorid}}',
+                                               'tocomment' => 'Test for ApiComparePagesTest: A 1',
+                                               'toparsedcomment' => 'Test for ApiComparePagesTest: A 1',
+                                               'next' => '{{REPL:revA2}}',
+                                               'body' => '<tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l1" >Line 1:</td>' . "\n"
+                                                       . '<td colspan="2" class="diff-lineno">Line 1:</td></tr>' . "\n"
+                                                       . '<tr><td class=\'diff-marker\'>−</td><td class=\'diff-deletedline\'><div> </div></td><td class=\'diff-marker\'>+</td><td class=\'diff-addedline\'><div><ins class="diffchange diffchange-inline">A 1</ins></div></td></tr>' . "\n",
+                                       ],
+                               ],
+                       ],
+                       'Relative diff, no next' => [
+                               [
+                                       'fromrev' => '{{REPL:revA4}}',
+                                       'torelative' => 'next',
+                                       'prop' => 'ids|rel|diff|title|user|comment',
+                               ],
+                               [
+                                       'warnings' => [
+                                               [
+                                                       'code' => 'compare-no-next',
+                                                       'module' => 'compare',
+                                               ],
+                                       ],
+                                       'compare' => [
+                                               'fromid' => '{{REPL:pageA}}',
+                                               'fromrevid' => '{{REPL:revA4}}',
+                                               'fromns' => 0,
+                                               'fromtitle' => 'ApiComparePagesTest A',
+                                               'fromuser' => '{{REPL:creator}}',
+                                               'fromuserid' => '{{REPL:creatorid}}',
+                                               'fromcomment' => 'Test for ApiComparePagesTest: A 4',
+                                               'fromparsedcomment' => 'Test for ApiComparePagesTest: A 4',
+                                               'prev' => '{{REPL:revA3}}',
+                                               'body' => '',
+                                       ],
+                               ],
+                       ],
                        'Diff for specific slots' => [
                                // @todo Use a page with multiple slots here
                                [
@@ -898,24 +954,6 @@ class ApiComparePagesTest extends ApiTestCase {
                                [],
                                'missingcontent'
                        ],
-                       'Error, Relative diff, no prev' => [
-                               [
-                                       'fromrev' => '{{REPL:revA1}}',
-                                       'torelative' => 'prev',
-                                       'prop' => 'ids',
-                               ],
-                               [],
-                               'baddiff'
-                       ],
-                       'Error, Relative diff, no next' => [
-                               [
-                                       'fromrev' => '{{REPL:revA4}}',
-                                       'torelative' => 'next',
-                                       'prop' => 'ids',
-                               ],
-                               [],
-                               'baddiff'
-                       ],
                        'Error, section diff with no revision' => [
                                [
                                        'fromtitle' => 'ApiComparePagesTest F',
index fc546ff..803eefb 100644 (file)
@@ -41,6 +41,35 @@ class ApiDeleteTest extends ApiTestCase {
                $this->assertFalse( Title::newFromText( $name )->exists() );
        }
 
+       public function testBatchedDelete() {
+               $this->setMwGlobals( 'wgDeleteRevisionsBatchSize', 1 );
+
+               $name = 'Help:' . ucfirst( __FUNCTION__ );
+               for ( $i = 1; $i <= 3; $i++ ) {
+                       $this->editPage( $name, "Revision $i" );
+               }
+
+               $apiResult = $this->doApiRequestWithToken( [
+                       'action' => 'delete',
+                       'title' => $name,
+               ] )[0];
+
+               $this->assertArrayHasKey( 'delete', $apiResult );
+               $this->assertArrayHasKey( 'title', $apiResult['delete'] );
+               $this->assertSame( $name, $apiResult['delete']['title'] );
+               $this->assertArrayHasKey( 'scheduled', $apiResult['delete'] );
+               $this->assertTrue( $apiResult['delete']['scheduled'] );
+               $this->assertArrayNotHasKey( 'logid', $apiResult['delete'] );
+
+               // Run the jobs
+               JobQueueGroup::destroySingletons();
+               $jobs = new RunJobs;
+               $jobs->loadParamsAndArgs( null, [ 'quiet' => true ], null );
+               $jobs->execute();
+
+               $this->assertFalse( Title::newFromText( $name )->exists( Title::GAID_FOR_UPDATE ) );
+       }
+
        public function testDeleteNonexistent() {
                $this->setExpectedException( ApiUsageException::class,
                        "The page you specified doesn't exist." );
index 312ef55..d7628e0 100644 (file)
@@ -634,6 +634,40 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                ];
        }
 
+       public function testAddMessagesFromStatus_filter() {
+               $result = new ApiResult( 8388608 );
+               $formatter = new ApiErrorFormatter( $result, Language::factory( 'qqx' ), 'plaintext', false );
+
+               $status = Status::newGood();
+               $status->warning( 'mainpage' );
+               $status->warning( 'parentheses', 'foobar' );
+               $status->warning( wfMessage( 'mainpage' ) );
+               $status->error( 'mainpage' );
+               $status->error( 'parentheses', 'foobaz' );
+               $formatter->addMessagesFromStatus( 'status', $status, [ 'warning', 'error' ], [ 'mainpage' ] );
+               $this->assertSame( [
+                       'errors' => [
+                               [
+                                       'code' => 'parentheses',
+                                       'text' => '(parentheses: foobaz)',
+                                       'module' => 'status',
+                                       ApiResult::META_CONTENT => 'text',
+                               ],
+                               ApiResult::META_INDEXED_TAG_NAME => 'error',
+                       ],
+                       'warnings' => [
+                               [
+                                       'code' => 'parentheses',
+                                       'text' => '(parentheses: foobar)',
+                                       'module' => 'status',
+                                       ApiResult::META_CONTENT => 'text',
+                               ],
+                               ApiResult::META_INDEXED_TAG_NAME => 'warning',
+                       ],
+                       ApiResult::META_TYPE => 'assoc',
+               ], $result->getResultData() );
+       }
+
        /**
         * @dataProvider provideIsValidApiCode
         * @covers ApiErrorFormatter::isValidApiCode
index f1e82ff..f1ee99f 100644 (file)
@@ -13,8 +13,6 @@ class ChangeTagsTest extends MediaWikiTestCase {
 
                $this->tablesUsed[] = 'change_tag';
                $this->tablesUsed[] = 'change_tag_def';
-               $this->tablesUsed[] = 'tag_summary';
-               $this->tablesUsed[] = 'valid_tag';
 
                // Truncate these to avoid the supposed-to-be-unused IDs in tests here turning
                // out to be used, leading ChangeTags::updateTags() to pick up bogus rc_id,
@@ -569,7 +567,6 @@ class ChangeTagsTest extends MediaWikiTestCase {
                $dbw = wfGetDB( DB_MASTER );
                $dbw->delete( 'change_tag', '*' );
                $dbw->delete( 'change_tag_def', '*' );
-               $dbw->delete( 'valid_tag', '*' );
 
                $rcId = 123;
                ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
@@ -590,7 +587,5 @@ class ChangeTagsTest extends MediaWikiTestCase {
                ];
                $res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_user_defined' ], '' );
                $this->assertEquals( $expected, iterator_to_array( $res, false ) );
-
-               $this->assertEquals( [], $dbr->selectFieldValues( 'valid_tag', 'vt_tag', '' ) );
        }
 }