Merge "(bug 32492) API now allows editing using pageid"
authorReedy <reedy@wikimedia.org>
Sat, 7 Apr 2012 15:48:39 +0000 (15:48 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sat, 7 Apr 2012 15:48:39 +0000 (15:48 +0000)
76 files changed:
CREDITS
RELEASE-NOTES-1.20
includes/ChangeTags.php
includes/DefaultSettings.php
includes/EditPage.php
includes/GitInfo.php
includes/GlobalFunctions.php
includes/ImageFunctions.php [deleted file]
includes/Pager.php
includes/Setup.php
includes/SkinTemplate.php
includes/api/ApiQueryWatchlist.php
includes/cache/SquidUpdate.php
includes/db/DatabaseSqlite.php
includes/filerepo/FileRepo.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/ForeignDBRepo.php
includes/filerepo/ForeignDBViaLBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/NullRepo.php
includes/filerepo/RepoGroup.php
includes/filerepo/backend/FileBackend.php
includes/filerepo/backend/FileBackendStore.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/parser/CoreParserFunctions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialRecentchanges.php
includes/upload/UploadStash.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesBa.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesCa.php
languages/messages/MessagesCs.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesEn.php
languages/messages/MessagesEs.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrp.php
languages/messages/MessagesHe.php
languages/messages/MessagesJa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKo.php
languages/messages/MessagesKw.php
languages/messages/MessagesLez.php
languages/messages/MessagesLus.php
languages/messages/MessagesMl.php
languages/messages/MessagesMs.php
languages/messages/MessagesNe.php
languages/messages/MessagesNl.php
languages/messages/MessagesOr.php
languages/messages/MessagesPs.php
languages/messages/MessagesQqq.php
languages/messages/MessagesRo.php
languages/messages/MessagesSl.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesTet.php
languages/messages/MessagesTr.php
languages/messages/MessagesZh_hans.php
maintenance/checkSyntax.php
maintenance/generateSitemap.php
maintenance/language/messages.inc
maintenance/tables.sql
resources/mediawiki/mediawiki.jqueryMsg.js
tests/parser/parserTests.txt
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php

diff --git a/CREDITS b/CREDITS
index f0e5c27..bac7391 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -86,6 +86,7 @@ following names for their contribution to the product.
 * Amir E. Aharoni
 * Andrew Dunbar
 * Antonio Ospite
+* Asier Lostalé
 * Azliq7
 * Bagariavivek
 * Beau
index 7ca0b96..c6b2756 100644 (file)
@@ -34,6 +34,10 @@ production.
 * (bug 34355) add a variable and parser function for the namespace number.
 * (bug 35649) Special:Version now shows hashes of extensions checked out from git.
 * (bug 35728) Git revisions are now linked on Special:Version.
+* "Show Changes" on default messages shows now diff against default message text
+* (bug 23006) create #speciale parser function.
+* generateSitemap can now optionally skip redirect pages.
+* (bug 27757) new API command just for retrieving tokens (not page-based)
 
 === Bug fixes in 1.20 ===
 * (bug 30245) Use the correct way to construct a log page title.
@@ -60,7 +64,6 @@ production.
 * (bug 34735) Updated compressOld.php documentation to mention the different
   usages of -s and -n parameters depending on compression type.
 * (bug 13896) Rendering of devanagari numbers in automatic '#' number lists.
-* (bug 18704) Add an unique CSS class or ID to the tagfilter table row at RecentChanges.
 * (bug 33689) Upgrade to 1.19 on Postgres fails due to incomplete query when.
   trying to defer foreign key for externallinks.
 * (bug 32748) Printer friendly version of article decode Unicode chars as a
@@ -71,6 +74,8 @@ production.
 * (bug 35680) jQuery upgraded to 1.7.2.
 * (bug 35681) jQuery UI upgraded to 1.8.18.
 * (bug 35705) QUnit upgraded from 1.2.0 to 1.5.0
+* (bug 35749) Updated maintenance/checkSyntax.php to use Git instead of
+  Subversion when invoked with the --modified option.
 
 === API changes in 1.20 ===
 * (bug 34316) Add ability to retrieve maximum upload size from MediaWiki API.
index 01b93ad..63d3732 100644 (file)
@@ -210,7 +210,7 @@ class ChangeTags {
                        return $fullForm ? '' : array();
 
                $data = array( Html::rawElement( 'label', array( 'for' => 'tagfilter' ), wfMsgExt( 'tag-filter', 'parseinline' ) ),
-                       Xml::input( 'tagfilter', 20, $selected ), array( 'class' => 'mw-tagfilter-input' ) );
+                       Xml::input( 'tagfilter', 20, $selected ) );
 
                if ( !$fullForm ) {
                        return $data;
@@ -219,7 +219,7 @@ class ChangeTags {
                $html = implode( '&#160;', $data );
                $html .= "\n" . Xml::element( 'input', array( 'type' => 'submit', 'value' => wfMsg( 'tag-filter-submit' ) ) );
                $html .= "\n" . Html::hidden( 'title', $title->getPrefixedText() );
-               $html = Xml::tags( 'form', array( 'action' => $title->getLocalURL(), 'class' => 'mw-tagfilter-form', 'method' => 'get' ), $html );
+               $html = Xml::tags( 'form', array( 'action' => $title->getLocalURL(), 'method' => 'get' ), $html );
 
                return $html;
        }
index 8402d69..48995a4 100644 (file)
@@ -1861,23 +1861,58 @@ $wgSquidServersNoPurge = array();
 /** Maximum number of titles to purge in any one client operation */
 $wgMaxSquidPurgeTitles = 400;
 
+/**
+ * Routing configuration for HTCP multicast purging. Add elements here to
+ * enable HTCP and determine which purges are sent where. If set to an empty
+ * array, HTCP is disabled.
+ * 
+ * Each key in this array is a regular expression to match against the purged
+ * URL, or an empty string to match all URLs. The purged URL is matched against
+ * the regexes in the order specified, and the first rule whose regex matches
+ * is used.
+ * 
+ * Example configuration to send purges for upload.wikimedia.org to one
+ * multicast group and all other purges to another:
+ * $wgHTCPMulticastRouting = array(
+ *         '|^https?://upload\.wikimedia\.org|' => array(
+ *                 'host' => '239.128.0.113',
+ *                 'port' => 4827,
+ *         ),
+ *         '' => array(
+ *                 'host' => '239.128.0.112',
+ *                 'port' => 4827,
+ *         ),
+ * );
+ * 
+ * @see $wgHTCPMulticastTTL
+ */
+$wgHTCPMulticastRouting = array();
+
 /**
  * HTCP multicast address. Set this to a multicast IP address to enable HTCP.
  *
  * Note that MediaWiki uses the old non-RFC compliant HTCP format, which was
  * present in the earliest Squid implementations of the protocol.
+ * 
+ * This setting is DEPRECATED in favor of $wgHTCPMulticastRouting , and kept
+ * for backwards compatibility only. If $wgHTCPMulticastRouting is set, this
+ * setting is ignored. If $wgHTCPMulticastRouting is not set and this setting
+ * is, it is used to populate $wgHTCPMulticastRouting.
+ * 
+ * @deprecated in favor of $wgHTCPMulticastRouting
  */
 $wgHTCPMulticastAddress = false;
 
 /**
  * HTCP multicast port.
+ * @deprecated in favor of $wgHTCPMulticastRouting
  * @see $wgHTCPMulticastAddress
  */
 $wgHTCPPort = 4827;
 
 /**
  * HTCP multicast TTL.
- * @see $wgHTCPMulticastAddress
+ * @see $wgHTCPMulticastRouting
  */
 $wgHTCPMulticastTTL = 1;
 
index 0b879c1..69187e4 100644 (file)
@@ -2335,7 +2335,16 @@ HTML
        function showDiff() {
                global $wgUser, $wgContLang, $wgParser, $wgOut;
 
-               $oldtext = $this->mArticle->getRawText();
+               $oldtitlemsg = 'currentrev';
+               # if message does not exist, show diff against the preloaded default
+               if( $this->mTitle->getNamespace() == NS_MEDIAWIKI && !$this->mTitle->exists() ) {
+                       $oldtext = $this->mTitle->getDefaultMessageText();
+                       if( $oldtext !== false ) {
+                               $oldtitlemsg = 'defaultmessagetext';
+                       }
+               } else {
+                       $oldtext = $this->mArticle->getRawText();
+               }
                $newtext = $this->mArticle->replaceSection(
                        $this->section, $this->textbox1, $this->summary, $this->edittime );
 
@@ -2345,7 +2354,7 @@ HTML
                $newtext = $wgParser->preSaveTransform( $newtext, $this->mTitle, $wgUser, $popts );
 
                if ( $oldtext !== false  || $newtext != '' ) {
-                       $oldtitle = wfMsgExt( 'currentrev', array( 'parseinline' ) );
+                       $oldtitle = wfMsgExt( $oldtitlemsg, array( 'parseinline' ) );
                        $newtitle = wfMsgExt( 'yourtext', array( 'parseinline' ) );
 
                        $de = new DifferenceEngine( $this->mArticle->getContext() );
index 82c01f7..595043a 100644 (file)
@@ -148,6 +148,9 @@ class GitInfo {
                }
 
                $url = $remote['url'];
+               if ( substr( $url, -4 ) !== '.git' ) {
+                       $url .= '.git';
+               }
                foreach( $this->viewers as $repo => $viewer ) {
                        $m = array();
                        $pattern = '#^' . $repo . '$#';
index 99570a7..517f70d 100644 (file)
@@ -3966,3 +3966,84 @@ function wfUnpack( $format, $data, $length=false ) {
        }
        return $result;
 }
+
+/**
+ * Determine if an image exists on the 'bad image list'.
+ *
+ * The format of MediaWiki:Bad_image_list is as follows:
+ *    * Only list items (lines starting with "*") are considered
+ *    * The first link on a line must be a link to a bad image
+ *    * Any subsequent links on the same line are considered to be exceptions,
+ *      i.e. articles where the image may occur inline.
+ *
+ * @param $name string the image name to check
+ * @param $contextTitle Title|bool the page on which the image occurs, if known
+ * @param $blacklist string wikitext of a file blacklist
+ * @return bool
+ */
+function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
+       static $badImageCache = null; // based on bad_image_list msg
+       wfProfileIn( __METHOD__ );
+
+       # Handle redirects
+       $redirectTitle = RepoGroup::singleton()->checkRedirect( Title::makeTitle( NS_FILE, $name ) );
+       if( $redirectTitle ) {
+               $name = $redirectTitle->getDbKey();
+       }
+
+       # Run the extension hook
+       $bad = false;
+       if( !wfRunHooks( 'BadImage', array( $name, &$bad ) ) ) {
+               wfProfileOut( __METHOD__ );
+               return $bad;
+       }
+
+       $cacheable = ( $blacklist === null );
+       if( $cacheable && $badImageCache !== null ) {
+               $badImages = $badImageCache;
+       } else { // cache miss
+               if ( $blacklist === null ) {
+                       $blacklist = wfMsgForContentNoTrans( 'bad_image_list' ); // site list
+               }
+               # Build the list now
+               $badImages = array();
+               $lines = explode( "\n", $blacklist );
+               foreach( $lines as $line ) {
+                       # List items only
+                       if ( substr( $line, 0, 1 ) !== '*' ) {
+                               continue;
+                       }
+
+                       # Find all links
+                       $m = array();
+                       if ( !preg_match_all( '/\[\[:?(.*?)\]\]/', $line, $m ) ) {
+                               continue;
+                       }
+
+                       $exceptions = array();
+                       $imageDBkey = false;
+                       foreach ( $m[1] as $i => $titleText ) {
+                               $title = Title::newFromText( $titleText );
+                               if ( !is_null( $title ) ) {
+                                       if ( $i == 0 ) {
+                                               $imageDBkey = $title->getDBkey();
+                                       } else {
+                                               $exceptions[$title->getPrefixedDBkey()] = true;
+                                       }
+                               }
+                       }
+
+                       if ( $imageDBkey !== false ) {
+                               $badImages[$imageDBkey] = $exceptions;
+                       }
+               }
+               if ( $cacheable ) {
+                       $badImageCache = $badImages;
+               }
+       }
+
+       $contextKey = $contextTitle ? $contextTitle->getPrefixedDBkey() : false;
+       $bad = isset( $badImages[$name] ) && !isset( $badImages[$name][$contextKey] );
+       wfProfileOut( __METHOD__ );
+       return $bad;
+}
diff --git a/includes/ImageFunctions.php b/includes/ImageFunctions.php
deleted file mode 100644 (file)
index 4b90e24..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-/**
- * Global functions related to images
- *
- * @file
- */
-
-/**
- * Determine if an image exists on the 'bad image list'.
- *
- * The format of MediaWiki:Bad_image_list is as follows:
- *    * Only list items (lines starting with "*") are considered
- *    * The first link on a line must be a link to a bad image
- *    * Any subsequent links on the same line are considered to be exceptions,
- *      i.e. articles where the image may occur inline.
- *
- * @param $name string the image name to check
- * @param $contextTitle Title|bool the page on which the image occurs, if known
- * @param $blacklist string wikitext of a file blacklist
- * @return bool
- */
-function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
-       static $badImageCache = null; // based on bad_image_list msg
-       wfProfileIn( __METHOD__ );
-
-       # Handle redirects
-       $redirectTitle = RepoGroup::singleton()->checkRedirect( Title::makeTitle( NS_FILE, $name ) );
-       if( $redirectTitle ) {
-               $name = $redirectTitle->getDbKey();
-       }
-
-       # Run the extension hook
-       $bad = false;
-       if( !wfRunHooks( 'BadImage', array( $name, &$bad ) ) ) {
-               wfProfileOut( __METHOD__ );
-               return $bad;
-       }
-       $cacheable = ( $blacklist === null );
-       if( $cacheable && $badImageCache !== null ) {
-               $badImages = $badImageCache;
-       } else { // cache miss
-               if ( $blacklist === null ) {
-                       $blacklist = wfMsgForContentNoTrans( 'bad_image_list' ); // site list
-               }
-               # Build the list now
-               $badImages = array();
-               $lines = explode( "\n", $blacklist );
-               foreach( $lines as $line ) {
-                       # List items only
-                       if ( substr( $line, 0, 1 ) !== '*' ) {
-                               continue;
-                       }
-
-                       # Find all links
-                       $m = array();
-                       if ( !preg_match_all( '/\[\[:?(.*?)\]\]/', $line, $m ) ) {
-                               continue;
-                       }
-
-                       $exceptions = array();
-                       $imageDBkey = false;
-                       foreach ( $m[1] as $i => $titleText ) {
-                               $title = Title::newFromText( $titleText );
-                               if ( !is_null( $title ) ) {
-                                       if ( $i == 0 ) {
-                                               $imageDBkey = $title->getDBkey();
-                                       } else {
-                                               $exceptions[$title->getPrefixedDBkey()] = true;
-                                       }
-                               }
-                       }
-
-                       if ( $imageDBkey !== false ) {
-                               $badImages[$imageDBkey] = $exceptions;
-                       }
-               }
-               if ( $cacheable ) {
-                       $badImageCache = $badImages;
-               }
-       }
-
-       $contextKey = $contextTitle ? $contextTitle->getPrefixedDBkey() : false;
-       $bad = isset( $badImages[$name] ) && !isset( $badImages[$name][$contextKey] );
-       wfProfileOut( __METHOD__ );
-       return $bad;
-}
index e2c7751..472cb48 100644 (file)
@@ -366,9 +366,10 @@ abstract class IndexPager extends ContextSource implements Pager {
         * @param $text String: text displayed on the link
         * @param $query Array: associative array of paramter to be in the query string
         * @param $type String: value of the "rel" attribute
+        *
         * @return String: HTML fragment
         */
-       function makeLink($text, $query = null, $type=null) {
+       function makeLink( $text, array $query = null, $type = null ) {
                if ( $query === null ) {
                        return $text;
                }
@@ -382,6 +383,7 @@ abstract class IndexPager extends ContextSource implements Pager {
                if( $type ) {
                        $attrs['class'] = "mw-{$type}link";
                }
+
                return Linker::linkKnown(
                        $this->getTitle(),
                        $text,
@@ -526,6 +528,7 @@ abstract class IndexPager extends ContextSource implements Pager {
        function getPagingLinks( $linkTexts, $disabledTexts = array() ) {
                $queries = $this->getPagingQueries();
                $links = array();
+
                foreach ( $queries as $type => $query ) {
                        if ( $query !== false ) {
                                $links[$type] = $this->makeLink(
@@ -539,6 +542,7 @@ abstract class IndexPager extends ContextSource implements Pager {
                                $links[$type] = $linkTexts[$type];
                        }
                }
+
                return $links;
        }
 
@@ -651,7 +655,9 @@ abstract class AlphabeticPager extends IndexPager {
         * @return String HTML
         */
        function getNavigationBar() {
-               if ( !$this->isNavigationBarShown() ) return '';
+               if ( !$this->isNavigationBarShown() ) {
+                       return '';
+               }
 
                if( isset( $this->mNavigationBar ) ) {
                        return $this->mNavigationBar;
@@ -682,10 +688,10 @@ abstract class AlphabeticPager extends IndexPager {
                $this->mNavigationBar = wfMessage( 'parentheses' )->rawParams(
                        $lang->pipeList(
                                array( $pagingLinks['first'],
-                               $pagingLinks['last'] )
+                                       $pagingLinks['last'] )
                        ) )->escaped() . " " .
                        wfMsgHtml( 'viewprevnext', $pagingLinks['prev'],
-                       $pagingLinks['next'], $limits );
+                               $pagingLinks['next'], $limits );
 
                if( !is_array( $this->getIndexField() ) ) {
                        # Early return to avoid undue nesting
@@ -787,9 +793,11 @@ abstract class ReverseChronologicalPager extends IndexPager {
        function getDateCond( $year, $month ) {
                $year = intval( $year );
                $month = intval( $month );
+
                // Basic validity checks
                $this->mYear = $year > 0 ? $year : false;
                $this->mMonth = ( $month > 0 && $month < 13 ) ? $month : false;
+
                // Given an optional year and month, we need to generate a timestamp
                // to use as "WHERE rev_timestamp <= result"
                // Examples: year = 2006 equals < 20070101 (+000000)
@@ -798,6 +806,7 @@ abstract class ReverseChronologicalPager extends IndexPager {
                if ( !$this->mYear && !$this->mMonth ) {
                        return;
                }
+
                if ( $this->mYear ) {
                        $year = $this->mYear;
                } else {
@@ -808,6 +817,7 @@ abstract class ReverseChronologicalPager extends IndexPager {
                                $year--;
                        }
                }
+
                if ( $this->mMonth ) {
                        $month = $this->mMonth + 1;
                        // For December, we want January 1 of the next year
@@ -820,14 +830,18 @@ abstract class ReverseChronologicalPager extends IndexPager {
                        $month = 1;
                        $year++;
                }
+
                // Y2K38 bug
                if ( $year > 2032 ) {
                        $year = 2032;
                }
+
                $ymd = (int)sprintf( "%04d%02d01", $year, $month );
+
                if ( $ymd > 20320101 ) {
                        $ymd = 20320101;
                }
+
                $this->mOffset = $this->mDb->timestamp( "${ymd}000000" );
        }
 }
@@ -895,7 +909,7 @@ abstract class TablePager extends IndexPager {
                                        $image = htmlspecialchars( "$wgStylePath/common/images/$image" );
                                        $link = $this->makeLink(
                                                "<img width=\"12\" height=\"12\" alt=\"$alt\" src=\"$image\" />" .
-                                               htmlspecialchars( $name ), $query );
+                                                       htmlspecialchars( $name ), $query );
                                        $s .= "<th class=\"$sortClass\">$link</th>\n";
                                } else {
                                        $s .= '<th>' . $this->makeLink( htmlspecialchars( $name ), $query ) . "</th>\n";
index 2777f73..fd35a60 100644 (file)
@@ -49,7 +49,7 @@ if ( !empty($wgActionPaths) && !isset($wgActionPaths['view']) ) {
 
 if ( !empty($wgActionPaths) && !isset($wgActionPaths['view']) ) {
        # 'view' is assumed the default action path everywhere in the code
-       # but is rarely filled in $wgActionPaths 
+       # but is rarely filled in $wgActionPaths
        $wgActionPaths['view'] = $wgArticlePath ;
 }
 
@@ -381,7 +381,6 @@ if ( !defined( 'MW_COMPILED' ) ) {
        require_once( "$IP/includes/normal/UtfNormalUtil.php" );
        require_once( "$IP/includes/GlobalFunctions.php" );
        require_once( "$IP/includes/ProxyTools.php" );
-       require_once( "$IP/includes/ImageFunctions.php" );
        require_once( "$IP/includes/normal/UtfNormalDefines.php" );
        wfProfileOut( $fname . '-includes' );
 }
@@ -391,6 +390,16 @@ if ( $wgCanonicalServer === false ) {
        $wgCanonicalServer = wfExpandUrl( $wgServer, PROTO_HTTP );
 }
 
+// Initialize $wgHTCPMulticastRouting from backwards-compatible settings
+if ( !$wgHTCPMulticastRouting && $wgHTCPMulticastAddress ) {
+       $wgHTCPMulticastRouting = array(
+               '' => array(
+                       'host' => $wgHTCPMulticastAddress,
+                       'port' => $wgHTCPPort,
+               )
+       );
+}
+
 wfProfileIn( $fname . '-misc1' );
 
 # Raise the memory limit if it's too low
index 511443f..702ca7e 100644 (file)
@@ -1190,12 +1190,10 @@ class SkinTemplate extends Skin {
                                'href' => self::makeSpecialUrlSubpage( 'Contributions', $rootUser )
                        );
 
-                       if ( $user->isLoggedIn() ) {
-                               $logPage = SpecialPage::getTitleFor( 'Log' );
-                               $nav_urls['log'] = array(
-                                       'href' => $logPage->getLocalUrl( array( 'user' => $rootUser ) )
-                               );
-                       }
+                       $logPage = SpecialPage::getTitleFor( 'Log' );
+                       $nav_urls['log'] = array(
+                               'href' => $logPage->getLocalUrl( array( 'user' => $rootUser ) )
+                       );
 
                        if ( $this->getUser()->isAllowed( 'block' ) ) {
                                $nav_urls['blockip'] = array(
index ea56fcd..77f6ce9 100644 (file)
@@ -296,13 +296,14 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        $vals['logid'] = intval( $row->rc_logid );
                        $vals['logtype'] = $row->rc_log_type;
                        $vals['logaction'] = $row->rc_log_action;
+                       $logEntry = DatabaseLogEntry::newFromRow( (array)$row );
                        ApiQueryLogEvents::addLogParams(
                                $this->getResult(),
                                $vals,
-                               $row->rc_params,
-                               $row->rc_log_type,
-                               $row->rc_log_action,
-                               $row->rc_timestamp
+                               $logEntry->getParameters(),
+                               $logEntry->getType(),
+                               $logEntry->getSubtype(),
+                               $logEntry->getTimestamp()
                        );
                }
 
index d47b5b5..e560e0e 100644 (file)
@@ -19,6 +19,7 @@ class SquidUpdate {
                } else {
                        $this->mMaxTitles = $maxTitles;
                }
+               $urlArr = array_unique( $urlArr ); // Remove duplicates
                if ( count( $urlArr ) > $this->mMaxTitles ) {
                        $urlArr = array_slice( $urlArr, 0, $this->mMaxTitles );
                }
@@ -102,7 +103,7 @@ class SquidUpdate {
         * @return void
         */
        static function purge( $urlArr ) {
-               global $wgSquidServers, $wgHTCPMulticastAddress, $wgHTCPPort;
+               global $wgSquidServers, $wgHTCPMulticastRouting;
 
                /*if ( (@$wgSquidServers[0]) == 'echo' ) {
                        echo implode("<br />\n", $urlArr) . "<br />\n";
@@ -113,12 +114,13 @@ class SquidUpdate {
                        return;
                }
 
-               if ( $wgHTCPMulticastAddress && $wgHTCPPort ) {
+               if ( $wgHTCPMulticastRouting ) {
                        SquidUpdate::HTCPPurge( $urlArr );
                }
 
                wfProfileIn( __METHOD__ );
 
+               $urlArr = array_unique( $urlArr ); // Remove duplicates
                $maxSocketsPerSquid = 8; //  socket cap per Squid
                $urlsPerSocket = 400; // 400 seems to be a good tradeoff, opening a socket takes a while
                $socketsPerSquid = ceil( count( $urlArr ) / $urlsPerSocket );
@@ -147,7 +149,7 @@ class SquidUpdate {
         * @param $urlArr array
         */
        static function HTCPPurge( $urlArr ) {
-               global $wgHTCPMulticastAddress, $wgHTCPMulticastTTL, $wgHTCPPort;
+               global $wgHTCPMulticastRouting, $wgHTCPMulticastTTL;
                wfProfileIn( __METHOD__ );
 
                $htcpOpCLR = 4; // HTCP CLR
@@ -168,11 +170,20 @@ class SquidUpdate {
                                socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_TTL,
                                        $wgHTCPMulticastTTL );
 
+                       $urlArr = array_unique( $urlArr ); // Remove duplicates
                        foreach ( $urlArr as $url ) {
                                if( !is_string( $url ) ) {
                                        throw new MWException( 'Bad purge URL' );
                                }
                                $url = SquidUpdate::expand( $url );
+                               $conf = self::getRuleForURL( $url, $wgHTCPMulticastRouting );
+                               if ( !$conf ) {
+                                       wfDebug( "No HTCP rule configured for URL $url , skipping\n" );
+                                       continue;
+                               }
+                               if ( !isset( $conf['host'] ) || !isset( $conf['port'] ) ) {
+                                       throw new MWException( "Invalid HTCP rule for URL $url\n" );
+                               }
 
                                // Construct a minimal HTCP request diagram
                                // as per RFC 2756
@@ -196,7 +207,7 @@ class SquidUpdate {
                                // Send out
                                wfDebug( "Purging URL $url via HTCP\n" );
                                socket_sendto( $conn, $htcpPacket, $htcpLen, 0,
-                                       $wgHTCPMulticastAddress, $wgHTCPPort );
+                                       $conf['host'], $conf['port'] );
                        }
                } else {
                        $errstr = socket_strerror( socket_last_error() );
@@ -223,4 +234,20 @@ class SquidUpdate {
        static function expand( $url ) {
                return wfExpandUrl( $url, PROTO_INTERNAL );
        }
+       
+       /**
+        * Find the HTCP routing rule to use for a given URL.
+        * @param $url string URL to match
+        * @param $rules array Array of rules, see $wgHTCPMulticastRouting for format and behavior
+        * @return mixed Element of $rules that matched, or false if nothing matched
+        */
+       static function getRuleForURL( $url, $rules ) {
+               foreach ( $rules as $regex => $routing ) {
+                       if ( $regex === '' || preg_match( $regex, $url ) ) {
+                               return $routing;
+                       }
+               }
+               return false;
+       }
+       
 }
index 3aa21b8..dc086b4 100644 (file)
@@ -342,7 +342,8 @@ class DatabaseSqlite extends DatabaseBase {
         * @return int
         */
        function insertId() {
-               return $this->mConn->lastInsertId();
+               // PDO::lastInsertId yields a string :(
+               return intval( $this->mConn->lastInsertId() );
        }
 
        /**
index db0dbcc..d121454 100644 (file)
@@ -20,8 +20,6 @@
  * @ingroup FileRepo
  */
 class FileRepo {
-       const FILES_ONLY = 1;
-
        const DELETE_SOURCE = 1;
        const OVERWRITE = 2;
        const OVERWRITE_SAME = 4;
@@ -47,7 +45,7 @@ class FileRepo {
        var $oldFileFactory = false;
        var $fileFactoryKey = false, $oldFileFactoryKey = false;
 
-       function __construct( Array $info = null ) {
+       function __construct( array $info = null ) {
                // Verify required settings presence
                if(
                        $info === null
@@ -111,7 +109,7 @@ class FileRepo {
        }
 
        /**
-        * Get the file backend instance
+        * Get the file backend instance. Use this function wisely.
         *
         * @return FileBackend
         */
@@ -120,7 +118,8 @@ class FileRepo {
        }
 
        /**
-        * Get an explanatory message if this repo is read-only
+        * Get an explanatory message if this repo is read-only.
+        * This checks if an administrator disabled writes to the backend.
         *
         * @return string|bool Returns false if the repo is not read-only
         */
@@ -129,8 +128,7 @@ class FileRepo {
        }
 
        /**
-        * Prepare a single zone or list of zones for usage.
-        * See initDeletedDir() for additional setup needed for the 'deleted' zone.
+        * Check if a single zone or list of zones is defined for usage
         *
         * @param $doZones Array Only do a particular zones
         * @return Status
@@ -206,12 +204,13 @@ class FileRepo {
        }
 
        /**
-        * Get the backend storage path corresponding to a virtual URL
+        * Get the backend storage path corresponding to a virtual URL.
+        * Use this function wisely.
         *
         * @param $url string
         * @return string
         */
-       function resolveVirtualUrl( $url ) {
+       public function resolveVirtualUrl( $url ) {
                if ( substr( $url, 0, 9 ) != 'mwrepo://' ) {
                        throw new MWException( __METHOD__.': unknown protocol' );
                }
@@ -232,7 +231,7 @@ class FileRepo {
 
        /**
         * The the storage container and base path of a zone
-        * 
+        *
         * @param $zone string
         * @return Array (container, base path) or (null, null)
         */
@@ -247,7 +246,7 @@ class FileRepo {
         * Get the storage path corresponding to one of the zones
         *
         * @param $zone string
-        * @return string|null
+        * @return string|null Returns null if the zone is not defined
         */
        public function getZonePath( $zone ) {
                list( $container, $base ) = $this->getZoneLocation( $zone );
@@ -295,9 +294,9 @@ class FileRepo {
         *
         * @param $title Mixed: Title object or string
         * @param $options array Associative array of options:
-        *     time:           requested time for an archived image, or false for the
+        *     time:           requested time for a specific file version, or false for the
         *                     current version. An image object will be returned which was
-        *                     created at the specified time.
+        *                     created at the specified time (which may be archived or current).
         *
         *     ignoreRedirect: If true, do not follow file redirects
         *
@@ -361,7 +360,7 @@ class FileRepo {
         *     $repo->findFiles( $findBatch );
         * @return array
         */
-       public function findFiles( $items ) {
+       public function findFiles( array $items ) {
                $result = array();
                foreach ( $items as $item ) {
                        if ( is_array( $item ) ) {
@@ -391,7 +390,6 @@ class FileRepo {
         */
        public function findFileFromKey( $sha1, $options = array() ) {
                $time = isset( $options['time'] ) ? $options['time'] : false;
-
                # First try to find a matching current version of a file...
                if ( $this->fileFactoryKey ) {
                        $img = call_user_func( $this->fileFactoryKey, $sha1, $this, $time );
@@ -435,15 +433,6 @@ class FileRepo {
                return $this->url;
        }
 
-       /**
-        * Returns true if the repository uses a multi-level directory structure
-        *
-        * @return string
-        */
-       public function isHashed() {
-               return (bool)$this->hashLevels;
-       }
-
        /**
         * Get the URL of thumb.php
         *
@@ -506,7 +495,7 @@ class FileRepo {
         * @param $levels
         * @return string
         */
-       static function getHashPathForLevel( $name, $levels ) {
+       protected static function getHashPathForLevel( $name, $levels ) {
                if ( $levels == 0 ) {
                        return '';
                } else {
@@ -647,10 +636,13 @@ class FileRepo {
         * @return FileRepoStatus
         */
        public function store( $srcPath, $dstZone, $dstRel, $flags = 0 ) {
+               $this->assertWritableRepo(); // fail out if read-only
+
                $status = $this->storeBatch( array( array( $srcPath, $dstZone, $dstRel ) ), $flags );
                if ( $status->successCount == 0 ) {
                        $status->ok = false;
                }
+
                return $status;
        }
 
@@ -666,10 +658,11 @@ class FileRepo {
         *     self::SKIP_LOCKING      Skip any file locking when doing the store
         * @return FileRepoStatus
         */
-       public function storeBatch( $triplets, $flags = 0 ) {
-               $backend = $this->backend; // convenience
+       public function storeBatch( array $triplets, $flags = 0 ) {
+               $this->assertWritableRepo(); // fail out if read-only
 
                $status = $this->newGood();
+               $backend = $this->backend; // convenience
 
                $operations = array();
                $sourceFSFilesToDelete = array(); // cleanup for disk source files
@@ -740,54 +733,41 @@ class FileRepo {
 
        /**
         * Deletes a batch of files.
-        * Each file can be a (zone, rel) pair, virtual url, storage path, or FS path.
+        * Each file can be a (zone, rel) pair, virtual url, storage path.
         * It will try to delete each file, but ignores any errors that may occur.
         *
         * @param $pairs array List of files to delete
         * @param $flags Integer: bitwise combination of the following flags:
         *     self::SKIP_LOCKING      Skip any file locking when doing the deletions
-        * @return void
+        * @return FileRepoStatus
         */
-       public function cleanupBatch( $files, $flags = 0 ) {
+       public function cleanupBatch( array $files, $flags = 0 ) {
+               $this->assertWritableRepo(); // fail out if read-only
+
+               $status = $this->newGood();
+
                $operations = array();
-               $sourceFSFilesToDelete = array(); // cleanup for disk source files
-               foreach ( $files as $file ) {
-                       if ( is_array( $file ) ) {
+               foreach ( $files as $path ) {
+                       if ( is_array( $path ) ) {
                                // This is a pair, extract it
-                               list( $zone, $rel ) = $file;
-                               $root = $this->getZonePath( $zone );
-                               $path = "$root/$rel";
+                               list( $zone, $rel ) = $path;
+                               $path = $this->getZonePath( $zone ) . "/$rel";
                        } else {
-                               if ( self::isVirtualUrl( $file ) ) {
-                                       // This is a virtual url, resolve it
-                                       $path = $this->resolveVirtualUrl( $file );
-                               } else {
-                                       // This is a full file name
-                                       $path = $file;
+                               // Resolve source to a storage path if virtual
+                               if ( self::isVirtualUrl( $path ) ) {
+                                       $path = $this->resolveVirtualUrl( $path );
                                }
                        }
-                       // Get a file operation if needed
-                       if ( FileBackend::isStoragePath( $path ) ) {
-                               $operations[] = array(
-                                       'op'           => 'delete',
-                                       'src'          => $path,
-                               );
-                       } else {
-                               $sourceFSFilesToDelete[] = $path;
-                       }
+                       $operations[] = array( 'op' => 'delete', 'src' => $path );
                }
                // Actually delete files from storage...
                $opts = array( 'force' => true );
                if ( $flags & self::SKIP_LOCKING ) {
                        $opts['nonLocking'] = true;
                }
-               $this->backend->doOperations( $operations, $opts );
-               // Cleanup for disk source files...
-               foreach ( $sourceFSFilesToDelete as $file ) {
-                       wfSuppressWarnings();
-                       unlink( $file ); // FS cleanup
-                       wfRestoreWarnings();
-               }
+               $status->merge( $this->backend->doOperations( $operations, $opts ) );
+
+               return $status;
        }
 
        /**
@@ -795,13 +775,14 @@ class FileRepo {
         * Returns a FileRepoStatus object with the file Virtual URL in the value,
         * file can later be disposed using FileRepo::freeTemp().
         *
-        *
         * @param $originalName String: the base name of the file as specified
         *     by the user. The file extension will be maintained.
         * @param $srcPath String: the current location of the file.
         * @return FileRepoStatus object with the URL in the value.
         */
        public function storeTemp( $originalName, $srcPath ) {
+               $this->assertWritableRepo(); // fail out if read-only
+
                $date      = gmdate( "YmdHis" );
                $hashPath  = $this->getHashPath( $originalName );
                $dstRel    = "{$hashPath}{$date}!{$originalName}";
@@ -809,19 +790,22 @@ class FileRepo {
 
                $result = $this->store( $srcPath, 'temp', $dstRel, self::SKIP_LOCKING );
                $result->value = $this->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel;
+
                return $result;
        }
 
        /**
-        * Concatenate a list of files into a target file location. 
-        * 
+        * Concatenate a list of files into a target file location.
+        *
         * @param $srcPaths Array Ordered list of source virtual URLs/storage paths
         * @param $dstPath String Target file system path
         * @param $flags Integer: bitwise combination of the following flags:
         *     self::DELETE_SOURCE     Delete the source files
         * @return FileRepoStatus
         */
-       function concatenate( $srcPaths, $dstPath, $flags = 0 ) {
+       public function concatenate( array $srcPaths, $dstPath, $flags = 0 ) {
+               $this->assertWritableRepo(); // fail out if read-only
+
                $status = $this->newGood();
 
                $sources = array();
@@ -861,15 +845,16 @@ class FileRepo {
         * @return Boolean: true on success, false on failure
         */
        public function freeTemp( $virtualUrl ) {
+               $this->assertWritableRepo(); // fail out if read-only
+
                $temp = "mwrepo://{$this->name}/temp";
                if ( substr( $virtualUrl, 0, strlen( $temp ) ) != $temp ) {
                        wfDebug( __METHOD__.": Invalid temp virtual URL\n" );
                        return false;
                }
-               $path   = $this->resolveVirtualUrl( $virtualUrl );
-               $op     = array( 'op' => 'delete', 'src' => $path );
-               $status = $this->backend->doOperation( $op );
-               return $status->isOK();
+               $path = $this->resolveVirtualUrl( $virtualUrl );
+
+               return $this->cleanupBatch( array( $path ), self::SKIP_LOCKING )->isOK();
        }
 
        /**
@@ -888,6 +873,8 @@ class FileRepo {
         * @return FileRepoStatus
         */
        public function publish( $srcPath, $dstRel, $archiveRel, $flags = 0 ) {
+               $this->assertWritableRepo(); // fail out if read-only
+
                $status = $this->publishBatch( array( array( $srcPath, $dstRel, $archiveRel ) ), $flags );
                if ( $status->successCount == 0 ) {
                        $status->ok = false;
@@ -897,6 +884,7 @@ class FileRepo {
                } else {
                        $status->value = false;
                }
+
                return $status;
        }
 
@@ -908,9 +896,10 @@ class FileRepo {
         *        that the source files should be deleted if possible
         * @return FileRepoStatus
         */
-       public function publishBatch( $triplets, $flags = 0 ) {
-               $backend = $this->backend; // convenience
+       public function publishBatch( array $triplets, $flags = 0 ) {
+               $this->assertWritableRepo(); // fail out if read-only
 
+               $backend = $this->backend; // convenience
                // Try creating directories
                $status = $this->initZones( 'public' );
                if ( !$status->isOK() ) {
@@ -1014,12 +1003,10 @@ class FileRepo {
         * Checks existence of a a file
         *
         * @param $file string Virtual URL (or storage path) of file to check
-        * @param $flags Integer: bitwise combination of the following flags:
-        *     self::FILES_ONLY     Mark file as existing only if it is a file (not directory)
         * @return bool
         */
-       public function fileExists( $file, $flags = 0 ) {
-               $result = $this->fileExistsBatch( array( $file ), $flags );
+       public function fileExists( $file ) {
+               $result = $this->fileExistsBatch( array( $file ) );
                return $result[0];
        }
 
@@ -1027,27 +1014,16 @@ class FileRepo {
         * Checks existence of an array of files.
         *
         * @param $files Array: Virtual URLs (or storage paths) of files to check
-        * @param $flags Integer: bitwise combination of the following flags:
-        *     self::FILES_ONLY     Mark file as existing only if it is a file (not directory)
         * @return array|bool Either array of files and existence flags, or false
         */
-       public function fileExistsBatch( $files, $flags = 0 ) {
+       public function fileExistsBatch( array $files ) {
                $result = array();
                foreach ( $files as $key => $file ) {
                        if ( self::isVirtualUrl( $file ) ) {
                                $file = $this->resolveVirtualUrl( $file );
                        }
-                       if ( FileBackend::isStoragePath( $file ) ) {
-                               $result[$key] = $this->backend->fileExists( array( 'src' => $file ) );
-                       } else {
-                               if ( $flags & self::FILES_ONLY ) {
-                                       $result[$key] = is_file( $file ); // FS only
-                               } else {
-                                       $result[$key] = file_exists( $file ); // FS only
-                               }
-                       }
+                       $result[$key] = $this->backend->fileExists( array( 'src' => $file ) );
                }
-
                return $result;
        }
 
@@ -1062,6 +1038,8 @@ class FileRepo {
         * @return FileRepoStatus object
         */
        public function delete( $srcRel, $archiveRel ) {
+               $this->assertWritableRepo(); // fail out if read-only
+
                return $this->deleteBatch( array( array( $srcRel, $archiveRel ) ) );
        }
 
@@ -1081,8 +1059,8 @@ class FileRepo {
         *        to the deleted zone root in the second element.
         * @return FileRepoStatus
         */
-       public function deleteBatch( $sourceDestPairs ) {
-               $backend = $this->backend; // convenience
+       public function deleteBatch( array $sourceDestPairs ) {
+               $this->assertWritableRepo(); // fail out if read-only
 
                // Try creating directories
                $status = $this->initZones( array( 'public', 'deleted' ) );
@@ -1092,14 +1070,14 @@ class FileRepo {
 
                $status = $this->newGood();
 
+               $backend = $this->backend; // convenience
                $operations = array();
                // Validate filenames and create archive directories
                foreach ( $sourceDestPairs as $pair ) {
                        list( $srcRel, $archiveRel ) = $pair;
                        if ( !$this->validateFilename( $srcRel ) ) {
                                throw new MWException( __METHOD__.':Validation error in $srcRel' );
-                       }
-                       if ( !$this->validateFilename( $archiveRel ) ) {
+                       } elseif ( !$this->validateFilename( $archiveRel ) ) {
                                throw new MWException( __METHOD__.':Validation error in $archiveRel' );
                        }
 
@@ -1135,6 +1113,15 @@ class FileRepo {
                return $status;
        }
 
+       /**
+        * Delete files in the deleted directory if they are not referenced in the filearchive table
+        *
+        * STUB
+        */
+       public function cleanupDeletedBatch( array $storageKeys ) {
+               $this->assertWritableRepo();
+       }
+
        /**
         * Get a relative path for a deletion archive key,
         * e.g. s/z/a/ for sza251lrxrc1jad41h5mgilp8nysje52.jpg
@@ -1167,7 +1154,7 @@ class FileRepo {
        /**
         * Get a local FS copy of a file with a given virtual URL/storage path.
         * Temporary files may be purged when the file object falls out of scope.
-        * 
+        *
         * @param $virtualUrl string
         * @return TempFSFile|null Returns null on failure
         */
@@ -1180,7 +1167,7 @@ class FileRepo {
         * Get a local FS file with a given virtual URL/storage path.
         * The file is either an original or a copy. It should not be changed.
         * Temporary files may be purged when the file object falls out of scope.
-        * 
+        *
         * @param $virtualUrl string
         * @return FSFile|null Returns null on failure.
         */
@@ -1288,23 +1275,7 @@ class FileRepo {
                if ( strval( $filename ) == '' ) {
                        return false;
                }
-               if ( wfIsWindows() ) {
-                       $filename = strtr( $filename, '\\', '/' );
-               }
-               /**
-                * Use the same traversal protection as Title::secureAndSplit()
-                */
-               if ( strpos( $filename, '.' ) !== false &&
-                       ( $filename === '.' || $filename === '..' ||
-                               strpos( $filename, './' ) === 0  ||
-                               strpos( $filename, '../' ) === 0 ||
-                               strpos( $filename, '/./' ) !== false ||
-                               strpos( $filename, '/../' ) !== false ) )
-               {
-                       return false;
-               } else {
-                       return true;
-               }
+               return FileBackend::isPathTraversalFree( $filename );
        }
 
        /**
@@ -1315,11 +1286,9 @@ class FileRepo {
        function getErrorCleanupFunction() {
                switch ( $this->pathDisclosureProtection ) {
                        case 'none':
+                       case 'simple': // b/c
                                $callback = array( $this, 'passThrough' );
                                break;
-                       case 'simple':
-                               $callback = array( $this, 'simpleClean' );
-                               break;
                        default: // 'paranoid'
                                $callback = array( $this, 'paranoidClean' );
                }
@@ -1336,22 +1305,6 @@ class FileRepo {
                return '[hidden]';
        }
 
-       /**
-        * Path disclosure protection function
-        *
-        * @param $param string
-        * @return string
-        */
-       function simpleClean( $param ) {
-               global $IP;
-               if ( !isset( $this->simpleCleanPairs ) ) {
-                       $this->simpleCleanPairs = array(
-                               $IP => '$IP', // sanity
-                       );
-               }
-               return strtr( $param, $this->simpleCleanPairs );
-       }
-
        /**
         * Path disclosure protection function
         *
@@ -1367,7 +1320,7 @@ class FileRepo {
         *
         * @return FileRepoStatus
         */
-       function newFatal( $message /*, parameters...*/ ) {
+       public function newFatal( $message /*, parameters...*/ ) {
                $params = func_get_args();
                array_unshift( $params, $this );
                return MWInit::callStaticMethod( 'FileRepoStatus', 'newFatal', $params );
@@ -1378,17 +1331,10 @@ class FileRepo {
         *
         * @return FileRepoStatus
         */
-       function newGood( $value = null ) {
+       public function newGood( $value = null ) {
                return FileRepoStatus::newGood( $this, $value );
        }
 
-       /**
-        * Delete files in the deleted directory if they are not referenced in the filearchive table
-        *
-        * STUB
-        */
-       public function cleanupDeletedBatch( $storageKeys ) {}
-
        /**
         * Checks if there is a redirect named as $title. If there is, return the
         * title object. If not, return false.
@@ -1441,7 +1387,7 @@ class FileRepo {
         * STUB
         * @return bool
         */
-       function getSharedCacheKey( /*...*/ ) {
+       public function getSharedCacheKey( /*...*/ ) {
                return false;
        }
 
@@ -1452,7 +1398,7 @@ class FileRepo {
         *
         * @return string
         */
-       function getLocalCacheKey( /*...*/ ) {
+       public function getLocalCacheKey( /*...*/ ) {
                $args = func_get_args();
                array_unshift( $args, 'filerepo', $this->getName() );
                return call_user_func_array( 'wfMemcKey', $args );
@@ -1466,4 +1412,13 @@ class FileRepo {
        public function getUploadStash() {
                return new UploadStash( $this );
        }
+
+       /**
+        * Throw an exception if this repo is read-only by design.
+        * This does not and should not check getReadOnlyReason().
+        *
+        * @return void
+        * @throws MWException
+        */
+       protected function assertWritableRepo() {}
 }
index ea15a49..ba2694e 100644 (file)
@@ -75,40 +75,7 @@ class ForeignAPIRepo extends FileRepo {
                return parent::newFile( $title, $time );
        }
 
-       /**
-        * No-ops
-        * @return bool
-        */
-
-       function storeBatch( $triplets, $flags = 0 ) {
-               return false;
-       }
-
-       function storeTemp( $originalName, $srcPath ) {
-               return false;
-       }
-
-       function concatenate( $fileList, $targetPath, $flags = 0 ){
-               return false;
-       }
-
-       function append( $srcPath, $toAppendPath, $flags = 0 ){
-               return false;
-       }
-
-       function appendFinish( $toAppendPath ){
-               return false;
-       }
-
-       function publishBatch( $triplets, $flags = 0 ) {
-               return false;
-       }
-
-       function deleteBatch( $sourceDestPairs ) {
-               return false;
-       }
-
-       function fileExistsBatch( $files, $flags = 0 ) {
+       function fileExistsBatch( array $files ) {
                $results = array();
                foreach ( $files as $k => $f ) {
                        if ( isset( $this->mFileExists[$k] ) ) {
@@ -385,4 +352,8 @@ class ForeignAPIRepo extends FileRepo {
        function enumFiles( $callback ) {
                throw new MWException( 'enumFiles is not supported by ' . get_class( $this ) );
        }
+
+       protected function assertWritableRepo() {
+               throw new MWException( get_class( $this ) . ': write operations are not supported.' );
+       }
 }
index 8eab72f..30f9977 100644 (file)
@@ -73,13 +73,7 @@ class ForeignDBRepo extends LocalRepo {
                }
        }
 
-       function store( $srcPath, $dstZone, $dstRel, $flags = 0 ) {
-               throw new MWException( get_class($this) . ': write operations are not supported' );
-       }
-       function publish( $srcPath, $dstRel, $archiveRel, $flags = 0 ) {
-               throw new MWException( get_class($this) . ': write operations are not supported' );
-       }
-       function deleteBatch( $sourceDestPairs ) {
-               throw new MWException( get_class($this) . ': write operations are not supported' );
+       protected function assertWritableRepo() {
+               throw new MWException( get_class( $this ) . ': write operations are not supported.' );
        }
 }
index 45dad1a..602902d 100644 (file)
@@ -51,13 +51,7 @@ class ForeignDBViaLBRepo extends LocalRepo {
                }
        }
 
-       function store( $srcPath, $dstZone, $dstRel, $flags = 0 ) {
-               throw new MWException( get_class($this) . ': write operations are not supported' );
-       }
-       function publish( $srcPath, $dstRel, $archiveRel, $flags = 0 ) {
-               throw new MWException( get_class($this) . ': write operations are not supported' );
-       }
-       function deleteBatch( $fileMap ) {
-               throw new MWException( get_class($this) . ': write operations are not supported' );
+       protected function assertWritableRepo() {
+               throw new MWException( get_class( $this ) . ': write operations are not supported.' );
        }
 }
index c8677b7..eecd67a 100644 (file)
@@ -55,7 +55,7 @@ class LocalRepo extends FileRepo {
         *
         * @return FileRepoStatus
         */
-       function cleanupDeletedBatch( $storageKeys ) {
+       function cleanupDeletedBatch( array $storageKeys ) {
                $backend = $this->backend; // convenience
                $root = $this->getZonePath( 'deleted' );
                $dbw = $this->getMasterDB();
index 65318f4..9d58bc8 100644 (file)
 class NullRepo extends FileRepo {
        function __construct( $info ) {}
 
-       function storeBatch( $triplets, $flags = 0 ) {
-               return false;
-       }
-
-       function storeTemp( $originalName, $srcPath ) {
-               return false;
-       }
-       function append( $srcPath, $toAppendPath, $flags = 0 ){
-               return false;
-       }
-       function appendFinish( $toAppendPath ){
-               return false;
-       }
-       function publishBatch( $triplets, $flags = 0 ) {
-               return false;
-       }
-       function deleteBatch( $sourceDestPairs ) {
-               return false;
-       }
-       function fileExistsBatch( $files, $flags = 0 ) {
-               return false;
-       }
-       function getFileProps( $virtualUrl ) {
-               return false;
-       }
-       function newFile( $title, $time = false ) {
-               return false;
-       }
-       function findFile( $title, $options = array() ) {
-               return false;
-       }
-       function concatenate( $fileList, $targetPath, $flags = 0 ) {
-               return false;
+       protected function assertWritableRepo() {
+               throw new MWException( get_class( $this ) . ': write operations are not supported.' );
        }
 }
index 8096336..b109803 100644 (file)
@@ -12,7 +12,6 @@
  * @ingroup FileRepo
  */
 class RepoGroup {
-
        /**
         * @var LocalRepo
         */
@@ -26,7 +25,7 @@ class RepoGroup {
         * @var RepoGroup
         */
        protected static $instance;
-       const MAX_CACHE_SIZE = 1000;
+       const MAX_CACHE_SIZE = 500;
 
        /**
         * Get a RepoGroup instance. At present only one instance of RepoGroup is
@@ -114,48 +113,41 @@ class RepoGroup {
                        && empty( $options['private'] )
                        && empty( $options['bypassCache'] ) )
                {
-                       $useCache = true;
                        $time = isset( $options['time'] ) ? $options['time'] : '';
                        $dbkey = $title->getDBkey();
                        if ( isset( $this->cache[$dbkey][$time] ) ) {
                                wfDebug( __METHOD__.": got File:$dbkey from process cache\n" );
                                # Move it to the end of the list so that we can delete the LRU entry later
-                               $tmp = $this->cache[$dbkey];
-                               unset( $this->cache[$dbkey] );
-                               $this->cache[$dbkey] = $tmp;
+                               $this->pingCache( $dbkey );
                                # Return the entry
                                return $this->cache[$dbkey][$time];
-                       } else {
-                               # Add a negative cache entry, may be overridden
-                               $this->trimCache();
-                               $this->cache[$dbkey][$time] = false;
-                               $cacheEntry =& $this->cache[$dbkey][$time];
                        }
+                       $useCache = true;
                } else {
                        $useCache = false;
                }
 
                # Check the local repo
                $image = $this->localRepo->findFile( $title, $options );
-               if ( $image ) {
-                       if ( $useCache ) {
-                               $cacheEntry = $image;
-                       }
-                       return $image;
-               }
 
                # Check the foreign repos
-               foreach ( $this->foreignRepos as $repo ) {
-                       $image = $repo->findFile( $title, $options );
-                       if ( $image ) {
-                               if ( $useCache ) {
-                                       $cacheEntry = $image;
+               if ( !$image ) {
+                       foreach ( $this->foreignRepos as $repo ) {
+                               $image = $repo->findFile( $title, $options );
+                               if ( $image ) {
+                                       break;
                                }
-                               return $image;
                        }
                }
-               # Not found, do not override negative cache
-               return false;
+
+               $image = $image ? $image : false; // type sanity
+               # Cache file existence or non-existence
+               if ( $useCache && ( !$image || $image->isCacheable() ) ) {
+                       $this->trimCache();
+                       $this->cache[$dbkey][$time] = $image;
+               }
+
+               return $image;
        }
 
        function findFiles( $inputItems ) {
@@ -371,6 +363,17 @@ class RepoGroup {
                }
        }
 
+       /**
+        * Move a cache entry to the top (such as when accessed)
+        */
+       protected function pingCache( $key ) {
+               if ( isset( $this->cache[$key] ) ) {
+                       $tmp = $this->cache[$key];
+                       unset( $this->cache[$key] );
+                       $this->cache[$key] = $tmp;
+               }
+       }
+
        /**
         * Limit cache memory
         */
index 9d82b5e..44f4d94 100644 (file)
@@ -692,11 +692,23 @@ abstract class FileBackend {
                return strtolower( $i ? substr( $path, $i + 1 ) : '' );
        }
 
+       /**
+        * Check if a relative path has no directory traversals
+        *
+        * @param $path string
+        * @return bool
+        */
+       final public static function isPathTraversalFree( $path ) {
+               return ( self::normalizeContainerPath( $path ) !== null );
+       }
+
        /**
         * Validate and normalize a relative storage path.
         * Null is returned if the path involves directory traversal.
         * Traversal is insecure for FS backends and broken for others.
         *
+        * This uses the same traversal protection as Title::secureAndSplit().
+        *
         * @param $path string Storage path relative to a container
         * @return string|null
         */
index 268ccb8..8c849ca 100644 (file)
  *
  * This class defines the methods as abstract that subclasses must implement.
  * Outside callers should *not* use functions with "Internal" in the name.
- * 
+ *
  * The FileBackend operations are implemented using basic functions
  * such as storeInternal(), copyInternal(), deleteInternal() and the like.
  * This class is also responsible for path resolution and sanitization.
- * 
+ *
  * @ingroup FileBackend
  * @since 1.19
  */
@@ -35,8 +35,8 @@ abstract class FileBackendStore extends FileBackend {
         * Get the maximum allowable file size given backend
         * medium restrictions and basic performance constraints.
         * Do not call this function from places outside FileBackend and FileOp.
-        * 
-        * @return integer Bytes 
+        *
+        * @return integer Bytes
         */
        final public function maxFileSizeInternal() {
                return $this->maxFileSize;
@@ -55,12 +55,12 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Create a file in the backend with the given contents.
         * Do not call this function from places outside FileBackend and FileOp.
-        * 
+        *
         * $params include:
         *     content       : the raw file contents
         *     dst           : destination storage path
         *     overwrite     : overwrite any file that exists at the destination
-        * 
+        *
         * @param $params Array
         * @return Status
         */
@@ -87,12 +87,12 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Store a file into the backend from a file on disk.
         * Do not call this function from places outside FileBackend and FileOp.
-        * 
+        *
         * $params include:
         *     src           : source path on disk
         *     dst           : destination storage path
         *     overwrite     : overwrite any file that exists at the destination
-        * 
+        *
         * @param $params Array
         * @return Status
         */
@@ -118,12 +118,12 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Copy a file from one storage path to another in the backend.
         * Do not call this function from places outside FileBackend and FileOp.
-        * 
+        *
         * $params include:
         *     src           : source storage path
         *     dst           : destination storage path
         *     overwrite     : overwrite any file that exists at the destination
-        * 
+        *
         * @param $params Array
         * @return Status
         */
@@ -145,11 +145,11 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Delete a file at the storage path.
         * Do not call this function from places outside FileBackend and FileOp.
-        * 
+        *
         * $params include:
         *     src                 : source storage path
         *     ignoreMissingSource : do nothing if the source file does not exist
-        * 
+        *
         * @param $params Array
         * @return Status
         */
@@ -171,12 +171,12 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Move a file from one storage path to another in the backend.
         * Do not call this function from places outside FileBackend and FileOp.
-        * 
+        *
         * $params include:
         *     src           : source storage path
         *     dst           : destination storage path
         *     overwrite     : overwrite any file that exists at the destination
-        * 
+        *
         * @param $params Array
         * @return Status
         */
@@ -468,6 +468,7 @@ abstract class FileBackendStore extends FileBackend {
                        // If we want the latest data, check that this cached
                        // value was in fact fetched with the latest available data.
                        if ( !$latest || $this->cache[$path]['stat']['latest'] ) {
+                               $this->pingCache( $path ); // LRU
                                wfProfileOut( __METHOD__ . '-' . $this->name );
                                wfProfileOut( __METHOD__ );
                                return $this->cache[$path]['stat'];
@@ -523,6 +524,7 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ . '-' . $this->name );
                $path = $params['src'];
                if ( isset( $this->cache[$path]['sha1'] ) ) {
+                       $this->pingCache( $path ); // LRU
                        wfProfileOut( __METHOD__ . '-' . $this->name );
                        wfProfileOut( __METHOD__ );
                        return $this->cache[$path]['sha1'];
@@ -577,6 +579,7 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ . '-' . $this->name );
                $path = $params['src'];
                if ( isset( $this->expensiveCache[$path]['localRef'] ) ) {
+                       $this->pingExpensiveCache();
                        wfProfileOut( __METHOD__ . '-' . $this->name );
                        wfProfileOut( __METHOD__ );
                        return $this->expensiveCache[$path]['localRef'];
@@ -667,7 +670,7 @@ abstract class FileBackendStore extends FileBackend {
         * Do not call this function from places outside FileBackend
         *
         * @see FileBackendStore::getFileList()
-        * 
+        *
         * @param $container string Resolved container name
         * @param $dir string Resolved path relative to container
         * @param $params Array
@@ -677,7 +680,7 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * Get the list of supported operations and their corresponding FileOp classes.
-        * 
+        *
         * @return Array
         */
        protected function supportedOperations() {
@@ -697,7 +700,7 @@ abstract class FileBackendStore extends FileBackend {
         *
         * The result must have the same number of items as the input.
         * An exception is thrown if an unsupported operation is requested.
-        * 
+        *
         * @param $ops Array Same format as doOperations()
         * @return Array List of FileOp objects
         * @throws MWException
@@ -794,17 +797,30 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * Clears any additional stat caches for storage paths
-        * 
+        *
         * @see FileBackend::clearCache()
-        * 
+        *
         * @param $paths Array Storage paths (optional)
         * @return void
         */
        protected function doClearCache( array $paths = null ) {}
 
+       /**
+        * Move a cache entry to the top (such as when accessed)
+        *
+        * @param $path string Storage path
+        */
+       protected function pingCache( $path ) {
+               if ( isset( $this->cache[$path] ) ) {
+                       $tmp = $this->cache[$path];
+                       unset( $this->cache[$path] );
+                       $this->cache[$path] = $tmp;
+               }
+       }
+
        /**
         * Prune the inexpensive cache if it is too big to add an item
-        * 
+        *
         * @return void
         */
        protected function trimCache() {
@@ -814,9 +830,22 @@ abstract class FileBackendStore extends FileBackend {
                }
        }
 
+       /**
+        * Move a cache entry to the top (such as when accessed)
+        *
+        * @param $path string Storage path
+        */
+       protected function pingExpensiveCache( $path ) {
+               if ( isset( $this->expensiveCache[$path] ) ) {
+                       $tmp = $this->expensiveCache[$path];
+                       unset( $this->expensiveCache[$path] );
+                       $this->expensiveCache[$path] = $tmp;
+               }
+       }
+
        /**
         * Prune the expensive cache if it is too big to add an item
-        * 
+        *
         * @return void
         */
        protected function trimExpensiveCache() {
@@ -829,12 +858,12 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Check if a container name is valid.
         * This checks for for length and illegal characters.
-        * 
+        *
         * @param $container string
         * @return bool
         */
        final protected static function isValidContainerName( $container ) {
-               // This accounts for Swift and S3 restrictions while leaving room 
+               // This accounts for Swift and S3 restrictions while leaving room
                // for things like '.xxx' (hex shard chars) or '.seg' (segments).
                // This disallows directory separators or traversal characters.
                // Note that matching strings URL encode to the same string;
@@ -957,9 +986,9 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * Get a list of full container shard suffixes for a container
-        * 
+        *
         * @param $container string
-        * @return Array 
+        * @return Array
         */
        final protected function getContainerSuffixes( $container ) {
                $shards = array();
@@ -975,9 +1004,9 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * Get the full container name, including the wiki ID prefix
-        * 
+        *
         * @param $container string
-        * @return string 
+        * @return string
         */
        final protected function fullContainerName( $container ) {
                if ( $this->wikiId != '' ) {
@@ -991,9 +1020,9 @@ abstract class FileBackendStore extends FileBackend {
         * Resolve a container name, checking if it's allowed by the backend.
         * This is intended for internal use, such as encoding illegal chars.
         * Subclasses can override this to be more restrictive.
-        * 
+        *
         * @param $container string
-        * @return string|null 
+        * @return string|null
         */
        protected function resolveContainerName( $container ) {
                return $container;
index 543f23f..ce69a03 100644 (file)
@@ -755,7 +755,7 @@ abstract class File {
 
        /**
         * Return either a MediaTransformError or placeholder thumbnail (if $wgIgnoreImageErrors)
-        * 
+        *
         * @param $thumbPath string Thumbnail storage path
         * @param $thumbUrl string Thumbnail URL
         * @param $params Array
@@ -1258,7 +1258,7 @@ abstract class File {
         */
        function isHashed() {
                $this->assertRepoDefined();
-               return $this->repo->isHashed();
+               return (bool)$this->repo->getHashLevels();
        }
 
        /**
@@ -1705,6 +1705,14 @@ abstract class File {
                return false;
        }
 
+       /**
+        * Check if this file object is small and can be cached
+        * @return boolean
+        */
+       public function isCacheable() {
+               return true;
+       }
+
        /**
         * Assert that $this->repo is set to a valid FileRepo instance
         * @throws MWException
index 7be554d..40ee0fa 100644 (file)
@@ -29,6 +29,8 @@ define( 'MW_FILE_VERSION', 8 );
  * @ingroup FileAbstraction
  */
 class LocalFile extends File {
+       const CACHE_FIELD_MAX_LEN = 1000;
+
        /**#@+
         * @private
         */
@@ -468,7 +470,7 @@ class LocalFile extends File {
 
        function isMissing() {
                if ( $this->missing === null ) {
-                       list( $fileExists ) = $this->repo->fileExists( $this->getVirtualUrl(), FileRepo::FILES_ONLY );
+                       list( $fileExists ) = $this->repo->fileExists( $this->getVirtualUrl() );
                        $this->missing = !$fileExists;
                }
                return $this->missing;
@@ -615,7 +617,7 @@ class LocalFile extends File {
                }
                */
 
-               if ( $this->repo->fileExists( $thumbDir, FileRepo::FILES_ONLY ) ) {
+               if ( $this->repo->fileExists( $thumbDir ) ) {
                        // Delete file where directory should be
                        $this->repo->cleanupBatch( array( $thumbDir ) );
                }
@@ -1021,9 +1023,9 @@ class LocalFile extends File {
                );
 
                if ( $dbw->affectedRows() == 0 ) {
-                       # (bug 34993) Note: $oldver can be empty here, if the previous 
-                       # version of the file was broken. Allow registration of the new 
-                       # version to continue anyway, because that's better than having 
+                       # (bug 34993) Note: $oldver can be empty here, if the previous
+                       # version of the file was broken. Allow registration of the new
+                       # version to continue anyway, because that's better than having
                        # an image that's not fixable by user operations.
 
                        $reupload = true;
@@ -1431,6 +1433,11 @@ class LocalFile extends File {
                return $this->sha1;
        }
 
+       function isCacheable() {
+               $this->load();
+               return strlen( $this->metadata ) <= self::CACHE_FIELD_MAX_LEN; // avoid OOMs
+       }
+
        /**
         * Start a transaction and lock the image for update
         * Increments a reference counter if the lock is already held
@@ -1787,7 +1794,7 @@ class LocalFileDeleteBatch {
                        $files[$src] = $this->file->repo->getVirtualUrl( 'public' ) . '/' . rawurlencode( $src );
                }
 
-               $result = $this->file->repo->fileExistsBatch( $files, FileRepo::FILES_ONLY );
+               $result = $this->file->repo->fileExistsBatch( $files );
 
                foreach ( $batch as $batchItem ) {
                        if ( $result[$batchItem[0]] ) {
@@ -2077,7 +2084,7 @@ class LocalFileRestoreBatch {
                foreach ( $triplets as $file )
                        $files[$file[0]] = $file[0];
 
-               $result = $this->file->repo->fileExistsBatch( $files, FileRepo::FILES_ONLY );
+               $result = $this->file->repo->fileExistsBatch( $files );
 
                foreach ( $triplets as $file ) {
                        if ( $result[$file[0]] ) {
@@ -2101,7 +2108,7 @@ class LocalFileRestoreBatch {
                                rawurlencode( $repo->getDeletedHashPath( $file ) . $file );
                }
 
-               $result = $repo->fileExistsBatch( $files, FileRepo::FILES_ONLY );
+               $result = $repo->fileExistsBatch( $files );
 
                foreach ( $batch as $file ) {
                        if ( $result[$file] ) {
@@ -2354,7 +2361,7 @@ class LocalFileMoveBatch {
                        $files[$file[0]] = $file[0];
                }
 
-               $result = $this->file->repo->fileExistsBatch( $files, FileRepo::FILES_ONLY );
+               $result = $this->file->repo->fileExistsBatch( $files );
                $filteredTriplets = array();
 
                foreach ( $triplets as $file ) {
index e578f27..35d03c4 100644 (file)
@@ -55,6 +55,7 @@ class CoreParserFunctions {
                $parser->setFunctionHook( 'padright',         array( __CLASS__, 'padright'         ), SFH_NO_HASH );
                $parser->setFunctionHook( 'anchorencode',     array( __CLASS__, 'anchorencode'     ), SFH_NO_HASH );
                $parser->setFunctionHook( 'special',          array( __CLASS__, 'special'          ) );
+               $parser->setFunctionHook( 'speciale',         array( __CLASS__, 'speciale'         ) );
                $parser->setFunctionHook( 'defaultsort',      array( __CLASS__, 'defaultsort'      ), SFH_NO_HASH );
                $parser->setFunctionHook( 'filepath',         array( __CLASS__, 'filepath'         ), SFH_NO_HASH );
                $parser->setFunctionHook( 'pagesincategory',  array( __CLASS__, 'pagesincategory'  ), SFH_NO_HASH );
@@ -692,12 +693,16 @@ class CoreParserFunctions {
                list( $page, $subpage ) = SpecialPageFactory::resolveAlias( $text );
                if ( $page ) {
                        $title = SpecialPage::getTitleFor( $page, $subpage );
-                       return $title;
+                       return $title->getPrefixedText();
                } else {
                        return wfMsgForContent( 'nosuchspecialpage' );
                }
        }
 
+       static function speciale( $parser, $text ) {
+               return wfUrlencode( str_replace( ' ', '_', self::special( $parser, $text ) ) );
+       }
+
        /**
         * @param $parser Parser
         * @param $text String The sortkey to use
index a6719c8..40856ca 100644 (file)
@@ -294,6 +294,7 @@ class DeletedContributionsPage extends SpecialPage {
                        $out->addHTML( $this->getForm( '' ) );
                        return;
                }
+               $this->getSkin()->setRelevantUser( $userObj );
 
                $target = $userObj->getName();
                $out->addSubtitle( $this->getSubTitle( $userObj ) );
index 393cf7e..6b817d2 100644 (file)
@@ -141,13 +141,13 @@ class MovePageForm extends UnlistedSpecialPage {
                        && $newTitle->quickUserCan( 'delete', $user )
                ) {
                        $out->addWikiMsg( 'delete_and_move_text', $newTitle->getPrefixedText() );
-                       $movepagebtn = wfMsg( 'delete_and_move' );
+                       $movepagebtn = $this->msg( 'delete_and_move' )->text();
                        $submitVar = 'wpDeleteAndMove';
                        $confirm = "
                                <tr>
                                        <td></td>
                                        <td class='mw-input'>" .
-                                               Xml::checkLabel( wfMsg( 'delete_and_move_confirm' ), 'wpConfirm', 'wpConfirm' ) .
+                                               Xml::checkLabel( $this->msg( 'delete_and_move_confirm' )->text(), 'wpConfirm', 'wpConfirm' ) .
                                        "</td>
                                </tr>";
                        $err = array();
@@ -157,7 +157,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        }
                        $out->addWikiMsg( $wgFixDoubleRedirects ? 'movepagetext' :
                                'movepagetext-noredirectfixer' );
-                       $movepagebtn = wfMsg( 'movepagebtn' );
+                       $movepagebtn = $this->msg( 'movepagebtn' )->text();
                        $submitVar = 'wpMove';
                        $confirm = false;
                }
@@ -249,11 +249,11 @@ class MovePageForm extends UnlistedSpecialPage {
                $out->addHTML(
                         Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL( 'action=submit' ), 'id' => 'movepage' ) ) .
                         Xml::openElement( 'fieldset' ) .
-                        Xml::element( 'legend', null, wfMsg( 'move-page-legend' ) ) .
+                        Xml::element( 'legend', null, $this->msg( 'move-page-legend' )->text() ) .
                         Xml::openElement( 'table', array( 'border' => '0', 'id' => 'mw-movepage-table' ) ) .
                         "<tr>
                                <td class='mw-label'>" .
-                                       wfMsgHtml( 'movearticle' ) .
+                                       $this->msg( 'movearticle' )->escaped() .
                                "</td>
                                <td class='mw-input'>
                                        <strong>{$oldTitleLink}</strong>
@@ -261,7 +261,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        </tr>
                        <tr>
                                <td class='mw-label'>" .
-                                       Xml::label( wfMsg( 'newtitle' ), 'wpNewTitleMain' ) .
+                                       Xml::label( $this->msg( 'newtitle' )->text(), 'wpNewTitleMain' ) .
                                "</td>
                                <td class='mw-input'>" .
                                        Html::namespaceSelector(
@@ -278,7 +278,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        </tr>
                        <tr>
                                <td class='mw-label'>" .
-                                       Xml::label( wfMsg( 'movereason' ), 'wpReason' ) .
+                                       Xml::label( $this->msg( 'movereason' )->text(), 'wpReason' ) .
                                "</td>
                                <td class='mw-input'>" .
                                        Html::element( 'textarea', array( 'name' => 'wpReason', 'id' => 'wpReason', 'cols' => 60, 'rows' => 2,
@@ -292,7 +292,7 @@ class MovePageForm extends UnlistedSpecialPage {
                                <tr>
                                        <td></td>
                                        <td class='mw-input'>" .
-                                               Xml::checkLabel( wfMsg( 'movetalk' ), 'wpMovetalk', 'wpMovetalk', $this->moveTalk ) .
+                                               Xml::checkLabel( $this->msg( 'movetalk' )->text(), 'wpMovetalk', 'wpMovetalk', $this->moveTalk ) .
                                        "</td>
                                </tr>"
                        );
@@ -303,7 +303,7 @@ class MovePageForm extends UnlistedSpecialPage {
                                <tr>
                                        <td></td>
                                        <td class='mw-input' >" .
-                                               Xml::checkLabel( wfMsg( 'move-leave-redirect' ), 'wpLeaveRedirect',
+                                               Xml::checkLabel( $this->msg( 'move-leave-redirect' )->text(), 'wpLeaveRedirect',
                                                        'wpLeaveRedirect', $this->leaveRedirect ) .
                                        "</td>
                                </tr>"
@@ -315,7 +315,7 @@ class MovePageForm extends UnlistedSpecialPage {
                                <tr>
                                        <td></td>
                                        <td class='mw-input' >" .
-                                               Xml::checkLabel( wfMsg( 'fix-double-redirects' ), 'wpFixRedirects',
+                                               Xml::checkLabel( $this->msg( 'fix-double-redirects' )->text(), 'wpFixRedirects',
                                                        'wpFixRedirects', $this->fixRedirects ) .
                                        "</td>
                                </tr>"
@@ -335,15 +335,11 @@ class MovePageForm extends UnlistedSpecialPage {
                                        array( 'id' => 'wpMovesubpages' )
                                ) . '&#160;' .
                                Xml::tags( 'label', array( 'for' => 'wpMovesubpages' ),
-                                       wfMsgExt(
+                                       $this->msg(
                                                ( $this->oldTitle->hasSubpages()
                                                        ? 'move-subpages'
-                                                       : 'move-talk-subpages' ),
-                                               array( 'parseinline' ),
-                                               $this->getLanguage()->formatNum( $wgMaximumMovedPages ),
-                                               # $2 to allow use of PLURAL in message.
-                                               $wgMaximumMovedPages
-                                       )
+                                                       : 'move-talk-subpages' )
+                                               )->numParams( $wgMaximumMovedPages )->params( $wgMaximumMovedPages )->parse()
                                ) .
                                        "</td>
                                </tr>"
@@ -358,7 +354,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        <tr>
                                <td></td>
                                <td class='mw-input'>" .
-                                       Xml::checkLabel( wfMsg( 'move-watch' ), 'wpWatch', 'watch', $watchChecked ) .
+                                       Xml::checkLabel( $this->msg( 'move-watch' )->text(), 'wpWatch', 'watch', $watchChecked ) .
                                "</td>
                        </tr>");
                }
@@ -421,7 +417,7 @@ class MovePageForm extends UnlistedSpecialPage {
                                return;
                        }
 
-                       $reason = wfMessage( 'delete_and_move_reason', $ot )->inContentLanguage()->text();
+                       $reason = $this->msg( 'delete_and_move_reason', $ot )->inContentLanguage()->text();
 
                        // Delete an associated image if there is
                        if ( $nt->getNamespace() == NS_FILE ) {
@@ -472,7 +468,7 @@ class MovePageForm extends UnlistedSpecialPage {
                $newText = $nt->getPrefixedText();
 
                $msgName = $createRedirect ? 'movepage-moved-redirect' : 'movepage-moved-noredirect';
-               $out->addHTML( wfMessage( 'movepage-moved' )->rawParams( $oldLink,
+               $out->addHTML( $this->msg( 'movepage-moved' )->rawParams( $oldLink,
                        $newLink )->params( $oldText, $newText )->parseAsBlock() );
                $out->addWikiMsg( $msgName );
 
@@ -562,15 +558,15 @@ class MovePageForm extends UnlistedSpecialPage {
                        $newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
                        if( !$newSubpage ) {
                                $oldLink = Linker::linkKnown( $oldSubpage );
-                               $extraOutput []= wfMsgHtml( 'movepage-page-unmoved', $oldLink,
-                                       htmlspecialchars(Title::makeName( $newNs, $newPageName )));
+                               $extraOutput []= $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink
+                                       )->params( Title::makeName( $newNs, $newPageName ) )->escaped();
                                continue;
                        }
 
                        # This was copy-pasted from Renameuser, bleh.
                        if ( $newSubpage->exists() && !$oldSubpage->isValidMoveTarget( $newSubpage ) ) {
                                $link = Linker::linkKnown( $newSubpage );
-                               $extraOutput []= wfMsgHtml( 'movepage-page-exists', $link );
+                               $extraOutput []= $this->msg( 'movepage-page-exists' )->rawParams( $link )->escaped();
                        } else {
                                $success = $oldSubpage->moveTo( $newSubpage, true, $this->reason, $createRedirect );
                                if( $success === true ) {
@@ -584,16 +580,16 @@ class MovePageForm extends UnlistedSpecialPage {
                                                array( 'redirect' => 'no' )
                                        );
                                        $newLink = Linker::linkKnown( $newSubpage );
-                                       $extraOutput []= wfMsgHtml( 'movepage-page-moved', $oldLink, $newLink );
+                                       $extraOutput []= $this->msg( 'movepage-page-moved' )->rawParams( $oldLink, $newLink )->escaped();
                                        ++$count;
                                        if( $count >= $wgMaximumMovedPages ) {
-                                               $extraOutput []= wfMsgExt( 'movepage-max-pages', array( 'parsemag', 'escape' ), $this->getLanguage()->formatNum( $wgMaximumMovedPages ) );
+                                               $extraOutput []= $this->msg( 'movepage-max-pages' )->numParams( $wgMaximumMovedPages )->escaped();
                                                break;
                                        }
                                } else {
                                        $oldLink = Linker::linkKnown( $oldSubpage );
                                        $newLink = Linker::link( $newSubpage );
-                                       $extraOutput []= wfMsgHtml( 'movepage-page-unmoved', $oldLink, $newLink );
+                                       $extraOutput []= $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink, $newLink )->escaped();
                                }
                        }
 
index c05aaad..bfc5248 100644 (file)
@@ -568,14 +568,14 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $submit = ' ' . Xml::submitbutton( wfMsg( 'allpagessubmit' ) );
 
                $out = Xml::openElement( 'table', array( 'class' => 'mw-recentchanges-table' ) );
-               foreach( $extraOpts as $name => $optionRow ) {
+               foreach( $extraOpts as $optionRow ) {
                        # Add submit button to the last row only
                        ++$count;
-                       $addSubmit = ( $count === $extraOptsCount ) ? $submit : '';
+                       $addSubmit = $count === $extraOptsCount ? $submit : '';
 
                        $out .= Xml::openElement( 'tr' );
                        if( is_array( $optionRow ) ) {
-                               $out .= Xml::tags( 'td', array( 'class' => 'mw-label mw-' . $name . '-label' ), $optionRow[0] );
+                               $out .= Xml::tags( 'td', array( 'class' => 'mw-label' ), $optionRow[0] );
                                $out .= Xml::tags( 'td', array( 'class' => 'mw-input' ), $optionRow[1] . $addSubmit );
                        } else {
                                $out .= Xml::tags( 'td', array( 'class' => 'mw-input', 'colspan' => 2 ), $optionRow . $addSubmit );
index 009c9b6..e347408 100644 (file)
@@ -499,7 +499,7 @@ class UploadStashFile extends UnregisteredLocalFile {
                        }
 
                        // check if path exists! and is a plain file.
-                       if ( ! $repo->fileExists( $path, FileRepo::FILES_ONLY ) ) {
+                       if ( ! $repo->fileExists( $path ) ) {
                                wfDebug( "UploadStash: tried to construct an UploadStashFile from a file that should already exist at '$path', but path is not found\n" );
                                throw new UploadStashFileNotFoundException( 'cannot find path, or not a plain file' );
                        }
@@ -623,7 +623,7 @@ class UploadStashFile extends UnregisteredLocalFile {
         * @return Status: success
         */
        public function remove() {
-               if ( !$this->repo->fileExists( $this->path, FileRepo::FILES_ONLY ) ) {
+               if ( !$this->repo->fileExists( $this->path ) ) {
                        // Maybe the file's already been removed? This could totally happen in UploadBase.
                        return true;
                }
@@ -632,7 +632,7 @@ class UploadStashFile extends UnregisteredLocalFile {
        }
 
        public function exists() {
-               return $this->repo->fileExists( $this->path, FileRepo::FILES_ONLY );
+               return $this->repo->fileExists( $this->path );
        }
 
 }
index 912d189..b2174de 100644 (file)
@@ -192,7 +192,7 @@ $messages = array(
 'june' => 'জুন',
 'july' => 'জুলাই',
 'august' => 'আগষ্ট',
-'september' => 'à¦\9aেপ্টেম্বৰ',
+'september' => 'à¦\9bেপ্টেম্বৰ',
 'october' => 'অক্টোবৰ',
 'november' => 'নৱেম্বৰ',
 'december' => 'ডিচেম্বৰ',
@@ -216,7 +216,7 @@ $messages = array(
 'jun' => 'জুন',
 'jul' => 'জুলাই',
 'aug' => 'আগষ্ট',
-'sep' => 'à¦\9aà§\87পà§\8dà¦\9f:',
+'sep' => 'à¦\9bà§\87পà§\8dà¦\9fà§\87মà§\8dবৰ:',
 'oct' => 'অক্টো:',
 'nov' => 'নৱে:',
 'dec' => 'ডিচে:',
@@ -259,8 +259,8 @@ $messages = array(
 'qbpageinfo' => 'প্ৰসংগ',
 'qbmyoptions' => 'মোৰ পৃষ্ঠাসমূহ',
 'qbspecialpages' => 'বিশেষ পৃষ্ঠাসমূহ',
-'faq' => 'সততà§\87 à¦\89ঠা à¦ªà§\8dৰশà§\8dন (FAQ)',
-'faqpage' => 'Project:সততà§\87 à¦\89ঠা à¦ªà§\8dৰশà§\8dন',
+'faq' => 'সততà§\87 à¦\89দিত à¦ªà§\8dৰশà§\8dনসমà§\82হ (FAQ)',
+'faqpage' => 'Project:সততà§\87 à¦\89দিত à¦ªà§\8dৰশà§\8dনসমà§\82হ',
 
 # Vector skin
 'vector-action-addsection' => 'বিষয় যোগ',
@@ -290,7 +290,7 @@ $messages = array(
 'history' => 'খতিয়ান',
 'history_short' => 'খতিয়ান',
 'updatedmarker' => 'মোৰ শেহতীয়া আগমনৰ পাছৰ পৰিৱৰ্তনবিলাক',
-'printableversion' => 'পà§\8dৰিণà§\8dà¦\9f à¦\95ৰাৰ à¦\89পযà§\8bà¦\97à§\80',
+'printableversion' => 'পà§\8dৰà¦\95াশনযà§\8bà¦\97à§\8dয à¦¸à¦\82সà§\8dà¦\95ৰন',
 'permalink' => 'স্থায়ী সূত্ৰ (লিংক)',
 'print' => 'প্ৰিণ্ট কৰিবলৈ',
 'view' => 'দেখুৱাওক',
@@ -298,8 +298,8 @@ $messages = array(
 'create' => 'সৃষ্টি কৰক',
 'editthispage' => 'বৰ্তমান পৃষ্ঠাটো সম্পাদন কৰিবলৈ',
 'create-this-page' => 'নতুন পৃষ্ঠা সৃষ্টি কৰক',
-'delete' => 'বিলোপন (ডিলিট)',
-'deletethispage' => 'বৰà§\8dতমান à¦ªà§\83ষà§\8dঠাৰ à¦¬à¦¿à¦²à§\8bপন (ডিলিà¦\9f)',
+'delete' => 'বিলোপ',
+'deletethispage' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦¬à¦¿à¦²à§\8bপ à¦\95ৰà¦\95',
 'undelete_short' => '{{PLURAL:$1|বিলোপিত পৃষ্ঠাৰ|$1 সংখ্যক বিলোপিত পৃষ্ঠাৰ}} পূৰ্ববৎকৰণ',
 'viewdeleted_short' => '{{PLURAL:$1| এটা বিলুপ্ত সম্পাদনা|$1 টা বিলুপ্ত সম্পাদনা}} দেখুৱাওক',
 'protect' => 'সুৰক্ষিত কৰক',
@@ -365,7 +365,7 @@ $1',
 
 'badaccess' => 'অনুমোদন ত্ৰুটি',
 'badaccess-group0' => 'আপুনি কৰিব বিচৰা কামতো কৰাৰ অধিকাৰ আপোনাৰ নাই।',
-'badaccess-groups' => 'আপুনি অনুৰোধ কৰা কাৰ্য্য কেৱল {{plural:$2|গোটৰ|গোটৰ}} সদস্যৰ বাবে সীমিত: $1',
+'badaccess-groups' => 'আপুনি অনুৰোধ কৰা কাৰ্য কেৱল {{plural:$2|গোটৰ|গোটৰ}} সদস্যৰ বাবে সীমিত: $1',
 
 'versionrequired' => 'মিডিয়াৱিকিৰ $1 সংকলন থাকিব লাগিব ।',
 'versionrequiredtext' => 'এই পৃষ্ঠাটো ব্যৱহাৰ কৰিবলৈ মিডিয়াৱিকিৰ $1 সংস্কৰণ থাকিব লাগিব । [[Special:Version|সংস্কৰণ পৃষ্ঠা]] চাওক।',
@@ -452,7 +452,7 @@ $1',
 'missingarticle-rev' => '(সংস্কৰণ#: $1)',
 'missingarticle-diff' => '(তফাৎ: $1, $2)',
 'readonly_lag' => 'তথ্যকোষ স্বয়ংক্ৰিয়ভাৱে বন্ধ হৈছে যাতে দ্বিতীয় শ্ৰেণীৰ তথ্যকোষৰ চাৰ্ভাৰ প্ৰধান তথ্যকোষৰ চাৰ্ভাৰৰ অৱস্থালৈ আহিব পাৰে ।',
-'internalerror' => 'ভিতৰà§\81ৱা à¦¤্ৰুটি',
+'internalerror' => 'à¦\86ভà§\8dযনà§\8dতৰà§\80ণ à¦\95্ৰুটি',
 'internalerror_info' => 'ভিতৰুৱা ত্ৰুটি: $1',
 'fileappenderrorread' => 'জোৰা দিয়াৰ সময়ত "$1" পাঠ্য কৰা নহ\'ল ।',
 'fileappenderror' => '"$2"ৰ লগত "$1"ৰ সংযোগ কৰা নহ\'ল ।',
@@ -463,7 +463,7 @@ $1',
 'filenotfound' => '"$1" নামৰ ফাইলটো বিচাৰি পোৱা নগল।',
 'fileexistserror' => '"$1" ফাইলটোত লিখিব নোৱাৰি: ফাইলটো আগৰ পৰাই আছে',
 'unexpected' => 'অনাকাংক্ষিত মূল্য: "$1"="$2".',
-'formerror' => 'ভুল: ফৰ্ম খন জমা দিব পৰা নগল',
+'formerror' => 'ভুল: ফৰ্ম খন জমা দিব পৰা নগল',
 'badarticleerror' => 'এই পৃষ্ঠাটোত এই কামটো কৰিব নোৱাৰি ।',
 'cannotdelete' => '"$1" পৃষ্ঠা বা ফাইল মচা সম্ভব নহয় ।
 সম্ভৱ আনে আগেই মচি থৈছে ।',
@@ -474,10 +474,10 @@ $1',
 'perfcachedts' => 'তলত দিয়া তথ্য খিনি আগতে জমা কৰি থোৱা (cached) আৰু শেষবাৰৰ কাৰণে $1 ত নবীকৰণ কৰা হৈছিল। সৰ্বাধিক {{PLURAL:$4|এটা ফলাফল|$4 টা ফলাফল}} এই cacheত পাব।',
 'querypage-no-updates' => 'এই পৃষ্ঠাটো নৱীকৰণ কৰা ৰোধ কৰা হৈছে। ইয়াৰ তথ্য এতিয়া সতেজ কৰিব নোৱাৰি।',
 'wrong_wfQuery_params' => 'wfQuery() ৰ কাৰণে ভুল মাপদণ্ড দিয়া হৈছে <br />
-কাৰ্য্য: $1<br />পৃষ্ঠা: $2',
+কাৰ্য: $1<br />পৃষ্ঠা: $2',
 'viewsource' => 'উৎস চাওক',
 'viewsource-title' => '$1ৰ উৎস চাওক',
-'actionthrottled' => 'কাৰ্য্য লেহেম কৰা হৈছে',
+'actionthrottled' => 'কাৰ্য লেহেম কৰা হৈছে',
 'actionthrottledtext' => 'স্পাম ৰোধ কৰিবলৈ এই ক্ৰিয়াতো কম সময়ৰ ভিতৰত বহু বেছি বাৰ কৰাতো ৰোধ কৰা হৈছে, আৰু আপুনি ইতিমধ্যে সেই সীমা অতিক্ৰম কৰিলে।
 অনুগ্ৰহ কৰি কিছু সময় পাছত চেষ্টা কৰক।',
 'protectedpagetext' => 'এই পৃষ্ঠাটোৰ সম্পাদনা ৰোধ কৰিবলৈ সুৰক্ষিত কৰা হৈছে।',
@@ -508,7 +508,7 @@ $2',
 আপুনি বেনামী ভাবেও {{SITENAME}} ব্যৱহাৰ কৰিব পাৰে, অথবা আকৌ সেই একে বা বেলেগ নামেৰে [[Special:UserLogin|প্ৰৱেশ]] কৰিব পাৰে।
 মন কৰিব যে যেতিয়ালৈকে আপোনাৰ ব্ৰাউজাৰৰ অস্থায়ী-স্মৃতি (cache memory) খালী নকৰে, তেতিয়ালৈকে কিছুমান পৃষ্ঠাত আপুনি প্ৰৱেশ কৰা বুলি দেখুৱাই থাকিব পাৰে।",
 'welcomecreation' => '== স্বাগতম, $1! ==
-আপোনাৰ সদস্যভুক্তি হৈ গল ।
+আপোনাৰ সদস্যভুক্তি হৈ গল ।
 [[Special:Preferences|{{SITENAME}}  পচন্দসমূহ]]ত আপোনাৰ পচন্দমতে ব্যক্তিগতকৰণ কৰি লবলৈ নাপাহৰে যেন ।',
 'yourname' => 'সদস্যনাম:',
 'yourpassword' => 'আপোনাৰ গুপ্তশব্দ',
@@ -516,7 +516,7 @@ $2',
 'remembermypassword' => 'মোৰ প্ৰৱেশ এই কম্পিউটাৰত মনত ৰাখিব (সৰ্বাধিক $1 {{PLURAL:$1|দিনলৈ|দিনলৈ}})',
 'securelogin-stick-https' => 'প্ৰৱেশ কৰা পাছত HTTPS-ৰ দ্বাৰা সংযোগ ৰাখক',
 'yourdomainname' => 'আপোনাৰ ডমেইন:',
-'externaldberror' => 'à¦\95à§\8bনà§\8b à¦ªà§\8dৰামাণà§\8dযà¦\95ৰণ à¦¤à¦¥à§\8dযà¦\95à§\8bষৰ à¦¤à§\8dৰà§\81à¦\9fি à¦\98à¦\9fিà¦\9bà§\87 à¦¨à¦¤à§\81বা à¦\86পà§\8bনাৰ à¦¬à§°à§\8dহি-à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f à¦¨à¦¬ীকৰণ কৰাৰ অনুমতি নাই ।',
+'externaldberror' => 'à¦\95à§\8bনà§\8b à¦ªà§\8dৰামাণà§\8dযà¦\95ৰণ à¦¤à¦¥à§\8dযà¦\95à§\8bষৰ à¦¤à§\8dৰà§\81à¦\9fি à¦\98à¦\9fিà¦\9bà§\87 à¦¨à¦¤à§\81বা à¦\86পà§\8bনাৰ à¦¬à§°à§\8dহি-à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f à¦¨à§±ীকৰণ কৰাৰ অনুমতি নাই ।',
 'login' => 'প্ৰৱেশ',
 'nav-login-createaccount' => 'প্ৰৱেশ/সদস্যভুক্তি',
 'loginprompt' => '{{SITENAME}}ত প্ৰৱেশ কৰিবলৈ আপুনি কুকী সক্ৰীয় কৰিব লাগিব',
@@ -530,7 +530,7 @@ $2',
 'createaccount' => 'সভ্যভুক্ত হবলৈ',
 'gotaccount' => "আপুনি সদস্য হয়নে? '''$1'''",
 'gotaccountlink' => 'প্ৰৱেশ',
-'userlogin-resetlink' => 'à¦\86পà§\8bনাৰ à¦²à¦\97-à¦\87ন তথ্য পাহৰিছে?',
+'userlogin-resetlink' => 'à¦\86পà§\8bনাৰ à¦ªà§\8dৰৱà§\87শ তথ্য পাহৰিছে?',
 'createaccountmail' => 'ই-মেইলেৰে',
 'createaccountreason' => 'কাৰণ:',
 'badretype' => 'আপুনি দিয়া গুপ্ত শব্দ দুটা মিলা নাই।',
@@ -548,7 +548,7 @@ $2',
 'nocookiesfornew' => 'সদস্য একাউন্ট সৃষ্টি কৰা নহল, কাৰণ তাৰ উৎস অনিশ্চিত ।
 আপোনাৰ কুকি সক্ৰিয় ৰাখক, এই পৃষ্ঠা ৰি-লোড কৰি পুনৰ চেষ্টা কৰক ।',
 'noname' => 'আপুনি বৈধ সদস্যনাম এটা দিয়া নাই।',
-'loginsuccesstitle' => "পà§\8dৰবেশ অনুমোদিত হ'ল",
+'loginsuccesstitle' => "পà§\8dৰৱেশ অনুমোদিত হ'ল",
 'loginsuccess' => "''' আপুনি {{SITENAME}}ত \"\$1\" নামেৰে প্ৰবেশ কৰিলে '''",
 'nosuchuser' => '"$1" নামৰ কোনো সদস্য নাই।
 সদস্য নাম আকাৰ সংবেদনশীল।
@@ -556,7 +556,7 @@ $2',
 'nosuchusershort' => '"$1" এই নামৰ কোনো সদস্য নাই ।
 বানানতো আকৌ এবাৰ ভালদৰে চাওক ।',
 'nouserspecified' => 'সদস্যনাম দিয়া বাধ্যতামূলক।',
-'login-userblocked' => 'এই সদস্যক নিষেধ কৰা হৈছে । লগ্ইন্ অসম্ভৱ ।',
+'login-userblocked' => 'এই সদস্যক নিষেধ কৰা হৈছে। প্ৰৱেশ অসম্ভৱ।',
 'wrongpassword' => 'আপুনি ভুল গুপ্তশব্দ দিছে। অনুগ্ৰহ কৰি আকৌ এবাৰ চেষ্টা কৰক।',
 'wrongpasswordempty' => 'দিয়া গুপ্তশব্দতো খালী; অনুগ্ৰহ কৰি আকৌ এবাৰ চেষ্টা কৰক। ।',
 'passwordtooshort' => "গুপ্তশব্দ কমেও {{PLURAL:$1|১ টা|$1 টা}} আখৰৰ হ'ব লাগিব ।",
@@ -590,6 +590,7 @@ $2',
 'invalidemailaddress' => 'এই ই-মেইল ঠিকনাতো গ্ৰহনযোগ্য নহয়, কাৰণ ই অবৈধ প্ৰকাৰৰ যেন লাগিছে।
 অনুগ্ৰহ কৰি এটা বৈধ ই-মেইল ঠিকনা লিখক অথবা একো নিলিখিব।',
 'cannotchangeemail' => 'এই ৱিকিত একাউন্ট ই-মেইল ঠিকনা সলনি কৰিব পৰা নাযায়',
+'emaildisabled' => 'এই ছাইটে ইমেইল পঠিয়াব নোৱাৰে',
 'accountcreated' => "একাউণ্ট সৃষ্টি কৰা হ'ল",
 'accountcreatedtext' => "$1ৰ কাৰণে সদস্য একাউণ্ট সৃষ্টি কৰা হ'ল।",
 'createaccount-title' => '{{SITENAME}}ৰ কাৰণে একাউণ্ট সৃষ্টি কৰক।',
@@ -618,7 +619,7 @@ $2',
 'resetpass_submit' => 'গুপ্তশব্দ বহাওক আৰু প্ৰৱেশ কৰক',
 'resetpass_success' => 'আপোনাৰ গুপ্তশব্দ সফলতাৰে সলনি কৰা হৈছে, এতিয়া আপুনি প্ৰৱেশ কৰি আছে...',
 'resetpass_forbidden' => 'গুপ্তশব্দ সলনি কৰিব নোৱাৰি',
-'resetpass-no-info' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠা à¦ªà§\8dৰতà¦\95à§\8dষà§\8dয à¦­à¦¾à¦¬ে ঢুকি পাবলৈ আপুনি প্ৰৱেশ কৰিব লাগিব ।',
+'resetpass-no-info' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠা à¦ªà§\8dৰতà§\8dযà¦\95à§\8dষ à¦­à¦¾à§±ে ঢুকি পাবলৈ আপুনি প্ৰৱেশ কৰিব লাগিব ।',
 'resetpass-submit-loggedin' => 'গুপ্তশব্দ সলনি কৰক',
 'resetpass-submit-cancel' => 'বাতিল কৰক',
 'resetpass-wrong-oldpass' => 'অস্থায়ী বা সাম্প্ৰতিক গুপ্তশব্দ গ্ৰহণযোগ্য নহয় ।
@@ -667,7 +668,7 @@ $2
 # Edit page toolbar
 'bold_sample' => 'গাঢ় পাঠ্য',
 'bold_tip' => 'গাঢ় পাঠ্য',
-'italic_sample' => 'বà§\87à¦\81à¦\95া পাঠ্য',
+'italic_sample' => 'হà§\87লনà§\80য়া পাঠ্য',
 'italic_tip' => 'বেঁকা পাঠ্য',
 'link_sample' => 'শিৰোনামা সংযোগ',
 'link_tip' => 'ভিতৰুৱা সংযোগ',
@@ -758,8 +759,8 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} সম্পৰ্কীয় অভিলেখ অনুসন্ধান কৰিব পাৰে],
 বা [{{fullurl:{{FULLPAGENAME}}|action=edit}} এই পৃষ্ঠা সম্পাদনা কৰিব পাৰে]</span>',
 'noarticletext-nopermission' => 'এই পৃষ্ঠাত বৰ্তমান কোনো পাঠ্য নাই ।
-à¦\86পà§\81নি à¦\86ন à¦ªà§\83ষà§\8dঠাত [[Special:Search/{{PAGENAME}}| à¦\8fà¦\87 à¦¶à¦¿à§°à§\8bণামা অনুসন্ধান কৰিব পাৰে]],
-বা <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à¦¸à¦®à§\8dপৰà§\8dà¦\95িয় à¦²à¦\97 অনুসন্ধান কৰিব পাৰে ।]</span>',
+à¦\86পà§\81নি à¦\86ন à¦ªà§\83ষà§\8dঠাত [[Special:Search/{{PAGENAME}}| à¦\8fà¦\87 à¦¶à¦¿à§°à§\8bনামা অনুসন্ধান কৰিব পাৰে]],
+বা <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à¦¸à¦®à§\8dপৰà§\8dà¦\95à§\80য় à¦\85ভিলà§\87à¦\96 অনুসন্ধান কৰিব পাৰে ।]</span>',
 'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" নামৰ সদস্য একাউন্ট নিবন্ধিত নহয় ।
 অনুগ্ৰহ কৰি চাওক আপুনি এই পৃষ্ঠা সৃষ্টি/সম্পাদনা কৰিব বিচাৰিছে নেকি ।',
 'userpage-userdoesnotexist-view' => "সদস্য একাউন্ট ''$1'' পঞ্জীভূত নহয়",
@@ -784,7 +785,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'userinvalidcssjstitle' => "'''সতৰ্কবাণী:'''  \"\$1\" নামৰ কোনো আৱৰণ নাই। Custom .css আৰু .js পৃষ্ঠাই সৰুফলাৰ শিৰোনামা ব্যৱহাৰ কৰে, যেনে-  {{ns:user}}:Foo/Vector.css ৰ সলনি {{ns:user}}:Foo/vector.css।",
 'updated' => "(আপডেট কৰা হ'ল)",
 'note' => "'''টোকা:'''",
-'previewnote' => "'''মনত à§°à¦¾à¦\96িব à¦¯à§\87 à¦\8fয়া à¦\95à§\87ৱল à¦\96à¦\9aৰা à¦¹à§\87, à¦¸à¦¾à¦²-সলনিবà§\8bৰ à¦\8fতিয়াà¦\93 à¦¸à¦\82ৰà¦\95à§\8dষিত কৰা হোৱা নাই!'''",
+'previewnote' => "'''à¦\8fয়া à¦ªà§\8dৰাà¦\95দৰà§\8dশনহà§\87 à¦®à¦¾à¦¥à§\8bন। à¦ªà§°à¦¿à§±à§°à§\8dতনসমà§\82হ à¦\8fতিয়à¦\93 à¦¸à¦\82ৰà¦\95à§\8dষণ কৰা হোৱা নাই!'''",
 'previewconflict' => 'এই প্ৰাকদৰ্শনে ওপৰৰ সম্পাদনা ক্ষেত্ৰৰ লেখা সাঁচি ৰাখিলে যেনেকুৱা দেখা যাব তেনেকুৱা দেখাইছে ।',
 'session_fail_preview' => "'''দুঃখিত! চেচন ডাটা হেৰাই যোৱাৰ কাৰণে আপোনাৰ সম্পাদনা কৃতকাৰ্য্য নহ'ল ।'''
 অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক ।
@@ -800,6 +801,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 কোনো আসোঁৱাহপূৰ্ণ ৱেব-ভিত্তিক বেনামী প্ৰক্সী সেৱা ব্যৱহাৰ কৰিলে এনে হ’ব পাৰে ।",
 'edit_form_incomplete' => "'''এই সম্পাদনাৰ কিছু অংশ চাৰ্ভাৰলৈ নগ’ল; আপোনাৰ সম্পাদনা ঠিকে আছেনে পৰীক্ষা কৰি পুনৰ চেষ্টা কৰক ।'''",
 'editing' => '$1 সম্পাদনা',
+'creating' => 'সৃষ্টি কৰি থকা হৈছে $1',
 'editingsection' => '$1 (বিভাগ) সম্পাদনা কৰি থকা হৈছে',
 'editingcomment' => '$1 (নতুন বিভাগ) সম্পাদনা কৰি থকা হৈছে',
 'editconflict' => 'সম্পাদনা দ্বন্দ: $1',
@@ -1810,7 +1812,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'unwatchedpages' => 'চকু নৰখা পৃষ্ঠাসমূহ',
 
 # List redirects
-'listredirects' => 'পà§\81নৰà§\8dনিৰà§\8dদà§\87শনাৰ à¦¤à¦¾à¦²à¦¿à¦\95া',
+'listredirects' => 'পুননিৰ্দেশনাৰ তালিকা',
 
 # Unused templates
 'unusedtemplates' => 'অব্যৱহৃত সাঁচসমূহ',
@@ -1823,8 +1825,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'randompage-nopages' => 'তলত দিয়া {{PLURAL:$2|নামস্থানত|নামস্থানসমূহত}} কোনো পৃষ্ঠা নাই: $1 ।',
 
 # Random redirect
-'randomredirect' => 'à¦\85নিৰà§\8dধাৰিত à¦ªà§\81নৰà§\8dনিৰà§\8dদà§\87শ',
-'randomredirect-nopages' => '"$1" à¦¨à¦¾à¦®à¦¸à§\8dথানত à¦\95à§\8bনà§\8b à¦ªà§\81নৰà§\8dনিৰà§\8dদà§\87শ à¦¨à¦¾à¦\87 à¥¤',
+'randomredirect' => 'অনিৰ্ধাৰিত পুননিৰ্দেশ',
+'randomredirect-nopages' => '"$1" নামস্থানত কোনো পুননিৰ্দেশ নাই ।',
 
 # Statistics
 'statistics' => 'পৰিসংখ্যা',
@@ -1906,7 +1908,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'mostcategories' => 'সৰ্বোচ্চ শ্ৰেণীসমৃদ্ধ প্ৰবন্ধসমূহ',
 'mostimages' => 'সৰ্বোচ্চ সংযোজিত ফাইলসমূহ',
 'mostrevisions' => 'অধিকবাৰ সম্পাদনা কৰা পৃষ্ঠাসমূহ',
-'prefixindex' => 'উপসৰ্গ সহ সকলো পৃষ্ঠা',
+'prefixindex' => 'উপসৰ্গসহ সকলো পৃষ্ঠা',
 'prefixindex-namespace' => 'উপসৰ্গ ($1 namespace) -ৰ সৈতে সকলো পৃষ্ঠা',
 'shortpages' => 'চুটি পৃষ্ঠাসমূহ',
 'longpages' => 'দীঘলীয়া পৃষ্ঠাসমূহ',
@@ -2082,7 +2084,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'nowatchlist' => 'আপোনাৰ নিৰীক্ষণ তালিকাত কোনো আইটেম নাই ।',
 'watchlistanontext' => 'আপোনাৰ লক্ষ্য তালিকাত থকা বস্তুবোৰ চাবলৈ বা সম্পাদনা কৰিবলৈ অনুগ্ৰহ কৰি $1 কৰক।',
 'watchnologin' => 'প্ৰৱেশ কৰা নাই',
-'watchnologintext' => 'নিৰà§\80à¦\95à§\8dষণ à¦¤à¦¾à¦²à¦¿à¦\95া à¦ªà§°à¦¿à§±à§°à§\8dতন à¦\95ৰিবলà§\88 à¦\86পà§\81নি à¦\86à¦\97তà§\87 [[Special:UserLogin|লà¦\97-à¦\87ন]] কৰিব লাগিব ।',
+'watchnologintext' => 'নিৰà§\80à¦\95à§\8dষণ à¦¤à¦¾à¦²à¦¿à¦\95া à¦ªà§°à¦¿à§±à§°à§\8dতন à¦\95ৰিবলà§\88 à¦\86পà§\81নি à¦\86à¦\97তà§\87 [[Special:UserLogin|পà§\8dৰৱà§\87শ]] কৰিব লাগিব ।',
 'addwatch' => 'লক্ষ্য-তালিকাত অন্তৰ্ভুক্ত কৰক',
 'addedwatchtext' => "আপোনাৰ [[Special:Watchlist|লক্ষ্য তালিকাত ]] \"[[:\$1]]\" অন্তৰ্ভুক্ত কৰা হ'ল।
 ভৱিষ্যতে ইয়াত হোৱা সাল-সলনি আপুনি আপোনাৰ লক্ষ্য তালিকাত দেখিব, লগতে [[Special:RecentChanges|সাম্প্ৰতিক সাল-সলনিৰ তালিকাত]] এই পৃষ্ঠাখন '''গাঢ়''' আখৰত দেখিব যাতে আপুনি সহজে ধৰিব পাৰে।",
@@ -2164,8 +2166,8 @@ $UNWATCHURL
 'historywarning' => "'''সাৱধান:''' আপুনি বিলোপ কৰিব বিচৰা পৃষ্ঠাখনৰ ইতিহাসত প্ৰায় {{PLURAL:$1|সংস্কৰণ|সংস্কৰণ}} আছে:",
 'confirmdeletetext' => 'আপুনি পৃষ্ঠা এটা তাৰ ইতিহাসৰ সৈতে বিলোপ কৰিব ওলাইছে।
 অনুগ্ৰহ কৰি নিশ্চিত কৰক যে এয়া [[{{MediaWiki:Policy-url}}|নীতিসম্মত]]। লগতে আপুনি ইয়াৰ পৰিণাম জানে আৰু আপুনি এয়া কৰিব বিচাৰিছে।',
-'actioncomplete' => 'কাৰ্য্য সম্পূৰ্ণ',
-'actionfailed' => "কাৰ্য্য বিফল হ'ল",
+'actioncomplete' => 'কাৰ্য সম্পূৰ্ণ',
+'actionfailed' => "কাৰ্য বিফল হ'ল",
 'deletedtext' => '"$1" ক বিলোপন কৰা হৈছে।
 সাম্প্ৰতিক বিলোপনসমূহৰ তালিকা চাবলৈ $2 চাওক।',
 'dellogpage' => 'বাতিল কৰা সূচী',
@@ -2822,7 +2824,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'tooltip-summary' => 'চমু সাৰাংশ লিখক',
 
 # Metadata
-'notacceptable' => 'ৱিà¦\95ি à¦\9aাৰà§\8dভাৰà§\87 à¦\86পà§\8bনাৰ à¦\95à§\8dলাà¦\8fন্টে পঢ়িব পৰা বিন্যাসত তথ্য প্ৰদান কৰিব নোৱাৰে।',
+'notacceptable' => 'ৱিà¦\95ি à¦\9aাৰà§\8dভাৰà§\87 à¦\86পà§\8bনাৰ à¦\95à§\8dলায়à§\87ন্টে পঢ়িব পৰা বিন্যাসত তথ্য প্ৰদান কৰিব নোৱাৰে।',
 
 # Attribution
 'anonymous' => '{{SITENAME}}ৰ বেনামী {{PLURAL:$1|সদস্য|সদস্যসকল}}',
index a9d80ff..b9798f4 100644 (file)
@@ -545,6 +545,7 @@ Nun s'unviará corréu de denguna de les funciones siguientes.",
 'invalidemailaddress' => "La direición de corréu nun se pue aceutar yá que paez tener un formatu non válidu.
 Por favor escribi una direición con formatu afayadizu o dexa vaciu'l campu.",
 'cannotchangeemail' => 'Les direiciones de corréu de la cuenta nun puen camudase nesta wiki.',
+'emaildisabled' => 'Esti sitiu nun pue unviar correos electrónicos.',
 'accountcreated' => 'Cuenta creada',
 'accountcreatedtext' => "La cuenta d'usuariu de $1 ta creada.",
 'createaccount-title' => 'Creación de cuenta pa {{SITENAME}}',
@@ -748,8 +749,8 @@ La cabera entrada del rexistru de bloqueos s'ufre darréu pa referencia:",
 'userinvalidcssjstitle' => "'''Avisu:''' Nun hai piel \"\$1\". Recuerda que les páxines personalizaes .css y .js usen un títulu en minúscules, p. ex. {{ns:user}}:Foo/vector.css en cuenta de {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Actualizao)',
 'note' => "'''Nota:'''",
-'previewnote' => "'''Alcuérdate de qu'esto ye sólo una vista previa.'''
-¡Los cambios entá nun se guardaron!",
+'previewnote' => "'''Alcuerdate de qu'esto ye sólo una vista previa.'''
+¡Los cambios entá nun se guardaron! [[#editform|→ Siguir editando]]",
 'previewconflict' => "Esta vista previa amuesa'l testu del área d'edición d'arriba tal como apaecerá si escueyes guardar.",
 'session_fail_preview' => "'''¡Sentímoslo muncho! Nun se pudo procesar la to edición porque hebo una perda de datos de la sesión.
 Inténtalo otra vuelta. Si nun se t'arregla, intenta salir y volver a rexistrate.'''",
@@ -763,6 +764,7 @@ La edición nun foi aceutada pa prevenir corrupciones na páxina de testu.
 Dacuando esto pasa por usar un serviciu proxy anónimu basáu en web que tenga fallos.",
 'edit_form_incomplete' => "'''Delles partes del formulariu d'edición nun llegaron al sirvidor; comprueba que les ediciones tean intactes y vuelve a tentalo.'''",
 'editing' => 'Editando $1',
+'creating' => 'Creando $1',
 'editingsection' => 'Editando $1 (seición)',
 'editingcomment' => 'Editando $1 (seición nueva)',
 'editconflict' => "Conflictu d'edición: $1",
@@ -1714,11 +1716,15 @@ Hai disponible una [[Special:WhatLinksHere/$2|llista completa]].",
 'morelinkstoimage' => 'Ver [[Special:WhatLinksHere/$1|más enllaces]] a esti archivu.',
 'linkstoimage-redirect' => '$1 (redireición de ficheru) $2',
 'duplicatesoffile' => "{{PLURAL:$1|El siguiente archivu ye un duplicáu|Los siguientes $1 archivos son duplicaos}} d'esti archivu ([[Special:FileDuplicateSearch/$2|más detalles]]):",
-'sharedupload' => 'El ficheru ye de $1 y pueden que tean usandolu otros proyeutos.',
+'sharedupload' => "Esti ficheru ye de $1 y se pue usar n'otros proyeutos.",
 'sharedupload-desc-there' => 'Esti ficheru ye de $1 y puen usalu otros proyeutos.
 Llee la [páxina de descripción del ficheru $2] pa más información.',
 'sharedupload-desc-here' => "Esti ficheru ye de $1 y puen usalu otros proyeutos.
 La descripción de la [páxina de descripción del ficheru $2] s'amuesa darréu.",
+'sharedupload-desc-edit' => "Esti ficheru ye de $1 y se pue usar n'otros proyeutos.
+Seique quieras camudar la descripción de la so [páxina de descripción de ficheru $2] allí.",
+'sharedupload-desc-create' => "Esti ficheru ye de $1 y se pue usar n'otros proyeutos.
+Seique quieras camudar la descripción de la so [páxina de descripción de ficheru $2] allí.",
 'filepage-nofile' => 'Nun esiste dengún ficheru con esti nome.',
 'filepage-nofile-link' => 'Nun esiste ficheru dalu con esti nome, pero pues [$1 xubilu].',
 'uploadnewversion-linktext' => "Xubir una nueva versión d'esta imaxe",
@@ -1928,6 +1934,7 @@ Pues filtrar la visualización seleicionando una mena de rexistru, el nome d'usu
 'allpagesprefix' => 'Amosar páxines col prefixu:',
 'allpagesbadtitle' => "El títulu dau a esta páxina nun yera válidu o tenía un prefixu d'enllaz interllingua o interwiki. Pue contener ún o más carauteres que nun se puen usar nos títulos.",
 'allpages-bad-ns' => '{{SITENAME}} nun tien l\'espaciu de nomes "$1".',
+'allpages-hide-redirects' => 'Anubrir redireiciones',
 
 # Special:Categories
 'categories' => 'Categoríes',
index 7b6b8cd..3ecdad4 100644 (file)
@@ -223,7 +223,7 @@ $messages = array(
 'history_short' => 'Тарих',
 'updatedmarker' => 'һуңғы кереүемдән һуң яңыртылған',
 'printableversion' => 'Ҡағыҙға баҫыу өлгөһө',
-'permalink' => 'Даими һылтау',
+'permalink' => 'Даими һылтанма',
 'print' => 'Баҫыу',
 'view' => 'Ҡарау',
 'edit' => 'Үҙгәртеү',
index 641a957..a93b367 100644 (file)
@@ -732,6 +732,7 @@ $2',
 'invalidemailaddress' => 'Уведзены адрас электроннай пошты не адпавядае фармату адрасоў электроннай пошты.
 Увядзіце слушны адрас электроннай пошты ці ачысьціце гэтае поле.',
 'cannotchangeemail' => 'Электронная пошта рахунку ня можа быць зьмененая ў {{GRAMMAR:месны|{{SITENAME}}}}.',
+'emaildisabled' => 'Гэты сайт ня можа адсылаць электронныя лісты.',
 'accountcreated' => 'Рахунак створаны',
 'accountcreatedtext' => 'Рахунак удзельніка для $1 быў створаны.',
 'createaccount-title' => 'Стварэньне рахунку ў {{GRAMMAR:месны|{{SITENAME}}}}',
@@ -924,7 +925,8 @@ $2
 Памятайце, што ўласныя старонкі .css і .js павінны мець назву, якая складаецца з малых літараў, напрыклад, {{ns:user}}:Хтосьці/vector.css, а не {{ns:user}}:Хтосьці/Vector.css.",
 'updated' => '(Абноўлена)',
 'note' => "'''Заўвага: '''",
-'previewnote' => "'''Гэта толькі папярэдні прагляд і зьмены яшчэ не былі захаваныя!'''",
+'previewnote' => "'''Гэта толькі папярэдні прагляд.'''
+Вашыя зьмены яшчэ не былі захаваныя! [[#editform|→ Працягнуць рэдагаваньне]]",
 'previewconflict' => 'Гэта папярэдні прагляд тэксту зь верхняга вакна рэдагаваньня, так ён будзе выглядаць, калі Вы вырашыце яго захаваць.',
 'session_fail_preview' => "'''Не атрымалася захаваць Вашую праўку праз тое, што былі страчаныя зьвесткі пра сэсію.
 Калі ласка, паспрабуйце яшчэ раз. Калі памылка ня зьнікне, паспрабуйце [[Special:UserLogout|выйсьці з сыстэмы]] і ўвайсьці ізноў.'''",
@@ -938,6 +940,7 @@ $2
 Такія памылкі здараюцца, калі Вы выкарыстоўваеце ананімны проксі-сэрвэр, які ўтрымлівае памылкі.'''",
 'edit_form_incomplete' => "'''Некаторыя часткі формы рэдагаваньня не дасягнулі сэрвэра. Упэўніцеся, што Вашыя рэдагаваньні не пашкоджаныя і паспрабуйце зноў.'''",
 'editing' => 'Рэдагаваньне: $1',
+'creating' => 'Стварэньне «$1»',
 'editingsection' => 'Рэдагаваньне: $1 (сэкцыя)',
 'editingcomment' => 'Рэдагаваньне: $1 (новая сэкцыя)',
 'editconflict' => 'Канфлікт рэдагаваньня: $1',
@@ -1878,6 +1881,10 @@ $1',
 Калі ласка, глядзіце падрабязнасьці на [$2 старонцы апісаньня файла].',
 'sharedupload-desc-here' => 'Гэты файл паходзіць з $1 і можа выкарыстоўвацца іншымі праектамі.
 Апісаньне са [$2 старонкі апісаньня файла] пададзенае ніжэй.',
+'sharedupload-desc-edit' => 'Гэты файл паходзіць з $1 і можа  выкарыстоўвацца іншымі праектамі.
+Калі спатрэбіцца, вы можаце зьмяніць апісаньне файла на [$2 адпаведнай старонцы].',
+'sharedupload-desc-create' => 'Гэты файл паходзіць з $1 і можа выкарыстоўвацца іншымі праектамі.
+Калі спатрэбіцца, вы можаце зьмяніць апісаньне на [$2 адпаведнай старонцы].',
 'filepage-nofile' => 'Файл з гэтай назвай не існуе.',
 'filepage-nofile-link' => 'Файл з гэтай назвай не існуе, але Вы можаце [$1 загрузіць яго].',
 'uploadnewversion-linktext' => 'Загрузіць новую вэрсію гэтага файла',
@@ -2090,6 +2097,7 @@ $1',
 'allpagesprefix' => 'Паказаць старонкі, назвы якіх пачынаюцца з:',
 'allpagesbadtitle' => 'Пададзеная назва старонкі была няслушная ці пачыналася зь міжмоўнай ці міжвікі спасылкі. Яна яшчэ можа ўтрымліваць сымбалі, якія ня могуць ужывацца ў назвах.',
 'allpages-bad-ns' => '{{SITENAME}} ня мае прасторы назваў «$1».',
+'allpages-hide-redirects' => 'Схаваць перанакіраваньні',
 
 # Special:Categories
 'categories' => 'Катэгорыі',
index 5e9188d..f1bdc1f 100644 (file)
@@ -657,6 +657,7 @@ Així, des d'aquesta adreça IP no es poden crear més comptes actualment.",
 'invalidemailaddress' => "No es pot acceptar l'adreça electrònica perquè sembla que té un format no vàlid.
 Introduïu una adreça amb un format adequat o bé buideu el camp.",
 'cannotchangeemail' => 'No podeu canviar adreces de correu electrònic en aquest wiki.',
+'emaildisabled' => 'El lloc no pot enviar correus electrònics.',
 'accountcreated' => "S'ha creat el compte",
 'accountcreatedtext' => "S'ha creat el compte d'usuari de $1.",
 'createaccount-title' => "Creació d'un compte a {{SITENAME}}",
@@ -847,7 +848,8 @@ Per més detalls, la darrera entrada del registre es mostra a continuació:",
 'userinvalidcssjstitle' => "'''Atenció:''' No existeix l'aparença «$1». Recordeu que les subpàgines personalitzades amb extensions .css i .js utilitzen el títol en minúscules, per exemple, {{ns:user}}:NOM/vector.css no és el mateix que {{ns:user}}:NOM/Vector.css.",
 'updated' => '(Actualitzat)',
 'note' => "'''Nota:'''",
-'previewnote' => "'''Açò només és una previsualització, els canvis de la qual encara no s'han desat!'''",
+'previewnote' => "'''Recordeu que això només és una previsualització.'''
+Els vostres canvis encara no s'han desat!",
 'previewconflict' => "Aquesta previsualització reflecteix, a l'àrea
 d'edició superior, el text tal i com apareixerà si trieu desar-lo.",
 'session_fail_preview' => "'''No s'ha pogut processar la vostra modificació a causa d'una pèrdua de dades de la sessió.
@@ -860,6 +862,7 @@ Si us plau, proveu-ho una altra vegada. Si continués sense funcionar, proveu de
 'token_suffix_mismatch' => "'''S'ha rebutjat la vostra modificació perquè el vostre client ha fet malbé els caràcters de puntuació en el testimoni d'edició. S'ha rebutjat la modificació per a evitar la corrupció del text de la pàgina. Açò passa a vegades quan s'utilitza un servei web de servidor intermediari anònim amb problemes.'''",
 'edit_form_incomplete' => "'''Certes parts del formulari de modificació no han arribat al servidor, verifiqueu que les vostres modificacions estan intactes i proveu-ho de nou.'''",
 'editing' => "S'està editant $1",
+'creating' => "S'està creant $1",
 'editingsection' => "S'està editant $1 (secció)",
 'editingcomment' => "S'està editant $1 (nova secció)",
 'editconflict' => "Conflicte d'edició: $1",
@@ -1784,6 +1787,10 @@ Podeu consultar la [[Special:WhatLinksHere/$2|llista completa]].",
 Si us plau vegeu la [$2 pàgina de descripció del fitxer] per a més informació.',
 'sharedupload-desc-here' => 'Aquest fitxer prové de $1 i pot ser usat per altres projectes.
 La descripció de la seva [$2 pàgina de descripció] es mostra a continuació.',
+'sharedupload-desc-edit' => 'Aquest fitxer és de $1 i potser el fan servir altres projectes.
+Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].',
+'sharedupload-desc-create' => 'Aquest fitxer és de $1 i potser el fan servir altres projectes.
+Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].',
 'filepage-nofile' => 'No hi ha cap fitxer amb aquest nom.',
 'filepage-nofile-link' => 'No existeix cap fitxer amb aquest nom, però podeu [$1 carregar-lo].',
 'uploadnewversion-linktext' => "Carrega una nova versió d'aquest fitxer",
@@ -1993,6 +2000,7 @@ Podeu reduir l'extensió seleccionant el tipus de registre, el nom del usuari (d
 'allpagesprefix' => 'Mostra les pàgines amb prefix:',
 'allpagesbadtitle' => "El títol de la pàgina que heu inserit no és vàlid o conté un prefix d'enllaç amb un altre projecte. També pot passar que contingui un o més caràcters que no es puguin fer servir en títols de pàgina.",
 'allpages-bad-ns' => "El projecte {{SITENAME}} no disposa de l'espai de noms «$1».",
+'allpages-hide-redirects' => 'Amaga les redireccions',
 
 # Special:Categories
 'categories' => 'Categories',
index def4c37..701d3c3 100644 (file)
@@ -1973,10 +1973,10 @@ Můžete si prohlédnout [[Special:WhatLinksHere/$2|úplný seznam]].',
 Více informací obsahuje jeho [$2 tamější stránka s popisem souboru].',
 'sharedupload-desc-here' => 'Tento soubor pochází z {{grammar:2sg|$1}} a mohou ho používat ostatní projekty.
 Níže jsou zobrazeny informace, které obsahuje jeho [$2 tamější stránka s popisem souboru].',
-'sharedupload-desc-edit' => 'Tento soubor je z  $1  a může být použit i v jiných projektech.
-Možná budete chtít upravit popis a dát jej do souladu s [ $2 popisem zdroje].',
-'sharedupload-desc-create' => 'Tento soubor je z  $1  a může být použit i v jiných projektech.
-Možná budete chtít upravit popis a dát jej do souladu s [ $2 popisem zdroje].',
+'sharedupload-desc-edit' => 'Tento soubor pochází z {{grammar:2sg|$1}} a mohou ho používat ostatní projekty.
+Možná spíše chcete upravit [$2 tamější stránku s popisem souboru].',
+'sharedupload-desc-create' => 'Tento soubor pochází z {{grammar:2sg|$1}} a mohou ho používat ostatní projekty.
+Možná spíše chcete upravit [$2 tamější stránku s popisem souboru].',
 'filepage-nofile' => 'Soubor s tímto názvem neexistuje.',
 'filepage-nofile-link' => 'Soubor s tímto názvem neexistuje, ale můžete [$1 ho načíst].',
 'uploadnewversion-linktext' => 'Načíst novou verzi tohoto souboru',
index fe21aeb..9f15cca 100644 (file)
@@ -500,6 +500,9 @@ $2",
 'ns-specialprotected' => 'Ni ellir golygu tudalennau arbennig.',
 'titleprotected' => "Diogelwyd y teitl hwn rhag ei greu gan [[User:$1|$1]].
 Rhoddwyd y rheswm hwn - ''$2''.",
+'filereadonlyerror' => 'Nid oes modd newid y ffeil "$1" oherwydd bod modd darllen storfa\'r ffeil yn "$2" yn unig.
+
+Y rheswm a roddir dros hyn yw "\'\'£3\'\'".',
 
 # Virus scanner
 'virus-badscanner' => "Cyfluniad gwael: sganiwr firysau anhysbys: ''$1''",
@@ -583,6 +586,7 @@ Felly ni chaiff defnyddwyr sy'n defnyddio'r cyfeiriad IP hwn greu rhagor o gyfri
 'emailconfirmlink' => 'Cadarnhewch eich cyfeiriad e-bost',
 'invalidemailaddress' => 'Ni allwn dderbyn y cyfeiriad e-bost gan fod ganddo fformat annilys. Mewnbynnwch cyfeiriad dilys neu gwagiwch y maes hwnnw, os gwelwch yn dda.',
 'cannotchangeemail' => 'Ni ellir newid cyfeiriadau e-bost i gyfrifon ar y wici hwn.',
+'emaildisabled' => 'Ni all y wefan hon anfon e-byst.',
 'accountcreated' => 'Crëwyd y cyfrif',
 'accountcreatedtext' => 'Crëwyd cyfrif defnyddiwr ar gyfer $1.',
 'createaccount-title' => 'Creu cyfrif ar {{SITENAME}}',
@@ -771,7 +775,7 @@ Dyma'r cofnod lòg diweddaraf, er gwybodaeth:",
 Cofiwch bod y tudalennau .css a .js yn defnyddio llythrennau bach, e.e. {{ns:user}}:Foo/vector.css yn hytrach na {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Diweddariad)',
 'note' => "'''Dalier sylw:'''",
-'previewnote' => "'''Cofiwch taw rhagolwg yw hwn; nid yw'r dudalen wedi ei chadw eto.'''",
+'previewnote' => "'''Cofiwch taw rhagolwg yw hwn.''' Nid yw eich gwaith wedi ei roi ar gadw eto! [[#editform|→ Parhau i olygu]]",
 'previewconflict' => "Mae'r rhagolwg hwn yn dangos y testun yn yr ardal golygu uchaf, fel ag y byddai'n ymddangos petaech yn rhoi'r dudalen ar gadw.",
 'session_fail_preview' => "'''Ymddiheurwn! Methwyd prosesu eich golygiad gan fod rhan o ddata'r sesiwn wedi'i golli. Ceisiwch eto.
 Os digwydd yr un peth eto, ceisiwch [[Special:UserLogout|allgofnodi]] ac yna mewngofnodi eto.'''",
@@ -786,6 +790,7 @@ Gwrthodwyd y golygiad rhag i destun y dudalen gael ei lygru.
 Weithiau fe ddigwydd hyn wrth ddefnyddio dirprwy-wasanaeth anhysbys gwallus yn seiliedig ar y we.'''",
 'edit_form_incomplete' => "'''Nid yw peth o'r ffurflen golygu wedi cyrraedd y gweinydd; sicrhewch bod eich golygiadau'n gyfan o hyd ac yna ceisiwch eto.'''",
 'editing' => 'Yn golygu $1',
+'creating' => "Yn dechrau'r dudalen $1",
 'editingsection' => 'Yn golygu $1 (adran)',
 'editingcomment' => 'Yn golygu $1 (adran newydd)',
 'editconflict' => 'Cyd-ddigwyddiad golygu: $1',
@@ -1924,6 +1929,7 @@ Sylwer bod llythrennau mawr neu fach o bwys i'r chwiliad.",
 'allpagesprefix' => 'Dangos pob tudalen mewn parth gan ddechrau o:',
 'allpagesbadtitle' => 'Roedd y darpar deitl yn annilys oherwydd bod ynddo naill ai:<p> - rhagddodiad rhyngwici neu ryngieithol, neu </p>- nod neu nodau na ellir eu defnyddio mewn teitlau.',
 'allpages-bad-ns' => 'Nid oes gan {{SITENAME}} barth o\'r enw "$1".',
+'allpages-hide-redirects' => 'Cuddio tudalennau ailgyfeirio',
 
 # Special:Categories
 'categories' => 'Categorïau',
index 58e22cf..1dd1349 100644 (file)
@@ -661,6 +661,7 @@ Derfor kan besøgende ikke oprette flere kontoer fra denne IP-adresse i øjeblik
 'emailconfirmlink' => 'Bekræft e-mail-adressen (autentificering).',
 'invalidemailaddress' => 'E-mail-adressen kan ikke accepteres da den tilsyneladende har et ugyldigt format. Skriv venligst en e-mail-adresse med et korrekt format eller tøm feltet.',
 'cannotchangeemail' => 'De email-adresser, der er tilknyttet brugerkontoer, kan ikke ændres på denne wiki.',
+'emaildisabled' => 'Denne hjemmeside kan ikke sende emails.',
 'accountcreated' => 'Brugerkonto oprettet',
 'accountcreatedtext' => 'Brugerkontoen $1 er oprettet.',
 'createaccount-title' => 'Opret brugerkonto på {{SITENAME}}',
@@ -856,7 +857,8 @@ Loggen over den seneste blokering ses nedenfor:',
 'userinvalidcssjstitle' => "'''Advarsel:''' Der findes intet skin „$1“. Tænk på, at brugerspecifikke .css- og .js-sider begynder med små bogstaver, altså f.eks. ''{{ns:user}}:Hansen/vector.css'' og ikke ''{{ns:user}}:Hansen/Vector.css''.",
 'updated' => '(Opdateret)',
 'note' => "'''Bemærk:'''",
-'previewnote' => 'Husk at dette er kun en forhåndsvisning, siden er ikke gemt endnu!',
+'previewnote' => "'''Husk at dette er kun en forhåndsvisning.'''
+Dine ændringer er endnu ikke blevet gemt! [[#editform|→ Fortsæt med at redigere]]",
 'previewconflict' => 'Denne forhåndsvisning er resultatet af den redigérbare tekst ovenfor, sådan vil det komme til at se ud hvis du vælger at gemme teksten.',
 'session_fail_preview' => "'''Din ændring kunne ikke gemmes, da dine sessionsdata er gået tabt.
 Prøv venligst igen. Hvis problemet fortsætter, log af og log på igen.'''",
@@ -868,6 +870,7 @@ Prøv venligst igen. Hvis problemet fortsætter, log af og log på igen.'''",
 'token_suffix_mismatch' => "'''Din redigering er afvist, da din browser har forvansket tegnsætningen i redigeringskontrolfilen. Afvisningen sker for at forhindre utilsigtede ændringer i artiklen. Denne fejl opstår nogle gange, når du redigerer gennem en fejlprogrammeret webbaseret anonymiseringstjeneste.'''",
 'edit_form_incomplete' => "'''Nogle dele af redigeringsformularen nåede ikke serveren; dobbelttjek, at redigeringerne er intakte, og prøv igen.'''",
 'editing' => 'Redigerer $1',
+'creating' => 'Opretter $1',
 'editingsection' => 'Redigerer $1 (afsnit)',
 'editingcomment' => 'Redigerer $1 (nyt afsnit)',
 'editconflict' => 'Redigeringskonflikt: $1',
index 28295ce..e91bedf 100644 (file)
@@ -981,9 +981,9 @@ Als Grund wurde ''$2'' angegeben.
 * Sperre betrifft: $7
 
 Du kannst $1 oder einen der anderen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] kontaktieren, um über die Sperre zu diskutieren.
-Du kannst die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in deinen [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist, oder diese Funktion für dich gesperrt wurde.
+Du kannst die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in deinen [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist oder diese Funktion für dich gesperrt wurde.
 Deine aktuelle IP-Adresse ist $3, und die Sperr-ID ist $5.
-Bitte füge alle Informationen jeder Anfrage hinzu, die du stellt.",
+Bitte füge alle Informationen jeder Anfrage hinzu, die du stellst.",
 'autoblockedtext' => "Deine IP-Adresse wurde automatisch gesperrt, da sie von einem anderen Benutzer genutzt wurde, der von $1 gesperrt wurde.
 Als Grund wurde angegeben:
 
@@ -995,10 +995,10 @@ Als Grund wurde angegeben:
 
 Du kannst $1 oder einen der anderen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] kontaktieren, um über die Sperre zu diskutieren.
 
-Du kannst die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in deinen [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist, oder diese Funktion für dich gesperrt wurde.
+Du kannst die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in deinen [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist oder diese Funktion für dich gesperrt wurde.
 
 Deine aktuelle IP-Adresse ist $3, und die Sperr-ID ist $5.
-Bitte füge alle Informationen jeder Anfrage hinzu, die du stellt.",
+Bitte füge alle Informationen jeder Anfrage hinzu, die du stellst.",
 'blockednoreason' => 'keine Begründung angegeben',
 'whitelistedittext' => 'Du musst dich $1, um Seiten bearbeiten zu können.',
 'confirmedittext' => 'Du musst deine E-Mail-Adresse erst bestätigen, bevor du Bearbeitungen durchführen kannst. Bitte ergänze und bestätige deine E-Mail in den [[Special:Preferences|Einstellungen]].',
@@ -1112,7 +1112,7 @@ Zur Information folgt der aktuelle Logbucheintrag:",
 'sectioneditnotsupported-text' => 'Die Bearbeitung von Abschnitten wird auf dieser Bearbeitungsseite nicht unterstützt.',
 'permissionserrors' => 'Berechtigungsfehler',
 'permissionserrorstext' => 'Du bist nicht berechtigt, die Aktion auszuführen. {{PLURAL:$1|Grund|Gründe}}:',
-'permissionserrorstext-withaction' => 'Du bist nicht berechtigt $2.
+'permissionserrorstext-withaction' => 'Du bist nicht berechtigt, $2.
 {{PLURAL:$1|Grund|Gründe}}:',
 'recreate-moveddeleted-warn' => "'''Achtung: Du erstellst eine Seite, die bereits früher gelöscht wurde.'''
 
@@ -1527,8 +1527,8 @@ Dies kann nicht mehr rückgängig gemacht werden.',
 'userrights-groupsmember' => 'Mitglied von:',
 'userrights-groupsmember-auto' => 'Automatisch Mitglied von:',
 'userrights-groups-help' => 'Du kannst die Gruppenzugehörigkeit dieses Benutzers ändern:
-* Ein markiertes Kästchen bedeutet, dass der Benutzer Mitglied dieser Gruppe ist
-* Ein nicht-markiertes Kästchen bedeutet, dass der Benutzer nicht Mitglied dieser Gruppe ist
+* Ein markiertes Kästchen bedeutet, dass der Benutzer Mitglied dieser Gruppe ist.
+* Ein nichtmarkiertes Kästchen bedeutet, dass der Benutzer nicht Mitglied dieser Gruppe ist.
 * Ein * bedeutet, dass du das Benutzerrecht nach Erteilung nicht wieder zurücknehmen kannst (oder umgekehrt).',
 'userrights-reason' => 'Grund:',
 'userrights-no-interwiki' => 'Du hast nicht die erforderliche Berechtigung, um Benutzerrechte in anderen Wikis ändern zu können.',
@@ -2003,11 +2003,11 @@ Eine [[Special:WhatLinksHere/$2|vollständige Liste]] ist verfügbar.',
 'duplicatesoffile' => 'Die {{PLURAL:$1|folgende Datei ist ein Duplikat|folgenden $1 Dateien sind Duplikate}} dieser Datei ([[Special:FileDuplicateSearch/$2|weitere Details]]):',
 'sharedupload' => 'Diese Datei stammt aus $1 und darf von anderen Projekten verwendet werden.',
 'sharedupload-desc-there' => 'Diese Datei stammt aus $1 und darf von anderen Projekten verwendet werden. Siehe auf der [$2 Dateibeschreibungsseite] nach weiteren Informationen.',
-'sharedupload-desc-here' => 'Diese Datei stammt aus $1 und darf von anderen Projekten verwendet werden. Die Beschreibung der [$2 Dateibeschreibungsseite] wird unten angezeigt.',
+'sharedupload-desc-here' => 'Diese Datei stammt aus $1 und kann von anderen Projekten verwendet werden. Die Beschreibung von deren [$2 Dateibeschreibungsseite] wird unten angezeigt.',
 'sharedupload-desc-edit' => 'Diese Datei stammt aus $1 und kann auf anderen Projekten verwendet werden.
-Vielleicht willst du die Beschreibung auf der dortigen [$2 Dateibeschreibungsseite] bearbeiten.',
-'sharedupload-desc-create' => 'Diese Datei stammt aus $1 und kann auf anderen Projekten verwendet werden.
-Vielleicht willst du die Beschreibung auf der dortigen [$2 Dateibeschreibungsseite] bearbeiten.',
+Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungsseite] bearbeiten.',
+'sharedupload-desc-create' => 'Diese Datei stammt aus $1 und kann von anderen Projekten verwendet werden.
+Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungsseite] bearbeiten.',
 'filepage-nofile' => 'Es existiert keine Datei mit diesem Namen.',
 'filepage-nofile-link' => 'Es existiert keine Datei mit diesem Namen, aber du kannst [$1 diese Datei hochladen].',
 'uploadnewversion-linktext' => 'Eine neue Version dieser Datei hochladen',
index 40c9f6a..952e4e9 100644 (file)
@@ -176,7 +176,7 @@ $messages = array(
 'vector-action-move' => 'Bere',
 'vector-action-protect' => 'Bıpawe',
 'vector-action-undelete' => 'Esterıtışi peyser bıgê',
-'vector-action-unprotect' => 'Ake',
+'vector-action-unprotect' => 'Starkerdışi bıvurne',
 'vector-simplesearch-preference' => 'Tewsiyanê cıgeyrayışiê raverberdeyan ake (Tenya vector skin de)',
 'vector-view-create' => 'Vıraze',
 'vector-view-edit' => 'Bıvurne',
@@ -213,8 +213,8 @@ $messages = array(
 'protect' => 'Bıpawe',
 'protect_change' => 'bıvurne',
 'protectthispage' => 'Ena pele bıpawe',
-'unprotect' => 'Ake',
-'unprotectthispage' => 'Ena pele ake',
+'unprotect' => 'Starkerdışi bıvurne',
+'unprotectthispage' => 'Starkerdışe ena peler bıvurne',
 'newpage' => 'Pela newiye',
 'talkpage' => 'Ena pele sero werêne',
 'talkpagelinktext' => 'Werênayış',
@@ -516,10 +516,14 @@ Bıne vındere u newe ra dest pê bıkere.',
 'passwordreset' => 'Parola ancia bınuse',
 'passwordreset-legend' => 'Parola ancia bınuse',
 'passwordreset-username' => 'Namey karberi:',
+'passwordreset-domain' => 'Domain:',
 'passwordreset-email' => 'Adresa e-postey:',
 'passwordreset-emailelement' => 'Namey karberi: $1
 Parola vêrdiye: $2',
 
+# Special:ChangeEmail
+'changeemail-none' => '(Çıno)',
+
 # Edit page toolbar
 'bold_sample' => 'Çapo qalınd',
 'bold_tip' => 'Herfo qalın',
@@ -638,6 +642,7 @@ Vurnayışê tu hama qeyd nıbiyo!",
 Vurnayişê şıma qey nêxerepyayişê peli tepeya geyra a.
 Eke şıma servisê proksi yo anonim şuxulneni sebebê ey noyo.'''",
 'editing' => 'Şımayê kenê "$1" bıvurnê',
+'creating' => "Şımaye kene $1'i vıraze",
 'editingsection' => '$1 vurneno (qısım)',
 'editingcomment' => '$1 vuryeno (qısmo newe)',
 'editconflict' => 'Vurnayişê ke yewbini nêtepışeni: $1',
@@ -758,7 +763,7 @@ Beno ke ena esteriya, ya zi namê cı vuriyo.
 Seba pelanê muhimanê newan [[Special:Search|cıgeyrayışê wiki de]] bıcerebne.',
 
 # Revision deletion
-'rev-deleted-comment' => '(tefşir esteriyo)',
+'rev-deleted-comment' => '(Timarkerdışe enay hewadeyayo)',
 'rev-deleted-user' => '(namey karberi esteriyo)',
 'rev-deleted-event' => '(fealiyetê cıkewtışi esteriyo)',
 'rev-deleted-user-contribs' => '[namey karberi ya zi adresa IPy esteriya - vurnayış iştırakan ra nımniyo]',
@@ -1001,6 +1006,7 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 'searchresultshead' => 'Cı geyre',
 'resultsperpage' => 'Serê pele  amarê cıkewtoğan:',
 'stub-threshold' => 'Baraj ke <a href="#" class="stub">stub link</a> ho şekil dano (bîtî):',
+'stub-threshold-disabled' => 'Dezge ra vıcyaya',
 'recentchangesdays' => 'Rocê ke vurnayışanê peyênan de bıasê:',
 'recentchangesdays-max' => 'Tewr zaf $1 {{PLURAL:$1|roc|roci}}',
 'recentchangescount' => 'Amarê vurnayışiê ke standard bıasê:',
@@ -1109,10 +1115,10 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'group-suppress' => 'Kontroli',
 'group-all' => '(pêro)',
 
-'group-user-member' => 'karber',
+'group-user-member' => '{{GENDER:$1|karber}}',
 'group-autoconfirmed-member' => 'karbero tesdiq biyae',
 'group-bot-member' => 'Bot',
-'group-sysop-member' => 'İdare kerdoğ',
+'group-sysop-member' => '{{GENDER:$1|İdarekar}}',
 'group-bureaucrat-member' => 'Burokrat',
 'group-suppress-member' => 'Kontrol',
 
index 7feec9d..8006df5 100644 (file)
@@ -336,6 +336,7 @@ $magicWords = array(
        'padleft'                => array( 0,    'PADLEFT'                ),
        'padright'               => array( 0,    'PADRIGHT'               ),
        'special'                => array( 0,    'special',               ),
+       'speciale'               => array( 0,    'speciale',              ),
        'defaultsort'            => array( 1,    'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'               => array( 0,    'FILEPATH:'              ),
        'tag'                    => array( 0,    'tag'                    ),
@@ -1463,6 +1464,7 @@ It appears to have been deleted.',
 It already exists.',
 'addsection-preload'               => '', # do not translate or duplicate this message to other languages
 'addsection-editintro'             => '', # do not translate or duplicate this message to other languages
+'defaultmessagetext'               => 'Default message text',
 
 # Parser/template warnings
 'expensive-parserfunction-warning'        => "'''Warning:''' This page contains too many expensive parser function calls.
@@ -2408,9 +2410,9 @@ Please see the [$2 file description page] for further information.',
 'sharedupload-desc-here'            => 'This file is from $1 and may be used by other projects.
 The description on its [$2 file description page] there is shown below.',
 'sharedupload-desc-edit'            => 'This file is from $1 and may be used by other projects.
-Maybe you want edit the description on its [$2 file description page] there.',
+Maybe you want to edit the description on its [$2 file description page] there.',
 'sharedupload-desc-create'          => 'This file is from $1 and may be used by other projects.
-Maybe you want edit the description on its [$2 file description page] there.',
+Maybe you want to edit the description on its [$2 file description page] there.',
 'shareddescriptionfollows'          => '-', # do not translate or duplicate this message to other languages
 'filepage-nofile'                   => 'No file by this name exists.',
 'filepage-nofile-link'              => 'No file by this name exists, but you can [$1 upload it].',
index 5c330f2..0d32420 100644 (file)
@@ -822,6 +822,7 @@ Hasta que lo hagas, las siguientes funciones no estarán disponibles.',
 'invalidemailaddress' => 'La dirección electrónica no puede ser aceptada, pues parece que tiene un formato no válido.
 Por favor, escribe una dirección en el formato adecuado o deja el campo en blanco.',
 'cannotchangeemail' => 'Las direcciones de la correo electrónico de las cuentas de usuario no puedes cambiarse en esta wiki.',
+'emaildisabled' => 'Este sitio no puede enviar mensajes de correo electrónico.',
 'accountcreated' => 'Cuenta creada',
 'accountcreatedtext' => 'La cuenta de usuario para $1 ha sido creada.',
 'createaccount-title' => 'Creación de cuenta para {{SITENAME}}',
@@ -1024,7 +1025,7 @@ La última entrada del registro de bloqueos se proporciona debajo para mayor ref
 'updated' => '(Actualizado)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''¡Recuerda que esto es solo una previsualización.'''
-¡Tus cambios aún no se ha guardado!",
+¡Tus cambios aún no se ha guardado! [[#editform|→ Continuar editando]]",
 'previewconflict' => 'Esta previsualización refleja el texto en el área de edición superior como aparecerá una vez guardados los cambios.',
 'session_fail_preview' => "'''Lo sentimos, no pudimos procesar la edición debido a una pérdida de los datos de sesión.'''
 Por favor, inténtalo de nuevo.
@@ -1039,6 +1040,7 @@ Se rechazó la edición para evitar que el texto de la página se corrompa.
 Esto sucede en ocasiones cuando se usa un servicio de proxy anónimo defectuoso.'''",
 'edit_form_incomplete' => "'''Algunas partes del formulario de edición no llegaron al servidor, comprueba que tus ediciones están intactas e inténtalo de nuevo'''.",
 'editing' => 'Editando $1',
+'creating' => 'Creando la página $1',
 'editingsection' => 'Editando $1 (sección)',
 'editingcomment' => 'Editando $1 (nueva sección)',
 'editconflict' => 'Conflicto de edición: $1',
@@ -1971,6 +1973,10 @@ También puedes consultar la [[Special:WhatLinksHere/$2|lista completa]].',
 Por favor mira la [$2 página de descripción del archivo] para información adicional.',
 'sharedupload-desc-here' => 'Este archivo es de $1 y puede ser usado por otros proyectos.
 La descripción en su [$2 página de descripción del archivo] está mostrada debajo.',
+'sharedupload-desc-edit' => 'Este archivo es de $1 y puede ser utilizado por otros proyectos.
+Tal vez desee editar la descripción de su [$2  página de descripción del archivo] allí.',
+'sharedupload-desc-create' => 'Este archivo es de $1 y puede ser utilizado por otros proyectos.
+Tal vez desee editar la descripción de su [$2 página de descripción del archivo] allí.',
 'filepage-nofile' => 'No existe ningún archivo con este nombre.',
 'filepage-nofile-link' => 'No existe ningún archivo con este nombre, pero puedes [$1 subirlo].',
 'uploadnewversion-linktext' => 'Subir una nueva versión de este archivo',
@@ -2181,6 +2187,7 @@ Puedes filtrar la vista seleccionando un tipo de registro, el nombre del usuario
 'allpagesprefix' => 'Mostrar páginas con el prefijo:',
 'allpagesbadtitle' => 'El título dado era inválido o tenía un prefijo de enlace inter-idioma o inter-wiki. Puede contener uno o más caracteres que no se pueden usar en títulos.',
 'allpages-bad-ns' => '{{SITENAME}} no tiene un espacio de nombres llamado «$1».',
+'allpages-hide-redirects' => 'Ocultar redirecciones',
 
 # Special:Categories
 'categories' => 'Categorías',
index 23ac18e..e67a909 100644 (file)
@@ -475,7 +475,7 @@ $messages = array(
 'vector-view-viewsource' => 'Näytä lähdekoodi',
 'actions' => 'Toiminnot',
 'namespaces' => 'Nimiavaruudet',
-'variants' => 'Muuttujat',
+'variants' => 'Kirjoitusjärjestelmät',
 
 'errorpagetitle' => 'Virhe',
 'returnto' => 'Palaa sivulle $1.',
index a266bca..c3590af 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Agzennay
+ * @author Arkanosis
  * @author Cedric31
  * @author ChrisPtDe
  * @author Coyau
@@ -2805,7 +2806,7 @@ Veuillez en choisir un autre.',
 'talkexists' => "'''La page elle-même a été déplacée avec succès, mais la page de discussion n’a pas pu être déplacée car il en existait déjà une sous le nouveau nom. Veuillez les fusionner manuellement.'''",
 'movedto' => 'renommé en',
 'movetalk' => 'Renommer aussi la page de discussion associée',
-'move-subpages' => 'Renommer les sous-pages (jusqu’à $1 pages)',
+'move-subpages' => 'Renommer les sous-pages (jusqu’à $1 {{PLURAL:$1|page|pages}})',
 'move-talk-subpages' => 'Renommer les sous-pages de la page de discussion (jusqu’à $1 pages)',
 'movepage-page-exists' => 'La page $1 existe déjà et ne peut pas être écrasée automatiquement.',
 'movepage-page-moved' => 'La page $1 a été renommée en $2.',
@@ -3933,12 +3934,12 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 'logentry-suppress-event-legacy' => '$1 a secrètement modifié la visibilité des événements du journal sur $3',
 'logentry-suppress-revision-legacy' => '$1 a secrètement modifié la visibilité des révisions sur la page $3',
 'revdelete-content-hid' => 'contenu caché',
-'revdelete-summary-hid' => 'modifier le résumé caché',
+'revdelete-summary-hid' => 'résumé de modification caché',
 'revdelete-uname-hid' => "nom d'utilisateur caché",
 'revdelete-content-unhid' => 'contenu démasqué',
-'revdelete-summary-unhid' => 'modifier le résumé démasqué',
+'revdelete-summary-unhid' => 'résumé de modification démasqué',
 'revdelete-uname-unhid' => "nom d'utilisateur démasqué",
-'revdelete-restricted' => 'a appliqué les restrictions aux administrateurs',
+'revdelete-restricted' => 'restrictions appliquées aux administrateurs',
 'revdelete-unrestricted' => 'restrictions retirées pour les administrateurs',
 'logentry-move-move' => '$1 a déplacé la page $3 vers $4',
 'logentry-move-move-noredirect' => '$1 a déplacé la page $3 vers $4 sans laisser de redirection',
index 188e7fe..ed0053a 100644 (file)
@@ -1023,6 +1023,7 @@ Lo changement at étâ refusâ por empachiér la corrupcion du tèxto de la pâg
 Ceti problèmo arreve quand vos utilisâd un sèrvor mandatèro (''proxy'') anonimo qu’est pas de sûr.",
 'edit_form_incomplete' => "'''Quârques parties du formulèro de changement ont pas avengiês lo sèrvor ; controlâd que voutros changements sont entiérs et pués tornâd èprovar.'''",
 'editing' => 'Changement de $1',
+'creating' => 'Crèacion de $1',
 'editingsection' => 'Changement de $1 (sèccion)',
 'editingcomment' => 'Changement de $1 (novèla sèccion)',
 'editconflict' => 'Conflit de changement : $1',
@@ -1673,9 +1674,11 @@ Ceta enformacion serat publica.',
 'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|usanciér qu’est|usanciérs que sont}} aprés siuvre]',
 'rc_categories' => 'Limita de les catègories (sèparacion avouéc « | »)',
 'rc_categories_any' => 'Totes',
+'rc-change-size-new' => '$1 octèt{{PLURAL:$1||s}} aprés changement',
 'newsectionsummary' => '/* $1 */ novèla sèccion',
 'rc-enhanced-expand' => 'Vêde los dètalys (at fôta de JavaScript)',
 'rc-enhanced-hide' => 'Cachiér los dètalys',
+'rc-old-title' => 'fêt avouéc lo titro « $1 »',
 
 # Recent changes linked
 'recentchangeslinked' => 'Changements de les pâges liyês',
@@ -2197,6 +2200,7 @@ Vos pouede rètrendre la vua en chouèséssent un tipo de jornal, un nom d’usa
 'allpagesbadtitle' => 'Lo titro de pâge balyê est fôx ou ben il at un prèfixo entèrlengoua ou entèrvouiqui resèrvâ.
 Contint sûrement yon ou ben un mouél de caractèros que pôvont pas étre utilisâs dens los titros.',
 'allpages-bad-ns' => '{{SITENAME}} at gins d’èspâço de noms « $1 ».',
+'allpages-hide-redirects' => 'Cachiér les redirèccions',
 
 # Special:Categories
 'categories' => 'Catègories',
@@ -3024,6 +3028,8 @@ Portant, vos en pouede vêre lo tèxto sôrsa.',
 'tooltip-diff' => 'Pèrmèt de fâre vêre los changements que vos éd fêts.',
 'tooltip-compareselectedversions' => 'Fâre ressortir les difèrences entre doves vèrsions de ceta pâge',
 'tooltip-watch' => 'Apondre ceta pâge a voutra lista de survelyence',
+'tooltip-watchlistedit-normal-submit' => 'Enlevar los titros',
+'tooltip-watchlistedit-raw-submit' => 'Betar a jorn la lista de survelyence',
 'tooltip-recreate' => 'Refâre la pâge mémo se ceta at étâ suprimâ',
 'tooltip-upload' => 'Emmodar lo tèlèchargement',
 'tooltip-rollback' => '« Rèvocar » anule en yon clic lo ou ben los changement(s) de ceta pâge per son dèrriér contributor.',
@@ -4043,6 +4049,7 @@ Les émâges sont montrâs dens lor plêna rèsolucion, los ôtros fichiérs son
 'api-error-duplicate-archive-popup-title' => 'Duplicar {{PLURAL:$1|lo fichiér|los fichiérs}} qu’{{PLURAL:$1|at ja étâ suprimâ|ont ja étâ suprimâs}}',
 'api-error-duplicate-popup-title' => 'Fichiér{{PLURAL:$1||s}} en doblo',
 'api-error-empty-file' => 'Lo fichiér que vos éd somês ére vouedo.',
+'api-error-emptypage' => 'La crèacion de pâges novèles vouedes est pas ôtorisâ.',
 'api-error-fetchfileerror' => 'Èrror de dedens : quârque-ren s’est mâl passâ pendent la rècupèracion du fichiér.',
 'api-error-file-too-large' => 'Lo fichiér que vos éd somês ére trop grant.',
 'api-error-filename-tooshort' => 'Lo nom du fichiér est trop côrt.',
@@ -4064,9 +4071,10 @@ Les émâges sont montrâs dens lor plêna rèsolucion, los ôtros fichiérs son
 'api-error-stashfailed' => 'Èrror de dedens : lo sèrvor at pas possu encartar lo fichiér temporèro.',
 'api-error-timeout' => 'Lo sèrvor at pas rèpondu dens lo dèlê atendu.',
 'api-error-unclassified' => 'Una èrror encognua est arrevâ',
-'api-error-unknown-code' => 'Èrror encognua : « $1 »',
+'api-error-unknown-code' => 'Èrror encognua : « $1 ».',
 'api-error-unknown-error' => 'Èrror de dedens : quârque-ren s’est mâl passâ pendent lo tèlèchargement de voutron fichiér.',
 'api-error-unknown-warning' => 'Avèrtissement encognu : $1',
+'api-error-unknownerror' => 'Èrror encognua : « $1 ».',
 'api-error-uploaddisabled' => 'Lo tèlèchargement est dèsactivâ sur ceti vouiqui.',
 'api-error-verification-error' => 'Cél fichiér pôt étre corrompu, ou ben son èxtension est fôssa.',
 
index a146b43..8c9383e 100644 (file)
@@ -840,6 +840,7 @@ $2',
 'invalidemailaddress' => 'כתובת הדוא"ל אינה מתקבלת כיוון שנראה שהיא בפורמט לא נכון.
 אנא הקלידו כתובת תקינה או השאירו את השדה ריק.',
 'cannotchangeemail' => 'לא ניתן לשנות את כתובות הדוא"ל של חשבונות באתר ויקי זה.',
+'emaildisabled' => 'אתר זה לא יכול לשלוח דואר אלקטרוני.',
 'accountcreated' => 'החשבון נוצר',
 'accountcreatedtext' => 'חשבון המשתמש $1 נוצר.',
 'createaccount-title' => 'יצירת חשבון ב{{grammar:תחילית|{{SITENAME}}}}',
@@ -1040,7 +1041,7 @@ $2
 'updated' => '(מעודכן)',
 'note' => "'''הערה:'''",
 'previewnote' => "'''זכרו שזו רק תצוגה מקדימה.'''
-השינויים שלכם טרם נשמרו!",
+השינויים שלכם טרם נשמרו! [[#editform|← להמשך העריכה]]",
 'previewconflict' => 'תצוגה מקדימה זו מציגה כיצד ייראה הטקסט בחלון העריכה העליון, אם תבחרו לשמור אותו.',
 'session_fail_preview' => "'''לא ניתן לבצע את עריכתכם עקב אובדן מידע הכניסה.'''
 אנא נסו שוב.
@@ -1056,6 +1057,7 @@ $2
 לעתים התקלה מתרחשת עקב שימוש בשירות פרוקסי אנונימי פגום.",
 'edit_form_incomplete' => "'''כמה חלקים מטופס העריכה לא הגיעו לשרת; בדקו היטב שעריכותיכם לא נפגעו ונסו שוב.'''",
 'editing' => 'עריכת $1',
+'creating' => 'יצירת $1',
 'editingsection' => 'עריכת $1 (פסקה)',
 'editingcomment' => 'עריכת $1 (פסקה חדשה)',
 'editconflict' => 'התנגשות עריכה: $1',
index 5459701..3cabb47 100644 (file)
@@ -1057,7 +1057,7 @@ IPアドレスは複数の利用者の間で共有されていることがあり
 'updated' => '(更新)',
 'note' => "'''お知らせ:'''",
 'previewnote' => "'''これはプレビューです。'''
-変更はまだ保存されていません!",
+変更箇所はまだ保存されていません! [[#editform|→ 編集を続行]]",
 'previewconflict' => 'このプレビューは、上の文章編集エリアの文章を保存した場合にどう見えるようになるかを示すものです。',
 'session_fail_preview' => "'''申し訳ありません!セッションが切断されたため編集を処理できませんでした。'''
 もう一度やりなおしてください。
@@ -2998,7 +2998,7 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript をテスト中',
-'javascripttest-disabled' => 'この機能は無効にされています。',
+'javascripttest-disabled' => 'この機能はこのウィキでは有効にされていません。',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => '自分の利用者ページ',
index 17edd8e..661ca76 100644 (file)
@@ -630,6 +630,7 @@ $1 საათში.',
 'invalidemailaddress' => 'ელ. ფოსტის მისამართი არ იქნა მიღებული, ვინაიდან იგი არასწორი ფორმატითაა წარმოდგენილი.
 გთხოვთ, სწორად შეიყვანოთ იგი ან წაშალოთ ეს ველი.',
 'cannotchangeemail' => 'ანგარიშის ელ-ფოსტის მისამართების შეცვლა ამ ვიკიში შეუძლებელია.',
+'emaildisabled' => 'ამ საიტს არ შეუძლია ელ.ფოსტის გაგზავნა.',
 'accountcreated' => 'ანგარიში შეიქმნა',
 'accountcreatedtext' => 'მომხმარებლის ანგარიში $1-სთვის შექმნილია.',
 'createaccount-title' => 'ანგარიშის შექმნა {{SITENAME}}-თვის',
@@ -836,7 +837,8 @@ $2
 'userinvalidcssjstitle' => "'''ყურადღება:''' გაფორმების თემა «$1» არ არის ნაპოვნი. გახსოვდეთ, რომ .css და .js გვერდებს უნდა ჰქონდეს მხოლოდ ზეხაზური სათაური, მაგ. «{{ns:user}}:ვიღაცა/vector.css», და არა «{{ns:user}}:ვიღაცა/Vector.css».",
 'updated' => '(განახლდა)',
 'note' => "'''შენიშვნა:'''",
-'previewnote' => "'''ეს მხოლოდ ნიმუშია; ცვლილებები ჯერ არ შენახულა!'''",
+'previewnote' => "'''დაიმახსოვრეთ, ეს მხოლოდ წინასწარი გადახედვაა.'''
+თქვენი ცვლილებები ჯერ არ შენახულა! [[#editform|→ რედაქტირების გაგრძელება]]",
 'previewconflict' => 'შავი ნიმუში უჩვენებს ტექსტს ზედა რედაქტირების ფანჯარაში, როგორც ის გამოჩნდება თუ თქვენ მას შეინახავთ.',
 'session_fail_preview' => "'''უკაცრავად! ვერ შევძელით თქვენი რედაქტირების შენახვა სესიის მონაცემთა დაკარგვის გამო.
 გთხოვთ ისევ სცადოთ.
@@ -849,6 +851,7 @@ $2
 'token_suffix_mismatch' => "'''თქვენი შესწორება გაუქმდა რადგანაც პროგრამა არასწორედ აღიქვამს პუნქტუაციის ნიშნებს რედაქტირების ფანჯარაში. შესწრება გაუქმდა სტატიის არ გაფუჭების მიზნით. შესაძლოა ეს გამოწვეულია გაფუჭებული ვებ პროქსის გამოყენებით.'''",
 'edit_form_incomplete' => "'''რედაქტირებების ნაწილმა სერვერამდე ვერ მიაღწია; გთხოვთ, შეამოწმეთ თქვენი რედაქტირებების სრულყოფილება და სცადეთ განმეორებით.'''",
 'editing' => 'რედაქტირება: $1',
+'creating' => 'იქმნება $1',
 'editingsection' => 'რედაქტირება - $1 (სექცია)',
 'editingcomment' => 'რედაქტირება: $1 (ახალი სექცია)',
 'editconflict' => 'რედაქტირების კონფლიქტი: $1',
@@ -1787,6 +1790,10 @@ $1',
 დამატებითი ინფორმაციის მოპოვება შეიძლება [$2 ფაილის აღწერის გვერდზე].',
 'sharedupload-desc-here' => 'ეს ფაილი $1-დან შეიძლება გამოყენებული იქნას სხვა პროექტებშიც.
 მისი [$2 აღწერის გვერდიდან] ინფორმაცია წარმოდგენილია ქვევით.',
+'sharedupload-desc-edit' => 'ეს ფაილი $1-დანაა, ის შესაძლოა გამოიყენებოდეს რამდენიმე სხვა საიტზეც.
+მისი აღწერის რედაქტირება შესაძლებელია [$2 შესაბამის გვერდზე].',
+'sharedupload-desc-create' => 'ეს ფაილი $1-დანაა, ის შესაძლოა გამოიყენებოდეს რამდენიმე სხვა საიტზეც.
+მისი აღწერის რედაქტირება შესაძლებელია [$2 შესაბამის გვერდზე].',
 'filepage-nofile' => 'ამ სახელით ფაილი არ არსებობს.',
 'filepage-nofile-link' => 'ამ სახელით ფაილი არ არსებობს, [$1 თუმცა თქვენ მისი ატვირთვა შეგიძლიათ].',
 'uploadnewversion-linktext' => 'ატვირთეთ ამ ფაილის ახალი ვერსია',
@@ -2001,6 +2008,7 @@ $1',
 'allpagesprefix' => 'ასახე გვერდები პრეფიქსით:',
 'allpagesbadtitle' => 'მოცემული გვერდის სათაური არასწორია ან აქვს ინტერვიკი ან ნათშორისი პრეფიქსი. იგი შესაძლოა შეიცავდეს ერთ ან მეტ სიმბოლოს, რომელიც არ შეიძლება გამოყენებულ იქნას სათაურში.',
 'allpages-bad-ns' => '{{SITENAME}} "$1" არ აქვს სახელთა სივრცე.',
+'allpages-hide-redirects' => 'გადამისამართებების დამალვა',
 
 # Special:Categories
 'categories' => 'კატეგორიები',
index 9d39bbe..7e5ce84 100644 (file)
@@ -769,6 +769,7 @@ $2',
 'invalidemailaddress' => '이메일 주소의 형식이 잘못되어 인식할 수 없습니다.
 정상적인 형식의 이메일을 입력하거나 칸을 비워 주세요.',
 'cannotchangeemail' => '이 위키에서는 계정의 이메일 주소를 바꿀 수 없습니다.',
+'emaildisabled' => '이 사이트에서는 이메일을 보낼 수 없습니다.',
 'accountcreated' => '계정 만들어짐',
 'accountcreatedtext' => '‘$1’ 사용자 계정이 만들어졌습니다.',
 'createaccount-title' => '{{SITENAME}} 계정 만들기',
@@ -951,7 +952,7 @@ $1, 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 
 .css와 .js 문서의 제목은 {{ns:user}}:Foo/vector.css 처럼 소문자로 써야 합니다. {{ns:user}}:Foo/Vector.css 와 같이 대문자로 쓸 경우 작동하지 않습니다.",
 'updated' => '(바뀜)',
 'note' => "'''주의:'''",
-'previewnote' => "'''ì§\80ê¸\88 ë¯¸ë¦¬ ë³´ê¸°ë¡\9c ë³´ê³  ì\9e\88ë\8a\94 ë\82´ì\9a©ì\9d\80 ì\95\84ì§\81 ì \80ì\9e¥ë\90\98ì§\80 ì\95\8aì\95\98ì\8aµë\8b\88ë\8b¤!'''",
+'previewnote' => "'''ì\9d´ í\99\94ë©´ì\9d\80 ë¯¸ë¦¬ ë³´ê¸°ì\9e\85ë\8b\88ë\8b¤'''. í\8e¸ì§\91í\95\9c ë\82´ì\9a©ì\9d\80 ì\95\84ì§\81 ì \80ì\9e¥ë\90\98ì§\80 ì\95\8aì\95\98ì\8aµë\8b\88ë\8b¤! [[#editform|â\86\92 í\8e¸ì§\91 ê³\84ì\86\8dí\95\98기]]",
 'previewconflict' => '이 미리 보기는 저장할 때의 모습, 즉 위쪽 편집창의 문서를 반영합니다.',
 'session_fail_preview' => "'''세션 데이터가 없어져 편집을 저장하지 못했습니다.
 다시 시도해도 되지 않으면 [[Special:UserLogout|로그아웃]]한 다음 다시 로그인해 보십시오.'''",
@@ -963,6 +964,7 @@ $1, 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 
 'token_suffix_mismatch' => "'''저장하려는 내용의 문장 부호가 망가져 있습니다. 문서 보호를 위해 해당 내용을 저장하지 않습니다. 버그가 있는 익명 프록시 서비스 등을 사용할 때 이런 문제가 발생할 수 있습니다.'''",
 'edit_form_incomplete' => "'''편집의 일부 내용이 서버에 전달되지 않았습니다. 당신의 편집이 손상되지 않았는지 확인하고 다시 시도해 주십시오.'''",
 'editing' => '$1 편집하기',
+'creating' => '$1 만들기',
 'editingsection' => '$1 편집하기 (부분)',
 'editingcomment' => '$1 편집하기 (덧붙이기)',
 'editconflict' => '편집 충돌: $1',
@@ -1789,6 +1791,9 @@ $1',
 'backend-fail-contenttype' => '"$1"에 저장하기 위한 파일의 내용 유형을 판별하지 못했습니다.',
 'backend-fail-batchsize' => '저장 백엔드에서 $1개의 파일 {{PLURAL:$1|작업}}이 쌓여 있습니다; 한계는 $2개입니다.',
 
+'filejournal-fail-dbconnect' => '저장소 백엔드 ‘$1’에 대한 저널 데이터베이스에 연결할 수 없습니다.',
+'filejournal-fail-dbquery' => '저장소 백엔드 ‘$1’에 대한 저널 데이터베이스에서 갱신할 수 없습니다.',
+
 # Lock manager
 'lockmanager-notlocked' => '‘$1’ 경로의 잠금을 풀 수 없습니다. 해당 경로는 잠겨 있지 않습니다.',
 'lockmanager-fail-closelock' => '‘$1’에 대한 잠금 파일을 닫지 못했습니다.',
@@ -1903,6 +1908,10 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 [$2 해당 파일]에 대한 자세한 정보를 확인해주세요.',
 'sharedupload-desc-here' => '이 파일은 $1에 있으며, 다른 프로젝트에서 사용하고 있을 가능성이 있습니다.
 [$2 해당 파일]에 대한 설명이 아래에 나와 있습니다.',
+'sharedupload-desc-edit' => '이 파일은 $1에 있으며 다른 프로젝트에서 사용하고 있을 가능성이 있습니다.
+해당 프로젝트의 [$2 파일 설명 문서]를 편집할 수도 있습니다.',
+'sharedupload-desc-create' => '이 파일은 $1에 있으며 다른 프로젝트에서 사용하고 있을 가능성이 있습니다.
+해당 프로젝트의 [$2 파일 설명 문서]를 편집할 수도 있습니다.',
 'filepage-nofile' => '해당 이름으로 된 파일이 없습니다.',
 'filepage-nofile-link' => '해당 이름으로 된 파일이 없습니다. [$1 파일을 올릴 수] 있습니다.',
 'uploadnewversion-linktext' => '이 파일의 새로운 버전을 올리기',
@@ -2115,6 +2124,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'allpagesprefix' => '다음으로 시작하는 문서 보기:',
 'allpagesbadtitle' => '문서 제목이 잘못되었거나 다른 사이트로 연결되는 인터위키를 가지고 있습니다. 문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.',
 'allpages-bad-ns' => '{{SITENAME}}에서는 ‘$1’ 이름공간을 사용하지 않습니다.',
+'allpages-hide-redirects' => '넘겨주기 숨기기',
 
 # Special:Categories
 'categories' => '분류',
index 35a99c4..603914a 100644 (file)
@@ -104,13 +104,13 @@ $messages = array(
 'editfont-default' => 'Defowt an beurel',
 
 # Dates
-'sunday' => "De' Sul",
-'monday' => "De' Lun",
-'tuesday' => "De' Meurth",
-'wednesday' => "De' Merher",
-'thursday' => "De' Yow",
-'friday' => "De' Gwener",
-'saturday' => "De' Sadorn",
+'sunday' => "Dy' Sul",
+'monday' => "Dy' Lun",
+'tuesday' => "Dy' Meurth",
+'wednesday' => "Dy' Merher",
+'thursday' => "Dy' Yow",
+'friday' => "Dy' Gwener",
+'saturday' => "Dy' Sadorn",
 'sun' => 'Sul',
 'mon' => 'Lun',
 'tue' => 'Meu',
@@ -249,7 +249,7 @@ $messages = array(
 'viewhelppage' => 'Gweles an folen gweres',
 'categorypage' => 'Gweles folen an klass',
 'viewtalkpage' => 'Gweles an keskows',
-'otherlanguages' => 'En tavosow erel',
+'otherlanguages' => 'En yethow erel',
 'redirectedfrom' => '(Daswedyes dhyworth $1)',
 'redirectpagesub' => 'Folen daswedyans',
 'lastmodifiedat' => 'An folen-ma a veu kens chanjys an $1, dhe $2.',
@@ -650,7 +650,7 @@ Gwrewgh assaya rag-gorra agas govyn gans ''all:'' rag hwilas en pub teller (a-ba
 'rcshowhideliu' => '$1 devnydhoryon omgelmys',
 'rcshowhideanons' => '$1 devnydhyoryon dihanow',
 'rcshowhidemine' => '$1 ow chanjyow',
-'rclinks' => "Diskwedhes an $1 chanj a-dhiwedhes gwres e'n $2 dedh a-dhiwedhes<br />$3",
+'rclinks' => "Diskwedhes an $1 chanj a-dhiwedhes gwres e'n $2 dydh a-dhiwedhes<br />$3",
 'diff' => 'dyffrans',
 'hist' => 'istori',
 'hide' => 'Kudha',
index 96e8282..2e633ef 100644 (file)
@@ -189,7 +189,7 @@ $messages = array(
 'undelete_short' => '$1 {{PLURAL:$1|дуьзар хъувун|дуьзар хъувунар}} туьхкIуьрун',
 'viewdeleted_short' => '{{PLURAL:$1|дуьзар хъувуниз|$1 дуьзар хъувунриз}} килигун',
 'protect' => 'Xуьн',
-'protect_change' => 'Ð\94егиÑ\88ун',
+'protect_change' => 'маÑ\81акIа Ð°Ð²ун',
 'protectthispage' => 'И ччин блокарун',
 'unprotect' => 'Хуьн дегишарун',
 'unprotectthispage' => 'И ччинин хуьн дегишарун',
@@ -248,7 +248,7 @@ $messages = array(
 'retrievedfrom' => 'Чешне "$1" я',
 'youhavenewmessages' => 'Квез  $1 ($2) атанва.',
 'newmessageslink' => 'цlийи чарар',
-'newmessagesdifflink' => 'ЭÑ\85иÑ\80имжи Ð´ÐµÐ³Ð¸Ñ\88аÑ\80Ñ\83нар',
+'newmessagesdifflink' => 'ЭÑ\85иÑ\80имжи Ð¼Ð°Ñ\81акIавилер',
 'youhavenewmessagesmulti' => '"$1"-да квез цIийи чарар атанва.',
 'editsection' => 'дуьзар хъувун',
 'editold' => 'Дуьзар хъувун',
@@ -291,7 +291,7 @@ $messages = array(
 'databaseerror' => 'Ганайбурун базадин гъалатI',
 'missing-article' => 'Малуматрин базада, квез герек авай "$1" $2 тIвар алай ччиндин текст жагъанвач
 
\98Ñ\85Ñ\8cÑ\82ин Ð³Ñ\8cал Ð°Ð´ÐµÑ\82 Ñ\8fз Ð°Ð»Ñ\83днавай Ñ\87Ñ\87индин Ð´ÐµÐ³Ð¸Ñ\88вилерин тарихдиз цlуру  рекьяй элячlайла арадал къвезва.
\98Ñ\85Ñ\8cÑ\82ин Ð³Ñ\8cал Ð°Ð´ÐµÑ\82 Ñ\8fз Ð°Ð»Ñ\83днавай Ñ\87Ñ\87инин Ð¼Ð°Ñ\81акIавилерин тарихдиз цlуру  рекьяй элячlайла арадал къвезва.
 
 Себеб ам туштlа, виридалайни мумкин тирди куьне программада гъалатl жугъурун я
 Тавакъу ийида, URL  къалурна адакай   [[Special:ListUsers/sysop|администратордиз]] хабар це.',
@@ -387,8 +387,8 @@ $messages = array(
 'preview' => 'Сифтедин килигун',
 'showpreview' => 'Сифтедин килигун къалурун',
 'showlivepreview' => 'Фад сифтедин килигун',
-'showdiff' => 'Ð\94егиÑ\88вилер къалурун',
-'anoneditwarning' => "'''Ð\94икÑ\8aеÑ\82:''' Ð\9aÑ\83Ñ\8cне Ñ\81иÑ\81Ñ\82емадиз Ð¶Ñ\83в Ð²Ñ\83ж Ñ\8fÑ\82Iа Ð»Ð°Ð³Ñ\8cанваÑ\87. Ð\9aÑ\83Ñ\8c IP-адÑ\80еÑ\81 Ð¸ Ñ\87Ñ\87инин Ð´ÐµÐ³Ð¸Ñ\88вилерин тарихдиз  кхьида.",
+'showdiff' => 'Ð\9cаÑ\81акIавилер къалурун',
+'anoneditwarning' => "'''Ð\94икÑ\8aеÑ\82:''' Ð\9aÑ\83Ñ\8cне Ñ\81иÑ\81Ñ\82емадиз Ð¶Ñ\83в Ð²Ñ\83ж Ñ\8fÑ\82Iа Ð»Ð°Ð³Ñ\8cанваÑ\87. Ð\9aÑ\83Ñ\8c IP-адÑ\80еÑ\81 Ð¸ Ñ\87Ñ\87инин Ð¼Ð°Ñ\81акIавилерин тарихдиз  кхьида.",
 'summary-preview' => 'Сифте килигун паталди:',
 'blockedtitle' => 'Иштиракчи блокарнава',
 'blockednoreason' => 'Са себебни ганвач',
@@ -408,7 +408,7 @@ $messages = array(
 Квевай [[Special:Search/{{PAGENAME}}| и тlвар алай ччин]] муькуь ччинра жугъуриз ва я
 <span class="plainlinks"> [{{fullurl: {{# Special:Log}} | page = {{FULLPAGENAMEE}}}} журналрин талукь тир кхьей затIар жугъуриз] жеда.',
 'previewnote' => "'''Рикlел хуьх хьи, им анжах сифтедин килигун я.'''  
\9aÑ\83Ñ\8c Ð´ÐµÐ³Ð¸Ñ\88Ñ\83наÑ\80 Ð³Ñ\8cеле Ñ\85венваÑ\87!",
\9aÑ\83Ñ\8c Ð¼Ð°Ñ\81акIавилеÑ\80 Ð³Ñ\8cеле Ñ\85венваÑ\87! [[#editform|â\86\92 Ð´Ñ\83Ñ\8cзаÑ\80 Ñ\85Ñ\8aÑ\83вÑ\83н Ð´Ð°Ð²Ð°Ð¼Ñ\80Ñ\83н]]",
 'editing' => '$1 Дуьзар хъувун',
 'editingsection' => 'Дуьзар хъувун $1  (пай)',
 'editconflict' => 'Дуьзар хъувунрин акьунар: $1',
@@ -447,7 +447,7 @@ $messages = array(
 'currentrev' => 'Алай жуьре',
 'currentrev-asof' => '$1 тарихдиз талукь тир алай жуьре',
 'revisionasof' => '$1 жуьре',
-'revision-info' => '$2 Ð¿Ð°Ñ\82ал Ð°Ð²Ñ\83нвай $1 Ñ\82аÑ\80иÑ\85дин Ð´ÐµÐ³Ð¸Ñ\88Ñ\83н',
+'revision-info' => '$2 Ð¿Ð°Ñ\82ал Ð°Ð²Ñ\83нвай $1 Ñ\82аÑ\80иÑ\85дин Ð¼Ð°Ñ\81акIавал',
 'previousrevision' => '←Вилик алатай жуьре',
 'nextrevision' => 'Мадни цlийи жуьре →',
 'currentrevisionlink' => 'Алай жуьре',
@@ -457,7 +457,7 @@ $messages = array(
 'page_first' => 'Садлагьайди',
 'page_last' => 'эхиримжи',
 'histlegend' => 'Тафаватдиз килигун: гекъигиз кlанзавайди жуьредин патав радио-кьватияр лишан ая ва  "ГЬалдун (Enter)"  ва я агъада авай дуьгмедиз илиса.<br />     
Ъавурда твазвайди: (алай)- алай жуьредикай тафават; (вилик фейи) - вилик фейи жуьредикай тафават; "гъ" - гъвечIи дегишун.',
ъавурда твазвайди: (алай)- алай жуьредикай тафават; (вилик фейи) - вилик фейи жуьредикай тафават; "гъ" - гъвечIи масакIавал.',
 'history-fieldset-title' => 'Тарихдиз килигун',
 'history-show-deleted' => 'Анжах алуднавайбур',
 'histfirst' => 'Виридалайни цIуру',
@@ -481,7 +481,7 @@ $messages = array(
 'revdelete-radio-set' => 'Эхь',
 'revdelete-radio-unset' => 'Ваъ',
 'revdelete-log' => 'Кар',
-'revdel-restore' => 'Ð\90квадайвал Ð´ÐµÐ³Ð¸Ñ\88аÑ\80ун',
+'revdel-restore' => 'Ð\90квадайвал Ð¼Ð°Ñ\81акIа Ð°Ð²ун',
 'revdel-restore-deleted' => 'Алуднавай жуьреяр',
 'revdel-restore-visible' => 'Аквадай масакIавилер',
 'pagehist' => 'Ччинин тарих',
@@ -504,7 +504,7 @@ $messages = array(
 'revertmerge' => 'Ччара авун',
 
 # Diffs
-'history-title' => '$1-ан дегишвилерин тарих',
+'history-title' => '$1  -  масакIавилерин тарих',
 'difference' => '(Жуьрейрин арада тафаватар)',
 'lineno' => 'ЦIар $1:',
 'compareselectedversions' => 'Хкягъай жуьреяр гекъигун',
@@ -694,25 +694,25 @@ $messages = array(
 'action-undelete' => 'и ччин туькIуьр хъувун',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|дегиÑ\88|дегиÑ\88Ñ\83нар}}',
-'recentchanges' => 'MÑ\83кÑ\8cваÑ\80а Ñ\85Ñ\8cайи Ð´ÐµÐ³Ð¸Ñ\88вилер',
-'recentchanges-legend' => 'Цlийи Ð´ÐµÐ³Ð¸Ñ\88вилерин низамарунар',
-'recentchangestext' => 'Ð\98 Ñ\87Ñ\87ина Ð²Ð¸ÐºÐ¸Ð´Ð° Ñ\85Ñ\8cанвай Ñ\8dÑ\85иÑ\80имжи Ð´ÐµÐ³Ð¸Ñ\88Ñ\83наÑ\80 гуьзетун',
-'recentchanges-feed-description' => 'Ð\98 Ñ\85вала Ð²Ð¸ÐºÐ¸Ð´Ð° Ñ\85Ñ\8cанвай Ñ\8dÑ\85иÑ\80имжи Ð´ÐµÐ³Ð¸Ñ\88Ñ\83нар гуьзетун',
+'nchanges' => '$1 {{PLURAL:$1|маÑ\81акIавал|маÑ\81акIавилер}}',
+'recentchanges' => 'MÑ\83кÑ\8cваÑ\80а Ñ\85Ñ\8cайи Ð¼Ð°Ñ\81акIавилер',
+'recentchanges-legend' => 'Цlийи Ð¼Ð°Ñ\81акIавилерин низамарунар',
+'recentchangestext' => 'Ð\92икида Ñ\85Ñ\8cанвай Ñ\8dÑ\85иÑ\80имжи Ð¼Ð°Ñ\81акIавилеÑ\80 Ð¸ Ñ\87Ñ\87ина гуьзетун',
+'recentchanges-feed-description' => 'Ð\98 Ñ\85вала Ð²Ð¸ÐºÐ¸Ð´Ð° Ñ\85Ñ\8cанвай Ñ\8dÑ\85иÑ\80имжи Ð¼Ð°Ñ\81акIавилер гуьзетун',
 'recentchanges-label-newpage' => 'И дуьзар хъувун  цlийи ччин туькlуьрна',
 'recentchanges-label-minor' => 'Им гъвечlи дуьзар хъувун я',
 'recentchanges-label-bot' => 'И дуьзар хъувун ботди авунвайд я',
 'recentchanges-label-unpatrolled' => 'И дуьзар хъувундин винел патрулвал авунвач',
-'rcnote' => "$5, $4 Ñ\87IавÑ\83н ÐºÑ\8cаÑ\82Iдиз Ñ\82алÑ\83кÑ\8c {{PLURAL:$2|Ñ\8eгÑ\8a|'''$2''' Ð¹Ð¸ÐºÑ\8aаÑ\80}} ÐºÑ\8aене{{PLURAL:$1|Ñ\8dÑ\85иÑ\80имжи'''1''' Ð´ÐµÐ³Ð¸Ñ\88Ñ\83н|Ñ\8dÑ\85иÑ\80имжи '''$1''' Ð´ÐµÐ³Ð¸Ñ\88Ñ\83нар}}",
-'rcnotefrom' => "Ð\90гÑ\8aадиÑ\85Ñ\8a '''$2'''-ай Ñ\8dгеÑ\87Iна Ð´ÐµÐ³Ð¸Ñ\88вилер къалурнава ( '''$1''' кьван  къалурнава).",
-'rclistfrom' => '$1-ла Ñ\8dгеÑ\87Iна Ñ\86Iийи Ð´ÐµÐ³Ð¸Ñ\88вилеÑ\80 ÐºÑ\8aалÑ\83Ñ\80а',
+'rcnote' => "$5, $4 Ñ\87IавÑ\83н ÐºÑ\8cаÑ\82Iдиз Ñ\82алÑ\83кÑ\8c {{PLURAL:$2|Ñ\8eгÑ\8a|'''$2''' Ð¹Ð¸ÐºÑ\8aаÑ\80}} ÐºÑ\8aене{{PLURAL:$1|Ñ\8dÑ\85иÑ\80имжи'''1''' Ð¼Ð°Ñ\81акIавал|Ñ\8dÑ\85иÑ\80имжи '''$1''' Ð¼Ð°Ñ\81акIавилер}}",
+'rcnotefrom' => "Ð\90гÑ\8aадиÑ\85Ñ\8a '''$2'''-ай Ñ\8dгеÑ\87Iна Ð¼Ð°Ñ\81акIавилер къалурнава ( '''$1''' кьван  къалурнава).",
+'rclistfrom' => '$1-й Ñ\8dгеÑ\87Iна Ñ\86Iийи Ð¼Ð°Ñ\81акIавилеÑ\80 ÐºÑ\8aалÑ\83Ñ\80Ñ\83н',
 'rcshowhideminor' => '$1 гъвечlи дуьзар хъувунар',
 'rcshowhidebots' => '$1 ботар',
 'rcshowhideliu' => '$1 чпин тlвар къалурнавай уртахар',
 'rcshowhideanons' => '$1 чуьнуьхай уртахар',
 'rcshowhidepatr' => '$1 гуьзчивал авунвай дуьзар хъувунар',
 'rcshowhidemine' => '$1 зи  дуьзар хъувунар',
-'rclinks' => 'ЭÑ\85иÑ\80имжи $2 Ð¹Ð¸ÐºÑ\8aан ÐºÑ\8aене $1 Ð´ÐµÐ³Ð¸Ñ\88вилер къалура <br />$3',
+'rclinks' => 'ЭÑ\85иÑ\80имжи $2 Ð¹Ð¸ÐºÑ\8aан ÐºÑ\8aене $1 Ð¼Ð°Ñ\81акIавилер къалура <br />$3',
 'diff' => 'тафават',
 'hist' => 'тарих',
 'hide' => 'Чуьнуьхун',
@@ -727,12 +727,12 @@ $messages = array(
 # Recent changes linked
 'recentchangeslinked' => 'Галкlанвай дуьзар хъувунар',
 'recentchangeslinked-feed' => 'Галкlанвай дуьзар хъувунар',
-'recentchangeslinked-toolbox' => 'Галкlанвай масакIаяр',
-'recentchangeslinked-title' => '"$1" Ð³Ð°Ð»Ð°Ð· Ð³Ð°Ð»Ðºlанавай Ð´ÐµÐ³Ð¸Ñ\88вилер',
-'recentchangeslinked-noresult' => 'Ð\93анвай Ñ\87lава Ð³Ð°Ð»Ðºlанавай Ñ\87Ñ\87инÑ\80а Ñ\81а Ð´ÐµÐ³Ð¸Ñ\88вални хьанвайд туш',
-'recentchangeslinked-summary' => 'Ð\98м ÐºÑ\8aалÑ\83Ñ\80ай Ñ\87Ñ\87иниз (ва Ñ\8f ÐºÑ\8aалÑ\83Ñ\80ай ÐºÐ°Ñ\82егоÑ\80иÑ\8fдиз Ð³Ñ\8cаÑ\82завай Ñ\87Ñ\87инÑ\80из) Ñ\8dлÑ\8fÑ\87Iзавай Ñ\87Ñ\87инÑ\80а Ð¼Ñ\83кÑ\8cваÑ\80а Ñ\85Ñ\8cайи Ð´ÐµÐ³Ð¸Ñ\88вилерин сиягь я. Куь [[Special:Watchlist| гуьзетунин сиягь  ]]диз гьатзавай  ччинар яцlу шрифтдал къалурнава.',
+'recentchangeslinked-toolbox' => 'Галкlанвай масакIавилер',
+'recentchangeslinked-title' => '"$1" Ð³Ð°Ð»Ð°Ð· Ð³Ð°Ð»Ðºlанавай Ð¼Ð°Ñ\81акIавилер',
+'recentchangeslinked-noresult' => 'Ð\93анвай Ñ\87lава Ð³Ð°Ð»Ðºlанавай Ñ\87Ñ\87инÑ\80а Ñ\81а Ð¼Ð°Ñ\81акIавални хьанвайд туш',
+'recentchangeslinked-summary' => 'Ð\98м ÐºÑ\8aалÑ\83Ñ\80ай Ñ\87Ñ\87иниз (ва Ñ\8f ÐºÑ\8aалÑ\83Ñ\80ай ÐºÐ°Ñ\82егоÑ\80иÑ\8fдиз Ð³Ñ\8cаÑ\82завай Ñ\87Ñ\87инÑ\80из) Ñ\8dлÑ\8fÑ\87Iзавай Ñ\87Ñ\87инÑ\80а Ð¼Ñ\83кÑ\8cваÑ\80а Ñ\85Ñ\8cайи Ð¼Ð°Ñ\81акIавилерин сиягь я. Куь [[Special:Watchlist| гуьзетунин сиягь  ]]диз гьатзавай  ччинар яцlу шрифтдал къалурнава.',
 'recentchangeslinked-page' => 'Ччинин тlвар:',
-'recentchangeslinked-to' => 'Ð\90кÑ\81ина, ÐºÑ\8aалÑ\83Ñ\80ай Ñ\87Ñ\87иниз Ñ\8dлÑ\8fÑ\87lзавай Ñ\87Ñ\87инÑ\80а Ð´ÐµÐ³Ð¸Ñ\88вилер къалура',
+'recentchangeslinked-to' => 'Ð\90кÑ\81ина, ÐºÑ\8aалÑ\83Ñ\80ай Ñ\87Ñ\87иниз Ñ\8dлÑ\8fÑ\87lзавай Ñ\87Ñ\87инÑ\80а Ð¼Ð°Ñ\81акIавилер къалура',
 
 # Upload
 'upload' => 'Файл ппарун',
@@ -1053,7 +1053,7 @@ $messages = array(
 'blocklist-reason' => 'Себеб',
 'blocklink' => 'Блок авун',
 'unblocklink' => 'Блок къахчун',
-'change-blocklink' => 'Ð\91локаÑ\80Ñ\83н Ð´ÐµÐ³Ð¸Ñ\88аÑ\80ун',
+'change-blocklink' => 'блокаÑ\80Ñ\83н Ð¼Ð°Ñ\81акIа Ð°Ð²ун',
 'contribslink' => 'Кутур крар',
 'blocklogpage' => 'Блокарунин журнал',
 'blocklogentry' => '[[$1]] блокарна,  $2 $3 чIав кьван',
@@ -1124,7 +1124,7 @@ $messages = array(
 'tooltip-ca-edit' => 'Квевай и ччин масакIа ийиз жеда. Ччин хуьдалди вилик, сифте килигундиз илис.',
 'tooltip-ca-addsection' => 'Гатlунив цlийи кьил',
 'tooltip-ca-viewsource' => 'И ччин хвенвайд я, амма квевай адан къене авайбуруз килигиз жеда.',
-'tooltip-ca-history' => 'Ð\98 Ñ\87Ñ\87индин Ð°Ð»Ð°Ñ\82ай Ð´ÐµÐ³Ð¸Ñ\88вилерин журнал',
+'tooltip-ca-history' => 'Ð\98 Ñ\87Ñ\87инин Ð°Ð»Ð°Ñ\82ай Ð¼Ð°Ñ\81акIавилерин журнал',
 'tooltip-ca-protect' => 'И ччин хуьн',
 'tooltip-ca-delete' => 'И ччин алудун',
 'tooltip-ca-move' => 'Ччиндин тIвар масакIа авун',
@@ -1158,10 +1158,10 @@ $messages = array(
 'tooltip-ca-nstab-image' => 'Файлдин ччиндиз килигун',
 'tooltip-ca-nstab-template' => 'Чешнедиз килигун',
 'tooltip-ca-nstab-category' => 'Категориядин ччиниз килигун',
-'tooltip-minoredit' => 'Ð\98 Ð´ÐµÐ³Ð¸Ñ\88Ñ\83н Ð³Ñ\8aвеÑ\87lи Ð´Ñ\83Ñ\8cзаÑ\80 Ñ\85Ñ\8aÑ\83вÑ\83н Ñ\85Ñ\8cиз ÐºÑ\8aейд ая',
-'tooltip-save' => 'Ð\9aÑ\83Ñ\8c Ð´ÐµÐ³Ð¸Ñ\88Ñ\83наÑ\80 хуьн',
+'tooltip-minoredit' => 'Ð\98 Ð¼Ð°Ñ\81акIавал Ð³Ñ\8aвеÑ\87lи Ð´Ñ\83Ñ\8cзаÑ\80 Ñ\85Ñ\8aÑ\83вÑ\83н Ñ\85Ñ\8cиз Ð»Ð¸Ñ\88ан ая',
+'tooltip-save' => 'Ð\9aÑ\83Ñ\8c Ð¼Ð°Ñ\81акIавал хуьн',
 'tooltip-preview' => 'Ччин хуьдалди вилик, сифте килигун кардик кутун тавакъу ийизва',
-'tooltip-diff' => 'СиÑ\84Ñ\82е ÐºÑ\8cилин Ñ\82екÑ\81Ñ\82диз Ñ\82алÑ\83кÑ\8c Ñ\82иÑ\80 ÐºÑ\83Ñ\8cне Ð°Ð²Ñ\83нвай Ð´ÐµÐ³Ð¸Ñ\88вилер къалурун',
+'tooltip-diff' => 'СиÑ\84Ñ\82е ÐºÑ\8cилин Ñ\82екÑ\81Ñ\82диз Ñ\82алÑ\83кÑ\8c Ñ\82иÑ\80 ÐºÑ\83Ñ\8cне Ð°Ð²Ñ\83нвай Ð¼Ð°Ñ\81акIавилер къалурун',
 'tooltip-compareselectedversions' => 'И ччинин кьве хкягъай жуьрейрин арада авай тафаватдиз килигун',
 'tooltip-watch' => 'И ччин куь гуьзетунин сиягьдиз алава авун',
 'tooltip-rollback' => '« КЬулухъди чIугун »  и ччиндиз эхиримжи кар кутазвайди патай  авунвай дуьзар хъувунар са т!ампуналди  paxкурзава',
@@ -1291,7 +1291,7 @@ Cиягьда авай анжах (* лишандихъ галаз эгечIза
 'watchlistedit-raw-submit' => 'Гуьзетунин сиягь цIийи хъувун',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'СиÑ\8fгÑ\8cда Ð°Ð²Ð°Ð¹ Ñ\87Ñ\87инÑ\80а Ð´ÐµÐ³Ð¸Ñ\88вилер',
+'watchlisttools-view' => 'СиÑ\8fгÑ\8cда Ð°Ð²Ð°Ð¹ Ñ\87Ñ\87инÑ\80а Ð¼Ð°Ñ\81акIавилер',
 'watchlisttools-edit' => 'Гьузетунин сиягь килигун ва дуьзар хъувун',
 'watchlisttools-raw' => 'Текст хьиз дуьзар хъувун',
 
index 06f9255..25fb555 100644 (file)
@@ -570,7 +570,7 @@ I rawn atan a danbeh chhinchhiahna kan han tarlang a ni e:',
 'userjsyoucanpreview' => "'''Rawlrûk:''' I JavaScript thar fiah tùrin i dahţhat hmain \"{{int:showpreview}}\" hmehkhep hi hmang rawh.",
 'note' => "'''Hriat tùr:'''",
 'previewnote' => "'''Heihi endikna chauh a ni tih hrereng ang che.'''
-I tihdanglamna dahţhat a la ni lo!",
+I tihdanglamna dahţhat a la ni lo!  [[#editform|→ Ziah chhunzawmna]]",
 'editing' => '$1 i siam(ţha) mék',
 'editingsection' => '$1 (hlawm) i siam(ţha) mék',
 'editingcomment' => '$1 (hlawm thar) i siam(ţha) mék',
index 5a7efba..c92d777 100644 (file)
@@ -705,6 +705,9 @@ $2',
 'ns-specialprotected' => 'പ്രത്യേകം എന്ന നാമമേഖലയിൽ വരുന്ന താളുകൾ തിരുത്താനാവുന്നവയല്ല.',
 'titleprotected' => "[[User:$1|$1]] എന്ന ഉപയോക്താവ് ഈ താൾ ഉണ്ടാക്കുന്നതു നിരോധിച്ചിരിക്കുന്നു.
 ''$2'' എന്നതാണു അതിനു കാണിച്ചിട്ടുള്ള കാരണം.",
+'filereadonlyerror' => 'പ്രമാണ ശേഖരണി "$2" ഇപ്പോൾ "കാണൽ-മാത്രം" വിധത്തിൽ ക്രമീകരിച്ചിരിക്കുന്നതിനാൽ "$1" എന്ന പ്രമാണത്തിൽ മാറ്റം വരുത്താനാകില്ല.
+
+നൽകിയിരിക്കുന്ന കാരണം "\'\'$1\'\'" എന്നാണ്.',
 
 # Virus scanner
 'virus-badscanner' => "തെറ്റായ ക്രമീകരണങ്ങൾ: അപരിചിതമായ വൈറസ് തിരച്ചിൽ ഉപാധി :  ''$1''",
@@ -788,6 +791,7 @@ $2',
 'invalidemailaddress' => 'ഇ-മെയിൽ വിലാസം സാധുവായ രൂപത്തിൽ അല്ലാത്തതിനാൽ സ്വീകാര്യമല്ല.
 ദയവായി സാധുവായ രൂപത്തിലുള്ള ഇമെയിൽ വിലാസം ചേർക്കുകയോ ഇമെയിൽ വിലാസത്തിനുള്ള ഇട ഒഴിവാക്കിയിടുകയോ ചെയ്യുക.',
 'cannotchangeemail' => 'അംഗത്വത്തിന്റെ ഇമെയിൽ വിലാസങ്ങൾ ഈ വിക്കിയിൽ മാറ്റാനാവില്ല.',
+'emaildisabled' => 'ഈ സൈറ്റിൽ നിന്ന് ഇമെയിലുകൾ അയയ്ക്കാനാവില്ല.',
 'accountcreated' => 'അംഗത്വം സൃഷ്ടിച്ചിരിക്കുന്നു',
 'accountcreatedtext' => '$1 എന്ന ഉപയോക്താവിനായി അംഗത്വം സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു.',
 'createaccount-title' => '{{SITENAME}} സംരംഭത്തിൽ അംഗത്വം സൃഷ്ടിക്കൽ',
@@ -974,7 +978,8 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'userinvalidcssjstitle' => "'''മുന്നറിപ്പ്:''' \"\$1\" എന്ന പേരിൽ ഒരു ദൃശ്യരൂപം ഇല്ല. '''.css''' ഉം '''.js''' ഉം താളുകൾ ഇംഗ്ലീഷ് ചെറിയക്ഷര തലക്കെട്ട് ആണ്‌ ഉപയോഗിക്കുന്നതെന്നു ദയവായി ഓർക്കുക. ഉദാ: {{ns:user}}:Foo/Vector.css എന്നതിനു പകരം {{ns:user}}:Foo/vector.css എന്നാണു ഉപയോഗിക്കേണ്ടത്.",
 'updated' => '(പുതുക്കിയിരിക്കുന്നു)',
 'note' => "'''പ്രത്യേക ശ്രദ്ധയ്ക്ക്:'''",
-'previewnote' => "'''ഇതൊരു പ്രിവ്യൂ മാത്രമാണ്, താങ്കൾ നടത്തിയ മാറ്റങ്ങൾ സേവ് ചെയ്തിട്ടില്ല!'''",
+'previewnote' => "'''ഇതൊരു പ്രിവ്യൂ മാത്രമാണെന്ന് ഓർക്കുക.'''
+താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ ഇതുവരെ സേവ് ചെയ്തിട്ടില്ല! [[#editform|→ തിരുത്തൽ തുടരുക]]",
 'previewconflict' => 'ഈ പ്രിവ്യൂവിൽ മുകളിലെ ടെക്സ്റ്റ് ഏരിയയിലുള്ള എഴുത്ത് മാത്രമാണ് കാട്ടുന്നത്, സേവ്‌ ചെയ്യാൻ താങ്കൾ തീരുമാനിച്ചാൽ അത് സേവ് ആകുന്നതാണ്.',
 'session_fail_preview' => "'''ക്ഷമിക്കണം! സെഷൻ ഡാറ്റ നഷ്ടപ്പെട്ടതിനാൽ താങ്കളുടെ തിരുത്തലിന്റെ തുടർപ്രക്രിയ നടത്തുവാൻ സാധിച്ചില്ല.''' 
 ദയവായി വീണ്ടും ശ്രമിക്കൂ.
@@ -989,6 +994,7 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 ഗുണനിലവാരമില്ലാത്ത വെബ് അധിഷ്ഠിത അജ്ഞാത പ്രോക്സി സേവനങ്ങൾ ഉപയോഗിച്ചാൽ ചിലപ്പോൾ ഇത്തരത്തിലുണ്ടാകാറുണ്ട്.",
 'edit_form_incomplete' => "'''തിരുത്തൽ ഫോമിന്റെ ചില ഭാഗങ്ങൾ സെർവറിൽ എത്തിയിട്ടില്ല; താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾക്ക് ക്ഷതമേറ്റിട്ടില്ലെന്ന് ഉറപ്പുവരുത്തി വീണ്ടും ശ്രമിക്കുക.'''",
 'editing' => 'തിരുത്തുന്ന താൾ: $1',
+'creating' => '$1 സൃഷ്ടിക്കുന്നു',
 'editingsection' => 'തിരുത്തുന്ന താൾ:- $1 (ഉപവിഭാഗം)',
 'editingcomment' => 'തിരുത്തുന്ന താൾ:- $1 (പുതിയ ഉപവിഭാഗം)',
 'editconflict' => 'തിരുത്തൽ സമരസപ്പെടായ്ക: $1',
@@ -1364,7 +1370,7 @@ $1",
 'recentchangesdays' => 'പുതിയ മാറ്റങ്ങളിൽ കാണിക്കേണ്ട ദിവസങ്ങളുടെ എണ്ണം:',
 'recentchangesdays-max' => 'പരമാവധി {{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസങ്ങൾ}}',
 'recentchangescount' => 'സ്വതേ പ്രദർശിപ്പിക്കേണ്ട തിരുത്തലുകളുടെ എണ്ണം:',
-'prefs-help-recentchangescount' => 'à´\87à´¤àµ\8d à´ªàµ\81തിയമാറàµ\8dà´±à´\99àµ\8dà´\99ൾ, à´¤à´¾à´³à´¿à´¨àµ\8dà´±àµ\86 à´¨à´¾àµ¾à´µà´´à´¿à´\95ൾ, à´°àµ\87à´\96à´\95ൾ à´\8eà´¨àµ\8dനിവയàµ\86 à´\89ൾà´\95àµ\8dà´\95àµ\8aà´³àµ\8dà´³àµ\81à´¨àµ\8dà´¨àµ\81.',
+'prefs-help-recentchangescount' => 'à´ªàµ\81തിയ à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99ൾ, à´¤à´¾à´³à´¿à´¨àµ\8dà´±àµ\86 à´¨à´¾àµ¾à´µà´´à´¿à´\95ൾ, à´°àµ\87à´\96à´\95ൾ à´\8eà´¨àµ\8dനിവà´\95àµ\8dà´\95àµ\81à´\82 à´\87à´¤àµ\8d à´¬à´¾à´§à´\95മാണàµ\8d.',
 'prefs-help-watchlist-token' => 'ഈ പെട്ടിയിൽ ഒരു രഹസ്യവാക്ക് ഉപയോഗിച്ചാൽ താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയ്ക്കുള്ള ആർ.എസ്.എസ്. ഫീഡ് ഉണ്ടാക്കുന്നതാണ്.
 ഈ രഹസ്യവാക്ക് അറിയാവുന്ന ആർക്കും താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക വായിക്കാവുന്നതാണ്. അതുകൊണ്ട് സുരക്ഷിതമായ ഒന്നു തിരഞ്ഞെടുക്കുക.
 ഇവിടെ താങ്കൾക്കുപയോഗിക്കാവുന്ന ക്രമരഹിതമായി സൃഷ്ടിച്ച ഒരെണ്ണം കൊടുത്തിരിക്കുന്നു: $1',
@@ -1901,6 +1907,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 കൂടുതൽ വിവരങ്ങൾക്ക് ദയവായി [$2 പ്രമാണത്തിന്റെ വിവരണ താൾ] കാണുക.',
 'sharedupload-desc-here' => 'ഈ പ്രമാണം $1 സംരംഭത്തിൽ നിന്നുമുള്ളതാണ്, മറ്റു പദ്ധതികൾ ഇതുപയോഗിക്കുന്നുണ്ടാകാം.
 ഈ [$2 പ്രമാണത്തിന്റെ വിവരണ താളിലുള്ള] വിവരങ്ങൾ താഴെ കൊടുത്തിരിക്കുന്നു.',
+'sharedupload-desc-edit' => 'ഇത് $1 സംരംഭത്തിൽ നിന്നുള്ള പ്രമാണമാണ്, മറ്റ് പദ്ധതികൾ ഇതുപയോഗിക്കുന്നുണ്ടാകാം.
+താങ്കൾക്കാവശ്യം അവിടെയുള്ള [$2 പ്രമാണ വിവരണ താൾ] തിരുത്തുകയായേക്കാം.',
+'sharedupload-desc-create' => 'ഇത് $1 സംരംഭത്തിൽ നിന്നുള്ള പ്രമാണമാണ്, മറ്റ് പദ്ധതികൾ ഇതുപയോഗിക്കുന്നുണ്ടാകാം.
+താങ്കൾക്കാവശ്യം അവിടെയുള്ള [$2 പ്രമാണ വിവരണ താൾ] തിരുത്തുകയായേക്കാം.',
 'filepage-nofile' => 'ഈ പേരിൽ ഒരു പ്രമാണവും നിലവിലില്ല.',
 'filepage-nofile-link' => 'ഈ പേരിൽ ഒരു പ്രമാണവും നിലവിലില്ല, താങ്കൾക്ക് [$1 അത് അപ്‌ലോഡ് ചെയ്യാവുന്നതാണ്‌]',
 'uploadnewversion-linktext' => 'ഈ പ്രമാണത്തിന്റെ പുതിയ പതിപ്പ് അപ്‌ലോഡ് ചെയ്യുക',
@@ -2847,6 +2857,8 @@ $1',
 'import-invalid-interwiki' => 'താങ്കൾ നിർദ്ദേശിച്ച വിക്കിയിൽനിന്നും ഇറക്കുമതിചെയ്യാൻ സാധിച്ചില്ല',
 'import-error-edit' => '"$1" എന്ന താൾ തിരുത്താനുള്ള അനുമതി താങ്കൾക്ക് ഇല്ലാത്തതിനാൽ അത് ഇറക്കുമതി ചെയ്തില്ല.',
 'import-error-create' => '"$1" എന്ന താൾ സൃഷ്ടിക്കാനുള്ള അനുമതി താങ്കൾക്ക് ഇല്ലാത്തതിനാൽ അത് ഇറക്കുമതി ചെയ്തില്ല.',
+'import-error-interwiki' => 'ബാഹ്യ കണ്ണിചേർക്കലിനു (അന്തർവിക്കി) കരുതിവെച്ചിരിക്കുന്ന പേര് ആയതിനാൽ, "$1" എന്ന താൾ ഇറക്കുമതി ചെയ്തില്ല.',
+'import-error-special' => 'താളുകൾ അനുവദിക്കാത്ത പ്രത്യേക നാമമേഖലയിൽ പെടുന്നതായതിനാൽ "$1" എന്ന താൾ ഇറക്കുമതി ചെയ്തില്ല.',
 'import-error-invalid' => 'പേര് അസാധുവായതിനാൽ "$1" എന്ന താൾ ഇറക്കുമതി ചെയ്യില്ല.',
 
 # Import log
index 0797d75..d1408d4 100644 (file)
@@ -669,6 +669,7 @@ e-mel bagi ciri-ciri berikut tidak boleh dikirim.',
 'emailconfirmlink' => 'Sahkan alamat e-mel anda.',
 'invalidemailaddress' => 'Alamat e-mel tersebut tidak boleh diterima kerana ia tidak sah. Sila masukkan alamat e-mel yang betul atau kosongkan sahaja ruangan tersebut.',
 'cannotchangeemail' => 'Alamat e-mel akaun tidak boleh diubah di wiki ini.',
+'emaildisabled' => 'Tapak ini tidak boleh menghantar e-mel.',
 'accountcreated' => 'Akaun dibuka',
 'accountcreatedtext' => 'Akaun pengguna bagi $1 telah dibuka.',
 'createaccount-title' => 'Pembukaan akaun {{SITENAME}}',
@@ -857,7 +858,7 @@ Masukan log sekatan terakhir disediakan di bawah sebagai rujukan:',
 'updated' => '(Dikemas kini)',
 'note' => "'''Catatan:'''",
 'previewnote' => "'''Ingatlah bahawa ini hanya pralihat.'''
-Perubahan anda belum disimpan!",
+Perubahan anda belum disimpan! [[#editform|→ Terus menyunting]]",
 'previewconflict' => 'Paparan ini merupakan teks di bahagian atas dalam kotak sunting teks. Teks ini akan disimpan sekiranya anda memilih berbuat demikian.',
 'session_fail_preview' => "'''Kami tidak dapat memproses suntingan anda kerana kehilangan data sesi. Sila cuba lagi. Jika masalah ini berlanjutan, [[Special:UserLogout|log keluar]] dahulu, kemudian log masuk sekali lagi.'''",
 'session_fail_preview_html' => "'''Kami tidak dapat memproses suntingan anda kerana kehilangan data sesi.'''
@@ -870,6 +871,7 @@ dalam token suntingan. Suntingan tersebut telah ditolak untuk menghalang kerosak
 Hal ini kadangkala berlaku apabila anda menggunakan khidmat proksi tanpa nama berdasarkan web yang bermasalah.'''",
 'edit_form_incomplete' => "'''Beberapa bahagian dari bentuk edit tidak mencapai pelayan, periksa bahawa suntingan anda utuh dan cuba lagi'.'''",
 'editing' => 'Menyunting $1',
+'creating' => 'Membuat $1',
 'editingsection' => 'Menyunting $1 (bahagian)',
 'editingcomment' => 'Menyunting $1 (bahagian baru)',
 'editconflict' => 'Percanggahan penyuntingan: $1',
@@ -1814,6 +1816,10 @@ Anda boleh melihat [[Special:WhatLinksHere/$2|senarai penuh]].',
 Sila lihat [$2 laman penerangan fail] untuk maklumat lanjut.',
 'sharedupload-desc-here' => 'Fail ini dari $1 dan mungkin digunakan oleh projek lain.
 Penerangan pada [$2 laman penerangan failnya] di sana ditunjukkan di bawah.',
+'sharedupload-desc-edit' => 'Fail ini dari $1 dan mungkin digunakan oleh projek-projek yang lain.
+Mungkin anda ingin menyunting keterangan pada [$2 laman penerangan failnya] di situ.',
+'sharedupload-desc-create' => 'Fail ini dari $1 dan mungkin digunakan oleh projek-projek yang lain.
+Mungkin anda ingin menyunting keterangan pada [$2 laman penerangan failnya] di situ.',
 'filepage-nofile' => 'Fail dengan nama ini tidak wujud.',
 'filepage-nofile-link' => 'Fail dengan nama ini tidak wujud, tetapi boleh [$1 dimuat naik].',
 'uploadnewversion-linktext' => 'Muat naik versi baru bagi fail ini',
@@ -2023,6 +2029,7 @@ serta mungkin mempunyai maklumat lanjut mengenai buku yang anda cari:',
 'allpagesprefix' => 'Tunjukkan laman dengan awalan:',
 'allpagesbadtitle' => 'Tajuk laman yang dinyatakan tidak sah atau mempunyai awalam antara bahasa atau antara wiki. Ia mungkin mengandungi aksara yang tidak boleh digunakan dalam tajuk laman.',
 'allpages-bad-ns' => '{{SITENAME}} tidak mempunyai ruang nama "$1".',
+'allpages-hide-redirects' => 'Sorokkan lencongan',
 
 # Special:Categories
 'categories' => 'Kategori',
index 11a5338..23f1e5f 100644 (file)
@@ -154,7 +154,7 @@ $messages = array(
 'jan' => 'जनवरी',
 'feb' => 'फेब्रुअरी',
 'mar' => 'मार्च',
-'apr' => 'à¤\8fपà¥\8dरà¥\80ल',
+'apr' => 'à¤\85पà¥\8dरिल',
 'may' => 'मे',
 'jun' => 'जुन',
 'jul' => 'जुलाई',
@@ -420,7 +420,7 @@ $1',
 'badtitle' => 'गलत शीर्षक',
 'badtitletext' => 'अनुरोध गरेको पृष्ठ शीर्षक अमान्य, खाली वा गलत रुपमा अन्तर भाषा वा अन्तर विकी सम्बन्ध गरिएको थियो।  यसमा शीर्षकमा प्रयोग गर्न नमिल्ने एक वा बढी अक्षरहरू रहेका हुनसक्छन् ।',
 'perfcached' => 'तलको डाटाहरु क्याचमा रहेका कुराहरु हुन्। अपटुडेट नहुनपनि सक्छन्।अधिकतम {{PLURAL:$1|नतिजा|$1 नतिजाहरू}} क्यासमा उपलब्ध छ।',
-'perfcachedts' => 'तलà¤\95à¥\8b à¤¡à¤¾à¤\9fाहरà¥\81 à¤\95à¥\8dयाà¤\9aमा à¤°à¤¹à¥\87à¤\95ा à¤\95à¥\81राहरà¥\81 à¤¹à¥\81नà¥\8d à¤° à¤¯à¥\8b à¤ªà¤\9bिलà¥\8dलà¥\8b à¤ªà¤²à¥\8dà¤\9f $1 à¤®à¤¾ à¤\85पडà¥\87à¤\9f à¤\97रà¥\80à¤\8fà¤\95à¥\8b à¤¥à¤¿à¤¯à¥\8b à¥¤ A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcachedts' => 'निमà¥\8dन à¤\86à¤\81à¤\95डा à¤\95à¥\8dयाà¤\9a à¤¹à¥\8b à¤° $1 à¤ªà¤¹à¤¿à¤²à¤¾ à¤\85दà¥\8dयतन à¤\97रिà¤\8fà¤\95à¥\8b à¤¥à¤¿à¤¯à¥\8b।  à¤¯à¤¸ à¤\95à¥\8dयाà¤\9aमा à¤\89पलबà¥\8dध {{PLURAL:$4|à¤\8fà¤\89à¤\9fा à¤\95ारण à¤¹à¥\8b|$4 à¤\95ारणहरà¥\81 à¤¹à¥\81नà¥\8d}}।',
 'querypage-no-updates' => 'यो पृष्ठको अद्यतन कार्य निस्क्रिय गरिएको छ।
 यहाँको डेटा हालमा ताजा पारिने  छैन।',
 'wrong_wfQuery_params' => ' wfQuery()को लागि गलत प्यारामेटर<br />
@@ -447,6 +447,9 @@ $2',
 'ns-specialprotected' => 'विशेष पृष्ठ सम्पादन गर्न सकिदैन ।',
 'titleprotected' => ' [[User:$1|$1]]द्वारा यो शीर्षक निर्माणहुनबाट जोगाइएको छ।
 कारण   "\'\'$2\'\'" हो ।',
+'filereadonlyerror' => 'फाइल "$1" लाई परिवर्तन गर्न सकिंदैन किन भनें फाइल भण्डार  "$2" केवल पढ्ने स्थिति (read-only mode)मा छ।
+
+कारण यो दिएकोछ: "\'\'$3\'\'"।',
 
 # Virus scanner
 'virus-badscanner' => "खराव मिलान: अज्ञात भाइरस स्क्यानर :''$1''",
@@ -536,6 +539,7 @@ $2',
 'emailconfirmlink' => 'तपाईंको ई-मेल ठेगाना पक्का गर्नुहोस्',
 'invalidemailaddress' => 'ई-मेल ठेगाना स्वीकार गर्न सकिएन किन भनें यो सही प्रारूपमा छैन, कृपया सही प्रारूपको  ठेगाना दिनुहोस्।',
 'cannotchangeemail' => 'यस विकिमा तपाईको खातासँग सम्बन्धित इमेल ठेगाना परिवर्तन गर्न सकिन्न ।',
+'emaildisabled' => 'यो साइटले इमेलहरु पठाउन सक्तैन।',
 'accountcreated' => 'खाता खोलियो',
 'accountcreatedtext' => '$1 कोलागि प्रयोगकर्ता खाता खोलियो।',
 'createaccount-title' => '{{SITENAME}}कोलागि खाता खोल्ने काम',
@@ -579,6 +583,7 @@ $2',
 'passwordreset-username' => 'प्रयोगकर्ता-नाम:',
 'passwordreset-domain' => 'डोमेन',
 'passwordreset-capture' => 'निस्कने इमेलको नमुना हेर्ने ?',
+'passwordreset-capture-help' => 'यदि तपाईंले यो कोठामा दाग दिनुभयो भनें यो इमेल (अस्थायी पासवर्ड सहित) तपाईंलाई देखा पर्नेछ साथै प्रयोगकर्तालाई पनि पठाइनेछ।',
 'passwordreset-email' => 'इमेल ठेगाना:',
 'passwordreset-emailtitle' => '{{SITENAME}}मा खाता विवरण',
 'passwordreset-emailtext-ip' => 'कसैले (सायद तपाईंले, $1 आई पी ठेगानाबाट) {{SITENAME}} ($4)मा तपाईंको खाता विवरणको निम्ति एउटा अनुस्मारकको अनुरोध गरेको छ। निम्न प्रयोगकर्ता {{PLURAL:$3|खाता यस इमेल ठेगानासित सम्बन्धित छ|खाताहरु यस इमेल ठेगानासित सम्बन्धित छन्}}:
@@ -596,6 +601,7 @@ $2
 'passwordreset-emailelement' => 'प्रयोगकर्ताको नाम: $1
 अस्थाई पासवर्ड: $2',
 'passwordreset-emailsent' => 'एउटा अनुस्मारक इमेल पठाइयो।',
+'passwordreset-emailsent-capture' => 'अनुस्मारक इमेल पठाइयो, जो तल देखाइएकोछ।',
 
 # Special:ChangeEmail
 'changeemail' => 'इमेल ठेगाना परिवर्तन गर्नुहोस',
@@ -745,6 +751,7 @@ $2
 यस्तो त्यसबेला हुन्छ जब तपाईंले बगी वेवमा आधारित अज्ञात प्रोक्सी सेवा प्रयोग गर्नुहुन्छ।",
 'edit_form_incomplete' => "'''सम्पादनको केहि भाग सर्वरसम्म पुग्न सकेन, दुइपल्ट जाँच गर्नुहोस्, तपाईंको सम्पादन यथावत रहे पुनः प्रयास गर्नुहोस्'''",
 'editing' => '$1 सम्पादन गरिँदै',
+'creating' => '$1 बनाइँदै',
 'editingsection' => '$1 (खण्ड) सम्पादन गरिँदै',
 'editingcomment' => '$1 सम्पादन गर्दै(नयाँ खण्ड)',
 'editconflict' => 'सम्पादन बाँझियो: $1',
@@ -878,8 +885,8 @@ $2
 'rev-suppressed-text-unhide' => "यस पृष्ठको पुनरावलोकन '''दबाइएकोछ'''।
 यसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को दबाइएको लगमा पाउन सकिन्छ]।
 यदि चाहनु भयो भनें प्रबन्धकको हैसियतमा [यो पुनरावलोकन $1] हेर्न सक्नुहुन्छ।",
-'rev-deleted-text-view' => "यस à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95न '''मेटिएकोछ'''।
-पà¥\8dरबनà¥\8dधà¤\95à¤\95à¥\8b à¤¹à¥\88सियतमा à¤¹à¥\87रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b; [{{fullurl:{{#Special:Log}}/delete|पà¥\83षà¥\8dठ={{FULLPAGENAMEE}}}}à¤\95à¥\8b à¤®à¥\87à¤\9fिà¤\8fà¤\95à¥\8b à¤²à¤\97मा à¤µà¤¿à¤µà¤°à¤£ à¤ªà¤¾à¤\89न à¤¸à¤\95िनà¥\8dà¤\9b]",
+'rev-deleted-text-view' => "यस à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤¸à¤\82शà¥\8bधन '''मेटिएकोछ'''।
+तपाà¤\88à¤\82लà¥\87 à¤¹à¥\87रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¤®à¥\87à¤\9fिà¤\8fà¤\95à¥\8b à¤²à¤\97मा à¤µà¤¿à¤µà¤°à¤£ à¤ªà¤¾à¤\89न à¤¸à¤\95िनà¥\8dà¤\9b]।",
 'rev-suppressed-text-view' => "यस पृष्ठको पुनरावलोकन '''दबिएकोछ'''।
 प्रबन्धकको हैसियतमा हेर्न सक्नुहुन्छ; [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को दबिएको लगमा विवरण पाउन सकिन्छ]",
 'rev-deleted-no-diff' => "तपाईंले यसको भिन्नता पाउन सक्नुहुन्न किन भनें यस पृष्ठको पुनरावलोकन '''मेटाइएकोछ'''।
@@ -892,9 +899,9 @@ $2
 यसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/suppress|पृष्ठ={{FULLPAGENAMEE}}}}को दबिएको लगमा पाउन सकिन्छ]।
 यदि चाहनु भयो भनें प्रबन्धकको हैसियतमा [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
 'rev-deleted-diff-view' => "यस भिन्नताका संशोधनहरुमध्येको एउटा चाहिं  '''मेटियो।''' 
-पà¥\8dरबनà¥\8dधà¤\95à¤\95à¥\8b à¤¹à¥\88सियतमा यस भिन्नतालाई हेर्न सक्नुहुन्छ; सबै विवरण  [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}} मेटाइएको (deletion) लग]मा पाउन सकिनेछ।",
+तपाà¤\88à¤\82लà¥\87 यस भिन्नतालाई हेर्न सक्नुहुन्छ; सबै विवरण  [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}} मेटाइएको (deletion) लग]मा पाउन सकिनेछ।",
 'rev-suppressed-diff-view' => "यस भिन्नताका संशोधनहरुमध्येको एउटा चाहिं  '''दबाइयो।''' 
-पà¥\8dरबनà¥\8dधà¤\95à¤\95à¥\8b à¤¹à¥\88सियतमा यस भिन्नतालाई हेर्न सक्नुहुन्छ; सबै विवरण  [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}} दबाइएको (suppression) लग]मा पाउन सकिनेछ।",
+तपाà¤\88à¤\82लà¥\87 यस भिन्नतालाई हेर्न सक्नुहुन्छ; सबै विवरण  [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}} दबाइएको (suppression) लग]मा पाउन सकिनेछ।",
 'rev-delundel' => 'देखाउने/लुकाउने',
 'rev-showdeleted' => 'देखाउनुहोस्',
 'revisiondelete' => 'मेटाउने/मेटाएको रद्दगर्ने  पुनरावलोकनहरु',
@@ -1199,7 +1206,7 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'userrights-lookup-user' => 'प्रयोगकर्ता समूह व्यवस्थापन गर्नुहोस',
 'userrights-user-editname' => 'प्रयोगकर्ता नाम दिनुहोस् :',
 'editusergroup' => 'प्रयोगकर्ता समूह सम्पादन गर्नुहोस्',
-'editinguser' => "'''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) प्रयोगकर्ताको प्रयोगकर्ता अधिकारहरु परिवर्तन गर्न",
+'editinguser' => "'''[[User:$1|$1]]''' $2 प्रयोगकर्ताको अधिकार परिवर्तन गरिंदै",
 'userrights-editusergroup' => 'प्रयोगकर्ता समूह सम्पादन गर्नुहोस्',
 'saveusergroups' => 'प्रयोगकर्ता समूहरू संग्रह गर्नुहोस्',
 'userrights-groupsmember' => 'को सदस्य:',
@@ -1227,8 +1234,8 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'group-suppress' => 'अतिदृष्टिहरु',
 'group-all' => '(सबै)',
 
-'group-user-member' => 'प्रयोगकर्ता',
-'group-autoconfirmed-member' => 'स्वनिर्धारित प्रयोगकर्ता',
+'group-user-member' => '{{GENDER:$1|प्रयोगकर्ता}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|स्वनिर्धारित प्रयोगकर्ता}}',
 'group-bot-member' => '{{GENDER:$1|बोट}}',
 'group-sysop-member' => '{{GENDER:$1|प्रवन्धक}}',
 'group-bureaucrat-member' => '{{GENDER:$1|प्रशासक}}',
@@ -1376,9 +1383,11 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'rc_categories' => 'श्रेणीहरुमा सीमित ("|" ले छुट्याउनुहोस्)',
 'rc_categories_any' => 'कुनै',
 'rc-change-size' => '$1',
+'rc-change-size-new' => 'परिवर्तनपछि $1 {{PLURAL:$1|बाइट|बाइट}}',
 'newsectionsummary' => '/* $1 */ नयाँ खण्ड',
 'rc-enhanced-expand' => 'जानकारी देखाउने( जाभा स्क्रिप्ट चाहिने)',
 'rc-enhanced-hide' => 'जानकारी लुकाउने',
+'rc-old-title' => 'मौलिक तौरमा "$1" रुपमा बनाइएको',
 
 # Recent changes linked
 'recentchangeslinked' => 'संबन्धित परिवर्तनहरु',
@@ -1429,6 +1438,7 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'minlength1' => 'फाइलको नाम कम्तिमा एक अक्षरको हुनैपर्छ।',
 'illegalfilename' => 'फाइल नाम "$1"मा त्यस्ता बर्णहरु छन् जसलाई पृष्ठको शीर्षकको रुपमा प्रयोग गर्ने अनुमति छैन।
 कृपया फाइललाई नयाँ नाम दिएर पुनः उर्ध्वभरणकोलागि प्रयास गर्नुहोस्।',
+'filename-toolong' => 'फाइलको नाम २४० बाइट भन्दा बडी हुनु हुँदैन।',
 'badfilename' => 'फाइलको नाम "$1"मा सारियो।',
 'filetype-mime-mismatch' => '".$1" फाइल विस्तार  पाइएको फाइल ($2)को MIME प्रकारसित मेल खाँदैन।',
 'filetype-badmime' => 'MIME "$1" प्रकारको फाइल उर्ध्वभरण गर्ने अनुमति छैन।',
@@ -1454,6 +1464,8 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 यो फाइलनाम गलत राखिएको कारणले भएको हुनसक्छ
 यो फाइल साच्चै उर्ध्वभरण गर्नेकुरामा निश्चित हुनुहोस् ।',
 'windows-nonascii-filename' => 'विशेष वर्ण सहितका फाइलनामहरु यस विकिद्वारा समर्थित छैनन् ।',
+'fileexists' => "यो नामको फाइल पहिले नैं छ, यदि तपाईं परिवर्तन गर्ने कुरामा सुनिश्चित हुनुहुन्न भनें कृपया '''<tt>[[:$1]]</tt>''' जाँच गर्नुहोस्।
+[[$1|thumb]]",
 'fileexists-extension' => "यहि नामको एउटा फाइल पहिलेदेखि नैं छ: [[$2|thumb]]
 * उर्ध्वभरण हुँदै गरेको पाइलको नाम: '''<tt>[[:$1]]</tt>'''
 * पहिलेदेखि नैं भएको पाइअलको नाम: '''<tt>[[:$2]]</tt>'''
@@ -1741,8 +1753,8 @@ $1',
 'booksources-go' => 'जाउ',
 
 # Special:Log
-'specialloguserlabel' => 'पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता:',
-'speciallogtitlelabel' => 'शà¥\80रà¥\8dषà¤\95:',
+'specialloguserlabel' => 'निषà¥\8dपादà¤\95:',
+'speciallogtitlelabel' => 'लà¤\95à¥\8dषà¥\8dय (शà¥\80रà¥\8dषà¤\95 à¤µà¤¾ à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता)',
 'log' => 'लगहरु',
 'all-logs-page' => 'सबै सार्वजनिक लगहरु',
 'logempty' => 'लगमा मिल्ने वस्तु भेटिएन ।',
@@ -1765,6 +1777,7 @@ $1',
 'allpagesbadtitle' => 'दिएको पृष्ठ शीर्षक अमान्य, खाली वा गलत रुपमा अन्तर भाषा वा अन्तर विकी सम्बन्ध गरिएको थियो।  
 यसमा शीर्षकमा प्रयोग गर्न नमिल्ने एक वा बढी अक्षरहरू रहेका हुनसक्छन् ।',
 'allpages-bad-ns' => '{{SITENAME}} को नामस्थान छैन "$1" ।',
+'allpages-hide-redirects' => 'अनुप्रेषण लुकाउने',
 
 # Special:Categories
 'categories' => 'श्रेणीहरू',
@@ -1778,7 +1791,7 @@ $1',
 'sp-deletedcontributions-contribs' => 'योगदानहरु',
 
 # Special:LinkSearch
-'linksearch' => 'बाह्य लिंक',
+'linksearch' => 'बाह्य लिंक खोज',
 'linksearch-pat' => 'खोज्ने नमूना:',
 'linksearch-ns' => 'नेमस्पेस:',
 'linksearch-ok' => 'खोज्नुहोस्',
@@ -2225,6 +2238,7 @@ $3द्वारा $1को ($4को  समय $5 मा) मेटाइए
 'unblocklink' => 'रोक फुकुवा गर्ने',
 'change-blocklink' => 'रोकमा परिवर्तन गर्ने',
 'contribslink' => 'योगदानहरु',
+'emaillink' => 'इमेल पठाउने',
 'autoblocker' => 'तपाईंको आई पी ठेगाना  "[[User:$1|$1]]" द्वारा  भर्खरै प्रयोग गरिएकोले स्वत: बन्देज गरिएको।
 $1को बन्देजको कारण : "$2" हो',
 'blocklogpage' => 'निषेध लग',
@@ -2348,7 +2362,7 @@ $1को बन्देजको कारण : "$2" हो',
 लक्ष्य गरिएको पृष्ठ  "[[:$1]]" पहिलादेखि छ
 के तपाईं यो त्यहाँ सार्न त्यसलाई मेट्न चाहनुहुन्छ?',
 'delete_and_move_confirm' => 'हो, पृष्ठ मेट्नुहोस्',
-'delete_and_move_reason' => 'सार्नलाई बाटो खुलाउन मेटियो',
+'delete_and_move_reason' => ' "[[$1]]"बाट सार्नलाई बाटो खुलाउन मेटियो',
 'selfmove' => 'स्रोत तथा लक्ष्य गरिएको फाइलको शीर्षक एउटै छ;
 यसैमाथि पृष्ठ सार्न सकिंदैन।',
 'immobile-source-namespace' => 'यो $1 नामस्थानमा पृष्टहरु सार्न सकिंदैन',
@@ -2360,9 +2374,11 @@ $1को बन्देजको कारण : "$2" हो',
 'nonfile-cannot-move-to-file' => 'अ-फइललाई   फाइल नेमस्पेसमा सार्न सकिन्न',
 'imagetypemismatch' => 'नयाँ फाइल एक्सटेन्सन फाइलको प्रकारसँग मेल खादैन',
 'imageinvalidfilename' => 'गन्तव्य फाइल नाम अमान्य छ',
+'move-leave-redirect' => 'अनुप्रेषण (redirect) छोडिराख्ने',
 
 # Export
 'export' => 'पृष्ठहरु पठाइने',
+'exportall' => 'सबै पृष्ठहरु निर्यात गर्ने',
 'exportcuronly' => 'हालको संस्करण मात्र थप्ने ,पूरा इतिहास हैन',
 'export-submit' => 'निर्यात',
 'export-addcattext' => 'श्रेणीबाट पृष्ठ थप्ने :',
@@ -3424,10 +3440,20 @@ $5
 'sqlite-no-fts' => '$1 पूरा पाठ खोज समर्थन बिना',
 
 # New logging system
+'logentry-delete-restore' => '$3 पृष्ठ $1ले पुनर्स्थापित गरेको हो',
+'revdelete-uname-hid' => 'प्रयोगकर्ताको नाम लुकाइयो',
 'revdelete-restricted' => 'प्रबन्धकहरुमाथि सीमितता लागू गरियो',
 'revdelete-unrestricted' => 'प्रवन्धककोलागि निषेधहरु हटाइयो ।',
+'logentry-move-move' => '$1 द्वारा $3 पृष्ठलाई $4 मा सारियो',
 'newuserlog-byemail' => 'इ मेलबाट पठाइएको प्रवेशशव्द',
 
+# Feedback
+'feedback-subject' => 'विषय:',
+'feedback-message' => 'सन्देश:',
+'feedback-cancel' => 'रद्द गर्ने',
+'feedback-error2' => 'त्रुटि: सम्पादन असफल',
+'feedback-close' => 'गरियो',
+
 # API errors
 'api-error-badaccess-groups' => 'यस विकिमा तपाईंलाई फाइल अपलोड गर्ने अनुमति छैन।',
 'api-error-copyuploaddisabled' => 'यस सर्वरमा URL द्वारा अपलोड गर्ने व्यवस्था निस्क्रिय गरिएकोछ।',
@@ -3457,6 +3483,7 @@ $5
 'api-error-timeout' => 'अपेक्षित समय भित्रमा सर्वरले प्रतिक्रिया देखाएन।',
 'api-error-unknown-code' => 'अज्ञात त्रुटि: "$1"',
 'api-error-unknown-warning' => 'अज्ञात चेतावनी: $1',
+'api-error-unknownerror' => 'अज्ञात त्रुटि: "$1".',
 'api-error-uploaddisabled' => 'यस विकिमा अपलोड निस्क्रिय गरिएकोछ।',
 
 );
index 45960bb..eff56e3 100644 (file)
@@ -841,6 +841,7 @@ U ontvangt geen e-mail voor de onderstaande functies.',
 'invalidemailaddress' => 'Het e-mailadres is niet aanvaard, omdat het een ongeldige opmaak heeft.
 Geef een geldig e-mailadres op of laat het veld leeg.',
 'cannotchangeemail' => 'Het e-mailadres voor een gebruiker kan op deze wiki niet gewijzigd worden.',
+'emaildisabled' => 'Deze site kan geen e-mails verzenden.',
 'accountcreated' => 'Gebruiker aangemaakt',
 'accountcreatedtext' => 'De gebruiker $1 is aangemaakt.',
 'createaccount-title' => 'Gebruikers registreren voor {{SITENAME}}',
@@ -1046,7 +1047,8 @@ De laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergege
 Uw eigen .css- en .js-pagina's beginnen met een kleine letter, bijvoorbeeld {{ns:user}}:Naam/vector.css in plaats van {{ns:user}}:Naam/Vector.css.",
 'updated' => '(Bijgewerkt)',
 'note' => "'''Opmerking:'''",
-'previewnote' => "'''Let op: dit is een controlepagina; uw tekst is niet opgeslagen!'''",
+'previewnote' => "'''Let op: dit is een controlepagina.'''
+Uw tekst is niet opgeslagen! [[#editform|→ Doorgaan met bewerken]]",
 'previewconflict' => 'Deze voorvertoning geeft aan hoe de tekst in het bovenste veld eruit ziet als u deze opslaat.',
 'session_fail_preview' => "'''Uw bewerking is niet verwerkt, omdat de sessiegegevens verloren zijn gegaan.
 Probeer het opnieuw.
@@ -1062,6 +1064,7 @@ De bewerking is geweigerd om verminking van de paginatekst te voorkomen.
 Dit gebeurt soms als er een webgebaseerde proxydienst wordt gebruikt die fouten bevat.",
 'edit_form_incomplete' => "'''Sommige onderdelen van het bewerkingsformulier hebben de server niet bereikt. Controleer of uw bewerkingen intact zijn en probeer het opnieuw.'''",
 'editing' => 'Bezig met bewerken van $1',
+'creating' => 'Bezig met het aanmaken van $1',
 'editingsection' => 'Bezig met bewerken van $1 (deelpagina)',
 'editingcomment' => 'Bezig met bewerken van $1 (nieuw kopje)',
 'editconflict' => 'Bewerkingsconflict: $1',
@@ -2036,6 +2039,10 @@ Er is ook een [[Special:WhatLinksHere/$2|volledige lijst]].',
 Zie de [$2 pagina met de bestandsbeschrijving] voor meer informatie.',
 'sharedupload-desc-here' => 'Dit bestand komt van $1 en kan ook in andere projecten gebruikt worden.
 De [$2 pagina met de bestandsbeschrijving] wordt hieronder weergegeven.',
+'sharedupload-desc-edit' => 'Dit bestand komt van $1 en kan ook in andere projecten gebruikt worden.
+U kunt de [$2 pagina met de bestandsbeschrijving] daar bewerken.',
+'sharedupload-desc-create' => 'Dit bestand komt van $1 en kan ook in andere projecten gebruikt worden.
+U kunt de beschrijving bewerken op de [$2 pagina met de bestandsbeschrijving].',
 'filepage-nofile' => 'Er bestaat geen bestand met deze naam.',
 'filepage-nofile-link' => 'Er bestaat geen bestand met deze naam, maar u kunt het [$1 uploaden].',
 'uploadnewversion-linktext' => 'Een nieuwe versie van dit bestand uploaden',
@@ -2254,6 +2261,7 @@ U kunt ook kiezen voor specifieke logboeken en filteren op gebruiker (hoofdlette
 'allpagesbadtitle' => 'De opgegeven paginanaam is ongeldig of had een intertaal- of interwikivoorvoegsel.
 Mogelijk bevatte de naam karakters die niet gebruikt mogen worden in paginanamen.',
 'allpages-bad-ns' => '{{SITENAME}} heeft geen naamruimte "$1".',
+'allpages-hide-redirects' => 'Doorverwijzingen verbergen',
 
 # Special:Categories
 'categories' => 'Categorieën',
index e5d95ce..b072188 100644 (file)
@@ -1248,7 +1248,7 @@ $1",
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) ଟି ଦେଖିବେ',
 'searchmenu-legend' => 'ଖୋଜିବା ବିକଳ୍ପ',
 'searchmenu-exists' => "'''ଏହି ଉଇକିରେ \"[[:\$1]]\" ନାଆଁରେ ପୃଷ୍ଠାଟିଏ ଅଛି ।'''",
-'searchmenu-new' => "'''\"[[:\$1]]\"ଟି ଏହି ଉଇକିରେ ତିଆରି କରନ୍ତୁ!'''",
+'searchmenu-new' => "<big><big><big>'''ଏହି ପ୍ରସଙ୍ଗଟି ଆଗରୁ ନାହିଁ, ତେଣୁ <big>''[[:$1]]''</big> ନାମରେ ପ୍ରସଙ୍ଗଟିଏ ଏଠାରେ ଗଢ଼ନ୍ତୁ!'''</big></big></big>",
 'searchhelp-url' => 'Help:ସୂଚୀ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ଏହି ନାମ ଆଗରୁ ଥିବା ପୃଷ୍ଠାସବୁ ଖୋଜିବେ]]',
 'searchprofile-articles' => 'ସୂଚୀ ପୃଷ୍ଠା',
index 66d2391..e103bf2 100644 (file)
@@ -2523,5 +2523,7 @@ $5
 'api-error-filetype-banned' => 'په دې ډول دوتنې بنديز دی.',
 'api-error-illegal-filename' => 'د دوتنې نوم نه دی پرېښل شوی.',
 'api-error-unknown-code' => 'ناڅرګنده تېروتنه: "$1"',
+'api-error-unknown-warning' => 'ناڅرګنده ګواښنه: "$1".',
+'api-error-unknownerror' => 'ناڅرګنده تېروتنه: "$1".',
 
 );
index f8577b0..5ac8d42 100644 (file)
@@ -972,7 +972,8 @@ See also {{msg-mw|Noarticletext-nopermission}}.',
 'updated' => '{{Identical|Updated}}',
 'previewnote' => 'Note displayed when clicking on Show preview',
 'editing' => "Shown as page title when editing a page. \$1 is the name of the page that is being edited. Example: \"''Editing Main Page''\".",
-'creating' => "Shown as page title when creating a page. \$1 is the name of the page that is being created. Example: \"''Creating Main Page''\".",
+'creating' => "Shown as page title when creating a page. Parameters:
+* \$1 is the name of the page that is being created. Example: \"''Creating Main Page''\".",
 'editingsection' => 'The variable $1 is the page name.  This message displays at the top of the page when a user is editing a page section.',
 'explainconflict' => 'Appears at the top of a page when there is an edit conflict.',
 'storedversion' => 'This is used in an edit conflict as the label for the top revision that has been stored, as opposed to your version that has not been stored which is shown at the bottom of the page.',
@@ -2072,8 +2073,10 @@ Example: [[:Image:Addon-icn.png]]',
 {{doc-important|Do not customise this message. Just translate it.|Customisation should be done by local wikis.}}',
 'sharedupload-desc-there' => ':See also: {{msg-mw|Sharedupload}}',
 'sharedupload-desc-here' => ':See also: {{msg-mw|Sharedupload}}',
-'sharedupload-desc-edit' => ':See also: {{msg-mw|Sharedupload}}',
-'sharedupload-desc-create' => ':See also: {{msg-mw|Sharedupload}}',
+'sharedupload-desc-edit' => ':See also: {{msg-mw|Sharedupload-desc-here}}
+:See also: {{msg-mw|Sharedupload-desc-create}}',
+'sharedupload-desc-create' => ':See also: {{msg-mw|Sharedupload-desc-here}}
+:See also: {{msg-mw|Sharedupload-desc-edit}}',
 'filepage-nofile' => "This message appears when visiting a File page for which there's no file, if the user cannot upload files, or file uploads are disabled. (Otherwise, see {{msg-mw|Filepage-nofile-link}})
 
 Filepage-nofile and Filepage-nofile-link message deprecate {{msg-mw|Noimage}}",
index e092b6a..b7786ff 100644 (file)
@@ -778,6 +778,7 @@ Prin urmare, vizitatorii care folosesc același IP nu mai pot crea alte conturi
 'emailconfirmlink' => 'Confirmați adresa dvs. de email',
 'invalidemailaddress' => 'Adresa de email nu a putut fi acceptată pentru că pare a avea un format invalid. Vă rugăm să reintroduceți o adresă bine formatată sau să goliți acel câmp.',
 'cannotchangeemail' => 'Adresele de e-mail asociate conturilor nu pot fi schimbate pe acest wiki.',
+'emaildisabled' => 'Acest site nu poate trimite e-mailuri.',
 'accountcreated' => 'Contul a fost creat.',
 'accountcreatedtext' => 'Contul utilizatorului pentru $1 a fost creat.',
 'createaccount-title' => 'Creare de cont la {{SITENAME}}',
@@ -976,7 +977,8 @@ Ultima intrare în jurnalul blocărilor este afișată mai jos pentru referinț
 Paginile .css și .js specifice utilizatorilor au titluri care încep cu literă mică; de exemplu {{ns:user}}:Foo/vector.css în comparație cu {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Actualizat)',
 'note' => "'''Notă:'''",
-'previewnote' => "Aceasta este doar o previzualizare! Pentru a salva pagina în forma actuală, descrieți succint modificările efectuate și apăsați butonul '''Salvează pagina'''.",
+'previewnote' => "'''Țineți cont că aceasta este doar o previzualizare.'''
+Modificările dumneavoastră nu au fost încă salvate! [[#editform|→ Continuă editarea]]",
 'previewconflict' => 'Această pre-vizualizare reflectă textul din caseta de sus, respectiv felul în care va arăta articolul dacă alegeți să-l salvați acum.',
 'session_fail_preview' => "'''Ne pare rău! Nu am putut procesa modificarea dumneavoastră din cauza pierderii datelor sesiunii.
 Vă rugăm să încercați din nou.
@@ -991,6 +993,7 @@ Modificarea a fost respinsă pentru a preveni deformarea textului paginii.
 Acest fapt se poate întâmpla atunci când folosești un serviciu proxy anonim.'''",
 'edit_form_incomplete' => "'''Unele părți ale formularului de modificare nu au ajuns la server; verificați dacă modificările dumneavoastră sunt intacte și reîncercați.'''",
 'editing' => 'modificare $1',
+'creating' => 'Se creează $1',
 'editingsection' => 'modificare $1 (secțiune)',
 'editingcomment' => 'Modificare $1 (secțiune nouă)',
 'editconflict' => 'Conflict de modificare: $1',
index fd8522d..b6b313d 100644 (file)
@@ -873,7 +873,8 @@ Najnovejši vnos v dnevniku blokad je prikazan spodaj:',
 Vedite, da .css in .js strani po meri uporabljajo naslov z malo začetnico, npr. {{ns:user}}:Blabla/vector.css namesto {{ns:user}}:Blabla/Vector.css.",
 'updated' => '(Posodobljeno)',
 'note' => "'''Opomba:'''",
-'previewnote' => "'''Stran le predogledujete in še ni shranjena!'''",
+'previewnote' => "'''Pomnite, da je to le predogled strani.'''
+Vaših sprememb še nismo shranili! [[#editform|→ Nadaljujte z urejanjem]]",
 'previewconflict' => 'V prikazanem predogledu je v zgornjem predelu urejanja navedeno besedilo, kakor se bo prikazalo, če ga boste shranili.',
 'session_fail_preview' => "'''Oprostite! Zaradi izgube podatkov o seji nam vašega urejanja žal ni uspelo obdelati.'''
 Prosimo, poskusite znova.
index 93307f8..ff9f7cd 100644 (file)
@@ -895,6 +895,7 @@ $2',
 'invalidemailaddress' => 'Е-адреса не може бити прихваћена јер је неисправног облика.
 Унесите исправну адресу или оставите празно поље.',
 'cannotchangeemail' => 'На овом викију не можете променити е-адресу налога.',
+'emaildisabled' => 'Овај сајт не може да шаље е-поруке.',
 'accountcreated' => 'Налог је отворен',
 'accountcreatedtext' => 'Налог {{GENDER:$1|корисника|кориснице|корисника}} $1 је отворен.',
 'createaccount-title' => 'Отварање корисничког налога за {{SITENAME}}',
@@ -1003,7 +1004,7 @@ $2
 'watchthis' => 'надгледај ову страницу',
 'savearticle' => 'Сачувај страницу',
 'preview' => 'Преглед',
-'showpreview' => 'Прикажи преглед',
+'showpreview' => 'Прикажи претпреглед',
 'showlivepreview' => 'Тренутни преглед',
 'showdiff' => 'Прикажи измене',
 'anoneditwarning' => "'''Упозорење:''' нисте пријављени.
@@ -1097,8 +1098,8 @@ $2
 Прилагођене странице CSS и јаваскрипт почињу малим словом, нпр. {{ns:user}}:Foo/vector.css, а не {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Ажурирано)',
 'note' => "'''Напомена:'''",
-'previewnote' => "'''Ð\9eво Ñ\98е само преглед.'''
¡Ñ\82Ñ\80аниÑ\86а Ñ\98оÑ\88 Ð½Ð¸Ñ\98е Ñ\81аÑ\87Ñ\83вана!",
+'previewnote' => "'''Ð\98маÑ\98Ñ\82е Ñ\83 Ð²Ð¸Ð´Ñ\83 Ð´Ð° Ñ\98е Ð¾Ð²Ð¾ само преглед.'''
\92аÑ\88е Ð¸Ð·Ð¼ÐµÐ½Ðµ Ñ\98оÑ\88 Ð½Ð¸Ñ\81Ñ\83 Ñ\81аÑ\87Ñ\83ване! [[#editform|â\86\92 Ð\9dаÑ\81Ñ\82ави Ñ\81 Ñ\83Ñ\80еÑ\92иваÑ\9aем]]",
 'previewconflict' => 'Овај преглед осликава како ће текст у текстуалном оквиру изгледати.',
 'session_fail_preview' => "'''Нисмо могли да обрадимо вашу измену због губитка података сесије.'''
 Покушајте поново.
@@ -1113,6 +1114,7 @@ $2
 То се понекад догађа када се користи неисправан посредник.'''",
 'edit_form_incomplete' => "'''Неки делови обрасца за уређивање нису достигли до сервера. Проверите да ли су измене промењене и покушајте поново.'''",
 'editing' => 'Уређујете $1',
+'creating' => 'Прављење странице $1',
 'editingsection' => 'Уређујете $1 (одељак)',
 'editingcomment' => 'Уређујете $1 (нови одељак)',
 'editconflict' => 'Сукобљене измене: $1',
@@ -2087,8 +2089,12 @@ $1',
 'sharedupload' => 'Ова датотека се налази на $1 и може се користити и на другим пројектима.',
 'sharedupload-desc-there' => 'Ова датотека се налази на $1 и може се користити и на другим пројектима.
 Погледајте [$2 страницу за опис датотеке] за више детаља о њој.',
-'sharedupload-desc-here' => 'Ова датотека се налази на $1 и може се користити и на другим пројектима.
-Опис на [$2 страници датотеке] је приказан испод.',
+'sharedupload-desc-here' => 'Ова датотека се налази на $1 и може да се користи на другим пројектима.
+Опис њене [$2 странице за опис] је приказан испод.',
+'sharedupload-desc-edit' => 'Ова датотека се налази на $1 и може да се користи на другим пројектима.
+Њен опис можете да измените на [$2 одговарајућој страници].',
+'sharedupload-desc-create' => 'Ова датотека се налази на $1 и може да се користи на другим пројектима.
+Њен опис можете да измените на [$2 одговарајућој страници].',
 'filepage-nofile' => 'Не постоји датотека с овим називом.',
 'filepage-nofile-link' => 'Не постоји датотека с овим називом, али је можете [$1 послати].',
 'uploadnewversion-linktext' => 'Пошаљи ново издање ове датотеке',
@@ -2305,6 +2311,7 @@ $1',
 'allpagesbadtitle' => 'Наведени назив странице није исправан или садржи међујезички или међувики префикс.
 Можда садржи знакове који се не могу користити у насловима.',
 'allpages-bad-ns' => '{{SITENAME}} нема именски простор „$1“.',
+'allpages-hide-redirects' => 'Сакриј преусмерења',
 
 # Special:Categories
 'categories' => 'Категоријe',
@@ -3907,7 +3914,7 @@ $5
 
 # Delete conflict
 'deletedwhileediting' => "'''Упозорење''': ова страница је обрисана након што сте почели с уређивањем!",
-'confirmrecreate' => "[[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|је обрисао|је обрисала|је обрисао}} ову страницу након што сте почели да је уређујете, са следећим разлогом:
+'confirmrecreate' => "[[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|је обрисао|је обрисала|обриса}} ову страницу након што сте почели да је уређујете, са следећим разлогом:
 : ''$2''
 Потврдите да стварно желите да направите страницу.",
 'confirmrecreate-noreason' => 'Корисник [[User:$1|$1]] ([[User talk:$1|разговор]]) је обрисао ову страницу након што сте почели да га уређујете. Потврдите да стварно желите да поново направите ову страницу.',
index c3391a5..2993781 100644 (file)
@@ -796,6 +796,7 @@ Poruke neće biti poslate ni za jednu od sledećih mogućnosti.',
 'invalidemailaddress' => 'E-adresa ne može biti prihvaćena jer je neispravnog oblika.
 Unesite ispravnu adresu ili ostavite prazno polje.',
 'cannotchangeemail' => 'Na ovom vikiju ne možete promeniti e-adresu naloga.',
+'emaildisabled' => 'Ovaj sajt ne može da šalje e-poruke.',
 'accountcreated' => 'Nalog je otvoren',
 'accountcreatedtext' => 'Nalog {{GENDER:$1|korisnika|korisnice|korisnika}} $1 je otvoren.',
 'createaccount-title' => 'Otvaranje korisničkog naloga za {{SITENAME}}',
@@ -998,8 +999,8 @@ Izveštaj o poslednjem blokiranju možete pogledati ispod:',
 Prilagođene stranice CSS i javaskript počinju malim slovom, npr. {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Ažurirano)',
 'note' => "'''Napomena:'''",
-'previewnote' => "'''Ovo je samo pregled.'''
-Stranica još nije sačuvana!",
+'previewnote' => "'''Imajte u vidu da je ovo samo pregled.'''
+Vaše izmene još nisu sačuvane! [[#editform|→ Nastavi s uređivanjem]]",
 'previewconflict' => 'Ovaj pregled oslikava kako će tekst u tekstualnom okviru izgledati.',
 'session_fail_preview' => "'''Nismo mogli da obradimo vašu izmenu zbog gubitka podataka sesije.'''
 Pokušajte ponovo.
@@ -1014,6 +1015,7 @@ Ako i dalje ne radi, pokušajte da se [[Special:UserLogout|odjavite]] i ponovo p
 To se ponekad događa kada se koristi neispravan posrednik.'''",
 'edit_form_incomplete' => "'''Neki delovi obrasca za uređivanje nisu dostigli do servera. Proverite da li su izmene promenjene i pokušajte ponovo.'''",
 'editing' => 'Uređujete $1',
+'creating' => 'Pravljenje stranice $1',
 'editingsection' => 'Uređujete $1 (odeljak)',
 'editingcomment' => 'Uređujete $1 (novi odeljak)',
 'editconflict' => 'Sukobljene izmene: $1',
@@ -1990,6 +1992,10 @@ Dostupan je i [[Special:WhatLinksHere/$2|potpuni spisak]].',
 Pogledajte [$2 stranicu za opis datoteke] za više detalja o njoj.',
 'sharedupload-desc-here' => 'Ova datoteka se nalazi na $1 i može se koristiti i na drugim projektima.
 Opis na [$2 stranici datoteke] je prikazan ispod.',
+'sharedupload-desc-edit' => 'Ova datoteka se nalazi na $1 i može da se koristi na drugim projektima.
+Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
+'sharedupload-desc-create' => 'Ova datoteka se nalazi na $1 i može da se koristi na drugim projektima.
+Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
 'filepage-nofile' => 'Ne postoji datoteka s ovim nazivom.',
 'filepage-nofile-link' => 'Ne postoji datoteka s ovim nazivom, ali je možete [$1 poslati].',
 'uploadnewversion-linktext' => 'Pošalji novo izdanje ove datoteke',
@@ -2206,6 +2212,7 @@ Možete suziti prikaz odabirući vrstu istorije, korisničkog imena ili tražene
 'allpagesbadtitle' => 'Navedeni naziv stranice nije ispravan ili sadrži međujezički ili međuviki prefiks.
 Možda sadrži znakove koji se ne mogu koristiti u naslovima.',
 'allpages-bad-ns' => '{{SITENAME}} nema imenski prostor „$1“.',
+'allpages-hide-redirects' => 'Sakrij preusmerenja',
 
 # Special:Categories
 'categories' => 'Kategorije',
index dce6f03..4384ccf 100644 (file)
@@ -45,6 +45,7 @@
  * @author Steinninn
  * @author Str4nd
  * @author Tobulos1
+ * @author VickyC
  * @author Where next Columbus
  * @author Where next Columbus?
  * @author WikiPhoenix
@@ -789,6 +790,7 @@ Som ett resultat kan besökare som använder den här IP-adressen inte skapa nå
 'invalidemailaddress' => 'E-postadressen kan inte godtas då formatet verkar vara felaktigt.
 Skriv in en adress med korrekt format eller töm fältet.',
 'cannotchangeemail' => 'E-post-adresser som är bundna till användarkonton kan inte ändras på denna wiki.',
+'emaildisabled' => 'Denna webbplats kan inte skicka e-post.',
 'accountcreated' => 'Användarkontot har skapats',
 'accountcreatedtext' => 'Användarkontot $1 har skapats.',
 'createaccount-title' => 'Konto skapat på {{SITENAME}}',
@@ -980,8 +982,8 @@ Den har inte sparats än!'''",
 'userinvalidcssjstitle' => "'''Varning:''' Skalet \"\$1\" finns inte. Kom ihåg att .css- och .js-sidor för enskilda användare börjar på liten bokstav. Exempel: {{ns:user}}:Foo/vector.css i stället för {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Uppdaterad)',
 'note' => "'''Obs!'''",
-'previewnote' => "'''Detta är bara en förhandsvisning;
-ändringar har ännu inte sparats!'''",
+'previewnote' => "'''Kom ihåg att detta bara är en förhandsvisning.'''
+Dina ändringar har ännu inte sparats! [[#editform|→ Fortsätt redigera]]",
 'previewconflict' => 'Den här förhandsvisningen är resultatet av den
 redigerbara texten ovanför,
 så som det kommer att se ut om du väljer att spara.',
@@ -999,6 +1001,7 @@ i redigeringens \"edit token\". Redigeringen stoppades för att förhindra att s
 Detta händer ibland om du använder buggiga webbaserade anonyma proxytjänster.'''",
 'edit_form_incomplete' => "'''Vissa delar av redigeringen kunde inte nå servern, dubbelkolla att dina ändringar är intakta och försök igen.'''",
 'editing' => 'Redigerar $1',
+'creating' => 'Skapar $1',
 'editingsection' => 'Redigerar $1 (avsnitt)',
 'editingcomment' => 'Redigerar $1 (nytt avsnitt)',
 'editconflict' => 'Redigeringskonflikt: $1',
@@ -1948,6 +1951,10 @@ Det finns en [[Special:WhatLinksHere/$2|fullständig lista]].',
 Var god se [$2 filbeskrivningssidan] för mer information.',
 'sharedupload-desc-here' => 'Den här filen är från $1 och kan användas av andra projekt.
 Beskrivningen på dess [$2 filbeskrivningssida] visas nedan.',
+'sharedupload-desc-edit' => 'Denna fil är från $1 och kan användas av andra projekt.
+Kanske vill du redigera beskrivningen på dess [$2 filbeskrivningssida] där.',
+'sharedupload-desc-create' => 'Denna fil är från $1 och kan användas av andra projekt.
+Kanske vill du redigera beskrivningen på dess [$2 filbeskrivningssida] där.',
 'filepage-nofile' => 'Det finns ingen fil med det här namnet.',
 'filepage-nofile-link' => 'Det finns ingen fil med det här namnet, men du kan [$1 ladda upp den].',
 'uploadnewversion-linktext' => 'Ladda upp en ny version av denna fil',
@@ -2158,6 +2165,7 @@ Du kan avgränsa sökningen och få färre träffar genom att ange typ av logg,
 'allpagesprefix' => 'Visa sidor med prefixet:',
 'allpagesbadtitle' => 'Den sökta sidtiteln var ogiltig eller så innehöll den ett prefix för annan språkversion eller interwiki-prefix. Titeln kan innehålla bokstäver som inte är tillåtna i sidtitlar.',
 'allpages-bad-ns' => 'Namnrymden "$1" finns inte på {{SITENAME}}.',
+'allpages-hide-redirects' => 'Göm omdirigeringar',
 
 # Special:Categories
 'categories' => 'Kategorier',
index 4cf033a..d8328bc 100644 (file)
@@ -605,6 +605,7 @@ Hakuna hata barua  pepe moja itakayotumwa kwa lolote katika vipengele hivi vifua
 'invalidemailaddress' => 'Anwani ya barua pepe haiwezi kukubalika ikiwa inaonekana kuwa na muundo batili.
 Tafadhali ingiza anwani ya miundo-mizuri au acha tupu kipengele hicho.',
 'cannotchangeemail' => 'Anwani za barua pepe haziwezi kubadilishwa katika akaunti za wiki hii.',
+'emaildisabled' => 'Tovuti hii haiwezi kutuma barua pepe.',
 'accountcreated' => 'Akaunti imeundwa',
 'accountcreatedtext' => 'Akaunti imeundwa kwa ajili ya mtumiaji $1.',
 'createaccount-title' => 'Kuanzisha akaunti kwa ajili ya {{SITENAME}}',
@@ -797,7 +798,8 @@ Rejea kumbukumbu ya uzuio ya mwisho inayoandikwa chini:',
 Kumbuka kwamba desturi ya kurasa za .css na .js hutumia herufi ndogo, yaani, {{ns:user}}:Foo/vector.css na si {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Imesasishwa)',
 'note' => "'''Taarifa:'''",
-'previewnote' => "'''Hii ni hakikisho tu; mabadiliko hayajahifadhiwa bado!'''",
+'previewnote' => "'''Hii ni hakikisho tu.''' 
+Mabadiliko hayajahifadhiwa bado! [[#editform|→ Endelea kuhariri]]",
 'previewconflict' => 'Hakikisho hii inaonyesha maandiko yaliyopo sanduku la juu yataonekayo ukiyahifadhi.',
 'session_fail_preview' => "'''Pole! Hatukuweza kuhifadhi sahihisho lako kwa sababu data za kipindi zilipotelewa.'''
 Tafadhali jaribu tena.
@@ -813,6 +815,7 @@ Haririo umekataliwa ili kuzuia uharibifu wa maandishi ya kurasa.
 Haya hutokea kwa muda ambao unatumia huduma ya seva ya wavu isiyotiwa jina na yenye hitilafu nyingi.",
 'edit_form_incomplete' => "'''Baadhi ya sehemu za fomu ya kuhariria hazikufikia seva. Hakikisha kwamba haririo lako bado lipo na kisha jaribu tena.'''",
 'editing' => 'Kuhariri $1',
+'creating' => '$1 unaanzishwa',
 'editingsection' => 'Unahariri $1 (fungu)',
 'editingcomment' => 'Una hariri $1 (sehemu mpya)',
 'editconflict' => 'Mgongano wa kuhariri: $1',
@@ -1833,6 +1836,7 @@ Unaweza kuona baadhi yao tu kwa kuchagua aina fulani ya kumbukumbu, jina la mtum
 'allpagesbadtitle' => 'Jina la ukurasa ni batili au linatumia kiambishi awali cha mradi mwingine.
 Inaweza kuwa na herufi isiyoweza kutumiwa ndani ya majina ya kurasa.',
 'allpages-bad-ns' => 'Eneo la "$1" halipatikani kwenye {{SITENAME}}.',
+'allpages-hide-redirects' => 'Ficha kurasa za kuelekeza',
 
 # Special:Categories
 'categories' => 'Jamii',
index c593388..f0915d8 100644 (file)
@@ -345,7 +345,8 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
 'loginreqpagetext' => 'Ó tenke $1 ba haree pájina seluk.',
 'newarticle' => '(Foun)',
 'noarticletext' => "Iha momentu lá'os testu iha pájina ne'e, bele [[Special:Search/{{PAGENAME}}|buka naran pájina nian]] iha pájina seluk, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs], ka [{{fullurl:{{FULLPAGENAME}}|action=edit}} edita pájina ne'e]</span>.",
-'previewnote' => "'''Ne'e de'it pájina ba kontrola; Ita-nia mudansa la armazenadu seidauk!'''",
+'previewnote' => "'''Ne'e de'it pájina ba kontrola.'''
+Ita-nia mudansa la armazenadu seidauk! [[#editform|→ Nafatin edita]]",
 'editing' => 'Edita $1',
 'editingsection' => 'Edita $1 (seksaun)',
 'editingcomment' => 'Edita $1 (seksaun foun)',
@@ -437,6 +438,7 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
 'userrights-lookup-user' => "Muda grupu uza-na'in",
 'userrights-user-editname' => "Fó naran uza-na'in ida:",
 'editusergroup' => "Muda grupu uza-na'in",
+'editinguser' => "Muda grupu '''[[User:$1|$1]]''' nian $2",
 'userrights-editusergroup' => "Muda grupu uza-na'in",
 'userrights-groupsmember' => 'Membru iha:',
 'userrights-reason' => 'Motivu:',
@@ -479,7 +481,7 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
 # User rights log
 'rightslog' => "Lista mudansa priviléjiu uza-na'in",
 'rightslogtext' => "Ne'e lista mudansa priviléjiu uza-na'in sira nian.",
-'rightslogentry' => 'muda grupu $1 nian husi $2 ba $3',
+'rightslogentry' => 'muda grupu "$1" nian husi "$2" ba "$3"',
 'rightsnone' => '(mamuk)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -926,6 +928,7 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
 'version-other' => 'Seluk',
 'version-version' => '(Versaun $1)',
 'version-license' => 'Lisensa',
+'version-poweredby-others' => 'ema seluk',
 'version-software-product' => 'Produtu',
 'version-software-version' => 'Versaun',
 
index 26014c7..0d1d819 100644 (file)
@@ -982,7 +982,8 @@ Son engelleme günlüğü girdisi referans için aşağıda sağlanmıştır:',
 'userinvalidcssjstitle' => "''Uyarı:''' \"\$1\" adıyla bir tema yoktur. tema-adı.css ve .js dosyalarının adları küçük harf ile yazması gerek, yani {{ns:user}}:Temel/'''V'''ector.css değil, {{ns:user}}:Temel/'''v'''ector.css.",
 'updated' => '(Güncellendi)',
 'note' => "'''Not: '''",
-'previewnote' => "'''Bu yalnızca bir önizlemedir, ve değişiklikleriniz henüz kaydedilmemiştir!'''",
+'previewnote' => "'''Bunun yalnızca bir ön izleme olduğunu unutmayın.'''
+Yaptığınız değişiklikler henüz kaydedilmedi! [[#editform|→ Düzenlemeye devam edin]]",
 'previewconflict' => 'Bu önizleme metin düzenleme kutucuğunun üstünde, maddenin eğer değişikliklerinizi kaydetmeyi seçerseniz nasıl görüneceğini yansıtır.',
 'session_fail_preview' => 'Özür dileriz. Oturum açılması ile ilgili veri kaybından kaynaklı değişikliğinizi kaydedemedik. Lütfen tekrar deneyiniz. Eğer bu yöntem işe yaramazsa oturumu kapatıp tekrar sisteme geri giriş yapınız.',
 'session_fail_preview_html' => "'''Üzgünüz! Oturum verisinin kaybolmasından dolayı düzenlemenizi işleme geçiremeyeceğiz.'''
index a19cd5d..055db44 100644 (file)
@@ -2724,7 +2724,7 @@ $1被封禁的理由是:“$2”',
 'importlogpagetext' => '由管理员从其他wiki导入的带有编辑历史的页面。',
 'import-logentry-upload' => '通过文件上传导入的[[$1]]',
 'import-logentry-upload-detail' => '$1个版本',
-'import-logentry-interwiki' => '跨 wiki $1',
+'import-logentry-interwiki' => '跨站导入 $1',
 'import-logentry-interwiki-detail' => '来自$2的$1个修订',
 
 # JavaScriptTest
index cc4e5af..6137a95 100644 (file)
@@ -36,7 +36,7 @@ class CheckSyntax extends Maintenance {
                $this->addOption( 'path', 'Specific path (file or directory) to check, either with absolute path or relative to the root of this MediaWiki installation',
                        false, true );
                $this->addOption( 'list-file', 'Text file containing list of files or directories to check', false, true );
-               $this->addOption( 'modified', 'Check only files that were modified (requires SVN command-line client)' );
+               $this->addOption( 'modified', 'Check only files that were modified (requires Git command-line client)' );
                $this->addOption( 'syntax-only', 'Check for syntax validity only, skip code style warnings' );
        }
 
@@ -114,18 +114,10 @@ class CheckSyntax extends Maintenance {
                        fclose( $f );
                        return;
                } elseif ( $this->hasOption( 'modified' ) ) {
-                       $this->output( "Retrieving list from Subversion... " );
-                       $parentDir = wfEscapeShellArg( dirname( __FILE__ ) . '/..' );
-                       $retval = null;
-                       $output = wfShellExec( "svn status --ignore-externals $parentDir", $retval );
-                       if ( $retval ) {
-                               $this->error( "Error retrieving list from Subversion!\n", true );
-                       } else {
-                               $this->output( "done\n" );
-                       }
-
-                       preg_match_all( '/^\s*[AM].{7}(.*?)\r?$/m', $output, $matches );
-                       foreach ( $matches[1] as $file ) {
+                       $this->output( "Retrieving list from Git... " );
+                       $files = $this->getGitModifiedFiles( $IP );
+                       $this->output( "done\n" );
+                       foreach ( $files as $file ) {
                                if ( $this->isSuitableFile( $file ) && !is_dir( $file ) ) {
                                        $this->mFiles[] = $file;
                                }
@@ -163,6 +155,59 @@ class CheckSyntax extends Maintenance {
                $this->output( 'done.', 'listfiles' );
        }
 
+       /**
+        * Returns a list of tracked files in a Git work tree differing from the master branch.
+        * @param $path string: Path to the repository
+        * @return array: Resulting list of changed files
+        */
+       private function getGitModifiedFiles( $path ) {
+
+               global $wgMaxShellMemory;
+
+               if ( !is_dir( "$path/.git" ) ) {
+                       $this->error( "Error: Not a Git repository!\n", true );
+               }
+
+               // git diff eats memory.
+               $oldMaxShellMemory = $wgMaxShellMemory;
+               if ( $wgMaxShellMemory < 1024000 ) {
+                       $wgMaxShellMemory = 1024000;
+               }
+
+               $ePath = wfEscapeShellArg( $path );
+
+               // Find an ancestor in common with master (rather than just using its HEAD)
+               // to prevent files only modified there from showing up in the list.
+               $cmd = "cd $ePath && git merge-base master HEAD";
+               $retval = 0;
+               $output = wfShellExec( $cmd, $retval );
+               if ( $retval !== 0 ) {
+                       $this->error( "Error retrieving base SHA1 from Git!\n", true );
+               }
+
+               // Find files in the working tree that changed since then.
+               $eBase = wfEscapeShellArg( rtrim( $output, "\n" ) );
+               $cmd = "cd $ePath && git diff --name-only --diff-filter AM $eBase";
+               $retval = 0;
+               $output = wfShellExec( $cmd, $retval );
+               if ( $retval !== 0 ) {
+                       $this->error( "Error retrieving list from Git!\n", true );
+               }
+
+               $wgMaxShellMemory = $oldMaxShellMemory;
+
+               $arr = array();
+               $filename = strtok( $output, "\n" );
+               while ( $filename !== false ) {
+                       if ( $filename !== '' ) {
+                               $arr[] = "$path/$filename";
+                       }
+                       $filename = strtok( "\n" );
+               }
+
+               return $arr;
+       }
+
        /**
         * Returns true if $file is of a type we can check
         * @param $file string
index 8f19ef5..7e83d5f 100644 (file)
@@ -71,6 +71,13 @@ class GenerateSitemap extends Maintenance {
         */
        var $compress;
 
+       /**
+        * Whether or not to include redirection pages
+        *
+        * @var bool
+        */
+       var $skipRedirects;
+
        /**
         * The number of entries to save in each sitemap file
         *
@@ -137,6 +144,7 @@ class GenerateSitemap extends Maintenance {
                $this->addOption( 'fspath', 'The file system path to save to, e.g. /tmp/sitemap; defaults to current directory', false, true );
                $this->addOption( 'urlpath', 'The URL path corresponding to --fspath, prepended to filenames in the index; defaults to an empty string', false, true );
                $this->addOption( 'compress', 'Compress the sitemap files, can take value yes|no, default yes', false, true );
+               $this->addOption( 'skip-redirects', 'Do not include redirecting articles in the sitemap' );
                $this->addOption( 'identifier', 'What site identifier to use for the wiki, defaults to $wgDBname', false, true );
        }
 
@@ -154,6 +162,7 @@ class GenerateSitemap extends Maintenance {
                }
                $this->identifier = $this->getOption( 'identifier', wfWikiID() );
                $this->compress = $this->getOption( 'compress', 'yes' ) !== 'no';
+               $this->skipRedirects = $this->getOption( 'skip-redirects', false ) !== false ;
                $this->dbr = wfGetDB( DB_SLAVE );
                $this->generateNamespaces();
                $this->timestamp = wfTimestamp( TS_ISO_8601, wfTimestampNow() );
@@ -279,6 +288,7 @@ class GenerateSitemap extends Maintenance {
                                'page_namespace',
                                'page_title',
                                'page_touched',
+                               'page_is_redirect'
                        ),
                        array( 'page_namespace' => $namespace ),
                        __METHOD__
@@ -302,7 +312,13 @@ class GenerateSitemap extends Maintenance {
 
                        $fns = $wgContLang->getFormattedNsText( $namespace );
                        $this->output( "$namespace ($fns)\n" );
+                       $skippedRedirects = 0;  // Number of redirects skipped for that namespace
                        foreach ( $res as $row ) {
+                               if ($this->skipRedirects && $row->page_is_redirect ) {
+                                       $skippedRedirects++;
+                                       continue;
+                               }
+
                                if ( $i++ === 0 || $i === $this->url_limit + 1 || $length + $this->limit[1] + $this->limit[2] > $this->size_limit ) {
                                        if ( $this->file !== false ) {
                                                $this->write( $this->file, $this->closeFile() );
@@ -332,6 +348,11 @@ class GenerateSitemap extends Maintenance {
                                        }
                                }
                        }
+
+                       if ($this->skipRedirects && $skippedRedirects > 0) {
+                               $this->output( "  skipped $skippedRedirects redirect(s)\n" );
+                       }
+
                        if ( $this->file ) {
                                $this->write( $this->file, $this->closeFile() );
                                $this->close( $this->file );
index 230f397..3c74403 100644 (file)
@@ -675,6 +675,7 @@ $wgMessageStructure = array(
                'edit-already-exists',
                'addsection-preload',
                'addsection-editintro',
+               'defaultmessagetext',
        ),
        'parserwarnings' => array(
                'expensive-parserfunction-warning',
index 66a1845..a848bf5 100644 (file)
@@ -25,7 +25,7 @@
 -- in early 2002 after a lot of trouble with the fields
 -- auto-updating.
 --
--- The Postgres backend uses DATETIME fields for timestamps,
+-- The Postgres backend uses TIMESTAMPTZ fields for timestamps,
 -- and we will migrate the MySQL definitions at some point as
 -- well.
 --
index a8d4a3a..3e33bde 100644 (file)
        };
 
        var parserDefaults = { 
-               'magic' : {},
+               'magic' : {
+                       'SITENAME' : mw.config.get( 'wgSiteName' )
+               },
                'messages' : mw.messages,
                'language' : mw.language
        };
 
        };
 
-       // TODO figure out a way to make magic work with common globals like wgSiteName, without requiring init from library users...
-       // var options = { magic: { 'SITENAME' : mw.config.get( 'wgSiteName' ) } };
-
        // deprecated! don't rely on gM existing.
        // the window.gM ought not to be required - or if required, not required here. But moving it to extensions breaks it (?!)
        // Need to fix plugin so it could do attributes as well, then will be okay to remove this.
index 04f7b50..7a67a8d 100644 (file)
@@ -3677,6 +3677,36 @@ msg
 No such special page
 !! end
 
+!! test
+{{#speciale:}} page name, known
+!! options
+msg
+!! input
+{{#speciale:Recentchanges}}
+!! result
+Special:RecentChanges
+!! end
+
+!! test
+{{#speciale:}} page name with subpage, known
+!! options
+msg
+!! input
+{{#speciale:Recentchanges/param}}
+!! result
+Special:RecentChanges/param
+!! end
+
+!! test
+{{#speciale:}} page name, unknown
+!! options
+msg
+!! input
+{{#speciale:foobarnonexistent}}
+!! result
+No_such_special_page
+!! end
+
 ###
 ### Images
 ###
index 84c0fc2..1f40b5a 100644 (file)
@@ -33,8 +33,6 @@ class ApiBlockTest extends ApiTestCase {
         * Root cause is https://gerrit.wikimedia.org/r/3434
         * Which made the Block/Unblock API to actually verify the token
         * previously always considered valid (bug 34212).
-        *
-        * @group Broken
         */
        function testMakeNormalBlock() {
 
@@ -70,4 +68,50 @@ class ApiBlockTest extends ApiTestCase {
 
        }
 
+       /**
+        * @dataProvider provideBlockUnblockAction
+        */
+       function testGetTokenUsingABlockingAction( $action ) {
+               $data = $this->doApiRequest(
+                       array(
+                               'action' => $action,
+                               'user' => 'UTApiBlockee',
+                               'gettoken' => '' ),
+                       null,
+                       false,
+                       self::$users['sysop']->user
+               );
+               $this->assertEquals( 34, strlen( $data[0][$action]["{$action}token"] ) );
+       }
+
+       /**
+        * Attempting to block without a token should give a UsageException with
+        * error message:
+        *   "The token parameter must be set"
+        *
+        * @dataProvider provideBlockUnblockAction
+        * @expectedException UsageException
+        */
+       function testBlockingActionWithNoToken( $action ) {
+               $this->doApiRequest(
+                       array(
+                               'action' => $action,
+                               'user' => 'UTApiBlockee',
+                               'reason' => 'Some reason',
+                               ),
+                       null,
+                       false,
+                       self::$users['sysop']->user
+               );
+       }
+
+       /**
+        * Just provide the 'block' and 'unblock' action to test both API calls
+        */
+       function provideBlockUnblockAction() {
+               return array(
+                       array( 'block'   ),
+                       array( 'unblock' ),
+               );
+       }
 }
index 067c731..d226598 100644 (file)
@@ -250,6 +250,16 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                }
        }
 
+       public function testInsertIdType() {
+               $db = new DatabaseSqliteStandalone( ':memory:' );
+               $this->assertInstanceOf( 'ResultWrapper',
+                       $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ ), "Database creationg" );
+               $this->assertTrue( $db->insert( 'a', array( 'a_1' => 10 ), __METHOD__ ),
+                       "Insertion worked" );
+               $this->assertEquals( "integer", gettype( $db->insertId() ), "Actual typecheck" );
+               $this->assertTrue( $db->close(), "closing database" );
+       }
+
        private function prepareDB( $version ) {
                static $maint = null;
                if ( $maint === null ) {