Merge "RC Filters: Detect filters conflicts to by-pass db query"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 19 Apr 2017 03:20:22 +0000 (03:20 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 19 Apr 2017 03:20:22 +0000 (03:20 +0000)
131 files changed:
autoload.php
composer.json
includes/EditPage.php
includes/GlobalFunctions.php
includes/MediaWiki.php
includes/WatchedItemStore.php
includes/api/ApiErrorFormatter.php
includes/api/ApiMain.php
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/cache/localisation/LCStoreDB.php
includes/db/DatabaseOracle.php
includes/exception/MWExceptionHandler.php
includes/exception/MWExceptionRenderer.php
includes/filebackend/filejournal/DBFileJournal.php
includes/filebackend/lockmanager/MySqlLockManager.php
includes/filerepo/file/ForeignDBFile.php
includes/installer/MssqlInstaller.php
includes/installer/MysqlInstaller.php
includes/installer/OracleInstaller.php
includes/installer/PostgresInstaller.php
includes/installer/SqliteInstaller.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobRunner.php
includes/jobqueue/jobs/RecentChangesUpdateJob.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/libs/lockmanager/DBLockManager.php
includes/libs/lockmanager/PostgreSqlLockManager.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMssql.php
includes/libs/rdbms/database/DatabaseMysql.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/database/DatabaseMysqli.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/libs/rdbms/database/IDatabase.php
includes/libs/rdbms/database/IMaintainableDatabase.php
includes/libs/rdbms/database/resultwrapper/IResultWrapper.php
includes/libs/rdbms/exception/DBAccessError.php
includes/libs/rdbms/exception/DBConnectionError.php
includes/libs/rdbms/exception/DBError.php
includes/libs/rdbms/exception/DBExpectedError.php
includes/libs/rdbms/exception/DBQueryError.php
includes/libs/rdbms/exception/DBReadOnlyError.php
includes/libs/rdbms/exception/DBReplicationWaitError.php
includes/libs/rdbms/exception/DBTransactionError.php
includes/libs/rdbms/exception/DBTransactionSizeError.php
includes/libs/rdbms/exception/DBUnexpectedError.php
includes/libs/rdbms/lbfactory/ILBFactory.php
includes/libs/rdbms/lbfactory/LBFactory.php
includes/libs/rdbms/loadbalancer/ILoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/objectcache/SqlBagOStuff.php
includes/page/WikiPage.php
includes/profiler/output/ProfilerOutputDb.php
includes/resourceloader/ResourceLoader.php
includes/specialpage/QueryPage.php
includes/specials/SpecialContributions.php
includes/user/User.php
languages/FakeConverter.php
languages/Language.php
languages/LanguageConverter.php
languages/i18n/ar.json
languages/i18n/arq.json
languages/i18n/bar.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/fa.json
languages/i18n/fr.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/ilo.json
languages/i18n/it.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/nl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ru.json
languages/i18n/tr.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/Maintenance.php
maintenance/oracle/alterSharedConstraints.php
maintenance/sql.php
maintenance/sqlite.inc
maintenance/storage/trackBlobs.php
package.json
resources/lib/oojs-ui/i18n/jv.json
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-core-apex.css
resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
resources/lib/oojs-ui/oojs-ui-core.js
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
resources/lib/oojs-ui/oojs-ui-toolbars.js
resources/lib/oojs-ui/oojs-ui-widgets-apex.css
resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
resources/lib/oojs-ui/oojs-ui-widgets.js
resources/lib/oojs-ui/oojs-ui-windows-apex.css
resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
resources/lib/oojs-ui/oojs-ui-windows.js
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterFloatingMenuSelectWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuHeaderWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterFloatingMenuSelectWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuOptionWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagItemWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js
resources/src/mediawiki.special/mediawiki.special.search.interwikiwidget.styles.less
resources/src/mediawiki/mediawiki.toc.print.css
resources/src/startup.js
tests/browser/features/support/pages/edit_page.rb
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js

index bfac50d..20a1bf4 100644 (file)
@@ -1594,8 +1594,18 @@ $wgAutoloadLocalClasses = [
        'Wikimedia\\Rdbms\\Blob' => __DIR__ . '/includes/libs/rdbms/encasing/Blob.php',
        'Wikimedia\\Rdbms\\ChronologyProtector' => __DIR__ . '/includes/libs/rdbms/ChronologyProtector.php',
        'Wikimedia\\Rdbms\\ConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/ConnectionManager.php',
+       'Wikimedia\\Rdbms\\DBAccessError' => __DIR__ . '/includes/libs/rdbms/exception/DBAccessError.php',
        'Wikimedia\\Rdbms\\DBConnRef' => __DIR__ . '/includes/libs/rdbms/database/DBConnRef.php',
+       'Wikimedia\\Rdbms\\DBConnectionError' => __DIR__ . '/includes/libs/rdbms/exception/DBConnectionError.php',
+       'Wikimedia\\Rdbms\\DBError' => __DIR__ . '/includes/libs/rdbms/exception/DBError.php',
+       'Wikimedia\\Rdbms\\DBExpectedError' => __DIR__ . '/includes/libs/rdbms/exception/DBExpectedError.php',
        'Wikimedia\\Rdbms\\DBMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/DBMasterPos.php',
+       'Wikimedia\\Rdbms\\DBQueryError' => __DIR__ . '/includes/libs/rdbms/exception/DBQueryError.php',
+       'Wikimedia\\Rdbms\\DBReadOnlyError' => __DIR__ . '/includes/libs/rdbms/exception/DBReadOnlyError.php',
+       'Wikimedia\\Rdbms\\DBReplicationWaitError' => __DIR__ . '/includes/libs/rdbms/exception/DBReplicationWaitError.php',
+       'Wikimedia\\Rdbms\\DBTransactionError' => __DIR__ . '/includes/libs/rdbms/exception/DBTransactionError.php',
+       'Wikimedia\\Rdbms\\DBTransactionSizeError' => __DIR__ . '/includes/libs/rdbms/exception/DBTransactionSizeError.php',
+       'Wikimedia\\Rdbms\\DBUnexpectedError' => __DIR__ . '/includes/libs/rdbms/exception/DBUnexpectedError.php',
        'Wikimedia\\Rdbms\\Database' => __DIR__ . '/includes/libs/rdbms/database/Database.php',
        'Wikimedia\\Rdbms\\DatabaseDomain' => __DIR__ . '/includes/libs/rdbms/database/DatabaseDomain.php',
        'Wikimedia\\Rdbms\\DatabaseMssql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMssql.php',
index 44a5eb4..36fd0ee 100644 (file)
@@ -25,7 +25,7 @@
                "ext-xml": "*",
                "liuggio/statsd-php-client": "1.0.18",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.21.0",
+               "oojs/oojs-ui": "0.21.1",
                "oyejorge/less.php": "1.7.0.14",
                "php": ">=5.5.9",
                "psr/log": "1.0.2",
index f97f164..ca3b4d1 100644 (file)
@@ -3044,6 +3044,7 @@ class EditPage {
                // Note: the maxlength is overridden in JS to 255 and to make it use UTF-8 bytes, not characters.
                return ( is_array( $inputAttrs ) ? $inputAttrs : [] ) + [
                        'id' => 'wpSummary',
+                       'name' => 'wpSummary',
                        'maxlength' => '200',
                        'tabindex' => '1',
                        'size' => 60,
@@ -4308,6 +4309,8 @@ HTML
                if ( $this->oouiEnabled ) {
                        $saveConfig = OOUI\Element::configFromHtmlAttributes( $attribs );
                        $buttons['save'] = new OOUI\ButtonInputWidget( [
+                               // Support: IE 6 – Use <input>, otherwise it can't distinguish which button was clicked
+                               'useInputTag' => true,
                                'flags' => [ 'constructive', 'primary' ],
                                'label' => $this->context->msg( $buttonLabelKey )->text(),
                                'infusable' => true,
@@ -4329,6 +4332,8 @@ HTML
                if ( $this->oouiEnabled ) {
                        $previewConfig = OOUI\Element::configFromHtmlAttributes( $attribs );
                        $buttons['preview'] = new OOUI\ButtonInputWidget( [
+                               // Support: IE 6 – Use <input>, otherwise it can't distinguish which button was clicked
+                               'useInputTag' => true,
                                'label' => $this->context->msg( 'showpreview' )->text(),
                                'infusable' => true,
                                'type' => 'submit'
@@ -4347,6 +4352,8 @@ HTML
                if ( $this->oouiEnabled ) {
                        $diffConfig = OOUI\Element::configFromHtmlAttributes( $attribs );
                        $buttons['diff'] = new OOUI\ButtonInputWidget( [
+                               // Support: IE 6 – Use <input>, otherwise it can't distinguish which button was clicked
+                               'useInputTag' => true,
                                'label' => $this->context->msg( 'showdiff' )->text(),
                                'infusable' => true,
                                'type' => 'submit',
index 243d066..4e60e63 100644 (file)
@@ -28,6 +28,7 @@ use Liuggio\StatsdClient\Sender\SocketSender;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\Session\SessionManager;
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\DBReplicationWaitError;
 
 // Hide compatibility functions from Doxygen
 /// @cond
index ef0563e..0fd6b92 100644 (file)
@@ -25,6 +25,7 @@ use Psr\Log\LoggerInterface;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ChronologyProtector;
 use Wikimedia\Rdbms\LBFactory;
+use Wikimedia\Rdbms\DBConnectionError;
 
 /**
  * The MediaWiki class is the helper class for the index.php entry point.
index 70fdbf1..b334098 100644 (file)
@@ -7,6 +7,7 @@ use MediaWiki\MediaWikiServices;
 use Wikimedia\Assert\Assert;
 use Wikimedia\ScopedCallback;
 use Wikimedia\Rdbms\LoadBalancer;
+use Wikimedia\Rdbms\DBUnexpectedError;
 
 /**
  * Storage layer class for WatchedItems.
index c52b731..5484a78 100644 (file)
@@ -176,7 +176,8 @@ class ApiErrorFormatter {
                        } else {
                                $msg = new RawMessage( '$1' );
                                if ( !isset( $options['code'] ) ) {
-                                       $options['code'] = 'internal_api_error_' . get_class( $exception );
+                                       $class = preg_replace( '#^Wikimedia\\\Rdbms\\\#', '', get_class( $exception ) );
+                                       $options['code'] = 'internal_api_error_' . $class;
                                }
                        }
                        $params = [ wfEscapeWikiText( $exception->getMessage() ) ];
index 4068a50..00f976e 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- *
- *
  * Created on Sep 4, 2006
  *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
@@ -28,6 +26,8 @@
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Timestamp\TimestampException;
+use Wikimedia\Rdbms\DBQueryError;
+use Wikimedia\Rdbms\DBError;
 
 /**
  * This is the main API class, used for both external and internal processing.
@@ -1044,7 +1044,8 @@ class ApiMain extends ApiBase {
                } else {
                        // Something is seriously wrong
                        $config = $this->getConfig();
-                       $code = 'internal_api_error_' . get_class( $e );
+                       $class = preg_replace( '#^Wikimedia\\\Rdbms\\\#', '', get_class( $e ) );
+                       $code = 'internal_api_error_' . $class;
                        if ( ( $e instanceof DBQueryError ) && !$config->get( 'ShowSQLErrors' ) ) {
                                $params = [ 'apierror-databaseerror', WebRequest::getRequestId() ];
                        } else {
index 3d0ea17..d7cc662 100644 (file)
@@ -26,7 +26,7 @@
        "apihelp-main-param-curtimestamp": "Inclui a data atual no resultado.",
        "apihelp-main-param-origin": "Ao acessar a API usando uma solicitação AJAX por domínio cruzado (CORS), defina isto como o domínio de origem. Isto deve estar incluso em toda solicitação ''pre-flight'', sendo portanto parte do URI da solicitação (ao invés do corpo do POST).\n\nPara solicitações autenticadas, isto deve corresponder a uma das origens no cabeçalho <code>Origin</code>, para que seja algo como <kbd>https://pt.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Se este parâmetro não corresponder ao cabeçalho <code>Origin</code>, uma resposta 403 será retornada. Se este parâmetro corresponder ao cabeçalho <code>Origin</code> e a origem for permitida (''whitelisted''), os cabeçalhos <code>Access-Control-Allow-Origin</code> e <code>Access-Control-Allow-Credentials</code> serão definidos.\n\nPara solicitações não autenticadas, especifique o valor <kbd>*</kbd>. Isto fará com que o cabeçalho <code>Access-Control-Allow-Origin</code> seja definido, porém o <code>Access-Control-Allow-Credentials</code> será <code>false</code> e todos os dados específicos para usuários tornar-se-ão restritos.",
        "apihelp-block-description": "Bloquear um usuário",
-       "apihelp-block-param-user": "Nome de usuário, endereço IP ou faixa de IP para bloquear.",
+       "apihelp-block-param-user": "Nome de usuário, endereço IP ou faixa de IP para bloquear. Não pode ser usado junto com <var>$1userid</var>",
        "apihelp-block-param-reason": "Razão do bloqueio.",
        "apihelp-block-param-anononly": "Bloqueia apenas usuários anônimos (ou seja desativa edições anônimas para este endereço IP).",
        "apihelp-block-param-nocreate": "Prevenir a criação de conta.",
@@ -65,7 +65,7 @@
        "apihelp-edit-param-text": "Conteúdo da página",
        "apihelp-edit-param-minor": "Edição menor.",
        "apihelp-edit-param-notminor": "Edição não-menor.",
-       "apihelp-edit-param-bot": "Marcar esta edição como feita por bot.",
+       "apihelp-edit-param-bot": "Marcar esta edição como uma edição de bot.",
        "apihelp-edit-param-createonly": "Não editar a página se já existir.",
        "apihelp-edit-param-nocreate": "Mostra um erro se a página não existir.",
        "apihelp-edit-param-watch": "Adiciona a página para a lista de vigiados do usuário atual.",
        "api-help-param-deprecated": "Obsoleto",
        "api-help-param-required": "Este parâmetro é obrigatório.",
        "apierror-badurl": "Valor \"$2\" não é válido para o parâmetro <var>$1</var> da URL.",
+       "apierror-cantblock-email": "Você não tem permissão para impedir que os usuários enviem e-mails através da wiki.",
+       "apierror-cantblock": "Você não tem permissão para bloquear usuários.",
+       "apierror-cantchangecontentmodel": "Você não tem permissão para mudar o modelo de conteúdo de uma página.",
+       "apierror-canthide": "Você não tem permissão para ocultar nomes de usuários do registro de bloqueios.",
+       "apierror-cantimport-upload": "Você não tem permissão para importar páginas enviadas.",
+       "apierror-cantimport": "Você não tem permissão para importar páginas.",
+       "apierror-noedit": "Você não tem permissão para editar páginas.",
+       "apierror-noimageredirect": "Você não tem permissão para criar redirecionamentos de imagens.",
+       "apierror-permissiondenied": "Você não tem permissão para $1.",
+       "apierror-permissiondenied-unblock": "Você não tem permissão para desbloquear usuários.",
+       "apierror-specialpage-cantexecute": "Você não tem permissão para ver os resultados desta página especial.",
        "apiwarn-invalidcategory": "\"$1\" não é uma categoria.",
        "apiwarn-invalidtitle": "\"$1\" não é um título válido.",
        "apiwarn-notfile": "\"$1\" não é um arquivo.",
index c595f24..e6873fb 100644 (file)
        "apihelp-query+templates-example-simple": "Obter as predefinições usadas na página <kbd>Main Page</kbd>.",
        "apihelp-query+templates-example-generator": "Obter informação sobre as páginas das predefinições usadas na página <kbd>Main Page</kbd>.",
        "apihelp-query+templates-example-namespaces": "Obter as páginas dos espaços nominais {{ns:user}} e {{ns:template}} que são transcluídas na página <kbd>Main Page</kbd>.",
-       "apihelp-query+tokens-description": "Obtêm tokens para ações de modificação de dados.",
+       "apihelp-query+tokens-description": "Obtém chaves para operações de modificação de dados.",
        "apihelp-query+tokens-param-type": "Tipos de chave a pedir.",
        "apihelp-query+tokens-example-simple": "Obter uma chave csfr (padrão).",
        "apihelp-query+tokens-example-types": "Obter uma chave de vigilância e uma chave de patrulha.",
        "api-help-param-default": "Valor por omissão: $1",
        "api-help-param-default-empty": "Padrão: <span class=\"apihelp-empty\">(vazio)</span>",
        "api-help-param-token": "Uma chave \"$1\" obtida de [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
-       "api-help-param-token-webui": "Para efeitos de compatibilidade, o token usado na interface ''web'' também é aceito.",
+       "api-help-param-token-webui": "Para efeitos de compatibilidade, a chave usada na interface ''web'' também é aceite.",
        "api-help-param-disabled-in-miser-mode": "Desativado devido ao [[mw:Manual:$wgMiserMode|modo avarento]] (''miser mode'').",
        "api-help-param-limited-in-miser-mode": "<strong>Nota:</strong> devido ao [[mw:Manual:$wgMiserMode|modo avarento]] (''miser mode''), usar isto pode resultar na devolução de menos de <var>$1limit</var> resultados antes de continuar; em casos extremos pode não ser devolvido qualquer resultado.",
        "api-help-param-direction": "A direção da enumeração:\n;newer:Listar o mais antigo primeiro. Nota: $1start tem de estar antes de $1end.\n;older:Listar o mais recente primeiro (padrão). Nota: $1start tem de estar depois de $1end.",
index 52611ec..c57145c 100644 (file)
@@ -19,6 +19,7 @@
  */
 
 use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBQueryError;
 
 /**
  * LCStore implementation which uses the standard DB functions to store data.
index a0d7ad8..b728786 100644 (file)
@@ -24,6 +24,8 @@
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\Blob;
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\DBConnectionError;
+use Wikimedia\Rdbms\DBUnexpectedError;
 
 /**
  * @ingroup Database
index 749be3c..433274e 100644 (file)
@@ -21,6 +21,7 @@
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
 use Psr\Log\LogLevel;
+use Wikimedia\Rdbms\DBError;
 
 /**
  * Handler class for MWExceptions
index a569bcd..a9bd4da 100644 (file)
  * @author Aaron Schulz
  */
 
+use Wikimedia\Rdbms\DBConnectionError;
+use Wikimedia\Rdbms\DBError;
+use Wikimedia\Rdbms\DBReadOnlyError;
+use Wikimedia\Rdbms\DBExpectedError;
+
 /**
  * Class to expose exceptions to the client (API bots, users, admins using CLI scripts)
  * @since 1.28
index d09c245..aa97c9a 100644 (file)
@@ -24,6 +24,7 @@
 
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBError;
 
 /**
  * Version of FileJournal that logs to a DB table
index 8510d0c..2108aed 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBError;
 
 /**
  * MySQL version of DBLockManager that supports shared locks.
index f6f44e6..cf21161 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup FileAbstraction
  */
 
+use Wikimedia\Rdbms\DBUnexpectedError;
+
 /**
  * Foreign file with an accessible MediaWiki database
  *
index 8307d8b..ba9818d 100644 (file)
@@ -22,6 +22,8 @@
  */
 
 use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DBQueryError;
+use Wikimedia\Rdbms\DBConnectionError;
 
 /**
  * Class for setting up the MediaWiki database using Microsoft SQL Server.
index c0731e7..09051f4 100644 (file)
@@ -22,6 +22,8 @@
  */
 
 use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DBQueryError;
+use Wikimedia\Rdbms\DBConnectionError;
 
 /**
  * Class for setting up the MediaWiki database using MySQL.
index b8fc4e7..14683d6 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\DBConnectionError;
+
 /**
  * Class for setting up the MediaWiki database using Oracle.
  *
index bd7cfb3..b501cb3 100644 (file)
@@ -22,6 +22,8 @@
  */
 
 use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DBQueryError;
+use Wikimedia\Rdbms\DBConnectionError;
 
 /**
  * Class for setting up the MediaWiki database using Postgres.
index e9d3ad4..3943374 100644 (file)
@@ -23,6 +23,7 @@
 
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\DatabaseSqlite;
+use Wikimedia\Rdbms\DBConnectionError;
 
 /**
  * Class for setting up the MediaWiki database using SQLLite.
index 540b8c5..924aacc 100644 (file)
  * @author Aaron Schulz
  */
 use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBConnRef;
+use Wikimedia\Rdbms\DBConnectionError;
+use Wikimedia\Rdbms\DBError;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
-use Wikimedia\Rdbms\DBConnRef;
 
 /**
  * Class to handle job queues stored in the DB
index baff288..6415533 100644 (file)
@@ -28,6 +28,8 @@ use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Wikimedia\ScopedCallback;
 use Wikimedia\Rdbms\LBFactory;
+use Wikimedia\Rdbms\DBError;
+use Wikimedia\Rdbms\DBReplicationWaitError;
 
 /**
  * Job queue runner utility methods
index 5c73308..c123619 100644 (file)
@@ -20,6 +20,7 @@
  * @ingroup JobQueue
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\DBReplicationWaitError;
 
 /**
  * Job for pruning recent changes
index f9284a5..64d955a 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup JobQueue
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\DBReplicationWaitError;
 
 /**
  * Job to update link tables for pages
index ddb8521..26e25f9 100644 (file)
@@ -23,6 +23,7 @@
 
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBError;
 
 /**
  * Version of LockManager based on using named/row DB locks.
index d6b1ce8..65c6993 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\Rdbms\DBError;
+
 /**
  * PostgreSQL version of DBLockManager that supports shared locks.
  * All locks are non-blocking, which avoids deadlocks.
index 6fafe71..0915b7d 100644 (file)
@@ -33,10 +33,6 @@ use MediaWiki;
 use BagOStuff;
 use HashBagOStuff;
 use InvalidArgumentException;
-use DBQueryError;
-use DBUnexpectedError;
-use DBConnectionError;
-use DBReadOnlyError;
 use Exception;
 use RuntimeException;
 
index bbd2400..c736cc7 100644 (file)
@@ -28,9 +28,6 @@
 namespace Wikimedia\Rdbms;
 
 use MediaWiki;
-use DBConnectionError;
-use DBUnexpectedError;
-use DBQueryError;
 use Exception;
 use stdClass;
 
index c0c9223..77e797d 100644 (file)
@@ -22,8 +22,6 @@
  */
 namespace Wikimedia\Rdbms;
 
-use DBConnectionError;
-
 /**
  * Database abstraction object for PHP extension mysql.
  *
index b09516c..9824caf 100644 (file)
@@ -26,10 +26,6 @@ use DateTime;
 use DateTimeZone;
 use MediaWiki;
 use InvalidArgumentException;
-use DBError;
-use DBExpectedError;
-use DBUnexpectedError;
-use DBConnectionError;
 use Exception;
 use stdClass;
 
index be25489..fcd29c3 100644 (file)
@@ -23,7 +23,6 @@
 namespace Wikimedia\Rdbms;
 
 use mysqli;
-use DBConnectionError;
 use IP;
 
 /**
index 5049f9b..b92d072 100644 (file)
@@ -25,8 +25,6 @@ namespace Wikimedia\Rdbms;
 use Wikimedia\Timestamp\ConvertibleTimestamp;
 use Wikimedia\WaitConditionLoop;
 use MediaWiki;
-use DBUnexpectedError;
-use DBConnectionError;
 use Exception;
 
 /**
index 6d187b8..779b4c9 100644 (file)
@@ -27,11 +27,8 @@ use PDO;
 use PDOException;
 use LockManager;
 use FSLockManager;
-use DBConnectionError;
-use DBReadOnlyError;
 use InvalidArgumentException;
 use RuntimeException;
-use DBError;
 use stdClass;
 
 /**
index feaf5cf..0b12cbc 100644 (file)
 namespace Wikimedia\Rdbms;
 
 use Wikimedia\ScopedCallback;
-use DBError;
-use DBConnectionError;
-use DBUnexpectedError;
-use DBQueryError;
 use Exception;
 use RuntimeException;
 use UnexpectedValueException;
index 5666170..fbc2774 100644 (file)
@@ -26,7 +26,6 @@ namespace Wikimedia\Rdbms;
 
 use Exception;
 use RuntimeException;
-use DBUnexpectedError;
 
 /**
  * Advanced database interface for IDatabase handles that include maintenance methods
index 864dea0..97e03b2 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 /**
  * Exception class for attempted DB access
  * @ingroup Database
@@ -28,3 +30,5 @@ class DBAccessError extends DBUnexpectedError {
                parent::__construct( null, "Database access has been disabled." );
        }
 }
+
+class_alias( DBAccessError::class, 'DBAccessError' );
index dca1302..0091524 100644 (file)
@@ -18,7 +18,7 @@
  * @file
  * @ingroup Database
  */
-use Wikimedia\Rdbms\IDatabase;
+namespace Wikimedia\Rdbms;
 
 /**
  * @ingroup Database
@@ -37,3 +37,5 @@ class DBConnectionError extends DBExpectedError {
                parent::__construct( $db, $msg );
        }
 }
+
+class_alias( DBConnectionError::class, 'DBConnectionError' );
index 226c675..d65e2d3 100644 (file)
  * @file
  * @ingroup Database
  */
-use Wikimedia\Rdbms\IDatabase;
+
+namespace Wikimedia\Rdbms;
+
+use Exception;
 
 /**
  * Database error base class
@@ -38,3 +41,5 @@ class DBError extends Exception {
                parent::__construct( $error );
        }
 }
+
+class_alias( DBError::class, 'DBError' );
index 57538a8..f6b9bd5 100644 (file)
  * @file
  * @ingroup Database
  */
-use Wikimedia\Rdbms\IDatabase;
+
+namespace Wikimedia\Rdbms;
+
+use MessageSpecifier;
+use ILocalizedException;
+use Message;
 
 /**
  * Base class for the more common types of database errors. These are known to occur
@@ -52,3 +57,5 @@ class DBExpectedError extends DBError implements MessageSpecifier, ILocalizedExc
                return Message::newFromSpecifier( $this );
        }
 }
+
+class_alias( DBExpectedError::class, 'DBExpectedError' );
index 89b9cea..bc2a865 100644 (file)
@@ -18,8 +18,8 @@
  * @file
  * @ingroup Database
  */
-use Wikimedia\Rdbms\Database;
-use Wikimedia\Rdbms\IDatabase;
+
+namespace Wikimedia\Rdbms;
 
 /**
  * @ingroup Database
@@ -63,3 +63,5 @@ class DBQueryError extends DBExpectedError {
                $this->fname = $fname;
        }
 }
+
+class_alias( DBQueryError::class, 'DBQueryError' );
index d4dce1e..4393343 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 /**
  * @ingroup Database
  */
 class DBReadOnlyError extends DBExpectedError {
 }
+
+class_alias( DBReadOnlyError::class, 'DBReadOnlyError' );
index c5e1ed7..457431e 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 /**
  * Exception class for replica DB wait timeouts
  * @ingroup Database
  */
 class DBReplicationWaitError extends DBExpectedError {
 }
+
+class_alias( DBReplicationWaitError::class, 'DBReplicationWaitError' );
index a488667..fd79773 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 /**
  * @ingroup Database
  */
 class DBTransactionError extends DBExpectedError {
 }
+
+class_alias( DBTransactionError::class, 'DBTransactionError' );
+
index 4e467b2..e45b9f3 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 /**
  * @ingroup Database
  */
@@ -27,3 +29,5 @@ class DBTransactionSizeError extends DBTransactionError {
                return 'transaction-duration-limit-exceeded';
        }
 }
+
+class_alias( DBTransactionSizeError::class, 'DBTransactionSizeError' );
index 5a12671..9c67eb5 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 /**
  * @ingroup Database
  */
 class DBUnexpectedError extends DBError {
 }
+
+class_alias( DBUnexpectedError::class, 'DBUnexpectedError' );
index faf7fb1..ac79acc 100644 (file)
@@ -24,8 +24,6 @@
 namespace Wikimedia\Rdbms;
 
 use InvalidArgumentException;
-use DBTransactionError;
-use DBReplicationWaitError;
 
 /**
  * An interface for generating database load balancers
index 86547b9..e8210c8 100644 (file)
@@ -30,8 +30,6 @@ use EmptyBagOStuff;
 use WANObjectCache;
 use Exception;
 use RuntimeException;
-use DBTransactionError;
-use DBReplicationWaitError;
 
 /**
  * An interface for generating database load balancers
index cbd0ff3..ceb8d07 100644 (file)
  */
 namespace Wikimedia\Rdbms;
 
-use DBError;
-use DBAccessError;
-use DBTransactionError;
-use DBExpectedError;
 use Exception;
 use InvalidArgumentException;
 
@@ -444,13 +440,17 @@ interface ILoadBalancer {
        /**
         * @note This method will trigger a DB connection if not yet done
         * @param string|bool $domain Domain ID, or false for the current domain
-        * @return bool Whether the generic connection for reads is highly "lagged"
+        * @return bool Whether the database for generic connections this request is highly "lagged"
         */
        public function getLaggedReplicaMode( $domain = false );
 
        /**
+        * Checks whether the database for generic connections this request was both:
+        *   - a) Already choosen due to a prior connection attempt
+        *   - b) Considered highly "lagged"
+        *
         * @note This method will never cause a new DB connection
-        * @return bool Whether any generic connection used for reads was highly "lagged"
+        * @return bool
         */
        public function laggedReplicaUsed();
 
index e8069c0..1202831 100644 (file)
@@ -29,13 +29,6 @@ use BagOStuff;
 use EmptyBagOStuff;
 use WANObjectCache;
 use ArrayUtils;
-use DBError;
-use DBAccessError;
-use DBExpectedError;
-use DBUnexpectedError;
-use DBTransactionError;
-use DBTransactionSizeError;
-use DBConnectionError;
 use InvalidArgumentException;
 use RuntimeException;
 use Exception;
@@ -311,60 +304,99 @@ class LoadBalancer implements ILoadBalancer {
 
        public function getReaderIndex( $group = false, $domain = false ) {
                if ( count( $this->mServers ) == 1 ) {
-                       # Skip the load balancing if there's only one server
+                       // Skip the load balancing if there's only one server
                        return $this->getWriterIndex();
                } elseif ( $group === false && $this->mReadIndex >= 0 ) {
-                       # Shortcut if generic reader exists already
+                       // Shortcut if the generic reader index was already cached
                        return $this->mReadIndex;
                }
 
-               # Find the relevant load array
                if ( $group !== false ) {
+                       // Use the server weight array for this load group
                        if ( isset( $this->mGroupLoads[$group] ) ) {
-                               $nonErrorLoads = $this->mGroupLoads[$group];
+                               $loads = $this->mGroupLoads[$group];
                        } else {
-                               # No loads for this group, return false and the caller can use some other group
+                               // No loads for this group, return false and the caller can use some other group
                                $this->connLogger->info( __METHOD__ . ": no loads for group $group" );
 
                                return false;
                        }
                } else {
-                       $nonErrorLoads = $this->mLoads;
+                       // Use the generic load group
+                       $loads = $this->mLoads;
                }
 
-               if ( !count( $nonErrorLoads ) ) {
-                       throw new InvalidArgumentException( "Empty server array given to LoadBalancer" );
+               // Scale the configured load ratios according to each server's load and state
+               $this->getLoadMonitor()->scaleLoads( $loads, $domain );
+
+               // Pick a server to use, accounting for weights, load, lag, and mWaitForPos
+               list( $i, $laggedReplicaMode ) = $this->pickReaderIndex( $loads, $domain );
+               if ( $i === false ) {
+                       // Replica DB connection unsuccessful
+                       return false;
                }
 
-               # Scale the configured load ratios according to the dynamic load if supported
-               $this->getLoadMonitor()->scaleLoads( $nonErrorLoads, $domain );
+               if ( $this->mWaitForPos && $i != $this->getWriterIndex() ) {
+                       // Before any data queries are run, wait for the server to catch up to the
+                       // specified position. This is used to improve session consistency. Note that
+                       // when LoadBalancer::waitFor() sets mWaitForPos, the waiting triggers here,
+                       // so update laggedReplicaMode as needed for consistency.
+                       if ( !$this->doWait( $i ) ) {
+                               $laggedReplicaMode = true;
+                       }
+               }
 
-               $laggedReplicaMode = false;
+               if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group === false ) {
+                       // Cache the generic reader index for future ungrouped DB_REPLICA handles
+                       $this->mReadIndex = $i;
+                       // Record if the generic reader index is in "lagged replica DB" mode
+                       if ( $laggedReplicaMode ) {
+                               $this->laggedReplicaMode = true;
+                       }
+               }
+
+               $serverName = $this->getServerName( $i );
+               $this->connLogger->debug( __METHOD__ . ": using server $serverName for group '$group'" );
+
+               return $i;
+       }
+
+       /**
+        * @param array $loads List of server weights
+        * @param string|bool $domain
+        * @return array (reader index, lagged replica mode) or false on failure
+        */
+       private function pickReaderIndex( array $loads, $domain = false ) {
+               if ( !count( $loads ) ) {
+                       throw new InvalidArgumentException( "Empty server array given to LoadBalancer" );
+               }
 
-               # No server found yet
+               /** @var $i int|bool Index of selected server */
                $i = false;
-               # First try quickly looking through the available servers for a server that
-               # meets our criteria
-               $currentLoads = $nonErrorLoads;
+               /** @var $laggedReplicaMode bool Whether server is considered lagged */
+               $laggedReplicaMode = false;
+
+               // Quickly look through the available servers for a server that meets criteria...
+               $currentLoads = $loads;
                while ( count( $currentLoads ) ) {
                        if ( $this->mAllowLagged || $laggedReplicaMode ) {
                                $i = ArrayUtils::pickRandom( $currentLoads );
                        } else {
                                $i = false;
                                if ( $this->mWaitForPos && $this->mWaitForPos->asOfTime() ) {
-                                       # ChronologyProtecter causes mWaitForPos to be set via sessions.
-                                       # This triggers doWait() after connect, so it's especially good to
-                                       # avoid lagged servers so as to avoid just blocking in that method.
+                                       // ChronologyProtecter sets mWaitForPos for session consistency.
+                                       // This triggers doWait() after connect, so it's especially good to
+                                       // avoid lagged servers so as to avoid excessive delay in that method.
                                        $ago = microtime( true ) - $this->mWaitForPos->asOfTime();
-                                       # Aim for <= 1 second of waiting (being too picky can backfire)
+                                       // Aim for <= 1 second of waiting (being too picky can backfire)
                                        $i = $this->getRandomNonLagged( $currentLoads, $domain, $ago + 1 );
                                }
                                if ( $i === false ) {
-                                       # Any server with less lag than it's 'max lag' param is preferable
+                                       // Any server with less lag than it's 'max lag' param is preferable
                                        $i = $this->getRandomNonLagged( $currentLoads, $domain );
                                }
                                if ( $i === false && count( $currentLoads ) != 0 ) {
-                                       # All replica DBs lagged. Switch to read-only mode
+                                       // All replica DBs lagged. Switch to read-only mode
                                        $this->replLogger->error( "All replica DBs lagged. Switch to read-only mode" );
                                        $i = ArrayUtils::pickRandom( $currentLoads );
                                        $laggedReplicaMode = true;
@@ -372,12 +404,12 @@ class LoadBalancer implements ILoadBalancer {
                        }
 
                        if ( $i === false ) {
-                               # pickRandom() returned false
-                               # This is permanent and means the configuration or the load monitor
-                               # wants us to return false.
+                               // pickRandom() returned false.
+                               // This is permanent and means the configuration or the load monitor
+                               // wants us to return false.
                                $this->connLogger->debug( __METHOD__ . ": pickRandom() returned false" );
 
-                               return false;
+                               return [ false, false ];
                        }
 
                        $serverName = $this->getServerName( $i );
@@ -386,8 +418,7 @@ class LoadBalancer implements ILoadBalancer {
                        $conn = $this->openConnection( $i, $domain );
                        if ( !$conn ) {
                                $this->connLogger->warning( __METHOD__ . ": Failed connecting to $i/$domain" );
-                               unset( $nonErrorLoads[$i] );
-                               unset( $currentLoads[$i] );
+                               unset( $currentLoads[$i] ); // avoid this server next iteration
                                $i = false;
                                continue;
                        }
@@ -398,38 +429,16 @@ class LoadBalancer implements ILoadBalancer {
                                $this->reuseConnection( $conn );
                        }
 
-                       # Return this server
+                       // Return this server
                        break;
                }
 
-               # If all servers were down, quit now
-               if ( !count( $nonErrorLoads ) ) {
+               // If all servers were down, quit now
+               if ( !count( $currentLoads ) ) {
                        $this->connLogger->error( "All servers down" );
                }
 
-               if ( $i !== false ) {
-                       # Replica DB connection successful.
-                       # Wait for the session master pos for a short time.
-                       if ( $this->mWaitForPos && $i > 0 ) {
-                               # When LoadBalancer::waitFor() set mWaitForPos, the wait will happen here.
-                               # Be sure to update laggedReplicaMode accordingly for consistency.
-                               if ( !$this->doWait( $i ) ) {
-                                       $laggedReplicaMode = true;
-                               }
-                       }
-                       if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group === false ) {
-                               $this->mReadIndex = $i;
-                               # Record if the generic reader index is in "lagged replica DB" mode
-                               if ( $laggedReplicaMode ) {
-                                       $this->laggedReplicaMode = true;
-                               }
-                       }
-                       $serverName = $this->getServerName( $i );
-                       $this->connLogger->debug(
-                               __METHOD__ . ": using server $serverName for group '$group'" );
-               }
-
-               return $i;
+               return [ $i, $laggedReplicaMode ];
        }
 
        public function waitFor( $pos ) {
index 141a375..a4a6ba8 100644 (file)
@@ -23,6 +23,9 @@
 
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBError;
+use Wikimedia\Rdbms\DBQueryError;
+use Wikimedia\Rdbms\DBConnectionError;
 use \MediaWiki\MediaWikiServices;
 use \Wikimedia\WaitConditionLoop;
 use \Wikimedia\Rdbms\TransactionProfiler;
index 7044e6a..a687900 100644 (file)
@@ -24,6 +24,8 @@ use \MediaWiki\Logger\LoggerFactory;
 use \MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\FakeResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBError;
+use Wikimedia\Rdbms\DBUnexpectedError;
 
 /**
  * Class representing a MediaWiki article and history.
@@ -3250,6 +3252,9 @@ class WikiPage implements Page, IDBAccessObject {
 
                MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title );
 
+               // Invalidate caches of articles which include this page
+               DeferredUpdates::addUpdate( new HTMLCacheUpdate( $title, 'templatelinks' ) );
+
                if ( $title->getNamespace() == NS_CATEGORY ) {
                        // Load the Category object, which will schedule a job to create
                        // the category table row if necessary. Checking a replica DB is ok
index 264ec0c..2225e3f 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Profiler
  */
 
+use Wikimedia\Rdbms\DBError;
+
 /**
  * Logs profiling data into the local DB
  *
index e72eaf2..3cd7821 100644 (file)
@@ -27,6 +27,7 @@ use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 use WrappedString\WrappedString;
+use Wikimedia\Rdbms\DBConnectionError;
 
 /**
  * Dynamic JavaScript and CSS resource loading system.
index 68d2d30..93873c0 100644 (file)
@@ -23,6 +23,7 @@
 
 use Wikimedia\Rdbms\ResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBError;
 
 /**
  * This is a class for doing query pages; since they're almost all the same,
index 1028002..167a025 100644 (file)
@@ -395,7 +395,7 @@ class SpecialContributions extends IncludableSpecialPage {
                if ( $userrightsPage->userCanChangeRights( $target ) ) {
                        $tools['userrights'] = $linkRenderer->makeKnownLink(
                                SpecialPage::getTitleFor( 'Userrights', $username ),
-                               $sp->msg( 'sp-contributions-userrights' )->text()
+                               $sp->msg( 'sp-contributions-userrights', $username )->text()
                        );
                }
 
index 30e370e..b8a36b8 100644 (file)
@@ -28,6 +28,7 @@ use MediaWiki\Auth\AuthenticationResponse;
 use MediaWiki\Auth\AuthenticationRequest;
 use Wikimedia\ScopedCallback;
 use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DBExpectedError;
 
 /**
  * String Some punctuation to prevent editing from broken text-mangling proxies.
index 78019a7..6f2117c 100644 (file)
@@ -64,6 +64,9 @@ class FakeConverter {
                return $this->mLang->getFormattedNsText( $ns );
        }
 
+       /**
+        * @return string[]
+        */
        function getVariants() {
                return [ $this->mLang->getCode() ];
        }
index 0672315..14e6f5c 100644 (file)
@@ -4127,7 +4127,7 @@ class Language {
         * Get the list of variants supported by this language
         * see sample implementation in LanguageZh.php
         *
-        * @return array An array of language codes
+        * @return string[] An array of language codes
         */
        public function getVariants() {
                return $this->mConverter->getVariants();
index 6286a2b..4c3e5be 100644 (file)
@@ -48,6 +48,10 @@ class LanguageConverter {
        ];
 
        public $mMainLanguageCode;
+
+       /**
+        * @var string[]
+        */
        public $mVariants;
        public $mVariantFallbacks;
        public $mVariantNames;
@@ -75,11 +79,9 @@ class LanguageConverter {
        const CACHE_VERSION_KEY = 'VERSION 7';
 
        /**
-        * Constructor
-        *
         * @param Language $langobj
         * @param string $maincode The main language code of this language
-        * @param array $variants The supported variants of this language
+        * @param string[] $variants The supported variants of this language
         * @param array $variantfallbacks The fallback language of each variant
         * @param array $flags Defining the custom strings that maps to the flags
         * @param array $manualLevel Limit for supported variants
@@ -122,7 +124,7 @@ class LanguageConverter {
         * Get all valid variants.
         * Call this instead of using $this->mVariants directly.
         *
-        * @return array Contains all valid variants
+        * @return string[] Contains all valid variants
         */
        public function getVariants() {
                return $this->mVariants;
index a23f5f1..26445a3 100644 (file)
        "sp-contributions-uploads": "مرفوعات",
        "sp-contributions-logs": "سجلات",
        "sp-contributions-talk": "نقاش",
-       "sp-contributions-userrights": "إدارة صلاحيات المستخدم",
+       "sp-contributions-userrights": "إدارة صلاحيات {{GENDER:$1|المستخدم|المستخدمة}}",
        "sp-contributions-blocked-notice": "هذا المستخدم ممنوع حاليا.\nإن آخر مدخلة في سجل المنع موجودة أدناه كمرجع:",
        "sp-contributions-blocked-notice-anon": "عنوان الأيبي هذا ممنوع حاليا.\nآخر مدخلة لسجل المنع معروضة هنا كمرجع:",
        "sp-contributions-search": "بحث عن مساهمات",
        "blocklist": "المستخدمون الممنوعون",
        "autoblocklist": "منع تلقائي",
        "autoblocklist-submit": "بحث",
-       "autoblocklist-legend": "عرض عمليات المنع التلقائي",
+       "autoblocklist-legend": "قائمة المنع التلقائي",
        "autoblocklist-localblocks": "{{PLURAL:$1|المنع التلقائي المحلي|عمليات المنع التلقائي المحلية}}",
        "autoblocklist-empty": "قائمة المنع التلقائي فارغة.",
        "autoblocklist-otherblocks": "{{PLURAL:$1|المنع التلقائي الآخر|عمليات المنع التلقائي الأخرى}}",
        "confirmrecreate-noreason": "{{GENDER:$1|حذف المستخدم|حذفت المستخدمة}} [[User:$1|$1]] ([[User talk:$1|نقاش]]) هذه الصفحة بعد أن بدأت أنت بتحريرها. الرجاء التأكد من أنك تريد إعادة إنشاء هذه الصفحة.",
        "recreate": "إعادة إنشاء",
        "unit-pixel": "بك",
+       "confirm-purge-title": "مسح كاش هذه الصفحة",
        "confirm_purge_button": "موافق",
        "confirm-purge-top": "امسح مختزن هذه الصفحة؟",
        "confirm-purge-bottom": "إفراغ مختزن الصفحة يمحو المختزن ويجبر أحدث نسخة على الظهور.",
index 0b3fce7..9d86e3b 100644 (file)
        "nocookiesnew": "الحساب تاع المستعملي راه مخلوق بصّح ما راكش مسجّل داخل.\n{{SITENAME}} يستعمل كوكيزات ف تسجال` الدخول تاع المستعمليين.\nراه عندك الكوكيزات راه محبّسين.\nالله يحفضك، اشعلهم و عاود سيّي تسجّل الدخول ب` السميّة تاع المستعملي و كلمت` السرّ تاعك الحدُد.",
        "nocookieslogin": "{{SITENAME}} يستعمل الكوكيزات ف تسجال الدخول تاع المستعمليين.\nالكوكيزات عندك راهم محبّسين.\nالله يحفضك، مشّيهم و عاود سيّي.",
        "nocookiesfornew": "الحساب تاع المستعملي ما تنخلقش خاطر ما نجمناش نوتّقو المصدر تاعهُ.\nأكّد بلّي الكوكيزات راهم ممشّيين عندك، عاود عمّر الپاجة و سيّي مرّة جديدة.",
+       "createacct-loginerror": "الحساب راه ندار وحدو، لكن ما دخلتش أوتوماتيك، من فضلك روح [[Special:UserLogin|دخلة بيديك]]",
        "noname": "ما مدّيتش سميّت` مستعملي مقبولة.",
        "loginsuccesstitle": "التوصال راه نجَح.",
        "loginsuccess": "<strong>راك مسجّل داخل ف {{SITENAME}} ب`السميّة \"$1\".</strong>",
-       "nosuchuser": "Ù\85ا Ù\83اÙ\8aÙ\86 Ø­ØªØ§ Ù\85ستعÙ\85Ù\84Ù\8a Ø¨`اÙ\84سÙ\85Ù\8aÙ\91Ø© \"$1\".\nاÙ\84سÙ\85Ù\8aÙ\91Ø© ØªØ§Ø¹ Ø§Ù\84Ù\85ستعÙ\85Ù\84Ù\8a Ø±Ø§Ù\87 حسّاسة ف تكسار الحروف (majuscule - minuscule).\nعاود أكّد على كيفاش كتبت الكلمات ولا [[Special:CreateAccount|اخلق حساب جديد]].",
+       "nosuchuser": "Ù\85ا Ù\83اÙ\86Ø´ Ù\85ستعÙ\85Ù\84 Ø¨`اÙ\84سÙ\85Ù\8aÙ\91Ø© \"$1\".\nاÙ\84سÙ\85Ù\8aÙ\91Ø© ØªØ§Ø¹ Ø§Ù\84Ù\85ستعÙ\85Ù\84Ù\8aÙ\86 Ø±Ø§Ù\87ا حسّاسة ف تكسار الحروف (majuscule - minuscule).\nعاود أكّد على كيفاش كتبت الكلمات ولا [[Special:CreateAccount|اخلق حساب جديد]].",
        "nosuchusershort": "ما كاين حتا مستعملي ب` السميّة \"$1\".\nأكّد على الكتيبة تاعك.",
        "nouserspecified": "لازم لك تمدّ السميّة تاع المستعملي.",
        "login-userblocked": "هاد السميّة تاع المستعملي راهي مطرودة. تسجال` الدخول ماشي مسموح.",
        "wrongpasswordempty": "كلمت` السرّ كانت خاوية.\nالله يعيّشك عاود سيّي.",
        "passwordtooshort": "كلمت` السرّ لازم يكون فيها على القل {{PLURAL:$1|1 حرف واحد|$1 حروف}}.",
        "passwordtoolong": "كلمت` السرّ ما تنجمش تكون طويلة على {{PLURAL:$1|1 حرف واحد|$1 حرف}}.",
+       "passwordtoopopular": "كلمات المرور الشايعة ما يمكنش استخدامها. من فضلك  خيّر كلمة سر سبيسيال.",
        "password-name-match": "كلمت` السرّ تاعك لازم لها تكون مبدّلة على سميّت` المستعملي تاعك.",
        "password-login-forbidden": "الستعملية تاع هاد السميّة تاع المستعملي و كلمت` السرّ راهم ممنوعين.",
        "mailmypassword": "استرجع كلمت` السرّ",
        "noemail": "ما كاين حتا إيمال مسجّل لل مستعملي \"$1\".",
        "noemailcreate": "لازم لك تحُطّ آدريسة تاع إيمال تكون مقبولة.",
        "passwordsent": "كلمت` سرّ جديدة راهي نبعتت لل آدريسة تاع إيمال المسجّلة ل \"$1\".\nالله يخلّيك عاود اتسجّل داخل مور ما راهي تلحق لك.",
-       "blocked-mailpassword": "الآدريسة إيپي تاعك راهي مبلوكية ف تبدال الپاجات، و باش نحضيو من كاش تخراب، ما تنجمش تاني تطلب باش تسترجع كلمت` السرّ.",
+       "blocked-mailpassword": "الآدريسة إيپي تاعك راهي مبلوكية ف تبدال الپاجات، و باش نحضيو من كاش تخريب، ما تنجمش تطلب باش ترجّع كلمت السرّ من هاذ الإيبي.",
        "eauthentsent": "راه نبعَت إيمال تاع تأكاد لل آدريسة الّي تمدّت.\nقبل ماينبعَت حتا إيمال وحداخُر ل هاد لادريسة، لازم تتبّع بعدا الوصافات الّي وصلو لك، باش تأكّد بلّي الحساب هادا راه ديالك.",
        "throttled-mailpassword": "راه نبعّت لك إيمال تاع السترجاع تاع كلمت& السرّ منقبَل، هادي {{PLURAL:$1|ساعة|$1 سوايع}}.\nباش نتحضّاو منل غشّ، ما ينجم ينبعت غير إيمال واحد تاع السترجاع ف كلّ مدّة تاع {{PLURAL:$1|ساعة|$1 سوايع}}.",
        "mailerror": "صرات غلطة فل بعت تاع الإيمال: $1",
-       "acct_creation_throttle_hit": "Ø´Ù\8a Ø²Ø§Ù\8aرÙ\8aÙ\86 Ù\84 Ù\87اد Ø§Ù\84Ù\88Ù\8aÙ\83Ù\8a Ù\83اÙ\86Ù\88 Ù\85ستعÙ\85Ù\84Ù\8aÙ\86 Ø§Ù\84ادرÙ\8aسة Ø¥Ù\8aÙ¾Ù\8a ØªØ§Ø¹Ù\83 Ù\88 Ø®Ù\84Ù\82Ù\88 {{PLURAL:$1|حساب|$1 Ø­Ø³Ø§Ø¨Ø§Øª}} Ù\81` Ø§Ù\84Ù\86Ù\87ار Ù\87ادا Ø§Ù\84Ù\91Ù\8a Ù\81اتØ\8c Ù\88 Ù\87اد Ù\87Ù\88Ù\91ا Ø§Ù\84حدÙ\91 Ø§Ù\84Ù\82اصÙ\8a Ø§Ù\84Ù\85Ù\82بÙ\88Ù\84 Ù\81 Ù\87اد Ø§Ù\84Ù\85دÙ\91Ø© ØªØ§Ø¹ Ø§Ù\84زÙ\85اÙ\86.\nعÙ\84Ù\89 Ù\87اد Ø§Ù\84Ø´Ù\8aØ\8c Ø§Ù\84زاÙ\8aرÙ\8aÙ\86 Ù\85Ù\86 Ù\87اد Ø§Ù\84Ø¥Ù\8aبÙ\8a Ù\85ا Ù\8aÙ\86جÙ\85Ù\88 Ù\8aØ®Ù\84Ù\82Ù\88 Ø­ØªØ§ Ø­Ø³Ø§Ø¨ Ù\81 Ù\87اد Ø§Ù\84Ù\88Ù\82Ù\8aتة.",
+       "acct_creation_throttle_hit": "دار Ø²Ø§Ù\8aرÙ\8aÙ\86 Ù\84 Ù\87اد Ø§Ù\84Ù\88Ù\8aÙ\83Ù\8a Ù\83اÙ\86Ù\88 Ù\85ستعÙ\85Ù\84Ù\8aÙ\86 Ø§Ù\84Ø¥Ù\8aÙ¾Ù\8a Ù\86تاعÙ\83 Ù\88 Ø®Ù\84Ù\82Ù\88 {{PLURAL:$1|حساب|$1 Ø­Ø³Ø§Ø¨Ø§Øª}} Ù\81` Ø§Ù\84Ù\86Ù\87ار Ù\87ادا Ø§Ù\84Ù\91Ù\8a Ù\81اتØ\8c Ù\88 Ù\87اد Ù\87Ù\88Ù\91ا Ø§Ù\84حدÙ\91 Ø§Ù\84Ù\82اصÙ\8a Ø§Ù\84Ù\85Ù\82بÙ\88Ù\84 Ù\81 Ù\87اد Ø§Ù\84Ù\85دÙ\91Ø©.\nعÙ\84Ù\89 Ù\87اد Ø§Ù\84Ø´Ù\8aØ\8c Ø§Ù\84زاÙ\8aرÙ\8aÙ\86 Ù\85Ù\86 Ù\87اد Ø§Ù\84Ø¥Ù\8aبÙ\8a Ù\85ا Ù\8aÙ\86جÙ\85Ù\88Ø´ Ù\8aصÙ\91Ù\86Ù\88 Ø­Ø³Ø§Ø¨ Ø¢Ø®Ø±.",
        "emailauthenticated": "الادريسة تاع الإيمال تاعك راهي تكونفيرمات ف $2 على الـ $3.",
        "emailnotauthenticated": "الادريسة تاع الإيمال تاعك مازال ما راهيش مكونفيرمية.\nحتا إيمال ما غادي ينبعَت لك على الشغّالات هادي.",
        "noemailprefs": "خصّص كاش آدريسة تاع إيمال فل إختيارات ديالك باش تمشي لك هاد التشغيلة.",
        "createaccount-title": "خليق حساب ف {{SITENAME}}",
        "createaccount-text": "شي واحد راه خلَق حساب ف {{SITENAME}} ($4) ب`السميّة \"$2\"، و كلمت` السرّ \"$3\".\nلازم لك ضركا تتسجّل داخل ف` السيت و تبدّل كلمت` السرّ ديالك.\n\nيلا هاد الحساب راه نخلَق ب غلطة، غير فوت هاد الميساج.",
        "login-throttled": "راك درت مسيّات كتَر من المقبول باش تدخُل ف`السيت.\nالله يخلّيك، اصبَر $1 قبَل ما تسيّي عاود.",
-       "login-abort-generic": "الدخول تاعك ما نجَحش",
+       "login-abort-generic": "المحاولة ديال الدخول نتاعك ما نجَحتش",
        "login-migrated-generic": "الحساب تاعك راه تنقّل و سميّت` المستعملي ما بقاش كاين ف هاد الويكي.",
        "loginlanguagelabel": "اللوغه: $1",
        "suspicious-userlogout": "المطلب تاعك باش تسجّل خارج ما تسجّلش خاطر راه يبان مرسول من عند بحّار معطّل ولا  خزّان تاع وسّاط (proxy cache).",
        "createacct-another-realname-tip": "السميّة الحقّانيّة ماشي ملزومة.\nيلا تستعملها غادي تصلاح باش تنسّب ليك الخدمة الّي غادي تديرها.",
        "pt-login": "ادخل",
        "pt-login-button": "دخول",
+       "pt-login-continue-button": "واصل الدخول",
        "pt-createaccount": "اصنع حساب",
        "pt-userlogout": "الخروج",
        "php-mail-error-unknown": "غلطة مجهولة صرات فل وضيفة mail() تاع PHP.",
        "newpassword": "كلمت` السرّ الجديدة:",
        "retypenew": "عتود اكتب كلمت` السرّ:",
        "resetpass_submit": "اختار كلمت` السرّ و سجّل الدخول",
-       "changepassword-success": "كلمت` السرّ تاعك راهي تبدّلت!",
+       "changepassword-success": "كلمت السرّ نتاعك راها تبدّلت!",
        "changepassword-throttled": "راك درت مسيّات كتَر من المقبول باش تدخُل ف`السيت.\nالله يخلّيك، اصبَر $1 قبَل ما تسيّي عاود.",
+       "botpasswords": "كلمات سر البوت",
+       "botpasswords-summary": "<em>كلمات سر البوت</em> تسمح بالوصول لحساب مستخدم من خلال API بلا ما  تستخدام اعتمادات تسجيل الدخول الرئيسية للحساب. صلاحيات المستخدم المتوفرة عند تسجيل الدخول باستخدام كلمة سر بوت بالاك تكون مقيدة.\nإذا ما عرفتش علاش باغي تدير هذا، لازملك ما تديرهاش. حد أبدا ما يلزملو يسألك باش تولّد واحدة من هذه و تعطيهالو.",
+       "botpasswords-disabled": "كلمات السر الخاصة بالبوت معطلة.",
+       "botpasswords-no-central-id": "باش تستخدام كلمة السر الخاصة بالبوت، لازم أن تسجيل الدخول من خلال حساب موحد.",
+       "botpasswords-existing": "كلمات سر البوت اللي كاينة",
+       "botpasswords-createnew": "صناعة كلمة سر جديدة للبوت",
+       "botpasswords-editexisting": "تعديل كلمة سر موجودة للبوت",
+       "botpasswords-label-appid": "آسم البوت:",
+       "botpasswords-label-create": "أصنع",
+       "botpasswords-label-update": "حدّث / ميزاجور",
+       "botpasswords-label-cancel": "بطّل",
+       "botpasswords-label-delete": "امحي",
+       "botpasswords-label-resetpassword": "عاود كلمة السر",
+       "botpasswords-label-grants": "الشروط المطبقة الممكنة",
        "resetpass_forbidden": "كلمت` السرّ ما تنجمش تتبدّل",
        "resetpass-no-info": "لازم لك تكون مسجّل الدخول باش تلحق ل هاد الپاجة.",
        "resetpass-submit-loggedin": "بدّل كلمت` السرّ",
index fd6f1e0..3bbecdf 100644 (file)
        "htmlform-selectorother-other": "Åndre",
        "logentry-move-move_redir": "$1 hod de Seitn $3 af $4 {{GENDER:$2|verschom}} und hod dabei a Weidaloatung ibaschriem",
        "logentry-move-move_redir-noredirect": "$1 hod de Seitn $3 af $4 {{GENDER:$2|verschom}} und dabei a Weidaloatung ibaschriem, ohne a neiche ozlegn",
-       "searchsuggest-search": "Suach",
+       "searchsuggest-search": "Suach (af Boarisch oda Deutsch)",
        "searchsuggest-containing": "Voitextsuach noch ..."
 }
index 448acb5..d23fe76 100644 (file)
        "mergehistory-merge": "Наступныя вэрсіі [[:$1]] можна аб'яднаць у [[:$2]].\nКарыстайцеся кнопкамі для аб'яднаньня толькі выбранага дыяпазону рэдагаваньняў.\nЗаўважце, што выкарыстаньне навігацыйных спасылак выдаліць зьвесткі ў гэтым слупку.",
        "mergehistory-go": "Паказаць праўкі, якія магчыма аб’яднаць",
        "mergehistory-submit": "Аб’яднаць гісторыі рэдагаваньняў",
-       "mergehistory-empty": "Ð\9dÑ\8fма Ð³Ñ\96Ñ\81Ñ\82оÑ\80Ñ\8bÑ\96 Ñ\80Ñ\8dдагаванÑ\8cнÑ\8fÑ\9e, Ñ\8fкÑ\83Ñ\8e Ð¼Ð°Ð³Ñ\87Ñ\8bма Ð°Ð±'яднаць.",
-       "mergehistory-done": "$3 {{PLURAL:$3|вэрсія|вэрсіі|вэрсіяў}} з $1 пасьпяхова аб’яднаныя ў [[:$2]].",
+       "mergehistory-empty": "Ð\9dÑ\8fма Ð¿Ñ\80авак, Ñ\8fкÑ\96Ñ\8f Ð¼Ð°Ð³Ñ\87Ñ\8bма Ð°Ð±â\80\99яднаць.",
+       "mergehistory-done": "$3 {{PLURAL:$3|вэрсія|вэрсіі|вэрсіяў}} з $1 {{PLURAL:$3|1=была аб’яднаная|былі аб’яднаныя}} ў [[:$2]].",
        "mergehistory-fail": "Не атрымалася аб'яднаць гісторыі старонак. Калі ласка, праверце парамэтры старонкі і часу.",
        "mergehistory-fail-bad-timestamp": "Няслушная метка часу.",
        "mergehistory-fail-invalid-source": "Няслушная старонка-крыніца.",
        "sp-contributions-uploads": "загрузкі",
        "sp-contributions-logs": "журналы падзеяў",
        "sp-contributions-talk": "гутаркі",
-       "sp-contributions-userrights": "кіраваньне правамі ўдзельнікаў і ўдзельніц",
+       "sp-contributions-userrights": "кіраваньне правамі {{GENDER:$1|ўдзельніка|ўдзельніцы}}",
        "sp-contributions-blocked-notice": "{{GENDER:$1|Гэты ўдзельнік у дадзены момант заблякаваны|Гэтая ўдзельніца ў дадзены момант заблякаваная}}. Апошні запіс з журнала блякаваньняў пададзены ніжэй для даведкі:",
        "sp-contributions-blocked-notice-anon": "Гэты IP-адрас у дадзены момант заблякаваны.\nАпошні запіс з журнала блякаваньняў пададзены ніжэй для даведкі:",
        "sp-contributions-search": "Пошук унёску",
        "autoblocklist": "Аўтаблякаваньні",
        "autoblocklist-submit": "Шукаць",
        "autoblocklist-legend": "Сьпіс аўтаблякаваньняў",
+       "autoblocklist-localblocks": "{{PLURAL:$1|1=Лякальнае аўтаблякаваньне|Лякальныя аўтаблякаваньні}}",
        "ipblocklist": "Заблякаваныя ўдзельнікі",
        "ipblocklist-legend": "Пошук заблякаванага ўдзельніка",
        "blocklist-userblocks": "Схаваць блякаваньні рахункаў",
index 30d0ee1..98338bb 100644 (file)
@@ -55,7 +55,7 @@
        "tog-editondblclick": "Редактиране на страниците чрез двойно щракване",
        "tog-editsectiononrightclick": "Възможност за редактиране на раздел при щракване с десния бутон върху заглавието му",
        "tog-watchcreations": "Добавяне на създадените от мен страници и качените от мен файлове към списъка ми за наблюдение",
-       "tog-watchdefault": "Добавяне на страниците, които редактирам, в списъка ми за наблюдение",
+       "tog-watchdefault": "Добавяне на страниците, които редактирам в списъка ми за наблюдение",
        "tog-watchmoves": "Добавяне на преместените от мен страници и файлове към списъка ми за наблюдение",
        "tog-watchdeletion": "Добавяне на изтритите от мен страници и файлове към списъка ми за наблюдение",
        "tog-watchuploads": "Добавяне на новите качени от мен файлове към списъка ми за наблюдение",
@@ -92,8 +92,8 @@
        "editfont-style": "Стил на шрифта в кутията за редактиране:",
        "editfont-default": "По подразбиране за браузъра",
        "editfont-monospace": "Равноширок шрифт",
-       "editfont-sansserif": "ШÑ\80иÑ\84Ñ\82 Ð±ÐµÐ· Ð¸Ð·Ð²Ð¸Ð²ÐºÐ¸",
-       "editfont-serif": "ШÑ\80иÑ\84Ñ\82 Ñ\81 Ð¸Ð·Ð²Ð¸Ð²ÐºÐ¸",
+       "editfont-sansserif": "Ð\9dеÑ\81еÑ\80иÑ\84ен Ñ\88Ñ\80иÑ\84Ñ\82",
+       "editfont-serif": "СеÑ\80иÑ\84ен Ñ\88Ñ\80иÑ\84Ñ\82",
        "sunday": "неделя",
        "monday": "понеделник",
        "tuesday": "вторник",
        "category_header": "Страници в категория „$1“",
        "subcategories": "Подкатегории",
        "category-media-header": "Файлове в категория „$1“",
-       "category-empty": "''В момента тази категория не съдържа страници или файлове.''",
+       "category-empty": "<em>В момента тази категория не съдържа страници или файлове.</em>",
        "hidden-categories": "{{PLURAL:$1|Скрита категория|Скрити категории}}",
        "hidden-category-category": "Скрити категории",
        "category-subcat-count": "{{PLURAL:$2|Тази категория съдържа само една подкатегория.|{{PLURAL:$1|Показана е една|Показани са $1}} от общо $2 подкатегории на тази категория.}}",
        "redirectedfrom": "(пренасочване от $1)",
        "redirectpagesub": "Пренасочваща страница",
        "redirectto": "Пренасочване към:",
-       "lastmodifiedat": "Последна промяна на страницата: в $2, на $1.",
+       "lastmodifiedat": "Последна редакция на страницата: в $2, на $1.",
        "viewcount": "Страницата е била преглеждана {{PLURAL:$1|един път|$1 пъти}}.",
        "protectedpage": "Защитена страница",
        "jumpto": "Направо към:",
        "privacy": "Поверителност",
        "privacypage": "Проект:Защита на личните данни",
        "badaccess": "Грешка при достъп",
-       "badaccess-group0": "Ð\9dÑ\8fмаÑ\82е Ð¿Ñ\80ава Ð´Ð° Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88иÑ\82е Ð¸Ñ\81каното действие.",
-       "badaccess-groups": "Ð\98Ñ\81каното действие могат да изпълнят само потребители от {{PLURAL:$2|групата|някоя от следните групи:}} $1.",
+       "badaccess-group0": "Ð\9dÑ\8fмаÑ\82е Ð¿Ñ\80ава Ð´Ð° Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88иÑ\82е Ð·Ð°Ñ\8fвеното действие.",
+       "badaccess-groups": "Ð\97аÑ\8fвеното действие могат да изпълнят само потребители от {{PLURAL:$2|групата|някоя от следните групи:}} $1.",
        "versionrequired": "Изисква се версия $1 на МедияУики",
        "versionrequiredtext": "Използването на тази страница изисква версия $1 на софтуера МедияУики. Вижте [[Special:Version|текущата версия]].",
        "ok": "Добре",
        "filerenameerror": "Файлът „$1“ не можа да бъде преименуван на „$2“.",
        "filedeleteerror": "Файлът „$1“ не можа да бъде изтрит.",
        "directorycreateerror": "Невъзможно е да бъде създадена директория „$1“.",
-       "directoryreadonlyerror": "Директория \"$1\" е само за четене.",
-       "directorynotreadableerror": "Директория \"$1\" не може да бъде четена.",
+       "directoryreadonlyerror": "Директория „$1“ е само за четене.",
+       "directorynotreadableerror": "Директория „$1“ не може да бъде четена.",
        "filenotfound": "Файлът „$1“ не беше намерен.",
        "unexpected": "Неочаквана стойност: „$1“=„$2“.",
-       "formerror": "Ð\92Ñ\8aзникна Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ð¸Ð·Ð¿Ñ\80аÑ\89ане Ð½Ð° Ñ\84оÑ\80мÑ\83лÑ\8fÑ\80а.",
+       "formerror": "Ð\93Ñ\80еÑ\88ка: Ð¤Ð¾Ñ\80мÑ\83лÑ\8fÑ\80Ñ\8aÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ð¿Ñ\80аÑ\82ен.",
        "badarticleerror": "Действието не може да бъде изпълнено на тази страница.",
        "cannotdelete": "Указаната страница или файл \"$1\" не можа да бъде изтрит(а). Възможно е вече да е бил(а) изтрит(а) от някой друг.",
        "cannotdelete-title": "Страницата „$1“ не може да бъде изтрита",
        "perfcachedts": "Данните са складирани и обновени за последно на $1. Най-много {{PLURAL:$4|един резултат е допустим и наличен|$4 резултата са допустими и налични}} в складираното копие.",
        "querypage-no-updates": "Обновяването на тази страница в момента е изключено. Засега данните тук няма да бъдат обновявани.",
        "viewsource": "Преглед на кода",
-       "viewsource-title": "Ð\9fÑ\80еглеждане на кода на $1",
+       "viewsource-title": "Ð\9fÑ\80еглед на кода на $1",
        "actionthrottled": "Ограничение в скоростта",
        "actionthrottledtext": "Като част от защитата против спам, многократното повтаряне на това действие за кратък период от време е ограничено и вие вече сте надвишили лимита. Моля опитайте отново след няколко минути.",
        "protectedpagetext": "Тази страница е защитена, за да се предотвратят редактиране или други действия.",
        "cascadeprotected": "Тази страница е защитена против редактиране, защото е включена в {{PLURAL:$1|следната страница, която от своя страна има|следните страници, които от своя страна имат}} „каскадна“ защита:\n$2",
        "namespaceprotected": "Нямате права за редактиране на страници в именно пространство '''$1'''.",
        "customcssprotected": "Нямате права за редактиране на тази CSS страница, защото тя съдържа чужди потребителски настройки.",
-       "customjsprotected": "Нямате права за редактиране на тази JavaScript страница, защото тя съдържа чужди потребителски настройки.",
+       "customjsprotected": "Нямате права за редактиране на тази JavaScript страница, тъй като съдържа чужди потребителски настройки.",
        "mycustomcssprotected": "Нямате права за редактиране на тази CSS страница.",
        "mycustomjsprotected": "Нямате права за редактиране на тази JavaScript страница.",
        "myprivateinfoprotected": "Нямате права да редактирате личната си информация.",
        "post-expand-template-argument-warning": "Внимание: Тази страница съдържа поне един аргумент на шаблон, който има твърде голям размер при разгръщане. Тези аргументи бяха пропуснати.",
        "post-expand-template-argument-category": "Страници, съдържащи шаблони с пропуснати аргументи",
        "parser-template-loop-warning": "Открито зацикляне на шаблон: [[$1]]",
+       "template-loop-category": "Страници със зацикляне в шаблона",
+       "template-loop-category-desc": "Тази страница съдържа зацикляне в шаблона, т.е. шаблон, който рекурсивно се самоповиква.",
        "parser-template-recursion-depth-warning": "Надвишен лимит на дълбочината при шаблонна рекурсия ($1)",
        "language-converter-depth-warning": "Надвишени са възможностите за автоматичен превод ($1)",
        "node-count-exceeded-category": "Страници, където е превишен възел-граф",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|промени}} потребителската група на $3",
        "logentry-rights-autopromote": "$1 е автоматично {{GENDER:$2|повишен|повишена}} от $4 до $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|качи}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|качи}} нова версия на $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|качи}} $3",
        "log-name-managetags": "Дневник на управлението на етикети",
        "log-description-managetags": "На тази страница са изброени задачи, свързани с управлението на [[Special:Tags|етикети]]. Дневникът съдържа само действия, извършвани ръчно от администратор. Етикети могат да бъдат създавани или изтривани от уики софтуера без това да бъде отразено в този дневник.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|създаде}} етикета \"$4\"",
        "log-name-tag": "Дневник на етикетите",
        "log-description-tag": "Тази страница показва, кога потребителите са добавили или премахнали [[Special:Tags|етикети]] от отделни версии или записи. Списъкът не включва подобни действия, когато те се появяват, като част от процеса на редактиране, изтриване или подобни действия.",
        "rightsnone": "(никакви)",
index fc87a2e..e79df3f 100644 (file)
        "logdelete-text": "অপসারিত লগ ইভেন্টসমূহ এখনও লগে প্রদর্শিত হয়, কিন্তু সেই বিষয়বস্তুর অংশগুলি সর্বসাধারণ দেখতে পারেবে না।",
        "revdelete-text-others": "অন্যান্য প্রশাসকেরা তার পরেও এই লুকানো বিষয়বস্তুগুলি দেখতে পারবেন এবং প্রয়োজনে সেগুলো ফিরিয়ে আনতে পারবেন, যদি অন্যান্য কোনো বাধা না থাকে।",
        "revdelete-confirm": "অনুগ্রহ করে নিশ্চিত করুন যে আপনি এটি করতে চাচ্ছিলেন, আপনি এর ফলাফল সম্পর্কে অবগত আছেন, এবং [[{{MediaWiki:Policy-url}}|নীতিমালার]] উপর ভিত্তি করেই এই কাজটি করছেন।",
-       "revdelete-suppress-text": "নিচের বিষয়গুলোর ক্ষেত্রেই '''কেবলমাত্র'''  চাপাচাপি করা যাবে:\n* সম্ভাব্য মানহানিকর তথ্য\n* ভুল ব্যক্তিগত তথ্য\n*: ''বাসার ঠিকানা এবং ফোন নম্বর, সোসাল সিকিউরিটি নম্বর, ইত্যাদি।''",
+       "revdelete-suppress-text": "নিচের বিষয়গুলোর ক্ষেত্রেই <strong>কেবলমাত্র</strong> গোপন করা যাবে:\n* সম্ভাব্য মানহানিকর তথ্য\n* ভুল ব্যক্তিগত তথ্য\n*: <em>বাসার ঠিকানা এবং ফোন নম্বর, সামাজিক নিরাপত্তা নম্বর, ইত্যাদি।</em>",
        "revdelete-legend": "দৃষ্টিপাত সীমাবদ্ধ করো",
        "revdelete-hide-text": "সংশোধনের লেখা",
        "revdelete-hide-image": "ফাইলের বিষয়বস্তু লুকিয়ে রাখা হোক",
        "blockipsuccesssub": "বাধা সফল",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] কে বাধা দেয়া হয়েছে।<br />\nবাধা দেয়া পুনর্বিবেচনা করতে হলে [[Special:BlockList|বাধা দেয়া তালিকা]] দেখুন।",
        "ipb-blockingself": "আপনি নিজেকেই বাধাপ্রদান করতে যাচ্ছেন! আপনি কী নিশ্চিত যে আপনি এটি-ই করতে চান?",
-       "ipb-confirmhideuser": "\"hide user\" ক্ষমতার মাধ্যমে আপনি একজন ব্যবহারকারীকে বাধা দিতে যাচ্ছেন। এর মাধ্যমে এই ব্যবহারকারীর নাম সকল লিস্ট এবং লগএন্ট্রি থেকে সরিয়ে ফেলা হবে। আপনি কি নিশ্চিতভাবে এটি করতে চান?",
+       "ipb-confirmhideuser": "আপনি \"ব্যবহারকারী লুকানো\" অধিকার যুক্ত একজন ব্যবহারকারীকে বাধা দিতে যাচ্ছেন। এর মাধ্যমে এই ব্যবহারকারীর নাম সকল তালিকা এবং লগের ভুক্তি থেকে সরিয়ে ফেলা হবে। আপনি কি নিশ্চিতভাবে এটি করতে চান?",
        "ipb-confirmaction": "আপনি যদি নিশ্চিত হন আপনি এটি সত্যিকার অর্থেই করতে চান তাহলে অনুগ্রহ করে উপরের \"{{int:ipb-confirm}}\" ঘরটি দেখুন।",
        "ipb-edit-dropdown": "বাধাদানের কারণ সম্পাদনা করুন",
        "ipb-unblock-addr": "$1-এর বাধা তুলে নিন",
index 5554c66..67ae91b 100644 (file)
        "confirmrecreate": "{{GENDER:$1|Diverket}} eo bet ar bajenn-mañ gant [[User:$1|$1]] ([[User talk:$1|kaozeal]]) goude ma vije bet kroget ganeoc'h kemmañ anezhi :\n: ''$2''\nKadarnait mar plij e fell deoc'h krouiñ ar pennad-mañ en-dro.",
        "confirmrecreate-noreason": "{{GENDER:$1|Diverket}} eo bet ar bajenn-mañ gant [[User:$1|$1]] ([[User talk:$1|kaozeal]]) goude ma vije bet kroget ganeoc'h kemmañ anezhi. Kadarnait e fell deoc'h adkrouiñ ar pennad-mañ e gwirionez.",
        "recreate": "Adkrouiñ",
+       "confirm-purge-title": "Spurjañ ar bajenn-mañ.",
        "confirm_purge_button": "Mat eo",
        "confirm-purge-top": "Spurjañ krubuilh ar bajenn-mañ?",
        "confirm-purge-bottom": "Spurjañ ur bajenn a a naeta ar grubuilh hag a redi ar stumm nevesañ da zont war wel.",
index c8c2825..e7be843 100644 (file)
        "templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} prikazani u ovom pregledu:",
        "templatesusedsection": "{{PLURAL:$1|Šablon|Šabloni}} korišteni u ovoj sekciji:",
        "template-protected": "(zaštićeno)",
-       "template-semiprotected": "(polu-zaštićeno)",
+       "template-semiprotected": "(poluzaštićeno)",
        "hiddencategories": "Ova stranica pripada u {{PLURAL:$1|$1 skrivenu kategoriju|$1 skrivene kategorije|$1 skrivenih kategorija}}:",
        "edittools": "<!-- Ovaj tekst će biti prikazan ispod formi za uređivanje i postavljanje. -->",
        "nocreatetext": "Na {{SITENAME}} je zabranjeno postavljanje novih stranica.\nMožete se vratiti i uređivati već postojeće stranice ili se [[Special:UserLogin|prijaviti ili otvoriti korisnički račun]].",
        "newimages-summary": "Ova posebna stranica prikazuje nedavno postavljene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ili dio imena):",
+       "newimages-user": "IP-adresa ili korisničko ime",
        "newimages-showbots": "Pokaži datoteke koje su poslali botovi",
        "newimages-hidepatrolled": "Sakrij patrolirana postavljanja",
        "noimages": "Nema ništa.",
index 36b0758..18cbd5e 100644 (file)
        "anoneditwarning": "<strong>ھۆشیار بە:</strong> نەڕۆیشتووتەتە ژوورەوە. ھەر دەستکارییەک بکەیت ناونیشانی IPیەکەت بۆ ھەموو کەسێک دیار دەبێت. بەڵام ئەگەر <strong>[$1 بچیتە ژوورەوە]</strong> یان <strong>[$2 ھەژمارێک دروست بکەیت]</strong>، دەستکارییەکانت بە ناوی بەکارھێنەرییەکەتەوە بڵاو دەبێتەوە و لە چەند قازانجی تریشی ھەیە.",
        "anonpreviewwarning": "«نەڕۆشتوویتە ژوورەوە. پاشەکەوتکردن، ئەدرەسی IPەکەت لە مێژووی دەستکاریی ئەم پەڕە تۆمار دەکات.»",
        "missingsummary": "'''وە بیر خستنەوە:''' پوختەیەکت نەنووسیوە بۆ چۆنیەتی گۆڕانکارییەکەت.\nئەگەر جارێکی تر پاشکەوت کردن لێبدەی، بێ پوختە تۆمار دەکرێ.",
-       "selfredirect": "<strong>ئاگاداری:</strong> تۆ خەریکی گواستنەوەی ئەم پەڕەیەیت بۆ سەر خۆی. لەوانەیە خەریکی گواستنەوەی پەڕەیەکی ھەڵە بیت یان ھەوڵی گواستنەوە دەدەیت بۆ ئامانجێکی ھەڵە. \nئەگەر دەەبارە کرتە لەسەر «{{int:savearticle}}» بکەیتەوە، ڕەوانەکەرەکە دروست دەکرێت بەھەرحاڵ.",
+       "selfredirect": "<strong>ئاگاداری:</strong> تۆ خەریکی گواستنەوەی ئەم پەڕەیەیت بۆ سەر خۆی. لەوانەیە خەریکی گواستنەوەی پەڕەیەکی ھەڵە بیت یان ھەوڵی گواستنەوە دەدەیت بۆ ئامانجێکی ھەڵە. \nئەگەر دووبارە کرتە لەسەر «{{int:savearticle}}» بکەیتەوە، ڕەوانەکەرەکە دروست دەکرێت بەھەرحاڵ.",
        "missingcommenttext": "تکایە لە خوارەوە شرۆڤەیەک بنووسە.",
        "missingcommentheader": "'''بیرهێنانەوە:''' بۆ ئەم بۆچوونەت سەردێڕ\\بابەت ڕاچاو نەکردووە.\nئەگەر دیسان «{{int:savearticle}}» لێبدەی، دەستکاریەکەت بێ سەردێڕ یان بابەت پاشەکەوت دەبێ.",
        "summary-preview": "پێشبینینی کورتە:",
        "badsiglength": "واژووەکەت زۆر درێژە.\nواژوو نابێ لە $1 {{PLURAL:$1|نووسە}} درێژتر بێت.",
        "yourgender": "پێت خۆشە چۆن وەسف بکرێیت؟",
        "gender-unknown": "پێم خۆشە باسی نەکەم",
-       "gender-male": "Ù¾Û\8cاÙ\88",
-       "gender-female": "ژن",
+       "gender-male": "Ù\86Û\8eر",
+       "gender-female": "مێ",
        "prefs-help-gender": "ئەم ھەڵبژاردەیە دڵخوازانەیە.\nبۆ بانگکردن و ئاماژەپێکردن بە شێوەیەکی دروست لەلایەن نەرمامێرەوە بەکاردێت.\nئەم زانیارییە گشتی دەبێت.",
        "email": "ئیمەیل",
        "prefs-help-realname": "ناوی ڕاستەقینە دڵخوازە.\nئەگەر بنووسرێت، لەوانەیە بۆ ئاماژەدان بەرھەمەکەت بە کار بھێنرێت.",
        "newpageletter": "ن",
        "boteditletter": "بۆت",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|بەکارھێنەر}}ی چاودێر]",
-       "rc_categories": "بەرتەسککردنەوە بە هاوپۆلەکان (به «|» جیای بکەوە‌)",
-       "rc_categories_any": "هەرکام",
+       "rc_categories": "بەرتەسککردنەوە بە هاوپۆلەکان (به «|» جیای بکەوە‌)",
+       "rc_categories_any": "هەرکامێک بێت",
        "rc-change-size-new": "$1 {{PLURAL:$1|بایت}} پاش گۆڕانکاری",
        "newsectionsummary": "/* $1 */ بەشی نوێ",
        "rc-enhanced-expand": "وردەکارییەکان نیشان بدە",
        "recentchangeslinked-summary": "ئەمە لیستێکی گۆڕانکارییەکانی ئەم دوایییانەی ئەو پەڕانەیە کە بەستەریان ھەیە لە پەڕەیەکی دیاریکراو (یان بۆ ئەندامەکانی پۆلێکی دیاریکراو)\nپەڕەکانی [[Special:Watchlist|لیستی چاودێرییەکەت]] '''ئەستوورن'''.",
        "recentchangeslinked-page": "ناوی پەڕە:",
        "recentchangeslinked-to": "بەجێگەی ئەوە گۆڕانکارییەکانی ئەو پەڕانە نیشانبدە کە بەستەریان ھەیە بۆ پەڕەی دیاریکراو",
+       "recentchanges-page-added-to-category": "[[:$1]] زیادکرا بۆ پۆل",
+       "recentchanges-page-removed-from-category": "[[:$1]] لابرا لە پۆل",
        "upload": "پەڕگەیەک بار بکە",
        "uploadbtn": "پەڕگە بار بکە",
        "reuploaddesc": "هەڵوەشانەوەی بارکردن و گەڕانەوە بۆ فۆرمی بارکردن",
        "illegalfilename": "ناوی‌پەڕگەی \"$1\" پیتێکی تێدایە کە ڕێگەنەدراوە بۆ سەردێڕی لاپەڕە بەکاربێت.\nتکایە ناوی پەڕگەکە بگۆڕە و دیسان باری بکەوە.",
        "filename-toolong": "ناوی پەڕگە ناتوانێ لە ٢٤٠ بایت درێژتر بێت.",
        "badfilename": "ناوی پەڕگە بە \"$1\" گۆڕا .",
+       "filetype-mime-mismatch": "فۆرماتی پەڕگە «$1» نەگونجێت لەگەڵ MIMEی دیاریکراوی پەڕگە ($2).",
        "filetype-badmime": "ڕێگە نەدراوە پەڕگەی \"$1\" جۆری MIME بار بکرێت.",
        "filetype-bad-ie-mime": "ناتوانین ئەم پەڕگە باربکەین لەبەر ئەوەی وێبگەڕی Internet Explore ئەوە وەک \"$1\" دەناسێت کە ڕێگەنەدراوەیە و جۆرە پەڕگەیەکی مەترسی‌دارە.",
        "filetype-unwanted-type": "'''\".$1\"''' جۆرە پەڕگەی نەخوازراوە.\n$2، ئەو جۆرە {{PLURAL:$3|پەڕگەیە|پەڕگانەیە}} وا بە باش‌ دازاندرێت.",
        "file-too-large": "ئەو پەڕگەیە ناردووتە زۆر گەورەیە.",
        "filename-tooshort": "ناوی پەڕگە زۆر کورتە.",
        "filetype-banned": "ئەم جۆرە پەڕگەیە قەدەغەیە.",
+       "verification-error": "ئەم پەڕگەیە شکسی ھێنا لە پڕۆسەی پەسەندکردنی پەڕگە.",
        "illegal-filename": "ناوی پەڕگە رێگەپێ‌نەدراوە.",
+       "overwrite": "بەسەردانانی پەڕگەی ئێستا ڕێگە پێنەدراوە.",
        "unknown-error": "ھەڵەیەکی نەزانراو ڕوویداوە.",
+       "tmp-create-error": "نەتوانرا پەڕگەی کاتیی دروست بکرێت.",
        "large-file": "پێشنیار دەکرێت قەبارەی پەڕگەکان زیاتر لە $1 نەبێت؛\nقەبارەی ئەم پەڕگە $2.",
        "largefileserver": "ئەم پەڕگە گەورەتر لەوەیە کە ڕاژەکار ڕێگەدەدات.",
        "emptyfile": "ئەو پەڕگەیەی بارت کردووە لەوە دەچێ واڵا بێت.\nلەوانەیە بە ھۆی هەڵەیەک لە تایپی ناوی پەڕگەکە بێت.\nتکایە تاوتوێی بکە ئەگەر بە ڕاستی دەتەوێ ئەم پەڕگەیە بار بکەی.",
-       "fileexists": "پەڕگەیەک هەر بەو ناوە‌ لە پێش‌دا هەیە، تکایە گەر ئەرخەیان نیت بۆ گۆڕینی، چاوێک لە <strong>[[:$1]]</strong> بکە.\n[[$1|thumb]]",
+       "windows-nonascii-filename": "ئەم ویکییە ڕێگە نادات بە بەکارھێنانی نووسینی تایبەتیی لە سەرناوی پەڕگەکاندا.",
+       "fileexists": "پەڕگەیەک هەر بەو ناوە‌ هەیە، تکایە گەر ئەرخەیان نیت بۆ گۆڕینی، چاوێک لە <strong>[[:$1]]</strong> بکە.\n[[$1|thumb]]",
        "filepageexists": "پەڕەی ناساندن بۆ ئەم پەڕگە پێشتر لە <strong>[[:$1]]</strong> درووستکراوە، بەڵام پەڕگەیەک بەو ناوەوە ئێستا نادۆزرێتەوە.\nئەو پوختەی کە نووسیوتە لە پەڕەی ناساندن بەرچاو ناکەوێت.\nگەر دەتەوێ پوختەکەت بەرچاو کەوێت دەبێ خۆت دەستی دەستکاری بکەی.\n[[$1|thumb]]",
        "fileexists-extension": "پەڕگەیەک هەر بەو ناوە هەیە: [[$2|thumb]]\n* ناوی ئەو پەڕگەی باری ئەکەی:<strong>[[:$1]]</strong>\n* ناوی ئەو پەڕگەی ئێستا هەیە:<strong>[[:$2]]</strong>\nتکایە ناوێکی دیکە هەڵبژێرە.",
        "fileexists-thumbnail-yes": "لەوە دەچێ ئەم پەڕگە وێنەیەکی بچووک‌کراوە بێت ''(هێما)''. [[$1|thumb]]\nتکایە چاو لە پەڕگەی <strong>[[:$1]]</strong> بکه.‌\nگەر ئەوەی چاوت لێ‌کرد قەبارەی ڕەسەنی هەر ئەو وێنەیە، پێویست ناکات دیسان هێماکەی باربکەی.",
        "uploadwarning": "ئاگادارییەکانی بارکردن",
        "savefile": "پەڕگە پاشەکەوت بکە",
        "uploaddisabled": "بارکردن قەدەخە کراوە",
+       "copyuploaddisabled": "بارکردن بە URL لابرا.",
        "uploaddisabledtext": "بارکردنی پەڕگەکان لە کار خستراوە.",
        "php-uploaddisabledtext": "بارکردنی پەڕگەکان لە PHPدا لە کار خستراوە.\nتکایە چاو لە هەڵبژاردەکانی بارکردنی_پەڕگەکان بکە.",
        "uploadscripted": "ئەم پەڕگە HTML یان کۆدی سکریپتی لەخۆگرتووە کە لەوانەیە ببێتە هۆی هەڵە تێگەیشتنی هێندێ وێبگەڕەکان.",
        "img-auth-accessdenied": "تێپه‌ربوون ره‌تکرایه‌وه‌",
        "img-auth-nofile": "فایلی \"$1\" بوونی نیه‌",
        "img-auth-isdir": "هه‌وڵ ده‌ده‌ی بۆ کردنه‌وه‌ی بوخچه‌ی \"$1\" له‌ کاتێکدا ته‌نیا کردنه‌وه‌ی فایل رێپێدراوه‌",
+       "http-invalid-url": "URLـی ھەڵە: $1",
        "upload-curl-error6": "توانای دەست‌پێ‌گەیشتنی URL نیە",
        "upload-curl-error6-text": "ئەو URL کە ڕاچاوت کردووە توانای دەست‌پێ‌گەیشتنی نییە.\nتکایە دیسان سەرنجی بدەوە کە URL درووست‌ نووسراوە و ماڵپەڕەکە بەردەوام کار دەکات.",
        "upload-curl-error28": "کات‌بەسەرچوونی بارکردن",
        "listfiles-delete": "سڕینەوە",
        "listfiles-summary": "ئەم پەڕە تایبەتە ھەموو پەڕگە بارکراوەکان نیشان دەدات.",
        "listfiles_search_for": "بگەڕێ بۆ ناوی میدیای:",
+       "listfiles-userdoesnotexist": "ھەژماری بەکارھێنەریی «$1» تۆمار نەکراوە.",
        "imgfile": "پەڕگە",
        "listfiles": "پێرستی پەڕگەکان",
        "listfiles_thumb": "وێنۆک",
        "randompage": "پەڕەی ھەڕەمەکی",
        "randompage-nopages": "ھیچ پەڕەیەک لە {{PLURAL:$2|بۆشایی ناو|بۆشایی ناوەکان}}ی خوارەوەدا نییە: $1.",
        "randomincategory": "پەڕەیەک بە ھەڵکەوت لە پۆلدا",
+       "randomincategory-invalidcategory": "«$1» ناوی پۆلێکی دروست نییە.",
+       "randomincategory-nopages": "ھیچ پەڕەیەک لە پۆلی [[:Category:$1|$1]]دا نییە.",
        "randomincategory-category": "پۆل:",
        "randomincategory-legend": "پەڕەیەک بە ھەڵکەوت لە پۆلدا",
        "randomincategory-submit": "بڕۆ",
        "protectedpages-noredirect": "ڕەوانەکەرەکان بشارەوە",
        "protectedpagesempty": "هیچ لاپەڕەیک ئێستا بەم دیاریکراوانە نەپارێزراوە.",
        "protectedpages-page": "پەڕە",
+       "protectedpages-expiry": "بەسەردەچێت",
+       "protectedpages-performer": "پاراستنی بەکارھێنەر",
        "protectedpages-params": "پارامەترەکانی پاراستن",
        "protectedpages-reason": "ھۆکار",
+       "protectedpages-submit": "پەڕەکان پیشان بدە",
        "protectedpages-unknown-timestamp": "نەزانراو",
        "protectedpages-unknown-performer": "بەکارھێنەرێکی نەناسراو",
        "protectedtitles": "سەرناوە پارێزراوەکان",
        "apisandbox-submit": "داواکاری",
        "apisandbox-reset": "سڕینەوە",
        "apisandbox-retry": "ھەوڵداناوە",
+       "apisandbox-helpurls": "بەستەرەکانی یارمەتی",
+       "apisandbox-examples": "نموونەکان",
+       "apisandbox-submit-invalid-fields-message": "تکایە بەشە دیاریکراوەکان ڕاست بکەرەوە و دووبارە ھەوڵ بدەرەوە.",
        "apisandbox-results": "ئاکامەکان",
        "apisandbox-continue": "بەردەوامبوون",
        "apisandbox-continue-clear": "سڕینەوە",
        "showhideselectedlogentries": "دیاریکردنی بابەتە ھەڵبژێردراوەکانی لۆگ بگۆڕە",
        "checkbox-all": "ھەموو",
        "checkbox-none": "هیچ",
+       "checkbox-invert": "پێچەوانەکردنەوە",
        "allpages": "ھەموو پەڕەکان",
        "nextpage": "پەڕەی پاشەوە ($1)",
        "prevpage": "پەڕەی پێشەوە ($1)",
        "listgrants-rights": "مافەکان",
        "trackingcategories": "پۆلەکانی شوێنکەوتن",
        "trackingcategories-name": "ناوی پەیام",
+       "restricted-displaytitle-ignored": "پەڕەکان بە ناونیشانی بینینی پشتگوێخراوەوە",
        "trackingcategories-nodesc": "ھیچ وردەکارییەک بەردەست نییە",
        "mailnologin": "ناونیشان بۆ ناردن نییە",
        "mailnologintext": "ده‌بێ له‌ [[Special:UserLogin|ژووره‌وه‌]] بیت و ناونیشانێکی بڕواپێ‌کراوی ئی‌مه‌یلت له‌ ناو [[Special:Preferences|هه‌ڵبژارده‌کان]] دیاری کردبێت تا بتوانی ئی‌مه‌یل بنێریت بۆ به‌کارهێنه‌رانی دیکه‌.",
        "addedwatchtext": "پەڕەی «[[:$1]]» خرایە ژێر [[Special:Watchlist|پێرستی چاودێری]]یەکەت.\nگۆڕانکارییەکانی داھاتووی ئەم پەڕەیە و پەڕەی وتووێژەکەی، لەوێدا پێرست دەکرێت.",
        "removewatch": "لەلیستی چاودێری لایبە",
        "removedwatchtext": "پەڕەی «[[:$1]]» لە [[Special:Watchlist|لیستی چاودێریەکەت]] لابرا.",
+       "removedwatchtext-short": "پەڕەی «$1» لە پێڕستی چاودێریت لابرا.",
        "watch": "چاودێری بکە",
        "watchthispage": "ئەم پەڕەیە بخە ژێر چاودێری",
        "unwatch": "لابردنی چاودێری",
        "whatlinkshere-hideimages": "$1 بەستەرەکانی پەڕگە",
        "whatlinkshere-filters": "پاڵێوکەکان",
        "whatlinkshere-submit": "بڕۆ",
+       "autoblockid": "بەربەستی ئۆتۆماتیکی #$1",
        "block": "بەربەستنی بەکارھێنەر",
        "unblock": "لە بەربەست‌دەرهێنانی بەکارهێنەر",
        "blockip": "بەربەستنی {{GENDER:$1|بەکارھێنەر}}",
        "ipbwatchuser": "پەڕەکانی بەکارھێنەر و لێدوانی ئەم بەکارهێنەرە بخە ژێر چاودێری",
        "ipb-disableusertalk": "بەرگری ئەم بەکارھێنەرە بکە لە دستکاریکردنی پەڕەی لێدوانەکەی کاتێک بەربەست کراوە",
        "ipb-change-block": "دیسان بەربەست‌کردنەوەی ئەم بەکارهێنەرە بەم هەڵبژاردانە",
+       "ipb-confirm": "بەربەست کردن دڵنیا بکەرەوە",
        "badipaddress": "ناونیشانی ئای‌پی نەگونجاو",
        "blockipsuccesssub": "بەربەست کردن سەرکەوتوو بوو",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] بەربەست کرا.<br />\nبڕوانە [[Special:BlockList|پێرستی بەربەستن]] بۆ بەسەرداچوونەوەی بەربەستنەکان.",
        "immobile-source-namespace": "پەڕەکان لە بۆشاییی ناوی \"$1\"دا ناگوێزرێنەوە.",
        "immobile-target-namespace": "گواستنەوەی لاپەڕە بۆناو بۆشایی‌ناو \"$1\" ناکرێت.",
        "immobile-target-namespace-iw": "بەستەرێکی نێوان‌ویکی ئامانجێکی گونجاو نیە بۆ گواستنەوەی لاپەڕە.",
-       "immobile-source-page": "ئەمە لاپەڕە بۆ گواستنەوە نابێت.",
+       "immobile-source-page": "ئەم لاپەڕەیە بۆ گواستنەوە نابێت.",
        "immobile-target-page": "بۆ ئەم سەردێڕی ئامانجە جێگۆڕ ناکرێ.",
        "imagenocrossnamespace": "گواستنەوەی پەڕگە بۆ بۆشایی‌نوێکی غەیری پەڕگە گونجاو نیە.",
        "nonfile-cannot-move-to-file": "گواستنەوەی پەڕگە بۆ بۆشایی‌نوێکی غەیری پەڕگە گونجاو نیە.",
        "export-download": "وەک پەڕگە پاشەکەوتی بکە",
        "export-templates": "داڕێژەکانیش لە خۆگرێت",
        "export-pagelinks": "لەخۆگرتنی لاپەڕەکانی بەستەر پێ‌دراو هەتا قووڵایی:",
+       "export-manual": "پەڕەکان بە دەست زیاد بکە:",
        "allmessages": "پەیامەکانی سیستەم",
        "allmessagesname": "ناو",
        "allmessagesdefault": "دەقی بنەڕەتی",
        "confirm-watch-top": "زێدەکردنی ئەم پەڕە بە لیستی چاودێریت؟",
        "confirm-unwatch-button": "باشه‌",
        "confirm-unwatch-top": "ئەم پەڕە لە لیستی چاودێریت لاببرێت؟",
+       "confirm-rollback-button": "باشە",
        "semicolon-separator": "؛&#32;",
        "comma-separator": "،&#32;",
        "imgmultipageprev": "← پەڕەی پێشوو",
        "watchlistedit-raw-done": "لیستی چاودێریەکەت نوێ‌کرایەوە",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 سەردێڕ|$1 سەردێڕ}} زیادکرا:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 سەردێڕ|$1 سەردێڕ}} لابرا:",
+       "watchlistedit-clear-title": "خاوێنکردنی پێڕستی چاودێری",
        "watchlistedit-clear-titles": "ناونیشانەکان :",
+       "watchlistedit-clear-done": "پێڕستی چاودێریت خاوێن کرایەوە",
        "watchlisttools-clear": "لیستی چاودێری پاک بکەرەوە",
        "watchlisttools-view": "گۆڕانکارییە پەیوەندیدارەکان ببینە",
        "watchlisttools-edit": "لیستی چاودێری ببینە و دەستکاری بکە",
        "version-hook-name": "ناوی قولاپ",
        "version-hook-subscribedby": "بەشداربوو لە لایەن",
        "version-version": "($1)",
+       "version-no-ext-name": "[بێ ناو]",
        "version-license": "مۆڵەتنامە",
        "version-ext-colheader-version": "وەشان",
+       "version-ext-colheader-license": "مۆڵەتنامە",
        "version-ext-colheader-description": "وەسف",
+       "version-ext-colheader-credits": "بەرھەمھێنەر",
        "version-poweredby-others": "دیکە",
        "version-software": "نەرمەکاڵای دامەزراو",
        "version-software-product": "بەرهەم",
        "version-software-version": "وەشان",
        "version-entrypoints-header-url": "ناونیشانی ئینتەرنێتی",
+       "version-libraries-version": "وەشان",
        "version-libraries-license": "مۆڵەت",
        "version-libraries-description": "وەسف",
        "version-libraries-authors": "نووسەر",
        "tags-tag": "ناوی تاگ",
        "tags-display-header": "دەرکەوتنی لە پێرستەکانی گۆڕانکاری",
        "tags-description-header": "وەسفی ماناکەی بە تەواوی",
+       "tags-source-header": "سەرچاوە",
+       "tags-active-header": "چالاک؟",
        "tags-hitcount-header": "گۆڕانکاریە تاگ‌کراوەکان",
+       "tags-actions-header": "کردەوەکان",
        "tags-active-yes": "بەڵێ",
        "tags-active-no": "نا",
        "tags-edit": "دەستکاری",
        "tags-delete": "سڕینەوە",
+       "tags-activate": "کارپێکردن",
+       "tags-deactivate": "لەکارخستن",
        "tags-hitcount": "$1 {{PLURAL:$1|گۆڕان|گۆڕانکاری}}",
+       "tags-create-heading": "تاگی نوێ دروست بکە",
+       "tags-create-tag-name": "ناوی تاگ:",
+       "tags-create-reason": "هۆکار:",
+       "tags-create-submit": "دروستکردن",
+       "tags-create-no-name": "پێویستە ئامژە بە ناوی تاگ بدەیت.",
+       "tags-create-invalid-chars": "تاگەکان نابێت بۆر (<code>،</code>) یان سلاش (<code>/</code>)یان تێدابێت.",
+       "tags-delete-reason": "هۆکار:",
        "comparepages": "پەڕەکان ھەڵسەنگێنە",
        "compare-page1": "پەڕەی ١",
        "compare-page2": "پەڕەی ٢",
        "htmlform-title-not-creatable": "«$1» سەرناوێک نییە کە بکرێت پەڕەی بۆ دروست بکرێت",
        "htmlform-title-not-exists": "$1 بوونی نیە.",
        "logentry-delete-delete": "$1 پەڕەی $3ی {{GENDER:$2|سڕییەوە}}",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|ڕەوانەکەری}} $3 سڕیەوە",
        "logentry-delete-restore": "$1 پەڕەی $3ی {{GENDER:$2|ھێنایەوە}}",
        "logentry-delete-revision": "$1 دەرکەوتنی {{PLURAL:$5|پێداچوونەوەیەکی|$5 پێداچوونەوەی}} پەڕەی $3ی {{GENDER:$2|گۆڕیی}}: $4",
        "logentry-suppress-delete": "$1 پەڕەی $3 {{GENDER:$2|بەرگری کرد}}.",
index 779d9da..503b78b 100644 (file)
        "rcfilters-filter-categorization-description": "Záznamy stránek zařazených do nebo vyřazených z kategorií.",
        "rcfilters-filter-logactions-label": "Zaznamenané činnosti",
        "rcfilters-filter-logactions-description": "Administrativní úkony, založení účtů, mazání stránek, načtení souborů...",
-       "rcfilters-hideminor-conflicts-typeofchange-global": "Filtr „Malé editace“ je v konfliktu s jedním nebo více filtry podle typu změny, protože určité typy změn nelze označit jako malé. Dotyčné filtry jsou označeny nahoře, v prostoru „Aktivní filtry.",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Filtr „Malé editace“ je v konfliktu s jedním nebo více filtry podle typu změny, protože určité typy změn nelze označit jako malé. Dotyčné filtry jsou označeny nahoře, v prostoru „Aktivní filtry.",
        "rcfilters-hideminor-conflicts-typeofchange": "Určité typy změn nelze označit jako malé, tento filtr je proto v konfliktu s následujícími filtry podle typu změny: $1",
        "rcfilters-typeofchange-conflicts-hideminor": "Tento filtr podle typu změny je v konfliktu s filtrem „Malé editace“. Určité typy změn nelze označit jako malé.",
        "rcnotefrom": "Níže {{PLURAL:$5|je změna|jsou změny}} od <strong>$3, $4</strong> ({{PLURAL:$1|zobrazena|zobrazeny|zobrazeno}} nejvýše <strong>$1</strong>).",
        "sp-contributions-uploads": "načtené soubory",
        "sp-contributions-logs": "protokolovací záznamy",
        "sp-contributions-talk": "diskuse",
-       "sp-contributions-userrights": "správa uživatelských práv",
+       "sp-contributions-userrights": "správa {{GENDER:$1|uživatelských}} práv",
        "sp-contributions-blocked-notice": "Tento uživatel je momentálně zablokován. Zde je pro přehled zobrazen nejnovější záznam z knihy zablokování:",
        "sp-contributions-blocked-notice-anon": "Tato IP adresa je momentálně zablokována.\nZde je pro přehled zobrazen nejnovější záznam z knihy zablokování:",
        "sp-contributions-search": "Zobrazení příspěvků",
        "anonymous": "{{PLURAL:$1|anonymního uživatele|anonymních uživatelů}} {{GRAMMAR:2sg|{{SITENAME}}}}",
        "siteuser": "{{GENDER:$2|uživatel|uživatelka}} {{GRAMMAR:2sg|{{SITENAME}}}} $1",
        "anonuser": "anonymní uživatel {{grammar:2sg|{{SITENAME}}}} $1",
-       "lastmodifiedatby": "Tuto stránku naposledy {{GENDER:$4|změnil|změnila|změnil}} $3 v $2, $1.",
+       "lastmodifiedatby": "Tuto stránku naposledy {{GENDER:$4|editoval|editoval(a)}} $3 v $2, $1.",
        "othercontribs": "Založeno na práci $1.",
        "others": "další",
        "siteusers": "{{PLURAL:$2|{{GENDER:$1|uživatele|uživatelky}}|uživatelů}} {{grammar:2sg|{{SITENAME}}}} $1",
        "confirmrecreate": "{{GENDER:$1|Uživatel|Uživatelka}} [[User:$1|$1]] ([[User talk:$1|diskuse]]) tuto stránku {{GENDER:$1|smazal|smazala}} poté, co jste {{GENDER:|začal|začala|začali}} editovat, s odůvodněním:\n: „$2“\nOpravdu si přejete znovu tuto stránku založit?",
        "confirmrecreate-noreason": "{{GENDER:$1|Uživatel|Uživatelka}} [[User:$1|$1]] ([[User talk:$1|diskuse]]) {{GENDER:$1|smazal|smazala}} tuto stránku poté, co jste {{GENDER:|začal|začala|začali}} s editací. Potvrďte, zda chcete stránku skutečně znovu založit.",
        "recreate": "Založit znovu",
+       "confirm-purge-title": "Vymazat cache této stránky",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Aktualizovat cachovanou verzi této stránky?",
        "confirm-purge-bottom": "Aktualizace stránky vymaže cache a vynutí zobrazení nejaktuálnější verze.",
index 44df213..f8493da 100644 (file)
        "redirectedfrom": "(Weitergeleitet von $1)",
        "redirectpagesub": "Weiterleitung",
        "redirectto": "Weiterleitung nach:",
-       "lastmodifiedat": "Diese Seite wurde zuletzt am $1 um $2 Uhr geändert.",
+       "lastmodifiedat": "Diese Seite wurde zuletzt am $1 um $2 Uhr bearbeitet.",
        "viewcount": "Diese Seite wurde bisher {{PLURAL:$1|einmal|$1 mal}} abgerufen.",
        "protectedpage": "Geschützte Seite",
        "jumpto": "Wechseln zu:",
        "sp-contributions-uploads": "Hochgeladene Dateien",
        "sp-contributions-logs": "Logbücher",
        "sp-contributions-talk": "Diskussion",
-       "sp-contributions-userrights": "Benutzerrechte­verwaltung",
+       "sp-contributions-userrights": "{{GENDER:$1|Benutzerrechte­verwaltung}}",
        "sp-contributions-blocked-notice": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin}} ist derzeit gesperrt. Es folgt der aktuelle Eintrag aus dem Benutzersperr-Logbuch:",
        "sp-contributions-blocked-notice-anon": "Diese IP-Adresse ist zurzeit gesperrt.\nZur Information folgt der aktuelle Auszug aus dem Sperr-Logbuch:",
        "sp-contributions-search": "Suche nach Benutzerbeiträgen",
        "anonymous": "{{PLURAL:$1|Unangemeldeter Benutzer|Unangemeldete Benutzer}} auf {{SITENAME}}",
        "siteuser": "{{SITENAME}}-{{GENDER:$2|Benutzer|Benutzerin}} $1",
        "anonuser": "Anonymer {{SITENAME}}-Benutzer $1",
-       "lastmodifiedatby": "Diese Seite wurde zuletzt am $1 um $2 Uhr von $3 geändert.",
+       "lastmodifiedatby": "Diese Seite wurde zuletzt am $1 um $2 Uhr von $3 bearbeitet.",
        "othercontribs": "Basierend auf der Arbeit von $1.",
        "others": "anderen",
        "siteusers": "{{SITENAME}}-{{PLURAL:$2|{{GENDER:$1|Benutzer|Benutzerin}}|Benutzer}} $1",
index 1a94c80..1e3e1dc 100644 (file)
@@ -50,7 +50,8 @@
                        "Αντιγόνη",
                        "Matma Rex",
                        "Ανώνυμος Βικιπαιδιστής",
-                       "GR"
+                       "GR",
+                       "Thodoris"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδέσμων:",
        "right-editsemiprotected": "Επεξεργασία προστατευμένων σελίδων ως \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Επεξεργασίας του μοντέλου περιεχόμενου σελίδας",
        "right-editinterface": "Επεξεργασία της διασύνδεσης χρήστη",
-       "right-editusercssjs": "Μεταγραφή των αρχείων CSS και JS άλλων χρηστών",
        "right-editusercss": "Μεταγραφή των αρχείων CSS άλλων χρηστών",
        "right-edituserjs": "Μεταγραφή των αρχείων JS άλλων χρηστών",
        "right-editmyusercss": "Επεξεργασία των ιδιωτικών αρχείων CSS χρήστη",
        "confirmrecreate": "{{GENDER:$1|Ο χρήστης|Η χρήστρια}} [[User:$1|$1]] ([[User talk:$1|συζήτηση]]) διέγραψε αυτήν τη σελίδα αφότου ξεκινήσατε την επεξεργασία με αιτιολόγηση:\n: <em>$2</em>\nΠαρακαλούμε επιβεβαιώστε ότι θέλετε πραγματικά να ξαναδημιουργήσετε αυτήν τη σελίδα.",
        "confirmrecreate-noreason": "{{GENDER:$1|Ο χρήστης|Η χρήστρια}} [[User:$1|$1]] ([[User talk:$1|συζήτηση]]) διέγραψε αυτήν τη σελίδα αφότου ξεκινήσατε την επεξεργασία.\nΠαρακαλούμε επιβεβαιώστε ότι θέλετε πραγματικά να ξαναδημιουργήσετε αυτήν τη σελίδα.",
        "recreate": "Αναδημιουργία",
+       "confirm-purge-title": "Καθάρισε αυτή την σελίδα",
        "confirm_purge_button": "Εντάξει",
        "confirm-purge-top": "Να απαλειφθεί η προσωρινή μνήμη αυτής της σελίδας;",
        "confirm-purge-bottom": "Ο καθαρισμός σελίδας απαλείφει την προσωρινή μνήμη και εξαναγκάζει την πλέον πρόσφατη αναθεώρηση να εμφανιστεί.",
index 9ab562b..ddac64f 100644 (file)
        "redirectpagesub": "Redirect page",
        "redirectto": "Redirect to:",
        "talkpageheader": "-",
-       "lastmodifiedat": "This page was last modified on $1, at $2.",
+       "lastmodifiedat": "This page was last edited on $1, at $2.",
        "viewcount": "This page has been accessed {{PLURAL:$1|once|$1 times}}.",
        "protectedpage": "Protected page",
        "jumpto": "Jump to:",
        "sp-contributions-uploads": "uploads",
        "sp-contributions-logs": "logs",
        "sp-contributions-talk": "talk",
-       "sp-contributions-userrights": "user rights management",
+       "sp-contributions-userrights": "{{GENDER:$1|user}} rights management",
        "sp-contributions-blocked-notice": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
        "sp-contributions-blocked-notice-anon": "This IP address is currently blocked.\nThe latest block log entry is provided below for reference:",
        "sp-contributions-search": "Search for contributions",
        "anonymous": "Anonymous {{PLURAL:$1|user|users}} of {{SITENAME}}",
        "siteuser": "{{SITENAME}} user $1",
        "anonuser": "{{SITENAME}} anonymous user $1",
-       "lastmodifiedatby": "This page was last modified $2, $1 by $3.",
+       "lastmodifiedatby": "This page was last edited $2, $1 by $3.",
        "othercontribs": "Based on work by $1.",
        "others": "others",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|user}}|users}} $1",
index 0bb047d..f9d3586 100644 (file)
        "redirectedfrom": "(Redirigido desde «$1»)",
        "redirectpagesub": "Página de redirección",
        "redirectto": "Redirige a:",
-       "lastmodifiedat": "Esta página fue modificada por última vez el $1 a las $2.",
+       "lastmodifiedat": "Esta página fue editada por última vez el $1 a las $2.",
        "viewcount": "Esta página ha recibido {{PLURAL:$1|una visita|$1 visitas}}.",
        "protectedpage": "Página protegida",
        "jumpto": "Saltar a:",
        "listgrouprights-removegroup": "Eliminar {{PLURAL:$2|grupo|grupos}}: $1",
        "listgrouprights-addgroup-all": "Agregar todos los grupos",
        "listgrouprights-removegroup-all": "Eliminar todos los grupos",
-       "listgrouprights-addgroup-self": "Agregar {{PLURAL:$2|grupo|grupos}} a tu propia cuenta: $1",
+       "listgrouprights-addgroup-self": "Agregar {{PLURAL:$2|grupo|grupos}} a su propia cuenta: $1",
        "listgrouprights-removegroup-self": "Eliminar {{PLURAL:$2|grupo|grupos}} de su propia cuenta: $1",
        "listgrouprights-addgroup-self-all": "Agregar todos los grupos a tu propia cuenta",
        "listgrouprights-removegroup-self-all": "Eliminar todos los grupos de tu propia cuenta",
        "sp-contributions-uploads": "subidas",
        "sp-contributions-logs": "registros",
        "sp-contributions-talk": "discusión",
-       "sp-contributions-userrights": "gestión de permisos de usuario",
+       "sp-contributions-userrights": "gestión de permisos {{GENDER:$1|del usuario|de la usuaria}}",
        "sp-contributions-blocked-notice": "Este usuario está actualmente bloqueado. La última entrada del registro de bloqueos es presentada debajo para mayor referencia:",
        "sp-contributions-blocked-notice-anon": "Esta dirección IP se encuentra actualmente bloqueada.\nA continuación se muestra la última entrada del registro de bloqueos para mayor referencia.",
        "sp-contributions-search": "Buscar contribuciones",
        "anonymous": "{{PLURAL:$1|Usuario anónimo|Usuarios anónimos}} de {{SITENAME}}",
        "siteuser": "{{GENDER:$1|el usuario|la usuaria}} $1 de {{SITENAME}}",
        "anonuser": "el usuario anónimo $1 de {{SITENAME}}",
-       "lastmodifiedatby": "Esta página fue modificada por última vez el $1 a las $2 por $3.",
+       "lastmodifiedatby": "Esta página fue editada por última vez el $1 a las $2 por $3.",
        "othercontribs": "Basado en el trabajo de $1.",
        "others": "otros",
        "siteusers": "{{PLURAL:$2|{{GENDER:$1|el usuario|la usuaria}}|los usuarios}} $1 de {{SITENAME}}",
index 366dcdb..e231ad7 100644 (file)
        "redirectedfrom": "(تغییرمسیر از $1)",
        "redirectpagesub": "صفحهٔ تغییرمسیر",
        "redirectto": "تغییرمسیر به:",
-       "lastmodifiedat": "این صفحه آخرین‌بار در $1 ساعت $2 تغییر یافته‌است.",
+       "lastmodifiedat": "این صفحه آخرین‌بار در $1 ساعت $2 ویرایش شده‌است.",
        "viewcount": "از این صفحه {{PLURAL:$1|یک‌بار|$1بار}} بازدید شده‌است.",
        "protectedpage": "صفحهٔ محافظت‌شده",
        "jumpto": "پرش به:",
        "sp-contributions-uploads": "بارگذاری‌ها",
        "sp-contributions-logs": "سیاهه‌ها",
        "sp-contributions-talk": "بحث",
-       "sp-contributions-userrights": "مدیریت اختیارات کاربر",
+       "sp-contributions-userrights": "مدیریت اختیارات {{GENDER:$1|کاربر}}",
        "sp-contributions-blocked-notice": "این کاربر در حال حاضر بسته شده‌است.\nآخرین سیاههٔ بسته شدن در زیر آمده‌است:",
        "sp-contributions-blocked-notice-anon": "این نشانی آی‌پی در حال حاضر بسته است.\nآخرین سیاههٔ بسته شدن در زیر آمده‌است:",
        "sp-contributions-search": "جستجوی مشارکت‌ها",
        "confirmrecreate": "کاربر [[User:$1|$1]] ([[User talk:$1|بحث]]) این مقاله را پس از اینکه شما آغاز به ویرایش آن نموده‌اید به دلیل زیر حذف کرده است :\n: ''$2'' \nلطفاً تأیید کنید که مجدداً می‌خواهید این مقاله را بسازید.",
        "confirmrecreate-noreason": "کاربر [[User:$1|$1]] ([[User talk:$1|بحث]]) این صفحه را پس از شروع ویرایش‌تان {{GENDER:$1|پاک}} کرده‌است.  لطفاً تأیید کنید که شما واقعاً می‌خواهید آن را دوباره ایجاد کنید.",
        "recreate": "باز ایجاد",
+       "confirm-purge-title": "خالی کردن کاشه این صفحه",
        "confirm_purge_button": "تأیید",
        "confirm-purge-top": "پاک کردن نسخهٔ حافظهٔ نهانی (Cache) این صفحه را تأیید می‌کنید؟",
        "confirm-purge-bottom": "خالی کردن میانگیر یک صفحه باعث می‌شود که آخرین نسخهٔ آن نمایش یابد.",
index 6e5b131..8254126 100644 (file)
        "redirectedfrom": "(Redirigé depuis $1)",
        "redirectpagesub": "Page de redirection",
        "redirectto": "Rediriger vers :",
-       "lastmodifiedat": "Dernière modification de cette page le $1, à $2.",
+       "lastmodifiedat": "Cette page a été modifiée pour la dernière fois le $1 à $2.",
        "viewcount": "Cette page {{PLURAL:$1|0=n’a jamais été consultée|1=a été consultée une seule fois|a été consultée $1 fois}}.",
        "protectedpage": "Page protégée",
        "jumpto": "Aller à :",
        "sp-contributions-uploads": "imports",
        "sp-contributions-logs": "journaux",
        "sp-contributions-talk": "discuter",
-       "sp-contributions-userrights": "gérer les droits",
+       "sp-contributions-userrights": "gérer les droits {{GENDER:$1|utilisateur}}",
        "sp-contributions-blocked-notice": "Cet utilisateur est actuellement bloqué. \nLa dernière entrée du journal des blocages est affichée ci-dessous pour référence :",
        "sp-contributions-blocked-notice-anon": "Cette adresse IP est actuellement bloquée.\nLa dernière entrée du journal des blocages est affichée ci-dessous pour référence :",
        "sp-contributions-search": "Rechercher les contributions",
        "confirmrecreate": "L’utilisat{{GENDER:$1|eur|rice}} [[User:$1|$1]] ([[User talk:$1|Discussion]]) a supprimé cette page, alors que vous aviez commencé à la modifier, pour le motif suivant :\n: <em>$2</em>\nVeuillez confirmer que vous désirez réellement recréer cette page.",
        "confirmrecreate-noreason": "L’utilisat{{GENDER:$1|eur|rice}} [[User:$1|$1]] ([[User talk:$1|Discussion]]) a supprimé cette page, alors que vous aviez commencé à la modifier. Veuillez confirmer que vous désirez réellement recréer cette page.",
        "recreate": "Recréer",
+       "confirm-purge-title": "Détruire cette page",
        "confirm_purge_button": "Confirmer",
        "confirm-purge-top": "Voulez-vous rafraîchir cette page (purger le cache) ?",
        "confirm-purge-bottom": "Purger une page l’efface du cache de rendu et force sa dernière version à être régénérée et affichée.",
index 8dacfad..eb7ef1c 100644 (file)
        "redirectedfrom": "(הופנה מהדף $1)",
        "redirectpagesub": "דף הפניה",
        "redirectto": "הפניה ל:",
-       "lastmodifiedat": "×\93×£ ×\96×\94 ×©×\95Ö¼× ×\94 לאחרונה ב־$1, בשעה $2.",
+       "lastmodifiedat": "×\93×£ ×\96×\94 × ×¢×¨×\9a לאחרונה ב־$1, בשעה $2.",
        "viewcount": "דף זה נצפה {{PLURAL:$1|פעם אחת|פעמיים|$1 פעמים}}.",
        "protectedpage": "דף מוגן",
        "jumpto": "קפיצה אל:",
        "sp-contributions-uploads": "העלאות",
        "sp-contributions-logs": "יומנים",
        "sp-contributions-talk": "שיחה",
-       "sp-contributions-userrights": "ניהול הרשאות משתמש",
+       "sp-contributions-userrights": "ניהול הרשאות {{GENDER:$1|משתמש|משתמשת}}",
        "sp-contributions-blocked-notice": "{{GENDER:$1|המשתמש הזה חסום|המשתמשת הזו חסומה}} כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
        "sp-contributions-blocked-notice-anon": "כתובת IP זו חסומה כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
        "sp-contributions-search": "חיפוש תרומות",
        "anonymous": "{{PLURAL:$1|משתמש אנונימי|משתמשים אנונימיים}} של {{SITENAME}}",
        "siteuser": "משתמש {{SITENAME}} $1",
        "anonuser": "משתמש אנונימי של {{SITENAME}} $1",
-       "lastmodifiedatby": "×\93×£ ×\96×\94 ×©×\95Ö¼× ×\94 לאחרונה ב־$2, $1 על־ידי $3.",
+       "lastmodifiedatby": "×\93×£ ×\96×\94 × ×¢×¨×\9a לאחרונה ב־$2, $1 על־ידי $3.",
        "othercontribs": "מבוסס על העבודה של $1.",
        "others": "אחרים",
        "siteusers": "{{PLURAL:$2|{{GENDER:$1|משתמש}}|משתמשי}} {{SITENAME}} $1",
        "confirmrecreate": "ה{{GENDER:$1|משתמש|משתמשת}} [[User:$1|$1]] ([[User talk:$1|שיחה]]) {{GENDER:$1|מחק|מחקה}} את הדף הזה לאחר שהתחלת לערוך אותו, מהסיבה הבאה:\n: <em>$2</em>\nיש לאשר שאכן ברצונך ליצור מחדש את הדף.",
        "confirmrecreate-noreason": "ה{{GENDER:$1|משתמש|משתמשת}} [[User:$1|$1]] ([[User talk:$1|שיחה]]) {{GENDER:$1|מחק|מחקה}} את הדף הזה לאחר שהתחלת לערוך אותו. יש לאשר שאכן ברצונך ליצור מחדש את הדף.",
        "recreate": "יצירה מחדש",
+       "confirm-purge-title": "ניקוי המטמון של דף זה",
        "confirm_purge_button": "אישור",
        "confirm-purge-top": "לנקות את המטמון של דף זה?",
        "confirm-purge-bottom": "ניקוי המטמון של דף גורם לגרסה החדשה ביותר להופיע.",
index 5bca07c..5a97d8a 100644 (file)
        "newimages-summary": "Ova posebna stranica pokazuje posljednje nedavno postavljene datoteke.",
        "newimages-legend": "Filtar",
        "newimages-label": "Naziv datoteke (ili njen dio):",
+       "newimages-user": "IP adresa ili suradničko ime",
        "newimages-showbots": "Prikaži datoteke koje su postavili botovi",
        "newimages-hidepatrolled": "Sakrij pregledana postavljanja",
        "noimages": "Nema slika.",
index fde6566..cb6c252 100644 (file)
        "botpasswords-insert-failed": "A(z) „$1” botnév hozzáadása sikertelen. Nem lehet, hogy már hozzá lett adva?",
        "botpasswords-update-failed": "A(z) „$1” nevű botfiók frissítése sikertelen. Lehet, hogy törölted?",
        "botpasswords-created-title": "Botjelszó létrehozva",
-       "botpasswords-created-body": "\"$2\" felhasználó \"$1\" bot jelszava létrehozva.",
+       "botpasswords-created-body": "„$2” felhasználó „$1” botjának jelszava létrehozva.",
        "botpasswords-updated-title": "Botjelszó frissítve",
-       "botpasswords-updated-body": "\"$2\" felhasználó \"$1\" bot jelszava módosítva.",
+       "botpasswords-updated-body": "„$2” felhasználó „$1” botjának jelszava módosítva.",
        "botpasswords-deleted-title": "Botjelszó törölve",
-       "botpasswords-deleted-body": "\"$2\" felhasználó \"$1\" bot jelszava törölve.",
+       "botpasswords-deleted-body": "„$2” felhasználó „$1” botjának jelszava törölve.",
        "botpasswords-newpassword": "A bejelentkezéshez használható új felhasználóneved <strong>$1</strong>, jelszavad <strong>$2</strong>. <em>Ezeket jegyezd fel a későbbiekre.</em> <br> (Régebbi botoknál, amik megkövetelhetik, hogy a bejelentkezési név megegyezzen magával a felhasználónévvel, használhatod a(z) <strong>$3</strong> felhasználónevet is <strong>$4</strong> jelszóval.)",
        "botpasswords-no-provider": "A BotPasswordsSessionProvider nem áll rendelkezésre.",
        "botpasswords-restriction-failed": "A botjelszó-korlátozások megakadályozzák ezt a bejelentkezést.",
index 510892c..60aafb5 100644 (file)
        "ipbexpiry": "Expiration:",
        "ipbreason": "Motivo:",
        "ipbreason-dropdown": "*Motivos frequente pro blocar\n** Insertion de informationes false\n** Elimination de contento de paginas\n** Ligamines ''spam'' verso sitos externe\n** Insertion de nonsenso/absurditates in paginas\n** Comportamento intimidatori/molestation\n** Abuso de contos multiple\n** Nomine de usator inacceptabile",
-       "ipb-hardblock": "Impedir le usatores authenticate de facer modificationes ab iste adresse IP",
+       "ipb-hardblock": "Impedir que usatores authenticate face modificationes ab iste adresse IP",
        "ipbcreateaccount": "Impedir creation de contos",
        "ipbemailban": "Impedir que le usator invia e-mail",
        "ipbenableautoblock": "Blocar automaticamente le adresse IP usate le plus recentemente per iste usator, e omne IPs successive desde le quales ille/-a tenta facer modificationes",
        "ipboptions": "2 horas:2 hours,1 die:1 day,3 dies:3 days,1 septimana:1 week,2 septimanas:2 weeks,1 mense:1 month,3 menses:3 months,6 menses:6 months,1 anno:1 year,infinite:infinite",
        "ipbhidename": "Celar le nomine del usator del modificationes e del listas",
        "ipbwatchuser": "Observar le paginas de usator e de discussion de iste usator",
-       "ipb-disableusertalk": "Impedir iste usator de modificar su proprie pagina de discussion durante que ille es blocate",
+       "ipb-disableusertalk": "Impedir que iste usator modifica su proprie pagina de discussion durante que ille es blocate",
        "ipb-change-block": "Reblocar le usator con iste configurationes",
        "ipb-confirm": "Confirmar blocada",
        "badipaddress": "Adresse IP mal formate.",
index 4ec9a1a..634e5b7 100644 (file)
        "redirectedfrom": "(Naibaw-ing manipud iti $1)",
        "redirectpagesub": "Baw-ing a panid",
        "redirectto": "Naibaw-ing iti:",
-       "lastmodifiedat": "Daytoy a panid ket naudi a nabaliwan idi $1, $2.",
+       "lastmodifiedat": "Daytoy a panid ket naudi a naurnos idi $1, $2.",
        "viewcount": "Naserrekanen daytoy a panid {{PLURAL:$1|iti naminsan|kadagiti $1 a beses}}.",
        "protectedpage": "Nasalakniban a panid",
        "jumpto": "Lumaktaw idiay:",
        "confirmrecreate": "{{GENDER:$1|Inikkat}} ni agar-aramat [[User:$1|$1]] ([[User talk:$1|tungtungan]])  daytoy a panid kalpasan idi nangrugika nga agurnos iti rason a:\n: <em>$2</em>\nPangngaasi a pasingkedan no agpayso a kayatmo a partuaten manen daytoy a panid",
        "confirmrecreate-noreason": "{{GENDER:$1|Inikkat}} ni agar-aramat [[User:$1|$1]] ([[User talk:$1|tungtungan]]) daytoy a panid kalpasan idi nangrugika nga agurnos. Pangngaasi a pasingkedan no agpayso a kayatmo a partuaten manen daytoy a panid.",
        "recreate": "Partuaten manen",
+       "confirm-purge-title": "Purgaen daytoy a panid",
        "confirm_purge_button": "Sige",
        "confirm-purge-top": "Dalusan ti cache daytoy a panid?",
        "confirm-purge-bottom": "Ti panagpurga ti panid ket dalusanna ti cache ken pursaranna nga iparang dagiti agdama rebision.",
        "pagelang-select-lang": "Agpili iti pagsasao",
        "pagelang-reason": "Rason",
        "pagelang-submit": "Ited",
+       "pagelang-nonexistent-page": "Awan ti panid ti $1.",
        "right-pagelang": "Baliwan ti pagsasao ti panid",
        "action-pagelang": "baliwan ti pagsasao ti panid",
        "log-name-pagelang": "Listaan ti panagbaliw ti pagsasao",
index 7279b27..8212835 100644 (file)
                        "Selven",
                        "Margherita.mignanelli",
                        "Redredsonia",
-                       "Luigi.delia"
+                       "Luigi.delia",
+                       "Samuele2002"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "rcfilters-noresults-conflict": "Nessun risultato trovato, perché i criteri di ricerca sono in conflitto",
        "rcfilters-filtergroup-registration": "Registrazione utente",
        "rcfilters-filter-registered-label": "Registrato",
+       "rcfilters-filter-unregistered-label": "Non registrato",
        "rcfilters-filtergroup-authorship": "Modifica paternità",
+       "rcfilters-filter-editsbyself-description": "Proprie modifiche.",
+       "rcfilters-filter-editsbyother-label": "Modifiche di altri",
+       "rcfilters-filter-editsbyother-description": "Modifiche create da altri utenti (non tu).",
+       "rcfilters-filtergroup-automated": "Contributi automatici",
        "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-humans-label": "Umani (non bot)",
        "rcfilters-filter-patrolled-label": "Verificate",
        "rcfilters-filter-patrolled-description": "Modifiche contrassegnate come verificate.",
        "rcfilters-filter-unpatrolled-label": "Non verificate",
        "sp-contributions-uploads": "file caricati",
        "sp-contributions-logs": "registri",
        "sp-contributions-talk": "discussione",
-       "sp-contributions-userrights": "gestione dei permessi",
+       "sp-contributions-userrights": "gestione permessi {{GENDER:$1|utente}}",
        "sp-contributions-blocked-notice": "Questo utente è attualmente bloccato.\nL'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
        "sp-contributions-blocked-notice-anon": "Questo indirizzo IP è attualmente bloccato.\nL'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
        "sp-contributions-search": "Ricerca contributi",
index 35ec6d9..3541b95 100644 (file)
        "redirectedfrom": "($1에서 넘어옴)",
        "redirectpagesub": "넘겨주기 문서",
        "redirectto": "넘겨줄 대상:",
-       "lastmodifiedat": "이 문서는 $1 $2에 마지막으로 바뀌었습니다.",
+       "lastmodifiedat": "이 문서는 $1 $2에 마지막으로 편집되었습니다.",
        "viewcount": "이 문서는 {{PLURAL:$1|한 번|$1번}} 읽혔습니다.",
        "protectedpage": "보호된 문서",
        "jumpto": "이동:",
        "readonlywarning": "<strong>경고: 데이터베이스가 관리를 위해 잠겨 있습니다. 따라서 문서를 편집한 내용을 지금 저장할 수 없습니다.</strong>\n편집 내용을 복사하여 붙여넣기 등을 사용하여 일단 다른 곳에 저장한 후, 나중에 다시 시도해 주세요.\n\n데이터베이스를 잠근 시스템 관리자가 남긴 설명은 다음과 같습니다: $1",
        "protectedpagewarning": "<strong>경고: 이 문서는 관리자 권한이 있는 사용자만 편집할 수 있도록 보호되어 있습니다.</strong>\n이 문서의 최근 기록을 참조하십시오:",
        "semiprotectedpagewarning": "<strong>참고:</strong> 이 문서는 계정을 등록한 사용자만이 편집할 수 있도록 보호되어 있습니다.\n이 문서의 최근 기록을 참조하십시오:",
-       "cascadeprotectedwarning": "<strong>경고:</strong> 이 문서는 보호되어 있어 관리자 권한이 있는 사용자만 편집할 수 있습니다. 연쇄적 보호가 걸린 다음 {{PLURAL:$1|문서}}에서 이 문서를 사용하고 있습니다:",
+       "cascadeprotectedwarning": "<strong>경고:</strong> 이 문서는 보호되어 있어 [[Special:ListGroupRights|특정 권한]]이 있는 사용자만 편집할 수 있습니다. 연쇄적 보호가 걸린 다음 {{PLURAL:$1|문서}}에서 이 문서를 사용하고 있습니다:",
        "titleprotectedwarning": "<strong>경고: 이 문서는 보호되어 있어, 문서를 만드려면 [[Special:ListGroupRights|특정한 권한]]이 필요합니다.</strong>\n아래 문서의 최근 기록을 참조하십시오:",
        "templatesused": "이 문서에서 사용한 {{PLURAL:$1|틀}}:",
        "templatesusedpreview": "이 미리 보기에서 사용하고 있는 {{PLURAL:$1|틀}}:",
        "post-expand-template-argument-warning": "<strong>경고:</strong> 이 문서는 전개하면 크기가 너무 큰 틀 인수가 하나 이상 포함되어 있습니다.\n이 인수는 생략했습니다.",
        "post-expand-template-argument-category": "생략된 틀 변수를 포함한 문서",
        "parser-template-loop-warning": "재귀적인 틀이 발견되었습니다: [[$1]]",
+       "template-loop-category": "틀 루프가 있는 문서",
+       "template-loop-category-desc": "이 문서에 틀 루프가 있습니다. (예: 자기 자신을 반복하여 호출하는 틀)",
        "parser-template-recursion-depth-warning": "틀 반복 깊이 제한을 초과함 ($1)",
        "language-converter-depth-warning": "언어 변환기 실행 제한 초과($1)",
        "node-count-exceeded-category": "노드 횟수를 초과한 문서",
        "sp-contributions-uploads": "올린 파일",
        "sp-contributions-logs": "기록",
        "sp-contributions-talk": "토론",
-       "sp-contributions-userrights": "사용자 권한 관리",
+       "sp-contributions-userrights": "{{GENDER:$1|사용자}} 권한 관리",
        "sp-contributions-blocked-notice": "이 사용자는 현재 차단되어 있습니다.\n해당 사용자의 차단 기록은 다음과 같습니다:",
        "sp-contributions-blocked-notice-anon": "이 IP 주소는 현재 차단되어 있습니다.\n차단 기록은 다음과 같습니다:",
        "sp-contributions-search": "기여 검색",
        "anonymous": "{{SITENAME}} 익명 {{PLURAL:$1|사용자}}",
        "siteuser": "{{SITENAME}} 사용자 $1",
        "anonuser": "{{SITENAME}} 익명 사용자 $1",
-       "lastmodifiedatby": "이 문서는 $3님이 $1 $2에 마지막으로 ë°\94꾸ì\97\88ì\8aµë\8b\88ë\8b¤.",
+       "lastmodifiedatby": "이 문서는 $3님이 $1 $2에 마지막으로 í\8e¸ì§\91í\96\88ì\8aµë\8b\88ë\8b¤.",
        "othercontribs": "$1의 작업을 바탕으로 합니다.",
        "others": "기타",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|사용자}}}} $1",
        "confirmrecreate": "[[User:$1|$1]] 사용자([[User talk:$1|토론]])가 당신이 편집하는 도중에 문서를 {{GENDER:$1|삭제했습니다}}. 삭제 이유는 다음과 같습니다:\n: $2\n문서를 다시 만들어야 하는지 확인해주세요.",
        "confirmrecreate-noreason": "[[User:$1|$1]] 사용자([[User talk:$1|토론]])가 당신이 편집하는 도중에 문서를 {{GENDER:$1|삭제했습니다}}. 문서를 다시 만들어야 하는지 확인해주세요.",
        "recreate": "새로 만들기",
+       "confirm-purge-title": "이 문서를 새로고침",
        "confirm_purge_button": "확인",
        "confirm-purge-top": "이 문서의 캐시를 지울까요?",
        "confirm-purge-bottom": "문서를 새로 고치는 것은 캐시를 지우고 강제로 가장 현재의 판이 나타나게 합니다.",
index bfe1958..a020f5c 100644 (file)
        "sp-contributions-uploads": "Eropgeluede Fichieren",
        "sp-contributions-logs": "Logbicher",
        "sp-contributions-talk": "diskutéieren",
-       "sp-contributions-userrights": "Verwaltung vun de Benotzerrechter",
+       "sp-contributions-userrights": "Verwaltung vun de {{GENDER:$1|Benotzer}}rechter",
        "sp-contributions-blocked-notice": "Dëse Benotzer ass elo gespaart. Déi lescht Entrée am Läsch-Logbuch steet als Referenz hei ënnendrënner:",
        "sp-contributions-blocked-notice-anon": "Dës IP-Adress ass elo gespaart.\nËnnendrënner steet déi lescht Aschreiwung an d'Spärlëscht:",
        "sp-contributions-search": "No Kontributioune sichen",
        "anonymous": "{{PLURAL:$1|Anonyme Benotzer|Anonym Benotzer}} op {{SITENAME}}",
        "siteuser": "{{SITENAME}}-Benotzer $1",
        "anonuser": "Anonyme(n) {{SITENAME}}-Benotzer $1",
-       "lastmodifiedatby": "Dës Säit gouf den $1 ëm $2 Auer vum $3 fir d'lescht geännert.",
+       "lastmodifiedatby": "Dës Säit gouf de(n) $1 ëm $2 Auer vum $3 fir d'lescht geännert.",
        "othercontribs": "Op der Basis vun der Aarbecht vum $1",
        "others": "anerer",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|Benotzer}} $1",
index 0891832..b1f06a0 100644 (file)
        "redirectedfrom": "(Doorverwezen vanaf $1)",
        "redirectpagesub": "Doorverwijspagina",
        "redirectto": "Doorverwijzen naar:",
-       "lastmodifiedat": "Deze pagina is het laatst bewerkt op $1 om $2.",
+       "lastmodifiedat": "Deze pagina is voor het laatst bewerkt op $1 om $2.",
        "viewcount": "Deze pagina is {{PLURAL:$1|één keer|$1 keer}} bekeken.",
        "protectedpage": "Beveiligde pagina",
        "jumpto": "Ga naar:",
        "rcnotefrom": "Wijzigingen sinds <strong>$3 om $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wijziging|wijzigingen}}).",
        "rclistfromreset": "Datum selectie opnieuw instellen",
        "rclistfrom": "Wijzigingen bekijken vanaf $3 $2",
-       "rcshowhideminor": "Kleine bewerkingen $1",
+       "rcshowhideminor": "kleine bewerkingen $1",
        "rcshowhideminor-show": "weergeven",
        "rcshowhideminor-hide": "verbergen",
        "rcshowhidebots": "bots $1",
        "sp-contributions-uploads": "uploads",
        "sp-contributions-logs": "logboeken",
        "sp-contributions-talk": "overleg",
-       "sp-contributions-userrights": "gebruikersrechtenbeheer",
+       "sp-contributions-userrights": "{{GENDER:$1|gebruikersrechtenbeheer}}",
        "sp-contributions-blocked-notice": "Deze gebruiker is op het moment geblokkeerd.\nDe laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergegeven:",
        "sp-contributions-blocked-notice-anon": "Dit IP-adres is geblokkeerd.\nDe laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergegeven:",
        "sp-contributions-search": "Zoeken naar bijdragen",
        "anonymous": "Anonieme {{PLURAL:$1|gebruiker|gebruikers}} van {{SITENAME}}",
        "siteuser": "{{SITENAME}}-gebruiker $1",
        "anonuser": "anonieme {{SITENAME}}-gebruiker $1",
-       "lastmodifiedatby": "Deze pagina is het laatst bewerkt op $1 om $2 door $3.",
+       "lastmodifiedatby": "Deze pagina is voor het laatst bewerkt op $1 om $2 door $3.",
        "othercontribs": "Gebaseerd op werk van $1.",
        "others": "anderen",
        "siteusers": "{{SITENAME}}-{{PLURAL:$2|gebruiker|gebruikers}} $1",
index caff860..ed7d375 100644 (file)
        "redirectedfrom": "(Redirecionado de $1)",
        "redirectpagesub": "Página de redirecionamento",
        "redirectto": "Redirecionar para:",
-       "lastmodifiedat": "Esta página foi modificada pela última vez à(s) $2 de $1.",
+       "lastmodifiedat": "Esta página foi modificada pela última vez em $1, às $2",
        "viewcount": "Esta página foi acessada {{PLURAL:$1|uma vez|$1 vezes}}.",
        "protectedpage": "Página protegida",
        "jumpto": "Ir para:",
        "readonlywarning": "'''Aviso: O banco de dados foi bloqueado para manutenção, por isso você não poderá salvar a sua edição neste momento.'''\nTalvez você queira copiar o seu texto num editor externo e guardá-lo, para posterior envio.\n\nQuem bloqueou o banco de dados forneceu a seguinte explicação: $1",
        "protectedpagewarning": "'''Atenção: Esta página foi protegida para que apenas usuários com privilégios de administrador possam editá-la.'''\nA última entrada no histórico é fornecida abaixo como referência:",
        "semiprotectedpagewarning": "'''Nota:''' Esta página foi protegida, sendo que apenas usuários registrados poderão editá-la.\nA última entrada no histórico é fornecida abaixo para referência:",
-       "cascadeprotectedwarning": "<strong>Aviso:</strong> Esta página foi protegida para que somente usuários com privilégios de administrador possam editá-la porque ela é transcluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} por cascata:",
+       "cascadeprotectedwarning": "<strong>Aviso:</strong> Esta página foi protegida para que somente usuários com [[Special:ListGroupRights|direitos específicos]] possam editá-la porque ela é transcluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} por cascata:",
        "titleprotectedwarning": "'''Atenção: esta página foi protegida; [[Special:ListGroupRights|privilégios específicos]] são necessários para criá-la.'''\nA última entrada no histórico é fornecida abaixo como referência:",
        "templatesused": "{{PLURAL:$1|Predefinição usada|Predefinições usadas}} nesta página:",
        "templatesusedpreview": "{{PLURAL:$1|Predefinição usada|Predefinições usadas}} nesta previsão:",
index 6e7ad8c..fb1d01e 100644 (file)
        "readonlywarning": "<strong>Atenção: A base de dados foi bloqueada para manutenção, pelo que não poderá gravar as suas edições neste momento.</strong>\nPode, contudo, copiar e colar o seu texto num ficheiro de texto e guardá-lo para mais tarde.\n\nO administrador do sistema que a bloqueou forneceu a seguinte explicação: $1",
        "protectedpagewarning": "'''Aviso: Esta página foi protegida para só poder ser editada por administradores.'''\nO último registo é apresentado abaixo para referência:",
        "semiprotectedpagewarning": "'''Nota:''' Esta página foi protegida de modo a que apenas utilizadores registados a possam editar.\nA última entrada no histórico é fornecida abaixo como referência.",
-       "cascadeprotectedwarning": "<strong>Aviso:</strong> Esta página está protegida de forma que apenas os administradores possam editá-la, porque se encontra transcluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} em cascata:",
+       "cascadeprotectedwarning": "<strong>Aviso:</strong> Esta página está protegida de forma que apenas os utilizadores com [[Special:ListGroupRights|privilégios específicos]] possam editá-la, porque se encontra transcluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} em cascata:",
        "titleprotectedwarning": "'''Aviso: Esta página foi protegida de forma a que [[Special:ListGroupRights|privilégios específicos]] sejam necessários para criá-la.'''\nPara referência, é apresentada abaixo a última entrada do registo:",
        "templatesused": "{{PLURAL:$1|Predefinição utilizada|Predefinições utilizadas}} nesta página:",
        "templatesusedpreview": "{{PLURAL:$1|Predefinição utilizada|Predefinições utilizadas}} nesta antevisão:",
index b0e1d74..a96c780 100644 (file)
        "sp-contributions-suppresslog": "Used as a display name for a link to log entries of suppressed edits made by that user.\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]]. Parameters:\n* $1 is a plain text username used for GENDER.\nSee also {{msg-mw|sp-contributions-deleted}}, {{msg-mw|sp-deletedcontributions-contribs}}, {{msg-mw|contributions}}, {{msg-mw|deletedcontributions-title}}.",
        "sp-contributions-deleted": "This is a link anchor used in [[Special:Contributions]]/''name'', when user viewing the page has the right to delete pages, or to restore deleted pages.\n\nUsed as link title in [[Special:Contributions]]. Parameters:\n* $1 is a plain text username used for GENDER.\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-userrights}}",
        "sp-contributions-uploads": "Used as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-deleted}}\n* {{msg-mw|Sp-contributions-userrights}}\n{{Identical|Upload}}",
-       "sp-contributions-logs": "Appears as an action link in the header of the Special:Contributions/''Username'' pages (e.g. \"For Somebody (talk | block log | logs)\").\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-deleted}}\n* {{msg-mw|Sp-contributions-userrights}}\n{{Identical|Log}}",
-       "sp-contributions-talk": "This is a link anchor used in the [[Special:Contributions]]/''usernamename'' pages.\nThe link appears in a list of similar ones separated by {{msg-mw|pipe-separator}}, e.g. like this:<br />\n( talk | block log | logs | deleted contributions | rights management )\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|change-blocklink}}\n* {{msg-mw|unblocklink}}\n* {{msg-mw|blocklink}}\n* {{msg-mw|sp-contributions-blocklog}}\n* {{msg-mw|sp-contributions-uploads}}\n* {{msg-mw|sp-contributions-logs}}\n* {{msg-mw|sp-contributions-deleted}}\n* {{msg-mw|sp-contributions-userrights}}\n{{Identical|Talk}}",
-       "sp-contributions-userrights": "This is a link anchor used in [[Special:Contributions]]/''name'', if the user viewing the page has the right to set or alter user rights.\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-deleted}}",
+       "sp-contributions-logs": "Appears as an action link in the header of the [[Special:Contributions]]/''username'' pages (e.g. \"For Somebody (talk | block log | logs)\").\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-deleted}}\n* {{msg-mw|Sp-contributions-userrights}}\n{{Identical|Log}}",
+       "sp-contributions-talk": "This is a link anchor used in the [[Special:Contributions]]/''username'' pages.\nThe link appears in a list of similar ones separated by {{msg-mw|pipe-separator}}, e.g. like this:<br />\n( talk | block log | logs | deleted contributions | rights management )\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|change-blocklink}}\n* {{msg-mw|unblocklink}}\n* {{msg-mw|blocklink}}\n* {{msg-mw|sp-contributions-blocklog}}\n* {{msg-mw|sp-contributions-uploads}}\n* {{msg-mw|sp-contributions-logs}}\n* {{msg-mw|sp-contributions-deleted}}\n* {{msg-mw|sp-contributions-userrights}}\n{{Identical|Talk}}",
+       "sp-contributions-userrights": "This is a link anchor used in [[Special:Contributions]]/''username'' if the user viewing the page has the right to set or alter user rights.\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]]. Parameters:\n* $1 is a plain text username used for GENDER.\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-deleted}}",
        "sp-contributions-blocked-notice": "Shown on top of contributions special page of currently blocked users.\n\nParameters:\n* $1 - (Optional) the blocked user. Can be used for GENDER\nAnon version:\n* {{msg-mw|Sp-contributions-blocked-notice-anon}}",
        "sp-contributions-blocked-notice-anon": "Same as {{msg-mw|Sp-contributions-blocked-notice}} but for anonymous users.",
        "sp-contributions-search": "Used on [[Special:Contributions]]",
index 3ba0ad0..8d98b43 100644 (file)
        "redirectedfrom": "(перенаправлено с «$1»)",
        "redirectpagesub": "Страница-перенаправление",
        "redirectto": "Перенаправление на:",
-       "lastmodifiedat": "Ð\9fоÑ\81леднее Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b: $2, $1.",
+       "lastmodifiedat": "ЭÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ð¾Ñ\81ледний Ñ\80аз Ð±Ñ\8bла Ð¾Ñ\82Ñ\80едакÑ\82иÑ\80ована $1 Ð² $2.",
        "viewcount": "К этой странице обращались $1 {{PLURAL:$1|1=раз|раза|раз}}.",
        "protectedpage": "Защищённая страница",
        "jumpto": "Перейти к:",
        "readonlywarning": "<strong>Предупреждение: База данных заблокирована в связи с процедурами обслуживания, поэтому вы не можете записать ваши изменения прямо сейчас.</strong>\nВозможно, вам следует скопировать этот текст в текстовый файл, чтобы сохранить его на будущее.\n\nСистемный администратор, заблокировавший базу данных, оставил следующее объяснение: $1",
        "protectedpagewarning": "'''Предупреждение. Эта страница защищена от изменений, её могут редактировать только участники с полномочиями администратора.'''\nНиже для справки приведена последняя запись журнала:",
        "semiprotectedpagewarning": "'''Замечание.''' Эта страница была защищена; редактировать её могут только зарегистрированные участники.\nНиже для справки приведена последняя запись журнала:",
-       "cascadeprotectedwarning": "<strong>Ð\9fÑ\80едÑ\83пÑ\80еждение:</strong> Ð\94аннÑ\83Ñ\8e Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð¼Ð¾Ð³Ñ\83Ñ\82 Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c Ñ\82олÑ\8cко Ñ\83Ñ\87аÑ\81Ñ\82ники Ñ\81 Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82ивнÑ\8bми Ð¿Ñ\80авами, поскольку она включена {{PLURAL:$1|1=в следующую страницу, для которой|в следующие страницы, для которых}} включена каскадная защита:",
+       "cascadeprotectedwarning": "<strong>Ð\9fÑ\80едÑ\83пÑ\80еждение:</strong> Ð­Ñ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð±Ñ\8bла Ð·Ð°Ñ\89иÑ\89ена, Ñ\82ак Ñ\87Ñ\82обÑ\8b ÐµÑ\91 Ð¼Ð¾Ð³Ð»Ð¸ Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c Ñ\82олÑ\8cко Ñ\83Ñ\87аÑ\81Ñ\82ники Ñ\81 [[Special:ListGroupRights|опÑ\80еделÑ\91ннÑ\8bми Ð¿Ñ\80авами]], поскольку она включена {{PLURAL:$1|1=в следующую страницу, для которой|в следующие страницы, для которых}} включена каскадная защита:",
        "titleprotectedwarning": "'''Предупреждение.  Это название защищено. Создать эту страницу могут только участники с [[Special:ListGroupRights|соответствующими правами]].'''\nНиже для справки приведена последняя запись журнала:",
        "templatesused": "{{PLURAL:$1|1=Шаблон, используемый|Шаблоны, используемые}} на этой странице:",
        "templatesusedpreview": "{{PLURAL:$1|1=Шаблон, используемый|Шаблоны, используемые}} в режиме предпросмотра:",
        "sp-contributions-uploads": "загрузки",
        "sp-contributions-logs": "журналы",
        "sp-contributions-talk": "обсуждение",
-       "sp-contributions-userrights": "управление правами участника",
+       "sp-contributions-userrights": "управление правами {{GENDER:$1|участника|участницы}}",
        "sp-contributions-blocked-notice": "Этот участник в данный момент заблокирован. Ниже приведена последняя запись из журнала блокировок:",
        "sp-contributions-blocked-notice-anon": "Этот IP-адрес в данный момент заблокирован. Ниже приведена последняя запись из журнала блокировок:",
        "sp-contributions-search": "Поиск вклада",
        "anonymous": "{{PLURAL:$1|1=Анонимный участник|Анонимные участники}} {{grammar:genitive|{{SITENAME}}}}",
        "siteuser": "{{GENDER:$2|участник|участница}} {{grammar:genitive|{{SITENAME}}}} $1",
        "anonuser": "анонимный участник {{grammar:genitive|{{SITENAME}}}} $1",
-       "lastmodifiedatby": "ЭÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ð¾Ñ\81ледний Ñ\80аз Ð±Ñ\8bла Ð¸Ð·Ð¼ÐµÐ½Ðµна $1 в $2, автор изменения — $3.",
+       "lastmodifiedatby": "ЭÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ð¾Ñ\81ледний Ñ\80аз Ð±Ñ\8bла Ð¾Ñ\82Ñ\80едакÑ\82иÑ\80ована $1 в $2, автор изменения — $3.",
        "othercontribs": "В создании приняли участие: $1.",
        "others": "другие",
        "siteusers": "{{PLURAL:$2|1={{GENDER:$1|участник|участница}}|участники}} {{grammar:genitive|{{SITENAME}}}} $1",
        "confirmrecreate-noreason": "{{GENDER:$1|Участник|Участница|}}&nbsp;[[User:$1|$1]] ([[User talk:$1|обс]]) {{GENDER:$1|удалил|удалила}} эту страницу после того, как вы начали её редактировать. Пожалуйста, подтвердите, что вы действительно хотите вновь создать эту страницу.",
        "recreate": "Создать заново",
        "unit-pixel": " пикс.",
+       "confirm-purge-title": "Очистить кэш этой страницы",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Очистить кэш этой страницы?",
        "confirm-purge-bottom": "После очистки кэша страницы будет показана её последняя версия.",
index bd0a335..f022ef3 100644 (file)
        "editing": "\"$1\" sayfasını değiştirmektesiniz",
        "creating": "$1 sayfasını oluşturuyorsunuz",
        "editingsection": "\"$1\" sayfasında bölüm değiştirmektesiniz",
-       "editingcomment": "$1 değiştiriliyor (yeni bölüm)",
+       "editingcomment": "$1 düzenleniyor (yeni bölüm)",
        "editconflict": "Değişiklik çakışması: $1",
        "explainconflict": "Siz sayfayı değiştirirken başka biri de değişiklik yaptı.\nYukarıdaki yazı sayfanın şu anki halini göstermektedir.\nSizin değişiklikleriniz alta gösterilmiştir. Son değişiklerinizi yazının içine eklemeniz gerekecektir.\n\"{{int:savearticle}}\"e bastığınızda '''sadece''' yukarıdaki yazı kaydedilecektir.",
        "yourtext": "Sizin metniniz",
        "pageswithprop-submit": "Git",
        "pageswithprop-prophidden-long": "uzun metin özellik değeri gizlendi ($1)",
        "pageswithprop-prophidden-binary": "ikili özellik değeri gizlendi ($1)",
-       "doubleredirects": "Çift yönlendirmeler",
+       "doubleredirects": "Yönlendirmeye olan yönlendirmeler",
        "doubleredirectstext": "Bu sayfa diğer yönlendirme sayfalarına yönlendirme yapan sayfaları listeler.\nHer satırın içerdiği bağlantılar; birinci ve ikinci yönlendirme, ayrıca ikinci yönlendirmenin hedefi, ki bu genelde birinci yönlendirmenin göstermesi gereken \"gerçek\" hedef sayfasıdır.\n<del>Üstü çizili</del> girdiler çözülmüştür.",
        "double-redirect-fixed-move": "[[$1]] taşındı.\nYönlendirme otomatik olarak güncellendi ve [[$2]] sayfasına yönlendirildi.",
        "double-redirect-fixed-maintenance": "[[$1]] sayfasından [[$2]] sayfasına yapılan çift yönlendirme otomatik olarak düzeltiliyor.",
        "emailuser-title-target": "Bu {{GENDER:$1|kullanıcıya}} e-posta gönder",
        "emailuser-title-notarget": "Kullanıcı e-posta",
        "emailpagetext": "Bu {{GENDER:$1|kullanıcıya}} e-posta iletisi göndermek için aşağıdaki formu kullanabilirsiniz.\n[[Special:Preferences|Kullanıcı tercihlerinizde]] girdiğiniz e-posta adresiniz, e-postanın \"From (Kimden)\" adresinde görünecektir, bu yüzden alıcı size doğrudan yanıt verebilecektir.",
-       "defemailsubject": "\"$1\" kullanıcısından {{SITENAME}} e-postası",
+       "defemailsubject": "\"$1\" adlı kullanıcıdan {{SITENAME}} e-postası",
        "usermaildisabled": "Kullanıcı e-postası devre dışı",
        "usermaildisabledtext": "Bu vikide diğer kullanıcılara e-posta gönderemezsiniz",
        "noemailtitle": "e-posta adresi yok",
        "unblocked": "[[User:$1|$1]] - engelleme kaldırıldı",
        "unblocked-range": "$1 adlı kullanıcının engeli kaldırıldı.",
        "unblocked-id": "$1 engeli çıkarıldı",
-       "unblocked-ip": "[[Special:Contributions/$1|$1]] engellenmiştir.",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] adlı kullanıcının engeli kaldırıldı.",
        "blocklist": "Engellenmiş kullanıcılar",
        "ipblocklist": "Engellenmiş kullanıcılar",
        "ipblocklist-legend": "Engellenen kullanıcı ara",
        "expiringblock": "$1 $2 tarihinde doluyor",
        "anononlyblock": "yalnızca anonim",
        "noautoblockblock": "otomatik engelleme devre dışı bırakıldı",
-       "createaccountblock": "hesap açımı engellendi",
+       "createaccountblock": "hesap oluşturma devre dışı bırakıldı",
        "emailblock": "e-posta engellendi",
        "blocklist-nousertalk": "kendi mesaj sayfasını değiştiremez",
        "ipblocklist-empty": "Engelleme listesi boş.",
        "blocklogtext": "Bu, kullanıcı engelleme ve engel kaldırma işlemlerinin bir günlüğüdür.\nOtomatik olarak engellenen IP adresleri listelenmemiştir.\nŞu anda geçerli yasaklama ve engellemelerin listesi için [[Special:BlockList|engelleme listesi]]ne bakın.",
        "unblocklogentry": ", $1 adlı kullanıcının engellemesini kaldırdı",
        "block-log-flags-anononly": "sadece anonim kullanıcılar",
-       "block-log-flags-nocreate": "hesap yaratımı engellendi",
+       "block-log-flags-nocreate": "hesap oluşturma devre dışı bırakıldı",
        "block-log-flags-noautoblock": "Otomatik engelleme iptal edildi",
        "block-log-flags-noemail": "e-posta engellendi",
        "block-log-flags-nousertalk": "kendi mesaj sayfasını değiştiremez",
index 34793ca..9a83162 100644 (file)
        "redirectedfrom": "(重定向自$1)",
        "redirectpagesub": "重定向页面",
        "redirectto": "重定向至:",
-       "lastmodifiedat": "本页面最后修改于$1 $2。",
+       "lastmodifiedat": "本页面最后编辑于$1 $2。",
        "viewcount": "本页面已经被访问过{{PLURAL:$1|$1次}}。",
        "protectedpage": "受保护页面",
        "jumpto": "跳转至:",
        "sp-contributions-uploads": "上传",
        "sp-contributions-logs": "日志",
        "sp-contributions-talk": "讨论",
-       "sp-contributions-userrights": "用户权限管理",
+       "sp-contributions-userrights": "{{GENDER:$1|用户}}权限管理",
        "sp-contributions-blocked-notice": "这位用户目前正在被封禁。最近的封禁日志记录在下面提供以供参考:",
        "sp-contributions-blocked-notice-anon": "这个IP地址目前正在被封禁。最近的封禁日志记录在下面提供以供参考:",
        "sp-contributions-search": "搜索贡献",
        "anonymous": "{{SITENAME}}匿名{{PLURAL:$1|用户}}",
        "siteuser": "{{SITENAME}}用户$1",
        "anonuser": "{{SITENAME}}匿名用户$1",
-       "lastmodifiedatby": "本页面被$3最后修改于$1 $2。",
+       "lastmodifiedatby": "本页面被$3最后编辑于$1 $2。",
        "othercontribs": "基于$1的劳动成果。",
        "others": "其他",
        "siteusers": "{{SITENAME}}{{PLURAL:$2|{{GENDER:$1|用户}}}}$1",
index 75227c4..cb37388 100644 (file)
        "unblocked-id": "已經移除 $1 的封鎖。",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] 已解除封鎖。",
        "blocklist": "已封鎖的使用者",
+       "autoblocklist-submit": "搜尋",
        "ipblocklist": "已封鎖的使用者",
        "ipblocklist-legend": "搜尋已封鎖的使用者",
        "blocklist-userblocks": "隱藏帳號封鎖",
index e5ba411..478a0c4 100644 (file)
@@ -25,6 +25,8 @@
 require_once __DIR__ . '/../includes/PHPVersionCheck.php';
 wfEntryPointCheck( 'cli' );
 
+use Wikimedia\Rdbms\DBReplicationWaitError;
+
 /**
  * @defgroup MaintenanceArchive Maintenance archives
  * @ingroup Maintenance
index ba1e879..48c3d37 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Maintenance
  */
 
+use Wikimedia\Rdbms\DBQueryError;
+
 /**
  * When using shared tables that are referenced by foreign keys on local
  * tables you have to change the constraints on local tables.
index 70f9aaa..36e55f3 100644 (file)
@@ -26,6 +26,7 @@ require_once __DIR__ . '/Maintenance.php';
 
 use Wikimedia\Rdbms\ResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBQueryError;
 
 /**
  * Maintenance script that sends SQL queries from the specified file to the database.
index cbb0c79..117e9cc 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\DatabaseSqlite;
+use Wikimedia\Rdbms\DBError;
 
 /**
  * This class contains code common to different SQLite-related maintenance scripts
index 4f22843..b4514ec 100644 (file)
@@ -22,6 +22,8 @@
  * @see wfWaitForSlaves()
  */
 
+use Wikimedia\Rdbms\DBConnectionError;
+
 require __DIR__ . '/../commandLine.inc';
 
 if ( count( $args ) < 1 ) {
index 29388c5..55f36a3 100644 (file)
@@ -24,7 +24,7 @@
     "karma-firefox-launcher": "1.0.1",
     "karma-mocha-reporter": "2.2.3",
     "karma-qunit": "1.0.0",
-    "qunitjs": "1.22.0",
+    "qunitjs": "1.23.1",
     "stylelint-config-wikimedia": "0.4.1",
     "wdio-junit-reporter": "0.2.0",
     "wdio-mocha-framework": "0.5.8",
index 546cc47..25aff68 100644 (file)
        "ooui-toolbar-more": "Liyané",
        "ooui-toolgroup-expand": "Liyané",
        "ooui-toolgroup-collapse": "Sacukupé",
-       "ooui-dialog-message-accept": "Ha'a",
+       "ooui-dialog-message-accept": "Oké",
        "ooui-dialog-message-reject": "Wurung",
        "ooui-dialog-process-error": "Ana sing klèru",
        "ooui-dialog-process-dismiss": "Tutup",
        "ooui-dialog-process-retry": "Jajal manèh",
-       "ooui-dialog-process-continue": "Banjuraké",
+       "ooui-dialog-process-continue": "Bacutaké",
        "ooui-selectfile-button-select": "Pilih barkas",
-       "ooui-selectfile-not-supported": "Barkas pilihan ora disengkuyung",
+       "ooui-selectfile-not-supported": "Ora bisa milih barkas",
        "ooui-selectfile-placeholder": "Ora ana barkas sing dipilih",
        "ooui-selectfile-dragdrop-placeholder": "Dèkèk barkas ing kéné"
 }
index be94720..ef48f5b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.21.0
+ * OOjs UI v0.21.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-04-11T22:51:05Z
+ * Date: 2017-04-18T23:32:49Z
  */
 ( function ( OO ) {
 
index 0313da4..29b0874 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.21.0
+ * OOjs UI v0.21.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-04-11T22:51:10Z
+ * Date: 2017-04-18T23:32:54Z
  */
 .oo-ui-element-hidden {
   display: none !important;
   cursor: pointer;
   display: inline-block;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   vertical-align: middle;
   font-family: inherit;
   font-size: inherit;
   white-space: nowrap;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button::-moz-focus-inner {
   border-color: transparent;
   text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
   border: 1px #c9c9c9 solid;
   -webkit-transition: border-color 100ms ease;
-     -moz-transition: border-color 100ms ease;
-          transition: border-color 100ms ease;
+  -moz-transition: border-color 100ms ease;
+  transition: border-color 100ms ease;
   background-color: #eeeeee;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #fff), color-stop(100%, #ddd));
   background-image: -webkit-linear-gradient(top, #fff 0, #ddd 100%);
-  background-image:    -moz-linear-gradient(top, #fff 0, #ddd 100%);
-  background-image:         linear-gradient(to bottom, #fff 0, #ddd 100%);
+  background-image: -moz-linear-gradient(top, #fff 0, #ddd 100%);
+  background-image: linear-gradient(to bottom, #fff 0, #ddd 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffffff', endColorstr='#ffdddddd' )";
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
   background-color: #eeeeee;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #ddd), color-stop(100%, #fff));
   background-image: -webkit-linear-gradient(top, #ddd 0, #fff 100%);
-  background-image:    -moz-linear-gradient(top, #ddd 0, #fff 100%);
-  background-image:         linear-gradient(to bottom, #ddd 0, #fff 100%);
+  background-image: -moz-linear-gradient(top, #ddd 0, #fff 100%);
+  background-image: linear-gradient(to bottom, #ddd 0, #fff 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffdddddd', endColorstr='#ffffffff' )";
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   background-color: #cde7f4;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #eaf4fa), color-stop(100%, #b0d9ee));
   background-image: -webkit-linear-gradient(top, #eaf4fa 0, #b0d9ee 100%);
-  background-image:    -moz-linear-gradient(top, #eaf4fa 0, #b0d9ee 100%);
-  background-image:         linear-gradient(to bottom, #eaf4fa 0, #b0d9ee 100%);
+  background-image: -moz-linear-gradient(top, #eaf4fa 0, #b0d9ee 100%);
+  background-image: linear-gradient(to bottom, #eaf4fa 0, #b0d9ee 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffeaf4fa', endColorstr='#ffb0d9ee' )";
 }
 .oo-ui-buttonElement-framed.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover,
   background-color: #cde7f4;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #b0d9ee), color-stop(100%, #eaf4fa));
   background-image: -webkit-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
-  background-image:    -moz-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
-  background-image:         linear-gradient(to bottom, #b0d9ee 0, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
+  background-image: linear-gradient(to bottom, #b0d9ee 0, #eaf4fa 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffb0d9ee', endColorstr='#ffeaf4fa' )";
 }
 .oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
   background-color: #daf0bd;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #f0fbe1), color-stop(100%, #c3e59a));
   background-image: -webkit-linear-gradient(top, #f0fbe1 0, #c3e59a 100%);
-  background-image:    -moz-linear-gradient(top, #f0fbe1 0, #c3e59a 100%);
-  background-image:         linear-gradient(to bottom, #f0fbe1 0, #c3e59a 100%);
+  background-image: -moz-linear-gradient(top, #f0fbe1 0, #c3e59a 100%);
+  background-image: linear-gradient(to bottom, #f0fbe1 0, #c3e59a 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff0fbe1', endColorstr='#ffc3e59a' )";
 }
 .oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
   background-color: #daf0bd;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #c3e59a), color-stop(100%, #f0fbe1));
   background-image: -webkit-linear-gradient(top, #c3e59a 0, #f0fbe1 100%);
-  background-image:    -moz-linear-gradient(top, #c3e59a 0, #f0fbe1 100%);
-  background-image:         linear-gradient(to bottom, #c3e59a 0, #f0fbe1 100%);
+  background-image: -moz-linear-gradient(top, #c3e59a 0, #f0fbe1 100%);
+  background-image: linear-gradient(to bottom, #c3e59a 0, #f0fbe1 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffc3e59a', endColorstr='#fff0fbe1' )";
 }
 .oo-ui-buttonElement-framed.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
   opacity: 0.5;
   -webkit-transform: translateZ(0);
-          transform: translateZ(0);
+  transform: translateZ(0);
   box-shadow: none;
   color: #333;
   background: #eee;
 }
 .oo-ui-clippableElement-clippable {
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   min-height: 3.125em;
 }
 .oo-ui-floatableElement {
@@ -483,7 +483,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-panelLayout-scrollable {
   overflow: auto;
   -webkit-transform: translateZ(0);
-          transform: translateZ(0);
+  transform: translateZ(0);
 }
 .oo-ui-panelLayout-expanded {
   position: absolute;
@@ -717,9 +717,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-head {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-popupWidget-head > .oo-ui-buttonWidget {
   float: right;
@@ -814,8 +814,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
   -webkit-transition: width 100ms ease, height 100ms ease, left 100ms ease;
-     -moz-transition: width 100ms ease, height 100ms ease, left 100ms ease;
-          transition: width 100ms ease, height 100ms ease, left 100ms ease;
+  -moz-transition: width 100ms ease, height 100ms ease, left 100ms ease;
+  transition: width 100ms ease, height 100ms ease, left 100ms ease;
 }
 .oo-ui-popupWidget-head {
   height: 2.5em;
@@ -857,8 +857,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
   vertical-align: middle;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   width: 100%;
   max-width: 50em;
 }
@@ -871,8 +871,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   background-repeat: no-repeat;
   width: 100%;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select {
   cursor: pointer;
@@ -909,8 +909,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
   vertical-align: middle;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   width: 100%;
   max-width: 50em;
 }
@@ -919,8 +919,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: block;
   width: 100%;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-textInputWidget textarea {
   overflow: auto;
@@ -957,9 +957,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   height: 100%;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
@@ -973,9 +973,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
   display: block;
@@ -1009,8 +1009,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   box-shadow: 0 0 0 #fff, inset 0 0.1em 0.2em #ddd;
   border-radius: 0.25em;
   -webkit-transition: border-color 250ms ease, box-shadow 250ms ease;
-     -moz-transition: border-color 250ms ease, box-shadow 250ms ease;
-          transition: border-color 250ms ease, box-shadow 250ms ease;
+  -moz-transition: border-color 250ms ease, box-shadow 250ms ease;
+  transition: border-color 250ms ease, box-shadow 250ms ease;
 }
 .oo-ui-textInputWidget input.oo-ui-pendingElement-pending,
 .oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
@@ -1120,14 +1120,24 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-menuSelectWidget-invisible {
   display: none;
 }
-.oo-ui-menuOptionWidget .oo-ui-iconElement-icon {
-  display: none;
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
 }
 .oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+  background-image: url('themes/apex/images/icons/check.png');
+  background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url('themes/apex/images/icons/check.svg');
+  background-image: linear-gradient(transparent, transparent), /* @embed */ url('themes/apex/images/icons/check.svg');
+  background-image: -o-linear-gradient(transparent, transparent), url('themes/apex/images/icons/check.png');
+  background-position: center center;
+  background-repeat: no-repeat;
+  background-size: contain;
   display: block;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
+  left: 0.5em;
+  top: 0;
+  min-width: 24px;
+  width: 1.875em;
+  min-height: 24px;
+  height: 100%;
 }
 .oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted,
 .oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
@@ -1158,12 +1168,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   cursor: default;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon,
 .oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
@@ -1332,24 +1342,24 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   height: 1em;
   border-right: 1px solid #ccc;
   -webkit-transition: width 250ms ease;
-     -moz-transition: width 250ms ease;
-          transition: width 250ms ease;
+  -moz-transition: width 250ms ease;
+  transition: width 250ms ease;
   background-color: #cde7f4;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #eaf4fa), color-stop(100%, #b0d9ee));
   background-image: -webkit-linear-gradient(top, #eaf4fa 0, #b0d9ee 100%);
-  background-image:    -moz-linear-gradient(top, #eaf4fa 0, #b0d9ee 100%);
-  background-image:         linear-gradient(to bottom, #eaf4fa 0, #b0d9ee 100%);
+  background-image: -moz-linear-gradient(top, #eaf4fa 0, #b0d9ee 100%);
+  background-image: linear-gradient(to bottom, #eaf4fa 0, #b0d9ee 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffeaf4fa', endColorstr='#ffb0d9ee' )";
 }
 .oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
   -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-     -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-          animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+  -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+  animation: oo-ui-progressBarWidget-slide 2s infinite linear;
   width: 40%;
   -webkit-transform: translate(-25%);
-     -moz-transform: translate(-25%);
-      -ms-transform: translate(-25%);
-          transform: translate(-25%);
+  -moz-transform: translate(-25%);
+  -ms-transform: translate(-25%);
+  transform: translate(-25%);
   border-left: 1px solid #a6cee1;
 }
 .oo-ui-progressBarWidget.oo-ui-widget-disabled {
@@ -1358,42 +1368,42 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
   from {
     -webkit-transform: translate(-100%);
-       -moz-transform: translate(-100%);
-        -ms-transform: translate(-100%);
-            transform: translate(-100%);
+    -moz-transform: translate(-100%);
+    -ms-transform: translate(-100%);
+    transform: translate(-100%);
   }
   to {
     -webkit-transform: translate(350%);
-       -moz-transform: translate(350%);
-        -ms-transform: translate(350%);
-            transform: translate(350%);
+    -moz-transform: translate(350%);
+    -ms-transform: translate(350%);
+    transform: translate(350%);
   }
 }
 @-moz-keyframes oo-ui-progressBarWidget-slide {
   from {
     -webkit-transform: translate(-100%);
-       -moz-transform: translate(-100%);
-        -ms-transform: translate(-100%);
-            transform: translate(-100%);
+    -moz-transform: translate(-100%);
+    -ms-transform: translate(-100%);
+    transform: translate(-100%);
   }
   to {
     -webkit-transform: translate(350%);
-       -moz-transform: translate(350%);
-        -ms-transform: translate(350%);
-            transform: translate(350%);
+    -moz-transform: translate(350%);
+    -ms-transform: translate(350%);
+    transform: translate(350%);
   }
 }
 @keyframes oo-ui-progressBarWidget-slide {
   from {
     -webkit-transform: translate(-100%);
-       -moz-transform: translate(-100%);
-        -ms-transform: translate(-100%);
-            transform: translate(-100%);
+    -moz-transform: translate(-100%);
+    -ms-transform: translate(-100%);
+    transform: translate(-100%);
   }
   to {
     -webkit-transform: translate(350%);
-       -moz-transform: translate(350%);
-        -ms-transform: translate(350%);
-            transform: translate(350%);
+    -moz-transform: translate(350%);
+    -ms-transform: translate(350%);
+    transform: translate(350%);
   }
 }
index 4cc49c8..a994e00 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.21.0
+ * OOjs UI v0.21.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-04-11T22:51:10Z
+ * Date: 2017-04-18T23:32:54Z
  */
 .oo-ui-element-hidden {
   display: none !important;
   cursor: pointer;
   display: inline-block;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   vertical-align: middle;
   font-family: inherit;
   font-size: inherit;
   white-space: nowrap;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button::-moz-focus-inner {
   border-color: transparent;
 }
 .oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
   -webkit-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
-     -moz-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
-          transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+  -moz-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+  transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
 }
 .oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
   opacity: 0.87;
   -webkit-transition: opacity 100ms;
-     -moz-transition: opacity 100ms;
-          transition: opacity 100ms;
+  -moz-transition: opacity 100ms;
+  transition: opacity 100ms;
 }
 .oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon.oo-ui-image-invert,
 .oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator.oo-ui-image-invert {
 }
 .oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button {
   margin-left: -1px;
-  border: 1px solid #fff;
+  border-color: #fff;
+  border-color: transparent;
+  border-style: solid;
+  border-width: 1px;
   padding: 0.3125em 0;
 }
 .oo-ui-buttonElement-frameless.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
   color: #fff;
   border: 1px solid #c8ccd1;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled + .oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-  border-left-color: #fff;
-}
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
   background-color: #f8f9fa;
   color: #222;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active:focus,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button {
   background-color: #eff3fa;
   color: #2a4b8d;
   border-color: #2a4b8d;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
   border-color: #36c;
   box-shadow: inset 0 0 0 1px #36c;
+  outline: 0;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
   color: #36c;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:active:focus,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button {
   background-color: #eff3fa;
   color: #2a4b8d;
   border-color: #2a4b8d;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
   border-color: #36c;
   box-shadow: inset 0 0 0 1px #36c;
+  outline: 0;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
   color: #d33;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active:focus,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button {
   background-color: #ffffff;
   color: #b32424;
   border-color: #b32424;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
   border-color: #d33;
   box-shadow: inset 0 0 0 1px #d33;
+  outline: 0;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
   color: #fff;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active:focus,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button {
   color: #fff;
   background-color: #2a4b8d;
   border-color: #2a4b8d;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
   border-color: #36c;
   box-shadow: inset 0 0 0 1px #36c, inset 0 0 0 2px #fff;
+  outline: 0;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
   color: #fff;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:active:focus,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button {
   color: #fff;
   background-color: #2a4b8d;
   border-color: #2a4b8d;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
   border-color: #36c;
   box-shadow: inset 0 0 0 1px #36c, inset 0 0 0 2px #fff;
+  outline: 0;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
   color: #fff;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active:focus,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button {
   color: #fff;
   background-color: #b32424;
   border-color: #b32424;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
   border-color: #d33;
   box-shadow: inset 0 0 0 1px #d33, inset 0 0 0 2px #fff;
+  outline: 0;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
 }
 .oo-ui-clippableElement-clippable {
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   min-height: 3.125em;
 }
 .oo-ui-floatableElement {
@@ -646,7 +658,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-panelLayout-scrollable {
   overflow: auto;
   -webkit-transform: translateZ(0);
-          transform: translateZ(0);
+  transform: translateZ(0);
 }
 .oo-ui-panelLayout-expanded {
   position: absolute;
@@ -734,6 +746,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-decoratedOptionWidget .oo-ui-labelElement-label {
   line-height: 1.172em;
 }
+.oo-ui-decoratedOptionWidget.oo-ui-indicatorElement {
+  padding-right: 1.875em;
+}
 .oo-ui-decoratedOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
   right: 0.9375em;
 }
@@ -808,18 +823,21 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-right: 0;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  border-radius: 0;
   margin-left: -1px;
+  border-radius: 0;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+  margin-left: 0;
   border-bottom-left-radius: 2px;
   border-top-left-radius: 2px;
-  margin-left: 0;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
   border-bottom-right-radius: 2px;
   border-top-right-radius: 2px;
 }
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed.oo-ui-widget-disabled + .oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+  border-left-color: #fff;
+}
 .oo-ui-buttonGroupWidget.oo-ui-widget-enabled .oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonGroupWidget.oo-ui-widget-enabled .oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active {
   z-index: 1;
@@ -894,9 +912,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-head {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-popupWidget-head > .oo-ui-buttonWidget {
   float: right;
@@ -991,8 +1009,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
   -webkit-transition: width 100ms, height 100ms, left 100ms;
-     -moz-transition: width 100ms, height 100ms, left 100ms;
-          transition: width 100ms, height 100ms, left 100ms;
+  -moz-transition: width 100ms, height 100ms, left 100ms;
+  transition: width 100ms, height 100ms, left 100ms;
 }
 .oo-ui-popupWidget-head {
   height: 2.5em;
@@ -1052,8 +1070,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   background-repeat: no-repeat;
   background-size: 0 0;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   position: absolute;
   left: 0;
   width: 1.5625em;
@@ -1064,8 +1082,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-checkboxInputWidget [type='checkbox']:checked + span {
   background-image: url('themes/mediawiki/images/icons/check-invert.png');
   background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url('themes/mediawiki/images/icons/check-invert.svg');
-  background-image:         linear-gradient(transparent, transparent), /* @embed */ url('themes/mediawiki/images/icons/check-invert.svg');
-  background-image:      -o-linear-gradient(transparent, transparent), url('themes/mediawiki/images/icons/check-invert.png');
+  background-image: linear-gradient(transparent, transparent), /* @embed */ url('themes/mediawiki/images/icons/check-invert.svg');
+  background-image: -o-linear-gradient(transparent, transparent), url('themes/mediawiki/images/icons/check-invert.png');
   background-size: 90% 90%;
 }
 .oo-ui-checkboxInputWidget [type='checkbox']:disabled + span {
@@ -1082,8 +1100,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type='checkbox'] + span {
   cursor: pointer;
   -webkit-transition: background-color 100ms, background-size 100ms, border-color 100ms, box-shadow 100ms;
-     -moz-transition: background-color 100ms, background-size 100ms, border-color 100ms, box-shadow 100ms;
-          transition: background-color 100ms, background-size 100ms, border-color 100ms, box-shadow 100ms;
+  -moz-transition: background-color 100ms, background-size 100ms, border-color 100ms, box-shadow 100ms;
+  transition: background-color 100ms, background-size 100ms, border-color 100ms, box-shadow 100ms;
 }
 .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type='checkbox']:hover + span,
 .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type='checkbox']:focus:hover + span {
@@ -1133,8 +1151,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
   vertical-align: middle;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   width: 100%;
   max-width: 50em;
 }
@@ -1147,8 +1165,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   background-repeat: no-repeat;
   width: 100%;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select {
   cursor: pointer;
@@ -1160,11 +1178,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-dropdownInputWidget select {
   -webkit-appearance: none;
-     -moz-appearance: none;
-          appearance: none;
+  -moz-appearance: none;
+  appearance: none;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
   padding: 0.625em 0.9375em 0.546875em;
@@ -1191,8 +1209,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   background-color: #f8f9fa;
   color: #222;
   -webkit-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
-     -moz-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
-          transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+  -moz-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+  transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
 }
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover {
   background-color: #fff;
@@ -1236,8 +1254,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: absolute;
   left: 0;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   width: 1.5625em;
   height: 1.5625em;
   border: 1px solid #72777d;
@@ -1273,8 +1291,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-radioInputWidget.oo-ui-widget-enabled [type='radio'] + span {
   cursor: pointer;
   -webkit-transition: background-color 100ms, border-color 100ms, border-width 100ms;
-     -moz-transition: background-color 100ms, border-color 100ms, border-width 100ms;
-          transition: background-color 100ms, border-color 100ms, border-width 100ms;
+  -moz-transition: background-color 100ms, border-color 100ms, border-width 100ms;
+  transition: background-color 100ms, border-color 100ms, border-width 100ms;
 }
 .oo-ui-radioInputWidget.oo-ui-widget-enabled [type='radio']:hover + span {
   border-color: #36c;
@@ -1325,8 +1343,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
   vertical-align: middle;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   width: 100%;
   max-width: 50em;
 }
@@ -1335,8 +1353,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: block;
   width: 100%;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-textInputWidget textarea {
   overflow: auto;
@@ -1373,9 +1391,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   height: 100%;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
@@ -1389,9 +1407,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
   display: block;
@@ -1435,10 +1453,10 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea {
-  box-shadow: inset 0 0 0 1px #fff;
+  box-shadow: inset 0 0 0 1px transparent;
   -webkit-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
-     -moz-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
-          transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+  -moz-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+  transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:hover,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:hover {
@@ -1452,7 +1470,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
-  color: #72777d;
+  background-color: #f8f9fa;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly]:hover,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly]:hover {
@@ -1460,8 +1478,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly]:focus,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly]:focus {
-  border-color: #c8ccd1;
-  box-shadow: inset 0 0 0 1px #c8ccd1;
+  border-color: #36c;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input::-webkit-input-placeholder,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea::-webkit-input-placeholder {
@@ -1576,14 +1593,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-menuOptionWidget {
   -webkit-transition: background-color 100ms, color 100ms;
-     -moz-transition: background-color 100ms, color 100ms;
-          transition: background-color 100ms, color 100ms;
-}
-.oo-ui-menuOptionWidget .oo-ui-iconElement-icon {
-  display: none;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
-  display: block;
+  -moz-transition: background-color 100ms, color 100ms;
+  transition: background-color 100ms, color 100ms;
 }
 .oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted {
   background-color: #eaecf0;
@@ -1593,17 +1604,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   background-color: #eaf3ff;
   color: #36c;
 }
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
-  display: none;
-}
 .oo-ui-menuOptionWidget.oo-ui-optionWidget-selected.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted,
 .oo-ui-menuOptionWidget.oo-ui-optionWidget-pressed.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted {
   background-color: rgba(41, 98, 204, 0.1);
   color: #36c;
 }
-.oo-ui-menuOptionWidget.oo-ui-iconElement {
-  padding-left: 0.9375em;
-}
 .oo-ui-menuSectionOptionWidget {
   color: #72777d;
   padding: 0.703125em 0.9375em 0.3125em;
@@ -1629,12 +1634,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   cursor: default;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon,
 .oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
@@ -1674,8 +1679,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   background-color: #f8f9fa;
   color: #222;
   -webkit-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
-     -moz-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
-          transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+  -moz-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+  transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
 }
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle:hover {
   background-color: #fff;
@@ -1699,8 +1704,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
   opacity: 0.87;
   -webkit-transition: opacity 100ms;
-     -moz-transition: opacity 100ms;
-          transition: opacity 100ms;
+  -moz-transition: opacity 100ms;
+  transition: opacity 100ms;
 }
 .oo-ui-dropdownWidget.oo-ui-widget-enabled.oo-ui-dropdownWidget-open .oo-ui-dropdownWidget-handle {
   background-color: #fff;
@@ -1840,18 +1845,18 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-progressBarWidget-bar {
   height: 1em;
   -webkit-transition: width 200ms;
-     -moz-transition: width 200ms;
-          transition: width 200ms;
+  -moz-transition: width 200ms;
+  transition: width 200ms;
 }
 .oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
   -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-     -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-          animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+  -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+  animation: oo-ui-progressBarWidget-slide 2s infinite linear;
   width: 40%;
   -webkit-transform: translate(-25%);
-     -moz-transform: translate(-25%);
-      -ms-transform: translate(-25%);
-          transform: translate(-25%);
+  -moz-transform: translate(-25%);
+  -ms-transform: translate(-25%);
+  transform: translate(-25%);
   border-left-width: 1px;
 }
 .oo-ui-progressBarWidget.oo-ui-widget-enabled .oo-ui-progressBarWidget-bar {
@@ -1863,42 +1868,42 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
   from {
     -webkit-transform: translate(-100%);
-       -moz-transform: translate(-100%);
-        -ms-transform: translate(-100%);
-            transform: translate(-100%);
+    -moz-transform: translate(-100%);
+    -ms-transform: translate(-100%);
+    transform: translate(-100%);
   }
   to {
     -webkit-transform: translate(350%);
-       -moz-transform: translate(350%);
-        -ms-transform: translate(350%);
-            transform: translate(350%);
+    -moz-transform: translate(350%);
+    -ms-transform: translate(350%);
+    transform: translate(350%);
   }
 }
 @-moz-keyframes oo-ui-progressBarWidget-slide {
   from {
     -webkit-transform: translate(-100%);
-       -moz-transform: translate(-100%);
-        -ms-transform: translate(-100%);
-            transform: translate(-100%);
+    -moz-transform: translate(-100%);
+    -ms-transform: translate(-100%);
+    transform: translate(-100%);
   }
   to {
     -webkit-transform: translate(350%);
-       -moz-transform: translate(350%);
-        -ms-transform: translate(350%);
-            transform: translate(350%);
+    -moz-transform: translate(350%);
+    -ms-transform: translate(350%);
+    transform: translate(350%);
   }
 }
 @keyframes oo-ui-progressBarWidget-slide {
   from {
     -webkit-transform: translate(-100%);
-       -moz-transform: translate(-100%);
-        -ms-transform: translate(-100%);
-            transform: translate(-100%);
+    -moz-transform: translate(-100%);
+    -ms-transform: translate(-100%);
+    transform: translate(-100%);
   }
   to {
     -webkit-transform: translate(350%);
-       -moz-transform: translate(350%);
-        -ms-transform: translate(350%);
-            transform: translate(350%);
+    -moz-transform: translate(350%);
+    -ms-transform: translate(350%);
+    transform: translate(350%);
   }
 }
index e566d96..c00d9a7 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.21.0
+ * OOjs UI v0.21.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-04-11T22:51:05Z
+ * Date: 2017-04-18T23:32:49Z
  */
 ( function ( OO ) {
 
@@ -719,7 +719,7 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
                throw new Error( 'No infusion data found: ' + id );
        }
        try {
-               data = $.parseJSON( data );
+               data = JSON.parse( data );
        } catch ( _ ) {
                data = null;
        }
@@ -4932,8 +4932,10 @@ OO.ui.PopupWidget.prototype.toggleAnchor = function ( show ) {
        if ( this.anchored !== show ) {
                if ( show ) {
                        this.$element.addClass( 'oo-ui-popupWidget-anchored' );
+                       this.$element.addClass( 'oo-ui-popupWidget-anchored-' + this.anchorEdge );
                } else {
                        this.$element.removeClass( 'oo-ui-popupWidget-anchored' );
+                       this.$element.removeClass( 'oo-ui-popupWidget-anchored-' + this.anchorEdge );
                }
                this.anchored = show;
        }
@@ -4951,7 +4953,9 @@ OO.ui.PopupWidget.prototype.setAnchorEdge = function ( edge ) {
                this.$element.removeClass( 'oo-ui-popupWidget-anchored-' + this.anchorEdge );
        }
        this.anchorEdge = edge;
-       this.$element.addClass( 'oo-ui-popupWidget-anchored-' + edge );
+       if ( this.anchored ) {
+               this.$element.addClass( 'oo-ui-popupWidget-anchored-' + edge );
+       }
 };
 
 /**
@@ -6610,9 +6614,6 @@ OO.mixinClass( OO.ui.DecoratedOptionWidget, OO.ui.mixin.IndicatorElement );
  * @param {Object} [config] Configuration options
  */
 OO.ui.MenuOptionWidget = function OoUiMenuOptionWidget( config ) {
-       // Configuration initialization
-       config = $.extend( { icon: 'check' }, config );
-
        // Parent constructor
        OO.ui.MenuOptionWidget.parent.call( this, config );
 
@@ -7884,9 +7885,18 @@ OO.ui.FloatingMenuSelectWidget = function OoUiFloatingMenuSelectWidget( inputWid
 OO.inheritClass( OO.ui.FloatingMenuSelectWidget, OO.ui.MenuSelectWidget );
 OO.mixinClass( OO.ui.FloatingMenuSelectWidget, OO.ui.mixin.FloatableElement );
 
+/* Events */
+
+/**
+ * @event ready
+ *
+ * The menu is ready: it is visible and has been positioned and clipped.
+ */
+
 /* Methods */
 
 /**
+ * @fires ready
  * @inheritdoc
  */
 OO.ui.FloatingMenuSelectWidget.prototype.toggle = function ( visible ) {
@@ -7905,6 +7915,9 @@ OO.ui.FloatingMenuSelectWidget.prototype.toggle = function ( visible ) {
 
        if ( change ) {
                this.togglePositioning( this.isVisible() );
+               if ( visible ) {
+                       this.emit( 'ready' );
+               }
        }
 
        return this;
@@ -8646,6 +8659,7 @@ OO.ui.DropdownInputWidget = function OoUiDropdownInputWidget( config ) {
        this.$element
                .addClass( 'oo-ui-dropdownInputWidget' )
                .append( this.dropdownWidget.$element );
+       this.setTabIndexedElement( null );
 };
 
 /* Setup */
@@ -8928,6 +8942,7 @@ OO.ui.RadioSelectInputWidget = function OoUiRadioSelectInputWidget( config ) {
        this.$element
                .addClass( 'oo-ui-radioSelectInputWidget' )
                .append( this.radioSelectWidget.$element );
+       this.setTabIndexedElement( null );
 };
 
 /* Setup */
index ec6e45d..b8dbf7b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.21.0
+ * OOjs UI v0.21.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-04-11T22:51:05Z
+ * Date: 2017-04-18T23:32:49Z
  */
 ( function ( OO ) {
 
@@ -48,14 +48,19 @@ OO.ui.MediaWikiTheme.prototype.getElementClasses = function ( element ) {
        if ( element.supports( [ 'hasFlag' ] ) ) {
                isFramed = element.supports( [ 'isFramed' ] ) && element.isFramed();
                isActive = element.supports( [ 'isActive' ] ) && element.isActive();
-               if ( isFramed && ( isActive || element.isDisabled() || element.hasFlag( 'primary' ) ) ) {
-                       // Button with a dark background, use white icon
+               if (
+                       // Button with a dark background
+                       isFramed && ( isActive || element.isDisabled() || element.hasFlag( 'primary' ) ) ||
+                       // Toolbar with a dark background
+                       element instanceof OO.ui.ToolGroup && ( isActive || element.hasFlag( 'primary' ) )
+               ) {
+                       // … use white icon / indicator, regardless of other flags
                        variants.invert = true;
                } else if ( !isFramed && element.isDisabled() ) {
-                       // Frameless disabled button, always use black icon regardless of flags
+                       // Frameless disabled button, always use black icon / indicator regardless of other flags
                        variants.invert = false;
                } else if ( !element.isDisabled() ) {
-                       // Any other kind of button, use the right colored icon if available
+                       // Any other kind of button, use the right colored icon / indicator if available
                        variants.progressive = element.hasFlag( 'progressive' );
                        variants.constructive = element.hasFlag( 'constructive' );
                        variants.destructive = element.hasFlag( 'destructive' );
index cb6ebc3..53c5bf3 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.21.0
+ * OOjs UI v0.21.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-04-11T22:51:10Z
+ * Date: 2017-04-18T23:32:54Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
@@ -43,8 +43,8 @@
   border-radius: 0.3125em;
   border: 1px solid transparent;
   -webkit-transition: border-color 250ms ease;
-     -moz-transition: border-color 250ms ease;
-          transition: border-color 250ms ease;
+  -moz-transition: border-color 250ms ease;
+  transition: border-color 250ms ease;
 }
 .oo-ui-toolGroup-empty {
   display: none;
   background-color: #f8fbfd;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #f1f7fb), color-stop(100%, #fff));
   background-image: -webkit-linear-gradient(top, #f1f7fb 0, #fff 100%);
-  background-image:    -moz-linear-gradient(top, #f1f7fb 0, #fff 100%);
-  background-image:         linear-gradient(to bottom, #f1f7fb 0, #fff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0, #fff 100%);
+  background-image: linear-gradient(to bottom, #f1f7fb 0, #fff 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff1f7fb', endColorstr='#ffffffff' )";
 }
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
 .oo-ui-toolbar-narrow .oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
   margin-right: 1.75em;
 }
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive > .oo-ui-popupToolGroup-handle {
+  border: 1px solid #a6cee1;
+  background-color: #cde7f4;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #eaf4fa), color-stop(100%, #b0d9ee));
+  background-image: -webkit-linear-gradient(top, #eaf4fa 0, #b0d9ee 100%);
+  background-image: -moz-linear-gradient(top, #eaf4fa 0, #b0d9ee 100%);
+  background-image: linear-gradient(to bottom, #eaf4fa 0, #b0d9ee 100%);
+  -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffeaf4fa', endColorstr='#ffb0d9ee' )";
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive > .oo-ui-popupToolGroup-handle:hover,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive > .oo-ui-popupToolGroup-handle:focus {
+  border-color: #9dc2d4;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:active,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive.oo-ui-popupToolGroup-active > .oo-ui-popupToolGroup-handle {
+  border: 1px solid #a6cee1;
+  background-color: #cde7f4;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #b0d9ee), color-stop(100%, #eaf4fa));
+  background-image: -webkit-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
+  background-image: linear-gradient(to bottom, #b0d9ee 0, #eaf4fa 100%);
+  -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffb0d9ee', endColorstr='#ffeaf4fa' )";
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive > .oo-ui-popupToolGroup-handle {
+  border: 1px solid #b8d892;
+  background-color: #daf0bd;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #f0fbe1), color-stop(100%, #c3e59a));
+  background-image: -webkit-linear-gradient(top, #f0fbe1 0, #c3e59a 100%);
+  background-image: -moz-linear-gradient(top, #f0fbe1 0, #c3e59a 100%);
+  background-image: linear-gradient(to bottom, #f0fbe1 0, #c3e59a 100%);
+  -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff0fbe1', endColorstr='#ffc3e59a' )";
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive > .oo-ui-popupToolGroup-handle:hover,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive > .oo-ui-popupToolGroup-handle:focus {
+  border-color: #adcb89;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:active,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive.oo-ui-popupToolGroup-active > .oo-ui-popupToolGroup-handle {
+  border: 1px solid #b8d892;
+  background-color: #daf0bd;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #c3e59a), color-stop(100%, #f0fbe1));
+  background-image: -webkit-linear-gradient(top, #c3e59a 0, #f0fbe1 100%);
+  background-image: -moz-linear-gradient(top, #c3e59a 0, #f0fbe1 100%);
+  background-image: linear-gradient(to bottom, #c3e59a 0, #f0fbe1 100%);
+  -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffc3e59a', endColorstr='#fff0fbe1' )";
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive > .oo-ui-popupToolGroup-handle {
+  color: #d45353;
+}
+.oo-ui-buttonGroupWidget .oo-ui-popupToolGroup {
+  margin-left: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-popupToolGroup > .oo-ui-popupToolGroup-handle {
+  height: 2.3em;
+  border-radius: 0;
+  margin-left: -2px;
+}
+.oo-ui-buttonGroupWidget .oo-ui-popupToolGroup:first-child > .oo-ui-popupToolGroup-handle {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+  margin-left: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-popupToolGroup:last-child {
+  margin-right: 0.5em;
+}
+.oo-ui-buttonGroupWidget .oo-ui-popupToolGroup:last-child > .oo-ui-popupToolGroup-handle {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
 .oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
   width: 0.9375em;
   height: 0.9375em;
   background-color: #f8fbfd;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #f1f7fb), color-stop(100%, #fff));
   background-image: -webkit-linear-gradient(top, #f1f7fb 0, #fff 100%);
-  background-image:    -moz-linear-gradient(top, #f1f7fb 0, #fff 100%);
-  background-image:         linear-gradient(to bottom, #f1f7fb 0, #fff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0, #fff 100%);
+  background-image: linear-gradient(to bottom, #f1f7fb 0, #fff 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff1f7fb', endColorstr='#ffffffff' )";
 }
 .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
 .oo-ui-listToolGroup .oo-ui-tool {
   display: block;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-listToolGroup .oo-ui-toolGroup-tools {
   padding: 0.3125em;
   background-color: #f8fbfd;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #f1f7fb), color-stop(100%, #fff));
   background-image: -webkit-linear-gradient(top, #f1f7fb 0, #fff 100%);
-  background-image:    -moz-linear-gradient(top, #f1f7fb 0, #fff 100%);
-  background-image:         linear-gradient(to bottom, #f1f7fb 0, #fff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0, #fff 100%);
+  background-image: linear-gradient(to bottom, #f1f7fb 0, #fff 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff1f7fb', endColorstr='#ffffffff' )";
 }
 .oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
 .oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
   background-image: url('themes/apex/images/icons/check.png');
   background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url('themes/apex/images/icons/check.svg');
-  background-image:         linear-gradient(transparent, transparent), /* @embed */ url('themes/apex/images/icons/check.svg');
-  background-image:      -o-linear-gradient(transparent, transparent), url('themes/apex/images/icons/check.png');
+  background-image: linear-gradient(transparent, transparent), /* @embed */ url('themes/apex/images/icons/check.svg');
+  background-image: -o-linear-gradient(transparent, transparent), url('themes/apex/images/icons/check.png');
   background-size: contain;
   background-position: center center;
   background-repeat: no-repeat;
 .oo-ui-toolbar-actions {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-toolbar-tools {
   display: inline;
 .oo-ui-toolbar-actions .oo-ui-popupWidget {
   -webkit-touch-callout: default;
   -webkit-user-select: all;
-     -moz-user-select: all;
-      -ms-user-select: all;
-          user-select: all;
+  -moz-user-select: all;
+  -ms-user-select: all;
+  user-select: all;
 }
 .oo-ui-toolbar-bar {
   background-color: #f8fbfd;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #fff), color-stop(100%, #F1F7FB));
   background-image: -webkit-linear-gradient(top, #fff 0, #F1F7FB 100%);
-  background-image:    -moz-linear-gradient(top, #fff 0, #F1F7FB 100%);
-  background-image:         linear-gradient(to bottom, #fff 0, #F1F7FB 100%);
+  background-image: -moz-linear-gradient(top, #fff 0, #F1F7FB 100%);
+  background-image: linear-gradient(to bottom, #fff 0, #F1F7FB 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffffff', endColorstr='#fff1f7fb' )";
 }
 .oo-ui-toolbar-position-top > .oo-ui-toolbar-bar {
index 85095d3..a82a8b2 100644 (file)
@@ -1,22 +1,22 @@
 /*!
- * OOjs UI v0.21.0
+ * OOjs UI v0.21.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-04-11T22:51:10Z
+ * Date: 2017-04-18T23:32:54Z
  */
 .oo-ui-tool.oo-ui-widget-enabled {
   -webkit-transition: background-color 100ms;
-     -moz-transition: background-color 100ms;
-          transition: background-color 100ms;
+  -moz-transition: background-color 100ms;
+  transition: background-color 100ms;
 }
 .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
   -webkit-transition: color 100ms;
-     -moz-transition: color 100ms;
-          transition: color 100ms;
+  -moz-transition: color 100ms;
+  transition: color 100ms;
 }
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
@@ -96,8 +96,8 @@
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-enabled > .oo-ui-tool-link .oo-ui-tool-title {
   color: #222;
   -webkit-transition: color 100ms;
-     -moz-transition: color 100ms;
-          transition: color 100ms;
+  -moz-transition: color 100ms;
+  transition: color 100ms;
 }
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-enabled.oo-ui-tool-active {
   background-color: #eaf3ff;
 .oo-ui-toolbar-narrow .oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
   margin-right: 1.75em;
 }
+.oo-ui-popupToolGroup.oo-ui-labelElement:not( .oo-ui-indicatorElement ) .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin: 0 0.5em;
+}
 .oo-ui-popupToolGroup-header {
   line-height: 2.6;
   margin: 0 0.6em;
 .oo-ui-toolbar-narrow .oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
   left: 0;
 }
+.oo-ui-popupToolGroup:not( .oo-ui-labelElement ):not( .oo-ui-iconElement ) .oo-ui-indicatorElement-indicator {
+  opacity: 1;
+}
 .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
   margin: 0 -1px;
   border: 1px solid #c8ccd1;
 .oo-ui-popupToolGroup .oo-ui-tool-link {
   padding: 0.4em 0.625em;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
   height: 2.5em;
 }
 .oo-ui-popupToolGroup.oo-ui-widget-enabled {
   -webkit-transition: background-color 100ms, box-shadow 100ms;
-     -moz-transition: background-color 100ms, box-shadow 100ms;
-          transition: background-color 100ms, box-shadow 100ms;
+  -moz-transition: background-color 100ms, box-shadow 100ms;
+  transition: background-color 100ms, box-shadow 100ms;
 }
 .oo-ui-popupToolGroup.oo-ui-widget-enabled.oo-ui-popupToolGroup-active {
   box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
 }
 .oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle {
   -webkit-transition: background-color 100ms, box-shadow 100ms;
-     -moz-transition: background-color 100ms, box-shadow 100ms;
-          transition: background-color 100ms, box-shadow 100ms;
+  -moz-transition: background-color 100ms, box-shadow 100ms;
+  transition: background-color 100ms, box-shadow 100ms;
 }
 .oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:hover {
   background-color: #eaecf0;
 .oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:active {
   background-color: #eaf3ff;
 }
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive > .oo-ui-popupToolGroup-handle {
+  color: #fff;
+  background-color: #36c;
+  border-color: #36c;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive > .oo-ui-popupToolGroup-handle:hover {
+  background-color: #447ff5;
+  border-color: #447ff5;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive > .oo-ui-popupToolGroup-handle:active,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive > .oo-ui-popupToolGroup-handle:active:focus,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-popupToolGroup-handle,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-popupToolGroup-handle,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive.oo-ui-popupToolGroup-active > .oo-ui-popupToolGroup-handle {
+  color: #fff;
+  background-color: #2a4b8d;
+  border-color: #2a4b8d;
+  box-shadow: none;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive > .oo-ui-popupToolGroup-handle:focus {
+  border-color: #36c;
+  box-shadow: inset 0 0 0 1px #36c, inset 0 0 0 2px #fff;
+  outline: 0;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive > .oo-ui-popupToolGroup-handle {
+  color: #fff;
+  background-color: #36c;
+  border-color: #36c;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive > .oo-ui-popupToolGroup-handle:hover {
+  background-color: #447ff5;
+  border-color: #447ff5;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive > .oo-ui-popupToolGroup-handle:active,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive > .oo-ui-popupToolGroup-handle:active:focus,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-popupToolGroup-handle,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-popupToolGroup-handle,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive.oo-ui-popupToolGroup-active > .oo-ui-popupToolGroup-handle {
+  color: #fff;
+  background-color: #2a4b8d;
+  border-color: #2a4b8d;
+  box-shadow: none;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive > .oo-ui-popupToolGroup-handle:focus {
+  border-color: #36c;
+  box-shadow: inset 0 0 0 1px #36c, inset 0 0 0 2px #fff;
+  outline: 0;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive > .oo-ui-popupToolGroup-handle {
+  color: #fff;
+  background-color: #d33;
+  border-color: #d33;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive > .oo-ui-popupToolGroup-handle:hover {
+  background-color: #ff4242;
+  border-color: #ff4242;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive > .oo-ui-popupToolGroup-handle:active,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive > .oo-ui-popupToolGroup-handle:active:focus,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-popupToolGroup-handle,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-popupToolGroup-handle,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive.oo-ui-popupToolGroup-active > .oo-ui-popupToolGroup-handle {
+  color: #fff;
+  background-color: #b32424;
+  border-color: #b32424;
+  box-shadow: none;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive > .oo-ui-popupToolGroup-handle:focus {
+  border-color: #d33;
+  box-shadow: inset 0 0 0 1px #d33, inset 0 0 0 2px #fff;
+  outline: 0;
+}
 .oo-ui-listToolGroup .oo-ui-tool {
   display: block;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
   background-color: #eaecf0;
 .oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
   background-image: url('themes/mediawiki/images/icons/check-progressive.png');
   background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url('themes/mediawiki/images/icons/check-progressive.svg');
-  background-image:         linear-gradient(transparent, transparent), /* @embed */ url('themes/mediawiki/images/icons/check-progressive.svg');
-  background-image:      -o-linear-gradient(transparent, transparent), url('themes/mediawiki/images/icons/check-progressive.png');
+  background-image: linear-gradient(transparent, transparent), /* @embed */ url('themes/mediawiki/images/icons/check-progressive.svg');
+  background-image: -o-linear-gradient(transparent, transparent), url('themes/mediawiki/images/icons/check-progressive.png');
   background-size: contain;
   background-position: center center;
   background-repeat: no-repeat;
 .oo-ui-toolbar-actions {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-toolbar-tools {
   display: inline;
 .oo-ui-toolbar-actions .oo-ui-popupWidget {
   -webkit-touch-callout: default;
   -webkit-user-select: all;
-     -moz-user-select: all;
-      -ms-user-select: all;
-          user-select: all;
+  -moz-user-select: all;
+  -ms-user-select: all;
+  user-select: all;
 }
 .oo-ui-toolbar-bar {
   background-color: #fff;
index 665e9dc..9ef478b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.21.0
+ * OOjs UI v0.21.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-04-11T22:51:05Z
+ * Date: 2017-04-18T23:32:49Z
  */
 ( function ( OO ) {
 
@@ -1778,6 +1778,7 @@ OO.ui.BarToolGroup.static.name = 'bar';
  * @mixins OO.ui.mixin.IndicatorElement
  * @mixins OO.ui.mixin.LabelElement
  * @mixins OO.ui.mixin.TitledElement
+ * @mixins OO.ui.mixin.FlaggedElement
  * @mixins OO.ui.mixin.ClippableElement
  * @mixins OO.ui.mixin.TabIndexedElement
  *
@@ -1795,7 +1796,7 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
 
        // Configuration initialization
        config = $.extend( {
-               indicator: toolbar.position === 'bottom' ? 'up' : 'down'
+               indicator: config.indicator === undefined ? ( toolbar.position === 'bottom' ? 'up' : 'down' ) : config.indicator
        }, config );
 
        // Parent constructor
@@ -1812,6 +1813,7 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
        OO.ui.mixin.IndicatorElement.call( this, config );
        OO.ui.mixin.LabelElement.call( this, config );
        OO.ui.mixin.TitledElement.call( this, config );
+       OO.ui.mixin.FlaggedElement.call( this, config );
        OO.ui.mixin.ClippableElement.call( this, $.extend( {}, config, { $clippable: this.$group } ) );
        OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$handle } ) );
 
@@ -1826,6 +1828,7 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
        // Initialization
        this.$handle
                .addClass( 'oo-ui-popupToolGroup-handle' )
+               .attr( 'role', 'button' )
                .append( this.$icon, this.$label, this.$indicator );
        // If the pop-up should have a header, add it to the top of the toolGroup.
        // Note: If this feature is useful for other widgets, we could abstract it into an
@@ -1849,6 +1852,7 @@ OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.IconElement );
 OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.IndicatorElement );
 OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.LabelElement );
 OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.TitledElement );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.FlaggedElement );
 OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.ClippableElement );
 OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.TabIndexedElement );
 
index 0d51782..dc149fb 100644 (file)
@@ -1,25 +1,25 @@
 /*!
- * OOjs UI v0.21.0
+ * OOjs UI v0.21.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-04-11T22:51:10Z
+ * Date: 2017-04-18T23:32:54Z
  */
 .oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ).oo-ui-widget {
   cursor: move;
   cursor: url(images/grab.cur );
   cursor: -webkit-grab;
-  cursor:    -moz-grab;
-  cursor:         grab;
+  cursor: -moz-grab;
+  cursor: grab;
 }
 .oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ):active {
   cursor: url(images/grabbing.cur );
   cursor: -webkit-grabbing;
-  cursor:    -moz-grabbing;
-  cursor:         grabbing;
+  cursor: -moz-grabbing;
+  cursor: grabbing;
 }
 .oo-ui-draggableElement-handle.oo-ui-widget-disabled,
 .oo-ui-widget-disabled .oo-ui-draggableElement-handle {
@@ -37,8 +37,8 @@
 .oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout {
   width: 100%;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-bookletLayout-outlinePanel-editable > .oo-ui-outlineSelectWidget {
   position: absolute;
@@ -83,8 +83,8 @@
 .oo-ui-menuLayout-content {
   position: absolute;
   -webkit-transition: all 200ms ease;
-     -moz-transition: all 200ms ease;
-          transition: all 200ms ease;
+  -moz-transition: all 200ms ease;
+  transition: all 200ms ease;
 }
 .oo-ui-menuLayout-menu {
   height: 18em;
   vertical-align: middle;
   overflow: hidden;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   -webkit-transform: translateZ(0);
-          transform: translateZ(0);
+  transform: translateZ(0);
   height: 2em;
   width: 4em;
   border-radius: 1em;
   background-color: #eeeeee;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #ddd), color-stop(100%, #fff));
   background-image: -webkit-linear-gradient(top, #ddd 0, #fff 100%);
-  background-image:    -moz-linear-gradient(top, #ddd 0, #fff 100%);
-  background-image:         linear-gradient(to bottom, #ddd 0, #fff 100%);
+  background-image: -moz-linear-gradient(top, #ddd 0, #fff 100%);
+  background-image: linear-gradient(to bottom, #ddd 0, #fff 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffdddddd', endColorstr='#ffffffff' )";
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled {
   position: absolute;
   display: block;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-toggleSwitchWidget:last-child {
   margin-right: 0;
   box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
   border: 1px #c9c9c9 solid;
   -webkit-transition: left 250ms ease, margin-left 250ms ease;
-     -moz-transition: left 250ms ease, margin-left 250ms ease;
-          transition: left 250ms ease, margin-left 250ms ease;
+  -moz-transition: left 250ms ease, margin-left 250ms ease;
+  transition: left 250ms ease, margin-left 250ms ease;
   background-color: #eeeeee;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #fff), color-stop(100%, #ddd));
   background-image: -webkit-linear-gradient(top, #fff 0, #ddd 100%);
-  background-image:    -moz-linear-gradient(top, #fff 0, #ddd 100%);
-  background-image:         linear-gradient(to bottom, #fff 0, #ddd 100%);
+  background-image: -moz-linear-gradient(top, #fff 0, #ddd 100%);
+  background-image: linear-gradient(to bottom, #fff 0, #ddd 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffffff', endColorstr='#ffdddddd' )";
 }
 .oo-ui-toggleSwitchWidget-glow {
   border-radius: 1em;
   box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
   -webkit-transition: opacity 250ms ease;
-     -moz-transition: opacity 250ms ease;
-          transition: opacity 250ms ease;
+  -moz-transition: opacity 250ms ease;
+  transition: opacity 250ms ease;
   background-color: #cde7f4;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #b0d9ee), color-stop(100%, #eaf4fa));
   background-image: -webkit-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
-  background-image:    -moz-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
-  background-image:         linear-gradient(to bottom, #b0d9ee 0, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
+  background-image: linear-gradient(to bottom, #b0d9ee 0, #eaf4fa 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffb0d9ee', endColorstr='#ffeaf4fa' )";
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
   opacity: 0;
   position: relative;
   overflow: hidden;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
   cursor: default;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-selectFileWidget-label {
   position: absolute;
 .oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget,
 }
 .oo-ui-selectFileWidget-label {
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   left: 0.5em;
   right: 2.175em;
   line-height: 2.3em;
 .oo-ui-outlineOptionWidget {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
   font-size: 1.1em;
   padding: 0.75em;
 }
 .oo-ui-outlineControlsWidget-movers {
   float: left;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
   float: left;
 .oo-ui-tagMultiselectWidget-content {
   position: relative;
 }
-.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-content > input {
-  display: none;
-}
 .oo-ui-tagMultiselectWidget-group {
   display: inline;
 }
-.oo-ui-tagMultiselectWidget-inputPosition-outline {
+.oo-ui-tagMultiselectWidget-outlined {
   width: 100%;
 }
+.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-inlined .oo-ui-tagMultiselectWidget-handle {
+  cursor: text;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-content > input {
+  display: none;
+}
 .oo-ui-tagMultiselectWidget-focusTrap {
   display: inline-block;
   height: 1px;
   border: 1px solid rgba(0, 0, 0, 0.1);
   border-radius: 0.25em;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-tagMultiselectWidget-handle:last-child {
   margin-right: 0;
   width: auto;
   max-width: 100%;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   vertical-align: middle;
   padding: 0 0.4em;
   margin: 0.1em;
   background-color: #eeeeee;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #fff), color-stop(100%, #ddd));
   background-image: -webkit-linear-gradient(top, #fff 0, #ddd 100%);
-  background-image:    -moz-linear-gradient(top, #fff 0, #ddd 100%);
-  background-image:         linear-gradient(to bottom, #fff 0, #ddd 100%);
+  background-image: -moz-linear-gradient(top, #fff 0, #ddd 100%);
+  background-image: linear-gradient(to bottom, #fff 0, #ddd 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffffff', endColorstr='#ffdddddd' )";
   border: 1px solid #ccc;
   color: #333;
 .oo-ui-tagItemWidget.oo-ui-widget-disabled {
   opacity: 0.5;
   -webkit-transform: translateZ(0);
-          transform: translateZ(0);
+  transform: translateZ(0);
   box-shadow: none;
   color: #333;
   background: #eee;
   border: 1px solid rgba(0, 0, 0, 0.1);
   border-radius: 0.25em;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-capsuleMultiselectWidget-handle:last-child {
   margin-right: 0;
   width: auto;
   max-width: 100%;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   vertical-align: middle;
   padding: 0 0.4em;
   margin: 0.1em;
   background-color: #eeeeee;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #fff), color-stop(100%, #ddd));
   background-image: -webkit-linear-gradient(top, #fff 0, #ddd 100%);
-  background-image:    -moz-linear-gradient(top, #fff 0, #ddd 100%);
-  background-image:         linear-gradient(to bottom, #fff 0, #ddd 100%);
+  background-image: -moz-linear-gradient(top, #fff 0, #ddd 100%);
+  background-image: linear-gradient(to bottom, #fff 0, #ddd 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffffff', endColorstr='#ffdddddd' )";
   border: 1px solid #ccc;
   color: #333;
 .oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
   opacity: 0.5;
   -webkit-transform: translateZ(0);
-          transform: translateZ(0);
+  transform: translateZ(0);
   box-shadow: none;
   color: #333;
   background: #eee;
index 25add3d..9b06573 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.21.0
+ * OOjs UI v0.21.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-04-11T22:51:10Z
+ * Date: 2017-04-18T23:32:54Z
  */
 .oo-ui-draggableElement {
   padding: 1.0546875em 0.9375em 0.9375em;
   cursor: move;
   cursor: url(images/grab.cur );
   cursor: -webkit-grab;
-  cursor:    -moz-grab;
-  cursor:         grab;
+  cursor: -moz-grab;
+  cursor: grab;
 }
 .oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ):active {
   cursor: url(images/grabbing.cur );
   cursor: -webkit-grabbing;
-  cursor:    -moz-grabbing;
-  cursor:         grabbing;
+  cursor: -moz-grabbing;
+  cursor: grabbing;
 }
 .oo-ui-draggableElement-handle.oo-ui-widget-disabled,
 .oo-ui-widget-disabled .oo-ui-draggableElement-handle {
@@ -45,8 +45,8 @@
 .oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout {
   width: 100%;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-bookletLayout-outlinePanel-editable > .oo-ui-outlineSelectWidget {
   position: absolute;
@@ -97,8 +97,8 @@
 .oo-ui-menuLayout-content {
   position: absolute;
   -webkit-transition: all 200ms ease;
-     -moz-transition: all 200ms ease;
-          transition: all 200ms ease;
+  -moz-transition: all 200ms ease;
+  transition: all 200ms ease;
 }
 .oo-ui-menuLayout-menu {
   height: 18em;
   outline: 0;
 }
 .oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  border-radius: 0;
   margin-left: -1px;
+  border-radius: 0;
 }
 .oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+  margin-left: 0;
   border-bottom-left-radius: 2px;
   border-top-left-radius: 2px;
-  margin-left: 0;
 }
 .oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
   border-bottom-right-radius: 2px;
 .oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
   position: absolute;
 }
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget.oo-ui-widget-disabled + .oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+  border-left-color: #fff;
+}
 .oo-ui-buttonSelectWidget.oo-ui-widget-enabled:focus .oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected .oo-ui-buttonElement-button {
   border-color: #36c;
   box-shadow: inset 0 0 0 1px #36c, inset 0 0 0 2px #fff;
   vertical-align: middle;
   overflow: hidden;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   -webkit-transform: translateZ(0);
-          transform: translateZ(0);
+  transform: translateZ(0);
   background-color: #f8f9fa;
   width: 3.5em;
   min-height: 26px;
   border-radius: 1em;
   margin-right: 0.5em;
   -webkit-transition: background-color 250ms, border-color 250ms;
-     -moz-transition: background-color 250ms, border-color 250ms;
-          transition: background-color 250ms, border-color 250ms;
+  -moz-transition: background-color 250ms, border-color 250ms;
+  transition: background-color 250ms, border-color 250ms;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled {
   cursor: pointer;
   position: absolute;
   display: block;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-toggleSwitchWidget:last-child {
   margin-right: 0;
   border-radius: 1em;
   z-index: 1;
   -webkit-transition: border-color 250ms;
-     -moz-transition: border-color 250ms;
-          transition: border-color 250ms;
+  -moz-transition: border-color 250ms;
+  transition: border-color 250ms;
 }
 .oo-ui-toggleSwitchWidget-grip {
   top: 0.3125em;
   height: 1.25em;
   border-radius: 1.25em;
   -webkit-transition: background-color 250ms, left 100ms, margin-left 100ms;
-     -moz-transition: background-color 250ms, left 100ms, margin-left 100ms;
-          transition: background-color 250ms, left 100ms, margin-left 100ms;
+  -moz-transition: background-color 250ms, left 100ms, margin-left 100ms;
+  transition: background-color 250ms, left 100ms, margin-left 100ms;
 }
 .oo-ui-toggleSwitchWidget-glow {
   display: none;
   position: relative;
   overflow: hidden;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
   cursor: default;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-selectFileWidget-label {
   position: absolute;
 .oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget,
   border-right-width: 0;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
+  top: -1px;
   left: 0.46875em;
-  min-height: 2.4em;
+  min-height: 2.5em;
   margin-left: -1px;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
+  top: -1px;
   right: 0.9375em;
-  min-height: 2.4em;
+  min-height: 2.5em;
 }
 .oo-ui-selectFileWidget-label {
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   display: block;
   right: 2.375em;
   padding-top: 0.625em;
   background-color: #fff;
   border-style: dashed;
   -webkit-transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
-     -moz-transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
-          transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+  -moz-transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+  transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
 }
 .oo-ui-selectFileWidget-empty.oo-ui-widget-enabled.oo-ui-selectFileWidget-dropTarget:hover {
   border-color: #72777d;
   background-color: #eaf3ff;
   color: #36c;
 }
-.oo-ui-selectFileWidget.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
-.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
-  background-color: #eaecf0;
-  border-color: #c8ccd1;
-}
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info,
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-info,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info {
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
   background-color: #eaecf0;
   color: #72777d;
   border-color: #c8ccd1;
   text-shadow: 0 1px 1px #fff;
 }
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
   opacity: 0.51;
 }
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
   opacity: 0.15;
 }
+.oo-ui-selectFileWidget.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget {
+  background-color: #eaecf0;
+  border-color: #c8ccd1;
+}
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info {
+  background-color: #eaecf0;
+  color: #222;
+  border-color: #c8ccd1;
+}
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
+  background-color: #eaecf0;
+  border-color: #c8ccd1;
+}
 .oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-label {
   padding: 1em 0.9375em;
 }
 .oo-ui-outlineOptionWidget {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
   padding: 1.0546875em 0.9375em 0.9375em;
   -webkit-transition: background-color 100ms, color 100ms;
-     -moz-transition: background-color 100ms, color 100ms;
-          transition: background-color 100ms, color 100ms;
+  -moz-transition: background-color 100ms, color 100ms;
+  transition: background-color 100ms, color 100ms;
 }
 .oo-ui-outlineOptionWidget.oo-ui-optionWidget-highlighted {
   background-color: #eaecf0;
 .oo-ui-outlineControlsWidget-movers {
   float: left;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
   float: left;
   padding: 0.35em 1em;
   font-weight: bold;
   -webkit-transition: background-color 100ms, color 100ms;
-     -moz-transition: background-color 100ms, color 100ms;
-          transition: background-color 100ms, color 100ms;
+  -moz-transition: background-color 100ms, color 100ms;
+  transition: background-color 100ms, color 100ms;
 }
 .oo-ui-tabOptionWidget.oo-ui-widget-enabled:hover {
   background-color: rgba(255, 255, 255, 0.3);
 .oo-ui-tagMultiselectWidget-content {
   position: relative;
 }
-.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-content > input {
-  display: none;
-}
 .oo-ui-tagMultiselectWidget-group {
   display: inline;
 }
-.oo-ui-tagMultiselectWidget-inputPosition-outline {
+.oo-ui-tagMultiselectWidget-outlined {
   width: 100%;
 }
+.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-inlined .oo-ui-tagMultiselectWidget-handle {
+  cursor: text;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-content > input {
+  display: none;
+}
 .oo-ui-tagMultiselectWidget-focusTrap {
   display: inline-block;
   height: 1px;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-tagMultiselectWidget-handle:last-child {
   margin-right: 0;
 }
 .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled .oo-ui-tagMultiselectWidget-handle {
   background-color: #fff;
-  cursor: text;
   -webkit-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
-     -moz-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
-          transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+  -moz-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+  transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
 }
 .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled:hover .oo-ui-tagMultiselectWidget-handle {
   border-color: #72777d;
   outline: 0;
   box-shadow: inset 0 0 0 1px #36c;
 }
+.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .oo-ui-tagMultiselectWidget-handle {
+  background-color: #f8f9fa;
+  border-bottom: 0;
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .oo-ui-tagMultiselectWidget-handle .oo-ui-tagItemWidget.oo-ui-widget-enabled {
+  background-color: #fff;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .oo-ui-inputWidget-input {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
 .oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-handle {
   color: #72777d;
   text-shadow: 0 1px 1px #fff;
   cursor: default;
   white-space: nowrap;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   width: auto;
   max-width: 100%;
   height: 1.7em;
   color: #222;
   padding-right: 1.5375em;
   -webkit-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
-     -moz-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
-          transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+  -moz-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+  transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
 }
 .oo-ui-tagItemWidget.oo-ui-widget-enabled:hover {
   background-color: #fff;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-capsuleMultiselectWidget-handle:last-child {
   margin-right: 0;
   background-color: #fff;
   cursor: text;
   -webkit-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
-     -moz-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
-          transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+  -moz-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+  transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-widget-enabled:hover .oo-ui-capsuleMultiselectWidget-handle {
   border-color: #72777d;
   cursor: default;
   white-space: nowrap;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   width: auto;
   max-width: 100%;
   height: 1.7em;
   color: #222;
   padding-right: 1.5375em;
   -webkit-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
-     -moz-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
-          transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+  -moz-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+  transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
 }
 .oo-ui-capsuleItemWidget.oo-ui-widget-enabled:hover {
   background-color: #fff;
index 2b2f2ca..a2e6e34 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.21.0
+ * OOjs UI v0.21.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-04-11T22:51:05Z
+ * Date: 2017-04-18T23:32:49Z
  */
 ( function ( OO ) {
 
@@ -4713,6 +4713,9 @@ OO.ui.TagItemWidget.prototype.isValid = function () {
  * @constructor
  * @param {Object} config Configuration object
  * @cfg {Object} [input] Configuration options for the input widget
+ * @cfg {OO.ui.InputWidget} [inputWidget] An optional input widget. If given, it will
+ *  replace the input widget used in the TagMultiselectWidget. If not given,
+ *  TagMultiselectWidget creates its own.
  * @cfg {boolean} [inputPosition='inline'] Position of the input. Options are:
  *     - inline: The input is invisible, but exists inside the tag list, so
  *             the user types into the tag groups to add tags.
@@ -4802,14 +4805,17 @@ OO.ui.TagMultiselectWidget = function OoUiTagMultiselectWidget( config ) {
        // Initialize
        this.$element
                .addClass( 'oo-ui-tagMultiselectWidget' )
-               .addClass( 'oo-ui-tagMultiselectWidget-inputPosition-' + this.inputPosition )
                .append( this.$handle );
 
        if ( this.hasInput ) {
-               this.input = new OO.ui.TextInputWidget( $.extend( {
-                       placeholder: config.placeholder,
-                       classes: [ 'oo-ui-tagMultiselectWidget-input' ]
-               }, config.input ) );
+               if ( config.inputWidget ) {
+                       this.input = config.inputWidget;
+               } else {
+                       this.input = new OO.ui.TextInputWidget( $.extend( {
+                               placeholder: config.placeholder,
+                               classes: [ 'oo-ui-tagMultiselectWidget-input' ]
+                       }, config.input ) );
+               }
                this.input.setDisabled( this.isDisabled() );
 
                inputEvents = {
@@ -4828,8 +4834,11 @@ OO.ui.TagMultiselectWidget = function OoUiTagMultiselectWidget( config ) {
                        // in the case the widget is outline so it can
                        // stretch all the way if the widet is wide
                        this.input.$element.css( 'max-width', 'inherit' );
-                       this.$element.append( this.input.$element );
+                       this.$element
+                               .addClass( 'oo-ui-tagMultiselectWidget-outlined' )
+                               .append( this.input.$element );
                } else {
+                       this.$element.addClass( 'oo-ui-tagMultiselectWidget-inlined' );
                        // HACK: When the widget is using 'inline' input, the
                        // behavior needs to only use the $input itself
                        // so we style and size it accordingly (otherwise
@@ -5155,11 +5164,9 @@ OO.ui.TagMultiselectWidget.prototype.isDuplicateData = function ( data ) {
  * Check whether a given value is allowed to be added
  *
  * @param {string|Object} data Requested value
- * @return {boolean} Value exists in the allowed values list
+ * @return {boolean} Value is allowed
  */
 OO.ui.TagMultiselectWidget.prototype.isAllowedData = function ( data ) {
-       var hash = OO.getHash( data );
-
        if ( this.allowArbitrary ) {
                return true;
        }
@@ -5174,7 +5181,7 @@ OO.ui.TagMultiselectWidget.prototype.isAllowedData = function ( data ) {
        // Check with allowed values
        if (
                this.getAllowedValues().some( function ( value ) {
-                       return hash === OO.getHash( value );
+                       return data === value;
                } )
        ) {
                return true;
@@ -5865,11 +5872,15 @@ OO.ui.MenuTagMultiselectWidget.prototype.getMenu = function () {
 };
 
 /**
- * @inheritdoc
+ * Get the allowed values list
+ *
+ * @return {string[]} Allowed data values
  */
-OO.ui.MenuTagMultiselectWidget.prototype.isAllowedData = function ( data ) {
-       return OO.ui.MenuTagMultiselectWidget.parent.prototype.isAllowedData.call( this, data ) &&
-               !!this.menu.getItemFromData( data );
+OO.ui.MenuTagMultiselectWidget.prototype.getAllowedValues = function () {
+       var menuDatas = this.menu.getItems().map( function ( menuItem ) {
+               return menuItem.getData();
+       } );
+       return this.allowedValues.concat( menuDatas );
 };
 
 /**
index 013d52d..c9c4c1b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.21.0
+ * OOjs UI v0.21.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-04-11T22:51:10Z
+ * Date: 2017-04-18T23:32:54Z
  */
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
   background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
@@ -17,8 +17,8 @@
 }
 .oo-ui-window-frame {
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-window-content {
   position: absolute;
@@ -34,9 +34,9 @@
 .oo-ui-window-foot {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-window-body {
   margin: 0;
@@ -56,8 +56,8 @@
   left: 0;
   right: 0;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-dialog-content > .oo-ui-window-head {
   overflow: hidden;
   background-color: rgba(255, 255, 255, 0.5);
   opacity: 0;
   -webkit-transition: opacity 250ms ease;
-     -moz-transition: opacity 250ms ease;
-          transition: opacity 250ms ease;
+  -moz-transition: opacity 250ms ease;
+  transition: opacity 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
   background-color: #fff;
   opacity: 0;
   -webkit-transform: scale(0.5);
-     -moz-transform: scale(0.5);
-      -ms-transform: scale(0.5);
-          transform: scale(0.5);
+  -moz-transform: scale(0.5);
+  -ms-transform: scale(0.5);
+  transform: scale(0.5);
   -webkit-transition: all 250ms ease;
-     -moz-transition: all 250ms ease;
-          transition: all 250ms ease;
+  -moz-transition: all 250ms ease;
+  transition: all 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
   opacity: 1;
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
   opacity: 1;
   -webkit-transform: scale(1);
-     -moz-transform: scale(1);
-      -ms-transform: scale(1);
-          transform: scale(1);
+  -moz-transform: scale(1);
+  -ms-transform: scale(1);
+  transform: scale(1);
 }
 .oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
   top: 1em;
index 1cb55d6..f6828e2 100644 (file)
@@ -1,20 +1,20 @@
 /*!
- * OOjs UI v0.21.0
+ * OOjs UI v0.21.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-04-11T22:51:10Z
+ * Date: 2017-04-18T23:32:54Z
  */
 .oo-ui-window {
   background: transparent;
 }
 .oo-ui-window-frame {
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-window-content {
   position: absolute;
@@ -30,9 +30,9 @@
 .oo-ui-window-foot {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-window-body {
   margin: 0;
@@ -52,8 +52,8 @@
   left: 0;
   right: 0;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-dialog-content > .oo-ui-window-head {
   overflow: hidden;
   margin-right: 0;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+  margin-left: 0;
+  border: 0;
   border-radius: 0;
+  padding: 0;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
   line-height: 3.4375em;
   text-align: center;
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled .oo-ui-buttonElement-button:hover {
+  background-color: #f8f9fa;
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled .oo-ui-buttonElement-button:active {
+  background-color: #c8ccd1;
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover,
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-  background-color: rgba(8, 126, 204, 0.05);
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled .oo-ui-buttonElement-button:focus {
+  box-shadow: inset 0 0 0 1px #36c, 0 0 0 1px #36c;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive .oo-ui-buttonElement-button:hover,
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive .oo-ui-buttonElement-button:hover {
+  background-color: #eaf3ff;
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active,
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive .oo-ui-buttonElement-button:active,
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive .oo-ui-buttonElement-button:active {
   background-color: rgba(8, 126, 204, 0.1);
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label {
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label {
   font-weight: bold;
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button:hover {
+  background-color: #fbe8e7;
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button:active {
   background-color: rgba(212, 83, 83, 0.1);
 }
 .oo-ui-processDialog-location {
   background-color: rgba(255, 255, 255, 0.5);
   opacity: 0;
   -webkit-transition: opacity 250ms;
-     -moz-transition: opacity 250ms;
-          transition: opacity 250ms;
+  -moz-transition: opacity 250ms;
+  transition: opacity 250ms;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
   background-color: #fff;
   opacity: 0;
   -webkit-transform: scale(0.5);
-     -moz-transform: scale(0.5);
-      -ms-transform: scale(0.5);
-          transform: scale(0.5);
+  -moz-transform: scale(0.5);
+  -ms-transform: scale(0.5);
+  transform: scale(0.5);
   -webkit-transition: all 250ms;
-     -moz-transition: all 250ms;
-          transition: all 250ms;
+  -moz-transition: all 250ms;
+  transition: all 250ms;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
   opacity: 1;
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
   opacity: 1;
   -webkit-transform: scale(1);
-     -moz-transform: scale(1);
-      -ms-transform: scale(1);
-          transform: scale(1);
+  -moz-transform: scale(1);
+  -ms-transform: scale(1);
+  transform: scale(1);
 }
 .oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
   top: 1em;
index b23949f..c955919 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.21.0
+ * OOjs UI v0.21.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-04-11T22:51:05Z
+ * Date: 2017-04-18T23:32:49Z
  */
 ( function ( OO ) {
 
index e3e80d8..b4418e5 100644 (file)
@@ -121,7 +121,8 @@ img {
        margin: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
-#toc {
+#toc,
+.toc {
        background-color: #f9f9f9;
        border: 1pt solid #aaa;
        padding: 5px;
index 194b1b2..7602465 100644 (file)
@@ -4,6 +4,20 @@
        z-index: auto;
        max-width: 650px;
 
+       &.oo-ui-menuSelectWidget-invisible {
+               display: block;
+       }
+
+       &-noresults {
+               display: none;
+               padding: 0.5em;
+               color: #666;
+
+               .oo-ui-menuSelectWidget-invisible & {
+                       display: inline-block;
+               }
+       }
+
        &-body {
                max-height: 70vh;
        }
index 1f3d343..4914dd9 100644 (file)
@@ -11,7 +11,6 @@
        &-header {
                border-bottom: 1px solid #c8ccd1;
                background: #f8f9fa;
-               overflow: hidden;
 
                &-highlight {
                        width: 1em;
index 7371fdd..f1b6871 100644 (file)
@@ -1,6 +1,11 @@
 .mw-rcfilters-ui-filterTagMultiselectWidget {
        max-width: none;
 
+       .oo-ui-tagMultiselectWidget-input input {
+               // Make sure this uses the interface direction, not the content direction
+               direction: ltr;
+       }
+
        &.oo-ui-widget-enabled .oo-ui-tagMultiselectWidget-handle {
                border: 1px solid #a2a9b1;
                border-bottom: 0;
index f52b7ff..dc8b013 100644 (file)
@@ -2,16 +2,4 @@
        width: 100%;
        // Make sure this uses the interface direction, not the content direction
        direction: ltr;
-
-       &-search {
-               max-width: none;
-               margin-top: -1px;
-
-               input {
-                       // We need to reiterate the directionality
-                       // for the input as well to literally override
-                       // a MediaWiki CSS rule that turns it 'ltr'
-                       direction: ltr;
-               }
-       }
 }
index ec85df9..748eea8 100644 (file)
                        }
                );
 
+               this.noResults = new OO.ui.LabelWidget( {
+                       label: mw.msg( 'rcfilters-filterlist-noresults' ),
+                       classes: [ 'mw-rcfilters-ui-filterFloatingMenuSelectWidget-noresults' ]
+               } );
+
                this.$element
                        .addClass( 'mw-rcfilters-ui-filterFloatingMenuSelectWidget' )
                        .append(
                                this.$body
-                                       .append( header.$element, this.$group )
+                                       .append( header.$element, this.$group, this.noResults.$element )
                        );
 
                if ( this.$footer ) {
index 1e0c8d5..616608e 100644 (file)
 
        OO.inheritClass( mw.rcfilters.ui.FilterItemHighlightButton, OO.ui.PopupButtonWidget );
 
+       /* Static Properties */
+
+       /**
+        * @static
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterItemHighlightButton.static.cancelButtonMouseDownEvents = true;
+
        /* Methods */
 
        /**
index b46c069..bda537f 100644 (file)
                        label: $label,
                        align: 'inline'
                } );
-
                // Event
                this.model.connect( this, { update: 'onModelUpdate' } );
                this.model.getGroupModel().connect( this, { update: 'onGroupModelUpdate' } );
+               // HACK: Prevent defaults on 'click' for the label so it
+               // doesn't steal the focus away from the input. This means
+               // we can continue arrow-movement after we click the label
+               // and is consistent with the checkbox *itself* also preventing
+               // defaults on 'click' as well.
+               layout.$label.on( 'click', false );
 
                this.$element
                        .addClass( 'mw-rcfilters-ui-filterMenuOptionWidget' )
index cfffc65..f79e013 100644 (file)
@@ -18,6 +18,7 @@
 
                this.controller = controller;
                this.model = model;
+               this.selected = false;
 
                mw.rcfilters.ui.FilterTagItemWidget.parent.call( this, $.extend( {
                        data: this.model.getName(),
                }
        };
 
+       /**
+        * Get the selected state of this widget
+        *
+        * @return {boolean} Tag is selected
+        */
+       mw.rcfilters.ui.FilterTagItemWidget.prototype.isSelected = function () {
+               return this.selected;
+       };
+
        /**
         * Get item name
         *
index 2461929..6fd3585 100644 (file)
                } else {
                        // Clear selection
                        this.getMenu().selectItem( null );
+                       this.selectTag( null );
                }
        };
 
         */
        mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onMenuChoose = function ( item ) {
                this.controller.toggleFilterSelect( item.model.getName() );
+
+               // Select the tag if it exists, or reset selection otherwise
+               this.selectTag( this.getItemFromData( item.model.getName() ) );
+
+               this.focus();
        };
 
        /**
         */
        mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onTagSelect = function ( tagItem ) {
                var widget = this,
-                       menuOption = this.menu.getItemFromData( tagItem.getData() );
+                       menuOption = this.menu.getItemFromData( tagItem.getData() ),
+                       oldInputValue = this.input.getValue();
 
                // Reset input
                this.input.setValue( '' );
                mw.rcfilters.ui.FilterTagMultiselectWidget.parent.prototype.onTagSelect.call( this, tagItem );
 
                this.menu.selectItem( menuOption );
+               this.selectTag( tagItem );
 
                // Scroll to the item
-               // We're binding a 'once' to the itemVisibilityChange event
-               // so this happens when the menu is ready after the items
-               // are visible again, in case this is done right after the
-               // user filtered the results
-               this.getMenu().once(
-                       'itemVisibilityChange',
-                       function () { widget.scrollToTop( menuOption.$element ); }
-               );
+               if ( oldInputValue ) {
+                       // We're binding a 'once' to the itemVisibilityChange event
+                       // so this happens when the menu is ready after the items
+                       // are visible again, in case this is done right after the
+                       // user filtered the results
+                       this.getMenu().once(
+                               'itemVisibilityChange',
+                               function () { widget.scrollToTop( menuOption.$element ); }
+                       );
+               } else {
+                       this.scrollToTop( menuOption.$element );
+               }
        };
 
+       /**
+        * Select a tag by reference. This is what OO.ui.SelectWidget is doing.
+        * If no items are given, reset selection from all.
+        *
+        * @param {mw.rcfilters.ui.FilterTagItemWidget} [item] Tag to select,
+        *  omit to deselect all
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.selectTag = function ( item ) {
+               var i, len, selected;
+
+               for ( i = 0, len = this.items.length; i < len; i++ ) {
+                       selected = this.items[ i ] === item;
+                       if ( this.items[ i ].isSelected() !== selected ) {
+                               this.items[ i ].toggleSelected( selected );
+                       }
+               }
+       };
        /**
         * @inheritdoc
         */
index da2c08f..5f6eb25 100644 (file)
@@ -1,4 +1,5 @@
 #toc.tochidden,
+.toc.tochidden,
 .toctoggle {
        display: none;
 }
index ad06b34..e0df772 100644 (file)
@@ -1,7 +1,8 @@
 /**
- * Code in this file MUST work on even the most ancient of browsers!
+ * This file is where we decide whether to initialise the Grade A run-time.
  *
- * This file is where we decide whether to initialise the modern run-time.
+ * - Beware: This file MUST parse without errors on even the most ancient of browsers!
+ * - Beware: Do not call mwNow before the isCompatible() check.
  */
 
 /* global mw, $VARS, $CODE */
@@ -18,9 +19,7 @@ var mwPerformance = ( window.performance && performance.mark ) ? performance : {
                        function () { return Date.now(); };
        }() ),
        // eslint-disable-next-line no-unused-vars
-       mediaWikiLoadStart = mwNow();
-
-mwPerformance.mark( 'mwLoadStart' );
+       mediaWikiLoadStart;
 
 /**
  * See <https://www.mediawiki.org/wiki/Compatibility#Browsers>
@@ -153,6 +152,9 @@ function isCompatible( str ) {
                };
        }
 
+       mediaWikiLoadStart = mwNow();
+       mwPerformance.mark( 'mwLoadStart' );
+
        script = document.createElement( 'script' );
        script.src = $VARS.baseModulesUri;
        script.onload = script.onreadystatechange = function () {
index b0f6bff..7ff6b47 100644 (file)
@@ -2,7 +2,7 @@ class EditPage
   include PageObject
 
   text_area(:edit_page_content, id: 'wpTextbox1')
-  button(:preview_button, id: 'wpPreview')
-  button(:show_changes_button, id: 'wpDiff')
-  button(:save_button, id: 'wpSave')
+  button(:preview_button, css: '#wpPreview > button')
+  button(:show_changes_button, css: '#wpDiff > button')
+  button(:save_button, css: '#wpSave > button')
 end
index 55bd276..a947484 100644 (file)
                                                        );
                                                } );
                                                // Force animations to stop to give the next test a clean start
+                                               $.timers = [];
                                                $.fx.stop();
 
                                                throw new Error( 'Unfinished animations: ' + timers );
index 70a7e35..8786993 100644 (file)
@@ -7,9 +7,9 @@
        } ) );
 
        QUnit.asyncTest( 'toggleToc', function ( assert ) {
-               var tocHtml, $toggleLink, $tocList;
+               var tocHtml, $toc, $toggleLink, $tocList;
 
-               assert.strictEqual( $( '#toc' ).length, 0, 'There is no table of contents on the page at the beginning' );
+               assert.strictEqual( $( '.toc' ).length, 0, 'There is no table of contents on the page at the beginning' );
 
                tocHtml = '<div id="toc" class="toc">' +
                        '<div id="toctitle" class="toctitle">' +
                        '</div>' +
                        '<ul><li></li></ul>' +
                        '</div>';
-               $( tocHtml ).appendTo( '#qunit-fixture' );
+               $toc = $( tocHtml );
+               $( '#qunit-fixture' ).append( $toc );
                mw.hook( 'wikipage.content' ).fire( $( '#qunit-fixture' ) );
 
-               $tocList = $( '#toc ul:first' );
-               $toggleLink = $( '#toc .togglelink' );
+               $tocList = $toc.find( 'ul:first' );
+               $toggleLink = $toc.find( '.togglelink' );
 
                assert.strictEqual( $toggleLink.length, 1, 'Toggle link is added to the table of contents' );