Merge "resourceloader: Remove 'wgMainPageTitle' mw.config key"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 16 Apr 2019 09:40:24 +0000 (09:40 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 16 Apr 2019 09:40:24 +0000 (09:40 +0000)
50 files changed:
RELEASE-NOTES-1.34
includes/MediaWiki.php
includes/ServiceWiring.php
includes/Title.php
includes/api/i18n/zh-hant.json
includes/clientpool/SquidPurgeClient.php
includes/db/DatabaseOracle.php
includes/installer/i18n/ko.json
includes/parser/Parser.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderImage.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/specialpage/RedirectSpecialPage.php
includes/specials/SpecialImport.php
includes/specials/SpecialRecentChanges.php
includes/specials/SpecialWatchlist.php
includes/title/MediaWikiTitleCodec.php
includes/title/TitleValue.php
languages/i18n/be-tarask.json
languages/i18n/ca.json
languages/i18n/diq.json
languages/i18n/el.json
languages/i18n/fr.json
languages/i18n/fy.json
languages/i18n/hr.json
languages/i18n/hyw.json
languages/i18n/ko.json
languages/i18n/mk.json
languages/i18n/nb.json
resources/src/jquery/jquery.lengthLimit.js
resources/src/mediawiki.String.js
resources/src/mediawiki.action/mediawiki.action.delete.file.js
resources/src/mediawiki.action/mediawiki.action.delete.js
resources/src/mediawiki.action/mediawiki.action.history.styles.less
resources/src/mediawiki.content.json.less
resources/src/mediawiki.htmlform.ooui.styles.less
resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less
resources/src/mediawiki.skinning/elements.css
resources/src/mediawiki.special.revisionDelete.js
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/includes/Permissions/PermissionManagerTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/api/ApiQueryRecentChangesIntegrationTest.php
tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderContextTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderOOUIImageModuleTest.php
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
tests/phpunit/includes/title/TitleValueTest.php

index 83da301..219cba4 100644 (file)
@@ -89,6 +89,10 @@ because of Phabricator reports.
 * ObjectFactory class, deprecated in 1.31, has been removed.
 * HWLDFWordAccumudlator class, deprecated in 1.28, has been removed.
 * XMPInfo, XMPReader and XMPValidate, deprecated in 1.32, have been removed.
+* The RedirectSpecialPage::execute method could sometimes return a Title object.
+  This behavior was removed, and the method now matches the parent signature
+  (SpecialPage::execute) which is to return HTML string or void.
+  To obtain the destination title, use RedirectSpecialPage::getRedirect.
 
 === Deprecations in 1.34 ===
 * The MWNamespace class is deprecated. Use MediaWikiServices::getNamespaceInfo.
index 990ed4e..69bafaf 100644 (file)
@@ -262,7 +262,7 @@ class MediaWiki {
                                                $target = $specialPage->getRedirect( $subpage );
                                                // target can also be true. We let that case fall through to normal processing.
                                                if ( $target instanceof Title ) {
-                                                       $query = $specialPage->getRedirectQuery() ?: [];
+                                                       $query = $specialPage->getRedirectQuery( $subpage ) ?: [];
                                                        $request = new DerivativeRequest( $this->context->getRequest(), $query );
                                                        $request->setRequestURL( $this->context->getRequest()->getRequestURL() );
                                                        $this->context->setRequest( $request );
index c55fc68..d39a0c7 100644 (file)
@@ -665,7 +665,8 @@ return [
                        $services->getContentLanguage(),
                        $services->getGenderCache(),
                        $services->getMainConfig()->get( 'LocalInterwikis' ),
-                       $services->getInterwikiLookup()
+                       $services->getInterwikiLookup(),
+                       $services->getNamespaceInfo()
                );
        },
 
index 12ab532..27baeb2 100644 (file)
@@ -246,6 +246,8 @@ class Title implements LinkTarget, IDBAccessObject {
         * unless $forceClone is "clone". If $forceClone is "clone" and the given TitleValue
         * is already a Title instance, that instance is copied using the clone operator.
         *
+        * @deprecated since 1.34, use newFromLinkTarget or castFromLinkTarget
+        *
         * @param TitleValue $titleValue Assumed to be safe.
         * @param string $forceClone set to NEW_CLONE to ensure a fresh instance is returned.
         *
@@ -283,6 +285,17 @@ class Title implements LinkTarget, IDBAccessObject {
                );
        }
 
+       /**
+        * Same as newFromLinkTarget, but if passed null, returns null.
+        *
+        * @param LinkTarget|null $linkTarget Assumed to be safe (if not null).
+        *
+        * @return Title|null
+        */
+       public static function castFromLinkTarget( $linkTarget ) {
+               return $linkTarget ? self::newFromLinkTarget( $linkTarget ) : null;
+       }
+
        /**
         * Create a new Title from text, such as what one would find in a link. De-
         * codes any HTML entities in the text.
index 225db87..09b92d4 100644 (file)
        "apihelp-json-summary": "使用 JSON 格式輸出資料。",
        "apihelp-json-param-callback": "若有指定,將輸出包在指定的函式呼叫。出於安全考量,會限制所有使用者特定資料。",
        "apihelp-json-param-utf8": "若有指定的話,將多數(並非全部)非 ASCII 字元編碼成 UTF-8,而不是以十六進位轉義序列來取代掉。預設是當 <var>formatversion</var> 不是 <kbd>1</kbd> 時。",
-       "apihelp-json-param-ascii": "若有指定,編碼所有使用十六進位跳脫序列的非 ASCII。預設當 <var>formatversion</var> 為 <kbd>1</kbd> 時。",
+       "apihelp-json-param-ascii": "若有指定,編碼所有使用十六進位跳脫序列的非 ASCII 字碼。預設當 <var>formatversion</var> 為 <kbd>1</kbd> 時。",
        "apihelp-json-param-formatversion": "輸出格式:\n;1:向下相容格式(XML 式布林值,用於內容節點的 <samp>*</samp> 鍵、其它)。\n;2:現代格式。\n;latest:使用最新格式(目前為 <kbd>2</kbd>)可能會不帶警告作更改。",
        "apihelp-jsonfm-summary": "使用 JSON 格式輸出資料 (使用 HTML 格式顯示)。",
        "apihelp-none-summary": "不輸出。",
index 49d9d1c..75f51ef 100644 (file)
@@ -68,9 +68,8 @@ class SquidPurgeClient {
 
        /**
         * @param string $server
-        * @param array $options
         */
-       public function __construct( $server, $options = [] ) {
+       public function __construct( $server ) {
                $parts = explode( ':', $server, 2 );
                $this->host = $parts[0];
                $this->port = $parts[1] ?? 80;
index dedaf21..f4753d6 100644 (file)
@@ -470,7 +470,7 @@ class DatabaseOracle extends Database {
                $this->mLastResult = $stmt = oci_parse( $this->conn, $sql );
                if ( $stmt === false ) {
                        $e = oci_error( $this->conn );
-                       $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
+                       $this->reportQueryError( $e['message'], $e['code'], $sql, $fname );
 
                        return false;
                }
@@ -496,7 +496,7 @@ class DatabaseOracle extends Database {
                                $val = $this->getVerifiedUTF8( $val );
                                if ( oci_bind_by_name( $stmt, ":$col", $val, -1, SQLT_CHR ) === false ) {
                                        $e = oci_error( $stmt );
-                                       $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
+                                       $this->reportQueryError( $e['message'], $e['code'], $sql, $fname );
 
                                        return false;
                                }
@@ -530,7 +530,7 @@ class DatabaseOracle extends Database {
                if ( oci_execute( $stmt, $this->execFlags() ) === false ) {
                        $e = oci_error( $stmt );
                        if ( !$this->ignoreDupValOnIndex || $e['code'] != '1' ) {
-                               $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
+                               $this->reportQueryError( $e['message'], $e['code'], $sql, $fname );
 
                                return false;
                        } else {
index 256a779..dca5ef8 100644 (file)
@@ -72,7 +72,7 @@
        "config-apc": "[https://www.php.net/apc APC]가 설치되었습니다",
        "config-apcu": "[https://www.php.net/apcu APCu]가 설치되었습니다",
        "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache]가 설치되었습니다",
-       "config-no-cache-apcu": "<strong>경고:</strong> [https://www.php.net/apcu APCu] 또는 [https://www.iis.net/downloads/microsoft/wincache-extension WinCache]를 찾을 수 없습니다.",
+       "config-no-cache-apcu": "<strong>경고:</strong> [https://www.php.net/apcu APCu] 또는 [https://www.iis.net/downloads/microsoft/wincache-extension WinCache]를 찾을 수 없습니다. 오브젝트 캐시를 사용할 수 없습니다.",
        "config-mod-security": "<strong>경고:</strong> 웹 서버에 [https://modsecurity.org/ mod_security]가 허용되었습니다. 잘못 설정된 경우 미디어위키나 사용자가 임의의 내용을 게시할 수 있는 다른 소프트웨어에 대한 문제를 일으킬 수 있습니다.\n[https://modsecurity.org/documentation/ mod_security] 문서를 참고하거나 임의의 오류가 발생할 경우 호스트의 지원 요청에 문의하십시오.",
        "config-diff3-bad": "GNU diff3를 찾을 수 없습니다.",
        "config-git": "Git 버전 관리 소프트웨어를 찾았습니다: <code>$1</code>.",
index 91de550..c28d842 100644 (file)
@@ -2607,7 +2607,7 @@ class Parser {
                        // @TODO: disallow this word on all namespaces
                        $this->nsInfo->isContent( $this->mTitle->getNamespace() )
                ) {
-                       if ( $this->mRevisionId ) {
+                       if ( $this->mRevisionId || $this->mOptions->getSpeculativeRevId() ) {
                                return '-';
                        } else {
                                $this->mOutput->setFlag( 'vary-revision-exists' );
index 7afbfb2..58152ea 100644 (file)
@@ -84,9 +84,11 @@ class ResourceLoaderContext implements MessageLocalizer {
 
                $this->skin = $request->getRawVal( 'skin' );
                $skinnames = Skin::getSkinNames();
-               // If no skin is specified, or we don't recognize the skin, use the default skin
                if ( !$this->skin || !isset( $skinnames[$this->skin] ) ) {
-                       $this->skin = $this->getConfig()->get( 'DefaultSkin' );
+                       // The 'skin' parameter is required. (Not yet enforced.)
+                       // For requests without a known skin specified,
+                       // use MediaWiki's 'fallback' skin for skin-specific decisions.
+                       $this->skin = 'fallback';
                }
        }
 
@@ -170,7 +172,9 @@ class ResourceLoaderContext implements MessageLocalizer {
                        $lang = $this->getRequest()->getRawVal( 'lang', '' );
                        // Stricter version of RequestContext::sanitizeLangCode()
                        if ( !Language::isValidBuiltInCode( $lang ) ) {
-                               $lang = $this->getConfig()->get( 'LanguageCode' );
+                               // The 'lang' parameter is required. (Not yet enforced.)
+                               // If omitted, localise with the dummy language code.
+                               $lang = 'qqx';
                        }
                        $this->language = $lang;
                }
index 27fa5ad..2e2da70 100644 (file)
@@ -40,6 +40,21 @@ class ResourceLoaderImage {
                'jpg' => 'image/jpg',
        ];
 
+       /** @var string */
+       private $name;
+       /** @var string */
+       private $module;
+       /** @var string|array */
+       private $descriptor;
+       /** @var string */
+       private $basePath;
+       /** @var array */
+       private $variants;
+       /** @var string|null */
+       private $defaultColor;
+       /** @var string */
+       private $extension;
+
        /**
         * @param string $name Image name
         * @param string $module Module name
index 9fad348..276d9a1 100644 (file)
@@ -82,7 +82,7 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
         *  getPages.
         */
        public function __construct( array $options = null ) {
-               if ( is_null( $options ) ) {
+               if ( $options === null ) {
                        return;
                }
 
index 01a88f4..c28b89e 100644 (file)
@@ -35,23 +35,19 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
 
        /**
         * @param string|null $subpage
-        * @return Title|bool
         */
        public function execute( $subpage ) {
                $redirect = $this->getRedirect( $subpage );
-               $query = $this->getRedirectQuery();
-               // Redirect to a page title with possible query parameters
+               $query = $this->getRedirectQuery( $subpage );
+
                if ( $redirect instanceof Title ) {
+                       // Redirect to a page title with possible query parameters
                        $url = $redirect->getFullUrlForRedirect( $query );
                        $this->getOutput()->redirect( $url );
-
-                       return $redirect;
                } elseif ( $redirect === true ) {
                        // Redirect to index.php with query parameters
                        $url = wfAppendQuery( wfScript( 'index' ), $query );
                        $this->getOutput()->redirect( $url );
-
-                       return $redirect;
                } else {
                        $this->showNoRedirectPage();
                }
@@ -70,9 +66,10 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
         * Return part of the request string for a special redirect page
         * This allows passing, e.g. action=history to Special:Mypage, etc.
         *
+        * @param string|null $subpage
         * @return array|bool
         */
-       public function getRedirectQuery() {
+       public function getRedirectQuery( $subpage ) {
                $params = [];
                $request = $this->getRequest();
 
index aaa405a..302a55f 100644 (file)
@@ -24,6 +24,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\Permissions\PermissionManager;
+
 /**
  * MediaWiki page data importer
  *
@@ -83,11 +85,11 @@ class SpecialImport extends SpecialPage {
                # getUserPermissionsErrors() might actually be used for, hence the 'ns-specialprotected'
                $errors = wfMergeErrorArrays(
                        $this->getPageTitle()->getUserPermissionsErrors(
-                               'import', $user, true,
+                               'import', $user, PermissionManager::RIGOR_FULL,
                                [ 'ns-specialprotected', 'badaccess-group0', 'badaccess-groups' ]
                        ),
                        $this->getPageTitle()->getUserPermissionsErrors(
-                               'importupload', $user, true,
+                               'importupload', $user, PermissionManager::RIGOR_FULL,
                                [ 'ns-specialprotected', 'badaccess-group0', 'badaccess-groups' ]
                        )
                );
index c8f65c1..d0846b3 100644 (file)
@@ -515,15 +515,16 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                if ( $this->isStructuredFilterUiEnabled() ) {
                        $rcfilterContainer = Html::element(
                                'div',
-                               [ 'class' => 'rcfilters-container' ]
+                               // TODO: Remove deprecated rcfilters-container class
+                               [ 'class' => 'rcfilters-container mw-rcfilters-container' ]
                        );
 
                        $loadingContainer = Html::rawElement(
                                'div',
-                               [ 'class' => 'rcfilters-spinner' ],
+                               [ 'class' => 'mw-rcfilters-spinner' ],
                                Html::element(
                                        'div',
-                                       [ 'class' => 'rcfilters-spinner-bounce' ]
+                                       [ 'class' => 'mw-rcfilters-spinner-bounce' ]
                                )
                        );
 
@@ -531,7 +532,8 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        $this->getOutput()->addHTML(
                                Html::rawElement(
                                        'div',
-                                       [ 'class' => 'rcfilters-head' ],
+                                       // TODO: Remove deprecated rcfilters-head class
+                                       [ 'class' => 'rcfilters-head mw-rcfilters-head' ],
                                        $rcfilterContainer . $rcoptions
                                )
                        );
index 6defc9d..c6d9fc7 100644 (file)
@@ -699,15 +699,16 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                if ( $this->isStructuredFilterUiEnabled() ) {
                        $rcfilterContainer = Html::element(
                                'div',
-                               [ 'class' => 'rcfilters-container' ]
+                               // TODO: Remove deprecated rcfilters-container class
+                               [ 'class' => 'rcfilters-container mw-rcfilters-container' ]
                        );
 
                        $loadingContainer = Html::rawElement(
                                'div',
-                               [ 'class' => 'rcfilters-spinner' ],
+                               [ 'class' => 'mw-rcfilters-spinner' ],
                                Html::element(
                                        'div',
-                                       [ 'class' => 'rcfilters-spinner-bounce' ]
+                                       [ 'class' => 'mw-rcfilters-spinner-bounce' ]
                                )
                        );
 
@@ -715,7 +716,8 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        $this->getOutput()->addHTML(
                                Html::rawElement(
                                        'div',
-                                       [ 'class' => 'rcfilters-head' ],
+                                       // TODO: Remove deprecated rcfilters-head class
+                                       [ 'class' => 'rcfilters-head mw-rcfilters-head' ],
                                        $rcfilterContainer . $form
                                )
                        );
index adbea89..31a0222 100644 (file)
@@ -56,20 +56,35 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         */
        protected $interwikiLookup;
 
+       /**
+        * @var NamespaceInfo
+        */
+       protected $nsInfo;
+
        /**
         * @param Language $language The language object to use for localizing namespace names.
         * @param GenderCache $genderCache The gender cache for generating gendered namespace names
         * @param string[]|string $localInterwikis
         * @param InterwikiLookup|null $interwikiLookup
+        * @param NamespaceInfo|null $nsInfo
         */
        public function __construct( Language $language, GenderCache $genderCache,
-               $localInterwikis = [], $interwikiLookup = null
+               $localInterwikis = [], InterwikiLookup $interwikiLookup = null,
+               NamespaceInfo $nsInfo = null
        ) {
+               if ( !$interwikiLookup ) {
+                       wfDeprecated( __METHOD__ . ' with no InterwikiLookup argument', '1.34' );
+                       $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup();
+               }
+               if ( !$nsInfo ) {
+                       wfDeprecated( __METHOD__ . ' with no NamespaceInfo argument', '1.34' );
+                       $nsInfo = MediaWikiServices::getInstance()->getNamespaceInfo();
+               }
                $this->language = $language;
                $this->genderCache = $genderCache;
                $this->localInterwikis = (array)$localInterwikis;
-               $this->interwikiLookup = $interwikiLookup ?:
-                       MediaWikiServices::getInstance()->getInterwikiLookup();
+               $this->interwikiLookup = $interwikiLookup;
+               $this->nsInfo = $nsInfo;
        }
 
        /**
@@ -83,7 +98,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         */
        public function getNamespaceName( $namespace, $text ) {
                if ( $this->language->needsGenderDistinction() &&
-                       MWNamespace::hasGenderDistinction( $namespace )
+                       $this->nsInfo->hasGenderDistinction( $namespace )
                ) {
                        // NOTE: we are assuming here that the title text is a user name!
                        $gender = $this->genderCache->getGenderOf( $text, __METHOD__ );
@@ -149,13 +164,17 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         * @return TitleValue
         */
        public function parseTitle( $text, $defaultNamespace = NS_MAIN ) {
+               // Convert things like &eacute; &#257; or &#x3017; into normalized (T16952) text
+               $filteredText = Sanitizer::decodeCharReferencesAndNormalize( $text );
+
                // NOTE: this is an ugly cludge that allows this class to share the
                // code for parsing with the old Title class. The parser code should
                // be refactored to avoid this.
-               $parts = $this->splitTitleString( $text, $defaultNamespace );
+               $parts = $this->splitTitleString( $filteredText, $defaultNamespace );
 
-               // Relative fragment links are not supported by TitleValue
-               if ( $parts['dbkey'] === '' ) {
+               // Fragment-only is okay, but only with no namespace
+               if ( $parts['dbkey'] === '' &&
+               ( $parts['fragment'] === '' || $parts['namespace'] !== NS_MAIN ) ) {
                        throw new MalformedTitleException( 'title-invalid-empty', $text );
                }
 
index 698bc4f..722e5ef 100644 (file)
@@ -103,7 +103,8 @@ class TitleValue implements LinkTarget {
                // Sanity check, no full validation or normalization applied here!
                Assert::parameter( !preg_match( '/^_|[ \r\n\t]|_$/', $dbkey ), '$dbkey',
                        "invalid DB key '$dbkey'" );
-               Assert::parameter( $dbkey !== '', '$dbkey', 'should not be empty' );
+               Assert::parameter( $dbkey !== '' || ( $fragment !== '' && $namespace === NS_MAIN ),
+                       '$dbkey', 'should not be empty unless namespace is main and fragment is non-empty' );
 
                $this->namespace = $namespace;
                $this->dbkey = $dbkey;
index d1bfe0a..03f7a7b 100644 (file)
        "action-purge": "ачыстку кэшу гэтай старонкі",
        "action-apihighlimits": "ўжываньне падвышаных лімітаў у API-запытах",
        "action-autoconfirmed": "адсутнасьць абмежаваньня хуткасьці паводле IP-адрасу",
+       "action-bigdelete": "выдаленьне старонак зь вялікай гісторыяй",
        "nchanges": "$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|з апошняга візыту}}",
        "enhancedrc-history": "гісторыя",
        "categories": "Катэгорыі",
        "categories-submit": "Паказаць",
        "categoriespagetext": "{{PLURAL:$1|1=Наступная катэгорыя існуе ў вікі і можа|Наступныя катэгорыі існуюць у вікі і могуць}} выкарыстоўвацца ці не выкарыстоўвацца.\nГлядзіце таксама [[Special:WantedCategories|сьпіс запатрабаваных катэгорыяў]].",
-       "categoriesfrom": "Паказаць катэгорыі, пачынаючы з:",
+       "categoriesfrom": "Паказаць катэгорыі ад:",
        "deletedcontributions": "Выдалены ўнёсак удзельніка",
        "deletedcontributions-title": "Выдалены ўнёсак удзельніка",
        "sp-deletedcontributions-contribs": "унёсак",
index 99ee8dc..53d5b40 100644 (file)
        "page_first": "primera",
        "page_last": "última",
        "histlegend": "Simbologia: (act) = diferència amb la versió actual,\n(prev) = diferència amb la versió anterior, m = modificació menor",
-       "history-fieldset-title": "Cerca revisions",
+       "history-fieldset-title": "Filtra les revisions",
        "history-show-deleted": "Només revisions suprimides",
        "histfirst": "les més antigues",
        "histlast": "les més noves",
        "historysize": "({{PLURAL:$1|1 octet|$1 octets}})",
-       "historyempty": "(buit)",
+       "historyempty": "buit",
        "history-feed-title": "Historial de revisió",
        "history-feed-description": "Historial de revisió per a aquesta pàgina del wiki",
        "history-feed-item-nocomment": "$1 a $2",
index 5c94005..b10bd1d 100644 (file)
        "rcfilters-filtergroup-authorship": "Wayiriya iştırakan",
        "rcfilters-filter-editsbyself-label": "Vurnayışê şıma",
        "rcfilters-filter-editsbyself-description": "İştırakê şıma.",
-       "rcfilters-filter-editsbyother-label": "vurnayışê merdımanê binan",
+       "rcfilters-filter-editsbyother-label": "Vurnayışê merdımanê binan",
        "rcfilters-filter-editsbyother-description": "Bê vurnayışanê şıma vurnayışi pêro.",
        "rcfilters-filtergroup-userExpLevel": "Qeydê karberi u tecrube",
        "rcfilters-filter-user-experience-level-registered-label": "Qeydıni",
        "rcfilters-filter-user-experience-level-newcomer-label": "Ameyayeyê neweyi",
        "rcfilters-filter-user-experience-level-newcomer-description": "Karberê qeydınê ke 10 ra kemi vurnayışi ya zi 4 rocan ra fealiyetê xo estê.",
        "rcfilters-filter-user-experience-level-learner-label": "Musayoği",
-       "rcfilters-filter-user-experience-level-learner-description": "Cerbnayışê cı \"Newe ameyeni\" u arey \"Karberê wustay\" dê editorê qeydıni",
+       "rcfilters-filter-user-experience-level-learner-description": "Vurnayoğê qeydınê ke cerrebnayışê cı \"Neweameyoği\" û \"Karberê westay\"an miyan dero.",
        "rcfilters-filter-user-experience-level-experienced-label": "Karberê mısayeyi",
-       "rcfilters-filter-user-experience-level-experienced-description": "Editorê qeydıni ke 30 roce ra zeder aktivite u wayırê 500 ra zeder vurnayışa",
+       "rcfilters-filter-user-experience-level-experienced-description": "Vurnayoğê qeydınê ke 30 roce ra zêdêr fealiyet û wayirê 500 ra zêdêr vurnayışanê.",
        "rcfilters-filtergroup-automated": "İştırakê otomatiki",
        "rcfilters-filter-bots-label": "Bot",
        "rcfilters-filter-bots-description": "Terefê hacetanê otomatikan ra vurnayışi vıraziyayi.",
        "rcfilters-filter-watchlistactivity-seen-label": "Vuriyayışê ke vêniyê",
        "rcfilters-filtergroup-changetype": "Tewrê vurnayışi",
        "rcfilters-filter-pageedits-label": "Vuriyayışê pelan",
-       "rcfilters-filter-pageedits-description": "Zerrekê wiki, werênayış, vurnayışê şınasiya Kategoriye...",
+       "rcfilters-filter-pageedits-description": "Vurnayışê zerrekê wikiyi, werênayışi, şınasiya kategoriyan...",
        "rcfilters-filter-newpages-label": "Vıraştışê pelan",
        "rcfilters-filter-newpages-description": "Vurnayışê ke pelanê newiyab vırazenê.",
        "rcfilters-filter-categorization-label": "Vuriyayışê kategoriyan",
        "rcfilters-filter-categorization-description": "Kategoriyan ra qeydê cıkerdış u wedardışê pelan.",
        "rcfilters-filter-logactions-label": "Rocekê iştırakan",
-       "rcfilters-filter-logactions-description": "Aksiyonê xızmetkaran, hesab vıraştış, esternayışê pela, barkerdışi...",
+       "rcfilters-filter-logactions-description": "Karberiya xızmetkaran, vıraştışê hesaban, esterıtışê pelan, barkerdışi...",
        "rcfilters-filtergroup-lastRevision": "Çımraviyarnayışê tewr peyêni",
        "rcfilters-filter-lastrevision-label": "Çımraviyarnayışo peyên",
        "rcfilters-filter-lastrevision-description": "Tenya vurnayışê yew peleyo tewr peyên.",
        "rcfilters-filter-previousrevision-label": "Çımraviyarnayışo peyên niyo",
-       "rcfilters-filter-previousrevision-description": "Vurnayışê pêroyê ke \"Çımraviyarnayışo peyên\" niyo",
+       "rcfilters-filter-previousrevision-description": "Heme vurnayışê ke \"çımraviyarnayışo peyên\" niyê.",
        "rcfilters-filter-excluded": "Xarıc",
        "rcfilters-tag-prefix-namespace-inverted": "$1 <strong>:nê</strong>",
        "rcfilters-exclude-button-off": "Weçinayeyi ciya bıtepışê",
index d294b29..85b991b 100644 (file)
        "customcssprotected": "Δεν έχετε δικαιώματα για να επεξεργαστείτε αυτή τη σελίδα CSS, επειδή περιέχει προσωπικές ρυθμίσεις άλλου χρήστη.",
        "customjsonprotected": "Δεν έχετε δικαιώματα για να επεξεργαστείτε αυτή τη σελίδα JSON, επειδή περιέχει προσωπικές ρυθμίσεις άλλου χρήστη.",
        "customjsprotected": "Δεν έχετε δικαιώματα για να επεξεργαστείτε αυτή τη σελίδα JavaScript, επειδή περιέχει προσωπικές ρυθμίσεις άλλου χρήστη.",
+       "sitejsprotected": "Δεν έχετε την άδεια να επεξεργαστείτε αυτήν τη σελίδα JavaScript επειδή μπορεί να επηρεάσει όλους τους επισκέπτες.",
        "mycustomcssprotected": "Δεν έχετε άδεια για να επεξεργαστείτε αυτήν τη σελίδα CSS.",
        "mycustomjsonprotected": "Δεν έχετε άδεια για να επεξεργαστείτε αυτήν τη σελίδα JSON.",
        "mycustomjsprotected": "Δεν έχετε άδεια για να επεξεργαστείτε αυτήν τη σελίδα JavaScript.",
        "botpasswords-updated-body": "Το συνθηματικό για το ρομπότ με όνομα «$1» του χρήστη «$2» ενημερώθηκε.",
        "botpasswords-deleted-title": "Το συνθηματικό του ρομπότ διαγράφηκε",
        "botpasswords-deleted-body": "Το συνθηματικό για το όνομα μποτ \"$1\" του χρήστη \"$2\" διαγράφηκε.",
-       "botpasswords-newpassword": "Î\9f Î½Î­Î¿Ï\82 ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î³Î¹Î± Î½Î± Ï\83Ï\85νδεθείÏ\84ε Î¼Îµ Ï\84ο <strong>$1</strong> ÎµÎ¯Î½Î±Î¹ <strong>$2</strong>. <em>ΠαÏ\81ακαλοÏ\8dμε Ï\83ημειÏ\8eÏ\83Ï\84ε Ï\84ο Î³Î¹Î± Î¼ÎµÎ»Î»Î¿Î½Ï\84ική Î±Î½Î±Ï\86οÏ\81ά.</em><br />(Î\93ια Ï\80αλιά bot Ï\80οÏ\85 Î±Ï\80αιÏ\84οÏ\8dν Ï\84ο Ï\8cνομα Ï\83Ï\8dνδεÏ\83ηÏ\82 Î½Î± ÎµÎ¯Î½Î±Î¹ Ï\84ο Î¯Î´Î¹Î¿ Î¼Îµ Ï\84ο Ï\84ελικÏ\8c Ï\8cνομα Ï\87Ï\81ήÏ\83Ï\84η, Î¼Ï\80οÏ\81είÏ\84ε ÎµÏ\80ίÏ\83ηÏ\82 Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιήÏ\83εÏ\84ε Ï\84ο  <strong>$3</strong> Ï\89Ï\82 Ï\8cνομα Ï\87Ï\81ήÏ\83Ï\84η ÎºÎ±Î¹ <strong>$4</strong> Ï\89Ï\82 ÎºÏ\89δικό.)",
+       "botpasswords-newpassword": "Το Î½Î­Î¿ Ï\83Ï\85νθημαÏ\84ικÏ\8c Î³Î¹Î± Î½Î± Ï\83Ï\85νδεθείÏ\84ε Î¼Îµ Ï\84ο <strong>$1</strong> ÎµÎ¯Î½Î±Î¹ <strong>$2</strong>. <em>ΠαÏ\81ακαλοÏ\8dμε Ï\83ημειÏ\8eÏ\83Ï\84ε Ï\84ο Î³Î¹Î± Î¼ÎµÎ»Î»Î¿Î½Ï\84ική Î±Î½Î±Ï\86οÏ\81ά.</em><br />(Î\93ια Ï\80αλιά Ï\81ομÏ\80Ï\8cÏ\84 Ï\80οÏ\85 Î±Ï\80αιÏ\84οÏ\8dν Ï\84ο Ï\8cνομα Ï\83Ï\8dνδεÏ\83ηÏ\82 Î½Î± ÎµÎ¯Î½Î±Î¹ Ï\84ο Î¯Î´Î¹Î¿ Î¼Îµ Ï\84ο ÎµÎ½Î´ÎµÏ\87Ï\8cμενο Ï\8cνομα Ï\87Ï\81ήÏ\83Ï\84η, Î¼Ï\80οÏ\81είÏ\84ε ÎµÏ\80ίÏ\83ηÏ\82 Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιήÏ\83εÏ\84ε Ï\84ο <strong>$3</strong> Ï\89Ï\82 Ï\8cνομα Ï\87Ï\81ήÏ\83Ï\84η ÎºÎ±Î¹ Ï\84ο <strong>$4</strong> Ï\89Ï\82 Ï\83Ï\85νθημαÏ\84ικό.)",
        "botpasswords-no-provider": "Το BotPasswordsSessionProvider δεν είναι διαθέσιμο.",
        "botpasswords-restriction-failed": "Περιορισμοί κωδικών πρόσβασης bot εμποδίζουν τη συγκεκριμένη σύνδεση.",
        "botpasswords-invalid-name": "Το όνομα χρήστη που ορίζεται δεν περιέχει το διαχωριστικό συνθηματικού ρομπότ («$1»).",
        "resetpass-abort-generic": "Η αλλαγή του κωδικού έχει απορριφθεί από μια προέκταση.",
        "resetpass-expired": "Το συνθηματικό σας έχει λήξει. Παρακαλούμε καθορίστε νέο συνθηματικό για να συνδεθείτε.",
        "resetpass-expired-soft": "Το συνθηματικό σας έχει λήξει και πρέπει να γίνει επαναφορά του. Παρακαλούμε επιλέξτε νέο συνθηματικό τώρα, ή κάντε κλικ στο «{{int:authprovider-resetpass-skip-label}}» για το επαναφέρετε αργότερα.",
-       "resetpass-validity-soft": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ήÏ\82 Ï\83αÏ\82 Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î­Î³ÎºÏ\85Ï\81οÏ\82: $1\n\nΠαÏ\81ακαλοÏ\8dμε ÎµÏ\80ιλέξÏ\84ε Î­Î½Î±Î½ Î½Î­Î¿ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84Ï\8eÏ\81α, Î® Ï\80αÏ\84ήÏ\83Ï\84ε Â«{{int:authprovider-resetpass-skip-label}}» Î³Î¹Î± Î½Î± Ï\84ον ÎµÏ\80αναÏ\86έÏ\81ετε αργότερα.",
+       "resetpass-validity-soft": "Το Ï\83Ï\85νθημαÏ\84ικÏ\8c Ï\83αÏ\82 Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î­Î³ÎºÏ\85Ï\81ο: $1\n\nΠαÏ\81ακαλοÏ\8dμε ÎµÏ\80ιλέξÏ\84ε Î½Î­Î¿ Ï\83Ï\85νθημαÏ\84ικÏ\8c Ï\84Ï\8eÏ\81α, Î® Ï\80αÏ\84ήÏ\83Ï\84ε Â«{{int:authprovider-resetpass-skip-label}}» Î³Î¹Î± Î½Î± Ï\84ο Î±Î»Î»Î¬Î¾ετε αργότερα.",
        "passwordreset": "Επαναφορά κωδικού",
        "passwordreset-text-one": "Συμπληρώστε αυτήν τη φόρμα για να λάβετε ένα προσωρινό συνθηματικό μέσω ηλεκτρονικού ταχυδρομείου.",
        "passwordreset-text-many": "{{PLURAL:$1|Συμπληρώστε ένα από τα πεδία για να λάβετε προσωρινό συνθηματικό μέσω ηλεκτρονικού ταχυδρομείου.}}",
        "semiprotectedpagewarning": "<strong>Σημείωση:</strong> Αυτή η σελίδα έχει προστατευτεί ώστε μόνο αυτοεπιβεβαιωμένοι χρήστες μπορούν να την επεξεργαστούν.\nΗ πιο πρόσφατη καταχώρηση στο αρχείο καταγραφής παρέχεται παρακάτω για αναφορά:",
        "cascadeprotectedwarning": "<strong>Προσοχή:</strong> Αυτή η σελίδα έχει κλειδωθεί ώστε μόνο χρήστες με [[Special:ListGroupRights|συγκεκριμένα δικαιώματα]] να μπορούν να την επεξεργαστούν, επειδή περιλαμβάνεται {{PLURAL:$1|στην ακόλουθη|στις ακόλουθες}} διαδοχικά (cascaded) {{PLURAL:$1|προστατευμένη σελίδα|προστατευμένες σελίδες}}:",
        "titleprotectedwarning": "'''Προειδοποίηση: Αυτή η σελίδα έχει κλειδωθεί ώστε χρειάζονται [[Special:ListGroupRights|ειδικά δικαιώματα]] για να δημιουργηθεί.'''\nΗ πιο πρόσφατη καταχώρηση στο αρχείο καταγραφής παρέχεται παρακάτω για αναφορά:",
-       "templatesused": "{{PLURAL:$1|Πρότυπο που χρησιμοποιείται|Πρότυπα που χρησιμοποιούνται}} σε αυτή τη σελίδα:",
-       "templatesusedpreview": "{{PLURAL:$1|Πρότυπο που χρησιμοποιείται|Πρότυπα που χρησιμοποιούνται}} σε αυτή την προεπισκόπηση:",
-       "templatesusedsection": "{{PLURAL:$1|Πρότυπο|Πρότυπα}} που χρησιμοποιούνται σε αυτή την ενότητα:",
+       "templatesused": "{{PLURAL:$1|Πρότυπο που χρησιμοποιείται|Πρότυπα που χρησιμοποιούνται}} σε αυτήν τη σελίδα:",
+       "templatesusedpreview": "{{PLURAL:$1|Πρότυπο που χρησιμοποιείται|Πρότυπα που χρησιμοποιούνται}} σε αυτήν την προεπισκόπηση:",
+       "templatesusedsection": "{{PLURAL:$1|Πρότυπο|Πρότυπα}} που χρησιμοποιούνται σε αυτήν την ενότητα:",
        "template-protected": "(προστατευμένη)",
        "template-semiprotected": "(ημιπροστατευμένη)",
        "hiddencategories": "Αυτή η σελίδα είναι μέλος {{PLURAL:$1|μίας κρυμμένης κατηγορίας|$1 κρυμμένων κατηγοριών}}:",
        "group-autoconfirmed-member": "{{GENDER:$1|αυτοεπιβεβαιωμένος χρήστης|αυτοεπιβεβαιωμένη χρήστρια}}",
        "group-bot-member": "ρομπότ",
        "group-sysop-member": "{{GENDER:$1|διαχειριστής|διαχειρίστρια}}",
-       "group-interface-admin-member": "{{GENDER:$1|διαχειριστής διεπαφής}}",
+       "group-interface-admin-member": "{{GENDER:$1|διαχειριστής|διαχειρίστρια}} διεπαφής",
        "group-bureaucrat-member": "{{GENDER:$1|γραφειοκράτης|γραφειοκράτις}}",
        "group-suppress-member": "{{GENDER:$1|επιτηρητής|επιτηρήτρια}}",
        "grouppage-user": "{{ns:project}}:Χρήστες",
        "deleteprotected": "Δεν μπορείτε να διαγράψετε αυτή τη σελίδα επειδή είναι προστατευόμενη.",
        "deleting-backlinks-warning": "<strong>Προσοχή:</strong>  [[Special:WhatLinksHere/{{FULLPAGENAME}}|Άλλες σελίδες]] συνδέουν ή ενσωματώνουν τη σελίδα που πρόκειται να διαγράψετε.",
        "rollback": "Επαναφορά επεξεργασιών",
+       "rollback-confirmation-no": "Ακύρωση",
        "rollbacklink": "αναστροφή",
        "rollbacklinkcount": "Αναστροφή $1 {{PLURAL:$1|επεξεργασίας|επεξεργασιών}}",
        "rollbacklinkcount-morethan": "αναστροφή περισσότερων από $1 {{PLURAL:$1|επεξεργασία|επεξεργασίες}}",
        "ipb-confirm": "Επιβεβαίωση φραγής",
        "ipb-partial": "Μερική",
        "ipb-pages-label": "Σελίδες",
+       "ipb-namespaces-label": "Ονοματοχώροι",
        "badipaddress": "Άκυρη διεύθυνση IP.",
        "blockipsuccesssub": "Η φραγή ολοκληρώθηκε επιτυχώς.",
        "blockipsuccesstext": "{{GENDER:$1|Ο|Η}} [[Special:Contributions/$1|$1]] έχει υποστεί φραγή.<br />\nΔείτε τον [[Special:BlockList|κατάλογο φραγών]] για να εποπτεύσετε τις φραγές.",
        "ipb-blocklist-contribs": "Συνεισφορές {{GENDER:$1|του $1|της $1}}",
        "ipb-blocklist-duration-left": "Απομένουν $1",
        "block-expiry": "Λήξη",
+       "block-reason": "Αιτία:",
        "unblockip": "Άρση φραγής χρήστη",
        "unblockiptext": "Χρησιμοποιήστε την παρακάτω φόρμα για να αποκαταστήσετε την πρόσβαση σε επεξεργασία, σε μια διεύθυνση IP ή σε ένα χρήστη που είχε αποκλειστεί με φραγή.",
        "ipusubmit": "Άρση φραγής",
        "createaccountblock": "δημιουργία λογαριασμού μπλοκαρισμένη",
        "emailblock": "το ηλεκτρονικό ταχυδρομείο έχει απενεργοποιηθεί",
        "blocklist-nousertalk": "δεν μπορεί να επεξεργαστεί τη σελίδα συζήτησής του",
+       "blocklist-editing-page": "σελίδες",
+       "blocklist-editing-ns": "ονοματοχώροι",
        "ipblocklist-empty": "Η λίστα φραγών είναι άδεια.",
        "ipblocklist-no-results": "Η ζητούμενη διεύθυνση IP ή το όνομα χρήστη δεν είναι φραγμένα.",
        "blocklink": "φραγή",
        "confirmemail": "Επιβεβαίωση διεύθυνσης ηλεκτρονικού ταχυδρομείου",
        "confirmemail_noemail": "Δεν έχετε ορίσει μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.",
        "confirmemail_text": "Το σύστημα χρειάζεται να επαληθεύσει τη διεύθυνση e-mail που δώσατε για να χρησιμοποιήσετε τις δυνατότητες αλληλογραφίας. Κάνετε κλικ στο παρακάτω κουμπί και θα σας αποσταλεί μήνυμα επαλήθευσης στη διεύθυνσή σας. Στο μήνυμα αυτό θα εμφανίζεται ένας σύνδεσμος που Θα περιέχει τον κωδικό επαλήθευσης -ακολουθήστε το σύνδεσμο αυτό για να μπορέσει το σύστημα να επαληθεύσει τη διεύθυνση αλληλογραφίας σας.",
-       "confirmemail_pending": "Ένας κωδικός επιβεβαίωσης σας έχει ήδη σταλεί μέσω μηνύματος e-mail. Αν δημιουργήσατε\nπρόσφατα το λογαριασμό σας, μπορεί να θέλετε να περιμένετε μερικά λεπτά\nγια να φτάσει αυτό πριν προσπαθήσετε να ζητήσετε ένα νέο κωδικό.",
+       "confirmemail_pending": "Ένας κωδικός επιβεβαίωσης σας έχει ήδη σταλεί μέσω μηνύματος ηλεκτρονικού ταχυδρομείου. \nΑν δημιουργήσατε πρόσφατα το λογαριασμό σας, ίσως θα θέλετε να περιμένετε μερικά λεπτά για να φτάσει το μήνυμα πριν προσπαθήσετε να ζητήσετε νέο κωδικό.",
        "confirmemail_send": "Αποστολή κωδικού επαλήθευσης με e-mail .",
        "confirmemail_sent": "Στάλθηκε το μήνυμα ηλεκτρονικού ταχυδρομείου για επιβεβαίωση.",
        "confirmemail_oncreate": "Ένας κωδικός επιβεβαίωσης σας έχει σταλεί στην διεύθυνση e-mail σας.\nΑυτός ο κωδικός δεν είναι απαραίτητος για να συνδεθείτε, αλλά θα χρειαστεί\nνα τον παρέχετε πριν ενεργοποιήσετε οποιαδήποτε χαρακτηριστικά βασισμένα σε e-mail, σε αυτό το wiki.",
        "confirm-unwatch-top": "Κατάργηση αυτής της σελίδας από τη λίστα παρακολούθησης σας;",
        "confirm-rollback-button": "Εντάξει",
        "confirm-rollback-top": "Επαναφέρετε τις επεξεργασίες σε αυτή τη σελίδα;",
+       "confirm-mcrrestore-title": "Επαναφορά αναθεώρησης",
+       "confirm-mcrundo-title": "Αναίρεση αλλαγής",
+       "mcrundofailed": "Η αναίρεση απέτυχε",
        "semicolon-separator": "•&#32;",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← προηγούμενη σελίδα",
        "redirect-file": "Όνομα αρχείου",
        "redirect-logid": "Αναγνωριστικό μητρώου",
        "redirect-not-exists": "Η τιμή δε βρέθηκε",
+       "redirect-not-numeric": "Η τιμή δεν είναι αριθμητική",
        "fileduplicatesearch": "Αναζήτηση για διπλά αρχεία",
        "fileduplicatesearch-summary": "Αναζήτηση για διπλά αρχεία με βάση την τιμή hash του αρχείου.",
        "fileduplicatesearch-filename": "Όνομα αρχείου:",
        "logentry-newusers-newusers": "Ο λογαριασμός χρήστη $1 {{GENDER:$2|δημιουργήθηκε}}",
        "logentry-newusers-create": "Ο λογαριασμός χρήστη $1 {{GENDER:$2|δημιουργήθηκε}}",
        "logentry-newusers-create2": "Ο λογαριασμός χρήστη $3 δημιουργήθηκε από {{GENDER:$2|τον|την}} $1",
-       "logentry-newusers-byemail": "Î\9f Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Ï\87Ï\81ήÏ\83Ï\84η $3 Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήθηκε Î±Ï\80Ï\8c {{GENDER:$2|Ï\84ον|Ï\84ην}} $1 ÎºÎ±Î¹ Î¿ ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 ÎµÏ\83Ï\84άλη μέσω ηλεκτρονικού ταχυδρομείου",
+       "logentry-newusers-byemail": "Î\9f Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Ï\87Ï\81ήÏ\83Ï\84η $3 Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήθηκε Î±Ï\80Ï\8c {{GENDER:$2|Ï\84ον|Ï\84ην}} $1 ÎºÎ±Î¹ Î±Ï\80εÏ\83Ï\84άλη Ï\83Ï\85νθημαÏ\84ικÏ\8c μέσω ηλεκτρονικού ταχυδρομείου",
        "logentry-newusers-autocreate": "Ο λογαριασμός χρήστη $1 δημιουργήθηκε αυτόματα",
        "logentry-protect-protect": "$1 {{GENDER:$2|προστατευμένος|προστατευμένη}} $3 $4",
        "logentry-protect-modify": "$1 {{GENDER:$2|άλλαξε}} επίπεδο προστασίας για $3 $4",
        "edit-error-short": "Σφάλμα: $1",
        "edit-error-long": "Σφάλματα: \n\n$1",
        "revid": "αναθεώρηση $1",
+       "interfaceadmin-info": "$1\n\nΟι άδειες για την επεξεργασία καθολικών αρχείων CSS/JS/JSON διαχωρίστηκαν πρόσφατα από το δικαίωμα <code>editinterface</code>. Εάν δεν καταλαβαίνετε γιατί εμφανίζεται αυτό το σφάλμα, ανατρέξτε στο [[mw:MediaWiki_1.32/interface-admin]].",
+       "gotointerwiki-invalid": "Ο καθορισμένος τίτλος δεν είναι έγκυρος.",
        "pagedata-title": "Δεδομένα σελίδας",
        "pagedata-bad-title": "Μη έγκυρος τίτλος: $1.",
-       "passwordpolicies-policy-passwordnotinlargeblacklist": "Ο κωδικός πρόσβασης δεν μπορεί να είναι στην λίστα των 100.000 πιο συνηθισμένων κωδικών πρόσβασης."
+       "unregistered-user-config": "Για λόγους ασφαλείας δεν είναι δυνατή η φόρτωση υποσελίδων χρήστη JavaScript, CSS και JSON για μη εγγεγραμμένους χρήστες.",
+       "passwordpolicies": "Πολιτικές συνθηματικού",
+       "passwordpolicies-summary": "Αυτή είναι μια λίστα με τις ισχύουσες πολιτικές συνθηματικού για τις ομάδες χρηστών που καθορίζονται σε αυτό το wiki.",
+       "passwordpolicies-group": "Ομάδα",
+       "passwordpolicies-policies": "Πολιτικές",
+       "passwordpolicies-policy-minimalpasswordlength": "Το συνθηματικό πρέπει να έχει μήκος τουλάχιστον $1 {{PLURAL:$1|χαρακτήρα|χαρακτήρων}}",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "Το συνθηματικό πρέπει να έχει μήκος τουλάχιστον $1 {{PLURAL:$1|χαρακτήρα|χαρακτήρων}} για να είναι δυνατή η σύνδεση",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Το συνθηματικό δεν μπορεί να είναι ίδιο με το όνομα χρήστη",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "Το συνθηματικό δεν μπορεί να είναι ακριβώς ίδιο με κάποιο από τα συνθηματικά που βρίσκονται σε μαύρη λίστα",
+       "passwordpolicies-policy-maximalpasswordlength": "Το συνθηματικό πρέπει να έχει μήκος λιγότερο από $1 {{PLURAL:$1|χαρακτήρα|χαρακτήρες}}",
+       "passwordpolicies-policy-passwordcannotbepopular": "Το συνθηματικό δεν μπορεί να είναι {{PLURAL:$1|το δημοφιλέστερο συνθηματικό|στη λίστα με τα $1 δημοφιλέστερα συνθηματικά}}",
+       "passwordpolicies-policy-passwordnotinlargeblacklist": "Το συνθηματικό δεν μπορεί να είναι στην λίστα των 100.000 συνηθέστερα χρησιμοποιούμενων συνθηματικών.",
+       "passwordpolicies-policyflag-forcechange": "πρέπει να αλλαχθεί κατά τη σύνδεση",
+       "unprotected-js": "Για λόγους ασφαλείας δεν μπορεί να φορτωθεί JavaScript από μη προστατευμένες σελίδες. Παρακαλούμε δημιουργήστε javascript μόνο στον ονοματοχώρο MediaWiki: ή ως υποσελίδα χρήστη"
 }
index f03b512..a172ef7 100644 (file)
        "action-bigdelete": "supprimer des pages avec de grands historiques",
        "action-blockemail": "empêcher un utilisateur d’envoyer des courriels",
        "action-bot": "être traité comme un processus automatisé",
+       "action-editprotected": "modifier les pages protégées comme « {{int:protect-level-sysop}} »",
        "action-editsemiprotected": "modifier des pages protégées avec le statut « {{int:protect-level-autoconfirmed}} »",
        "action-editinterface": "modifier l’interface utilisateur",
        "action-editusercss": "modifier les fichiers CSS d’autres utilisateurs",
index 0268edd..c8c261c 100644 (file)
        "right-deletedhistory": "Wiske ferzjes besjen, sûnder sjen te kinnen wat wiske is.",
        "right-browsearchive": "Wiske siden besjen",
        "right-undelete": "Wiske siden tebeksette",
-       "right-suppressrevision": "Beskate sideferzjes fan in meidogger besjen, ferbergje of net ferbergje",
+       "right-suppressrevision": "Beskate sideferzjes fan in meidogger besjen, ferbergje of werombringe",
        "right-suppressionlog": "Net-publike logboeken besjen",
        "right-block": "Oare meidoggers de mûglikheid ta bewurkjen ôfnimme",
        "right-blockemail": "In meidogger it rjocht ta it ferstjoeren fan e-mail ôfnimme",
        "recentchanges-label-plusminus": "De sidegrutte is mei dit oantal bytes wizige",
        "recentchanges-legend-heading": "<strong>Leginda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}<br />(sjoch ek de [[Special:NewPages|list mei nije siden]])",
+       "recentchanges-submit": "Werjaan",
        "rcfilters-legend-heading": "<strong>List fan ôfkoartings:</strong>",
        "rcfilters-group-results-by-page": "Resultaten op side groepearje",
        "rcfilters-activefilters": "Aktive filters",
        "rcfilters-activefilters-hide": "Ynklappe",
        "rcfilters-activefilters-show": "Utklappe",
+       "rcfilters-activefilters-hide-tooltip": "Fek mei Aktive filters ferbergje",
+       "rcfilters-activefilters-show-tooltip": "Fek mei Aktive filters sjen litte",
        "rcfilters-advancedfilters": "Utwreide filters",
        "rcfilters-limit-title": "Resultaten werjaan",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|feroaring|feroarings}}, $2",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|dei|dagen}}",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|oere|oeren}}",
        "rcfilters-quickfilters": "Bewarre filters",
+       "rcfilters-quickfilters-placeholder-title": "Noch gjin filters bewarre",
+       "rcfilters-quickfilters-placeholder-description": "Klik op it blêdwizerikoan yn it fek mei Aktive filters hjirûnder, en bewarje jo filterynstellings foar letter werbrûk.",
        "rcfilters-savedqueries-defaultlabel": "Bewarre filters",
+       "rcfilters-savedqueries-rename": "Omneame",
+       "rcfilters-savedqueries-setdefault": "As standert ynstelle",
+       "rcfilters-savedqueries-unsetdefault": "As standert wiskje",
+       "rcfilters-savedqueries-remove": "Wiskje",
+       "rcfilters-savedqueries-new-name-label": "Namme",
+       "rcfilters-savedqueries-new-name-placeholder": "Beskriuw it doel fan it filter",
+       "rcfilters-savedqueries-apply-label": "Filter oanmeitsje",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Standertfilter oanmeitsje",
+       "rcfilters-savedqueries-cancel-label": "Annulearje",
        "rcfilters-savedqueries-add-new-title": "De filterynstellings fan no bewarje",
+       "rcfilters-savedqueries-already-saved": "Dizze filters wurde al bewarre. Feroarje jo ynstellings om in nij filter bewarje te kinnen.",
+       "rcfilters-restore-default-filters": "Standertfilters werombringe",
        "rcfilters-clear-all-filters": "Alle filters wiskje",
        "rcfilters-search-placeholder": "Feroarings filterje (brûk it menu of sykje op filternamme)",
+       "rcfilters-empty-filter": "Gjin aktive filters. Alle bydragen wurde werjûn.",
        "rcfilters-filterlist-feedbacklink": "Lit ús hearre wat jo fan dit filterark fine",
        "rcfilters-highlightbutton-title": "Resultaten aksintuearje",
        "rcfilters-highlightmenu-title": "Kies in kleur",
        "rcfilters-highlightmenu-help": "Kleur kieze foar it aksintuearjen fan dizze eigenskip",
+       "rcfilters-filtergroup-automated": "Automatisearre bydragen",
+       "rcfilters-filter-bots-description": "Wizigings makke troch automatisearre helpmiddels.",
+       "rcfilters-filter-humans-label": "Minske (gjin bot)",
+       "rcfilters-filter-humans-description": "Wizigings makke troch minskehannen.",
+       "rcfilters-filtergroup-significance": "Belang",
+       "rcfilters-filter-minor-label": "Lytse betsjutting",
+       "rcfilters-filter-minor-description": "Feroarings troch de skriuwer lebele as fan lytse betsjutting.",
+       "rcfilters-filter-major-label": "Gjin lytse betsjutting",
+       "rcfilters-filter-major-description": "Feroarings net lebele as fan lytse betsjutting.",
+       "rcfilters-filtergroup-changetype": "Wizigingssoarte",
+       "rcfilters-filter-pageedits-label": "Sidebewurkings",
+       "rcfilters-filter-newpages-label": "Nije siden",
+       "rcfilters-filter-logactions-label": "Lochaksjes",
        "rcfilters-filter-excluded": "Utsein",
        "rcfilters-exclude-button-off": "Seleksje omkeare",
        "rcfilters-exclude-button-on": "Omkearde seleksje",
index 2383108..4785e11 100644 (file)
@@ -87,6 +87,7 @@
        "tog-norollbackdiff": "Izostavi razliku nakon vraćanja",
        "tog-useeditwarning": "Upozori me kad napuštam stranicu za uređivanje bez spremanja izmjena",
        "tog-prefershttps": "Uvijek koristi sigurnu vezu kod prijave",
+       "tog-showrollbackconfirmation": "Prikaži odzivnu poruku za potvrđivanje škljocaja na poveznicu za brzo uklanjanje",
        "underline-always": "Uvijek",
        "underline-never": "Nikad",
        "underline-default": "Prema postavkama preglednika",
        "help": "Pomoć",
        "help-mediawiki": "Pomoć o MediaWikiju",
        "search": "Traži",
+       "search-ignored-headings": " #<!-- ne mijenjajte ništa u ovom retku --> <pre>\n# Zaglavlja koja će biti zanemarena pri pretrazi.\n# Izmjene koje ovdje načinite stupit će na snagu čim se stranica sa zaglavljem indeksira.\n# Možete forsirati da se stranica indeksira tako što ćete izvršiti prazno uređivanje.\n# Sintaksa je sljedeća:\n#   * Sve od znaka \"#\" pa do kraja retka je komentar.\n#   * Svaki redak koji nije prazan jest točan naziv koji će biti zanemaren, s tim da se razlikuju mala i velika slova i sve ostalo.\nIzvori\nVanjske poveznice\nVidi i\n #</pre> <!-- ne mijenjajte ništa u ovom retku -->",
        "searchbutton": "Traži",
        "go": "Kreni",
        "searcharticle": "Kreni",
        "pool-timeout": "Istek vremena (''timeout'') čekajući zaključavanje",
        "pool-queuefull": "Red čekanja je pun",
        "pool-errorunknown": "Nepoznata pogrješka",
+       "pool-servererror": "Usluga brojača redaka nije dostupna ($1).",
        "poolcounter-usage-error": "Greška korištenja: $1",
        "aboutsite": "O projektu {{SITENAME}}",
        "aboutpage": "Project:O_projektu_{{SITENAME}}",
        "ns-specialprotected": "Stranice u imenskom prostoru ''{{ns:special}}'' ne mogu se uređivati.",
        "titleprotected": "Ovaj naslov je od kreiranja zaštitio suradnik [[User:$1|$1]], uz razlog: <em>$2</em>.",
        "filereadonlyerror": "Ne mogu izmijeniti datoteku \"$1\" jer je spremište \"$2\" dostupno samo za čitanje.\n\nAdministrator koji je zaključao spremište naveo je sljedeći razlog: \"$3\".",
+       "invalidtitle": "Neispravan naslov",
        "invalidtitle-knownnamespace": "Neispravan naziv imenskog prostora \"$2\" i teksta \"$3\"",
        "invalidtitle-unknownnamespace": "Neispravan naziv imenskog prostora broj $1 i teksta \"$2\"",
        "exception-nologin": "Niste prijavljeni",
        "botpasswords-existing": "Postojeće zaporke botova",
        "botpasswords-createnew": "Stvorite novu zaporku bota",
        "botpasswords-editexisting": "Uredite postojeću zaporku bota",
+       "botpasswords-label-needsreset": "(zaporku treba ponovo postaviti)",
        "botpasswords-label-appid": "Ime bota:",
        "botpasswords-label-create": "Stvori",
        "botpasswords-label-update": "Ažuriraj",
        "passwordreset-domain": "Domena:",
        "passwordreset-email": "E-mail adresa:",
        "passwordreset-emailtitle": "Pojedinosti o računu na {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Netko (vjerojatno Vi, s IP adrese $1) zatražio je podsjetnik za Vaše detalje računa\nza {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}}\npovezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena zaporka|Ove privremene zaporke}} će isteći u {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu zaporku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše izvorne zaporke, a više je ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru zaporku.",
-       "passwordreset-emailtext-user": "Suradnik $1 na {{SITENAME}} zatražio je podsjetnik o pojedinostima vašeg računa za {{SITENAME}}\n($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena zaporka|Ove privremene zaporke}} će isteći u {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu zaporku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše izvorne zaporke, a više je ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru zaporku.",
+       "passwordreset-emailtext-ip": "Netko (vjerojatno Vi, s IP adrese $1) zatražio je podsjetnik za Vaše detalje računa\nza {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}}\npovezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena zaporka|Ove privremene zaporke}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu zaporku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše izvorne zaporke, a više je ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru zaporku.",
+       "passwordreset-emailtext-user": "Suradnik $1 na {{SITENAME}} zatražio je podsjetnik o pojedinostima vašeg računa za {{SITENAME}}\n($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena zaporka|Ove privremene zaporke}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu zaporku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše izvorne zaporke, a više je ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru zaporku.",
        "passwordreset-emailelement": "Suradničko ime: \n$1\n\nPrivremena zaporka: \n$2",
        "passwordreset-emailsentemail": "Ako je ova adresa povezana s Vašim suradničkim računom, na nju će biti poslan podsjetnik na zaporku.",
        "passwordreset-emailsentusername": "Ukoliko je ova adresa povezana s Vašim suradničkim računom, na istu će biti poslan podsjetnik sa zaporkom.",
        "page_first": "prva",
        "page_last": "zadnja",
        "histlegend": "Izbor za usporedbu: označi kružiće pokraj dvije inačice koje želiš usporediti i pritisni \"Enter\" ili tipku na dnu.<br />\nUputa: <strong>({{int:cur}})</strong> = razlika od trenutačne inačice, <strong>({{int:last}})</strong> = razlika od prethodne inačice, <strong>{{int:minoreditletter}}</strong> = manja promjena.",
-       "history-fieldset-title": "Pretraži izmjene",
+       "history-fieldset-title": "Filtriranje inačica",
        "history-show-deleted": "Samo izbrisane izmjene",
        "histfirst": "najstarije",
        "histlast": "najnovije",
        "historysize": "({{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}})",
-       "historyempty": "(prazna stranica)",
+       "historyempty": "prazno",
        "history-feed-title": "Povijest promjena",
        "history-feed-description": "Povijest promjena ove stranice na wikiju",
        "history-feed-item-nocomment": "$1 u (test) $2",
        "recentchangescount": "Zadani broj izmjena koje se prikazuju u nedavnim promjenama, povijesti stranica i u evidencijama:",
        "prefs-help-recentchangescount": "Najveći broj: 1000",
        "prefs-help-watchlist-token2": "Ovo je tajni ključ prema sažetku Vašeg popisa praćenja. \nSvaki suradnik kojem je poznat, moći će čitati Vaš popis praćenih stranica. Ne dijelite ga ni s kim.\nAko je potrebno možete ga [[Special:ResetTokens|ponovo postaviti]].",
+       "prefs-help-tokenmanagement": "Možete vidjeti te ponovo zadati tajni ključ za svoj račun kojim možete pristupiti svemrežnom izvodu Vašega popisa praćenja. Svatko tko zna ključ moći će čitati Vaš popis praćenja, stoga ga nemojte dijeliti.",
        "savedprefs": "Vaše postavke su sačuvane.",
        "savedrights": "Suradnička su prava {{GENDER:$1|suradnika $1|suradnice $1}} spremljena.",
        "timezonelegend": "Vremenska zona:",
        "delete-confirm": "Pobriši »$1«",
        "delete-legend": "Izbriši",
        "historywarning": "<strong>Upozorenje:</strong> stranica koju želite izbrisati ima starije izmjene s $1 {{PLURAL:$1|inačicom|inačice|inačica}}:",
-       "historyaction-submit": "Prikaži",
+       "historyaction-submit": "Prikaži inačice",
        "confirmdeletetext": "Zauvijek ćete izbrisati stranicu ili sliku zajedno s prijašnjim inačicama.\nMolim potvrdite svoju namjeru, da razumijete posljedice i da ovo radite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "actioncomplete": "Radnja je dovršena",
        "actionfailed": "Radnja nije uspjela",
        "deleting-backlinks-warning": "<strong>Upozorenje:</strong> \nbrišete stranicu koja je uključena u [[Special:WhatLinksHere/{{FULLPAGENAME}}|druge]] ili druge stranice povezuju na nju.",
        "deleting-subpages-warning": "<strong>Upozorenje:</strong> Stranica koju ste nakanili izbrisati ima [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|$1 podstranicu|$1 podstranice|$1 podstranica|51=preko 50 podstranica}}]].",
        "rollback": "Ukloni posljednju promjenu",
+       "rollback-confirmation-confirm": "Molimo Vas, potvrdite:",
+       "rollback-confirmation-yes": "ukloni",
+       "rollback-confirmation-no": "otkaži",
        "rollbacklink": "ukloni",
        "rollbacklinkcount": "ukloni $1 {{PLURAL:$1|uređivanje|uređivanja}}",
        "rollbacklinkcount-morethan": "ukloni više od $1 {{PLURAL:$1|uređivanje|uređivanja}}",
        "mycontris": "Doprinosi",
        "anoncontribs": "Doprinosi",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
+       "contributions-subtitle": "Za {{GENDER:$3|$1}}",
        "contributions-userdoesnotexist": "Suradnički račun \"$1\" nije registriran.",
+       "negative-namespace-not-supported": "Imenski prostori s negativnim vrijednostima nisu podržani.",
        "nocontribs": "Nema promjena koje udovoljavaju ovim kriterijima.",
        "uctop": "vrh",
        "month": "Od mjeseca (i ranije):",
        "pagedata-bad-title": "Naslov nije valjan: $1.",
        "passwordpolicies": "Pravila za zaporke",
        "passwordpolicies-summary": "Ovo je popis pravila za zaporke za suradničke grupe definirane na ovom wikiju.",
+       "passwordpolicies-group": "Skupina",
+       "passwordpolicies-policies": "Pravila",
        "passwordpolicies-policy-minimalpasswordlength": "Zaporka mora sadržavati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}",
        "passwordpolicies-policy-minimumpasswordlengthtologin": "Da biste se prijavili, zaporka mora sadržavati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}",
        "passwordpolicies-policy-passwordcannotmatchusername": "Zaporka ne može biti ista kao i suradničko ime",
index d73dc11..17a3470 100644 (file)
@@ -14,6 +14,7 @@
        "tog-extendwatchlist": "Տարածել հսկացանկը՝ ցոյց տալով բոլոր փոփոխութիւնները, ոչ միայն վերջինները",
        "tog-numberheadings": "Ինքնահամարակալել վերնագիրները",
        "tog-editondblclick": "Խմբագրել էջերը կրկնակի սեղմամբ",
+       "tog-shownumberswatching": "Ցոյց տալ հսկող մասնակիցներուն թիւը",
        "tog-watchlisthideown": "Թաքցնել իմ խմբագրումները հսկացանկէն",
        "tog-watchlisthidebots": "Թաքցնել իմ խմբագրումները հսկացանկէն",
        "tog-watchlisthideminor": "Թաքցնել իմ խմբագրումները հսկացանկէն",
        "helppage-top-gethelp": "Օգնութիւն",
        "mainpage": "Գլխաւոր Էջ",
        "mainpage-description": "Գլխաւոր Էջ",
+       "policy-url": "Project:Քաղաքականութիւն",
        "portal": "Համայնքային դարպաս",
        "portal-url": "Project:Համայնքային դարպաս",
        "privacy": "Սեփական տուեալներու պահպանման քաղաքականութիւն",
        "viewsourcetext": "Կրնաք այս էջին աղբիւրը տեսնել ու ընդօրինակել։",
        "invalidtitle": "Անվաւեր վերնագիր",
        "exception-nologin": "Դուք մուտք չէք գործած համակարգ",
+       "cannotlogoutnow-title": "Այժմ դուք չէք կրնար դուրս գալ",
        "welcomeuser": "Բարի գալո՜ւստ, $1",
        "welcomecreation-msg": "Ձեր հաշիւը ստեղծուած է։\nՉմոռնաք փոփոխել ձեր [[Special:Preferences|նախընտրութիւնները]]։",
        "yourname": "Մասնակիցի անուն",
        "password-login-forbidden": "Այս մասնակիցի անունը եւ գաղտաբարի օգտագործումը արգիլուած է:",
        "mailmypassword": "Վերականգնել գաղտնաբառը",
        "passwordremindertitle": "Նոր ժամանակաւոր գաղտնաբառ {{grammar:genitive|{{SITENAME}}}} համար",
+       "emailconfirmlink": "Հաստատեցէ՛ք ձեր ելեկտրոնային հասցէն",
        "accountcreated": "Հաշիւը ստեղծուեցաւ:",
        "loginlanguagelabel": "Լեզու՝ $1",
        "pt-login": "Մուտք գործել",
        "changepassword-success": "Ձեր անցաբառը փոխուեցաւ։",
        "botpasswords-label-appid": "Մեքենայիկի անուն՝",
        "botpasswords-label-create": "Ստեղծել",
+       "botpasswords-label-update": "Թարմացնել",
        "botpasswords-label-cancel": "Չեղարկել",
        "botpasswords-label-delete": "Ջնջել",
        "botpasswords-label-resetpassword": "Վերականգնել գաղտնաբառը",
        "noarticletext-nopermission": "Ներկայիս այս էջին վրայ որեւէ գրութիւն չկայ։\nԿրնաք [[Special:Search/{{PAGENAME}}|այս վերնագիրով էջը որոնել]] այլ էջերու մէջ, կամ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} որոնել համապատասխան տեղեկատետրերը], սակայն իրաւունք չունիք այս էջը ստեղծելու։",
        "userpage-userdoesnotexist-view": "«$1» անունով գրանցուած մասնակից չկայ։",
        "clearyourcache": "<strong>Նշում՝</strong> Պահելէ ետք կրնայ ըլլալ որ պէտք ունենաք մաքրելու դիտարկիչին պաշարը (cache) փոփոխութիւնները կարենալ տեսնելու համար։\n* <strong>Firefox / Safari:</strong> Սեղմած պահել <em>Shiftը</em> մինչ կը սեղմէք  <em>Reload</em>, կամ ալ սեղմել <em>Ctrl-F5</em> կամ <em>Ctrl-R</em> (<em>⌘-R</em> Macի վրայ)\n* <strong>Google Chrome:</strong> Սեղմել <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> Macի վրայ)\n* <strong>Internet Explorer:</strong> Սեղմած պահել <em>Ctrl</em> մինչ կը սեղմէք  <em>Refresh</em>, կամ ալ սեղմել <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Երթալ <em>Menu → Settings</em> (<em>Opera → Preferences</em> Macի վրայ) եւ ապա <em>Privacy & security → մաքրել թերթատման տեղեկութիւնները → Պաշարի մէջ դրուած նկարներ եւ նիշքեր</em>.",
+       "updated": "(Թարմացուած)",
        "previewnote": "<strong>Յիշել որ ասիկա միայն կանխաստուգում է. ձեր կատարած փոփոխութիւնները տակաւին չեն պահուած։<strong>",
        "continue-editing": "Շարունակել խմբագրել",
        "editing": "Կը խմբագրուի՝ $1 էջը",
        "search-category": "(ստորոգութիւն $1)",
        "search-file-match": "(համապատասխան է նիշքի բովանդակութեան)",
        "search-suggest": "$1 Նկատի ունի՞ք",
+       "search-interwiki-default": "$1 արդիւնք.",
        "search-interwiki-more": "(աւելի)",
        "search-interwiki-more-results": "աւելի շատ արդիւնքներ",
        "search-relatedarticle": "Հարակից",
        "group": "Խումբ.",
        "group-bot": "Մեքենայիկներ",
        "group-sysop": "Վարիչներ",
+       "group-sysop-member": "{{GENDER:$1|վարիչ}}",
        "grouppage-bot": "{{ns:project}}:Մեքենայիկներ",
        "grouppage-sysop": "{{ns:project}}:Վարիչներ",
        "right-writeapi": "API գիրի օգտագործումը",
        "recentchanges-legend-heading": "<strong>Ծանօթ.՝</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (տե՛ս նաեւ՝  [[Special:NewPages|նոր էջերու ցանկ]])",
        "rcfilters-activefilters": "Աշխոյժ զտիչներ",
+       "rcfilters-limit-title": "Ցուցադրուող արդիւնքներ",
        "rcnotefrom": "Ներքեւ {{PLURAL:$5|փոփոխութիւնն է|փոփոխութիւններն են}} սկսեալ <strong>$3, $4</strong> (մինչեւ <strong>$1</strong> ցոյց տրուած).",
        "rclistfrom": "Ցոյց տալ նոր փոփոխութիւնները սկսած $3 $2",
        "rcshowhideminor": "$1 չնչին խմբագրումներ",
        "upload-disallowed-here": "Այս նիշքը կարելի չէ ջնջել ու փոխարինել։",
        "randompage": "Պատահական էջ",
        "statistics": "Վիճակագրութիւն",
+       "statistics-header-pages": "Էջերու վիճակագրութիւն",
+       "statistics-header-edits": "Խմբագրումներու վիճակագրութիւն",
+       "statistics-header-users": "Մասնակիցներու վիճակագրութիւն",
+       "statistics-pages-desc": "Ուիքիի բոլոր էջերը՝ ներառեալ քննարկման էջերը, վերայղումները եւ այլն",
+       "statistics-files": "Բեռնուած նիշքեր",
+       "statistics-edits-average": "Իւրաքանչիւր էջի խմբագրումներուն միջին թիւը",
+       "statistics-users-active": "Աշխոյժ մասնակիցներ",
        "double-redirect-fixer": "Վերայղումներու շտկիչ",
        "nbytes": "$1 {{PLURAL:$1|պայթ}}",
        "nmembers": "$1 {{PLURAL:$1|անդամ|անդամներ}}",
        "move": "Տեղափոխել այս էջը",
        "pager-newer-n": "{{PLURAL:$1|նոր 1|աւելի նոր $1}}",
        "pager-older-n": "{{PLURAL:$1|աւելի հին 1|աւելի հին $1}}",
+       "apisandbox-results": "Արդիւնքներ",
        "booksources": "Գիրքի աղբիւրներ",
        "booksources-search-legend": "Որոնել գիրքի մասին",
        "booksources-search": "Որոնել",
        "allpagessubmit": "‎Յառաջանալ",
        "allpages-hide-redirects": "Թաքցնել վերայղումները",
        "categories": "Ստորոգութիւններ",
+       "activeusers": "Աշխոյժ մասնակիցներու ցանկ",
+       "activeusers-submit": "Ցոյց տալ աշխոյժ մասնակիցները",
        "listgrouprights-members": "(անդամներու ցանկ)",
        "emailuser": "էլ-նամակ ուղարկել այս մասնակիցին",
        "usermessage-editor": "Համակարգային սուրհանդակի անուն",
        "tooltip-diff": "Ցոյց տալ ձեր կատարած փոփոխութիւնները գրութեան մէջ",
        "tooltip-compareselectedversions": "Տեսնել այս էջին ընտրուած երկու տարբերակներուն միջեւ տարբերութիւնները",
        "tooltip-watch": "Աւելցնել այս էջը ձեր հսկողութեան ցանկին վրայ",
+       "tooltip-watchlistedit-raw-submit": "Թարմացնել Հսկացանկը",
        "tooltip-rollback": "«Յետարկում»ը մէկ սեղմումով վերջին մասնակիցին կատարած բոլոր խմբագրումները ետ կ՚ընէ",
        "tooltip-undo": "«Յետարկել»ը կը շրջէ կատարուած փոփոխութիւնը եւ խմբագրումը կը տրամադրէ կանխաստուգման վիճակով, թոյլ տալով նշել պատճառը ամփոփումին մէջ։",
        "tooltip-summary": "Մուտքագրեցէ՛ք հակիրճ ամփոփում մը",
        "imgmultipagenext": "յաջորդ էջը →",
        "imgmultigo": "Անցնի՛լ",
        "imgmultigoto": "Անցնիլ $1 էջը",
+       "watchlistedit-raw-submit": "Թարմացնել Հսկացանկը",
        "watchlistedit-clear-title": "Մաքրել հսկողութեան ցանկը",
        "watchlistedit-clear-legend": "Մաքրել հսկողութեան ցանկը",
        "watchlisttools-clear": "Մաքրել հսկողութեան ցանկը",
        "feedback-cancel": "Չեղարկել",
        "searchsuggest-search": "Որոնել {{SITENAME}} կայքին մէջ",
        "duration-days": "$1 {{PLURAL:$1|օր}}",
+       "special-characters-group-latin": "Լատիներէն",
+       "special-characters-group-arabic": "Արաբերէն",
        "randomrootpage": "Պատահական արմատ էջ"
 }
index efb39cf..be41e53 100644 (file)
        "badretype": "입력한 비밀번호가 일치하지 않습니다.",
        "usernameinprogress": "이 사용자 이름에 대한 계정 생성이 이미 시작되었습니다. 기다려 주세요.",
        "userexists": "입력한 사용자 계정 이름이 이미 사용되고 있습니다.\n다른 이름을 선택하세요.",
-       "createacct-normalization": "당신의 사용자 이름은 기술적 한계로 인해 $2로 조정됩니다.",
+       "createacct-normalization": "당신의 사용자 이름은 기술적 한계로 인해 $2(으)로 조정됩니다.",
        "loginerror": "로그인 오류",
        "createacct-error": "계정 만들기 오류",
        "createaccounterror": "계정을 만들 수 없습니다: $1",
        "action-editusercss": "다른 사용자의 CSS 파일 편집",
        "action-edituserjson": "다른 사용자의 JSON 파일 편집",
        "action-edituserjs": "다른 사용자의 자바스크립트 파일 편집",
+       "action-unblockself": "자신을 차단 해제하기",
        "nchanges": "$1개 {{PLURAL:$1|바뀜}}",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|마지막 방문 이후}} $1개",
        "enhancedrc-history": "역사",
index bf34927..b6cfd45 100644 (file)
        "log-action-filter-suppress-event": "Притајување дневник",
        "log-action-filter-suppress-revision": "Притајување преработка",
        "log-action-filter-suppress-delete": "Притајување страница",
-       "log-action-filter-suppress-block": "Притајување на корисникот преку блокирање",
-       "log-action-filter-suppress-reblock": "Притајување на корисникот преку преблокирање",
+       "log-action-filter-suppress-block": "Притајување на корисник со блокирање",
+       "log-action-filter-suppress-reblock": "Притајување на корисник со повторно блокирање",
        "log-action-filter-upload-upload": "Ново подигање",
        "log-action-filter-upload-overwrite": "Преподигање",
        "log-action-filter-upload-revert": "Отповикај",
index e0afd43..1786795 100644 (file)
        "page_first": "første",
        "page_last": "siste",
        "histlegend": "Valg av diff: merk i radioboksene de revisjonene du ønsker å sammenligne og trykk enter eller knappen nederst på siden.<br />\nForklaring: '''({{int:cur}})''' = forskjell fra nåværende revisjon, '''({{int:last}})''' = forskjell fra foregående revisjon, '''{{int:minoreditletter}}''' = mindre endring.",
-       "history-fieldset-title": "Søk etter revisjoner",
+       "history-fieldset-title": "Filtrer revisjoner",
        "history-show-deleted": "Kun slettede revisjoner",
        "histfirst": "eldste",
        "histlast": "nyeste",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
-       "historyempty": "(tom)",
+       "historyempty": "tom",
        "history-feed-title": "Revisjonshistorikk",
        "history-feed-description": "Revisjonshistorikk for denne siden",
        "history-feed-item-nocomment": "$1 på $2",
        "right-reupload-own": "Skrive over egne filer",
        "right-reupload-shared": "Skrive over delte filer lokalt",
        "right-upload_by_url": "Laste opp en fil via URL",
-       "right-purge": "Rense mellomlageret for sider",
+       "right-purge": "Rens mellomlageret for en side",
        "right-autoconfirmed": "Redigere halvlåste sider",
        "right-bot": "Bli behandlet som en automatisk prosess",
        "right-nominornewtalk": "Får ikke «Du har nye meldinger»-beskjeden ved mindre endringer på diskusjonsside",
        "action-changetags": "legg til og fjern vilkårlige merker på individuelle revisjoner og loggposter",
        "action-deletechangetags": "slette tagger fra databasen",
        "action-purge": "gjenoppfriske denne siden",
+       "action-apihighlimits": "bruke høyere grenser for API-spørringer",
+       "action-autoconfirmed": "ikke bli påvirket av IP-baserte hastighetsbegrensninger",
+       "action-bigdelete": "slette sider med lang historikk",
+       "action-blockemail": "blokkere en bruker fra å sende e-post",
+       "action-bot": "bli behandlet som en automatisert prosess",
+       "action-editprotected": "redigere sider som er beskyttet som «{{int:protect-level-sysop}}»",
+       "action-editsemiprotected": "redigere sider som er beskyttet som «{{int:protect-level-autoconfirmed}}»",
+       "action-editinterface": "redigere brukergrensesnittet",
+       "action-editusercss": "redigere andre brukeres CSS-filer",
+       "action-edituserjson": "redigere andre brukeres JSON-filer",
+       "action-edituserjs": "redigere andre brukeres JavaScript-filer",
+       "action-editsitecss": "redigere CSS som påvirker hele nettstedet",
+       "action-editsitejson": "redigere JSON som påvirker hele nettstedet",
+       "action-editsitejs": "redigere JavaScript som påvirker hele nettstedet",
+       "action-editmyusercss": "redigere dine egne CSS-filer",
+       "action-editmyuserjson": "redigere dine egne JSON-filer",
+       "action-editmyuserjs": "redigere dine egne JavaScript-filer",
+       "action-viewsuppressed": "viser skjulte revisjoner",
+       "action-hideuser": "blokkere et brukernavn og skjule det fra offentligheten",
+       "action-ipblock-exempt": "omgå IP-blokkeringer, autoblokkeringer og rekkeblokkeringer",
+       "action-unblockself": "avblokkere deg selv",
+       "action-noratelimit": "ikke bli påvirket av hastighetsbegrensninger",
+       "action-reupload-own": "overskrive eksisterende filer lastet opp av deg selv",
+       "action-nominornewtalk": "hindre at mindre redigeringer på diskusjonssider utløser spørsmål om nye meldinger",
+       "action-markbotedits": "markere tilbakestillinger som botredigeringer",
+       "action-patrolmarks": "vise patruljeringsmerker i siste endringer",
+       "action-override-export-depth": "eksportere sider inkludert lenkede sider til og med en lenkedybde på 5",
+       "action-suppressredirect": "ikke opprette omdirigeringer fra kildesider ved flytting av sider",
        "nchanges": "$1 {{PLURAL:$1|endring|endringer}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|siden forrige besøk}}",
        "enhancedrc-history": "historikk",
        "delete-confirm": "Slett «$1»",
        "delete-legend": "Slett",
        "historywarning": "<strong>Advarsel:</strong> Siden du er i ferd med å slette har en historikk med $1 {{PLURAL:$1|revisjon|revisjoner}}:",
-       "historyaction-submit": "Vis",
+       "historyaction-submit": "Vis revisjoner",
        "confirmdeletetext": "Du holder på å slette en side sammen med historikken.\nBekreft at du virkelig vil slette denne siden, at du forstår konsekvensene og at du gjør det i samsvar med [[{{MediaWiki:Policy-url}}|retningslinjene]].",
        "actioncomplete": "Gjennomført",
        "actionfailed": "Handling mislyktes",
        "deleting-backlinks-warning": "<strong>Advarsel:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Andre sider]] lenker til eller inkluderer siden du er i ferd med å slette.",
        "deleting-subpages-warning": "<strong>Advarsel:</strong> Siden du er i ferd med å slette har [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|en underside|$1 undersider|51=over 50 undersider}}]].",
        "rollback": "Fjern redigeringer",
+       "rollback-confirmation-confirm": "Vennligst bekreft:",
+       "rollback-confirmation-yes": "Tilbakestill",
+       "rollback-confirmation-no": "Avbryt",
        "rollbacklink": "tilbakestill",
        "rollbacklinkcount": "tilbakestill {{PLURAL:$1|én endring|$1 endringer}}",
        "rollbacklinkcount-morethan": "tilbakestill mer enn $1 {{PLURAL:$1|endring|endringer}}",
        "mycontris": "Bidrag",
        "anoncontribs": "Bidrag",
        "contribsub2": "For {{GENDER:$3|$1}} ($2)",
+       "contributions-subtitle": "For {{GENDER:$3|$1}}",
        "contributions-userdoesnotexist": "Brukerkontoen «$1» er ikke registrert.",
        "negative-namespace-not-supported": "Navnerom med negative verdier støttes ikke.",
        "nocontribs": "Ingen endringer er funnet som passer disse kriteriene.",
        "confirm-unwatch-top": "Fjern denne siden fra overvåkningslisten din?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Tilbakestill redigeringer på denne siden?",
+       "confirm-rollback-bottom": "Dette vil tilbakestille de valgte endringene til denne siden umiddelbart.",
        "confirm-mcrrestore-title": "Gjenopprett en revisjon",
        "confirm-mcrundo-title": "Fjern en endring",
        "mcrundofailed": "Fjerning mislyktes",
index 26f8f9b..0e3394b 100644 (file)
@@ -31,7 +31,7 @@
         * function, if none, pass empty string.
         * @param {string} newVal New value that may have to be trimmed down.
         * @param {number} byteLimit Number of bytes the value may be in size.
-        * @param {Function} [filterFn] See jQuery#byteLimit.
+        * @param {Function} [filterFunction] See jQuery#byteLimit.
         * @return {Object}
         * @return {string} return.newVal
         * @return {boolean} return.trimmed
        mw.log.deprecate( $, 'trimByteLength', trimByteLength,
                'Use require( \'mediawiki.String\' ).trimByteLength instead.', '$.trimByteLength' );
 
-       function lengthLimit( trimFn, limit, filterFn ) {
+       function lengthLimit( trimFn, limit, filterFunction ) {
                var allowNativeMaxlength = trimFn === trimByteLength;
 
                // If the first argument is the function,
-               // set filterFn to the first argument's value and ignore the second argument.
+               // set filterFunction to the first argument's value and ignore the second argument.
                if ( typeof limit === 'function' ) {
-                       filterFn = limit;
+                       filterFunction = limit;
                        limit = undefined;
                // Either way, verify it is a function so we don't have to call
                // isFunction again after this.
-               } else if ( !filterFn || typeof filterFn !== 'function' ) {
-                       filterFn = undefined;
+               } else if ( !filterFunction || typeof filterFunction !== 'function' ) {
+                       filterFunction = undefined;
                }
 
                // The following is specific to each element in the collection.
                                return;
                        }
 
-                       if ( filterFn ) {
+                       if ( filterFunction ) {
                                // Save function for reference
-                               $el.data( 'lengthLimit.callback', filterFn );
+                               $el.data( 'lengthLimit.callback', filterFunction );
                        }
 
                        // Remove old event handlers (if there are any)
                        $el.off( '.lengthLimit' );
 
-                       if ( filterFn || !allowNativeMaxlength ) {
+                       if ( filterFunction || !allowNativeMaxlength ) {
                                // Disable the native maxLength (if there is any), because it interferes
                                // with the (differently calculated) character/byte limit.
                                // Aside from being differently calculated,
                                        prevSafeVal,
                                        this.value,
                                        elLimit,
-                                       filterFn
+                                       filterFunction
                                );
 
                                // Only set value property if it was trimmed, because whenever the
         *
         * @param {number} [limit] Limit to enforce, fallsback to maxLength-attribute,
         *  called with fetched value as argument.
-        * @param {Function} [filterFn] Function to call on the string before assessing the length.
+        * @param {Function} [filterFunction] Function to call on the string before assessing the length.
         * @return {jQuery}
         * @chainable
         */
-       $.fn.byteLimit = function ( limit, filterFn ) {
-               return lengthLimit.call( this, trimByteLength, limit, filterFn );
+       $.fn.byteLimit = function ( limit, filterFunction ) {
+               return lengthLimit.call( this, trimByteLength, limit, filterFunction );
        };
 
        /**
         *
         * @param {number} [limit] Limit to enforce, fallsback to maxLength-attribute,
         *  called with fetched value as argument.
-        * @param {Function} [filterFn] Function to call on the string before assessing the length.
+        * @param {Function} [filterFunction] Function to call on the string before assessing the length.
         * @return {jQuery}
         * @chainable
         */
-       $.fn.codePointLimit = function ( limit, filterFn ) {
-               return lengthLimit.call( this, trimCodePointLength, limit, filterFn );
+       $.fn.codePointLimit = function ( limit, filterFunction ) {
+               return lengthLimit.call( this, trimCodePointLength, limit, filterFunction );
        };
 
        /**
index 5d9bef0..5960f93 100644 (file)
         * function, if none, pass empty string.
         * @param {string} newVal New value that may have to be trimmed down.
         * @param {number} byteLimit Number of bytes the value may be in size.
-        * @param {Function} [filterFn] Function to call on the string before assessing the length.
+        * @param {Function} [filterFunction] Function to call on the string before assessing the length.
         * @return {Object}
         * @return {string} return.newVal
         * @return {boolean} return.trimmed
         */
-       function trimByteLength( safeVal, newVal, byteLimit, filterFn ) {
+       function trimByteLength( safeVal, newVal, byteLimit, filterFunction ) {
                var lengthFn;
-               if ( filterFn ) {
+               if ( filterFunction ) {
                        lengthFn = function ( val ) {
-                               return byteLength( filterFn( val ) );
+                               return byteLength( filterFunction( val ) );
                        };
                } else {
                        lengthFn = byteLength;
         * function, if none, pass empty string.
         * @param {string} newVal New value that may have to be trimmed down.
         * @param {number} codePointLimit Number of characters the value may be in size.
-        * @param {Function} [filterFn] Function to call on the string before assessing the length.
+        * @param {Function} [filterFunction] Function to call on the string before assessing the length.
         * @return {Object}
         * @return {string} return.newVal
         * @return {boolean} return.trimmed
         */
-       function trimCodePointLength( safeVal, newVal, codePointLimit, filterFn ) {
+       function trimCodePointLength( safeVal, newVal, codePointLimit, filterFunction ) {
                var lengthFn;
-               if ( filterFn ) {
+               if ( filterFunction ) {
                        lengthFn = function ( val ) {
-                               return codePointLength( filterFn( val ) );
+                               return codePointLength( filterFunction( val ) );
                        };
                } else {
                        lengthFn = codePointLength;
index 7996ea4..a0505cc 100644 (file)
@@ -8,7 +8,7 @@
                        summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
                        reasonList = OO.ui.infuse( $( '#wpDeleteReasonList' ).closest( '.oo-ui-widget' ) ),
                        reason = OO.ui.infuse( $( '#wpReason' ).closest( '.oo-ui-widget' ) ),
-                       filterFn = function ( input ) {
+                       filterFunction = function ( input ) {
                                // Should be built the same as in SpecialRevisionDelete::submit()
                                var comment = reasonList.getValue();
                                if ( comment === 'other' ) {
@@ -22,9 +22,9 @@
 
                // Limit to bytes or UTF-8 codepoints, depending on MediaWiki's configuration
                if ( summaryCodePointLimit ) {
-                       reason.$input.codePointLimit( summaryCodePointLimit, filterFn );
+                       reason.$input.codePointLimit( summaryCodePointLimit, filterFunction );
                } else if ( summaryByteLimit ) {
-                       reason.$input.byteLimit( summaryByteLimit, filterFn );
+                       reason.$input.byteLimit( summaryByteLimit, filterFunction );
                }
        } );
 
index a7228ed..f125748 100644 (file)
@@ -8,7 +8,7 @@
                        summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
                        reasonList = OO.ui.infuse( $( '#wpDeleteReasonList' ).closest( '.oo-ui-widget' ) ),
                        reason = OO.ui.infuse( $( '#wpReason' ).closest( '.oo-ui-widget' ) ),
-                       filterFn = function ( input ) {
+                       filterFunction = function ( input ) {
                                // Should be built the same as in Article::delete()
                                var comment = reasonList.getValue();
                                if ( comment === 'other' ) {
@@ -22,9 +22,9 @@
 
                // Limit to bytes or UTF-8 codepoints, depending on MediaWiki's configuration
                if ( summaryCodePointLimit ) {
-                       reason.$input.codePointLimit( summaryCodePointLimit, filterFn );
+                       reason.$input.codePointLimit( summaryCodePointLimit, filterFunction );
                } else if ( summaryByteLimit ) {
-                       reason.$input.byteLimit( summaryByteLimit, filterFn );
+                       reason.$input.byteLimit( summaryByteLimit, filterFunction );
                }
        } );
 }() );
index 1265637..c6f5b49 100644 (file)
@@ -4,11 +4,6 @@
 
 /* stylelint-disable selector-class-pattern */
 
-// Trigger only when collapsible & JS is available via `.mw-collapsed`.
-#mw-history-search.mw-collapsed .oo-ui-fieldsetLayout-header .oo-ui-labelElement-label {
-       margin-bottom: 0;
-}
-
 #pagehistory .history-user {
        margin-left: 0.4em;
        margin-right: 0.2em;
index 4fa9ee2..63a652d 100644 (file)
        background-color: #fff;
        font-weight: normal;
 }
-
-.mw-json caption {
-       /* For stylistic reasons, suppress the caption of the outermost table */
-       display: none;
-}
-
-.mw-json table caption {
-       color: #72777d;
-       display: inline-block;
-       font-size: 10px;
-       font-style: italic;
-       margin-bottom: 0.5em;
-       text-align: left;
-}
index f356fa2..470d826 100644 (file)
 @ooui-padding-vertical: 4 / @ooui-font-size-browser / @ooui-font-size-base; // equals `0.285714em`≈`4px`
 
 .mw-htmlform-ooui-wrapper.oo-ui-panelLayout-padded {
+       // Reducing `padding-top`, as the heading's `line-height` provides similar distance.
        padding: @ooui-spacing-medium @ooui-spacing-large @ooui-spacing-large;
+
+       // Trigger only when collapsible & JS is available via `.mw-collapsed`.
+       .client-js & .oo-ui-fieldsetLayout.mw-collapsed .oo-ui-fieldsetLayout-header {
+               // Negative margin to match the reduced distance on the top caused by the previous rule.
+               margin-bottom: -( @ooui-spacing-large - @ooui-spacing-medium );
+
+               .oo-ui-labelElement-label {
+                       margin-bottom: 0;
+               }
+       }
 }
 
 .mw-htmlform-ooui {
index 4e5e0fe..0ba75fb 100644 (file)
@@ -105,7 +105,7 @@ function init() {
                {
                        $wrapper: $( 'body' ),
                        $topSection: $topSection,
-                       $filtersContainer: $( '.rcfilters-container' ),
+                       $filtersContainer: $( '.mw-rcfilters-container' ),
                        $changesListContainer: $( '.mw-changeslist, .mw-changeslist-empty' ),
                        $formContainer: $initialFieldset,
                        collapsed: initialCollapsedState
index bc558a5..d3fce46 100644 (file)
@@ -2,8 +2,6 @@
 @import 'mediawiki.ui/variables';
 @import 'mw.rcfilters.mixins';
 
-/* stylelint-disable selector-class-pattern */
-
 @rcfilters-spinner-size: 12px;
 @rcfilters-head-min-height: 210px;
 @rcfilters-head-margin-bottom: 20px;
 
 // Corrections for the standard special page
 .client-js {
+       /* stylelint-disable-next-line selector-class-pattern */
        .cloptions {
                border: 0;
        }
 
        // Reserve space for the UI while it loads
-       .rcfilters-head {
+       .mw-rcfilters-head {
                min-height: @rcfilters-head-min-height;
                margin-bottom: @rcfilters-head-margin-bottom;
        }
 
        // On the watchlist, reserve a bit more
-       .mw-special-Watchlist .rcfilters-head {
+       .mw-special-Watchlist .mw-rcfilters-head {
                min-height: @rcfilters-wl-head-min-height;
        }
 
        .mw-rcfilters-collapsed {
-               .rcfilters-head {
+               .mw-rcfilters-head {
                        min-height: @rcfilters-head-min-height-collapsed;
                }
 
                // On the watchlist, reserve a bit more
-               &.mw-special-Watchlist .rcfilters-head {
+               &.mw-special-Watchlist .mw-rcfilters-head {
                        min-height: @rcfilters-wl-head-min-height-collapsed;
                }
        }
                        }
                }
 
-               .rcfilters-head {
+               .mw-rcfilters-head {
                        opacity: 0.5;
                        pointer-events: none;
 
+                       /* stylelint-disable-next-line selector-class-pattern */
                        .cloptions {
                                display: none;
                        }
                display: none;
        }
 
+       /* stylelint-disable-next-line selector-class-pattern */
        .errorbox {
                display: none;
        }
                opacity: 0.5;
        }
 
-       .rcfilters-spinner {
+       .mw-rcfilters-spinner {
                display: none;
                position: absolute;
                left: 50%;
                margin-left: -3 * @rcfilters-spinner-size / 2;
                white-space: nowrap;
 
-               & .rcfilters-spinner-bounce,
+               & .mw-rcfilters-spinner-bounce,
                &:before,
                &:after {
                        content: '';
                }
        }
 
-       body:not( .mw-rcfilters-ui-initialized ) .rcfilters-spinner {
+       body:not( .mw-rcfilters-ui-initialized ) .mw-rcfilters-spinner {
                display: block;
                // When initializing, display the spinner on top of the area where the UI will appear
                margin-top: -( @rcfilters-head-min-height + @rcfilters-head-margin-bottom ) / 1.5;
        }
 
-       body.mw-rcfilters-ui-loading .rcfilters-spinner {
+       body.mw-rcfilters-ui-loading .mw-rcfilters-spinner {
                display: block;
                // When loading new results, display the spinner on top of the results area
                margin-top: -( @rcfilters-head-min-height + @rcfilters-head-margin-bottom ) / 8;
 
        // Make the watchlist-details message display while loading, but make it not take up any
        // space. This makes the min-height trick work better.
+       /* stylelint-disable-next-line selector-class-pattern */
        .watchlistDetails {
                float: left;
                // The 20em should match the min-width we are setting up
index fed8235..df27f78 100644 (file)
@@ -110,7 +110,6 @@ img {
 
 hr {
        height: 1px;
-       color: #a2a9b1;
        background-color: #a2a9b1;
        border: 0;
        margin: 0.2em 0;
index e9b0e6a..6552750 100644 (file)
@@ -7,7 +7,7 @@
                summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
                $wpRevDeleteReasonList = $( '#wpRevDeleteReasonList' ),
                $wpReason = $( '#wpReason' ),
-               filterFn = function ( input ) {
+               filterFunction = function ( input ) {
                        // Should be built the same as in SpecialRevisionDelete::submit()
                        var comment = $wpRevDeleteReasonList.val();
                        if ( comment === 'other' ) {
@@ -21,9 +21,9 @@
 
        // Limit to bytes or UTF-8 codepoints, depending on MediaWiki's configuration
        if ( summaryCodePointLimit ) {
-               $wpReason.codePointLimit( summaryCodePointLimit, filterFn );
+               $wpReason.codePointLimit( summaryCodePointLimit, filterFunction );
        } else if ( summaryByteLimit ) {
-               $wpReason.byteLimit( summaryByteLimit, filterFn );
+               $wpReason.byteLimit( summaryByteLimit, filterFunction );
        }
 
 }() );
index c7fb48b..57f56f4 100644 (file)
@@ -29,7 +29,7 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
                        'debug' => 'true',
                        'lang' => 'en',
                        'dir' => 'ltr',
-                       'skin' => 'vector',
+                       'skin' => 'fallback',
                        'modules' => 'startup',
                        'only' => 'scripts',
                        'safemode' => null,
index 7f5ec40..a6c00dc 100644 (file)
@@ -993,6 +993,7 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                $this->setMwGlobals( [
                        'wgEmailConfirmToEdit' => true,
                        'wgEmailAuthentication' => true,
+                       'wgBlockDisablesLogin' => false,
                ] );
 
                $this->overrideMwServices();
index f7ffe8d..e5e265f 100644 (file)
@@ -891,6 +891,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->setMwGlobals( [
                        'wgEmailConfirmToEdit' => true,
                        'wgEmailAuthentication' => true,
+                       'wgBlockDisablesLogin' => false,
                ] );
                $this->overrideMwServices();
 
index e29b7e7..c0de1bf 100644 (file)
@@ -157,12 +157,7 @@ class TitleTest extends MediaWikiTestCase {
                        ]
                ] );
 
-               // Reset TitleParser since we modified $wgLocalInterwikis
-               $this->setService( 'TitleParser', new MediaWikiTitleCodec(
-                               Language::factory( 'en' ),
-                               new GenderCache(),
-                               [ 'localtestiw' ]
-               ) );
+               $this->overrideMwServices();
        }
 
        /**
@@ -598,6 +593,27 @@ class TitleTest extends MediaWikiTestCase {
                $this->assertTrue( $clone->equals( $title ) );
        }
 
+       public function provideCastFromLinkTarget() {
+               return array_merge( [ [ null ] ], self::provideNewFromTitleValue() );
+       }
+
+       /**
+        * @covers Title::castFromLinkTarget
+        * @dataProvider provideCastFromLinkTarget
+        */
+       public function testCastFromLinkTarget( $value ) {
+               $title = Title::castFromLinkTarget( $value );
+
+               if ( $value === null ) {
+                       $this->assertNull( $title );
+               } else {
+                       $dbkey = str_replace( ' ', '_', $value->getText() );
+                       $this->assertSame( $dbkey, $title->getDBkey() );
+                       $this->assertSame( $value->getNamespace(), $title->getNamespace() );
+                       $this->assertSame( $value->getFragment(), $title->getFragment() );
+               }
+       }
+
        public static function provideGetTitleValue() {
                return [
                        [ 'Foo' ],
index a95d5c1..ff0e2e6 100644 (file)
@@ -149,16 +149,8 @@ class ApiQueryRecentChangesIntegrationTest extends ApiTestCase {
                return $response[0]['query']['recentchanges'];
        }
 
-       private function getTitleFormatter() {
-               return new MediaWikiTitleCodec(
-                       Language::factory( 'en' ),
-                       MediaWikiServices::getInstance()->getGenderCache()
-               );
-       }
-
        private function getPrefixedText( LinkTarget $target ) {
-               $formatter = $this->getTitleFormatter();
-               return $formatter->getPrefixedText( $target );
+               return MediaWikiServices::getInstance()->getTitleFormatter()->getPrefixedText( $target );
        }
 
        public function testListRecentChanges_returnsRCInfo() {
index 41ecd52..2b08a81 100644 (file)
@@ -228,16 +228,8 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                }
        }
 
-       private function getTitleFormatter() {
-               return new MediaWikiTitleCodec(
-                       Language::factory( 'en' ),
-                       MediaWikiServices::getInstance()->getGenderCache()
-               );
-       }
-
        private function getPrefixedText( LinkTarget $target ) {
-               $formatter = $this->getTitleFormatter();
-               return $formatter->getPrefixedText( $target );
+               return MediaWikiServices::getInstance()->getTitleFormatter()->getPrefixedText( $target );
        }
 
        private function cleanTestUsersWatchlist() {
index 5c53040..60cd4a8 100644 (file)
@@ -14,8 +14,6 @@ class ResourceLoaderContextTest extends PHPUnit\Framework\TestCase {
        protected static function getResourceLoader() {
                return new EmptyResourceLoader( new HashConfig( [
                        'ResourceLoaderDebug' => false,
-                       'DefaultSkin' => 'fallback',
-                       'LanguageCode' => 'nl',
                        'LoadScript' => '/w/load.php',
                ] ) );
        }
@@ -25,7 +23,7 @@ class ResourceLoaderContextTest extends PHPUnit\Framework\TestCase {
 
                // Request parameters
                $this->assertEquals( [], $ctx->getModules() );
-               $this->assertEquals( 'nl', $ctx->getLanguage() );
+               $this->assertEquals( 'qqx', $ctx->getLanguage() );
                $this->assertEquals( false, $ctx->getDebug() );
                $this->assertEquals( null, $ctx->getOnly() );
                $this->assertEquals( 'fallback', $ctx->getSkin() );
@@ -34,7 +32,7 @@ class ResourceLoaderContextTest extends PHPUnit\Framework\TestCase {
 
                // Misc
                $this->assertEquals( 'ltr', $ctx->getDirection() );
-               $this->assertEquals( 'nl|fallback||||||||', $ctx->getHash() );
+               $this->assertEquals( 'qqx|fallback||||||||', $ctx->getHash() );
                $this->assertInstanceOf( User::class, $ctx->getUserObj() );
        }
 
index ea220f1..30e9f30 100644 (file)
@@ -56,9 +56,9 @@ class ResourceLoaderOOUIImageModuleTest extends ResourceLoaderTestCase {
                        'Generated styles use the default image (embed)'
                );
                $this->assertRegExp(
-                       '/vector/',
+                       '/fallback/',
                        $styles['all'],
-                       'Generated styles use the default image (link)'
+                       'Generated styles use the default skin (link)'
                );
        }
 
index 20f0039..b8bf087 100644 (file)
@@ -19,6 +19,8 @@
  * @author Daniel Kinzler
  */
 
+use MediaWiki\Interwiki\InterwikiLookup;
+
 /**
  * @covers MediaWikiTitleCodec
  *
@@ -37,21 +39,6 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                        'wgMetaNamespace' => 'Project',
                        'wgLocalInterwikis' => [ 'localtestiw' ],
                        'wgCapitalLinks' => true,
-
-                       // NOTE: this is why global state is evil.
-                       // TODO: refactor access to the interwiki codes so it can be injected.
-                       'wgHooks' => [
-                               'InterwikiLoadPrefix' => [
-                                       function ( $prefix, &$data ) {
-                                               if ( $prefix === 'localtestiw' ) {
-                                                       $data = [ 'iw_url' => 'localtestiw' ];
-                                               } elseif ( $prefix === 'remotetestiw' ) {
-                                                       $data = [ 'iw_url' => 'remotetestiw' ];
-                                               }
-                                               return false;
-                                       }
-                               ]
-                       ]
                ] );
                $this->setUserLang( 'en' );
                $this->setContentLang( 'en' );
@@ -77,12 +64,60 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                return $genderCache;
        }
 
+       /**
+        * Returns a mock InterwikiLookup that only has an isValidInterwiki() method, which recognizes
+        * 'localtestiw' and 'remotetestiw'. All other methods throw.
+        *
+        * @return InterwikiLookup
+        */
+       private function getInterwikiLookup() : InterwikiLookup {
+               $iwLookup = $this->createMock( InterwikiLookup::class );
+
+               $iwLookup->expects( $this->any() )
+                       ->method( 'isValidInterwiki' )
+                       ->will( $this->returnCallback( function ( $prefix ) {
+                               return $prefix === 'localtestiw' || $prefix === 'remotetestiw';
+                       } ) );
+
+               $iwLookup->expects( $this->never() )
+                       ->method( $this->callback( function ( $name ) {
+                               return $name !== 'isValidInterwiki';
+                       } ) );
+
+               return $iwLookup;
+       }
+
+       /**
+        * Returns a mock NamespaceInfo that has only a hasGenderDistinction() method, which assumes
+        * only NS_USER and NS_USER_TALK have a gender distinction. All other methods throw.
+        *
+        * @return NamespaceInfo
+        */
+       private function getNamespaceInfo() : NamespaceInfo {
+               $nsInfo = $this->createMock( NamespaceInfo::class );
+
+               $nsInfo->expects( $this->any() )
+                       ->method( 'hasGenderDistinction' )
+                       ->will( $this->returnCallback( function ( $ns ) {
+                               return $ns === NS_USER || $ns === NS_USER_TALK;
+                       } ) );
+
+               $nsInfo->expects( $this->never() )
+                       ->method( $this->callback( function ( $name ) {
+                               return $name !== 'hasGenderDistinction';
+                       } ) );
+
+               return $nsInfo;
+       }
+
        protected function makeCodec( $lang ) {
-               $gender = $this->getGenderCache();
-               $lang = Language::factory( $lang );
-               // language object can came from cache, which does not respect test settings
-               $lang->resetNamespaces();
-               return new MediaWikiTitleCodec( $lang, $gender );
+               return new MediaWikiTitleCodec(
+                       Language::factory( $lang ),
+                       $this->getGenderCache(),
+                       [],
+                       $this->getInterwikiLookup(),
+                       $this->getNamespaceInfo()
+               );
        }
 
        public static function provideFormat() {
@@ -298,7 +333,9 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                                new TitleValue( NS_CATEGORY,
                                        'X' . str_repeat( 'x', 247 ) ) ],
                        [ str_repeat( 'x', 252 ), NS_MAIN, 'en',
-                               'X' . str_repeat( 'x', 251 ) ]
+                               'X' . str_repeat( 'x', 251 ) ],
+                       // Test decoding and normalization
+                       [ '&quot;n&#x303;&#34;', NS_MAIN, 'en', new TitleValue( NS_MAIN, '"ñ"' ) ],
                ];
        }
 
index d221b43..bbeb068 100644 (file)
@@ -28,6 +28,7 @@ class TitleValueTest extends MediaWikiTestCase {
 
        public function goodConstructorProvider() {
                return [
+                       [ NS_MAIN, '', 'fragment', '', true, false ],
                        [ NS_USER, 'TestThis', 'stuff', '', true, false ],
                        [ NS_USER, 'TestThis', '', 'baz', false, true ],
                ];
@@ -58,7 +59,7 @@ class TitleValueTest extends MediaWikiTestCase {
 
                        [ NS_MAIN, 5, 'fragment', '' ],
                        [ NS_MAIN, null, 'fragment', '' ],
-                       [ NS_MAIN, '', 'fragment', '' ],
+                       [ NS_USER, '', 'fragment', '' ],
                        [ NS_MAIN, 'foo bar', '', '' ],
                        [ NS_MAIN, 'bar_', '', '' ],
                        [ NS_MAIN, '_foo', '', '' ],