Merge "Update categoriespagetext message"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 1 Aug 2018 10:03:05 +0000 (10:03 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 1 Aug 2018 10:03:05 +0000 (10:03 +0000)
73 files changed:
RELEASE-NOTES-1.32
autoload.php
docs/hooks.txt
includes/DefaultSettings.php
includes/MagicWord.php
includes/MagicWordArray.php
includes/MagicWordFactory.php [new file with mode: 0644]
includes/MediaWikiServices.php
includes/ServiceWiring.php
includes/Title.php
includes/actions/InfoAction.php
includes/api/ApiQuerySiteinfo.php
includes/api/i18n/ar.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/it.json
includes/api/i18n/nb.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/api/i18n/ru.json
includes/api/i18n/uk.json
includes/api/i18n/zh-hans.json
includes/content/WikitextContent.php
includes/content/WikitextContentHandler.php
includes/deferred/LinksUpdate.php
includes/jobqueue/jobs/DoubleRedirectJob.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/logging/LogEventsList.php
includes/pager/ReverseChronologicalPager.php
includes/parser/CoreParserFunctions.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/user/User.php
languages/i18n/az.json
languages/i18n/be-tarask.json
languages/i18n/bn.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/en.json
languages/i18n/fa.json
languages/i18n/hr.json
languages/i18n/hyw.json
languages/i18n/inh.json
languages/i18n/ka.json
languages/i18n/kw.json
languages/i18n/nb.json
languages/i18n/pl.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/ru.json
languages/i18n/sr-ec.json
languages/i18n/te.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/zgh.json
languages/i18n/zh-hant.json
languages/messages/MessagesUr.php
tests/parser/ParserTestRunner.php
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/content/JavaScriptContentTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/content/WikitextContentTest.php
tests/phpunit/includes/session/CookieSessionProviderTest.php
tests/phpunit/includes/session/PHPSessionHandlerTest.php
tests/phpunit/includes/specials/SpecialPageExecutor.php
tests/phpunit/structure/SpecialPageFatalTest.php [new file with mode: 0644]
tests/selenium/specs/user.js

index 9c6609b..baa520c 100644 (file)
@@ -66,6 +66,8 @@ production.
   remove or otherwise alter the elements to be output in the page <head>.
 * (T28934) The 'HistoryPageToolLinks' hook allows extensions to append
   additional links to the subtitle of a history page.
+* The 'GetLinkColours' hook now receives an additional $title parameter,
+  the Title object of the page being parsed, on which the links will be shown.
 
 === External library changes in 1.32 ===
 * …
@@ -229,6 +231,11 @@ because of Phabricator reports.
   * getItemsData: Use getItems instead and get the data property
 * Two OutputPage methods, addMetadataLink() and getMetadataAttribute(), were
   removed.  Use addLink() instead.
+* All MagicWord static member variables have been removed.  Use appropriate
+  hooks or MagicWordFactory methods instead.
+* MagicWord::clearCache() has been removed.  Instead, create a new
+  MagicWordFactory, such as by calling
+  resetServiceForTesting( 'MagicWordFactory' ) on a MediaWikiServices.
 
 === Deprecations in 1.32 ===
 * Use of a StartProfiler.php file is deprecated in favour of placing
@@ -324,6 +331,8 @@ because of Phabricator reports.
 * The $wgExternalDiffEngine value 'wikidiff2' is deprecated. To use wikidiff2
   just enable the PHP extension, and it will be autodetected.
 * The wfUseMW function, soft-deprecated in 1.26, is now hard deprecated.
+* All MagicWord static methods are now deprecated.  Use the MagicWordFactory
+  methods instead.
 
 === Other changes in 1.32 ===
 * (T198811) The following tables have had their UNIQUE indexes turned into
index 7588060..b5b5c52 100644 (file)
@@ -832,6 +832,7 @@ $wgAutoloadLocalClasses = [
        'MachineReadableRCFeedFormatter' => __DIR__ . '/includes/rcfeed/MachineReadableRCFeedFormatter.php',
        'MagicWord' => __DIR__ . '/includes/MagicWord.php',
        'MagicWordArray' => __DIR__ . '/includes/MagicWordArray.php',
+       'MagicWordFactory' => __DIR__ . '/includes/MagicWordFactory.php',
        'MailAddress' => __DIR__ . '/includes/mail/MailAddress.php',
        'MainConfigDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
        'MaintainableDBConnRef' => __DIR__ . '/includes/libs/rdbms/database/MaintainableDBConnRef.php',
index 251bea6..219c51f 100644 (file)
@@ -1730,6 +1730,7 @@ $query: query options passed to Title::getInternalURL()
 $linkcolour_ids: array of prefixed DB keys of the pages linked to,
   indexed by page_id.
 &$colours: (output) array of CSS classes, indexed by prefixed DB keys
+$title: Title object of the page being parsed, on which the links will be shown
 
 'GetLocalURL': Modify local URLs as output into page links. Note that if you are
 working with internal urls (non-interwiki) then it may be preferable to work
index 03dbfb9..27769f9 100644 (file)
@@ -7206,7 +7206,7 @@ $wgRightsUrl = null;
 
 /**
  * If either $wgRightsUrl or $wgRightsPage is specified then this variable gives the text for the
- * link.
+ * link. Otherwise, it will be treated as raw HTML.
  * If using $wgRightsUrl then this value must be specified. If using $wgRightsPage then the name
  * of the page will also be used as the link if this variable is not set.
  */
index 9cef700..a193c9f 100644 (file)
  * @ingroup Parser
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class encapsulates "magic words" such as "#redirect", __NOTOC__, etc.
  *
  * @par Usage:
  * @code
- *     if (MagicWord::get( 'redirect' )->match( $text ) ) {
+ *     if ( $magicWordFactory->get( 'redirect' )->match( $text ) ) {
  *       // some code
  *     }
  * @endcode
  *
- * Possible future improvements:
- *   * Simultaneous searching for a number of magic words
- *   * MagicWord::$mObjects in shared memory
- *
  * Please avoid reading the data out of one of these objects and then writing
  * special case code. If possible, add another match()-like function here.
  *
@@ -92,170 +90,12 @@ class MagicWord {
        /** @var bool */
        private $mFound = false;
 
-       /** @var bool */
-       public static $mVariableIDsInitialised = false;
-
-       /** @var string[] */
-       public static $mVariableIDs = [
-               '!',
-               'currentmonth',
-               'currentmonth1',
-               'currentmonthname',
-               'currentmonthnamegen',
-               'currentmonthabbrev',
-               'currentday',
-               'currentday2',
-               'currentdayname',
-               'currentyear',
-               'currenttime',
-               'currenthour',
-               'localmonth',
-               'localmonth1',
-               'localmonthname',
-               'localmonthnamegen',
-               'localmonthabbrev',
-               'localday',
-               'localday2',
-               'localdayname',
-               'localyear',
-               'localtime',
-               'localhour',
-               'numberofarticles',
-               'numberoffiles',
-               'numberofedits',
-               'articlepath',
-               'pageid',
-               'sitename',
-               'server',
-               'servername',
-               'scriptpath',
-               'stylepath',
-               'pagename',
-               'pagenamee',
-               'fullpagename',
-               'fullpagenamee',
-               'namespace',
-               'namespacee',
-               'namespacenumber',
-               'currentweek',
-               'currentdow',
-               'localweek',
-               'localdow',
-               'revisionid',
-               'revisionday',
-               'revisionday2',
-               'revisionmonth',
-               'revisionmonth1',
-               'revisionyear',
-               'revisiontimestamp',
-               'revisionuser',
-               'revisionsize',
-               'subpagename',
-               'subpagenamee',
-               'talkspace',
-               'talkspacee',
-               'subjectspace',
-               'subjectspacee',
-               'talkpagename',
-               'talkpagenamee',
-               'subjectpagename',
-               'subjectpagenamee',
-               'numberofusers',
-               'numberofactiveusers',
-               'numberofpages',
-               'currentversion',
-               'rootpagename',
-               'rootpagenamee',
-               'basepagename',
-               'basepagenamee',
-               'currenttimestamp',
-               'localtimestamp',
-               'directionmark',
-               'contentlanguage',
-               'pagelanguage',
-               'numberofadmins',
-               'cascadingsources',
-       ];
-
-       /** Array of caching hints for ParserCache
-        * @var array [ string => int ]
-        */
-       public static $mCacheTTLs = [
-               'currentmonth' => 86400,
-               'currentmonth1' => 86400,
-               'currentmonthname' => 86400,
-               'currentmonthnamegen' => 86400,
-               'currentmonthabbrev' => 86400,
-               'currentday' => 3600,
-               'currentday2' => 3600,
-               'currentdayname' => 3600,
-               'currentyear' => 86400,
-               'currenttime' => 3600,
-               'currenthour' => 3600,
-               'localmonth' => 86400,
-               'localmonth1' => 86400,
-               'localmonthname' => 86400,
-               'localmonthnamegen' => 86400,
-               'localmonthabbrev' => 86400,
-               'localday' => 3600,
-               'localday2' => 3600,
-               'localdayname' => 3600,
-               'localyear' => 86400,
-               'localtime' => 3600,
-               'localhour' => 3600,
-               'numberofarticles' => 3600,
-               'numberoffiles' => 3600,
-               'numberofedits' => 3600,
-               'currentweek' => 3600,
-               'currentdow' => 3600,
-               'localweek' => 3600,
-               'localdow' => 3600,
-               'numberofusers' => 3600,
-               'numberofactiveusers' => 3600,
-               'numberofpages' => 3600,
-               'currentversion' => 86400,
-               'currenttimestamp' => 3600,
-               'localtimestamp' => 3600,
-               'pagesinnamespace' => 3600,
-               'numberofadmins' => 3600,
-               'numberingroup' => 3600,
-       ];
-
-       /** @var string[] */
-       public static $mDoubleUnderscoreIDs = [
-               'notoc',
-               'nogallery',
-               'forcetoc',
-               'toc',
-               'noeditsection',
-               'newsectionlink',
-               'nonewsectionlink',
-               'hiddencat',
-               'index',
-               'noindex',
-               'staticredirect',
-               'notitleconvert',
-               'nocontentconvert',
-       ];
-
-       /** @var string[] */
-       public static $mSubstIDs = [
-               'subst',
-               'safesubst',
-       ];
-
-       /** @var array [ string => MagicWord ] */
-       public static $mObjects = [];
-
-       /** @var MagicWordArray */
-       public static $mDoubleUnderscoreArray = null;
-
        /**#@-*/
 
        /**
         * Create a new MagicWord object
         *
-        * Use factory instead: MagicWord::get
+        * Use factory instead: MagicWordFactory::get
         *
         * @param string|null $id The internal name of the magic word
         * @param string[]|string $syn synonyms for the magic word
@@ -273,36 +113,29 @@ class MagicWord {
         * @param string $id The internal name of the magic word
         *
         * @return MagicWord
+        * @deprecated since 1.32, use MagicWordFactory::get
         */
-       public static function &get( $id ) {
-               if ( !isset( self::$mObjects[$id] ) ) {
-                       $mw = new MagicWord();
-                       $mw->load( $id );
-                       self::$mObjects[$id] = $mw;
-               }
-               return self::$mObjects[$id];
+       public static function get( $id ) {
+               return MediaWikiServices::getInstance()->getMagicWordFactory()->get( $id );
        }
 
        /**
         * Get an array of parser variable IDs
         *
         * @return string[]
+        * @deprecated since 1.32, use MagicWordFactory::getVariableIDs
         */
        public static function getVariableIDs() {
-               if ( !self::$mVariableIDsInitialised ) {
-                       # Get variable IDs
-                       Hooks::run( 'MagicWordwgVariableIDs', [ &self::$mVariableIDs ] );
-                       self::$mVariableIDsInitialised = true;
-               }
-               return self::$mVariableIDs;
+               return MediaWikiServices::getInstance()->getMagicWordFactory()->getVariableIDs();
        }
 
        /**
         * Get an array of parser substitution modifier IDs
         * @return string[]
+        * @deprecated since 1.32, use MagicWordFactory::getSubstIDs
         */
        public static function getSubstIDs() {
-               return self::$mSubstIDs;
+               return MediaWikiServices::getInstance()->getMagicWordFactory()->getSubstIDs();
        }
 
        /**
@@ -310,34 +143,20 @@ class MagicWord {
         *
         * @param string $id
         * @return int
+        * @deprecated since 1.32, use MagicWordFactory::getCacheTTL
         */
        public static function getCacheTTL( $id ) {
-               if ( array_key_exists( $id, self::$mCacheTTLs ) ) {
-                       return self::$mCacheTTLs[$id];
-               } else {
-                       return -1;
-               }
+               return MediaWikiServices::getInstance()->getMagicWordFactory()->getCacheTTL( $id );
        }
 
        /**
         * Get a MagicWordArray of double-underscore entities
         *
         * @return MagicWordArray
+        * @deprecated since 1.32, use MagicWordFactory::getDoubleUnderscoreArray
         */
        public static function getDoubleUnderscoreArray() {
-               if ( is_null( self::$mDoubleUnderscoreArray ) ) {
-                       Hooks::run( 'GetDoubleUnderscoreIDs', [ &self::$mDoubleUnderscoreIDs ] );
-                       self::$mDoubleUnderscoreArray = new MagicWordArray( self::$mDoubleUnderscoreIDs );
-               }
-               return self::$mDoubleUnderscoreArray;
-       }
-
-       /**
-        * Clear the self::$mObjects variable
-        * For use in parser tests
-        */
-       public static function clearCache() {
-               self::$mObjects = [];
+               return MediaWikiServices::getInstance()->getMagicWordFactory()->getDoubleUnderscoreArray();
        }
 
        /**
index 4010ec7..20ac680 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Class for handling an array of magic words
@@ -32,6 +33,9 @@ class MagicWordArray {
        /** @var array */
        public $names = [];
 
+       /** @var MagicWordFactory */
+       private $factory;
+
        /** @var array */
        private $hash;
 
@@ -41,9 +45,14 @@ class MagicWordArray {
 
        /**
         * @param array $names
+        * @param MagicWordFactory|null $factory
         */
-       public function __construct( $names = [] ) {
+       public function __construct( $names = [], MagicWordFactory $factory = null ) {
                $this->names = $names;
+               $this->factory = $factory;
+               if ( !$factory ) {
+                       $this->factory = MediaWikiServices::getInstance()->getMagicWordFactory();
+               }
        }
 
        /**
@@ -75,7 +84,7 @@ class MagicWordArray {
                        global $wgContLang;
                        $this->hash = [ 0 => [], 1 => [] ];
                        foreach ( $this->names as $name ) {
-                               $magic = MagicWord::get( $name );
+                               $magic = $this->factory->get( $name );
                                $case = intval( $magic->isCaseSensitive() );
                                foreach ( $magic->getSynonyms() as $syn ) {
                                        if ( !$case ) {
@@ -97,7 +106,7 @@ class MagicWordArray {
                        $this->baseRegex = [ 0 => '', 1 => '' ];
                        $allGroups = [];
                        foreach ( $this->names as $name ) {
-                               $magic = MagicWord::get( $name );
+                               $magic = $this->factory->get( $name );
                                $case = intval( $magic->isCaseSensitive() );
                                foreach ( $magic->getSynonyms() as $i => $syn ) {
                                        // Group name must start with a non-digit in PCRE 8.34+
diff --git a/includes/MagicWordFactory.php b/includes/MagicWordFactory.php
new file mode 100644 (file)
index 0000000..15a7678
--- /dev/null
@@ -0,0 +1,271 @@
+<?php
+/**
+ * See docs/magicword.txt.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Parser
+ */
+
+/**
+ * A factory that stores information about MagicWords, and creates them on demand with caching.
+ *
+ * Possible future improvements:
+ *   * Simultaneous searching for a number of magic words
+ *   * $mObjects in shared memory
+ *
+ * @since 1.32
+ * @ingroup Parser
+ */
+class MagicWordFactory {
+       /**#@-*/
+
+       /** @var bool */
+       private $mVariableIDsInitialised = false;
+
+       /** @var string[] */
+       private $mVariableIDs = [
+               '!',
+               'currentmonth',
+               'currentmonth1',
+               'currentmonthname',
+               'currentmonthnamegen',
+               'currentmonthabbrev',
+               'currentday',
+               'currentday2',
+               'currentdayname',
+               'currentyear',
+               'currenttime',
+               'currenthour',
+               'localmonth',
+               'localmonth1',
+               'localmonthname',
+               'localmonthnamegen',
+               'localmonthabbrev',
+               'localday',
+               'localday2',
+               'localdayname',
+               'localyear',
+               'localtime',
+               'localhour',
+               'numberofarticles',
+               'numberoffiles',
+               'numberofedits',
+               'articlepath',
+               'pageid',
+               'sitename',
+               'server',
+               'servername',
+               'scriptpath',
+               'stylepath',
+               'pagename',
+               'pagenamee',
+               'fullpagename',
+               'fullpagenamee',
+               'namespace',
+               'namespacee',
+               'namespacenumber',
+               'currentweek',
+               'currentdow',
+               'localweek',
+               'localdow',
+               'revisionid',
+               'revisionday',
+               'revisionday2',
+               'revisionmonth',
+               'revisionmonth1',
+               'revisionyear',
+               'revisiontimestamp',
+               'revisionuser',
+               'revisionsize',
+               'subpagename',
+               'subpagenamee',
+               'talkspace',
+               'talkspacee',
+               'subjectspace',
+               'subjectspacee',
+               'talkpagename',
+               'talkpagenamee',
+               'subjectpagename',
+               'subjectpagenamee',
+               'numberofusers',
+               'numberofactiveusers',
+               'numberofpages',
+               'currentversion',
+               'rootpagename',
+               'rootpagenamee',
+               'basepagename',
+               'basepagenamee',
+               'currenttimestamp',
+               'localtimestamp',
+               'directionmark',
+               'contentlanguage',
+               'pagelanguage',
+               'numberofadmins',
+               'cascadingsources',
+       ];
+
+       /** Array of caching hints for ParserCache
+        * @var array [ string => int ]
+        */
+       private $mCacheTTLs = [
+               'currentmonth' => 86400,
+               'currentmonth1' => 86400,
+               'currentmonthname' => 86400,
+               'currentmonthnamegen' => 86400,
+               'currentmonthabbrev' => 86400,
+               'currentday' => 3600,
+               'currentday2' => 3600,
+               'currentdayname' => 3600,
+               'currentyear' => 86400,
+               'currenttime' => 3600,
+               'currenthour' => 3600,
+               'localmonth' => 86400,
+               'localmonth1' => 86400,
+               'localmonthname' => 86400,
+               'localmonthnamegen' => 86400,
+               'localmonthabbrev' => 86400,
+               'localday' => 3600,
+               'localday2' => 3600,
+               'localdayname' => 3600,
+               'localyear' => 86400,
+               'localtime' => 3600,
+               'localhour' => 3600,
+               'numberofarticles' => 3600,
+               'numberoffiles' => 3600,
+               'numberofedits' => 3600,
+               'currentweek' => 3600,
+               'currentdow' => 3600,
+               'localweek' => 3600,
+               'localdow' => 3600,
+               'numberofusers' => 3600,
+               'numberofactiveusers' => 3600,
+               'numberofpages' => 3600,
+               'currentversion' => 86400,
+               'currenttimestamp' => 3600,
+               'localtimestamp' => 3600,
+               'pagesinnamespace' => 3600,
+               'numberofadmins' => 3600,
+               'numberingroup' => 3600,
+       ];
+
+       /** @var string[] */
+       private $mDoubleUnderscoreIDs = [
+               'notoc',
+               'nogallery',
+               'forcetoc',
+               'toc',
+               'noeditsection',
+               'newsectionlink',
+               'nonewsectionlink',
+               'hiddencat',
+               'index',
+               'noindex',
+               'staticredirect',
+               'notitleconvert',
+               'nocontentconvert',
+       ];
+
+       /** @var string[] */
+       private $mSubstIDs = [
+               'subst',
+               'safesubst',
+       ];
+
+       /** @var array [ string => MagicWord ] */
+       private $mObjects = [];
+
+       /** @var MagicWordArray */
+       private $mDoubleUnderscoreArray = null;
+
+       /**#@-*/
+
+       /**
+        * Factory: creates an object representing an ID
+        *
+        * @param string $id The internal name of the magic word
+        *
+        * @return MagicWord
+        */
+       public function get( $id ) {
+               if ( !isset( $this->mObjects[$id] ) ) {
+                       $mw = new MagicWord();
+                       $mw->load( $id );
+                       $this->mObjects[$id] = $mw;
+               }
+               return $this->mObjects[$id];
+       }
+
+       /**
+        * Get an array of parser variable IDs
+        *
+        * @return string[]
+        */
+       public function getVariableIDs() {
+               if ( !$this->mVariableIDsInitialised ) {
+                       # Get variable IDs
+                       Hooks::run( 'MagicWordwgVariableIDs', [ &$this->mVariableIDs ] );
+                       $this->mVariableIDsInitialised = true;
+               }
+               return $this->mVariableIDs;
+       }
+
+       /**
+        * Get an array of parser substitution modifier IDs
+        * @return string[]
+        */
+       public function getSubstIDs() {
+               return $this->mSubstIDs;
+       }
+
+       /**
+        * Allow external reads of TTL array
+        *
+        * @param string $id
+        * @return int
+        */
+       public function getCacheTTL( $id ) {
+               if ( array_key_exists( $id, $this->mCacheTTLs ) ) {
+                       return $this->mCacheTTLs[$id];
+               } else {
+                       return -1;
+               }
+       }
+
+       /**
+        * Get a MagicWordArray of double-underscore entities
+        *
+        * @return MagicWordArray
+        */
+       public function getDoubleUnderscoreArray() {
+               if ( is_null( $this->mDoubleUnderscoreArray ) ) {
+                       Hooks::run( 'GetDoubleUnderscoreIDs', [ &$this->mDoubleUnderscoreIDs ] );
+                       $this->mDoubleUnderscoreArray = $this->newArray( $this->mDoubleUnderscoreIDs );
+               }
+               return $this->mDoubleUnderscoreArray;
+       }
+
+       /**
+        * Get a new MagicWordArray with provided $names
+        *
+        * @param array $names
+        * @return MagicWordArray
+        */
+       public function newArray( array $names = [] ) : MagicWordArray {
+               return new MagicWordArray( $names, $this );
+       }
+}
index fba15c1..f891042 100644 (file)
@@ -51,6 +51,7 @@ use TitleFormatter;
 use TitleParser;
 use VirtualRESTServiceClient;
 use MediaWiki\Interwiki\InterwikiLookup;
+use MagicWordFactory;
 
 /**
  * Service locator for MediaWiki core services.
@@ -864,6 +865,14 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'ConfigRepository' );
        }
 
+       /**
+        * @since 1.32
+        * @return MagicWordFactory
+        */
+       public function getMagicWordFactory() {
+               return $this->getService( 'MagicWordFactory' );
+       }
+
        ///////////////////////////////////////////////////////////////////////////
        // NOTE: When adding a service getter here, don't forget to add a test
        // case for it in MediaWikiServicesTest::provideGetters() and in
index 7d49080..66b4c0c 100644 (file)
@@ -137,7 +137,7 @@ return [
                $config = $services->getMainConfig();
                $wiki = $config->get( 'DBname' );
                return new BufferingStatsdDataFactory(
-                       rtrim( $services->getMainConfig()->get( 'StatsdMetricPrefix' ), '.' ) . $wiki
+                       rtrim( $services->getMainConfig()->get( 'StatsdMetricPrefix' ) ) . '.' . $wiki
                );
        },
 
@@ -301,7 +301,8 @@ return [
 
        'Parser' => function ( MediaWikiServices $services ) {
                $conf = $services->getMainConfig()->get( 'ParserConf' );
-               return ObjectFactory::constructClassInstance( $conf['class'], [ $conf ] );
+               return ObjectFactory::constructClassInstance( $conf['class'],
+                       [ $conf, $services->getMagicWordFactory() ] );
        },
 
        'ParserCache' => function ( MediaWikiServices $services ) {
@@ -600,6 +601,11 @@ return [
                );
        },
 
+       'MagicWordFactory' => function ( MediaWikiServices $services ) {
+               global $wgContLang;
+               return new MagicWordFactory( $wgContLang );
+       },
+
        ///////////////////////////////////////////////////////////////////////////
        // NOTE: When adding a service here, don't forget to add a getter function
        // in the MediaWikiServices class. The convenience getter should just call
index d3e0622..cc7d722 100644 (file)
@@ -2377,14 +2377,25 @@ class Title implements LinkTarget {
         */
        private function checkSiteConfigPermissions( $action, $user, $errors, $rigor, $short ) {
                if ( $action != 'patrol' ) {
+                       $error = null;
                        // Sitewide CSS/JSON/JS changes, like all NS_MEDIAWIKI changes, also require the
                        // editinterface right. That's implemented as a restriction so no check needed here.
                        if ( $this->isSiteCssConfigPage() && !$user->isAllowed( 'editsitecss' ) ) {
-                               $errors[] = [ 'sitecssprotected', $action ];
+                               $error = [ 'sitecssprotected', $action ];
                        } elseif ( $this->isSiteJsonConfigPage() && !$user->isAllowed( 'editsitejson' ) ) {
-                               $errors[] = [ 'sitejsonprotected', $action ];
+                               $error = [ 'sitejsonprotected', $action ];
                        } elseif ( $this->isSiteJsConfigPage() && !$user->isAllowed( 'editsitejs' ) ) {
-                               $errors[] = [ 'sitejsprotected', $action ];
+                               $error = [ 'sitejsprotected', $action ];
+                       }
+
+                       if ( $error ) {
+                               if ( $user->isAllowed( 'editinterface' ) ) {
+                                       // Most users / site admins will probably find out about the new, more restrictive
+                                       // permissions by failing to edit something. Give them more info.
+                                       // TODO remove this a few release cycles after 1.32
+                                       $error = [ 'interfaceadmin-info', wfMessage( $error[0], $error[1] ) ];
+                               }
+                               $errors[] = $error;
                        }
                }
 
index 98dfeb3..e77cdf7 100644 (file)
@@ -209,12 +209,14 @@ class InfoAction extends FormlessAction {
        protected function pageInfo() {
                global $wgContLang;
 
+               $services = MediaWikiServices::getInstance();
+
                $user = $this->getUser();
                $lang = $this->getLanguage();
                $title = $this->getTitle();
                $id = $title->getArticleID();
                $config = $this->context->getConfig();
-               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+               $linkRenderer = $services->getLinkRenderer();
 
                $pageCounts = $this->pageCounts( $this->page );
 
@@ -599,7 +601,7 @@ class InfoAction extends FormlessAction {
                ];
 
                // Array of MagicWord objects
-               $magicWords = MagicWord::getDoubleUnderscoreArray();
+               $magicWords = $services->getMagicWordFactory()->getDoubleUnderscoreArray();
 
                // Array of magic word IDs
                $wordIDs = $magicWords->names;
index 4b408fc..7d4b55f 100644 (file)
@@ -808,7 +808,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        public function appendVariables( $property ) {
-               $variables = MagicWord::getVariableIDs();
+               $variables = MediaWikiServices::getInstance()->getMagicWordFactory()->getVariableIDs();
                ApiResult::setArrayType( $variables, 'BCarray' );
                ApiResult::setIndexedTagName( $variables, 'v' );
 
index 313cb02..8c69b9d 100644 (file)
        "apierror-sectionsnotsupported": "الأقسام غير مدعومة لنموذج المحتوى $1.",
        "apierror-sectionsnotsupported-what": "الأقسام غير مدعومة بواسطة $1.",
        "apierror-show": "وسيط غير صحيحة; قد لا يتم تقديم قيم خاصة متبادلة.",
-       "apierror-siteinfo-includealldenied": "يمكن عرض جميع معلومات الخوادم ما لم يكن <var>$wgShowHostNames</var> صحيحا.",
+       "apierror-siteinfo-includealldenied": "يمكن عرض جميع معلومات الخوادم ما لم يكن <var>$wgShowHostnames</var> صحيحا.",
        "apierror-sizediffdisabled": "تم تعطيل فرق الحجم في وضع Miser.",
        "apierror-spamdetected": "تم رفض تعديلك لأنه يحتوي على جزء من الرسائل غير المرغوب فيها: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "ليست لديك صلاحية لعرض نتائج هذه الصفحة الخاصة.",
        "apiwarn-checktoken-percentencoding": "تحقق من أن الرموز مثل \"+\" في الرمز المميز يتم ترميزها بشكل صحيح في المسار.",
        "apiwarn-compare-nocontentmodel": "لا يمكن تحديد نموذج محتوى، على افتراض $1.",
        "apiwarn-deprecation-deletedrevs": "تم إيقاف <kbd>list=deletedrevs</kbd>; الرجاء استخدام <kbd>prop=deletedrevisions</kbd> or <kbd>list=alldeletedrevisions</kbd> بدلا من ذلك.",
-       "apiwarn-deprecation-expandtemplates-prop": "نظرا لعدم تحديد أية قيم للوسيط <var>prop</var>; تم استخدام تنسيق قديم للإخراج، تم إيقاف هذا التنسيق، وفي المستقبل، سيتم تعيين قيمة افتراضية للوسيط <var>prop</var>، مما يؤدي إلى استخدام التنسيق الجديد دائما.",
        "apiwarn-deprecation-httpsexpected": "HTTP المستخدمة عند توقع HTTPS.",
        "apiwarn-deprecation-login-botpw": "تم إيقاف تسجيل الدخول إلى الحساب الرئيسي عبر <kbd>action=login</kbd> وقد يتوقف عن العمل دون سابق إنذار، لمتابعة تسجيل الدخول باستخدام <kbd>action=login</kbd>; راجع [[Special:BotPasswords]]، لمتابعة استخدام تسجيل الدخول إلى الحساب الرئيسي بأمان; راجع <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "تم إيقاف تسجيل الدخول إلى الحساب الرئيسي عبر <kbd>action=login</kbd>، وقد يتوقف عن العمل دون سابق إنذار، لتسجيل الدخول بأمان; راجع <kbd>action=clientlogin</kbd>.",
index 54fbef8..5bdc3c9 100644 (file)
        "apihelp-query+revisions+base-paramvalue-prop-user": "Benutzer, der die Version erstellt hat.",
        "apihelp-query+revisions+base-paramvalue-prop-userid": "Benutzerkennung des Versionserstellers.",
        "apihelp-query+revisions+base-paramvalue-prop-size": "Länge in Bytes der Version.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsize": "Länge (Bytes) eines jeden Versionsschlitzes.",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1-Prüfsumme (Basis 16) der Version.",
-       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "Inhaltsmodell-Kennung der Version.",
-       "apihelp-query+revisions+base-paramvalue-prop-content": "Text der Version.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsha1": "SHA-1 (Basis 16) eines jeden Versionsschlitzes.",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "Inhaltsmodell-Kennung eines jeden Versionsschlitzes.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Inhalt eines jeden Versionsschlitzes.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Markierungen für die Version.",
+       "apihelp-query+revisions+base-paramvalue-prop-roles": "Die Liste enthält Schlitzregeln, die in der Version vorhanden sind.",
        "apihelp-query+search-param-what": "Welcher Suchtyp ausgeführt werden soll.",
        "apihelp-query+search-param-info": "Welche Metadaten zurückgegeben werden sollen.",
        "apihelp-query+search-param-prop": "Eigenschaften zur Rückgabe:",
        "apierror-unknownerror-nocode": "Unbekannter Fehler.",
        "apierror-unknownerror": "Unbekannter Fehler: „$1“.",
        "apierror-unknownformat": "Nicht erkanntes Format „$1“.",
+       "apiwarn-deprecation-missingparam": "Da <var>$1</var> nicht angegeben wurde, wurde ein veraltetes Format für die Ausgabe verwendet. Dieses Format ist veraltet und in Zukunft wird immer das neue Format benutzt.",
        "apiwarn-ignoring-invalid-templated-value": "Ignorieren des Wertes <kbd>$2</kbd> in <var>$1</var> bei der Verarbeitung von Vorlagenparametern.",
        "apiwarn-invalidcategory": "„$1“ ist keine Kategorie.",
        "apiwarn-invalidtitle": "„$1“ ist kein gültiger Titel.",
index 44b4dfd..3c74f25 100644 (file)
        "apierror-sectionsnotsupported": "Sections are not supported for content model $1.",
        "apierror-sectionsnotsupported-what": "Sections are not supported by $1.",
        "apierror-show": "Incorrect parameter - mutually exclusive values may not be supplied.",
-       "apierror-siteinfo-includealldenied": "Cannot view all servers' info unless <var>$wgShowHostNames</var> is true.",
+       "apierror-siteinfo-includealldenied": "Cannot view all servers' info unless <var>$wgShowHostnames</var> is true.",
        "apierror-sizediffdisabled": "Size difference is disabled in Miser Mode.",
        "apierror-spamdetected": "Your edit was refused because it contained a spam fragment: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "You don't have permission to view the results of this special page.",
index b23a5f8..f807411 100644 (file)
        "apierror-sectionsnotsupported": "Las secciones no son compatibles con el modelo de contenido $1.",
        "apierror-sectionsnotsupported-what": "Las secciones no son compatibles con $1.",
        "apierror-show": "Parámetro incorrecto: no se pueden proporcionar valores mutuamente excluyentes.",
-       "apierror-siteinfo-includealldenied": "No se puede ver la información de todos los servidores a menos que <var>$wgShowHostNames</var> tenga valor verdadero.",
+       "apierror-siteinfo-includealldenied": "No se puede ver la información de todos los servidores a menos que <var>$wgShowHostnames</var> tenga valor verdadero.",
        "apierror-sizediffdisabled": "La diferencia de tamaño está deshabilitada en el modo avaro.",
        "apierror-spamdetected": "Tu edición fue rechazada por contener un fragmento de spam: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "No tienes permiso para ver los resultados de esta página especial.",
        "apiwarn-badurlparam": "No se pudo analizar <var>$1urlparam</var> para $2. Se utilizarán solamente la anchura y altura.",
        "apiwarn-badutf8": "El valor pasado para <var>$1</var> contiene datos no válidos o no normalizados. Los datos textuales deberían estar en Unicode válido, normalizado en NFC y sin caracteres de control C0 excepto HT (\\t), LF (\\n) y CR (\\r).",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> ha quedado obsoleto. En su lugar, utiliza <kbd>prop=deletedrevisions</kbd> o <kbd>list=alldeletedrevisions</kbd>.",
-       "apiwarn-deprecation-expandtemplates-prop": "Como no se ha especificado ningún valor para el parámetro <var>prop</var>, se ha utilizado un formato heredado para la salida. Este formato está en desuso y, en el futuro, el parámetro <var>prop</var> tendrá un valor predeterminado, de forma que siempre se utilizará el formato nuevo.",
        "apiwarn-deprecation-httpsexpected": "Se ha utilizado HTTP cuando se esperaba HTTPS.",
        "apiwarn-deprecation-login-botpw": "El inicio de sesión con la cuenta principal mediante <kbd>action=login</kbd> está en desuso y puede dejar de funcionar sin aviso previo. Para proseguir el inicio de sesión mediante <kbd>action=login</kbd>, véase [[Special:BotPasswords]]. Para proseguir el inicio de sesión con la cuenta principal de forma segura, véase <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "El inicio de sesión con la cuenta principal mediante <kbd>action=login</kbd> está en desuso y puede dejar de funcionar sin aviso previo. Para iniciar sesión de forma segura, véase <kbd>action=clientlogin</kbd>.",
index 32c0192..5652404 100644 (file)
        "apihelp-query+revisions+base-paramvalue-prop-user": "L’utilisateur qui a fait la révision.",
        "apihelp-query+revisions+base-paramvalue-prop-userid": "L’ID de l’utilisateur créateur de la révision.",
        "apihelp-query+revisions+base-paramvalue-prop-size": "Longueur (en octets) de la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsize": "Longueur (en octets) de chaque emplacement de révision.",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "Hachage SHA-1 (base 16) de la révision.",
-       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "ID du modèle de contenu de la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsha1": "SHA-1 (base 16) de chaque emplacement de révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "ID du modèle de contenu de chaque emplacement de révision.",
        "apihelp-query+revisions+base-paramvalue-prop-comment": "Commentaire de l’utilisateur sur la révision.",
        "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Commentaire analysé de l’utilisateur sur la révision.",
-       "apihelp-query+revisions+base-paramvalue-prop-content": "Texte de la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Contenu de chaque emplacement de révision.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Balises de la révision.",
-       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "<span class=\"apihelp-deprecated\">Deprecated.</span> Utiliser  <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> à la place. L’arbre d’analyse XML du contenu de la révision (nécessite le modèle de contenu <code>$1</code>).",
+       "apihelp-query+revisions+base-paramvalue-prop-roles": "Lister les rôles d’emplacement de contenu qui existent dans la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Utiliser  <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> à la place. L’arbre d’analyse XML du contenu de la révision (nécessite le modèle de contenu <code>$1</code>).",
+       "apihelp-query+revisions+base-param-slots": "Pour quels emplacements de révision renvoyer des données, quand les propriétés relatives aux emplacements sont incluses dans <var>$1props</var>. Si omis, les données de l’emplacement <kbd>main</kbd> seront renvoyées dans un format rétro-compatible.",
        "apihelp-query+revisions+base-param-limit": "Limiter le nombre de révisions retournées.",
        "apihelp-query+revisions+base-param-expandtemplates": "Utiliser <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> à la place. Développer les modèles dans le contenu de la révision (nécessite $1prop=content).",
        "apihelp-query+revisions+base-param-generatexml": "Utiliser <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> à la place. Générer l’arbre d’analyse XML pour le contenu de la révision (nécessite $1prop=content).",
        "apierror-sectionsnotsupported": "Les sections ne sont pas prises en charge pour le modèle de contenu $1.",
        "apierror-sectionsnotsupported-what": "Les sections ne sont pas prises en charge par $1.",
        "apierror-show": "Paramètre incorrect - des valeurs mutuellement exclusives ne peuvent pas être fournies.",
-       "apierror-siteinfo-includealldenied": "Impossible d’afficher toutes les informatiosn du serveur, sauf si <var>$wgShowHostNames</var> vaut vrai.",
+       "apierror-siteinfo-includealldenied": "Impossible d’afficher toutes les informatiosn du serveur, sauf si <var>$wgShowHostnames</var> vaut vrai.",
        "apierror-sizediffdisabled": "La différence de taille est désactivée dans le mode Miser.",
        "apierror-spamdetected": "Votre modification a été refusée parce qu’elle contenait un fragment de pourriel : <code>$1</code>.",
        "apierror-specialpage-cantexecute": "Vous n'avez pas l'autorisation d'afficher les résultats de cette page spéciale.",
        "apiwarn-checktoken-percentencoding": "Vérifier que les symboles tels que \"+\" dans le jeton sont correctement  codés avec des pourcents dans l'URL.",
        "apiwarn-compare-nocontentmodel": "Aucun modèle de contenu n’a pu être déterminé, $1 est supposé.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> est devenu désuet. Veuillez utiliser <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd> à la place.",
-       "apiwarn-deprecation-expandtemplates-prop": "Comme aucune valeur n’a été spécifiée pour le paramètre <var>prop</var>, un format patrimonial a été utilisé pour la sortie. Ce format est désuet et, dans le futur, une valeur par défaut sera fixée pour le paramètre <var>prop</var>, provoquant ainsi l’utilisation systématique du nouveau format.",
        "apiwarn-deprecation-httpsexpected": "HTTP est utilisé alors que HTTPS est attendu.",
        "apiwarn-deprecation-login-botpw": "La connexion au compte principal via <kbd>action=login</kbd> est désuète et peut cesser de fonctionner sans avertissement. Pour continuer à vous connecter avec <kbd>action=login</kbd>, voyez [[Special:BotPasswords]]. Pour continuer à utiliser la connexion au compte principal en toute sécurité, voyez <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "La connexion au compte principal via <kbd>action=login</kbd> est désuète et peut cesser de fonctionner sans avertissement. Pour vous connecter en toute sécurité, voyez <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-token": "La récupération d’un jeton via <kbd>action=login</kbd> est désuète. Utilisez <kbd>action=query&meta=tokens&type=login</kbd> à la place.",
+       "apiwarn-deprecation-missingparam": "Comme <var>$1</var> n’a pas été spécifié, un format ancien a été utilisé pour la sortie. Ce format est obsolète, et dans le futur, le nouveau format sera toujours utilisé.",
        "apiwarn-deprecation-parameter": "Le paramètre <var>$1</var> est désuet.",
        "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> est désuet depuis MédiaWiki 1.28. Utilisez <kbd>prop=headhtml</kbd> lors de la création de nouveaux documents HTML, ou <kbd>prop=modules|jsconfigvars</kbd> lors de la mise à jour d’un document côté client.",
        "apiwarn-deprecation-purge-get": "L’utilisation de <kbd>action=purge</kbd> via un GET est désuète. Utiliser POST à la place.",
index da839f4..5103bd3 100644 (file)
        "apierror-sectionsnotsupported": "As seccións non son compatibles co modelo de contido $1.",
        "apierror-sectionsnotsupported-what": "As seccións non son compatibles con $1.",
        "apierror-show": "Parámetro incorrecto - non se poden proporcionar valores mutuamente excluíntes.",
-       "apierror-siteinfo-includealldenied": "Non se pode ver a información de tódolos servidores a menos que <var>$wgShowHostNames</var> teña valor verdadeiro.",
+       "apierror-siteinfo-includealldenied": "Non se pode ver a información de tódolos servidores a menos que <var>$wgShowHostnames</var> teña valor verdadeiro.",
        "apierror-sizediffdisabled": "A diferenza de tamaño está deshabilitada no modo Miser.",
        "apierror-spamdetected": "A súa edición foi rexeitada por conter un fragmento de publicidade: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "Non ten permiso para ver os resultados desta páxina especial.",
        "apiwarn-badurlparam": "Non se puido analizar <var>$1urlparam</var> para $2. Só se usará a anchura e a altura.",
        "apiwarn-badutf8": "O valor pasado para <var>$1</var> contén datos non válidos ou non normalizados. Os datos de texto deberían estar en formato Unicode válido, normalizado en NFC e sen caracteres de control C0 distintos de HT (\\t), LF (\\n) e CR (\\r).",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> quedou obsoleto. No seu lugar, utilice <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd>.",
-       "apiwarn-deprecation-expandtemplates-prop": "Como non se especificou ningún valor para o parámetro <var>prop</var>, utilizouse un formato herdado para a saída. Este formato está en desuso e, no futuro, o parámetro <var>prop</var> terá un valor predeterminado, de forma que sempre se utilizará o formato novo.",
        "apiwarn-deprecation-httpsexpected": "Utilizouse HTTP cando esperábase HTTPS.",
        "apiwarn-deprecation-login-botpw": "O inicio de sesión coa conta principal mediante <kbd>action=login</kbd> está en desuso e pode deixar de funcionar sen aviso previo. Para proseguir o inicio de sesión mediante <kbd>action=login</kbd>, consulte [[Special:BotPasswords]]. Para proseguir o inicio de sesión coa conta principal de forma segura, consulte <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "O inicio de sesión coa conta principal mediante <kbd>action=login</kbd> está en desuso e pode deixar de funcionar sen aviso previo. Para iniciar sesión de forma segura, consulte <kbd>action=clientlogin</kbd>.",
index 5cc5795..e2c73c2 100644 (file)
        "apierror-sectionsnotsupported": "מקטעים אינם נתמכים במודל התוכן $1.",
        "apierror-sectionsnotsupported-what": "מקטעים אינם נתמכים ב־$1.",
        "apierror-show": "פרמטר לא נכון – אי־אפשר לספק ערכים שמבטלים זה את זה.",
-       "apierror-siteinfo-includealldenied": "לא ניתן להציג את המידע של כל השרתים אלא אם <var dir=\"ltr\">$wgShowHostNames</var> מוגדר להיות true.",
+       "apierror-siteinfo-includealldenied": "לא ניתן להציג את המידע של כל השרתים אלא אם <var dir=\"ltr\">$wgShowHostnames</var> מוגדר להיות true.",
        "apierror-sizediffdisabled": "ההבדל בגודל כבוי במצב קמצן.",
        "apierror-spamdetected": "העריכה שלך סורבה כי הכילה חלק ספאם: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "אין לך הרשאה להציג את התוצאות של הדף המיוחד הזה.",
        "apiwarn-checktoken-percentencoding": "נא לבדוק שסימנים כמו \"+\" באסימון מקודדים עם אחוזים בצורה נכונה ב־URL.",
        "apiwarn-compare-nocontentmodel": "לא היה אפשר לקבוע את מודל התוכן, נניח שזה $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> הוצהר בתור מיושן. נא להשתמש ב־ <kbd>prop=deletedrevisions</kbd> או ב־<kbd>list=alldeletedrevisions</kbd> במקום זה.",
-       "apiwarn-deprecation-expandtemplates-prop": "מכיוון שלא ניתנו ערכים לפרמטר <var>prop</var>, תסדיר מיושן ישמש לפלט. התסדיר הזה מיושן, ובעתיד יינתן ערך בררת מחדל לפרמטר <var>prop</var>, כך שתמיד ישמש התסדיר החדש.",
        "apiwarn-deprecation-httpsexpected": "משמש HTTP כשהיה צפוי HTTPS.",
        "apiwarn-deprecation-login-botpw": "כניסה לחשבון עיקרי (main-account) דרך <kbd>action=login</kbd> מיושנת ועלולה להפסיק לעבוד ללא אזהרה נוספת. כדי להמשיך להיכנס עם <kbd>action=login</kbd>, ר' [[Special:BotPasswords]]. כדי להמשיך באופן מאובטח באמצעות חשבון עיקרי, ר' <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "כניסה בחשבון ראשי עם <kbd>action=login</kbd> מיושנת ויכולה להפסיק לעבוד ללא אזהרה. כדי להיכנס באופן מאובטח, ר' <kbd>action=clientlogin</kbd>.",
index 2bcaef1..ceb2d42 100644 (file)
        "apihelp-query+revisions+base-paramvalue-prop-timestamp": "Il timestamp della versione.",
        "apihelp-query+revisions+base-paramvalue-prop-user": "Utente che ha effettuato la versione.",
        "apihelp-query+revisions+base-paramvalue-prop-userid": "ID utente dell'autore della versione.",
-       "apihelp-query+revisions+base-paramvalue-prop-content": "Testo della versione.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Contenuto di ogni slot di versione.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Etichette della versione.",
        "apihelp-query+search-summary": "Eseguire una ricerca di testo completa.",
        "apihelp-query+search-param-what": "Quale tipo di ricerca effettuare.",
index c43960b..be6e798 100644 (file)
        "apierror-sectionreplacefailed": "Kunne ikke flette oppdatert seksjon.",
        "apierror-sectionsnotsupported": "Seksjoner støttes ikke for innholdsmodellen $1.",
        "apierror-sectionsnotsupported-what": "Seksjoner støttes ikke av $1.",
-       "apierror-siteinfo-includealldenied": "Kan ikke vise alle tjenernes info med mindre </var>$wgShowHostNames</var> er sann.",
+       "apierror-siteinfo-includealldenied": "Kan ikke vise alle tjenernes info med mindre </var>$wgShowHostnames</var> er sann.",
        "apierror-sizediffdisabled": "Størrelsesforskjell er slått av i Miser-modus.",
        "apierror-timeout": "Tjeneren svarte ikke innenfor forventet tid.",
        "apiwarn-validationfailed": "Bekreftelsesfeil <kbd>$1</kbd>: $2"
index e6724d4..3d2ac3e 100644 (file)
        "apihelp-query+revisions+base-paramvalue-prop-user": "Usuário que fez a revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-userid": "ID de usuário do criador da revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-size": "Comprimento (bytes) da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsize": "O comprimento (em bytes) de cada segmento de revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (base 16) da revisão.",
-       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "ID do modelo de conteúdo da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsha1": "O resumo criptográfico SHA-1 (base 16) de cada segmento de revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "O identificador do modelo de conteúdo de cada segmento de revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-comment": "Comentário do usuário para a revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Analisar comentário do usuário para a revisão.",
-       "apihelp-query+revisions+base-paramvalue-prop-content": "Texto da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Conteúdo de cada segmento de revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Etiquetas para a revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-roles": "Listar as funções dos segmentos de conteúdo que existem na revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-parsetree": "<span class=\"apihelp-deprecated\">Obsoleto.</span> Use <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> em vez. A árvore de análise XML de conteúdo da revisão (requer o modelo de conteúdo <code>$1</code>).",
+       "apihelp-query+revisions+base-param-slots": "Quais os segmentos de revisão cujos dados devem ser devolvidos quando propriedades relacionadas com segmentos são incluídas em <var>$1props</var>. Se for omitido, serão devolvidos dados do segmento principal (<kbd>main</kbd>) num formato compatível com versões anteriores.",
        "apihelp-query+revisions+base-param-limit": "Limita quantas revisões serão retornadas.",
        "apihelp-query+revisions+base-param-expandtemplates": "Use <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> em vez disso. Expande predefinições no conteúdo de revisão (requer $1prop=content).",
        "apihelp-query+revisions+base-param-generatexml": "Use <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> em vez disso. Gerar árvore de analise XML para o conteúdo de revisão (requer $1prop=content).",
        "apierror-sectionsnotsupported": "As seções não são suportadas para o modelo de conteúdo $1.",
        "apierror-sectionsnotsupported-what": "As seções não são suportadas por $1.",
        "apierror-show": "Parâmetro incorreto - valores mutuamente exclusivos podem não ser fornecidos.",
-       "apierror-siteinfo-includealldenied": "Não é possível visualizar a informação de todos os servidores, a menos que <var>$wgShowHostNames</var> seja true.",
+       "apierror-siteinfo-includealldenied": "Não é possível visualizar a informação de todos os servidores, a menos que <var>$wgShowHostnames</var> seja true.",
        "apierror-sizediffdisabled": "A diferença de tamanho está desativada no Miser Mode.",
        "apierror-spamdetected": "Sua edição foi bloqueada porque contem um fragmento de spam: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "Você não tem permissão para ver os resultados desta página especial.",
        "apiwarn-checktoken-percentencoding": "Verificar se os símbolos, como \"+\" no token, estão codificados corretamente na URL.",
        "apiwarn-compare-nocontentmodel": "Nenhum modelo de conteúdo pode ser determinado, assumindo $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> foi depreciado. Por favor, use <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd> em vez.",
-       "apiwarn-deprecation-expandtemplates-prop": "Como nenhum valor foi especificado para o parâmetro <var>prop</var>, um formato herdado foi usado para a saída. Este formato está obsoleto e no futuro um valor padrão será definido para o parâmetro <var>prop</var>, fazendo com que o novo formato sempre seja usado.",
        "apiwarn-deprecation-httpsexpected": "HTTP usado quando o HTTPS era esperado.",
        "apiwarn-deprecation-login-botpw": "O login da conta principal via <kbd>action=login</kbd> está obsoleto e pode parar de funcionar sem aviso prévio. Para continuar com o login com <kbd>action=login</ kbd>, consulte [[Special:BotPasswords]]. Para continuar com segurança usando o login da conta principal, veja <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "O login da conta principal via <kbd>action=login</kbd> está obsoleto e pode parar de funcionar sem aviso prévio. Para fazer login com segurança, veja <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-token": "Obter um token via <kbd>action=login</kbd> está obsoleto. Use <kbd>action=query&meta=tokens&type=login</kbd> em vez.",
+       "apiwarn-deprecation-missingparam": "Foi usado um formato antigo para a saída, porque <var>$1</var> não foi especificado. Este formato foi descontinuado e de futuro será sempre usado o formato novo.",
        "apiwarn-deprecation-parameter": "O parâmetro <var>$1</var> é obsoleto.",
        "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> está depreciado desde o MediaWiki 1.28. Use <kbd>prop=headhtml</kbd> quando for criar novos documentos HTML, ou <kbd>prop=modules|jsconfigvars</kbd> quando for atualizar um documento no lado do cliente.",
        "apiwarn-deprecation-purge-get": "O uso de <kbd>action=purge</kbd> via GET está obsoleto. Use o POST em vez disso.",
index 49b66a7..0cc3238 100644 (file)
        "apihelp-query+revisions+base-paramvalue-prop-timestamp": "A data e hora da revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-user": "O utilizador que fez a revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-userid": "O identificador de utilizador do criador da revisão.",
-       "apihelp-query+revisions+base-paramvalue-prop-size": "O tamanho (em bytes) da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "O comprimento (em bytes) da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsize": "O comprimento (em bytes) de cada segmento de revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "O resumo criptográfico SHA-1 (na base 16) da revisão.",
-       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "O identificador do modelo de conteúdo da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-slotsha1": "O resumo criptográfico SHA-1 (base 16) de cada segmento de revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "O identificador do modelo de conteúdo de cada segmento de revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-comment": "O comentário do utilizador para a revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "O comentário do utilizador para a revisão, após a análise sintática.",
-       "apihelp-query+revisions+base-paramvalue-prop-content": "O texto da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Conteúdo de cada segmento de revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "As etiquetas para a revisão.",
-       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "<span class=\"apihelp-deprecated\">Descontinuado.</span> Em substituição, use <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>. A árvore de análise XML do conteúdo da revisão (requer o modelo de conteúdo <code>$1</code>).",
+       "apihelp-query+revisions+base-paramvalue-prop-roles": "Listar as funções dos segmentos de conteúdo que existem na revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Usar antes <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>. A árvore XML da análise sintática do conteúdo da revisão <code>$1</code>).",
+       "apihelp-query+revisions+base-param-slots": "Quais os segmentos de revisão cujos dados devem ser devolvidos quando propriedades relacionadas com segmentos são incluídas em <var>$1props</var>. Se for omitido, serão devolvidos dados do segmento principal (<kbd>main</kbd>) num formato compatível com versões anteriores.",
        "apihelp-query+revisions+base-param-limit": "Limitar o número de revisões que serão devolvidas.",
        "apihelp-query+revisions+base-param-expandtemplates": "Em substituição, use <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd>. Expandir predefinições no conteúdo da revisão (requer $1prop=content).",
        "apihelp-query+revisions+base-param-generatexml": "Em substituição, use <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>. Gerar a árvore de análise sintática em XML do conteúdo da revisão (requer $1prop=content).",
        "apierror-sectionsnotsupported": "Secções não são suportadas pelo modelo de conteúdo $1.",
        "apierror-sectionsnotsupported-what": "Secções não são suportadas por $1.",
        "apierror-show": "Parâmetro incorreto - não podem ser fornecidos valores mutuamente exclusivos.",
-       "apierror-siteinfo-includealldenied": "Não é possível ver a informação de todos os servidores, a menos que <var>$wgShowHostNames</var> tenha o valor \"true\".",
+       "apierror-siteinfo-includealldenied": "Não é possível ver a informação de todos os servidores, a menos que <var>$wgShowHostnames</var> tenha o valor \"true\".",
        "apierror-sizediffdisabled": "A diferença de tamanho está desativada no modo avarento.",
        "apierror-spamdetected": "A sua edição foi recusada porque continha um fragmento de spam: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "Não tem permissão para ver os resultados desta página especial.",
        "apiwarn-checktoken-percentencoding": "Verifique que símbolos como \"+\" na chave estão devidamente codificados com percentagem no URL.",
        "apiwarn-compare-nocontentmodel": "Não foi possível determinar nenhum modelo de conteúdo; será assumido $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> foi descontinuado. Em substituição, use <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd>, por favor.",
-       "apiwarn-deprecation-expandtemplates-prop": "Dado que não foi especificado nenhum valor para o parâmetro <var>prop</var> foi usado um formato antigo para o resultado. Esse formato está descontinuado e, de futuro, será definido um valor por omissão para o parâmetro <var>prop</var>, de forma que seja sempre usado um formato novo.",
        "apiwarn-deprecation-httpsexpected": "Foi usado HTTP quando era esperado HTTPS.",
        "apiwarn-deprecation-login-botpw": "O início de sessões com uma conta principal através de <kbd>action=login</kbd> foi descontinuado e poderá deixar de funcionar sem aviso prévio. Para continuar a iniciar sessões com <kbd>action=login</kbd>, consulte [[Special:BotPasswords]]. Para continuar a iniciar sessões com a conta principal de forma segura, consulte <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "O início de sessões com uma conta principal através de <kbd>action=login</kbd> foi descontinuado e poderá deixar de funcionar sem aviso prévio. Para iniciar uma sessão de forma segura, consulte <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-token": "A obtenção de uma chave através de <kbd>action=login</kbd> foi descontinuada. Em substituição, use <kbd>action=query&meta=tokens&type=login</kbd>.",
+       "apiwarn-deprecation-missingparam": "Foi usado um formato antigo para a saída, porque <var>$1</var> não foi especificado. Este formato foi descontinuado e de futuro será sempre usado o formato novo.",
        "apiwarn-deprecation-parameter": "O parâmetro <var>$1</var> foi descontinuado.",
        "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> está obsoleto desde o MediaWiki 1.28. Use <kbd>prop=headhtml</kbd> ao criar novos documentos de HTML, ou <kbd>prop=modules|jsconfigvars</kbd> ao atualizar um documento no lado do cliente.",
        "apiwarn-deprecation-purge-get": "O uso de <kbd>action=purge</kbd> através de um GET foi descontinuado. Em substituição, use um POST.",
index 6bfe059..bae0948 100644 (file)
        "apierror-sectionsnotsupported": "Разбиение на секции не поддерживается моделью содержимого $1.",
        "apierror-sectionsnotsupported-what": "Разбиение на секции не поддерживается $1.",
        "apierror-show": "Некорректный параметр — вручную исключённые значения не могут быть обработаны.",
-       "apierror-siteinfo-includealldenied": "Невозможно отобразить информацию о всех серверах, если <var>$wgShowHostNames</var> не истинно.",
+       "apierror-siteinfo-includealldenied": "Невозможно отобразить информацию о всех серверах, если <var>$wgShowHostnames</var> не истинно.",
        "apierror-sizediffdisabled": "Подсчёт разницы размеров отключён в жадном режиме.",
        "apierror-spamdetected": "Ваша правка была отклонена, так как содержит спам: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "У вас нет прав, чтобы просматривать результаты этой служебной страницы.",
        "apiwarn-checktoken-percentencoding": "Проверьте, что символы вроде «+» в токене корректно закодированы %-последовательностями в ссылке.",
        "apiwarn-compare-nocontentmodel": "Модель содержимого не может быть определена, предполагается $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> устарел. Пожалуйста, вместо него используйте <kbd>prop=deletedrevisions</kbd> или <kbd>list=alldeletedrevisions</kbd>.",
-       "apiwarn-deprecation-expandtemplates-prop": "Поскольку никакие значения не были указаны в параметре <var>prop</var>, был использован наследованный формат. Этот формат является устаревшим, и в будущем параметру <var>prop</var> будет присвоено значение по умолчанию, что приведёт к повсеместному использованию нового формата.",
        "apiwarn-deprecation-httpsexpected": "Использован HTTP, где ожидался HTTPS.",
        "apiwarn-deprecation-login-botpw": "Вход в основной аккаунт через <kbd>action=login</kbd> устарел и может быть отключен без предупреждения. Для продолжения авторизации с <kbd>action=login</kbd>, см.\n[[Special:BotPasswords]]. Для безопасного продолжения использования входа в основной аккаунт, см. <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "Вход в основной аккаунт через <kbd>action=login</kbd> не поддерживается и может быть отключен без предупреждения. Для безопасной авторизации, см. <kbd>action=clientlogin</kbd>.",
index 95cd709..e9078e0 100644 (file)
        "apierror-sectionsnotsupported": "Розділи не підтримуються для контентної моделі $1.",
        "apierror-sectionsnotsupported-what": "Розділи не підтримуються $1.",
        "apierror-show": "Неправильний параметр — не можна надавати взаємовиключні значення.",
-       "apierror-siteinfo-includealldenied": "Не можна переглядати інформацію щодо всіх серверів, якщо тільки <var>$wgShowHostNames</var> не вказано як «true».",
+       "apierror-siteinfo-includealldenied": "Не можна переглядати інформацію щодо всіх серверів, якщо тільки <var>$wgShowHostnames</var> не вказано як «true».",
        "apierror-sizediffdisabled": "Різниця у розмірах вимкнена в скупому режимі.",
        "apierror-spamdetected": "Ваше редагування було відхилено, оскільки воно містило фрагмент спаму: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "Ви не маєте прав на перегляд результатів цієї спеціальної сторінки.",
        "apiwarn-checktoken-percentencoding": "Перевірте, чи символи, такі як «+» у токені, пройшли правильне процентне кодування в URL.",
        "apiwarn-compare-nocontentmodel": "Не вдалося визначити контентну модель, припускаємо $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> є застарілим. Будь ласка, використовуйте замість нього <kbd>prop=deletedrevisions</kbd> або <kbd>list=alldeletedrevisions</kbd>.",
-       "apiwarn-deprecation-expandtemplates-prop": "Оскільки не задано жодних значень для параметра <var>prop</var>, як вихідні дані було використано старий формат. Цей формат є застарілим, і в майбутньому параметру <var>prop</var> буде задано стандартне значення, наслідком чого стане те, що завжди використовуватиметься новий формат.",
        "apiwarn-deprecation-httpsexpected": "Використано HTTP, тоді як очікувалося використання HTTPS.",
        "apiwarn-deprecation-login-botpw": "Вхід в основний обліковий запис через <kbd>action=login</kbd> є застарілим, і може припинити працювати, без попередження. Щоб продовжити вхід у систему через <kbd>action=login</kbd>, див. [[Special:BotPasswords]]. Щоб безпечно продовжити, використовуючи вхід в основний обліковий запис, див. <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "Вхід в основний обліковий запис через <kbd>action=login</kbd> є застарілим, і може припинити працювати, без попередження. Щоб безпечно увійти в систему, див. <kbd>action=clientlogin</kbd>.",
index 2509d8d..088b730 100644 (file)
        "apierror-sectionsnotsupported": "内容模型$1不支持章节。",
        "apierror-sectionsnotsupported-what": "章节不被$1所支持。",
        "apierror-show": "不正确的参数——不可提供互斥值。",
-       "apierror-siteinfo-includealldenied": "除非<var>$wgShowHostNames</var>为真,否则不能查看所有服务器的信息。",
+       "apierror-siteinfo-includealldenied": "除非<var>$wgShowHostnames</var>为真,否则不能查看所有服务器的信息。",
        "apierror-sizediffdisabled": "大小差异在Miser模式中被禁用。",
        "apierror-spamdetected": "您的编辑被拒绝,因为它包含垃圾部分:<code>$1</code>。",
        "apierror-specialpage-cantexecute": "您没有权限查看此特殊页面的结果。",
        "apiwarn-checktoken-percentencoding": "在令牌中检查例如“+”的符号会在URL中适当进行百分号编码。",
        "apiwarn-compare-nocontentmodel": "没有可以定义的模型,假定为$1。",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd>已弃用。请改用<kbd>prop=deletedrevisions</kbd>或<kbd>list=alldeletedrevisions</kbd>。",
-       "apiwarn-deprecation-expandtemplates-prop": "因为没有为<var>prop</var>参数指定值,所以在输出上使用了遗留格式。这种格式已弃用,并且将来会为<var>prop</var>参数设置默认值,这会导致新格式总会被使用。",
        "apiwarn-deprecation-httpsexpected": "当应为HTTPS时,HTTP被使用。",
        "apiwarn-deprecation-login-botpw": "通过<kbd>action=login</kbd>的主账户登录已被弃用,并可能在未事先警告的情况下停止工作。要继续通过<kbd>action=login</kbd>登录,请参见[[Special:BotPasswords]]。要安全继续使用主账户登录,请参见<kbd>action=clientlogin</kbd>。",
        "apiwarn-deprecation-login-nobotpw": "通过<kbd>action=login</kbd>的主账户登录已被弃用,并可能在未事先警告的情况下停止工作。要安全登录,请参见<kbd>action=clientlogin</kbd>。",
index 5beef31..21947d2 100644 (file)
@@ -25,6 +25,8 @@
  * @author Daniel Kinzler
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Content object for wiki text pages.
  *
@@ -182,7 +184,7 @@ class WikitextContent extends TextContent {
                        return $this->redirectTargetAndText;
                }
 
-               $redir = MagicWord::get( 'redirect' );
+               $redir = MediaWikiServices::getInstance()->getMagicWordFactory()->get( 'redirect' );
                $text = ltrim( $this->getNativeData() );
                if ( $redir->matchStartAndRemove( $text ) ) {
                        // Extract the first link and see if it's usable
index 9c26ae1..ab157f5 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Content
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Content handler for wiki text pages.
  *
@@ -60,7 +62,7 @@ class WikitextContentHandler extends TextContentHandler {
                        }
                }
 
-               $mwRedir = MagicWord::get( 'redirect' );
+               $mwRedir = MediaWikiServices::getInstance()->getMagicWordFactory()->get( 'redirect' );
                $redirectText = $mwRedir->getSynonym( 0 ) .
                        ' [[' . $optionalColon . $destination->getFullText() . ']]';
 
index 39e8bd9..141888c 100644 (file)
@@ -141,14 +141,9 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
                }
 
                foreach ( $this->mCategories as &$sortkey ) {
-                       # If the sortkey is longer then 255 bytes,
-                       # it truncated by DB, and then doesn't get
-                       # matched when comparing existing vs current
-                       # categories, causing T27254.
-                       # Also. substr behaves weird when given "".
-                       if ( $sortkey !== '' ) {
-                               $sortkey = substr( $sortkey, 0, 255 );
-                       }
+                       # If the sortkey is longer then 255 bytes, it is truncated by DB, and then doesn't match
+                       # when comparing existing vs current categories, causing T27254.
+                       $sortkey = mb_strcut( $sortkey, 0, 255 );
                }
 
                $this->mRecursive = $recursive;
index 74c446f..1bcbd30 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup JobQueue
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Job to fix double redirects after moving a page
  *
@@ -116,7 +118,7 @@ class DoubleRedirectJob extends Job {
                }
 
                // Check for a suppression tag (used e.g. in periodically archived discussions)
-               $mw = MagicWord::get( 'staticredirect' );
+               $mw = MediaWikiServices::getInstance()->getMagicWordFactory()->get( 'staticredirect' );
                if ( $content->matchMagicWord( $mw ) ) {
                        wfDebug( __METHOD__ . ": skipping: suppressed with __STATICREDIRECT__\n" );
 
index ca44572..b0fd12a 100644 (file)
@@ -220,10 +220,6 @@ class DatabaseSqlite extends Database {
                return false;
        }
 
-       public function selectDB( $db ) {
-               return false; // doesn't make sense
-       }
-
        /**
         * @return string SQLite DB file path
         * @since 1.25
index 559ac87..f032efc 100644 (file)
@@ -144,7 +144,8 @@ class LogEventsList extends ContextSource {
                // Date menu
                $formDescriptor['date'] = [
                        'type' => 'date',
-                       'label-message' => 'date'
+                       'label-message' => 'date',
+                       'default' => sprintf( "%04d-%02d-%02d", $year, $month, $day ),
                ];
 
                // Tag filter
index 9eef728..51824d2 100644 (file)
@@ -81,14 +81,16 @@ abstract class ReverseChronologicalPager extends IndexPager {
                        return null;
                }
 
-               // Treat the given time in the wiki timezone and get a UTC timestamp for the database lookup
                $timestamp = self::getOffsetDate( $year, $month, $day );
-               $timestamp->setTimezone( $this->getConfig()->get( 'Localtimezone' ) );
 
                try {
-                       $this->mYear = (int)$timestamp->format( 'Y' );
-                       $this->mMonth = (int)$timestamp->format( 'm' );
-                       $this->mDay = (int)$timestamp->format( 'd' );
+                       // The timestamp used for DB queries is at midnight of the *next* day after the selected date.
+                       $selectedDate = new DateTime( $timestamp->getTimestamp( TS_ISO_8601 ) );
+                       $selectedDate = $selectedDate->modify( '-1 day' );
+
+                       $this->mYear = (int)$selectedDate->format( 'Y' );
+                       $this->mMonth = (int)$selectedDate->format( 'm' );
+                       $this->mDay = (int)$selectedDate->format( 'd' );
                        $this->mOffset = $this->mDb->timestamp( $timestamp->getTimestamp() );
                } catch ( TimestampException $e ) {
                        // Invalid user provided timestamp (T149257)
index 10da0b0..3c47de3 100644 (file)
@@ -171,7 +171,8 @@ class CoreParserFunctions {
        public static function urlencode( $parser, $s = '', $arg = null ) {
                static $magicWords = null;
                if ( is_null( $magicWords ) ) {
-                       $magicWords = new MagicWordArray( [ 'url_path', 'url_query', 'url_wiki' ] );
+                       $magicWords =
+                               $parser->getMagicWordFactory()->newArray( [ 'url_path', 'url_query', 'url_wiki' ] );
                }
                switch ( $magicWords->matchStartToEnd( $arg ) ) {
                        // Encode as though it's a wiki page, '_' for ' '.
@@ -296,9 +297,11 @@ class CoreParserFunctions {
         * @return string
         */
        public static function formatnum( $parser, $num = '', $arg = null ) {
-               if ( self::matchAgainstMagicword( 'rawsuffix', $arg ) ) {
+               if ( self::matchAgainstMagicword( $parser->getMagicWordFactory(), 'rawsuffix', $arg ) ) {
                        $func = [ $parser->getFunctionLang(), 'parseFormattedNumber' ];
-               } elseif ( self::matchAgainstMagicword( 'nocommafysuffix', $arg ) ) {
+               } elseif (
+                       self::matchAgainstMagicword( $parser->getMagicWordFactory(), 'nocommafysuffix', $arg )
+               ) {
                        $func = [ $parser->getFunctionLang(), 'formatNumNoSeparators' ];
                } else {
                        $func = [ $parser->getFunctionLang(), 'formatNum' ];
@@ -391,7 +394,8 @@ class CoreParserFunctions {
 
                static $magicWords = null;
                if ( is_null( $magicWords ) ) {
-                       $magicWords = new MagicWordArray( [ 'displaytitle_noerror', 'displaytitle_noreplace' ] );
+                       $magicWords = $parser->getMagicWordFactory()->newArray(
+                               [ 'displaytitle_noerror', 'displaytitle_noreplace' ] );
                }
                $arg = $magicWords->matchStartToEnd( $uarg );
 
@@ -475,16 +479,20 @@ class CoreParserFunctions {
        /**
         * Matches the given value against the value of given magic word
         *
+        * @param MagicWordFactory $magicWordFactory A factory to get the word from, e.g., from
+        *   $parser->getMagicWordFactory()
         * @param string $magicword Magic word key
         * @param string $value Value to match
         * @return bool True on successful match
         */
-       private static function matchAgainstMagicword( $magicword, $value ) {
+       private static function matchAgainstMagicword(
+               MagicWordFactory $magicWordFactory, $magicword, $value
+       ) {
                $value = trim( strval( $value ) );
                if ( $value === '' ) {
                        return false;
                }
-               $mwObject = MagicWord::get( $magicword );
+               $mwObject = $magicWordFactory->get( $magicword );
                return $mwObject->matchStartToEnd( $value );
        }
 
@@ -494,10 +502,18 @@ class CoreParserFunctions {
         * @param int|float $num
         * @param string $raw
         * @param Language|StubUserLang $language
+        * @param MagicWordFactory|null $magicWordFactory To evaluate $raw
         * @return string
         */
-       public static function formatRaw( $num, $raw, $language ) {
-               if ( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) {
+       public static function formatRaw(
+               $num, $raw, $language, MagicWordFactory $magicWordFactory = null
+       ) {
+               if ( $raw !== null && !$magicWordFactory ) {
+                       $magicWordFactory = MediaWikiServices::getInstance()->getMagicWordFactory();
+               }
+               if (
+                       $raw !== null && self::matchAgainstMagicword( $magicWordFactory, 'rawsuffix', $raw )
+               ) {
                        return $num;
                } else {
                        return $language->formatNum( $num );
@@ -729,7 +745,7 @@ class CoreParserFunctions {
                global $wgContLang;
                static $magicWords = null;
                if ( is_null( $magicWords ) ) {
-                       $magicWords = new MagicWordArray( [
+                       $magicWords = $parser->getMagicWordFactory()->newArray( [
                                'pagesincategory_all',
                                'pagesincategory_pages',
                                'pagesincategory_subcats',
@@ -739,7 +755,7 @@ class CoreParserFunctions {
                static $cache = [];
 
                // split the given option to its variable
-               if ( self::matchAgainstMagicword( 'rawsuffix', $arg1 ) ) {
+               if ( self::matchAgainstMagicword( $parser->getMagicWordFactory(), 'rawsuffix', $arg1 ) ) {
                        // {{pagesincategory:|raw[|type]}}
                        $raw = $arg1;
                        $type = $magicWords->matchStartToEnd( $arg2 );
@@ -966,7 +982,8 @@ class CoreParserFunctions {
        public static function defaultsort( $parser, $text, $uarg = '' ) {
                static $magicWords = null;
                if ( is_null( $magicWords ) ) {
-                       $magicWords = new MagicWordArray( [ 'defaultsort_noerror', 'defaultsort_noreplace' ] );
+                       $magicWords = $parser->getMagicWordFactory()->newArray(
+                               [ 'defaultsort_noerror', 'defaultsort_noreplace' ] );
                }
                $arg = $magicWords->matchStartToEnd( $uarg );
 
index 7e150e9..66fd723 100644 (file)
@@ -360,7 +360,7 @@ class LinkHolderArray {
                }
                if ( count( $linkcolour_ids ) ) {
                        // pass an array of page_ids to an extension
-                       Hooks::run( 'GetLinkColours', [ $linkcolour_ids, &$colours ] );
+                       Hooks::run( 'GetLinkColours', [ $linkcolour_ids, &$colours, $this->parent->getTitle() ] );
                }
 
                # Do a second query for different language variants of links and categories
@@ -589,7 +589,7 @@ class LinkHolderArray {
                                        }
                                }
                        }
-                       Hooks::run( 'GetLinkColours', [ $linkcolour_ids, &$colours ] );
+                       Hooks::run( 'GetLinkColours', [ $linkcolour_ids, &$colours, $this->parent->getTitle() ] );
 
                        // rebuild the categories in original order (if there are replacements)
                        if ( count( $varCategories ) > 0 ) {
index 12d899b..2778ea6 100644 (file)
@@ -260,10 +260,14 @@ class Parser {
         */
        protected $mLinkRenderer;
 
+       /** @var MagicWordFactory */
+       private $magicWordFactory;
+
        /**
         * @param array $conf
+        * @param MagicWordFactory|null $magicWordFactory
         */
-       public function __construct( $conf = [] ) {
+       public function __construct( $conf = [], MagicWordFactory $magicWordFactory = null ) {
                $this->mConf = $conf;
                $this->mUrlProtocols = wfUrlProtocols();
                $this->mExtLinkBracketedRegex = '/\[(((?i)' . $this->mUrlProtocols . ')' .
@@ -284,6 +288,11 @@ class Parser {
                        $this->mPreprocessorClass = Preprocessor_Hash::class;
                }
                wfDebug( __CLASS__ . ": using preprocessor: {$this->mPreprocessorClass}\n" );
+
+               $this->magicWordFactory = $magicWordFactory;
+               if ( !$magicWordFactory ) {
+                       $this->magicWordFactory = MediaWikiServices::getInstance()->getMagicWordFactory();
+               }
        }
 
        /**
@@ -948,6 +957,16 @@ class Parser {
                return $this->mLinkRenderer;
        }
 
+       /**
+        * Get the MagicWordFactory that this Parser is using
+        *
+        * @since 1.32
+        * @return MagicWordFactory
+        */
+       public function getMagicWordFactory() {
+               return $this->magicWordFactory;
+       }
+
        /**
         * Replaces all occurrences of HTML-style comments and the given tags
         * in the text with a random marker and returns the next text. The output
@@ -2482,7 +2501,7 @@ class Parser {
         *
         * @private
         *
-        * @param string $index Magic variable identifier as mapped in MagicWord::$mVariableIDs
+        * @param string $index Magic variable identifier as mapped in MagicWordFactory::$mVariableIDs
         * @param bool|PPFrame $frame
         *
         * @throws MWException
@@ -2859,11 +2878,11 @@ class Parser {
         * @private
         */
        public function initialiseVariables() {
-               $variableIDs = MagicWord::getVariableIDs();
-               $substIDs = MagicWord::getSubstIDs();
+               $variableIDs = $this->magicWordFactory->getVariableIDs();
+               $substIDs = $this->magicWordFactory->getSubstIDs();
 
-               $this->mVariables = new MagicWordArray( $variableIDs );
-               $this->mSubstWords = new MagicWordArray( $substIDs );
+               $this->mVariables = $this->magicWordFactory->newArray( $variableIDs );
+               $this->mSubstWords = $this->magicWordFactory->newArray( $substIDs );
        }
 
        /**
@@ -3098,8 +3117,9 @@ class Parser {
                        $id = $this->mVariables->matchStartToEnd( $part1 );
                        if ( $id !== false ) {
                                $text = $this->getVariableValue( $id, $frame );
-                               if ( MagicWord::getCacheTTL( $id ) > -1 ) {
-                                       $this->mOutput->updateCacheExpiry( MagicWord::getCacheTTL( $id ) );
+                               if ( $this->magicWordFactory->getCacheTTL( $id ) > -1 ) {
+                                       $this->mOutput->updateCacheExpiry(
+                                               $this->magicWordFactory->getCacheTTL( $id ) );
                                }
                                $found = true;
                        }
@@ -3108,17 +3128,17 @@ class Parser {
                # MSG, MSGNW and RAW
                if ( !$found ) {
                        # Check for MSGNW:
-                       $mwMsgnw = MagicWord::get( 'msgnw' );
+                       $mwMsgnw = $this->magicWordFactory->get( 'msgnw' );
                        if ( $mwMsgnw->matchStartAndRemove( $part1 ) ) {
                                $nowiki = true;
                        } else {
                                # Remove obsolete MSG:
-                               $mwMsg = MagicWord::get( 'msg' );
+                               $mwMsg = $this->magicWordFactory->get( 'msg' );
                                $mwMsg->matchStartAndRemove( $part1 );
                        }
 
                        # Check for RAW:
-                       $mwRaw = MagicWord::get( 'raw' );
+                       $mwRaw = $this->magicWordFactory->get( 'raw' );
                        if ( $mwRaw->matchStartAndRemove( $part1 ) ) {
                                $forceRawInterwiki = true;
                        }
@@ -3985,7 +4005,7 @@ class Parser {
         */
        public function doDoubleUnderscore( $text ) {
                # The position of __TOC__ needs to be recorded
-               $mw = MagicWord::get( 'toc' );
+               $mw = $this->magicWordFactory->get( 'toc' );
                if ( $mw->match( $text ) ) {
                        $this->mShowToc = true;
                        $this->mForceTocPosition = true;
@@ -3998,7 +4018,7 @@ class Parser {
                }
 
                # Now match and remove the rest of them
-               $mwa = MagicWord::getDoubleUnderscoreArray();
+               $mwa = $this->magicWordFactory->getDoubleUnderscoreArray();
                $this->mDoubleUnderscores = $mwa->matchAndRemove( $text );
 
                if ( isset( $this->mDoubleUnderscores['nogallery'] ) ) {
@@ -4649,7 +4669,7 @@ class Parser {
 
                # @todo FIXME: Regex doesn't respect extension tags or nowiki
                #  => Move this logic to braceSubstitution()
-               $substWord = MagicWord::get( 'subst' );
+               $substWord = $this->magicWordFactory->get( 'subst' );
                $substRegex = '/\{\{(?!(?:' . $substWord->getBaseRegex() . '))/x' . $substWord->getRegexCase();
                $substText = '{{' . $substWord->getSynonym( 0 );
 
@@ -4862,7 +4882,7 @@ class Parser {
                $this->mFunctionHooks[$id] = [ $callback, $flags ];
 
                # Add to function cache
-               $mw = MagicWord::get( $id );
+               $mw = $this->magicWordFactory->get( $id );
                if ( !$mw ) {
                        throw new MWException( __METHOD__ . '() expecting a magic word identifier.' );
                }
@@ -5046,7 +5066,7 @@ class Parser {
                                unset( $paramMap['img_width'] );
                        }
 
-                       $mwArray = new MagicWordArray( array_keys( $paramMap ) );
+                       $mwArray = $this->magicWordFactory->newArray( array_keys( $paramMap ) );
 
                        $label = '';
                        $alt = '';
@@ -5165,7 +5185,8 @@ class Parser {
                                }
                        }
                        $this->mImageParams[$handlerClass] = $paramMap;
-                       $this->mImageParamsMagicArray[$handlerClass] = new MagicWordArray( array_keys( $paramMap ) );
+                       $this->mImageParamsMagicArray[$handlerClass] =
+                               $this->magicWordFactory->newArray( array_keys( $paramMap ) );
                }
                return [ $this->mImageParams[$handlerClass], $this->mImageParamsMagicArray[$handlerClass] ];
        }
index 8ebd2d2..5e57a18 100644 (file)
@@ -5073,10 +5073,10 @@ class User implements IDBAccessObject, UserIdentity {
         */
        public static function getAllGroups() {
                global $wgGroupPermissions, $wgRevokePermissions;
-               return array_diff(
+               return array_values( array_diff(
                        array_merge( array_keys( $wgGroupPermissions ), array_keys( $wgRevokePermissions ) ),
                        self::getImplicitGroups()
-               );
+               ) );
        }
 
        /**
index fa2b983..9049d61 100644 (file)
        "group-autoconfirmed": "Avtotəsdiqlənmiş istifadəçilər",
        "group-bot": "Botlar",
        "group-sysop": "İdarəçilər",
+       "group-interface-admin": "İnterfeys idarəçiləri",
        "group-bureaucrat": "Bürokratlar",
        "group-suppress": "Gizlədənlər",
        "group-all": "(bütün)",
        "group-autoconfirmed-member": "Avtotəsdiqlənmiş istifadəçilər",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|idarəçi}}",
+       "group-interface-admin-member": "{{GENDER:$1|interfeys idarəçisi}}",
        "group-bureaucrat-member": "{{GENDER:$1|bürokrat}}",
        "group-suppress-member": "{{GENDER:$1|gizlədən}}",
        "grouppage-user": "{{ns:project}}:İstifadəçilər",
        "grouppage-autoconfirmed": "{{ns:project}}:Avtotəsdiqlənmiş istifadəçilər",
        "grouppage-bot": "{{ns:project}}:Botlar",
        "grouppage-sysop": "{{ns:project}}:İdarəçilər",
+       "grouppage-interface-admin": "{{ns:project}}:İnterfeys idarəçiləri",
        "grouppage-bureaucrat": "{{ns:project}}:Bürokratlar",
        "grouppage-suppress": "{{ns:project}}:Gizlədənlər",
        "right-read": "Səhifələrin oxunması",
index 15c6487..84b4e80 100644 (file)
        "customjsprotected": "Вы ня маеце правоў на рэдагаваньне гэтай старонкі JavaScript, таму што яна ўтрымлівае пэрсанальныя налады іншага ўдзельніка.",
        "sitecssprotected": "Вы ня маеце дазволу на рэдагаваньне гэтай CSS-старонкі, бо гэта можа паўплываць на ўсіх удзельнікаў",
        "sitejsonprotected": "Вы ня маеце дазволу на рэдагаваньне гэтай JSON-старонкі, бо гэта можа паўплываць на ўсіх удзельнікаў",
+       "sitejsprotected": "Вы ня маеце дазволу на рэдагаваньне гэтай JavaScript-старонкі, бо гэта можа паўплываць на ўсіх наведнікаў",
        "mycustomcssprotected": "Вы ня маеце дазволу рэдагаваць гэтую CSS-старонку.",
        "mycustomjsonprotected": "Вы ня маеце дазволу на рэдагаваньне гэтай JSON-старонкі.",
        "mycustomjsprotected": "Вы ня маеце дазволу рэдагаваць гэтую JavaScript-старонку.",
index f8b9881..f07c2c3 100644 (file)
        "protectedpagetext": "সম্পাদনা অথবা অন্যান্য কাজে বাধা দিতে এই পাতাটিকে সুরক্ষিত করা হয়েছে।",
        "viewsourcetext": "আপনি এই পাতাটি দেখতে এবং উৎসের প্রতিলিপি করতে পারবেন।",
        "viewyourtext": "আপনি এই পাতায় করা <strong>আপনার সম্পাদনাগুলি</strong> দেখতে এবং প্রতিলিপি করতে পারেন।",
-       "protectedinterface": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦\8fà¦\87 à¦\89à¦\87à¦\95ি à¦¸à¦«à¦\9fà¦\93য়à§\8dযারà§\87র à¦\8fà¦\95à¦\9fি à¦\87নà§\8dà¦\9fারফà§\87স à¦¬à¦¾à¦°à§\8dতা à¦ªà§\8dরদান à¦\95রà§\87, à¦¤à¦¾à¦\87 à¦\8fà¦\9fি à¦¯à¦¾à¦¤à§\87 à¦\85পবà§\8dযবহারà§\87 à¦¨à¦¾ à¦\95রা à¦¹à¦¯à¦¼, à¦¸à§\87à¦\9cনà§\8dয à¦\8fà¦\9fিà¦\95à§\87 à¦¸à§\81রà¦\95à§\8dষিত à¦\95রà§\87 à¦°à¦¾à¦\96া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nসà¦\95ল à¦\89à¦\87à¦\95ির à¦\85নà§\81বাদà§\87 à¦\95à§\8bনà§\8b à¦§à¦°à¦¨à§\87র à¦¸à¦\82যà§\8bà¦\9cন à¦¬à¦¾ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87 à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ি স্থানীয়করণ প্রকল্প [https://translatewiki.net/ translatewiki.net] ব্যবহার করুন।",
+       "protectedinterface": "à¦\8fà¦\87 à¦\89à¦\87à¦\95িতà§\87 à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦«à¦\9fà¦\93য়à§\8dযারà§\87র à¦\9cনà§\8dয à¦\87নà§\8dà¦\9fারফà§\87সà§\87র à¦¬à¦¾à¦°à§\8dতা à¦¸à¦°à¦¬à¦°à¦¾à¦¹ à¦\95রà§\87, à¦¤à¦¾à¦\87 à¦\85পবà§\8dযবহার à¦°à§\8bধ à¦\95রার à¦\9cনà§\8dয à¦\8fà¦\9fিà¦\95à§\87 à¦¸à§\81রà¦\95à§\8dষিত à¦\95রà§\87 à¦°à¦¾à¦\96া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nসà¦\95ল à¦\89à¦\87à¦\95ির à¦\9cনà§\8dয à¦\85নà§\81বাদà§\87 à¦\95à§\8bনà§\8b à¦§à¦°à¦¨à§\87র à¦¸à¦\82যà§\8bà¦\9cন à¦¬à¦¾ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87, à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ির স্থানীয়করণ প্রকল্প [https://translatewiki.net/ translatewiki.net] ব্যবহার করুন।",
        "editinginterface": "<strong>সতর্ক বার্তা:</strong> আপনি এমন একটি পাতা সম্পাদনা করছেন যা সফটওয়্যারের জন্য ইন্টারফেস লেখা সরবরাহ করে।\nএই পাতাতে সংঘটিত পরিবর্তন এই উইকির অন্যান্য ব্যবহারকারীদের জন্য দৃশ্যমান ইন্টারফেসে প্রভাব ফেলবে।",
        "translateinterface": "সকল উইকির জন্য অনুবাদ যোগ বা পরিবর্তন করতে দয়া করে [https://translatewiki.net/ translatewiki.net], মিডিয়াউইকি স্থানীয়করণ প্রকল্প ব্যবহার করুন।",
        "cascadeprotected": "এই পাতাটিকে সম্পাদনা করা থেকে সুরক্ষিত করা হয়েছে, কারণ এটি নিম্নোক্ত {{PLURAL:$1|পাতায়|পাতাগুলিতে}} অন্তর্ভুক্ত, {{PLURAL:$1|যেটি|যেগুলি}} \"প্রপাতাকার\" বৈশিষ্ট্য সহযোগে সুরক্ষিত করা আছে:\n$2",
        "customcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
        "customjsonprotected": "আপনার এই JSON পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এই পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
        "customjsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
+       "sitecssprotected": "আপনার এই CSS পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে",
+       "sitejsonprotected": "আপনার এই JSON পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে",
+       "sitejsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে",
        "mycustomcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই।",
        "mycustomjsonprotected": "আপনার এই JSON পাতাটি সম্পাদনা করার অনুমতি নেই।",
        "mycustomjsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই।",
        "diff-paragraph-moved-toold": "অনুচ্ছেদ স্থানান্তর করা হয়েছে। পুরনো অবস্থানে যাওয়ার জন্য ক্লিক করুন।",
        "difference-missing-revision": "এই পার্থক্যের ($1) অন্তর্গত {{PLURAL:$2|একটি সংশোধিত সংস্করণ|$2টি সংশোধিত সংস্করণ}} খুঁজে পাওয়া যাচ্ছে না।\n\nসাধারণত মুছে ফেলা হয়েছে এমন পাতার মেয়াদ উত্তীর্ণ ইতিহাস পাতার লিংক খোলার কারণে এটি হতে পারে। \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} পাতা অবলুপ্তি লগে] বিস্তারিত তথ্য জানা যাবে।",
        "searchresults": "অনুসন্ধানের ফলাফল",
+       "search-filter-title-prefix": "শুধুমাত্র \"$1\" শিরোনাম দিয়ে শুরু হওয়া পাতাগুলি খোঁজা হচ্ছে",
        "search-filter-title-prefix-reset": "সব পাতা অনুসন্ধান করুন",
        "searchresults-title": "\"$1\" অনুসন্ধানের ফলাফল",
        "titlematches": "নিবন্ধের শিরোনাম মিলেছে",
        "group-autoconfirmed": "স্বয়ংনিশ্চিতকৃত ব্যবহারকারী",
        "group-bot": "বট",
        "group-sysop": "প্রশাসক",
+       "group-interface-admin": "ইন্টারফেস প্রশাসক",
        "group-bureaucrat": "ব্যুরোক্র্যাট",
        "group-suppress": "দমনকারী",
        "group-all": "(সমস্ত)",
        "group-autoconfirmed-member": "{{GENDER:$1|স্বয়ংনিশ্চিতকৃত ব্যবহারকারী}}",
        "group-bot-member": "বট",
        "group-sysop-member": "প্রশাসক",
+       "group-interface-admin-member": "{{GENDER:$1|ইন্টারফেস প্রশাসক}}",
        "group-bureaucrat-member": "ব্যুরোক্র্যাট",
        "group-suppress-member": "{{GENDER:$1|দমনকারী}}",
        "grouppage-user": "{{ns:project}}:ব্যবহারকারী",
        "grouppage-autoconfirmed": "{{ns:project}}:স্বয়ংক্রিয়ভাবে নিশ্চিতকৃত ব্যবহারকারী",
        "grouppage-bot": "{{ns:project}}:বট",
        "grouppage-sysop": "{{ns:project}}:প্রশাসক",
+       "grouppage-interface-admin": "{{ns:project}}:ইন্টারফেস প্রশাসক",
        "grouppage-bureaucrat": "{{ns:project}}:ব্যুরোক্র্যাট",
        "grouppage-suppress": "{{ns:project}}:দমনকারী",
        "right-read": "যেকোন পাতা পড়া",
-       "right-edit": "পাতা সম্পাদনা করা",
+       "right-edit": "পাতাগুলি সম্পাদনা করা",
        "right-createpage": "আলাপ পাতা নয়, এমন পাতা তৈরি করা",
        "right-createtalk": "আলাপ পাতা তৈরি করা",
        "right-createaccount": "নতুন ব্যবহারকারীর অ্যাকাউন্ট তৈরি করুন",
        "right-editusercss": "অন্য ব্যবহারকারীগণের CSS ফাইল সম্পাদনা",
        "right-edituserjson": "অন্য ব্যবহারকারীগণের JSON ফাইল সম্পাদনা",
        "right-edituserjs": "অন্য ব্যবহারকারীগণের JS ফাইল সম্পাদনা",
+       "right-editsitecss": "সাইটব্যাপী CSS সম্পাদনা করা",
+       "right-editsitejson": "সাইটব্যাপী JSON সম্পাদনা করা",
+       "right-editsitejs": "সাইটব্যাপী জাভাস্ক্রিপ্ট সম্পাদনা করা",
        "right-editmyusercss": "আপনার নিজস্ব ব্যবহারকারী সিএসএস ফাইল সম্পাদনা করুন",
        "right-editmyuserjson": "আপনার নিজস্ব ব্যবহারকারী JSON ফাইল সম্পাদনা করা",
        "right-editmyuserjs": "আপনার নিজস্ব ব্যবহারকারী জাভাস্ক্রিপ্ট ফাইল সম্পাদনা করুন",
        "grant-createaccount": "অ্যাকাউন্ট তৈরি করুন",
        "grant-createeditmovepage": "পাতা তৈরি, সম্পাদনা এবং স্থানান্তর করুন",
        "grant-delete": "পাতা, পুনর্বিবেচনা ও লগ ভুক্তিসমূহ মুছে ফেলুন।",
-       "grant-editinterface": "মিডিয়াà¦\89à¦\87à¦\95ি à¦¨à¦¾à¦®à¦¸à§\8dথান à¦\8fবà¦\82 à¦¬à§\8dযবহারà¦\95ারà§\80র à¦¸à¦¿à¦\8fসà¦\8fস/JSON/à¦\9cাভাসà§\8dà¦\95à§\8dরিপà§\8dà¦\9f সম্পাদনা করে",
+       "grant-editinterface": "মিডিয়াà¦\89à¦\87à¦\95ি à¦¨à¦¾à¦®à¦¸à§\8dথান à¦\8fবà¦\82 à¦¸à¦¾à¦\87à¦\9fবà§\8dযাপà§\80/বà§\8dযবহারà¦\95ারà§\80র JSON সম্পাদনা করে",
        "grant-editmycssjs": "আপনার ব্যবহারকারী সিএসএস/জেএসওএন/জাভাস্ক্রিপ্ট সম্পাদনা করুন",
        "grant-editmyoptions": "আপনার ব্যবহারকারী পছন্দসমূহ সম্পাদনা করুন",
        "grant-editmywatchlist": "আপনার নজরতালিকা সম্পাদনা করুন",
+       "grant-editsiteconfig": "সাইটব্যাপী ও ব্যবহারকারীর CSS/JS সম্পাদনা করা",
        "grant-editpage": "বিদ্যমান পাতা সম্পাদনা করুন",
        "grant-editprotected": "সংরক্ষিত পাতা সম্পাদনা করুন",
        "grant-highvolume": "উচ্চ-মাত্রার সম্পাদনা",
        "recentchanges-page-removed-from-category": "বিষয়শ্রেণী থেকে [[:$1]] সরানো হয়েছে",
        "recentchanges-page-removed-from-category-bundled": "বিষয়শ্রেণীতে [[:$1]] সরানো হয়েছে, [[Special:WhatLinksHere/$1|এই পাতাটি অন্য পাতাগুলির মধ্যে অন্তর্ভুক্তকৃত]]",
        "autochange-username": "মিডিয়াউইকি স্বয়ংক্রিয় পরিবর্তন",
-       "upload": "আপলোড",
+       "upload": "আপলোড করুন",
        "uploadbtn": "ফাইল আপলোড করুন",
        "reuploaddesc": "আপলোড বাতিল করুন এবং আপলোড ফর্মে ফেরত যান",
        "upload-tryagain": "পরিবর্তিত ফাইল বর্ণনা জমা দিন",
        "uploadstash-zero-length": "ফাইলটির দৈর্ঘ্য শূন্য।",
        "invalid-chunk-offset": "ত্রুটিপূর্ণ চাংক অফসেট",
        "img-auth-accessdenied": "প্রবেশাধিকার নাই",
-       "img-auth-nopathinfo": "PATH_INFO পাওয়া যাচ্ছে না।\nআপনার সার্ভার থেকে এই তথ্য পাঠানোর জন্য কনফিগার করা হয়নি।\nএটি হয়তো CGI ভিত্তিক এবং img_auth সমর্থন করে না।\nবিস্তারিত দেখুন https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization।",
+       "img-auth-nopathinfo": "পথের তথ্য পাওয়া যাচ্ছে না।\nআপনার সার্ভার অবশ্যই REQUEST_URI ও/বা PATH_INFO চলক অতিক্রম করাতে সমর্থ হতে হবে।\nযদি এটি তাই হয়, তবে $wgUsePathInfo সক্রিয় করার চেষ্টা করুন।\nবিস্তারিত জানতে https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization দেখুন।",
        "img-auth-notindir": "অনুরোধকৃত পাথটি কনফিগার করা আপলোড ডিরেক্টরী নয়।",
        "img-auth-badtitle": "\"$1\" থেকে একটি সঠিক শিরনাম তৈরী করা যাচ্ছে না।",
        "img-auth-nologinnWL": "আপনি প্রবেশ করেননি এবং \"$1\" নজরতালিকায় নেই।",
        "tooltip-ca-history": "এই পাতার পুরনো সংস্করণগুলি",
        "tooltip-ca-protect": "এই পাতাকে সুরক্ষিত করো",
        "tooltip-ca-unprotect": "এই পাতার সুরক্ষা পরিবর্তন করো",
-       "tooltip-ca-delete": "পাতাà¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লà§\8b",
+       "tooltip-ca-delete": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\85পসারণ à¦\95রà§\81ন",
        "tooltip-ca-undelete": "পাতাটি অপসারণের আগে যে সম্পাদনাগুলি করা হয়েছিল সেগুলি উদ্ধার করা হোক",
        "tooltip-ca-move": "পাতাটি স্থানান্তর করুন",
        "tooltip-ca-watch": "এই পাতাটি আপনার নজরতালিকায় যোগ করুন",
index 21e3132..2913625 100644 (file)
        "rcfilters-liveupdates-button-title-off": "Керла хийцамаш ма-бинехь гайта",
        "rcfilters-preference-label": "Керла хийцамийн дика кечйина верси къайлаяккха",
        "rcfilters-preference-help": "2017 шеран интерфейсан редизайн а, оцу хенахь дуьйна тӀетоьхна гӀирсаш а къайлайоху.",
+       "rcfilters-watchlist-preference-label": "Дика кечбина тергаме могӀам къайлабаккха",
+       "rcfilters-watchlist-preference-help": "ДӀайоху 2017 шеран интерфейсан редизайн, а оцу хенахь а, цул тӀехьа а тӀетоьхна болу гӀирсаш а.",
        "rcfilters-filter-showlinkedfrom-label": "Хьажоргаш йолучу агӀонашна тӀехь нисдарш гайта",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Хаьржиначунна хьажоргаш йолу агӀонаш</strong>",
        "rcfilters-filter-showlinkedto-label": "Хьажоргаш йолучу агӀонашна тӀехь нисдарш гайта",
index cf485b7..1e84913 100644 (file)
        "group-autoconfirmed": "بەکارھێنەرە خۆبەخۆ پەسندکراوەکان",
        "group-bot": "بۆتەکان",
        "group-sysop": "بەڕێوەبەران",
+       "group-interface-admin": "بەڕێوەبەرانی ڕووکار",
        "group-bureaucrat": "بیوروکراتەکان",
        "group-suppress": "چاودێرەکان",
        "group-all": "(ھەموو)",
        "grouppage-autoconfirmed": "{{ns:project}}:بەکارھێنەرە خۆبەخۆ پەسندکراوەکان",
        "grouppage-bot": "{{ns:project}}:بۆت",
        "grouppage-sysop": "{{ns:project}}:بەڕێوەبەران",
+       "grouppage-interface-admin": "{{ns:project}}:بەڕێوەبەرانی ڕووکار",
        "grouppage-bureaucrat": "{{ns:project}}:بیوروکراتەکان",
        "grouppage-suppress": "{{ns:project}}:چاودێر",
        "right-read": "خوێندنەوەی پەڕەکان",
        "uctop": "(ھەنووکە)",
        "month": "لە مانگی (و پێشترەوە):",
        "year": "لە ساڵی (و پێشترەوە):",
+       "date": "لە ڕێکەوتی (و پێشترەوە)",
        "sp-contributions-newbies": "تەنیا بەشدارییەکانی ھەژمارە نوێکان نیشان بدە",
        "sp-contributions-newbies-sub": "بۆ ھەژمارە نوێکان",
        "sp-contributions-newbies-title": "بەشدارییەکانی بەکارھێنەر بۆ ھەژمارە نوێکان",
        "date-range-to": "بۆ ڕێکەوتی:",
        "log-action-filter-block": "جۆری بلۆک:",
        "log-action-filter-contentmodel": "جۆری گۆڕینی مۆدێلی ناوەڕۆک:",
+       "log-action-filter-delete": "جۆری سڕینەوە:",
        "log-action-filter-all": "ھەموو",
        "log-action-filter-upload-upload": "بارکردنی نوێ",
        "authmanager-email-label": "ئیمەیڵ"
index 5ea3313..0948136 100644 (file)
        "edit-error-long": "Errors:\n\n$1",
        "revid": "revision $1",
        "pageid": "page ID $1",
+       "interfaceadmin-info": "$1\n\nPermissions for editing of sitewide CSS/JS/JSON files were recently separated from the <code>editinterface</code> right. If you do not understand why you are getting this error, see [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "&lt;html&gt; tags cannot be used outside of normal pages.",
        "gotointerwiki": "Leaving {{SITENAME}}",
        "gotointerwiki-invalid": "The specified title is invalid.",
index e853143..a7aaabe 100644 (file)
        "rcfilters-filter-humans-description": "ویرایش توسط انسان.",
        "rcfilters-filtergroup-reviewstatus": "وضعیت بازبینی",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "گشت‌نخورده",
+       "rcfilters-filter-reviewstatus-manual-label": "به طور دستی گشت خورد",
        "rcfilters-filtergroup-significance": "اهمیت",
        "rcfilters-filter-minor-label": "ویرایش‌های جزئی",
        "rcfilters-filter-minor-description": "ویرایش‌هایی که به عنوان جزئی برچسب خورده‌اند.",
index dc678af..938791d 100644 (file)
        "group-autoconfirmed": "Automatski potvrđeni suradnici",
        "group-bot": "Botovi",
        "group-sysop": "Administratori",
+       "group-interface-admin": "Administratori sučelja",
        "group-bureaucrat": "Birokrati",
        "group-suppress": "Otajnici",
        "group-all": "(svi)",
        "group-autoconfirmed-member": "{{GENDER:$1|automatski potvrđeni suradnik|automatski potvrđena suradnica}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratorica}}",
+       "group-interface-admin-member": "{{GENDER:$1|administrator sučelja|administratorica sučelja}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat|birokratica}}",
        "group-suppress-member": "{{GENDER:$1|otajnik|otajnica}}",
        "grouppage-user": "{{ns:project}}:Suradnici",
        "grouppage-autoconfirmed": "{{ns:project}}:automatski potvrđeni suradnici",
        "grouppage-bot": "{{ns:project}}:Botovi",
        "grouppage-sysop": "{{ns:project}}:Administratori",
+       "grouppage-interface-admin": "{{ns:project}}:Administratori sučelja",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrati",
        "grouppage-suppress": "{{ns:project}}:Otajnost",
        "right-read": "Čitanje stranica",
index 90cbf86..a5c4009 100644 (file)
        "editundo": "Յետարկել",
        "diff-empty": "(Տարբերութիւն չկայ)",
        "diff-multi-sameuser": "(նոյն մասնակիցի ցոյց չտրուած {{PLURAL:$1|մէկ միջանկեալ խմբագրում|$1 միջանկեալ խմբագրումներ}})",
-       "diff-multi-otherusers": "(նոյն մասնակիցի ցոյց չտրուած {{PLURAL:$1|մէկ միջանկեալ վերանայում|$1 միջանկեալ վերանայումներ}})",
+       "diff-multi-otherusers": "(նոյն մասնակիցի ցոյց չտրուած {{PLURAL:$1|մէկ միջանկեալ վերանայում|$2 միջանկեալ վերանայումներ}})",
        "searchresults": "Որոնման արդիւնքներ",
        "searchresults-title": "«$1»-ի որոնման արդիւնքները",
        "prevn": "նախորդ {{PLURAL:$1|$1}}",
        "recentchangeslinked-feed": "Առնչուած փոփոխութիւններ",
        "recentchangeslinked-toolbox": "Առնչուող փոփոխութիւններ",
        "recentchangeslinked-title": "«$1» էջին առնչուած փոփոխութիւնները",
-       "recentchangeslinked-summary": "Õ\86Õ·Õ¥Õ¬ Ô·Õ»Õ« Õ©Õ«Ö\82Õ¨ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬Õ¸Ö\82 Õ°Õ¡Õ´Õ¡Ö\80 Õ¡ÕµÕ¤ Õ§Õ»Õ«Õ¶ Õ¯Õ¡Õ´ Õ§Õ»Õ§Õ¶ ÕµÕ²Õ¸Ö\82Õ¸Õ² Ö\83Õ¸Ö\83Õ¸Õ­Õ¸Ö\82Õ©Õ«Ö\82Õ¶Õ¶Õ¥Ö\80Õ¨Ö\89 (Õ\8dÕ¿Õ¸Ö\80Õ¸Õ£Õ¸Ö\82Õ©Õ¥Õ¡Õ¶ Õ´Õ¨ Õ¡Õ¶Õ¤Õ¡Õ´Õ¶Õ¥Ö\80Õ¨ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬Õ¸Ö\82 Õ°Õ¡Õ´Õ¡Ö\80, Õ¶Õ·Õ¥Õ¬ {{ns:category}}:Õ\8dÕ¿Õ¸Ö\80Õ¸Õ£Õ¸Ö\82Õ©Õ¥Õ¡Õ¶ Õ¡Õ¶Õ¸Ö\82Õ¶Õ¨))Ö\89\n[[Special:Õ\80Õ½Õ¯Õ¸Õ²Õ¸Ö\82Õ©Õ¥Õ¡Õ¶ Ö\81Õ¡Õ¶Õ¯|Õ±Õ¥Ö\80 Õ°Õ½Õ¯Õ¸Õ²Õ¸Ö\82Õ©Õ¥Õ¡Õ¶ Ö\81Õ¡Õ¶Õ¯]]Õ« Õ§Õ»Õ«Õ¶ Õ¾Ö\80Õ¡Õµ Õ£Õ¿Õ¶Õ¸Ö\82Õ¸Õ² Ö\83Õ¸Ö\83Õ¸Õ­Õ¸Ö\82Õ©Õ«Ö\82Õ¶Õ¶Õ¥Ö\80Õ¨ <strong>Õ·Õ¥Õ·Õ¿Õ¸Ö\82Õ¡Õ® Õ¿Õ¡Õ¼Õ¥Ö\80Õ¸Õ¾</strong> Õ¥Õ¶։",
+       "recentchangeslinked-summary": "Õ\86Õ·Õ¥Õ¬ Ô·Õ»Õ« Õ©Õ«Ö\82Õ¨ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬Õ¸Ö\82 Õ°Õ¡Õ´Õ¡Ö\80 Õ¡ÕµÕ¤ Õ§Õ»Õ«Õ¶ Õ¯Õ¡Õ´ Õ§Õ»Õ§Õ¶ ÕµÕ²Õ¸Ö\82Õ¸Õ² Ö\83Õ¸Ö\83Õ¸Õ­Õ¸Ö\82Õ©Õ«Ö\82Õ¶Õ¶Õ¥Ö\80Õ¨Ö\89 (Õ\8dÕ¿Õ¸Ö\80Õ¸Õ£Õ¸Ö\82Õ©Õ¥Õ¡Õ¶ Õ´Õ¨ Õ¡Õ¶Õ¤Õ¡Õ´Õ¶Õ¥Ö\80Õ¨ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬Õ¸Ö\82 Õ°Õ¡Õ´Õ¡Ö\80, Õ¶Õ·Õ¥Õ¬ {{ns:category}}:Õ\8dÕ¿Õ¸Ö\80Õ¡Õ£Õ¸Ö\82Õ©Õ¥Õ¡Õ¶ Õ¡Õ¶Õ¸Ö\82Õ¶Õ¨))Ö\89\n[[Special:Õ\80Õ½Õ¯Õ¸Õ²Õ¸Ö\82Õ©Õ¥Õ¡Õ¶ Ö\81Õ¡Õ¶Õ¯|Õ±Õ¥Ö\80 Õ°Õ½Õ¯Õ¸Õ²Õ¸Ö\82Õ©Õ¥Õ¡Õ¶ Ö\81Õ¡Õ¶Õ¯]]Õ« Õ§Õ»Õ«Õ¶ Õ¾Ö\80Õ¡Õµ Õ£Õ¿Õ¶Õ¸Ö\82Õ¸Õ² Ö\83Õ¸Ö\83Õ¸Õ­Õ¸Ö\82Õ©Õ«Ö\82Õ¶Õ¶Õ¥Ö\80Õ¨ <strong>Õ·Õ¥Õ·Õ¿Õ¸Ö\82Õ¡Õ® Õ¿Õ¡Õ¼Õ¥Ö\80Õ¸Õ¾ Õ¥Õ¶</strong>։",
        "recentchangeslinked-page": "Էջին անունը՝",
        "recentchangeslinked-to": "Փոխարէնը ցոյց տալ տուեալ էջին առնչուած էջերուն մէջ կատարուած փոփոխութիւնները։",
        "upload": "Վերբեռնել նիշք",
        "watchlisttools-raw": "Խմբագրել հում հսկողութեան ցանկը",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|քննարկում]])",
        "redirect": "Վերայղում նիշքի, մասնակիցի, էջի, տարբերակի կամ տեղեկատետրի ինքնութեան համարէն",
-       "redirect-summary": "Այս յատուկ էջը կը վերայղուի նիշքի մը (տրուած ըլլալով նիշքին անունը), էջի մը (տրուած ըլլալով վերանայման կամ էջի ինքնութեան համարը), մասնակիցի էջի մը .տրուած ըլլալով մասնակիցի մը թուային ինքնութեան համարը), եւ կամ տեղեկատետրի մը մէջ տողի մը, (տրուած ըլլալով տեղեկատետրի ինքնութեան համարը)։ Գործածութիւն՝  [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
+       "redirect-summary": "Այս յատուկ էջը կը վերայղուի նիշքի մը (տրուած ըլլալով նիշքին անունը), էջի մը (տրուած ըլլալով վերանայման կամ էջի ինքնութեան համարը), մասնակիցի էջի մըտրուած ըլլալով մասնակիցի մը թուային ինքնութեան համարը), եւ կամ տեղեկատետրի մը մէջ տողի մը, (տրուած ըլլալով տեղեկատետրի ինքնութեան համարը)։ Գործածութիւն՝  [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Յառաջ",
        "redirect-lookup": "Որոնում՝",
        "redirect-value": "Արժէք՝",
index 9b87ad7..e54666d 100644 (file)
        "thu": "ера",
        "fri": "пIаьраска",
        "sat": "шоатта",
-       "january": "АгIой",
-       "february": "Саь-кур",
-       "march": "Мутт-хьал",
-       "april": "Тушоли",
-       "may_long": "Села",
-       "june": "Этинга",
+       "january": "АгIой ''(январь)''",
+       "february": "Саь-кур ''(февраль)''",
+       "march": "Мутт-хьал ''(март)''",
+       "april": "Тушол ''(апрель)''",
+       "may_long": "Села ''(май)''",
+       "june": "Этинга ''(июнь)''",
        "july": "Баьцамеа",
        "august": "Мяцхали",
        "september": "Михий",
        "october": "АьрхIий",
        "november": "Лай чилла",
        "december": "Чан-тар",
-       "january-gen": "АгIой",
-       "february-gen": "Саь-кур",
-       "march-gen": "Мутт-хьал",
-       "april-gen": "Тушоли",
-       "may-gen": "Села",
-       "june-gen": "Этинга",
+       "january-gen": "АгIой ''(январь)'' бетта",
+       "february-gen": "Саь-кур ''(февраль)'' бетта",
+       "march-gen": "Мутт-хьал ''(март)'' бетта",
+       "april-gen": "Тушол ''(апрель)'' бетта",
+       "may-gen": "Села ''(май)'' бетта",
+       "june-gen": "Этинга ''(июнь)'' бетта",
        "july-gen": "Баьцамеа",
        "august-gen": "Мяцхали",
        "september-gen": "Михий",
        "october-gen": "АьрхIий",
        "november-gen": "Лай чилла",
        "december-gen": "Чан-тар",
-       "jan": "АгIой",
-       "feb": "Саь-кур",
-       "mar": "Мутт-хьал",
+       "jan": "АгIой ''(янв)''",
+       "feb": "Саь-кур ''(фев)''",
+       "mar": "Мутт-хьал ''(мар)''",
        "apr": "Tушоли",
-       "may": "Села",
-       "jun": "Этинга",
+       "may": "Села ''(май)''",
+       "jun": "Этинга ''(июн)''",
        "jul": "Баьцамеа",
        "aug": "Мяцхали",
        "sep": "Михий",
        "oct": "АьрхIий",
        "nov": "Лай чилла",
        "dec": "Чан-тар",
-       "january-date": "АгIой $1",
-       "february-date": "Саь-кур $1",
-       "march-date": "Мутт-хьал $1",
-       "april-date": "Тушоли $1",
-       "may-date": "Села $1",
-       "june-date": "Этинга $1",
+       "january-date": "АгIой ''(Январь)'' $1",
+       "february-date": "Саь-кур ''(февраль)'' $1",
+       "march-date": "Мутт-хьал ''(март)'' $1",
+       "april-date": "Тушол ''(апрель)'' $1",
+       "may-date": "Села ''(май)'' $1",
+       "june-date": "Этинга ''(июнь)'' $1",
        "july-date": "Баьцамеа $1",
        "august-date": "Мяцхали $1",
        "september-date": "Михий $1",
index ef0f171..64a68cc 100644 (file)
        "rcfilters-other-review-tools": "შემოწმების სხვა ხელსაწყოები",
        "rcfilters-group-results-by-page": "ჯგუფის შედეგები გვერდების მიხედვით",
        "rcfilters-activefilters": "აქტიური ფილტრები",
+       "rcfilters-activefilters-hide": "დამალვა",
+       "rcfilters-activefilters-show": "ჩვენება",
+       "rcfilters-activefilters-hide-tooltip": "აქტიური ფილტრების ადგილის დამალვა",
+       "rcfilters-activefilters-show-tooltip": "აქტიური ფილტრების ადგილის ჩვენება",
        "rcfilters-advancedfilters": "გაფართოებული ფილტრები",
        "rcfilters-limit-title": "ცვლილელების ნახვა",
        "rcfilters-limit-and-date-label": "{{PLURAL:$1|ცვლილება|$1 ცვლილება}}, $2",
        "rcfilters-preference-help": "გათიშავს 2017 წლის ინტერფეისის დიზაინზე გაკეთებულ განახლებას, გაითიშება მას შემდეგ დამატებული ყველა ხელსაწყო.",
        "rcfilters-watchlist-preference-label": "კონტროლის სიის გაუმჯობესებული ვერსიის დამალვა",
        "rcfilters-watchlist-preference-help": "აუქმებს 2017 წლის ინტერფეისისა და ყველა ხელსაწყოს რედიზაინს დამატებულს მაშინ და შემდგომ.",
+       "rcfilters-filter-showlinkedfrom-label": "ცვლილებების ჩვენება დაკავშირებულ გვერდებზე",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>არჩეულზე, დაკავშირებული</strong> გვერდები",
        "rcnotefrom": "ქვემოთ {{PLURAL:$5|ნაჩვენებია ცვლილება|ნაჩვენებია ცვლილებები}} <strong>$3, $4</strong>-დან (ნაჩვენებია არაუმეტეს <strong>$1</strong>).",
        "rclistfromreset": "თარიღის საწყის კონფიგურაციაზე დაბრუნება",
        "rclistfrom": "ახალი ცვლილებების ჩვენება დაწყებული $3 $2-დან",
        "filedelete-edit-reasonlist": "წაშლის მიზეზების რედაქტირება",
        "filedelete-maintenance": "ფაილების წაშლა და აღდგენა დროებით გათიშულია ტექნიკური სამუშაობის განმავლობაში.",
        "filedelete-maintenance-title": "ფაილის წაშლა ვერ ხერხდება",
-       "mimesearch": "MIME ძიება",
+       "mimesearch": "MIME-ის ძიება",
        "mimesearch-summary": "ამ გვერდის მეშვეობით შესაძლებელია ფაილების მოძიება მათი MIME-ტიპის მიხედვით. შეტანის ფორმა: შიგთავსის ტიპი/ქვეტიპი, მაგ <code>image/jpeg</code>.",
        "mimetype": "MIME ტიპი:",
        "download": "გადმოტვირთვა",
        "pagedata-title": "გვერდის მონაცემი",
        "pagedata-text": "ეს გვერდი აჩვენებს მონაცემის ინტერფეისს გვერდებზე. გთხოვთ წარმოადგინეთ გვერდის სათაური URL-ში, ქვეგვერდის სინტაქსის გამოყენებით.\n* Content negotiation მუშაობს კლიენტის Accept ჰედერზე დაფუძნებით. ეს ნიშნავს, რომ გვერდის მონაცემი გამოჩნდება თქვენი კლიენტის ფორმატით.",
        "pagedata-not-acceptable": "შესაბამისი ფორმატი ვერ მოიძებნა. მხარდაჭერილი MIME ტიპები: $1",
-       "pagedata-bad-title": "არასწორი სათაური: \"$1\"."
+       "pagedata-bad-title": "არასწორი სათაური: \"$1\".",
+       "passwordpolicies": "პაროლების პოლიტიკა"
 }
index 466d339..89b7548 100644 (file)
        "otherlanguages": "Yn tavosow erel",
        "redirectedfrom": "(Daskevarwodhys dhyworth $1)",
        "redirectpagesub": "Folen dhaskedya",
+       "redirectto": "Daskidya dhe:",
        "lastmodifiedat": "Diwettha chanj an folen ma a veu an $1, dhe $2.",
        "protectedpage": "Folen dhifresys",
        "jumpto": "Lamma dhe:",
        "pool-errorunknown": "Gwall ankoth",
        "aboutsite": "A-dro dhe {{SITENAME}}",
        "aboutpage": "Project:Kedhlow",
-       "copyright": "Kavadow yw an dalgh yn-dann $1.",
+       "copyright": "Kavadow yw an dalgh yn-dann $1, marnas avisyes yn ken maner.",
        "copyrightpage": "{{ns:project}}:Gwirbryntyansow",
        "currentevents": "Hwarvosow a-lemmyn",
        "currentevents-url": "Project:Hwarvosow a-lemmyn",
        "youhavenewmessages": "$1 a'gas beus ($2).",
        "youhavenewmessagesfromusers": "Hwi a'gas beus $1 dhyworth {{PLURAL:$3|devnydhyer aral|$3 devnydhyer}} ($2).",
        "youhavenewmessagesmanyusers": "Hwi a'gas beus $1 dhyworth lies devnydhyer ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|messach nowyth|messajys nowyth}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|chanj|chanjyow}} diwettha",
+       "newmessageslinkplural": "{{PLURAL:$1|messach nowydh|999=messajys nowydh}}",
+       "newmessagesdifflinkplural": "an {{PLURAL:$1|chanj|999=chanjyow}} diwettha",
        "youhavenewmessagesmulti": "Messajys nowyth a'gas beus war $1",
        "editsection": "chanjya",
        "editold": "chanjya",
        "filenotfound": "Ny allas kavos an restren \"$1\".",
        "cannotdelete-title": "Ny yllir dilea an folen \"$1\"",
        "badtitle": "Titel drog",
+       "badtitletext": "Drog po gwag o an folen wovynnys, po titel kammkevrennys kesyeth po keswiki o.\nMartesen yma unn lytheren po moy ynno na yllir usya yn titlys.",
        "viewsource": "Gweles an bennfenten",
        "viewsource-title": "Gweles an bennfenten rag $1",
        "protectedpagetext": "Difresys yw an folen ma dhe witha rag chanjya po gwriansow erel.",
        "image_tip": "Restren neythys",
        "media_tip": "Kevren restren",
        "sig_tip": "Agas sinans ha stampa-termyn",
+       "hr_tip": "Linen worwelyek (na usyowgh re)",
        "summary": "Berrskrif:",
        "subject": "Testen:",
        "minoredit": "Chanj byghan yw hemma",
        "template-semiprotected": "(hanter-difresys)",
        "hiddencategories": "Esel a {{PLURAL:$1|1 glass kudhys|$1 klass kudhys}} yw an folen ma:",
        "permissionserrorstext-withaction": "Nyns eus kummyas dhywgh dhe $2, rag an {{PLURAL:$1|acheson|achesonys}} a syw:",
-       "moveddeleted-notice": "Diles veu an folen ma.\nA-woles yma kovnotennow dhilea ha gwaya an folen.",
+       "recreate-moveddeleted-warn": "<strong>Gwarnyans: Yth esowgh ow kul folen a veu diles kens.</strong>\n\nY tal dhywgh prederi mars yw gwiw pesya ow chanjya an folen ma.\nOttomma kovnoten dhilea ha gwaya an folen ma:",
+       "moveddeleted-notice": "Diles veu an folen ma.\nA-woles yma kovnotennow dhilea, difres ha gwaya an folen.",
        "log-fulllog": "Gweles an govnoten dhien",
        "editwarning-warning": "Mar kesowgh an folen ma, hwi a allsa kelli chanjyow gwrys genowgh.\nMars owgh hwi omgelmys, hwi a yll diallosegi an gwarnyans ma yn tregh \"{{int:prefs-editing}}\" agas dewisyow.",
+       "content-model-wikitext": "wikitekst",
        "undo-success": "Y hyllir diswul an chanj-ma.\nCheckyewgh mar pleg an kehevelyans a-woles rag gwirya bos hemma an pyth a vynnowgh, hag ena gwithewgh an chanjyow a-woles rag gorfenna diswul an chanj.",
        "undo-summary": "Amendyans $1 gans [[Special:Contributions/$2|$2]] ([[User talk:$2|keskows]]) diswrys",
        "viewpagelogs": "Gweles kovnotennow an folen ma",
        "page_first": "kynsa",
        "page_last": "diwettha",
        "histlegend": "Dewis dyffransow: Merkyewgh kistennow radyo a'n amendyansow dhe geheveli, ha gweskewgh 'entra' po an boton orth goles an folen.<br />\nAlhwedh: '''({{int:cur}})''' = an dyffrans dhyworth an amendyans diwettha, '''({{int:last}})''' = an dyffrans dhyworth an amendyans kyns, '''{{int:minoreditletter}}''' = chanj byhan.",
-       "history-fieldset-title": "Peuri an istori",
+       "history-fieldset-title": "Hwilas amendyansow",
        "history-show-deleted": "Diles hepken",
-       "histfirst": "An moyha a-varr",
-       "histlast": "An diwettha",
+       "histfirst": "an kottha",
+       "histlast": "an nowettha",
        "historysize": "({{PLURAL:$1|1 bayt}})",
        "historyempty": "(gwag)",
        "history-feed-title": "Istori amendya",
        "compareselectedversions": "Keheveli an amendyansow dewisyes",
        "showhideselectedversions": "Diskwedhes/kudha amendyansow dewisyes",
        "editundo": "diswul",
+       "diff-empty": "(Dihevelepter vyth)",
+       "diff-multi-sameuser": "(Nyns yw diskwedhys {{PLURAL:$1|unn janj|$1 chanj}} kresel gans an keth devnydhyer)",
+       "diff-multi-otherusers": "(Nyns yw diskwedhys {{PLURAL:$1|unn janj|$1 chanj}} kresel gans {{PLURAL:$2|unn devnydhyer aral|$2 usyer}})",
        "searchresults": "Sewyansow hwilas",
        "searchresults-title": "Sewyansow hwilas rag \"$1\"",
        "notextmatches": "Nyns eus tekst folen vyth owth omdhesedha",
        "right-move": "Gwaya folennow",
        "right-movefile": "Gwaya restrennow",
        "right-upload": "Ughkarga restrennow",
+       "right-writeapi": "Devnydh a'n API skrifa",
        "right-delete": "Dilea folennow",
        "newuserlogpage": "Kovnoten gwruthyl akontow devnydhyer",
        "rightslog": "Kovnoten wiryow an devnydhyer",
        "action-edit": "chanjya an folen-ma",
+       "action-createaccount": "formya an akont usyer ma",
        "action-move": "gwaya an folen ma",
        "action-movefile": "gwaya an restren-ma",
        "action-upload": "ughkarga an restren-ma",
        "rcfilters-filter-pageedits-label": "Chanjyow dhe folennow",
        "rcfilters-filter-newpages-label": "Folennow gwrys",
        "rcfilters-liveupdates-button": "Nowedhansow byw",
+       "rcnotefrom": "A-woles yma {{PLURAL:$5|an chanj|an chanjyow}} a-dhia <strong>$3, $4</strong> (ow tiskwedhes bys yn <strong>$1</strong>).",
        "rclistfrom": "Diskwedhes chanjyow nowydh a-dhia $3 $2",
        "rcshowhideminor": "$1 chanjyow byghan",
+       "rcshowhideminor-show": "Diskwedhes",
        "rcshowhideminor-hide": "Kudha",
        "rcshowhidebots": "$1 bottow",
        "rcshowhidebots-show": "Diskwedhes",
        "rcshowhidebots-hide": "Kudha",
        "rcshowhideliu": "$1 devnydhoryon govskrifys",
+       "rcshowhideliu-show": "Diskwedhes",
        "rcshowhideliu-hide": "Kudha",
        "rcshowhideanons": "$1 devnydhyoryon dhihanow",
        "rcshowhideanons-show": "Diskwedhes",
        "rcshowhideanons-hide": "Kudha",
        "rcshowhidepatr-hide": "Kudha",
        "rcshowhidemine": "$1 ow chanjyow",
+       "rcshowhidemine-show": "Diskwedhes",
        "rcshowhidemine-hide": "Kudha",
        "rcshowhidecategorization-hide": "Kudha",
        "rclinks": "Diskwedhes an $1 chanj diwettha gwrys y'n $2 dydh diwettha",
        "newsectionsummary": "/* $1 */ tregh nowyth",
        "rc-enhanced-expand": "Diskwedhes an manylyon (res yw JavaScript)",
        "rc-enhanced-hide": "Kudha an manylyon",
+       "rc-old-title": "gwrys yn kensa avel \"$1\"",
        "recentchangeslinked": "Chanjyow kelmys",
        "recentchangeslinked-feed": "Chanjyow kelmys",
        "recentchangeslinked-toolbox": "Chanjyow kelmys",
        "recentchangeslinked-title": "Chanjyow kelmys dhe \"$1\"",
-       "recentchangeslinked-summary": "Homm yw rol a janjyow gwrys a-dhiwedhes dhe folennow yw kevrennys dhyworth folen res (po dhe eseli a glass res).\n'''Tew''' yw folennow eus war agas [[Special:Watchlist|rol wolya]].",
+       "recentchangeslinked-summary": "Entrowgh hanow folen rag gweles chanjyow war folennow kevrennys a po bys y'n folen na. (Rag gweles eseli klass, entrowgh {{ns:category}}:Hanow an klass). Skrifys yn <strong>tew</strong> yw chanjyow dhe folennow war [[Special:Watchlist|agas rol golya]].",
        "recentchangeslinked-page": "Hanow an folen:",
        "recentchangeslinked-to": "Diskwedhes chanjyow dhe folennow kevrennys dhe'n folen res yn le",
        "upload": "Ughkarga restren",
        "filesource": "Pennfenten:",
        "savefile": "Gwitha restren",
        "watchthisupload": "Golya an folen-ma",
+       "license-header": "Leshyans",
        "imgfile": "restren",
        "listfiles_date": "Dedhyans",
        "listfiles_name": "Hanow",
        "linkstoimage-more": "Yma moy es $1 {{PLURAL:$1|folen}} ow kevrenna dhe'n restren-ma.\nNy dhiskwa an rol a syw marnas an {{PLURAL:$1|kynsa kevren folen|kynsa $1 kevren folen}} dhe'n restren-ma.\nYma [[Special:WhatLinksHere/$2|rol leun]] kavadow.",
        "nolinkstoimage": "Nyns eus folen vyth ow kevrenna dhe'n restren-ma.",
        "morelinkstoimage": "Gweles [[Special:WhatLinksHere/$1|moy kevrennow]] dhe'n restren-ma.",
+       "linkstoimage-redirect": "$1 (ow taskidya restren) $2",
        "sharedupload": "An folen ma a dheu a $1 hag a allsa bos usys gans ragdresow erel.",
        "sharedupload-desc-here": "Yma an restren ma dhe $1 ha ragdresow erel a allsa bos orth hy devnydhya.\nDiskwedhys a-woles yma an deskrifans war hy [$2 folen dheskrifans] ena.",
+       "filepage-nofile": "Nyns eus folen henwys yndelma.",
        "uploadnewversion-linktext": "Ughkarga versyon nowyth a'n restren-ma",
+       "upload-disallowed-here": "Ny yllowgh gorskrifa an restren ma.",
        "filedelete": "Dilea $1",
        "filedelete-legend": "Dilea an restren",
        "filedelete-submit": "Dilea",
        "pager-older-n": "{{PLURAL:$1|1 kottha|$1 kottha}}",
        "booksources": "Pennfentynyow lyver",
        "booksources-search-legend": "Hwilas pennfentynyow lyver",
+       "booksources-search": "Hwilas",
        "specialloguserlabel": "Awtour:",
        "speciallogtitlelabel": "Kosten (titel po devnydhyer):",
        "log": "Kovnotennow",
        "watchlist-details": "Yma {{PLURAL:$1|$1 folen}} war agas rol wolya, marnas folennow keskows.",
        "wlheader-showupdated": "Yn '''tew''' y tiskwedhir folennow re beu chanjyes a-dhia agas vysytyans diwettha.",
        "wlnote": "A-woles yma an {{PLURAL:$1|chanj diwettha|'''$1''' chanj diwettha}} y'n {{PLURAL:$2|our|'''$2''' our}} diwettha, a-dhia $3, $4.",
-       "wlshowlast": "Diskwedhes an $1 our diwettha, an $2 dydh diwettha, po",
+       "wlshowlast": "Diskwedhes an $1 our $2 dydh diwettha",
        "watchlist-hide": "Kudha",
        "watchlist-options": "Etholyow an rol wolya",
        "watching": "Ow kolya...",
        "deleteotherreason": "Acheson aral/keworansel:",
        "deletereasonotherlist": "Acheson aral",
        "rollbacklink": "rolya war-dhelergh",
+       "rollbacklinkcount": "rolya $1 {{PLURAL:$1|janj|chanj}} war-dhelergh",
        "protectlogpage": "Kovnoten dhifres",
        "protectedarticle": "\"[[$1]]\" difresys",
+       "modifiedarticleprotection": "a janjyas nivel difresans \"[[$1]]\"",
        "prot_1movedto2": "[[$1]] gwayys dhe [[$2]]",
        "protectcomment": "Acheson:",
        "protectexpiry": "Ow tiwedha:",
        "undelete-show-file-submit": "Ya",
        "namespace": "Spas hanow:",
        "invert": "Trebuchya an dewisyans",
+       "tooltip-invert": "Tyckyowgh an gist ma rag kudha chanjyow dhe folennow y'n hanow spas dewisyes (ha'n hanow spas kevrennys, mars yw tyckyes)",
        "namespace_association": "Spas hanow kelmys",
+       "tooltip-namespace_association": "Tyckyowgh an gist ma dhe geworra ynwedh an hanow spas keskows po testen kevrennys dhe'n hanow spas dewisyes",
        "blanknamespace": "(Penn)",
        "contributions": "Kevrohow an {{GENDER:$1|devnydhyer}}",
        "contributions-title": "Kevrohow $1",
        "mycontris": "Kevrohow",
-       "contribsub2": "Rag $1 ($2)",
-       "uctop": "(gwartha)",
+       "anoncontribs": "Kevrohow",
+       "contribsub2": "Gans {{GENDER:$3|$1}} ($2)",
+       "uctop": "(a-lemmyn)",
        "month": "Dhyworth an mis (ha moy a-varr):",
        "year": "Dhyworth an vledhen (ha moy a-varr):",
        "sp-contributions-newbies": "Diskwedhes yn unnik kevrohow akontow nowyth",
        "sp-contributions-search": "Hwilas kevrohow",
        "sp-contributions-username": "Trigva IP po hanow devnydhyer:",
        "sp-contributions-toponly": "Diskwedhes yn unnik chanjyow yw amendyansow diwettha",
+       "sp-contributions-newonly": "Diskwedhes yn unnik chanjyow a wrug folennow nowydh",
        "sp-contributions-submit": "Hwilas",
        "whatlinkshere": "Folennow kevrennys",
        "whatlinkshere-title": "Folennow ow kevrenna dhe \"$1\"",
        "whatlinkshere-prev": "{{PLURAL:$1|kyns|$1 kyns}}",
        "whatlinkshere-next": "{{PLURAL:$1|nessa|nessa $1}}",
        "whatlinkshere-links": "← kevrennow",
-       "whatlinkshere-hideredirs": "$1 daskedyansow",
-       "whatlinkshere-hidetrans": "$1 treuskludyans",
+       "whatlinkshere-hideredirs": "$1 daskidyansow",
+       "whatlinkshere-hidetrans": "$1 treuskludyansow",
        "whatlinkshere-hidelinks": "$1 kevrennow",
        "whatlinkshere-hideimages": "$1 kevrennow restren",
        "whatlinkshere-filters": "Sidhlow",
        "import-upload-filename": "Hanow an restren:",
        "importstart": "Owth ymperthi folennow...",
        "import-noarticle": "Nyns eus folen vyth dhe ymperthi!",
-       "tooltip-pt-userpage": "Agas folen dhevnydhyer",
-       "tooltip-pt-mytalk": "Agas folen gows",
-       "tooltip-pt-preferences": "Agas dewisyow",
+       "tooltip-pt-userpage": "{{GENDER:|Agas folen dhevnydhyer}}",
+       "tooltip-pt-mytalk": "{{GENDER:|Agas folen gows}}",
+       "tooltip-pt-preferences": "{{GENDER:|Agas dewisyow}}",
        "tooltip-pt-watchlist": "Rol a folennow esowgh ow kolya rag chanjyow",
-       "tooltip-pt-mycontris": "Rol a'gas kevrohow",
+       "tooltip-pt-mycontris": "Rol {{GENDER:|a'gas kevrohow}}",
        "tooltip-pt-login": "Ni a gomend hwi dhe omgelmi, mes nyns yw bysi",
        "tooltip-pt-logout": "Omdenna",
        "tooltip-pt-createaccount": "Ni a gomend hwi dhe wruthyl akont hag omgelmi; byttegyns nyns yw bysi",
        "tooltip-t-recentchangeslinked": "Chanjyow a-dhiwedhes yn folennow kevrennys dhyworth an folen ma",
        "tooltip-feed-rss": "Feed RSS rag an folen-ma",
        "tooltip-feed-atom": "Feed Atom rag an folen ma",
-       "tooltip-t-contributions": "Gweles rol a gevrohow an devnydhyer ma",
-       "tooltip-t-emailuser": "Danvon ebost dhe'n devnydhyer-ma",
+       "tooltip-t-contributions": "Rol a gevrohow gans {{GENDER:$1|an usyer ma}}",
+       "tooltip-t-emailuser": "Danvon ebost dhe'n {{GENDER:$1|usyer|usyores}} ma",
        "tooltip-t-upload": "Ughkarga restrennow",
        "tooltip-t-specialpages": "Rol a geniver folen arbennek",
        "tooltip-t-print": "Versyon pryntyadow a'n folen ma",
        "tooltip-ca-nstab-special": "Folen arbennek yw homma; ny yllir hy chanjya",
        "tooltip-ca-nstab-project": "Gweles folen an wiki",
        "tooltip-ca-nstab-image": "Gweles folen an restren",
+       "tooltip-ca-nstab-mediawiki": "Gweles messach an system",
        "tooltip-ca-nstab-template": "Gweles an skantlyn",
        "tooltip-ca-nstab-category": "Gweles folen an klass",
        "tooltip-minoredit": "Merkya hemma avel chanj byhan",
        "siteuser": "devnydhyer {{SITENAME}} $1",
        "lastmodifiedatby": "Chanj diwettha an folen ma a veu dhe $2 an $1 gans $3.",
        "siteusers": "{{PLURAL:$2|devnydhyer|devnydhyoryon}} {{SITENAME}} $1",
+       "simpleantispam-label": "Prov gorth-spam.\n<strong>Na</strong> lenwowgh hemma!",
+       "pageinfo-title": "Kedhlow \"$1\"",
+       "pageinfo-header-edits": "Istori chanjya",
+       "pageinfo-watchers": "Niver a dus ow kolya",
+       "pageinfo-few-watchers": "Le es $1 {{PLURAL:$1|golyer|golyoryon}}",
+       "pageinfo-firstuser": "Gwrier an folen",
+       "pageinfo-firsttime": "Dedhyans gwrians an folen",
+       "pageinfo-edits": "Niver a janjyow",
        "pageinfo-toolboxlink": "Kedhlow an folen",
        "previousdiff": "← Chanj kottha",
        "nextdiff": "Chanj nowyttha →",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|folen}}",
        "file-info-size": "$1 × $2 piksel, myns an restren: $3, eghen MIME: $4",
        "file-nohires": "Nyns eus klerder ughella kavadow.",
        "svg-long-desc": "Restren SVG, $1 × $2 piksel yn hanow, myns an restren: $3",
        "metadata-collapse": "Kudha manylyon ystynnys",
        "exif-imagewidth": "Les",
        "exif-imagelength": "Uhelder",
+       "exif-xresolution": "Klerder gorwelyek",
+       "exif-yresolution": "Klerder plommwedhek",
        "exif-artist": "Awtour",
        "exif-meteringmode-255": "Aral",
        "exif-contrast-0": "Usadow",
        "version": "Versyon",
        "version-other": "Aral",
        "version-version": "($1)",
+       "redirect-submit": "Mos",
+       "redirect-lookup": "Hwilas:",
+       "redirect-user": "ID an usyer",
+       "redirect-page": "ID an folen",
+       "redirect-revision": "Amendyans an folen",
+       "redirect-file": "Hanow an restren",
        "fileduplicatesearch-filename": "Hanow an restren:",
        "fileduplicatesearch-submit": "Hwilas",
        "specialpages": "Folennow arbennek",
        "tag-filter": "Sidhel [[Special:Tags|tagyow]]:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tagg|Taggys}}]]: $2)",
        "tags-title": "Taggys",
+       "tags-active-no": "Nag yw",
        "tags-edit": "chanjya",
        "dberr-problems": "Drog yw genen! An wiasva-ma a's teves kaletter teknogel.",
        "dberr-again": "Assayewgh gortos pols ha daskarga.",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|a wayas}} an folen $3 dhe $4 heb gasa daskedyans",
        "logentry-move-move_redir": "$1 {{GENDER:$2|a wayas}} an folen $3 dhe $4 dres daskedyans",
        "logentry-newusers-create": "{{GENDER:$2|Gwruthys}} veu an akont devnydhyer $1",
-       "searchsuggest-search": "Hwilas",
+       "logentry-newusers-autocreate": "{{GENDER:$2|Gwrys}} veu an akont usyer $1 yn awtomatek",
+       "logentry-upload-upload": "$1 {{GENDER:$2|a ughkargas}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|a ughkargas}} versyon nowydh a $3",
+       "searchsuggest-search": "Hwilas yn {{SITENAME}}",
        "searchsuggest-containing": "ynni...",
+       "duration-days": "$1 {{PLURAL:$1|jydh|dydh}}",
        "special-characters-group-latin": "Latin",
        "special-characters-group-latinextended": "Latin ystynnys",
        "special-characters-group-ipa": "IPA",
index 0b30dfe..bc7c9dd 100644 (file)
        "customcssprotected": "Du har ikke tillatelse til å redigere denne CSS-siden fordi den inneholder en annen brukers personlige innstillinger.",
        "customjsonprotected": "Du har ikke tillatelse til å redigere denne JSON-siden fordi den inneholder en annen bruker sine personlige innstillinger.",
        "customjsprotected": "Du har ikke tillatelse til å redigere denne JavaScript-siden fordi den inneholder en annen brukers personlige innstillinger.",
+       "sitecssprotected": "Du har ikke tillatelse til å redigere denne CSS-siden fordi det kan påvirke alle besøkende",
+       "sitejsonprotected": "Du har ikke tillatelse til å redigere denne JSON-siden fordi det kan påvirke alle besøkende",
+       "sitejsprotected": "Du har ikke tillatelse til å redigere denne JavaScript-siden fordi det kan påvirke alle besøkende",
        "mycustomcssprotected": "Du har ikke rettigheter til å redigere denne CSS-siden.",
        "mycustomjsonprotected": "Du har ikke tillatelse til å redigere denne JSON-siden.",
        "mycustomjsprotected": "Du har ikke rettigheter til å redigere denne Javascript-siden.",
        "group-autoconfirmed": "Autobekreftede brukere",
        "group-bot": "Roboter",
        "group-sysop": "Administratorer",
+       "group-interface-admin": "Grensesnittadministratorer",
        "group-bureaucrat": "Byråkrater",
        "group-suppress": "Sidefjernere",
        "group-all": "(alle)",
        "group-autoconfirmed-member": "{{GENDER:$1|autobekreftet bruker}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator}}",
+       "group-interface-admin-member": "{{GENDER:$1|grensesnittadministrator}}",
        "group-bureaucrat-member": "{{GENDER:$1|byråkrat}}",
        "group-suppress-member": "{{GENDER:$1|historikkrydder}}",
        "grouppage-user": "{{ns:project}}:Brukere",
        "grouppage-autoconfirmed": "{{ns:project}}:Autobekreftede brukere",
        "grouppage-bot": "{{ns:project}}:Roboter",
        "grouppage-sysop": "{{ns:project}}:Administratorer",
+       "grouppage-interface-admin": "{{ns:project}}:Grensesnittadministratorer",
        "grouppage-bureaucrat": "{{ns:project}}:Byråkrater",
        "grouppage-suppress": "{{ns:project}}:Historikkrydding",
        "right-read": "Se sider",
        "right-editusercss": "Redigere andre brukeres CSS-filer",
        "right-edituserjson": "Rediger andre brukere sine JSON-filer",
        "right-edituserjs": "Redigere andre brukeres JS-filer",
+       "right-editsitecss": "Redigere CSS for hele nettstedet",
+       "right-editsitejson": "Redigere JSON for hele nettstedet",
+       "right-editsitejs": "Redigere JavaScript for hele nettstedet",
        "right-editmyusercss": "Redigere sine egne CSS-filer",
        "right-editmyuserjson": "Rediger din egen bruker sine JSON-filer",
        "right-editmyuserjs": "Redigere sine egne JavaScript-filer",
        "grant-createaccount": "Opprette kontoer",
        "grant-createeditmovepage": "Opprette, redigere eller flytte sider",
        "grant-delete": "Slette sider, revisjoner og logginnlegg",
-       "grant-editinterface": "Redigere MediaWiki-navnerommet og CSS/JSON/JavaScript i brukernavnerommet",
+       "grant-editinterface": "Redigere MediaWiki-navnerommet og JSON for helle nettstedet og i brukernavnerommet",
        "grant-editmycssjs": "Redigere din bruker-CSS/JSON/JavaScript",
        "grant-editmyoptions": "Rediger dine brukerinnstillinger",
        "grant-editmywatchlist": "Redigere overvåkningslisten din",
+       "grant-editsiteconfig": "Redigere CSS og JavaScript for hele nettstedet og i brukernavnerommet",
        "grant-editpage": "Redigere eksisterende sider",
        "grant-editprotected": "Redigere beskyttede sider",
        "grant-highvolume": "Høy&shy;volum&shy;redigering",
        "uploadstash-zero-length": "Filen har en lengde på null.",
        "invalid-chunk-offset": "Ugyldig delforskyvning",
        "img-auth-accessdenied": "Ingen tilgang",
-       "img-auth-nopathinfo": "Manglende PATH_INFO.\nTjeneren din er ikke satt opp til å gi denne informasjonen.\nDen er kanskje CGI-basert og støtter ikke img_auth.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Se bildeautorisasjon.",
+       "img-auth-nopathinfo": "Manglende stiinformasjon.\nTjeneren må være satt opp til å sende variablene REQUEST_URI og/eller PATH_INFO.\nOm den er det, prøv å slå på $wgUsePathInfo.\nSe https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization .",
        "img-auth-notindir": "Den ønskede stien finnes ikke i den oppsatte opplastingsmappa.",
        "img-auth-badtitle": "Kunne ikke lage en gyldig tittel ut fra «$1».",
        "img-auth-nologinnWL": "Du er ikke logget inn, og «$1» er ikke på hvitelista.",
        "passwordpolicies-policy-passwordcannotmatchusername": "Passordet kan ikke være det samme som brukernavnet",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Passordet kan ikke matche spesifikt svartelistede passord",
        "passwordpolicies-policy-maximalpasswordlength": "Passordet må være på minst $1 {{PLURAL:$1|tegn}}",
-       "passwordpolicies-policy-passwordcannotbepopular": "Passordet kan ikke være {{PLURAL:$1|det populære passordet|i lista over $1 populære passord}}"
+       "passwordpolicies-policy-passwordcannotbepopular": "Passordet kan ikke være {{PLURAL:$1|det populære passordet|i lista over $1 populære passord}}",
+       "easydeflate-invaliddeflate": "Det gitte innholdet er ikke riktig komprimert"
 }
index 3e5b262..c5a4235 100644 (file)
        "customcssprotected": "Nie jesteś uprawniony do edytowania tej strony CSS, ponieważ zawiera ona ustawienia osobiste innego użytkownika.",
        "customjsonprotected": "Nie jesteś uprawniony do edytowania tej strony JSON, ponieważ zawiera ona ustawienia osobiste innego użytkownika.",
        "customjsprotected": "Nie jesteś uprawniony do edytowania tej strony JavaScript, ponieważ zawiera ona ustawienia osobiste innego użytkownika.",
+       "sitecssprotected": "Nie masz uprawnień do edytowania tej strony CSS, ponieważ może to wpłynąć na wszystkich odwiedzających",
+       "sitejsonprotected": "Nie masz uprawnień do edytowania tej strony JSON, ponieważ może to wpłynąć na wszystkich odwiedzających",
        "sitejsprotected": "Nie masz uprawnień do edytowania tej strony JavaScript, ponieważ może to wpłynąć na wszystkich odwiedzających",
        "mycustomcssprotected": "Nie masz uprawnień do edytowania tej strony CSS.",
        "mycustomjsonprotected": "Nie masz uprawnień do edytowania tej strony JSON.",
        "right-editusercss": "Edycja plików CSS innych użytkowników",
        "right-edituserjson": "Edycja plików JSON innych użytkowników",
        "right-edituserjs": "Edycja plików JS innych użytkowników",
+       "right-editsitecss": "Edycja plików CSS projektu",
+       "right-editsitejson": "Edycja plików JSON projektu",
+       "right-editsitejs": "Edycja plików JavaScript projektu",
        "right-editmyusercss": "Edycja swoich plików CSS",
        "right-editmyuserjson": "Edycja swoich plików JSON",
        "right-editmyuserjs": "Edycja swoich plików JavaScript",
        "grant-createaccount": "Tworzenie kont",
        "grant-createeditmovepage": "Tworzenie, edycja i przenoszenie stron",
        "grant-delete": "Usuwanie stron, wersji stron i wpisów rejestru",
-       "grant-editinterface": "Edycja przestrzeni nazw MediaWiki oraz CSS/JSON/JavaScript użytkownika",
+       "grant-editinterface": "Edycja przestrzeni nazw MediaWiki oraz plików JSON projektu i innych użytkowników",
        "grant-editmycssjs": "Edycja swoich plików CSS/JSON/JavaScript",
        "grant-editmyoptions": "Edycja swoich preferencji",
        "grant-editmywatchlist": "Edycja listy obserwowanych",
+       "grant-editsiteconfig": "Edycja plików CSS i JS projektu i innych użytkowników",
        "grant-editpage": "Edycja istniejących stron",
        "grant-editprotected": "Edycja stron zabezpieczonych",
        "grant-highvolume": "Masowe edytowanie",
        "uploadstash-zero-length": "Plik ma zerowy rozmiar.",
        "invalid-chunk-offset": "Nieprawidłowe przesunięcie fragmentu",
        "img-auth-accessdenied": "Odmowa dostępu",
-       "img-auth-nopathinfo": "Brak PATH_INFO.\nSerwer nie został skonfigurowany, tak aby przekazywał tę informację.\nMożliwe, że jest oparty na CGI i nie może obsługiwać img_auth.\nWięcej o informacji o autoryzacji grafik na https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Brak informacji o ścieżce.\nSerwer musi być skonfigurowany tak, aby przekazywał zmienne REQUEST_URI lub PATH_INFO.\nJeżeli jest już odpowiednio skonfigurowany, spróbuj włączyć $wgUsePathInfo.\nWięcej o informacji o autoryzacji grafik na https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Żądana ścieżka nie jest w obrębie katalogu skonfigurowanego do przesyłania plików.",
        "img-auth-badtitle": "Nie można wygenerować prawidłowego tytuł z „$1”.",
        "img-auth-nologinnWL": "Nie jesteś zalogowany, a „$1” nie jest na białej liście.",
index dca810c..8baa4d0 100644 (file)
        "converter-manual-rule-error": "Erro detetado na regra de conversão de língua manual",
        "undo-success": "É possível desfazer a edição.\nVerifique a comparação abaixo, por favor, para se certificar de que corresponde ao que pretende fazer.\nDepois grave as alterações, para finalizar e desfazer a edição.",
        "undo-failure": "Não foi possível desfazer a edição por conflito com alterações intermédias.",
-       "undo-main-slot-only": "Não foi possível desfazer a edição porque ela envolve conteúdo fora da zona principal.",
+       "undo-main-slot-only": "Não foi possível desfazer a edição porque ela envolve conteúdo fora do segmento de revisão principal.",
        "undo-norev": "Não foi possível desfazer a edição porque não existe ou foi apagada.",
        "undo-nochange": "A edição parece já ter sido desfeita.",
        "undo-summary": "Desfez a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussão]])",
index 9b665c5..41765df 100644 (file)
        "grouppage-bureaucrat": "{{doc-group|bureaucrat|page}}",
        "grouppage-suppress": "{{doc-group|suppress|page}}\n{{Identical|Suppress}}",
        "right-read": "{{doc-right|read}}\nBasic right to read any page.",
-       "right-edit": "Description of edit right",
+       "right-edit": "{{doc-right|edit}}\nBasic right to edit pages that are not protected.\n{{Identical|Edit page}}",
        "right-createpage": "{{doc-right|createpage}}\nBasic right to create pages. The right to edit discussion/talk pages is {{msg-mw|right-createtalk}}.",
        "right-createtalk": "{{doc-right|createtalk}}\nBasic right to create discussion/talk pages. The right to edit other pages is {{msg-mw|right-createpage}}.",
        "right-createaccount": "{{doc-right|createaccount}}\nThe right to [[Special:CreateAccount|create a user account]].",
        "edit-error-long": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|edit-error-short}}\n{{Identical|Error}}",
        "revid": "Used to format a revision ID number in text. Parameters:\n* $1 - Revision ID number.\n{{Identical|Revision}}",
        "pageid": "Used to format a page ID number in text. Parameters:\n* $1 - Page ID number.",
+       "interfaceadmin-info": "Used to wrap the normal permission error for actions which used to only require editinterface but now require more permissions. Parameters:\n* $1 - The normal permission error.",
        "rawhtml-notallowed": "Error message given when $wgRawHtml = true; is set and a user uses an &lt;html&gt; tag in a system message or somewhere other than a normal page.",
        "gotointerwiki": "{{doc-special|GoToInterwiki}}\n\nSpecial:GoToInterwiki is a warning page displayed before redirecting users to external interwiki links. Its triggered by people going to something like [[Special:Search/google:foo]].\n{{Identical|Leaving}}",
        "gotointerwiki-invalid": "Message shown on Special:GoToInterwiki if given an invalid title.",
index c734d04..9bc8be5 100644 (file)
        "rcfilters-quickfilters-placeholder-description": "Chillch'ina churasqakunata qhipaqta llamk'achinaypaq waqaychanaykipaqqa, urapi kaq Llamk'achkaq Ch'illchina suyuchapi sananchana rikch'achata ñit'iy.",
        "rcfilters-savedqueries-defaultlabel": "Waqaychasqa ch'illchinakuna",
        "rcfilters-search-placeholder": "Hukchasqakunata ch'illchiy (sutisuyuta llamk'achiy icha ch'illchinap sutinta maskay)",
+       "rcfilters-filter-editsbyself-description": "Kikiykip llamk'apusqaykikuna.",
        "rcfilters-filter-bots-label": "Rurana antacha",
        "rcfilters-filter-bots-description": "Rurana antachakunap llamk'apusqankuna.",
        "rcfilters-filter-humans-label": "Chiqap runa",
index 12408f4..185ddac 100644 (file)
        "grouppage-bureaucrat": "{{ns:project}}:Бюрократы",
        "grouppage-suppress": "{{ns:project}}:Скрывающие",
        "right-read": "просмотр страниц",
-       "right-edit": "правка страниц",
+       "right-edit": "Ð\9fравка страниц",
        "right-createpage": "создание страниц, не являющихся обсуждениями",
        "right-createtalk": "создание страниц обсуждений",
        "right-createaccount": "создание новых учётных записей участников",
        "uploadstash-zero-length": "Файл нулевой длины.",
        "invalid-chunk-offset": "Недопустимое смещение фрагмента",
        "img-auth-accessdenied": "Доступ запрещён",
-       "img-auth-nopathinfo": "Отсутствует <code>PATH_INFO</code>.\nВаш сервер не настроен для передачи этих сведений.\nВозможно, он работает на основе CGI и не поддерживает <code>img_auth</code>.\nСм. https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Отсутствует информация о пути.\nВаш сервер должен быть настроен для передачи переменных REQUEST_URI и/или PATH_INFO.\nЕсли это так, попробуйте включить $wgUsePathInfo.\nСм. https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Запрашиваемый путь не относится к настроенной папке загрузок.",
        "img-auth-badtitle": "Невозможно построить правильный заголовок из «$1».",
        "img-auth-nologinnWL": "Вы не вошли в систему, а «$1» не входит в белый список.",
index 963b58e..388d26f 100644 (file)
        "speciallogtitlelabel": "Циљ (наслов или {{ns:user}}:корисничко име):",
        "log": "Дневници",
        "logeventslist-submit": "Прикажи",
-       "logeventslist-more-filters": "Ð\9fÑ\80икажи Ð´Ð¾Ð´Ð°Ñ\82не Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÐµ:",
+       "logeventslist-more-filters": "Ð\9fÑ\80иказ Ð´Ð¾Ð´Ð°Ñ\82ниÑ\85 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÐ°:",
        "logeventslist-patrol-log": "Дневник патролирања",
        "logeventslist-tag-log": "Дневник ознака",
        "all-logs-page": "Сви јавни дневници",
index 92c9f29..83a75b2 100644 (file)
        "trackingcategories-msg": "పహారా కాయు వర్గము",
        "trackingcategories-name": "సందేశం పేరు",
        "trackingcategories-desc": "వర్గపు చేర్పు క్రైటేరియా",
+       "post-expand-template-argument-category-desc": "ఓ మూస పరామితిని విస్తరించాక (మూడు మీసాల బ్రాకెట్ల మధ్య ఉన్నవి, ఇలా: <code>{{{Foo}}}</code>), ఈ పేజీ <code>$wgMaxArticleSize</code> కంటే పెద్దదిగా ఉంది.",
+       "expensive-parserfunction-category-desc": "ఈ పేజీ ఖరీదైన పార్సరు ఫంక్షన్లు చాలా వాటిని వాడుతోంది (<code>#ifexist</code> లాంటివి). [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] చూడండి.",
        "broken-file-category-desc": "ఈ పుటలో విరిగిన దస్త్ర లంకె ఉన్నది (దస్త్రం ఉనికిలో లేనప్పుడు దస్త్రానికి ఎంబెడ్ చేయు లంకె).",
        "trackingcategories-nodesc": "వివరణ లేదు.",
        "trackingcategories-disabled": "వర్గం అచేతనమై ఉంది",
        "delete-warning-toobig": "ఈ పేజీకి $1 {{PLURAL:$1|కూర్పుకు|కూర్పులకు}} మించిన, చాలా పెద్ద దిద్దుబాటు చరితం ఉంది. దాన్ని తొలగిస్తే {{SITENAME}}కి చెందిన డేటాబేసు కార్యాలకు ఆటంకం కలగొచ్చు; అప్రమత్తతో ముందుకుసాగండి.",
        "deleteprotected": "ఈ పేజీ సంరక్షణలో ఉంది కనుక మీరు తొలగించలేరు.",
        "deleting-backlinks-warning": "<strong>హెచ్చరిక:</strong> మీరు తొలగించబోతున్న పేజీకి [[Special:WhatLinksHere/{{FULLPAGENAME}}|ఇతర పేజీల]] నుండి లింకులు ఉన్నాయి. లేదా ఇతర పేజీల్లో అది ట్రాన్స్‍క్లూడు అవుతోంది.",
+       "deleting-subpages-warning": "<strong>హెచ్చరిక:</strong> మీరు తొలగించబోతున్న పేజీకి [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|ఒక ఉపపేజీ ఉంది|$1 ఉపపేజీలున్నాయి|51=50 కి పైగా ఉపపేజీలున్నాయి}}]].",
        "rollback": "దిద్దుబాట్లను రద్దుచేయి",
        "rollbacklink": "రద్దుచేయి",
        "rollbacklinkcount": "$1 {{PLURAL:$1|మార్పును|మార్పులను}} రద్దుచేయి",
        "rollbacklinkcount-morethan": "$1 కంటే ఎక్కువ {{PLURAL:$1|మార్పును|మార్పులను}} రద్దుచేయి",
        "rollbackfailed": "రద్దుచేయటం విఫలమైంది",
+       "rollback-missingrevision": "కూర్పు డేటాను లోడు చెయ్యలేకపోయాం.",
        "cantrollback": "రచనను వెనక్కి తీసుకువెళ్ళలేము; ఈ పేజీకి ఇదొక్కటే రచన.",
        "alreadyrolled": "[[:$1]]లో [[User:$2|$2]] ([[User talk:$2|చర్చ]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) చేసిన చివరి మార్పును రద్దు చెయ్యలేము;\nమరెవరో ఆ పేజీని వెనక్కి మళ్ళించారు, లేదా మార్చారు.\n\nచివరి మార్పులు చేసినవారు: [[User:$3|$3]] ([[User talk:$3|చర్చ]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "దిద్దుబాటు సారాశం: <em>$1</em>.",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|చర్చ]]) చేసిన మార్పులను [[User:$1|$1]] చివరి కూర్పు వరకు తిప్పికొట్టారు.",
        "revertpage-nouser": "దాగి ఉన్న వాడుకరి చేసిన మార్పులను [[User:$1|$1]] చివరి కూర్పు వరకు తిప్పికొట్టారు",
-       "rollback-success": "$1 చేసిన దిద్దుబాట్లను వెనక్కు తీసుకెళ్ళాం; తిరిగి $2 చేసిన చివరి కూర్పుకు మార్చాం.",
+       "rollback-success": "{{GENDER:$3|$1}} చేసిన దిద్దుబాట్లను వెనక్కు తీసుకెళ్ళాం; తిరిగి {{GENDER:$4|$2}} చేసిన చివరి కూర్పుకు మార్చాం.",
+       "rollback-success-notify": "$1 చేసిన దిద్దుబాట్లను వెనక్కు తీసుకెళ్ళాం;\nతిరిగి $2 చేసిన చివరి కూర్పుకు మార్చాం. [$3 మార్పులు చూపించు]",
        "sessionfailure-title": "సెషను వైఫల్యం",
        "sessionfailure": "మీ లాగిన్ సెషనుతో ఏదో సమస్య ఉన్నట్లుంది;\nసెషను హైజాకు కాకుండా ఈ చర్యను రద్దు చేసాం.\nఫారమును తిరిగి సమర్పించండి.",
        "changecontentmodel": "పేజీ కంటెంటు మోడలును మార్చు",
        "namespace": "పేరుబరి:",
        "invert": "ఎంపికను తిరగవెయ్యి",
        "tooltip-invert": "ఎంచుకున్న పేరుబరి (చెక్ చేసి ఉంటే అనుబంధ పేరుబరి కూడా) లోని పేజీల్లో జరిగిన మార్పులను దాచేందుకు ఈ పెట్టెను చెక్ చెయ్యండి",
+       "tooltip-whatlinkshere-invert": "ఎంచుకున్న పేరుబరి లోని పేజీల నుండి వచ్చే లింకులను దాచేందుకు ఈ పెట్టెను చెక్ చెయ్యండి.",
        "namespace_association": "సంబంధిత పేరుబరి",
        "tooltip-namespace_association": "ఎంచుకున్న పేరుబరికి చెందిన చర్చ లేదా విషయం పేరుబరిని కూడా ఎంచుకునేందుకు ఈ పెట్టెను చెక్ చెయ్యండి.",
        "blanknamespace": "(మొదటి)",
        "uctop": "(ప్రస్తుత)",
        "month": "ఈ నెల నుండి (అంతకు ముందువి):",
        "year": "ఈ సంవత్సరం నుండి (అంతకు ముందువి):",
+       "date": "ఈ తేదీవి (అంతకు ముందువీ):",
        "sp-contributions-newbies": "కొత్త ఖాతాల యొక్క రచనలని మాత్రమే చూపించు",
        "sp-contributions-newbies-sub": "కొత్త ఖాతాల కోసం",
        "sp-contributions-newbies-title": "కొత్త ఖాతాల వాడుకరుల మార్పుచేర్పులు",
        "sp-contributions-uploads": "ఎక్కింపులు",
        "sp-contributions-logs": "చిట్టాలు",
        "sp-contributions-talk": "చర్చ",
-       "sp-contributions-userrights": "వాడుకరి హక్కుల నిర్వహణ",
+       "sp-contributions-userrights": "{{GENDER:$1|వాడుకరి}} హక్కుల నిర్వహణ",
        "sp-contributions-blocked-notice": "ఈ వాడుకరిపై ప్రస్తుతం నిరోధం ఉంది.\nనిరోధపు చిట్టాలోని చివరి పద్దుని మీ సమాచారంకోసం ఇస్తున్నాం:",
        "sp-contributions-blocked-notice-anon": "ఈ ఐపీ చిరునామాపై ప్రస్తుతం నిరోధం ఉంది.\nనిరోధపు చిట్టాలోని చివరి పద్దుని మీ సమాచారంకోసం ఇస్తున్నాం:",
        "sp-contributions-search": "రచనల కోసం అన్వేషణ",
        "sp-contributions-newonly": "పేజీని సృష్టించిన మార్పులను మాత్రమే చూపించు",
        "sp-contributions-hideminor": "చిన్న మార్పులను దాచు",
        "sp-contributions-submit": "వెతుకు",
+       "sp-contributions-outofrange": "ఫలితాలేమీ చూపించలేక పోయాం. అడిగిన IP శ్రేణి CIDR పరిమితి అయిన /$1 కంటే పెద్దదిగా ఉంది.",
        "whatlinkshere": "ఇక్కడికి లింకైనవి",
        "whatlinkshere-title": "\"$1\"కి లింకున్న పుటలు",
        "whatlinkshere-page": "పేజీ:",
        "unblocked-id": "$1 అనే నిరోధాన్ని తొలగించాం",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] పైనున్న నిరోధాన్ని ఎత్తివేసాం.",
        "blocklist": "నిరోధిత వాడుకరులు",
+       "autoblocklist": "ఆటోబ్లాకులు",
        "autoblocklist-submit": "వెతుకు",
+       "autoblocklist-legend": "ఆటోబ్లాకుల జాబితా",
+       "autoblocklist-localblocks": "స్థానిక {{PLURAL:$1|ఆటోబ్లాకు|ఆటోబ్లాకులు}}",
+       "autoblocklist-total-autoblocks": "ఆటోబ్లాకుల మొత్తం సంఖ్య: $1",
+       "autoblocklist-empty": "ఆటోబ్లాకుల జాబితా ఖాళీగా ఉంది.",
+       "autoblocklist-otherblocks": "ఇతర {{PLURAL:$1|ఆటోబ్లాకు|ఆటోబ్లాకులు}}",
        "ipblocklist": "నిరోధించబడిన వాడుకరులు",
        "ipblocklist-legend": "నిరోధించబడిన వాడుకరిని వెతకండి",
        "blocklist-userblocks": "ఖాతా నిరోధాలను దాచు",
        "tooltip-pt-mycontris": "{{GENDER:|మీ}} మార్పుచేర్పుల జాబితా",
        "tooltip-pt-anoncontribs": "ఈ IP అడ్రసు నుండి చేసిన దిద్దుబాట్ల జాబితా",
        "tooltip-pt-login": "మిమ్మల్ని లాగినవమని ప్రోత్సహిస్తున్నాం; కానీ అది తప్పనిసరేమీ కాదు.",
+       "tooltip-pt-login-private": "ఈ వికీని వాడాలంటే మీరు లాగినై ఉండాలి.",
        "tooltip-pt-logout": "లాగౌటవండి",
        "tooltip-pt-createaccount": "మీరొక ఖాతాని సృష్టించుకొని ప్రవేశించటాన్ని సమర్ధిస్తున్నాము; కానీ, అది అవసరం కాదు, ఐచ్ఛికం మాత్రమే.",
        "tooltip-ca-talk": "విషయపు పేజీ గురించి చర్చ",
index c8e05b7..bd8a3fb 100644 (file)
        "right-editusercss": "редагування CSS-файлів інших користувачів",
        "right-edituserjson": "редагування JSON-файлів інших користувачів",
        "right-edituserjs": "редагування JS-файлів інших користувачів",
+       "right-editsitecss": "Редагувати загальний CSS",
+       "right-editsitejson": "Редагувати загальний JSON",
+       "right-editsitejs": "Редагувати загальний JavaScript",
        "right-editmyusercss": "редагування власних CSS-файлів користувача",
        "right-editmyuserjson": "редагування власних JSON-файлів користувача",
        "right-editmyuserjs": "редагування власних JavaScript-файлів користувача",
        "grant-createaccount": "Створювати облікові записи",
        "grant-createeditmovepage": "Створювати, редагувати та перейменовувати сторінки",
        "grant-delete": "Вилучати сторінки, версії і записи журналів",
-       "grant-editinterface": "Редагувати простір назв MediaWiki та CSS/JSON/JavaScript користувача",
+       "grant-editinterface": "Редагувати простір назв MediaWiki та загальний/користувацький JSON",
        "grant-editmycssjs": "Редагувати Ваш користувацький CSS/JSON/JavaScript",
        "grant-editmyoptions": "Редагувати Ваші налаштування користувача",
        "grant-editmywatchlist": "Редагувати Ваш список спостереження",
+       "grant-editsiteconfig": "Редагувати загальний та користувацький CSS/JS",
        "grant-editpage": "Редагувати наявні сторінки",
        "grant-editprotected": "Редагувати захищені сторінки",
        "grant-highvolume": "Редагування у великих обсягах",
        "http-timed-out": "Перевищення часу очікування HTTP-запиту.",
        "http-curl-error": "Помилка звертання до URL: $1",
        "http-bad-status": "Під час HTTP-запиту виникла проблема: $1 $2",
+       "http-internal-error": "Внутрішня помилка HTTP.",
        "upload-curl-error6": "Неможливо досягнути вказану адресу.",
        "upload-curl-error6-text": "Неможливо досягнути вказану адресу. Будь-ласка, перевірте, що вказана адреса вірна, а сайт доступний.",
        "upload-curl-error28": "Час виділений на завантаження вичерпано",
        "passwordpolicies-policy-passwordcannotmatchusername": "Пароль не може збігатися з назвою облікового запису",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Пароль не може збігатися з паролями із чорного списку",
        "passwordpolicies-policy-maximalpasswordlength": "Пароль повинен бути коротшим $1 {{PLURAL:$1|символа|символів}}",
-       "passwordpolicies-policy-passwordcannotbepopular": "Пароль не може бути {{PLURAL:$1|часто вживаним|будь-яким з $1 часто вживаних паролів}}"
+       "passwordpolicies-policy-passwordcannotbepopular": "Пароль не може бути {{PLURAL:$1|часто вживаним|будь-яким з $1 часто вживаних паролів}}",
+       "easydeflate-invaliddeflate": "Наданий вміст не стиснений належним чином"
 }
index 8bc3135..4971f0e 100644 (file)
        "session_fail_preview_html": "معاف کیجیے گا!سیشن ڈاٹا کے نقصان کی وجہ سے ہم آپ کی تبدیلی نافذنہیں کرسکتے.\n<em>چونکہ{{SITENAME}}نے نامکملHTMLکوفعال کررکھاہے,اس لئےنمائش کوجاوااسکرپٹ کےحملوں سےحفاظت کےلئےپوشیدہ کردیاگیاہے.</em>\n<strong>اگرتبدیلی کی یہ جدوجہدقانونی ہےتوبرائےمہربانی دوبارہ کوشش کریں.<strong>\nاگراس کےبعدبھی کام نہ کرے تو[[Special:UserLogout|logging out]]لاگ آؤٹ ہوکردوبارہ لاگ ان کیجیے.اورجانچ کیجیے کہ آپ کابراؤزراس سائٹ کےکوکیزکی اجأزت دیتاہےیانہیں.",
        "token_suffix_mismatch": "<strong>آپ کی ترمیم رد کردی گئی ہے کیونکہ آپ کے اسامی نے ٹوکن ترمیم میں رموزو اوقاف علامتوں کی دھجیاں اڑا دی تھیں۔</strong>\n\nترمیم صفحے کے متن میں خرابی سے روکنے کے لیے رد کی گئی ہے۔\nیہ بعض دفعہ تب ہوتا ہے جب آپ buggy ویب پر مبنی نامعلوم پروکسی سروس کا استعمال کررہے ہوں۔",
        "edit_form_incomplete": "<strong>خانہ ترمیم سے کچھ حصے سرور تک نہیں پہنچ سکے ہیں؛ براہ کرم اپنی ترامیم کو دوبارہ جانچ لیں کہ آیا وہ برقرار ہیں یا نہیں اور دوبارہ کوشش کریں۔</strong>",
-       "editing": "آپ \"$1\" میں ترمیم کر رہے ہیں۔",
+       "editing": "آپ «$1» میں ترمیم کر رہے ہیں",
        "creating": "زیر تخلیق $1",
        "editingsection": "«$1» کے قطعہ کی ترمیم",
-       "editingcomment": "زیرترمیم $1 (نیا قطعہ)",
+       "editingcomment": "زیر ترمیم $1 (نیا قطعہ)",
        "editconflict": "تنازع ترمیم:$1",
        "explainconflict": "آپکی تدوین شروع ہونے کے بعد شاید کسی نے یہ صفحہ تبدیل کردیا ہے.\nبالائی خانۂ متن میں صفحہ کا موجودہ مواد ہے.\nآپ کی تبدیلیاں نچلے متن خانہ میں دکھائی گئی ہیں.\nآپ کو اپنی تبدیلیاں موجودہ متن میں ضم کرنا ہوں گی.\n\"محفوظ\" کا بٹن ٹک کرنے سے '''صرف''' بالائی متن محفوظ ہوگا.",
        "yourtext": "آپ کی تحریر",
index 9cc2440..7b7da4b 100644 (file)
@@ -34,6 +34,7 @@
        "tog-enotifwatchlistpages": "ⴰⵣⵏ ⵢⵉ ⵏⵏ ⴳ ⵉⵎⴰⵢⵍ ⴰⴽⵓⴷ ⵏⵏⴰ ⵜⵡⴰⵙⵙⵏⴼⵍ ⴽⵔⴰ ⵏ ⵜⴰⵙⵏⴰ ⵏⵖ ⴰⴼⴰⵢⵍⵓ ⵉⵍⵍⴰⵏ ⴳ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ ⵉⵏⵓ",
        "tog-enotifusertalkpages": "ⴰⵣⵏ ⵢⵢⵉ ⵏⵏ ⵉⵎⴰⵢⵍ ⴰⴽⵓⴷ ⵏⵏⴰ ⵜⵡⴰⵙⵙⵏⴼⵍ ⵜⴰⵙⵏⴰ ⵏ ⵓⵎⵙⴰⵡⴰⵍ ⵉⵏⵓ",
        "tog-enotifminoredits": "ⴰⵣⵏ ⵢⵢⵉ ⵏⵏ ⴰⵍⵜⵓ ⵉⵎⴰⵢⵍ ⵅⴼ ⵉⵙⵏⴼⵍⵏ ⵉⵎⵣⵢⴰⵏⵏ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⴷ ⵉⴼⴰⵢⵍⵓⵜⵏ",
+       "tog-oldsig": "ⴰⵙⴳⵎⴹ ⵏⵏⴽ ⵏ ⴷⵖⵉⴽⴽ",
        "tog-watchlisthideown": "ⵙⵙⵏⵜⵍ ⵉⵙⵏⵉⴼⵉⵍⵏ ⵉⵏⵓ ⵙⴳ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
        "tog-watchlisthidebots": "ⵙⵙⵏⵜⵍ ⵉⵙⵏⵉⴼⵉⵍⵏ ⵏ ⵉⵔⵓⴱⵓⵜⵏ ⵙⴳ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
        "tog-watchlisthideminor": "ⵙⵙⵏⵜⵍ ⵉⵙⵏⵉⴼⵉⵍⵏ ⵉⵎⵥⵢⴰⵏⴻⵏ ⵙⴳ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
        "toc": "ⵜⵓⵎⴰⵢⵉⵏ",
        "showtoc": "ⵙⴽⵏ",
        "hidetoc": "ⵙⵙⵏⵜⵍ",
+       "confirmable-confirm": "ⵉⵙ ⵜⵏⵥⵉⴷ",
        "confirmable-yes": "ⵢⴰⵀ",
        "confirmable-no": "ⵓⵀⵓ",
+       "thisisdeleted": "ⴰⴷ ⵜⵙⴽⵏⴷ ⵏⵖ ⴷ ⴰⴷ ⴷ ⵜⵔⴰⵔⴷ $1?",
        "viewdeleted": "ⵥⵕ $1?",
        "site-atom-feed": "ⴰⵏⴳⵉ ⵏ ⴰⵜⵓⵎ ⵏ $1",
        "page-atom-feed": "ⴰⵏⴳⵉ ⵏ ⴰⵜⵓⵎ ⵏ $1",
index beaab45..05e95c6 100644 (file)
        "right-editusercss": "編輯其他使用者的 CSS 檔",
        "right-edituserjson": "編輯其他使用者的 JSON 檔",
        "right-edituserjs": "編輯其他使用者的 JavaScript 檔",
-       "right-editsitecss": "編輯站台範圍 CSS",
-       "right-editsitejson": "編輯站台範圍 JSON",
-       "right-editsitejs": "編輯站台範圍 JavaScript",
+       "right-editsitecss": "編輯全站CSS",
+       "right-editsitejson": "編輯全站JSON",
+       "right-editsitejs": "編輯全站JavaScript",
        "right-editmyusercss": "編輯自己的使用者 CSS 檔",
        "right-editmyuserjson": "編輯您自己的使用者 JSON 檔",
        "right-editmyuserjs": "編輯自己的使用者 JavaScript 檔",
index 19ece46..dc8ad55 100644 (file)
@@ -357,7 +357,7 @@ $magicWords = [
 ];
 
 # LinkTrail for Urdu language
-$linkTrail = "/^([ابپتٹثجچحخدڈذر​ڑ​زژسشصضطظعغفقکگل​م​نوؤہھیئےآأءۃ]+)(.*)$/sDu";
+$linkTrail = "/^([ابپتٹثجچحخدڈذر​ڑ​زژسشصضطظعغفقکگل​م​نںوؤہھیئےآأءۃ]+)(.*)$/sDu";
 
 $defaultDateFormat = 'dmy';
 
index 5eb91c3..26e4e9f 100644 (file)
@@ -1152,7 +1152,7 @@ class ParserTestRunner {
                $lang->resetNamespaces();
                $setup['wgContLang'] = $lang;
                $reset = function () {
-                       MagicWord::clearCache();
+                       MediaWikiServices::getInstance()->resetServiceForTesting( 'MagicWordFactory' );
                        $this->resetTitleServices();
                };
                $setup[] = $reset;
index 164c83c..94de088 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Parser-related tests that don't suit for parserTests.txt
  *
@@ -28,7 +30,7 @@ class ExtraParserTest extends MediaWikiTestCase {
                $this->options->setTemplateCallback( [ __CLASS__, 'statelessFetchTemplate' ] );
                $this->parser = new Parser;
 
-               MagicWord::clearCache();
+               MediaWikiServices::getInstance()->resetServiceForTesting( 'MagicWordFactory' );
        }
 
        /**
index 7763aff..4189e93 100644 (file)
@@ -365,6 +365,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        'PreferencesFactory' => [ 'PreferencesFactory', PreferencesFactory::class ],
                        'ActorMigration' => [ 'ActorMigration', ActorMigration::class ],
                        'ConfigRepository' => [ 'ConfigRepository', \MediaWiki\Config\ConfigRepository::class ],
+                       'MagicWordFactory' => [ 'MagicWordFactory', MagicWordFactory::class ],
                ];
        }
 
index 823be6f..9506c36 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group ContentHandler
  * @group Database
@@ -207,7 +209,7 @@ class JavaScriptContentTest extends TextContentTest {
         * @covers JavaScriptContent::matchMagicWord
         */
        public function testMatchMagicWord() {
-               $mw = MagicWord::get( "staticredirect" );
+               $mw = MediaWikiServices::getInstance()->getMagicWordFactory()->get( "staticredirect" );
 
                $content = $this->newContent( "#REDIRECT [[FOO]]\n__STATICREDIRECT__" );
                $this->assertFalse(
index 59984d8..4bb1ed2 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group ContentHandler
  */
@@ -81,7 +83,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                global $wgContLang;
                $wgContLang->resetNamespaces();
 
-               MagicWord::clearCache();
+               MediaWikiServices::getInstance()->resetServiceForTesting( 'MagicWordFactory' );
 
                if ( is_string( $title ) ) {
                        $title = Title::newFromText( $title );
index c78bc5b..687c7e0 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group ContentHandler
  *
@@ -303,7 +305,7 @@ just a test"
         * @covers WikitextContent::matchMagicWord
         */
        public function testMatchMagicWord() {
-               $mw = MagicWord::get( "staticredirect" );
+               $mw = MediaWikiServices::getInstance()->getMagicWordFactory()->get( "staticredirect" );
 
                $content = $this->newContent( "#REDIRECT [[FOO]]\n__STATICREDIRECT__" );
                $this->assertTrue( $content->matchMagicWord( $mw ), "should have matched magic word" );
index aeaf273..33bc29f 100644 (file)
@@ -540,7 +540,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                        'forceHTTPS' => [
                                'value' => $secure ? 'true' : '',
                                'secure' => false,
-                               'expire' => $secure ? $remember ? $defaults['expire'] : 0 : -31536000,
+                               'expire' => $secure ? ( $remember ? $defaults['expire'] : 0 ) : -31536000,
                        ] + $defaults,
                ];
                foreach ( $expect as $key => $value ) {
index 28fc04a..b001eb9 100644 (file)
@@ -126,7 +126,7 @@ class PHPSessionHandlerTest extends MediaWikiTestCase {
                $wrap = TestingAccessWrapper::newFromObject( $rProp->getValue() );
                $reset[] = new \Wikimedia\ScopedCallback(
                        [ $wrap, 'setEnableFlags' ],
-                       [ $wrap->enable ? $wrap->warn ? 'warn' : 'enable' : 'disable' ]
+                       [ $wrap->enable ? ( $wrap->warn ? 'warn' : 'enable' ) : 'disable' ]
                );
                $wrap->setEnableFlags( 'warn' );
 
index e7cfca7..9572e30 100644 (file)
@@ -73,6 +73,9 @@ class SpecialPageExecutor {
 
                $this->setEditTokenFromUser( $context );
 
+               // Make sure the skin context is correctly set https://phabricator.wikimedia.org/T200771
+               $context->getSkin()->setContext( $context );
+
                return $context;
        }
 
diff --git a/tests/phpunit/structure/SpecialPageFatalTest.php b/tests/phpunit/structure/SpecialPageFatalTest.php
new file mode 100644 (file)
index 0000000..abf1cdd
--- /dev/null
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Test that runs against all registered special pages to make sure that regular
+ * execution of the special page does not cause a fatal error.
+ *
+ * UTSysop is used to run as much of the special page code as possible without
+ * actually knowing the details of the special page.
+ *
+ * @since 1.32
+ * @author Addshore
+ */
+class SpecialPageFatalTest extends MediaWikiTestCase {
+
+       public static function setUpBeforeClass() {
+               parent::setUpBeforeClass();
+               SpecialPageFactory::resetList();
+       }
+
+       public static function tearDownAfterClass() {
+               SpecialPageFactory::resetList();
+               parent::tearDownAfterClass();
+       }
+
+       public function provideSpecialPages() {
+               $specialPages = [];
+               foreach ( SpecialPageFactory::getNames() as $name ) {
+                       $specialPages[$name] = [ SpecialPageFactory::getPage( $name ) ];
+               }
+               return $specialPages;
+       }
+
+       /**
+        * @dataProvider provideSpecialPages
+        */
+       public function testSpecialPageDoesNotFatal( SpecialPage $page ) {
+               $executor = new SpecialPageExecutor();
+               $user = User::newFromName( 'UTSysop' );
+
+               try {
+                       $executor->executeSpecialPage( $page, '', null, null, $user );
+               } catch ( Exception $e ) {
+                       // Exceptions are allowed
+               }
+
+               // If the page fataled phpunit will have already died
+               $this->addToAssertionCount( 1 );
+       }
+
+}
index b64d9f5..4884ded 100644 (file)
@@ -42,7 +42,8 @@ describe( 'User', function () {
                assert.strictEqual( UserLoginPage.userPage.getText(), username );
        } );
 
-       it( 'should be able to change preferences', function () {
+       // Disabled due to flakiness (T199446)
+       it.skip( 'should be able to change preferences', function () {
                var realName = Util.getTestString();
 
                // create