Merge "Improve readability of SpecialBlock::checkUnblockSelf"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 12 Dec 2018 23:42:30 +0000 (23:42 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 12 Dec 2018 23:42:30 +0000 (23:42 +0000)
95 files changed:
.travis.yml
RELEASE-NOTES-1.33
autoload.php
composer.json
includes/Block.php
includes/DefaultSettings.php
includes/MediaWiki.php
includes/MovePage.php
includes/actions/RollbackAction.php
includes/api/ApiBase.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiQueryBase.php
includes/api/ApiRollback.php
includes/api/i18n/zh-hant.json
includes/diff/DifferenceEngine.php
includes/htmlform/fields/HTMLTitlesMultiselectField.php
includes/http/GuzzleHttpRequest.php [new file with mode: 0644]
includes/http/HttpRequestFactory.php
includes/http/MWHttpRequest.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/rdbms/TransactionProfiler.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/libs/redis/RedisConnRef.php
includes/sparql/SparqlClient.php
includes/specialpage/AuthManagerSpecialPage.php
includes/specials/SpecialUndelete.php
includes/specials/pagers/AllMessagesTablePager.php
includes/specials/pagers/ImageListPager.php
includes/user/BotPassword.php
includes/user/User.php
includes/widget/TitlesMultiselectWidget.php
languages/data/ZhConversion.php
languages/i18n/af.json
languages/i18n/ar.json
languages/i18n/azb.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/en.json
languages/i18n/fa.json
languages/i18n/frr.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hy.json
languages/i18n/it.json
languages/i18n/kjp.json
languages/i18n/ko.json
languages/i18n/mai.json
languages/i18n/mk.json
languages/i18n/mr.json
languages/i18n/my.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sl.json
languages/i18n/sv.json
languages/i18n/uk.json
languages/i18n/vi.json
languages/i18n/yi.json
languages/i18n/zh-hant.json
maintenance/language/zhtable/simp2trad.manual
maintenance/language/zhtable/toCN.manual
maintenance/language/zhtable/toHK.manual
maintenance/language/zhtable/toSimp.manual
maintenance/language/zhtable/toTW.manual
maintenance/language/zhtable/toTrad.manual
maintenance/language/zhtable/trad2simp.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
resources/src/jquery.spinner/spinner.js
resources/src/jquery/jquery.textSelection.js
resources/src/mediawiki.Title/Title.js
resources/src/mediawiki.base/mediawiki.base.js
resources/src/mediawiki.cookie.js
resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js
resources/src/mediawiki.special.block.js
resources/src/mediawiki.special.contributions.js
resources/src/mediawiki.special.pageLanguage.js
resources/src/mediawiki.special.search/search.js
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsProvider.js
resources/src/mediawiki.widgets/mw.widgets.ExpiryInputWidget.less
resources/src/startup/mediawiki.log.js
tests/phpunit/includes/actions/ViewActionTest.php [new file with mode: 0644]
tests/phpunit/includes/http/HttpTest.php
tests/phpunit/includes/user/UserTest.php
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js

index b28861d..4260c46 100644 (file)
@@ -17,6 +17,18 @@ sudo: false
 # - Required for non-buggy xml library for XmlTypeCheck/UploadBaseTest (T75176).
 dist: trusty
 
+git:
+  depth: 3
+  quiet: true
+
+# Cache NPM and Composer directories
+# <https://docs.travis-ci.com/user/caching/>
+cache:
+  npm: true
+  directories:
+  # Composer doesn't have a dedicated cache setting in Travis CI config, so set the directory path instead.
+  - vendor
+
 matrix:
   fast_finish: true
   include:
index baf3689..f68875b 100644 (file)
@@ -44,6 +44,11 @@ production.
 ==== New external libraries ====
 * Added wikimedia/password-blacklist 0.1.4.
 * …
+* Added guzzlehttp/guzzle 6.3.3 and dependents:
+  * guzzlehttp/promises 1.3.1
+  * guzzlehttp/psr7 1.5.0
+  * psr/http-message 1.0.1
+  * ralouphie/getallheaders 2.0.5
 
 ==== Changed external libraries ====
 * Updated wikimedia/xmp-reader from 0.6.0 to 0.6.1.
index 68b3305..c411948 100644 (file)
@@ -571,6 +571,7 @@ $wgAutoloadLocalClasses = [
        'GitInfo' => __DIR__ . '/includes/GitInfo.php',
        'GlobalDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
        'GlobalVarConfig' => __DIR__ . '/includes/config/GlobalVarConfig.php',
+       'GuzzleHttpRequest' => __DIR__ . '/includes/http/GuzzleHttpRequest.php',
        'HHVMMakeRepo' => __DIR__ . '/maintenance/hhvm/makeRepo.php',
        'HTMLApiField' => __DIR__ . '/includes/htmlform/fields/HTMLApiField.php',
        'HTMLAutoCompleteSelectField' => __DIR__ . '/includes/htmlform/fields/HTMLAutoCompleteSelectField.php',
index bf3a101..08b0e01 100644 (file)
                "ext-json": "*",
                "ext-mbstring": "*",
                "ext-xml": "*",
+               "guzzlehttp/guzzle": "6.3.3",
+               "guzzlehttp/promises": "1.3.1",
+               "guzzlehttp/psr7": "1.5.0",
                "liuggio/statsd-php-client": "1.0.18",
                "oojs/oojs-ui": "0.29.6",
                "pear/mail": "1.4.1",
                "pear/mail_mime": "1.10.2",
                "pear/net_smtp": "1.8.0",
                "php": ">=5.6.99",
+               "psr/http-message": "1.0.1",
                "psr/log": "1.0.2",
+               "ralouphie/getallheaders": "2.0.5",
                "wikimedia/assert": "0.2.2",
                "wikimedia/at-ease": "1.2.0",
                "wikimedia/base-convert": "2.0.0",
index eb8214b..ec8cae8 100644 (file)
@@ -1168,7 +1168,12 @@ class Block {
                                $res = $this->isSitewide();
                                break;
                        case 'editownusertalk':
+                               // NOTE: this check is not reliable on partial blocks
+                               // since partially blocked users are always allowed to edit
+                               // their own talk page unless a restriction exists on the
+                               // page or User_talk: namespace
                                $res = wfSetVar( $this->mDisableUsertalk, $x );
+
                                // edit own user talk can be disabled by config
                                if ( !$blockAllowsUTEdit ) {
                                        $res = true;
index 0acce58..a63d352 100644 (file)
@@ -4975,6 +4975,10 @@ $wgAutoblockExpiry = 86400;
 
 /**
  * Set this to true to allow blocked users to edit their own user talk page.
+ *
+ * This only applies to sitewide blocks. Partial blocks always allow users to
+ * edit their own user talk page unless otherwise specified in the block
+ * restrictions.
  */
 $wgBlockAllowsUTEdit = true;
 
index 267b589..f5a954d 100644 (file)
@@ -893,8 +893,7 @@ class MediaWiki {
 
                // Loosen DB query expectations since the HTTP client is unblocked
                $trxProfiler = Profiler::instance()->getTransactionProfiler();
-               $trxProfiler->resetExpectations();
-               $trxProfiler->setExpectations(
+               $trxProfiler->redefineExpectations(
                        $this->context->getRequest()->hasSafeMethod()
                                ? $this->config->get( 'TrxProfilerLimits' )['PostSend-GET']
                                : $this->config->get( 'TrxProfilerLimits' )['PostSend-POST'],
index bb76395..7d27a27 100644 (file)
@@ -249,23 +249,7 @@ class MovePage {
                        return $status;
                }
 
-               // If it is a file, move it first.
-               // It is done before all other moving stuff is done because it's hard to revert.
                $dbw = wfGetDB( DB_MASTER );
-               if ( $this->oldTitle->getNamespace() == NS_FILE ) {
-                       $file = wfLocalFile( $this->oldTitle );
-                       $file->load( File::READ_LATEST );
-                       if ( $file->exists() ) {
-                               $status = $file->move( $this->newTitle );
-                               if ( !$status->isOK() ) {
-                                       return $status;
-                               }
-                       }
-                       // Clear RepoGroup process cache
-                       RepoGroup::singleton()->clearCache( $this->oldTitle );
-                       RepoGroup::singleton()->clearCache( $this->newTitle ); # clear false negative cache
-               }
-
                $dbw->startAtomic( __METHOD__ );
 
                Hooks::run( 'TitleMoveStarting', [ $this->oldTitle, $this->newTitle, $user ] );
@@ -394,6 +378,16 @@ class MovePage {
                        $store->duplicateAllAssociatedEntries( $this->oldTitle, $this->newTitle );
                }
 
+               // If it is a file then move it last.
+               // This is done after all database changes so that file system errors cancel the transaction.
+               if ( $this->oldTitle->getNamespace() == NS_FILE ) {
+                       $status = $this->moveFile( $this->oldTitle, $this->newTitle );
+                       if ( !$status->isOK() ) {
+                               $dbw->cancelAtomic( __METHOD__ );
+                               return $status;
+                       }
+               }
+
                Hooks::run(
                        'TitleMoveCompleting',
                        [ $this->oldTitle, $this->newTitle,
@@ -427,6 +421,33 @@ class MovePage {
                return Status::newGood();
        }
 
+       /**
+        * Move a file associated with a page to a new location.
+        * Can also be used to revert after a DB failure.
+        *
+        * @access private
+        * @param Title Old location to move the file from.
+        * @param Title New location to move the file to.
+        * @return Status
+        */
+       private function moveFile( $oldTitle, $newTitle ) {
+               $status = Status::newFatal(
+                       'cannotdelete',
+                       $oldTitle->getPrefixedText()
+               );
+
+               $file = wfLocalFile( $oldTitle );
+               $file->load( File::READ_LATEST );
+               if ( $file->exists() ) {
+                       $status = $file->move( $newTitle );
+               }
+
+               // Clear RepoGroup process cache
+               RepoGroup::singleton()->clearCache( $oldTitle );
+               RepoGroup::singleton()->clearCache( $newTitle ); # clear false negative cache
+               return $status;
+       }
+
        /**
         * Move page to a title which is either a redirect to the
         * source page or nonexistent
index 3e6d402..03a5bc8 100644 (file)
@@ -73,9 +73,9 @@ class RollbackAction extends FormlessAction {
                $fname = __METHOD__;
                $trxLimits = $this->context->getConfig()->get( 'TrxProfilerLimits' );
                $trxProfiler = Profiler::instance()->getTransactionProfiler();
-               $trxProfiler->setExpectations( $trxLimits['POST'], $fname );
+               $trxProfiler->redefineExpectations( $trxLimits['POST'], $fname );
                DeferredUpdates::addCallableUpdate( function () use ( $trxProfiler, $trxLimits, $fname ) {
-                       $trxProfiler->setExpectations( $trxLimits['PostSend-POST'], $fname );
+                       $trxProfiler->redefineExpectations( $trxLimits['PostSend-POST'], $fname );
                } );
 
                $data = null;
index 9ea8c6d..d29131b 100644 (file)
@@ -1856,7 +1856,7 @@ abstract class ApiBase extends ContextSource {
                                                'min_id' => "MIN($field)",
                                                'max_id' => "MAX($field)",
                                        ],
-                                       null,
+                                       '',
                                        __METHOD__
                                );
                                self::$filterIDsCache[$table][$field] = $row;
index 37ec3cf..8c0b42d 100644 (file)
@@ -69,7 +69,7 @@ class ApiFeedWatchlist extends ApiBase {
                                'meta' => 'siteinfo',
                                'siprop' => 'general',
                                'list' => 'watchlist',
-                               'wlprop' => 'title|user|comment|timestamp|ids',
+                               'wlprop' => 'title|user|comment|timestamp|ids|loginfo',
                                'wldir' => 'older', // reverse order - from newest to oldest
                                'wlend' => $endTime, // stop at this time
                                'wllimit' => min( 50, $this->getConfig()->get( 'FeedLimit' ) )
@@ -193,7 +193,12 @@ class ApiFeedWatchlist extends ApiBase {
                        }
                }
                if ( isset( $info['revid'] ) ) {
-                       $titleUrl = $title->getFullURL( [ 'diff' => $info['revid'] ] );
+                       if ( $info['revid'] === 0 && isset( $info['logid'] ) ) {
+                               $logTitle = Title::makeTitle( NS_SPECIAL, 'Log' );
+                               $titleUrl = $logTitle->getFullURL( [ 'logid' => $info['logid'] ] );
+                       } else {
+                               $titleUrl = $title->getFullURL( [ 'diff' => $info['revid'] ] );
+                       }
                } else {
                        $titleUrl = $title->getFullURL( $curidParam );
                }
index b243cee..d9fe50b 100644 (file)
@@ -464,32 +464,31 @@ abstract class ApiQueryBase extends ApiBase {
        public function showHiddenUsersAddBlockInfo( $showBlockInfo ) {
                $db = $this->getDB();
 
-               $this->addTables( 'ipblocks' );
-               $this->addJoinConds( [
-                       'ipblocks' => [ 'LEFT JOIN', [
+               $tables = [ 'ipblocks' ];
+               $fields = [ 'ipb_deleted' ];
+               $joinConds = [
+                       'blk' => [ 'LEFT JOIN', [
                                'ipb_user=user_id',
                                'ipb_expiry > ' . $db->addQuotes( $db->timestamp() ),
                        ] ],
-               ] );
-
-               $this->addFields( 'ipb_deleted' );
+               ];
 
                if ( $showBlockInfo ) {
-                       $this->addFields( [
+                       $actorQuery = ActorMigration::newMigration()->getJoin( 'ipb_by' );
+                       $commentQuery = CommentStore::getStore()->getJoin( 'ipb_reason' );
+                       $tables += $actorQuery['tables'] + $commentQuery['tables'];
+                       $joinConds += $actorQuery['joins'] + $commentQuery['joins'];
+                       $fields = array_merge( $fields, [
                                'ipb_id',
                                'ipb_expiry',
                                'ipb_timestamp'
-                       ] );
-                       $actorQuery = ActorMigration::newMigration()->getJoin( 'ipb_by' );
-                       $this->addTables( $actorQuery['tables'] );
-                       $this->addFields( $actorQuery['fields'] );
-                       $this->addJoinConds( $actorQuery['joins'] );
-                       $commentQuery = CommentStore::getStore()->getJoin( 'ipb_reason' );
-                       $this->addTables( $commentQuery['tables'] );
-                       $this->addFields( $commentQuery['fields'] );
-                       $this->addJoinConds( $commentQuery['joins'] );
+                       ], $actorQuery['fields'], $commentQuery['fields'] );
                }
 
+               $this->addTables( [ 'blk' => $tables ] );
+               $this->addFields( $fields );
+               $this->addJoinConds( $joinConds );
+
                // Don't show hidden names
                if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
                        $this->addWhere( 'ipb_deleted = 0 OR ipb_deleted IS NULL' );
index 78696da..18aa6da 100644 (file)
@@ -59,9 +59,9 @@ class ApiRollback extends ApiBase {
                $fname = __METHOD__;
                $trxLimits = $this->getConfig()->get( 'TrxProfilerLimits' );
                $trxProfiler = Profiler::instance()->getTransactionProfiler();
-               $trxProfiler->setExpectations( $trxLimits['POST'], $fname );
+               $trxProfiler->redefineExpectations( $trxLimits['POST'], $fname );
                DeferredUpdates::addCallableUpdate( function () use ( $trxProfiler, $trxLimits, $fname ) {
-                       $trxProfiler->setExpectations( $trxLimits['PostSend-POST'], $fname );
+                       $trxProfiler->redefineExpectations( $trxLimits['PostSend-POST'], $fname );
                } );
 
                $retval = $pageObj->doRollback(
index 3972b4e..a516888 100644 (file)
        "apihelp-query+userinfo-paramvalue-prop-realname": "添加使用者的真實姓名。",
        "apihelp-query+userinfo-paramvalue-prop-email": "添加使用者的電子郵件地址與電子郵件驗證日期。",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "添加使用者的註冊日期。",
+       "apihelp-query+userinfo-paramvalue-prop-centralids": "替使用者添加中心 ID 與附加狀態。",
        "apihelp-query+userinfo-example-simple": "取得目前使用者的資訊。",
        "apihelp-query+userinfo-example-data": "取得目前使用者的額外資訊。",
        "apihelp-query+users-summary": "取得有關使用者清單的資訊。",
        "apihelp-query+users-paramvalue-prop-registration": "添加使用者的註冊時間戳記。",
        "apihelp-query+users-paramvalue-prop-emailable": "若使用者符合條件並想要透過 [[Special:Emailuser]] 來接收電子郵件時標記。",
        "apihelp-query+users-paramvalue-prop-gender": "標記使用者性別。回傳「male」、「female」、或「unknown」。",
+       "apihelp-query+users-paramvalue-prop-centralids": "替使用者添加中心 ID 與附加狀態。",
        "apihelp-query+users-param-users": "要獲取的使用者清單。",
        "apihelp-query+users-param-userids": "要獲取的使用者 ID 清單。",
        "apihelp-query+users-param-token": "請改用 <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "添加使用者上一次被通知到有關編輯的時間戳記。",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "在適當處添加日誌資訊。",
        "apihelp-query+watchlist-paramvalue-prop-tags": "列出項目的標籤。",
+       "apihelp-query+watchlist-param-show": "僅顯示符合這些標準的項目。例如,僅查看由登入使用者做出的小編輯,請設定 $1show=minor|!anon。",
        "apihelp-query+watchlist-param-type": "要顯示的更改類型:",
        "apihelp-query+watchlist-paramvalue-type-edit": "一般頁面編輯。",
        "apihelp-query+watchlist-paramvalue-type-external": "外部更改。",
        "apihelp-revisiondelete-summary": "刪除和取消刪除修訂。",
        "apihelp-revisiondelete-param-type": "正執行的修訂刪除類型。",
        "apihelp-revisiondelete-param-target": "要修訂刪除的頁面標題,若類型有所需要。",
+       "apihelp-revisiondelete-param-ids": "要刪除的修訂識別碼。",
        "apihelp-revisiondelete-param-hide": "各修訂所要隱藏的內容。",
        "apihelp-revisiondelete-param-show": "各修訂所要取消隱藏的內容。",
        "apihelp-revisiondelete-param-suppress": "是否對管理者及其他使用者禁止資料。",
        "apihelp-rollback-param-markbot": "將回退的編輯以及回退操作標記為機器人所做編輯。",
        "apihelp-rollback-param-watchlist": "使用偏好設定無條件地將頁面加入至或移除自目前使用者的監視清單,或不更改監視。",
        "apihelp-rollback-example-simple": "回退由使用者 <kbd>Example</kbd> 對頁面 <kbd>Main Page</kbd> 所做的最新編輯。",
+       "apihelp-rollback-example-summary": "帶編輯摘要 <kbd>Reverting vandalism</kbd> 來回退由 IP 使用者 <kbd>192.0.2.5</kbd> 對頁面 <kbd>Main Page</kbd> 所做的最新編輯,並標記這些編輯與回退為機器人做出的編輯。",
        "apihelp-rsd-summary": "匯出一個簡易探索(Really Simple Discovery、RSD)架構。",
        "apihelp-rsd-example-simple": "匯出 RSD 架構。",
        "apihelp-setnotificationtimestamp-summary": "更新監視頁面的通知時間戳記。",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "在所有已監視頁面運作。",
+       "apihelp-setnotificationtimestamp-param-timestamp": "要設定通知時間戳記的時間戳記。",
+       "apihelp-setnotificationtimestamp-param-torevid": "要設定通知時間戳記的修訂(僅限一個頁面)。",
        "apihelp-setnotificationtimestamp-example-all": "重新設定整個監視清單的通知狀態。",
        "apihelp-setnotificationtimestamp-example-page": "重新設定用於 <kbd>Main page</kbd> 的通知狀態。",
+       "apihelp-setnotificationtimestamp-example-pagetimestamp": "設定 <kbd>Main page</kbd> 的通知時間戳記,讓所有自 2012 年 1 月起的編輯為未查看。",
        "apihelp-setnotificationtimestamp-example-allpages": "重新設定在 <kbd>{{ns:user}}</kbd> 命名空間裡頁面的通知狀態。",
        "apihelp-setpagelanguage-summary": "更改頁面的語言。",
        "apihelp-setpagelanguage-extended-description-disabled": "您不被允許在此 wiki 上變更頁面的語言。\n\n請啟用 <var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> 來進行此操作。",
        "apihelp-tag-summary": "從各別修訂或日誌項目添加或移除變更標籤。",
        "apihelp-tag-param-revid": "要添加或移除標籤的一個或多個修訂 ID。",
        "apihelp-tag-param-logid": "要添加或移除標籤的一個或多個日誌項目 ID。",
+       "apihelp-tag-param-add": "要添加的標籤。僅有手動定義的標籤可被添加。",
        "apihelp-tag-param-reason": "變更的原因。",
+       "apihelp-tag-example-rev": "不指明原因將 ID 為 123 的修訂添加 <kbd>vandalism</kbd> 標籤",
+       "apihelp-tag-example-log": "將 ID 為 123 的日誌項目移除 <kbd>spam</kbd> 標籤,原因:<kbd>Wrongly applied</kbd>",
        "apihelp-tokens-summary": "取得資料修改動作的權杖。",
        "apihelp-tokens-extended-description": "此模組已因支援 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] 而停用。",
        "apihelp-tokens-param-type": "請求的權杖類型。",
index 63cc2a8..826eecb 100644 (file)
  * @ingroup DifferenceEngine
  */
 
+use MediaWiki\MediaWikiServices;
 use MediaWiki\Revision\RevisionRecord;
 use MediaWiki\Revision\SlotRecord;
+use MediaWiki\Storage\NameTableAccessException;
 
 /**
  * DifferenceEngine is responsible for rendering the difference between two revisions as HTML.
@@ -1797,22 +1799,42 @@ class DifferenceEngine extends ContextSource {
 
                // Load tags information for both revisions
                $dbr = wfGetDB( DB_REPLICA );
+               $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
                if ( $this->mOldid !== false ) {
-                       $this->mOldTags = $dbr->selectField(
-                               'tag_summary',
-                               'ts_tags',
-                               [ 'ts_rev_id' => $this->mOldid ],
+                       $tagIds = $dbr->selectFieldValues(
+                               'change_tag',
+                               'ct_tag_id',
+                               [ 'ct_rev_id' => $this->mOldid ],
                                __METHOD__
                        );
+                       $tags = [];
+                       foreach ( $tagIds as $tagId ) {
+                               try {
+                                       $tags[] = $changeTagDefStore->getName( (int)$tagId );
+                               } catch ( NameTableAccessException $exception ) {
+                                       continue;
+                               }
+                       }
+                       $this->mOldTags = implode( ',', $tags );
                } else {
                        $this->mOldTags = false;
                }
-               $this->mNewTags = $dbr->selectField(
-                       'tag_summary',
-                       'ts_tags',
-                       [ 'ts_rev_id' => $this->mNewid ],
+
+               $tagIds = $dbr->selectFieldValues(
+                       'change_tag',
+                       'ct_tag_id',
+                       [ 'ct_rev_id' => $this->mNewid ],
                        __METHOD__
                );
+               $tags = [];
+               foreach ( $tagIds as $tagId ) {
+                       try {
+                               $tags[] = $changeTagDefStore->getName( (int)$tagId );
+                       } catch ( NameTableAccessException $exception ) {
+                               continue;
+                       }
+               }
+               $this->mNewTags = implode( ',', $tags );
 
                return true;
        }
index 6fef23b..7b099ca 100644 (file)
@@ -7,7 +7,7 @@ use MediaWiki\Widget\TitlesMultiselectWidget;
  *
  * Besides the parameters recognized by HTMLTitleTextField, additional recognized
  * parameters are:
- *  default - (optional) Array of usernames to use as preset data
+ *  default - (optional) Array of titles to use as preset data
  *  placeholder - (optional) Custom placeholder message for input
  *
  * The result is the array of titles
diff --git a/includes/http/GuzzleHttpRequest.php b/includes/http/GuzzleHttpRequest.php
new file mode 100644 (file)
index 0000000..5654a71
--- /dev/null
@@ -0,0 +1,202 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+use GuzzleHttp\Client;
+use GuzzleHttp\Psr7\Request;
+
+/**
+ * MWHttpRequest implemented using the Guzzle library
+ *
+ * Differences from the CurlHttpRequest implementation:
+ *   1) the MWHttpRequest 'callback" option is unsupported.  Instead, use the 'sink' option to
+ *      send a filename/stream (see http://docs.guzzlephp.org/en/stable/request-options.html#sink)
+ *   2) callers may set a custom handler via the 'handler' option.
+ *      If this is not set, Guzzle will use curl (if available) or PHP streams (otherwise)
+ *   3) setting either sslVerifyHost or sslVerifyCert will enable both.  Guzzle does not allow
+ *      them to be set separately.
+ *
+ * @since 1.33
+ */
+class GuzzleHttpRequest extends MWHttpRequest {
+       const SUPPORTS_FILE_POSTS = true;
+
+       protected $handler = null;
+       protected $sink = null;
+       protected $guzzleOptions = [ 'http_errors' => false ];
+
+       /**
+        * @param string $url Url to use. If protocol-relative, will be expanded to an http:// URL
+        * @param array $options (optional) extra params to pass (see Http::request())
+        * @param string $caller The method making this request, for profiling
+        * @param Profiler|null $profiler An instance of the profiler for profiling, or null
+        * @throws Exception
+        */
+       public function __construct(
+               $url, array $options = [], $caller = __METHOD__, $profiler = null
+       ) {
+               parent::__construct( $url, $options, $caller, $profiler );
+
+               if ( isset( $options['handler'] ) ) {
+                       $this->handler = $options['handler'];
+               }
+               if ( isset( $options['sink'] ) ) {
+                       $this->sink = $options['sink'];
+               }
+       }
+
+       /**
+        * @see MWHttpRequest::execute
+        *
+        * @return Status
+        */
+       public function execute() {
+               $this->prepare();
+
+               if ( !$this->status->isOK() ) {
+                       return Status::wrap( $this->status ); // TODO B/C; move this to callers
+               }
+
+               if ( $this->proxy ) {
+                       $this->guzzleOptions['proxy'] = $this->proxy;
+               }
+
+               $this->guzzleOptions['timeout'] = $this->timeout;
+               $this->guzzleOptions['connect_timeout'] = $this->connectTimeout;
+               $this->guzzleOptions['version'] = '1.1';
+
+               if ( !$this->followRedirects ) {
+                       $this->guzzleOptions['allow_redirects'] = false;
+               } else {
+                       $this->guzzleOptions['allow_redirects'] = [
+                               'max' => $this->maxRedirects
+                       ];
+               }
+
+               if ( $this->method == 'POST' ) {
+                       $postData = $this->postData;
+                       $this->guzzleOptions['body'] = $postData;
+
+                       // Suppress 'Expect: 100-continue' header, as some servers
+                       // will reject it with a 417 and Curl won't auto retry
+                       // with HTTP 1.0 fallback
+                       $this->guzzleOptions['expect'] = false;
+               }
+
+               $this->guzzleOptions['headers'] = $this->reqHeaders;
+
+               if ( $this->handler ) {
+                       $this->guzzleOptions['handler'] = $this->handler;
+               }
+
+               if ( $this->sink ) {
+                       $this->guzzleOptions['sink'] = $this->sink;
+               }
+
+               if ( $this->caInfo ) {
+                       $this->guzzleOptions['verify'] = $this->caInfo;
+               } elseif ( !$this->sslVerifyHost && !$this->sslVerifyCert ) {
+                       $this->guzzleOptions['verify'] = false;
+               }
+
+               try {
+                       $client = new Client( $this->guzzleOptions );
+                       $request = new Request( $this->method, $this->url );
+                       $response = $client->send( $request );
+                       $this->headerList = $response->getHeaders();
+                       $this->content = $response->getBody()->getContents();
+
+                       $this->respVersion = $response->getProtocolVersion();
+                       $this->respStatus = $response->getStatusCode() . ' ' . $response->getReasonPhrase();
+
+               } catch ( GuzzleHttp\Exception\ConnectException $e ) {
+                       // ConnectException is thrown for several reasons besides generic "timeout":
+                       //   Connection refused
+                       //   couldn't connect to host
+                       //   connection attempt failed
+                       //   Could not resolve IPv4 address for host
+                       //   Could not resolve IPv6 address for host
+                       if ( $this->usingCurl() ) {
+                               $handlerContext = $e->getHandlerContext();
+                               if ( $handlerContext['errno'] == CURLE_OPERATION_TIMEOUTED ) {
+                                       $this->status->fatal( 'http-timed-out', $this->url );
+                               } else {
+                                       $this->status->fatal( 'http-curl-error', $handlerContext['error'] );
+                               }
+                       } else {
+                               $this->status->fatal( 'http-request-error' );
+                       }
+               } catch ( GuzzleHttp\Exception\RequestException $e ) {
+                       if ( $this->usingCurl() ) {
+                               $handlerContext = $e->getHandlerContext();
+                               $this->status->fatal( 'http-curl-error', $handlerContext['error'] );
+                       } else {
+                               // Non-ideal, but the only way to identify connection timeout vs other conditions
+                               $needle = 'Connection timed out';
+                               if ( strpos( $e->getMessage(), $needle ) !== false ) {
+                                       $this->status->fatal( 'http-timed-out', $this->url );
+                               } else {
+                                       $this->status->fatal( 'http-request-error' );
+                               }
+                       }
+               } catch ( GuzzleHttp\Exception\GuzzleException $e ) {
+                       $this->status->fatal( 'http-internal-error' );
+               }
+
+               if ( $this->profiler ) {
+                       $profileSection = $this->profiler->scopedProfileIn(
+                               __METHOD__ . '-' . $this->profileName
+                       );
+               }
+
+               if ( $this->profiler ) {
+                       $this->profiler->scopedProfileOut( $profileSection );
+               }
+
+               $this->parseHeader();
+               $this->setStatus();
+
+               return Status::wrap( $this->status ); // TODO B/C; move this to callers
+       }
+
+       /**
+        * @return bool
+        */
+       protected function usingCurl() {
+               return ( $this->handler && is_a( $this->handler, 'GuzzleHttp\Handler\CurlHandler' ) ) ||
+                       ( !$this->handler && extension_loaded( 'curl' ) );
+       }
+
+       /**
+        * Guzzle provides headers as an array.  Reprocess to match our expectations.  Guzzle will
+        * have already parsed and removed the status line (in EasyHandle::createResponse)z.
+        */
+       protected function parseHeader() {
+               // Failure without (valid) headers gets a response status of zero
+               if ( !$this->status->isOK() ) {
+                       $this->respStatus = '0 Error';
+               }
+
+               foreach ( $this->headerList as $name => $values ) {
+                       $this->respHeaders[strtolower( $name )] = $values;
+               }
+
+               $this->parseCookies();
+       }
+}
index c5413b3..a3a14d0 100644 (file)
@@ -26,6 +26,7 @@ use MediaWiki\Logger\LoggerFactory;
 use MWHttpRequest;
 use PhpHttpRequest;
 use Profiler;
+use GuzzleHttpRequest;
 
 /**
  * Factory creating MWHttpRequest objects.
@@ -43,7 +44,7 @@ class HttpRequestFactory {
         */
        public function create( $url, array $options = [], $caller = __METHOD__ ) {
                if ( !Http::$httpEngine ) {
-                       Http::$httpEngine = function_exists( 'curl_init' ) ? 'curl' : 'php';
+                       Http::$httpEngine = 'guzzle';
                } elseif ( Http::$httpEngine == 'curl' && !function_exists( 'curl_init' ) ) {
                        throw new DomainException( __METHOD__ . ': curl (https://secure.php.net/curl) is not ' .
                           'installed, but Http::$httpEngine is set to "curl"' );
@@ -54,6 +55,8 @@ class HttpRequestFactory {
                }
 
                switch ( Http::$httpEngine ) {
+                       case 'guzzle':
+                               return new GuzzleHttpRequest( $url, $options, $caller, Profiler::instance() );
                        case 'curl':
                                return new CurlHttpRequest( $url, $options, $caller, Profiler::instance() );
                        case 'php':
index 435c34d..b087019 100644 (file)
@@ -88,6 +88,7 @@ abstract class MWHttpRequest implements LoggerAwareInterface {
         * @param array $options (optional) extra params to pass (see Http::request())
         * @param string $caller The method making this request, for profiling
         * @param Profiler|null $profiler An instance of the profiler for profiling, or null
+        * @throws Exception
         */
        public function __construct(
                $url, array $options = [], $caller = __METHOD__, $profiler = null
@@ -408,18 +409,20 @@ abstract class MWHttpRequest implements LoggerAwareInterface {
        /**
         * Sets HTTPRequest status member to a fatal value with the error
         * message if the returned integer value of the status code was
-        * not successful (< 300) or a redirect (>=300 and < 400).  (see
-        * RFC2616, section 10,
-        * http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html for a
-        * list of status codes.)
+        * not successful (1-299) or a redirect (300-399).
+        * See RFC2616, section 10, http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
+        * for a list of status codes.
         */
        protected function setStatus() {
                if ( !$this->respHeaders ) {
                        $this->parseHeader();
                }
 
-               if ( (int)$this->respStatus > 399 ) {
+               if ( ( (int)$this->respStatus > 0 && (int)$this->respStatus < 400 ) ) {
+                       $this->status->setResult( true, (int)$this->respStatus );
+               } else {
                        list( $code, $message ) = explode( " ", $this->respStatus, 2 );
+                       $this->status->setResult( false, (int)$this->respStatus );
                        $this->status->fatal( "http-bad-status", $code, $message );
                }
        }
index 0403725..28a293f 100644 (file)
@@ -626,25 +626,41 @@ abstract class FileBackendStore extends FileBackend {
                        return false; // invalid storage path
                }
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
+
                $latest = !empty( $params['latest'] ); // use latest data?
-               if ( !$latest && !$this->cheapCache->hasField( $path, 'stat', self::CACHE_TTL ) ) {
-                       $this->primeFileCache( [ $path ] ); // check persistent cache
+               $requireSHA1 = !empty( $params['requireSHA1'] ); // require SHA-1 if file exists?
+
+               if ( !$latest ) {
+                       $stat = $this->cheapCache->getField( $path, 'stat', self::CACHE_TTL );
+                       // Note that some backends, like SwiftFileBackend, sometimes set file stat process
+                       // cache entries from mass object listings that do not include the SHA-1. In that
+                       // case, loading the persistent stat cache will likely yield the SHA-1.
+                       if (
+                               $stat === null ||
+                               ( $requireSHA1 && is_array( $stat ) && !isset( $stat['sha1'] ) )
+                       ) {
+                               $this->primeFileCache( [ $path ] ); // check persistent cache
+                       }
                }
-               if ( $this->cheapCache->hasField( $path, 'stat', self::CACHE_TTL ) ) {
-                       $stat = $this->cheapCache->getField( $path, 'stat' );
-                       // If we want the latest data, check that this cached
-                       // value was in fact fetched with the latest available data.
-                       if ( is_array( $stat ) ) {
-                               if ( !$latest || $stat['latest'] ) {
-                                       return $stat;
-                               }
-                       } elseif ( in_array( $stat, [ 'NOT_EXIST', 'NOT_EXIST_LATEST' ] ) ) {
-                               if ( !$latest || $stat === 'NOT_EXIST_LATEST' ) {
-                                       return false;
-                               }
+
+               $stat = $this->cheapCache->getField( $path, 'stat', self::CACHE_TTL );
+               // If we want the latest data, check that this cached
+               // value was in fact fetched with the latest available data.
+               if ( is_array( $stat ) ) {
+                       if (
+                               ( !$latest || $stat['latest'] ) &&
+                               ( !$requireSHA1 || isset( $stat['sha1'] ) )
+                       ) {
+                               return $stat;
+                       }
+               } elseif ( in_array( $stat, [ 'NOT_EXIST', 'NOT_EXIST_LATEST' ], true ) ) {
+                       if ( !$latest || $stat === 'NOT_EXIST_LATEST' ) {
+                               return false;
                        }
                }
+
                $stat = $this->doGetFileStat( $params );
+
                if ( is_array( $stat ) ) { // file exists
                        // Strongly consistent backends can automatically set "latest"
                        $stat['latest'] = $stat['latest'] ?? $latest;
index 31882de..61b4d69 100644 (file)
@@ -720,7 +720,7 @@ class SwiftFileBackend extends FileBackendStore {
         * @param string $path Storage path to object
         * @return array New headers
         */
-       protected function addMissingMetadata( array $objHdrs, $path ) {
+       protected function addMissingHashMetadata( array $objHdrs, $path ) {
                if ( isset( $objHdrs['x-object-meta-sha1base36'] ) ) {
                        return $objHdrs; // nothing to do
                }
@@ -780,8 +780,8 @@ class SwiftFileBackend extends FileBackendStore {
                $auth = $this->getAuthentication();
 
                $ep = array_diff_key( $params, [ 'srcs' => 1 ] ); // for error logging
-               // Blindly create tmp files and stream to them, catching any exception if the file does
-               // not exist. Doing stats here is useless and will loop infinitely in addMissingMetadata().
+               // Blindly create tmp files and stream to them, catching any exception
+               // if the file does not exist. Do not waste time doing file stats here.
                $reqs = []; // (path => op)
 
                foreach ( $params['srcs'] as $path ) { // each path in this concurrent batch
@@ -1052,14 +1052,12 @@ class SwiftFileBackend extends FileBackendStore {
        }
 
        protected function doGetFileSha1base36( array $params ) {
+               // Avoid using stat entries from file listings, which never include the SHA-1 hash.
+               // Also, recompute the hash if it's not part of the metadata headers for some reason.
+               $params['requireSHA1'] = true;
+
                $stat = $this->getFileStat( $params );
                if ( $stat ) {
-                       if ( !isset( $stat['sha1'] ) ) {
-                               // Stat entries filled by file listings don't include SHA1
-                               $this->clearCache( [ $params['src'] ] );
-                               $stat = $this->getFileStat( $params );
-                       }
-
                        return $stat['sha1'];
                } else {
                        return false;
@@ -1139,8 +1137,8 @@ class SwiftFileBackend extends FileBackendStore {
                $auth = $this->getAuthentication();
 
                $ep = array_diff_key( $params, [ 'srcs' => 1 ] ); // for error logging
-               // Blindly create tmp files and stream to them, catching any exception if the file does
-               // not exist. Doing a stat here is useless causes infinite loops in addMissingMetadata().
+               // Blindly create tmp files and stream to them, catching any exception
+               // if the file does not exist. Do not waste time doing file stats here.
                $reqs = []; // (path => op)
 
                foreach ( $params['srcs'] as $path ) { // each path in this concurrent batch
@@ -1631,7 +1629,9 @@ class SwiftFileBackend extends FileBackendStore {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $reqs[$path]['response'];
                        if ( $rcode === 200 || $rcode === 204 ) {
                                // Update the object if it is missing some headers
-                               $rhdrs = $this->addMissingMetadata( $rhdrs, $path );
+                               if ( !empty( $params['requireSHA1'] ) ) {
+                                       $rhdrs = $this->addMissingHashMetadata( $rhdrs, $path );
+                               }
                                // Load the stat array from the headers
                                $stat = $this->getStatFromHeaders( $rhdrs );
                                if ( $this->isRGW ) {
index 8ea28f0..e4dad01 100644 (file)
@@ -114,10 +114,12 @@ class TransactionProfiler implements LoggerAwareInterface {
        }
 
        /**
-        * Set multiple performance expectations
+        * Set one or multiple performance expectations
         *
         * With conflicting expectations, the most narrow ones will be used
         *
+        * Use this to initialize expectations or make them stricter mid-request
+        *
         * @param array $expects Map of (event => limit)
         * @param string $fname
         * @since 1.26
@@ -129,7 +131,11 @@ class TransactionProfiler implements LoggerAwareInterface {
        }
 
        /**
-        * Reset performance expectations and hit counters
+        * Reset all performance expectations and hit counters
+        *
+        * Use this for unit testing or before applying a totally different set of expectations
+        * for a different part of the request, such as during "post-send" (execution after HTTP
+        * response completion)
         *
         * @since 1.25
         */
@@ -145,6 +151,21 @@ class TransactionProfiler implements LoggerAwareInterface {
                $this->expectBy = [];
        }
 
+       /**
+        * Clear all expectations and hit counters and set new performance expectations
+        *
+        * Use this to apply a totally different set of expectations for a different part
+        * of the request, such as during "post-send" (execution after HTTP response completion)
+        *
+        * @param array $expects Map of (event => limit)
+        * @param string $fname
+        * @since 1.33
+        */
+       public function redefineExpectations( array $expects, $fname ) {
+               $this->resetExpectations();
+               $this->setExpectations( $expects, $fname );
+       }
+
        /**
         * Mark a DB as having been connected to with a new handle
         *
index bc51726..ca18122 100644 (file)
@@ -312,7 +312,7 @@ class LoadBalancer implements ILoadBalancer {
                                                ": server {host} is not replicating?", [ 'host' => $host ] );
                                        unset( $loads[$i] );
                                } elseif ( $lag > $maxServerLag ) {
-                                       $this->replLogger->info(
+                                       $this->replLogger->debug(
                                                __METHOD__ .
                                                ": server {host} has {lag} seconds of lag (>= {maxlag})",
                                                [ 'host' => $host, 'lag' => $lag, 'maxlag' => $maxServerLag ]
index a73fac1..d09620b 100644 (file)
@@ -44,22 +44,16 @@ class RedisConnRef implements LoggerAwareInterface {
 
        /**
         * No authentication errors.
-        *
-        * @var constant
         */
        const AUTH_NO_ERROR = 200;
 
        /**
         * Temporary authentication error; recovered by reauthenticating.
-        *
-        * @var constant
         */
        const AUTH_ERROR_TEMPORARY = 201;
 
        /**
         * Authentication error was permanent and could not be recovered.
-        *
-        * @var constant
         */
        const AUTH_ERROR_PERMANENT = 202;
 
@@ -210,7 +204,7 @@ class RedisConnRef implements LoggerAwareInterface {
        /**
         * Handle authentication errors and automatically reauthenticate.
         *
-        * @return constant self::AUTH_NO_ERROR, self::AUTH_ERROR_TEMPORARY, or self::AUTH_ERROR_PERMANENT
+        * @return int self::AUTH_NO_ERROR, self::AUTH_ERROR_TEMPORARY, or self::AUTH_ERROR_PERMANENT
         */
        private function checkAuthentication() {
                if ( preg_match( '/^ERR operation not permitted\b/', $this->conn->getLastError() ) ) {
index 778a3b3..20fc9b3 100644 (file)
@@ -170,7 +170,7 @@ class SparqlClient {
                $status = $request->execute();
 
                if ( !$status->isOK() ) {
-                       throw new SparqlException( "HTTP error: {$status->getWikiText()}" );
+                       throw new SparqlException( 'HTTP error: ' . $status->getWikiText( false, false, 'en' ) );
                }
                $result = $request->getContent();
                \Wikimedia\suppressWarnings();
index 8466399..c56cc65 100644 (file)
@@ -456,7 +456,7 @@ abstract class AuthManagerSpecialPage extends SpecialPage {
                                // Let's just submit the data to AuthManager directly instead.
                                LoggerFactory::getInstance( 'authentication' )
                                        ->warning( 'Validation error on return', [ 'data' => $form->mFieldData,
-                                               'status' => $status->getWikiText() ] );
+                                               'status' => $status->getWikiText( false, false, 'en' ) ] );
                                $status = $this->handleFormSubmit( $form->mFieldData );
                        }
                }
index 6a01b0c..cd754ca 100644 (file)
@@ -23,6 +23,7 @@
 
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Revision\RevisionRecord;
+use MediaWiki\Storage\NameTableAccessException;
 use Wikimedia\Rdbms\IResultWrapper;
 
 /**
@@ -596,12 +597,22 @@ class SpecialUndelete extends SpecialPage {
 
                $minor = $rev->isMinor() ? ChangesList::flag( 'minor' ) : '';
 
-               $tags = wfGetDB( DB_REPLICA )->selectField(
-                       'tag_summary',
-                       'ts_tags',
-                       [ 'ts_rev_id' => $rev->getId() ],
+               $tagIds = wfGetDB( DB_REPLICA )->selectFieldValues(
+                       'change_tag',
+                       'ct_tag_id',
+                       [ 'ct_rev_id' => $rev->getId() ],
                        __METHOD__
                );
+               $tags = [];
+               $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
+               foreach ( $tagIds as $tagId ) {
+                       try {
+                               $tags[] = $changeTagDefStore->getName( (int)$tagId );
+                       } catch ( NameTableAccessException $exception ) {
+                               continue;
+                       }
+               }
+               $tags = implode( ',', $tags );
                $tagSummary = ChangeTags::formatSummaryRow( $tags, 'deleteddiff', $this->getContext() );
 
                // FIXME This is reimplementing DifferenceEngine#getRevisionHeader
index 6d5f64b..a9479c4 100644 (file)
@@ -372,12 +372,6 @@ class AllMessagesTablePager extends TablePager {
                        $arr['class'] = 'allmessages-customised';
                }
 
-               if ( !$isSecond ) {
-                       $arr['id'] = Sanitizer::escapeIdForAttribute(
-                               'msg_' . $this->getLanguage()->lcfirst( $row->am_title )
-                       );
-               }
-
                return $arr;
        }
 
index ab3237a..ab38e1a 100644 (file)
@@ -139,7 +139,9 @@ class ImageListPager extends TablePager {
                        $actorWhere = ActorMigration::newMigration()->getWhere(
                                $dbr,
                                $prefix . '_user',
-                               User::newFromName( $this->mUserName, false )
+                               User::newFromName( $this->mUserName, false ),
+                               // oldimage doesn't have an index on oi_user, while image does. Set $useId accordingly.
+                               $prefix === 'img'
                        );
                        $conds[] = $actorWhere['conds'];
                }
index 0c4b425..187c0a9 100644 (file)
@@ -18,6 +18,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
+use MediaWiki\Auth\AuthenticationResponse;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Session\BotPasswordSessionProvider;
 use Wikimedia\Rdbms\IMaintainableDatabase;
@@ -458,14 +459,14 @@ class BotPassword implements IDBAccessObject {
                // Split name into name+appId
                $sep = self::getSeparator();
                if ( strpos( $username, $sep ) === false ) {
-                       return Status::newFatal( 'botpasswords-invalid-name', $sep );
+                       return self::loginHook( $username, 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 Status::newFatal( 'nosuchuser', $name );
+                       return self::loginHook( $user ?: $name, Status::newFatal( 'nosuchuser', $name ) );
                }
 
                if ( $user->isLocked() ) {
@@ -482,35 +483,66 @@ class BotPassword implements IDBAccessObject {
                        $result = $throttle->increase( $user->getName(), $request->getIP(), __METHOD__ );
                        if ( $result ) {
                                $msg = wfMessage( 'login-throttled' )->durationParams( $result['wait'] );
-                               return Status::newFatal( $msg );
+                               return self::loginHook( $user, Status::newFatal( $msg ) );
                        }
                }
 
                // Get the bot password
                $bp = self::newFromUser( $user, $appId );
                if ( !$bp ) {
-                       return Status::newFatal( 'botpasswords-not-exist', $name, $appId );
+                       return self::loginHook( $user, Status::newFatal( 'botpasswords-not-exist', $name, $appId ) );
                }
 
                // Check restrictions
                $status = $bp->getRestrictions()->check( $request );
                if ( !$status->isOK() ) {
-                       return Status::newFatal( 'botpasswords-restriction-failed' );
+                       return self::loginHook( $user, Status::newFatal( 'botpasswords-restriction-failed' ) );
                }
 
                // Check the password
                $passwordObj = $bp->getPassword();
                if ( $passwordObj instanceof InvalidPassword ) {
-                       return Status::newFatal( 'botpasswords-needs-reset', $name, $appId );
+                       return self::loginHook( $user, Status::newFatal( 'botpasswords-needs-reset', $name, $appId ) );
                }
                if ( !$passwordObj->equals( $password ) ) {
-                       return Status::newFatal( 'wrongpassword' );
+                       return self::loginHook( $user, Status::newFatal( 'wrongpassword' ) );
                }
 
                // Ok! Create the session.
                if ( $throttle ) {
                        $throttle->clear( $user->getName(), $request->getIP() );
                }
-               return Status::newGood( $provider->newSessionForRequest( $user, $bp, $request ) );
+               return self::loginHook(
+                       $user,
+                       Status::newGood( $provider->newSessionForRequest( $user, $bp, $request ) )
+               );
+       }
+
+       /**
+        * Call AuthManagerLoginAuthenticateAudit
+        *
+        * To facilitate logging all authentications, even ones not via
+        * AuthManager, call the AuthManagerLoginAuthenticateAudit hook.
+        *
+        * @param User|string $user User being logged in
+        * @param Status $status Login status
+        * @return Status The passed-in status
+        */
+       private static function loginHook( $user, Status $status ) {
+               if ( $user instanceof User ) {
+                       $name = $user->getName();
+               } else {
+                       $name = $user;
+                       $user = null;
+               }
+
+               if ( $status->isGood() ) {
+                       $response = AuthenticationResponse::newPass( $name );
+               } else {
+                       $response = AuthenticationResponse::newFail( $status->getMessage() );
+               }
+               Hooks::run( 'AuthManagerLoginAuthenticateAudit', [ $response, $user, $name ] );
+
+               return $status;
        }
 }
index 419e23b..1412215 100644 (file)
@@ -2304,9 +2304,10 @@ class User implements IDBAccessObject, UserIdentity {
                                        if ( $block->isSitewide() ) {
                                                $blocked = $block->prevents( 'editownusertalk' );
                                        } else {
-                                               // If the block is partial, then only a true value is honored,
-                                               // otherwise fallback to the partial block settings.
-                                               $blocked = $block->prevents( 'editownusertalk' ) ?: $block->appliesToTitle( $title );
+                                               // If the block is partial, ignore 'editownusertalk' unless
+                                               // there is a restriction on the user talk namespace.
+                                               // TODO: To be implemented with Namespace restrictions
+                                               $blocked = $block->appliesToTitle( $title );
                                        }
                                } else {
                                        $blocked = $block->appliesToTitle( $title );
index 0a50fcd..f62ee83 100644 (file)
@@ -20,7 +20,7 @@ class TitlesMultiselectWidget extends \OOUI\Widget {
 
        /**
         * @param array $config Configuration options
-        *   - array $config['titles'] Array of titles to use as preset data
+        *   - array $config['default'] Array of titles to use as preset data
         *   - array $config['placeholder'] Placeholder message for input
         *   - array $config['name'] Name attribute (used in forms)
         *   - number $config['tagLimit'] Maximum number of selected titles
index 617545d..cdec27d 100644 (file)
@@ -63,6 +63,7 @@ public static $zh2Hant = [
 '䀥' => '䁻',
 '䁖' => '瞜',
 '䂵' => '碽',
+'䃅' => '磾',
 '䅉' => '稏',
 '䅪' => '𥢢',
 '䇲' => '筴',
@@ -425,6 +426,7 @@ public static $zh2Hant = [
 '埚' => '堝',
 '堑' => '塹',
 '堕' => '墮',
+'塆' => '壪',
 '墙' => '牆',
 '壮' => '壯',
 '声' => '聲',
@@ -2041,7 +2043,7 @@ public static $zh2Hant = [
 '锅' => '鍋',
 '锆' => '鋯',
 '锇' => '鋨',
-'é\94\88' => 'é\8a¹',
+'é\94\88' => 'é\8f½',
 '锉' => '銼',
 '锊' => '鋝',
 '锋' => '鋒',
@@ -3039,6 +3041,7 @@ public static $zh2Hant = [
 '𫞩' => '璊',
 '𫟅' => '綡',
 '𫟦' => '䡵',
+'𫟷' => '鉝',
 '𫟹' => '鉷',
 '𫟼' => '鐽',
 '𫠆' => '頍',
@@ -3149,17 +3152,15 @@ public static $zh2Hant = [
 '𬹼' => '齘',
 '𬺈' => '齮',
 '𬺓' => '齼',
-'0出现' => '0出現',
-'0出現' => '0出現',
-'0出線' => '0出線',
-'0出线' => '0出線',
 '0只支持' => '0只支持',
 '0只支援' => '0只支援',
 '0周后' => '0周後',
 '0天后' => '0天後',
 '0只' => '0隻',
 '0余' => '0餘',
-'0出' => '0齣',
+'0出。' => '0齣。',
+'0出电影' => '0齣電影',
+'0出,' => '0齣,',
 '1只支持' => '1只支持',
 '1只支援' => '1只支援',
 '1周后' => '1周後',
@@ -3357,7 +3358,6 @@ public static $zh2Hant = [
 '不丑' => '不醜',
 '不采声' => '不采聲',
 '不采聲' => '不采聲',
-'不锈钢' => '不鏽鋼',
 '不食乾腊' => '不食乾腊',
 '不食干腊' => '不食乾腊',
 '不斗' => '不鬥',
@@ -3624,9 +3624,6 @@ public static $zh2Hant = [
 '干鱼' => '乾魚',
 '干鲜' => '乾鮮',
 '干面' => '乾麵',
-'乱发生' => '亂發生',
-'乱发脾气' => '亂發脾氣',
-'乱发' => '亂髮',
 '乱斗' => '亂鬥',
 '乱哄哄' => '亂鬨鬨',
 '了然后' => '了然後',
@@ -3773,7 +3770,6 @@ public static $zh2Hant = [
 '于洪區' => '于洪區',
 '于浩威' => '于浩威',
 '于海' => '于海',
-'于海洋' => '于海洋',
 '于湘兰' => '于湘蘭',
 '于湘蘭' => '于湘蘭',
 '于汉超' => '于漢超',
@@ -3904,8 +3900,6 @@ public static $zh2Hant = [
 '仲裁制' => '仲裁制',
 '件钟' => '件鐘',
 '价川' => '价川',
-'任何钟' => '任何鐘',
-'任何钟表' => '任何鐘錶',
 '仿制' => '仿製',
 '伊于湖底' => '伊于湖底',
 '伊府面' => '伊府麵',
@@ -3944,6 +3938,7 @@ public static $zh2Hant = [
 '余威德' => '余威德',
 '余子明' => '余子明',
 '余思敏' => '余思敏',
+'佛历' => '佛曆',
 '佛罗棱萨' => '佛羅稜薩',
 '佛钟' => '佛鐘',
 '作品里' => '作品裡',
@@ -4183,7 +4178,11 @@ public static $zh2Hant = [
 '冬游' => '冬遊',
 '冰山里' => '冰山裡',
 '冶游' => '冶遊',
+'冷面天使' => '冷面天使',
+'冷面杀手' => '冷面殺手',
+'冷面殺手' => '冷面殺手',
 '冷面相' => '冷面相',
+'冷面笑匠' => '冷面笑匠',
 '冷面' => '冷麵',
 '准三后' => '准三后',
 '准保护' => '准保護',
@@ -4441,7 +4440,6 @@ public static $zh2Hant = [
 '只影響' => '只影響',
 '只采' => '只採',
 '只冲' => '只衝',
-'只要功夫深,铁杵磨成锈花针' => '只要功夫深,鐵杵磨成鏽花針',
 '只身上已' => '只身上已',
 '只身上有' => '只身上有',
 '只身上沒' => '只身上沒',
@@ -4554,7 +4552,6 @@ public static $zh2Hant = [
 '含齿戴发' => '含齒戴髮',
 '吸干' => '吸乾',
 '吹干' => '吹乾',
-'吹发' => '吹髮',
 '吾为之范我驰驱' => '吾爲之範我馳驅',
 '吕后' => '呂后',
 '呂后' => '呂后',
@@ -4608,9 +4605,6 @@ public static $zh2Hant = [
 '喂喲' => '喂喲',
 '喂!' => '喂!',
 '喂,' => '喂,',
-'喜欢表' => '喜歡錶',
-'喜欢钟' => '喜歡鐘',
-'喜欢钟表' => '喜歡鐘錶',
 '喝干' => '喝乾',
 '喧哗' => '喧譁',
 '喧哄' => '喧鬨',
@@ -4632,6 +4626,7 @@ public static $zh2Hant = [
 '噙齿戴发' => '噙齒戴髮',
 '当啷' => '噹啷',
 '当当' => '噹噹',
+'尝粪' => '嚐糞',
 '噜苏' => '嚕囌',
 '啮合' => '嚙合',
 '啮齿类' => '嚙齒類',
@@ -5169,6 +5164,7 @@ public static $zh2Hant = [
 '干路' => '幹路',
 '干办' => '幹辦',
 '干这' => '幹這',
+'干过' => '幹過',
 '干道' => '幹道',
 '干部' => '幹部',
 '干革命' => '幹革命',
@@ -5697,12 +5693,12 @@ public static $zh2Hant = [
 '拙朴' => '拙樸',
 '拚舍' => '拚捨',
 '拜托' => '拜託',
-'括发' => '括髮',
 '拭干' => '拭乾',
 '拮据' => '拮据',
 '拳局' => '拳跼',
 '拼斗' => '拼鬥',
 '拾沈' => '拾瀋',
+'拿不准' => '拿不準',
 '拿准' => '拿準',
 '拿破仑' => '拿破崙',
 '挌斗' => '挌鬥',
@@ -5713,7 +5709,6 @@ public static $zh2Hant = [
 '捉奸贼' => '捉奸賊',
 '捉奸党' => '捉奸黨',
 '捉奸' => '捉姦',
-'捉发' => '捉髮',
 '捍御' => '捍禦',
 '捏面人' => '捏麵人',
 '舍不得' => '捨不得',
@@ -5945,7 +5940,6 @@ public static $zh2Hant = [
 '教范' => '教範',
 '敢干' => '敢幹',
 '敢情欲' => '敢情欲',
-'敢斗了胆' => '敢斗了膽',
 '散伙' => '散夥',
 '散荡' => '散蕩',
 '敦朴' => '敦樸',
@@ -5983,6 +5977,7 @@ public static $zh2Hant = [
 '文思泉涌' => '文思泉湧',
 '文杰' => '文杰',
 '文采郁郁' => '文采郁郁',
+'斗法会' => '斗法會',
 '斗牛星' => '斗牛星',
 '斫雕为朴' => '斫雕為樸',
 '新井里美' => '新井里美',
@@ -5992,6 +5987,7 @@ public static $zh2Hant = [
 '新历史' => '新歷史',
 '新扎' => '新紮',
 '斲雕为朴' => '斲雕為樸',
+'断发现' => '斷發現',
 '断发' => '斷髮',
 '断发文身' => '斷髮文身',
 '方便面' => '方便麵',
@@ -6000,7 +5996,9 @@ public static $zh2Hant = [
 '于山东' => '於山東',
 '于山西' => '於山西',
 '于海上' => '於海上',
+'于海平面' => '於海平面',
 '于海拔' => '於海拔',
+'于海洋' => '於海洋',
 '于海边' => '於海邊',
 '于震中' => '於震中',
 '于震前' => '於震前',
@@ -6267,6 +6265,7 @@ public static $zh2Hant = [
 '朴父' => '樸父',
 '朴直' => '樸直',
 '朴素' => '樸素',
+'朴茨茅斯' => '樸茨茅斯',
 '朴讷' => '樸訥',
 '朴质' => '樸質',
 '朴鄙' => '樸鄙',
@@ -6723,9 +6722,6 @@ public static $zh2Hant = [
 '狐借虎威' => '狐藉虎威',
 '猛冲' => '猛衝',
 '猜三划五' => '猜三划五',
-'犹如表' => '猶如錶',
-'犹如钟' => '猶如鐘',
-'犹如钟表' => '猶如鐘錶',
 '狱里' => '獄裡',
 '奖杯' => '獎盃',
 '独裁制' => '獨裁制',
@@ -6751,6 +6747,11 @@ public static $zh2Hant = [
 '理个发' => '理個髮',
 '理完发' => '理完髮',
 '理次发' => '理次髮',
+'理发动' => '理發動',
+'理发展' => '理發展',
+'理发现' => '理發現',
+'理发生' => '理發生',
+'理发表' => '理發表',
 '理发' => '理髮',
 '琴钟' => '琴鐘',
 '珐琅' => '琺瑯',
@@ -6767,11 +6768,13 @@ public static $zh2Hant = [
 '甜面酱' => '甜麵醬',
 '生力面' => '生力麵',
 '生物钟' => '生物鐘',
-'生发生' => '生發生',
 '生华发' => '生華髮',
 '生姜' => '生薑',
-'生锈' => '生鏽',
-'生发' => '生髮',
+'生发剂' => '生髮劑',
+'生发水' => '生髮水',
+'生发油' => '生髮油',
+'生发液' => '生髮液',
+'生发药' => '生髮藥',
 '苏醒' => '甦醒',
 '用法里' => '用法裡',
 '甩发' => '甩髮',
@@ -6780,6 +6783,7 @@ public static $zh2Hant = [
 '田里' => '田裡',
 '田里穗' => '田里穗',
 '由余' => '由余',
+'由于' => '由於',
 '甲胄' => '甲冑',
 '甲后路' => '甲后路',
 '男仆' => '男僕',
@@ -6789,7 +6793,6 @@ public static $zh2Hant = [
 '留发行' => '留發行',
 '留长发' => '留長髮',
 '留发' => '留髮',
-'毕生发展' => '畢生發展',
 '画里' => '畫裡',
 '当准' => '當準',
 '当当丁丁' => '當當丁丁',
@@ -6817,6 +6820,7 @@ public static $zh2Hant = [
 '发状态' => '發狀態',
 '发状况' => '發狀況',
 '发签' => '發籤',
+'发表' => '發表',
 '发松' => '發鬆',
 '发面' => '發麵',
 '白干儿' => '白乾兒',
@@ -6893,6 +6897,7 @@ public static $zh2Hant = [
 '相干' => '相干',
 '相冲' => '相衝',
 '相斗' => '相鬥',
+'盼复' => '盼覆',
 '看法里' => '看法裡',
 '看准' => '看準',
 '看表面' => '看表面',
@@ -6940,7 +6945,11 @@ public static $zh2Hant = [
 '研制' => '研製',
 '砰当' => '砰噹',
 '破鉴' => '破鑑',
+'朱卷' => '硃卷',
+'朱批' => '硃批',
 '朱砂' => '硃砂',
+'朱笔' => '硃筆',
+'朱谕' => '硃諭',
 '硬干' => '硬幹',
 '确瘠' => '确瘠',
 '碑志' => '碑誌',
@@ -7047,6 +7056,7 @@ public static $zh2Hant = [
 '谷胱' => '穀胱',
 '谷舱' => '穀艙',
 '谷苗' => '穀苗',
+'谷茬' => '穀茬',
 '谷草' => '穀草',
 '谷贵饿农' => '穀貴餓農',
 '谷贱伤农' => '穀賤傷農',
@@ -7183,6 +7193,8 @@ public static $zh2Hant = [
 '纸扎' => '紙紮',
 '素数里' => '素數裡',
 '素朴' => '素樸',
+'素发现' => '素發現',
+'素发生' => '素發生',
 '素发' => '素髮',
 '素面' => '素麵',
 '索馬里' => '索馬里',
@@ -7212,12 +7224,16 @@ public static $zh2Hant = [
 '组里' => '組裡',
 '结伴同游' => '結伴同遊',
 '结伙' => '結夥',
+'结发育' => '結發育',
+'结发表' => '結發表',
 '结扎' => '結紮',
 '结余' => '結餘',
 '结发' => '結髮',
 '绞干' => '絞乾',
 '络腮胡' => '絡腮鬍',
 '丝恩发怨' => '絲恩髮怨',
+'丝发现' => '絲發現',
+'丝发生' => '絲發生',
 '丝制' => '絲製',
 '丝发' => '絲髮',
 '绑扎' => '綁紮',
@@ -7375,6 +7391,9 @@ public static $zh2Hant = [
 '胃脏' => '胃臟',
 '胃里' => '胃裡',
 '背地里' => '背地裡',
+'胎发展' => '胎發展',
+'胎发生' => '胎發生',
+'胎发育' => '胎發育',
 '胎发' => '胎髮',
 '胜肽' => '胜肽',
 '胜鍵' => '胜鍵',
@@ -7812,7 +7831,6 @@ public static $zh2Hant = [
 '复壁' => '複壁',
 '复姓' => '複姓',
 '复字键' => '複字鍵',
-'复审' => '複審',
 '复写' => '複寫',
 '复对数' => '複對數',
 '复平面' => '複平面',
@@ -7869,6 +7887,7 @@ public static $zh2Hant = [
 '要自制' => '要自制',
 '要冲' => '要衝',
 '复信' => '覆信',
+'复审' => '覆審',
 '复核' => '覆核',
 '见棱见角' => '見稜見角',
 '见素抱朴' => '見素抱樸',
@@ -7942,6 +7961,7 @@ public static $zh2Hant = [
 '评鉴' => '評鑑',
 '词干' => '詞幹',
 '词汇' => '詞彙',
+'词里' => '詞裡',
 '词余' => '詞餘',
 '试制' => '試製',
 '詩云' => '詩云',
@@ -8049,6 +8069,7 @@ public static $zh2Hant = [
 '译文里' => '譯文裡',
 '译制' => '譯製',
 '译注' => '譯註',
+'护发展' => '護發展',
 '护发' => '護髮',
 '变征' => '變徵',
 '变丑' => '變醜',
@@ -8484,6 +8505,7 @@ public static $zh2Hant = [
 '铜制' => '銅製',
 '铜钟' => '銅鐘',
 '铯钟' => '銫鐘',
+'锈病' => '銹病',
 '铝制' => '鋁製',
 '锌制' => '鋅製',
 '钢之炼金术师' => '鋼之鍊金術師',
@@ -8498,8 +8520,6 @@ public static $zh2Hant = [
 '表停' => '錶停',
 '表冠' => '錶冠',
 '表带' => '錶帶',
-'表快' => '錶快',
-'表慢' => '錶慢',
 '表板' => '錶板',
 '表王' => '錶王',
 '表盘' => '錶盤',
@@ -8523,9 +8543,6 @@ public static $zh2Hant = [
 '镰仓' => '鎌倉',
 '镇里' => '鎮裡',
 '镜图里' => '鏡圖裡',
-'锈病' => '鏽病',
-'锈菌' => '鏽菌',
-'锈蚀' => '鏽蝕',
 '钟上' => '鐘上',
 '钟下' => '鐘下',
 '钟不' => '鐘不',
@@ -8550,8 +8567,6 @@ public static $zh2Hant = [
 '钟形' => '鐘形',
 '钟形虫' => '鐘形蟲',
 '钟律' => '鐘律',
-'钟快' => '鐘快',
-'钟慢' => '鐘慢',
 '钟摆' => '鐘擺',
 '钟敲' => '鐘敲',
 '钟有' => '鐘有',
@@ -8580,9 +8595,6 @@ public static $zh2Hant = [
 '钟速' => '鐘速',
 '钟表' => '鐘錶',
 '钟表停' => '鐘錶停',
-'钟表快' => '鐘錶快',
-'钟表慢' => '鐘錶慢',
-'钟表王' => '鐘錶王',
 '钟表盘' => '鐘錶盤',
 '钟表速' => '鐘錶速',
 '钟关' => '鐘關',
@@ -8597,7 +8609,6 @@ public static $zh2Hant = [
 '钟鼎' => '鐘鼎',
 '钟鼓' => '鐘鼓',
 '铁制' => '鐵製',
-'铁锈' => '鐵鏽',
 '铁钟' => '鐵鐘',
 '铸钟' => '鑄鐘',
 '鉴别' => '鑑別',
@@ -8667,7 +8678,6 @@ public static $zh2Hant = [
 '防水表' => '防水錶',
 '防御' => '防禦',
 '防范' => '防範',
-'防锈' => '防鏽',
 '阿里' => '阿里',
 '附注' => '附註',
 '限制' => '限制',
@@ -8773,6 +8783,7 @@ public static $zh2Hant = [
 '面包住' => '面包住',
 '面包含' => '面包含',
 '面包围' => '面包圍',
+'面包圍' => '面包圍',
 '面包容' => '面包容',
 '面包庇' => '面包庇',
 '面包厢' => '面包廂',
@@ -8786,6 +8797,7 @@ public static $zh2Hant = [
 '面包着' => '面包著',
 '面包藏' => '面包藏',
 '面包装' => '面包裝',
+'面包裝' => '面包裝',
 '面包裹' => '面包裹',
 '面包起' => '面包起',
 '面包办' => '面包辦',
@@ -8821,7 +8833,11 @@ public static $zh2Hant = [
 '预报不准' => '預報不準',
 '预制' => '預製',
 '领袖欲' => '領袖慾',
+'头乱发' => '頭亂髮',
+'头发动' => '頭發動',
+'头发展' => '頭發展',
 '头发现' => '頭發現',
+'头发生' => '頭發生',
 '头里' => '頭裡',
 '头长发' => '頭長髮',
 '头发' => '頭髮',
@@ -9421,7 +9437,6 @@ public static $zh2Hant = [
 '齐王舍牛' => '齊王捨牛',
 '齿危发秀' => '齒危髮秀',
 '齿落发白' => '齒落髮白',
-'齿发' => '齒髮',
 '龙岩' => '龍巖',
 '龙卷' => '龍捲',
 '龙眼干' => '龍眼乾',
@@ -9921,6 +9936,7 @@ public static $zh2Hans = [
 '壠' => '垅',
 '壢' => '坜',
 '壩' => '坝',
+'壪' => '塆',
 '壯' => '壮',
 '壺' => '壶',
 '壻' => '婿',
@@ -10927,6 +10943,7 @@ public static $zh2Hans = [
 '矚' => '瞩',
 '矯' => '矫',
 '砲' => '炮',
+'硃' => '朱',
 '硜' => '硁',
 '硤' => '硖',
 '硨' => '砗',
@@ -10947,6 +10964,7 @@ public static $zh2Hans = [
 '磧' => '碛',
 '磯' => '矶',
 '磽' => '硗',
+'磾' => '䃅',
 '礄' => '硚',
 '礆' => '碱',
 '礎' => '础',
@@ -12205,6 +12223,7 @@ public static $zh2Hans = [
 '鉗' => '钳',
 '鉚' => '铆',
 '鉛' => '铅',
+'鉝' => '𫟷',
 '鉞' => '钺',
 '鉢' => '钵',
 '鉤' => '钩',
@@ -12246,6 +12265,7 @@ public static $zh2Hans = [
 '銳' => '锐',
 '銶' => '𨱇',
 '銷' => '销',
+'銹' => '锈',
 '銻' => '锑',
 '銼' => '锉',
 '鋁' => '铝',
@@ -13660,9 +13680,10 @@ public static $zh2Hans = [
 '土著' => '土著',
 '坤乾' => '坤乾',
 '墨瀋' => '墨渖',
+'覆審' => '复审',
 '覆查' => '复查',
 '覆核' => '复核',
-'è¦\86æ£\80' => '复检',
+'è¦\86檢' => '复检',
 '復甦' => '复苏',
 '大麴' => '大曲',
 '天道为乾' => '天道为乾',
@@ -13828,9 +13849,6 @@ public static $zh2Hans = [
 '朝乾夕惕' => '朝乾夕惕',
 '朱有燉' => '朱有燉',
 '朱淛' => '朱淛',
-'硃砂' => '朱砂',
-'硃紅' => '朱红',
-'硃色' => '朱色',
 '朴於宇同' => '朴於宇同',
 '李乾德' => '李乾德',
 '李乾順' => '李乾顺',
@@ -13879,6 +13897,7 @@ public static $zh2Hans = [
 '皁保' => '皁保',
 '目劄' => '目劄',
 '直昇' => '直升',
+'盼覆' => '盼复',
 '睹微知著' => '睹微知著',
 '瞭台' => '瞭台',
 '瞭臺' => '瞭台',
@@ -13887,6 +13906,7 @@ public static $zh2Hans = [
 '矇矓' => '矇眬',
 '石碁' => '石碁',
 '石碁鎮' => '石碁镇',
+'硃山湖' => '硃山湖',
 '碩託' => '硕讬',
 '鹼菜' => '硷菜',
 '碁圣' => '碁圣',
@@ -13974,9 +13994,9 @@ public static $zh2Hans = [
 '鍾意' => '钟意',
 '鍾靈' => '钟灵',
 '鍾愛' => '钟爱',
+'鍾祥' => '钟祥',
 '鐵鍊' => '铁链',
 '鉸鍊' => '铰链',
-'銀硃' => '银朱',
 '銀鍊' => '银链',
 '鍊子' => '链子',
 '鍊條' => '链条',
@@ -14073,6 +14093,8 @@ public static $zh2TW = [
 '落車' => '下車',
 '不來梅' => '不萊梅',
 '不来梅' => '不萊梅',
+'登巴萨' => '丹帕沙',
+'登巴薩' => '丹帕沙',
 '幺' => '么',
 '以太网' => '乙太網',
 '九杆' => '九桿',
@@ -14139,6 +14161,7 @@ public static $zh2TW = [
 '十杆' => '十桿',
 '特立尼达和托巴哥' => '千里達托貝哥',
 '特立尼達和多巴哥' => '千里達托貝哥',
+'不列颠哥伦比亚省' => '卑詩省',
 '南朝鲜' => '南韓',
 '卡斯特罗' => '卡斯楚',
 '卡塔尔' => '卡達',
@@ -14167,8 +14190,8 @@ public static $zh2TW = [
 '斯坦福大学' => '史丹福大學',
 '斯皮尔伯格' => '史匹柏',
 '斯特劳斯' => '史特勞斯',
-'斯威士兰' => '史瓦濟蘭',
-'斯威士蘭' => '史瓦濟蘭',
+'斯威士兰' => '史瓦帝尼',
+'斯威士蘭' => '史瓦帝尼',
 '斯蒂芬' => '史蒂芬',
 '斯大林' => '史達林',
 '結他' => '吉他',
@@ -14246,6 +14269,7 @@ public static $zh2TW = [
 '门德尔松' => '孟德爾頌',
 '安哈尔特' => '安哈特',
 '安哈爾特' => '安哈特',
+'安提瓜' => '安地卡',
 '安提瓜和巴布达' => '安地卡及巴布達',
 '安提瓜和巴布達' => '安地卡及巴布達',
 '洪都拉斯' => '宏都拉斯',
@@ -14266,6 +14290,7 @@ public static $zh2TW = [
 '尼日尔' => '尼日',
 '尼日爾' => '尼日',
 '雅马哈' => '山葉',
+'巴厘岛' => '峇里島',
 '特朗普' => '川普',
 '机床' => '工具機',
 '機床' => '工具機',
@@ -14284,10 +14309,10 @@ public static $zh2TW = [
 '勃蘭登堡' => '布蘭登堡',
 '布里斯托尔' => '布里斯托',
 '布隆方丹' => '布隆泉',
+'希拉克略' => '希拉克略',
 '希拉莉' => '希拉蕊',
 '希拉里' => '希拉蕊',
 '希特拉' => '希特勒',
-'傷殘奧林匹克' => '帕拉林匹克',
 '残疾人奥林匹克' => '帕拉林匹克',
 '残奥会' => '帕運會',
 '殘奧會' => '帕運會',
@@ -14344,6 +14369,7 @@ public static $zh2TW = [
 '揮杆' => '揮桿',
 '搜索引擎' => '搜尋引擎',
 '摩根士丹利' => '摩根史坦利',
+'阿拉伯撒哈拉' => '撒拉威阿拉伯',
 '台球' => '撞球',
 '攻打' => '攻打',
 '数字化' => '數位化',
@@ -14378,6 +14404,8 @@ public static $zh2TW = [
 '智能手機' => '智慧型手機',
 '智能电话' => '智慧型電話',
 '智能電話' => '智慧型電話',
+'智能机器人' => '智慧機器人',
+'智能機械人' => '智慧機器人',
 '知識產權' => '智慧財產權',
 '知识产权' => '智慧財產權',
 '萌島' => '曼島',
@@ -14420,7 +14448,6 @@ public static $zh2TW = [
 '標準杆' => '標準桿',
 '毛里求斯' => '模里西斯',
 '毛里裘斯' => '模里西斯',
-'机器人' => '機器人',
 '機械人' => '機器人',
 '概率' => '機率',
 '電單車' => '機車',
@@ -14492,6 +14519,7 @@ public static $zh2TW = [
 '徵狀' => '症狀',
 '勃朗宁' => '白朗寧',
 '百慕大' => '百慕達',
+'皮特凯恩' => '皮特肯',
 '卢旺达' => '盧安達',
 '盧旺達' => '盧安達',
 '真人騷' => '真人秀',
@@ -14671,14 +14699,19 @@ public static $zh2TW = [
 '浮罗交怡' => '蘭卡威',
 '浮羅交怡' => '蘭卡威',
 '劳拉' => '蘿拉',
+'虚拟现实' => '虛擬實境',
 '荧光' => '螢光',
 '荧屏' => '螢屏',
 '行人路权' => '行人路權',
 '行人路權' => '行人路權',
 '流動作業系統' => '行動作業系統',
 '移动操作系统' => '行動作業系統',
+'流動支付' => '行動支付',
+'移动支付' => '行動支付',
 '流動網絡' => '行動網路',
 '移动网络' => '行動網路',
+'流動裝置' => '行動裝置',
+'移动设备' => '行動裝置',
 '流動電話' => '行動電話',
 '移动电话' => '行動電話',
 '冲着' => '衝著',
@@ -15255,8 +15288,6 @@ public static $zh2HK = [
 '備著者' => '備著者',
 '備著述' => '備著述',
 '備著錄' => '備著錄',
-'帕拉林匹克' => '傷殘奧林匹克',
-'残疾人奥林匹克' => '傷殘奧林匹克',
 '傻里傻气' => '傻裏傻氣',
 '雇员' => '僱員',
 '雇用' => '僱用',
@@ -15351,6 +15382,7 @@ public static $zh2HK = [
 '北朝鲜' => '北韓',
 '区里有' => '區裏有',
 '区里的' => '區裏的',
+'不列颠哥伦比亚省' => '卑詩省',
 '南朝鲜' => '南韓',
 '波札那' => '博茨瓦納',
 '占卜' => '占卜',
@@ -15642,6 +15674,7 @@ public static $zh2HK = [
 '守著述' => '守著述',
 '守著錄' => '守著錄',
 '安哈特' => '安哈爾特',
+'安地卡' => '安提瓜',
 '安地卡及巴布達' => '安提瓜和巴布達',
 '定著' => '定着',
 '定著作' => '定著作',
@@ -15711,6 +15744,7 @@ public static $zh2HK = [
 '山里的' => '山裏的',
 '甘比亞' => '岡比亞',
 '岸裡' => '岸裡',
+'巴厘岛' => '峇里島',
 '工作台' => '工作枱',
 '已占' => '已佔',
 '巴塞罗那' => '巴塞隆拿',
@@ -16203,6 +16237,7 @@ public static $zh2HK = [
 '斥著述' => '斥著述',
 '斥著錄' => '斥著錄',
 '斯堪地那維亞' => '斯堪的納維亞',
+'史瓦帝尼' => '斯威士蘭',
 '史瓦濟蘭' => '斯威士蘭',
 '斯洛維尼亞' => '斯洛文尼亞',
 '紐澳良' => '新奧爾良',
@@ -16244,6 +16279,7 @@ public static $zh2HK = [
 '智慧型' => '智能',
 '智慧卡' => '智能卡',
 '智慧手機' => '智能手機',
+'智慧機器人' => '智能機械人',
 '暗地里' => '暗地裏',
 '暗沟里' => '暗溝裏',
 '暗著' => '暗着',
@@ -16372,6 +16408,7 @@ public static $zh2HK = [
 '死里求生' => '死裏求生',
 '死里逃生' => '死裏逃生',
 '帕運會' => '殘奧會',
+'帕拉林匹克' => '殘疾人奧林匹克',
 '殺著' => '殺着',
 '殺著作' => '殺著作',
 '殺著名' => '殺著名',
@@ -16446,8 +16483,12 @@ public static $zh2HK = [
 '活著錄' => '活著錄',
 '移动操作系统' => '流動作業系統',
 '行動作業系統' => '流動作業系統',
+'移动支付' => '流動支付',
+'行動支付' => '流動支付',
 '移动网络' => '流動網絡',
 '行動網路' => '流動網絡',
+'移动设备' => '流動裝置',
+'行動裝置' => '流動裝置',
 '移动电话' => '流動電話',
 '行動電話' => '流動電話',
 '流著' => '流着',
@@ -16685,6 +16726,7 @@ public static $zh2HK = [
 '疑著述' => '疑著述',
 '疑著錄' => '疑著錄',
 '狂牛症' => '瘋牛症',
+'丹帕沙' => '登巴薩',
 '发布' => '發佈',
 '發布' => '發佈',
 '發著' => '發着',
@@ -16698,6 +16740,7 @@ public static $zh2HK = [
 '百科里' => '百科裏',
 '的图里' => '的圖裏',
 '的山里' => '的山裏',
+'皮特凯恩' => '皮特肯',
 '皮里春秋' => '皮裏春秋',
 '皮里阳秋' => '皮裏陽秋',
 '皺著' => '皺着',
@@ -17266,6 +17309,7 @@ public static $zh2HK = [
 '記著述' => '記著述',
 '記著錄' => '記著錄',
 '記錄著' => '記錄着',
+'词里' => '詞裏',
 '試著' => '試着',
 '試著作' => '試著作',
 '試著名' => '試著名',
@@ -17634,6 +17678,7 @@ public static $zh2HK = [
 '聞著' => '闻着',
 '亞塞拜然' => '阿塞拜疆',
 '阿布達比' => '阿布扎比',
+'撒拉威阿拉伯' => '阿拉伯撒哈拉',
 '阿拉伯聯合大公國' => '阿拉伯聯合酋長國',
 '亞斯文' => '阿斯旺',
 '阿联酋' => '阿聯酋',
@@ -17917,6 +17962,7 @@ public static $zh2CN = [
 '下著稱' => '下著称',
 '下著者' => '下著者',
 '下著述' => '下著述',
+'卑詩省' => '不列颠哥伦比亚省',
 '不著' => '不着',
 '不著書' => '不著书',
 '不著名' => '不著名',
@@ -18632,6 +18678,7 @@ public static $zh2CN = [
 '守著者' => '守著者',
 '守著述' => '守著述',
 '安哈特' => '安哈尔特',
+'安地卡' => '安提瓜',
 '安地卡及巴布達' => '安提瓜和巴布达',
 '巨集' => '宏',
 '定著' => '定着',
@@ -18679,6 +18726,7 @@ public static $zh2CN = [
 '展著述' => '展著述',
 '瓦倫西亞' => '巴伦西亚',
 '華倫西亞' => '巴伦西亚',
+'峇里' => '巴厘',
 '巴塞隆拿' => '巴塞罗那',
 '巴塞隆納' => '巴塞罗那',
 '巴斯拉' => '巴士拉',
@@ -19169,6 +19217,7 @@ public static $zh2CN = [
 '史丹福大學' => '斯坦福大学',
 '斯堪地那維亞' => '斯堪的纳维亚',
 '史達林' => '斯大林',
+'史瓦帝尼' => '斯威士兰',
 '史瓦濟蘭' => '斯威士兰',
 '斯洛維尼亞' => '斯洛文尼亚',
 '史特勞斯' => '斯特劳斯',
@@ -19213,6 +19262,7 @@ public static $zh2CN = [
 '智慧型' => '智能',
 '智慧卡' => '智能卡',
 '智慧手機' => '智能手机',
+'智慧機器人' => '智能机器人',
 '暗著' => '暗着',
 '暗著書' => '暗著书',
 '暗著作' => '暗著作',
@@ -19323,7 +19373,6 @@ public static $zh2CN = [
 '欠帳' => '欠账',
 '死帳' => '死账',
 '帕運會' => '残奥会',
-'傷殘奧林匹克' => '残疾人奥林匹克',
 '帕拉林匹克' => '残疾人奥林匹克',
 '庇里牛斯' => '比利牛斯',
 '披索' => '比索',
@@ -19565,8 +19614,10 @@ public static $zh2CN = [
 '疑著述' => '疑著述',
 '狂牛症' => '疯牛病',
 '徵狀' => '症状',
+'丹帕沙' => '登巴萨',
 '百慕達' => '百慕大',
 '皮雅斯·布士南' => '皮尔斯·布鲁斯南',
+'皮特肯' => '皮特凯恩',
 '皺著' => '皱着',
 '皺著書' => '皱著书',
 '皺著作' => '皱著作',
@@ -19770,10 +19821,14 @@ public static $zh2CN = [
 '積極份子' => '积极分子',
 '流動作業系統' => '移动操作系统',
 '行動作業系統' => '移动操作系统',
+'流動支付' => '移动支付',
+'行動支付' => '移动支付',
 '流動電話' => '移动电话',
 '行動電話' => '移动电话',
 '流動網絡' => '移动网络',
 '行動網路' => '移动网络',
+'流動裝置' => '移动设备',
+'行動裝置' => '移动设备',
 '程式設計師' => '程序员',
 '程式控制' => '程控',
 '空中巴士' => '空中客车',
@@ -19987,6 +20042,7 @@ public static $zh2CN = [
 '獲著稱' => '获著称',
 '獲著者' => '获著者',
 '獲著述' => '获著述',
+'菁寮' => '菁寮',
 '塞拉耶佛' => '萨拉热窝',
 '落著' => '落着',
 '落著書' => '落著书',
@@ -20024,6 +20080,7 @@ public static $zh2CN = [
 '蘸著稱' => '蘸著称',
 '蘸著者' => '蘸著者',
 '蘸著述' => '蘸著述',
+'虛擬實境' => '虚拟现实',
 '行人路权' => '行人路权',
 '行人路權' => '行人路权',
 '行著' => '行着',
@@ -20230,6 +20287,7 @@ public static $zh2CN = [
 '踩著述' => '踩著述',
 '笨豬跳' => '蹦极跳',
 '绑紧跳' => '蹦极跳',
+'身份' => '身份',
 '身分' => '身份',
 '身著' => '身着',
 '身著書' => '身著书',
@@ -20417,6 +20475,7 @@ public static $zh2CN = [
 '聞著' => '闻着',
 '亞塞拜然' => '阿塞拜疆',
 '阿布達比' => '阿布扎比',
+'撒拉威阿拉伯' => '阿拉伯撒哈拉',
 '阿拉伯聯合大公國' => '阿拉伯联合酋长国',
 '亞斯文' => '阿斯旺',
 '附著' => '附着',
index f976904..86e91aa 100644 (file)
        "createacct-another-realname-tip": "Regte naam is opsioneel.\nAs u dit verskaf, sal dit gebruik word om u erkenning vir u werk te gee.",
        "pt-login": "Meld aan",
        "pt-login-button": "Meld aan",
+       "pt-login-continue-button": "Meld verder aan",
        "pt-createaccount": "Skep gebruiker",
        "pt-userlogout": "Meld af",
        "php-mail-error-unknown": "Onbekende fout in PHP se mail()-funksie",
        "user-mail-no-addy": "Geprobeer om e-pos te stuur sonder 'n e-posadres.",
        "user-mail-no-body": "Daar is probeer om 'n leë of 'n onredelike kort boodskap te stuur.",
        "changepassword": "Verander wagwoord",
-       "resetpass_announce": "U het aangeteken met 'n tydelike e-poskode.\nOm voort te gaan moet u 'n nuwe wagwoord hier kies:",
+       "resetpass_announce": "Om klaar aan te meld, kies 'n nuwe wagwoord.",
        "resetpass_text": "<!-- Voeg teks hier by -->",
        "resetpass_header": "Verander wagwoord",
        "oldpassword": "Ou wagwoord",
        "newpassword": "Nuwe wagwoord",
        "retypenew": "Tik nuwe wagwoord weer in",
        "resetpass_submit": "Stel wagwoord en meld aan",
-       "changepassword-success": "U wagwoord is suksesvol gewysig!",
+       "changepassword-success": "U wagwoord is verander!",
        "botpasswords-label-create": "Skep",
        "botpasswords-label-update": "Opdateer",
        "botpasswords-label-cancel": "Kanselleer",
index b1e604e..de5d715 100644 (file)
        "rcfilters-watchlist-edit-watchlist-button": "تعديل قائمة الصفحات المراقبة",
        "rcfilters-watchlist-showupdated": "التغييرات للصفحات التي لم تزرها منذ حدوث التغييرات تكون <strong>بالخط العريض</strong>، مع علامات صلبة.",
        "rcfilters-preference-label": "استخدم واجهة غير جافا سكريبت",
-       "rcfilters-preference-help": "يحمل أحدث التغييرات دون وظيفة المرشحات أو تسليط الضوء.",
+       "rcfilters-preference-help": "يحمل أحدث التغييرات دون وظيفة مرشحات البحث أو تسليط الضوء.",
        "rcfilters-watchlist-preference-label": "استخدم واجهة غير جافا سكريبت",
-       "rcfilters-watchlist-preference-help": "يحمل قائمة المراقبة دون وظيفة المرشحات أو تسليط الضوء.",
+       "rcfilters-watchlist-preference-help": "يحمل قائمة المراقبة دون وظيفة مرشحات البحث أو تسليط الضوء.",
        "rcfilters-filter-showlinkedfrom-label": "عرض التغييرات في الصفحات الموصولة من",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>الصفحات الموصولة من</strong> الصفحة المختارة",
        "rcfilters-filter-showlinkedto-label": "عرض التغييرات في الصفحات الموصولة بصفحة",
        "move": "انقل",
        "movethispage": "انقل هذه الصفحة",
        "unusedimagestext": "الملفات التالية موجودة لكن غير مضمنة في أي صفحة.\nمن فضلك لاحظ أن المواقع الأخرى ربما تصل إلى ملف بمسار مباشر، ولذا ربما يكون معروضا هنا بالرغم من كونه مستخدما.",
+       "unusedimagestext-categorizedimgisused": "الملفات التالية موجودة ولكنها غير مضمنة في أية صفحة، تُعتبَر الصور المصنفة مستعملة على الرغم من أنها غير مضمنة في أية صفحة.\n\nتُرجَى ملاحظة أن مواقع الويب الأخرى قد ترتبط بملف يحتوي على مسار مباشر; ولذلك قد لا تزال مدرجة هنا على الرغم من كونها قيد الاستخدام النشط.",
        "unusedcategoriestext": "التصنيفات التالية موجودة على الرغم من أنها لا تحتوي على أية صفحات أو تصنيفات أخرى.",
        "notargettitle": "لا هدف",
        "notargettext": "لم تحدد الصفحة أو المستخدم المستهدف لعمل هذه الخاصية.",
index ea021dd..3d21fcc 100644 (file)
        "rcfilters-savedqueries-setdefault": "دفالت حالتده تنظیمله",
        "rcfilters-savedqueries-new-name-placeholder": "فیلتر هدفینی آچیقلا",
        "rcfilters-savedqueries-apply-label": "فیلتر یارات",
+       "rcfilters-savedqueries-add-new-title": "ایندیکی فیلتر تنظیملرینی ذخیره ائت",
        "rcfilters-restore-default-filters": "دِفالت فیلترلری قایتار",
        "rcfilters-clear-all-filters": "بۆتون فیلترلری سیل",
        "rcfilters-show-new-changes": "اَن سون دَییشیکلیکلره باخ",
        "rcfilters-exclude-button-off": "سئچیلمیشلرین چیخاریلماسی",
        "rcfilters-exclude-button-on": "سئچیلمیشلرین چیخاریلماسی",
        "rcfilters-view-tags": "اتیکتلنمیش دییشدیرمه‌لر",
+       "rcfilters-view-namespaces-tooltip": "نتیجه‌لری آد فضالارینا گؤره فیلترله",
        "rcfilters-liveupdates-button": "دیری یئنیلنمه‌لر",
        "rcnotefrom": "آشاغی داکی دَییشیک لرده <strong>$3, $4</strong> (دن <strong>$1</strong> {{PLURAL:$5|چان گوستریلیب|چان گوستریلیب دیر}}).",
        "rclistfrom": "$3 $2 واختیندان باشلایاراق یئنی دییشیکلری گؤستر",
index b81cb58..519d1a9 100644 (file)
        "rcfilters-watchlist-edit-watchlist-button": "Рэдагаваць ваш сьпіс назіраньня за старонкамі",
        "rcfilters-watchlist-showupdated": "Зьмены старонак, якія вы не наведвалі пасьля гэтых зьменаў, пазначаныя <strong>тоўстым</strong> з адпаведнымі пазнакамі.",
        "rcfilters-preference-label": "Выкарыстоўваць інтэрфэйс без JavaScript",
-       "rcfilters-preference-help": "Загружае апошнія зьмены бязь фільтраў ці інструмэнтаў вылучэньня.",
+       "rcfilters-preference-help": "Загружае апошнія зьмены бязь фільтраў пошуку ці інструмэнтаў вылучэньня.",
        "rcfilters-watchlist-preference-label": "Выкарыстоўваць інтэрфэйс без JavaScript",
-       "rcfilters-watchlist-preference-help": "Загружае сьпіс назіраньня бязь фільтраў ці інструмэнтаў вылучэньня.",
+       "rcfilters-watchlist-preference-help": "Загружае сьпіс назіраньня бязь фільтраў пошуку ці інструмэнтаў вылучэньня.",
        "rcfilters-filter-showlinkedfrom-label": "Паказаць зьмены на старонках, на якія спасылаецца",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Старонкі, на якія спасылаецца</strong> абраная старонка",
        "rcfilters-filter-showlinkedto-label": "Паказаць зьмены старонак, якія спасылаюцца на",
        "filedelete": "Выдаліць $1",
        "filedelete-legend": "Выдаліць файл",
        "filedelete-intro": "Вы выдаляеце файл <strong>[[Media:$1|$1]]</strong> з усёй яго гісторыяй.",
-       "filedelete-intro-old": "Вы выдаляеце вэрсію '''[[Media:$1|$1]]''' ад [$4 $3, $2].",
+       "filedelete-intro-old": "Вы выдаляеце вэрсію <strong>[[Media:$1|$1]]</strong> ад [$4 $3, $2].",
        "filedelete-comment": "Прычына:",
        "filedelete-submit": "Выдаліць",
        "filedelete-success": "'''$1''' выдалены.",
        "move": "Перанесьці",
        "movethispage": "Перанесьці гэтую старонку",
        "unusedimagestext": "Наступныя файлы існуюць, але не выкарыстоўваюцца ні на адной старонцы.\nКалі ласка, заўважце, што іншыя сайты могуць спасылацца на гэты файл празь непасрэдную спасылку (URL), і ён можа актыўна выкарыстоўвацца нягледзячы на знаходжаньне ў гэтым сьпісе.",
+       "unusedimagestext-categorizedimgisused": "Наступныя файлы існуюць, але ня ўкладзеныя ні ў якую старонку. Катэгарызаваныя выявы лічацца ўжыванымі, нягледзячы на тое, што яны ня ўкладзеныя ні ў якую старонку.\nКалі ласка, заўважце, што іншыя вэбсайты могуць спасылацца на файл празь непасрэдны URL-адрас, але пры гэтым яны будуць знаходзіцца ў гэтым сьпісе, нягледзячы на актыўнае выкарыстаньне.",
        "unusedcategoriestext": "Існуюць наступныя катэгорыі, якія ня ўтрымліваюць старонак ці іншых катэгорыяў.",
        "notargettitle": "Не пазначаная мэта",
        "notargettext": "Вы не пазначылі мэтавую старонку альбо ўдзельніка для гэтага дзеяньня.",
        "pageinfo-display-title": "Загаловак для адлюстраваньня",
        "pageinfo-default-sort": "Перадвызначаны ключ сартаваньня",
        "pageinfo-length": "Памер старонкі (у байтах)",
+       "pageinfo-namespace": "Прастора назваў",
        "pageinfo-article-id": "Ідэнтыфікатар старонкі",
        "pageinfo-language": "Мова зьместу старонкі",
        "pageinfo-language-change": "зьмяніць",
index d787414..dd9bee3 100644 (file)
        "prefs-advancedwatchlist": "Пашыраныя настройкі",
        "prefs-displayrc": "Паказ",
        "prefs-displaywatchlist": "Паказ",
+       "prefs-changesrc": "Паказаныя змены",
+       "prefs-changeswatchlist": "Паказаныя змены",
+       "prefs-pageswatchlist": "Назіраныя старонкі",
        "prefs-tokenwatchlist": "Токен",
        "prefs-diffs": "Розніцы",
        "prefs-help-prefershttps": "Гэта настройка пачне дзейнічаць па наступным уваходзе ў сістэму.",
index a815186..08d8082 100644 (file)
        "movepage-moved": "<strong>Страницата „$1“ беше преместена под името „$2“</strong>",
        "movepage-moved-redirect": "Беше създадено пренасочване.",
        "movepage-moved-noredirect": "Създаването на пренасочване беше спряно.",
-       "articleexists": "Вече съществува страница с това име или името, което сте избрали, е невалидно. Изберете друго име.",
-       "cantmove-titleprotected": "Страницата не може да бъде преместена под новото заглавие, тъй като то е защитено от създаване",
+       "articleexists": "Вече съществува страница с това име или името, което сте избрали е невалидно.\nИзберете друго име.",
+       "cantmove-titleprotected": "Страницата не може да бъде преместена под новото заглавие, тъй като то е защитено от създаване.",
        "movetalk": "Преместване и на беседата, ако е приложимо",
        "move-subpages": "Преместване на всички подстраници (до $1)",
        "move-talk-subpages": "Преместване на всички подстраници на беседата (до $1)",
index 89e4544..e6e6269 100644 (file)
        "rcfilters-watchlist-edit-watchlist-button": "Deine Liste der beobachteten Seiten bearbeiten",
        "rcfilters-watchlist-showupdated": "Änderungen an Seiten, die du seit ihrem Auftreten nicht besucht hast, sind <strong>fett</strong> markiert.",
        "rcfilters-preference-label": "Die Oberfläche ohne JavaScript verwenden",
-       "rcfilters-preference-help": "Lädt die „Letzten Änderungen“ ohne Filter oder Hervorhebungsfunktion.",
+       "rcfilters-preference-help": "Lädt die „Letzten Änderungen“ ohne Filtersuche oder Hervorhebungsfunktion.",
        "rcfilters-watchlist-preference-label": "Die Oberfläche ohne JavaScript verwenden",
-       "rcfilters-watchlist-preference-help": "Lädt die Beobachtungsliste ohne Filter oder Hervorhebungsfunktion.",
+       "rcfilters-watchlist-preference-help": "Lädt die Beobachtungsliste ohne Filtersuche oder Hervorhebungsfunktion.",
        "rcfilters-filter-showlinkedfrom-label": "Änderungen auf Seiten anzeigen, die verlinkt sind von",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Seiten</strong>, die <strong>von</strong> der ausgewählten Seite <strong>verlinkt</strong> sind",
        "rcfilters-filter-showlinkedto-label": "Änderungen auf Seiten anzeigen, die verlinken auf",
index 2fc4047..ce541fc 100644 (file)
        "uctop": "weziyet",
        "month": "Aşme:",
        "year": "Serre:",
+       "date": "Tarix ra (û raver):",
        "sp-contributions-newbies": "Tenya iştırakanê karberanê newan bımotne",
        "sp-contributions-newbies-sub": "Qe hesebê newe",
        "sp-contributions-newbies-title": "Hesabanê neweyan rê iştırakê karberi",
index 75e6281..b3a0e9b 100644 (file)
        "rcfilters-watchlist-edit-watchlist-button": "Edit your list of watched pages",
        "rcfilters-watchlist-showupdated": "Changes to pages you haven't visited since the changes occurred are in <strong>bold</strong>, with solid markers.",
        "rcfilters-preference-label": "Use non-JavaScript interface",
-       "rcfilters-preference-help": "Loads RecentChanges without filters or highlighting functionality.",
+       "rcfilters-preference-help": "Loads RecentChanges without filters search or highlighting functionality.",
        "rcfilters-watchlist-preference-label": "Use non-JavaScript interface",
-       "rcfilters-watchlist-preference-help": "Loads Watchlist without filters or highlighting functionality.",
+       "rcfilters-watchlist-preference-help": "Loads Watchlist without filters search or highlighting functionality.",
        "rcfilters-filter-showlinkedfrom-label": "Show changes on pages linked from",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Pages linked from</strong> the selected page",
        "rcfilters-filter-showlinkedto-label": "Show changes on pages linking to",
index 52406ca..d314cd8 100644 (file)
        "rcfilters-liveupdates-button-title-off": "نمایش تغییرات جدید همچنان که رخ می‌دهند",
        "rcfilters-watchlist-markseen-button": "نشانه‌گذاری تمام تغییرات به‌عنوان خوانده‌شده",
        "rcfilters-watchlist-edit-watchlist-button": "ویرایش فهرست صفحه‌های پی‌گیری‌هایتان",
-       "rcfilters-watchlist-showupdated": "تغÛ\8cÛ\8cرات ØµÙ\81حاتÛ\8c Ú©Ù\87 Ø´Ù\85ا Ø¨Ø§Ø²Ø¯Û\8cد Ù\86کردÛ\8cد Ø§Ø² Ø²Ù\85اÙ\86Û\8c Ú©Ù\87 ØªØºÛ\8cÛ\8cرات Ø±Ø® Ø¯Ø§Ø¯Ù\87 Ø¨Ù\87 ØµÙ\88رت <strong>پررÙ\86Ú¯</strong>Ø\8c Ø¨Ø§ Ù\86شاÙ\86گر ØªÙ\88پر.",
+       "rcfilters-watchlist-showupdated": "تغÛ\8cÛ\8cرات ØµÙ\81حاتÛ\8c Ú©Ù\87 Ø´Ù\85ا Ø§Ø² Ø²Ù\85اÙ\86Û\8c Ú©Ù\87 ØªØºÛ\8cÛ\8cر Ø¨Ø§Ø²Ø¯Û\8cدشاÙ\86 Ù\86کردÙ\87â\80\8cاÛ\8cد Ø¨Ù\87 ØµÙ\88رت <strong>پررÙ\86Ú¯</strong> Ù\88 Ø¨Ø§ Ù\86شاÙ\86گر ØªÙ\88پر Ù\86Ù\85اÛ\8cØ´ Ù\85Û\8câ\80\8cÛ\8cابد.",
        "rcfilters-preference-label": "مخفی کردن نسخه بهبود یافته تغییرات اخیر",
        "rcfilters-preference-help": "تغییرات رابط کاربری که در سال ۲۰۱۷ اضافه شده است را بر می‌گرداند.",
        "rcfilters-watchlist-preference-label": "نمایش نسخهٔ بهبودیافتهٔ فهرست پیگیری",
index fa1cece..e55e3b3 100644 (file)
        "autosumm-blank": "Det sidj as leesag maaget wurden.",
        "autosumm-replace": "Di tekst as ütjbütjet wurden mä \"$1\"",
        "autoredircomment": "Sidj tu [[$1]] widjerfeerd",
+       "autosumm-removed-redirect": "Widjerfeerang tu [[$1]] wechnimen",
        "autosumm-changed-redirect-target": "Widjerfeerang feranert faan [[$1]] tu [[$2]]",
        "autosumm-new": "Det sidj as nei uunlaanj wurden: \"$1\"",
        "autosumm-newblank": "En leesag sidj maaget",
index 7ca67b0..7e4076c 100644 (file)
        "rcfilters-watchlist-edit-watchlist-button": "עריכת רשימת הדפים במעקב שלך",
        "rcfilters-watchlist-showupdated": "שינויים בדפים שלא ביקרת בהם מאז ביצוע השינויים מופיעים בכתב <strong>מודגש</strong>, ומסומנים בצבע.",
        "rcfilters-preference-label": "שימוש בממשק ללא JavaScript",
-       "rcfilters-preference-help": "שימוש בשינויים האחרונים בלי מסננים ובלי הבלטות.",
+       "rcfilters-preference-help": "ש×\99×\9e×\95ש ×\91ש×\99× ×\95×\99×\99×\9d ×\94×\90×\97ר×\95× ×\99×\9d ×\91×\9c×\99 ×\97×\99פ×\95ש ×¢×\9d ×\9eסננ×\99×\9d ×\95×\91×\9c×\99 ×\94×\91×\9c×\98×\95ת.",
        "rcfilters-watchlist-preference-label": "שימוש בממשק ללא JavaScript",
-       "rcfilters-watchlist-preference-help": "שימוש ברשימת המעקב בלי מסננים ובלי הבלטות.",
+       "rcfilters-watchlist-preference-help": "ש×\99×\9e×\95ש ×\91רש×\99×\9eת ×\94×\9eעק×\91 ×\91×\9c×\99 ×\97×\99פ×\95ש ×¢×\9d ×\9eסננ×\99×\9d ×\95×\91×\9c×\99 ×\94×\91×\9c×\98×\95ת.",
        "rcfilters-filter-showlinkedfrom-label": "הצגת שינויים בדפים שמקושרים מתוך",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>דפים שמקושרים מתוך</strong> הדף שנבחר",
        "rcfilters-filter-showlinkedto-label": "הצגת שינויים בדפים שמקשרים אל",
index 18f4722..f140fe0 100644 (file)
        "defaultmessagetext": "Prvotni tekst poruke",
        "content-failed-to-parse": "Obrada (''parsiranje'') formata $2 za model $1 nije uspjela: $3",
        "invalid-content-data": "Nevaljani sadržaj",
-       "content-not-allowed-here": "Sadržaj napisan u obliku \"$1\"-a nije dozvoljen na stranici [[:$2]]",
+       "content-not-allowed-here": "Sadržaj »$1« nije dopušten na stranici [[:$2]] na lokaciji slota »$3«",
        "editwarning-warning": "Napuštanje ove stranice može uzrokovati gubitak svake izmjene koju ste napravili.\nAko ste prijavljeni, možete onemogućiti ovo upozorenje u odjeljku \"{{int:prefs-editing}}\" Vaših postavki.",
        "editpage-invalidcontentmodel-title": "Model sadržaja nije podržan",
        "editpage-invalidcontentmodel-text": "Model sadržaja »$1« nije podržan.",
index bdad332..8b2994d 100644 (file)
        "unwatch": "Հանել հսկումից",
        "unwatchthispage": "Հանել հսկումից",
        "notanarticle": "Հոդված չէ",
-       "watchlist-details": "Ձեր հսկացանկում կա {{PLURAL:$1|$1 էջ}}` այդ թվում քննարկման էջերը։",
+       "watchlist-details": "Ձեր հսկացանկում կա {{PLURAL:$1|$1 էջ}}, այդ թվում՝ քննարկման էջերը։",
        "wlheader-enotif": "Էլ-փոստով տեղեկացումը միացված է։",
        "wlheader-showupdated": "Էջերը, որոնք փոփոխվել են ձեր վերջին այցից հետո, բերված են '''թավատառ'''։",
        "wlnote": "Ստորև բերված {{PLURAL:$1|է վերջին փոփոխությունը|են վերջին '''$1''' փոփոխությունները}} վերջին <strong>$2</strong> ժամվա ընթացքում՝ $3, $4֊ի դրությամբ։",
index 2d09a18..67243a2 100644 (file)
        "rcfilters-filter-excluded": "Escluso",
        "rcfilters-tag-prefix-namespace-inverted": "<strong>:non</strong> $1",
        "rcfilters-exclude-button-off": "Escludi selezionati",
-       "rcfilters-exclude-button-on": "Escludendo selezionati",
+       "rcfilters-exclude-button-on": "Selezionati esclusi",
        "rcfilters-view-tags": "Modifiche etichettate",
        "rcfilters-view-namespaces-tooltip": "Filtra risultati per namespace",
        "rcfilters-view-tags-tooltip": "Filtra risultati per etichette di modifica",
        "rcfilters-watchlist-edit-watchlist-button": "Modifica il tuo elenco di pagine osservate",
        "rcfilters-watchlist-showupdated": "Le modifiche alle pagine che non hai ancora visitato da quando le modifiche sono avvenute, vengono evidenziate in <strong>grassetto</strong> e con dei pallini pieni.",
        "rcfilters-preference-label": "Utilizza l'interfaccia senza JavaScript",
-       "rcfilters-preference-help": "Carica le ultime modifiche senza filtri o funzionalità di evidenziazione.",
+       "rcfilters-preference-help": "Carica le ultime modifiche senza filtri di ricerca o funzionalità di evidenziazione.",
        "rcfilters-watchlist-preference-label": "Utilizza l'interfaccia senza JavaScript",
-       "rcfilters-watchlist-preference-help": "Carica gli osservati speciali senza filtri o funzionalità di evidenziazione.",
+       "rcfilters-watchlist-preference-help": "Carica gli osservati speciali senza filtri di ricerca o funzionalità di evidenziazione.",
        "rcfilters-filter-showlinkedfrom-label": "Mostra le modifiche alle pagine collegate da",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Pagine con collegamenti da</strong> la pagina selezionata",
        "rcfilters-filter-showlinkedto-label": "Mostra le modifiche alle pagine che collegano a",
index eaa9175..09b258c 100644 (file)
        "prefs-editing": "ဆ်ုသံင့်ၜးၯဴ",
        "username": "{{GENDER:$1|ဆ်ုသုံႋဆာႋမိင်}}:",
        "yourrealname": "အ်ုမိင်ယင်ႋ:",
+       "yournick": "စူးဏါင်းသင့်:",
+       "prefs-signature": "စူးဏါင်း",
        "editusergroup": "မ်ုၮဲဖှ်ေ ဆ်ုသုံႋဆာႋကုံရွာဲ",
        "group-user": "ဆ်ုသုံႋဆာႋလ်ုဖး",
        "group-autoconfirmed": "အ်ုဆ်ုမာအ်ု ဏေဝ်ႋၯုင်ႋခိုင့်ထ ဆ်ုသုံႋဆာႋလ်ုဖး",
        "grouppage-user": "{{ns:project}}:ဆ်ုသုံႋဆာႋလ်ုဖး",
        "grouppage-bot": "{{ns:project}}:ဘော့သယ်",
        "grouppage-sysop": "{{ns:project}}:ပိုင်ဆ်ုပျာဆိုင်လ်ုဖး",
+       "right-edit": "မ်ုအင်းတါင် လိက်မေံလ်ုဖးယိုဝ်",
        "right-writeapi": "ဆ်ုကေဝ်လိက် API အိုဝ် မ်ုအင်းသုံ့",
+       "right-delete": "မ်ုထုဂ်ဆိင့်လိက်‌မေံၜၠါ်လ်ုဖး",
        "newuserlogpage": "အွးပ္တုံသံင့် စ်ုရင့်",
        "rightslog": "ဆ်ုသုံ့ဆာ အ်ုဝေ့ၮေဝ်ထဆ်ုပၠယ်တဝ်သယ်လ်ုဖး ဆ်ုမာၮါင်း",
        "action-edit": "လိက်မေံယိုဝ် မ်ုအင်းတါင်",
+       "action-createpage": "မ်ုပ္တံင် လိက်မေံၜၠါ်ယိုဝ်",
        "action-createaccount": "ဆ်ုအင်းသုံ့က်ုဆာဆ်ုမာ မ်ုအင်းတင်",
+       "action-delete": "လိက်‌မေံၜၠါ်ယိုဝ် မ်ုထုဂ်ဆိင့်",
        "enhancedrc-history": "မေင်ႋစိင်",
        "recentchanges": "အ်ုခါ့ယိုဝ် ဆ်ုအင်းလယ်လ်ုဖး",
        "recentchanges-legend": "အ်ုခါ့ ဆ်ုအင်းလယ်ၯင်း လုဲႋသယ်လ်ုဖး",
        "recentchanges-legend-heading": "<strong>ပ်ုယုံ့:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|လက်မေံသံင့်သယ် က်ုတုဂ်]]ၮ်ှ မ်ုယောဝ်ႋ)",
        "rcfilters-legend-heading": "<strong>ဖုႋဖုႋတုဂ်တုဂ် စ်ုရင့်:</strong>",
+       "rcfilters-savedqueries-remove": "ထုဂ်ဆိင့်",
        "rcnotefrom": "ဖံင့်လာႋသယ်ၮှ် <strong>$3၊ $4</strong> ခဝ့် ၯံင် {{PLURAL:$5|ဆ်ုအင်းလဲါ|ဆ်ုအင်းလဲါလ်ုဖး}} မွာဲဆေဝ်ႋ  (<strong>$1</strong> ခဝ့်ဍာ် ၮဲဖှ်ေထ)။",
        "rclistfrom": "$3 $2 ခဝ့်ၯံင် ဆ်ုအင်းလယ်သင့်သယ်ၮှ် မ်ုၮဲဖှ်ေ",
        "rcshowhideminor": "အ်ုဍံင်လ်ုဍောဟ် ဆ်ုအင်းတင်ႋ $1 ၯင်း",
        "upload-form-label-infoform-description": "ဆ်ုဏဲဖၠဟ်",
        "license": "လိုင်စင်ပၞံင့်ပ္တုံ",
        "license-header": "လိုင်စင်ပၞံင့်ပ္တုံ",
+       "listfiles-delete": "ထုဂ်ဆိင့်",
        "imgfile": "ဖိုင်ႋ",
        "listfiles": "ဖိုင်ႋစ်ုရင့်",
        "listfiles_description": "ဆ်ုဏဲဖၠဟ်",
        "file-anchor-link": "ဖိုင်",
        "filehist": "ဃွှာန့်မေင်ႋစိင်",
        "filehist-help": "ဖိုင်ၮ်ှ ဗေ့မူႋသင့်သိုဝ် မ်ုဍးၯင်း မူႋသင့်/ခိင့်ခါ့ လ်ုမိင်မိင်ၮ်ှ ၜါ်လင်။",
+       "filehist-deleteone": "ထုဂ်ဆိင့်",
        "filehist-revert": "ၜၠာ်က္ဍာ",
        "filehist-current": "လ်ုဏီမူႋအ်ုခါ့ယိုဝ်",
        "filehist-datetime": "မူႋသင့်/ခိင့်ခါ့",
        "sharedupload-desc-here": "ဖိုင်အ်ယိုဝ် လ်ု $1 ခဝ့်ၯင်ႋ အ်ုၰာၰံင်ပ်ုရာ်ဂျက်ခဝ့်ၮ်ှ သုဲးသီးသုံးသှ်ေဆေဝ်ႋလှ်။\nအ်ုဝေ့ [$2 ဖိုင်လိက်မေံအ်ုကျံင်] ဝယ် ဖှ်ေထာ့ဝေ့ၮ်ှ ဗေ့အ်ုဖၠင်လာႋသၠင်ဆေဝ်ႋလ်ှ။",
        "filepage-nofile": "လ်ုမၠိင်ယိုဝ် ဖိုင်ႋမိင်မိင် လ်ုအှ်ၜး။",
        "upload-disallowed-here": "ၮ်ု File အ်ုယိုဝ် ဖိုဟ်ထိုင့်သာ ကီလ်ုၮေဝ်ၜး။",
+       "filedelete-submit": "ထုဂ်ဆိင့်",
        "randompage": "ဆ်ုတံင်ဏံင်းလိက်မေံၜၠါ်",
        "statistics": "စ်ုရင့်ကါင်ကါ",
        "double-redirect-fixer": "ထါင်ၮဲအ်ုထိုဝ်အင်းတင်ဆာ",
+       "brokenredirects-delete": "ထုဂ်ဆိင့်",
        "nbytes": "$1 {{PLURAL:$1|ဘိုက်|ဘိုက်လ်ုဖး}}",
        "nmembers": "ကုံလွာဲဆာ $1 {{PLURAL:$1|ၮါင်း|ၮါင်းလ်ုဖး}}",
        "prefixindex": "အ်ုမေံယာ့ prefix အှ် လိက်မေံၜၠါ်လုက်ဆိင့်",
        "wlshowlast": "လါင်ခါင့်ထုက် $1 နာႋဍီ $2 သင့်  အိုဝ်မ်ုၮဲ",
        "watchlist-options": "ခီုဝ်ယောဝ်ႋစ်ုရင့်သယ်ၯင်း လုဲႋၮေဝ်ထလ်ုဖး",
        "enotif_reset": "လိက်မေံၜၠါ်လုက်ဆိင့် ယောဝ်ႋၯံင်ဆ်ုပ်ုယှောဝ်ႋ မ်ုမါၮါင်း",
+       "deletepage": "မ်ုထုဂ်ဆိင့်လိက်‌မေံၜၠါ်",
+       "delete-confirm": "မ်ုထုဂ်ဆိင့် \"$1\"",
+       "delete-legend": "ထုဂ်ဆိင့်",
        "dellogpage": "မာဆိင့်ထ အ်ုၮါင်း",
        "rollbacklink": "မ်ုလေဝ်ႋထါင် လင်ဍာ",
        "rollbacklinkcount": "{{PLURAL:$1|ဆ်ုအင်းတင်|ဆ်ုအင်းတင်လ်ုဖး}} $1 အိုဝ် ထါင်အင်းလဲါထါင်",
        "tooltip-pt-logout": "တါ်ထင်း",
        "tooltip-pt-createaccount": "တါင်ၮ်ုဆ်ုမာဝံင် အွးဖှ်ေလာ။ လာၮင့်သီး ၮ်ုဆ်ုမာလ်ှ။",
        "tooltip-ca-talk": "ပ်ုယုံ့ခေါဟ်တင် လိက်မေံၜၠါ်ၯံင် ဆ်ုခၠါင်ကါင်ကါလ်ုဖး",
-       "tooltip-ca-edit": "á\80\9cá\80­á\80\80á\80ºá\80\99á\80±á\80¶á\80¡á\80ºá\80¯á\80\9aá\80­á\80¯á\80\9dá\80º á\80\99á\80¬á\81®á\80±á\80\9dá\80ºထိုဝ်ၜုဂ်",
+       "tooltip-ca-edit": "á\80\9cá\80­á\80\80á\80ºá\80\99á\80±á\80¶á\80¡á\80ºá\80¯á\80\9aá\80­á\80¯á\80\9dá\80º á\80\99á\80¬á\80\8fá\80±á\80\9dá\80ºá\82\8bထိုဝ်ၜုဂ်",
        "tooltip-ca-addsection": "ကၞါင့်သံင်လ်ုဍူ ပ္တုံသံင်ၜိုဒ်",
        "tooltip-ca-viewsource": "လိက်မေံယိုဝ် လ်ုအင်းတင်ႋခဝ့် ပၠယ်တဝ်ဝေ့အေး။ ၮ်ုယောဝ်ႋ လိက်အ်ုဍံင်ၮေဝ်ႋလှ်။",
        "tooltip-ca-history": "လိက်မေံအ်ုယိုဝ် အ်ုလင်ႋလီအး",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|လိက်ထိက်ၜုဂ်|လိက်ထိက်ၜုဂ်လ်ုဖး}}]]: $2",
        "tags-active-yes": "မွာဲ",
        "tags-active-no": "လ်ုမွာဲၜး",
+       "tags-delete": "ထုဂ်ဆိင့်",
        "tags-hitcount": "ဆ်ုအင်းလယ် $1 {{PLURAL:$1|ၮါင်း|ၮါင်းလ်ုဖး}}",
        "tags-edit-existing-tags-none": "အှ်ဏင်မိင်အေ",
        "htmlform-yes": "မွာဲ",
        "logentry-upload-upload": "$1 ၮှ် $3 အိုဝ် {{GENDER:$2|upload ဆောဟ်ထါင်ႋ}}",
        "logentry-upload-overwrite": "$3 ၮှ်ခဝ့် ဗားရှင်းအ်ုသင့်အိုဝ် $1 {{GENDER:$2|upload ပ္တုံထုင်းထဆေဝ်ႋ}}",
        "rightsnone": "(ပၠဝ်ပြေ)",
+       "feedback-thanks-title": "ဆ်ုဂုဏ်လှ်။",
        "searchsuggest-search": "{{SITENAME}} ဖိုင် မ်ုအင်းၰူ့",
        "duration-days": "$1 {{PLURAL:$1|မူႋသင့်|မူႋသင့်လ်ုဖး}}",
        "pagelang-select-lang": "မ်ုလုဲႋ ဆ်ုခၠါင်ဘာႋသာ့",
index 19e8e6b..d8e4f84 100644 (file)
        "defaultmessagetext": "기본 메시지 글",
        "content-failed-to-parse": "$1 모델에 대한 $2 내용을 구문 분석하는 데 실패했습니다: $3",
        "invalid-content-data": "잘못된 내용 데이터입니다",
-       "content-not-allowed-here": "\"$1\" ë\82´ì\9a©ì\9d\80 ì\8a¬ë¡\9d \"$3\"의 [[:$2]] 문서에 허용하지 않습니다",
+       "content-not-allowed-here": "\"$1\" ë\82´ì\9a©ì\9d\80 ì\8a¬ë¡¯ \"$3\"의 [[:$2]] 문서에 허용하지 않습니다",
        "editwarning-warning": "이 페이지에서 벗어나면 저장하지 않은 바뀜이 모두 사라집니다.\n로그인을 했다면, 환경 설정의 \"{{int:prefs-editing}}\"에서 이 경고를 띄우지 않도록 설정할 수 있습니다.",
        "editpage-invalidcontentmodel-title": "지원하지 않는 콘텐츠 모델",
        "editpage-invalidcontentmodel-text": "\"$1\" 콘텐츠 모델은 지원되지 않습니다.",
index df84bcc..ab71fe3 100644 (file)
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|दिन}} पहिने",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|घंटा}} पहिने",
        "rcfilters-quickfilters": "फ़िल्टर संरक्षण करू",
+       "rcfilters-savedqueries-defaultlabel": "फ़िल्टर संरक्षण करू",
        "rcfilters-savedqueries-rename": "नाम बदलु",
        "rcfilters-savedqueries-setdefault": "मूल के रूप मे राखु",
        "rcfilters-savedqueries-remove": "मेटाबी",
        "rcfilters-filtergroup-changetype": "बदल क प्रकार:",
        "rcfilters-filter-pageedits-label": "पन्नाक संपादनसभ",
        "rcfilters-filter-newpages-label": "प्रयोक्ता रचना लग",
+       "rcfilters-filtergroup-lastRevision": "नूतन संशोधन",
+       "rcfilters-filter-lastrevision-label": "नूतन संशोधन",
+       "rcfilters-filter-excluded": "अपवर्जित",
+       "rcfilters-view-tags": "पन्नाक संपादनसभ",
        "rcfilters-liveupdates-button": "अखुनका अद्यतन",
        "rcfilters-target-page-placeholder": "पृष्ठ(अथवा श्रेणी) क नाम भरू",
        "rcnotefrom": "नीचाँमे '''$2''' सँ भेल परिवर्तन अछि ('''$1''' धरि देखाएल)।",
        "speciallogtitlelabel": "प्रयोजन (शीर्षक अथवा {{ns:user}}:प्रयोगकर्तानाम):",
        "log": "लौग",
        "logeventslist-submit": "देखाबी",
+       "logeventslist-patrol-log": "परीक्षण लग",
+       "logeventslist-tag-log": "ट्याग लग",
        "all-logs-page": "सभ सार्वजनिक लौग",
        "alllogstext": "{{अन्तर्जाल}} क सभटा उपलब्ध वृत्तलेखक संयुक्त दृश्य।\nअहाँ दृश्यकेँ संकीर्ण करबा लेल वृत्तलेखक एकटा प्रकार चुनि सकै छी, प्रयोक्तानाम (ब्रह्मक्षर-लघ्वक्षर विचारणीय), वा प्रभावित पन्ना (एतौ ब्रह्मक्षर-लघ्वक्षर विचारणीय)।",
        "logempty": "वृत्तलेखमे कोनो मेल खाइबला बौस्तु नै।",
        "dellogpagetext": "नीचाँ एकदम लगक मेटाएल पन्नाकऽ सूची छी।",
        "deletionlog": "मेटाएल लौग",
        "log-name-create": "प्रयोक्ता रचना लग",
+       "log-description-create": "नीचाँ एकदम लगक मेटाएल पन्नाकऽ सूची छी।",
+       "logentry-create-create": "$1 {{GENDER:$2|दबाएल}} page $3",
        "reverted": "पुरान कोनो संशोधन धरि घुराउ",
        "deletecomment": "कारण:",
        "deleteotherreason": "दोसर/ अतिरिक्त कारण:",
        "uctop": "शिखर",
        "month": "माससँ (आ पहिने)",
        "year": "ई साल (आ पहिने)",
+       "date": "माससँ (आ पहिने)",
        "sp-contributions-newbies": "मात्र नव खाताक योगदान देखाबी",
        "sp-contributions-newbies-sub": "नब प्रयोक्ताकऽ लेल",
        "sp-contributions-newbies-title": "नब प्रयोक्ताकऽ योगदान",
        "ipb-disableusertalk": "ऐ प्रयोक्ताकेँ प्रतिबन्ध अवधिमे अपन वार्ता पन्नाक सम्पादनसँ रोकू।",
        "ipb-change-block": "प्रयोक्ताकें  पुनः प्रतिबन्धित करू ई विकल्पक संग",
        "ipb-confirm": "प्रतिबन्ध सुनिश्चित करू",
+       "ipb-partial": "आंशिक",
+       "ipb-type-label": "प्रकार",
+       "ipb-pages-label": "पन्ना",
        "badipaddress": "अमान्य आईपी पता",
        "blockipsuccesssub": "प्रतिबन्ध सफल भेल",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] प्रतिबन्धित कएल गेल।<br />\nदेखू [[Special:BlockList|IP block list]] प्रतिबन्धक पुनरीक्षण लेल।",
        "blocklist": "प्रतिबन्धित प्रयोक्ता सभ",
        "autoblocklist": "स्वतः प्रतिबन्धित",
        "autoblocklist-submit": "खोज",
+       "autoblocklist-legend": "स्वतः अवरोध सूची",
        "autoblocklist-empty": "प्रतिबन्धसूची खाली अछि।",
        "ipblocklist": "प्रतिबन्धित प्रयोक्ता सभ",
        "ipblocklist-legend": "प्रतिबन्धित प्रयोक्ताकेँ ताकू",
        "createaccountblock": "लेखा निर्माण अशक्त कएल",
        "emailblock": "ई-पत्र प्रतिबन्धित",
        "blocklist-nousertalk": "अपन वार्ता पन्ना सम्पादित नै कऽ सकब",
+       "blocklist-editing": "सम्पादन कऽ रहल छी",
        "ipblocklist-empty": "प्रतिबन्धसूची खाली अछि।",
        "ipblocklist-no-results": "आग्रह कएल अनिकेत वा प्रयोक्तानाम प्रतिबन्धित नै कएल गेल।",
        "blocklink": "प्रतिबन्धित",
        "movenotallowedfile": "अहाँकेँ संचिका सभकेँ घसकेबाक अधिकार नै अछि।",
        "cant-move-user-page": "अहाँकेँ प्रयोक्ता पन्ना सभकेँ घसकेबाक अधिकार नै अछि (उपपन्ना सभकेँ छोड़ि कऽ)।",
        "cant-move-to-user-page": "अहाँकेँ कोनो पन्नाकेँ प्रयोक्ता पन्ना लग घसकेबाक अधिकार नै अछि (प्रयोक्ता उपपन्ना लग छोड़ि कऽ)।",
+       "cant-move-subpages": "अहाँकेँ पन्ना घसकेबाक अधिकार नै अछि।",
        "newtitle": "नव शीर्षक:",
        "move-watch": "लिङ्क पन्ना आ लक्षित पन्ना देखी",
        "movepagebtn": "नाम परिवर्तन करी",
        "movelogpagetext": "नाम बदलल गेल लेख कऽ सूचि नीचां देल गेल अछि",
        "movesubpage": "{{PLURAL:$1|उप पन्ना|उप पन्ना}}",
        "movesubpagetext": "नीचां $1 {{PLURAL:$1| पन्ना देखाओल गएल अछि, जे अहि पन्नाकऽ उप पन्ना अछि|पन्ना देखावोल गएल अछि, जे अहि पन्नाकऽ उप पन्ना अछि}}।",
+       "movesubpagetalktext": "नीचां $1 {{PLURAL:$1| पन्ना देखाओल गएल अछि, जे अहि पन्नाकऽ उप पन्ना अछि|पन्ना देखावोल गएल अछि, जे अहि पन्नाकऽ उप पन्ना अछि}}।",
        "movenosubpage": "अहि पन्ना कऽ कोनो उप पन्ना नहि अछि।",
        "movereason": "कारण:",
        "revertmove": "पूर्ववत्",
        "previousdiff": "← पुरान सम्पादन",
        "nextdiff": "नव सम्पादन →",
        "mediawarning": "'''चेतौनी''': ई संचिका प्रकार विषाणु कूटशब्द युक्त रहि सकैए।\nएकरा प्रयोग केलापर अहाँक तंत्रकेँ किछु समझौता करऽ पड़ि सकै छै।",
-       "imagemaxsize": "à¤\9aितà¥\8dर à¤\86à¤\95ारà¤\95 à¤¸à¥\80मा:<br />''(सà¤\82à¤\9aिà¤\95ा à¤µà¤°à¥\8dणन à¤ªà¤¨à¥\8dना à¤²à¥\87ल)''",
+       "imagemaxsize": "सà¤\82à¤\9aिà¤\95ा à¤µà¤°à¥\8dणन à¤ªà¤¨à¥\8dना à¤²à¥\87ल à¤\9aितà¥\8dर à¤\86à¤\95ारà¤\95 à¤¸à¥\80मा:",
        "thumbsize": "संकुचितचित्र आकार:",
        "widthheight": "$1 × $2",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|पन्ना|पन्ना सभ}}",
        "confirm-unwatch-top": "ऐ पन्नाकेँ हमर साकांक्ष सूचीसँ हटाउ",
        "confirm-rollback-button": "ठीक अछि",
        "confirm-rollback-top": "ई पृष्ठ सम्पादन पूर्ववत करी?",
+       "confirm-mcrrestore-title": "संशोधन सभकेँ घुराउ",
+       "confirm-mcrundo-title": "परिवर्तन पुरान स्थिति पर आनी",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← पहिलुका पृष्ठ",
        "imgmultipagenext": "अगुलका पृष्ठ →",
        "tags-deactivate": "निष्क्रिय करी",
        "tags-hitcount": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तनसभ}}",
        "tags-manage-no-permission": "अहाँकेँ पन्ना घसकेबाक अधिकार नै अछि।",
-       "tags-manage-blocked": "अहाँ प्रतिबन्धित रहैत समय ट्यागमे कोनो जोडए या हटाबैक कार्य नै करि सकैत छी।",
+       "tags-manage-blocked": "अहाँक {{GENDER:$1|you}} प्रतिबन्धित रहैत समय ट्यागमे कोनो जोडए या हटाबैक कार्य नै करि सकैत छी।",
        "tags-create-heading": "एकटा नयाँ विकि-समूह बनाबु",
        "tags-create-explanation": "पुनः निर्धारित रूप से, नवनिर्मित टैग प्रयोगकर्तासभ आर बॉट के लेल हाजीर राहत।",
        "tags-create-tag-name": "चेन्हक नाम:",
        "compare-title-not-exists": "जे शीर्षक अहाँ कहलौं से अछिये नै।",
        "compare-revision-not-exists": "जे संशोधन अहाँ कहलौं से अछिये नै।",
        "diff-form": "अन्तर",
+       "diff-form-submit": "(कोनो अंतर नै)",
        "permanentlink": "स्थायी लिङ्क",
        "permanentlink-revid": "संशोधन",
        "permanentlink-submit": "संशोधन में जाउ",
        "htmlform-date-placeholder": "YYYY-MM-DD",
        "htmlform-time-placeholder": "HH:MM:SS",
        "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
-       "htmlform-title-not-exists": "अस्तित्व में नहि अछि",
+       "htmlform-title-not-exists": "$1 अस्तित्व में नै अछि",
+       "htmlform-user-not-exists": "'''$1''' नै अछि।",
        "logentry-delete-delete": "$1 पृष्ठ $3 {{GENDER:$2|मेटौलक}}",
        "logentry-delete-restore": "$1 {{GENDER:$2|restored}} page $3",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|दबाएल}} page $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 revision|$1 revisions}} घुराएल",
+       "restore-count-files": "{{PLURAL:$1|1 संचिका|$1 संचिका सभ}} आनल",
        "logentry-delete-event": "$1द्वारा $3 पृष्ठक लौग {{PLURAL:$5|प्रविष्टि|प्रविष्टिसभ}}क दृश्यता {{GENDER:$2|परिवर्तित केलक}}: $4",
        "logentry-delete-revision": "$1 द्वारा $3 पृष्ठक {{PLURAL:$5|एक अवतरण|$5 अवतरणसभ}}क दृश्यता {{GENDER:$2|परिवर्तित}}: $4",
        "logentry-delete-event-legacy": "$1द्वारा $3 पृष्ठ पर लौग क्रियासभक दृश्यता {{GENDER:$2|परिवर्तित केलक}}",
        "logentry-newusers-byemail": "$1 द्वारा प्रयोक्ता खाता $3 {{GENDER:$2|बनाओल}} गेल आ कूटशब्द ई-पत्र द्वारा भेजल गेल",
        "logentry-newusers-autocreate": "खाता $1 छल {{GENDER:$2|बनाएल}} स्वतः",
        "logentry-upload-upload": "$1 {{GENDER:$2|ए}} $3 अपलोड केलक",
+       "logentry-managetags-create": "$1 {{GENDER:$2|दबाएल}} page $3",
        "log-name-tag": "ट्याग लौग",
        "rightsnone": "(कोनो नै)",
        "feedback-adding": "पन्ना उपर प्रतिक्रिया जोडु ...",
        "pagelang-language": "भाषा",
        "pagelang-use-default": "डिफल्ट भाषा प्रयोग करी",
        "pagelang-select-lang": "भाषा चुनु",
+       "pagelang-reason": "कारण",
        "pagelang-submit": "भेजी",
+       "pagelang-nonexistent-page": "$1 पृष्ठ अस्तित्वमे नै अछि।",
        "right-pagelang": "पृष्ठ भाषा परिवर्तन करी",
        "action-pagelang": "पृष्ठ भाषा परिवर्तन करी",
        "log-name-pagelang": "भाषा परिवर्तन लग",
        "log-description-pagelang": "ई पृष्ठ भाषासभमे परिवर्तनक लग छी।",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|बदलि देल गेल}} पृष्ठ भाषा $3 क लेल $4 सँ $5।",
        "mediastatistics": "मिडिया तथ्याङ्क",
+       "mediastatistics-table-mimetype": "माइम प्रकार",
+       "mediastatistics-table-count": "फाइल सभके संख्या",
+       "mediastatistics-header-unknown": "अज्ञात",
+       "mediastatistics-header-audio": "ऑडियो",
+       "mediastatistics-header-video": "भिडियो",
+       "mediastatistics-header-total": "सभ फ़िल्टर",
        "special-characters-group-latin": "ल्याटिन",
        "special-characters-group-latinextended": "ल्याटिन विस्तारित",
        "special-characters-group-ipa": "आइपीए",
        "special-characters-title-endash": "एन डैश",
        "special-characters-title-emdash": "एम डैश",
        "special-characters-title-minus": "ऋण चिह्न",
+       "mw-widgets-categoryselector-add-category-placeholder": "श्रेणी जोड़",
+       "mw-widgets-usersmultiselect-placeholder": "और जोड़ु",
+       "mw-widgets-titlesmultiselect-placeholder": "और जोड़ु",
+       "date-range-from": "दिन से (शुरू):",
+       "date-range-to": "दिन तक (समाप्त):",
+       "sessionprovider-generic": "$1 सत्र",
        "randomrootpage": "अविशिष्ट मूल पृष्ठ",
        "log-action-filter-block": "प्रतिबन्धक प्रकार:",
        "log-action-filter-delete": "मेटबैक प्रकार:",
        "log-action-filter-block-block": "अवरोध",
        "log-action-filter-block-reblock": "अवरोध परिवर्तन",
        "log-action-filter-block-unblock": "अवरोधरहित",
-       "log-action-filter-contentmodel-change": "सामग्रीक नमूना परिवर्तन"
+       "log-action-filter-contentmodel-change": "सामग्रीक नमूना परिवर्तन",
+       "log-action-filter-delete-revision": "खाली मेटाएल",
+       "log-action-filter-managetags-create": "प्रयोक्ता रचना लग",
+       "log-action-filter-newusers-create": "अज्ञात सदस्य द्वारा निर्मित",
+       "log-action-filter-newusers-autocreate": "स्वचालित निर्माण",
+       "log-action-filter-protect-protect": "सुरक्षा",
+       "log-action-filter-protect-modify": "सुरक्षा परिवर्तन",
+       "log-action-filter-protect-unprotect": "असुरक्षा",
+       "log-action-filter-protect-move_prot": "पन्ना संरक्षण",
+       "log-action-filter-rights-autopromote": "स्वतः परिवर्तन",
+       "log-action-filter-suppress-event": "लॉग अवरोध",
+       "log-action-filter-suppress-revision": "संशोधन अवरोध",
+       "log-action-filter-suppress-delete": "पृष्ठ अवरोध",
+       "log-action-filter-upload-upload": "नया अपलोड",
+       "authmanager-create-disabled": "लेखा निर्माण अशक्त कएल",
+       "authmanager-userdoesnotexist": "प्रयोक्ता खाता \"$1\" पंजीकृत नै अछि।",
+       "authmanager-email-label": "इमेल",
+       "authmanager-email-help": "ई-पत्र ठेगान:",
+       "authmanager-realname-label": "असली नाम",
+       "authmanager-provider-temporarypassword": "तात्कालिक कूटशब्द:",
+       "authprovider-resetpass-skip-label": "छाेड",
+       "authform-wrongtoken": "गलत टोकन",
+       "cannotauth-not-allowed-title": "अनुमति नै मिलली।",
+       "changecredentials": "साख बदल",
+       "changecredentials-submit": "साख बदल",
+       "removecredentials": "परिचय निकाल",
+       "credentialsform-provider": "परिचय प्रकार :",
+       "credentialsform-account": "खाता क नाम:",
+       "restrictionsfield-badip": "अमान्य अनिकेत क्षेत्र: $1",
+       "edit-error-short": "त्रुटि: $1",
+       "edit-error-long": "त्रुटि:\n\n$1",
+       "revid": "संशोधन $1",
+       "pageid": "पेज आईडी $1",
+       "pagedata-bad-title": "अवैध शीर्षक: $1.",
+       "passwordpolicies-group": "समूह",
+       "passwordpolicies-policies": "राजनीति",
+       "passwordpolicies-policy-minimalpasswordlength": "कूटशब्द कमसँ कम {{PLURAL:$1|1 वर्ण|$1 वर्णक}} हुअए।"
 }
index 1b35077..b9b6c35 100644 (file)
        "rcfilters-watchlist-edit-watchlist-button": "Уреди набљудувани",
        "rcfilters-watchlist-showupdated": "Промени во страниците што ги немате посетено откако се случиле се <strong>задебелени</strong>.",
        "rcfilters-preference-label": "Користи посредник без JavaScript",
-       "rcfilters-preference-help": "Ги вчитува скорешните промени без филтри или можност за истакнување.",
+       "rcfilters-preference-help": "Ги вчитува скорешните промени без филтерско пребарување или можност за истакнување.",
        "rcfilters-watchlist-preference-label": "Користи посредник без JavaScript",
-       "rcfilters-watchlist-preference-help": "Ги вчитува набљудуваните без филтри или можност за истакнување.",
+       "rcfilters-watchlist-preference-help": "Ги вчитува набљудуваните без филтерско пребарување или можност за истакнување.",
        "rcfilters-filter-showlinkedfrom-label": "Прикажи промени во страници кои водат од",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Страници кон кои води</strong> избраната страница",
        "rcfilters-filter-showlinkedto-label": "Прикажи промени во страници кои водат кон",
        "move": "Премести",
        "movethispage": "Премести ја страницава",
        "unusedimagestext": "Следниве податотеки постојат, но не се вметнати во ниедна страница.\nИмајте предвид дека други мрежни места може да ставаат врски до неа со непосредна URL-адреса, и затоа може да е наведена овде и покрај тоа што е во активна употреба.",
+       "unusedimagestext-categorizedimgisused": "Следниве податотеки постојат, но не се вметнати во нидна страница. Категоризираните слики се сметаат за употребени, иако не се присутни на ниедна страница.\nИмајте на ум дека други мрежни места може да се повикуваат на податотеката со непосредна URL, и така може да се наведени овде иако се во активна употреба.",
        "unusedcategoriestext": "Следните категории постојат и покрај тоа што ниедна статија и категорија не ги користи.",
        "notargettitle": "Нема цел",
        "notargettext": "Не одредивте целна страница или корисник на кој би се применила функцијата.",
index c5972e6..b2c1a4e 100644 (file)
        "badretype": "तुम्ही टाकलेले परवलीचे शब्द जुळत नाहीत.",
        "usernameinprogress": "या सदस्यनावाचे खाते तयार करण्याचे काम प्रगतीपथावर आहे. कृपया थांबा.",
        "userexists": "तुम्ही टाकलेले सदस्यनाम पूर्वीच वापरात आहे.\nकृपया वेगळे सदस्यनाम निवडा.",
-       "loginerror": "सनà¥\8bà¤\82द-पà¥\8dरवà¥\87शात चूक झाली आहे",
+       "loginerror": "तà¥\81मà¥\8dहà¥\80 à¤\86लà¥\8dयाà¤\9aà¥\80 à¤¨à¥\8bà¤\82द à¤\95रणà¥\8dयात चूक झाली आहे",
        "createacct-error": "खाते तयार करण्यात चुकी",
        "createaccounterror": "हे खाते तयार करता येऊ शकले नाही:$1",
        "nocookiesnew": "सदस्य खाते तयार झाले ,पण तुम्ही सनोंद-प्रवेशित(लॉग्डईन) नाहीत.{{SITENAME}} सदस्यांना सनोंद-प्रवेश देतांना त्यांचे स्मृतिशेष (कुकिज) वापरते.तुम्ही स्मृतिशेष सुविधा अनुपलब्ध ठेवली आहे.ती कृपया उपलब्ध करा,आणि नंतर तुमच्या नवीन सदस्य नावाने आणि परवलीने दाखल व्हा.",
        "nosuchuser": "\"$1\" या नावाचा कोणताही सदस्य नाही.तुमचे शुद्धलेखन तपासा, किंवा [[Special:CreateAccount|नवीन खाते]] तयार करा.",
        "nosuchusershort": "\"$1\" या नावाचा सदस्य नाही. लिहीताना आपली चूक तर नाही ना झाली?",
        "nouserspecified": "तुम्हाला सदस्यनाव नमूद करावे लागेल.",
-       "login-userblocked": "हा à¤¸à¤¦à¤¸à¥\8dय â\80\99पà¥\8dरतिबà¤\82धितâ\80\99 à¤\86हà¥\87. à¤¤à¥\8dयास à¤¸à¤¨à¥\8bà¤\82द-पà¥\8dरवà¥\87शाची परवानगी नाही.",
+       "login-userblocked": "हा à¤¸à¤¦à¤¸à¥\8dय â\80\99पà¥\8dरतिबà¤\82धितâ\80\99 à¤\86हà¥\87. à¤¤à¥\8dयाला à¤\86लà¥\8dयाà¤\9aà¥\80 à¤¨à¥\8bà¤\82द à¤\95रणà¥\8dयाची परवानगी नाही.",
        "wrongpassword": "सदस्यनाव अथवा परवलीचा शब्द चुकीचा टाकण्यात आला आहे. पुन्हा एकदा प्रयत्न करा.",
        "wrongpasswordempty": "परवलीचा शब्द कोरा आहे; पुन्हा प्रयत्न करा.",
        "passwordtooshort": "तुमच्या परवलीच्या शब्दात किमान {{PLURAL:$1|१ अक्षर |$1 अक्षरे}} हवे/हवीत.",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|चर्चा]]) चे सदस्यखाते तयार करण्यात आले आहे.",
        "createaccount-title": "{{SITENAME}} साठी खाते तयार करणे",
        "createaccount-text": "तुमचा विपत्र पत्ता घेउन {{SITENAME}} ($4)वर \"$2\" नावाच्या कोण्या एकाने \"$3\" परवलीने खाते उघडले आहे. कृपया आपण सनोंद-प्रवेश करून आपला परवलीचा शब्द बदलावा.\n\nजर ही खातेनोंदणी चुकिने झाली असेल तर, तुम्ही या संदेशाकडे दुर्लक्ष करू शकता.",
-       "login-throttled": "तà¥\81मà¥\8dहà¥\80 à¤¨à¥\81à¤\95तà¥\87à¤\9a à¤¸à¤¨à¥\8bà¤\82द- à¤ªà¥\8dरवà¥\87शासाठी अनेकानेक प्रयत्न केले आहेत.\nकृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.",
+       "login-throttled": "तà¥\81मà¥\8dहà¥\80 à¤¨à¥\81à¤\95तà¥\87à¤\9a à¤\86लà¥\8dयाà¤\9aà¥\80 à¤¨à¥\8bà¤\82द à¤\95रणà¥\8dयासाठी अनेकानेक प्रयत्न केले आहेत.\nकृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.",
        "login-abort-generic": "तुमचा प्रवेश अयशस्वी होऊन रद्द झाला.",
        "login-migrated-generic": "आपल्या खात्याचे स्थलांतर झाले आहे,या विकिवर आपले सदस्यनाव आता यापुढे अस्तित्वात राहणार नाही.",
        "loginlanguagelabel": "भाषा: $1",
        "createacct-another-realname-tip": "आपले खरे नाव टाकणे वैकल्पिक आहे.\nजर आपण ते द्यायचे ठरविले तर,ते आपल्या कामाचा मूळ स्रोत म्णून देण्यास वापरले जाईल.",
        "pt-login": "सनोंद-प्रवेश करा",
        "pt-login-button": "सनोंद-प्रवेश करा",
-       "pt-login-continue-button": "लà¥\89à¤\97िन à¤¸à¥\81रà¥\82 ठेवा",
+       "pt-login-continue-button": "à¤\86लà¥\8dयाà¤\9aà¥\80 à¤¨à¥\8bà¤\82द à¤¤à¤¶à¥\80à¤\9a ठेवा",
        "pt-createaccount": "खाते बनवा",
        "pt-userlogout": "सनोंद-निर्गम",
        "php-mail-error-unknown": "पीएचपीच्या विपत्र() पर्यायात अज्ञात चूक",
        "retypenew": "पुन्हा एकदा परवलीचा शब्द टंका:",
        "resetpass_submit": "परवलीचा शब्द टाका आणि सनोंद-प्रवेश करा",
        "changepassword-success": "तुमचा परवलीचा शब्द बदललेला आहे!",
-       "changepassword-throttled": "तà¥\81मà¥\8dहà¥\80 à¤¨à¥\81à¤\95तà¥\87à¤\9a à¤¸à¤¨à¥\8bà¤\82द- à¤ªà¥\8dरवà¥\87शासाठी अनेकानेक प्रयत्न केले आहेत.\nकृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.",
+       "changepassword-throttled": "तà¥\81मà¥\8dहà¥\80 à¤¨à¥\81à¤\95तà¥\87à¤\9a à¤\86लà¥\8dयाà¤\9aà¥\80 à¤¨à¥\8bà¤\82द à¤\95रणà¥\8dयासाठी अनेकानेक प्रयत्न केले आहेत.\nकृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.",
        "botpasswords": "सांगकाम्याचे परवलीचे शब्द",
        "botpasswords-summary": "<em>सांगकाम्याचे परवलीचे शब्द</em>हे त्या खात्याची मुख्य सनोंद-प्रवेश अधिकारपत्रे न वापरता, एपीआय मार्फत, सदस्य खात्याच्या प्रवेशास पोहोच देतात.सांगकाम्याचा परवलीचा शब्द वापरुन सनोंद प्रवेश केलेल्यांचे उपलब्ध सदस्य अधिकार प्रतिबंधित असू शकतात.\n\nजर आपणास कळत नसेल आपण हे कां करीत आहोत,तर आपण ते बहुतेक करावयास नको.कोणीही आपणास असे कधीही सांगु नये कि यापैकी एखादे उत्पादित करा व त्यांना द्या.",
        "botpasswords-disabled": "सांगकाम्यांचे परवलीचे शब्द अक्षम केले आहेत.",
        "botpasswords-deleted-body": "{{GENDER:$2|सदस्य}} \"$2\" साठी,\"$1\" या सांगकाम्याच्या नावाचा परवलीचा शब्द वगळला.",
        "botpasswords-newpassword": "<strong>$1</strong>द्वारे सनोंद प्रवेशास नविन परवलीचा शब्द <strong>$2</strong>आहे. <em>कृपया याची भविष्यातील संदर्भासाठी नोंद ठेवा.</em>(जून्या सांगकाम्यांसाठी, ज्यांचेसाठी सदस्यनाम हे मूळ सदस्यनावच असणे आवश्यक आहे, आपण  <strong>$3</strong> हे सदस्यनाम म्हणून व <strong>$4</strong> हा परवलीचा शब्द म्हणून वापरू शकता.)",
        "botpasswords-no-provider": "सांगकाम्यापरवलीशब्दसत्रपुरवठादार उपलब्ध नाही.",
-       "botpasswords-restriction-failed": "साà¤\82à¤\97à¤\95ामà¥\8dया à¤ªà¤°à¤µà¤²à¥\80à¤\9aà¥\8dया à¤¶à¤¬à¥\8dदावर à¤\85सलà¥\87लà¥\87 à¤ªà¥\8dरतिबà¤\82ध à¤¯à¤¾ à¤¸à¤¨à¥\8bà¤\82द à¤ªà¥\8dरवà¥\87शास à¤\85à¤\9fà¤\95ाव à¤\95रà¥\80त आहेत.",
+       "botpasswords-restriction-failed": "साà¤\82à¤\97à¤\95ामà¥\8dया à¤ªà¤°à¤µà¤²à¥\80à¤\9aà¥\8dया à¤¶à¤¬à¥\8dदावर à¤\85सलà¥\87लà¥\87 à¤ªà¥\8dरतिबà¤\82ध à¤¯à¤¾ à¤\86लà¥\8dयाà¤\9aà¥\80 à¤¨à¥\8bà¤\82द à¤\95रणà¥\8dयास à¤¥à¤¾à¤\82बवित आहेत.",
        "botpasswords-invalid-name": "नमूद केलेल्या सदस्यनावात सांगकाम्याचा परवलीचा शब्द-विभाजक (\"$1\") नाही.",
        "botpasswords-not-exist": "सदस्य \"$1\" चा \"$2\" नावाचा सांगकाम्या परवलीचा शब्द नाही.",
+       "botpasswords-locked": "तुम्ही तुमच्या सांगकाम्या खात्यावरून आल्याची नोंद करू शकत नाही, हे खाते बंद केले गेले आहे.",
        "resetpass_forbidden": "परवलीचे शब्द बदलता येत नाहीत.",
        "resetpass_forbidden-reason": "परवलीचे शब्द बदलता येऊ शकत नाहीत:$1",
        "resetpass-no-info": "या पानामध्ये थेट जाण्यासाठी तुम्हास  सनोंद-प्रवेशित असावयास हवे.",
        "changeemail-none": "(काहीही नाही)",
        "changeemail-password": "तुमचा {{SITENAME}} परवलीचा शब्द:",
        "changeemail-submit": "ईमेल बदला",
-       "changeemail-throttled": "तà¥\81मà¥\8dहà¥\80 à¤¨à¥\81à¤\95तà¥\87à¤\9a à¤¸à¤¨à¥\8bà¤\82द- à¤ªà¥\8dरवà¥\87शासाठà¥\80 à¤\85नेक प्रयत्न केले आहेत.\nकृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.",
+       "changeemail-throttled": "तà¥\81मà¥\8dहà¥\80 à¤¨à¥\81à¤\95तà¥\87à¤\9a à¤\86लà¥\8dयाà¤\9aà¥\80 à¤¨à¥\8bà¤\82द à¤\95रणà¥\8dयासाठà¥\80 à¤\85नà¥\87à¤\95ानेक प्रयत्न केले आहेत.\nकृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.",
        "changeemail-nochange": "कृपया  वेगळा नविन विपत्रपत्ता टाका.",
        "resettokens": "ओळखचिन्ह (टोकन) पुनर्स्थापित करा",
        "resettokens-text": "येथे आपल्या खात्यात असलेला व्यक्तिगत मजकूरापर्यंत पोचण्यासाठी आपण ओळखचिन्ह(टोकन) पुनर्स्थापित करू शकता.\nआपण जर तो अपघाताने कोणासमवेत सहभागीला असेल किंवा आपले खात्याची आपण तडजोड केली असल्यास, हे करावयास हवे.",
        "confirmedittext": "तुम्ही संपादने करण्यापूर्वी तुमचा विपत्र पत्ता प्रमाणित करणे आवश्यक आहे. तुमचा विपत्र पत्ता तुमच्या [[Special:Preferences|सदस्य पसंती]]तून लिहा व सिद्ध करा.",
        "nosuchsectiontitle": "असा विभाग नाही.",
        "nosuchsectiontext": "तुम्ही अस्तिवात नसलेला विभाग संपादन करण्याचा प्रयत्न केला आहे.हे पान आपण बघत असतांना तो हलविल्या किंवा वगळल्या गेला आहे.",
-       "loginreqtitle": "सनà¥\8bà¤\82द-पà¥\8dरवà¥\87श आवश्यक आहे",
+       "loginreqtitle": "à¤\86लà¥\8dयाà¤\9aà¥\80 à¤¨à¥\8bà¤\82द à¤\95रणà¥\87 आवश्यक आहे",
        "loginreqlink": "\nसनोंद-प्रवेश करा",
        "loginreqpagetext": "तुम्ही इतर पाने पहाण्याकरिता $1 केलेच पाहिजे.",
        "accmailtitle": "परवलीचा शब्द पाठविण्यात आलेला आहे.",
        "prefs-displaywatchlist": "प्रदर्शन पर्याय",
        "prefs-tokenwatchlist": "ओळखचिन्ह",
        "prefs-diffs": "फरक",
-       "prefs-help-prefershttps": "हा à¤ªà¤¸à¤\82तà¥\80à¤\95à¥\8dरम à¤\86पलà¥\8dया à¤ªà¥\81ढà¥\80ल à¤¸à¤¨à¥\8bà¤\82द à¤ªà¥\8dरवà¥\87शानंतर कार्यान्वित होईल.",
+       "prefs-help-prefershttps": "हा à¤ªà¤¸à¤\82तà¥\80à¤\95à¥\8dरम à¤\86पलà¥\8dया à¤ªà¥\81ढà¥\80ल à¤\86लà¥\8dयाà¤\9aà¥\80 à¤¨à¥\8bà¤\82द à¤\95à¥\87लà¥\8dयानंतर कार्यान्वित होईल.",
        "prefswarning-warning": "आपण आपल्या पसंतीक्रमात केलेला बदल अद्याप जतन झाला नाही.जर आपण \"$1\" न टिचकता, या पानावरुन दुसरीकडे गेलात तर आपला पसंतीक्रम अद्यतन होणार नाही.",
        "prefs-tabs-navigation-hint": "उपयुक्त सूचना:आपण कळींच्या यादीत, कळींदरम्यानच्या सुचालनास डावी व उजवी बाण-कळ वापरु शकता.",
        "userrights": "सदस्य अधिकार",
index 337a2f2..8dbab6d 100644 (file)
@@ -25,7 +25,8 @@
                        "Nemo bis",
                        "Stephanecbisson",
                        "Fitoschido",
-                       "Dr Lotus Black"
+                       "Dr Lotus Black",
+                       "Rul1902"
                ]
        },
        "tog-underline": "လင့်ကို မျဉ်းသားသည့် ပုံစံ:",
        "edit-already-exists": "စာမျက်နှာအသစ်တစ်ခု မဖန်တီးနိုင်ပါ။\nယင်းစာမျက်နှာ တည်ရှိပြီး ဖြစ်သည်။",
        "defaultmessagetext": "ပုံမှန် အသိပေးချက် စာသား",
        "invalid-content-data": "မဆီလျော်သော မာတိကာဒေတာ",
-       "content-not-allowed-here": "\"$1\" မာတိကာကို [[:$2]] စာမျက်နှာပေါ်တွင် ခွင့်မပြုပါ။",
+       "content-not-allowed-here": "\"$1\" မာတိကာကို \"$3\" စလုတ်ရှိ [[:$2]] စာမျက်နှာပေါ်တွင် ခွင့်မပြုပါ။",
        "editpage-invalidcontentmodel-title": "မာတိကာမော်ဒယ်သည် မထောက်ပံ့ထားပါ",
        "editpage-invalidcontentmodel-text": "မာတိကာမော်ဒယ် \"$1\" သည် မထောက်ပံ့ထားပါ။",
        "editpage-notsupportedcontentformat-title": "မာတိကာပုံစံသည် မထောက်ပံ့ထားပါ",
        "timezonelegend": "အချိန်ဇုန် -",
        "localtime": "ပြည်တွင်းအချိန် -",
        "timezoneuseserverdefault": "ဝီကီအပြင်အဆင်ကို သုံးရန် ($1)",
-       "timezoneuseoffset": "အခြား (တန်ဖိုးသတ်မှတ်ပေးရန်)",
+       "timezoneuseoffset": "အခြား (specify offset below)",
        "servertime": "ဆာဗာအချိန် -",
        "guesstimezone": "ဘရောက်ဇာမှ ဖြည့်ရန်",
        "timezoneregion-africa": "အာဖရိက",
index 7eabf81..c54380d 100644 (file)
@@ -31,7 +31,8 @@
                        "Nabin Sapkota",
                        "Tulsi Bhagat",
                        "ديفيد",
-                       "Haribanshi"
+                       "Haribanshi",
+                       "Parbat subedi"
                ]
        },
        "tog-underline": "रेखाङ्कित लिङ्क:",
        "editwarning-warning": "यो पृष्ठबाट बाहिर जाँदा तपाईं द्वारा गरिएको कुनै पनि परिवर्तन हराउनेछ।\nयदि तपाईंले लग इन गर्नुभएको छ भने तपाईं यस सूचनालाई देखाउन आफ्नो अभिरूचीहरूको \"{{int:prefs-editing}}\" भागमा गएर बन्द गर्न सक्नुहुन्छ।",
        "editpage-notsupportedcontentformat-title": "सामग्री प्रकार समर्थित छैन",
        "editpage-notsupportedcontentformat-text": "$1 सामग्री स्वरूप $2 सामग्री मोडलद्वारा समर्थित छैन।",
+       "slot-name-main": "मुख्य",
        "content-model-wikitext": "विकिपाठ",
        "content-model-text": "साधारण पाठ",
        "content-model-javascript": "जाभास्क्रिप्ट",
        "prefs-dateformat": "मिति ढाँचा",
        "prefs-timeoffset": "समय अफसेट",
        "prefs-advancedediting": "सामान्य विकल्पहरू",
+       "prefs-developertools": "विकासकर्ता अौजार",
        "prefs-editor": "सम्पादक",
        "prefs-preview": "पूर्वावलोकन",
        "prefs-advancedrc": "उन्नत विकल्पहरू",
        "prefs-advancedwatchlist": "उन्नत विकल्पहरू",
        "prefs-displayrc": "प्रदर्शन विकल्पहरू",
        "prefs-displaywatchlist": "प्रदर्शन विकल्पहरू",
+       "prefs-changesrc": "परिवर्तन देखाउने",
+       "prefs-pageswatchlist": "हेरिएका पृष्ठहरू",
        "prefs-tokenwatchlist": "टोकन",
        "prefs-diffs": "diffs(भिन्नता)",
        "prefs-help-prefershttps": "यो अभिरूची तपाईंको अर्को प्रवेश (लग इन) बाट लागु हुनेछ ।",
        "recentchanges-legend-plusminus": "(''±१२३'')",
        "recentchanges-submit": "देखाउनुहोस्",
        "rcfilters-tag-remove": "'$1' हटाउनुहोस्",
+       "rcfilters-activefilters-hide": "लुकाउने",
+       "rcfilters-activefilters-show": "देखाउने",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|दिन|दिनहरू}}",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|घण्टा|घण्टाहरू}}",
        "rcfilters-savedqueries-setdefault": "पूर्वनिर्धारितको रुपमा सेट गर्नुहोस्",
        "rcfilters-filter-user-experience-level-unregistered-label": "दर्ता नभएकाे",
        "rcfilters-filter-bots-label": "बोट",
        "rcfilters-filter-minor-label": "सामान्य सम्पादनहरू",
+       "rcfilters-filter-watchlist-watched-label": "अवलोकनसूचीमा",
        "rcfilters-filter-watchlistactivity-unseen-label": "नहेरिएका परिवर्तनहरू",
        "rcfilters-filter-watchlistactivity-seen-label": "हेरिएका परिवर्तनहरू",
+       "rcfilters-filtergroup-changetype": "परिवर्तनको प्रकार",
        "rcfilters-filter-pageedits-label": "पृष्ठ सम्पादनहरू",
+       "rcfilters-filter-newpages-label": "बनाइएका पृष्ठहरू",
+       "rcfilters-filter-newpages-description": "नयाँ पृष्ठ निर्माण हुने सम्पादन",
+       "rcfilters-filter-categorization-label": "परिवर्तित श्रेणी",
        "rcfilters-filter-lastrevision-label": "हालको संस्करण",
        "rcnotefrom": "तल <strong>$2</strong> देखि (<strong>$1</strong> सम्म) {{PLURAL:$5|भएका परिवर्तनहरू देखाइएको छ|भएका परिवर्तनहरू देखाइन्छ}}।",
        "rclistfrom": "$3 $2 देखिका नयाँ परिवर्तनहरू देखाउनु",
        "upload-form-label-infoform-description": "वर्णन",
        "upload-form-label-usage-title": "प्रयोग",
        "upload-form-label-usage-filename": "फाइल नाम",
+       "upload-form-label-own-work": "यो मेरो अाफ्नै कार्य हो",
        "upload-form-label-infoform-categories": "श्रेणीहरू",
        "upload-form-label-infoform-date": "मिति",
        "backend-fail-stream": "फाइल ''$1'' प्रवाह गर्न सकिएन ।",
index e75bfc1..e7e428b 100644 (file)
        "rcfilters-watchlist-edit-watchlist-button": "Bewerk uw volglijst",
        "rcfilters-watchlist-showupdated": "Wijzigingen aan pagina's die u niet hebt bezocht sinds de wijzigingen zijn aangebracht, worden <strong>vet</strong> en met gevulde opsommingstekens weergeven.",
        "rcfilters-preference-label": "Gebruik de niet-JavaScript interface",
-       "rcfilters-preference-help": "Laad Recente Wijzigingen zonder filters of markeerfunctionaliteit.",
+       "rcfilters-preference-help": "Laad Recente Wijzigingen zonder filters, zoek- of markeerfunctionaliteit.",
        "rcfilters-watchlist-preference-label": "Gebruik de niet-JavaScript interface",
-       "rcfilters-watchlist-preference-help": "Laad de volglijst zonder filters of markeerfunctionaliteit.",
+       "rcfilters-watchlist-preference-help": "Laad de volglijst zonder filters, zoek- of markeerfunctionaliteit.",
        "rcfilters-filter-showlinkedfrom-label": "Toon wijzigingen op pagina's gekoppeld aan",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Paginas gekoppeld aan</strong> de geselecteerde pagina",
        "rcfilters-filter-showlinkedto-label": "Toon wijzigingen op pagina's gekoppeld naar",
        "move": "Hernoemen",
        "movethispage": "Deze pagina hernoemen",
        "unusedimagestext": "De volgende bestanden zijn aanwezig maar worden nergens gebruikt.\nHet is mogelijk dat er direct verwezen wordt naar een bestand.\nEen bestand kan hier dus ten onrechte opgenomen zijn.",
+       "unusedimagestext-categorizedimgisused": "De volgende bestanden zijn aanwezig maar worden nergens gebruikt. Gecategoriseerde afbeeldingen worden beschouwd als in gebruik, zelfs als ze niet op een pagina gebruikt worden.\nHet is mogelijk dat er direct verwezen wordt naar een bestand. Een bestand kan hier dus ten onrechte opgenomen zijn.",
        "unusedcategoriestext": "Hieronder staan categorieën die zijn aangemaakt, maar door geen enkele pagina of andere categorie gebruikt worden.",
        "notargettitle": "Geen doelpagina",
        "notargettext": "U hebt niet opgegeven voor welke pagina of gebruiker u deze handeling wilt uitvoeren.",
index 39a61e0..e46430e 100644 (file)
        "move": "Mover",
        "movethispage": "Mover esta página",
        "unusedimagestext": "Os seguintes arquivos existem mas não são embutidos em nenhuma página.\nPor favor note que outros websites podem apontar para um arquivo através de um URL direto e, por isso, podem estar a ser listadas aqui, mesmo estando em uso.",
+       "unusedimagestext-categorizedimgisused": "Os arquivos a seguir existem, mas não estão incorporados em nenhuma página. As imagens categorizadas são consideradas usadas apesar de não estarem incorporadas em nenhuma página.\nObserve que outros sites da Web podem vincular a um arquivo com um URL direto e, portanto, ainda podem estar listados aqui, apesar de estarem em uso ativo.",
        "unusedcategoriestext": "As seguintes categorias existem, embora nenhuma página ou categoria faça uso delas.",
        "notargettitle": "Sem alvo",
        "notargettext": "Você não especificou uma página alvo ou um usuário para executar esta função.",
index afc4d65..77b03c8 100644 (file)
        "move": "Mover",
        "movethispage": "Mover esta página",
        "unusedimagestext": "Os seguintes ficheiros existem mas não são usados em nenhuma página.\nNote que outros sítios na Internet podem ter hiperligações para um ficheiro através de um URL direto e, por isso, podem estar listados ficheiros que estão a ser ativamente usados por entidades externas.",
+       "unusedimagestext-categorizedimgisused": "Os seguintes ficheiros existem mas não foram incorporados em nenhuma página. Considera-se que as imagens categorizadas estão a ser usadas, mesmo que não tenham sido incorporadas em nenhuma página.\nNote que é possível que outros sítios da Internet tenham hiperligações para um ficheiro com um URL direto; esse ficheiro poderá aparecer nesta lista, apesar de estar em uso ativo.",
        "unusedcategoriestext": "As seguintes categorias existem, embora nenhuma página ou categoria faça uso delas.",
        "notargettitle": "Sem alvo",
        "notargettext": "Especifique sobre que página alvo ou utilizador pretende executar esta função.",
index 6b9fa15..c0dc7ca 100644 (file)
        "ipb-sitewide": "A type of block the user can select from on [[Special:Block]].",
        "ipb-partial": "A type of block the user can select from on [[Special:Block]].",
        "ipb-type-label": "The label of the type of editing restriction the admin would like to impose on [[Special:Block]].",
-       "ipb-pages-label": "The label for a autocomplete text field to specify pages to block a user from editing on [[Special:Block]].",
+       "ipb-pages-label": "The label for an autocomplete text field to specify pages to block a user from editing on [[Special:Block]].",
        "badipaddress": "An error message shown when one entered an invalid IP address in blocking page.",
        "blockipsuccesssub": "Used as page title in [[Special:Block]].\n\nThis message is the subject for the following message:\n* {{msg-mw|Blockipsuccesstext}}",
        "blockipsuccesstext": "Used in [[Special:Block]].\nThe title (subject) for this message is {{msg-mw|Blockipsuccesssub}}.\n\nParameters:\n* $1 - username, can be used for GENDER",
index 369cc3b..8b75c88 100644 (file)
        "botpasswords-invalid-name": "'U nome de l'utende mise non ge tène 'u separatore pe passuord bot (\"$1\").",
        "botpasswords-not-exist": "Utende \"$1\" non ge tène 'na password bot chiamate \"$2\".",
        "botpasswords-needs-reset": "'A passuord pu bot de nome \"$2\" de l'{{GENDER:$2|utende}} \"$1\" ha state azzerate.",
+       "botpasswords-locked": "Non ge puè trasè cu 'nu passuord bot jndr'à 'u cunde tune ca jè bloccate.",
        "resetpass_forbidden": "Le Password non ge ponne cangià",
        "resetpass_forbidden-reason": "Le passuord non ge ponne essere cangiate: $1",
        "resetpass-no-info": "Tu a essere colleghete pe accedere a sta pàgene direttamende.",
        "passwordreset-emailsentemail": "Ce queste éte 'n'e-mail pu cunde tune, allore 'na password azzerate ha state mannate addà.",
        "passwordreset-nocaller": "'Nu chiamande adda essere mise",
        "passwordreset-nosuchcaller": "'U chiamande nnon g'esiste: $1",
+       "passwordreset-ignored": "'A 'mbostazione nove d'a passuord non g'è gestite. Pò essere ca no ste nisciune provider configurate?",
        "passwordreset-invalidemail": "Indirizze email invalide",
+       "passwordreset-nodata": "Non g'ha state date nè 'nu nome utende nè 'nu 'ndirizze de poste elettroneche",
        "changeemail": "Cange o live 'u 'ndirizze e-mail",
        "changeemail-header": "Comblete stu module pe cangià 'u 'ndirizze email. Ce tu vuè ccu live l'associazione cu ogne indirizze email da 'u cunde tune, lasse 'u 'ndirizze email vacande quanne conferme 'u module.",
        "changeemail-no-info": "Tu a essere collegate pe accedere a sta pàgene direttamende.",
        "rcfilters-liveupdates-button-title-on": "Stute le aggiornaminde automatece",
        "rcfilters-watchlist-markseen-button": "Signe tutte le cangiaminde cumme 'ndrucate",
        "rcfilters-watchlist-edit-watchlist-button": "Cange l'elenghe de le pàggene condrollate",
+       "rcfilters-preference-help": "Careche le urteme cangiaminde senze filtre de recerche o funziune de evidenziazione.",
        "rcnotefrom": "Sotte {{PLURAL:$5|ste 'u cangiamende|stonne le cangiaminde}} da <strong>$3, $4</strong> ('nzigne a <strong>$1</strong> fatte vedè).",
        "rclistfrom": "Fà vedè le urteme cangiaminde partenne da $3 $2",
        "rcshowhideminor": "$1 cangiaminde stuèdeche",
index 9299667..0017297 100644 (file)
        "rcfilters-watchlist-edit-watchlist-button": "Редактировать ваш список наблюдения",
        "rcfilters-watchlist-showupdated": "Изменения страниц, которые вы не посещали с того момента, как они изменились, выделены <strong>жирным</strong> и отмечены полным маркером.",
        "rcfilters-preference-label": "Использовать не JavaScript интерфейс",
-       "rcfilters-preference-help": "Загружает свежие правки без фильтров или возможности подчёркивания.",
+       "rcfilters-preference-help": "Загружает свежие правки без поиска по фильтрам или возможностей подсветки.",
        "rcfilters-watchlist-preference-label": "Использовать интерфейс без JavaScript",
-       "rcfilters-watchlist-preference-help": "Ð\97агÑ\80Ñ\83жаеÑ\82 Ð½Ð°Ð±Ð»Ñ\8eдаемÑ\8bе Ð±ÐµÐ· Ñ\84илÑ\8cÑ\82Ñ\80ов Ð¸Ð»Ð¸ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñ\81Ñ\82и Ð¿Ð¾Ð´Ñ\87Ñ\91Ñ\80киваниÑ\8f.",
+       "rcfilters-watchlist-preference-help": "Ð\97агÑ\80Ñ\83жаеÑ\82 Ð¡Ð¿Ð¸Ñ\81ок Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f Ð±ÐµÐ· Ð¿Ð¾Ð¸Ñ\81ка Ð¿Ð¾ Ñ\84илÑ\8cÑ\82Ñ\80ам Ð¸Ð»Ð¸ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñ\81Ñ\82ей Ð¿Ð¾Ð´Ñ\81веÑ\82ки.",
        "rcfilters-filter-showlinkedfrom-label": "Показать правки на ссылаемых страницах",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Страницы, на которые ссылается</strong> выбранная",
        "rcfilters-filter-showlinkedto-label": "Показать правки на ссылающихся страницах",
        "move": "Переименовать",
        "movethispage": "Переименовать эту страницу",
        "unusedimagestext": "Следующие файлы не используются ни на одной странице.\nПожалуйста, учтите, что другие веб-сайты могут непосредственно ссылаться на этот файл (его URL), таким образом он может использоваться несмотря на вхождение в этот список.",
+       "unusedimagestext-categorizedimgisused": "Следующие файлы существуют, но не включены ни в одну страницу. Категоризируемые изображения считаются используемыми, несмотря на то что не присутствуют ни в одной странице.\nОбратите внимание, что другие вебсайты могут ссылаться на файл по прямому URL-адресу, и они будут находиться несмотря на активное использование.",
        "unusedcategoriestext": "Существуют следующие страницы категорий, не содержащие статей или других категорий.",
        "notargettitle": "Не указана цель",
        "notargettext": "Вы не указали целевую страницу или участника для этого действия.",
index bc4fb00..9b44b35 100644 (file)
        "rcfilters-watchlist-edit-watchlist-button": "Uredi svoj seznam nadzorovanih strani",
        "rcfilters-watchlist-showupdated": "Spremembe strani, ki jih niste obiskali od zadnje spremembe, so prikazane <strong>krepko</strong>, z močnimi oznakami.",
        "rcfilters-preference-label": "Uporabi vmesnik brez JavaScripta",
-       "rcfilters-preference-help": "Naloži Zadnje spremembe brez filtrov in možnosti obarvanja.",
+       "rcfilters-preference-help": "Naloži Zadnje spremembe brez iskalnih filtrov in možnosti obarvanja.",
        "rcfilters-watchlist-preference-label": "Uporabi vmesnik brez JavaScripta",
-       "rcfilters-watchlist-preference-help": "Naloži Spisek nadzorov brez filtrov in možnosti obarvanja.",
+       "rcfilters-watchlist-preference-help": "Naloži Spisek nadzorov brez iskalnih filtrov in možnosti obarvanja.",
        "rcfilters-filter-showlinkedfrom-label": "Pokaži spremembe na straneh, na katere se povezuje",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Strani, na katere kaže</strong> izbrana stran",
        "rcfilters-filter-showlinkedto-label": "Pokaži spremembe na straneh, ki kažejo na",
index 91e793f..8217afb 100644 (file)
        "returnto": "Tillbaka till $1.",
        "tagline": "Från {{SITENAME}}",
        "help": "Hjälp",
+       "help-mediawiki": "Hjälp om MediaWiki",
        "search": "Sök",
        "search-ignored-headings": "#<!-- lämna denna rad precis som den är --> <pre>\n# Rubriker som kommer att ignoreras av sökningen.\n# Förändringar av detta kommer att gälla så fort sidan med rubriken är indexerad.\n# Du kan tvinga sidan att indexeras om genom att göra en null-redigering.\n# Syntaxen är som följer:\n#  * Allt från ett \"#\" tecken till slutet av raden är en kommentar.\n#  * Varje icke-tom rad är den exakta titeln som ska ignoreras, skiftläge och allt.\nReferenser\nExterna länkar\nSe även\n #</pre> <!-- lämna denna rad precis som den är -->",
        "searchbutton": "Sök",
        "edit-gone-missing": "Kunde inte uppdatera sidan.\nDet verkar som att den har raderats.",
        "edit-conflict": "Redigeringskonflikt.",
        "edit-no-change": "Din redigering ignorerades, eftersom ingen ändring gjordes i texten.",
+       "edit-slots-cannot-add": "Följande {{PLURAL:$1|plats|platser}} stöds inte här: $2.",
+       "edit-slots-cannot-remove": "Följande {{PLURAL:$1|plats|platser}} krävs och kan inte tas bort: $2.",
+       "edit-slots-missing": "Följande {{PLURAL:$1|plats|platser}} saknas: $2.",
        "postedit-confirmation-created": "Sidan har skapats.",
        "postedit-confirmation-restored": "Sidan har återställts.",
        "postedit-confirmation-saved": "Din redigering sparades.",
        "defaultmessagetext": "Standardtext för meddelande",
        "content-failed-to-parse": "Det gick inte att parsa $2 innehåll för $1 modell: $3",
        "invalid-content-data": "Ogiltig innehållsdata",
-       "content-not-allowed-here": "innehåll av \"$1\" är inte tillåtet på sidan [[:$2]]",
+       "content-not-allowed-here": "Innehållet \"$1\" tillåts inte på sidan [[:$2]] i platsen \"$3\"",
        "editwarning-warning": "Om du lämnar den här sidan kommer du att förlora alla ändringar du har gjort.\nOm du är inloggad kan du slå av den här varningen under \"{{int:prefs-editing}}\" i dina inställningar.",
        "editpage-invalidcontentmodel-title": "Innehållsmodellen stöds inte",
        "editpage-invalidcontentmodel-text": "Innehållsmodellen \"$1\" stöds inte.",
        "editpage-notsupportedcontentformat-title": "Innehållsformat stöds inte",
        "editpage-notsupportedcontentformat-text": "Innehållsformatet $1 stöds inte av innehållsmodellen $2.",
+       "slot-name-main": "Huvud",
        "content-model-wikitext": "wikitext",
        "content-model-text": "oformaterad text",
        "content-model-javascript": "JavaScript",
        "rcfilters-watchlist-edit-watchlist-button": "Redigera din lista över bevakade sidor",
        "rcfilters-watchlist-showupdated": "Sidor som har ändrats sedan ditt senaste besök visas i <strong>fetstil</strong> med färgmarkering.",
        "rcfilters-preference-label": "Använd gränssnitt som inte använder JavaScript",
-       "rcfilters-preference-help": "Läser in senaste ändringarna utan filter eller markeringsfunktionalitet.",
+       "rcfilters-preference-help": "Läser in senaste ändringarna utan filtersökning eller markeringsfunktionalitet.",
        "rcfilters-watchlist-preference-label": "Använd gränssnitt som inte använder JavaScript",
-       "rcfilters-watchlist-preference-help": "Läser in bevakningslistan utan filter eller markeringsfunktionalitet.",
+       "rcfilters-watchlist-preference-help": "Läser in bevakningslistan utan filtersökning eller markeringsfunktionalitet.",
        "rcfilters-filter-showlinkedfrom-label": "Visa ändringar på sidor som länkas från",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Sidor som länkas från</strong> den valda sidan",
        "rcfilters-filter-showlinkedto-label": "Visa ändringar på sidor som länkar till",
        "move": "Flytta",
        "movethispage": "Flytta denna sida",
        "unusedimagestext": "Följande filer existerar men är inte inlagda i någon sida.\nObservera att andra webbplatser kan länka direkt till en fil med en URL. Filer kan därför användas aktivt trots att de listas här.",
+       "unusedimagestext-categorizedimgisused": "Följande filer finns men är inte inbäddad på någon sida. Kategoriserade bilder övervägs vara använda fastän de inte är inbäddade på någon sida.\nObservera att andra webbplatser kan länka till en fil med en direkt webbadress och kan fortfarande listas här fastän de används aktivt.",
        "unusedcategoriestext": "Följande kategorier finns men innehåller inga sidor eller underkategorier.",
        "notargettitle": "Inget mål",
        "notargettext": "Du har inte angivit någon sida eller användare att utföra denna funktion på.",
        "pageinfo-display-title": "Visningstitel",
        "pageinfo-default-sort": "Standardsorteringsnyckel",
        "pageinfo-length": "Sidlängd (i byte)",
+       "pageinfo-namespace": "Namnrymd",
        "pageinfo-article-id": "Sid-ID",
        "pageinfo-language": "Språk för sidinnehåll",
        "pageinfo-language-change": "ändra",
index 2e40dc3..69c3250 100644 (file)
        "editpage-invalidcontentmodel-text": "Контентна модель «$1» не підтримується.",
        "editpage-notsupportedcontentformat-title": "Формат вмісту не підтримується",
        "editpage-notsupportedcontentformat-text": "Формат вмісту $1 не підтримується моделлю вмісту $2.",
+       "slot-name-main": "Головна",
        "content-model-wikitext": "вікітекст",
        "content-model-text": "звичайний текст",
        "content-model-javascript": "JavaScript",
        "search-file-match": "(збігається із вмістом файлу)",
        "search-suggest": "Можливо, ви мали на увазі: $1",
        "search-rewritten": "Показуються результати для $1. Шукати натомість $2.",
-       "search-interwiki-caption": "Результати з братніх проектів",
+       "search-interwiki-caption": "Результати із сестринських проектів",
        "search-interwiki-default": "Результати із $1:",
        "search-interwiki-more": "(більше)",
        "search-interwiki-more-results": "більше результатів",
index 3233bb8..c7111c4 100644 (file)
@@ -43,7 +43,8 @@
                        "Harriettruong3",
                        "Fitoschido",
                        "Leducthn",
-                       "Nhatminh01"
+                       "Nhatminh01",
+                       "Leduyquang753"
                ]
        },
        "tog-underline": "Gạch chân liên kết:",
        "returnto": "Quay lại $1.",
        "tagline": "Từ {{SITENAME}}",
        "help": "Trợ giúp",
+       "help-mediawiki": "Trợ giúp về MediaWiki",
        "search": "Tìm kiếm",
        "search-ignored-headings": " #<!-- để yên dòng này --> <pre>\n# Công cụ tìm kiếm sẽ bỏ qua các đề mục này.\n# Các thay đổi trong danh sách này sẽ có hiệu lực ngay khi trang chứa đề mục được đưa vào chỉ mục.\n# Để bắt buộc trang phải được đưa trở lại vào chỉ mục, hãy thực hiện một sửa đổi rỗng.\n# Cú pháp:\n#   * Tất cả mọi thứ từ ký hiệu “#” đến cuối dòng là chú thích.\n#   * Mỗi dòng có nội dung là bản sao của tên đề mục cần bỏ qua, phân biệt chữ hoa/thường.\nTham khảo\nChú thích\nLiên kết ngoài\nXem thêm\nĐọc thêm\n #</pre> <!-- để yên dòng này -->",
        "searchbutton": "Tìm kiếm",
        "edit-gone-missing": "Không thể cập nhật trang.\nDường như trang này đã bị xóa.",
        "edit-conflict": "Sửa đổi mâu thuẫn.",
        "edit-no-change": "Sửa đổi của bạn không được tính đến, vì nó không làm thay đổi nội dung.",
+       "edit-slots-cannot-remove": "{{PLURAL:$1|Vị trí|Các vị trí}} sau là bắt buộc nên không thể bỏ qua: $2",
+       "edit-slots-missing": "{{PLURAL:$1|Vị trí|Các vị trí}} sau không được sử dụng: $2.",
        "postedit-confirmation-created": "Trang đã được tạo ra.",
        "postedit-confirmation-restored": "Trang đã được phục hồi.",
        "postedit-confirmation-saved": "Sửa đổi của bạn đã được lưu.",
        "defaultmessagetext": "Nội dung mặc định",
        "content-failed-to-parse": "Thất bại phân tích nội dung $2 cho kiểu $1: $3",
        "invalid-content-data": "Dữ liệu nội dung không hợp lệ",
-       "content-not-allowed-here": "Không cho phép đưa nội dung “$1” vào trang [[:$2]]",
+       "content-not-allowed-here": "Nội dung \"$1\" không được phép đưa vào trang [[:$2]] tại vị trí \"$3\"",
        "editwarning-warning": "Rời khỏi trang này sẽ khiến bạn mất các sửa đổi đã thực hiện.\nNếu đã đăng nhập, bạn có thể tắt cảnh báo này tại mục “{{int:prefs-editing}}” trong tùy chọn cá nhân.",
        "editpage-invalidcontentmodel-title": "Không hỗ trợ kiểu nội dung",
        "editpage-invalidcontentmodel-text": "Kiểu nội dung “$1” không được hỗ trợ.",
        "editpage-notsupportedcontentformat-title": "Không hỗ trợ định dạng nội dung",
        "editpage-notsupportedcontentformat-text": "Kiểu nội dung $2 không hỗ trợ định dạng nội dung $1.",
+       "slot-name-main": "Chính",
        "content-model-wikitext": "mã wiki",
        "content-model-text": "văn bản thuần",
        "content-model-javascript": "JavaScript",
        "localtime": "Giờ hiện tại:",
        "timezoneuseserverdefault": "Sử dụng giờ mặc định của wiki ($1)",
        "timezoneuseoffset": "Khác (cần ghi số giờ chênh lệch)",
+       "timezone-useoffset-placeholder": "Các giá trị mẫu: \"-07:00\" hoặc \"01:00\"",
        "servertime": "Giờ máy chủ:",
        "guesstimezone": "Dùng giờ của trình duyệt",
        "timezoneregion-africa": "Châu Phi",
        "move": "Di chuyển",
        "movethispage": "Di chuyển trang này",
        "unusedimagestext": "Các tập tin sau tồn tại nhưng chưa được nhúng vào trang nào.\nXin lưu ý là các trang Web bên ngoài có thể liên kết đến một tập tin ở đây qua một địa chỉ URL trực tiếp, do đó nhiều tập tin vẫn được liệt kê ở đây dù có thể nó đang được sử dụng.",
+       "unusedimagestext-categorizedimgisused": "Các tệp sau tồn tại nhưng không được nhúng vào trang nào. Các hình ảnh có thể loại được coi như được sử dụng mặc dù chúng cũng không được nhúng.\nXin lưu ý rằng các trang web khác có thể liên kết bằng một URL trực tiếp, và vì vậy có thể vẫn được liệt kê ở đây bất chấp chúng được sử dụng.",
        "unusedcategoriestext": "Các trang thể loại này tồn tại mặc dù không có trang hay thể loại con nào thuộc về nó.",
        "notargettitle": "Chưa có mục tiêu",
        "notargettext": "Xin chỉ rõ trang hoặc thành viên cần thực hiện tác vụ.",
index ec6d069..c3ab7c6 100644 (file)
        "returnto": "צוריקקערן צו $1.",
        "tagline": "פֿון {{SITENAME}}",
        "help": "הילף",
+       "help-mediawiki": "הילף וועגן מעדיעוויקי",
        "search": "זוך",
        "search-ignored-headings": " #<!-- ענדערט נישט די שורה --> <pre>\n# קעפלעך וואס דער זוך וועט אינגנארירן.\n# Changes to this take effect as soon as the page with the heading is indexed.\n# You can force page reindexing by doing a null edit.\n# דער סינטאקס איז אזוי:\n#   * אלץ פונעם כאראקטער \"#\" ביזן סוף פון דער שורה איז א הערה.\n#   * Every non-blank line is the exact title to ignore, case and everything.\nרעפערענצן\nוועבלינקען\nזעט אויך\n #</pre> <!-- ענדערט נישט די שורה -->",
        "searchbutton": "זוך",
        "defaultmessagetext": "גרונטלעכער מעלדונג טעקסט",
        "content-failed-to-parse": "פארזן $2 אינהאלט פאר $1 מאדעל דורכגעפאלן: $3",
        "invalid-content-data": "אומגילטיקע אינהאלט דאטן",
-       "content-not-allowed-here": "\"$1\" אינהאלט נישט דערלויבט אויף בלאט [[:$2]]",
+       "content-not-allowed-here": "\"$1\" אינהאלט נישט דערלויבט אויף בלאט [[:$2]] אין שפעלטל \"$3\"",
        "editwarning-warning": "איבערלאזן דעם בלאט קען גורם זײַן פֿארלירן אײַערע ענדערונגען.\nאויב איר זענט ארײַנלאגירט, קענט איר מבטל זײַן די דאזיגע ווארענונג אין דער \"באארבעטן\" אפטיילונג פון אײַערע פרעפערענצן.",
        "editpage-invalidcontentmodel-title": "אינהאלט־מאדעל נישט געשטיצט",
        "editpage-invalidcontentmodel-text": "דער אינהאלט מאדעל \"$1\" איז נישט געשטיצט.",
        "powersearch-togglelabel": "קאנטראלירן:",
        "powersearch-toggleall": "אלע",
        "powersearch-togglenone": "קיין",
-       "powersearch-remember": "×\92×¢×\93× ×¢קען אויסקלייב פאר צוקונפטדיקע זוכן",
+       "powersearch-remember": "×\92×¢×\93×¢× קען אויסקלייב פאר צוקונפטדיקע זוכן",
        "search-external": "דרויסנדיק זוכן",
        "searchdisabled": "{{SITENAME}} זוך איז אָפאַקטיווירט.\nצווישנצײַט קענט איר זוכן מיט גוגל.\nגעב אכט אז ס'איז מעגלעך אַז זייער אינדעקס פֿון {{SITENAME}} אינהאַלט איז אפשר פֿאַרעלטערט.",
        "search-error": "ס׳האָט פּאַסירט אַ פֿעלער ביים זוכן: $1",
        "timezonelegend": "צײַט זאנע:",
        "localtime": "לאקאלע צייט:",
        "timezoneuseserverdefault": "ניצן סערווירער גרונט ($1)",
-       "timezoneuseoffset": "×\90Ö·× ×\93ער (ספעצ×\99פֿ×\99ר×\98 ×\90×\95× ×\98ערש×\99×\99×\93)",
+       "timezoneuseoffset": "×\90Ö·× ×\93ער (ספעצ×\99פֿ×\99ר×\9f ×\90×\95× ×\98ערש×\99×\99×\93 ×\90×\95× ×\98×\9f)",
        "servertime": "סארווער צײַט:",
        "guesstimezone": "אנפֿילן פֿון בלעטערער",
        "timezoneregion-africa": "אפריקע",
index c33c69e..55e03bf 100644 (file)
        "rcfilters-watchlist-edit-watchlist-button": "編輯您的監視頁面列表",
        "rcfilters-watchlist-showupdated": "自更改發生以來,對您尚未訪問的頁面做出的更改以<strong>粗體</strong>顯示,並帶有實心圓形標記。",
        "rcfilters-preference-label": "使用非 JavaScript 介面",
-       "rcfilters-preference-help": "è¼\89å\85¥ä¸\8d帶篩é\81¸æ\88\96æ\98\8e顯æ¨\99示å\8a\9fè\83½ç\9a\84ç\9b£è¦\96æ¸\85å\96®。",
+       "rcfilters-preference-help": "è¼\89å\85¥ä¸\8d帶篩é\81¸æ\90\9cå°\8bæ\88\96æ\98\8e顯æ¨\99示å\8a\9fè\83½ç\9a\84è¿\91æ\9c\9fè®\8aæ\9b´。",
        "rcfilters-watchlist-preference-label": "使用非 JavaScript 介面",
-       "rcfilters-watchlist-preference-help": "載入不帶篩選或明顯標示功能的監視清單。",
+       "rcfilters-watchlist-preference-help": "è¼\89å\85¥ä¸\8d帶篩é\81¸æ\90\9cå°\8bæ\88\96æ\98\8e顯æ¨\99示å\8a\9fè\83½ç\9a\84ç\9b£è¦\96æ¸\85å\96®ã\80\82",
        "rcfilters-filter-showlinkedfrom-label": "顯示連結自此頁面的頁面上的變更",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>連結自</strong>指定頁面的頁面",
        "rcfilters-filter-showlinkedto-label": "顯示連結到該頁面的頁面上的更改",
index e81eec0..cb85a53 100644 (file)
@@ -1,3 +1,4 @@
+U+040C5䃅|U+078FE磾|
 U+04724䜤|U+09FC1鿁|
 U+04CA4䲤|U+09FD0鿐|
 U+04E07万|U+0842C萬|U+04E07万|
@@ -70,6 +71,7 @@ U+056F0困|U+056F0困|U+0774F睏|
 U+05742坂|U+05742坂|U+0962A阪|
 U+0574F坏|U+058DE壞|U+0574F坏|
 U+0575B坛|U+058C7壇|U+07F48罈|
+U+05846塆|U+058EA壪|
 U+05899墙|U+07246牆|U+058BB墻|
 U+058F3壳|U+06BBC殼|U+06BBB殻|
 U+0590D复|U+05FA9復|U+08907複|
@@ -210,7 +212,7 @@ U+0949F钟|U+0937E鍾|U+09418鐘|
 U+094A9钩|U+0920E鈎|U+09264鉤|
 U+094B5钵|U+07F3D缽|U+09262鉢|
 U+094F2铲|U+093DF鏟|U+05277剷|
-U+09508锈|U+092B9銹|U+093FD鏽|
+U+09508锈|U+093FD鏽|U+092B9銹|
 U+09510锐|U+092B3銳|U+092ED鋭|
 U+09528锨|U+06774杴|U+09341鍁|
 U+0954B镋|U+09482钂|U+093B2鎲|
@@ -300,6 +302,7 @@ U+2B6ED𫛭|U+09D5F鵟|
 U+2B7A9𫞩|U+0748A璊|
 U+2B7C5𫟅|U+07DA1綡|
 U+2B7E6𫟦|U+04875䡵|
+U+2B7F7𫟷|U+0925D鉝|
 U+2B7F9𫟹|U+09277鉷|
 U+2B7FC𫟼|U+0943D鐽|
 U+2B806𫠆|U+0980D頍|
index 0c6dbfd..31abd35 100644 (file)
@@ -21,6 +21,7 @@
 水氣 水汽
 計畫 计划
 規畫 规划
+身份 身份 #分词用
 天份 天分
 名份 名分
 職份 职分
 穿梭機      航天飞机
 網際網路   互联网
 機械人      机器人
+智慧機器人        智能机器人
 行動電話   移动电话
 流動電話   移动电话
+行動網路   移动网络
+流動網絡   移动网络
+行動支付   移动支付
+流動支付   移动支付
+行動裝置   移动设备
+流動裝置   移动设备
 數據機      调制解调器
 網域名稱   域名
+虛擬實境   虚拟现实
 葉門 也门
 貝里斯      伯利兹
 維德角      佛得角
 突尼西亞   突尼斯
 寮國 老挝
 貢寮 贡寮 #分詞用
+菁寮 菁寮 #分詞用
 蘇利南      苏里南
 奈洛比      内罗毕
 莫三比克   莫桑比克
@@ -2640,8 +2650,6 @@ A型肝炎        甲型肝炎
 數碼訊號   数字信号
 數位音樂   数字音乐
 數位化      数字化
-行動網路   移动网络
-流動網絡   移动网络
 咪高峰      麦克风
 幫浦 泵
 電單車      摩托车
@@ -2695,4 +2703,10 @@ A型肝炎       甲型肝炎
 真人騷      真人秀
 帕運會      残奥会
 帕拉林匹克        残疾人奥林匹克
-傷殘奧林匹克     残疾人奥林匹克
+卑詩省      不列颠哥伦比亚省
+丹帕沙      登巴萨
+峇里 巴厘
+史瓦帝尼   斯威士兰
+皮特肯      皮特凯恩
+安地卡      安提瓜
+撒拉威阿拉伯     阿拉伯撒哈拉
index c73c97a..1ad4540 100644 (file)
 鼓里 鼓裏
 殿里 殿裏
 队里 隊裏
+词里 詞裏
 世纪里      世紀裏
 夜晚里      夜晚裏
 参数里      參數裏
 網際網路   互聯網
 机器人      機械人
 機器人      機械人
+智慧機器人        智能機械人
 移动电话   流動電話
 行動電話   流動電話
+行動網路   流動網絡
+移动网络   流動網絡
+行動支付   流動支付
+移动支付   流動支付
+移动设备   流動裝置
+行動裝置   流動裝置
 操作系统   作業系統
 移动操作系统     流動作業系統
 行動作業系統     流動作業系統
@@ -3015,8 +3023,6 @@ IP地址  IP位址
 數位音樂   數碼音樂
 数字化      數碼化
 數位化      數碼化
-行動網路   流動網絡
-移动网络   流動網絡
 麥克風      咪高峰
 麦克风      咪高峰
 幫浦 泵
@@ -3059,5 +3065,11 @@ IP地址 IP位址
 烏龍麵      烏冬麵
 真人秀      真人騷
 帕運會      殘奧會
-帕拉林匹克        傷殘奧林匹克
-残疾人奥林匹克  傷殘奧林匹克
+帕拉林匹克        殘疾人奧林匹克
+不列颠哥伦比亚省       卑詩省
+丹帕沙      登巴薩
+巴厘岛      峇里島
+史瓦帝尼   斯威士蘭
+皮特凯恩   皮特肯
+安地卡      安提瓜
+撒拉威阿拉伯     阿拉伯撒哈拉
index 1abbf45..5ad8eeb 100644 (file)
 重覆 重复
 覆核 复核
 覆查 复查
-覆检 复检
+覆檢 复检
+覆審 复审
+候覆 候复
+待覆 待复
+盼覆 盼复
+批覆 批复
 鬱姓 鬱姓
 鬱氏 鬱氏
 夥計 伙计
 氾濫 泛滥
 近角聪信   近角聪信
 米泽瑠美   米泽瑠美
-候覆 候复
-待覆 待复
-批覆 批复
 矇眬 矇眬
 荠苧 荠苧
 噁心 恶心
 獨鍾 独钟
 鍾靈 钟灵
 龍鍾 龙钟
+鍾祥 钟祥
 薰心 熏心
 薰習 熏习
 薰陶 熏陶
 造麴 造曲
 大麴 大曲
 黃麴毒素   黄曲毒素
-硃砂 朱砂
-硃紅 朱红
-硃色 朱色
-銀硃 银朱
+硃山湖      硃山湖
 遶境 绕境
 侷促 局促
 侷限 局限
index 91fe87a..28055e1 100644 (file)
 因特网      網際網路
 互聯網      網際網路
 互聯網絡   網際網路
-机器人      機器人
 機械人      機器人
+智能机器人        智慧機器人
+智能機械人        智慧機器人
 移动电话   行動電話
 流動電話   行動電話
+移动网络   行動網路
+流動網絡   行動網路
+移动支付   行動支付
+流動支付   行動支付
+移动设备   行動裝置
+流動裝置   行動裝置
 调制解调器        數據機
 調制解調器        數據機
 短信 簡訊
+虚拟现实   虛擬實境
 乍得 查德
 也门 葉門
 也門 葉門
 希拉里      希拉蕊
 希拉莉      希拉蕊
 希拉克      席哈克
+希拉克略   希拉克略
 尼克松      尼克森
 威廉姆斯   威廉士
 多普勒      都卜勒
@@ -755,8 +764,6 @@ IP地址    IP位址
 數碼音樂   數位音樂
 数字化      數位化
 數碼化      數位化
-移动网络   行動網路
-流動網絡   行動網路
 网络游戏   網路遊戲
 網絡遊戲   網路遊戲
 电脑网络   電腦網路
@@ -799,4 +806,12 @@ IP地址   IP位址
 残奥会      帕運會
 殘奧會      帕運會
 残疾人奥林匹克  帕拉林匹克
-傷殘奧林匹克     帕拉林匹克
+不列颠哥伦比亚省       卑詩省
+登巴萨      丹帕沙
+登巴薩      丹帕沙
+巴厘岛      峇里島
+斯威士兰   史瓦帝尼
+斯威士蘭   史瓦帝尼
+皮特凯恩   皮特肯
+安提瓜      安地卡
+阿拉伯撒哈拉     撒拉威阿拉伯
index 6a30724..5bfe18f 100644 (file)
 府干擾      府干擾
 頁面 頁面
 面條目      面條目
+面包圍      面包圍
+面包裝      面包裝
 黃鈺筑      黃鈺筑
 答复 答覆
 反复 反覆
 反反复复   反反覆覆
 候复 候覆
 待复 待覆
+盼复 盼覆
 批复 批覆
 复信 覆信
 复核 覆核
+复审 覆審
 的回复      的回覆
 回复中      回覆中
 回复说      回覆說
 泸州大曲   瀘州大麯 #商標名
 洋河大曲   洋河大麯
 沟大曲      溝大麯
-朱砂 硃砂
-银朱 銀硃
+朱卷 硃卷
 喲喂 喲喂
 鳥栖 鳥栖
 澄江县      澂江縣 #以下為含異體字地名
index 3be11d4..7206924 100644 (file)
@@ -157,6 +157,7 @@ U+058B0墰|U+0575B坛|
 U+058BB墻|U+05899墙|
 U+058CE壎|U+057D9埙|
 U+058DC壜|U+0575B坛|
+U+058EA壪|U+05846塆|
 U+058FB壻|U+05A7F婿|
 U+05918夘|U+0536F卯|
 U+05925夥|U+04F19伙|U+05925夥|
@@ -451,9 +452,11 @@ U+077C1矁|U+07785瞅|
 U+077C7矇|U+08499蒙|U+077C7矇|
 U+077D9矙|U+077B0瞰|
 U+07832砲|U+070AE炮|
+U+07843硃|U+06731朱|
 U+07881碁|U+068CB棋|
 U+078AA碪|U+07827砧|
 U+078DF磟|U+0788C碌|
+U+078FE磾|U+040C5䃅|
 U+07906礆|U+078B1碱|
 U+07910礐|U+2C488𬒈|
 U+0792E礮|U+070AE炮|
@@ -748,6 +751,7 @@ U+0920E鈎|U+094A9钩|
 U+09244鉄|U+094C1铁|
 U+09246鉆|U+094BB钻|
 U+0924A鉊|U+2CB3F𬬿|
+U+0925D鉝|U+2B7F7𫟷|
 U+09262鉢|U+094B5钵|
 U+09265鉥|U+2CB38𬬸|
 U+09267鉧|U+2CB41𬭁|
@@ -756,6 +760,7 @@ U+09277鉷|U+2B7F9𫟹|
 U+09288銈|U+2B4EF𫓯|
 U+092B2銲|U+0710A焊|
 U+092B6銶|U+28C47𨱇|
+U+092B9銹|U+09508锈|
 U+092D0鋐|U+2CB4E𬭎|
 U+092D7鋗|U+2B4F6𫓶|
 U+092ED鋭|U+09510锐|
index e624e40..327f8f3 100644 (file)
 董氏封髮
 胎髮
 禿妃之髮
-捉髮
 綠髮
-括髮
 髡髮
 鵠髮
 解髮佯狂
 心細如髮
 祝髮
 擢髮
-齒髮
 齒危髮秀
 沖冠髮怒
 甩髮
 穀城縣
 穀氨
 穀胱
+穀茬
 颳雪
 广部
 亂鬨鬨
 曆局
 授時曆
 顓頊曆
+儒略曆
+伊斯蘭曆
+佛曆
 共和歷史
 厤物之意
 爰定祥厤
 瀰山遍野
 瀰瀰
 冷麵
+冷面笑匠
+冷面殺手
+冷面天使
 撈麵
 煮麵
 炆麵
 樸鈍
 樸直
 見素抱樸
+樸茨茅斯
 掣籤
 標籤
 書籤
 幹這
 幹仗
 包幹
+幹過
 李連杰
 周杰
 杰倫
 債纍纍
 果纍纍
 實纍纍
-儒略曆
-伊斯蘭曆
 酒麴
 澹臺
 拜託
 泳氣鐘
 電子鐘
 電子鐘錶
-石英鐘錶
 石英鐘
-鐘錶王
+石英鐘錶
 鐘律
 看鐘
 看錶
 對準鐘
 對準鐘錶
 對準錶
-鐘錶快
-鐘快
-錶快
-鐘錶慢
-鐘慢
-錶慢
 響鐘
 鐘敲
 世紀鐘錶
 萬年曆錶
 個鐘
 個鐘錶
-喜歡鐘
-喜歡鐘錶
-喜歡錶
 大鐘
 佛鐘
 鐘壁
 南屏晚鐘
 敲鐘
 警報鐘
-猶如鐘
-猶如鐘錶
-猶如錶
 舊鐘錶
 繁鐘
 四面鐘
 更鐘
 警示鐘
 鐘差
-任何鐘錶
-任何鐘
 手錶
 選手表現
 選手表達
 角落發
 村落發
 蛇髮女妖
-畢生發展
 對華發
 尸魂界
 樹樑
 好斗膽
 好斗蓬
 墨斗
+雄斗斗
+科斗
+斗牛星
+斗法會
 小几
 尸利
 尸祿
 捉奸細
 捉奸賊
 敢情欲
-敢斗了膽
 敲扑
 望了望
 桌几
 金表面
 長几
 隆准許
-雄斗斗
 裡面包
 表面包
 外面包
 宜云
 貴价
 郁郁菲菲
-生發生
 必須
 須根據
 ·范
 註裡
 殿裡
 隊裡
+詞裡
 裏白 #植物常用名
 烏蘇里 #分詞用
-首發
 夸脫
 風采
 代碼表
 電碼表
 碼碼表
 碼表示
-科斗
 灕水
 這只不
 這只容
 于江震
 于洪區
 于浩威
-于海洋
 于湘蘭
 于特森
 于玉立
 于欣
 于少保
 于海
+於海洋
 於海邊
 於海上
 於海拔
+於海平面
 於山東
 於山西
 于凌辰
 於震前
 於震後
 於震中
+由於 #分詞用
 固定制
 划船
 划不來
 余力為
 葉叶琴
 幾個
+首發
 併發症
 併發重症
 併發模式
 髮披肩
 髮及腰
 飄髮自由女神
+生髮液
+生髮油
+生髮藥
+生髮水
+生髮劑
+頭亂髮
 後天
 學家
 游離
 說不準
 對不準
 量不準
+拿不準
 準不準
 音不準
 預報不準
 蕩氣
 木籤
 薝蔔
-斗牛星
 告劄
 點劄
 嚮慕
 十出擊
 十出家
 十出祁山
-0齣
-0出現
-0出線
+0齣
+0齣。
+0齣電影
 這齣
 這出現
 這出乎
 繫上。
 繫舟
 繫膜
-亂發生
-亂發脾氣
 秀發村
 秀發動
 秀發表
 簡短發
 短發生
 頭發現
+頭發展
+頭發動
+頭發生
 蛋白發
 發狀態
 發狀況
 染發生
+發表 #分詞用
+理發表
+理發現
+理發展
+理發動
+理發生
+護發展
+素發現
+素發生
+絲發現
+絲發生
+斷發現
+胎發展
+胎發育
+胎發生
+結發育
+結發表
 古人有云
 昔人有云
 云敞
 崑岡
 西崑
 蘇崑
+銹病
+嚐糞
index 5024688..5dfbab7 100644 (file)
@@ -61,7 +61,7 @@
                createSpinner: function ( opts ) {
                        var $spinner;
 
-                       if ( opts !== undefined && $.type( opts ) !== 'object' ) {
+                       if ( typeof opts === 'string' ) {
                                opts = {
                                        id: opts
                                };
index cbbed99..6b4ab97 100644 (file)
                        setContents: function ( content ) {
                                return this.each( function () {
                                        var scrollTop = this.scrollTop;
-                                       this.select();
-                                       if ( !document.execCommand( 'insertText', false, content ) ) {
-                                               $( this ).val( content );
-                                       }
+                                       $( this ).val( content );
                                        // Setting this.value may scroll the textarea, restore the scroll position
                                        this.scrollTop = scrollTop;
                                } );
                                return this.each( function () {
                                        var allText, currSelection, startPos, endPos;
 
-                                       if ( !document.execCommand( 'insertText', false, value ) ) {
-                                               allText = $( this ).textSelection( 'getContents' );
-                                               currSelection = $( this ).textSelection( 'getCaretPosition', { startAndEnd: true } );
-                                               startPos = currSelection[ 0 ];
-                                               endPos = currSelection[ 1 ];
+                                       allText = $( this ).textSelection( 'getContents' );
+                                       currSelection = $( this ).textSelection( 'getCaretPosition', { startAndEnd: true } );
+                                       startPos = currSelection[ 0 ];
+                                       endPos = currSelection[ 1 ];
 
-                                               $( this ).textSelection( 'setContents', allText.slice( 0, startPos ) + value +
-                                                       allText.slice( endPos ) );
-                                               $( this ).textSelection( 'setSelection', {
-                                                       start: startPos,
-                                                       end: startPos + value.length
-                                               } );
-                                       }
+                                       $( this ).textSelection( 'setContents', allText.slice( 0, startPos ) + value +
+                                               allText.slice( endPos ) );
+                                       $( this ).textSelection( 'setSelection', {
+                                               start: startPos,
+                                               end: startPos + value.length
+                                       } );
                                } );
                        },
 
index 44baa8b..ff7a40f 100644 (file)
         *
         * @static
         * @param {string} title
-        * @param {number} [defaultNamespace=NS_MAIN]
+        * @param {number|Object} [defaultNamespaceOrOptions=NS_MAIN]
         *  If given, will used as default namespace for the given title.
+        *  This method can also be called with two arguments, in which case
+        *  this becomes options (see below).
         * @param {Object} [options] additional options
         * @param {boolean} [options.forUploading=true]
         *  Makes sure that a file is uploadable under the title returned.
         *  Automatically assumed if the title is created in the Media namespace.
         * @return {mw.Title|null} A valid Title object or null if the input cannot be turned into a valid title
         */
-       Title.newFromUserInput = function ( title, defaultNamespace, options ) {
-               var namespace, m, id, ext, parts;
+       Title.newFromUserInput = function ( title, defaultNamespaceOrOptions, options ) {
+               var namespace, m, id, ext, parts,
+                       defaultNamespace;
 
                // defaultNamespace is optional; check whether options moves up
-               if ( arguments.length < 3 && $.type( defaultNamespace ) === 'object' ) {
-                       options = defaultNamespace;
-                       defaultNamespace = undefined;
+               if ( arguments.length < 3 && typeof defaultNamespace === 'object' ) {
+                       options = defaultNamespaceOrOptions;
+               } else {
+                       defaultNamespace = defaultNamespaceOrOptions;
                }
 
                // merge options into defaults
index 8a44dcc..04ed5d6 100644 (file)
                 * @return {string} Parsed message
                 */
                parser: function () {
-                       return mw.format.apply( null, [ this.map.get( this.key ) ].concat( this.parameters ) );
+                       var text;
+                       if ( mw.config.get( 'wgUserLanguage' ) === 'qqx' ) {
+                               text = '(' + this.key + '$*)';
+                       } else {
+                               text = this.map.get( this.key );
+                       }
+                       return mw.format.apply( null, [ text ].concat( this.parameters ) );
                },
 
                /**
                 * @return {boolean}
                 */
                exists: function () {
+                       if ( mw.config.get( 'wgUserLanguage' ) === 'qqx' ) {
+                               return true;
+                       }
                        return this.map.exists( this.key );
                }
        };
                } );
        };
 
+       /**
+        * Replace $* with a list of parameters for &uselang=qqx.
+        *
+        * @since 1.33
+        * @param {string} formatString Format string
+        * @param {Array} parameters Values for $N replacements
+        * @return {string} Transformed format string
+        */
+       mw.transformFormatForQqx = function ( formatString, parameters ) {
+               var parametersString;
+               if ( formatString.indexOf( '$*' ) !== -1 ) {
+                       parametersString = '';
+                       if ( parameters.length ) {
+                               parametersString = ': ' + parameters.map( function ( _, i ) {
+                                       return '$' + ( i + 1 );
+                               } ).join( ', ' );
+                       }
+                       return formatString.replace( '$*', parametersString );
+               }
+               return formatString;
+       };
+
        /**
         * Format a string. Replace $1, $2 ... $N with positional arguments.
         *
         */
        mw.format = function ( formatString ) {
                var parameters = slice.call( arguments, 1 );
+               formatString = mw.transformFormatForQqx( formatString, parameters );
                return formatString.replace( /\$(\d+)/g, function ( str, match ) {
                        var index = parseInt( match, 10 ) - 1;
                        return parameters[ index ] !== undefined ? parameters[ index ] : '$' + match;
index 5923ff8..76038f6 100644 (file)
@@ -26,7 +26,7 @@
                 * @param {string} key
                 * @param {string|null} value Value of cookie. If `value` is `null` then this method will
                 *   instead remove a cookie by name of `key`.
-                * @param {Object|Date} [options] Options object, or expiry date
+                * @param {Object|Date|number} [options] Options object, or expiry date
                 * @param {Date|number|null} [options.expires] The expiry date of the cookie, or lifetime in seconds.
                 *
                 *   If `options.expires` is null, then a session cookie is set.
@@ -61,8 +61,8 @@
                        };
 
                        // Options argument can also be a shortcut for the expiry
-                       // Expiry can be a Date or null
-                       if ( $.type( options ) !== 'object' ) {
+                       // Expiry can be a Date, number or null
+                       if ( !options || options instanceof Date || typeof options === 'number' ) {
                                // Also takes care of options = undefined, in which case we also don't need $.extend()
                                defaultOptions.expires = options;
                                options = defaultOptions;
index ebb469f..3dc09b7 100644 (file)
                 * @return {jQuery}
                 */
                parse: function ( key, replacements ) {
-                       var ast = this.getAst( key );
+                       var ast = this.getAst( key, replacements );
                        return this.emitter.emit( ast, replacements );
                },
 
                 * Note that we pass '⧼' + key + '⧽' back for a missing message here.
                 *
                 * @param {string} key
+                * @param {Array} replacements Variable replacements for $1, $2... $n
                 * @return {string|Array} string of '⧼key⧽' if message missing, simple string if possible, array of arrays if needs parsing
                 */
-               getAst: function ( key ) {
+               getAst: function ( key, replacements ) {
                        var wikiText;
 
                        if ( !Object.prototype.hasOwnProperty.call( this.astCache, key ) ) {
-                               wikiText = this.settings.messages.get( key );
-                               if ( typeof wikiText !== 'string' ) {
-                                       wikiText = '⧼' + key + '⧽';
+                               if ( mw.config.get( 'wgUserLanguage' ) === 'qqx' ) {
+                                       wikiText = '(' + key + '$*)';
+                               } else {
+                                       wikiText = this.settings.messages.get( key );
+                                       if ( typeof wikiText !== 'string' ) {
+                                               wikiText = '⧼' + key + '⧽';
+                                       }
                                }
+                               wikiText = mw.transformFormatForQqx( wikiText, replacements );
                                this.astCache[ key ] = this.wikiTextToAst( wikiText );
                        }
                        return this.astCache[ key ];
index 441b1d6..255b878 100644 (file)
@@ -20,6 +20,7 @@
                        watchUserField = infuseIfExists( $( '#mw-input-wpWatch' ).closest( '.oo-ui-fieldLayout' ) ),
                        expiryWidget = infuseIfExists( $( '#mw-input-wpExpiry' ) ),
                        editingRestrictionWidget = infuseIfExists( $( '#mw-input-wpEditingRestriction' ) ),
+                       preventTalkPageEdit = infuseIfExists( $( '#mw-input-wpDisableUTEdit' ) ),
                        pageRestrictionsWidget = infuseIfExists( $( '#mw-input-wpPageRestrictions' ) );
 
                function updateBlockOptions() {
                        if ( pageRestrictionsWidget ) {
                                pageRestrictionsWidget.setDisabled( editingRestrictionValue === 'sitewide' );
                        }
+                       if ( preventTalkPageEdit ) {
+                               // TODO: (T210475) this option is disabled for partial blocks unless
+                               // a namespace restriction for User_talk namespace is in place.
+                               // This needs to be updated once Namespace restrictions is available
+                               if ( editingRestrictionValue === 'partial' ) {
+                                       preventTalkPageEdit.setDisabled( true );
+                               } else {
+                                       preventTalkPageEdit.setDisabled( false );
+                               }
+                       }
+
                }
 
                if ( blockTargetWidget ) {
index 275e96a..fb81dd8 100644 (file)
                // date picker is open will cause the date picker to remain visible (but non-functional), but
                // not replacing the interface while the user is working with it is probably a good idea anyway.
                startReady = whenBlurred( $( '#mw-date-start .oo-ui-inputWidget-input' ) ).then( function () {
-                       return mw.widgets.DateInputWidget.static.infuse( 'mw-date-start' );
+                       return mw.widgets.DateInputWidget.static.infuse( $( '#mw-date-start' ) );
                } );
                endReady = whenBlurred( $( '#mw-date-end .oo-ui-inputWidget-input' ) ).then( function () {
-                       return mw.widgets.DateInputWidget.static.infuse( 'mw-date-end' );
+                       return mw.widgets.DateInputWidget.static.infuse( $( '#mw-date-end' ) );
                } );
 
                $.when( startReady, endReady ).then( function ( startInput, endInput ) {
index 589182a..8b70e1f 100644 (file)
@@ -4,8 +4,8 @@
 ( function () {
        $( function () {
                // Select the 'Language select' option if user is trying to select language
-               OO.ui.infuse( 'mw-pl-languageselector' ).on( 'change', function () {
-                       OO.ui.infuse( 'mw-pl-options' ).setValue( '2' );
+               OO.ui.infuse( $( '#mw-pl-languageselector' ) ).on( 'change', function () {
+                       OO.ui.infuse( $( '#mw-pl-options' ) ).setValue( '2' );
                } );
        } );
 }() );
index f0bc495..03ba0d2 100644 (file)
@@ -33,7 +33,7 @@
 
                // Change the header search links to what user entered
                $headerLinks = $( '.search-types a' );
-               searchWidget = OO.ui.infuse( 'searchText' );
+               searchWidget = OO.ui.infuse( $( '#searchText' ) );
                updateHeaderLinks = function ( value ) {
                        $headerLinks.each( function () {
                                var parts = $( this ).attr( 'href' ).split( 'search=' ),
index 8f8ef53..781ad08 100644 (file)
 
                xhr = $.getJSON( this.getAPIurl(), allParams )
                        .done( function ( data ) {
-                               if (
-                                       $.type( data ) !== 'array' ||
-                                       (
-                                               $.type( data ) === 'array' &&
-                                               data.length === 0
-                                       )
-                               ) {
-                                       deferred.resolve();
-                               } else {
+                               if ( Array.isArray( data ) && data.length ) {
                                        deferred.resolve( data );
+                               } else {
+                                       deferred.resolve();
                                }
                        } );
                return deferred.promise( { abort: xhr.abort } );
index cd0cbd7..b3c25fa 100644 (file)
@@ -1,8 +1,12 @@
+// TODO: Redefined here to avoid importing variables.less;
+@width-breakpoint-desktop: 1000px;
+
 @wm-expirywidget-text-width: 43.3em;
 
 .mw-widget-ExpiryWidget.mw-widget-ExpiryWidget-hasDatePicker {
        .oo-ui-buttonSelectWidget {
-               float: left;
+               display: inline-block;
+               vertical-align: top;
        }
 
        .oo-ui-textInputWidget.mw-widget-ExpiryWidget-relative {
                max-width: @wm-expirywidget-text-width;
        }
 
+       .mw-widget-selectWithInputWidget {
+               display: inline;
+       }
+
+       .mw-widget-selectWithInputWidget.mw-widget-ExpiryWidget-relative .oo-ui-dropdownInputWidget {
+               display: inline-block;
+       }
+
        .mw-widget-selectWithInputWidget.mw-widget-ExpiryWidget-relative .oo-ui-textInputWidget {
+               display: inline-block;
                max-width: 22.8em;
        }
 
                        max-height: 2.286em;
                }
        }
+
+       @media ( max-width: ( @width-breakpoint-desktop - 1px ) ) {
+               .mw-widget-selectWithInputWidget {
+                       display: block;
+               }
+
+               .mw-widget-selectWithInputWidget.mw-widget-ExpiryWidget-relative .oo-ui-dropdownInputWidget,
+               .mw-widget-selectWithInputWidget.mw-widget-ExpiryWidget-relative .oo-ui-textInputWidget,
+               .mw-widgets-datetime-dateTimeInputWidget {
+                       display: block;
+                       max-width: 50em;
+                       margin-top: 0.5em;
+               }
+       }
 }
index 9283b16..e8eb0ae 100644 (file)
@@ -7,7 +7,7 @@
  * @author Trevor Parscal <tparscal@wikimedia.org>
  */
 ( function () {
-       /* global console, mw */
+       /* global mw */
        /* eslint-disable no-console */
        var original = mw.log;
 
diff --git a/tests/phpunit/includes/actions/ViewActionTest.php b/tests/phpunit/includes/actions/ViewActionTest.php
new file mode 100644 (file)
index 0000000..5f659c0
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @covers \ViewAction
+ *
+ * @group Actions
+ *
+ * @author Derick N. Alangi
+ */
+class ViewActionTest extends MediaWikiTestCase {
+       /**
+        * @return ViewAction
+        */
+       private function makeViewActionClassFactory() {
+               $page = new Article( Title::newMainPage() );
+               $context = RequestContext::getMain();
+               $viewAction = new ViewAction( $page, $context );
+
+               return $viewAction;
+       }
+
+       public function testGetName() {
+               $viewAction = $this->makeViewActionClassFactory();
+               $actual = $viewAction->getName();
+
+               $this->assertSame( 'view', $actual );
+       }
+
+       public function testOnView() {
+               $viewAction = $this->makeViewActionClassFactory();
+               $actual = $viewAction->onView();
+
+               $this->assertNull( $actual );
+       }
+}
index cd24be4..ac7ef80 100644 (file)
@@ -1,5 +1,9 @@
 <?php
 
+use GuzzleHttp\Handler\MockHandler;
+use GuzzleHttp\HandlerStack;
+use GuzzleHttp\Psr7\Response;
+
 /**
  * @group Http
  * @group small
@@ -503,6 +507,18 @@ class HttpTest extends MediaWikiTestCase {
 
                $this->assertTrue( defined( $value ), $value . ' not defined' );
        }
+
+       /**
+        * No actual request is made herein
+        */
+       public function testGuzzleHttpRequest() {
+               $handler = HandlerStack::create( new MockHandler( [ new Response( 200 ) ] ) );
+               $r = new GuzzleHttpRequest( 'http://www.example.text', [ 'handler' => $handler ] );
+               $r->execute();
+               $this->assertEquals( 200, $r->getStatus() );
+
+               // @TODO: add failure tests (404s and failure to connect)
+       }
 }
 
 /**
@@ -513,13 +529,15 @@ class MWHttpRequestTester extends MWHttpRequest {
        // returns appropriate tester class here
        public static function factory( $url, array $options = null, $caller = __METHOD__ ) {
                if ( !Http::$httpEngine ) {
-                       Http::$httpEngine = function_exists( 'curl_init' ) ? 'curl' : 'php';
+                       Http::$httpEngine = 'guzzle';
                } elseif ( Http::$httpEngine == 'curl' && !function_exists( 'curl_init' ) ) {
                        throw new DomainException( __METHOD__ . ': curl (https://secure.php.net/curl) is not ' .
                                'installed, but Http::$httpEngine is set to "curl"' );
                }
 
                switch ( Http::$httpEngine ) {
+                       case 'guzzle':
+                               return new GuzzleHttpRequestTester( $url, $options, $caller );
                        case 'curl':
                                return new CurlHttpRequestTester( $url, $options, $caller );
                        case 'php':
@@ -535,6 +553,12 @@ class MWHttpRequestTester extends MWHttpRequest {
        }
 }
 
+class GuzzleHttpRequestTester extends GuzzleHttpRequest {
+       function setRespHeaders( $name, $value ) {
+               $this->respHeaders[$name] = $value;
+       }
+}
+
 class CurlHttpRequestTester extends CurlHttpRequest {
        function setRespHeaders( $name, $value ) {
                $this->respHeaders[$name] = $value;
index b9289db..4f8a7da 100644 (file)
@@ -1268,34 +1268,56 @@ class UserTest extends MediaWikiTestCase {
                return [
                        'Basic operation' => [ 'Test page', true ],
                        'User talk page, not allowed' => [ self::USER_TALK_PAGE, true, [
-                               'allowUsertalk' => false,
-                       ] ],
-                       'User talk page, allowed' => [ self::USER_TALK_PAGE, false, [
-                               'allowUsertalk' => true,
-                       ] ],
-                       'User talk page, allowed but $wgBlockAllowsUTEdit is false' => [ self::USER_TALK_PAGE, true, [
-                               'allowUsertalk' => true,
-                               'blockAllowsUTEdit' => false,
-                       ] ],
-
-                       'Partial block, blocking the page' => [ 'Test page', true, [
-                               'pageRestrictions' => [ 'Test page' ],
-                       ] ],
-                       'Partial block, not blocking the page' => [ 'Test page 2', false, [
-                               'pageRestrictions' => [ 'Test page' ],
-                       ] ],
-                       'Partial block, overriding allowUsertalk' => [ self::USER_TALK_PAGE, true, [
-                               'allowUsertalk' => false,
-                               'pageRestrictions' => [ self::USER_TALK_PAGE ],
-                       ] ],
-                       'Partial block, allowing user talk' => [ self::USER_TALK_PAGE, false, [
-                               'allowUsertalk' => true,
-                               'pageRestrictions' => [ 'Test page' ],
-                       ] ],
-                       'Partial block, not allowing user talk' => [ self::USER_TALK_PAGE, true, [
-                               'allowUsertalk' => false,
-                               'pageRestrictions' => [ 'Test page' ],
-                       ] ],
+                                       'allowUsertalk' => false,
+                               ]
+                       ],
+                       'User talk page, allowed' => [
+                                       self::USER_TALK_PAGE, false, [
+                                       'allowUsertalk' => true,
+                               ]
+                       ],
+                       'User talk page, allowed but $wgBlockAllowsUTEdit is false' => [
+                               self::USER_TALK_PAGE, true, [
+                                       'allowUsertalk' => true,
+                                       'blockAllowsUTEdit' => false,
+                               ]
+                       ],
+                       'Partial block, blocking the page' => [
+                               'Test page', true, [
+                                       'pageRestrictions' => [ 'Test page' ],
+                               ]
+                       ],
+                       'Partial block, not blocking the page' => [
+                               'Test page 2', false, [
+                                       'pageRestrictions' => [ 'Test page' ],
+                               ]
+                       ],
+                       'Partial block, allowing user talk' => [
+                               self::USER_TALK_PAGE, false, [
+                                       'allowUsertalk' => false,
+                                       'pageRestrictions' => [ 'Test page' ],
+                               ]
+                       ],
+                       'Partial block, not allowing user talk' => [
+                               self::USER_TALK_PAGE, true, [
+                                       'allowUsertalk' => true,
+                                       'pageRestrictions' => [ self::USER_TALK_PAGE ],
+                               ]
+                       ],
+                       'Partial block, allowing user talk but $wgBlockAllowsUTEdit is false' => [
+                               self::USER_TALK_PAGE, false, [
+                                       'allowUsertalk' => false,
+                                       'pageRestrictions' => [ 'Test page' ],
+                                       'blockAllowsUTEdit' => false,
+                               ]
+                       ],
+                       'Partial block, not allowing user talk with $wgBlockAllowsUTEdit set to false' => [
+                               self::USER_TALK_PAGE, true, [
+                                       'allowUsertalk' => true,
+                                       'pageRestrictions' => [ self::USER_TALK_PAGE ],
+                                       'blockAllowsUTEdit' => false,
+                               ]
+                       ],
                ];
        }
 
index 3f3cc2c..84e1d4e 100644 (file)
                var i;
                for ( i = 0; i < cases.valid.length; i++ ) {
                        assert.strictEqual(
-                               $.type( mw.Title.newFromText( cases.valid[ i ] ) ),
+                               typeof mw.Title.newFromText( cases.valid[ i ] ),
                                'object',
                                cases.valid[ i ]
                        );
                }
                for ( i = 0; i < cases.invalid.length; i++ ) {
                        assert.strictEqual(
-                               $.type( mw.Title.newFromText( cases.invalid[ i ] ) ),
-                               'null',
+                               mw.Title.newFromText( cases.invalid[ i ] ),
+                               null,
                                cases.invalid[ i ]
                        );
                }
 
                                assert.notStrictEqual( title, null, prefix + 'Parses successfully' );
                                assert.strictEqual( title.toText(), thisCase.expected, prefix + 'Title as expected' );
+                               if ( thisCase.defaultNamespace === undefined ) {
+                                       title = mw.Title.newFromUserInput( thisCase.title, thisCase.options );
+                                       assert.strictEqual( title.toText(), thisCase.expected, prefix + 'Skipping namespace argument' );
+                               }
                        } else {
                                assert.strictEqual( title, null, thisCase.description + ', should not produce an mw.Title object' );
                        }
index 913022d..1c7d8ee 100644 (file)
        } );
 
        QUnit.test( 'Integration', function ( assert ) {
-               var expected, msg;
+               var expected, msg, $bar;
 
                expected = '<b><a title="Bold" href="/wiki/Bold">Bold</a>!</b>';
                mw.messages.set( 'integration-test', '<b>[[Bold]]!</b>' );
                        '<a href="http://example.com/">Link</a>',
                        'Calling .parse() multiple times does not duplicate link contents'
                );
+
+               mw.config.set( 'wgUserLanguage', 'qqx' );
+               $bar = $( '<b>' ).text( 'bar' );
+               assert.strictEqual( mw.message( 'foo', $bar, 'baz' ).parse(), '(foo: <b>bar</b>, baz)', 'qqx message with parameters' );
        } );
 
        QUnit.test( 'setParserDefaults', function ( assert ) {
index 0353694..425e18e 100644 (file)
                        'Script escaped when using parse format'
                );
 
+               mw.config.set( 'wgUserLanguage', 'qqx' );
+               assert.strictEqual( mw.message( 'foo' ).plain(), '(foo)', 'qqx message' );
+               assert.strictEqual( mw.message( 'foo', 'bar', 'baz' ).plain(), '(foo: bar, baz)', 'qqx message with parameters' );
        } );
 
        QUnit.test( 'mw.msg', function ( assert ) {