Merge "Do not pass null to Title::newFromText in Special:MyLanguage"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 9 Apr 2015 00:31:23 +0000 (00:31 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 9 Apr 2015 00:31:23 +0000 (00:31 +0000)
86 files changed:
CREDITS
HISTORY
RELEASE-NOTES-1.25
RELEASE-NOTES-1.26 [new file with mode: 0644]
api.php
autoload.php
docs/extension.schema.json
includes/ChangeTags.php
includes/DefaultSettings.php
includes/GlobalFunctions.php
includes/Html.php
includes/MediaWiki.php
includes/PHPVersionError.php
includes/SiteStats.php
includes/Title.php
includes/User.php
includes/api/ApiParse.php
includes/cache/MessageCache.php
includes/db/Database.php
includes/db/DatabasePostgres.php
includes/db/LoadBalancer.php
includes/installer/Installer.php
includes/installer/i18n/de.json
includes/jobqueue/JobRunner.php
includes/libs/MapCacheLRU.php
includes/mime.info
includes/mime.types
includes/objectcache/RedisBagOStuff.php
includes/page/Article.php
includes/page/WikiPage.php
includes/registration/ExtensionProcessor.php
includes/registration/ExtensionRegistry.php
includes/resourceloader/ResourceLoader.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialWhatlinkshere.php
languages/i18n/ar.json
languages/i18n/be-tarask.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/cs.json
languages/i18n/cv.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/fy.json
languages/i18n/gl.json
languages/i18n/he.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/kn.json
languages/i18n/ko.json
languages/i18n/ku-latn.json
languages/i18n/lrc.json
languages/i18n/mk.json
languages/i18n/nap.json
languages/i18n/nds-nl.json
languages/i18n/pms.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/zh-hans.json
languages/messages/MessagesBgn.php
maintenance/Maintenance.php
maintenance/cleanupUploadStash.php
maintenance/convertExtensionToRegistration.php
maintenance/mergeMessageFileList.php
maintenance/populateBloomCache.php [deleted file]
maintenance/update.php
resources/src/jquery/jquery.suggestions.js
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki/mediawiki.searchSuggest.js
tests/phpunit/includes/changes/RecentChangeTest.php
tests/phpunit/includes/deferred/SearchUpdateTest.php
tests/phpunit/includes/filerepo/file/LocalFileTest.php
tests/phpunit/includes/registration/ExtensionProcessorTest.php

diff --git a/CREDITS b/CREDITS
index 54890fe..49616a3 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1,6 +1,6 @@
 {{int:version-credits-summary}}
 <!--
-MediaWiki 1.25 is a collaborative project released under the
+MediaWiki 1.26 is a collaborative project released under the
 GNU General Public License v2. We would like to recognize the
 following names for their contribution to the product.
 -->
diff --git a/HISTORY b/HISTORY
index 6ea5c2e..0cf6b08 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,4 +1,4 @@
-Change notes from older releases. For current info see RELEASE-NOTES-1.25.
+Change notes from older releases. For current info see RELEASE-NOTES-1.26.
 
 == MediaWiki 1.24 ==
 
index 7fc13bd..4612c45 100644 (file)
@@ -427,6 +427,8 @@ changes to languages because of Bugzilla reports.
   retrievedfrom, thisisdeleted, viewsourcelink, lastmodifiedat, laggedslavemode,
   protect-summary-cascade
 * All BloomCache related code has been removed. This was largely experimental.
+* $wgResourceModuleSkinStyles no longer supports per-module local or remote paths. They
+  can only be set for the entire skin.
 
 == Compatibility ==
 
diff --git a/RELEASE-NOTES-1.26 b/RELEASE-NOTES-1.26
new file mode 100644 (file)
index 0000000..46509be
--- /dev/null
@@ -0,0 +1,97 @@
+Security reminder: If you have PHP's register_globals option set, you must
+turn it off. MediaWiki will not work with it enabled.
+
+== MediaWiki 1.26 ==
+
+THIS IS NOT A RELEASE YET
+
+MediaWiki 1.26 is an alpha-quality branch and is not recommended for use in
+production.
+
+=== Configuration changes in 1.26 ===
+
+=== New features in 1.26 ===
+
+==== External libraries ====
+
+=== Bug fixes in 1.26 ===
+
+=== Action API changes in 1.26 ===
+
+=== Action API internal changes in 1.26 ===
+
+=== Languages updated in 1.26 ===
+
+MediaWiki supports over 350 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+
+=== Other changes in 1.26 ===
+
+
+== Compatibility ==
+
+MediaWiki 1.26 requires PHP 5.3.3 or later. There is experimental support for
+HHVM 3.3.0.
+
+MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
+support for them is somewhat less mature. There is experimental support for
+Oracle and Microsoft SQL Server.
+
+The supported versions are:
+
+* MySQL 5.0.3 or later
+* PostgreSQL 8.3 or later
+* SQLite 3.3.7 or later
+* Oracle 9.0.1 or later
+* Microsoft SQL Server 2005 (9.00.1399)
+
+== Upgrading ==
+
+1.26 has several database changes since 1.25, and will not work without schema
+updates. Note that due to changes to some very large tables like the revision
+table, the schema update may take quite long (minutes on a medium sized site,
+many hours on a large site).
+
+If upgrading from before 1.11, and you are using a wiki as a commons
+repository, make sure that it is updated as well. Otherwise, errors may arise
+due to database schema changes.
+
+If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
+new database fields are filled with data.
+
+If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
+1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
+with MediaWiki 1.21.
+
+Don't forget to always back up your database before upgrading!
+
+See the file UPGRADE for more detailed upgrade instructions.
+
+For notes on 1.25.x and older releases, see HISTORY.
+
+== Online documentation ==
+
+Documentation for both end-users and site administrators is available on
+MediaWiki.org, and is covered under the GNU Free Documentation License (except
+for pages that explicitly state that their contents are in the public domain):
+
+       https://www.mediawiki.org/wiki/Documentation
+
+== Mailing list ==
+
+A mailing list is available for MediaWiki user support and discussion:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
+
+A low-traffic announcements-only list is also available:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
+
+It's highly recommended that you sign up for one of these lists if you're
+going to run a public MediaWiki, so you can be notified of security fixes.
+
+== IRC help ==
+
+There's usually someone online in #mediawiki on irc.freenode.net.
diff --git a/api.php b/api.php
index 9212747..ea2f60a 100644 (file)
--- a/api.php
+++ b/api.php
@@ -61,7 +61,7 @@ if ( !$wgEnableAPI ) {
 
 // Set a dummy $wgTitle, because $wgTitle == null breaks various things
 // In a perfect world this wouldn't be necessary
-$wgTitle = Title::makeTitle( NS_MAIN, 'API' );
+$wgTitle = Title::makeTitle( NS_SPECIAL, 'Badtitle/dummy title for API calls set in api.php' );
 
 // RequestContext will read from $wgTitle, but it will also whine about it.
 // In a perfect world this wouldn't be necessary either.
index 1e62ccc..b480096 100644 (file)
@@ -886,7 +886,6 @@ $wgAutoloadLocalClasses = array(
        'PoolCounter_Stub' => __DIR__ . '/includes/poolcounter/PoolCounter.php',
        'PoolWorkArticleView' => __DIR__ . '/includes/poolcounter/PoolWorkArticleView.php',
        'PopulateBacklinkNamespace' => __DIR__ . '/maintenance/populateBacklinkNamespace.php',
-       'PopulateBloomFilter' => __DIR__ . '/maintenance/populateBloomCache.php',
        'PopulateCategory' => __DIR__ . '/maintenance/populateCategory.php',
        'PopulateFilearchiveSha1' => __DIR__ . '/maintenance/populateFilearchiveSha1.php',
        'PopulateImageSha1' => __DIR__ . '/maintenance/populateImageSha1.php',
index dd35d05..d1b982c 100644 (file)
@@ -8,6 +8,10 @@
                        "description": "The extension's canonical name.",
                        "required": true
                },
+               "namemsg": {
+                       "type": "string",
+                       "description": "i18n message key of the extension's name."
+               },
                "type": {
                        "type": "string",
                        "description": "The extension's type, as an index to $wgExtensionCredits.",
                                }
                        }
                },
+               "ResourceModuleSkinStyles": {
+                       "type": "object",
+                       "description": "ResourceLoader modules for custom skin styles"
+               },
                "ResourceLoaderSources": {
                        "type": "object",
                        "description": "ResourceLoader sources to register"
index d597d6d..52c665c 100644 (file)
@@ -41,17 +41,13 @@ class ChangeTags {
        public static function formatSummaryRow( $tags, $page ) {
                global $wgLang;
 
-               $tags = explode( ',', $tags );
-
-               // XXX(Ori Livneh, 2014-11-08): remove once bug 73181 is resolved.
-               $tags = array_diff( $tags, array( 'HHVM', '' ) );
-
                if ( !$tags ) {
                        return array( '', array() );
                }
 
                $classes = array();
 
+               $tags = explode( ',', $tags );
                $displayTags = array();
                foreach ( $tags as $tag ) {
                        $displayTags[] = Xml::tags(
index fe67adf..dc16ae3 100644 (file)
@@ -75,7 +75,7 @@ $wgConfigRegistry = array(
  * MediaWiki version number
  * @since 1.2
  */
-$wgVersion = '1.25alpha';
+$wgVersion = '1.26alpha';
 
 /**
  * Name of the site. It must be changed in LocalSettings.php
@@ -1855,13 +1855,6 @@ $wgDBerrorLog = false;
  */
 $wgDBerrorLogTZ = false;
 
-/**
- * Scale load balancer polling time so that under overload conditions, the
- * database server receives a SHOW STATUS query at an average interval of this
- * many microseconds
- */
-$wgDBAvgStatusPoll = 2000;
-
 /**
  * Set to true to engage MySQL 4.1/5.0 charset-related features;
  * for now will just cause sending of 'SET NAMES=utf8' on connect.
@@ -3338,8 +3331,6 @@ $wgResourceModules = array();
  *
  * As with $wgResourceModules, paths default to being relative to the MediaWiki root.
  * You should always provide a localBasePath and remoteBasePath (or remoteExtPath/remoteSkinPath).
- * Either for all skin styles at once (first example below) or for each module separately (second
- * example).
  *
  * @par Example:
  * @code
@@ -3349,19 +3340,6 @@ $wgResourceModules = array();
  *     'remoteSkinPath' => 'Foo',
  *     'localBasePath' => __DIR__,
  *   );
- *
- *   $wgResourceModuleSkinStyles['foo'] = array(
- *     'bar' => array(
- *       'bar.css',
- *       'remoteSkinPath' => 'Foo',
- *       'localBasePath' => __DIR__,
- *     ),
- *     'quux' => array(
- *       'quux.css',
- *       'remoteSkinPath' => 'Foo',
- *       'localBasePath' => __DIR__,
- *     ),
- *   );
  * @endcode
  */
 $wgResourceModuleSkinStyles = array();
index 7c4ebc2..3be43b3 100644 (file)
@@ -1344,6 +1344,12 @@ function wfReadOnlyReason() {
                } else {
                        $wgReadOnly = false;
                }
+               // Callers use this method to be aware that data presented to a user
+               // may be very stale and thus allowing submissions can be problematic.
+               if ( $wgReadOnly === false && wfGetLB()->getLaggedSlaveMode() ) {
+                       $wgReadOnly = 'The database has been automatically locked ' .
+                               'while the slave database servers catch up to the master';
+               }
        }
 
        return $wgReadOnly;
index d312e0a..6907245 100644 (file)
@@ -109,7 +109,7 @@ class Html {
         * @see https://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
         * @return array $attrs A modified attribute array
         */
-       public static function buttonAttributes( $attrs, $modifiers = array() ) {
+       public static function buttonAttributes( array $attrs, array $modifiers = array() ) {
                global $wgUseMediaWikiUIEverywhere;
                if ( $wgUseMediaWikiUIEverywhere ) {
                        if ( isset( $attrs['class'] ) ) {
@@ -137,11 +137,8 @@ class Html {
         * @param array $attrs An attribute array.
         * @return array $attrs A modified attribute array
         */
-       public static function getTextInputAttributes( $attrs ) {
+       public static function getTextInputAttributes( array $attrs ) {
                global $wgUseMediaWikiUIEverywhere;
-               if ( !$attrs ) {
-                       $attrs = array();
-               }
                if ( $wgUseMediaWikiUIEverywhere ) {
                        if ( isset( $attrs['class'] ) ) {
                                if ( is_array( $attrs['class'] ) ) {
@@ -169,7 +166,7 @@ class Html {
         * @see http://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
         * @return string Raw HTML
         */
-       public static function linkButton( $contents, $attrs, $modifiers = array() ) {
+       public static function linkButton( $contents, array $attrs, array $modifiers = array() ) {
                return self::element( 'a',
                        self::buttonAttributes( $attrs, $modifiers ),
                        $contents
@@ -189,7 +186,7 @@ class Html {
         * @see http://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
         * @return string Raw HTML
         */
-       public static function submitButton( $contents, $attrs, $modifiers = array() ) {
+       public static function submitButton( $contents, array $attrs, array $modifiers = array() ) {
                $attrs['type'] = 'submit';
                $attrs['value'] = $contents;
                return self::element( 'input', self::buttonAttributes( $attrs, $modifiers ) );
@@ -337,8 +334,7 @@ class Html {
         *   further documentation.
         * @return array An array of attributes functionally identical to $attribs
         */
-       private static function dropDefaults( $element, $attribs ) {
-
+       private static function dropDefaults( $element, array $attribs ) {
                // Whenever altering this array, please provide a covering test case
                // in HtmlTest::provideElementsWithAttributesHavingDefaultValues
                static $attribDefaults = array(
@@ -485,11 +481,10 @@ class Html {
         * @return string HTML fragment that goes between element name and '>'
         *   (starting with a space if at least one attribute is output)
         */
-       public static function expandAttributes( $attribs ) {
+       public static function expandAttributes( array $attribs ) {
                global $wgWellFormedXml;
 
                $ret = '';
-               $attribs = (array)$attribs;
                foreach ( $attribs as $key => $value ) {
                        // Support intuitive array( 'checked' => true/false ) form
                        if ( $value === false || is_null( $value ) ) {
@@ -714,7 +709,7 @@ class Html {
         *   attributes, passed to Html::element()
         * @return string Raw HTML
         */
-       public static function input( $name, $value = '', $type = 'text', $attribs = array() ) {
+       public static function input( $name, $value = '', $type = 'text', array $attribs = array() ) {
                $attribs['type'] = $type;
                $attribs['value'] = $value;
                $attribs['name'] = $name;
@@ -794,7 +789,7 @@ class Html {
         *   attributes, passed to Html::element()
         * @return string Raw HTML
         */
-       public static function hidden( $name, $value, $attribs = array() ) {
+       public static function hidden( $name, $value, array $attribs = array() ) {
                return self::input( $name, $value, 'hidden', $attribs );
        }
 
@@ -810,7 +805,7 @@ class Html {
         *   attributes, passed to Html::element()
         * @return string Raw HTML
         */
-       public static function textarea( $name, $value = '', $attribs = array() ) {
+       public static function textarea( $name, $value = '', array $attribs = array() ) {
                $attribs['name'] = $name;
 
                if ( substr( $value, 0, 1 ) == "\n" ) {
@@ -937,7 +932,7 @@ class Html {
         *   attributes, passed to Html::element() of html tag.
         * @return string Raw HTML
         */
-       public static function htmlHeader( $attribs = array() ) {
+       public static function htmlHeader( array $attribs = array() ) {
                $ret = '';
 
                global $wgHtml5Version, $wgMimeType, $wgXhtmlNamespaces;
@@ -1047,7 +1042,7 @@ class Html {
         * @param string[] $urls
         * @return string
         */
-       static function srcSet( $urls ) {
+       static function srcSet( array $urls ) {
                $candidates = array();
                foreach ( $urls as $density => $url ) {
                        // Cast density to float to strip 'x'.
index 86531bb..ec2f40f 100644 (file)
@@ -464,7 +464,9 @@ class MediaWiki {
                // Send Ajax requests to the Ajax dispatcher.
                if ( $this->config->get( 'UseAjax' ) && $request->getVal( 'action' ) === 'ajax' ) {
                        // Set a dummy title, because $wgTitle == null might break things
-                       $title = Title::makeTitle( NS_MAIN, 'AJAX' );
+                       $title = Title::makeTitle( NS_SPECIAL, 'Badtitle/performing an AJAX call in '
+                               . __METHOD__
+                       );
                        $this->context->setTitle( $title );
                        $wgTitle = $title;
 
index b061990..3a2f9f8 100644 (file)
@@ -39,7 +39,7 @@
  * version are hardcoded here
  */
 function wfPHPVersionError( $type ) {
-       $mwVersion = '1.25';
+       $mwVersion = '1.26';
        $minimumVersionPHP = '5.3.3';
 
        $phpVersion = PHP_VERSION;
index 15c18f3..81172a1 100644 (file)
@@ -68,6 +68,8 @@ class SiteStats {
         * @return bool|ResultWrapper
         */
        static function loadAndLazyInit() {
+               global $wgMiserMode;
+
                wfDebug( __METHOD__ . ": reading site_stats from slave\n" );
                $row = self::doLoad( wfGetDB( DB_SLAVE ) );
 
@@ -77,7 +79,7 @@ class SiteStats {
                        $row = self::doLoad( wfGetDB( DB_MASTER ) );
                }
 
-               if ( !self::isSane( $row ) ) {
+               if ( !$wgMiserMode && !self::isSane( $row ) ) {
                        // Normally the site_stats table is initialized at install time.
                        // Some manual construction scenarios may leave the table empty or
                        // broken, however, for instance when importing from a dump into a
index 9868b2e..bf0fb8e 100644 (file)
@@ -260,8 +260,10 @@ class Title {
         * @return Title|null Title or null on an error.
         */
        public static function newFromText( $text, $defaultNamespace = NS_MAIN ) {
-               if ( !is_string( $text ) ) {
-                       throw new InvalidArgumentException( 'Title::newFromText given something that isn\'t a string' );
+               if ( is_object( $text ) ) {
+                       throw new InvalidArgumentException( '$text must be a string.' );
+               } elseif ( !is_string( $text ) ) {
+                       wfWarn( __METHOD__ . ': $text must be a string. This will throw an InvalidArgumentException in future.' );
                }
 
                $cache = self::getTitleCache();
index ecb31ba..f526fe0 100644 (file)
@@ -452,7 +452,7 @@ class User implements IDBAccessObject {
                // The cache needs good consistency due to its high TTL, so the user
                // should have been loaded from the master to avoid lag amplification.
                if ( !( $this->queryFlagsUsed & self::READ_LATEST ) ) {
-                       wfWarn( "Cannot save slave-loaded User object data to cache." );
+                       wfWarn( "Cannot cache slave-loaded User object with ID '{$this->mId}'." );
                        return;
                }
 
@@ -1371,10 +1371,10 @@ class User implements IDBAccessObject {
         */
        private function loadGroups() {
                if ( is_null( $this->mGroups ) ) {
-                       $dbr = ( $this->queryFlagsUsed & self::READ_LATEST )
+                       $db = ( $this->queryFlagsUsed & self::READ_LATEST )
                                ? wfGetDB( DB_MASTER )
                                : wfGetDB( DB_SLAVE );
-                       $res = $dbr->select( 'user_groups',
+                       $res = $db->select( 'user_groups',
                                array( 'ug_group' ),
                                array( 'ug_user' => $this->mId ),
                                __METHOD__ );
@@ -1395,10 +1395,17 @@ class User implements IDBAccessObject {
         * @since 1.24
         */
        private function loadPasswords() {
-               if ( $this->getId() !== 0 && ( $this->mPassword === null || $this->mNewpassword === null ) ) {
-                       $this->loadFromRow( wfGetDB( DB_MASTER )->selectRow(
+               if ( $this->getId() !== 0 &&
+                       ( $this->mPassword === null || $this->mNewpassword === null )
+               ) {
+                       $db = ( $this->queryFlagsUsed & self::READ_LATEST )
+                               ? wfGetDB( DB_MASTER )
+                               : wfGetDB( DB_SLAVE );
+
+                       $this->loadFromRow( $db->selectRow(
                                'user',
-                               array( 'user_password', 'user_newpassword', 'user_newpass_time', 'user_password_expires' ),
+                               array( 'user_password', 'user_newpassword',
+                                       'user_newpass_time', 'user_password_expires' ),
                                array( 'user_id' => $this->getId() ),
                                __METHOD__
                        ) );
@@ -2195,6 +2202,8 @@ class User implements IDBAccessObject {
         *   page. Ignored if null or !$val.
         */
        public function setNewtalk( $val, $curRev = null ) {
+               global $wgMemc;
+
                if ( wfReadOnly() ) {
                        return;
                }
@@ -2209,7 +2218,6 @@ class User implements IDBAccessObject {
                        $field = 'user_id';
                        $id = $this->getId();
                }
-               global $wgMemc;
 
                if ( $val ) {
                        $changed = $this->updateNewtalk( $field, $id, $curRev );
@@ -2261,37 +2269,13 @@ class User implements IDBAccessObject {
        }
 
        /**
-        * Immediately touch the user data cache for this account.
-        * Updates user_touched field, and removes account data from memcached
-        * for reload on the next hit.
+        * Immediately touch the user data cache for this account
+        *
+        * Calls touch() and removes account data from memcached
         */
        public function invalidateCache() {
-               if ( wfReadOnly() ) {
-                       return;
-               }
-               $this->load();
-               if ( $this->mId ) {
-                       $this->mTouched = $this->newTouchedTimestamp();
-
-                       $dbw = wfGetDB( DB_MASTER );
-                       $userid = $this->mId;
-                       $touched = $this->mTouched;
-                       $method = __METHOD__;
-                       $dbw->onTransactionIdle( function () use ( $dbw, $userid, $touched, $method ) {
-                               // Prevent contention slams by checking user_touched first
-                               $encTouched = $dbw->addQuotes( $dbw->timestamp( $touched ) );
-                               $needsPurge = $dbw->selectField( 'user', '1',
-                                       array( 'user_id' => $userid, 'user_touched < ' . $encTouched ) );
-                               if ( $needsPurge ) {
-                                       $dbw->update( 'user',
-                                               array( 'user_touched' => $dbw->timestamp( $touched ) ),
-                                               array( 'user_id' => $userid, 'user_touched < ' . $encTouched ),
-                                               $method
-                                       );
-                               }
-                       } );
-                       $this->clearSharedCache();
-               }
+               $this->touch();
+               $this->clearSharedCache();
        }
 
        /**
@@ -3050,10 +3034,10 @@ class User implements IDBAccessObject {
                $this->load();
 
                if ( is_null( $this->mFormerGroups ) ) {
-                       $dbr = ( $this->queryFlagsUsed & self::READ_LATEST )
+                       $db = ( $this->queryFlagsUsed & self::READ_LATEST )
                                ? wfGetDB( DB_MASTER )
                                : wfGetDB( DB_SLAVE );
-                       $res = $dbr->select( 'user_former_groups',
+                       $res = $db->select( 'user_former_groups',
                                array( 'ufg_group' ),
                                array( 'ufg_user' => $this->mId ),
                                __METHOD__ );
@@ -3604,16 +3588,21 @@ class User implements IDBAccessObject {
                $this->load();
                $this->loadPasswords();
                if ( 0 == $this->mId ) {
-                       return;
+                       return; // anon
                }
 
                // This method is for updating existing users, so the user should
                // have been loaded from the master to begin with to avoid problems.
                if ( !( $this->queryFlagsUsed & self::READ_LATEST ) ) {
-                       wfWarn( "Attempting to save slave-loaded User object data." );
+                       wfWarn( "Attempting to save slave-loaded User object with ID '{$this->mId}'." );
                }
 
+               // Get a new user_touched that is higher than the old one.
+               // This will be used for a CAS check as a last-resort safety
+               // check against race conditions and slave lag.
+               $oldTouched = $this->mTouched;
                $this->mTouched = $this->newTouchedTimestamp();
+
                if ( !$wgAuth->allowSetLocalPassword() ) {
                        $this->mPassword = self::getPasswordFactory()->newFromCiphertext( null );
                }
@@ -3634,10 +3623,22 @@ class User implements IDBAccessObject {
                                'user_email_token_expires' => $dbw->timestampOrNull( $this->mEmailTokenExpires ),
                                'user_password_expires' => $dbw->timestampOrNull( $this->mPasswordExpires ),
                        ), array( /* WHERE */
-                               'user_id' => $this->mId
+                               'user_id' => $this->mId,
+                               'user_touched' => $dbw->timestamp( $oldTouched ) // CAS check
                        ), __METHOD__
                );
 
+               if ( !$dbw->affectedRows() ) {
+                       // User was changed in the meantime or loaded with stale data
+                       MWExceptionHandler::logException( new MWException(
+                               "CAS update failed on user_touched for user ID '{$this->mId}'."
+                       ) );
+                       // Maybe the problem was a missed cache update; clear it to be safe
+                       $this->clearSharedCache();
+
+                       return;
+               }
+
                $this->saveOptions();
 
                Hooks::run( 'UserSaveSettings', array( $this ) );
index 73bea83..b565dea 100644 (file)
@@ -107,7 +107,10 @@ class ApiParse extends ApiBase {
                                $popts = $this->makeParserOptions( $pageObj, $params );
 
                                // If for some reason the "oldid" is actually the current revision, it may be cached
-                               if ( $rev->isCurrent() ) {
+                               // Deliberately comparing $pageObj->getLatest() with $rev->getId(), rather than
+                               // checking $rev->isCurrent(), because $pageObj is what actually ends up being used,
+                               // and if its ->getLatest() is outdated, $rev->isCurrent() won't tell us that.
+                               if ( $rev->getId() == $pageObj->getLatest() ) {
                                        // May get from/save to parser cache
                                        $p_result = $this->getParsedContent( $pageObj, $popts,
                                                $pageid, isset( $prop['wikitext'] ) );
index 82919c7..a55e25a 100644 (file)
@@ -1049,7 +1049,7 @@ class MessageCache {
                if ( !$title ) {
                        # It's not uncommon having a null $wgTitle in scripts. See r80898
                        # Create a ghost title in such case
-                       $title = Title::newFromText( 'Dwimmerlaik' );
+                       $title = Title::makeTitle( NS_SPECIAL, 'Badtitle/title not set in ' . __METHOD__ );
                }
 
                $this->mInParser = true;
index cbd8be5..0c0248d 100644 (file)
@@ -1226,13 +1226,10 @@ abstract class DatabaseBase implements IDatabase {
         * @throws DBQueryError
         */
        public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
-               # Ignore errors during error handling to avoid infinite recursion
-               $ignore = $this->ignoreErrors( true );
                ++$this->mErrorCount;
 
-               if ( $ignore || $tempIgnore ) {
+               if ( $this->ignoreErrors() || $tempIgnore ) {
                        wfDebug( "SQL ERROR (ignored): $error\n" );
-                       $this->ignoreErrors( $ignore );
                } else {
                        $sql1line = mb_substr( str_replace( "\n", "\\n", $sql ), 0, 5 * 1024 );
                        wfLogDBError(
@@ -3324,41 +3321,40 @@ abstract class DatabaseBase implements IDatabase {
         * @return bool
         */
        public function deadlockLoop() {
-               $this->begin( __METHOD__ );
                $args = func_get_args();
                $function = array_shift( $args );
-               $oldIgnore = $this->ignoreErrors( true );
                $tries = self::DEADLOCK_TRIES;
-
                if ( is_array( $function ) ) {
                        $fname = $function[0];
                } else {
                        $fname = $function;
                }
 
-               do {
-                       $retVal = call_user_func_array( $function, $args );
-                       $error = $this->lastError();
-                       $errno = $this->lastErrno();
-                       $sql = $this->lastQuery();
+               $this->begin( __METHOD__ );
 
-                       if ( $errno ) {
+               $e = null;
+               do {
+                       try {
+                               $retVal = call_user_func_array( $function, $args );
+                               break;
+                       } catch ( DBQueryError $e ) {
+                               $error = $this->lastError();
+                               $errno = $this->lastErrno();
+                               $sql = $this->lastQuery();
                                if ( $this->wasDeadlock() ) {
-                                       # Retry
+                                       // Retry after a randomized delay
                                        usleep( mt_rand( self::DEADLOCK_DELAY_MIN, self::DEADLOCK_DELAY_MAX ) );
                                } else {
-                                       $this->reportQueryError( $error, $errno, $sql, $fname );
+                                       // Throw the error back up
+                                       throw $e;
                                }
                        }
-               } while ( $this->wasDeadlock() && --$tries > 0 );
-
-               $this->ignoreErrors( $oldIgnore );
+               } while ( --$tries > 0 );
 
                if ( $tries <= 0 ) {
+                       // Too many deadlocks; give up
                        $this->rollback( __METHOD__ );
-                       $this->reportQueryError( $error, $errno, $sql, $fname );
-
-                       return false;
+                       throw $e;
                } else {
                        $this->commit( __METHOD__ );
 
index 3d0ed86..9287f7a 100644 (file)
@@ -530,10 +530,12 @@ class DatabasePostgres extends DatabaseBase {
                                return;
                        }
                }
-               /* Transaction stays in the ERROR state until rolledback */
+               /* Transaction stays in the ERROR state until rolled back */
                if ( $this->mTrxLevel ) {
+                       $ignore = $this->ignoreErrors( true );
                        $this->rollback( __METHOD__ );
-               };
+                       $this->ignoreErrors( $ignore );
+               }
                parent::reportQueryError( $error, $errno, $sql, $fname, false );
        }
 
index d9584e1..bc17911 100644 (file)
@@ -214,7 +214,7 @@ class LoadBalancer {
         * @return bool|int|string
         */
        public function getReaderIndex( $group = false, $wiki = false ) {
-               global $wgReadOnly, $wgDBtype;
+               global $wgDBtype;
 
                # @todo FIXME: For now, only go through all this for mysql databases
                if ( $wgDBtype != 'mysql' ) {
@@ -258,7 +258,7 @@ class LoadBalancer {
                # meets our criteria
                $currentLoads = $nonErrorLoads;
                while ( count( $currentLoads ) ) {
-                       if ( $wgReadOnly || $this->mAllowLagged || $laggedSlaveMode ) {
+                       if ( $this->mAllowLagged || $laggedSlaveMode ) {
                                $i = ArrayUtils::pickRandom( $currentLoads );
                        } else {
                                $i = false;
@@ -277,8 +277,6 @@ class LoadBalancer {
                                if ( $i === false && count( $currentLoads ) != 0 ) {
                                        # All slaves lagged. Switch to read-only mode
                                        wfDebugLog( 'replication', "All slaves lagged. Switch to read-only mode" );
-                                       $wgReadOnly = 'The database has been automatically locked ' .
-                                               'while the slave database servers catch up to the master';
                                        $i = ArrayUtils::pickRandom( $currentLoads );
                                        $laggedSlaveMode = true;
                                }
@@ -330,6 +328,10 @@ class LoadBalancer {
                        }
                        if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group === false ) {
                                $this->mReadIndex = $i;
+                               # Record if the generic reader index is in "lagged slave" mode
+                               if ( $laggedSlaveMode ) {
+                                       $this->mLaggedSlaveMode = true;
+                               }
                        }
                        $serverName = $this->getServerName( $i );
                        wfDebug( __METHOD__ . ": using server $serverName for group '$group'\n" );
@@ -1096,9 +1098,12 @@ class LoadBalancer {
        }
 
        /**
-        * @return bool
+        * @return bool Whether the generic connection for reads is highly "lagged"
         */
        public function getLaggedSlaveMode() {
+               # Get a generic reader connection
+               $this->getConnection( DB_SLAVE );
+
                return $this->mLaggedSlaveMode;
        }
 
index b40b3f1..f9c885d 100644 (file)
@@ -1492,16 +1492,31 @@ abstract class Installer {
                 */
                global $wgAutoloadClasses;
                $wgAutoloadClasses = array();
+               $queue = array();
 
                require "$IP/includes/DefaultSettings.php";
 
                foreach ( $exts as $e ) {
-                       require_once "$IP/extensions/$e/$e.php";
+                       if ( file_exists( "$IP/extensions/$e/extension.json" ) ) {
+                               $queue["$IP/extensions/$e/extension.json"] = 1;
+                       } else {
+                               require_once "$IP/extensions/$e/$e.php";
+                       }
                }
 
+               $registry = new ExtensionRegistry();
+               $data = $registry->readFromQueue( $queue );
+               $wgAutoloadClasses += $data['autoload'];
+
                $hooksWeWant = isset( $wgHooks['LoadExtensionSchemaUpdates'] ) ?
                        $wgHooks['LoadExtensionSchemaUpdates'] : array();
 
+               if ( isset( $data['globals']['wgHooks']['LoadExtensionSchemaUpdates'] ) ) {
+                       $hooksWeWant = array_merge_recursive(
+                               $hooksWeWant,
+                               $data['globals']['wgHooks']['LoadExtensionSchemaUpdates']
+                       );
+               }
                // Unset everyone else's hooks. Lord knows what someone might be doing
                // in ParserFirstCallInit (see bug 27171)
                $GLOBALS['wgHooks'] = array( 'LoadExtensionSchemaUpdates' => $hooksWeWant );
index b45b8f2..b348a1b 100644 (file)
        "config-restart": "Ja, erneut starten",
        "config-welcome": "=== Prüfung der Installationsumgebung ===\nDie Basisprüfungen werden jetzt durchgeführt, um festzustellen, ob die Installationsumgebung für MediaWiki geeignet ist.\nNotiere diese Informationen und gib sie an, sofern du Hilfe beim Installieren benötigst.",
        "config-copyright": "=== Lizenz und Nutzungsbedingungen ===\n\n$1\n\nDieses Programm ist freie Software, d. h. es kann, gemäß den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.\n\nDieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird, allerdings '''ohne jegliche Garantie''' und sogar ohne die implizierte Garantie einer '''Marktgängigkeit''' oder '''Eignung für einen bestimmten Zweck'''. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.\n\nEine <doclink href=Copying>Kopie der GNU General Public License</doclink> sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [http://www.gnu.org/copyleft/gpl.html online gelesen] werden.",
-       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/de Benutzeranleitung]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/de Administratorenanleitung]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/de Häufig gestellte Fragen]\n----\n* <doclink href=Readme>Lies mich</doclink>\n* <doclink href=ReleaseNotes>Versionsinformationen</doclink>\n* <doclink href=Copying>Lizenzbestimmungen</doclink>\n* <doclink href=UpgradeDoc>Aktualisierung</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/de Benutzer­anleitung]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/de Administratoren­anleitung]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/de Häufig gestellte Fragen]\n----\n* <doclink href=Readme>Lies mich</doclink>\n* <doclink href=ReleaseNotes>Versions­informationen</doclink>\n* <doclink href=Copying>Lizenz­bestimmungen</doclink>\n* <doclink href=UpgradeDoc>Aktualisierung</doclink>",
        "config-env-good": "Die Installationsumgebung wurde geprüft.\nMediaWiki kann installiert werden.",
        "config-env-bad": "Die Installationsumgebung wurde geprüft.\nMediaWiki kann nicht installiert werden.",
        "config-env-php": "Die Skriptsprache „PHP“ ($1) ist installiert.",
        "config-env-hhvm": "HHVM $1 ist installiert.",
-       "config-unicode-using-utf8": "Zur Unicode-Normalisierung wird Brion Vibbers <code>utf8_normalize.so</code> eingesetzt.",
        "config-unicode-using-intl": "Zur  Unicode-Normalisierung wird die [http://pecl.php.net/intl PECL-Erweiterung intl] eingesetzt.",
        "config-unicode-pure-php-warning": "'''Warnung:''' Die [http://pecl.php.net/intl PECL-Erweiterung intl] ist für die Unicode-Normalisierung nicht verfügbar, so dass stattdessen die langsame pure-PHP-Implementierung genutzt wird.\nSofern eine Website mit großer Benutzeranzahl betrieben wird, sollten weitere Informationen auf der Webseite [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-Normalisierung (en)] gelesen werden.",
        "config-unicode-update-warning": "'''Warnung:''' Die installierte Version des Unicode-Normalisierungswrappers nutzt einer ältere Version der Bibliothek des [http://site.icu-project.org/ ICU-Projekts].\nDiese sollte [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aktualisiert] werden, sofern auf die Verwendung von Unicode Wert gelegt wird.",
index b8c5d6c..f808a32 100644 (file)
@@ -117,6 +117,11 @@ class JobRunner implements LoggerAwareInterface {
                        return $response;
                }
 
+               // Catch huge single updates that lead to slave lag
+               $trxProfiler = Profiler::instance()->getTransactionProfiler();
+               $trxProfiler->setLogger( LoggerFactory::getInstance( 'DBPerformance' ) );
+               $trxProfiler->setExpectation( 'maxAffected', 500, __METHOD__ );
+
                // Bail out if there is too much DB lag
                list( , $maxLag ) = wfGetLBFactory()->getMainLB( wfWikiID() )->getMaxLag();
                if ( $maxLag >= 5 ) {
index b0cb078..0b6db32 100644 (file)
@@ -74,11 +74,7 @@ class MapCacheLRU {
         * @return bool
         */
        public function has( $key ) {
-               if ( is_string( $key ) || is_integer( $key ) ) {
-                       return array_key_exists( $key, $this->cache );
-               }
-               wfWarn( __METHOD__ . ": Key passed isn't a string or an integer.", 2 );
-               return false;
+               return array_key_exists( $key, $this->cache );
        }
 
        /**
index 07b2495..243e280 100644 (file)
@@ -72,6 +72,7 @@ text/tab-separated-values     [TEXT]
 application/zip application/x-zip      [ARCHIVE]
 application/x-gzip     [ARCHIVE]
 application/x-bzip     [ARCHIVE]
+application/x-bzip2    [ARCHIVE]
 application/x-tar      [ARCHIVE]
 application/x-stuffit  [ARCHIVE]
 application/x-opc+zip  [ARCHIVE]
index 75017db..210610a 100644 (file)
@@ -21,7 +21,8 @@ application/vnd.wap.wmlc wmlc
 application/vnd.wap.wmlscriptc wmlsc
 application/voicexml+xml vxml
 application/x-bcpio bcpio
-application/x-bzip gz bz2
+application/x-bzip bz
+application/x-bzip2 bz2
 application/x-cdlink vcd
 application/x-chess-pgn pgn
 application/x-cpio cpio
index de3511d..23c8b6d 100644 (file)
@@ -25,6 +25,8 @@ class RedisBagOStuff extends BagOStuff {
        protected $redisPool;
        /** @var array List of server names */
        protected $servers;
+       /** @var array Map of (tag => server name) */
+       protected $serverTagMap;
        /** @var bool */
        protected $automaticFailover;
 
@@ -34,7 +36,8 @@ class RedisBagOStuff extends BagOStuff {
         *   - servers: An array of server names. A server name may be a hostname,
         *     a hostname/port combination or the absolute path of a UNIX socket.
         *     If a hostname is specified but no port, the standard port number
-        *     6379 will be used. Required.
+        *     6379 will be used. Arrays keys can be used to specify the tag to
+        *     hash on in place of the host/port. Required.
         *
         *   - connectTimeout: The timeout for new connections, in seconds. Optional,
         *     default is 1 second.
@@ -66,6 +69,10 @@ class RedisBagOStuff extends BagOStuff {
                $this->redisPool = RedisConnectionPool::singleton( $redisConf );
 
                $this->servers = $params['servers'];
+               foreach ( $this->servers as $key => $server ) {
+                       $this->serverTagMap[is_int( $key ) ? $server : $key] = $server;
+               }
+
                if ( isset( $params['automaticFailover'] ) ) {
                        $this->automaticFailover = $params['automaticFailover'];
                } else {
@@ -348,23 +355,25 @@ class RedisBagOStuff extends BagOStuff {
         * @return array (server, RedisConnRef) or (false, false)
         */
        protected function getConnection( $key ) {
-               if ( count( $this->servers ) === 1 ) {
-                       $candidates = $this->servers;
-               } else {
-                       $candidates = $this->servers;
+               $candidates = array_keys( $this->serverTagMap );
+
+               if ( count( $this->servers ) > 1 ) {
                        ArrayUtils::consistentHashSort( $candidates, $key, '/' );
                        if ( !$this->automaticFailover ) {
                                $candidates = array_slice( $candidates, 0, 1 );
                        }
                }
 
-               foreach ( $candidates as $server ) {
+               foreach ( $candidates as $tag ) {
+                       $server = $this->serverTagMap[$tag];
                        $conn = $this->redisPool->getConnection( $server );
                        if ( $conn ) {
                                return array( $server, $conn );
                        }
                }
+
                $this->setLastError( BagOStuff::ERR_UNREACHABLE );
+
                return array( false, false );
        }
 
index eb597d2..91e9971 100644 (file)
@@ -378,7 +378,7 @@ class Article implements Page {
                # Pre-fill content with error message so that if something
                # fails we'll have something telling us what we intended.
                //XXX: this isn't page content but a UI message. horrible.
-               $this->mContentObject = new MessageContent( 'missing-revision', array( $oldid ), array() );
+               $this->mContentObject = new MessageContent( 'missing-revision', array( $oldid ) );
 
                if ( $oldid ) {
                        # $this->mRevision might already be fetched by getOldIDFromRequest()
@@ -390,17 +390,20 @@ class Article implements Page {
                                }
                        }
                } else {
-                       if ( !$this->mPage->getLatest() ) {
+                       $oldid = $this->mPage->getLatest();
+                       if ( !$oldid ) {
                                wfDebug( __METHOD__ . " failed to find page data for title " .
                                        $this->getTitle()->getPrefixedText() . "\n" );
                                return false;
                        }
 
+                       # Update error message with correct oldid
+                       $this->mContentObject = new MessageContent( 'missing-revision', array( $oldid ) );
+
                        $this->mRevision = $this->mPage->getRevision();
 
                        if ( !$this->mRevision ) {
-                               wfDebug( __METHOD__ . " failed to retrieve current page, rev_id " .
-                                       $this->mPage->getLatest() . "\n" );
+                               wfDebug( __METHOD__ . " failed to retrieve current page, rev_id $oldid\n" );
                                return false;
                        }
                }
index 5caffab..6242a54 100644 (file)
@@ -1150,28 +1150,24 @@ class WikiPage implements Page, IDBAccessObject {
         * @return bool
         */
        public function doPurge() {
-               global $wgUseSquid;
-
                if ( !Hooks::run( 'ArticlePurge', array( &$this ) ) ) {
                        return false;
                }
 
-               // Invalidate the cache
-               $this->mTitle->invalidateCache();
-
-               if ( $wgUseSquid ) {
-                       // Commit the transaction before the purge is sent
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->commit( __METHOD__ );
-
-                       // Send purge
-                       $update = SquidUpdate::newSimplePurge( $this->mTitle );
-                       $update->doUpdate();
-               }
+               $title = $this->mTitle;
+               wfGetDB( DB_MASTER )->onTransactionIdle( function() use ( $title ) {
+                       global $wgUseSquid;
+                       // Invalidate the cache in auto-commit mode
+                       $title->invalidateCache();
+                       if ( $wgUseSquid ) {
+                               // Send purge now that page_touched update was committed above
+                               $update = SquidUpdate::newSimplePurge( $title );
+                               $update->doUpdate();
+                       }
+               } );
 
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
                        // @todo move this logic to MessageCache
-
                        if ( $this->exists() ) {
                                // NOTE: use transclusion text for messages.
                                //       This is consistent with  MessageCache::getMsgFromNamespace()
@@ -1188,6 +1184,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                        MessageCache::singleton()->replace( $this->mTitle->getDBkey(), $text );
                }
+
                return true;
        }
 
index f85b878..a5349fb 100644 (file)
@@ -54,6 +54,7 @@ class ExtensionProcessor implements Processor {
         */
        protected static $creditsAttributes = array(
                'name',
+               'namemsg',
                'author',
                'version',
                'url',
@@ -193,15 +194,17 @@ class ExtensionProcessor implements Processor {
                        $defaultPaths['localBasePath'] = "$dir/{$defaultPaths['localBasePath']}";
                }
 
-               if ( isset( $info['ResourceModules'] ) ) {
-                       foreach ( $info['ResourceModules'] as $name => $data ) {
-                               if ( isset( $data['localBasePath'] ) ) {
-                                       $data['localBasePath'] = "$dir/{$data['localBasePath']}";
+               foreach ( array( 'ResourceModules', 'ResourceModuleSkinStyles' ) as $setting ) {
+                       if ( isset( $info[$setting] ) ) {
+                               foreach ( $info[$setting] as $name => $data ) {
+                                       if ( isset( $data['localBasePath'] ) ) {
+                                               $data['localBasePath'] = "$dir/{$data['localBasePath']}";
+                                       }
+                                       if ( $defaultPaths ) {
+                                               $data += $defaultPaths;
+                                       }
+                                       $this->globals["wg$setting"][$name] = $data;
                                }
-                               if ( $defaultPaths ) {
-                                       $data += $defaultPaths;
-                               }
-                               $this->globals['wgResourceModules'][$name] = $data;
                        }
                }
        }
index c06f7e3..5ef3853 100644 (file)
@@ -91,41 +91,55 @@ class ExtensionRegistry {
                if ( $data ) {
                        $this->exportExtractedData( $data );
                } else {
-                       $data = array( 'globals' => array( 'wgAutoloadClasses' => array() ) );
-                       $autoloadClasses = array();
-                       foreach ( $this->queued as $path => $mtime ) {
-                               $json = file_get_contents( $path );
-                               $info = json_decode( $json, /* $assoc = */ true );
-                               if ( !is_array( $info ) ) {
-                                       throw new Exception( "$path is not a valid JSON file." );
-                               }
-                               $autoload = $this->processAutoLoader( dirname( $path ), $info );
-                               // Set up the autoloader now so custom processors will work
-                               $GLOBALS['wgAutoloadClasses'] += $autoload;
-                               $autoloadClasses += $autoload;
-                               if ( isset( $info['processor'] ) ) {
-                                       $processor = $this->getProcessor( $info['processor'] );
-                               } else {
-                                       $processor = $this->getProcessor( 'default' );
-                               }
-                               $processor->extractInfo( $path, $info );
-                       }
-                       foreach ( $this->processors as $processor ) {
-                               $data = array_merge_recursive( $data, $processor->getExtractedInfo() );
-                       }
-                       foreach ( $data['credits'] as $credit ) {
-                               $data['globals']['wgExtensionCredits'][$credit['type']][] = $credit;
-                       }
-                       $this->processors = array(); // Reset
+                       $data = $this->readFromQueue( $this->queued );
                        $this->exportExtractedData( $data );
                        // Do this late since we don't want to extract it since we already
                        // did that, but it should be cached
-                       $data['globals']['wgAutoloadClasses'] += $autoloadClasses;
+                       $data['globals']['wgAutoloadClasses'] += $data['autoload'];
+                       unset( $data['autoload'] );
                        $this->cache->set( $key, $data );
                }
                $this->queued = array();
        }
 
+       /**
+        * Process a queue of extensions and return their extracted data
+        *
+        * @param array $queue keys are filenames, values are ignored
+        * @return array extracted info
+        * @throws Exception
+        */
+       public function readFromQueue( array $queue ) {
+               $data = array( 'globals' => array( 'wgAutoloadClasses' => array() ) );
+               $autoloadClasses = array();
+               foreach ( $queue as $path => $mtime ) {
+                       $json = file_get_contents( $path );
+                       $info = json_decode( $json, /* $assoc = */ true );
+                       if ( !is_array( $info ) ) {
+                               throw new Exception( "$path is not a valid JSON file." );
+                       }
+                       $autoload = $this->processAutoLoader( dirname( $path ), $info );
+                       // Set up the autoloader now so custom processors will work
+                       $GLOBALS['wgAutoloadClasses'] += $autoload;
+                       $autoloadClasses += $autoload;
+                       if ( isset( $info['processor'] ) ) {
+                               $processor = $this->getProcessor( $info['processor'] );
+                       } else {
+                               $processor = $this->getProcessor( 'default' );
+                       }
+                       $processor->extractInfo( $path, $info );
+               }
+               foreach ( $this->processors as $processor ) {
+                       $data = array_merge_recursive( $data, $processor->getExtractedInfo() );
+               }
+               foreach ( $data['credits'] as $credit ) {
+                       $data['globals']['wgExtensionCredits'][$credit['type']][] = $credit;
+               }
+               $this->processors = array(); // Reset
+               $data['autoload'] = $autoloadClasses;
+               return $data;
+       }
+
        protected function getProcessor( $type ) {
                if ( !isset( $this->processors[$type] ) ) {
                        $processor = $type === 'default' ? new ExtensionProcessor() : new $type();
index 976275b..3d5cc51 100644 (file)
@@ -346,12 +346,9 @@ class ResourceLoader {
                                        }
 
                                        // Add new file paths, remapping them to refer to our directories and not use settings
-                                       // from the module we're modifying. These can come from the base definition or be defined
-                                       // for each module.
+                                       // from the module we're modifying, which come from the base definition.
                                        list( $localBasePath, $remoteBasePath ) =
                                                ResourceLoaderFileModule::extractBasePaths( $skinStyles );
-                                       list( $localBasePath, $remoteBasePath ) =
-                                               ResourceLoaderFileModule::extractBasePaths( $paths, $localBasePath, $remoteBasePath );
 
                                        foreach ( $paths as $path ) {
                                                $styleFiles[] = new ResourceLoaderFilePath( $path, $localBasePath, $remoteBasePath );
index a031dad..2c00175 100644 (file)
@@ -302,7 +302,7 @@ class SpecialActiveUsers extends SpecialPage {
         * @return int How many seconds old the cache is
         */
        public static function mergeActiveUsers( $period, $days ) {
-               $dbr = wfGetDB( DB_SLAVE );
+               $dbr = wfGetDB( DB_SLAVE, 'recentchanges' );
                $cTime = $dbr->selectField( 'querycache_info',
                        'qci_timestamp',
                        array( 'qci_type' => 'activeusers' )
index 64b0eca..1387988 100644 (file)
@@ -263,6 +263,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        );
        }
 
+       protected function getDB() {
+               return wfGetDB( DB_SLAVE, 'recentchanges' );
+       }
+
        public function outputFeedLinks() {
                $this->addFeedLinks( $this->getFeedQuery() );
        }
index 40cce5e..0b3175a 100644 (file)
@@ -73,7 +73,9 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
 
                $this->target = Title::newFromURL( $opts->getValue( 'target' ) );
                if ( !$this->target ) {
-                       $out->addHTML( $this->whatlinkshereForm() );
+                       if ( !$this->including() ) {
+                               $out->addHTML( $this->whatlinkshereForm() );
+                       }
 
                        return;
                }
index a702bf7..f0b1caf 100644 (file)
@@ -50,7 +50,8 @@
                        "Bibas",
                        "Khaled",
                        "Emara",
-                       "Macofe"
+                       "Macofe",
+                       "Yahya Sakhnini"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "notextmatches": "لم يتم إيجاد أي نص مطابق",
        "prevn": "{{PLURAL:$1|$1}} السابقة",
        "nextn": "{{PLURAL:$1|$1}} التالية",
+       "prev-page": "الصفحة السابقة",
+       "next-page": "الصفحة التالية",
        "prevn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة",
        "nextn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} تالية",
        "shown-title": "عرض $1 {{PLURAL:$1|نتيجة|نتيجة}} لكل صفحة",
        "tags-source-header": "المصدر",
        "tags-active-header": "نشط؟",
        "tags-hitcount-header": "تغييرات موسومة",
+       "tags-actions-header": "إجراءات",
        "tags-active-yes": "نعم",
        "tags-active-no": "لا",
        "tags-edit": "عدل",
        "tags-delete": "احذف",
        "tags-activate": "نشط",
+       "tags-deactivate": "تعطيل",
        "tags-hitcount": "{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}",
        "tags-create-tag-name": "اسم الوسم:",
        "tags-create-reason": "السبب:",
        "tags-create-submit": "أنشئ",
+       "tags-delete-reason": "سبب:",
+       "tags-activate-submit": "تفعيل",
+       "tags-deactivate-reason": "سبب",
        "comparepages": "قارن صفحات",
        "compare-page1": "صفحة 1",
        "compare-page2": "صفحة 2",
index d9f2ae7..289cb66 100644 (file)
        "emailccsubject": "Копія Вашага ліста да $1: $2",
        "emailsent": "Ліст адасланы",
        "emailsenttext": "Ваш ліст быў адасланы.",
-       "emailuserfooter": "Гэты ліст быў дасланы ўдзельнікам $1 да {{GENDER:$2|ўдзельніка|ўдзельніцы}} $2 з дапамогай функцыі «Даслаць ліст» {{GRAMMAR:родны|{{SITENAME}}}}.",
+       "emailuserfooter": "Гэты ліст быў дасланы {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $1 да {{GENDER:$2|ўдзельніка|ўдзельніцы}} $2 з дапамогай функцыі «{{int:emailpage}}» {{GRAMMAR:родны|{{SITENAME}}}}.",
        "usermessage-summary": "Паведамленьне пра выхад з сыстэмы.",
        "usermessage-editor": "Дастаўка сыстэмных паведамленьняў",
        "watchlist": "Сьпіс назіраньня",
        "tags-create-submit": "Стварыць",
        "tags-create-no-name": "Вы мусіце пазначыць назву меткі.",
        "tags-create-invalid-chars": "Назвы метак ня мусяць утрымліваць коскі (<code>,</code>) або сымбалі касых рысаў (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Назвы метак ня мусяць утрымліваць сымбалі, якія нельга ўжываць у назвах старонак.",
        "comparepages": "Параўнаньне старонак",
        "compare-page1": "Старонка 1",
        "compare-page2": "Старонка 2",
index 0d5f6fb..5a1911b 100644 (file)
        "wrongpassword": "La contrasenya que heu introduït és incorrecta. Torneu-ho a provar.",
        "wrongpasswordempty": "La contrasenya que s'ha introduït estava en blanc. Torneu-ho a provar.",
        "passwordtooshort": "La contrasenya ha de tenir un mínim {{PLURAL:$1|d'un caràcter|de $1 caràcters}}.",
+       "passwordtoolong": "La contrasenya ha de tenir un màxim {{PLURAL:$1|d'un caràcter|de $1 caràcters}}.",
        "password-name-match": "La contrasenya ha de ser diferent al vostre nom d'usuari.",
        "password-login-forbidden": "No és permès d'utilitzar aquest nom d'usuari i contrasenya.",
        "mailmypassword": "Restableix la contrasenya",
        "emailccsubject": "Còpia del vostre missatge a $1: $2",
        "emailsent": "Correu electrònic enviat",
        "emailsenttext": "S'ha enviat el vostre correu electrònic.",
-       "emailuserfooter": "Aquest missatge de correu electrònic l'ha enviat $1 a $2 amb la funció «e-mail» del projecte {{SITENAME}}.",
+       "emailuserfooter": "Aquest missatge de correu electrònic l'ha enviat $1 a $2 amb la funció «{{int:emailpage}}» de {{SITENAME}}.",
        "usermessage-summary": "Deixant missatges de sistema.",
        "usermessage-editor": "Missatger del sistema",
        "watchlist": "Llista de seguiment",
        "tags-create-warnings-below": "Voleu continuar creant l'etiqueta?",
        "tags-delete-title": "Elimina l'etiqueta",
        "tags-delete-explanation-initial": "Esteu a punt d'eliminar l'etiqueta «$1» de la base de dades.",
+       "tags-delete-explanation-warning": "Aquesta acció és <strong>irreversible</strong> i <strong>no es pot desfer</strong>, ni tan sols els administradors de la base de dades poden desfer-la. Assegureu-vos que aquesta és l'etiqueta que voleu suprimir.",
        "tags-delete-reason": "Motiu:",
        "tags-delete-submit": "Suprimeix irreversiblement aquesta etiqueta",
        "tags-delete-not-found": "L'etiqueta «$1» no existeix.",
        "feedback-message": "Missatge:",
        "feedback-subject": "Assumpte:",
        "feedback-submit": "Envia",
+       "feedback-terms": "Entenc que la informació del meu agent d'usuari inclou les versions exactes del meu navegador i del meu sistema operatiu i que seran publicades amb els meus comentaris.",
+       "feedback-termsofuse": "Accepto proporcionar informació d'acord amb les Condicions d'ús.",
        "feedback-thanks": "Gràcies! S'ha publicat la vostra opinió a la pàgina «[$2 $1]».",
        "feedback-thanks-title": "Gràcies!",
        "feedback-useragent": "Agent d'usuari:",
index db1256a..a0ab89b 100644 (file)
@@ -52,7 +52,7 @@
        "tog-prefershttps": "Даима лела йе лардина системин чудалар",
        "underline-always": "Даимна",
        "underline-never": "Цкъа а",
-       "underline-default": "Ð\9bелайа Ð±Ñ\80аÑ\83зеÑ\80ан Ð½Ð¸Ñ\81йарца",
+       "underline-default": "Ð\9bелае Ð±Ñ\80аÑ\83зеÑ\80ан Ð½Ð¸Ñ\81Ñ\8fрца",
        "editfont-style": "Тадар чохь долу шрифт:",
        "editfont-default": "Браузеран гӀирса чура шрифт",
        "editfont-monospace": "Цхьатерра доцу шрифт",
        "ancientpages": "ТӀаьххьарлерачу хенаца нисбина яззамаш",
        "move": "ЦӀе хийца",
        "movethispage": "ХӀокху агӀон цӀе хийца",
-       "unusedimagestext": "Ð\94еÑ\85аÑ\80 Ð´Ð¾, Ñ\82идаме Ñ\8dÑ\86а, ÐºÑ\85ин Ð¹Ð¾Ð»Ñ\83 Ð´Ñ\83Ñ\8cнана Ð¼Ð°Ñ\88ан-меÑ\82Ñ\82игаÑ\88 Ð° Ð»ÐµÐ»Ð¾Ñ\88 Ñ\85ила Ð¼ÐµÐ³Ð° Ð½Ð¸Ð¹Ñ\81Ñ\81а Ð¹Ð¾Ð³Ó\80Ñ\83 Ñ\85Ñ\8cажоÑ\80г (URL) Ñ\85Ó\80окÑ\85Ñ\83 Ñ\85Ó\80Ñ\83ман, Ñ\85Ó\80окÑ\85Ñ\83 Ð¼Ð¾Ð³Ó\80аме Ð¹Ð¾Ð³Ó\80Ñ\83Ñ\88 Ñ\8fлаÑ\85Ñ\8c Ñ\8fÑ\86ахь а иза хила мега жигара лелош.",
+       "unusedimagestext": "Ð\9bаÑ\85аÑ\80а Ñ\84айлаÑ\88 Ñ\86Ñ\85Ñ\8cана Ð°Ð³Ó\80онгаÑ\85Ñ\8c Ð»ÐµÐ»Ð¾Ñ\88 Ñ\8fÑ\86.\nÐ\94еÑ\85аÑ\80 Ð´Ð¾, Ñ\82идаме Ð±Ðµ, ÐºÑ\85ин Ð¹Ð¾Ð»Ñ\83 Ð²ÐµÐ±-Ñ\81айÑ\82аÑ\88 Ð° Ð»ÐµÐ»Ð¾Ñ\88 Ñ\85ила Ð¼ÐµÐ³Ð° Ð½Ð¸Ð¹Ñ\81Ñ\81а Ð¹Ð¾Ð³Ó\80Ñ\83 Ñ\85Ñ\8cажоÑ\80г (URL), Ñ\85Ó\80окÑ\85Ñ\83 Ð¼Ð¾Ð³Ó\80аме Ð¹Ð¾Ð³Ó\80Ñ\83Ñ\88 Ñ\8fлахь а иза хила мега жигара лелош.",
        "unusedcategoriestext": "ХӀокху категорешан чохь агӀонаш я кхин категореш яц.",
        "notargettitle": "Ӏалашо билгал йина яц",
        "notargettext": "И кхочушдан ахьа билгал йина яц Ӏалашонан агӀо я декъашхо.",
index edc1553..d959c98 100644 (file)
        "emailccsubject": "Kopie Vaší zprávy pro uživatele $1: $2",
        "emailsent": "E-mail odeslán",
        "emailsenttext": "Váš e-mail byl odeslán.",
-       "emailuserfooter": "Tento e-mail byl odeslán z {{grammar:2sg|{{SITENAME}}}} pomocí funkce „Poslat e-mail“; odeslal ho uživatel $1 uživateli $2",
+       "emailuserfooter": "Tento e-mail byl odeslán z {{grammar:2sg|{{SITENAME}}}} pomocí funkce „{{int:emailpage}}“; {{GENDER:$1|odeslal ho uživatel|odeslala ho uživatelka}} $1 {{GENDER:$2|uživateli|uživatelce}} $2.",
        "usermessage-summary": "Doručena zpráva od systému.",
        "usermessage-editor": "Systémový poslíček",
        "watchlist": "Sledované stránky",
        "feedback-error1": "Chyba: Nerozpoznaný výsledek z API",
        "feedback-error2": "Chyba: Editace se nezdařila",
        "feedback-error3": "Chyba: API nevrátilo žádnou odpověď",
+       "feedback-error4": "Chyba: Nelze napsat na uvedenou stránku pro zpětnou vazbu",
        "feedback-message": "Zpráva:",
        "feedback-subject": "Předmět:",
        "feedback-submit": "Odeslat",
index 2402316..f487f84 100644 (file)
@@ -96,9 +96,9 @@
        "nov": "Чӳк",
        "dec": "Раш",
        "pagecategories": "{{PLURAL:$1|Категори|Категорисем}}",
-       "category_header": "«$1» категорири статьясем",
+       "category_header": "\"$1\" категоринчи статьясем",
        "subcategories": "Подкатегорисем",
-       "category-media-header": "«$1» категорири файлсем",
+       "category-media-header": "\"$1\" категоринчи файлсем",
        "category-empty": "''Хальхи вăхăтра ку категори пушă.''",
        "hidden-categories": "{{PLURAL:$1|Пытарнă категори|Пытарнă категорисем}}",
        "hidden-category-category": "Пытарнă категорисем",
        "media_tip": "Медиа-файл çине каçă",
        "sig_tip": "Сирĕн алă пусни тата вăхăт",
        "hr_tip": "Горизонтальлĕ йĕр (сахалтарах усă курăр)",
-       "summary": "Улшăнусен ăнлантарăвĕ:",
+       "summary": "Улăштарнисене ăнлантарни:",
        "subject": "Тема:",
        "minoredit": "Пĕчĕк улшăну",
        "watchthis": "Ку страницăна сăна",
        "copyrightwarning": "Эсир кĕртнĕ, е улăштарнă пур статьясен тексчĕсем $2 ($1 пăхăр) лизензине пăхăнаççĕ. Енчен те эсир кĕртнĕ текста пурте усă курма, тӳрлетсе улăштарма пултарнипе килĕшместĕр пулсан кунта ăна ан кĕртĕр. <br /> Çавăн пекех эсир кĕртнĕ текстăн е авторĕ, е ăна ирĕклĕ усă курма юракан çăлкуçсенчен илнине çирĕплететĕр. <br /> '''АВТОР ПРАВИСЕМПЕ ХӲТĔЛЕНĔ МАТЕРИАЛСЕНЕ АН КĔРТĔР!'''",
        "protectedpagewarning": "'''АСĂРХАТТАРНИ: ку страницăна улшăнусем кĕртессинчен хӳтĕленĕ, ăна тӳрлетме администраторсем кăна пултараççĕ.'''",
        "titleprotectedwarning": "'''Асăрхаттару. Ку страницăпа ĕçлеме чарнă, ăна хăш-пĕр хутшăнакан кăна хатерлеме пултарать.'''",
-       "templatesused": "Ку страницă çинче усă курнă {{PLURAL:$1|Шаблон|Шаблонсем}}:",
+       "templatesused": "Ку страницă çинче усă курнă {{PLURAL:$1|шаблон|шаблонсем}}:",
        "templatesusedpreview": "Пăхакан страница çинче усă курнă шаблонсем:",
        "templatesusedsection": "Ку пайра усă курнă шаблонсем:",
        "template-protected": "(сыхланă)",
        "nohistory": "Ку страницăн улшăнусен журналĕ çук.",
        "currentrev": "Хальхи верси",
        "revisionasof": "$1 сăнташ",
-       "revision-info": "$1 версийĕ; $2",
+       "revision-info": "Версийĕ $1 {{GENDER:$6|$2}}$7",
        "previousrevision": "← Малтанхи сăнташ",
        "nextrevision": "Тепĕр сăнташ →",
        "currentrevisionlink": "хальхи верси çине куç",
        "group-bureaucrat": "Бюрократсем",
        "group-suppress": "Тĕрĕслекенсем",
        "group-all": "(пурте)",
+       "group-user-member": "{{GENDER:$1|хутшăнакан}}",
        "group-autoconfirmed-member": "автоподтверждённый участник",
        "group-bot-member": "{{GENDER:$1|бот}}",
        "group-sysop-member": "{{GENDER:$1|администратор}}",
        "uploadlogpagetext": "Аяларах эсир юлашкинчен кĕртнĕ файлсене куратăр.\nПур çĕрте те сервер вăхăтне (Гринвич тăрăх, UTC) кăтартнă.",
        "filename": "Файл ячĕ",
        "filedesc": "Кĕскен ăнлантарни",
-       "fileuploadsummary": "Кĕске ăнлантару:",
+       "fileuploadsummary": "Кĕскен ăнлантарни:",
        "filestatus": "Усă курмалли майсем",
        "filesource": "Çăлкуç",
        "ignorewarning": "Асăрхаттарусене пăхмасăр файла çав-çавах çырса хумалла.",
        "watching": "Сăнамаллисем шутне хушасси…",
        "unwatching": "Сăнав ят-йышĕнчен кăларса пăрахасси…",
        "enotif_reset": "Пур страницăсене те пăхнă пек палăрт",
+       "enotif_impersonal_salutation": "{{SITENAME}} хутшăнакан",
        "enotif_anon_editor": "$1 анонимлă хутшăнакан",
        "created": "хатĕрленĕ",
        "changed": "улăштарнă",
        "undelete-search-submit": "Шыра",
        "blanknamespace": "(Тĕп)",
        "contributions": "{{GENDER:$1|Усă куракан}} ӳсĕмĕсем",
+       "contributions-title": "Усă куракан $1 хушни",
        "mycontris": "Ӳсĕм",
-       "contribsub2": "{{GENDER:$3|$1}} ӳсĕмĕ ($2)",
+       "contribsub2": "{{GENDER:$3|$1}} валли ($2)",
        "uctop": " (пуçламăш)",
        "month": "Уйăхран (тата маларах):",
        "year": "Çултан (тата маларах):",
        "sp-contributions-talk": "сӳтсе яв",
        "sp-contributions-userrights": "Хутшăнакансен прависемпе ĕçлесси",
        "sp-contributions-search": "Тӳпе шыравĕ",
+       "sp-contributions-username": "IP адрес е усă куракан ят:",
        "sp-contributions-submit": "Шыра",
        "whatlinkshere": "Кунта килекен каçăсем",
        "linkshere": "Çак страницăсем '''[[:$1]]''' çине илсе килеççĕ:",
        "whatlinkshere-links": "← каçăсем",
        "whatlinkshere-filters": "Аласем",
        "blockip": "Хăтшăнакана ĕçлеме чар",
+       "ipaddressorusername": "IP адрес е усă куракан ят:",
        "ipbreason": "Сăлтавĕ",
        "ipbother": "Урăх вăхăт:",
        "ipboptions": "2 сехет:2 hours,1 кун:1 day,3 кун:3 days,1 эрне:1 week,2 эрне:2 weeks,1 уйăх:1 month,3 уйăх:3 months,6 уйăх:6 months,1 çул:1 year,яванлăха:infinite",
        "tooltip-feed-atom": "Ку страницăн Atom куçару",
        "tooltip-ca-nstab-image": "Файлăн страници",
        "tooltip-ca-nstab-template": "Шаблонăн страници",
-       "tooltip-ca-nstab-category": "Категори страницине уç",
+       "tooltip-ca-nstab-category": "Категорин страницине пăхни",
        "tooltip-save": "Тӳрлетӳсене астуса хăвармалла",
        "tooltip-watch": "Çак страницăна пăхса тăмаллисем шутне хуш",
        "tooltip-summary": "Кĕскĕн ăнлантарса парăр",
        "spambot_username": "MediaWiki спамран тасатни",
        "pageinfo-title": "\"$1\" çинчен",
        "pageinfo-toolboxlink": "Страници çинчен",
+       "pageinfo-category-info": "Категори çинчен",
        "markaspatrolleddiff": "Тĕрĕсленĕ тесе палăрт",
        "markaspatrolledtext": "Ку статьяна тĕрĕсленĕ тесе палăртмалла",
        "markedaspatrolled": "Тĕрĕсленĕ пек палăртнă",
index 1f54788..6f3ab07 100644 (file)
        "revdelete-show-file-confirm": "Er du sikker på, at du vil vise en slettet version af filen \"<nowiki>$1</nowiki>\" fra den $2, klokken $3?",
        "revdelete-show-file-submit": "Ja",
        "logdelete-selected": "{{PLURAL:$1|Valgt logindførsel|Valgte logindførsler}}:",
-       "revdelete-text-text": "Slettede version vil stadigt fremgå af sidehistorikken, men dele af indholdet vil ikke være offentlig tilgængeligt.",
+       "revdelete-text-text": "Slettede versioner vil stadig fremgå af sidehistorikken, men dele af indholdet vil ikke være offentlig tilgængeligt.",
        "revdelete-text-others": "Andre administratorer vil fortsat have adgang til det skjulte indhold og have mulighed for at genskabe det, med mindre andre begrænsninger er sat.",
        "revdelete-confirm": "Vær venlig at bekræfte at du vil gøre dette, at du forstår konsekvenserne, og at du gør det i overensstemmelse med [[{{MediaWiki:Policy-url}}|retningslinjerne]].",
        "revdelete-suppress-text": "Der bør '''kun''' skjules i de følgende tilfælde:\n* Potentielt injurierende oplysninger\n* Upassende personlige oplysninger\n*: ''hjemmeadresser og -telefonnumre, CPR-numre og lign.''",
index f765cab..98a8f55 100644 (file)
        "emailccsubject": "Kopie deiner Nachricht an $1: $2",
        "emailsent": "E-Mail verschickt",
        "emailsenttext": "Deine E-Mail wurde verschickt.",
-       "emailuserfooter": "Diese E-Mail wurde von {{SITENAME}}-Benutzer „$1“ an „$2“ gesendet.",
+       "emailuserfooter": "Diese E-Mail wurde von „$1“ an „$2“ durch die Funktion „{{int:emailpage}}“ bei {{SITENAME}} gesendet.",
        "usermessage-summary": "Systemnachricht gespeichert.",
        "usermessage-editor": "System-Messenger",
        "usermessage-template": "MediaWiki:Benutzernachricht",
        "feedback-error1": "Fehler: Unbekanntes Ergebnis der API",
        "feedback-error2": "Fehler: Bearbeitung gescheitert",
        "feedback-error3": "Fehler: Keine Antwort von der API",
+       "feedback-error4": "Fehler: Der Beitrag konnte nicht unter dem angegebenen Rückmeldungstitel gespeichert werden",
        "feedback-message": "Nachricht:",
        "feedback-subject": "Betreff:",
        "feedback-submit": "Senden",
index fa3b4ea..1190c40 100644 (file)
        "emailccsubject": "Copy of your message to $1: $2",
        "emailsent": "Email sent",
        "emailsenttext": "Your email message has been sent.",
-       "emailuserfooter": "This email was sent by $1 to $2 by the \"Email user\" function at {{SITENAME}}.",
+       "emailuserfooter": "This email was sent by $1 to $2 by the \"{{int:emailpage}}\" function at {{SITENAME}}.",
        "usermessage-summary": "Leaving system message.",
        "usermessage-editor": "System messenger",
        "usermessage-template": "MediaWiki:UserMessage",
index 4703218..3759bc8 100644 (file)
        "ipboptions": "2 horoj:2 hours,1 tago:1 day,3 tagoj:3 days,1 semajno:1 week,2 semajnoj:2 weeks,1 monato:1 month,3 monatoj:3 months,6 monatoj:6 months,1 jaro:1 year,porĉiam:infinite",
        "ipbhidename": "Kaŝi salutnomon de redaktoj kaj listoj",
        "ipbwatchuser": "Atenti la paĝojn por uzanto kaj diskuto de ĉi tiu uzanto.",
-       "ipb-disableusertalk": "Preventi ĉi tiun uzanton de redaktante ties propran diskuto-paĝon kiam forbarita",
+       "ipb-disableusertalk": "Preventi ĉi tiun uzanton redakti sian diskuto-paĝon, dum li estas forbarita",
        "ipb-change-block": "Reforbari la uzanton kun ĉi tiuj preferoj",
        "ipb-confirm": "Konfirmi forbaron",
        "badipaddress": "Neniu uzanto, aŭ la IP-adreso estas misformita.",
        "blockipsuccesssub": "Forbaro sukcesis.",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] estas forbarita. <br />\nVidu la [[Special:BlockList|liston de forbaroj]] por kontroli.",
        "ipb-blockingself": "Vi preskaŭ forbaros vin mem! Ĉu vi certas ke vi volas fari ĉi tiel?",
-       "ipb-confirmhideuser": "Vi preskaŭ forbaras uzanto kun \"kaŝi uzanton\" ŝalta. Ĉi tiu kaŝi la nomon de uzanto en ĉiuj listoj ka protokoloj. Ĉu vi certas ke vi volas fari ĉi tiel?",
+       "ipb-confirmhideuser": "Vi preskaŭ forbaras uzanton kun ŝaltita modo \"kaŝi uzanton\". Ĉi tio kaŝos la nomon de uzanto en ĉiuj listoj kaj protokoloj. Ĉu vi certas, ke vi volas fari ĉi tion?",
        "ipb-edit-dropdown": "Redakti kialojn por forbaro.",
        "ipb-unblock-addr": "Restarigi $1",
        "ipb-unblock": "Malforbari salutnomon aŭ IP-adreson",
        "ipb_already_blocked": "\"$1\" estas jam forbarita",
        "ipb-needreblock": "$1 estas jam forbarita. Ĉu vi volas ŝanĝi la opciojn?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Alia forbaro|Aliaj forbaroj}}",
-       "unblock-hideuser": "Vi ne povas malforbari ĉi tiun uzanton, pro ties salutnomo estis kaŝita.",
+       "unblock-hideuser": "Vi ne povas malforbari ĉi tiun uzanton, ĉar ties salutnomo estis kaŝita.",
        "ipb_cant_unblock": "Eraro: Forbar-identigo $1 ne estas trovita. Ĝi eble estis jam malforbarita.",
        "ipb_blocked_as_range": "Eraro: La IP-adreso $1 ne estas forbarita rekte kaj ne povas esti malforbarita. Tamen ĝi estas forbarita kiel parto de la intervalo $2, kiu ne povas esti malforbarita.",
        "ip_range_invalid": "Malvalida IP-adresa intervalo.",
        "import-rootpage-nosubpage": "La nomspaco \"$1\" de la radikopaĝo ne permesas subpaĝoj.",
        "importlogpage": "Protokolo de importaĵoj",
        "importlogpagetext": "Administrantecaj importoj de paĝoj kun redakto-historio de aliaj vikioj.",
-       "import-logentry-upload": "importita [[$1]] de dosiera alŝuto",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|revizio importita|revizioj importitaj}}",
-       "import-logentry-interwiki": "transvikiigita $1",
        "import-logentry-interwiki-detail": "Importis $1 {{PLURAL:$1|revizion|reviziojn}} de $2",
        "javascripttest": "Ĝavoskripta testado",
        "javascripttest-pagetext-noframework": "Ĉi tiu paĝo estas konservita por funkciigi testojn de JavaScript.",
        "logentry-upload-revert": "$1 {{GENDER:$2|alŝutis}} $3",
        "rightsnone": "(nenia)",
        "revdelete-summary": "redaktoresumon",
+       "feedback-adding": "Aldonanta respondon al la paĝo...",
+       "feedback-bugcheck": "Bonega! Nur konfirmu ke ĝi ne jam ekzistas inter la [$1 konataj cimoj].",
+       "feedback-bugnew": "Mi konfirmis. Raportu novan cimon.",
        "feedback-bugornote": "Se vi pretas priskribi teknikan problemon detale, bonvolu [$1 raporti cimon].\nAŭ vi povas uzi la facilan formularon sube. Via komento estos aldonita al la paĝo \"[$3 $2]\", kune kun via salutnomo kaj uzita retumilo.",
-       "feedback-subject": "Temo:",
-       "feedback-message": "Mesaĝo:",
        "feedback-cancel": "Nuligi",
-       "feedback-submit": "Sendi Mesaĝon",
-       "feedback-adding": "Aldonanta respondon al la paĝo...",
+       "feedback-close": "Farita",
        "feedback-error1": "Eraro: Nerekonita rezulto de API",
        "feedback-error2": "Eraro: La redakto malsukcesis",
        "feedback-error3": "Eraro: Neniu respondo de API",
+       "feedback-message": "Mesaĝo:",
+       "feedback-subject": "Temo:",
+       "feedback-submit": "Sendi Mesaĝon",
        "feedback-thanks": "Dankon! Via opinio-esprimo estis afiŝita al la paĝo \"[$2 $1]\".",
-       "feedback-close": "Farita",
-       "feedback-bugcheck": "Bonega! Nur konfirmu ke ĝi ne jam ekzistas inter la [$1 konataj cimoj].",
-       "feedback-bugnew": "Mi konfirmis. Raportu novan cimon.",
        "searchsuggest-search": "Serĉi",
        "searchsuggest-containing": "enhavas...",
        "api-error-badaccess-groups": "Vi ne havas permeson alŝuti dosierojn al tiu ĉi vikio.",
        "mediastatistics-header-text": "Tekstaj",
        "mediastatistics-header-executable": "Plenumeblaj dosieroj",
        "json-error-state-mismatch": "JSON estas malvalida aŭ malformigita",
-       "json-error-syntax": "Sintaksa eraro"
+       "json-error-syntax": "Sintaksa eraro",
+       "special-characters-group-latin": "Latina",
+       "special-characters-group-latinextended": "Latina etendita",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-symbols": "Simboloj",
+       "special-characters-group-greek": "Greka",
+       "special-characters-group-cyrillic": "Cirila",
+       "special-characters-group-arabic": "Araba",
+       "special-characters-group-arabicextended": "araba etendite",
+       "special-characters-group-persian": "persa",
+       "special-characters-group-hebrew": "Hebrea",
+       "special-characters-group-bangla": "Bengala",
+       "special-characters-group-tamil": "Tamila",
+       "special-characters-group-telugu": "Telegua",
+       "special-characters-group-sinhala": "Sinhala",
+       "special-characters-group-gujarati": "Guĝarata",
+       "special-characters-group-devanagari": "Nagario",
+       "special-characters-group-thai": "Taja",
+       "special-characters-group-lao": "laŭa",
+       "special-characters-group-khmer": "kmera",
+       "special-characters-title-endash": "mallonga streketo",
+       "special-characters-title-emdash": "longa streketo",
+       "special-characters-title-minus": "minus-signo"
 }
index 0bf854a..ce80478 100644 (file)
        "disclaimers": "Fyrivarni",
        "disclaimerpage": "Project:Generelt fyrivarni",
        "edithelp": "Rættingarhjálp",
+       "helppage-top-gethelp": "Hjálp",
        "mainpage": "Forsíða",
        "mainpage-description": "Forsíða",
        "policy-url": "Project:Handfaring av persónligum upplýsingum",
        "hidetoc": "fjal",
        "collapsible-collapse": "Samanbrot",
        "collapsible-expand": "Víðka",
+       "confirmable-confirm": "Ert {{GENDER:$1|tú}} sikkur?",
        "confirmable-yes": "Ja",
        "confirmable-no": "Nei",
        "thisisdeleted": "Sí ella endurstovna $1?",
        "notextmatches": "Ongin síðutekstur samsvarar",
        "prevn": "undanfarnu {{PLURAL:$1|$1}}",
        "nextn": "næstu {{PLURAL:$1|$1}}",
+       "next-page": "næsta síða",
        "prevn-title": "Gomul $1 {{PLURAL:$1|úrslit|úrslit}}",
        "nextn-title": "Næstu $1 {{PLURAL:$1|úrslit|úrslit}}",
        "shown-title": "Vís $1 {{PLURAL:$1|úrslit|úrslit}} á hvørjari síðu",
        "search-result-category-size": "{{PLURAL:$1|1 limur|$1 limir}} ({{PLURAL:$2|1 undirbólkur|$2 undirbólkar}}, {{PLURAL:$3|1 fíla|$3 fílur}})",
        "search-redirect": "(umstilling $1)",
        "search-section": "(sektión $1)",
+       "search-category": "(bólkur $1)",
        "search-suggest": "Meinti tú: $1",
        "search-interwiki-caption": "Líknandi verkætlanir",
        "search-interwiki-default": "Úrslit frá $1:",
        "suppress": "Yvirlit",
        "booksources": "Bókakeldur",
        "booksources-search-legend": "Leita eftir bókum",
+       "booksources-search": "Leita",
        "specialloguserlabel": "Gjørt hevur:",
        "speciallogtitlelabel": "Mál (heiti ella brúkari):",
        "log": "Gerðabøkur",
        "import-options-wrong": "{{PLURAL:$2|Ikki loyvd innstilling|Ikki loyvdar innstillingar}}: <nowiki>$1</nowiki>",
        "importlogpage": "Innflutningsloggur.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|versjón|versjónir}}",
-       "import-logentry-interwiki": "$1 varð flutt millum wikiir",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versjón|versjónir}} frá $2",
        "javascripttest": "Royndarkoyring av JavaScript",
        "javascripttest-pagetext-noframework": "Henda síðan er løgd av til at koyra JavaScript royndir.",
        "spambot_username": "MediaWiki spamm-reinsan",
        "spam_blanking": "Allar versjónir innihildu leinkjur til $1, tømir síðuna",
        "spam_deleting": "Allar versjónir innihalda leinkjur til $1, slettar",
+       "simpleantispam-label": "Anti-spam eftirlit.\nTú mást <strong>IKKI</strong> útfylla her!",
        "pageinfo-title": "Kunning um \"$1\"",
        "pageinfo-not-current": "Tað er tíverri ómøguligt at veita hesa kunning viðvíkjandi gomlum útgávum.",
        "pageinfo-header-basic": "Grundleggjandi kunning",
        "show-big-image": "Upprunafíla",
        "show-big-image-preview": "Stødd av hesi forskoðan: $1.",
        "show-big-image-other": "{{PLURAL:$2|Onnur upploysn|Aðrar upploysnir}}: $1.",
+       "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-frames": "$1 {{PLURAL:$1|ramma|rammur}}",
        "file-info-png-repeat": "spælt $1 {{PLURAL:$1|ferð|ferðir}}",
        "file-info-png-frames": "$1 {{PLURAL:$1|ramma|rammur}}",
        "watchlisttools-view": "Vís viðkomandi broytingar",
        "watchlisttools-edit": "Vís og rætta eftirlit",
        "watchlisttools-raw": "Rætta rátt eftirlit",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|kjak]])",
        "duplicate-defaultsort": "'''Ávaring:''' Standard sorteringslykilin \"$2\" yvirtekur fyrrverandi standard sorteringslykilin \"$1\".",
        "version": "Útgáva",
        "version-skins": "Útsjóndir",
        "compare-rev1": "Versjón 1",
        "compare-rev2": "Versjón 2",
        "compare-submit": "Samanber",
+       "logentry-newusers-create": "Brúkarakonta $1 varð {{GENDER:$2|upprættað}}",
        "rightsnone": "(ongin)",
        "revdelete-summary": "yvirlit yvir broytingar",
        "searchsuggest-search": "Leita",
index 36c91e6..8307d73 100644 (file)
        "wrongpassword": "Le mot de passe est incorrect. Veuillez essayer à nouveau.",
        "wrongpasswordempty": "Vous n'avez pas entré de mot de passe. Veuillez essayer à nouveau.",
        "passwordtooshort": "Votre mot de passe doit contenir au moins $1 caractère{{PLURAL:$1||s}}.",
+       "passwordtoolong": "Les mots de passe ne peuvent pas dépasser {{PLURAL:$1|1 caractère|$1 caractères}}.",
        "password-name-match": "Votre mot de passe doit être différent de votre nom d'utilisateur.",
        "password-login-forbidden": "L'utilisation de ce nom d'utilisateur et de ce mot de passe a été interdite.",
        "mailmypassword": "Réinitialiser le mot de passe",
        "notextmatches": "Aucun texte de page ne correspond à la recherche.",
        "prevn": "{{PLURAL:$1|précédente|$1 précédentes}}",
        "nextn": "{{PLURAL:$1|suivante|$1 suivantes}}",
+       "prev-page": "page précédente",
+       "next-page": "page suivante",
        "prevn-title": "$1 {{PLURAL:$1|résultat précédent|résultats précédents}}",
        "nextn-title": "$1 {{PLURAL:$1|résultat suivant|résultats suivants}}",
        "shown-title": "Afficher $1 résultat{{PLURAL:$1||s}} par page",
        "emailccsubject": "Copie de votre message à $1 : $2",
        "emailsent": "Courriel envoyé",
        "emailsenttext": "Votre message a été envoyé par courriel.",
-       "emailuserfooter": "Ce courriel a été envoyé par « $1 » à « $2 » par la fonction « Envoyer un courriel à l'utilisateur » de {{SITENAME}}.",
+       "emailuserfooter": "Ce courriel a été envoyé par « $1 » à « $2 » par la fonction « {{int:emailpage}} » de {{SITENAME}}.",
        "usermessage-summary": "A laissé un message système.",
        "usermessage-editor": "Messager du système",
        "watchlist": "Liste de suivi",
index 570fd00..abcda04 100644 (file)
        "fileexists-forbidden": "Der bestiet al in triem mei dizze namme.\nBied jo triem ûnder in oare namme oan.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Der bestiet al in triem mei dizze namme by de dielde triemmen.\nAs jo de triem dochs noch oanbiede wolle, gean dan werom en kies in oare namme.\n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Dizze triem is idintyk oan {{PLURAL:$1|de folgjende triem|de folgjende triemmen}}:",
-       "file-deleted-duplicate": "In bestân idintyk oan dit bestân ([[:$1]]) is foarhinne fuorthelle.\nRieplachtsje it fuorthel-logboek foar't jo fierder geane.",
+       "file-deleted-duplicate": "In triem idintyk oan dizze triem ([[:$1]]) is foarhinne fuorthelle.\nRieplachtsje it fuorthel-logboek foar't jo fierder geane.",
        "uploadwarning": "Oanbied-warskôging",
        "savefile": "Lis triem fêst",
        "uploaddisabled": "Sorry, op dizze tsjinner kin net oanbean wurde.",
        "listfiles-summary": "Op dizze spesjale side binne alle tafoege triemmen te besjen.\nStandert wurde de lêst tafoege triemmen boppe oan de list werjûn.\nKlikken op in kolomkop feroaret de sortearring.",
        "listfiles_search_for": "Sykje nei triem:",
        "imgfile": "triem",
-       "listfiles": "Ofbyld list",
+       "listfiles": "Triemlist",
        "listfiles_thumb": "Miniatuerôfbylding",
        "listfiles_date": "Datum",
        "listfiles_name": "Namme",
index e6adeee..113f209 100644 (file)
        "wrongpassword": "O contrasinal escrito é incorrecto.\nPor favor, insira outro.",
        "wrongpasswordempty": "O campo do contrasinal estaba en branco.\nPor favor, inténteo de novo.",
        "passwordtooshort": "Os contrasinais deben conter, como mínimo, {{PLURAL:$1|1 carácter|$1 caracteres}}.",
+       "passwordtoolong": "Os contrasinais non deben ser máis longo de {{PLURAL:$1|1 carácter|$1 caracteres}}.",
        "password-name-match": "O seu contrasinal debe ser diferente do seu nome de usuario.",
        "password-login-forbidden": "O uso deste nome de usuario e contrasinal foi prohibido.",
        "mailmypassword": "Restablecer o contrasinal",
        "notextmatches": "Non se atopou o texto en ningunha páxina",
        "prevn": "{{PLURAL:$1|$1}} previas",
        "nextn": "{{PLURAL:$1|$1}} seguintes",
+       "prev-page": "páxina anterior",
+       "next-page": "páxina seguinte",
        "prevn-title": "{{PLURAL:$1|O resultado anterior|Os anteriores $1 resultados}}",
        "nextn-title": "{{PLURAL:$1|O seguinte resultado|Os seguintes $1 resultados}}",
        "shown-title": "Mostrar $1 {{PLURAL:$1|resultado|resultados}} por páxina",
        "emailccsubject": "Copia da súa mensaxe para $1: $2",
        "emailsent": "Mensaxe enviada",
        "emailsenttext": "A súa mensaxe de correo electrónico foi enviada.",
-       "emailuserfooter": "Este correo electrónico foi enviado por $1 a $2 mediante a función \"Enviar un correo electrónico a este usuario\" de {{SITENAME}}.",
+       "emailuserfooter": "Este correo electrónico foi enviado por $1 a $2 mediante a función \"{{int:emailpage}}\" en {{SITENAME}}.",
        "usermessage-summary": "Mensaxe deixada polo sistema.",
        "usermessage-editor": "Editor das mensaxes do sistema",
        "watchlist": "Lista de vixilancia",
        "feedback-error1": "Erro: Resultado da API non recoñecido",
        "feedback-error2": "Erro: Fallo de edición",
        "feedback-error3": "Erro: Non hai resposta da API",
+       "feedback-error4": "Erro: Non foi posible enviar o seu comentario sobre o título selecionado",
        "feedback-message": "Mensaxe:",
        "feedback-subject": "Asunto:",
        "feedback-submit": "Enviar",
index 1c36479..f49313d 100644 (file)
        "emailccsubject": "העתק של הודעתך למשתמש $1: $2",
        "emailsent": "הדואר נשלח",
        "emailsenttext": "הודעת הדואר האלקטרוני שלך נשלחה.",
-       "emailuserfooter": "דואר זה נשלח על־ידי $1 ל{{GRAMMAR:תחילית|$2}} באמצעות פעולת \"שליחת דואר אלקטרוני למשתמש זה\" באתר {{SITENAME}}.",
+       "emailuserfooter": "דואר זה נשלח על־ידי $1 ל{{GRAMMAR:תחילית|$2}} באמצעות פעולת \"{{int:emailpage}}\" ב{{GRAMMAR:תחילית|{{SITENAME}}}}.",
        "usermessage-summary": "השארת הודעת מערכת.",
        "usermessage-editor": "שולח הודעות המערכת",
        "watchlist": "רשימת המעקב",
        "feedback-error1": "שגיאה: תוצאה לא מזוהה מה־API",
        "feedback-error2": "שגיאה: העריכה נכשלה",
        "feedback-error3": "שגיאה: אין תשובה מה־API",
+       "feedback-error4": "שגיאה: לא ניתן לשלוח הודעה לכותרת המשוב המבוקשת",
        "feedback-message": "הודעה:",
        "feedback-subject": "נושא:",
        "feedback-submit": "שליחה",
index 665a98c..5611b47 100644 (file)
        "revertpage-nouser": "Visszaállítottam a lap korábbi változatát (szerkesztőnév eltávolítva) szerkesztéséről [[User:$1|$1]] szerkesztésére",
        "rollback-success": "$1 szerkesztéseit visszaállítottam $2 utolsó változatára.",
        "sessionfailure-title": "Munkamenethiba",
-       "sessionfailure": "Úgy látszik, hogy probléma van a bejelentkezési munkameneteddel;\nez a művelet a munkamenet eltérítése miatti óvatosságból megszakadt.\nKérjük, hogy nyomd meg a \"vissza\" gombot, és töltsd le újra az oldalt, ahonnan jöttél, majd próbáld újra.",
+       "sessionfailure": "Úgy látszik, hogy probléma van a bejelentkezési munkameneteddel;\nez a művelet a munkamenet eltérítése miatti óvatosságból megszakadt.\nKérjük, hogy nyomd meg a „vissza” gombot, és töltsd le újra az oldalt, ahonnan jöttél, majd próbáld újra.",
        "protectlogpage": "Lapvédelmi napló",
        "protectlogtext": "Alább látható a lapvédelemmel kapcsolatos változtatások listája.\nA [[Special:ProtectedPages|védett lapok listáján]] megtekintheted a jelenleg is érvényben lévő védelmeket.",
        "protectedarticle": "levédte a(z) [[$1]] lapot",
index 3f6eb71..515ac00 100644 (file)
        "wrongpassword": "Le contrasigno que tu entrava es incorrecte. Per favor reprova.",
        "wrongpasswordempty": "Tu non entrava un contrasigno. Per favor reprova.",
        "passwordtooshort": "Le contrasignos debe continer al minus {{PLURAL:$1|1 character|$1 characteres}}.",
+       "passwordtoolong": "Le contrasignos non pote esser plus longe de {{PLURAL:$1|1 character|$1 characteres}}.",
        "password-name-match": "Tu contrasigno debe esser differente de tu nomine de usator.",
        "password-login-forbidden": "Le uso de iste nomine de usator e contrasigno ha essite prohibite.",
        "mailmypassword": "Reinitialisar contrasigno",
        "missingcommentheader": "'''Rememoration:''' Tu non ha specificate un subjecto/titulo pro iste commento.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin titulo.",
        "summary-preview": "Previsualisation del summario:",
        "subject-preview": "Previsualisation del subjecto/titulo:",
+       "previewerrortext": "Un error ha occurrite durante le tentativa de previsualisar le cambiamentos.",
        "blockedtitle": "Le usator es blocate",
        "blockedtext": "'''Tu nomine de usator o adresse IP ha essite blocate.'''\n\nLe blocada esseva facite per $1.\nLe motivo presentate es ''$2''.\n\n* Initio del blocada: $8\n* Expiration del blocada: $6\n* Le blocato intendite: $7\n\nTu pote contactar $1 o un altere [[{{MediaWiki:Grouppage-sysop}}|administrator]] pro discuter le blocada.\nTu non pote usar le function 'inviar e-mail a iste usator' salvo que un adresse de e-mail valide es specificate in le\n[[Special:Preferences|preferentias de tu conto]] e que tu non ha essite blocate de usar lo.\nTu adresse IP actual es $3, e le ID del blocada es #$5.\nPer favor include tote le detalios supra specificate in omne correspondentia.",
        "autoblockedtext": "Tu adresse de IP ha essite automaticamente blocate proque un altere usator lo usava qui esseva blocate per $1.\nLe motivo presentate es:\n\n:''$2''\n\n* Initio del blocada: $8\n* Expiration del blocada: $6\n* Blocato intendite: $7\n\nTu pote contactar $1 o un del altere [[{{MediaWiki:Grouppage-sysop}}|administratores]] pro discuter le blocada.\n\nNota que tu non pote utilisar le function \"inviar e-mail a iste usator\" salvo que tu ha registrate un adresse de e-mail valide in tu [[Special:Preferences|preferentias de usator]] e que tu non ha essite blocate de usar lo.\n\nTu adresse IP actual es $3, e le ID del blocada es #$5.\nPer favor include tote le detalios supra specificate in omne correspondentia.",
        "notextmatches": "Nulle resultato in le texto de paginas",
        "prevn": "$1 {{PLURAL:$1|precedente|precedentes}}",
        "nextn": "$1 {{PLURAL:$1|sequente|sequentes}}",
+       "prev-page": "pagina precedente",
+       "next-page": "pagina sequente",
        "prevn-title": "$1 {{PLURAL:$1|resultato|resultatos}} precedente",
        "nextn-title": "$1 {{PLURAL:$1|resultato|resultatos}} sequente",
        "shown-title": "Monstrar $1 {{PLURAL:$1|resultato|resultatos}} per pagina",
        "unusedimages": "Imagines non usate",
        "wantedcategories": "Categorias plus demandate",
        "wantedpages": "Paginas plus demandate",
+       "wantedpages-summary": "Lista de paginas non existente con le major numero de ligamines verso illos, excludente le paginas que ha solmente redirectiones que liga verso illos. Pro un lista de paginas non existente que ha redirectiones que liga verso illos, vide [[{{#special:BrokenRedirects}}]].",
        "wantedpages-badtitle": "Titulo invalide in le gruppo de resultatos: $1",
        "wantedfiles": "Files desirate",
        "wantedfiletext-cat": "Le sequente files es usate ma non existe. Le files ab repositorios externe pote esser listate malgrado que illos existe. Omne tal false positivos essera <del>cancellate</del>. In addition, paginas que incorpora files que non existe es listate in [[:$1]].",
        "emailccsubject": "Copia de tu message a $1: $2",
        "emailsent": "E-mail inviate",
        "emailsenttext": "Tu message de e-mail ha essite inviate.",
-       "emailuserfooter": "Iste e-mail esseva inviate per $1 a $2 con le function \"Inviar e-mail al usator\" a {{SITENAME}}.",
+       "emailuserfooter": "Iste e-mail ha essite inviate per $1 a $2 con le function \"{{int:emailpage}}\" in {{SITENAME}}.",
        "usermessage-summary": "Lassante un message de systema.",
        "usermessage-editor": "Messagero del systema",
        "watchlist": "Observatorio",
index df33503..42b2234 100644 (file)
@@ -18,7 +18,8 @@
                        "Ævar Arnfjörð Bjarmason",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Sveinn í Felli"
                ]
        },
        "tog-underline": "Undirstrika tengla:",
        "password-login-forbidden": "Notkun þessa notendanafns og lykilorðs er ekki leyfileg.",
        "mailmypassword": "Endurstilla lykilorð",
        "passwordremindertitle": "Nýtt tímabundið aðgangsorð fyrir {{SITENAME}}",
-       "passwordremindertext": "Einhver (líklegast þú, á vistfanginu $1) hefur beðið um að fá nýtt\nlykilorð fyrir {{SITENAME}} ($4). Tímabundið lykilorð fyrir notandann „$2“\nhefur verið búið til og er núna „$3“. Ef þetta er það sem þú vildir, þarfu að skrá\nþig inn og velja nýtt lykilorð.  Þetta tímabundna lykilorð rennur út eftir $5 {{PLURAL:$5|dag|daga}}.\n\nEf það var ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt,\nog vilt ekki lengur breyta því, skaltu hunsa þessi skilaboð og\nhalda áfram að nota gamla lykilorðið.",
+       "passwordremindertext": "Einhver (líklegast þú, á vistfanginu $1) hefur beðið um að fá nýtt\nlykilorð fyrir {{SITENAME}} ($4). Tímabundið lykilorð fyrir notandann „$2“\nhefur verið búið til og er núna „$3“. Ef þetta er það sem þú vildir, þarfu að skrá\nþig inn og velja nýtt lykilorð.  Þetta tímabundna lykilorð rennur út eftir $5 {{PLURAL:$5|dag|daga}}.\n\nEf það var ekki þú sem fórst fram á þetta, eða ef þú manst lykilorðið þitt,\nog vilt ekki lengur breyta því, skaltu hunsa þessi skilaboð og\nhalda áfram að nota gamla lykilorðið.",
        "noemail": "Það er ekkert netfang skráð fyrir notandan \"$1\".",
        "noemailcreate": "Þú verður að skrá gilt netfang",
        "passwordsent": "Nýtt lykilorð var sent á netfangið sem er skráð á „$1“.\nVinsamlegast skráðu þig inn á ný þegar þú hefur móttekið það.",
        "passwordreset-capture-help": "Ef þú hakar við þennan reit verður tölvupósturinn (með tímabundna lykilorðinu) sýndur þér og einnig sendur notandanum.",
        "passwordreset-email": "Netfang:",
        "passwordreset-emailtitle": "Notendaupplýsingar á {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Einhver (líklegast þú, á vistfanginu $1) hefur beðið um \nendursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:\n\n$2\n\nEf þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorðið rennur|Tímabundnu lykilorðin renna}} út eftir $5 {{PLURAL:$5|dag|daga}}.\n\nEf það varst ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt, og villt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.",
-       "passwordreset-emailtext-user": "Notandinn $1 á {{SITENAME}} hefur beðið um endursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:\n\n$2\n\nEf þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorðið rennur|Tímabundnu lykilorðin renna}} út eftir $5 {{PLURAL:$5|dag|daga}}.\n\nEf það varst ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt, og villt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.",
+       "passwordreset-emailtext-ip": "Einhver (líklegast þú, á vistfanginu $1) hefur beðið um \nendursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:\n\n$2\n\nEf þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorðið rennur|Tímabundnu lykilorðin renna}} út eftir $5 {{PLURAL:$5|dag|daga}}.\n\nEf það varst ekki þú sem fórst fram á þetta, eða ef þú manst lykilorðið þitt, og villt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.",
+       "passwordreset-emailtext-user": "Notandinn $1 á {{SITENAME}} hefur beðið um endursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:\n\n$2\n\nEf þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorðið rennur|Tímabundnu lykilorðin renna}} út eftir $5 {{PLURAL:$5|dag|daga}}.\n\nEf það varst ekki þú sem fórst fram á þetta, eða ef þú manst aftur lykilorðið þitt, og vilt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.",
        "passwordreset-emailelement": "Notendanafn: $1\nTímabundið lykilorð: $2",
        "passwordreset-emailsent": "Töluvpóstur til að endursetja lykilorðið hefur verið sendur.",
        "passwordreset-emailsent-capture": "Tölvupóstur til að endursetja lykilorðið hefur verið sendur í tölvupósti, sem er sýndur hér fyrir neðan.",
        "template-semiprotected": "(hálfvernduð)",
        "hiddencategories": "Þessi síða er meðlimur í $1 {{PLURAL:$1|földum flokki|földum flokkum}}:",
        "nocreatetext": "{{SITENAME}} hefur takmarkað eiginleikann að gera nýjar síður.\nÞú getur farið til baka og breytt núverandi síðum, eða [[Special:UserLogin|skráð þið inn eða búið til aðgang]].",
-       "nocreate-loggedin": "Þú hefur ekki leyfi til að skapa nýjar síður.",
+       "nocreate-loggedin": "Þú hefur ekki leyfi til að búa til nýjar síður.",
        "sectioneditnotsupported-title": "Hlutabreyting er ekki virk",
        "sectioneditnotsupported-text": "Hlutabreyting er ekki virk á þessari síðu.",
        "permissionserrors": "Leyfisvilla",
        "userrights-no-interwiki": "Þú hefur ekki leyfi til að breyta notandaréttindum á öðrum wiki-síðum.",
        "userrights-nodatabase": "Gagnagrunnurinn $1 er ekki til eða ekki staðbundinn.",
        "userrights-nologin": "Þú verður að [[Special:UserLogin|innskrá]] þig á möppudýraaðgang til að geta útdeilt notandaréttindum.",
-       "userrights-notallowed": "Þú hefur ekki réttindi til að útdeila eða draga til baka notandaréttini.",
+       "userrights-notallowed": "Þú hefur ekki réttindi til að útdeila eða draga til baka notandaréttindi.",
        "userrights-changeable-col": "Hópar sem þú getur breytt",
        "userrights-unchangeable-col": "Hópar sem þú getur ekki breytt",
        "userrights-conflict": "Árekstur í að breyta notandaréttindum! Vinsamlegast skoðaðu aftur og staðfestu breytingar þínar.",
        "recentchanges-label-bot": "Þessi breyting var gerð af vélmenni",
        "recentchanges-label-unpatrolled": "Þessi breyting hefur ekki verið yfirfarin",
        "recentchanges-label-plusminus": "Stærð síðunnar breyttist um svona mörg bæti",
+       "recentchanges-legend-heading": "'''Fyrirsögn:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sjá einng [[Special:NewPages|lista yfir nýjar síður]])",
        "rcnotefrom": "Að neðan {{PLURAL:$5|er breyting síðan|eru breytingar síðan}} <strong>$3, $4</strong> (allt að <strong>$1</strong> sýndar).",
        "rclistfrom": "Sýna breytingar frá og með $3 $2",
        "illegalfilename": "Skráarnafnið „$1“ inniheldur stafi sem eru ekki leyfðir í síðutitlum.\nGjörðu svo vel og endurnefndu skrána og hladdu henni inn aftur.",
        "filename-toolong": "Skráarnöfn mega ekki vera lengri en 240 bæt.",
        "badfilename": "Skáarnafninu hefur verið breytt í „$1“.",
-       "filetype-mime-mismatch": "Skráarendingin \".$1\" samræmist ekki MIME gerð skráarinnar ($2).",
+       "filetype-mime-mismatch": "Skráarendingin \".$1\" samræmist ekki MIME-gerð skrárinnar ($2).",
        "filetype-badmime": "Skrárir af MIME-gerðinni „$1“ er ekki leyfilegt að hlaða inn.",
        "filetype-bad-ie-mime": "Mistókst að hlaða inn skrá því Internet Explorer myndi uppgvötva hana sem \"$1\" sem er óheimil og mögulega hættulegt skráarsnið.",
        "filetype-unwanted-type": "'''„.$1“''' er óæskileg skráargerð.\n{{PLURAL:$3|Ákjósanleg skráargerð er|Ákjósanlegar skráargerðir eru}} $2.",
        "illegal-filename": "Þetta skráarnafn er ekki leyft.",
        "overwrite": "Óheimilt er að skrifa yfir skrá sem er þegar til.",
        "unknown-error": "Óþekkt villa kom upp.",
-       "tmp-create-error": "Gat ekki búið til tímabundna skrá.",
+       "tmp-create-error": "Gat ekki búið til bráðabirgðaskrá.",
        "tmp-write-error": "Villa við skrifun tímabundinnar skrár.",
        "large-file": "Það er mælt með að skrár séu ekki stærri en $1; þessi skrá er $2.",
        "largefileserver": "Þessi skrá er of stór. Vefþjónninn getur ekki tekið við skránni.",
        "windows-nonascii-filename": "Þessi wiki styður ekki skráarnöfn með sérstökum stöfum",
        "fileexists": "Skrá með þessu nafni er þegar til, skoðaðu <strong>[[:$1]]</strong> ef þú ert óviss um hvort þú viljir breyta henni.\n[[$1|thumb]]",
        "filepageexists": "Myndasíðan fyrir þessa síðu hefur þegar verið búin til <strong>[[:$1]]</strong>, en engin skrá er til með þessu nafni.\nLýsingin sem þú skrifaðir verður ekki birt á myndasíðunni.\nTil þess að lýsingin geti birst á síðunni, þá þarft þú að breyta síðunni sérstaklega.\n[[$1|thumb]]",
-       "fileexists-extension": "Skrá með svipuðu nafni er til: [[$2|thumb]]\n*Nafn skráarinnar sem hlaða á inn: <strong>[[:$1]]</strong>\n*Nafn skráarinnar sem er þegar til: <strong>[[:$2]]</strong>\nVilt þú kanski nota annað nafn sem er meira lýsandi fyrir skránna ?",
+       "fileexists-extension": "Skrá með svipuðu nafni er til: [[$2|thumb]]\n*Nafn skrárinnar sem hlaða á inn: <strong>[[:$1]]</strong>\n*Nafn skrárinnar sem er þegar til: <strong>[[:$2]]</strong>\nVilt þú kannski nota annað nafn sem er meira lýsandi fyrir skrána ?",
        "fileexists-thumbnail-yes": "Skráin virðist vera smámynd [[$1|thumb]]\nVinsamlegast athugaðu skránna <strong>[[:$1]]</strong>.\nEf skráin er sama myndin í upprunalegri stærð er ekki þörf á annari smámynd.",
        "file-thumbnail-no": "Skráin er líklega smámynd, því skráarnafnið byrjar á <strong>$1</strong>.\nEf skráin er í fullri upplausn haltu þá áfram að hlaða henni inn, en ef ekki breyttu þá skráarnafninu.",
        "fileexists-forbidden": "Skrá með þessu nafni er þegar til og ekki er hægt að skrifa yfir skránna.\nEf þú villt hlaða inn skránni þinni engu að síður, farðu þá til baka og veldu annað skráarnafn.\n[[File:$1|thumb|center|$1]]",
        "filename-bad-prefix": "Sráarnafnið lýsir ekki skránni, heldur var það búið til af myndavélinni, því það byrjar á '''\"$1\"'''.\nVeldu lýsandi nafn fyrir skránna og reyndu aftur.",
        "upload-success-subj": "Innhlaðning tókst",
        "upload-success-msg": "Upphlöðun frá [$2] tókst. Það er aðgengilegt hér: [[:{{ns:file}}:$1]]",
-       "upload-failure-subj": "Vandamál við upphleðslu skráarinnar",
+       "upload-failure-subj": "Vandamál við upphleðslu",
        "upload-failure-msg": "Upphlaðið frá [$2] mistókst:\n\n$1",
        "upload-warning-subj": "Aðvörun",
        "upload-warning-msg": "Upphal þitt [$2] mistókst. Þú getur farið aftur á [[Special:Upload/stash/$1|upphlaðsviðmótið]] og leiðrétt villuna.",
        "upload-proto-error": "Vitlaus samskiptaregla",
        "upload-proto-error-text": "Upphlöðun frá öðrum vefþjón þarfnast vefslóðar sem byrjar á <code>http://</code> eða <code>ftp://</code>.",
        "upload-file-error": "Innri villa",
-       "upload-file-error-text": "Innri villa: Gat ekki búið til tímabundna skrá á vefþjóni.\nVinsamlegast hafðu samband við [[Special:ListUsers/sysop|stjórnanda]].",
+       "upload-file-error-text": "Innri villa: Gat ekki búið til bráðabirgðaskrá á vefþjóni.\nVinsamlegast hafðu samband við [[Special:ListUsers/sysop|stjórnanda]].",
        "upload-misc-error": "Óþekkt innhleðsluvilla",
        "upload-misc-error-text": "Upphal þitt mistókst vegna óþekktrar villu.\nAthugaðu hvort vefslóðin sé rétt og aðgengileg og að því loknu reyndu aftur.\nEf vandamálið lagast ekki, hafðu samband við [[Special:ListUsers/sysop|stjórnanda]].",
        "upload-too-many-redirects": "Vefslóðin inniheldur of margar tilvísanir.",
-       "upload-http-error": "HTTP villa kom upp við upphal skráarinnar: $1",
+       "upload-http-error": "HTTP villa kom upp: $1",
        "upload-copy-upload-invalid-domain": "Lokað er fyrir afritun skráa frá öðrum vefþjón á þessu vefsvæði.",
        "backend-fail-stream": "Gat ekki streymt skránni „$1“.",
-       "backend-fail-backup": "Öryggisafritun skráarinnar $1 mistókst.",
+       "backend-fail-backup": "Öryggisafritun skrárinnar $1 mistókst.",
        "backend-fail-notexists": "Skráin $1 er ekki til.",
        "backend-fail-hashes": "Gat ekki nálgast tætigildi skráanna til samanburðar.",
        "backend-fail-notsame": "Ólík skrá er þegar til á $1.",
        "backend-fail-invalidpath": "$1 er ekki gildur geymslustaður.",
        "backend-fail-delete": "Mistókst að eyða skránni $1.",
-       "backend-fail-describe": "Mistókst að breyta lýsisgögnum skráarinnar „$1“.",
+       "backend-fail-describe": "Mistókst að breyta lýsisgögnum skrárinnar „$1“.",
        "backend-fail-alreadyexists": "Skráin $1 er þegar til.",
        "backend-fail-store": "Mistókst að vista skrá $1 á $2.",
        "backend-fail-copy": "Mistókst að afrita skjal $1 á $2.",
        "backend-fail-move": "Mistókst að færa skrá $1 á $2.",
-       "backend-fail-opentemp": "Mistókst að opna tímabundna skrá.",
-       "backend-fail-writetemp": "Gat ekki skrifað í tímabundna skrá.",
+       "backend-fail-opentemp": "Mistókst að opna bráðabirgðaskrá.",
+       "backend-fail-writetemp": "Gat ekki skrifað í bráðabirgðaskrá.",
        "backend-fail-closetemp": "Mistókst að loka tímabundinni skrá.",
        "backend-fail-read": "Mistókst að lesa skrá $1.",
        "backend-fail-create": "Mistókst að skrifa skrá $1.",
        "backend-fail-synced": "Skráin $1 er í ósamkvæmu ástandi innan innri geymslubakenda",
        "backend-fail-connect": "Mistókst að tengjast gagnabankanum \"$1\".",
        "backend-fail-internal": "Óþekkt villa átti sér stað í gagnabankanum \"$1\".",
-       "backend-fail-contenttype": "Gat ekki ákvarðað innihaldgerð skráarinnar til geymslu á „$1“.",
+       "backend-fail-contenttype": "Gat ekki ákvarðað innihaldgerð skrárinnar til geymslu á „$1“.",
        "backend-fail-batchsize": "Geymslubakendinn fékk bunka af $1 {{PLURAL:$1|skráaraðgerð|skráaraðgerðum}}; mest eru leyfðar $2 {{PLURAL:$2|aðgerð|aðgerðir}}.",
        "backend-fail-usable": "Gat ekki lesið skrána „$1“ vegna ófullnægjandi aðgangsheimilda eða týndra mappa/íláta.",
        "filejournal-fail-dbconnect": "Gat ekki tengst dagbókargrunni fyrir geymslubakendann „$1“.",
        "lockmanager-fail-db-release": "Gat ekki opnað lása á gagnagrunninum $1.",
        "lockmanager-fail-svr-acquire": "Gat ekki nálgast lása á þjóninum $1.",
        "lockmanager-fail-svr-release": "Gat ekki opnað lása á þjóninum $1.",
-       "zip-file-open-error": "Mistök við opnun skráarinnar fyrir ZIP athuganir.",
+       "zip-file-open-error": "Mistök við opnun skrárinnar fyrir ZIP prófanir.",
        "zip-wrong-format": "Skráin var ekki ZIP skrá.",
-       "zip-bad": "Þessi ZIP skrá er skemmd eða ólesanleg.\nEkki var hægt að athuga öryggi skráarinnar almennilega.",
-       "zip-unsupported": "Þessi skrá er ZIP skrá sem notar möguleika sem eru ekki studdir af MediaWiki.\nEkki er hægt að athuga öryggi skráarinnar almennilega.",
+       "zip-bad": "Þessi ZIP skrá er skemmd eða ólesanleg.\nEkki var hægt að athuga öryggi skrárinnar almennilega.",
+       "zip-unsupported": "Þessi skrá er ZIP skrá sem notar möguleika sem eru ekki studdir af MediaWiki.\nEkki er hægt að athuga öryggi skrárinnar almennilega.",
        "uploadstash": "Óútgefnar skrár",
        "uploadstash-summary": "Þessi síða gefur aðgang að þeim skrám sem hafa verið hlaðið inn (eða eru í biðröð eftir því að vera hlaðið inn) en hafa ekki verið útgefnar. Þessar skrár eru eingöngu sýnilegar þeim notanda sem hlóð þeim inn.",
        "uploadstash-clear": "Tæma listann",
        "license-nopreview": "(Forskoðun ekki fáanleg)",
        "upload_source_url": "(þín valda skrá frá gildri, aðgengilegri vefslóð)",
        "upload_source_file": "(þín valda skrá frá tölvunni þinni)",
+       "listfiles-delete": "eyða",
        "listfiles-summary": "Þessi kerfissíða sýnir allar upphlaðnar skrár.",
        "listfiles_search_for": "Leita að miðilsnafni:",
        "imgfile": "skrá",
        "sharedupload": "Skrá þessi er af $1, og deilt meðal annarra verkefna og nýtist því þar.",
        "sharedupload-desc-there": "Skrá þessi er af $1, og deilt meðal annarra verkefna og nýtist því þar.\nGjörðu svo vel og sjáðu [$2 skráarsíðuna þar] fyrir fleiri upplýsingar.",
        "sharedupload-desc-here": "Skrá þessi er af $1, og deilt meðal annarra verkefna og nýtist því þar.\nHér fyrir neðan er afrit af [$2 skráarsíðunni þar].",
-       "sharedupload-desc-edit": "Þessi skrá er af $1 og gæti verið í notkun á öðrum vefkefnum.\nHentugra væri ef þú gætir breytt lýsingu skráarinnar á [$2 myndasíðu] hennar þar.",
-       "sharedupload-desc-create": "Ã\9eessi skrá er af $1 og gæti verið Ã­ notkun Ã¡ Ã¶Ã°rum vefkefnum.\nHentugra væri ef Ã¾Ãº gætir breytt lýsingu skráarinnar á [$2 myndasíðu] hennar þar.",
+       "sharedupload-desc-edit": "Þessi skrá er af $1 og gæti verið í notkun á öðrum vefkefnum.\nHentugra væri ef þú gætir breytt lýsingu skrárinnar á [$2 myndasíðu] hennar þar.",
+       "sharedupload-desc-create": "Ã\9eessi skrá er af $1 og gæti verið Ã­ notkun Ã­ Ã¶Ã°rum verkefnum.\nHentugra væri ef Ã¾Ãº gætir breytt lýsingu skrárinnar á [$2 myndasíðu] hennar þar.",
        "filepage-nofile": "Engin skrá er til með þessu nafni.",
        "filepage-nofile-link": "Engin skrá er til með þessu nafni, en þú getur [$1 hlaðið henni inn].",
        "uploadnewversion-linktext": "Hlaða inn nýrri útgáfu af þessari skrá",
        "randomincategory": "Handhófsvalin síða í flokki",
        "randomincategory-invalidcategory": "„$1“ er ekki gilt flokkarheiti",
        "randomincategory-nopages": "Það eru engar síður í flokkinum [[:Category:$1|$1]].",
+       "randomincategory-category": "Flokkur:",
+       "randomincategory-legend": "Handhófsvalin síða í flokki",
        "randomredirect": "Handahófsvalin tilvísun",
        "randomredirect-nopages": "Það eru engar tilvísanir í nafnrýminu „$1“.",
        "statistics": "Tölfræði",
        "undelete-missing-filearchive": "Mistókst að endurvekja skjalasafn með auðkenninu $1 því það er ekki til í gagnabankanum.\nMögulega er þegar búið að endurvekja það.",
        "undelete-error": "Mistókst að endurvekja síðu.",
        "undelete-error-short": "Villa við endurvakningu skráar: $1",
-       "undelete-error-long": "Það kom upp villa við endurvakningu skráarinnar:\n\n$1",
+       "undelete-error-long": "Það kom upp villa við endurvakningu skrárinnar:\n\n$1",
        "undelete-show-file-confirm": "Ertu viss um að þú viljir sjá eydda breytingu af skránni \"<nowiki>$1</nowiki>\" frá $2 $3?",
        "undelete-show-file-submit": "Já",
        "namespace": "Nafnrými:",
        "thumbnail_error_remote": "Villumelding frá $1:\n$2",
        "djvu_page_error": "DjVu-blaðsíða er utan marka",
        "djvu_no_xml": "Mistókst að sækja XML-gögn fyrir DjVu skrá",
-       "thumbnail-temp-create": "Mistókst að búa til tímabundna smámynd.",
+       "thumbnail-temp-create": "Mistókst að búa til bráðabirgða-smámyndaskrá",
        "thumbnail-dest-create": "Gat ekki vistað smámynd á markstað",
        "thumbnail_invalid_params": "Breytur smámyndarinnar eru rangar",
        "thumbnail_dest_directory": "Mistókst að búa til niðurhals möppu",
        "importsuccess": "Innflutningi lokið!",
        "importnosources": "Engin uppspretta hefur verið valin og bein upphlöð breytingarskráa eru óvirk.",
        "importnofile": "Engri skrá var hlaðið inn.",
-       "importuploaderrorsize": "Upphlöðun skráarinnar mistókst.\nSkráin er stærri en hámarsstærð síðna segir til um.",
-       "importuploaderrorpartial": "Upphlöðun skráarinnar mistókst.\nSkráinni var eingöngu að hluta til hlaðið inn.",
-       "importuploaderrortemp": "Upphlöðun skráarinnar mistókst.\nTímabundin mappa fannst ekki.",
+       "importuploaderrorsize": "Upphleðsla skrárinnar mistókst.\nSkráin er stærri en leyfð hámarksstærð.",
+       "importuploaderrorpartial": "Upphleðsla skráarinnar mistókst.\nSkráinni var eingöngu hlaðið inn að hluta.",
+       "importuploaderrortemp": "Upphleðsla skrárinnar mistókst.\nBráðabirgðamappa fannst ekki.",
        "import-parse-failure": "Þáttunarvilla við innflutning XML skjals",
        "import-noarticle": "Engin síða til innflutnings!",
        "import-nonewrevisions": "Engar breytingar voru fluttar inn (þær voru allar annaðhvort þegar til eða sleppt vegna villna).",
        "log-show-hide-patrol": "$1 Listi yfir vaktaðar síður",
        "deletedrevision": "Eyddi gamla útgáfu $1",
        "filedeleteerror-short": "Villa við eyðingu: $1",
-       "filedeleteerror-long": "Það kom upp villa við eyðingu skráarinnar: $1",
+       "filedeleteerror-long": "Það kom upp villa við eyðingu skrárinnar: $1",
        "filedelete-missing": "Skránni „$1“ er ekki hægt að eyða vegna þess að hún er ekki til.",
        "filedelete-old-unregistered": "Tilgreind útgáfa \"$1\" er ekki til í gagnabankanum.",
        "filedelete-current-unregistered": "Tilgreind skrá \"$1\" er ekki til í gagnabankanum.",
        "api-error-nomodule": "Innri villa: Engin upphlaðs eining valin.",
        "api-error-ok-but-empty": "Innri villa: ekkert svar frá vefþjón.",
        "api-error-overwrite": "Óheimilt er að skrifa yfir skrá sem er þegar til.",
-       "api-error-stashfailed": "Innri villa: Vefþjónninn gat ekki geymt tímabundna skrá.",
+       "api-error-stashfailed": "Innri villa: Vefþjónninn gat ekki geymt bráðabirgðaskrá.",
        "api-error-publishfailed": "Innri villa: Vefþjónninn gat ekki gefið út bráðabirgðaskrá.",
        "api-error-timeout": "Vefþjónninn svaraði ekki á tilætluðum tíma.",
        "api-error-unclassified": "Óþekkt villa kom upp.",
index 6f7ad23..12482b7 100644 (file)
        "feedback-error1": "Errore: Dalla API è arrivato un risultato non riconosciuto",
        "feedback-error2": "Errore: Non è stato possibile eseguire la modifica",
        "feedback-error3": "Errore: Nessuna risposta dalla API",
+       "feedback-error4": "Errore: non sono in grado di postare il titolo del feedback desiderato.",
        "feedback-message": "Messaggio:",
        "feedback-subject": "Oggetto:",
        "feedback-submit": "Invia",
index 5c25332..bee8a3b 100644 (file)
        "revdelete-uname-unhid": "利用者名の可視化",
        "revdelete-restricted": "管理者に対する制限の適用",
        "revdelete-unrestricted": "管理者に対する制限の除去",
-       "logentry-block-block": "$1 ã\81\8c {{GENDER:$4|$3}} ã\82\92$5ã\81¾ã\81§ã\81®æ\9c\9fé\99\90ä»\98ã\81\8dã\81§{{GENDER:$2|ã\83\96ã\83­ã\83\83ã\82¯ã\81\97ã\81¾ã\81\97ã\81\9f}} $6",
+       "logentry-block-block": "$1 が {{GENDER:$4|$3}} を$5で{{GENDER:$2|ブロックしました}} $6",
        "logentry-block-unblock": "$1 が {{GENDER:$4|$3}} の{{GENDER:$2|ブロックを解除しました}}",
-       "logentry-block-reblock": "$1 が {{GENDER:$4|$3}} のブロック設定を$5までの期限に{{GENDER:$2|変更しました}} $6",
-       "logentry-suppress-block": "$1 ã\81\8c {{GENDER:$4|$3}} ã\82\92$5ã\81¾ã\81§ã\81®æ\9c\9fé\99\90ä»\98ã\81\8dã\81§{{GENDER:$2|ã\83\96ã\83­ã\83\83ã\82¯ã\81\97ã\81¾ã\81\97ã\81\9f}} $6",
-       "logentry-suppress-reblock": "$1 が {{GENDER:$4|$3}} のブロック設定を$5までの期限に{{GENDER:$2|変更しました}} $6",
+       "logentry-block-reblock": "$1 が {{GENDER:$4|$3}} のブロックの期限を$5に{{GENDER:$2|変更しました}} $6",
+       "logentry-suppress-block": "$1 が {{GENDER:$4|$3}} を$5で{{GENDER:$2|ブロックしました}} $6",
+       "logentry-suppress-reblock": "$1 が {{GENDER:$4|$3}} のブロックの期限を$5に{{GENDER:$2|変更しました}} $6",
        "logentry-import-upload": "$1 がファイルをアップロードして $3 を{{GENDER:$2|インポートしました}}",
        "logentry-import-interwiki": "$1 が他のウィキから $3 を{{GENDER:$2|インポートしました}}",
        "logentry-merge-merge": "$1{{GENDER:$2|統合元}} と$3を$4に統合(改訂版を$5に掲載)",
index 9af2ee9..cbd155a 100644 (file)
@@ -25,7 +25,7 @@
                        "아라"
                ]
        },
-       "tog-underline": "ಲಿà²\82à²\95à³\81ಗಳ ಕೆಳಗೆ ಗೆರೆ ತೋರಿಸಿ",
+       "tog-underline": "à²\95à³\8aà²\82ಡಿಗಳ ಕೆಳಗೆ ಗೆರೆ ತೋರಿಸಿ",
        "tog-hideminor": "ಚಿಕ್ಕಪುಟ್ಟ ಬದಲಾವಣೆಗಳನ್ನು ಅಡಗಿಸಿ",
        "tog-hidepatrolled": "ಪಹರೆಯಲ್ಲಿ ಆದ ಸಂಪಾದನೆಗಳನ್ನು ಇತ್ತೀಚೆಗಿನ ಬದಲಾವಣೆಗಳಲ್ಲಿ ಅಡಗಿಸು",
        "tog-newpageshidepatrolled": "ಪಹರೆಯಲ್ಲಿ ಆದ ಪುಟಗಳನ್ನು ಹೊಸ ಪುಟಗಳ ಪಟ್ಟಿಯಲ್ಲಿ ಅಡಗಿಸು",
        "import-noarticle": "ಆಮದು ಮಾಡಲು ಯಾವ ಪುಟವೂ ಇಲ್ಲ!",
        "import-nonewrevisions": "ಎಲ್ಲಾ ಬದಲಾವಣೆಗಳನ್ನೂ ಮುಂಚೆಯೆ ಆಮದು ಮಾಡಲಾಗಿದೆ.",
        "importlogpage": "ಆಮದುಗಳ ದಾಖಲೆ",
-       "import-logentry-upload": "ಫೈಲು ಅಪ್ಲೋಡ್ ಮೂಲಕ [[$1]] ಅನ್ನು ಆಮದು ಮಾಡಲಾಗಿದೆ",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಗಳು}}",
        "tooltip-pt-userpage": "ನಿಮ್ಮ ಸದಸ್ಯ ಪುಟ",
        "tooltip-pt-anonuserpage": "ನೀವು ಸಂಪಾದನೆ ಮಾಡುತ್ತಿರುವ ipಯ ಬಳಕೆದಾರ ಪುಟ",
        "duration-decades": "$1 {{PLURAL:$1|ದಶಕ|ದಶಕಗಳು}}",
        "duration-centuries": "$1 {{PLURAL:$1|ಶತಮಾನ|ಶತಮಾನಗಳು}}",
        "duration-millennia": "$1 {{PLURAL:$1|ಸಹಸ್ರಮಾನ|ಸಹಸ್ರಮಾನಗಳು}}",
-       "expand_templates_preview": "ಮುನ್ನೋಟ"
+       "expand_templates_preview": "ಮುನ್ನೋಟ",
+       "special-characters-group-latin": "ಲ್ಯಾಟಿನ",
+       "special-characters-group-greek": "ಗ್ರೀಕ್",
+       "special-characters-group-arabic": "ಅರೇಬಿಕ್",
+       "special-characters-group-persian": "ಪರ್ಶಿಯನ್",
+       "special-characters-group-hebrew": "ಹೀಬ್ರೂ",
+       "special-characters-group-bangla": "ಬಾಂಗ್ಲಾ",
+       "special-characters-group-tamil": "ತಮಿಳು",
+       "special-characters-group-telugu": "ತೆಲುಗು",
+       "special-characters-group-sinhala": "ಸಿಂಹಳ",
+       "special-characters-group-gujarati": "ಗುಜರಾತಿ",
+       "special-characters-group-devanagari": "ದೇವನಾಗರಿ",
+       "special-characters-group-thai": "ಥಾಯ್",
+       "special-characters-group-lao": "ಲಾವೋ",
+       "special-characters-group-khmer": "ಖ್ಮೇರ್"
 }
index 9494194..7c18c02 100644 (file)
        "recentchanges-summary": "이 페이지에서 위키의 최근 바뀜을 추적합니다.",
        "recentchanges-noresult": "지정한 조건과 일치하는 주어진 기간 동안 바뀜이 없습니다.",
        "recentchanges-feed-description": "이 피드에 위키의 최근 바뀜을 추적합니다.",
-       "recentchanges-label-newpage": "새로 만든 문서",
+       "recentchanges-label-newpage": "새 문서",
        "recentchanges-label-minor": "사소한 편집",
        "recentchanges-label-bot": "봇이 수행한 편집",
        "recentchanges-label-unpatrolled": "아직 점검하지 않은 편집",
index a1af0f4..c0536dd 100644 (file)
        "underline-never": "Qet",
        "underline-default": "Tercîhên lêgerokê",
        "editfont-default": "Tercîhên lêgerokê",
-       "sunday": "Yekşem",
-       "monday": "Duşem",
+       "sunday": "yekşem",
+       "monday": "duşem",
        "tuesday": "Sêşem",
        "wednesday": "Çarşem",
        "thursday": "Pêncşem",
        "friday": "În",
-       "saturday": "Å\9eemî",
+       "saturday": "Å\9femî",
        "sun": "Ykş",
        "mon": "Duş",
        "tue": "Sêş",
        "thu": "Pşm",
        "fri": "În",
        "sat": "Şem",
-       "january": "Rêbendan",
-       "february": "Reşemî",
-       "march": "Adar",
-       "april": "Avrêl",
-       "may_long": "Gulan",
-       "june": "Pûşper",
-       "july": "Tîrmeh",
-       "august": "Gelawêj",
-       "september": "Rezber",
-       "october": "Kewçêr",
-       "november": "Sermawez",
-       "december": "Berfanbar",
+       "january": "rêbendan",
+       "february": "reşemî",
+       "march": "adar",
+       "april": "avrêl",
+       "may_long": "gulan",
+       "june": "pûşper",
+       "july": "tîrmeh",
+       "august": "gelawêj",
+       "september": "rezber",
+       "october": "kewçêr",
+       "november": "sermawez",
+       "december": "berfanbar",
        "january-gen": "Rêbendan",
        "february-gen": "Reşemî",
        "march-gen": "Adar",
        "april-gen": "Avrêl",
-       "may-gen": "Gulan",
-       "june-gen": "Pûşper",
+       "may-gen": "gulan",
+       "june-gen": "pûşper",
        "july-gen": "Tîrmeh",
        "august-gen": "Gelawêj",
-       "september-gen": "Rezber",
+       "september-gen": "rezber",
        "october-gen": "Kewçêr",
        "november-gen": "Sermawez",
-       "december-gen": "Berfanbar",
+       "december-gen": "berfanbar",
        "jan": "rêb",
        "feb": "reş",
        "mar": "adr",
        "notextmatches": "Di nav sernivîsan de nehat dîtin.",
        "prevn": "{{PLURAL:$1|$1}} paş",
        "nextn": "{{PLURAL:$1|$1}} pêş",
+       "prev-page": "rûpela berî vê",
+       "next-page": "rûpela pêş",
        "prevn-title": "{{PLURAL:$1|result|Encamên}} pêştir $1",
        "nextn-title": "$1 {{PLURAL:$1|encama|encamên}} pêştir",
        "shown-title": "Li her rûpelê $1 {{PLURAL:$1|encam|encaman}} nîşan bide",
index d480ccf..df4b948 100644 (file)
        "uploaderror": "خطا د سوار کردن",
        "upload-recreate-warning": "'''زئنار: جانیایی که وه ای نومه یا پاکسا بیه یا جا وه جا بیه.'''\n\nسی رائتی، نومگه پاکساگری و جا وه جا کردن ای بلگه ها د هار:",
        "uploadtext": "دسی دئین جانیایی که  د دماتر سوار بینه روئیت وه  [[Special:FileList|نوم گه جانیایا]] . د نو سوارکردن  د [[Special:Log/upload|نوم گه سوارکردیا]] و پاکساگری جانیایا د [[Special:Log/delete|deletion log]] جاگئر موئه.\n\nنها یه که یه گل جانیانه سوار کردیت می تونیت د سه شکل هاری وه نه د بلگه یا وه کار بونیت:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' سی به کار بسن نسقه کامل جانیا\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' سی به کار بسن یه گل نسقه 200 پیکسلی  د جانیایی که ها د مینه یه گل جعوه  که ها د لا چپ نیسسه که د وه عبارت alt text چی توضیح وه کار بسه بیه\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' سی دروس کردن یه گل هوم پیوند سرراست وه جانیا بی یه که جانیا دیاری بکه نوم بلگه هاری سی سوارکرد جانیایا تازه استفاده بکیت.",
-       "upload-permitted": "جورا جانیا مجاز:$1.",
+       "upload-permitted": "جورا جانیا مجاز:$1 .",
        "upload-preferred": "جورا جانیا مجاز:$1.",
        "upload-prohibited": "جورا جانیا مجاز:$1.",
        "uploadlogpage": "سوارکرد",
        "restriction-level-all": "هر ریترازی",
        "undelete": "دیئن بلگه یا پاکسا بیه",
        "undeletepage": "دیئن و  ؤرگشتن بلگه یا پاکسا بیه",
+       "undeletepagetitle": "'''اوی چی که ها د نها د ور گرته نسقه یا پاکسا بیه [[:$1|$1]] ه'''.",
        "viewdeletedpage": "دیئن بلگه یا پاکسا بیه",
        "undeletepagetext": "{{PLURAL:$1|بلگه های پاکسا بیه|بلگه یا هاری پاکسا بینه}} ولی ایسه د اماییه جا {{PLURAL:$1|هئ|هان}} و {{PLURAL:$1|می تونه د نو زنه با|می‌ تونن د نو زنه بان}}.\nای اماییه جا ممکنه هر چن گری تمیس بوئه.",
        "undelete-fieldset-title": "د نو زنه کردن وانئریا",
+       "undeleteextrahelp": "سی زنه کردن همه ویرگارچه یا بلگه، هم جعوه یا حالی نه ول بکیت و دگمه '''''{{int:undeletebtn}}''''' نه بپورنیت.\nسی انجوم دئن د نو زنه کردن انتخاوی، جعوه ویایی که هان د ارتواط وا نسقه یا خوشو سی د نو زنه کردن نشو دار بکیت و دگمه '''''{{int:undeletebtn}}''''' بپورنیت.",
        "undeleterevisions": "$1 نسقه مال دیاری{{PLURAL:$1|بیه|بینه}}",
+       "undeletehistory": "ار ای بلگه نه د نو زنه بکیت، همه نسقه یا وه د ویرگارچه ش د نو زنه بوئن.\nار بلگه تازه یی وا نوم هومبراوری د گات پاکسا بیین دروس بیه با، نسقه یا د نو زنه بیه د ویرگارچه ره وندیاری می کن.",
+       "undeleterevdel": "ناپاکسا کردن بلگه یا د حال و باری که باعث پاکسا بیین بهرجایی د آخری نسقه بلگه یا جانیا با امکانش نئ.\nد ای حال و بار شما واس تازه تری نسقه پاکساگری بینه ئم د نو زنه بکیت.",
+       "undeletehistorynoadmin": "ای بلگه پاکسا بیه.\nدلیل پاکسا بیین ای بلگه واگرد مشخصات کاریاریایی که دما د پاکسا کردن ای بلگه نه ویرایشت دئنه ها د چکسته هاری.\nنیسسه راستیکی ای ویرایشت پاکسا بیه و فقط ها د دسرس دیوونداریا.",
        "undelete-revision": "نسقه پاکسا بیه $1 (د ویرگار$4 ساعت $5) وه دس $3:",
+       "undeleterevision-missing": "وانئری یا گم بیه یا نامعتوره.\nشایت هوم پیوند شما دروس نبوئه یا یه که ای وانئری د اماییه جا پاکسا بیه یا بازجست بیه.",
        "undelete-nodiff": "وانئری دماتری پیدا نبیه.",
        "undeletebtn": "د نو زنه کردن",
        "undeletelink": "بوين/دوواره آماده با",
        "undeletedrevisions-files": "{{PLURAL:$1|1 وانئری|$1 وانئریا}} و{{PLURAL:$2|1 جانیا|$2 جانیا}} د نو زئنه بینه.",
        "undeletedfiles": "{{PLURAL:$1|1 جانیا|$1 جانیایا}} د نو زنه بیه",
        "cannotundelete": "زنه کردن انجوم نبی:$1",
+       "undeletedpage": "'''$1 د نو زنه بی'''\n\nسی دیئن پهرستنومه پاکساکاریا و د نو زنه کردنیا ایسنی روئیت د [[Special:Log/delete|پهرستنوم پاکساکاری]].",
        "undelete-header": "سی دیئن بلگه یا پاکسا بیه ایسنی [[Special:Log/delete|پهرستونمه پاکسا بیین]] نه سیل بکیت.",
        "undelete-search-title": "بلگه یا پاکسا بیه نه پی جوری کو",
        "undelete-search-box": "پی جوری بلگه یا پاکسا بیه",
        "undelete-search-prefix": "بلگه یایی که وا شرو بیه نشو بیه:",
        "undelete-search-submit": "پی جوری",
        "undelete-no-results": "هیچ بلگه یکی بیینی د مال دیارکن پاکسا بیه یا نئ.",
+       "undelete-filename-mismatch": "نبوئه نسقه $1 نه د نو زنه بکی: نوم جانیا واش یکی نئ.",
+       "undelete-bad-store-key": "نبوئه نسقه $1 نه د نو زنه بکی: جانیا وه دما د پاکسا کردن د بین رئته.",
        "undelete-cleanup-error": "خطا د پاکسا کردن ویرگارچه وه کار نگرته بیه د«$1».",
+       "undelete-missing-filearchive": "نبوئه ویرگارچه شماره $1 د نو زنه بکی سی یه که دونسمنیاش د رسینه جا نیئن.\nیا شایت د دماتر د نو زنه بینه.",
        "undelete-error": "خطا بلگه ای که نبوئه پاکساش بکی",
        "undelete-error-short": "خطا پاک نبیئن جانیا:$1",
        "undelete-error-long": "د گات زنه کردن جانیا یه گل خطا پیش اوما:\n\n\n$1",
+       "undelete-show-file-confirm": "آیا یه دل بئیته که میهایت یه گل نسقه پاکسا بیه د جانیا \"<nowiki>$1</nowiki>\" که ها د ویرگار $2 ساعت $3 نه سیل بکیت؟",
        "undelete-show-file-submit": "هری",
        "undelete-revision-row": "$1 $2 ($3) $4 . . $5 $6 $7 $8 $9",
        "namespace": "نوم جا:",
        "invert": "انتخاو برعسك بوئه",
        "tooltip-invert": "د ری ای جعوه بپورنیت و آلشتیایی نه که د مینجا نوم ورگه انتخاو بیه انجوم بینه قام بکیت(و ار نوم ورگه شریکی وارسی بیه)",
+       "tooltip-whatlinkshere-invert": "ای جعون نه سی نهو کردن هوم پیوند بلگه یایی که نوم جاشو انتخاو بیه، انتخاو بکیت.",
        "namespace_association": "نوم جایا یکاگرته",
        "tooltip-namespace_association": "ای جعوه نه وارسی بکیت ای جعوه د ور گرته چک چنه یا داسون نوم ورگه شریکی و نوم ورگه انتخاو بیه ئه",
        "blanknamespace": "اصلی",
        "sp-contributions-logs": "نیسنن رخ ونیا",
        "sp-contributions-talk": "چك چنه",
        "sp-contributions-userrights": "دیوونداری حقوق کاریار",
+       "sp-contributions-blocked-notice": "د دسرسی ای کاریا د ایسنی نهاگری بیه.\nآخری برشت د پهرستنومه نهاگری ها د سرچشمه هاری:",
+       "sp-contributions-blocked-notice-anon": "ای آی پی ایسنی دسرسی ناره.\nآخری برشت د پهرستنومه ها د سرچشمه هاری:",
        "sp-contributions-search": "سی هومیاریا پی جور با",
        "sp-contributions-username": "نوم نشون آی پی يا نوم كاروری:",
        "sp-contributions-toponly": "فقط ویرایشتیایی که جزئه آخرین دوواره دیئن هئین نشو بیه",
        "unblock": "کاریار نهاگری نبیه",
        "blockip": "نهاگری{{GENDER:$1|کاریار}}",
        "blockip-legend": "نهاگری کاریار",
+       "blockiptext": "نومگه بلگه هاری نه سی نهاگری د دسرسی ویرایشت یه گل تیرنشون آی پی وا نوم کاریاری مشخص وه کار بئیریت.\nای کار فقط فقط واس سی نهاگری د خراوکاری و د پایه [[{{MediaWiki:Policy-url}}|سیاست نهاگری]] انجوم با.\nدلیل دیاری نه د هار بوئیت (مثلند وا گوتن بلگه یایی که دشو خراوکاری بیه).",
        "ipaddressorusername": "نوم نشون آی پی يا نوم كاروری:",
        "ipbexpiry": "تموم بين:",
        "ipbreason": "دليل:",
+       "ipbreason-dropdown": "*دلیلیا جاافتائه سی نهاگری\n**دئن دونسمنیا غلط\n**پاکسا کردن دونسمنیا خو د بلگه یا\n**هرزه نیسی د طریق نیسنن هوم پیوند تکراری د دیارگه یا\n**نیسنن چرند و چار یا نیسسه یا بی مئنی د بلگه یا\n**سهم ونن د کاریاریا هنی\n**وه کار گرتن چن گل حساو کاریاری\n**نوم کاریاری گن",
        "ipb-hardblock": "پیشگری د ویرایشت کردن کاریاریی که د طریق ای تیرنشون آی پی وامین اومانه.",
        "ipbcreateaccount": "نهاگری دروس کردن حساو",
        "ipbemailban": "نهاگرتن کاریار د کل کردن انجومانامه",
        "blockipsuccesssub": "قلف کردن د خوئی انجوم بی",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] بسته بیه.<br />\nسی وارسی بسته بیه یا [[Special:BlockList|نوم گه بسته بیه یا ]] نه سیل بکیت.",
        "ipb-blockingself": "شما د حال نهاگری خوتونیت! آیا دلراس هیئت که میهایت چنی کاری انجوم بیتو؟",
+       "ipb-confirmhideuser": "شما د حال و بار بستن یه گل کاریاریت که سی وه «نهوسازی کاریار» کنشتیار بیه. ای کار نوم کاریار نه د همه نومگه یا و سیائه یا نهو می که، آیا یه دلیت که میهایت ای کار نه انجوم بئیت؟",
+       "ipb-confirmaction": "ار د راستکی یه دل بئیته که میهایت ونه انجوم بئیت، لطف بکیت زمینه \"{{int:ipb-confirm}}\" ونه د هار وارسی بکیت.",
        "ipb-edit-dropdown": "ویرایشت دلیلیا نهاگرتن",
        "ipb-unblock-addr": "وا کردن قلف $1",
        "ipb-unblock": "واز کردن نوم کاریاری یا تیرنشون آی پی",
        "ipb-blocklist": "دیئن نهاگرتن یا ایسنی",
        "ipb-blocklist-contribs": "هومیاریا $1",
        "unblockip": "کارور منع نبیه",
+       "unblockiptext": "سی ؤرئشت دئن دسرسی نیسسن د یه گل تیرنشون آی پی یا نوم کاریاری نهاگری بیه نوم بلگه هاری نه وه کار بئیریت.",
        "ipusubmit": "ای قلف نه ؤردار",
        "unblocked": "دسرسی [[User:$1|$1]] دوواره برقرار بیه.",
        "unblocked-range": "$1 وا بیه.",
        "change-blocklink": "اجازه نديئن سی  آلشت",
        "contribslink": "هومیاریا",
        "emaillink": "انجومانامه نه کل کو",
+       "autoblocker": "وه خود انجومن بسه بی سی یه که آی پی شما د ایسنی وه دس کاریار «[[User:$1|$1]]» وه کار گرته بیه.\nدلیل نهاگری $1 ینه \"$2\"",
        "blocklogpage": "قلف",
+       "blocklog-showlog": "تیرنشون ای آی پی دماتر نهاگیری بیه.\nنهاگری ای پهرستنومه وا سرچشمه هاری دروس بیه:",
+       "blocklog-showsuppresslog": "تیرنشون ای آی پی دماتر نهاگیری بیه.\nنهاگری ای پهرستنومه وا سرچشمه هاری دروس بیه:",
        "blocklogentry": " [[$1]] وا یه گل وخت تموم بیئن $2 و $3  قلف بیه",
        "reblock-logentry": "میزوکاری سی نهاگری[[$1]] آلشت بیه سی آخر نهاگری د $2 $3",
+       "blocklogtext": "ای پهرستنومه سی نهاگری یا واز کردن دسرسی کاریاریائه.\nتیرنشونیا آی پی که خود انجومن نهاگری بینه د ایسنی نومگه کاری نبینه.\nسی نومگه نهاگریا و بسه بینیا د ایسنی روئیت د [[Special:BlockList|نومگه نهاگری بیه یا]].",
        "unblocklogentry": "وا کردن قلف $1",
        "block-log-flags-anononly": "فقط کاریاریایی که نادیارن",
        "block-log-flags-nocreate": "حساو راس کردن عاجز بیه.",
        "range_block_disabled": "درس کردن بسن یه گل پوشگر وه دس دیوونداریا ناکنشتگر بیه.",
        "ipb_expiry_invalid": "گات تموم بیین نامعتوره.",
        "ipb_expiry_temp": "نهاگری نوم کاریاریا قام بیه واس همیشه یی با.",
+       "ipb_hide_invalid": "نبوئه ای حساو نه پاکساکاری کرد؛ ای حساو بیشتر د {{PLURAL:$1|یه گل ویرایشت|$1 ویرایشتیا}} نه د خوش داره.",
        "ipb_already_blocked": "\"$1\" ایسه نهاگری بیه.",
        "ipb-needreblock": "$1 د دماتر نهاگری بیه. آیا میهایت میزوکاری ونه آلشت بیتو؟",
        "ipb-otherblocks-header": "هنی{{PLURAL:$1|نهاگرتن|نهاگرتنیا}}",
+       "unblock-hideuser": "‫سی یه که حساو کاریاری ای کاریار نهو بیه شما نمی تونیت ونه واز بکیت.‬",
        "ipb_cant_unblock": "خطا:نهاگری د نوم دیارکن $1 دیار نئ.شایت وه د ایسنی نهاگریش د بین رئته.",
+       "ipb_blocked_as_range": "خطا: تیرنشون آی‌ پی $1 سر راست نهاگری نبیه و نبوئه وازش بکیت.\nای تیرنشون واگرد پوشگر $ نهاگری بیه وا بیینی یه.",
        "ip_range_invalid": "پوشگر نامعتور آی پی",
        "ip_range_toolarge": "نهاگری پوشینه یا گپتر $1/ مجاز نئ.",
        "proxyblocker": "قلف کننه پروکسی",
+       "proxyblockreason": "تیرنشون آی پی شما نهاگری بیه سی یه مال یه گل پروکسی آزاده.\nلطف بکیت وا انجومکار اینترنتی خوتو یا حامینکار کسمی خوتو پیوند بگریت و ونونه د مشگل امنتی گن خوتو وارسیار بکیت.",
        "sorbs": "دی ان اس بی ال",
+       "sorbsreason": "تیرنشون آی پی شما وه دس DNSBL  وه کار گرته وه دس {{SITENAME}} چی یه گل پروکسی آزاد گزارشت بیه.",
+       "sorbs_create_account_reason": "تیرنشون آی پی شما وه دس DNSBL  وه کار گرته وه دس {{SITENAME}} چی یه گل پروکسی آزاد گزارشت بیه.\nشما نتونیت یه گل حساو راس بکیت.",
+       "xffblockreason": "تیرنشون آی پی ها د X-Forwarded-For header و پروکسی شما یا رسینه گایی که شما ونه وه کار مئیریت نهاگری بیه. دلیل نهاگری وه: $1",
+       "cant-see-hidden-user": "کاریاری که شما میهایت دش نهاگری بکیت د دماتر نهاگری بیه و نهو بیه.\nسی یه که شما وه نهوکاری کاریار دسرسی ناریت نمی تونیت نهاگری کاریار نه دسکاری بکیت.",
+       "ipbblocked": "شما نمی تونیت د دسرسی کاریاریا هنی نهاگری بکیت یا ونه واز بکتی سی یه د دسرسی خوتو نهاگری بیه.",
        "ipbnounblockself": "شما صلادار وارکدن دسرسی خوتو نییت.",
        "lockdb": "قلف کردن رسینه گا",
        "unlockdb": "رسینه گا قلف نبیه",
        "fileduplicatesearch-filename": "نوم جانیا:",
        "fileduplicatesearch-submit": "پی جوری",
        "fileduplicatesearch-info": "$1 × $2 pixel<br />انازه جانیا: $3<br />MIME type: $4",
+       "fileduplicatesearch-noresults": "جانیایی وا نوم «$1» یافت نبی.",
        "specialpages": "بلگيا ويجه",
        "specialpages-note-top": "میراث",
        "specialpages-group-maintenance": "گزارشتیا واداشتن",
        "tags-title": "سردیسیا",
        "tags-tag": "نوم سردیس",
        "tags-display-header": "دیاری کردن د نوم گه آلشتیا",
+       "tags-description-header": "توضیح کامل هومبراور",
        "tags-source-header": "سرچشمه",
        "tags-active-header": "کنشتگره؟",
        "tags-hitcount-header": "آلشتیا سردیس دار",
        "api-error-mustbeloggedin": "شما سی سوارکردن فایلیا با بیایت وامین",
        "api-error-unclassified": "یه گل خطا نادیار ری ون کرده.",
        "api-error-unknown-code": "خطا نادیار:\"$1\".",
+       "api-error-unknown-error": "خطا مینونه: د گاتی که شما د حال و بار تلاش سی سوارکرد جانیاتو بییت، یه گل اشتوا پیش اوما.",
        "api-error-unknown-warning": "هشدار نادیار:\"$1\".",
        "api-error-unknownerror": "خطا نادیار:\"$1\".",
        "api-error-uploaddisabled": "سوار کردن د ای ویکی ناکشتگر بیه.",
+       "api-error-verification-error": "شایت جانیا خراو بیه، یا پسون غلط داشتوئه.",
        "duration-seconds": "$1 {{PLURAL:$1|ثانیه|ثانیه یا}}",
        "duration-minutes": "$1 {{PLURAL:$1|دیقه|دیقه یا}}",
        "duration-hours": "$1 {{PLURAL:$1|ساعت |ساعتیا}}",
        "duration-decades": "$1 {{PLURAL:$1|دهه|دهه یا}}",
        "duration-centuries": "$1 {{PLURAL:$1|سده|سده یا}}",
        "duration-millennia": "$1 {{PLURAL:$1|میلینیوم|ملینا}}",
+       "rotate-comment": "عسگ وا $1 {{PLURAL:$1|گرینج|گرینج}} ساعت گرد قر حرده",
+       "limitreport-title": "داده یا جانیاکار وااشکافت کار:",
        "limitreport-cputime": "گات وه کار گرتن سی پی یو",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|ثانیه|ثانیه یا}}",
        "limitreport-walltime": "زمون راستکی وه کار گرتن",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|ثانیه|ثانیه یا}}",
+       "limitreport-ppvisitednodes": "شمارش یار گره دیئه بیه دما پردازشتکار",
        "limitreport-ppvisitednodes-value": "$1/$2",
+       "limitreport-ppgeneratednodes": "شمارش یار گره تولیدی دما پردازشتکار",
        "limitreport-ppgeneratednodes-value": "$1/$2",
+       "limitreport-postexpandincludesize": "انازه د ور گرته نها گپ کلونکاری",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|بایت|بایتیا}}",
+       "limitreport-templateargumentsize": "انازه چوئه آرگومان",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|بایت|بایتیا}}",
+       "limitreport-expansiondepth": "بیشتری پی یا گپ کلونکاری",
        "limitreport-expansiondepth-value": "$1/$2",
        "limitreport-expensivefunctioncount": "انازه انجومگریا وااشکافتکار پر مصرف",
        "limitreport-expensivefunctioncount-value": "$1/$2",
        "expandtemplates": "گپ کلون کردن چوئه یا",
+       "expand_templates_intro": "ای بلگه ویجه یه گل نیسسه نه گرته و همه چوئه یایی که هان د وه ونونه و حال و بار ؤرئشتن گپ کلونکاری می که همچنی. آلشیاریا وااشکافت کاری چی <code><nowiki>{{</nowiki>#language:…}}</code> و آلشتکنیا چی <code><nowiki>{{</nowiki>CURRENTDAY}}</code> نه ئم گپ کلونکاری می که— د راستکی تقریون هر چی نه که ها د میلات دو گل آکولات. ای کار وا واحونی کاری ریترازجا وااشکافت مربوط د خود ویکی وارسگر انجوم دیار موئه.",
        "expand_templates_title": "داسون، سی {{FULLPAGENAME}} و چیا هنی:",
        "expand_templates_input": "نیسسه درینده:",
        "expand_templates_output": "نتیجه",
        "expand_templates_generate_xml": "نشو دئن دار وااشکافتکاری XML",
        "expand_templates_generate_rawhtml": "نشو دئن اچ‌ تی‌ ام‌ ال خام",
        "expand_templates_preview": "پيش سيل",
+       "expand_templates_preview_fail_html": "<em>سی یه که{{SITENAME}} تا یه گل HTML خام کنشتیار و یه گل د دس رئتن دونسمنیا نشسجا هئ، پیش سیل وا داسون یه انجومکاری احتیاطی ری وه ری چل کاریا جاوا نیسسه نهو بیه.</em>\n\n<strong>ار ای تلاش پیش سیل مشروعه، لطف بکیت د نو تلاش بکیت. ار هنی ئم کار نمی که، تلاش بکیت ری [[Special:UserLogout|اومائن وه در د سامونه]] بپورنیت و د نو روئیت وامین سامونه.",
+       "expand_templates_preview_fail_html_anon": "<em>سی یه که{{SITENAME}} تا یه گل HTML خام کنشتیار و یه گل د دس رئتن دونسمنیا نشسجا هئ، پیش سیل وا داسون یه  احتیاطی ری وه ری چل کاریا جاوا نیسسه نهو بیه.</em>\n\n<strong>ار ای تلاش پیش سیل مشروعه، لطف بکیت د نو تلاش بکیت. ار هنی ئم کار نمی که، تلاش بکیت ری [[Special:UserLogout|اومائن وه در د سامونه]] بپورنیت و د نو روئیت وامین سامونه.",
        "pagelanguage": "بلگه انتخاو زون",
        "pagelang-name": "بلگه",
        "pagelang-language": "زون",
        "action-pagelang": "آلشت دئن زون بلگه",
        "log-name-pagelang": "آلشت دئن زون پهرستنومه",
        "log-description-pagelang": "ای پهرستنومه در بلگه زونا آلشت گرته.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2| آلشتکاری بی}} زون بلگه سی $3  د $4  وه $5 .",
+       "default-skin-not-found-no-skins": "پویه پیش فرض سی ویکی شما د <code>$wgDefaultSkin</code> جاگر نبیه و د اوچه وا داسون <code>$1</code>، هئیش دیاری نمی که.\n\nشما پوسه یا نپورسیته.\n\n:ار ویکی وارسگر نه د نو وه هنگوم سازی کردیته یا ونه د نو بپورسیته:\n:شایت د گیتیا یا کند بیین سرچشمه واگرد روشتیا هنی پورسن نه وه کار گرتیته. تیه داشتوئیت کهMediaWiki 1.24 یا تازه تر د جانیا اصلی هیچ پوسه یی ناشتوئن.\nتلاش بکیت چن گل پوسه د [https://www.mediawiki.org/wiki/Category:All_skins جانیا پوسه یا ویکی وارسگر]، نه واگرد:\n:*گرتن [https://www.mediawiki.org/wiki/Download پورسیا تاربال]، که وا چن گل پوسه و دما دیسه ای کار بکیت. شما می می تونیت پوسه <code>skins/</code> نه د وه وردار بدیس بکیت.\n:*کلون کردن یه گل د <code dir=\"ltr\">mediawiki/skins/*</code> د ریپوزیتوری د جانیا <code>skins/</code> ویکی وارسگرتو.\n:ار یه گل گپ کلونکاریا ویکی وارسگر هئیت، انجوم دئن ای کار نواس ضدیتی وا ریپوزیتوری گیت شما داشتوئه. سی دونسمنیا هنی و کنشتیار کردن پوسه یاو انتخاو ونو سی پیش فرض بیین [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: میزونکاری پوسه] نه سیل بکیت.",
        "default-skin-not-found-row-enabled": "* <رازینه>$1</رازینه> / $2 ('''ناکنشتگر بیه''')",
        "default-skin-not-found-row-disabled": "* <رازینه>$1</رازینه> / $2 ('''ناکنشتگر بیه''')",
        "mediastatistics": "آماریا وارسگر",
+       "mediastatistics-summary": "آماریایی که دباره جوریا یه گل جانیا وه هنگوم بیه . ای چی فقط د ور گرته آخری نسقه جانیائه. نسقه یا دمایی یا پاکسا بینه یا جیاوازی دارن.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 بایت|$1 بایتیا}} ($2; $3%)",
        "mediastatistics-table-mimetype": "جورMIME:",
        "mediastatistics-table-extensions": "دمادیسیا ممکن",
        "mediastatistics-header-text": "نیسسه دار",
        "mediastatistics-header-executable": "اجرا کردنیا",
        "mediastatistics-header-archive": "قالویا جم بیه",
+       "json-warn-trailing-comma": "$1 ویرگار که ها د نها جی سون {{PLURAL:$1|پاکسا بی}}.",
+       "json-error-unknown": "مشگل د جی سون بی. خطا: $1",
+       "json-error-depth": "بیشترونه پی یا دماداری رد بیه",
        "json-error-state-mismatch": "جی‌ سن نادرست یا ناقص",
+       "json-error-ctrl-char": "خطا نیسه یار کنترلی، شایت غلط رازینه کاری بیه",
        "json-error-syntax": "خطا دستوری",
+       "json-error-utf8": "نیسه یاریا غلط یو تی‌ اف-۸، شایت غلط رازینه کاری بیه",
+       "json-error-recursion": "ری کردن یه گلی یا بیشتر د انازه یی که رازینه کاری بوئه",
        "json-error-inf-or-nan": "ارزایشتیا INF یا NAN یه گل یا بیشتر د وه د انازه یی که رازینه کاری بیه",
        "json-error-unsupported-type": "یه گل ارزایشت د جوری که نبوئه رازینه کاری با وتو دئه بیه",
        "headline-anchor-title": "هوم پیوند کردن د ای بهرجا",
index a188041..da7d2e9 100644 (file)
        "linksearch-error": "Џокер-знаците може да се користат само на почетокот во името на домаќинот.",
        "listusersfrom": "Прикажи корисници почнувајќи од:",
        "listusers-submit": "Прикажи",
-       "listusers-noresult": "Ð\9dе Ðµ Ð¿Ñ\80онаÑ\98ден корисник.",
+       "listusers-noresult": "Ð\9dе Ð¿Ñ\80онаÑ\98дов Ð½Ð¸Ðµден корисник.",
        "listusers-blocked": "(блокиран)",
        "activeusers": "Список на активни корисници",
        "activeusers-intro": "Ова е список на корисници кои биле на некој начин активни во последните {{PLURAL:$1|еден ден|$1 дена}}.",
        "activeusers-from": "Прикажи корисници почнувајќи од:",
        "activeusers-hidebots": "Скриј ботови",
        "activeusers-hidesysops": "Скриј администратори",
-       "activeusers-noresult": "Нема пронајдено корисници.",
+       "activeusers-noresult": "Не пронајдов ниеден корисник.",
        "listgrouprights": "Права на кориснички групи",
        "listgrouprights-summary": "Следи список на кориснички групи утврдени на ова вики, заедно со нивните придружни права на пристап.\nМожно е да има [[{{MediaWiki:Listgrouprights-helppage}}|дополнителни информации]] за некои права.",
        "listgrouprights-key": "Легенда:\n* <span class=\"listgrouprights-granted\">Доделено право</span>\n* <span class=\"listgrouprights-revoked\">Одземено право</span>",
        "emailccsubject": "Копија од вашата порака до $1: $2",
        "emailsent": "Писмото е испратено",
        "emailsenttext": "Писмото е испратено.",
-       "emailuserfooter": "Оваа е-порака беше пратена од $1 до $2 со помош на функцијата Е-пошта на {{SITENAME}}.",
+       "emailuserfooter": "$1 го испрати писмово на $2 со помош на функцијата „{{int:emailpage}}“ на {{SITENAME}}.",
        "usermessage-summary": "Оставете системска порака.",
        "usermessage-editor": "Системски гласник",
        "watchlist": "набљудувања",
        "feedback-error1": "Грешка: Непрепознаен резултат од извршникот",
        "feedback-error2": "Грешка: Уредувањето не успеа",
        "feedback-error3": "Грешка: Извршникот не одговара",
+       "feedback-error4": "Грешка: Не можам да објавам под дадениот наслов",
        "feedback-message": "Порака:",
        "feedback-subject": "Наслов:",
        "feedback-submit": "Поднеси",
index e7922b4..31d47c4 100644 (file)
        "emailccsubject": "Copia d' 'a mmasciata tua 'a $1: $2",
        "emailsent": "Mmasciata e-mail mannata",
        "emailsenttext": "'A mmasciata d' 'a toja s'è mannata.",
-       "emailuserfooter": "Chista mmasciata e-mail è stata mannata 'a $1 a $2 p' 'a funziona \"Mmasciata e-mail a l'utente\" 'e {{SITENAME}}.",
+       "emailuserfooter": "Chista mmasciata e-mail è stata mannata 'a $1 a $2 p' 'a funziona \"{{int:emailpage}}\" 'e {{SITENAME}}.",
        "usermessage-summary": "Lassanno na mmasciata 'e sistema.",
        "usermessage-editor": "Mmasciatore d' 'o sistema",
        "watchlist": "Paggene cuntrullate",
        "feedback-error1": "Errore: Risultato nun aspettato 'a ll'API",
        "feedback-error2": "Errore: Cagnamiento scassato",
        "feedback-error3": "Errore: Ll'API nun risponne",
+       "feedback-error4": "Errore: Nun se può miette 'o commento p' 'o titulo",
        "feedback-message": "Mmasciata:",
        "feedback-subject": "Suggietto:",
        "feedback-submit": "Manna",
index b80a22e..f54cc78 100644 (file)
        "file-thumbnail-no": "De bestaandsnaam begint mit <strong>$1</strong>.\nDit is warschienlik n verkleinde aofbeelding ''(overzichsaofbeelding)''.\nA'j disse aofbeelding in volle grootte hebben voeg t dan toe, wiezig aanders de bestaandsnaam.",
        "fileexists-forbidden": "n Bestaand mit disse naam besteet al, en kan niet overschreven wörden.\nVoeg t bestaand toe onder n aandere naam.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Der besteet al n bestaand mit disse naam in de gezamenlike bestaandslokasie.\nA'j t bestaand evengoed op willen sturen, gao dan weerumme en kies n aandere naam.\n[[File:$1|thumb|center|$1]]",
-       "file-exists-duplicate": "Dit bestaand is liek alleens as {{PLURAL:$1|t volgende bestaand|de volgende bestaanden}}:",
-       "file-deleted-duplicate": "n Bestaand dat liek alleens is an dit bestaand ([[:$1]]) is eerder al vortedaon.\nBekiek t vortdologboek veurda'j verdan gaon.",
+       "file-exists-duplicate": "Dit bestaand is gelieke an {{PLURAL:$1|t volgende bestaand|de volgende bestaanden}}:",
+       "file-deleted-duplicate": "n Bestaand dat gelieke is an dit bestaand ([[:$1]]) is eerder al vortedaon.\nBekiek t vortdologboek veurda'j vedan gaon.",
        "uploadwarning": "Waorschuwing",
        "uploadwarning-text": "Pas de bestaandsbeschrieving hieronder an en probeer t opniej",
        "savefile": "Bestaand opslaon",
        "nolinkstoimage": "Bestaand is niet in gebruuk.",
        "morelinkstoimage": "[[Special:WhatLinksHere/$1|Meer verwiezingen]] naor dit bestaand bekieken.",
        "linkstoimage-redirect": "$1 (bestaandsdeurverwiezing) $2",
-       "duplicatesoffile": "{{PLURAL:$1|t Volgende bestaand is|De volgende $1 bestaanden bin}} liek alleens as dit bestaand ([[Special:FileDuplicateSearch/$2|meer informasie]]):",
+       "duplicatesoffile": "{{PLURAL:$1|t Volgende bestaand is|De volgende $1 bestaanden bin}} gelieke an dit bestaand ([[Special:FileDuplicateSearch/$2|meer informasie]]):",
        "sharedupload": "Dit is n edeeld bestaand op $1 en ku'j oek gebruken veur aandere projekten.",
        "sharedupload-desc-there": "Dit is n edeeld bestaand op $1 en ku'j oek gebruken veur aandere projekten. Bekiek de [$2 beschrieving van t bestaand] veur meer informasie.",
        "sharedupload-desc-here": "Dit is n edeeld bestaand op $1 en ku'j oek gebruken veur aandere projekten. De [$2 beschrieving van t bestaand] dergindse, steet hieronder.",
        "fileduplicatesearch-filename": "Bestaandsnaam:",
        "fileduplicatesearch-submit": "Zeuken",
        "fileduplicatesearch-info": "$1 × $2 beeldpunten<br />Bestaandsgrootte: $3<br />MIME-type: $4",
-       "fileduplicatesearch-result-1": "Der bin gien bestaanden die liek alleens bin as \"$1\".",
-       "fileduplicatesearch-result-n": "Der {{PLURAL:$2|is één bestaand|bin $2 bestaanden}} die liek alleens bin as \"$1\".",
+       "fileduplicatesearch-result-1": "Der bin gien bestaanden die gelieke bin an \"$1\".",
+       "fileduplicatesearch-result-n": "Der {{PLURAL:$2|is één bestaand|bin $2 bestaanden}} die gelieke bin an \"$1\".",
        "fileduplicatesearch-noresults": "Der is gien bestaand mit de naam \"$1\" evunnen.",
        "specialpages": "Spesiale ziejen",
        "specialpages-note-top": "Legenda",
index 1878fe7..04b979d 100644 (file)
        "emailccsubject": "Còpia dël mëssagi mandà a $1: $2",
        "emailsent": "Mëssagi eletrònich mandà",
        "emailsenttext": "Sò mëssagi eletrònich a l'é stàit mandà",
-       "emailuserfooter": "Ës mëssagi eletrònich a l'é stàit mandà da $1 a $2 con la fonsion «Mandé un mëssagi eletrònich a l'utent» ëd {{SITENAME}}.",
+       "emailuserfooter": "Ës mëssagi eletrònich a l'é stàit mandà da $1 a $2 con la fonsion «{{int:emailpage}}» ëd {{SITENAME}}.",
        "usermessage-summary": "A l'ha lassà un mëssagi ëd sistema.",
        "usermessage-editor": "Mëssagerìa ëd sistema",
        "watchlist": "Ròba che as ten sot-euj",
        "feedback-error1": "Eror: Arzultà ëd l'API nen arconossù",
        "feedback-error2": "Eror: Modìfica falìa",
        "feedback-error3": "Eror: gnun-e rispòste da l'API",
+       "feedback-error4": "Eror: Impossìbil publiché al tìtol ëd sugeriment dàit",
        "feedback-message": "Mëssagi:",
        "feedback-subject": "Soget:",
        "feedback-submit": "Spediss",
index 1c1c8d6..3a0e736 100644 (file)
        "wrongpassword": "A palavra-passe que introduziu é inválida. Tente novamente, por favor.",
        "wrongpasswordempty": "A palavra-passe não foi introduzida. \nIntroduza-a, por favor.",
        "passwordtooshort": "A palavra-passe deve ter no mínimo $1 {{PLURAL:$1|carácter|caracteres}}.",
+       "passwordtoolong": "A palavra-passe deve exceder $1 {{PLURAL:$1|carácter|caracteres}}.",
        "password-name-match": "A sua palavra-passe tem de ser diferente do seu nome de utilizador.",
        "password-login-forbidden": "Foi proibido o uso deste nome de utilizador e palavra-passe.",
        "mailmypassword": "Reiniciar a palavra-passe",
        "notextmatches": "Não foi possível localizar, no conteúdo das páginas, o termo pesquisado",
        "prevn": "{{PLURAL:$1|anterior|$1 anteriores}}",
        "nextn": "{{PLURAL:$1|posterior|$1 posteriores}}",
+       "prev-page": "página anterior",
+       "next-page": "página seguinte",
        "prevn-title": "$1 {{PLURAL:$1|resultado anterior|resultados anteriores}}",
        "nextn-title": "{{PLURAL:$1|próximo|próximos}} $1 {{PLURAL:$1|resultado|resultados}}",
        "shown-title": "Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página",
        "emailccsubject": "Cópia da sua mensagem para $1: $2",
        "emailsent": "Mensagem enviada",
        "emailsenttext": "A sua mensagem foi enviada.",
-       "emailuserfooter": "Esta mensagem foi enviada por $1 para $2 através da opção \"Contactar este utilizador\" em {{SITENAME}}.",
+       "emailuserfooter": "Esta mensagem foi enviada por $1 para $2 através da opção \"{{int:emailpage}}\" em {{SITENAME}}.",
        "usermessage-summary": "Deixar mensagem de sistema.",
        "usermessage-editor": "Editor de mensagens de sistema",
        "watchlist": "Páginas vigiadas",
        "feedback-error1": "Erro: O resultado da API não foi reconhecido",
        "feedback-error2": "Erro: A edição falhou",
        "feedback-error3": "Erro: A API não responde",
+       "feedback-error4": "Erro: Não foi possível enviar o seu comentário sobre o título selecionado",
        "feedback-message": "Mensagem:",
        "feedback-subject": "Assunto:",
        "feedback-submit": "Enviar",
index f0ba941..65792cd 100644 (file)
        "exif-locationdestcode": "Code of location depicted. Typically this is an ISO country code, but the IPTC-iim standard also defines other codes like XSP for outer space. See appendix D (and tag 2:100) of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf",
        "exif-objectcycle": "Time of day that media is intended for. Either morning only, evening only, or all day. Typically only used for news related things that might only be broadcast at a specific time of day.\n\nSee also:\n* {{msg-mw|Exif-objectcycle-a}}\n* {{msg-mw|Exif-objectcycle-p}}\n* {{msg-mw|Exif-objectcycle-b}}",
        "exif-contact": "Contact information of the person responsible for the image.",
-       "exif-writer": "The person who wrote the caption of the image. See Description Writer on page 18 of http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf",
+       "exif-writer": "The person who wrote the caption of the image. See Description Writer on page 18 of http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf\n{{Identical|Writer}}",
        "exif-languagecode": "Language of image/media.\n\nThis is taken from IPTC-iim 2:135 and XMP's dc:language.\n{{Identical|Language}}",
        "exif-iimversion": "IIM version number. Version of information interchange 2:xx records. 4 is current version. 2 is often seen as well. This is the value stored 2:00 field (Note, iptc-iim also stores a model version in 1:00. This version field displays the 2:00 record only)",
        "exif-iimcategory": "Primary Category of image (or other media). Technically supposed to be limited to 3 characters, however that is not always followed. Some common 3 letter category abbreviations are expanded by mediawiki. Similar to {{msg-mw|exif-keywords}}.\n{{Identical|Category}}",
index 38a5e5a..56a2eed 100644 (file)
        "emailccsubject": "Kopija tvojega sporočila iz $1: $2",
        "emailsent": "E-pismo je poslano!",
        "emailsenttext": "E-pismo je poslano.",
-       "emailuserfooter": "To e-poštno sporočilo je bilo poslano od $1 uporabniku $2 preko funkcije »{{int:emailpage}}« na {{GRAMMAR:dative|{{SITENAME}}}}.",
+       "emailuserfooter": "To e-poštno sporočilo je bilo poslal(-a) $1 uporabniku $2 s funkcijo »{{int:emailpage}}« na {{GRAMMAR:dative|{{SITENAME}}}}.",
        "usermessage-summary": "Pusti sistemsko sporočilo.",
        "usermessage-editor": "Sistemski sporočevalec",
        "watchlist": "Spisek nadzorov",
        "feedback-error1": "Napaka: Neznan rezultat iz API",
        "feedback-error2": "Napaka: Urejanje je spodletelo",
        "feedback-error3": "Napaka: Ni odgovora od API",
+       "feedback-error4": "Napaka: Ne morem objaviti navedenega naslova povratnih informacij",
        "feedback-message": "Sporočilo:",
        "feedback-subject": "Zadeva:",
        "feedback-submit": "Pošlji",
index bf05562..dfce20e 100644 (file)
        "missing-article": "Текст странице под називом „$1“ ($2) није пронађен.\n\nУзрок ове грешке је обично застарела измена или веза до обрисане странице.\n\nАко се не ради о томе, онда сте вероватно пронашли грешку у софтверу.\nПријавите је [[Special:ListUsers/sysop|администратору]] уз одговарајућу везу.",
        "missingarticle-rev": "(измена#: $1)",
        "missingarticle-diff": "(разлика: $1, $2)",
-       "readonly_lag": "Ð\91аза Ð¿Ð¾Ð´Ð°Ñ\82ака Ñ\98е Ð·Ð°ÐºÑ\99Ñ\83Ñ\87ана Ð´Ð¾Ðº Ñ\81е Ñ\81поÑ\80едни Ð±Ð°Ð·Ð½Ð¸ Ñ\81еÑ\80веÑ\80и Ð½Ðµ Ñ\83Ñ\81кладе с главним.",
+       "readonly_lag": "Ð\91аза Ð¿Ð¾Ð´Ð°Ñ\82ака Ñ\98е Ð°Ñ\83Ñ\82омаÑ\82Ñ\81ки Ð·Ð°ÐºÑ\99Ñ\83Ñ\87ана Ð´Ð° Ð±Ð¸ Ñ\81е Ñ\81екÑ\83ндаÑ\80ни Ñ\81еÑ\80веÑ\80и Ð±Ð°Ð·Ðµ Ð¿Ð¾Ð´Ð°Ñ\82ака Ñ\83Ñ\81кладили с главним.",
        "internalerror": "Унутрашња грешка",
        "internalerror_info": "Унутрашња грешка: $1",
        "filecopyerror": "Не могу да умножим датотеку „$1“ у „$2“.",
index fd5bf80..a226dca 100644 (file)
        "missing-article": "Tekst stranice pod nazivom „$1“ ($2) nije pronađen.\n\nUzrok ove greške je obično zastarela izmena ili veza do obrisane stranice.\n\nAko se ne radi o tome, onda ste verovatno pronašli grešku u softveru.\nPrijavite je [[Special:ListUsers/sysop|administratoru]] uz odgovarajuću vezu.",
        "missingarticle-rev": "(izmena#: $1)",
        "missingarticle-diff": "(razlika: $1, $2)",
-       "readonly_lag": "Baza podataka je zaključana dok se sporedni bazni serveri ne usklade s glavnim.",
+       "readonly_lag": "Baza podataka je automatski zaključana da bi se sekundarni serveri baze podataka uskladili s glavnim.",
        "internalerror": "Unutrašnja greška",
        "internalerror_info": "Unutrašnja greška: $1",
        "filecopyerror": "Ne mogu da umnožim datoteku „$1“ u „$2“.",
index a910adf..fbe35b5 100644 (file)
        "prefs-rc": "Son değişiklikler",
        "prefs-watchlist": "İzleme listesi",
        "prefs-editwatchlist": "İzleme listesini düzenle",
+       "prefs-editwatchlist-edit": "İzleme listesini gör ve düzenle",
+       "prefs-editwatchlist-raw": "Ham izleme listesini düzenle",
+       "prefs-editwatchlist-clear": "İzleme listesini temizle",
        "prefs-watchlist-days": "İzleme listesinde görüntülenecek gün sayısı:",
        "prefs-watchlist-days-max": "en fazla $1 {{PLURAL:$1|gün|gün}}",
        "prefs-watchlist-edits": "Genişletilmiş izleme listesinde gösterilecek değişiklik sayısı:",
index 3e3df26..1d209d9 100644 (file)
        "grouppage-bureaucrat": "{{ns:project}}:Бюрократи",
        "grouppage-suppress": "{{ns:project}}:Ревізори",
        "right-read": "перегляд сторінок",
-       "right-edit": "Редагування сторінок",
-       "right-createpage": "Створення сторінок (але не обговорень)",
-       "right-createtalk": "Створення обговорень сторінок",
-       "right-createaccount": "Створення нових облікових записів",
+       "right-edit": "редагування сторінок",
+       "right-createpage": "створення сторінок (але не обговорень)",
+       "right-createtalk": "створення обговорень сторінок",
+       "right-createaccount": "створення нових облікових записів",
        "right-minoredit": "позначення редагувань як незначні",
        "right-move": "перейменування сторінок",
        "right-move-subpages": "перейменування сторінок і їх підсторінок",
        "right-move-categorypages": "перейменування сторінок категорій",
        "right-movefile": "перейменування файлів",
        "right-suppressredirect": "нестворення перенаправлення зі старої назви на нову при перейменуванні сторінки",
-       "right-upload": "Ð\97авантаження файлів",
-       "right-reupload": "Ð\9fерезаписування існуючих файлів",
-       "right-reupload-own": "Ð\9fерезаписування існуючих файлів, завантажених тим самим користувачем",
+       "right-upload": "завантаження файлів",
+       "right-reupload": "перезаписування існуючих файлів",
+       "right-reupload-own": "перезаписування існуючих файлів, завантажених тим самим користувачем",
        "right-reupload-shared": "Підміна файлів зі спільного сховища локальними",
        "right-upload_by_url": "Завантаження файлів за URL-адресами",
        "right-purge": "Очищення кешу для сторінки без сторінки підтвердження",
        "right-undelete": "Відновлення сторінок",
        "right-suppressrevision": "Перегляд, приховання та відновлення конкретних змін сторінок від будь-якого користувача",
        "right-viewsuppressed": "Перегляд змін, приховаих від усіх користувачів",
-       "right-suppressionlog": "Ð\9fерегляд приватних журналів",
+       "right-suppressionlog": "перегляд приватних журналів",
        "right-block": "Заборона редагувань для інших дописувачів",
        "right-blockemail": "Блокування користувачам надсилання електронної пошти",
        "right-hideuser": "Блокування імені користувача і приховування його",
        "right-editmyoptions": "редагування власних налаштувань",
        "right-rollback": "Швидкий відкіт редагувань останнього користувача, який редагував сторінку",
        "right-markbotedits": "Позначення відкинутих редагувань як редагування бота",
-       "right-noratelimit": "Ð\9dема обмежень за швидкістю",
+       "right-noratelimit": "нема обмежень за швидкістю",
        "right-import": "Імпорт сторінок з інших вікі",
        "right-importupload": "Імпорт сторінок через завантаження файлів",
        "right-patrol": "Позначення редагувань патрульованими",
index 91a19dc..846c6ff 100644 (file)
        "emailccsubject": "您发送给$1的消息的副本:$2",
        "emailsent": "电子邮件已发送",
        "emailsenttext": "您的电子邮件已经发出。",
-       "emailuserfooter": "本电子邮件是通过{{SITENAME}}的“电邮联系”功能被$1发送至$2的。",
+       "emailuserfooter": "本电子邮件是通过{{SITENAME}}的“{{int:emailpage}}”功能被$1发送至$2的。",
        "usermessage-summary": "留下系统消息。",
        "usermessage-editor": "系统信息编辑器",
        "watchlist": "监视列表",
        "feedback-error1": "错误:从API返回无法识别的结果",
        "feedback-error2": "错误:编辑失败",
        "feedback-error3": "错误:API没有响应",
+       "feedback-error4": "错误:无法发布至指定的反馈标题",
        "feedback-message": "信息:",
        "feedback-subject": "主题:",
        "feedback-submit": "提交",
index 3d0aafc..98c2ba3 100644 (file)
@@ -1,11 +1,13 @@
 <?php
-/** Western Balochi
+/** Western Balochi (بلوچی رخشانی)
  *
  * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
  *
+ * @author Ibrahim khashrowdi
+ * @author Mjbmr
  */
 
 $fallback = 'fa';
@@ -29,3 +31,28 @@ $namespaceNames = array(
        NS_CATEGORY         => 'تهر',
        NS_CATEGORY_TALK    => 'تهر_ئی_گپ',
 );
+
+$specialPageAliases = array(
+       'Activeusers'               => array( 'پئالین_کارمرزوکان' ),
+       'Allmessages'               => array( 'موچین_پیامان' ),
+       'AllMyUploads'              => array( 'ني_موچین_ایرگیج_ئآن', 'ني_موچین_وّرک_ئآن' ),
+       'Allpages'                  => array( 'موچین_تاکدیمان' ),
+       'ApiHelp'                   => array( 'ای_پی_آی_کومک' ),
+       'Ancientpages'              => array( 'کوهنگین_تاکدیمان' ),
+       'Badtitle'                  => array( 'خرابین_ئینوان' ),
+       'Blankpage'                 => array( 'خالین_دیم' ),
+       'Block'                     => array( 'بستین', 'آی_پی_بستین', 'کارمرزوکی_بستین' ),
+       'Booksources'               => array( 'کتاب_ئی_بُن' ),
+       'BrokenRedirects'           => array( 'خرابین_تغیرمسیر' ),
+       'Categories'                => array( 'تهرئان' ),
+       'ChangeEmail'               => array( 'ایمیل_ئی_گردینتین' ),
+       'ChangePassword'            => array( 'چیهرگال_ئی_پاک_کورتین', 'چیهرگال_ئی_ٹگل' ),
+       'ComparePages'              => array( 'تاکدیمانی_موقایسه_کورتین' ),
+       'Confirmemail'              => array( 'ایمیل_ئی_تائید_کورتین' ),
+       'Contributions'             => array( 'شراکت_ئان' ),
+       'CreateAccount'             => array( 'کارمرزوکین_هیساب_ئی_جۆڑ_کورتین' ),
+       'Deadendpages'              => array( 'بن_بست_ئین_تاکدیمان' ),
+       'DeletedContributions'      => array( 'پاک_بوته_ئین_شراکت_ئان' ),
+       'Diff'                      => array( 'پرک' ),
+       'DoubleRedirects'           => array( 'دوئین_تغیرمسیرئان' ),
+);
index a0ffcb2..a8dbd5f 100644 (file)
@@ -38,6 +38,8 @@ define( 'DO_MAINTENANCE', RUN_MAINTENANCE_IF_MAIN ); // original name, harmless
 
 $maintClass = false;
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * Abstract maintenance class for quickly writing and churning out
  * maintenance scripts with minimal effort. All that _must_ be defined
@@ -612,6 +614,11 @@ abstract class Maintenance {
                        $profiler->setTemplated( true );
                        Profiler::replaceStubInstance( $profiler );
                }
+
+               $trxProfiler = Profiler::instance()->getTransactionProfiler();
+               $trxProfiler->setLogger( LoggerFactory::getInstance( 'DBPerformance' ) );
+               # Catch huge single updates that lead to slave lag
+               $trxProfiler->setExpectation( 'maxAffected', 1000, __METHOD__ );
        }
 
        /**
index 24b63a8..70490e1 100644 (file)
@@ -87,6 +87,7 @@ class UploadStashCleanup extends Maintenance {
                                        $this->output( "Failed removing stashed upload with key: $key ($type)\n" );
                                }
                                if ( $i % 100 == 0 ) {
+                                       wfWaitForSlaves();
                                        $this->output( "$i\n" );
                                }
                        }
index 76bc982..2fb3697 100644 (file)
@@ -10,10 +10,20 @@ class ConvertExtensionToRegistration extends Maintenance {
                'AutoloadClasses' => 'removeAbsolutePath',
                'ExtensionCredits' => 'handleCredits',
                'ResourceModules' => 'handleResourceModules',
+               'ResourceModuleSkinStyles' => 'handleResourceModules',
                'Hooks' => 'handleHooks',
                'ExtensionFunctions' => 'handleExtensionFunctions',
        );
 
+       /**
+        * Things that were formerly globals and should still be converted
+        *
+        * @var array
+        */
+       protected $formerGlobals = array(
+               'TrackingCategories',
+       );
+
        /**
         * Keys that should be put at the top of the generated JSON file (T86608)
         *
@@ -44,7 +54,7 @@ class ConvertExtensionToRegistration extends Maintenance {
                $processor = new ReflectionClass( 'ExtensionProcessor' );
                $settings = $processor->getProperty( 'globalSettings' );
                $settings->setAccessible( true );
-               return $settings->getValue();
+               return $settings->getValue() + $this->formerGlobals;
        }
 
        public function execute() {
index 2a6f8a8..43fa460 100644 (file)
@@ -85,12 +85,24 @@ class MergeMessageFileList extends Maintenance {
                                if ( $extname == '.' || $extname == '..' || !is_dir( "$extdir/$extname" ) ) {
                                        continue;
                                }
-                               $extfile = "{$extdir}/{$extname}/{$extname}.php";
-                               if ( file_exists( $extfile ) ) {
-                                       $mmfl['setupFiles'][] = $extfile;
-                               } else {
+                               $possibilities = array(
+                                       "$extdir/$extname/extension.json",
+                                       "$extdir/$extname/skin.json",
+                                       "$extdir/$extname/$extname.php"
+                               );
+                               $found = false;
+                               foreach ( $possibilities as $extfile ) {
+                                       if ( file_exists( $extfile ) ) {
+                                               $mmfl['setupFiles'][] = $extfile;
+                                               $found = true;
+                                               break;
+                                       }
+                               }
+
+                               if ( !$found ) {
                                        $this->hasError = true;
-                                       $this->error( "Extension {$extname} in {$extdir} lacks expected {$extname}.php" );
+                                       $this->error( "Extension {$extname} in {$extdir} lacks expected entry point: " .
+                                               "extension.json, skin.json, or {$extname}.php." );
                                }
                        }
                }
@@ -150,6 +162,7 @@ class MergeMessageFileList extends Maintenance {
 
 require_once RUN_MAINTENANCE_IF_MAIN;
 
+$queue = array();
 foreach ( $mmfl['setupFiles'] as $fileName ) {
        if ( strval( $fileName ) === '' ) {
                continue;
@@ -157,12 +170,26 @@ foreach ( $mmfl['setupFiles'] as $fileName ) {
        if ( empty( $mmfl['quiet'] ) ) {
                fwrite( STDERR, "Loading data from $fileName\n" );
        }
-       // Include the extension to update $wgExtensionMessagesFiles
-       if ( !( include_once $fileName ) ) {
+       // Using extension.json or skin.json
+       if ( substr( $fileName, -strlen( '.json' ) ) === '.json' ) {
+               $queue[$fileName] = 1;
+       } elseif ( !( include_once $fileName ) ) {
+               // Include the extension to update $wgExtensionMessagesFiles
                fwrite( STDERR, "Unable to read $fileName\n" );
                exit( 1 );
        }
 }
+
+if ( $queue ) {
+       $registry = new ExtensionRegistry();
+       $data = $registry->readFromQueue( $queue );
+       foreach ( array( 'wgExtensionMessagesFiles', 'wgMessagesDirs' ) as $var ) {
+               if ( isset( $data['globals'][$var] ) ) {
+                       $GLOBALS[$var] = array_merge( $data['globals'][$var], $GLOBALS[$var] );
+               }
+       }
+}
+
 fwrite( STDERR, "\n" );
 $s =
        "<" . "?php\n" .
diff --git a/maintenance/populateBloomCache.php b/maintenance/populateBloomCache.php
deleted file mode 100644 (file)
index 40ad5fc..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-/**
- * Script to populate a bloom filter with a BloomFilter* class
- *
- * 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 Maintenance
- */
-
-require_once __DIR__ . '/Maintenance.php';
-
-/**
- * Script to populate a bloom filter with a BloomFilter* class
- *
- * @ingroup Maintenance
- */
-class PopulateBloomFilter extends Maintenance {
-       public function __construct() {
-               parent::__construct();
-               $this->addOption( 'cache', 'Bloom cache store name', true, true );
-               $this->addOption( 'filter', 'Bloom filter name', true, true );
-               $this->addOption( 'domain', 'Bloom filter domain', true, true );
-               $this->addOption( 'delay', 'Sleep delay between batches (us)', false, true );
-               $this->mDescription = "Populate the specified bloom filter";
-       }
-
-       public function execute() {
-               $type = $this->getOption( 'filter' );
-               $domain = $this->getOption( 'domain' );
-               $bcache = BloomCache::get( $this->getOption( 'cache' ) );
-               $delay = $this->getOption( 'delay', 1e5 );
-
-               if ( !method_exists( "BloomFilter{$type}", 'merge' ) ) {
-                       $this->error( "No \"BloomFilter{$type}::merge\" method found.", 1 );
-               }
-
-               $virtualKey = "$domain:$type";
-               $status = $bcache->getStatus( $virtualKey );
-               if ( $status == false ) {
-                       $this->error( "Could not query virtual bloom filter '$virtualKey'.", 1 );
-               }
-
-               $startTime = microtime( true );
-               $this->output( "Current timestamp is '$startTime'.\n" );
-               $this->output( "Current filter timestamp is '{$status['asOfTime']}'.\n" );
-
-               do {
-                       $status = call_user_func_array(
-                               array( "BloomFilter{$type}", 'merge' ),
-                               array( $bcache, $domain, $virtualKey, $status )
-                       );
-                       if ( $status == false ) {
-                               $this->error( "Could not query virtual bloom filter '$virtualKey'.", 1 );
-                       }
-                       $this->output( "Filter updated to timestamp '{$status['asOfTime']}'.\n" );
-                       usleep( $delay );
-               } while ( $status['asOfTime'] && $status['asOfTime'] < $startTime );
-
-               $this->output( "Done, filter $type of domain $domain reached time '$startTime'.\n" );
-       }
-}
-
-$maintClass = "PopulateBloomFilter";
-require_once RUN_MAINTENANCE_IF_MAIN;
index 6e93011..0fd1fd8 100755 (executable)
@@ -161,7 +161,7 @@ class UpdateMediaWiki extends Maintenance {
                        wfCountDown( 5 );
                }
 
-               $time1 = new MWTimestamp();
+               $time1 = microtime( true );
 
                $shared = $this->hasOption( 'doshared' );
 
@@ -197,9 +197,10 @@ class UpdateMediaWiki extends Maintenance {
                        $updater->purgeCache();
                }
 
-               $time2 = new MWTimestamp();
-               $timeDiff = $time2->diff( $time1 );
-               $this->output( "\nDone in " . $timeDiff->format( "%i:%S" ) . ".\n" );
+               $time2 = microtime( true );
+
+               $timeDiff = $wgLang->formatTimePeriod( $time2 - $time1 );
+               $this->output( "\nDone in $timeDiff.\n" );
        }
 
        function afterFinalSetup() {
index 813c37c..7c9bec3 100644 (file)
  * @param {Function} options.result.select Called in context of the suggestions-result-current element.
  * @param {jQuery} options.result.select.$textbox
  *
+ * @param {Object} [options.update] Set of callbacks for listening to a change in the text input.
+ *
+ * @param {Function} options.update.before Called right after the user changes the textbox text.
+ * @param {Function} options.update.after Called after results are updated either from the cache or
+ * the API as a result of the user input.
+ *
  * @param {jQuery} [options.$region=this] The element to place the suggestions below and match width of.
  *
  * @param {string[]} [options.suggestions] Array of suggestions to display.
@@ -83,7 +89,7 @@
  * @param {boolean} [options.positionFromLeft] Sets `expandFrom=left`, for backwards
  *  compatibility.
  *
- * @param {boolean} [options.highlightInput=false] Whether to hightlight matched portions of the
+ * @param {boolean} [options.highlightInput=false] Whether to highlight matched portions of the
  *  input or not.
  */
 ( function ( $ ) {
@@ -144,6 +150,10 @@ $.suggestions = {
                                cache = context.data.cache,
                                cacheHit;
 
+                       if ( typeof context.config.update.before === 'function' ) {
+                               context.config.update.before.call( context.data.$textbox );
+                       }
+
                        // Only fetch if the value in the textbox changed and is not empty, or if the results were hidden
                        // if the textbox is empty then clear the result div, but leave other settings intouched
                        if ( val.length === 0 ) {
@@ -158,6 +168,9 @@ $.suggestions = {
                                if ( context.config.cache && hasOwn.call( cache, val ) ) {
                                        if ( +new Date() - cache[ val ].timestamp < context.config.cacheMaxAge ) {
                                                context.data.$textbox.suggestions( 'suggestions', cache[ val ].suggestions );
+                                               if ( typeof context.config.update.after === 'function' ) {
+                                                       context.config.update.after.call( context.data.$textbox );
+                                               }
                                                cacheHit = true;
                                        } else {
                                                // Cache expired
@@ -171,6 +184,9 @@ $.suggestions = {
                                                function ( suggestions ) {
                                                        suggestions = suggestions.slice( 0, context.config.maxRows );
                                                        context.data.$textbox.suggestions( 'suggestions', suggestions );
+                                                       if ( typeof context.config.update.after === 'function' ) {
+                                                               context.config.update.after.call( context.data.$textbox );
+                                                       }
                                                        if ( context.config.cache ) {
                                                                cache[ val ] = {
                                                                        suggestions: suggestions,
@@ -227,6 +243,7 @@ $.suggestions = {
                        case 'cancel':
                        case 'special':
                        case 'result':
+                       case 'update':
                        case '$region':
                        case 'expandFrom':
                                context.config[property] = value;
@@ -559,6 +576,7 @@ $.fn.suggestions = function () {
                                        cancel: function () {},
                                        special: {},
                                        result: {},
+                                       update: {},
                                        $region: $( this ),
                                        suggestions: [],
                                        maxRows: 10,
index eb4741f..e526d47 100644 (file)
@@ -528,7 +528,7 @@ table.wikitable > tr > td,
 table.wikitable > * > tr > th,
 table.wikitable > * > tr > td {
        border: 1px solid #aaa;
-       padding: 0.3em 0.4em;
+       padding: 0.2em 0.4em;
 }
 
 table.wikitable > tr > th,
index 7b7ccf3..f981b90 100644 (file)
@@ -12,7 +12,8 @@
                        // element (not the search form, as that would leave the buttons
                        // vertically between the input and the suggestions).
                        $searchRegion = $( '#simpleSearch, #searchInput' ).first(),
-                       $searchInput = $( '#searchInput' );
+                       $searchInput = $( '#searchInput' ),
+                       previousSearchText = $searchInput.val();
 
                // Compatibility map
                map = {
                        };
                }
 
+               /**
+                * Callback that's run when the user changes the search input text
+                * 'this' is the search input box (jQuery object)
+                * @ignore
+                */
+               function onBeforeUpdate() {
+                       var searchText = this.val();
+
+                       if ( searchText && searchText !== previousSearchText ) {
+                               mw.track( 'mediawiki.searchSuggest', {
+                                       action: 'session-start'
+                               } );
+                       }
+                       previousSearchText = searchText;
+               }
+
+               /**
+                * Callback that's run when suggestions have been updated either from the cache or the API
+                * 'this' is the search input box (jQuery object)
+                * @ignore
+                */
+               function onAfterUpdate() {
+                       var context = this.data( 'suggestionsContext' );
+
+                       mw.track( 'mediawiki.searchSuggest', {
+                               action: 'impression-results',
+                               numberOfResults: context.config.suggestions.length,
+                               // FIXME: when other types of search become available change this value accordingly
+                               // See the API call below (opensearch = prefix)
+                               resultSetType: 'prefix'
+                       } );
+               }
+
                // The function used to render the suggestions.
                function renderFunction( text, context ) {
                        if ( !resultRenderCache ) {
                                );
                }
 
+               // The function used when the user makes a selection
+               function selectFunction( $input ) {
+                       var context = $input.data( 'suggestionsContext' ),
+                               text = $input.val();
+
+                       mw.track( 'mediawiki.searchSuggest', {
+                               action: 'click-result',
+                               numberOfResults: context.config.suggestions.length,
+                               clickIndex: context.config.suggestions.indexOf( text ) + 1
+                       } );
+
+                       // allow the form to be submitted
+                       return true;
+               }
+
                function specialRenderFunction( query, context ) {
                        var $el = this;
 
                        return;
                }
 
-               // Special suggestions functionality for skin-provided search box
+               // Special suggestions functionality and tracking for skin-provided search box
                $searchInput.suggestions( {
+                       update: {
+                               before: onBeforeUpdate,
+                               after: onAfterUpdate
+                       },
+                       result: {
+                               render: renderFunction,
+                               select: selectFunction
+                       },
                        special: {
                                render: specialRenderFunction,
                                select: function ( $input ) {
index b3cb7b5..0dba183 100644 (file)
@@ -46,6 +46,7 @@ class RecentChangeTest extends MediaWikiTestCase {
         * - protect/protect
         * - protect/modifyprotect
         * - protect/unprotect
+        * - protect/move_prot
         * - upload/upload
         * - merge/merge
         * - import/upload
@@ -223,6 +224,15 @@ class RecentChangeTest extends MediaWikiTestCase {
                        $protectParams,
                        $this->user_comment
                );
+
+               # protect/move_prot
+               $this->assertIRCComment(
+                       $this->context->msg( 'movedarticleprotection', 'SomeTitle', 'OldTitle' )
+                               ->plain() . $sep . $this->user_comment,
+                       'protect', 'move_prot',
+                       array( 'OldTitle' ),
+                       $this->user_comment
+               );
        }
 
        /**
index b70880e..90438a0 100644 (file)
@@ -17,7 +17,6 @@ class MockSearch extends SearchEngine {
 
 /**
  * @group Search
- * @group Database
  */
 class SearchUpdateTest extends MediaWikiTestCase {
 
index 5c5052e..3c5754b 100644 (file)
@@ -2,7 +2,6 @@
 
 /**
  * These tests should work regardless of $wgCapitalLinks
- * @group Database
  * @todo Split tests into providers and test methods
  */
 
index b4c225c..b95316c 100644 (file)
@@ -261,6 +261,57 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                                        ),
                                ),
                        ),
+                       // ResourceModuleSkinStyles with file module paths
+                       array(
+                               // Input
+                               array(
+                                       'ResourceFileModulePaths' => array(
+                                               'localBasePath' => '',
+                                               'remoteSkinPath' => 'FooBar',
+                                       ),
+                                       'ResourceModuleSkinStyles' => array(
+                                               'foobar' => array(
+                                                       'test.foo' => 'foo.css',
+                                               )
+                                       ),
+                               ),
+                               // Expected
+                               array(
+                                       'wgResourceModuleSkinStyles' => array(
+                                               'foobar' => array(
+                                                       'test.foo' => 'foo.css',
+                                                       'localBasePath' => $dir,
+                                                       'remoteSkinPath' => 'FooBar',
+                                               ),
+                                       ),
+                               ),
+                       ),
+                       // ResourceModuleSkinStyles with file module paths and an override
+                       array(
+                               // Input
+                               array(
+                                       'ResourceFileModulePaths' => array(
+                                               'localBasePath' => '',
+                                               'remoteSkinPath' => 'FooBar',
+                                       ),
+                                       'ResourceModuleSkinStyles' => array(
+                                               'foobar' => array(
+                                                       'test.foo' => 'foo.css',
+                                                       'remoteSkinPath' => 'BarFoo'
+                                               ),
+                                       ),
+                               ),
+                               // Expected
+                               array(
+                                       'wgResourceModuleSkinStyles' => array(
+                                               'foobar' => array(
+                                                       'test.foo' => 'foo.css',
+                                                       'localBasePath' => $dir,
+                                                       'remoteSkinPath' => 'BarFoo',
+                                               ),
+                                       ),
+                               ),
+                       ),
                );
        }