Merge "startup.js: Move IE8 down from Grade A to Grade C"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 6 Jan 2016 23:53:48 +0000 (23:53 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 6 Jan 2016 23:53:48 +0000 (23:53 +0000)
38 files changed:
docs/hooks.txt
includes/Setup.php
includes/WebRequest.php
includes/api/i18n/zh-hans.json
includes/changes/OldChangesList.php
includes/changes/RecentChange.php
includes/context/RequestContext.php
includes/diff/DifferenceEngine.php
includes/import/WikiRevision.php
includes/installer/i18n/ksh.json
includes/logging/LogEntry.php
includes/skins/SkinTemplate.php
includes/specials/SpecialBlock.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialShortpages.php
languages/i18n/ast.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bs.json
languages/i18n/de.json
languages/i18n/en.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/ja.json
languages/i18n/ka.json
languages/i18n/ksh.json
languages/i18n/la.json
languages/i18n/nap.json
languages/i18n/nn.json
languages/i18n/pt-br.json
languages/i18n/qqq.json
languages/i18n/ru.json
package.json
resources/src/jquery/jquery.accessKeyLabel.js
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js
resources/src/mediawiki/mediawiki.ForeignUpload.js
resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
resources/src/mediawiki/mediawiki.Upload.js

index c928aae..83ce62e 100644 (file)
@@ -2571,6 +2571,13 @@ $enotif: EmailNotification object
 
 'SetupAfterCache': Called in Setup.php, after cache objects are set
 
+'ShortPagesQuery': Allow extensions to modify the query used by
+Special:ShortPages.
+&$tables: tables to join in the query
+&$conds: conditions for the query
+&$joinConds: join conditions for the query
+&$options: options for the query
+
 'ShowMissingArticle': Called when generating the output for a non-existent page.
 $article: The article object corresponding to the page
 
index c863722..2723258 100644 (file)
@@ -264,6 +264,7 @@ foreach ( $wgForeignFileRepos as &$repo ) {
 }
 unset( $repo ); // no global pollution; destroy reference
 
+$rcMaxAgeDays = $wgRCMaxAge / ( 3600 * 24 );
 if ( $wgRCFilterByAge ) {
        // Trim down $wgRCLinkDays so that it only lists links which are valid
        // as determined by $wgRCMaxAge.
@@ -273,12 +274,22 @@ if ( $wgRCFilterByAge ) {
        // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
        for ( $i = 0; $i < count( $wgRCLinkDays ); $i++ ) {
                // @codingStandardsIgnoreEnd
-               if ( $wgRCLinkDays[$i] >= $wgRCMaxAge / ( 3600 * 24 ) ) {
+               if ( $wgRCLinkDays[$i] >= $rcMaxAgeDays ) {
                        $wgRCLinkDays = array_slice( $wgRCLinkDays, 0, $i + 1, false );
                        break;
                }
        }
 }
+// Ensure that default user options are not invalid, since that breaks Special:Preferences
+$wgDefaultUserOptions['rcdays'] = min(
+       $wgDefaultUserOptions['rcdays'],
+       ceil( $rcMaxAgeDays )
+);
+$wgDefaultUserOptions['watchlistdays'] = min(
+       $wgDefaultUserOptions['watchlistdays'],
+       ceil( $rcMaxAgeDays )
+);
+unset( $rcMaxAgeDays );
 
 if ( $wgSkipSkin ) {
        $wgSkipSkins[] = $wgSkipSkin;
@@ -606,15 +617,13 @@ if ( !$wgDBerrorLogTZ ) {
        $wgDBerrorLogTZ = $wgLocaltimezone;
 }
 
+// initialize the request object in $wgRequest
+$wgRequest = RequestContext::getMain()->getRequest(); // BackCompat
+
 // Useful debug output
 if ( $wgCommandLineMode ) {
-       $wgRequest = new FauxRequest( array() );
-
        wfDebug( "\n\nStart command line script $self\n" );
 } else {
-       // Can't stub this one, it sets up $_GET and $_REQUEST in its constructor
-       $wgRequest = new WebRequest;
-
        $debug = "\n\nStart request {$wgRequest->getMethod()} {$wgRequest->getRequestURL()}\n";
 
        if ( $wgDebugPrintHttpHeaders ) {
index 6cb39d8..7b76592 100644 (file)
@@ -726,47 +726,27 @@ class WebRequest {
                return wfExpandUrl( $this->getRequestURL(), PROTO_CURRENT );
        }
 
-       /**
-        * Take an arbitrary query and rewrite the present URL to include it
-        * @deprecated Use appendQueryValue/appendQueryArray instead
-        * @param string $query Query string fragment; do not include initial '?'
-        * @return string
-        */
-       public function appendQuery( $query ) {
-               wfDeprecated( __METHOD__, '1.25' );
-               return $this->appendQueryArray( wfCgiToArray( $query ) );
-       }
-
        /**
         * @param string $key
         * @param string $value
-        * @param bool $onlyquery [deprecated]
         * @return string
         */
-       public function appendQueryValue( $key, $value, $onlyquery = true ) {
-               return $this->appendQueryArray( array( $key => $value ), $onlyquery );
+       public function appendQueryValue( $key, $value ) {
+               return $this->appendQueryArray( array( $key => $value ) );
        }
 
        /**
         * Appends or replaces value of query variables.
         *
         * @param array $array Array of values to replace/add to query
-        * @param bool $onlyquery Whether to only return the query string
-        *  and not the complete URL [deprecated]
         * @return string
         */
-       public function appendQueryArray( $array, $onlyquery = true ) {
-               global $wgTitle;
+       public function appendQueryArray( $array ) {
                $newquery = $this->getQueryValues();
                unset( $newquery['title'] );
                $newquery = array_merge( $newquery, $array );
-               $query = wfArrayToCgi( $newquery );
-               if ( !$onlyquery ) {
-                       wfDeprecated( __METHOD__, '1.25' );
-                       return $wgTitle->getLocalURL( $query );
-               }
 
-               return $query;
+               return wfArrayToCgi( $newquery );
        }
 
        /**
index 6ef0a80..c7c6a9c 100644 (file)
@@ -16,7 +16,8 @@
                        "御坂美琴",
                        "RyRubyy",
                        "Umherirrender",
-                       "Apflu"
+                       "Apflu",
+                       "Hzy980512"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|文档]]\n* [[mw:API:FAQ|常见问题]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 程序错误与功能请求]\n</div>\n<strong>状态信息:</strong>本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n<strong>错误请求:</strong>当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:API:Errors_and_warnings|API: 错误与警告]]。",
        "apihelp-query+contributors-param-limit": "返回的贡献数。",
        "apihelp-query+contributors-example-simple": "显示<kbd>Main Page</kbd>的贡献。",
        "apihelp-query+deletedrevisions-description": "获得删除修订版本信息。\n\n可在很多途径中使用:\n# 获得一组页面的已删除修订,通过设置标题或页面ID。以标题和时间戳排序。\n# 通过设置它们的ID与修订ID获得关于一组已删除修订。以修订ID排序。",
+       "apihelp-query+deletedrevisions-param-start": "要开始枚举的时间戳。在处理修订ID列表时无视。",
+       "apihelp-query+deletedrevisions-param-end": "要停止枚举的时间戳。在处理修订ID列表时无视。",
        "apihelp-query+deletedrevisions-param-tag": "只列出被此标签标记的修订。",
        "apihelp-query+deletedrevisions-param-user": "只列出此用户做出的修订。",
        "apihelp-query+deletedrevisions-param-excludeuser": "不要列出此用户做出的修订。",
        "apihelp-query+deletedrevs-param-user": "只列出此用户做出的修订。",
        "apihelp-query+deletedrevs-param-excludeuser": "不要列出此用户做出的修订。",
        "apihelp-query+deletedrevs-param-namespace": "只列出此名字空间的页面。",
+       "apihelp-query+deletedrevs-param-limit": "要列出的最大修订数量。",
        "apihelp-query+deletedrevs-param-prop": "要获取的属性:\n;revid:添加被删除修订的修订ID。\n;parentid:添加上一修订的修订ID至页面。\n;user:添加做出修订的用户。\n;userid:添加做出修订的用户ID。\n;comment:添加修订摘要。\n;parsedcomment:添加解析过的修订摘要。\n;minor:如果修订是小编辑则加标签。\n;len:添加修订长度(字节)。\n;sha1:添加修订的SHA-1(base 16)。\n;content:添加修订内容。\n;token:<span class=\"apihelp-deprecated\">已弃用。</span>提供编辑令牌。\n;tags:修订标签。",
        "apihelp-query+deletedrevs-example-mode1": "列出最近已删除的对页面<kbd>Main Page</kbd>和<kbd>Talk:Main Page</kbd>的贡献,带内容(模式1)。",
        "apihelp-query+deletedrevs-example-mode2": "列出由<kbd>Bob</kbd>作出的最近50次已删除贡献(模式2)。",
        "apihelp-query+deletedrevs-example-mode3-main": "列出前50次主名字空间已删除贡献(模式3)。",
        "apihelp-query+deletedrevs-example-mode3-talk": "列出前50次{{ns:talk}}名字空间已删除页面(模式3)。",
        "apihelp-query+disabled-description": "此查询模块已被禁用。",
+       "apihelp-query+duplicatefiles-description": "根据哈希值列出此给定文件的所有副本。",
        "apihelp-query+duplicatefiles-param-limit": "返回多少重复文件。",
        "apihelp-query+duplicatefiles-param-dir": "罗列所采用的方向。",
        "apihelp-query+duplicatefiles-param-localonly": "只看本地存储库的文件。",
        "apihelp-query+users-paramvalue-prop-emailable": "Tags if the user can and wants to receive email through [[Special:Emailuser]].",
        "apihelp-query+users-paramvalue-prop-gender": "Tags the gender of the user. Returns \"male\", \"female\", or \"unknown\".",
        "apihelp-query+users-paramvalue-prop-centralids": "添加中心ID并为用户附加状态。",
+       "apihelp-query+users-param-users": "要获取信息的用户列表。",
        "apihelp-query+users-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+users-example-simple": "返回用户<kbd>Example</kbd>的信息。",
        "apihelp-query+watchlist-description": "在当前用户的监视列表中获取对页面的最近更改。",
        "apihelp-query+watchlistraw-param-fromtitle": "要列举的起始标题(带名字空间前缀)。",
        "apihelp-query+watchlistraw-param-totitle": "要列举的最终标题(带名字空间前缀)。",
        "apihelp-query+watchlistraw-example-simple": "列出当前用户的监视列表中的页面。",
+       "apihelp-query+watchlistraw-example-generator": "获取在此用户的监视列表中的页面的信息。",
        "apihelp-revisiondelete-description": "删除和恢复修订版本。",
        "apihelp-revisiondelete-param-type": "正在执行的修订版本删除类型。",
        "apihelp-revisiondelete-param-target": "要进行修订版本删除的页面标题,如果对某一类型需要。",
index 58a57a4..6f05dc4 100644 (file)
@@ -74,10 +74,16 @@ class OldChangesList extends ChangesList {
         */
        private function formatChangeLine( RecentChange $rc, array &$classes, $watched ) {
                $html = '';
+               $unpatrolled = $this->showAsUnpatrolled( $rc );
 
                if ( $rc->mAttribs['rc_log_type'] ) {
                        $logtitle = SpecialPage::getTitleFor( 'Log', $rc->mAttribs['rc_log_type'] );
                        $this->insertLog( $html, $logtitle, $rc->mAttribs['rc_log_type'] );
+                       $flags = $this->recentChangesFlags( array( 'unpatrolled' =>$unpatrolled,
+                               'bot' => $rc->mAttribs['rc_bot'] ), '' );
+                       if ( $flags !== '' ) {
+                               $html .= ' ' . $flags;
+                       }
                // Log entries (old format) or log targets, and special pages
                } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
                        list( $name, $htmlubpage ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] );
@@ -86,7 +92,6 @@ class OldChangesList extends ChangesList {
                        }
                // Regular entries
                } else {
-                       $unpatrolled = $this->showAsUnpatrolled( $rc );
                        $this->insertDiffHist( $html, $rc, $unpatrolled );
                        # M, N, b and ! (minor, new, bot and unpatrolled)
                        $html .= $this->recentChangesFlags(
index 408b5ee..61c7000 100644 (file)
@@ -700,10 +700,12 @@ class RecentChange {
         * @param string $params
         * @param int $newId
         * @param string $actionCommentIRC
+        * @param int $revId Id of associated revision, if any
         * @return RecentChange
         */
        public static function newLogEntry( $timestamp, &$title, &$user, $actionComment, $ip,
-               $type, $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' ) {
+               $type, $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '',
+               $revId = 0 ) {
                global $wgRequest;
 
                # # Get pageStatus for email notification
@@ -727,6 +729,10 @@ class RecentChange {
                                break;
                }
 
+               // Allow unpatrolled status when an associated rev id is passed
+               // May be used in core by moves and uploads
+               $markPatrolled = ( $revId > 0 ) ? $user->isAllowed( 'autopatrol' ) : true;
+
                $rc = new RecentChange;
                $rc->mTitle = $target;
                $rc->mPerformer = $user;
@@ -741,11 +747,11 @@ class RecentChange {
                        'rc_user' => $user->getId(),
                        'rc_user_text' => $user->getName(),
                        'rc_comment' => $logComment,
-                       'rc_this_oldid' => 0,
+                       'rc_this_oldid' => $revId,
                        'rc_last_oldid' => 0,
                        'rc_bot' => $user->isAllowed( 'bot' ) ? $wgRequest->getBool( 'bot', true ) : 0,
                        'rc_ip' => self::checkIPAddress( $ip ),
-                       'rc_patrolled' => 1,
+                       'rc_patrolled' => $markPatrolled ? 1 : 0,
                        'rc_new' => 0, # obsolete
                        'rc_old_len' => null,
                        'rc_new_len' => null,
index 9b6e1f3..36c644a 100644 (file)
@@ -123,8 +123,13 @@ class RequestContext implements IContextSource, MutableContext {
         */
        public function getRequest() {
                if ( $this->request === null ) {
-                       global $wgRequest; # fallback to $wg till we can improve this
-                       $this->request = $wgRequest;
+                       global $wgCommandLineMode;
+                       // create the WebRequest object on the fly
+                       if ( $wgCommandLineMode ) {
+                               $this->request = new FauxRequest( array() );
+                       } else {
+                               $this->request = new WebRequest();
+                       }
                }
 
                return $this->request;
index 5e37663..d588d51 100644 (file)
@@ -433,7 +433,7 @@ class DifferenceEngine extends ContextSource {
                                        array( $msg ) );
                        } else {
                                # Give explanation and add a link to view the diff...
-                               $query = $this->getRequest()->appendQueryValue( 'unhide', '1', true );
+                               $query = $this->getRequest()->appendQueryValue( 'unhide', '1' );
                                $link = $this->getTitle()->getFullURL( $query );
                                $msg = $suppressed ? 'rev-suppressed-unhide-diff' : 'rev-deleted-unhide-diff';
                                $out->wrapWikiMsg(
index 90b048a..8705bb0 100644 (file)
@@ -500,7 +500,7 @@ class WikiRevision {
                $prevId = $dbw->selectField( 'revision', 'rev_id',
                        array(
                                'rev_page' => $pageId,
-                               'rev_timestamp <= ' . $dbw->timestamp( $this->timestamp ),
+                               'rev_timestamp <= ' . $dbw->addQuotes( $dbw->timestamp( $this->timestamp ) ),
                        ),
                        __METHOD__,
                        array( 'ORDER BY' => array(
@@ -544,6 +544,16 @@ class WikiRevision {
 
        function importLogItem() {
                $dbw = wfGetDB( DB_MASTER );
+
+               $user = User::newFromName( $this->getUser() );
+               if ( $user ) {
+                       $userId = intval( $user->getId() );
+                       $userText = $user->getName();
+               } else {
+                       $userId = 0;
+                       $userText = $this->getUser();
+               }
+
                # @todo FIXME: This will not record autoblocks
                if ( !$this->getTitle() ) {
                        wfDebug( __METHOD__ . ": skipping invalid {$this->type}/{$this->action} log time, timestamp " .
@@ -576,8 +586,8 @@ class WikiRevision {
                        'log_type' => $this->type,
                        'log_action' => $this->action,
                        'log_timestamp' => $dbw->timestamp( $this->timestamp ),
-                       'log_user' => User::idFromName( $this->user_text ),
-                       # 'log_user_text' => $this->user_text,
+                       'log_user' => $userId,
+                       'log_user_text' => $userText,
                        'log_namespace' => $this->getTitle()->getNamespace(),
                        'log_title' => $this->getTitle()->getDBkey(),
                        'log_comment' => $this->getComment(),
index fd7dd5c..ac76621 100644 (file)
        "config-db-web-account": "Dä Zohjang zor Daatebangk för et Wiki",
        "config-db-web-help": "Donn ene Name un e Paßwoot för der Zohjang zor Daatebangk för et Wiki em nomaale Bedrief aanjävve.",
        "config-db-web-account-same": "Donn dersällve Zohjang nämme, wi heh beim Opsäze.",
-       "config-db-web-create": "Donn dä Zohjang aanlääje, wann dä noch nit doh es.",
+       "config-db-web-create": "Donn dä Zohjang aanlähje, wann dä noch nit doh es.",
        "config-db-web-no-create-privs": "Dä Zohjang för et Opsäze es nit berääschtesch, ene ander Zohjan enzereeschte.\nDä aanjejovve Zohjang för der Nomaalbedrief moß dröm schunn enjersht sen!",
        "config-mysql-engine": "De Zoot udder et Fommaat vun de Tabälle:",
        "config-mysql-innodb": "InnoDB",
index 8427adb..993f3de 100644 (file)
@@ -386,6 +386,9 @@ class ManualLogEntry extends LogEntryBase {
        /** @var string Comment for the log entry */
        protected $comment = '';
 
+       /** @var int A rev id associated to the log entry */
+       protected $revId = 0;
+
        /** @var int Deletion state of the log entry */
        protected $deleted;
 
@@ -484,6 +487,17 @@ class ManualLogEntry extends LogEntryBase {
                $this->comment = $comment;
        }
 
+       /**
+        * Set an associated revision id.
+        *
+        * @since 1.27
+        *
+        * @param int $revId
+        */
+       public function setAssociatedRevId( $revId ) {
+               $this->revId = $revId;
+       }
+
        /**
         * Set the 'legacy' flag
         *
@@ -608,7 +622,8 @@ class ManualLogEntry extends LogEntryBase {
                        $this->getComment(),
                        LogEntryBase::makeParamBlob( $this->getParameters() ),
                        $newId,
-                       $formatter->getIRCActionComment() // Used for IRC feeds
+                       $formatter->getIRCActionComment(), // Used for IRC feeds
+                       $this->getAssociatedRevId() // Used for e.g. moves and uploads
                );
        }
 
@@ -632,6 +647,12 @@ class ManualLogEntry extends LogEntryBase {
                if ( $to === 'udp' || $to === 'rcandudp' ) {
                        $rc->notifyRCFeeds();
                }
+
+               // Log the autopatrol if an associated rev id was passed
+               if ( $this->getAssociatedRevId() > 0 &&
+                       $rc->getAttribute( 'rc_patrolled' ) === 1 ) {
+                       PatrolLog::record( $rc, true, $this->getPerformer() );
+               }
        }
 
        // LogEntry->
@@ -672,6 +693,14 @@ class ManualLogEntry extends LogEntryBase {
                return $this->comment;
        }
 
+       /**
+        * @since 1.27
+        * @return int
+        */
+       public function getAssociatedRevId() {
+               return $this->revId;
+       }
+
        /**
         * @since 1.25
         * @return bool
index c0e5556..2ecbafb 100644 (file)
@@ -1204,7 +1204,7 @@ class SkinTemplate extends Skin {
                        $nav_urls['print'] = array(
                                'text' => $this->msg( 'printableversion' )->text(),
                                'href' => $this->getTitle()->getLocalURL(
-                                       $request->appendQueryValue( 'printable', 'yes', true ) )
+                                       $request->appendQueryValue( 'printable', 'yes' ) )
                        );
                }
 
index db50bd8..226d633 100644 (file)
@@ -321,7 +321,8 @@ class SpecialBlock extends FormSpecialPage {
        protected function preText() {
                $this->getOutput()->addModules( array( 'mediawiki.special.block', 'mediawiki.userSuggest' ) );
 
-               $text = $this->msg( 'blockiptext' )->parse();
+               $blockCIDRLimit = $this->getConfig()->get( 'BlockCIDRLimit' );
+               $text = $this->msg( 'blockiptext', $blockCIDRLimit['IPv4'], $blockCIDRLimit['IPv6'] )->parse();
 
                $otherBlockMessages = array();
                if ( $this->target !== null ) {
index 17c224c..14d8675 100644 (file)
@@ -207,7 +207,7 @@ class SpecialExpandTemplates extends SpecialPage {
                $form
                        ->setSubmitTextMsg( 'expand_templates_ok' )
                        ->setWrapperLegendMsg( 'expandtemplates' )
-                       ->setHeaderText( $this->msg( 'expand_templates_intro' )->text() )
+                       ->setHeaderText( $this->msg( 'expand_templates_intro' )->parse() )
                        ->setSubmitCallback( array( $this, 'onSubmitInput' ) )
                        ->showAlways();
        }
index ba11862..74a1322 100644 (file)
@@ -38,18 +38,27 @@ class ShortPagesPage extends QueryPage {
        }
 
        public function getQueryInfo() {
+               $tables = array( 'page' );
+               $conds = array(
+                       'page_namespace' => MWNamespace::getContentNamespaces(),
+                       'page_is_redirect' => 0
+               );
+               $joinConds = array();
+               $options = array( 'USE INDEX' => array( 'page' => 'page_redirect_namespace_len' ) );
+
+               // Allow extensions to modify the query
+               Hooks::run( 'ShortPagesQuery', array( &$tables, &$conds, &$joinConds, &$options ) );
+
                return array(
-                       'tables' => array( 'page' ),
+                       'tables' => $tables,
                        'fields' => array(
                                'namespace' => 'page_namespace',
                                'title' => 'page_title',
                                'value' => 'page_len'
                        ),
-                       'conds' => array(
-                               'page_namespace' => MWNamespace::getContentNamespaces(),
-                               'page_is_redirect' => 0
-                       ),
-                       'options' => array( 'USE INDEX' => 'page_redirect_namespace_len' )
+                       'conds' => $conds,
+                       'join_conds' => $joinConds,
+                       'options' => $options
                );
        }
 
index f41175b..9b0254a 100644 (file)
        "passwordreset-emailtext-ip": "Dalguién (seique vusté, dende la direición IP $1)solicitó'l reaniciu de la so contraseña de {{SITENAME}} ($4).\n{{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}\na esta direición de corréu electrónicu:\n\n$2\n\n{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.\nTendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solicitú la fizo otra persona,\no si recordó la clave orixinal y yá nun quier camudala, pue escaecer esti mensaxe y siguir\nusando la contraseña antigua.",
        "passwordreset-emailtext-user": "L'usuariu $1 de {{SITENAME}} solicitó un reaniciu de la so contraseña de {{SITENAME}} ($4). {{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}} con esta direición de corréu electrónicu:\n\n$2\n\n{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.\nTendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solicitú la fizo otra persona, o si recordó la clave orixinal y yá nun quier camudala, pue escaecer esti mensaxe y siguir usando la contraseña antigua.",
        "passwordreset-emailelement": "Nome d'usuariu: \n$1\n\nContraseña temporal: \n$2",
-       "passwordreset-emailsentemail": "Si esta ye una direición de corréu electrónicu rexistrada pa la to cuenta, unviaráse un corréu pa reaniciar la contraseña.",
-       "passwordreset-emailsentusername": "Si hai una direición rexistrada de corréu electrónicu correspondiente a esta cuenta, unviaráse un corréu electrónicu pa reaniciar la contraseña.",
+       "passwordreset-emailsentemail": "Si esta direición de corréu electrónicu ta asociada cola to cuenta, unviaráse un corréu pa reaniciar la contraseña.",
+       "passwordreset-emailsentusername": "Si hai una direición de corréu electrónicu asociada con esti nome d'usuariu, unviaráse un corréu electrónicu pa reaniciar la contraseña.",
        "passwordreset-emailsent-capture": "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo.",
        "passwordreset-emailerror-capture": "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo, pero falló l'unviu {{GENDER:$2|al usuariu|a la usuaria}}: $1",
        "changeemail": "Camudar o desaniciar la dirección de corréu electrónicu",
        "upload-form-label-select-file": "Seleiciona un ficheru",
        "upload-form-label-infoform-title": "Detalles",
        "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-name-tooltip": "Un títulu descriptivu únicu pal ficheru, que sirvirá para da-y nome al ficheru. Se pue usar llinguax normal con espacios. Nun amiestes la estensión del ficheru.",
        "upload-form-label-infoform-description": "Descripción",
+       "upload-form-label-infoform-description-tooltip": "Describe de mou curtiu cualquier cosa notable de la obra.\nPa una semeya, cuenta les principales coses qu'apaecen, la ocasión o'l sitiu.",
        "upload-form-label-usage-title": "Usu",
        "upload-form-label-usage-filename": "Nome del ficheru",
        "foreign-structured-upload-form-label-own-work": "Esti ye'l mio propiu trabayu",
        "export-download": "Guardar como archivu",
        "export-templates": "Inxerir plantíes",
        "export-pagelinks": "Incluyir páxines enllazaes fasta una profundidá de:",
+       "export-manual": "Amestar páxines a mano:",
        "allmessages": "Tolos mensaxes del sistema",
        "allmessagesname": "Nome",
        "allmessagesdefault": "Testu predetermináu",
        "expand_templates_preview": "Vista previa",
        "expand_templates_preview_fail_html": "<em>Como {{SITENAME}} tien activáu el códigu HTML puru y hebo una perda de datos de la sesión, la vista previa ta tapecida como precaución escontra ataques de JavaScript.</em>\n\n<strong>Si esti ye un intentu llexítimu d'accesu a la vista previa, vuelvi a intentalo.</strong>\nSi inda nun funciona, intenta [[Special:UserLogout|salir]] y volver a entrar na to cuenta.",
        "expand_templates_preview_fail_html_anon": "<em>Como {{SITENAME}} tien activáu el códigu HTML puru y nun aniciasti sesión, la vista previa ta tapecida como precaución escontra ataques de JavaScript.</em>\n\n<strong>Si esti ye un intentu llexítimu d'accesu a la vista previa, intenta [[Special:UserLogin|entrar]] y vuelvi a intentalo.</strong>",
+       "expand_templates_input_missing": "Fai falta dar daqué de testu d'entrada.",
        "pagelanguage": "Selector de llingua de la páxina",
        "pagelang-name": "Páxina",
        "pagelang-language": "Llingua",
        "pagelang-use-default": "Usar la llingua predeterminada",
        "pagelang-select-lang": "Escoyer llingua",
+       "pagelang-submit": "Unviar",
        "right-pagelang": "Cambiar la llingua de la páxina",
        "action-pagelang": "cambiar la llingua de la páxina",
        "log-name-pagelang": "Rexistru de cambios de llingua",
        "mediastatistics": "Estadístiques de multimedia",
        "mediastatistics-summary": "Estadístiques sobro los tipos de ficheros xubíos. Esto sólo incluye la versión más nueva d'un ficheru. Escluyense les versiones antigües o desaniciaes de los ficheros.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Tamañu total del ficheru pa esta sección: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%).",
+       "mediastatistics-allbytes": "Tamañu total del ficheru pa tolos ficheros: {{PLURAL:$1|$1 byte|$1 bytes}} ($2).",
        "mediastatistics-table-mimetype": "Tipu MIME",
        "mediastatistics-table-extensions": "Estensiones posibles",
        "mediastatistics-table-count": "Númberu de ficheros",
        "mediastatistics-header-text": "Testual",
        "mediastatistics-header-executable": "Executables",
        "mediastatistics-header-archive": "Formatos comprimíos",
+       "mediastatistics-header-total": "Tolos ficheros",
        "json-warn-trailing-comma": "$1 {{PLURAL:$1|coma al final desanicióse|comes al final desaniciáronse}} de JSON",
        "json-error-unknown": "Hebo un problema col JSON. Error: $1",
        "json-error-depth": "Pasóse de la fondura máxima de la pila",
index dbe3a67..edf10c8 100644 (file)
        "tags-deactivate": "адключыць",
        "tags-hitcount": "$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}",
        "tags-manage-no-permission": "Вы ня маеце правоў на зьмену метак.",
+       "tags-manage-blocked": "Вы ня можаце мяняць меткі, калі заблякаваныя.",
        "tags-create-heading": "Стварэньне новай меткі",
        "tags-create-explanation": "Па змоўчаньні, наваствораныя меткі будуць даступныя для выкарыстаньня ўдзельнікамі і робатамі.",
        "tags-create-tag-name": "Назва меткі:",
        "tags-deactivate-not-allowed": "Немагчыма дэактываваць метку «$1».",
        "tags-deactivate-submit": "Адключыць",
        "tags-apply-no-permission": "Вы ня маеце права прымяняць меткі да вашых рэдагаваньняў.",
+       "tags-apply-blocked": "Вы ня можаце мяняць меткі да вашых зьменаў, калі заблякаваныя.",
        "tags-apply-not-allowed-one": "Метка «$1» ня можа быць прызначаная ўручную.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Наступную метку|Наступныя меткі}} нельга дадаваць уручную: $1",
        "tags-update-no-permission": "Вы ня маеце права на дадаваньне ці выдаленьне метак зьменаў для асобных вэрсіяў ці запісаў журналаў.",
index fa96f36..50b3ffb 100644 (file)
        "sig_tip": "Вашият подпис заедно с времева отметка",
        "hr_tip": "Хоризонтална линия (използвайте пестеливо)",
        "summary": "Резюме:",
-       "subject": "Тема/заглавие:",
+       "subject": "Ð\97аглавие:",
        "minoredit": "Това е малка промяна",
        "watchthis": "Наблюдаване на страницата",
        "savearticle": "Съхраняване",
        "anonpreviewwarning": "Внимание: Не сте влезли в системата. Ако съхраните редакцията си, тя ще бъде записана в историята на страницата с вашият IP-адрес.",
        "missingsummary": "'''Напомняне:''' Не е въведено кратко описание на промените. При повторно натискане на бутона „Съхраняване“, редакцията ще бъде съхранена без резюме.",
        "missingcommenttext": "По-долу въведете вашето съобщение.",
-       "missingcommentheader": "'''Напомняне:''' Не е въведено заглавие на коментара.\nПри повторно натискане на \"{{int:savearticle}}\", редакцията ще бъде записана без такова.",
+       "missingcommentheader": "<strong>Напомняне:</strong> Не е въведено заглавие на коментара.\nПри повторно натискане на \"{{int:savearticle}}\", редакцията ще бъде записана без такова.",
        "summary-preview": "Предварителен преглед на резюмето:",
        "subject-preview": "Предварителен преглед на заглавието:",
+       "previewerrortext": "Възникна грешка при опита за преглед на промените.",
        "blockedtitle": "Потребителят е блокиран",
        "blockedtext": "'''Вашето потребителско име (или IP-адрес) беше блокирано.'''\n\nБлокирането е извършено от $1. Посочената причина е: ''$2''\n\n*Начало на блокирането: $8\n*Край на блокирането: $6\n*Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „Пращане писмо на потребител“ само ако не ви е забранена употребата й и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nВашият IP адрес е $3, а номерът на блокирането е $5. Включвайте едно от двете или и двете във всяко запитване, което правите.",
        "autoblockedtext": "IP-адресът ви беше блокиран автоматично, защото е бил използван от друг потребител, който е бил блокиран от $1.\nПосочената причина е:\n\n:''$2''\n\n* Начало на блокирането: $8\n* Край на блокирането: $6\n* Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „Пращане писмо на потребител“ само ако не ви е забранена употребата й и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nТекущият ви IP-адрес е $3, а номерът на блокирането ви е $5. Включвайте ги във всяко питане, което правите.",
        "copyrightwarning": "Обърнете внимание, че всички приноси към {{SITENAME}} се публикуват при условията на $2 (за подробности вижте $1).\nАко не сте съгласни вашата писмена работа да бъде променяна и разпространявана без ограничения, не я публикувайте.<br />\n\nСъщо потвърждавате, че '''вие''' сте написали материала или сте използвали '''свободни ресурси''' — <em>обществено достояние</em> или друг свободен източник.\nАко сте ползвали чужди материали, за които имате разрешение, непременно посочете източника.\n\n<div style=\"font-variant:small-caps\">'''Не публикувайте произведения с авторски права без разрешение!'''</div>",
        "copyrightwarning2": "Обърнете внимание, че всички приноси към {{SITENAME}} могат да бъдат редактирани, променяни или премахвани от останалите сътрудници.\nАко не сте съгласни вашата писмена работа да бъде променяна без ограничения, не я публикувайте.<br />\nСъщо потвърждавате, че '''вие''' сте написали материала или сте използвали '''свободни ресурси''' — <em>обществено достояние</em> или друг свободен източник (за подробности вижте $1).\nАко сте ползвали чужди материали, за които имате разрешение, непременно посочете източника.\n\n<div style=\"font-variant:small-caps\">'''Не публикувайте произведения с авторски права без разрешение!'''</div>",
        "longpageerror": "'''ГРЕШКА: Изпратеният текст е с големина {{PLURAL:$1|един килобайт|$1 килобайта}}, което надвишава позволения максимум от {{PLURAL:$2|един килобайт|$2 килобайта}}.'''\nПоради тази причина той не може да бъде съхранен.",
-       "readonlywarning": "'''ВНИМАНИЕ: Базата от данни беше затворена за поддръжка, затова в момента промените няма да могат да бъдат съхранени.'''\n\nАко желаете, можете да съхраните страницата като текстов файл и да се опитате да я публикувате по-късно.\n\nАдминистраторът, който е затворил базата от данни, е посочил следната причина: $1",
+       "readonlywarning": "<strong>ВНИМАНИЕ: Базата от данни беше затворена за поддръжка, затова в момента промените няма да могат да бъдат съхранени.</strong>\n\nАко желаете, можете да съхраните страницата като текстов файл и да се опитате да я публикувате по-късно.\n\nСистемният администратор, който е затворил базата от данни, е посочил следната причина: $1",
        "protectedpagewarning": "'''Внимание: Страницата е защитена и само потребители със статут на администратори могат да я редактират.'''\nЗа справка по-долу е показан последният запис от дневниците.",
        "semiprotectedpagewarning": "'''Забележка:''' Тази страница е защитена и само регистрирани потребители могат да я редактират.\nЗа справка по-долу е показан последният запис от дневниците.",
-       "cascadeprotectedwarning": "'''Внимание:''' Страницата е защитена, като само потребители с администраторски права могат да я редактират. Тя е включена в {{PLURAL:$1|следната страница|следните страници}} с каскадна защита:",
+       "cascadeprotectedwarning": "<strong>Внимание:</strong> Страницата е защитена, като само потребители с администраторски права могат да я редактират. Тя е включена в {{PLURAL:$1|следната страница|следните страници}} с каскадна защита:",
        "titleprotectedwarning": "'''Внимание: Тази страница е защитена и са необходими [[Special:ListGroupRights|специални права]], за да бъде създадена.'''\nЗа справка по-долу е показан последният запис от дневниците.",
        "templatesused": "{{PLURAL:$1|Шаблон, използван|Шаблони, използвани}} на страницата:",
        "templatesusedpreview": "{{PLURAL:$1|Шаблон, използван|Шаблони, използвани}} в предварителния преглед:",
        "columns": "Колони:",
        "searchresultshead": "Търсене",
        "stub-threshold": "Праг за форматиране на <a href=\"#\" class=\"stub\">препратки към мъничета</a>:",
+       "stub-threshold-sample-link": "пример",
        "stub-threshold-disabled": "Изключено",
        "recentchangesdays": "Брой дни в последни промени:",
        "recentchangesdays-max": "(най-много $1 {{PLURAL:$1|ден|дни}})",
        "upload-misc-error-text": "Неизвестна грешка при качване. Убедете се, че адресът е верен и опитайте отново. Ако отново имате проблем, обърнете се към [[Special:ListUsers/sysop|администратор]].",
        "upload-too-many-redirects": "Адресът съдържа твърде много пренасочвания",
        "upload-http-error": "Възникна HTTP грешка: $1",
+       "upload-dialog-button-cancel": "Отказване",
+       "upload-dialog-button-done": "Готово",
+       "upload-dialog-button-save": "Съхраняване",
+       "upload-dialog-button-upload": "Качване",
+       "upload-form-label-select-file": "Избиране на файл",
+       "upload-form-label-infoform-title": "Подробности",
+       "upload-form-label-infoform-name": "Име",
+       "upload-form-label-infoform-description": "Описание",
+       "upload-form-label-usage-title": "Използване",
+       "upload-form-label-usage-filename": "Име на файл",
+       "foreign-structured-upload-form-label-infoform-categories": "Категории",
+       "foreign-structured-upload-form-label-infoform-date": "Дата",
        "foreign-structured-upload-form-3-label-yes": "Да",
        "foreign-structured-upload-form-3-label-no": "Не",
        "backend-fail-notexists": "Файлът $1 не съществува.",
        "wlshowlast": "Показване на последните $1 часа $2 дни",
        "watchlistall2": "всички",
        "watchlist-hide": "Скриване",
+       "watchlist-submit": "Показване",
        "wlshowtime": "Период от време за показване:",
+       "wlshowhideminor": "малки промени",
+       "wlshowhidebots": "ботове",
+       "wlshowhideliu": "регистрирани потребители",
+       "wlshowhideanons": "анонимни потребители",
+       "wlshowhidepatr": "проверени редакции",
+       "wlshowhidemine": "моите редакции",
        "watchlist-options": "Опции на списъка за наблюдение",
        "watching": "Наблюдение…",
        "unwatching": "Спиране на наблюдение…",
        "deletepage": "Изтриване",
        "confirm": "Потвърждаване",
        "excontent": "съдържанието беше: „$1“",
-       "excontentauthor": "съдържанието беше: „$1“ (като единственият автор беше [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "съдържанието беше: „$1“, като единственият автор беше \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|беседа]])",
        "exbeforeblank": "премахнато преди това съдържание: „$1“",
        "delete-confirm": "Изтриване на „$1“",
        "delete-legend": "Изтриване",
-       "historywarning": "'''Внимание:''' Страницата, която възнамерявате да изтриете, има история с приблизително $1 {{PLURAL:$1|редакция|редакции}}:",
+       "historywarning": "\"Внимание:</strong>  Страницата, която възнамерявате да изтриете, има история с приблизително $1 {{PLURAL:$1|редакция|редакции}}:",
        "historyaction-submit": "Показване",
        "confirmdeletetext": "На път сте безвъзвратно да изтриете страница или файл, заедно с цялата прилежаща редакционна история, от базата от данни.\nПотвърдете, че искате това, разбирате последствията и правите това в съответствие с [[{{MediaWiki:Policy-url}}|линията на поведение]].",
        "actioncomplete": "Действието беше изпълнено",
        "rollback-success": "Отменени редакции на $1; възвръщане към последната версия на $2.",
        "sessionfailure-title": "Прекъсната сесия",
        "sessionfailure": "Изглежда има проблем със сесията ви; действието беше отказано като предпазна мярка срещу крадене на сесията. Натиснете бутона за връщане на браузъра, презаредете страницата, от която сте дошли, и опитайте отново.",
+       "changecontentmodel-title-label": "Заглавие на страницата",
+       "changecontentmodel-reason-label": "Причина:",
        "protectlogpage": "Дневник на защитата",
        "protectlogtext": "Списък на промените в защитата за страницата.\nМожете да прегледате и [[Special:ProtectedPages|списъка на текущо защитените страници]].",
        "protectedarticle": "защити „[[$1]]“",
        "movenotallowedfile": "Нямате права да премествате файлове.",
        "cant-move-user-page": "Нямате нужните права на достъп, за да местите потребителски страници (можете да местите само подстраници).",
        "cant-move-to-user-page": "Нямате нужните права на достъп, за да извършвате преместване на страници върху потребителски страници (можете да местите само върху подстраници от потребителското пространство).",
-       "newtitle": "Ð\9aÑ\8aм Ð½ово заглавие:",
+       "newtitle": "Ð\9dово заглавие:",
        "move-watch": "Наблюдаване на страницата",
        "movepagebtn": "Преместване",
        "pagemovedsub": "Преместването беше успешно",
        "version-libraries": "Инсталирани библиотеки",
        "version-libraries-library": "Библиотека",
        "version-libraries-version": "Версия",
+       "version-libraries-description": "Описание",
+       "version-libraries-authors": "Автори",
        "redirect-submit": "Отваряне",
        "redirect-value": "Стойност:",
        "redirect-user": "Потребителски номер",
        "special-characters-title-minus": "знак минус",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
+       "mw-widgets-titleinput-description-new-page": "страницата все още не съществува",
+       "mw-widgets-titleinput-description-redirect": "пренасочване към $1",
        "api-error-blacklisted": "Моля, изберете различно, описателно заглавие."
 }
index b4dabe0..2833ee9 100644 (file)
        "viewpagelogs": "Pogledaj zapisnike ove stranice",
        "nohistory": "Ne postoji historija izmjena za ovu stranicu.",
        "currentrev": "Trenutna verzija",
-       "currentrev-asof": "Trenutna verzija na dan $1",
+       "currentrev-asof": "Trenutna verzija na dan $2 u $3",
        "revisionasof": "Verzija od $1",
        "revision-info": "Izmjena od $1 od {{GENDER:$6|$2}}$7",
        "previousrevision": "← Starija izmjena",
index 05e6589..2ead049 100644 (file)
        "unblock": "Benutzer freigeben",
        "blockip": "IP-Adresse/{{GENDER:$1|Benutzer|Benutzerin}} sperren",
        "blockip-legend": "IP-Adresse/Benutzer sperren",
-       "blockiptext": "Mit diesem Formular sperrst du eine IP-Adresse oder einen Benutzernamen, so dass von dort keine Änderungen mehr vorgenommen werden können.\nDies sollte nur erfolgen, um Vandalismus zu verhindern und in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]].\nBitte gib den Grund für die Sperre an.",
+       "blockiptext": "Mit diesem Formular sperrst du eine IP-Adresse oder einen Benutzernamen, so dass von dort keine Änderungen mehr vorgenommen werden können.\nDies sollte nur erfolgen, um Vandalismus zu verhindern und in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]].\nBitte gib den Grund für die Sperre an.\nDu kannst IP-Bereiche mit der [https://de.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]-Syntax sperren; der größte erlaubte Bereich ist /$1 für IPv4 und /$2 für IPv6.",
        "ipaddressorusername": "IP-Adresse oder Benutzername:",
        "ipbexpiry": "Sperrdauer:",
        "ipbreason": "Grund:",
index 0b31abc..5c811bf 100644 (file)
        "unblock-summary": "",
        "blockip": "Block {{GENDER:$1|user}}",
        "blockip-legend": "Block user",
-       "blockiptext": "Use the form below to block write access from a specific IP address or username.\nThis should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].\nFill in a specific reason below (for example, citing particular pages that were vandalized).",
+       "blockiptext": "Use the form below to block write access from a specific IP address or username.\nThis should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].\nFill in a specific reason below (for example, citing particular pages that were vandalized).\nYou can block IP ranges using the [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] syntax; the largest allowed range is /$1 for IPv4 and /$2 for IPv6.",
        "ipaddressorusername": "IP address or username:",
        "ipbexpiry": "Expiry:",
        "ipbreason": "Reason:",
index e490b21..e07228d 100644 (file)
        "unblock": "שחרור משתמש",
        "blockip": "חסימת {{GENDER:$1|משתמש|משתמשת}}",
        "blockip-legend": "חסימת משתמש",
-       "blockiptext": "השתמשו בטופס שלהלן כדי לחסום את הרשאות הכתיבה מכתובת IP או משתמש מסוימים.\nחסימות כאלה צריכות להתבצע רק כדי למנוע השחתה, ובהתאם ל[[{{MediaWiki:Policy-url}}|נהלים]].\nאנא מלאו את הסיבה הפרטנית לחסימה להלן (לדוגמה, באמצעות ציון דפים מסוימים שהשחית המשתמש).",
+       "blockiptext": "השתמשו בטופס שלהלן כדי לחסום את הרשאות הכתיבה מכתובת IP או משתמש מסוימים.\nחסימות כאלה צריכות להתבצע רק כדי למנוע השחתה, ובהתאם ל[[{{MediaWiki:Policy-url}}|נהלים]].\nאנא מלאו את הסיבה הפרטנית לחסימה להלן (לדוגמה, באמצעות ציון דפים מסוימים שהשחית המשתמש).\nבאפשרותך לחסום טווחי IP באמצעות תחביר [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; הטווח הגדול ביותר שמורשה הוא <span dir=\"ltr\">/$1</span> עבור IPv4 ו־<span dir=\"ltr\">/$2</span> עבור IPv6.",
        "ipaddressorusername": "כתובת IP או שם משתמש:",
        "ipbexpiry": "פקיעה:",
        "ipbreason": "סיבה:",
index 008e61f..19062c2 100644 (file)
        "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
        "watchlistall2": "sve",
        "watchlist-hide": "Sakrij",
+       "watchlist-submit": "Prikaži",
        "wlshowtime": "Prikaži posljednjih:",
        "wlshowhideminor": "manje promjene",
        "wlshowhidebots": "botove",
index 3225cbd..94700cc 100644 (file)
        "mediastatistics": "メディア統計",
        "mediastatistics-summary": "アップロードされたファイルの種類に関する統計です。これはファイルの最新バージョンのみを含みます。以前のまたは削除されたバージョンについては除外されています。",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 バイト}} ($2; $3%)",
-       "mediastatistics-bytespertype": "このセクションの総ファイルサイズは $1 バイトです。",
-       "mediastatistics-allbytes": "全ファイルの総ファイルサイズは $1 バイトです。",
+       "mediastatistics-bytespertype": "このセクションの総ファイルサイズは {{PLURAL:$1|$1 バイト}} ($2、$3%) です。",
+       "mediastatistics-allbytes": "全ファイルの総ファイルサイズは {{PLURAL:$1|$1 バイト}} ($2) です。",
        "mediastatistics-table-mimetype": "MIMEタイプ",
        "mediastatistics-table-extensions": "取りうる拡張子",
        "mediastatistics-table-count": "ファイル数",
index 5571ae5..fbab2fc 100644 (file)
        "cachedspecial-viewing-cached-ts": "თქვენ ნახულობთ ამ გვერდის ქეშირებულ ვერსიას, რომელიც შესაძლოა მნიშვნელოვნად განსხვავდებოდეს მიმდინარე ვერსისაგან.",
        "cachedspecial-refresh-now": "ბოლო ვერსიის ხილვა.",
        "categories": "კატეგორიები",
+       "categories-submit": "ჩვენება",
        "categoriespagetext": "შემდეგი {{PLURAL:$1|კატეგორია შეიცავს|კატეგორია შეიცავს}} გვერდს ან მედიას.\n[[Special:UnusedCategories|გამოუყენებელი კატეგორიები]] აქ ნაჩვენები არ არის.\nიხ. ასევე [[Special:WantedCategories|მოთხოვნილი კატეგორიები]].",
        "categoriesfrom": "აჩვენეთ კატეგორიები, რომლებიც იწყება:",
        "special-categories-sort-count": "დაალაგეთ რაოდენობის მიხედვით",
        "delete-confirm": "„$1“-ის წაშლა",
        "delete-legend": "წაშლა",
        "historywarning": "'''ყურადღება:''' გვერდს, რომლის წაშლასაც აპირებთ, აქვს დიდი ისტორია: ($1)",
+       "historyaction-submit": "ჩვენება",
        "confirmdeletetext": "თქვენ მოითხოვეთ გვერდისა (ან ფაილისა) და მონაცემთა ბაზიდან მისი ისტორიის წაშლა.\nგთხოვთ დაადასტუროთ, რომ მართლაც აპირებთ ამის გაკეთებას და გესმით თქვენი ქმედებების ფასი.\nასევე გადაამოწმეთ, თუ ასრულებთ ამას [[{{MediaWiki:Policy-url}}|წესებიდან გამომდინარე]].",
        "actioncomplete": "მოქმედება შესრულებულია",
        "actionfailed": "მოქმედება ვერ განხორციელდა",
index e99b740..5c7ed50 100644 (file)
        "emailccme": "Scheck mer en Kopie vun dä E-Mail.",
        "emailccsubject": "En Kopie vun Dinger E-Mail aan $1: $2",
        "emailsent": "De <i lang=\"en\">e-mail</i> es ongerwähs",
-       "emailsenttext": "Ding E-Mail es jetz lossjescheck woode.",
+       "emailsenttext": "Ding <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> es jäz loßßjeschek woode.",
        "emailuserfooter": "Heh di <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> hät {{GENDER:$1|dä|et|dä Metmaacher|di Metmaacherėn|dät}} „$1“ an {{GENDER:$2|dä|et|dä Metmaacher|di Metmaacherėn|dät}} „$2“ jescheck, un doför {{GRAMMAR:en dative|{{SITENAME}}}} dat „{{int:emailuser}}“ jebruch.",
        "usermessage-summary": "En Nohreesch vum Wiki afjelivvert.",
        "usermessage-editor": "Name vum Metmaacher för de Täxte un Nohreshte vum Wiki ze beärbeide",
        "thumbnail_error_remote": "Ene Fähler es em $1 opjevalle:\n$2",
        "djvu_page_error": "De DjVu-Sgg es ußerhallef",
        "djvu_no_xml": "De XML-Date för di DjVu-Datei kunnte mer nit afrofe",
-       "thumbnail-temp-create": "Mer kunnte kein Zweschedattei für Minnibeldscher aanlääje.",
+       "thumbnail-temp-create": "Mer kunnte kein Zweschedattei für Minnibeldscher aanlähje.",
        "thumbnail-dest-create": "Mer kunnte kein Minnibeldscher faßhallde, woh se hen sulle.",
        "thumbnail_invalid_params": "Ene Parameter för et Breefmarke-Belldsche (<i lang=\"en\">thumbnail</i>) Maache wohr nit en Odenung",
        "thumbnail_toobigimagearea": "Datteij met mih wi $1",
index 8f39889..86a2f3e 100644 (file)
@@ -59,9 +59,9 @@
        "tog-watchlisthidebots": "Recensiones per automaton factas in paginarum observatarum indice supprimere",
        "tog-watchlisthideminor": "Minores recensiones in paginarum observatarum indice supprimere",
        "tog-watchlisthideliu": "Recensiones ab usoribus notis factas in paginarum observatarum indice supprimere",
-       "tog-watchlistreloadautomatically": "Quamprimum aliquis selectus mutatus erit, indicem paginarum observatarum reficere (JavaScript required)",
+       "tog-watchlistreloadautomatically": "Quamprimum aliquis selectus mutatus erit, indicem paginarum observatarum reficere (JavaScript necesse est)",
        "tog-watchlisthideanons": "Recensiones ab usoribus ignotis factas in paginarum observatarum indice supprimere",
-       "tog-watchlisthidepatrolled": "Recensiones custoditarum paginarum supprimere",
+       "tog-watchlisthidepatrolled": "Recensiones custoditas supprimere",
        "tog-ccmeonemails": "Transcriptiones earum, quas ad alios usores misero litteras, mihi ipsi mittantur",
        "tog-diffonly": "Nihil nisi differentiam in pagina factam ostendatur",
        "tog-showhiddencats": "Categorias celatas monstrare",
        "email": "Litterae electronicae",
        "prefs-help-realname": "Nomen verum non necesse est.\nSi vis id dare, opera tua tibi ascribentur.",
        "prefs-help-email": "Non necesse est inscriptionem electronicam dare. Qua tamen data tessera tibi tribui poterit nova, si prioris oblitus eris.",
-       "prefs-help-email-others": "Praeterea, si libeat, aliis concedas tibi nuntia per nexum in pagina vel disputatione tua positum mitttere electronicas.\nInscriptio tua electronica usoribus tibi scribentis non erit visibilis.",
+       "prefs-help-email-others": "Praeterea, si libeat, aliis concedas tibi nuntia per nexum in pagina vel disputatione tua positum mittere electronicas.\nInscriptio tua electronica usoribus tibi scribentis non erit visibilis.",
        "prefs-help-email-required": "Inscriptio electronica necesse est.",
        "prefs-info": "Generalia",
        "prefs-i18n": "Sermonis delectus",
index 132cc7f..9694320 100644 (file)
        "userpage-userdoesnotexist": "'O cunto utente \"<nowiki>$1</nowiki>\" nun è riggistrato. Cuntrolla ca si buò overo crià o cagnà sta paggena.",
        "userpage-userdoesnotexist-view": "'O cunto utente \"$1\" nun è riggistrato.",
        "blocked-notice-logextract": "St'utente è bloccato mò.\nL'urdemo elemento d' 'o riggistro 'e blocche è ripurtato ccà abbascio p'avé nu riferimento:",
-       "clearyourcache": "'''Nota:''' aroppo sarvate putisse necessità 'e pulezzà 'a caché d' 'o navigatóre pe' vedé 'e cagnamiente. \n*'''Firefox / Safari''': sprémme 'o buttóne maiuscole e ffà clic ncopp'a ''Recarreca'', o pure spremme ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' ncopp'a Mac)\n*'''Google Chrome''': spremme ''Ctrl-Shift-R'' (''⌘-Shift-R'' ncopp'a nu Mac)\n*'''Internet Explorer''': spremme 'o buttóne ''Ctrl'' pe' tramente ca faie click ncopp'a ''Refresh'', o pure spremmere ''Ctrl-F5''\n*'''Opera''': abbacanta tutt' 'a cache addò menu ''Strumiente → Preferenze''",
+       "clearyourcache": "'''Nota:''' aroppo sarvate putisse necessità 'e pulezzà 'a caché d' 'o navigatóre pe' vedé 'e cagnamiente. \n*'''Firefox / Safari''': sprémme 'o buttóne maiuscole e ffà clic ncopp'a ''Recarreca'', o pure spremme ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' ncopp'a Mac)\n*'''Google Chrome''': spremme ''Ctrl-Shift-R'' (''⌘-Shift-R'' ncopp'a nu Mac)\n*'''Internet Explorer''': spremme 'o buttóne ''Ctrl'' pe' tramente ca faie click ncopp'a ''Refresh'', o pure spremmere ''Ctrl-F5''\n*'''Opera''': sbacanta tutt' 'a cache addò menu ''Strumiente → Preferenze''",
        "usercssyoucanpreview": "'''Cunziglio:''' spremme 'o buttone 'Vide anteprimma' pe' pruvà 'o CSS nuovo apprimma d' 'o sarvà.",
        "userjsyoucanpreview": "'''Cunziglio:''' spremme 'o buttone 'Vide anteprimma' pe' pruvà 'o JavaScript nuovo apprimma d' 'o sarvà.",
        "usercsspreview": "'''Arricuordate ca chest'è sulamente n'anteprimma p' 'o CSS perzunale. 'E cagnamiente nun so' state ancora sarvate!'''",
        "watchlistedit-clear-done": "L'elenco 'e paggene cuntrullate vuosto è stat'abbacantato.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|nu titolo è stato luvato|$1 titule so' state luvate}}:",
        "watchlistedit-too-many": "Ce stanno troppe paggene 'a veré ccà.",
-       "watchlisttools-clear": "Abbacanta l'elenco 'e paggene cuntrullate",
+       "watchlisttools-clear": "Sbacanta l'elenco 'e paggene cuntrullate",
        "watchlisttools-view": "Vide 'e cagnamiente mpurtante",
        "watchlisttools-edit": "Vide e cagna l'elenco 'e paggene cuntrullate",
        "watchlisttools-raw": "Cagna l'elenco 'e paggene cuntrullate ncruro",
index a24db3a..0bb4726 100644 (file)
        "revdelete-uname-unhid": "brukarnamn gjort synleg",
        "revdelete-restricted": "la til avgrensingar for administratorar",
        "revdelete-unrestricted": "fjerna avgrensingar for administratorar",
+       "logentry-block-block": "$1 {{GENDER:$2|blokkerte}} {{GENDER:$4|$3}} for $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|endra}} blokkeringsinnstillingar for {{GENDER:$4|$3}} med opphøyrstid $5 $6",
        "logentry-move-move": "$1 {{GENDER:$2|flytte}} sida $3 til $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|flytte}} sida $3 til $4 utan å lata etter ei omdirigering",
index 7c7355d..b7556e0 100644 (file)
@@ -87,7 +87,8 @@
                        "Rhcastilhos",
                        "Claudio Emanuel Weiler",
                        "Almondega",
-                       "Eduardo Addad de Oliveira"
+                       "Eduardo Addad de Oliveira",
+                       "Raphaelras"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "contributions": "Contribuições {{GENDER:$1|do usuário|da usuária|do(a) usuário(a)}}",
        "contributions-title": "Contribuições {{GENDER:$1|do usuário|da usuária|do(a) usuário(a)}} $1",
        "mycontris": "Contribuições",
+       "anoncontribs": "Contribuições",
        "contribsub2": "Para {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "A conta de usuário \"$1\" não está registrada.",
        "nocontribs": "Não foram encontradas mudanças com este critério.",
index 60ae69e..dc2bd50 100644 (file)
        "unblock-summary": "{{doc-specialpagesummary|unblock}}",
        "blockip": "Used as the text of a link in the sidebar toolbox. Clicking this link takes you to [[Special:Block]], with a relevant username or IP address (e.g. \"Username\" on [[User talk:Username]], [[Special:Contributions/Username]], etc.) already filled in.\n\nParameters:\n* $1 - username, for GENDER support\n{{Identical|Block user}}",
        "blockip-legend": "Legend/Header for the fieldset around the input form of [[Special:Block]].\n\n{{Identical|Block user}}",
-       "blockiptext": "Used in the {{msg-mw|Blockip}} form in [[Special:Block]].\n\nRefers to {{msg-mw|Policy-url}}.\n\nThis message may follow the message {{msg-mw|Ipb-otherblocks-header}} and other block messages.\n\nSee also:\n* {{msg-mw|Unblockiptext}}",
+       "blockiptext": "Used in the {{msg-mw|Blockip}} form in [[Special:Block]].\n\nRefers to {{msg-mw|Policy-url}}.\n\nThis message may follow the message {{msg-mw|Ipb-otherblocks-header}} and other block messages.\n\nParameters:\n* $1 - CIDR suffix of the largest allowed IPv4 block (as an integer)\n* $2 - CIDR suffix of the largest allowed IPv6 block (as an integer)\n\nSee also:\n* {{msg-mw|Unblockiptext}}",
        "ipaddressorusername": "{{Identical|IP address or username}}",
        "ipbexpiry": "{{Identical|Expiry}}",
        "ipbreason": "Label of the block reason dropdown in [[Special:BlockIP]] and the unblock reason textfield in [{{fullurl:Special:IPBlockList|action=unblock}} Special:IPBlockList?action=unblock].\n\n{{Identical|Reason}}",
index 4d75db5..080d35e 100644 (file)
@@ -86,7 +86,8 @@
                        "Nzeemin",
                        "INS Pirat",
                        "Краснорядцева Елена",
-                       "Frhdkazan"
+                       "Frhdkazan",
+                       "Ядерный Трамвай"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "upload-form-label-select-file": "Выбрать файл",
        "upload-form-label-infoform-title": "Подробности",
        "upload-form-label-infoform-name": "Имя",
+       "upload-form-label-infoform-name-tooltip": "Уникальный описательный заголовок для файла, который будет сохранён как его название. Можете использовать простой язык и пробелы. Не указывайте расширение.",
        "upload-form-label-infoform-description": "Описание",
+       "upload-form-label-infoform-description-tooltip": "Коротко опишите всё самое важное об этом произведении. Для фото — укажите, что главное изображено, обстоятельства съёмки или место.",
        "upload-form-label-usage-title": "Использование",
        "upload-form-label-usage-filename": "Имя файла",
        "foreign-structured-upload-form-label-own-work": "Это моя собственная работа",
        "expand_templates_preview": "Предпросмотр",
        "expand_templates_preview_fail_html": "<em>Поскольку на сайте {{SITENAME}} с включенным «сырым» HTML произошла потеря данных сессии, предварительный просмотр скрыт в качестве меры предосторожности против JavaScript-атак.</em>\n\n<strong>Если это была правомерная попытка предварительного просмотра, пожалуйста, попробуйте ещё раз.</strong>\nЕсли у вас по-прежнему не получается, попробуйте [[Special:UserLogout|завершить сеанс работы]] и авторизоваться ещё раз.",
        "expand_templates_preview_fail_html_anon": "<em>Поскольку на сайте {{SITENAME}} включен «сырой» HTML, а вы не авторизовались, предварительный просмотр скрыт в качестве меры предосторожности против JavaScript-атак.</em>\n\n<strong>Если это правомерная попытка предварительного просмотра, пожалуйста, [[Special:UserLogin|войдите]] и попробуйте ещё раз.",
+       "expand_templates_input_missing": "Вы должны вставить хоть какой-то текст.",
        "pagelanguage": "Выбор языка страницы",
        "pagelang-name": "Страница",
        "pagelang-language": "Язык",
index 19cd461..74eaac5 100644 (file)
@@ -16,8 +16,8 @@
     "grunt-jsonlint": "1.0.7",
     "grunt-karma": "0.12.1",
     "karma": "0.13.19",
-    "karma-chrome-launcher": "0.2.0",
-    "karma-firefox-launcher": "0.1.6",
+    "karma-chrome-launcher": "0.2.2",
+    "karma-firefox-launcher": "0.1.7",
     "karma-qunit": "0.1.5",
     "qunitjs": "1.18.0"
   }
index afa7201..519e39b 100644 (file)
@@ -5,8 +5,8 @@
  */
 ( function ( $, mw ) {
 
-// Cached access key prefix for used browser
-var cachedAccessKeyPrefix,
+// Cached access key modifiers for used browser
+var cachedAccessKeyModifiers,
 
        // Whether to use 'test-' instead of correct prefix (used for testing)
        useTestPrefix = false,
@@ -16,37 +16,39 @@ var cachedAccessKeyPrefix,
        labelable = 'button, input, textarea, keygen, meter, output, progress, select';
 
 /**
- * Get the prefix for the access key for browsers that don't support accessKeyLabel.
+ * Find the modifier keys that need to be pressed together with the accesskey to trigger the input.
  *
+ * The result is dependant on the ua paramater or the current platform.
  * For browsers that support accessKeyLabel, #getAccessKeyLabel never calls here.
+ * Valid key values that are returned can be: ctrl, alt, option, shift, esc
  *
  * @private
  * @param {Object} [ua] An object with a 'userAgent' and 'platform' property.
- * @return {string} Access key prefix
+ * @return {Array} Array with 0 or more of the string values: ctrl, option, alt, shift, esc
  */
-function getAccessKeyPrefix( ua ) {
+function getAccessKeyModifiers( ua ) {
        // use cached prefix if possible
-       if ( !ua && cachedAccessKeyPrefix ) {
-               return cachedAccessKeyPrefix;
+       if ( !ua && cachedAccessKeyModifiers ) {
+               return cachedAccessKeyModifiers;
        }
 
        var profile = $.client.profile( ua ),
-               accessKeyPrefix = 'alt-';
+               accessKeyModifiers = [ 'alt' ];
 
        // Classic Opera on any platform
        if ( profile.name === 'opera' && profile.versionNumber < 15 ) {
-               accessKeyPrefix = 'shift-esc-';
+               accessKeyModifiers = [ 'shift', 'esc' ];
 
        // Chrome and modern Opera on any platform
        } else if ( profile.name === 'chrome' || profile.name === 'opera' ) {
-               accessKeyPrefix = (
+               accessKeyModifiers = (
                        profile.platform === 'mac'
                                // Chrome on Mac
-                               ? 'ctrl-option-'
+                               ? [ 'ctrl', 'option' ]
                                // Chrome on Windows or Linux
                                // (both alt- and alt-shift work, but alt with E, D, F etc does not
                                // work since they are browser shortcuts)
-                               : 'alt-shift-'
+                               : [ 'alt', 'shift' ]
                );
 
        // Non-Windows Safari with webkit_version > 526
@@ -54,7 +56,7 @@ function getAccessKeyPrefix( ua ) {
                && profile.name === 'safari'
                && profile.layoutVersion > 526
        ) {
-               accessKeyPrefix = 'ctrl-alt-';
+               accessKeyModifiers = [ 'ctrl', 'alt' ];
 
        // Safari/Konqueror on any platform, or any browser on Mac
        // (but not Safari on Windows)
@@ -63,27 +65,27 @@ function getAccessKeyPrefix( ua ) {
                || profile.platform === 'mac'
                || profile.name === 'konqueror' )
        ) {
-               accessKeyPrefix = 'ctrl-';
+               accessKeyModifiers = [ 'ctrl' ];
 
        // Firefox/Iceweasel 2.x and later
        } else if ( ( profile.name === 'firefox' || profile.name === 'iceweasel' )
                && profile.versionBase > '1'
        ) {
-               accessKeyPrefix = 'alt-shift-';
+               accessKeyModifiers = [ 'alt', 'shift' ];
        }
 
-       // cache prefix
+       // cache modifiers
        if ( !ua ) {
-               cachedAccessKeyPrefix = accessKeyPrefix;
+               cachedAccessKeyModifiers = accessKeyModifiers;
        }
-       return accessKeyPrefix;
+       return accessKeyModifiers;
 }
 
 /**
  * Get the access key label for an element.
  *
  * Will use native accessKeyLabel if available (currently only in Firefox 8+),
- * falls back to #getAccessKeyPrefix.
+ * falls back to #getAccessKeyModifiers.
  *
  * @private
  * @param {HTMLElement} element Element to get the label for
@@ -99,7 +101,7 @@ function getAccessKeyLabel( element ) {
        if ( !useTestPrefix && element.accessKeyLabel ) {
                return element.accessKeyLabel;
        }
-       return ( useTestPrefix ? 'test-' : getAccessKeyPrefix() ) + element.accessKey;
+       return ( useTestPrefix ? 'test' : getAccessKeyModifiers().join( '-' ) ) + '-' + element.accessKey;
 }
 
 /**
@@ -175,12 +177,30 @@ $.fn.updateTooltipAccessKeys = function () {
 };
 
 /**
- * Exposed for testing.
+ * getAccessKeyModifiers
+ *
+ * @method updateTooltipAccessKeys_getAccessKeyModifiers
+ * @inheritdoc #getAccessKeyModifiers
+ */
+$.fn.updateTooltipAccessKeys.getAccessKeyModifiers = getAccessKeyModifiers;
+
+/**
+ * getAccessKeyLabel
+ *
+ * @method updateTooltipAccessKeys_getAccessKeyLabel
+ * @inheritdoc #getAccessKeyLabel
+ */
+$.fn.updateTooltipAccessKeys.getAccessKeyLabel = getAccessKeyLabel;
+
+/**
+ * getAccessKeyPrefix
  *
  * @method updateTooltipAccessKeys_getAccessKeyPrefix
- * @inheritdoc #getAccessKeyPrefix
+ * @deprecated 1.27 Use #getAccessKeyModifiers
  */
-$.fn.updateTooltipAccessKeys.getAccessKeyPrefix = getAccessKeyPrefix;
+$.fn.updateTooltipAccessKeys.getAccessKeyPrefix = function ( ua ) {
+       return getAccessKeyModifiers( ua ).join( '-' ) + '-';
+};
 
 /**
  * Switch test mode on and off.
index ddf7f2b..4806097 100644 (file)
@@ -43,7 +43,7 @@
                mw.ForeignStructuredUpload.BookletLayout.parent.prototype.initialize.call( this )
                        .done( function () {
                                // Point the CategorySelector to the right wiki
-                               this.upload.apiPromise.done( function ( api ) {
+                               this.upload.getApi().done( function ( api ) {
                                        // If this is a ForeignApi, it will have a apiUrl, otherwise we don't need to do anything
                                        if ( api.apiUrl ) {
                                                // Can't reuse the same object, CategorySelector calls #abort on its mw.Api instance
index 61fb59f..aa08b6c 100644 (file)
         * or to local uploads if no foreign target is configured.
         */
 
+       /**
+        * @inheritdoc
+        */
+       ForeignUpload.prototype.getApi = function () {
+               return this.apiPromise;
+       };
+
        /**
         * Override from mw.Upload to make sure the API info is found and allowed
         */
index 26eabc7..1cd9101 100644 (file)
         */
        mw.Upload.BookletLayout.prototype.initialize = function () {
                var
-                       apiPromise,
                        booklet = this,
                        deferred = $.Deferred();
 
                this.upload = this.createUpload();
                this.setPage( 'upload' );
 
-               apiPromise = this.upload.apiPromise || $.Deferred().resolve( this.upload.api );
-               apiPromise.done( function ( api ) {
+               this.upload.getApi().done( function ( api ) {
                        // If the user can't upload anything, don't give them the option to.
                        api.getUserInfo().done( function ( userInfo ) {
                                if ( userInfo.rights.indexOf( 'upload' ) === -1 ) {
index d80b4eb..8a74ffc 100644 (file)
 
        UP = Upload.prototype;
 
+       /**
+        * Get the mw.Api instance used by this Upload object.
+        *
+        * @return {jQuery.Promise}
+        * @return {Function} return.done
+        * @return {mw.Api} return.done.api
+        */
+       UP.getApi = function () {
+               return $.Deferred().resolve( this.api ).promise();
+       };
+
        /**
         * Set the text of the file page, to be created on file upload.
         *