Merge "Space in $separatorTransformTable should be non-breaking in Portuguese, Espera...
authorNikerabbit <niklas.laxstrom@gmail.com>
Wed, 18 Apr 2012 06:44:11 +0000 (06:44 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 18 Apr 2012 06:44:11 +0000 (06:44 +0000)
64 files changed:
RELEASE-NOTES-1.20
docs/hooks.txt
includes/AutoLoader.php
includes/GitInfo.php
includes/ImageGallery.php
includes/api/ApiDelete.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllImages.php [new file with mode: 0644]
includes/api/ApiQueryAllMessages.php [new file with mode: 0644]
includes/api/ApiQueryAllPages.php [new file with mode: 0644]
includes/api/ApiQueryAllimages.php [deleted file]
includes/api/ApiQueryAllmessages.php [deleted file]
includes/api/ApiQueryAllpages.php [deleted file]
includes/api/ApiQueryFilearchive.php
includes/filerepo/FileRepo.php
includes/filerepo/backend/SwiftFileBackend.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignAPIFile.php
includes/filerepo/file/LocalFile.php
includes/parser/Parser.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderStartUpModule.php
languages/messages/MessagesAr.php
languages/messages/MessagesAst.php
languages/messages/MessagesBa.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCs.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesEn.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesHy.php
languages/messages/MessagesJa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKiu.php
languages/messages/MessagesLa.php
languages/messages/MessagesLez.php
languages/messages/MessagesLmo.php
languages/messages/MessagesLt.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesNan.php
languages/messages/MessagesNl.php
languages/messages/MessagesOs.php
languages/messages/MessagesPl.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesRu.php
languages/messages/MessagesSk.php
languages/messages/MessagesSo.php
languages/messages/MessagesTa.php
languages/messages/MessagesTe.php
languages/messages/MessagesTk.php
languages/messages/MessagesTr.php
languages/messages/MessagesUk.php
languages/messages/MessagesVep.php
languages/messages/MessagesYi.php
maintenance/language/rebuildLanguage.php
maintenance/language/writeMessagesArray.inc
resources/mediawiki/mediawiki.js
tests/parser/parserTests.txt
tests/phpunit/includes/filerepo/FileBackendTest.php

index ccb111e..3f5a314 100644 (file)
@@ -38,6 +38,8 @@ production.
 * (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)
+* Added GitViewers hook for extensions using external git repositories to have a web-based
+  repository viewer linked to from Special:Version.
 
 === Bug fixes in 1.20 ===
 * (bug 30245) Use the correct way to construct a log page title.
index b02c305..d87bd3d 100644 (file)
@@ -997,6 +997,11 @@ $result: User permissions error to add. If none, return true.
 'getUserPermissionsErrorsExpensive': Absolutely the same, but is called only
        if expensive checks are enabled.
 
+'GitViewers': called when generating the list of git viewers for Special:Version, use
+       this to change the list.
+&$extTypes: associative array of repo URLS to viewer URLs.
+
+
 'ImageBeforeProduceHTML': Called before producing the HTML created by a wiki
        image insertion.  You can skip the default logic entirely by returning
        false, or just modify a few things using call-by-reference.
index a1bbc3c..56f3af6 100644 (file)
@@ -323,10 +323,10 @@ $wgAutoloadLocalClasses = array(
        'ApiPurge' => 'includes/api/ApiPurge.php',
        'ApiQuery' => 'includes/api/ApiQuery.php',
        'ApiQueryAllCategories' => 'includes/api/ApiQueryAllCategories.php',
-       'ApiQueryAllimages' => 'includes/api/ApiQueryAllimages.php',
+       'ApiQueryAllImages' => 'includes/api/ApiQueryAllImages.php',
        'ApiQueryAllLinks' => 'includes/api/ApiQueryAllLinks.php',
-       'ApiQueryAllmessages' => 'includes/api/ApiQueryAllmessages.php',
-       'ApiQueryAllpages' => 'includes/api/ApiQueryAllpages.php',
+       'ApiQueryAllMessages' => 'includes/api/ApiQueryAllMessages.php',
+       'ApiQueryAllPages' => 'includes/api/ApiQueryAllPages.php',
        'ApiQueryAllUsers' => 'includes/api/ApiQueryAllUsers.php',
        'ApiQueryBacklinks' => 'includes/api/ApiQueryBacklinks.php',
        'ApiQueryBase' => 'includes/api/ApiQueryBase.php',
index 0dfd48d..74c07cc 100644 (file)
@@ -21,17 +21,9 @@ class GitInfo {
        protected $basedir;
 
        /**
-        * Map of repo URLs to viewer URLs.
-        * Key is a pattern passed to preg_match() and preg_replace(),
-        * without the delimiters (which are #) and must match the whole URL.
-        * The value is the replacement for the key (it can contain $1, etc.)
-        * %h will be replaced by the short SHA-1 (7 first chars) and %H by the
-        * full SHA-1 of the HEAD revision.
+        * Map of repo URLs to viewer URLs. Access via static method getViewers().
         */
-       protected $viewers = array(
-               'https://gerrit.wikimedia.org/r/p/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
-               'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
-       );
+       private static $viewers = false;
 
        /**
         * @param $dir string The root directory of the repo where the .git dir can be found
@@ -151,7 +143,7 @@ class GitInfo {
                if ( substr( $url, -4 ) !== '.git' ) {
                        $url .= '.git';
                }
-               foreach( $this->viewers as $repo => $viewer ) {
+               foreach( self::getViewers() as $repo => $viewer ) {
                        $pattern = '#^' . $repo . '$#';
                        if ( preg_match( $pattern, $url ) ) {
                                $viewerUrl = preg_replace( $pattern, $viewer, $url );
@@ -189,4 +181,29 @@ class GitInfo {
        public static function headViewUrl() {
                return self::repo()->getHeadViewUrl();
        }
+
+       /**
+        * Gets the list of repository viewers
+        * @return array
+        */
+       protected static function getViewers() {
+               if( self::$viewers === false ) {
+
+                       // Map of repo URLs to viewer URLs.
+                       //
+                       // Key is a pattern passed to preg_match() and preg_replace(),
+                       // without the delimiters (which are #) and must match the whole URL.
+                       // The value is the replacement for the key (it can contain $1, etc.)
+                       // %h will be replaced by the short SHA-1 (7 first chars) and %H by the
+                       // full SHA-1 of the HEAD revision.
+                       self::$viewers = array(
+                               'https://gerrit.wikimedia.org/r/p/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
+                               'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
+                       );
+
+                       wfRunHooks( 'GitViewers', array( &self::$viewers ) );
+               }
+
+               return self::$viewers;
+       }
 }
index 5a8fb8e..f947f09 100644 (file)
@@ -141,23 +141,24 @@ class ImageGallery {
         * @param $title Title object of the image that is added to the gallery
         * @param $html  String: Additional HTML text to be shown. The name and size of the image are always shown.
         * @param $alt   String: Alt text for the image
+        * @param $link  String: Override image link (optional)
         */
-       function add( $title, $html = '', $alt = '' ) {
+       function add( $title, $html = '', $alt = '', $link = '') {
                if ( $title instanceof File ) {
                        // Old calling convention
                        $title = $title->getTitle();
                }
-               $this->mImages[] = array( $title, $html, $alt );
+               $this->mImages[] = array( $title, $html, $alt, $link );
                wfDebug( 'ImageGallery::add ' . $title->getText() . "\n" );
        }
 
        /**
-       * Add an image at the beginning of the gallery.
-       *
-       * @param $title Title object of the image that is added to the gallery
-       * @param $html  String: Additional HTML text to be shown. The name and size of the image are always shown.
-       * @param $alt   String: Alt text for the image
-       */
+        * Add an image at the beginning of the gallery.
+        *
+        * @param $title Title object of the image that is added to the gallery
+        * @param $html  String: Additional HTML text to be shown. The name and size of the image are always shown.
+        * @param $alt   String: Alt text for the image
+        */
        function insert( $title, $html = '', $alt = '' ) {
                if ( $title instanceof File ) {
                        // Old calling convention
@@ -245,6 +246,7 @@ class ImageGallery {
                        $nt = $pair[0];
                        $text = $pair[1]; # "text" means "caption" here
                        $alt = $pair[2];
+                       $link = $pair[3];
 
                        $descQuery = false;
                        if ( $nt->getNamespace() == NS_FILE ) {
@@ -289,6 +291,7 @@ class ImageGallery {
                                        'desc-link' => true,
                                        'desc-query' => $descQuery,
                                        'alt' => $alt,
+                                       'custom-url-link' => $link
                                );
                                # In the absence of both alt text and caption, fall back on providing screen readers with the filename as alt text
                                if ( $alt == '' && $text == '' ) {
@@ -346,9 +349,9 @@ class ImageGallery {
                                        . '<div style="width: ' . ( $this->mWidths + self::THUMB_PADDING + self::GB_PADDING ) . 'px">'
                                        . $thumbhtml
                                        . "\n\t\t\t" . '<div class="gallerytext">' . "\n"
-                                               . $textlink . $text . $fileSize
+                                       . $textlink . $text . $fileSize
                                        . "\n\t\t\t</div>"
-                               . "\n\t\t</div></li>";
+                                       . "\n\t\t</div></li>";
                }
                $output .= "\n</ul>";
 
@@ -378,8 +381,8 @@ class ImageGallery {
         */
        public function getContextTitle() {
                return is_object( $this->contextTitle ) && $this->contextTitle instanceof Title
-                               ? $this->contextTitle
-                               : false;
+                       ? $this->contextTitle
+                       : false;
        }
 
 } //class
index 8a4a17f..b8ffff9 100644 (file)
@@ -53,18 +53,20 @@ class ApiDelete extends ApiBase {
                        if ( !$titleObj ) {
                                $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
                        }
+                       $pageObj = WikiPage::factory( $titleObj );
+                       $pageObj->loadPageData( 'fromdbmaster' );
+                       if ( !$pageObj->exists() ) {
+                               $this->dieUsageMsg( 'notanarticle' );
+                       }
                } elseif ( isset( $params['pageid'] ) ) {
-                       $titleObj = Title::newFromID( $params['pageid'] );
-                       if ( !$titleObj ) {
+                       $pageObj = WikiPage::newFromID( $params['pageid'] );
+                       if ( !$pageObj ) {
                                $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
                        }
-               }
-               if ( !$titleObj->exists() ) {
-                       $this->dieUsageMsg( 'notanarticle' );
+                       $titleObj = $pageObj->getTitle();
                }
 
                $reason = ( isset( $params['reason'] ) ? $params['reason'] : null );
-               $pageObj = WikiPage::factory( $titleObj );
                $user = $this->getUser();
 
                if ( $titleObj->getNamespace() == NS_FILE ) {
index c172d24..866b71c 100644 (file)
@@ -64,8 +64,8 @@ class ApiQuery extends ApiBase {
        );
 
        private $mQueryListModules = array(
-               'allimages' => 'ApiQueryAllimages',
-               'allpages' => 'ApiQueryAllpages',
+               'allimages' => 'ApiQueryAllImages',
+               'allpages' => 'ApiQueryAllPages',
                'alllinks' => 'ApiQueryAllLinks',
                'allcategories' => 'ApiQueryAllCategories',
                'allusers' => 'ApiQueryAllUsers',
@@ -95,7 +95,7 @@ class ApiQuery extends ApiBase {
        private $mQueryMetaModules = array(
                'siteinfo' => 'ApiQuerySiteinfo',
                'userinfo' => 'ApiQueryUserInfo',
-               'allmessages' => 'ApiQueryAllmessages',
+               'allmessages' => 'ApiQueryAllMessages',
        );
 
        private $mSlaveDB = null;
index 78367a4..ce28d03 100644 (file)
@@ -65,7 +65,12 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
 
                $min = $params['min'];
                $max = $params['max'];
-               $this->addWhereRange( 'cat_pages', $dir, $min, $max );
+               if ( $dir == 'newer' ) {
+                       $this->addWhereRange( 'cat_pages', 'newer', $min, $max );
+               } else {
+                       $this->addWhereRange( 'cat_pages', 'older', $max, $min);
+               }
+    
 
                if ( isset( $params['prefix'] ) ) {
                        $this->addWhere( 'cat_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
diff --git a/includes/api/ApiQueryAllImages.php b/includes/api/ApiQueryAllImages.php
new file mode 100644 (file)
index 0000000..60a05a7
--- /dev/null
@@ -0,0 +1,267 @@
+<?php
+
+/**
+ * API for MediaWiki 1.12+
+ *
+ * Created on Mar 16, 2008
+ *
+ * Copyright © 2008 Vasiliev Victor vasilvv@gmail.com,
+ * based on ApiQueryAllPages.php
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Query module to enumerate all available pages.
+ *
+ * @ingroup API
+ */
+class ApiQueryAllImages extends ApiQueryGeneratorBase {
+
+       protected $mRepo;
+
+       public function __construct( $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'ai' );
+               $this->mRepo = RepoGroup::singleton()->getLocalRepo();
+       }
+
+       /**
+        * Override parent method to make sure to make sure the repo's DB is used
+        * which may not necesarilly be the same as the local DB.
+        *
+        * TODO: allow querying non-local repos.
+        * @return DatabaseBase
+        */
+       protected function getDB() {
+               return $this->mRepo->getSlaveDB();
+       }
+
+       public function execute() {
+               $this->run();
+       }
+
+       public function getCacheMode( $params ) {
+               return 'public';
+       }
+
+       /**
+        * @param $resultPageSet ApiPageSet
+        * @return void
+        */
+       public function executeGenerator( $resultPageSet ) {
+               if ( $resultPageSet->isResolvingRedirects() ) {
+                       $this->dieUsage( 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator', 'params' );
+               }
+
+               $this->run( $resultPageSet );
+       }
+
+       /**
+        * @param $resultPageSet ApiPageSet
+        * @return void
+        */
+       private function run( $resultPageSet = null ) {
+               $repo = $this->mRepo;
+               if ( !$repo instanceof LocalRepo ) {
+                       $this->dieUsage( 'Local file repository does not support querying all images', 'unsupportedrepo' );
+               }
+
+               $db = $this->getDB();
+
+               $params = $this->extractRequestParams();
+
+               // Image filters
+               $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
+               $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
+               $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
+               $this->addWhereRange( 'img_name', $dir, $from, $to );
+
+               if ( isset( $params['prefix'] ) )
+                       $this->addWhere( 'img_name' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+
+               if ( isset( $params['minsize'] ) ) {
+                       $this->addWhere( 'img_size>=' . intval( $params['minsize'] ) );
+               }
+
+               if ( isset( $params['maxsize'] ) ) {
+                       $this->addWhere( 'img_size<=' . intval( $params['maxsize'] ) );
+               }
+
+               $sha1 = false;
+               if ( isset( $params['sha1'] ) ) {
+                       if ( !$this->validateSha1Hash( $params['sha1'] ) ) {
+                               $this->dieUsage( 'The SHA1 hash provided is not valid', 'invalidsha1hash' );
+                       }
+                       $sha1 = wfBaseConvert( $params['sha1'], 16, 36, 31 );
+               } elseif ( isset( $params['sha1base36'] ) ) {
+                       $sha1 = $params['sha1base36'];
+                       if ( !$this->validateSha1Base36Hash( $sha1 ) ) {
+                               $this->dieUsage( 'The SHA1Base36 hash provided is not valid', 'invalidsha1base36hash' );
+                       }
+               }
+               if ( $sha1 ) {
+                       $this->addWhereFld( 'img_sha1', $sha1 );
+               }
+
+               if ( !is_null( $params['mime'] ) ) {
+                       global $wgMiserMode;
+                       if ( $wgMiserMode  ) {
+                               $this->dieUsage( 'MIME search disabled in Miser Mode', 'mimesearchdisabled' );
+                       }
+
+                       list( $major, $minor ) = File::splitMime( $params['mime'] );
+
+                       $this->addWhereFld( 'img_major_mime', $major );
+                       $this->addWhereFld( 'img_minor_mime', $minor );
+               }
+
+               $this->addTables( 'image' );
+
+               $prop = array_flip( $params['prop'] );
+               $this->addFields( LocalFile::selectFields() );
+
+               $limit = $params['limit'];
+               $this->addOption( 'LIMIT', $limit + 1 );
+               $this->addOption( 'ORDER BY', 'img_name' .
+                                               ( $params['dir'] == 'descending' ? ' DESC' : '' ) );
+
+               $res = $this->select( __METHOD__ );
+
+               $titles = array();
+               $count = 0;
+               $result = $this->getResult();
+               foreach ( $res as $row ) {
+                       if ( ++ $count > $limit ) {
+                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
+                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->img_name ) );
+                               break;
+                       }
+
+                       if ( is_null( $resultPageSet ) ) {
+                               $file = $repo->newFileFromRow( $row );
+                               $info = array_merge( array( 'name' => $row->img_name ),
+                                       ApiQueryImageInfo::getInfo( $file, $prop, $result ) );
+                               self::addTitleInfo( $info, $file->getTitle() );
+
+                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $info );
+                               if ( !$fit ) {
+                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->img_name ) );
+                                       break;
+                               }
+                       } else {
+                               $titles[] = Title::makeTitle( NS_IMAGE, $row->img_name );
+                       }
+               }
+
+               if ( is_null( $resultPageSet ) ) {
+                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'img' );
+               } else {
+                       $resultPageSet->populateFromTitles( $titles );
+               }
+       }
+
+       public function getAllowedParams() {
+               return array (
+                       'from' => null,
+                       'to' => null,
+                       'prefix' => null,
+                       'minsize' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                       ),
+                       'maxsize' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                       ),
+                       'limit' => array(
+                               ApiBase::PARAM_DFLT => 10,
+                               ApiBase::PARAM_TYPE => 'limit',
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+                       ),
+                       'dir' => array(
+                               ApiBase::PARAM_DFLT => 'ascending',
+                               ApiBase::PARAM_TYPE => array(
+                                       'ascending',
+                                       'descending'
+                               )
+                       ),
+                       'sha1' => null,
+                       'sha1base36' => null,
+                       'prop' => array(
+                               ApiBase::PARAM_TYPE => ApiQueryImageInfo::getPropertyNames( $this->propertyFilter ),
+                               ApiBase::PARAM_DFLT => 'timestamp|url',
+                               ApiBase::PARAM_ISMULTI => true
+                       ),
+                       'mime' => null,
+               );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'from' => 'The image title to start enumerating from',
+                       'to' => 'The image title to stop enumerating at',
+                       'prefix' => 'Search for all image titles that begin with this value',
+                       'dir' => 'The direction in which to list',
+                       'minsize' => 'Limit to images with at least this many bytes',
+                       'maxsize' => 'Limit to images with at most this many bytes',
+                       'limit' => 'How many images in total to return',
+                       'sha1' => "SHA1 hash of image. Overrides {$this->getModulePrefix()}sha1base36",
+                       'sha1base36' => 'SHA1 hash of image in base 36 (used in MediaWiki)',
+                       'prop' => ApiQueryImageInfo::getPropertyDescriptions( $this->propertyFilter ),
+                       'mime' => 'What MIME type to search for. e.g. image/jpeg. Disabled in Miser Mode',
+               );
+       }
+
+       private $propertyFilter = array( 'archivename' );
+
+       public function getDescription() {
+               return 'Enumerate all images sequentially';
+       }
+
+       public function getPossibleErrors() {
+               return array_merge( parent::getPossibleErrors(), array(
+                       array( 'code' => 'params', 'info' => 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator' ),
+                       array( 'code' => 'unsupportedrepo', 'info' => 'Local file repository does not support querying all images' ),
+                       array( 'code' => 'mimesearchdisabled', 'info' => 'MIME search disabled in Miser Mode' ),
+                       array( 'code' => 'invalidsha1hash', 'info' => 'The SHA1 hash provided is not valid' ),
+                       array( 'code' => 'invalidsha1base36hash', 'info' => 'The SHA1Base36 hash provided is not valid' ),
+               ) );
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=query&list=allimages&aifrom=B' => array(
+                               'Simple Use',
+                               'Show a list of images starting at the letter "B"',
+                       ),
+                       'api.php?action=query&generator=allimages&gailimit=4&gaifrom=T&prop=imageinfo' => array(
+                               'Using as Generator',
+                               'Show info about 4 images starting at the letter "T"',
+                       ),
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Allimages';
+       }
+
+       public function getVersion() {
+               return __CLASS__ . ': $Id$';
+       }
+}
diff --git a/includes/api/ApiQueryAllMessages.php b/includes/api/ApiQueryAllMessages.php
new file mode 100644 (file)
index 0000000..dedd3e5
--- /dev/null
@@ -0,0 +1,277 @@
+<?php
+/**
+ *
+ *
+ * Created on Dec 1, 2007
+ *
+ * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * A query action to return messages from site message cache
+ *
+ * @ingroup API
+ */
+class ApiQueryAllMessages extends ApiQueryBase {
+
+       public function __construct( $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'am' );
+       }
+
+       public function execute() {
+               $params = $this->extractRequestParams();
+
+               if ( is_null( $params['lang'] ) ) {
+                       global $wgLang;
+                       $langObj = $wgLang;
+               } else {
+                       $langObj = Language::factory( $params['lang'] );
+               }
+
+               if ( $params['enableparser'] ) {
+                       if ( !is_null( $params['title'] ) ) {
+                               $title = Title::newFromText( $params['title'] );
+                               if ( !$title ) {
+                                       $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+                               }
+                       } else {
+                               $title = Title::newFromText( 'API' );
+                       }
+               }
+
+               $prop = array_flip( (array)$params['prop'] );
+
+               // Determine which messages should we print
+               if ( in_array( '*', $params['messages'] ) ) {
+                       $message_names = Language::getMessageKeysFor( $langObj->getCode() );
+                       if ( $params['includelocal'] ) {
+                               global $wgLanguageCode;
+                               $message_names = array_unique( array_merge(
+                                       $message_names,
+                                       // Pass in the content language code so we get local messages that have a
+                                       // MediaWiki:msgkey page. We might theoretically miss messages that have no
+                                       // MediaWiki:msgkey page but do have a MediaWiki:msgkey/lang page, but that's
+                                       // just a stupid case.
+                                       MessageCache::singleton()->getAllMessageKeys( $wgLanguageCode )
+                               ) );
+                       }
+                       sort( $message_names );
+                       $messages_target = $message_names;
+               } else {
+                       $messages_target = $params['messages'];
+               }
+
+               // Filter messages that have the specified prefix
+               // Because we sorted the message array earlier, they will appear in a clump:
+               if ( isset( $params['prefix'] ) ) {
+                       $skip = false;
+                       $messages_filtered = array();
+                       foreach ( $messages_target as $message ) {
+                               // === 0: must be at beginning of string (position 0)
+                               if ( strpos( $message, $params['prefix'] ) === 0 ) {
+                                       if( !$skip ) {
+                                               $skip = true;
+                                       }
+                                       $messages_filtered[] = $message;
+                               } elseif ( $skip ) {
+                                       break;
+                               }
+                       }
+                       $messages_target = $messages_filtered;
+               }
+
+               // Filter messages that contain specified string
+               if ( isset( $params['filter'] ) ) {
+                       $messages_filtered = array();
+                       foreach ( $messages_target as $message ) {
+                               // !== is used because filter can be at the beginning of the string
+                               if ( strpos( $message, $params['filter'] ) !== false ) {
+                                       $messages_filtered[] = $message;
+                               }
+                       }
+                       $messages_target = $messages_filtered;
+               }
+
+               // Whether we have any sort of message customisation filtering
+               $customiseFilterEnabled = $params['customised'] !== 'all';
+               if ( $customiseFilterEnabled ) {
+                       global $wgContLang;
+                       $lang = $langObj->getCode();
+
+                       $customisedMessages = AllmessagesTablePager::getCustomisedStatuses(
+                               array_map( array( $langObj, 'ucfirst'), $messages_target ), $lang, $lang != $wgContLang->getCode() );
+
+                       $customised = $params['customised'] === 'modified';
+               }
+
+               // Get all requested messages and print the result
+               $skip = !is_null( $params['from'] );
+               $useto = !is_null( $params['to'] );
+               $result = $this->getResult();
+               foreach ( $messages_target as $message ) {
+                       // Skip all messages up to $params['from']
+                       if ( $skip && $message === $params['from'] ) {
+                               $skip = false;
+                       }
+
+                       if ( $useto && $message > $params['to'] ) {
+                               break;
+                       }
+
+                       if ( !$skip ) {
+                               $a = array( 'name' => $message );
+                               $args = array();
+                               if ( isset( $params['args'] ) && count( $params['args'] ) != 0 ) {
+                                       $args = $params['args'];
+                               }
+
+                               if ( $customiseFilterEnabled ) {
+                                       $messageIsCustomised = isset( $customisedMessages['pages'][ $langObj->ucfirst( $message ) ] );
+                                       if ( $customised === $messageIsCustomised ) {
+                                               if ( $customised ) {
+                                                       $a['customised'] = '';
+                                               }
+                                       } else {
+                                               continue;
+                                       }
+                               }
+
+                               $msg = wfMessage( $message, $args )->inLanguage( $langObj );
+
+                               if ( !$msg->exists() ) {
+                                       $a['missing'] = '';
+                               } else {
+                                       // Check if the parser is enabled:
+                                       if ( $params['enableparser'] ) {
+                                               $msgString = $msg->title( $title )->text();
+                                       } else {
+                                               $msgString = $msg->plain();
+                                       }
+                                       if ( !$params['nocontent'] ) {
+                                               ApiResult::setContent( $a, $msgString );
+                                       }
+                                       if ( isset( $prop['default'] ) ) {
+                                               $default = wfMessage( $message )->inLanguage( $langObj )->useDatabase( false );
+                                               if ( !$default->exists() ) {
+                                                       $a['defaultmissing'] = '';
+                                               } elseif ( $default->plain() != $msgString ) {
+                                                       $a['default'] = $default->plain();
+                                               }
+                                       }
+                               }
+                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $a );
+                               if ( !$fit ) {
+                                       $this->setContinueEnumParameter( 'from', $message );
+                                       break;
+                               }
+                       }
+               }
+               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'message' );
+       }
+
+       public function getCacheMode( $params ) {
+               if ( is_null( $params['lang'] ) ) {
+                       // Language not specified, will be fetched from preferences
+                       return 'anon-public-user-private';
+               } elseif ( $params['enableparser'] ) {
+                       // User-specific parser options will be used
+                       return 'anon-public-user-private';
+               } else {
+                       // OK to cache
+                       return 'public';
+               }
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'messages' => array(
+                               ApiBase::PARAM_DFLT => '*',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
+                       'prop' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_TYPE => array(
+                                       'default'
+                               )
+                       ),
+                       'enableparser' => false,
+                       'nocontent' => false,
+                       'includelocal' => false,
+                       'args' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_ALLOW_DUPLICATES => true,
+                       ),
+                       'filter' => array(),
+                       'customised' => array(
+                               ApiBase::PARAM_DFLT => 'all',
+                               ApiBase::PARAM_TYPE => array(
+                                       'all',
+                                       'modified',
+                                       'unmodified'
+                               )
+                       ),
+                       'lang' => null,
+                       'from' => null,
+                       'to' => null,
+                       'title' => null,
+                       'prefix' => null,
+               );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'messages' => 'Which messages to output. "*" (default) means all messages',
+                       'prop' => 'Which properties to get',
+                       'enableparser' => array( 'Set to enable parser, will preprocess the wikitext of message',
+                                                       'Will substitute magic words, handle templates etc.' ),
+                       'nocontent' => 'If set, do not include the content of the messages in the output.',
+                       'includelocal' => array( "Also include local messages, i.e. messages that don't exist in the software but do exist as a MediaWiki: page.",
+                                                       "This lists all MediaWiki: pages, so it will also list those that aren't 'really' messages such as Common.js",
+                       ),
+                       'title' => 'Page name to use as context when parsing message (for enableparser option)',
+                       'args' => 'Arguments to be substituted into message',
+                       'prefix' => 'Return messages with this prefix',
+                       'filter' => 'Return only messages with names that contain this string',
+                       'customised' => 'Return only messages in this customisation state',
+                       'lang' => 'Return messages in this language',
+                       'from' => 'Return messages starting at this message',
+                       'to' => 'Return messages ending at this message',
+               );
+       }
+
+       public function getDescription() {
+               return 'Return messages from this site';
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=query&meta=allmessages&amprefix=ipb-',
+                       'api.php?action=query&meta=allmessages&ammessages=august|mainpage&amlang=de',
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Meta#allmessages_.2F_am';
+       }
+
+       public function getVersion() {
+               return __CLASS__ . ': $Id$';
+       }
+}
diff --git a/includes/api/ApiQueryAllPages.php b/includes/api/ApiQueryAllPages.php
new file mode 100644 (file)
index 0000000..f3254c5
--- /dev/null
@@ -0,0 +1,333 @@
+<?php
+/**
+ *
+ *
+ * Created on Sep 25, 2006
+ *
+ * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Query module to enumerate all available pages.
+ *
+ * @ingroup API
+ */
+class ApiQueryAllPages extends ApiQueryGeneratorBase {
+
+       public function __construct( $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'ap' );
+       }
+
+       public function execute() {
+               $this->run();
+       }
+
+       public function getCacheMode( $params ) {
+               return 'public';
+       }
+
+       /**
+        * @param $resultPageSet ApiPageSet
+        * @return void
+        */
+       public function executeGenerator( $resultPageSet ) {
+               if ( $resultPageSet->isResolvingRedirects() ) {
+                       $this->dieUsage( 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator', 'params' );
+               }
+
+               $this->run( $resultPageSet );
+       }
+
+       /**
+        * @param $resultPageSet ApiPageSet
+        * @return void
+        */
+       private function run( $resultPageSet = null ) {
+               $db = $this->getDB();
+
+               $params = $this->extractRequestParams();
+
+               // Page filters
+               $this->addTables( 'page' );
+
+               if ( $params['filterredir'] == 'redirects' ) {
+                       $this->addWhereFld( 'page_is_redirect', 1 );
+               } elseif ( $params['filterredir'] == 'nonredirects' ) {
+                       $this->addWhereFld( 'page_is_redirect', 0 );
+               }
+
+               $this->addWhereFld( 'page_namespace', $params['namespace'] );
+               $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
+               $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
+               $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
+               $this->addWhereRange( 'page_title', $dir, $from, $to );
+
+               if ( isset( $params['prefix'] ) ) {
+                       $this->addWhere( 'page_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+               }
+
+               if ( is_null( $resultPageSet ) ) {
+                       $selectFields = array(
+                               'page_namespace',
+                               'page_title',
+                               'page_id'
+                       );
+               } else {
+                       $selectFields = $resultPageSet->getPageTableFields();
+               }
+
+               $this->addFields( $selectFields );
+               $forceNameTitleIndex = true;
+               if ( isset( $params['minsize'] ) ) {
+                       $this->addWhere( 'page_len>=' . intval( $params['minsize'] ) );
+                       $forceNameTitleIndex = false;
+               }
+
+               if ( isset( $params['maxsize'] ) ) {
+                       $this->addWhere( 'page_len<=' . intval( $params['maxsize'] ) );
+                       $forceNameTitleIndex = false;
+               }
+
+               // Page protection filtering
+               if ( count( $params['prtype'] ) || $params['prexpiry'] != 'all' ) {
+                       $this->addTables( 'page_restrictions' );
+                       $this->addWhere( 'page_id=pr_page' );
+                       $this->addWhere( 'pr_expiry>' . $db->addQuotes( $db->timestamp() ) );
+
+                       if ( count( $params['prtype'] ) ) {
+                               $this->addWhereFld( 'pr_type', $params['prtype'] );
+
+                               if ( isset( $params['prlevel'] ) ) {
+                                       // Remove the empty string and '*' from the prlevel array
+                                       $prlevel = array_diff( $params['prlevel'], array( '', '*' ) );
+
+                                       if ( count( $prlevel ) ) {
+                                               $this->addWhereFld( 'pr_level', $prlevel );
+                                       }
+                               }
+                               if ( $params['prfiltercascade'] == 'cascading' ) {
+                                       $this->addWhereFld( 'pr_cascade', 1 );
+                               } elseif ( $params['prfiltercascade'] == 'noncascading' ) {
+                                       $this->addWhereFld( 'pr_cascade', 0 );
+                               }
+
+                               $this->addOption( 'DISTINCT' );
+                       }
+                       $forceNameTitleIndex = false;
+
+                       if ( $params['prexpiry'] == 'indefinite' ) {
+                               $this->addWhere( "pr_expiry = {$db->addQuotes( $db->getInfinity() )} OR pr_expiry IS NULL" );
+                       } elseif ( $params['prexpiry'] == 'definite' ) {
+                               $this->addWhere( "pr_expiry != {$db->addQuotes( $db->getInfinity() )}" );
+                       }
+
+               } elseif ( isset( $params['prlevel'] ) ) {
+                       $this->dieUsage( 'prlevel may not be used without prtype', 'params' );
+               }
+
+               if ( $params['filterlanglinks'] == 'withoutlanglinks' ) {
+                       $this->addTables( 'langlinks' );
+                       $this->addJoinConds( array( 'langlinks' => array( 'LEFT JOIN', 'page_id=ll_from' ) ) );
+                       $this->addWhere( 'll_from IS NULL' );
+                       $forceNameTitleIndex = false;
+               } elseif ( $params['filterlanglinks'] == 'withlanglinks' ) {
+                       $this->addTables( 'langlinks' );
+                       $this->addWhere( 'page_id=ll_from' );
+                       $this->addOption( 'STRAIGHT_JOIN' );
+                       // We have to GROUP BY all selected fields to stop
+                       // PostgreSQL from whining
+                       $this->addOption( 'GROUP BY', implode( ', ', $selectFields ) );
+                       $forceNameTitleIndex = false;
+               }
+
+               if ( $forceNameTitleIndex ) {
+                       $this->addOption( 'USE INDEX', 'name_title' );
+               }
+
+               $limit = $params['limit'];
+               $this->addOption( 'LIMIT', $limit + 1 );
+               $res = $this->select( __METHOD__ );
+
+               $count = 0;
+               $result = $this->getResult();
+               foreach ( $res as $row ) {
+                       if ( ++ $count > $limit ) {
+                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
+                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) );
+                               break;
+                       }
+
+                       if ( is_null( $resultPageSet ) ) {
+                               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+                               $vals = array(
+                                       'pageid' => intval( $row->page_id ),
+                                       'ns' => intval( $title->getNamespace() ),
+                                       'title' => $title->getPrefixedText()
+                               );
+                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
+                               if ( !$fit ) {
+                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) );
+                                       break;
+                               }
+                       } else {
+                               $resultPageSet->processDbRow( $row );
+                       }
+               }
+
+               if ( is_null( $resultPageSet ) ) {
+                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'p' );
+               }
+       }
+
+       public function getAllowedParams() {
+               global $wgRestrictionLevels;
+
+               return array(
+                       'from' => null,
+                       'to' => null,
+                       'prefix' => null,
+                       'namespace' => array(
+                               ApiBase::PARAM_DFLT => 0,
+                               ApiBase::PARAM_TYPE => 'namespace',
+                       ),
+                       'filterredir' => array(
+                               ApiBase::PARAM_DFLT => 'all',
+                               ApiBase::PARAM_TYPE => array(
+                                       'all',
+                                       'redirects',
+                                       'nonredirects'
+                               )
+                       ),
+                       'minsize' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                       ),
+                       'maxsize' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                       ),
+                       'prtype' => array(
+                               ApiBase::PARAM_TYPE => Title::getFilteredRestrictionTypes( true ),
+                               ApiBase::PARAM_ISMULTI => true
+                       ),
+                       'prlevel' => array(
+                               ApiBase::PARAM_TYPE => $wgRestrictionLevels,
+                               ApiBase::PARAM_ISMULTI => true
+                       ),
+                       'prfiltercascade' => array(
+                               ApiBase::PARAM_DFLT => 'all',
+                               ApiBase::PARAM_TYPE => array(
+                                       'cascading',
+                                       'noncascading',
+                                       'all'
+                               ),
+                       ),
+                       'limit' => array(
+                               ApiBase::PARAM_DFLT => 10,
+                               ApiBase::PARAM_TYPE => 'limit',
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+                       ),
+                       'dir' => array(
+                               ApiBase::PARAM_DFLT => 'ascending',
+                               ApiBase::PARAM_TYPE => array(
+                                       'ascending',
+                                       'descending'
+                               )
+                       ),
+                       'filterlanglinks' => array(
+                               ApiBase::PARAM_TYPE => array(
+                                       'withlanglinks',
+                                       'withoutlanglinks',
+                                       'all'
+                               ),
+                               ApiBase::PARAM_DFLT => 'all'
+                       ),
+                       'prexpiry' => array(
+                               ApiBase::PARAM_TYPE => array(
+                                       'indefinite',
+                                       'definite',
+                                       'all'
+                               ),
+                               ApiBase::PARAM_DFLT => 'all'
+                       ),
+               );
+       }
+
+       public function getParamDescription() {
+               $p = $this->getModulePrefix();
+               return array(
+                       'from' => 'The page title to start enumerating from',
+                       'to' => 'The page title to stop enumerating at',
+                       'prefix' => 'Search for all page titles that begin with this value',
+                       'namespace' => 'The namespace to enumerate',
+                       'filterredir' => 'Which pages to list',
+                       'dir' => 'The direction in which to list',
+                       'minsize' => 'Limit to pages with at least this many bytes',
+                       'maxsize' => 'Limit to pages with at most this many bytes',
+                       'prtype' => 'Limit to protected pages only',
+                       'prlevel' => "The protection level (must be used with {$p}prtype= parameter)",
+                       'prfiltercascade' => "Filter protections based on cascadingness (ignored when {$p}prtype isn't set)",
+                       'filterlanglinks' => 'Filter based on whether a page has langlinks',
+                       'limit' => 'How many total pages to return.',
+                       'prexpiry' => array(
+                               'Which protection expiry to filter the page on',
+                               ' indefinite - Get only pages with indefinite protection expiry',
+                               ' definite - Get only pages with a definite (specific) protection expiry',
+                               ' all - Get pages with any protections expiry'
+                       ),
+               );
+       }
+
+       public function getDescription() {
+               return 'Enumerate all pages sequentially in a given namespace';
+       }
+
+       public function getPossibleErrors() {
+               return array_merge( parent::getPossibleErrors(), array(
+                       array( 'code' => 'params', 'info' => 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator' ),
+                       array( 'code' => 'params', 'info' => 'prlevel may not be used without prtype' ),
+               ) );
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=query&list=allpages&apfrom=B' => array(
+                               'Simple Use',
+                               'Show a list of pages starting at the letter "B"',
+                       ),
+                       'api.php?action=query&generator=allpages&gaplimit=4&gapfrom=T&prop=info' => array(
+                               'Using as Generator',
+                               'Show info about 4 pages starting at the letter "T"',
+                       ),
+                       'api.php?action=query&generator=allpages&gaplimit=2&gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content' => array(
+                               'Show content of first 2 non-redirect pages begining at "Re"',
+                       )
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Allpages';
+       }
+
+       public function getVersion() {
+               return __CLASS__ . ': $Id$';
+       }
+}
diff --git a/includes/api/ApiQueryAllimages.php b/includes/api/ApiQueryAllimages.php
deleted file mode 100644 (file)
index ca344f7..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-<?php
-
-/**
- * API for MediaWiki 1.12+
- *
- * Created on Mar 16, 2008
- *
- * Copyright © 2008 Vasiliev Victor vasilvv@gmail.com,
- * based on ApiQueryAllpages.php
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Query module to enumerate all available pages.
- *
- * @ingroup API
- */
-class ApiQueryAllimages extends ApiQueryGeneratorBase {
-
-       protected $mRepo;
-
-       public function __construct( $query, $moduleName ) {
-               parent::__construct( $query, $moduleName, 'ai' );
-               $this->mRepo = RepoGroup::singleton()->getLocalRepo();
-       }
-
-       /**
-        * Override parent method to make sure to make sure the repo's DB is used
-        * which may not necesarilly be the same as the local DB.
-        *
-        * TODO: allow querying non-local repos.
-        * @return DatabaseBase
-        */
-       protected function getDB() {
-               return $this->mRepo->getSlaveDB();
-       }
-
-       public function execute() {
-               $this->run();
-       }
-
-       public function getCacheMode( $params ) {
-               return 'public';
-       }
-
-       /**
-        * @param $resultPageSet ApiPageSet
-        * @return void
-        */
-       public function executeGenerator( $resultPageSet ) {
-               if ( $resultPageSet->isResolvingRedirects() ) {
-                       $this->dieUsage( 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator', 'params' );
-               }
-
-               $this->run( $resultPageSet );
-       }
-
-       /**
-        * @param $resultPageSet ApiPageSet
-        * @return void
-        */
-       private function run( $resultPageSet = null ) {
-               $repo = $this->mRepo;
-               if ( !$repo instanceof LocalRepo ) {
-                       $this->dieUsage( 'Local file repository does not support querying all images', 'unsupportedrepo' );
-               }
-
-               $db = $this->getDB();
-
-               $params = $this->extractRequestParams();
-
-               // Image filters
-               $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
-               $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
-               $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
-               $this->addWhereRange( 'img_name', $dir, $from, $to );
-
-               if ( isset( $params['prefix'] ) )
-                       $this->addWhere( 'img_name' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
-
-               if ( isset( $params['minsize'] ) ) {
-                       $this->addWhere( 'img_size>=' . intval( $params['minsize'] ) );
-               }
-
-               if ( isset( $params['maxsize'] ) ) {
-                       $this->addWhere( 'img_size<=' . intval( $params['maxsize'] ) );
-               }
-
-               $sha1 = false;
-               if ( isset( $params['sha1'] ) ) {
-                       if ( !$this->validateSha1Hash( $params['sha1'] ) ) {
-                               $this->dieUsage( 'The SHA1 hash provided is not valid', 'invalidsha1hash' );
-                       }
-                       $sha1 = wfBaseConvert( $params['sha1'], 16, 36, 31 );
-               } elseif ( isset( $params['sha1base36'] ) ) {
-                       $sha1 = $params['sha1base36'];
-                       if ( !$this->validateSha1Base36Hash( $sha1 ) ) {
-                               $this->dieUsage( 'The SHA1Base36 hash provided is not valid', 'invalidsha1base36hash' );
-                       }
-               }
-               if ( $sha1 ) {
-                       $this->addWhereFld( 'img_sha1', $sha1 );
-               }
-
-               if ( !is_null( $params['mime'] ) ) {
-                       global $wgMiserMode;
-                       if ( $wgMiserMode  ) {
-                               $this->dieUsage( 'MIME search disabled in Miser Mode', 'mimesearchdisabled' );
-                       }
-
-                       list( $major, $minor ) = File::splitMime( $params['mime'] );
-
-                       $this->addWhereFld( 'img_major_mime', $major );
-                       $this->addWhereFld( 'img_minor_mime', $minor );
-               }
-
-               $this->addTables( 'image' );
-
-               $prop = array_flip( $params['prop'] );
-               $this->addFields( LocalFile::selectFields() );
-
-               $limit = $params['limit'];
-               $this->addOption( 'LIMIT', $limit + 1 );
-               $this->addOption( 'ORDER BY', 'img_name' .
-                                               ( $params['dir'] == 'descending' ? ' DESC' : '' ) );
-
-               $res = $this->select( __METHOD__ );
-
-               $titles = array();
-               $count = 0;
-               $result = $this->getResult();
-               foreach ( $res as $row ) {
-                       if ( ++ $count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
-                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->img_name ) );
-                               break;
-                       }
-
-                       if ( is_null( $resultPageSet ) ) {
-                               $file = $repo->newFileFromRow( $row );
-                               $info = array_merge( array( 'name' => $row->img_name ),
-                                       ApiQueryImageInfo::getInfo( $file, $prop, $result ) );
-                               self::addTitleInfo( $info, $file->getTitle() );
-
-                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $info );
-                               if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->img_name ) );
-                                       break;
-                               }
-                       } else {
-                               $titles[] = Title::makeTitle( NS_IMAGE, $row->img_name );
-                       }
-               }
-
-               if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'img' );
-               } else {
-                       $resultPageSet->populateFromTitles( $titles );
-               }
-       }
-
-       public function getAllowedParams() {
-               return array (
-                       'from' => null,
-                       'to' => null,
-                       'prefix' => null,
-                       'minsize' => array(
-                               ApiBase::PARAM_TYPE => 'integer',
-                       ),
-                       'maxsize' => array(
-                               ApiBase::PARAM_TYPE => 'integer',
-                       ),
-                       'limit' => array(
-                               ApiBase::PARAM_DFLT => 10,
-                               ApiBase::PARAM_TYPE => 'limit',
-                               ApiBase::PARAM_MIN => 1,
-                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
-                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
-                       ),
-                       'dir' => array(
-                               ApiBase::PARAM_DFLT => 'ascending',
-                               ApiBase::PARAM_TYPE => array(
-                                       'ascending',
-                                       'descending'
-                               )
-                       ),
-                       'sha1' => null,
-                       'sha1base36' => null,
-                       'prop' => array(
-                               ApiBase::PARAM_TYPE => ApiQueryImageInfo::getPropertyNames( $this->propertyFilter ),
-                               ApiBase::PARAM_DFLT => 'timestamp|url',
-                               ApiBase::PARAM_ISMULTI => true
-                       ),
-                       'mime' => null,
-               );
-       }
-
-       public function getParamDescription() {
-               return array(
-                       'from' => 'The image title to start enumerating from',
-                       'to' => 'The image title to stop enumerating at',
-                       'prefix' => 'Search for all image titles that begin with this value',
-                       'dir' => 'The direction in which to list',
-                       'minsize' => 'Limit to images with at least this many bytes',
-                       'maxsize' => 'Limit to images with at most this many bytes',
-                       'limit' => 'How many images in total to return',
-                       'sha1' => "SHA1 hash of image. Overrides {$this->getModulePrefix()}sha1base36",
-                       'sha1base36' => 'SHA1 hash of image in base 36 (used in MediaWiki)',
-                       'prop' => ApiQueryImageInfo::getPropertyDescriptions( $this->propertyFilter ),
-                       'mime' => 'What MIME type to search for. e.g. image/jpeg. Disabled in Miser Mode',
-               );
-       }
-
-       private $propertyFilter = array( 'archivename' );
-
-       public function getDescription() {
-               return 'Enumerate all images sequentially';
-       }
-
-       public function getPossibleErrors() {
-               return array_merge( parent::getPossibleErrors(), array(
-                       array( 'code' => 'params', 'info' => 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator' ),
-                       array( 'code' => 'unsupportedrepo', 'info' => 'Local file repository does not support querying all images' ),
-                       array( 'code' => 'mimesearchdisabled', 'info' => 'MIME search disabled in Miser Mode' ),
-                       array( 'code' => 'invalidsha1hash', 'info' => 'The SHA1 hash provided is not valid' ),
-                       array( 'code' => 'invalidsha1base36hash', 'info' => 'The SHA1Base36 hash provided is not valid' ),
-               ) );
-       }
-
-       public function getExamples() {
-               return array(
-                       'api.php?action=query&list=allimages&aifrom=B' => array(
-                               'Simple Use',
-                               'Show a list of images starting at the letter "B"',
-                       ),
-                       'api.php?action=query&generator=allimages&gailimit=4&gaifrom=T&prop=imageinfo' => array(
-                               'Using as Generator',
-                               'Show info about 4 images starting at the letter "T"',
-                       ),
-               );
-       }
-
-       public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allimages';
-       }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
-}
diff --git a/includes/api/ApiQueryAllmessages.php b/includes/api/ApiQueryAllmessages.php
deleted file mode 100644 (file)
index 4477492..0000000
+++ /dev/null
@@ -1,277 +0,0 @@
-<?php
-/**
- *
- *
- * Created on Dec 1, 2007
- *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * A query action to return messages from site message cache
- *
- * @ingroup API
- */
-class ApiQueryAllmessages extends ApiQueryBase {
-
-       public function __construct( $query, $moduleName ) {
-               parent::__construct( $query, $moduleName, 'am' );
-       }
-
-       public function execute() {
-               $params = $this->extractRequestParams();
-
-               if ( is_null( $params['lang'] ) ) {
-                       global $wgLang;
-                       $langObj = $wgLang;
-               } else {
-                       $langObj = Language::factory( $params['lang'] );
-               }
-
-               if ( $params['enableparser'] ) {
-                       if ( !is_null( $params['title'] ) ) {
-                               $title = Title::newFromText( $params['title'] );
-                               if ( !$title ) {
-                                       $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
-                               }
-                       } else {
-                               $title = Title::newFromText( 'API' );
-                       }
-               }
-
-               $prop = array_flip( (array)$params['prop'] );
-
-               // Determine which messages should we print
-               if ( in_array( '*', $params['messages'] ) ) {
-                       $message_names = Language::getMessageKeysFor( $langObj->getCode() );
-                       if ( $params['includelocal'] ) {
-                               global $wgLanguageCode;
-                               $message_names = array_unique( array_merge(
-                                       $message_names,
-                                       // Pass in the content language code so we get local messages that have a
-                                       // MediaWiki:msgkey page. We might theoretically miss messages that have no
-                                       // MediaWiki:msgkey page but do have a MediaWiki:msgkey/lang page, but that's
-                                       // just a stupid case.
-                                       MessageCache::singleton()->getAllMessageKeys( $wgLanguageCode )
-                               ) );
-                       }
-                       sort( $message_names );
-                       $messages_target = $message_names;
-               } else {
-                       $messages_target = $params['messages'];
-               }
-
-               // Filter messages that have the specified prefix
-               // Because we sorted the message array earlier, they will appear in a clump:
-               if ( isset( $params['prefix'] ) ) {
-                       $skip = false;
-                       $messages_filtered = array();
-                       foreach ( $messages_target as $message ) {
-                               // === 0: must be at beginning of string (position 0)
-                               if ( strpos( $message, $params['prefix'] ) === 0 ) {
-                                       if( !$skip ) {
-                                               $skip = true;
-                                       }
-                                       $messages_filtered[] = $message;
-                               } elseif ( $skip ) {
-                                       break;
-                               }
-                       }
-                       $messages_target = $messages_filtered;
-               }
-
-               // Filter messages that contain specified string
-               if ( isset( $params['filter'] ) ) {
-                       $messages_filtered = array();
-                       foreach ( $messages_target as $message ) {
-                               // !== is used because filter can be at the beginning of the string
-                               if ( strpos( $message, $params['filter'] ) !== false ) {
-                                       $messages_filtered[] = $message;
-                               }
-                       }
-                       $messages_target = $messages_filtered;
-               }
-
-               // Whether we have any sort of message customisation filtering
-               $customiseFilterEnabled = $params['customised'] !== 'all';
-               if ( $customiseFilterEnabled ) {
-                       global $wgContLang;
-                       $lang = $langObj->getCode();
-
-                       $customisedMessages = AllmessagesTablePager::getCustomisedStatuses(
-                               array_map( array( $langObj, 'ucfirst'), $messages_target ), $lang, $lang != $wgContLang->getCode() );
-
-                       $customised = $params['customised'] === 'modified';
-               }
-
-               // Get all requested messages and print the result
-               $skip = !is_null( $params['from'] );
-               $useto = !is_null( $params['to'] );
-               $result = $this->getResult();
-               foreach ( $messages_target as $message ) {
-                       // Skip all messages up to $params['from']
-                       if ( $skip && $message === $params['from'] ) {
-                               $skip = false;
-                       }
-
-                       if ( $useto && $message > $params['to'] ) {
-                               break;
-                       }
-
-                       if ( !$skip ) {
-                               $a = array( 'name' => $message );
-                               $args = array();
-                               if ( isset( $params['args'] ) && count( $params['args'] ) != 0 ) {
-                                       $args = $params['args'];
-                               }
-
-                               if ( $customiseFilterEnabled ) {
-                                       $messageIsCustomised = isset( $customisedMessages['pages'][ $langObj->ucfirst( $message ) ] );
-                                       if ( $customised === $messageIsCustomised ) {
-                                               if ( $customised ) {
-                                                       $a['customised'] = '';
-                                               }
-                                       } else {
-                                               continue;
-                                       }
-                               }
-
-                               $msg = wfMessage( $message, $args )->inLanguage( $langObj );
-
-                               if ( !$msg->exists() ) {
-                                       $a['missing'] = '';
-                               } else {
-                                       // Check if the parser is enabled:
-                                       if ( $params['enableparser'] ) {
-                                               $msgString = $msg->title( $title )->text();
-                                       } else {
-                                               $msgString = $msg->plain();
-                                       }
-                                       if ( !$params['nocontent'] ) {
-                                               ApiResult::setContent( $a, $msgString );
-                                       }
-                                       if ( isset( $prop['default'] ) ) {
-                                               $default = wfMessage( $message )->inLanguage( $langObj )->useDatabase( false );
-                                               if ( !$default->exists() ) {
-                                                       $a['defaultmissing'] = '';
-                                               } elseif ( $default->plain() != $msgString ) {
-                                                       $a['default'] = $default->plain();
-                                               }
-                                       }
-                               }
-                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $a );
-                               if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'from', $message );
-                                       break;
-                               }
-                       }
-               }
-               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'message' );
-       }
-
-       public function getCacheMode( $params ) {
-               if ( is_null( $params['lang'] ) ) {
-                       // Language not specified, will be fetched from preferences
-                       return 'anon-public-user-private';
-               } elseif ( $params['enableparser'] ) {
-                       // User-specific parser options will be used
-                       return 'anon-public-user-private';
-               } else {
-                       // OK to cache
-                       return 'public';
-               }
-       }
-
-       public function getAllowedParams() {
-               return array(
-                       'messages' => array(
-                               ApiBase::PARAM_DFLT => '*',
-                               ApiBase::PARAM_ISMULTI => true,
-                       ),
-                       'prop' => array(
-                               ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => array(
-                                       'default'
-                               )
-                       ),
-                       'enableparser' => false,
-                       'nocontent' => false,
-                       'includelocal' => false,
-                       'args' => array(
-                               ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_ALLOW_DUPLICATES => true,
-                       ),
-                       'filter' => array(),
-                       'customised' => array(
-                               ApiBase::PARAM_DFLT => 'all',
-                               ApiBase::PARAM_TYPE => array(
-                                       'all',
-                                       'modified',
-                                       'unmodified'
-                               )
-                       ),
-                       'lang' => null,
-                       'from' => null,
-                       'to' => null,
-                       'title' => null,
-                       'prefix' => null,
-               );
-       }
-
-       public function getParamDescription() {
-               return array(
-                       'messages' => 'Which messages to output. "*" (default) means all messages',
-                       'prop' => 'Which properties to get',
-                       'enableparser' => array( 'Set to enable parser, will preprocess the wikitext of message',
-                                                       'Will substitute magic words, handle templates etc.' ),
-                       'nocontent' => 'If set, do not include the content of the messages in the output.',
-                       'includelocal' => array( "Also include local messages, i.e. messages that don't exist in the software but do exist as a MediaWiki: page.",
-                                                       "This lists all MediaWiki: pages, so it will also list those that aren't 'really' messages such as Common.js",
-                       ),
-                       'title' => 'Page name to use as context when parsing message (for enableparser option)',
-                       'args' => 'Arguments to be substituted into message',
-                       'prefix' => 'Return messages with this prefix',
-                       'filter' => 'Return only messages with names that contain this string',
-                       'customised' => 'Return only messages in this customisation state',
-                       'lang' => 'Return messages in this language',
-                       'from' => 'Return messages starting at this message',
-                       'to' => 'Return messages ending at this message',
-               );
-       }
-
-       public function getDescription() {
-               return 'Return messages from this site';
-       }
-
-       public function getExamples() {
-               return array(
-                       'api.php?action=query&meta=allmessages&amprefix=ipb-',
-                       'api.php?action=query&meta=allmessages&ammessages=august|mainpage&amlang=de',
-               );
-       }
-
-       public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Meta#allmessages_.2F_am';
-       }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
-}
diff --git a/includes/api/ApiQueryAllpages.php b/includes/api/ApiQueryAllpages.php
deleted file mode 100644 (file)
index e003ee9..0000000
+++ /dev/null
@@ -1,333 +0,0 @@
-<?php
-/**
- *
- *
- * Created on Sep 25, 2006
- *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Query module to enumerate all available pages.
- *
- * @ingroup API
- */
-class ApiQueryAllpages extends ApiQueryGeneratorBase {
-
-       public function __construct( $query, $moduleName ) {
-               parent::__construct( $query, $moduleName, 'ap' );
-       }
-
-       public function execute() {
-               $this->run();
-       }
-
-       public function getCacheMode( $params ) {
-               return 'public';
-       }
-
-       /**
-        * @param $resultPageSet ApiPageSet
-        * @return void
-        */
-       public function executeGenerator( $resultPageSet ) {
-               if ( $resultPageSet->isResolvingRedirects() ) {
-                       $this->dieUsage( 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator', 'params' );
-               }
-
-               $this->run( $resultPageSet );
-       }
-
-       /**
-        * @param $resultPageSet ApiPageSet
-        * @return void
-        */
-       private function run( $resultPageSet = null ) {
-               $db = $this->getDB();
-
-               $params = $this->extractRequestParams();
-
-               // Page filters
-               $this->addTables( 'page' );
-
-               if ( $params['filterredir'] == 'redirects' ) {
-                       $this->addWhereFld( 'page_is_redirect', 1 );
-               } elseif ( $params['filterredir'] == 'nonredirects' ) {
-                       $this->addWhereFld( 'page_is_redirect', 0 );
-               }
-
-               $this->addWhereFld( 'page_namespace', $params['namespace'] );
-               $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
-               $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
-               $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
-               $this->addWhereRange( 'page_title', $dir, $from, $to );
-
-               if ( isset( $params['prefix'] ) ) {
-                       $this->addWhere( 'page_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
-               }
-
-               if ( is_null( $resultPageSet ) ) {
-                       $selectFields = array(
-                               'page_namespace',
-                               'page_title',
-                               'page_id'
-                       );
-               } else {
-                       $selectFields = $resultPageSet->getPageTableFields();
-               }
-
-               $this->addFields( $selectFields );
-               $forceNameTitleIndex = true;
-               if ( isset( $params['minsize'] ) ) {
-                       $this->addWhere( 'page_len>=' . intval( $params['minsize'] ) );
-                       $forceNameTitleIndex = false;
-               }
-
-               if ( isset( $params['maxsize'] ) ) {
-                       $this->addWhere( 'page_len<=' . intval( $params['maxsize'] ) );
-                       $forceNameTitleIndex = false;
-               }
-
-               // Page protection filtering
-               if ( count( $params['prtype'] ) || $params['prexpiry'] != 'all' ) {
-                       $this->addTables( 'page_restrictions' );
-                       $this->addWhere( 'page_id=pr_page' );
-                       $this->addWhere( 'pr_expiry>' . $db->addQuotes( $db->timestamp() ) );
-
-                       if ( count( $params['prtype'] ) ) {
-                               $this->addWhereFld( 'pr_type', $params['prtype'] );
-
-                               if ( isset( $params['prlevel'] ) ) {
-                                       // Remove the empty string and '*' from the prlevel array
-                                       $prlevel = array_diff( $params['prlevel'], array( '', '*' ) );
-
-                                       if ( count( $prlevel ) ) {
-                                               $this->addWhereFld( 'pr_level', $prlevel );
-                                       }
-                               }
-                               if ( $params['prfiltercascade'] == 'cascading' ) {
-                                       $this->addWhereFld( 'pr_cascade', 1 );
-                               } elseif ( $params['prfiltercascade'] == 'noncascading' ) {
-                                       $this->addWhereFld( 'pr_cascade', 0 );
-                               }
-
-                               $this->addOption( 'DISTINCT' );
-                       }
-                       $forceNameTitleIndex = false;
-
-                       if ( $params['prexpiry'] == 'indefinite' ) {
-                               $this->addWhere( "pr_expiry = {$db->addQuotes( $db->getInfinity() )} OR pr_expiry IS NULL" );
-                       } elseif ( $params['prexpiry'] == 'definite' ) {
-                               $this->addWhere( "pr_expiry != {$db->addQuotes( $db->getInfinity() )}" );
-                       }
-
-               } elseif ( isset( $params['prlevel'] ) ) {
-                       $this->dieUsage( 'prlevel may not be used without prtype', 'params' );
-               }
-
-               if ( $params['filterlanglinks'] == 'withoutlanglinks' ) {
-                       $this->addTables( 'langlinks' );
-                       $this->addJoinConds( array( 'langlinks' => array( 'LEFT JOIN', 'page_id=ll_from' ) ) );
-                       $this->addWhere( 'll_from IS NULL' );
-                       $forceNameTitleIndex = false;
-               } elseif ( $params['filterlanglinks'] == 'withlanglinks' ) {
-                       $this->addTables( 'langlinks' );
-                       $this->addWhere( 'page_id=ll_from' );
-                       $this->addOption( 'STRAIGHT_JOIN' );
-                       // We have to GROUP BY all selected fields to stop
-                       // PostgreSQL from whining
-                       $this->addOption( 'GROUP BY', implode( ', ', $selectFields ) );
-                       $forceNameTitleIndex = false;
-               }
-
-               if ( $forceNameTitleIndex ) {
-                       $this->addOption( 'USE INDEX', 'name_title' );
-               }
-
-               $limit = $params['limit'];
-               $this->addOption( 'LIMIT', $limit + 1 );
-               $res = $this->select( __METHOD__ );
-
-               $count = 0;
-               $result = $this->getResult();
-               foreach ( $res as $row ) {
-                       if ( ++ $count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
-                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) );
-                               break;
-                       }
-
-                       if ( is_null( $resultPageSet ) ) {
-                               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-                               $vals = array(
-                                       'pageid' => intval( $row->page_id ),
-                                       'ns' => intval( $title->getNamespace() ),
-                                       'title' => $title->getPrefixedText()
-                               );
-                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
-                               if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) );
-                                       break;
-                               }
-                       } else {
-                               $resultPageSet->processDbRow( $row );
-                       }
-               }
-
-               if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'p' );
-               }
-       }
-
-       public function getAllowedParams() {
-               global $wgRestrictionLevels;
-
-               return array(
-                       'from' => null,
-                       'to' => null,
-                       'prefix' => null,
-                       'namespace' => array(
-                               ApiBase::PARAM_DFLT => 0,
-                               ApiBase::PARAM_TYPE => 'namespace',
-                       ),
-                       'filterredir' => array(
-                               ApiBase::PARAM_DFLT => 'all',
-                               ApiBase::PARAM_TYPE => array(
-                                       'all',
-                                       'redirects',
-                                       'nonredirects'
-                               )
-                       ),
-                       'minsize' => array(
-                               ApiBase::PARAM_TYPE => 'integer',
-                       ),
-                       'maxsize' => array(
-                               ApiBase::PARAM_TYPE => 'integer',
-                       ),
-                       'prtype' => array(
-                               ApiBase::PARAM_TYPE => Title::getFilteredRestrictionTypes( true ),
-                               ApiBase::PARAM_ISMULTI => true
-                       ),
-                       'prlevel' => array(
-                               ApiBase::PARAM_TYPE => $wgRestrictionLevels,
-                               ApiBase::PARAM_ISMULTI => true
-                       ),
-                       'prfiltercascade' => array(
-                               ApiBase::PARAM_DFLT => 'all',
-                               ApiBase::PARAM_TYPE => array(
-                                       'cascading',
-                                       'noncascading',
-                                       'all'
-                               ),
-                       ),
-                       'limit' => array(
-                               ApiBase::PARAM_DFLT => 10,
-                               ApiBase::PARAM_TYPE => 'limit',
-                               ApiBase::PARAM_MIN => 1,
-                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
-                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
-                       ),
-                       'dir' => array(
-                               ApiBase::PARAM_DFLT => 'ascending',
-                               ApiBase::PARAM_TYPE => array(
-                                       'ascending',
-                                       'descending'
-                               )
-                       ),
-                       'filterlanglinks' => array(
-                               ApiBase::PARAM_TYPE => array(
-                                       'withlanglinks',
-                                       'withoutlanglinks',
-                                       'all'
-                               ),
-                               ApiBase::PARAM_DFLT => 'all'
-                       ),
-                       'prexpiry' => array(
-                               ApiBase::PARAM_TYPE => array(
-                                       'indefinite',
-                                       'definite',
-                                       'all'
-                               ),
-                               ApiBase::PARAM_DFLT => 'all'
-                       ),
-               );
-       }
-
-       public function getParamDescription() {
-               $p = $this->getModulePrefix();
-               return array(
-                       'from' => 'The page title to start enumerating from',
-                       'to' => 'The page title to stop enumerating at',
-                       'prefix' => 'Search for all page titles that begin with this value',
-                       'namespace' => 'The namespace to enumerate',
-                       'filterredir' => 'Which pages to list',
-                       'dir' => 'The direction in which to list',
-                       'minsize' => 'Limit to pages with at least this many bytes',
-                       'maxsize' => 'Limit to pages with at most this many bytes',
-                       'prtype' => 'Limit to protected pages only',
-                       'prlevel' => "The protection level (must be used with {$p}prtype= parameter)",
-                       'prfiltercascade' => "Filter protections based on cascadingness (ignored when {$p}prtype isn't set)",
-                       'filterlanglinks' => 'Filter based on whether a page has langlinks',
-                       'limit' => 'How many total pages to return.',
-                       'prexpiry' => array(
-                               'Which protection expiry to filter the page on',
-                               ' indefinite - Get only pages with indefinite protection expiry',
-                               ' definite - Get only pages with a definite (specific) protection expiry',
-                               ' all - Get pages with any protections expiry'
-                       ),
-               );
-       }
-
-       public function getDescription() {
-               return 'Enumerate all pages sequentially in a given namespace';
-       }
-
-       public function getPossibleErrors() {
-               return array_merge( parent::getPossibleErrors(), array(
-                       array( 'code' => 'params', 'info' => 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator' ),
-                       array( 'code' => 'params', 'info' => 'prlevel may not be used without prtype' ),
-               ) );
-       }
-
-       public function getExamples() {
-               return array(
-                       'api.php?action=query&list=allpages&apfrom=B' => array(
-                               'Simple Use',
-                               'Show a list of pages starting at the letter "B"',
-                       ),
-                       'api.php?action=query&generator=allpages&gaplimit=4&gapfrom=T&prop=info' => array(
-                               'Using as Generator',
-                               'Show info about 4 pages starting at the letter "T"',
-                       ),
-                       'api.php?action=query&generator=allpages&gaplimit=2&gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content' => array(
-                               'Show content of first 2 non-redirect pages begining at "Re"',
-                       )
-               );
-       }
-
-       public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allpages';
-       }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
-}
index be995f3..7bf97d3 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright © 2010 Sam Reed
  * Copyright © 2008 Vasiliev Victor vasilvv@gmail.com,
- * based on ApiQueryAllpages.php
+ * based on ApiQueryAllPages.php
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index dcc9610..8fe786a 100644 (file)
@@ -783,6 +783,86 @@ class FileRepo {
                return $status;
        }
 
+       /**
+        * Import a file from the local file system into the repo.
+        * This does no locking nor journaling and overrides existing files.
+        * This is intended for copying generated thumbnails into the repo.
+        *
+        * @param $src string File system path
+        * @param $dst string Virtual URL or storage path
+        * @return FileRepoStatus
+        */
+       final public function quickImport( $src, $dst ) {
+               return $this->quickImportBatch( array( array( $src, $dst ) ) );
+       }
+
+       /**
+        * Purge a file from the repo. This does no locking nor journaling.
+        * This is intended for purging thumbnail.
+        *
+        * @param $path string Virtual URL or storage path
+        * @return FileRepoStatus
+        */
+       final public function quickPurge( $path ) {
+               return $this->quickPurgeBatch( array( $path ) );
+       }
+
+       /**
+        * Import a batch of files from the local file system into the repo.
+        * This does no locking nor journaling and overrides existing files.
+        * This is intended for copying generated thumbnails into the repo.
+        *
+        * @param $src Array List of tuples (file system path, virtual URL or storage path)
+        * @return FileRepoStatus
+        */
+       public function quickImportBatch( array $pairs ) {
+               $this->assertWritableRepo(); // fail out if read-only
+
+               $status = $this->newGood();
+               $operations = array();
+               foreach ( $pairs as $pair ) {
+                       list ( $src, $dst ) = $pair;
+                       $operations[] = array(
+                               'op'        => 'store',
+                               'src'       => $src,
+                               'dst'       => $this->resolveToStoragePath( $dst ),
+                               'overwrite' => true
+                       );
+                       $this->backend->prepare( array( 'dir' => dirname( $dst ) ) );
+               }
+               $status->merge( $this->backend->doOperations( $operations,
+                       array( 'force' => 1, 'nonLocking' => 1, 'allowStale' => 1, 'nonJournaled' => 1 )
+               ) );
+
+               return $status;
+       }
+
+       /**
+        * Purge a batch of files from the repo. This does no locking nor journaling.
+        * This is intended for purging thumbnails.
+        *
+        * @param $path Array List of virtual URLs or storage paths
+        * @return FileRepoStatus
+        */
+       public function quickPurgeBatch( array $paths ) {
+               $this->assertWritableRepo(); // fail out if read-only
+
+               $status = $this->newGood();
+               $operations = array();
+               foreach ( $paths as $path ) {
+                       $operations[] = array(
+                               'op'                  => 'delete',
+                               'src'                 => $this->resolveToStoragePath( $path ),
+                               'ignoreMissingSource' => true
+                       );
+               }
+               $status->merge( $this->backend->doOperations( $operations,
+                       array( 'force' => 1, 'nonLocking' => 1, 'allowStale' => 1, 'nonJournaled' => 1 )
+               ) );
+
+               return $status;
+       }
+
        /**
         * Pick a random name in the temp zone and store a file to it.
         * Returns a FileRepoStatus object with the file Virtual URL in the value,
@@ -927,7 +1007,7 @@ class FileRepo {
                foreach ( $triplets as $i => $triplet ) {
                        list( $srcPath, $dstRel, $archiveRel ) = $triplet;
                        // Resolve source to a storage path if virtual
-                       if ( substr( $srcPath, 0, 9 ) == 'mwrepo://' ) {
+                       if ( $this->isVirtualUrl( $srcPath ) ) {
                                $srcPath = $this->resolveVirtualUrl( $srcPath );
                        }
                        if ( !$this->validateFilename( $dstRel ) ) {
@@ -1012,6 +1092,22 @@ class FileRepo {
                return $status;
        }
 
+       /**
+        * Deletes a directory if empty
+        *
+        * @param $dir string Virtual URL (or storage path) of directory to clean
+        * @return Status
+        */
+       public function cleanDir( $dir ) {
+               $this->assertWritableRepo(); // fail out if read-only
+
+               $status = $this->newGood();
+               $status->merge( $this->backend->clean(
+                       array( 'dir' => $this->resolveToStoragePath( $dir ) ) ) );
+
+               return $status;
+       }
+
        /**
         * Checks existence of a a file
         *
index 3ad78e3..c7e40e8 100644 (file)
@@ -42,17 +42,17 @@ class SwiftFileBackend extends FileBackendStore {
         *    shardViaHashLevels : Map of container names to sharding config with:
         *                         'base'   : base of hash characters, 16 or 36
         *                         'levels' : the number of hash levels (and digits)
-        *                         'repeat' : hash subdirectories are prefixed with all the 
+        *                         'repeat' : hash subdirectories are prefixed with all the
         *                                    parent hash directory names (e.g. "a/ab/abc")
         */
        public function __construct( array $config ) {
                parent::__construct( $config );
                // Required settings
                $this->auth = new CF_Authentication(
-                       $config['swiftUser'], 
-                       $config['swiftKey'], 
+                       $config['swiftUser'],
+                       $config['swiftKey'],
                        null, // account; unused
-                       $config['swiftAuthUrl'] 
+                       $config['swiftAuthUrl']
                );
                // Optional settings
                $this->authTTL = isset( $config['swiftAuthTTL'] )
@@ -116,7 +116,7 @@ class SwiftFileBackend extends FileBackendStore {
                try {
                        $dContObj = $this->getContainer( $dstCont );
                        if ( empty( $params['overwrite'] ) &&
-                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) ) 
+                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
                        {
                                $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
                                return $status;
@@ -179,7 +179,7 @@ class SwiftFileBackend extends FileBackendStore {
                try {
                        $dContObj = $this->getContainer( $dstCont );
                        if ( empty( $params['overwrite'] ) &&
-                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) ) 
+                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
                        {
                                $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
                                return $status;
@@ -255,7 +255,7 @@ class SwiftFileBackend extends FileBackendStore {
                        $sContObj = $this->getContainer( $srcCont );
                        $dContObj = $this->getContainer( $dstCont );
                        if ( empty( $params['overwrite'] ) &&
-                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) ) 
+                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
                        {
                                $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
                                return $status;
@@ -480,7 +480,7 @@ class SwiftFileBackend extends FileBackendStore {
 
        /**
         * Fill in any missing object metadata and save it to Swift
-        * 
+        *
         * @param $obj CF_Object
         * @param $path string Storage path to object
         * @return bool Success
@@ -545,7 +545,7 @@ class SwiftFileBackend extends FileBackendStore {
 
        /**
         * Do not call this function outside of SwiftFileBackendFileList
-        * 
+        *
         * @param $fullCont string Resolved container name
         * @param $dir string Resolved storage directory with no trailing slash
         * @param $after string Storage path of file to list items after
@@ -560,7 +560,6 @@ class SwiftFileBackend extends FileBackendStore {
                        $prefix = ( $dir == '' ) ? null : "{$dir}/";
                        $files = $container->list_objects( $limit, $after, $prefix );
                } catch ( NoSuchContainerException $e ) {
-               } catch ( NoSuchObjectException $e ) {
                } catch ( InvalidResponseException $e ) {
                } catch ( Exception $e ) { // some other exception?
                        $this->logException( $e, __METHOD__, array( 'cont' => $fullCont, 'dir' => $dir ) );
@@ -573,7 +572,7 @@ class SwiftFileBackend extends FileBackendStore {
         * @see FileBackendStore::doGetFileSha1base36()
         * @return bool
         */
-       public function doGetFileSha1base36( array $params ) {
+       protected function doGetFileSha1base36( array $params ) {
                $stat = $this->getFileStat( $params );
                if ( $stat ) {
                        return $stat['sha1'];
@@ -667,11 +666,11 @@ class SwiftFileBackend extends FileBackendStore {
 
        /**
         * Get headers to send to Swift when reading a file based
-        * on a FileBackend params array, e.g. that of getLocalCopy(). 
+        * on a FileBackend params array, e.g. that of getLocalCopy().
         * $params is currently only checked for a 'latest' flag.
-        * 
+        *
         * @param $params Array
-        * @return Array 
+        * @return Array
         */
        protected function headersFromParams( array $params ) {
                $hdrs = array();
@@ -799,7 +798,7 @@ class SwiftFileBackend extends FileBackendStore {
 
        /**
         * Log an unexpected exception for this backend
-        * 
+        *
         * @param $e Exception
         * @param $func string
         * @param $params Array
@@ -830,7 +829,7 @@ class SwiftFileBackendFileList implements Iterator {
        protected $pos = 0; // integer
 
        /** @var SwiftFileBackend */
-       protected $backend; 
+       protected $backend;
        protected $container; //
        protected $dir; // string storage directory
        protected $suffixStart; // integer
index ce69a03..ae11e67 100644 (file)
@@ -864,14 +864,8 @@ abstract class File {
                                        $thumb = $this->handler->getTransform( $this, $tmpThumbPath, $thumbUrl, $params );
                                }
                        } elseif ( $this->repo && $thumb->hasFile() && !$thumb->fileIsSource() ) {
-                               $backend = $this->repo->getBackend();
-                               // Copy the thumbnail from the file system into storage. This avoids using
-                               // FileRepo::store(); getThumbPath() uses a different zone in some subclasses.
-                               $backend->prepare( array( 'dir' => dirname( $thumbPath ) ) );
-                               $status = $backend->store(
-                                       array( 'src' => $tmpThumbPath, 'dst' => $thumbPath, 'overwrite' => 1 ),
-                                       array( 'force' => 1, 'nonLocking' => 1, 'allowStale' => 1 )
-                               );
+                               // Copy the thumbnail from the file system into storage...
+                               $status = $this->repo->quickImport( $tmpThumbPath, $thumbPath );
                                if ( $status->isOK() ) {
                                        $thumb->setStoragePath( $thumbPath );
                                } else {
index 16828fa..9ae501a 100644 (file)
@@ -247,8 +247,8 @@ class ForeignAPIFile extends File {
                }
 
                # Delete the thumbnails
-               $this->repo->cleanupBatch( $purgeList, FileRepo::SKIP_LOCKING );
+               $this->repo->quickPurgeBatch( $purgeList );
                # Clear out the thumbnail directory if empty
-               $this->repo->getBackend()->clean( array( 'dir' => $dir ) );
+               $this->repo->cleanDir( $dir );
        }
 }
index 04d7a47..af1b7cd 100644 (file)
@@ -777,9 +777,9 @@ class LocalFile extends File {
                }
 
                # Delete the thumbnails
-               $this->repo->cleanupBatch( $purgeList, FileRepo::SKIP_LOCKING );
+               $this->repo->quickPurgeBatch( $purgeList );
                # Clear out the thumbnail directory if empty
-               $this->repo->getBackend()->clean( array( 'dir' => $dir ) );
+               $this->repo->cleanDir( $dir );
        }
 
        /** purgeDescription inherited */
index 8954031..20c8b95 100644 (file)
@@ -4854,30 +4854,41 @@ class Parser {
 
                        $label = '';
                        $alt = '';
+                       $link = '';
                        if ( isset( $matches[3] ) ) {
                                // look for an |alt= definition while trying not to break existing
                                // captions with multiple pipes (|) in it, until a more sensible grammar
                                // is defined for images in galleries
 
                                $matches[3] = $this->recursiveTagParse( trim( $matches[3] ) );
-                               $altmatches = StringUtils::explode('|', $matches[3]);
+                               $parameterMatches = StringUtils::explode('|', $matches[3]);
                                $magicWordAlt = MagicWord::get( 'img_alt' );
+                               $magicWordLink = MagicWord::get( 'img_link' );
 
-                               foreach ( $altmatches as $altmatch ) {
-                                       $match = $magicWordAlt->matchVariableStartToEnd( $altmatch );
-                                       if ( $match ) {
+                               foreach ( $parameterMatches as $parameterMatch ) {
+                                       if ( $match = $magicWordAlt->matchVariableStartToEnd( $parameterMatch ) ) {
                                                $alt = $this->stripAltText( $match, false );
                                        }
+                                       elseif( $match = $magicWordLink->matchVariableStartToEnd( $parameterMatch ) ){
+                                               $link = strip_tags($this->replaceLinkHoldersText($match));
+                                               $chars = self::EXT_LINK_URL_CLASS;
+                                               $prots = $this->mUrlProtocols;
+                                               //check to see if link matches an absolute url, if not then it must be a wiki link.
+                                               if(!preg_match( "/^($prots)$chars+$/u", $link)){
+                                                       $localLinkTitle = Title::newFromText($link);
+                                                       $link = $localLinkTitle->getLocalURL();
+                                               }
+                                       }
                                        else {
                                                // concatenate all other pipes
-                                               $label .= '|' . $altmatch;
+                                               $label .= '|' . $parameterMatch;
                                        }
                                }
                                // remove the first pipe
                                $label = substr( $label, 1 );
                        }
 
-                       $ig->add( $title, $label, $alt );
+                       $ig->add( $title, $label, $alt ,$link);
                }
                return $ig->toHTML();
        }
index 7a036b8..71b2c59 100644 (file)
@@ -500,10 +500,6 @@ class ResourceLoader {
                        $response = $this->makeComment( $warnings ) . $response;
                }
 
-               // Remove the output buffer and output the response
-               ob_end_clean();
-               echo $response;
-
                // Save response to file cache unless there are errors
                if ( isset( $fileCache ) && !$errors && !$missing ) {
                        // Cache single modules...and other requests if there are enough hits
@@ -516,6 +512,10 @@ class ResourceLoader {
                        }
                }
 
+               // Remove the output buffer and output the response
+               ob_end_clean();
+               echo $response;
+
                wfProfileOut( __METHOD__ );
        }
 
index 5dbce43..3384631 100644 (file)
@@ -80,7 +80,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgDefaultDateFormat' => $wgContLang->getDefaultDateFormat(),
                        'wgMonthNames' => $wgContLang->getMonthNamesArray(),
                        'wgMonthNamesShort' => $wgContLang->getMonthAbbreviationsArray(),
-                       'wgMainPageTitle' => $mainPage ? $mainPage->getPrefixedText() : null,
+                       'wgMainPageTitle' => $mainPage->getPrefixedText(),
                        'wgFormattedNamespaces' => $wgContLang->getFormattedNamespaces(),
                        'wgNamespaceIds' => $namespaceIds,
                        'wgSiteName' => $wgSitename,
@@ -125,12 +125,12 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                // Register modules
                foreach ( $resourceLoader->getModuleNames() as $name ) {
                        $module = $resourceLoader->getModule( $name );
+                       $deps = $module->getDependencies();
+                       $group = $module->getGroup();
+                       $source = $module->getSource();
                        // Support module loader scripts
                        $loader = $module->getLoaderScript();
                        if ( $loader !== false ) {
-                               $deps = $module->getDependencies();
-                               $group = $module->getGroup();
-                               $source = $module->getSource();
                                $version = wfTimestamp( TS_ISO_8601_BASIC,
                                        $module->getModifiedTime( $context ) );
                                $out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $source, $loader );
@@ -143,26 +143,23 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                $mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $wgCacheEpoch ) );
                                // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
                                // mw.loader.register()
-                               if ( !count( $module->getDependencies() && $module->getGroup() === null && $module->getSource() === 'local' ) ) {
+                               if ( !count( $deps ) && $group === null && $source === 'local' ) {
                                        $registrations[] = array( $name, $mtime );
                                }
                                // Modules with dependencies but no group or foreign source pass three arguments
                                // (name, timestamp, dependencies) to mw.loader.register()
-                               elseif ( $module->getGroup() === null && $module->getSource() === 'local' ) {
-                                       $registrations[] = array(
-                                               $name, $mtime,  $module->getDependencies() );
+                               elseif ( $group === null && $source === 'local' ) {
+                                       $registrations[] = array( $name, $mtime, $deps );
                                }
                                // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
                                // to mw.loader.register()
-                               elseif ( $module->getSource() === 'local' ) {
-                                       $registrations[] = array(
-                                               $name, $mtime,  $module->getDependencies(), $module->getGroup() );
+                               elseif ( $source === 'local' ) {
+                                       $registrations[] = array( $name, $mtime, $deps, $group );
                                }
                                // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
                                // to mw.loader.register()
                                else {
-                                       $registrations[] = array(
-                                               $name, $mtime, $module->getDependencies(), $module->getGroup(), $module->getSource() );
+                                       $registrations[] = array( $name, $mtime, $deps, $group, $source );
                                }
                        }
                }
@@ -185,19 +182,20 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                if ( $context->getOnly() === 'scripts' ) {
 
                        // The core modules:
-                       $modules = array( 'jquery', 'mediawiki' );
-                       wfRunHooks( 'ResourceLoaderGetStartupModules', array( &$modules ) );
+                       $moduleNames = array( 'jquery', 'mediawiki' );
+                       wfRunHooks( 'ResourceLoaderGetStartupModules', array( &$moduleNames ) );
 
                        // Get the latest version
+                       $loader = $context->getResourceLoader();
                        $version = 0;
-                       foreach ( $modules as $moduleName ) {
+                       foreach ( $moduleNames as $moduleName ) {
                                $version = max( $version,
-                                       $context->getResourceLoader()->getModule( $moduleName )->getModifiedTime( $context )
+                                       $loader->getModule( $moduleName )->getModifiedTime( $context )
                                );
                        }
                        // Build load query for StartupModules
                        $query = array(
-                               'modules' => ResourceLoader::makePackedModulesString( $modules ),
+                               'modules' => ResourceLoader::makePackedModulesString( $moduleNames ),
                                'only' => 'scripts',
                                'lang' => $context->getLanguage(),
                                'skin' => $context->getSkin(),
@@ -210,6 +208,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        // Startup function
                        $configuration = $this->getConfig( $context );
                        $registrations = self::getModuleRegistrations( $context );
+                       $registrations = str_replace( "\n", "\n\t", trim( $registrations ) ); // fix indentation
                        $out .= "var startUp = function() {\n" .
                                "\tmw.config = new " . Xml::encodeJsCall( 'mw.Map', array( $wgLegacyJavaScriptGlobals ) ) . "\n" .
                                "\t$registrations\n" .
index 00a85da..b866f48 100644 (file)
@@ -18,6 +18,7 @@
  * @author Bassem JARKAS
  * @author Chaos
  * @author Ciphers
+ * @author DRIHEM
  * @author DrFO.Tn
  * @author Elmondo21st
  * @author Elmoro
@@ -1141,7 +1142,7 @@ $2
 تذكر أن ملفات ال.css و ال.js تستخدم حروف صغيرة في العنوان ، كمثال {{ns:user}}:Foo/vector.css و ليس {{ns:user}}:Foo/Vector.css.",
 'updated' => '(محدثة)',
 'note' => "'''ملاحظة:'''",
-'previewnote' => "'''تذكر أن هذه مجرد معاينة للصفحة؛''''
+'previewnote' => "'''تذكر أن هذه مجرد معاينة أولية.'''
 لم تحفظ تغييراتك إلى الآن!",
 'previewconflict' => 'هذا العرض يوضح النص الموجود في صندوق التحرير العلوي والذي سيظهر إذا اخترت الحفظ.',
 'session_fail_preview' => "'''عذرا! لم نتمكن من حفظ التعديلات التي قمت بها نتيجة لضياع بيانات هذه الجلسة.
@@ -1998,9 +1999,9 @@ $1',
 # img_auth script messages
 'img-auth-accessdenied' => 'رفض الوصول',
 'img-auth-nopathinfo' => 'PATH_INFO مفقود.
-خادÙ\88Ù\85Ù\83 Ù\84Ù\8aس Ù\85ضبÙ\88طا Ù\84تÙ\85رÙ\8aر Ù\87Ø°Ù\87 Ø§Ù\84Ù\85عÙ\84Ù\88Ù\85ات.
-ربما يكون مبني على CGI ولا يمكنه دعم img_auth.
-[https://www.mediawiki.org/wiki/Manual:Image_Authorization راجع تصريح الصور].',
+خادÙ\85Ù\83 Ù\84Ù\8aس Ù\85ضبÙ\88طا  Ù\84تÙ\85رÙ\8aر Ù\87Ø°Ù\87 Ø§Ù\84Ù\85عÙ\84Ù\88Ù\85Ø©.
+قد يكون مبنيا على نظام CGI ولا يمكنه دعم img_auth.
+راجع https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'img-auth-notindir' => 'المسار المطلوب غير موجود في مجلد الرفع المضبوط.',
 'img-auth-badtitle' => 'تعذر تشكيل عنوان صالح من "$1".',
 'img-auth-nologinnWL' => 'لست والجا و"$1" ليست في القائمة البيضاء.',
@@ -2318,8 +2319,9 @@ $1',
 'linksearch-pat' => 'نمط البحث:',
 'linksearch-ns' => 'النطاق:',
 'linksearch-ok' => 'ابحث',
-'linksearch-text' => 'الكروت الخاصة مثل "*.wikipedia.org" يمكن استخدامها.<br />
-البروتوكولات المدعومة: <tt>$1</tt>',
+'linksearch-text' => 'Wildcards مثل "*.wikipedia.org" يمكن استخدامها.
+تحتاج على الأقل إلى نطاق ذو مستوى أعلى، كمثال "*.org".<br />
+البروتوكولات المدعومة: <tt>$1</tt> (لا تقم بإضافة أي من هذه إلى بحثك).',
 'linksearch-line' => '$1 موصولة من $2',
 'linksearch-error' => 'الكروت الخاصة يمكن أن تظهر فقط في بداية اسم المضيف.',
 
index d8dd929..c2db89a 100644 (file)
@@ -60,61 +60,61 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Sorrayar enllaces:',
 'tog-justify' => 'Xustificar parágrafos',
-'tog-hideminor' => 'Anubrir les ediciones menores nos cambios recientes',
-'tog-hidepatrolled' => 'Anubrir les ediciones vixilaes nos cambios recientes',
-'tog-newpageshidepatrolled' => 'Atapecer les páxines vixilaes na llista de páxines nueves',
-'tog-extendwatchlist' => "Espander la llista de vixilancia p'amosar tolos cambios, non sólo los recientes.",
-'tog-usenewrc' => 'Cambios recientes ameyoraos (necesita JavaScript)',
+'tog-hideminor' => 'Anubrir les ediciones menores nos cambeos recientes',
+'tog-hidepatrolled' => 'Anubrir les ediciones vixilaes nos cambeos recientes',
+'tog-newpageshidepatrolled' => 'Anubrir les páxines vixilaes na llista de páxines nueves',
+'tog-extendwatchlist' => "Espander la llista de vixilancia p'amosar tolos cambeos, non solo los más recientes.",
+'tog-usenewrc' => 'Cambeos recientes ameyoraos (necesita JavaScript)',
 'tog-numberheadings' => 'Autonumberar los encabezaos',
 'tog-showtoolbar' => "Amosar la barra de ferramientes d'edición (JavaScript)",
-'tog-editondblclick' => 'Editar páxines con doble clic (JavaScript)',
+'tog-editondblclick' => 'Editar páxines con doble clic (necesita JavaScript)',
 'tog-editsection' => "Activar la edición de seiciones per aciu d'enllaces [editar]",
-'tog-editsectiononrightclick' => 'Activar la edición de seiciones calcando col botón<br /> drechu enriba los títulos de seición (JavaScript)',
+'tog-editsectiononrightclick' => 'Activar la edición de seiciones calcando col botón drechu nos títulos de seición (necesita JavaScript)',
 'tog-showtoc' => 'Amosar índiz (pa páxines con más de 3 encabezaos)',
-'tog-rememberpassword' => 'Recordar la mio identificación nesti ordenador (por un máximu de $1 {{PLURAL:$1|día|díes}})',
-'tog-watchcreations' => 'Añader les páxines que creo a la mio llista de vixilancia',
-'tog-watchdefault' => "Añader les páxines qu'edito a la mio llista de vixilancia",
-'tog-watchmoves' => 'Añader les páxines que muevo a la mio llista de vixilancia',
-'tog-watchdeletion' => "Añader les páxines qu'esborro a la mio llista de vixilancia",
-'tog-minordefault' => 'Marcar toles ediciones como menores de mou predetermináu',
+'tog-rememberpassword' => 'Recordar la mio identificación nesti ordenador (hasta un máximu de $1 {{PLURAL:$1|día|díes}})',
+'tog-watchcreations' => 'Amestar les páxines que creo a la mio llista de vixilancia',
+'tog-watchdefault' => "Amestar les páxines qu'edito a la mio llista de vixilancia",
+'tog-watchmoves' => 'Amestar les páxines que muevo a la mio llista de vixilancia',
+'tog-watchdeletion' => 'Amestar les páxines que desanicio a la mio llista de vixilancia',
+'tog-minordefault' => 'Marcar toles ediciones como menores por defeutu',
 'tog-previewontop' => "Amosar previsualización enantes de la caxa d'edición",
 'tog-previewonfirst' => 'Amosar previsualización na primer edición',
 'tog-nocache' => 'Desactivar la caché de páxines del restolador',
-'tog-enotifwatchlistpages' => 'Mandame un corréu cuando cambie una páxina de la mio llista de vixilancia',
+'tog-enotifwatchlistpages' => 'Mandame un corréu cuando camude una páxina de la mio llista de vixilancia',
 'tog-enotifusertalkpages' => "Mandame un corréu cuando camude la mio páxina d'alderique",
-'tog-enotifminoredits' => 'Mandame tamién un corréu pa les ediciones menores',
-'tog-enotifrevealaddr' => 'Amosar el mio corréu electrónicu nos correos de notificación',
-'tog-shownumberswatching' => "Amosar el númberu d'usuarios que la tán vixilando",
+'tog-enotifminoredits' => 'Mandame tamién un corréu cuando heba ediciones menores de les páxines',
+'tog-enotifrevealaddr' => 'Amosar la mio direición de corréu nos correos de notificación',
+'tog-shownumberswatching' => "Amosar el númberu d'usuarios que tán vixilando la páxina",
 'tog-oldsig' => 'Firma esistente:',
-'tog-fancysig' => 'Usar la firma como "testu wiki" (ensin enllaz automáticu)',
-'tog-externaleditor' => 'Usar un editor esternu de mou predeterminao (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
-'tog-externaldiff' => 'Usar un diff esternu de mou predetermináu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
+'tog-fancysig' => 'Tratar la firma como testu wiki (ensin enllaz automáticu)',
+'tog-externaleditor' => 'Usar un editor esternu por defeutu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
+'tog-externaldiff' => 'Usar un diff esternu por defutu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
 'tog-showjumplinks' => 'Activar los enllaces d\'accesibilidá "saltar a"',
-'tog-uselivepreview' => 'Usar vista previa en direutu (JavaScript) (en pruebes)',
+'tog-uselivepreview' => 'Usar vista previa en tiempu real (necesita JavaScript) (en pruebes)',
 'tog-forceeditsummary' => "Avisame cuando grabe col resume d'edición en blanco",
-'tog-watchlisthideown' => 'Esconder les mios ediciones na llista de vixilancia',
-'tog-watchlisthidebots' => 'Esconder les ediciones de bots na llista de vixilancia',
-'tog-watchlisthideminor' => 'Esconder les ediciones menores na llista de vixilancia',
-'tog-watchlisthideliu' => "Ocultar ediciones d'usuarios rexistraos na llista de vixilancia",
-'tog-watchlisthideanons' => "Ocultar ediciones d'usuarios anónimos na llista de vixilancia",
-'tog-watchlisthidepatrolled' => 'Anubrir les ediciones patrullaes de la llista de vixilancia',
+'tog-watchlisthideown' => 'Anubrir les mios ediciones na llista de vixilancia',
+'tog-watchlisthidebots' => 'Anubrir les ediciones de bots na llista de vixilancia',
+'tog-watchlisthideminor' => 'Anubrir les ediciones menores na llista de vixilancia',
+'tog-watchlisthideliu' => "Anubrir les ediciones d'usuarios identificaos na llista de vixilancia",
+'tog-watchlisthideanons' => "Anubrir les ediciones d'usuarios anónimos na llista de vixilancia",
+'tog-watchlisthidepatrolled' => 'Anubrir les ediciones vixilaes de la llista de vixilancia',
 'tog-nolangconversion' => 'Desactivar la conversión de variantes',
-'tog-ccmeonemails' => 'Mandame copies de los correos que mando a otros usuarios',
+'tog-ccmeonemails' => "Mandame copies de los correos qu'unvio a otros usuarios",
 'tog-diffonly' => 'Nun amosar el conteníu de la páxina embaxo de les diferencies',
 'tog-showhiddencats' => 'Amosar categoríes anubríes',
 'tog-noconvertlink' => 'Desactivar la conversión del títulu del enllaz',
-'tog-norollbackdiff' => 'Desanicier les diferencies depués de restaurar',
+'tog-norollbackdiff' => 'Desaniciar les diferencies depués de facer una restauración',
 
-'underline-always' => 'Siempres',
+'underline-always' => 'Siempre',
 'underline-never' => 'Nunca',
-'underline-default' => 'Valor predetermináu del navegador',
+'underline-default' => 'Restolador por defeutu',
 
 # Font style option in Special:Preferences
-'editfont-style' => "Estilu de fonte deárea d'edición:",
-'editfont-default' => 'Valor predetermináu del navegador',
-'editfont-monospace' => 'Fonte monoespaciada',
-'editfont-sansserif' => 'Fonte Sans-serif',
-'editfont-serif' => 'Fonte Serif',
+'editfont-style' => "Estilu de fonte de l'área d'edición:",
+'editfont-default' => 'Restolador por defeutu',
+'editfont-monospace' => 'Tipu de lletra monoespaciada',
+'editfont-sansserif' => 'Tipu de lletra Sans-serif',
+'editfont-serif' => 'TIpu de lletra Serif',
 
 # Dates
 'sunday' => 'domingu',
index 3ecdad4..b9b4311 100644 (file)
@@ -15,6 +15,7 @@
  * @author Roustammr
  * @author Timming
  * @author Рустам Нурыев
+ * @author ҒатаУлла
  */
 
 $fallback = 'ru';
@@ -403,8 +404,8 @@ $1',
 'cannotdelete-title' => '"$1" битен юйып булмай',
 'badtitle' => 'Ярамаған исем',
 'badtitletext' => 'Биттең һоратылған исеме дөрөҫ түгел, буш йәки телдәр араһы йәки интервики исеме яңылыш күрһәтелгән. Исемдә тыйылған символдар булыуы ла мөмкин.',
-'perfcached' => 'Был мәғлүмәттәр кэштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Был мәғлүмәттәр кэштан алынды, ул һуңғы тапҡыр $1 яңыртылды. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Был мәғлүмәттәр кэштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин. Кэшта иң күбе {{PLURAL:$1|язма}} һаҡлана.',
+'perfcachedts' => 'Был мәғлүмәттәр кэштан алынған, ул һуңғы тапҡыр $1 яңыртылды.  Кэшта иң күбе  {{PLURAL:$4|язма}} һаҡлана',
 'querypage-no-updates' => 'Был битте яңыртыу хәҙер тыйылған.
 Бында күрһәтелгән мәғлүмәттәр яңыртылмаясаҡ.',
 'wrong_wfQuery_params' => 'wfQuery() функцияһы өсөн рөхсәт ителмәгән параметрҙар<br />
@@ -430,6 +431,9 @@ $2',
 'ns-specialprotected' => '«{{ns:special}}» исем арауығындағы биттәрҙе үҙгәртеп булмай.',
 'titleprotected' => "Был исем менән бит яһау [[User:$1|$1]] тарафынан тыйылған.
 Белдерелгән сәбәп: ''$2''.",
+'filereadonlyerror' => "«$1» файлын үҙгәртеп булмай, сөнки «$2» һаҡлағысы «уҡыу өсөн генә» тәртибенде.
+
+Установивший этот режим администратор оставил следующее разъяснение: «''$3''».",
 
 # Virus scanner
 'virus-badscanner' => "Көйләү хатаһы: Билдәһеҙ вирустар сканеры: ''$1''",
@@ -513,6 +517,7 @@ $2',
 'invalidemailaddress' => 'Электрон почта адресы ҡабул ителә алмай, сөнки ул форматка тап килмәй.
 Зинһар, дөрөҫ адрес керетегеҙ йәки юлды буш ҡалдырығыҙ.',
 'cannotchangeemail' => 'Иҫәп яҙыуы электрон почта адрестарын был викила үҙгәртеп булмай.',
+'emaildisabled' => 'Был сайт электрон почта хәберҙәрен ебәрә алмай',
 'accountcreated' => 'Иҫәп яҙыуы яһалды',
 'accountcreatedtext' => '$1 исемле ҡулланыусы өсөн исәп яҙыуы яһалды.',
 'createaccount-title' => '{{SITENAME}}: теркәлеү',
@@ -704,7 +709,8 @@ $2
 'userinvalidcssjstitle' => "'''Иғтибар:''' \"\$1\" биҙәү темаһы табылманы. Иҫтә тотоғоҙ, .css һәм .js ҡулланыусы биттәренең исемдәре тик бәләкәй хәрефтәрҙән генә торорға тейеш. Мәҫәлән: {{ns:user}}:Foo/vector.css, ә {{ns:user}}:Foo/Vector.css түгел!",
 'updated' => '(Яңыртылды)',
 'note' => "'''Иҫкәрмә:'''",
-'previewnote' => "'''Ҡарап сығыу өлгөһө, әлегә үҙгәрештәр яҙҙырылмаған!'''",
+'previewnote' => "'''Ҡарап сығыу өлгөһө, әлегә үҙгәрештәр яҙҙырылмаған!'''
+Һеҙҙең үҙгәртеүҙәр әле яҙылмаған! [[#editform|→ мөхәрирләүҙә дауам итеү]]",
 'previewconflict' => 'Әлеге алдан ҡарау, мөхәррирләү тәҙрәһенең өҫтөндә, һаҡланғандан һуң текстың нисек күренәсәген күрһәтә.',
 'session_fail_preview' => "'''Ҡыҙғанысҡа ҡаршы, һеҙҙең ултырыш идентификаторығыҙ юғалды. Һөҙөмтәлә үҙгәртеүҙәрегеҙ ҡабул ителмәйәсәк.
 Зинһар, тағы бер тапҡыр ҡабатлағыҙ.
@@ -719,6 +725,7 @@ $2
 Бындай хәлдәр хаталы аноним web-проксилар ҡулланғанда килеп сығырға мөмкин.",
 'edit_form_incomplete' => "'''Мөхәррирләү формаһының ҡайһы өлөштәре серверға барып етмәне. Төҙәтеүҙәрегеҙҙе яҡшы итеп тикшерегеҙ һәм яңынан ҡабатлағыҙ.'''",
 'editing' => 'Мөхәрирләү  $1',
+'creating' => 'Төҙөү $1',
 'editingsection' => 'Мөхәрирләү  $1 (секция)',
 'editingcomment' => '$1 мөхәррирләнә (яңы бүлек)',
 'editconflict' => 'Мөхәррирләү конфликты: $1',
index 0d7185f..6f5fbe3 100644 (file)
@@ -413,8 +413,8 @@ $1',
 'editlink' => 'دەستکاری',
 'viewsourcelink' => 'سەرچاوەکەی ببینە',
 'editsectionhint' => 'دەستکاری کردنی بەشی: $1',
-'toc' => 'Ù\86اÙ\88Û\95رÛ\86Ú©',
-'showtoc' => 'نیشاندان',
+'toc' => 'Ù¾Û\8eرست',
+'showtoc' => 'نیشانیبدە',
 'hidetoc' => 'بیشارەوە',
 'collapsible-collapse' => 'کۆیبکەوە',
 'collapsible-expand' => 'بڵاویبکەوە',
@@ -1257,7 +1257,7 @@ $1",
 'prefs-advancedrendering' => 'هەڵبژاردە پێشکەوتووەکان',
 'prefs-advancedsearchoptions' => 'هەڵبژاردە پێشکەوتووەکان',
 'prefs-advancedwatchlist' => 'هەڵبژاردە پێشکەوتووەکان',
-'prefs-displayrc' => 'هەڵبژاردەکانی نیشان‌دان',
+'prefs-displayrc' => 'ھەڵبژاردەکانی نیشاندان',
 'prefs-displaysearchoptions' => 'ھەڵبژاردەکانی نیشاندان',
 'prefs-displaywatchlist' => 'ھەڵبژاردەکانی نیشاندان',
 'prefs-diffs' => 'جیاوازییەکان',
@@ -1881,7 +1881,7 @@ $1',
 
 # Special:ListUsers
 'listusersfrom' => 'نیشاندانی بەکارھێنەران بە دست پێکردن لە:',
-'listusers-submit' => 'نیشاندان',
+'listusers-submit' => 'نیشانیبدە',
 'listusers-noresult' => 'ھیچ بەکارھێنەرێک نەدۆزرایەوە.',
 'listusers-blocked' => '(بەربەست‌کراو)',
 
index 8100d12..38d3b85 100644 (file)
@@ -371,7 +371,7 @@ $messages = array(
 'tog-rememberpassword' => 'Zapamatovat si mé přihlášení v tomto prohlížeči (maximálně $1 {{PLURAL:$1|den|dny|dní}})',
 'tog-watchcreations' => 'Přidávat mnou založené stránky ke sledovaným',
 'tog-watchdefault' => 'Přidávat mnou editované stránky ke sledovaným',
-'tog-watchmoves' => 'Přidávat přesouvané stránky mezi sledované',
+'tog-watchmoves' => 'Přidávat mnou přesouvané stránky mezi sledované',
 'tog-watchdeletion' => 'Přidávat stránky, které smažu, mezi sledované',
 'tog-minordefault' => 'Označit editaci implicitně jako malá editace',
 'tog-previewontop' => 'Zobrazovat náhled před editačním oknem (ne za ním)',
@@ -952,14 +952,14 @@ Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace z
 'blockedtitle' => 'Uživatel zablokován',
 'blockedtext' => "'''Vaší IP adrese či uživatelskému jménu byla zablokována možnost editace.'''
 
-Zablokování provedl $1.
+Zablokování provedl{{gender:$4||a}} $1.
 Udaným důvodem bylo ''$2''.
 
 * Začátek blokování: $8
 * Zablokování vyprší: $6
 * Blokovaný uživatel: $7
 
-Pokud chcete zablokování prodiskutovat, můžete kontaktovat uživatele $1 či jiného [[{{MediaWiki:Grouppage-sysop}}|správce]].
+Pokud chcete zablokování prodiskutovat, můžete kontaktovat {{gender:$4|uživatele|uživatelku}} $1 či jiného [[{{MediaWiki:Grouppage-sysop}}|správce]].
 Uvědomte si, že nemůžete použít nabídku „Poslat e-mail“, jestliže nemáte ve svém [[Special:Preferences|nastavení]] uvedenu platnou e-mailovou adresu nebo pokud vám byla tato možnost zakázána.
 Vaše IP adresa je $3 a&nbsp;identifikační číslo bloku je #$5; tyto údaje uvádějte ve všech dotazech na správce.",
 'autoblockedtext' => "Vaše IP adresa byla automaticky zablokována, protože ji používal jiný uživatel, kterého zablokoval $1.
@@ -1526,7 +1526,7 @@ Tuto operaci nelze vrátit zpět.',
 
 'group-user-member' => '{{GENDER:$1|uživatel|uživatelka|uživatel}}',
 'group-autoconfirmed-member' => 'automaticky {{GENDER:$1|schválený uživatel|schválená uživatelka|schválený uživatel}}',
-'group-bot-member' => '{{GENDER:$1|bot|botka|bot}}',
+'group-bot-member' => '{{GENDER:$1|bot}}',
 'group-sysop-member' => '{{GENDER:$1|správce|správkyně|správce}}',
 'group-bureaucrat-member' => '{{GENDER:$1|byrokrat|byrokratka|byrokrat}}',
 'group-suppress-member' => '{{GENDER:$1|dohlížitel|dohlížitelka|dohlížitel}}',
index c7513ce..0e48609 100644 (file)
@@ -1063,7 +1063,7 @@ Sollte das Problem bestehen bleiben, [[Special:UserLogout|melde dich ab]] und da
 Eine Speicherung kann den Seiteninhalt zerstören. Dies geschieht bisweilen durch die Benutzung eines anonymen Proxy-Dienstes, der fehlerhaft arbeitet.'''",
 'edit_form_incomplete' => "'''Der Inhalt des Bearbeitungsformulars hat den Server nicht vollständig erreicht. Bitte prüfe deine Bearbeitungen auf Vollständigkeit und versuche es erneut.'''",
 'editing' => 'Bearbeiten von „$1“',
-'creating' => '$1 wird erstellt',
+'creating' => 'Erstellen von „$1“',
 'editingsection' => 'Bearbeiten von „$1“ (Abschnitt)',
 'editingcomment' => 'Bearbeiten von „$1“ (Neuer Abschnitt)',
 'editconflict' => 'Bearbeitungskonflikt: $1',
index dfab851..8153266 100644 (file)
@@ -431,7 +431,7 @@ Hesabê şıma biyo a.
 'userlogin' => 'Cı kewe / hesab vıraze',
 'userloginnocreate' => 'Cı kewe',
 'logout' => 'Cı ra veciye',
-'userlogout' => 'Veciye',
+'userlogout' => 'Vıcyayış',
 'notloggedin' => 'Hesab akerde niyo',
 'nologin' => "Hesabê şıma çıniyo? '''$1'''.",
 'nologinlink' => 'Yew hesab ake',
@@ -526,6 +526,18 @@ Bıne vındere u newe ra dest pê bıkere.',
 'passwordreset-capture' => 'neticey e-postay bımocne?',
 'passwordreset-email' => 'Adresa e-postey:',
 'passwordreset-emailtitle' => 'Hesab timarê {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Jeweri, {{SITENAME}} ra (ma heta şımayê, $1 IP adresi ra) ($4) teferuatê hesabdê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:
+
+$2
+
+{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.
+Ena parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.',
+'passwordreset-emailtext-user' => '$1 enê karberi, {{SITENAME}}  ra ($4) teferuatê hesab dê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:
+
+$2
+
+{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.
+Ena parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.',
 'passwordreset-emailelement' => 'Namey karberi: $1
 Parola vêrdiye: $2',
 
@@ -558,9 +570,9 @@ Parola vêrdiye: $2',
 'hr_tip' => 'Çızgiy Horizantoli (use sparingly)',
 
 # Edit pages
-'summary' => 'Mênine:',
+'summary' => 'Xulasa:',
 'subject' => 'Mewzu/serrêze:',
-'minoredit' => 'Eno yew vurnayışo qıckeko',
+'minoredit' => 'Vurnayışo qıckeko',
 'watchthis' => 'Ena pele seyr ke',
 'savearticle' => 'Ena pele qeyd ke',
 'preview' => 'Verqayt',
@@ -655,8 +667,8 @@ Vurnayışê tu hama qeyd nıbiyo![[#editform|→ timar kerdışi rê dewam ke]]
 'token_suffix_mismatch' => "'''Vurnayişê şıma tepeya ameyo çunke qutiyê imla xerıbya.
 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",
+'editing' => 'Pela "$1"\'i bıvurnê',
+'creating' => "Pela $1'i vıraze",
 'editingsection' => '$1 vurneno (qısım)',
 'editingcomment' => '$1 vuryeno (qısmo newe)',
 'editconflict' => 'Vurnayişê ke yewbini nêtepışeni: $1',
@@ -675,8 +687,7 @@ Tı ma ri soz dano ki tı nuşte xo oricinali nuşt, ya zi tı yew dokumantê um
 '''İTİYA DI METARİYALÊ \"COPYRIGHT\"İ NINUSİ!.'''",
 'copyrightwarning2' => 'Ney bızane ke nuşteyê ke şıma ruşneni (şaweni) keyepelê {{SITENAME}} herkes eşkeno nê nuşteyanê şıma ser kay bıkero. Eke şıma qayil niye kes bıvurno, nuşetyanê xo meerze ita. <br />
 Wexta ke şıma nuşte zi erzeni ita; şıma gani taahhud bıde koti ra ardo (qey teferruati referans: $1).',
-'longpageerror' => "'''Xeta: Dergeya nuşte dê şıma nezdi $1 kilobayta, u $2 kilobayt ra vêşiyo.
-Qeyd biyayişê cı nêbeno'''",
+'longpageerror' => "'''Xırab: Dergeya nuşte dê şıma nezdi {{PLURAL:$1|kilobayto|$1 kilobayto}}, feqet {{PLURAL:$2|kilobayt|$2 kilobayt}} ra vêşiyo. Qeyd biyayişê cı nêbeno'''",
 'readonlywarning' => "'''DİQET: Semedê mıqayti, database kılit biyo. No sebeb ra vurnayişê şıma qayd nêbeno. Nuşteyanê şıma yewna serkar eşkeno wedaro u pey ra şıma eşkeni reyna ita de qayd bıker'''
 
 Serkar o ke kılit kerdo; no beyanat dayo: $1",
@@ -716,6 +727,7 @@ Hewna kerde aseno.',
 'edit-no-change' => 'Vurnayişê şıma qebul nêbı, çunke nuşte de yew vurnayiş n3evıraziya.',
 'edit-already-exists' => 'Pelo newe nêvıraziyeno.
 Pel ca ra esto.',
+'defaultmessagetext' => 'Normal metnê nuşti',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Hişyari: No pel de fonksiyoni zaf esti.
@@ -1105,6 +1117,10 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'prefs-displaywatchlist' => 'Weçinayışê mocnayışi',
 'prefs-diffs' => 'Diffs',
 
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'e-posta adresi raştayo',
+'email-address-validity-invalid' => 'e-postayo raştay defiye de',
+
 # User rights
 'userrights' => 'İdarey heqanê karberan',
 'userrights-lookup-user' => 'Grubanê karberi/karbere idare bıke',
@@ -1251,6 +1267,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'action-userrights' => 'heqqa karberanê hemî bivurne',
 'action-userrights-interwiki' => 'heqqa karberanê ke wikiyê binî de hemî bivurne',
 'action-siteadmin' => 'database kilit bike ya zi a bike',
+'action-sendemail' => 'e-posta bırşe',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|vurnayış|vurnayışan}}',
@@ -1422,6 +1439,10 @@ Eke problem dewam kerd [[Special:ListUsers/sysop|serkari]] de irtibat kewe.',
 'upload-http-error' => 'Yew ğeletê HTTPî biyo: $1',
 
 # File backend
+'backend-fail-stream' => '$1 nê vırazeyê',
+'backend-fail-backup' => '$1 nê wendeyê',
+'backend-fail-notexists' => '$1 name dı dosya çına.',
+'backend-fail-delete' => '$1 nê besterneyê',
 'backend-fail-store' => '$1 ra $2 berdışo nê wanêno',
 'backend-fail-copy' => '$1 ra $2 kopya kerdışena dosyayo nêbeno',
 'backend-fail-move' => '$1 ra $2 berdışo nê wanêno',
@@ -1607,6 +1628,7 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 <del>serê ey nuşteyi</del> safi biye.',
 'double-redirect-fixed-move' => '[[$1]] kırışiya, hıni ray dana [[$2]] no pel',
+'double-redirect-fixed-maintenance' => 'raçarnayışo dıletê [[$1]] ra  pela da [[$2]] timarêno',
 'double-redirect-fixer' => 'Fixerî redirek bike',
 
 'brokenredirects' => 'Redireksiyonî ke hin nixebitiyeno',
@@ -1628,6 +1650,8 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'nmembers' => '$1 {{PLURAL:$1|eza|ezayan}}',
 'nrevisions' => '$1 {{PLURAL:$1|revizyon|revizyonî}}',
 'nviews' => '$1 {{PLURAL:$1|vînayîş|vînayîşî}}',
+'nimagelinks' => '$1 {{PLURAL:$1|ena pela de|ena pela de}} karêno',
+'ntransclusions' => '$1 {{PLURAL:$1|ena pela de|ena pela de}} karêno',
 'specialpage-empty' => 'Ser ena report netice çini yo.',
 'lonelypages' => 'Pelî ke yetim mend',
 'lonelypagestext' => 'Ena pelî link nibiyê ya zi pelanê binî {{SITENAME}} de transclude biy.',
@@ -1841,7 +1865,7 @@ Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni. Hem zi çı dem
 'watchmethod-list' => 'pel ê ke şıma temaşa kenî vuryayişê peyinê ey konrol beno',
 'watchlistcontains' => 'listeya seyrkerdışê şıma de $1 tene {{PLURAL:$1|peli|peli}} estî.',
 'iteminvalidname' => "pê no '$1' unsuri problem bı, nameyo nemeqbul...",
-'wlnote' => "Bıni dı {{PLURAL:$1|vurnayış|peyniya '''$1'''  dı vurnayışi estê}} {{PLURAL:$2|roci|'''$2''' roci}}, hetani $5, $4 esênê.",
+'wlnote' => "$3 seate u bahde $4 deqa dıma {{PLURAL:$2|ju seate dı|'''$2''' ju seate dı}} {{PLURAL:$1|vurnayışe peyeni|vurnayışe '''$1''' peyeni}} cêrdeyê",
 'wlshowlast' => 'bımoc $1 seat $2 rocan $3',
 'watchlist-options' => 'Tercihanê listey seyrkerdışi',
 
@@ -1947,7 +1971,7 @@ kerem kerê "tepiya" şiyerê u pel o ke şıma tera ameyî u o pel newe ra bar
 Qey malumato ziyede [[Special:ProtectedPages|Peleyê ke star biye]] bewni rê êna .',
 'protectedarticle' => '"[[$1]]" kılit biyo',
 'modifiedarticleprotection' => 'Qe "[[$1]]", seviye kılit kerdişi vurnayi biyo',
-'unprotectedarticle' => 'pawıtış weradiya/wedariya: "[[$1]]"',
+'unprotectedarticle' => 'Starkerdışê "[[$1]]" hewadeya',
 'movedarticleprotection' => 'eyarê pawıtışi no "[[$2]]" peli ra kırışiya no "[[$1]]" peli',
 'protect-title' => 'qey "$1" yew seviyaya pawıtışi bıvıcinê',
 'prot_1movedto2' => 'nameyê [[$1]] peli yo newe: [[$2]]',
@@ -2013,7 +2037,7 @@ Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading p
 'undeletepagetext' => '{{PLURAL:$1|pelo|$1 pelo}} cerın hewn a şiyo labele hema zi arşiv de yo u tepiya geriyeno.
 Arşiv daimi pak beno.',
 'undelete-fieldset-title' => 'revizyonan tepiya bar ker',
-'undeleteextrahelp' => "qey ardışê pel u verê pelani tuşê '''tepiya biya!'''yi bıtıknê. qey ciya ciya ardışê verê pelani zi qutiye tesdiqi nişane kerê u tuşê '''tepiya biya!'''yi bıtıknê. qey hewn a kerdışê qutiya tesdiqan u qey sıfır kerdışê cayê sebebani zi tuşê '''agêr caverd/aça ker'''i bıtıknê.",
+'undeleteextrahelp' => "Qey ardışê pel u verê pelani tuşê '''tepiya biya!'''yi bıtıknê. qey ciya ciya ardışê verê pelani zi qutiye tesdiqi nişane kerê u tuşê '''tepiya biya!'''yi bıtıknê '''''{{int:undeletebtn}}'''''.. qey hewn a kerdışê qutiya tesdiqan u qey sıfır kerdışê cayê sebebani zi tuşê '''agêr caverd/aça ker'''i bıtıknê '''''{{int:undeletebtn}}'''''..",
 'undeleterevisions' => '$1 {{PLURAL:$1|revizyon|revizyon}} arşiw bi',
 'undeletehistory' => 'eke şıma pel tepiya biyari heme revizyonî zi tepiya yeni.
 eke yew pel hewn a biyo u pê nameyê o peli newe ra yew pel bıvıraziyo, revizyonê o pelê verıni zerreyê no pel de aseno.',
@@ -2023,10 +2047,10 @@ eke yew pel hewn a biyo u pê nameyê o peli newe ra yew pel bıvıraziyo, reviz
 'undeleterevision-missing' => 'revizyonê nemeqbul u vindbiyayeyi.
 Revizyoni ya hewn a biyê ya arşiw ra veciyayê ya zi cıresayişê şımayi şaş o.',
 'undelete-nodiff' => 'revizyonê verıni nidiya',
-'undeletebtn' => 'Restore bike',
+'undeletebtn' => 'Timar bike',
 'undeletelink' => 'bıvêne/peyser bia',
 'undeleteviewlink' => 'ra mocın',
-'undeletereset' => 'Sifir bike',
+'undeletereset' => 'Reset kerê',
 'undeleteinvert' => 'vicnayeyi qeldaye açarn',
 'undeletecomment' => 'Sebeb:',
 'undeletedrevisions' => 'pêro piya{{PLURAL:$1|1 qeyd|$1 qeyd}} tepiya anciya.',
@@ -2037,6 +2061,7 @@ Revizyoni ya hewn a biyê ya arşiw ra veciyayê ya zi cıresayişê şımayi ş
 
 qey karê tepiya ardışi u qey karê hewn a kerdışê verıni bıewnê [[Special:Log/delete|qeydê hewn a kerdışi]].",
 'undelete-header' => 'qey vinayişê peli yê ke cıwa ver hewn a biyê: [[Special:Log/delete|qeydê hewn a kerdışi]].',
+'undelete-search-title' => 'Bıgeyre pelanê eserıtiyan',
 'undelete-search-box' => 'bıgêr pelê hewn a biyayeyani',
 'undelete-search-prefix' => 'pel ê ke pê ney destpêkenî, ramocın',
 'undelete-search-submit' => 'bigêre',
@@ -2136,6 +2161,7 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'ipbhidename' => 'Nameyê karberî listeyan u vurnayîşan ra binumne',
 'ipbwatchuser' => 'Pela miniqaşe u pela ena karberî seyr bike',
 'ipb-change-block' => 'Pê ena ayaran, karberî reyna bloke bike',
+'ipb-confirm' => 'Bloke kerdışi tesdik ke',
 'badipaddress' => 'Adresê IPî raşt niyo',
 'blockipsuccesssub' => 'Blok biyo',
 'blockipsuccesstext' => 'verniyê [[Special:Contributions/$1|$1]] geriya.
@@ -2153,6 +2179,9 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'blocklist' => 'Karberê kılitbiyaey',
 'ipblocklist' => 'Karberê kılitbiyaey',
 'ipblocklist-legend' => 'Yew karberê blok biyaye bivîne',
+'blocklist-addressblocks' => 'Nêverdışanê IP bınımne',
+'blocklist-rangeblocks' => 'Nêverdışanê gırda bınımne',
+'blocklist-timestamp' => 'İmzay demi',
 'blocklist-target' => 'Menzil',
 'blocklist-expiry' => 'Wahdey qedyayışi',
 'blocklist-by' => 'hizmetdarê blokê',
@@ -2255,6 +2284,18 @@ Tı nıeşkeni name yew pele reyna bıvurni.
 '''Teme!'''
 Ena transfer ser peleyanê populari zaf muhumo;
 Ma tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
+'movepagetext-noredirectfixer' => "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.
+Ma nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.
+Tı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.
+Eg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|raçarnayışo dılet]] ya zi [[Special:BrokenRedirects|raçarnayışo xırab]]i qontrol bıke.
+Tı gani qontrol bıki eg gıreyan şıno peleyanê raşti.
+
+Teme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.
+Tı nıeşkeni name yew pele reyna bıvurni.
+
+'''İkaz!'''
+Ena transfer ser peleyanê populari zaf muhumo;
+Ma tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
 'movepagetalktext' => "Ma peleyê mınaqeşeyê ena pele otomatik beno, '''ma nıeşken ber, eg:'''
 *Yew peleyê mınaqeşeyê ser ena name rona esto, ya zi
 *Tı quti check nıkerd.
@@ -2417,6 +2458,9 @@ dosyaya emaneti vindbiyo',
 'import-logentry-interwiki' => '$1 transwiki biyo',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revizyon|revizyonî}} $2 ra',
 
+# JavaScriptTest
+'javascripttest' => 'Cerbnayışê JavaScripti',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Pela ya Qarberi',
 'tooltip-pt-anonuserpage' => 'pelê karberê IPyi',
@@ -2437,7 +2481,7 @@ Kerem ke, qeydkerdış ra ver gocega verqayti bıxebetne.',
 Çımey ena pele bıvin',
 'tooltip-ca-history' => 'Versiyonê verênê ena pele',
 'tooltip-ca-protect' => 'Ena pele kılit ke',
-'tooltip-ca-unprotect' => 'Ena pele a bike',
+'tooltip-ca-unprotect' => 'Starkerdışe ena peler bıvurne',
 'tooltip-ca-delete' => 'Ena pele bıestere',
 'tooltip-ca-undelete' => 'peli biyarê halê ver hewnakerdışi',
 'tooltip-ca-move' => 'Ena pele bere',
@@ -2480,6 +2524,8 @@ Kerem ke, qeydkerdış ra ver gocega verqayti bıxebetne.',
 'tooltip-diff' => 'Vurnayışe mı bımoc',
 'tooltip-compareselectedversions' => 'Ferqê versiyonan bevinin',
 'tooltip-watch' => 'Eno pele listey tıyo seyir-kerdişi ri dek',
+'tooltip-watchlistedit-normal-submit' => 'Sernuşteya hewad',
+'tooltip-watchlistedit-raw-submit' => 'Listeyê seyr kerdişî newen ke',
 'tooltip-recreate' => 'pel hewn a bışiyo zi tepiya biya',
 'tooltip-upload' => 'Bar bike',
 'tooltip-rollback' => '"Peyser biya" be yew tik pela îştirak(an)ê peyên|i(an) peyser ano.',
@@ -2512,11 +2558,17 @@ Tı eşkeno yew sebeb bınus.',
 'spam_blanking' => 'revizyonê hemeyi de ıney $1 re gıreyi estî, deverdiyeno',
 
 # Info page
+'pageinfo-title' => 'Heq tê "$1"\'i',
 'pageinfo-header-edits' => 'Vurnayışi',
 'pageinfo-header-watchlist' => 'Listey temaşi',
 'pageinfo-header-views' => 'Bıvin',
 'pageinfo-subjectpage' => 'Pele',
 'pageinfo-talkpage' => 'Pelay qıse',
+'pageinfo-watchers' => 'Amarina temaşekaran',
+'pageinfo-edits' => 'Amarina vurnayışan',
+'pageinfo-authors' => 'Amarina nuştekaran',
+'pageinfo-views' => 'Amarina mocnayışan',
+'pageinfo-viewsperedit' => 'Vurnayışi sero vurnayışa bımocnêyış',
 
 # Patrolling
 'markaspatrolleddiff' => 'Nişan bike ke devriye biyo',
@@ -2557,9 +2609,12 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pele|peli}}',
 'file-info' => 'ebatê dosyayi: $1, MIME tip: $2',
 'file-info-size' => '$1 × $2 pixelan, ebatê dosya: $3, MIME type: $4',
+'file-info-size-pages' => '$1 × $2 pikse, dergeya dosyay: $3, MIME tipiya cı: $4, $5 {{PLURAL:$5|pela|pela}}',
 'file-nohires' => 'Rovıleşiyayışo berzêr çıniyo.',
 'svg-long-desc' => 'SVG dosya, nominalin $1 × $2 piksels, ebatê dosya: $3',
 'show-big-image' => 'Resolosyonê temami',
+'show-big-image-preview' => "Verqayd dergiya: $1'i.",
+'show-big-image-other' => 'Zewmi{{PLURAL:$2|Vılêşnayış|Vılêşnayışê}}: $1.',
 'show-big-image-size' => '$1 × $2 piksel',
 'file-info-gif-looped' => 'viyariye biyo',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|çerçeve|çerçeveyi}}',
@@ -2730,10 +2785,43 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-gpsdifferential' => 'GPS differential correction',
 'exif-jpegfilecomment' => "Vatışê dosyada JPEG'i",
 'exif-keywords' => 'Qesa kelimey',
+'exif-worldregiondest' => 'Wareyo ke mocneyêno',
+'exif-countrydest' => 'Dewleta ke mocneyêna',
+'exif-countrycodedest' => 'Kodê dewleto ke mocneyoêno',
+'exif-provinceorstatedest' => 'Eyalet yana wılayeto ke mocneyêno',
+'exif-citydest' => 'Sûka ke mocneyêna',
+'exif-sublocationdest' => 'Mıntıqeya sûker mocnayış',
+'exif-objectname' => 'Sernuşteyo qıckek',
+'exif-specialinstructions' => 'Talimatê xısusi',
+'exif-headline' => 'Sername',
+'exif-credit' => 'Kredi/Destegdaren',
+'exif-source' => 'Çıme',
+'exif-urgency' => 'Aciliyet',
+'exif-fixtureidentifier' => 'Namey fiksturi',
 'exif-writer' => 'Nuştekar',
 'exif-languagecode' => 'Zuwan',
+'exif-iimversion' => 'Verqaydê IIM',
 'exif-iimcategory' => 'Kategori',
+'exif-datetimeexpires' => 'No peyra mekarênê',
+'exif-datetimereleased' => 'Bıroşe',
+'exif-originaltransmissionref' => 'Oricinal pusula da kodê açarnayışi',
+'exif-identifier' => 'Şınasnayer',
+'exif-lens' => 'Lensê karkerdışi',
+'exif-cameraownername' => 'Wayırê kamera',
 'exif-label' => 'Etiket',
+'exif-rating' => 'Rey dayış (5i sera)',
+'exif-copyrighted' => 'Weziyetê telifi',
+'exif-copyrightowner' => 'Wayırê Telifi',
+'exif-usageterms' => 'Şertê karkerdışi',
+'exif-pngfilecomment' => "Vatışê dosyada PNG'i",
+'exif-disclaimer' => 'Reddê mesuliyeti',
+'exif-contentwarning' => 'İkazê zerreki',
+'exif-giffilecomment' => "vatena dosya da GIF'i",
+'exif-intellectualgenre' => 'Babeta çêki',
+'exif-subjectnewscode' => 'Kodê muhtewa',
+'exif-event' => 'Weqaya ke nameycıyo ravreno',
+'exif-organisationinimage' => 'Organizasyono ke ravêreno',
+'exif-personinimage' => 'Merdumo ke nameycıyo ravêreno',
 
 # EXIF attributes
 'exif-compression-1' => 'têhet nêanciyayo',
@@ -2821,6 +2909,8 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-sensingmethod-7' => 'Sensorê hirê-çizgi',
 'exif-sensingmethod-8' => 'sensora aritmetik a ke rengın his kena',
 
+'exif-filesource-3' => 'Dicital makinay kamera',
+
 'exif-scenetype-1' => 'ca de fotoğraf ker',
 
 'exif-customrendered-0' => 'Prosesê normali',
@@ -2869,6 +2959,10 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-gpslongitude-e' => 'derganiya rocvetış',
 'exif-gpslongitude-w' => 'Derganiya rocawan',
 
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => 'Sewiye de roy ra $1 {{PLURAL:$1|metre|metre}} cordeyo',
+'exif-gpsaltitude-below-sealevel' => 'Sewiye de roy ra $1 {{PLURAL:$1|metre|metre}} cêrdeyo',
+
 'exif-gpsstatus-a' => 'peymawıtış dewam keno',
 'exif-gpsstatus-v' => 'şuxuliyayişê peymawıtışi',
 
@@ -2995,6 +3089,19 @@ eke şıma hesab *a nêkerdo*, qey ibtalê tesdiqkerdışê adresa e-postayi gı
 
 $5
 
+kodê tesdiqi heta ıney tarixi $4 meqbul o.',
+'confirmemail_body_set' => 'Jew ten, muhtemelen şıma no IP-adresi $1 ra,
+keye pelê {{SITENAME}}i de pê no $2 e-postayi hesab kerda.
+
+Eke raşta no e-posta eyê şıma yo şıma gani tesdiq bıkerî,
+qey tesdiq kerdışi gani karê e-postayê keyepeli {{SITENAME}} aktif bıbo, qey aktif kerdışi gıreyê cêrıni bıtıkne:
+
+$3
+
+eke şıma hesab *nêakerdo*, qey ibtalê tesdiq kerdışê adresa e-postayi gıreyê cêrêni bıtıknê:
+
+$5
+
 kodê tesdiqi heta ıney tarixi $4 meqbul o.',
 'confirmemail_invalidated' => 'Konfermasyonê adres ê emaîlî iptal biy',
 'invalidateemail' => 'confirmasyonê e-maili iptal bik',
@@ -3109,6 +3216,11 @@ Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 'version-license' => 'Lisans',
 'version-poweredby-credits' => "Ena wiki, dezginda '''[//www.mediawiki.org/ MediaWiki]''' ya piya vıraziyaya, heqê telifi © 2001-$1 $2.",
 'version-poweredby-others' => 'Zewmi',
+'version-license-info' => "MediaWiki xoseri jew nuştereno; MediaWiki'yer, weqfê xoseri nuşteren GNU lisansiya merdumi şene ke vıla kerê, bıvurnê u timar kerê.
+
+Nuşterenê MediaWiki merdumi cı ra nahfat bivinê deye êyê mısade danê; feqet ke nêşeno BIROŞO yana XOSERİ VILA KERO qerantiya ney çına. bewni rê lisansta GNU'y.
+
+enê programiya piya [{{SERVER}}{{SCRIPTPATH}}/COPYING jew kopyay lisans dê GNU] zi şımarê icab keno; narak lisansê şıma çıno se, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA adresi ra yana [//www.gnu.org/licenses/old-licenses/gpl-2.0.html enê lisansi buwane].",
 'version-software' => 'Softwareyê ronayi',
 'version-software-product' => 'Mal',
 'version-software-version' => 'Versiyon',
@@ -3210,14 +3322,17 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 # New logging system
 'logentry-delete-delete' => "$1'i Pelaya $3'i besternê",
 'logentry-delete-restore' => "$1'i pelaya $3'i peyd grot",
+'logentry-suppress-delete' => '$1  $3 rê pıloxneyê',
 'revdelete-content-hid' => 'nusno nımte',
 'revdelete-summary-hid' => 'Vurnayışi nımtey niyê',
 'revdelete-uname-hid' => 'Namey karberi nımteyo',
+'revdelete-content-unhid' => 'Zerrek mocneya',
 'revdelete-summary-unhid' => 'Xulusaya vurnayışa mucneyê',
 'revdelete-uname-unhid' => 'Namey karberi ne nımteyo',
 'revdelete-restricted' => 'verger (vergırewtış) ê ke qey xızmkaran biye',
 'revdelete-unrestricted' => 'verger (ver gırewtış) ê ke qey xızmkaran diyê wera (wedariyê)',
 'logentry-move-move' => "$1'i pelaya $3'i berd $4",
+'logentry-move-move-noredirect' => "$1'i pelay $3 raçarnayış neker dı u berd $4",
 'logentry-newusers-newusers' => '$1 deye namey karberi vıraziya',
 'logentry-newusers-create' => '$1 deye namey karberi vıraziya',
 'logentry-newusers-create2' => "$1'i $3 rê hesab vıraşt",
@@ -3231,9 +3346,14 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 'feedback-adding' => 'Pela rê peyxeberdar defêno...',
 'feedback-error1' => 'Xeta: API ra neticey ne vıcyay',
 'feedback-error2' => 'Xeta: Timar kerdış nebı',
+'feedback-error3' => 'Xeta: API ra cewab çıno',
 'feedback-close' => 'Biya star',
+'feedback-bugnew' => 'Mı qontrol ke. Xetaya newi xeber ke',
 
 # API errors
+'api-error-duplicate' => 'Ena {{PLURAL:$1|ze ke [zey $2]|biya [zey dosya da $2]}} zeq wesiqa biya wendeyê.',
+'api-error-duplicate-archive' => 'Ena {{PLURAL:$1|vurneyaya [$2 zey na dosya]| [zerrey cı zey $2 dosya]}} aseno,feqet {{PLURAL:$1|ena dosya|tewr veri}} besterneyaya.',
+'api-error-duplicate-archive-popup-title' => 'Ena {{PLURAL:$1|Dosya besterneyaya|dosya}} xora  besterneyaya.',
 'api-error-duplicate-popup-title' => '{{PLURAL:$1|dosyaya|dosyaya}} dılet',
 'api-error-unknown-code' => "$1'dı jew xeta vıciye",
 'api-error-unknown-warning' => "$1'dı ikazo xırab:",
index 9a55c3d..2a762d5 100644 (file)
@@ -1399,7 +1399,7 @@ You will have to merge your changes into the existing text.
 '''Only''' the text in the upper text area will be saved when you press \"{{int:savearticle}}\".",
 'yourtext'                         => 'Your text',
 'storedversion'                    => 'Stored revision',
-'nonunicodebrowser'                => "'''Warning: Your browser is not unicode compliant.'''
+'nonunicodebrowser'                => "'''Warning: Your browser is not Unicode compliant.'''
 A workaround is in place to allow you to safely edit pages: Non-ASCII characters will appear in the edit box as hexadecimal codes.",
 'editingold'                       => "'''Warning: You are editing an out-of-date revision of this page.'''
 If you save it, any changes made since this revision will be lost.",
@@ -1626,7 +1626,7 @@ Please check the logs.',
 # Suppression log
 'suppressionlog'     => 'Suppression log',
 'suppressionlogtext' => 'Below is a list of deletions and blocks involving content hidden from administrators.
-See the [[Special:BlockList|IP block list]] for the list of currently operational bans and blocks.',
+See the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.',
 
 # History merging
 'mergehistory'                     => 'Merge page histories',
@@ -3137,7 +3137,7 @@ Fill in a specific reason below (for example, citing particular pages that were
 'badipaddress'                    => 'Invalid IP address',
 'blockipsuccesssub'               => 'Block succeeded',
 'blockipsuccesstext'              => '[[Special:Contributions/$1|$1]] has been blocked.<br />
-See [[Special:BlockList|IP block list]] to review blocks.',
+See the [[Special:BlockList|block list]] to review blocks.',
 'ipb-blockingself'                => 'You are about to block yourself!  Are you sure you want to do that?',
 'ipb-confirmhideuser'             => 'You are about to block a user with "hide user" enabled.  This will suppress the user\'s name in all lists and log entries.  Are you sure you want to do that?',
 'ipb-edit-dropdown'               => 'Edit block reasons',
@@ -3175,7 +3175,7 @@ See [[Special:BlockList|IP block list]] to review blocks.',
 'createaccountblock'              => 'account creation blocked',
 'emailblock'                      => 'e-mail blocked',
 'blocklist-nousertalk'            => 'cannot edit own talk page',
-'ipblocklist-empty'               => 'The blocklist is empty.',
+'ipblocklist-empty'               => 'The block list is empty.',
 'ipblocklist-no-results'          => 'The requested IP address or username is not blocked.',
 'blocklink'                       => 'block',
 'unblocklink'                     => 'unblock',
@@ -3193,7 +3193,7 @@ The suppress log is provided below for reference:',
 'reblock-logentry'                => 'changed block settings for [[$1]] with an expiry time of $2 $3',
 'blocklogtext'                    => 'This is a log of user blocking and unblocking actions.
 Automatically blocked IP addresses are not listed.
-See the [[Special:BlockList|IP block list]] for the list of currently operational bans and blocks.',
+See the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.',
 'unblocklogentry'                 => 'unblocked $1',
 'block-log-flags-anononly'        => 'anonymous users only',
 'block-log-flags-nocreate'        => 'account creation disabled',
index bdba52b..f57be39 100644 (file)
@@ -1750,7 +1750,7 @@ $1",
 'action-undelete' => 'احیای این صفحه',
 'action-suppressrevision' => 'مشاهده و احیای ویرایش‌های حذف شده',
 'action-suppressionlog' => 'مشاهدهٔ این سیاههٔ خصوصی',
-'action-block' => 'قطع دسترسی ویرایش این کاربر',
+'action-block' => 'قطع دسترسی این کاربر از ویرایش کردن',
 'action-protect' => 'تغییر سطح محافظت این صفحه',
 'action-rollback' => 'واگردانی سریع ویرایش‌های آخرین کاربری که یک صفحه را ویرایش کرده‌است',
 'action-import' => 'وارد کردن این صفحه از یک ویکی دیگر',
index e67a909..7760366 100644 (file)
@@ -16,6 +16,7 @@
  * @author Jack Phoenix
  * @author Jafeluv
  * @author Kaganer
+ * @author Kulmalukko
  * @author Mobe
  * @author Nedergard
  * @author Nike
@@ -2865,6 +2866,7 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'tooltip-diff' => 'Näytä tehdyt muutokset',
 'tooltip-compareselectedversions' => 'Vertaile valittuja versioita',
 'tooltip-watch' => 'Lisää tämä sivu tarkkailulistaan',
+'tooltip-watchlistedit-normal-submit' => 'Poista otsikot',
 'tooltip-watchlistedit-raw-submit' => 'Päivitä tarkkailulista',
 'tooltip-recreate' => 'Luo sivu uudelleen',
 'tooltip-upload' => 'Aloita tallennus',
index fc929db..369d443 100644 (file)
@@ -2048,8 +2048,8 @@ $1',
 '''ԶԳՈՒՇԱՑՈ՜ՒՄ'''
 Այս գործողությունը կարող է ունենալ արմատական ազդեցություն ''ժողովրդական'' էջի համար։
 Շարունակելուց առաջ խնդրում ենք համոզվել նրանում, որ դուք հասկանում եք հնարավոր հետևանքները։",
-'movepagetalktext' => "Կցված քննարկման էջը ավտոմատիկ կտեղափոխվի էջի հետ՝ '''բացառությամբ դեպքերի, երբ'''.
-*Գոյություն ունի ոչ-դատարկ քքնարկման էջ նոր անվանման տակ
+'movepagetalktext' => "Կցված քննարկման էջը ավտոմատ կտեղափոխվի էջի հետ՝ '''բացառությամբ այն դեպքերի, երբ'''.
+*Գոյություն ունի ոչ-դատարկ քննարկման էջ նոր անվանման տակ
 *Դուք հանել եք նշումը ստորև արկղից
 
 Այսպիսի դեպքերում հարկավոր է տեղափոխել կամ միաձուլել էջերը ձեռքով, եթե դա ցանկանաք։",
index 3cabb47..e8369d9 100644 (file)
@@ -750,6 +750,9 @@ $2',
 'ns-specialprotected' => '特別ページは編集できません。',
 'titleprotected' => "[[User:$1|$1]]によりこのページ名を持つページの作成は保護されています。
 理由は「''$2''」です。",
+'filereadonlyerror' => 'ファイルリポジトリ「$2」が読み取り専用の状態にあるため、ファイル「$1」を変更することができません。
+
+読み取り専用に設定した管理者からの説明: 「$3」',
 
 # Virus scanner
 'virus-badscanner' => "環境設定が不適合です:不明なウイルス検知ソフトウェア:''$1''",
@@ -846,6 +849,7 @@ $2',
 'invalidemailaddress' => '入力されたメールアドレスが正しい形式に従っていないため、受け付けられません。
 正しい形式で入力し直すか、メールアドレス欄を空にしておいてください。',
 'cannotchangeemail' => 'このウィキでは、アカウントの電子メールアドレスを変更できません。',
+'emaildisabled' => 'このサイトでは、メールの送信はできません。',
 'accountcreated' => 'アカウントを作成しました',
 'accountcreatedtext' => '利用者アカウント:$1が作成されました。',
 'createaccount-title' => '{{SITENAME}}のアカウント作成',
@@ -1073,6 +1077,7 @@ IPアドレスは複数の利用者の間で共有されていることがあり
 これは、問題のある匿名プロキシサービスを利用していると、起こることがあります。",
 'edit_form_incomplete' => "'''一部の編集フォームの値がサーバーに届きませんでした。ご確認の上、そのまま再度投稿してください。'''",
 'editing' => '「$1」を編集中',
+'creating' => '「$1」を作成中',
 'editingsection' => '「$1」を編集中 (節単位)',
 'editingcomment' => '「$1」を編集中 (新しい節)',
 'editconflict' => '編集競合:$1',
@@ -1140,6 +1145,7 @@ IPアドレスは複数の利用者の間で共有されていることがあり
 'edit-no-change' => '文章が変更されていないため、編集は無視されました。',
 'edit-already-exists' => '新しいページを作成できませんでした。
 そのページは、すでに存在しています。',
+'defaultmessagetext' => '既定のメッセージ文',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''警告:'''このページでの、高負荷なパーサー関数の呼び出し回数が多過ぎます。
@@ -1727,6 +1733,7 @@ HTMLタグを見直してください。',
 'newsectionsummary' => '/* $1 */ 新しい節',
 'rc-enhanced-expand' => '詳細を表示(JavaScriptが必要)',
 'rc-enhanced-hide' => '詳細を非表示',
+'rc-old-title' => '作成時のページ名は「$1」',
 
 # Recent changes linked
 'recentchangeslinked' => '関連ページの更新状況',
@@ -1901,6 +1908,7 @@ $1',
 'backend-fail-stream' => 'ファイル $1 をストリームできませんでした。',
 'backend-fail-backup' => 'ファイル $1 をバックアップできませんでした。',
 'backend-fail-notexists' => 'ファイル $1 は存在しません。',
+'backend-fail-hashes' => 'ファイルの比較用のハッシュを取得できませんでした。',
 'backend-fail-notsame' => 'ファイル名 $1 はすでに違うファイルが使用しています。',
 'backend-fail-invalidpath' => '$1 はストレージパスに使用することができません。',
 'backend-fail-delete' => 'ファイル $1 を削除できませんでした。',
@@ -1913,10 +1921,23 @@ $1',
 'backend-fail-closetemp' => '一時ファイルを閉じることができませんでした。',
 'backend-fail-read' => 'ファイル $1 を読み込めませんでした。',
 'backend-fail-create' => 'ファイル $1 を作成できませんでした。',
+'backend-fail-maxsize' => 'ファイル「$1」は{{PLURAL:$2||}}$2バイトよりも大きいため、作成できませんでした。',
 'backend-fail-readonly' => 'ストレージバックエンド「$1」は現在読み取り専用です。理由:「$2」',
 'backend-fail-synced' => 'ファイル「$1」は、ストレージバックエンド内部において不一致の状態にあります。',
+'backend-fail-connect' => 'ストレージバックエンドに接続できませんでした。「$1」',
+'backend-fail-internal' => 'ストレージバックエンド「$1」で原因不明のエラーが発生しました。',
 'backend-fail-contenttype' => '「$1」に保存するコンテンツの種類が判断できませんでした。',
 
+# Lock manager
+'lockmanager-notlocked' => '「$1」をアンロックできませんでした。ロックはされていません。',
+'lockmanager-fail-closelock' => '「$1」用のロックファイルを閉じることができませんでした。',
+'lockmanager-fail-deletelock' => '「$1」用のロックファイルを削除することができませんでした。',
+'lockmanager-fail-acquirelock' => '「$1」用のロックを取得できませんでした。',
+'lockmanager-fail-openlock' => '「$1」用のロックファイルを開くことができませんでした。',
+'lockmanager-fail-releaselock' => '「$1」用のロックを解放できませんでした。',
+'lockmanager-fail-db-release' => 'データベース $1 上のロックを解放できませんでした。',
+'lockmanager-fail-svr-release' => 'サーバー $1 上のロックを解放できませんでした。',
+
 # ZipDirectoryReader
 'zip-file-open-error' => 'ZIPのチェックを行った際にエラーが検出されました。',
 'zip-wrong-format' => '指定されたファイルはZIPファイルではありませんでした。',
@@ -2023,7 +2044,12 @@ URLが正しいものであり、ウェブサイトが稼働していること
 'sharedupload' => 'このファイルは$1のものであり、他のプロジェクトで使用されている可能性があります。',
 'sharedupload-desc-there' => 'このファイルは$1のものであり、他のプロジェクトで使用されている可能性があります。
 詳細は[$2 ファイル解説ページ]を参照してください。',
-'sharedupload-desc-here' => 'このファイルは$1のものであり、他のプロジェクトで使用されている可能性があります。その[$2 ファイル解説ページ]にある説明を以下に表示しています。',
+'sharedupload-desc-here' => 'このファイルは$1から来ており、他のプロジェクトで使用されている可能性があります。
+$1での[$2 ファイル解説ページ]にある説明を以下に示します。',
+'sharedupload-desc-edit' => 'このファイルは$1から来ており、他のプロジェクトで使用されている可能性があります。
+$1での[$2 ファイル解説ページ]にある説明を編集したほうがいいかもしれません。',
+'sharedupload-desc-create' => 'このファイルは$1から来ており、他のプロジェクトで使用されている可能性があります。
+$1での[$2 ファイル解説ページ]にある説明を編集したほうがいいかもしれません。',
 'filepage-nofile' => 'この名前のファイルは存在しません。',
 'filepage-nofile-link' => 'この名前のファイルは存在しませんが、[$1 アップロード]することができます。',
 'uploadnewversion-linktext' => 'このファイルの新しい版をアップロードする',
@@ -2160,6 +2186,8 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'wantedpages' => 'ページが存在しないリンク',
 'wantedpages-badtitle' => '結果に不正なページ名が含まれています:$1',
 'wantedfiles' => 'ファイル情報ページが存在しないファイル',
+'wantedfiletext-cat' => '下記のファイルは存在していませんが、使われています。外部リポジトリ由来のファイルは存在しているにもかかわらずここに列挙されることがあります。そのような偽陽性は<del>取り消され</del>ます。加えて、存在していないファイルを埋め込んでいるページは[[:$1]]に列挙されます。',
+'wantedfiletext-nocat' => '下記のファイルは存在していませんが、使われています。外部リポジトリ由来のファイルは存在しているにもかかわらずここに列挙されることがあります。そのような偽陽性は<del>取り消され</del>ます。',
 'wantedtemplates' => '呼び出し先が存在しないテンプレート呼び出し',
 'mostlinked' => '被リンク数の多いページ',
 'mostlinkedcategories' => '被リンク数の多いカテゴリ',
@@ -2237,6 +2265,7 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'allpagesbadtitle' => '指定したページ名は無効か、言語間またはウィキ間接頭辞を含んでいます。
 ページ名に使用できない文字が1つ以上含まれている可能性があります。',
 'allpages-bad-ns' => '{{SITENAME}}に「$1」という名前空間はありません。',
+'allpages-hide-redirects' => 'リダイレクトを隠す',
 
 # Special:Categories
 'categories' => 'カテゴリ',
@@ -2999,6 +3028,13 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 # JavaScriptTest
 'javascripttest' => 'JavaScript をテスト中',
 'javascripttest-disabled' => 'この機能はこのウィキでは有効にされていません。',
+'javascripttest-title' => '$1 のテストの実行',
+'javascripttest-pagetext-noframework' => 'このページは JavaScript のテストを実行するために予約されています。',
+'javascripttest-pagetext-unknownframework' => '未知のテストフレームワーク「$1」。',
+'javascripttest-pagetext-frameworks' => '次のテストフレームワークからひとつを選択してください:$1',
+'javascripttest-pagetext-skins' => 'テストを実行する外装を選択してください:',
+'javascripttest-qunit-intro' => 'mediawiki.org上の[$1 テストのドキュメント]を参照してください。',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit テストスイート',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => '自分の利用者ページ',
index befc719..682f7a7 100644 (file)
@@ -169,6 +169,17 @@ $messages = array(
 'faq' => 'Isteqsiyen',
 'faqpage' => 'Project:Isteqsiyen',
 
+# Vector skin
+'vector-action-delete' => 'Mḥu',
+'vector-action-move' => 'Smimeḍ',
+'vector-view-create' => 'Snulfu',
+'vector-view-edit' => 'Ẓẓiẓreg',
+'vector-view-history' => 'Ẓeṛ amazray',
+'vector-view-view' => 'Ɣer',
+'actions' => 'Tigawtin',
+'namespaces' => 'Talluntin n isemawen',
+'variants' => 'Tineḍwa',
+
 'errorpagetitle' => 'Agul',
 'returnto' => 'Uɣal ar $1.',
 'tagline' => 'Seg {{SITENAME}}',
@@ -184,6 +195,7 @@ $messages = array(
 'permalink' => 'Azday ur yettbeddil ara',
 'print' => 'Imprimi',
 'edit' => 'Beddel',
+'create' => 'Snulfu',
 'editthispage' => 'Beddel asebter-agi',
 'delete' => 'Mḥu',
 'deletethispage' => 'Mḥu asebter-agi',
@@ -253,6 +265,7 @@ $messages = array(
 'youhavenewmessagesmulti' => 'Tesɛiḍ iznan imaynuten deg $1',
 'editsection' => 'beddel',
 'editold' => 'beddel',
+'editlink' => 'beddel',
 'viewsourcelink' => 'ẓeṛ aɣbalu',
 'editsectionhint' => 'Beddel amur: $1',
 'toc' => 'Agbur',
@@ -263,13 +276,14 @@ $messages = array(
 'restorelink' => '{{PLURAL:$1|Yiwen abeddel yettumḥan|$1 Ibeddlen yettumḥan}}',
 'feedlinks' => 'Asuddem:',
 'feed-invalid' => 'Anaw n usuddem mačči ṣaḥiḥ.',
+'site-atom-feed' => 'Taneflit Atom n $1',
 'red-link-title' => '$1 (ulac asebter)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Amagrad',
 'nstab-user' => 'Asebter n wemseqdac',
 'nstab-media' => 'Asebter n media',
-'nstab-special' => 'Uslig',
+'nstab-special' => 'Asebter uslig',
 'nstab-project' => 'Awal ɣef...',
 'nstab-image' => 'Afaylu',
 'nstab-mediawiki' => 'Izen',
@@ -303,6 +317,12 @@ MySQL yerra-d agul "$3: $4"',
 'readonlytext' => 'Database d tamsekkert, ahat tettuseggem, qrib ad tuɣal-d.
 
 Win (anedbal) isekker-itt yenna-d: $1',
+'missing-article' => 'Taffa n isefka ur t-ufa ara aḍris n yiwen usebter ilaq at af, s-isem « $1 » $2.
+
+Umata, wagi yeḍra mi neḍfeṛ azday ɣer yiwen diff aqbur naɣ ɣer amazray n usebter yemḥan.
+
+Ma mačči d-tajṛut agi, ihi d-taniwit deg uhil.
+Ilaq ad εeggenem yiwen [[Special:ListUsers/sysop|anedbal]] war ad ttum asefkem URL n uzday.',
 'readonly_lag' => 'Database d tamsekkert (weḥdes) axaṭer kra n serveur ɛeṭṭlen',
 'internalerror' => 'Agul zdaxel',
 'filecopyerror' => 'Ur yezmir ara ad yexdem alsaru n ufaylu "$1" ar "$2".',
@@ -594,6 +614,12 @@ Inedbalen wiyaḍ deg wiki-yagi zemren ad ẓren imuren i yettwafren u zemren a
 'revdelete-submit' => 'Eg-it i tasiwelt tettwafren',
 'revdelete-success' => "'''Asekkud n tasiwelt yettuxdem.'''",
 'logdelete-success' => "'''Asekkud n tamirt yettuxdem.'''",
+'revdel-restore' => 'beddel timezrit',
+'revdel-restore-deleted' => 'allas iqḍeεen',
+'revdel-restore-visible' => 'allas i nezmer an ẓeṛ',
+
+# Merge log
+'revertmerge' => 'Fru',
 
 # Diffs
 'difference' => '(Imgerraden ger tisiwal)',
@@ -604,6 +630,7 @@ Inedbalen wiyaḍ deg wiki-yagi zemren ad ẓren imuren i yettwafren u zemren a
 
 # Search results
 'searchresults' => 'Igmad n unadi',
+'searchresults-title' => 'Igmad n unadi i "$1"',
 'searchresulttext' => 'Akken ad tessneḍ amek ara tnadiḍ deg {{SITENAME}}, ẓer [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => "Tnadiḍ ɣef '''[[:$1]]'''",
 'searchsubtitleinvalid' => "Tnadiḍ ɣef '''$1'''",
@@ -613,11 +640,28 @@ Inedbalen wiyaḍ deg wiki-yagi zemren ad ẓren imuren i yettwafren u zemren a
 'notextmatches' => 'ulac ayen yecban azwel n usebter',
 'prevn' => '{{PLURAL:$1|$1}} ssabeq',
 'nextn' => '{{PLURAL:$1|$1}} ameḍfir',
+'prevn-title' => '$1 {{PLURAL:$1|agmud n uqbel|igmad n uqbel}}',
+'nextn-title' => '$1 {{PLURAL:$1|agmud n sakin|igmad n sakin}}',
+'shown-title' => 'Beqqeḍ $1 {{PLURAL:$1|agmud|igmad}} s usebter',
 'viewprevnext' => 'Ẓer ($1 {{int:pipe-separator}} $2) ($3).',
 'searchhelp-url' => 'Help:Agbur',
+'searchprofile-articles' => 'Isebtaren n ugbur',
+'searchprofile-project' => 'Isebtaren n tallat dɣa n usenfa',
+'searchprofile-images' => 'Agetmedia',
+'searchprofile-everything' => 'Akk',
+'searchprofile-advanced' => 'Anadi anemhal',
+'searchprofile-articles-tooltip' => 'Nadi deg $1',
+'searchprofile-project-tooltip' => 'Nadi deg $1',
+'searchprofile-images-tooltip' => 'Nadi  ifuyla agetmedia',
+'searchprofile-everything-tooltip' => 'Nadi deg akk usmel (ula deg isebtaren n umyannan)',
+'searchprofile-advanced-tooltip' => 'Fren ideggen n isemawen i unadi',
 'search-result-size' => '$1 ({{PLURAL:$2|1 awal|$2 awalen}})',
+'search-redirect' => '(asemmimeḍ $1)',
+'search-section' => '(tigezmi $1)',
+'searchall' => 'akk',
 'showingresults' => "Tamuli n {{PLURAL:$1|'''Yiwen''' wegmud|'''$1''' n yigmad}} seg  #'''$2'''.",
 'showingresultsnum' => "Tamuli n {{PLURAL:$3|'''Yiwen''' wegmud|'''$3''' n yigmad}} seg  #'''$2'''.",
+'showingresultsheader' => "{{PLURAL:$5|Agmud '''$1'''|Igmad '''$1–$2'''}} n '''$3''' i '''$4'''",
 'nonefound' => "'''Tamawt''': S umata, asmi ur tufiḍ acemma
 d ilmen awalen am \"ala\" and \"seg\",
 awalen-agi mačči deg tasmult, neɣ tefkiḍ kter n yiwen n wawal (ala isebtar
@@ -822,7 +866,9 @@ Ma tesɛiḍ tugna-nni s resolution tameqqrant, azen-it, ma ulac beddel isem-is.
 
 # File description page
 'file-anchor-link' => 'Afaylu',
+'filehist' => 'Amazray n tugna',
 'filehist-current' => 'Lux a',
+'filehist-datetime' => 'Azmez/Asrag',
 'filehist-user' => 'Amseqdac',
 'imagelinks' => 'Izdayen',
 'linkstoimage' => 'isebtar-agi sɛan azday ar afaylu-agi',
@@ -987,6 +1033,7 @@ deg « Expéditeur» n izen inek iwakken amseqdac-nni yezmer a k-yerr.',
 # Watchlist
 'watchlist' => 'Umuɣ n uɛessi inu',
 'mywatchlist' => 'Umuɣ n uɛessi inu',
+'watchlistfor2' => 'I $1 $2',
 'nowatchlist' => 'Umuɣ n uɛessi inek d ilem.',
 'watchlistanontext' => 'G leɛnaya-k $1 iwakken ad twalaḍ neɣ tbeddleḍ iferdas deg wumuɣ n uɛessi inek.',
 'watchnologin' => 'Ur tekcimeḍ ara',
@@ -1012,6 +1059,7 @@ Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
 'iteminvalidname' => "Agnu akk d uferdis '$1', isem mačči ṣaḥiḥ...",
 'wlnote' => "Deg ukessar {{PLURAL:$1|yella yiwen ubeddel aneggaru|llan '''$1''' n yibeddlen ineggura}} deg {{PLURAL:$2|saɛa taneggarut|'''$2''' swayeɛ tineggura}}.",
 'wlshowlast' => 'Ssken $1 n swayeɛ $2 n wussan neɣ $3 ineggura',
+'watchlist-options' => 'Tifranin n umuɣ n uɛessi',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Ad iɛass...',
@@ -1067,6 +1115,7 @@ Tadhelt:
 'deletecomment' => 'Ayɣer',
 
 # Rollback
+'rollbacklink' => 'semmet',
 'cantrollback' => 'Ur yezmir ara ad yessuɣal; yella yiwen kan amseqdac iwumi ibeddel/yexleq asebter-agi.',
 'editcomment' => "Agzul n ubeddel yella: \"''\$1''\".",
 'revertpage' => 'Yessuɣal ibeddlen n [[Special:Contributions/$2|$2]] ([[User talk:$2|Meslay]]); yettubeddel ɣer tasiwelt taneggarut n [[User:$1|$1]]',
@@ -1095,6 +1144,8 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 
 # Undelete
 'viewdeletedpage' => 'Ẓer isebtar yettumḥan',
+'undeletelink' => 'ẓeṛ/uɣaled',
+'undeleteviewlink' => 'ẓeṛ',
 'undeletecomment' => 'Awennit:',
 'undelete-header' => 'Ẓer [[Special:Log/delete|aɣmis n umḥay]] i isebtar ttumḥan tura.',
 'undelete-search-box' => 'Nadi ɣef isebtar yettumḥan',
@@ -1143,6 +1194,8 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 'badipaddress' => 'Tansa IP mačči d ṣaḥiḥ',
 'ipblocklist-submit' => 'Nadi',
 'blocklink' => 'ɛekkel',
+'unblocklink' => 'ekkes asewḥel',
+'change-blocklink' => 'beddel asewḥel',
 'contribslink' => 'tikkin',
 'block-log-flags-anononly' => 'Imseqdacen udrigen kan',
 'proxyblockreason' => 'Tansa n IP inek teɛkel axaṭer nettat "open proxy". G leɛnayek, meslay akk d provider inek.',
@@ -1268,6 +1321,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-search-fulltext' => 'Nadi isebtar i sɛan aḍris agi',
 'tooltip-p-logo' => 'Asebter amenzawi',
 'tooltip-n-mainpage' => 'Ẓer asebter amenzawi',
+'tooltip-n-mainpage-description' => 'Rzu asebter amenzawi',
 'tooltip-n-portal' => 'Ɣef usenfar, ayen tzemrḍ ad txedmeḍ, anda tafeḍ tiɣawsiwin',
 'tooltip-n-currentevents' => 'Af ayen yeḍran tura',
 'tooltip-n-recentchanges' => 'Umuɣ n yibeddlen imaynuten deg wiki.',
@@ -1281,6 +1335,8 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-t-emailuser' => 'Azen e-mail i wemseqdac-agi',
 'tooltip-t-upload' => 'Azen ifuyla',
 'tooltip-t-specialpages' => 'Umuɣ n akk isebtar usligen',
+'tooltip-t-print' => 'Lqem tasiggezt n usebter agi',
+'tooltip-t-permalink' => 'Azday ameɣlal ɣer lqem agi n usebter',
 'tooltip-ca-nstab-main' => 'Ẓer ayen yellan deg usebter',
 'tooltip-ca-nstab-user' => 'Ẓer asebter n wemseqdac',
 'tooltip-ca-nstab-media' => 'Ẓer asebter n media',
@@ -1298,6 +1354,8 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-compareselectedversions' => 'Ẓer amgirred ger snat tisiwlini (i textareḍ) n usebter-agi.',
 'tooltip-watch' => 'Rnu asebter-agi i wumuɣ n uɛessi inu',
 'tooltip-recreate' => 'Ɛiwed xleq asebter ɣas akken yettumḥu',
+'tooltip-rollback' => '« Semmet » yesemmet s-yiwen asenned akk d-acu amseqdac aneggaru yebeddel deg usebter',
+'tooltip-undo' => '« Ssefsu » yesemmet abeddel agi dɣa i ldi asfaylu n ubeddel deg uskar n azaraskan. I ɛemmed an uɣal ar lqem n uqbel dɣa an rnu taɣẓint deg tanaka n ugzul.',
 
 # Attribution
 'anonymous' => 'Amseqdac udrig (Imseqdacen udrigen) n {{SITENAME}}',
index a9ce9e3..483a7d2 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Erdemaslancan
  * @author Mirzali
  */
 
index 0383065..0624ce1 100644 (file)
@@ -1384,6 +1384,7 @@ Adspectum graciliorem potes facere modum indicum, nomen usoris (cave litteras ma
 'allpagesprefix' => 'Monstrare paginas quibus est praeverbium:',
 'allpagesbadtitle' => 'Nomen paginae datum fuit invalidum aut praverbium interlinguale vel interviciale habuit. Fortasse insunt una aut plus litterarum quae in titulis non possunt inscribier.',
 'allpages-bad-ns' => 'Non est spatium nominale "$1" apud {{grammar:accusative|{{SITENAME}}}}.',
+'allpages-hide-redirects' => 'Celare redirectiones',
 
 # Special:Categories
 'categories' => 'Categoriae',
index dfe840f..24c487d 100644 (file)
@@ -27,6 +27,7 @@ $messages = array(
 'tog-hideminor' => 'Мукьвара хьайи дегишвилера авай гъвечIи дуьзар хъувунар чуьнуьхун',
 'tog-hidepatrolled' => 'Мукьвара хьайи дегишвилера авай къаравулвал авунвай дуьзар хъувунар чуьнуьхун',
 'tog-newpageshidepatrolled' => 'ЦIийи ччинрин сиягьда къаравулвал авунвай ччинар чуьнуьхун',
+'tog-extendwatchlist' => 'Чlехи сиягь килигунин, кутазвай вири дегишунар, амма са эхирбур туш',
 'tog-usenewrc' => 'ЦIийи дегишвилерин сиягь кардик кутун (JavaScript герекзава)',
 'tog-numberheadings' => 'КЬилин цIарариз автоматдаказ номерар эцигун',
 'tog-showtoolbar' => 'Дуьзар хъувунин алатрин кьвати къалура (JavaScript)',
index 91aac02..6fc01f0 100644 (file)
@@ -12,6 +12,7 @@
  * @author Dakrismeno
  * @author DracoRoboter
  * @author Flavio05
+ * @author GatoSelvadego
  * @author Insübrich
  * @author Kemmótar
  * @author Malafaya
@@ -1364,6 +1365,9 @@ Te riçevaree un mesacc cun deent un ligamm specjal; ti duvaree clicaa sül liga
 'watchlisttools-edit' => 'Varda e mudifega la lista di paginn che te tegnet sut ögg',
 'watchlisttools-raw' => 'Mudifega la lista in furmaa test',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ciciaràde]])',
+
 # Special:Version
 'version' => 'Versiun',
 
index 46fb3ca..8a8c926 100644 (file)
@@ -18,6 +18,7 @@
  * @author Kaganer
  * @author Matasg
  * @author Meno25
+ * @author Ola
  * @author Pdxx
  * @author Perkunas
  * @author Pėstininkas
@@ -835,7 +836,7 @@ Jūs galite [[Special:Search/{{PAGENAME}}|ieškoti šio puslapio pavadinimo]] ki
 'userinvalidcssjstitle' => "'''Dėmesio:''' Nėra jokios išvaizdos „$1“. Nepamirškite, kad savo .css ir .js puslapiai naudoja pavadinimą mažosiomis raidėmis, pvz., {{ns:user}}:Foo/vector.css, o ne {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Atnaujinta)',
 'note' => "'''Pastaba:'''",
-'previewnote' => "'''Nepamirškite, kad tai tik peržiūra, pakeitimai dar nėra išsaugoti!'''",
+'previewnote' => "''Nepamirškite, kad tai tik peržiūra, pakeitimai dar nėra išsaugoti!'''",
 'previewconflict' => 'Ši peržiūra parodo tekstą iš viršutiniojo teksto redagavimo lauko taip, kaip jis bus rodomas, jei pasirinksite išsaugoti.',
 'session_fail_preview' => "'''Atsiprašome! Mes negalime vykdyti jūsų keitimo dėl sesijos duomenų praradimo.
 Prašome pamėginti vėl. Jei tai nepadeda, pamėginkite atsijungti ir prisijungti atgal.'''",
index bcbd0bd..3e10202 100644 (file)
@@ -1559,7 +1559,7 @@ $1",
 
 # User rights log
 'rightslog' => 'ഉപയോക്തൃ അവകാശ രേഖ',
-'rightslogtext' => 'à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´\85à´µà´\95ാശà´\99àµ\8dà´\99ൾà´\95àµ\8dà´\95àµ\81à´£àµ\8dà´\9fായ à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99ൾ à´\95ാണിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´\92à´°àµ\81 à´²àµ\8bà´\97ാണിത്.',
+'rightslogtext' => 'à´\88 à´ªàµ\8dരവർതàµ\8dതനരàµ\87à´\96 à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´\85à´µà´\95ാശà´\99àµ\8dà´\99ൾà´\95àµ\8dà´\95àµ\81à´£àµ\8dà´\9fായ à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99à´³àµ\81à´\9fàµ\87താണ്.',
 'rightslogentry' => '$1 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം $2 എന്നതിൽ നിന്നു $3 എന്നതിലേക്കു മാറ്റിയിരിക്കുന്നു',
 'rightslogentry-autopromote' => '$2 എന്നതിൽ നിന്ന് $3 എന്നതിലേയ്ക്ക് സ്വയം ഉയർത്തിയിരിക്കുന്നു',
 'rightsnone' => '(ഒന്നുമില്ല)',
index 7d8b499..8b6c385 100644 (file)
@@ -303,7 +303,7 @@ $1',
 'ok' => 'OK',
 'pagetitle' => '$1 - {{SITENAME}}',
 'retrievedfrom' => '"$1" хуудаснаас авсан',
-'youhavenewmessages' => 'Таньд $1 ($2) байна.',
+'youhavenewmessages' => 'Таньд $1 ($2) байна.',
 'newmessageslink' => 'шинэ мессеж',
 'newmessagesdifflink' => 'сүүлийн өөрчлөлт',
 'youhavenewmessagesmulti' => 'Таньд $1 дээр шинэ мессеж ирсэн байна',
@@ -496,11 +496,11 @@ $2',
 'password-login-forbidden' => 'Ийм хэрэглэгчийн, нууц үгээр нэвтрэхийг хориглож байна.',
 'mailmypassword' => 'Мэйл хаягаар шинэ нууц үгийг илгээ',
 'passwordremindertitle' => '{{SITENAME}}-д нэвтрэх түр зуурын шинэ нууц үг',
-'passwordremindertext' => 'Хэн нэгэн (магадгүй та, IP хаяг нь $1) {{SITENAME}} ($4) хуудсанд нэвтрэх шинэ нууц үг явуулах хүсэлтийг тавьсан байна. Түр нууц үг "$3" хэрэглэгч "$2"-д олгогдлоо.
-Хэрэв та үүнийг хүссэн бол холбогдож шинэ нууц үгээ одоо сонгоно уу.
-Таны түр зуурын нууц үг {{PLURAL:$5|нэг өдрийн|$5 өдрийн}} дараа цуцлагдах болно.
+'passwordremindertext' => 'Хэн нэгэн (магадгүй та, $1 гэх IP хаягаас) {{SITENAME}} ($4) хуудсанд нэвтрэх шинэ нууц үг явуулах хүсэлтийг тавьсан байна. "$3" гэсэн түр хугацаанд хэрэглэж болох нууц үгийг хэрэглэгч "$2"-д олгов.
+Хэрэв та ингэхийг хүссэн бол нэвтэрч ороод шинэ нууц үгээ сонгоно уу.
+Таны түр зуурын нууц үгний хугацаа {{PLURAL:$5|нэг өдрийн|$5 өдрийн}} дараа дуусах болно.
 
-Хэрэв энэ хүсэлтийг өөр хүн тавьсан, эсвэл та хуучин нууц үгээ санаж солихыг хүсэхгүй байгаа бол та энэ мэйлийг тоохгүйгээр хуучин нууц үгээ хэвээр хэрэглэж болно.',
+Хэрэв энэ хүсэлтийг өөр хүн тавьсан, эсвэл та хуучин нууц үгээ олоод, солихыг хүсэхгүй байгаа бол та энэ мэйлийг үл ойшоон хуучин нууц үгээ хэрэглэсэн хэвээр байж болно.',
 'noemail' => 'Хэрэглэгч "$1" нь мэйл хаягаа бүртгүүлээгүй байна.',
 'noemailcreate' => 'Та хүчинтэй и-мэйл хаягаа өгөх ёстой',
 'passwordsent' => '"$1"-н бүртгүүлсэн мэйл хаяг руу шинэ нууц үг илгээгдлээ.
@@ -524,10 +524,10 @@ $2',
 'accountcreated' => 'Бүртгэл үүсгэгдлээ',
 'accountcreatedtext' => '$1 хэрэглэгчийн бүртгэл үүсгэгдлээ.',
 'createaccount-title' => '{{SITENAME}}-н бүртгэлийн үүсгэл',
-'createaccount-text' => 'Хэн нэгэн {{SITENAME}}-д ($4) "$2" нэртэй, "$3" нууц үгтэй бүртгэлийг энэ мэйл хаягт үүсгэжээ.
+'createaccount-text' => 'Хэн нэгэн {{SITENAME}}-д ($4) "$2" гэсэн нэрээр, "$3" гэсэн нууц үгтэйгээр таны мэйл хаягийг ашиглан бүртгүүлжээ.
 Та одоо нэвтэрч өөрийн нууц үгээ солих хэрэгтэй.
 
-Хэрэв энэ бүртгэлийг алдаа гаргаж үүсгэсэн бол энэ мэдэгдлийг үл ойшоож болно.',
+Хэрэв буруугаар бүртгүүлсэн бол энэ мэдэгдлийг үл ойшоож болно.',
 'usernamehasherror' => 'Хэрэглэгчийн нэрэнд хаш тэмдэгт орж болохгүй',
 'login-throttled' => 'Та хэт олон удаа нэвтрэх гэж оролдсон байна.
 Хүлээж байгаад дахин оролдого уу.',
@@ -703,7 +703,8 @@ $2',
 Өөрсдийн .css болон .js хуудсуудыг нэрлэхэд жижиг үсэг хэрэглэдэг болохыг сануулж байна. Жишээ нь: {{ns:user}}:Foo/vector.css гэж л хэрэглэх бөгөөд {{ns:user}}:Foo/Vector.css гэхгүй.",
 'updated' => '(Шинэчлэгдсэн)',
 'note' => "'''Анхааруулга:'''",
-'previewnote' => "'''Энэ бол зөвхөн урьдчилж харсан байдал; засварууд одоохондоо хадгалагдаагүй байна!'''",
+'previewnote' => "'''Энэ бол зөвхөн урьдчилж харсан байдал.'''
+Таны хийсэн өөрчлөлтүүдийг одоохондоо хадгалаагүй байгаа! [[#editform|→ үргэлжүүлж засварлах]]",
 'previewconflict' => 'Энэ урьдчилж харсан байдал нь дээд талын засварлах талбарын текстийг хадгалахад харагдах байдлыг харуулна.',
 'session_fail_preview' => "'''Уучлаарай! Мэдээлэл алдагдснаас болж таны засварыг боловсруулж чадсангүй. Дахин оролдож үзнэ үү. Ингээд ч болохгүй байвал сайтаас гарч дахин нэвтэрч орж үзнэ үү.'''",
 'session_fail_preview_html' => "'''Уучлаарай! Мэдээлэл алдагдснаас болж таны засварыг боловсруулж чадсангүй.'''
@@ -795,7 +796,7 @@ $2 дуудлагаас доош байх ёстой, харин одоо $1 б
 Эдгээр аргументуудыг тооцсонгүй.",
 'post-expand-template-argument-category' => 'Орхигдсон загварын аргументуудтай хуудаснууд',
 'parser-template-loop-warning' => 'Загвар тойрч буйг тогтоов: [[$1]]',
-'parser-template-recursion-depth-warning' => 'Загварын рекурсийн гүний хязгаараас ихэдлээ ($1)',
+'parser-template-recursion-depth-warning' => 'Загварын рекурсийн хэмжээний хязгаараас хэтрэв ($1)',
 'language-converter-depth-warning' => 'Хэл хооронд хөрвүүлэх гүний хязгаараас хэтрэв ($1)',
 
 # "Undo" feature
@@ -803,7 +804,7 @@ $2 дуудлагаас доош байх ёстой, харин одоо $1 б
 Доорх харьцуулалтыг шалгаж үнэхээр хиймээр байгаа зүйл мөн үү гэдгээ нотлоорой. Дараа нь засварыг дуусгахын тулд өөрчлөлтүүдээ хадгална уу.',
 'undo-failure' => 'Хоорондын засваруудаас болж засвар цуцлагдах боломжгүй байна.',
 'undo-norev' => 'Засвар оршдогүүй эсвэл устгагдсан тул цуцлаж чадсангүй.',
-'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|Яриа]]) хэрэглэгчийн $1 засварыг цуцлах',
+'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|Яриа]]) хэрэглэгчийн $1 засварыг цуцлах',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Хэрэглэгчийн бүртгэлийг үүсгэж чадсангүй.',
@@ -833,7 +834,7 @@ $3-н тодорхойлсон шалтгаан нь ''$2''",
 'history-show-deleted' => 'Зөвхөн устгагдсаныг',
 'histfirst' => 'Эхний',
 'histlast' => 'Сүүлийн',
-'historysize' => '($1 байт)',
+'historysize' => '($1 байт)',
 'historyempty' => '(хоосон байна)',
 
 # Revision feed
@@ -972,7 +973,7 @@ $1",
 
 # Merge log
 'mergelog' => 'Нэгтгэлийн лог',
-'pagemerge-logentry' => '[[$1]]-г [[$2]] руу нэгтгэлээ ($3 хүртэлх засварууд)',
+'pagemerge-logentry' => '[[$1]]-г [[$2]] руу нэгтгэлээ ($3 хүртэлх засварууд)',
 'revertmerge' => 'Нэгтгэлийг буцаах',
 'mergelogpagetext' => 'Доорх нь нэг хуудасны түүхийг өөр түүхтэй нэгтгэсэн хамгийн сүүлийн нэгтгэлүүд юм.',
 
@@ -991,7 +992,7 @@ $1",
 'searchresults' => 'Хайлтын үр дүн',
 'searchresults-title' => '"$1" гэх хайлтын үр дүн',
 'searchresulttext' => '{{SITENAME}}-с хайх тухай дэлгэрэнгүй мэдээллийг [[{{MediaWiki:Helppage}}|{{int:help}}]] хуудаснаас авна уу.',
-'searchsubtitle' => 'Та \'\'\'[[:$1]]\'\'\' гэж хайлаа ([[Special:Prefixindex/$1|"$1-р эхлэсэн бүх хуудас]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"-д холбогдсон бүх хуудас]])',
+'searchsubtitle' => 'Та \'\'\'[[:$1]]\'\'\' гэж хайлаа ([[Special:Prefixindex/$1|"$1-р эхлэсэн бүх хуудас]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"-д холбогдсон бүх хуудас]])',
 'searchsubtitleinvalid' => "Та '''$1''' гэж хайлаа",
 'toomanymatches' => 'Хэт олон илэрц илэрлээ. Өөр үгээр хайна уу.',
 'titlematches' => 'Хуудасны гарчигтай таарсан хуудсууд',
@@ -1019,7 +1020,7 @@ $1",
 'searchprofile-images-tooltip' => 'Файлуудаас хайх',
 'searchprofile-everything-tooltip' => 'Бүх агуулгаас хайх (үүнд ярианы хуудсуудыг оролцуулах)',
 'searchprofile-advanced-tooltip' => 'Сонгосон нэрний зайнуудаас хайх',
-'search-result-size' => '$1 ($2 үг)',
+'search-result-size' => '$1 (нийт $2 үг)',
 'search-result-category-size' => '{{PLURAL:$1|1 гишүүн|$1 гишүүн}} ({{PLURAL:$2|1 дэд ангилал|$2 дэд ангилал}}, {{PLURAL:$3|1 файл|$3 файл}})',
 'search-result-score' => 'Холбоо хамаарал: $1%',
 'search-redirect' => '(чиглүүлэгч $1)',
@@ -1342,7 +1343,7 @@ $1 тэмдэгтээс богино байх ёстой.',
 'recentchanges-label-bot' => 'Энэ засварыг бот гүйцэтгэсэн байна',
 'recentchanges-label-unpatrolled' => 'Энэ засварыг одоогийн байдлаар манаагүй байна',
 'rcnote' => "Доорх нь $5, $4-ий байдлаарх сүүлийн '''$2''' өдрийн турших '''$1''' засвар юм.",
-'rcnotefrom' => "Доорх нь '''$2'''-с хойших өөрчлөлтүүд ('''$1''' хүртэл харуулагдсан) юм.",
+'rcnotefrom' => "Доорх нь '''$2'''-с хойших өөрчлөлтүүд ('''$1''' хүртэлхийг харуулав) юм.",
 'rclistfrom' => '$1-с хойших шинэ засваруудыг үзүүлэх',
 'rcshowhideminor' => 'Бага зэргийн засваруудыг $1',
 'rcshowhidebots' => 'Роботуудыг $1',
@@ -1359,7 +1360,7 @@ $1 тэмдэгтээс богино байх ёстой.',
 'newpageletter' => 'Ш',
 'boteditletter' => 'р',
 'number_of_watching_users_pageview' => '[$1 хэрэглэгч харж байна]',
-'rc_categories' => 'Ангиллуудад хязгаарлах ("|" тэмдгээр тусгаарлах)',
+'rc_categories' => 'Ангиллуудад хязгаарлах ("|" тэмдгээр тусгаарлана)',
 'rc_categories_any' => 'Хамаагүй',
 'rc-change-size-new' => 'Өөрчилсний дараа $1 {{PLURAL:$1|байт|байт}}',
 'newsectionsummary' => '/* $1 */ шинэ хэсэг',
@@ -1384,8 +1385,8 @@ $1 тэмдэгтээс богино байх ёстой.',
 'upload-tryagain' => 'Өөрчилсан файлын тодорхойлолтыг явуулах',
 'uploadnologin' => 'Нэвтрээгүй байна',
 'uploadnologintext' => 'Та файл оруулахын тулд [[Special:UserLogin|нэвтэрч орсон]] байх шаардлагатай.',
-'upload_directory_missing' => 'Ð\9eÑ\80Ñ\83Ñ\83лалÑ\82Ñ\8bн Ð»Ð°Ð²Ð»Ð°Ñ\85 ï¼\88$1ï¼\89 Ð¾Ð»Ð´Ð¾Ñ\85гүй Ð±Ð°Ð¹Ð³Ð°Ð° Ð±Ó©Ð³Ó©Ó©Ð´ Ð²Ñ\8dбÑ\81еÑ\80вÑ\8dÑ\80 Ò¯Ò¯Ñ\81гÑ\8dÑ\8dгүй Ð±Ð°Ð¹Ð¶ Ð¼Ð°Ð³Ð°Ð´Ð³Ò¯Ð¹ Ð±Ð°Ð¹Ð½Ð°.',
-'upload_directory_read_only' => 'Файл Ð¾Ñ\80Ñ\83Ñ\83лаÑ\85 ÐºÐ°Ñ\82алог ï¼\88$1ï¼\89 Ð½Ñ\8c Ð²Ñ\8dбÑ\81еÑ\80веÑ\80Ñ\82 Ð±Ð¸Ñ\87игдÑ\8dх боломгүй байна.',
+'upload_directory_missing' => 'Ð\90плоÑ\83д Ñ\81ан ($1) Ð¾Ð»Ð´Ð¾Ñ\85гүй Ð±Ð°Ð¹Ð³Ð°Ð° Ð±Ó©Ð³Ó©Ó©Ð´ Ð²Ñ\8dбÑ\81еÑ\80веÑ\80 Ò¯Ò¯Ð½Ð¸Ð¹Ð³ Ò¯Ò¯Ñ\81гÑ\8dж Ñ\87адÑ\81ангүй.',
+'upload_directory_read_only' => 'Ð\90плоÑ\83д Ñ\81ан ($1) Ñ\80Ñ\83Ñ\83 Ð²Ñ\8dбÑ\81еÑ\80веÑ\80 Ð±Ð¸Ñ\87их боломгүй байна.',
 'uploaderror' => 'Файл оруулахад алдаа гарлаа',
 'upload-recreate-warning' => "'''Анхаар: Тэрхүү нэртэй файл нь устгагдсан эсвэл зөөгдсөн байна..'''
 
@@ -1424,7 +1425,7 @@ $1 тэмдэгтээс богино байх ёстой.',
 Ашиглахыг зөвлөж буй {{PLURAL:\$3|файлын төрөл|файлын төрлүүд}} нь \$2.",
 'filetype-banned-type' => "'''\".\$1\"''' нь зөвшөөрөгдөхгүй файлын төрөл байна.
 Зөвшөөрөгдөх {{PLURAL:\$3|файлын төрөл|файлын төрлүүд}} нь \$2.",
-'filetype-missing' => 'Энэ файлд өргөтгөл байхгүй байна (".jpg" гэх мэт).',
+'filetype-missing' => 'Энэ файлд өргөтгөл байхгүй байна (".jpg" гэх мэт).',
 'empty-file' => 'Таны явуулсан файл хоосон байв.',
 'file-too-large' => 'Таны явуулсан файл хэтэрхий том байв.',
 'filename-tooshort' => 'Файлын нэр хэтэрхий богино байна.',
@@ -1465,8 +1466,8 @@ $1 тэмдэгтээс богино байх ёстой.',
 Файлаа оруулахыг хүсч байвал шинэ нэр өгөөд дахин оролдоно уу.
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Энэ файл нь дараах {{PLURAL:$1|файлтай|файлуудтай}} ижил байна:',
-'file-deleted-duplicate' => 'Энэ файлтай ([[:$1]]) яг ижилхэн файл урьд өмнө устгагдсан байна.
\94аÑ\85ин оруулахынхаа өмнө тэрхүү файлын устгалын түүхийг харна уу.',
+'file-deleted-duplicate' => 'Энэ файлтай ([[:$1]]) яг ижилхэн файлыг урьд өмнө устгасан байна.
\94аÑ\85иРоруулахынхаа өмнө тэрхүү файлын устгалын түүхийг харна уу.',
 'uploadwarning' => 'Хуулах үеийн анхааруулга',
 'uploadwarning-text' => 'Доорх файлын тодорхойлолтыг өөрчлөөд дахин оролдоно уу.',
 'savefile' => 'Файлыг хадгалах',
@@ -1613,7 +1614,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 [[Special:WhatLinksHere/$2|Бүтэн жагсаалт]] мөн байгаа.',
 'nolinkstoimage' => 'Энэ файлд холбогдсон хуудас байхгүй байна.',
 'morelinkstoimage' => 'Энэ файлд руух [[Special:WhatLinksHere/$1|илүү олон холбоос]] үзэх.',
-'duplicatesoffile' => 'Дараах {{PLURAL:$1|файл|$1 файл}} нь энэ файлтай яг ижилхэн байна ([[Special:FileDuplicateSearch/$2|дэлгэрэнгүй мэдээлэл]]):',
+'duplicatesoffile' => 'Дараах {{PLURAL:$1|файл|$1 файл}} нь энэ файлтай яг ижилхэн байна ([[Special:FileDuplicateSearch/$2|дэлгэрэнгүй мэдээлэл]])',
 'sharedupload' => 'Энэ файл нь $1-ийнх бөгөөд бусад төслүүдэд ашиглах боломжтой',
 'sharedupload-desc-there' => 'Энэ файл нь $1-нх бөгөөд бусад төслүүд үүнийг хэрэглэх боломжтой.
 Дэлгэрэнгүй мэдээллийг [$2 файлын тайлбарын хуудаснаас] харна уу.',
@@ -1807,8 +1808,8 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 # Special:AllPages
 'allpages' => 'Бүх хуудас',
 'alphaindexline' => '$1-с $2 хүртэл',
-'nextpage' => 'Дараагийн хуудас ($1)',
-'prevpage' => 'Өмнөх хуудас ($1)',
+'nextpage' => 'Дараагийн хуудас ($1)',
+'prevpage' => 'Өмнөх хуудас ($1)',
 'allpagesfrom' => 'Хамгийн эхэлж харуулах хуудас:',
 'allpagesto' => 'Дараах гэж дуусах хуудсуудыг үзүүлэх:',
 'allarticles' => 'Бүх хуудас',
@@ -2116,7 +2117,7 @@ $NEWPAGE
 'undeleterevdel' => 'Дээд хуудас буюу файлын засвар бага зэргээр устгагдах явдал гарах бол хуудас сэргээгдэхгүй.
 Ийм тохиолдолд та хамгийн сүүлд устгагдсан засварыг нууцлахаа, эсвэл тэмдэглэхээ болих шаардлагатай.',
 'undeletehistorynoadmin' => 'Энэ өгүүлэл устгагдсан. Үүний устгагдсан шалтгаан нь устгалын өмнө энэ хуудсыг засварласан хэрэглэгчдийн тухай мэдээллүүдтэй хамт доорх тайланд өгөгдсөн байгаа. Эдгээр устгагдсан хувилбаруудад яг юу байсныг зөвхөн администраторууд л харж чадна.',
-'undelete-revision' => '$3 хэрэглэгчийн $1-н ($2-ий байдлаарх) устгасан засвар',
+'undelete-revision' => '$3 хэрэглэгчийн засварласан $1 хуудасны ($4, $5-ийн байдлаарх) засварыг устгав.',
 'undeleterevision-missing' => 'Хүчингүй эсвэл алга болсон засвар.
 Таньд буруу холбоос байна, эсвэл засвар сэргээгдсэн, эсвэл архиваас устгагдсан байж болзошгүй.',
 'undelete-nodiff' => 'Өмнөх засвар олдсонгүй.',
@@ -2160,7 +2161,7 @@ $1',
 'contributions' => 'Хэрэглэгчийн хувь нэмэр',
 'contributions-title' => '$1 хэрэглэгчийн хувь нэмэр',
 'mycontris' => 'Миний оруулсан хувь нэмэр',
-'contribsub2' => 'Хэрэглэгчийн нэр: $1 ($2)',
+'contribsub2' => 'Хэрэглэгч: $1 ($2)',
 'nocontribs' => 'Энэ шалгуурт тохирох өөрчилсөн зүйлүүд олдсонгүй.',
 'uctop' => '(дээд)',
 'month' => 'Дараах сараас (өмнөх засварууд нь ч орно):',
@@ -2689,7 +2690,7 @@ $1',
 # Bad image list
 'bad_image_list' => 'Формат дараах байдлаар байна:
 
-Зөвхөн жагсаагдсан зүйлс (*-аар эхлэх мөрүүд) тооцогдоно.
+Зөвхөн жагсаагдсан зүйлс (*-аар эхлэх мөрүүд) тооцогдоно.
 Мөр дэх эхний линк муу файл руух холбоос байж таарна.
 Үүнтэй адил мөр дэх бусад линкүүд тооцогдохгүй. Өөрөөр хэлбэл, файлын орж болзошгүй хуудсууд юм.',
 
@@ -2699,8 +2700,8 @@ $1',
 Хэрэв энэ файл анхныхаа байдлаас өөрчлөгдсөн бол зарим мэдээлэл нь одоогийн хувилбартайгаа нийцэхгүй байж магадгүй.',
 'metadata-expand' => 'Дэлгэрэнгүй мэдээллийг харуулах',
 'metadata-collapse' => 'Дэлгэрэнгүй мэдээллийг нуух',
-'metadata-fields' => 'Энэ мэдэгдэлд байгаа EXIF мэдээллийн талбарууд мэдээллийн хүснэгт буулгагдсан үед зургын хуудсанд харагдана.
\91Ñ\83Ñ\81ад Ð½Ñ\8c Ð°Ð½Ñ\85нааÑ\81аа Ñ\85аÑ\80агдаÑ\85гүй Ð±Ð°Ð¹Ð½а.
+'metadata-fields' => 'Энэ мэдэгдэлд байгаа зурагний мэдээллийн талбарууд нь мэдээллийн хүснэгт буулгагдсан үед зургын хуудсанд харагдана.
\91Ñ\83Ñ\81дÑ\8bг Ð°Ð½Ñ\85нÑ\8b Ñ\82оÑ\85иÑ\80гоогооÑ\80 Ð½Ñ\83Ñ\83Ñ\86алÑ\81ан Ð±Ð°Ð¹Ð³Ð°а.
 * make
 * model
 * datetimeoriginal
@@ -2758,7 +2759,7 @@ $1',
 'exif-subsectimeoriginal' => 'ОгнооЦагАнхны дэдсекунд',
 'exif-subsectimedigitized' => 'ОгнооЦагДижитал дэдсекунд',
 'exif-exposuretime' => 'Гэрэл өгөх хугацаа',
-'exif-exposuretime-format' => '$1 секунд ($2)',
+'exif-exposuretime-format' => '$1 секунд ($2)',
 'exif-fnumber' => 'Харьцангуй диафрагм',
 'exif-exposureprogram' => 'Гэрэл өгөх хугацааны программ',
 'exif-spectralsensitivity' => 'Спектралийн мэдрэмтгий байдал',
@@ -3196,6 +3197,16 @@ $5
 'blankpage' => 'Хоосон хуудас',
 'intentionallyblankpage' => 'Энэхүү хуудсыг албаар хоосон үлдээв.',
 
+# External image whitelist
+'external_image_whitelist' => '#Энэ мөрийг яг хэвээр нь үлдээнэ үү<pre>
+#Доорх хэсэгт regular expression-ээр бичсэн хэсгүүдийг (//-н дунд л байх хэсэг) оруул
+#Эдгээрийг гадаад (шууд холбосон) зургуудын URL-тай тохируулах болно
+#Тохирсон бол зураг болж харагдана, үгүй бол зураг руух холбоос л гарна
+#"#"-аар эхлэсэн мөрүүдийг коммент гэж тооцоно
+#Том жижиг үсэг үл харгалзана
+
+#Дээрх хэсэгт regular expression-ээр бичсэн хэсгүүдийг оруул. Энэ мөрийг яг хэвээр нь үлдээнэ үү</pre>',
+
 # Special:Tags
 'tags' => 'Хүчинтэй өөрчлөлтийн тагууд',
 'tag-filter' => '[[Special:Tags|Тагийн]] шүүлтүүр:',
index f4377de..90d4cb2 100644 (file)
@@ -1374,13 +1374,13 @@ Tī pat-lâng liân-lo̍k lí ê sî-chūn bē kā e-mail tsū-tsí siá chhut--
 
 這頁有刣掉佮徙走的記錄通參考:",
 'uploadtext' => "用下跤的表來共檔案上載。
-若欲看抑是揣往過上載的檔案,會使進入[[Special:FileList|檔案上載清單]],(重)上載嘛會記錄佇[[Special:Log/upload|上傳記錄]],若刣掉就會記錄佇[[Special:Log/delete|刪除記錄]]。
+若欲看,抑是揣往過上載的檔案,會使入去[[Special:FileList|檔案上載清單]]。上載嘛會記錄佇[[Special:Log/upload|上載記錄]],若刣掉就會記錄佇[[Special:Log/delete|刣掉記錄]]。
 
-若欲佇頁加入檔案,用下跤的一種方式來連結:
+上載後,若欲佇頁加入檔案,會使用下跤的一種方式來連結:
 * '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>'''使用檔案的完整版本
 * '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|替換文字]]</nowiki></tt>'''用一个囥佇倒爿的一个200 像素圖相框,「替換文字」做說明
 * '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''直接連結到檔案,毋過無顯示檔案",
-'upload-permitted' => '准許的檔案類型: $1',
+'upload-permitted' => '通用的檔案類型: $1',
 'upload-preferred' => '建議的檔案類型: $1',
 'upload-prohibited' => '禁止的檔案類型: $1。',
 'uploadlog' => '上載記錄',
index b9b35a8..141c9a4 100644 (file)
@@ -521,7 +521,7 @@ $messages = array(
 'searchbutton' => 'Zoeken',
 'go' => 'OK',
 'searcharticle' => 'OK',
-'history' => 'Paginageschiedenis',
+'history' => 'Geschiedenis',
 'history_short' => 'Geschiedenis',
 'updatedmarker' => 'bewerkt sinds mijn laatste bezoek',
 'printableversion' => 'Printervriendelijke versie',
@@ -672,7 +672,7 @@ Het laatste verzoek aan de database was:
 “$1”
 vanuit de functie “$2”.
 De database gaf de volgende foutmelding: “$3: $4”',
-'laggedslavemode' => "'''Waarschuwing:''' de pagina kan verouder zijn.",
+'laggedslavemode' => "'''Waarschuwing:''' in deze pagina zijn recente wijzigingen mogelijk nog niet verwerkt.",
 'readonly' => 'Database geblokkeerd',
 'enterlockreason' => 'Geef een reden op voor de blokkade en geef op wanneer die waarschijnlijk wordt opgeheven',
 'readonlytext' => 'De database is geblokkeerd voor bewerkingen, waarschijnlijk voor regulier databaseonderhoud. Na afronding wordt de functionaliteit hersteld.
@@ -1077,8 +1077,8 @@ U dient uw bewerkingen in te voegen in de bestaande tekst.
 'storedversion' => 'Opgeslagen versie',
 'nonunicodebrowser' => "'''Waarschuwing: Uw browser kan niet goed overweg met unicode.'''
 Hiermee wordt door de MediaWiki-software rekening gehouden zodat u toch zonder problemen pagina's kunt bewerken: niet-ASCII karakters worden in het bewerkingsveld weergegeven als hexadecimale codes.",
-'editingold' => "'''Waarschuwing: U bewerkt een oude versie van deze pagina.'''
-Als u uw bewerking opslaat, gaan alle wijzigingen die na deze versie gemaakt zijn verloren.",
+'editingold' => "'''Waarschuwing: u bewerkt een oude versie van deze pagina.'''
+Als u uw bewerking opslaat, gaan alle wijzigingen verloren die na deze versie zijn gemaakt.",
 'yourdiff' => 'Wijzigingen',
 'copyrightwarning' => "Let op: alle bijdragen aan {{SITENAME}} worden geacht te zijn vrijgegeven onder de \$2 (zie \$1 voor details).
 Als u niet wilt dat uw tekst door anderen naar believen bewerkt en verspreid kan worden, kies dan niet voor \"Pagina opslaan\".<br />
@@ -1268,7 +1268,7 @@ $1",
 'revdel-restore' => 'Zichtbaarheid wijzigen',
 'revdel-restore-deleted' => 'verwijderde versies',
 'revdel-restore-visible' => 'zichtbare versies',
-'pagehist' => 'paginageschiedenis',
+'pagehist' => 'Geschiedenis',
 'deletedhist' => 'verwijderde geschiedenis',
 'revdelete-hide-current' => 'Er is een fout opgetreden bij het verbergen van het object van $1 om $2 uur: dit is de huidige versie.
 Deze versie kan niet verborgen worden.',
@@ -2134,8 +2134,8 @@ Vergeet niet de "Verwijzingen naar deze pagina" te controleren alvorens dit sjab
 'disambiguations' => "Pagina's die verwijzen naar doorverwijspagina's",
 'disambiguationspage' => 'Template:Doorverwijspagina',
 'disambiguations-text' => "Hieronder staan pagina's die verwijzen naar een '''doorverwijspagina'''.
-Deze horen waarschijnlijk direct naar het juiste onderwerp te verwijzen.
-<br />Een pagina wordt gezien als doorverwijspagina als er een sjabloon op staat dat opgenomen is op [[MediaWiki:Disambiguationspage]]",
+Deze horen waarschijnlijk direct naar het juiste onderwerp te verwijzen.<br />
+Een pagina wordt gezien als doorverwijspagina als er een sjabloon op staat dat opgenomen is op [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Dubbele doorverwijzingen',
 'doubleredirectstext' => "Deze lijst bevat pagina's die doorverwijzen naar andere doorverwijspagina's.
@@ -2587,7 +2587,7 @@ Mogelijk hebt u een verkeerde verwijzing of is de versie hersteld of verwijderd
 'undeletelink' => 'bekijken/terugplaatsen',
 'undeleteviewlink' => 'bekijken',
 'undeletereset' => 'Fomulier wissen',
-'undeleteinvert' => 'Omgekeerde selectie',
+'undeleteinvert' => 'Selectie omkeren',
 'undeletecomment' => 'Reden:',
 'undeletedrevisions' => '$1 {{PLURAL:$1|versie|versies}} teruggeplaatst',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 versie|$1 versies}} en {{PLURAL:$2|1 bestand|$2 bestanden}} teruggeplaatst',
@@ -2618,7 +2618,7 @@ $1',
 
 # Namespace form on various pages
 'namespace' => 'Naamruimte:',
-'invert' => 'Omgekeerde selectie',
+'invert' => 'Selectie omkeren',
 'tooltip-invert' => 'Vink dit aan om wijzigingen te verbergen in de geselecteerde naamruimte (en de gekoppelde naamruimte indien aangevinkt)',
 'namespace_association' => 'Gekoppelde naamruimte',
 'tooltip-namespace_association' => 'Vink dit aan om ook wijzigingen weer te geven in de overleg- of onderwerpnaamruimte die bij de geselecteerde naamruimte hoort',
@@ -3195,7 +3195,7 @@ Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
 'markaspatrolleddiff' => 'Als gecontroleerd markeren',
 'markaspatrolledtext' => 'Deze pagina als gecontroleerd markeren',
 'markedaspatrolled' => 'Gemarkeerd als gecontroleerd',
-'markedaspatrolledtext' => 'De geselecteerde versie van [[:$1]] is gemarkeerd als gecontroleerd.',
+'markedaspatrolledtext' => 'De geselecteerde bewerking van [[:$1]] is gemarkeerd als gecontroleerd.',
 'rcpatroldisabled' => 'De controlemogelijkheid op recente wijzigingen is uitgeschakeld.',
 'rcpatroldisabledtext' => 'De mogelijkheid om recente wijzigingen als gecontroleerd aan te merken is op dit ogenblik uitgeschakeld.',
 'markedaspatrollederror' => 'Kan niet als gecontroleerd worden aangemerkt',
@@ -3817,7 +3817,7 @@ Probeer de normale voorvertoning.',
 Probeer normale voorvertoning.',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => 'Veranderingen die nieuwer zijn dan $1 {{PLURAL:$1|seconde|seconden}} worden misschien niet weergegeven in deze lijst.',
+'lag-warn-normal' => 'Wijzigingen in de afgelopen {{PLURAL:$1|seconde|$1 seconden}} worden misschien niet weergegeven in deze lijst.',
 'lag-warn-high' => 'Door een hoge database-servertoevoer zijn wijzigingen nieuwer dan $1 {{PLURAL:$1|seconde|seconden}} mogelijk niet beschikbaar in de lijst.',
 
 # Watchlist editor
index 9492418..e6d3e22 100644 (file)
@@ -450,7 +450,7 @@ $2',
 Æхгæныны бындур уыд "\'\'$2\'\'".',
 'filereadonlyerror' => 'Нæ уайы фæивын файл "$1" уый тыххæй æмæ репозиторий "$2" кусы æрмæст фæрсыны уавæры.
 
-РаздæÑ\85Ñ\82 Ð±Ñ\8bндÑ\83Ñ\80 Ñ\83 "\'\'$3\'\'".',
+РадгæÑ\81, ÐºÃ¦Ñ\86Ñ\8b Ñ\81æвæÑ\80дÑ\82а Ð°Ñ\86Ñ\8b Ñ\83авæÑ\80, Ð½Ñ\8bÑ\83Ñ\83агÑ\8aÑ\82а Ð°Ñ\85æм Ð°Ð¼Ð¾Ð½Ã¦Ð½: "\'\'$3\'\'".',
 
 # Virus scanner
 'virus-badscanner' => "Æвзæр æвæрд: Нæзонгæ вирусты скане: ''$1''",
@@ -465,7 +465,7 @@ $2',
 'welcomecreation' => '== Ӕгас цу, $1! ==
 Дæ аккаунт арæзт æрцыдис.
 Ма дæ ферох уæт æркæсын дæ [[Special:Preferences|{{grammar:genitive|{{SITENAME}}}} фадæттæм]].',
-'yourname' => 'Ð\90Ñ\80Ñ\85айæджÑ\8b Ð½Ð¾Ð¼:',
+'yourname' => 'ФæÑ\81номÑ\8bг:',
 'yourpassword' => 'Пароль:',
 'yourpasswordagain' => 'Дæ пароль иу хатт ма:',
 'remembermypassword' => 'Бахъуыды мæ кæнæд ашы браузеры (максимум $1 {{PLURAL:$1|бонмæ|бонмæ}})',
@@ -489,7 +489,7 @@ $2',
 'createaccountmail' => 'адрисмæ гæсгæ',
 'createaccountreason' => 'Бындур:',
 'badretype' => 'Дыууæ хатты иу пароль хъуамæ ныффыстаис',
-'userexists' => 'Уыцы ном нæвдæлон у.
+'userexists' => 'Уыцы фæсномыг нæвдæлон у.
 Дæ хорзæхæй, равзар æндæр.',
 'loginerror' => 'Бахизыны рæдыд',
 'createaccounterror' => 'Нæ рауадис аккаунт саразын: $1',
@@ -502,23 +502,23 @@ $2',
 Дæ хорзæхæй, баиу цæ кæн æмæ нæуæгæй бафæлвар.',
 'nocookiesfornew' => 'Архайæджы аккаунт нæ сарæзт ис, уымæн æмæ йын мах нæ базыдтам йæ равзæрæн.
 Бацархай, цæмæй cookies иу уой, анæуæг кæн ацы фарс æмæ ногæй бафæлвар.',
-'noname' => 'Ð\94Ñ\8b Ð½Ã¦ Ð½Ñ\8bÑ\84Ñ\84Ñ\8bÑ\81Ñ\82ай Ñ\80аÑ\81Ñ\82 Ð°Ñ\80Ñ\85айæджÑ\8b Ð½Ð¾Ð¼.',
+'noname' => 'РаÑ\81Ñ\82 Ñ\84æÑ\81номÑ\8bг Ð½Ã¦ Ð½Ñ\8bÑ\84Ñ\84Ñ\8bÑ\81Ñ\82ай.',
 'loginsuccesstitle' => 'Бахизын рауадис',
 'loginsuccess' => "'''Ныр ды дæ хыст {{grammar:genitive|{{SITENAME}}}} куыд \"\$1\".'''",
 'nosuchuser' => 'Нæй ахæм архайæг "$1" номимæ.
 Архайджыты нæмттæ хатынц дамгъæты регистр.
 Сбæрæг æй кæн, раст ныффыстай ном, æви [[Special:UserLogin/signup|бакæн ног аккаунт]].',
-'nosuchusershort' => 'Нæй архайæг "$1" номимæ.
-Фен, ном раст ныффыстай, æви нæ.',
-'nouserspecified' => 'Ды хъуамæ зæгъай дæ ном.',
+'nosuchusershort' => 'Нæй архайæг "$1" фæсномыгимæ.
+Фен, фæсномыг раст ныффыстай, æви нæ.',
+'nouserspecified' => 'Ды хъуамæ зæгъай дæ фæсномыг.',
 'login-userblocked' => 'Ацы архайæг хъодыгонд у. Нæй гæнæн бахизын.',
 'wrongpassword' => 'Цы пароль ныффыстай, уый раст нæу.
 Лæмбынæгæй ныффысс дæ пароль',
 'wrongpasswordempty' => 'Пароль афтид у.
 Бафæлвар ногæй.',
 'passwordtooshort' => 'Паролтæ хъуамæ уой уæддæр {{PLURAL:$1|1 дамгъæйы|$1 дамгъæйы}} дæргъæн.',
-'password-name-match' => 'Дæ парол ма хъуамæ уа дæ номы хуызæн.',
-'password-login-forbidden' => 'Ацы архайæджы ном æмæ паролæй нæй гæнæн архайын.',
+'password-name-match' => 'Дæ парол ма хъуамæ уа дæ фæсномыгы хуызæн.',
+'password-login-forbidden' => 'Ацы фæсномыг æмæ паролæй нæй гæнæн архайын.',
 'mailmypassword' => 'Рарвит мæм ног пароль',
 'passwordremindertitle' => 'Ног рæстæгмæ пароль {{grammar:dative|{{SITENAME}}}}',
 'passwordremindertext' => 'Чидæр (æвæццæгæн ды, $1 IP адрисæй) æрдомтта ног парол {{grammar:dative|{{SITENAME}}}} ($4). "$2" архайæгæн арæзт æрцыд рæстæгмæ парол. Парол у "$3". Кæд уый ды уыдтæ, уæд дын ныр хъæудзæн бахизын æмæ равзарын ног парол.
@@ -531,8 +531,23 @@ $2',
 'blocked-mailpassword' => 'Дæ IP адрис уыд хъодыгонд ивынæй æмæ цæмæй мачи разнаггад кæна, уы тыххæй дзы нæй гæнæн парол раивын дæр.',
 'eauthentsent' => 'Бæлвырдгæнæн фыстæг æрвыст æрцыд амынд e-mail адрисмæ.
 Цæмæй дæм æндæр фыстæджытæ дæр цæуой, уый тыххæй дын хъæудзæн сæххæст кæнын фыстæджы фыст амындтытæ. Уый фæстæ сбæлвыд уыдзæн аккаунт æцæгдæр дæу кæй у, уый.',
+'throttled-mailpassword' => 'Паролрымысæн нырид æрвыст æрцыд фæстаг {{PLURAL:$1|сахаты|$1 сахаты}} мидæг.
+Цæмæй мачи разнагкад кæна, уый тыххæй æрмæст иу хатт ис гæнæн райсын рымысæнфыстæг {{PLURAL:$1|сахаты|$1 сахаты}} мидæг.',
 'mailerror' => 'Фыстæг арвитыны рæдыд: $1',
+'acct_creation_throttle_hit' => 'Ацы викимæ дæ IP адрисæй чи æрбацыдис, уыдон фæстаг боны мидæг бакодтой {{PLURAL:$1|1 аккаунт|$1 аккаунты}}. Уымæй фылдæр нæй гæнæн ахæм рæстæгмæ.
+Уый тыххæй, ацы тæккæ, ацы IP адрисæй уазджытæн сæ бон нæу бакæнын аккаунттæ.',
+'emailauthenticated' => 'Дæ e-mail уыд бæлвырдгонд $2 $3 сахатыл.',
+'emailnotauthenticated' => 'Дæ e-mail адрис нырмæ нæу бæлвырдгонд.
+Иу e-mail дæр дæм нæ уыдзæн æрвыст ацы функцитæй.',
+'noemailprefs' => 'Бафысс e-mail адрис дæ фадæтты, цæмæй ацы функцитæ кусой.',
 'emailconfirmlink' => 'Дæ электронон посты адрис сфидар кæн',
+'invalidemailaddress' => 'E-mail нæй гæнæн райсын, уымæн æмæ йæ формат раст нæу.
+Бафысс раст форматы адрис кæнæ та йæ сафтид кæн.',
+'cannotchangeemail' => 'Аккаунты e-mail нæй гæнæн ивын ацы викийы.',
+'emaildisabled' => 'Ацы сайтæн йæ бон нæу æрвитын e-mail.',
+'accountcreated' => 'Аккаунт конд æрцыд',
+'accountcreatedtext' => '$1 архайæджы аккаунт конд æрцыд.',
+'createaccount-title' => '{{grammar:genitive|{{SITENAME}}}} аккант бакæнын',
 'loginlanguagelabel' => 'Æвзаг: $1',
 
 # Change password dialog
@@ -545,9 +560,9 @@ $2',
 'resetpass-temp-password' => 'Рæстæгмæ пароль:',
 
 # Special:PasswordReset
-'passwordreset-username' => 'Ð\90Ñ\80Ñ\85айæджÑ\8b Ð½Ð¾Ð¼:',
+'passwordreset-username' => 'ФæÑ\81номÑ\8bг:',
 'passwordreset-email' => 'Электрон посты адрис:',
-'passwordreset-emailelement' => 'Ð\90Ñ\80Ñ\85айæджÑ\8b Ð½Ð¾Ð¼: $1
+'passwordreset-emailelement' => 'ФæÑ\81номÑ\8bг: $1
 Рæстæгмæ пароль: $2',
 
 # Special:ChangeEmail
@@ -658,11 +673,11 @@ $2',
 'history-feed-item-nocomment' => '$1 $2',
 
 # Revision deletion
-'rev-deleted-comment' => '(ивды афыст æппæрст æрцыд)',
-'rev-deleted-user' => '(архайæджы ном аппæрст у)',
-'rev-deleted-event' => '(фыст аппæрст у)',
+'rev-deleted-comment' => '(ивды афыст хафт у)',
+'rev-deleted-user' => '(фæсномыг хафт у)',
+'rev-deleted-event' => '(фыст хафт у)',
 'rev-delundel' => 'равдисын/айсын',
-'revisiondelete' => 'Ð\90ппаÑ\80 / Ñ\80аÑ\86аÑ\80аз фарсы фæлтæртæ',
+'revisiondelete' => 'СÑ\85аÑ\84Ñ\8bн/Ñ\80аÑ\86аÑ\80азÑ\8bн фарсы фæлтæртæ',
 'revdel-restore' => 'ивын зынæн',
 'revdel-restore-deleted' => 'хафт ивдтытæ',
 'revdel-restore-visible' => 'зынгæ ивдтытæ',
@@ -778,7 +793,7 @@ $2',
 'prefs-custom-css' => 'Хиæвæрд CSS',
 'prefs-custom-js' => 'Хиæвæрд JavaScript',
 'youremail' => 'E-mail:',
-'username' => 'РегиÑ\81Ñ\82Ñ\80аÑ\86игонд Ð½Ð¾Ð¼:',
+'username' => 'ФæÑ\81номÑ\8bг:',
 'uid' => 'Архайæджы ID:',
 'yourrealname' => 'Æцæг ном:',
 'yourlanguage' => 'Техникон фыстыты æвзаг:',
@@ -838,7 +853,7 @@ $2',
 'action-edit' => 'ацы фарс ивын',
 'action-createpage' => 'фæрстæ кæнын',
 'action-createtalk' => 'тæрхоны фæрстæ кæнын',
-'action-createaccount' => 'ацы архайæджы ном аразын',
+'action-createaccount' => 'саразын ацы архайæджы аккаунт',
 'action-minoredit' => 'ацы ивд чысылæй нысан кæнын',
 'action-move' => 'ацы фарсы ном ивын',
 'action-movefile' => 'ацы файлы ном ивын',
@@ -1124,7 +1139,7 @@ $3',
 'sp-contributions-logs' => 'логтæ',
 'sp-contributions-talk' => 'ныхас',
 'sp-contributions-search' => 'Бавæрд агурæн',
-'sp-contributions-username' => 'IP адрис кæнæ архайæджы ном:',
+'sp-contributions-username' => 'IP адрис кæнæ фæсномыг:',
 'sp-contributions-toponly' => 'Æвдисæт æрмæст фæстаг ивдтытæ',
 'sp-contributions-submit' => 'Агурын',
 
index 3228901..0096dff 100644 (file)
@@ -1054,6 +1054,7 @@ Zdaje się, że została skasowana.',
 'edit-no-change' => 'Twoja edycja została zignorowana, ponieważ nie zmienił{{GENDER:|eś|aś|eś(‐aś)}} niczego w tekście.',
 'edit-already-exists' => 'Nie udało się stworzyć nowej strony.
 Strona już istnieje.',
+'defaultmessagetext' => 'Domyślny tekst komunikatu',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Uwaga! Ta strona zawiera zbyt wiele wywołań złożonych obliczeniowo funkcji parsera.
index 6765369..f9ce0f3 100644 (file)
@@ -338,7 +338,7 @@ $messages = array(
 'tog-fancysig' => 'Tratar assinatura como wikitexto (sem link automático)',
 'tog-externaleditor' => 'Utilizar editor externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
 'tog-externaldiff' => 'Utilizar comparador de versões externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-showjumplinks' => 'Ativar hiperligações de acessibilidade "ir para"',
+'tog-showjumplinks' => 'Ativar links de acessibilidade "ir para"',
 'tog-uselivepreview' => 'Utilizar pré-visualização em tempo real (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Avisar-me ao introduzir um sumário vazio',
 'tog-watchlisthideown' => 'Esconder as minhas edições da lista de páginas vigiadas',
@@ -579,7 +579,7 @@ Veja a [[Special:Version|página sobre a versão do sistema]].',
 'editlink' => 'editar',
 'viewsourcelink' => 'ver código-fonte',
 'editsectionhint' => 'Editar seção: $1',
-'toc' => 'Tabela de conteúdo',
+'toc' => 'Conteúdo',
 'showtoc' => 'exibir',
 'hidetoc' => 'ocultar',
 'collapsible-collapse' => 'Ocultar',
@@ -693,6 +693,9 @@ $2',
 'ns-specialprotected' => 'Não é possível editar páginas especiais',
 'titleprotected' => "Este título foi protegido, para que não seja criado.
 Quem o protegeu foi [[User:$1|$1]], com a justificativa: ''$2''.",
+'filereadonlyerror' => 'Não é possível modificar o arquivo "$1" porque o repositório do arquivo "$2" está em modo somente leitura.
+
+O administrador que bloqueou ofereceu a seguinte explicação: "$3".',
 
 # Virus scanner
 'virus-badscanner' => "Má configuração: antivírus desconhecido: ''$1''",
@@ -821,7 +824,7 @@ Você pode já ter alterado com sucesso a sua senha, ou solicitado uma nova senh
 'passwordreset' => 'Redefinir senha',
 'passwordreset-text' => 'Preencha este formulário para recuperar os dados da sua conta pelo e-mail.',
 'passwordreset-legend' => 'Reiniciar a senha',
-'passwordreset-disabled' => 'Reiniciar a senha foi impossibilitado nesta wiki.',
+'passwordreset-disabled' => 'Redefinições de senha foram desabilitadas neste wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
 'passwordreset-username' => 'Nome de usuário:',
 'passwordreset-domain' => 'Domínio:',
@@ -1056,6 +1059,7 @@ Ela parece ter sido eliminada.',
 'edit-no-change' => 'A sua edição foi ignorada, uma vez que o texto não sofreu alterações.',
 'edit-already-exists' => 'Não foi possível criar uma nova página.
 Ela já existia.',
+'defaultmessagetext' => 'Texto da mensagem padrão',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Aviso: Esta página contém muitas chamadas a funções do analisador "parser".
@@ -1110,11 +1114,11 @@ Legenda: ''({{int:cur}})''' = diferença com relação a versão atual,
 
 # Revision feed
 'history-feed-title' => 'Histórico de revisão',
-'history-feed-description' => 'Histórico de revisões para esta página nesta wiki',
+'history-feed-description' => 'Histórico de revisões para esta página neste wiki',
 'history-feed-item-nocomment' => '$1 em $2',
 'history-feed-empty' => 'A página requisitada não existe.
-Poderá ter sido eliminada da wiki ou renomeada.
-Tente [[Special:Search|pesquisar na wiki]] por páginas relevantes.',
+Poderá ter sido eliminada do wiki ou renomeada.
+Tente [[Special:Search|pesquisar no wiki]] por páginas relevantes.',
 
 # Revision deletion
 'rev-deleted-comment' => '(resumo da edição suprimido)',
@@ -1307,7 +1311,8 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 'showingresults' => "A seguir {{PLURAL:$1|é mostrado '''um''' resultado|são mostrados até '''$1''' resultados}}, iniciando no '''$2'''º.",
 'showingresultsnum' => "A seguir {{PLURAL:$3|é mostrado '''um''' resultado|são mostrados '''$3''' resultados}}, iniciando com o '''$2'''º.",
 'showingresultsheader' => "{{PLURAL:$5|Resulado '''$1''' de '''$3'''|Resultados '''$1 - $2''' de '''$3'''}} para '''$4'''",
-'nonefound' => "'''Nota''': apenas alguns espaços nominais são pesquisados por padrão. Tente utilizar o prefixo ''all:'' em sua busca, para pesquisar por todos os conteúdos desta wiki (inclusive páginas de discussão, predefinições etc), ou mesmo, utilizando o espaço nominal desejado como prefixo.",
+'nonefound' => "'''Nota''': apenas alguns espaços nominais são pesquisados por padrão.
+Tente utilizar o prefixo ''all:'' em sua busca, para pesquisar por todos os conteúdos deste wiki (inclusive páginas de discussão, predefinições etc), ou mesmo, utilizando o espaço nominal desejado como prefixo.",
 'search-nonefound' => 'Não houve resultados para a pesquisa.',
 'powersearch' => 'Pesquisa avançada',
 'powersearch-legend' => 'Pesquisa avançada',
@@ -1379,7 +1384,7 @@ Eis um valor gerado aleatoriamente que você pode usar: $1",
 'savedprefs' => 'As suas preferências foram salvas.',
 'timezonelegend' => 'Fuso horário:',
 'localtime' => 'Horário local:',
-'timezoneuseserverdefault' => 'Usar padrão da wiki ($1)',
+'timezoneuseserverdefault' => 'Utilizar padrão do wiki ($1)',
 'timezoneuseoffset' => 'Outro (especifique diferença horária)',
 'timezoneoffset' => 'Diferença horária¹',
 'servertime' => 'Horário do servidor:',
@@ -1415,7 +1420,7 @@ Esta ação não pode ser desfeita.',
 'yourrealname' => 'Nome verdadeiro:',
 'yourlanguage' => 'Língua:',
 'yourvariant' => 'Variante da língua de conteúdo:',
-'prefs-help-variant' => 'A sua variante preferida ou ortografia para mostrar no conteúdo das páginas desta wiki.',
+'prefs-help-variant' => 'A sua variante preferida ou ortografia para mostrar no conteúdo das páginas deste wiki.',
 'yournick' => 'Assinatura:',
 'prefs-help-signature' => 'Ao inserir comentários em páginas de discussão, assine-os colocando quatro tiles (<nowiki>~~~~</nowiki>) no fim dos comentários. Ao salvar, estes serão convertidos na sua assinatura mais a data e a hora da edição.',
 'badsig' => 'Assinatura inválida; verifique o código HTML utilizado.',
@@ -1466,7 +1471,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 * Uma caixa de seleção desselecionada significa que o usuário não se encontra no grupo.
 * Um * indica que não pode remover o grupo depois de o adicionar, ou vice-versa.',
 'userrights-reason' => 'Motivo:',
-'userrights-no-interwiki' => 'Você não tem permissão de alterar privilégios de usuários em outras wikis.',
+'userrights-no-interwiki' => 'Você não tem permissão para alterar privilégios de usuários em outros wikis.',
 'userrights-nodatabase' => 'O banco de dados $1 não existe ou não é um banco de dados local.',
 'userrights-nologin' => 'Você precisa [[Special:UserLogin|autenticar-se]] como um administrador para especificar os privilégios de usuário.',
 'userrights-notallowed' => 'A sua conta não tem permissão para adicionar ou remover privilégios a usuários.',
@@ -1561,7 +1566,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 # User rights log
 'rightslog' => 'Registro de privilégios de usuário',
 'rightslogtext' => 'Este é um registro de mudanças nos privilégios de usuários.',
-'rightslogentry' => 'foi alterado o grupo de acesso de $1 (de $2 para $3)',
+'rightslogentry' => 'alterou os grupos de privilégios {{GENDER:$1|do usuário|da usuária|de usuário para}} $1 (de $2 para $3)',
 'rightslogentry-autopromote' => 'foi automaticamente promovido de $2 para $3',
 'rightsnone' => '(nenhum)',
 
@@ -1591,7 +1596,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'action-block' => 'impedir que este usuário edite',
 'action-protect' => 'alterar os níveis de proteção desta página',
 'action-rollback' => 'Reverter rapidamente as edições do último usuário que editou uma página em particular',
-'action-import' => 'importar esta página a partir de outra wiki',
+'action-import' => 'importar esta página a partir de outro wiki',
 'action-importupload' => 'importar esta página através do carregamento de um arquivo',
 'action-patrol' => 'marcar as edições de outros usuários como patrulhadas',
 'action-autopatrol' => 'ter suas edições marcadas como patrulhadas',
@@ -1844,6 +1849,7 @@ Caso o problema persista, procure um [[Special:ListUsers/sysop|administrador]].'
 'lockmanager-fail-acquirelock' => 'Não foi possível obter uma referência de bloqueio para "$1".',
 'lockmanager-fail-openlock' => 'Não foi possível abrir a referência de bloqueio para "$1".',
 'lockmanager-fail-releaselock' => 'Não foi possível liberar o bloqueio para "$1".',
+'lockmanager-fail-db-bucket' => 'Não foi possível contatar suficientemente bloqueio das bases de dados no bucket $1 .',
 'lockmanager-fail-db-release' => 'Não foi possível liberar os bloqueios para "$1".',
 'lockmanager-fail-svr-release' => 'Não foi possível liberar os bloqueios do servidor "$1".',
 
@@ -1857,7 +1863,7 @@ A sua segurança não pode ser devidamente verificada.',
 
 # Special:UploadStash
 'uploadstash' => 'Arquivos escondidos',
-'uploadstash-summary' => 'Esta página dá acesso aos arquivos enviados (ou que estão no processo de envio) mas que ainda não foram publicados na wiki. Estes arquivos não são visíveis para ninguém, exceto para o usuário que os enviou.',
+'uploadstash-summary' => 'Esta página dá acesso aos arquivos enviados (ou que estão no processo de envio) mas que ainda não foram publicados no wiki. Estes arquivos não são visíveis para ninguém, exceto para o usuário que os enviou.',
 'uploadstash-clear' => 'Apagar os arquivos escondidos',
 'uploadstash-nofiles' => 'Você não tem nenhum arquivo escondido.',
 'uploadstash-badtoken' => 'Não foi possível executar essa operação, talvez porque as suas credenciais de edição expiraram. Tente novamente.',
@@ -1877,8 +1883,8 @@ Consulte a documentação em [//www.mediawiki.org/wiki/Manual:Image_Authorizatio
 'img-auth-isdir' => 'Você está tentando acessar o diretório "$1".
 Somente acesso ao arquivo é permitido.',
 'img-auth-streaming' => "Realizando ''streaming'' de \"\$1\".",
-'img-auth-public' => 'A img_auth.php produz arquivos a partir de uma wiki privada.
-Esta wiki está configurada como uma wiki pública.
+'img-auth-public' => 'A img_auth.php produz arquivos a partir de um wiki privado.
+Este wiki está configurado como um wiki público.
 Para melhor segurança, o img_auth.php está desativado.',
 'img-auth-noread' => 'Usuário não tem acesso para ler "$1".',
 'img-auth-bad-query-string' => 'A URL tem um texto de consulta inválido.',
@@ -2002,8 +2008,8 @@ A descrição na sua [$2 página de descrição de arquivo] é exibida abaixo.',
 
 # Unused templates
 'unusedtemplates' => 'Predefinições não utilizadas',
-'unusedtemplatestext' => 'Esta página lista todas as páginas no espaço nominal {{ns:template}} que não estão incluídas numa outra página. Lembre-se de conferir se há outras ligações para as predefinições antes de apaga-las.',
-'unusedtemplateswlh' => 'outras ligações',
+'unusedtemplatestext' => 'Esta página lista todas as páginas no espaço nominal {{ns:template}} que não estão incluídas em uma outra página. Lembre-se de conferir se há outros links para as predefinições antes de apaga-las.',
+'unusedtemplateswlh' => 'outros links',
 
 # Random page
 'randompage' => 'Página aleatória',
@@ -2022,7 +2028,7 @@ A descrição na sua [$2 página de descrição de arquivo] é exibida abaixo.',
 'statistics-header-hooks' => 'Outras estatísticas',
 'statistics-articles' => 'Páginas de conteúdo',
 'statistics-pages' => 'Páginas',
-'statistics-pages-desc' => 'Todas as páginas na wiki, incluindo páginas de discussão, redirecionamentos, etc.',
+'statistics-pages-desc' => 'Todas as páginas no wiki, incluindo páginas de discussão, redirecionamentos, etc.',
 'statistics-files' => 'Arquivos carregados',
 'statistics-edits' => 'Edições de página desde que {{SITENAME}} foi instalado',
 'statistics-edits-average' => 'Média de edições por página',
@@ -2041,7 +2047,7 @@ Uma página é considerada como de desambiguação se utilizar uma predefiniçã
 
 'doubleredirects' => 'Redirecionamentos duplos',
 'doubleredirectstext' => 'Esta página lista as páginas que redirecionam para outros redirecionamentos.
-Cada linha contém ligações para o primeiro e o segundo redirecionamentos, juntamente com o alvo do segundo redirecionamento, que é geralmente a verdadeira página de destino, para a qual o primeiro redirecionamento deveria apontar.
+Cada linha contém links para o primeiro e o segundo redirecionamentos, juntamente com o alvo do segundo redirecionamento, que é geralmente a verdadeira página de destino, para a qual o primeiro redirecionamento deveria apontar.
 Entradas <del>riscadas</del> foram resolvidas.',
 'double-redirect-fixed-move' => '[[$1]] foi movido e agora é um redirecionamento para [[$2]]',
 'double-redirect-fixed-maintenance' => 'Corrigindo redirecionamento duplo de [[$1]] para [[$2]].',
@@ -2070,7 +2076,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'ntransclusions' => 'usada {{PLURAL:$1|numa página|em $1 páginas}}',
 'specialpage-empty' => 'Atualmente não há dados a serem exibidos nesta página.',
 'lonelypages' => 'Páginas órfãs',
-'lonelypagestext' => 'As seguintes páginas não recebem ligações nem são incluídas em outras páginas do {{SITENAME}}.',
+'lonelypagestext' => 'As seguintes páginas não recebem links nem são incluídas em outras páginas do {{SITENAME}}.',
 'uncategorizedpages' => 'Páginas não categorizadas',
 'uncategorizedcategories' => 'Categorias não categorizadas',
 'uncategorizedimages' => 'Imagens não categorizadas',
@@ -2093,7 +2099,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'shortpages' => 'Páginas curtas',
 'longpages' => 'Páginas longas',
 'deadendpages' => 'Páginas sem saída',
-'deadendpagestext' => 'As seguintes páginas não contêm hiperligações para outras páginas nesta wiki.',
+'deadendpagestext' => 'As seguintes páginas não contêm links para outras páginas no wiki {{SITENAME}}.',
 'protectedpages' => 'Páginas protegidas',
 'protectedpages-indef' => 'Proteções infinitas apenas',
 'protectedpages-cascade' => 'Apenas proteções progressivas',
@@ -2174,7 +2180,7 @@ Veja também [[Special:WantedCategories|categorias pedidas]].',
 'sp-deletedcontributions-contribs' => 'contribuições',
 
 # Special:LinkSearch
-'linksearch' => 'Pesquisa de ligações externas',
+'linksearch' => 'Pesquisa de links externos',
 'linksearch-pat' => 'Procurar padrão:',
 'linksearch-ns' => 'Espaço nominal:',
 'linksearch-ok' => 'Pesquisar',
@@ -2205,7 +2211,7 @@ Protocolos suportados: <tt>$1</tt> (não adicionado nenhum desses em sua pesquis
 
 # Special:ListGroupRights
 'listgrouprights' => 'Privilégios de grupo de usuários',
-'listgrouprights-summary' => 'O que segue é uma lista dos grupos de usuários definidos nesta wiki, com os seus privilégios de acessos associados.
+'listgrouprights-summary' => 'O que segue é uma lista dos grupos de usuários definidos neste wiki, com os seus privilégios de acessos associados.
 Pode haver [[{{MediaWiki:Listgrouprights-helppage}}|informações adicionais]] sobre privilégios individuais.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">Privilégio concedido</span>
 * <span class="listgrouprights-revoked">Privilégio revogado</span>',
@@ -2543,8 +2549,8 @@ Segue, para referência, a entrada mais recente no registro de bloqueios:',
 'whatlinkshere' => 'Páginas afluentes',
 'whatlinkshere-title' => 'Páginas que apontam para "$1"',
 'whatlinkshere-page' => 'Página:',
-'linkshere' => "As seguintes páginas possuem ligações para '''[[:$1]]''':",
-'nolinkshere' => "Não existem ligações para '''[[:$1]]'''.",
+'linkshere' => "As seguintes páginas possuem links para '''[[:$1]]''':",
+'nolinkshere' => "Não existem links para '''[[:$1]]'''.",
 'nolinkshere-ns' => "Não há links para '''[[:$1]]''' no espaço nominal selecionado.",
 'isredirect' => 'página de redirecionamento',
 'istemplate' => 'inclusão',
@@ -2554,7 +2560,7 @@ Segue, para referência, a entrada mais recente no registro de bloqueios:',
 'whatlinkshere-links' => '← links',
 'whatlinkshere-hideredirs' => '$1 redirecionamentos',
 'whatlinkshere-hidetrans' => '$1 transclusões',
-'whatlinkshere-hidelinks' => '$1 ligações',
+'whatlinkshere-hidelinks' => '$1 links',
 'whatlinkshere-hideimages' => '$1 links de imagens',
 'whatlinkshere-filters' => 'Filtros',
 
@@ -2793,11 +2799,12 @@ Por favor, escolha outro nome.',
 
 # Export
 'export' => 'Exportação de páginas',
-'exporttext' => 'Você pode exportar o texto e o histórico de edições de uma página em particular para um arquivo XML. Poderá então importar esse conteúdo noutra wiki que utilize o software MediaWiki através da [[Special:Import|página de importações]].
+'exporttext' => 'Você pode exportar o texto e o histórico de edições, ou de uma página em particular ou de um conjunto de páginas, para um arquivo XML.
+A partir disso, será possível importar esse conteúdo em outro wiki que utilize o software MediaWiki através da [[Special:Import|página de importações]].
 
-Para exportar páginas, introduza os títulos na caixa de texto abaixo (um título por linha) e selecione se deseja todas as versões, com as linhas de histórico de edições, ou apenas a edição atual e informações apenas sobre a mais recente das edições.
+Para exportar páginas, insira os títulos na caixa de texto abaixo, um título por linha; selecione entre a edição atual acompanhada das edições anteriores e respectivo histórico de edições ou entre apenas a última edição e suas respectivas informações.
 
-Se desejar, pode utilizar uma ligação (por exemplo, [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para a [[{{MediaWiki:Mainpage}}]]).',
+Para o último caso, é possível obter o XML a partir de um link direto (por exemplo, [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para a edição mais recente da página "[[{{MediaWiki:Mainpage}}]]").',
 'exportall' => 'Exportar todas as páginas',
 'exportcuronly' => 'Incluir apenas a revisão atual, não o histórico inteiro',
 'exportnohistory' => "----
@@ -2854,7 +2861,7 @@ Todas as ações de importação transwiki são registradas no [[Special:Log/imp
 'import-interwiki-namespace' => 'Domínio de destino:',
 'import-upload-filename' => 'Nome do arquivo:',
 'import-comment' => 'Comentário:',
-'importtext' => 'Por favor, exporte o arquivo da wiki de origem utilizando a página especial [[Special:Export|exportação de páginas]].
+'importtext' => 'Por favor, exporte o arquivo do wiki de origem utilizando a página especial [[Special:Export|exportação de páginas]].
 Salve o arquivo no seu computador e importe-o aqui.',
 'importstart' => 'Importando páginas...',
 'import-revision-count' => '{{PLURAL:$1|uma edição|$1 edições}}',
@@ -2878,13 +2885,13 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'xml-error-string' => '$1 na linha $2, coluna $3 (byte $4): $5',
 'import-upload' => 'Enviar dados em XML',
 'import-token-mismatch' => 'Perda dos dados da sessão. Por favor tente novamente.',
-'import-invalid-interwiki' => 'Não é possível importar da wiki especificada.',
+'import-invalid-interwiki' => 'Não é possível importar do wiki especificado.',
 'import-error-edit' => 'A página "$1" não foi importada porque você não tem permissão para editá-la.',
 'import-error-create' => 'A página "$1" não foi importada porque você não tem permissão para criá-la.',
 
 # Import log
 'importlogpage' => 'Registro de importações',
-'importlogpagetext' => 'Importações administrativas de páginas com a preservação do histórico de edição de outras wikis.',
+'importlogpagetext' => 'Importações administrativas de páginas com a preservação do histórico de edição de outros wikis.',
 'import-logentry-upload' => 'importou [[$1]] através de arquivo de importação',
 'import-logentry-upload-detail' => '{{PLURAL:$1|uma edição|$1 edições}}',
 'import-logentry-interwiki' => 'transwiki $1',
@@ -2917,7 +2924,7 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'tooltip-ca-move' => 'Mover esta página',
 'tooltip-ca-watch' => 'Adicionar esta página às páginas vigiadas',
 'tooltip-ca-unwatch' => 'Remover esta página da lista de páginas vigiadas',
-'tooltip-search' => 'Pesquisar nesta wiki',
+'tooltip-search' => 'Pesquisar em {{SITENAME}}',
 'tooltip-search-go' => 'Ir a uma página com este exato nome, caso exista',
 'tooltip-search-fulltext' => 'Procurar por páginas contendo este texto',
 'tooltip-p-logo' => 'Página principal',
@@ -2925,7 +2932,7 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'tooltip-n-mainpage-description' => 'Visitar a página principal',
 'tooltip-n-portal' => 'Sobre o projeto',
 'tooltip-n-currentevents' => 'Informação temática sobre eventos atuais',
-'tooltip-n-recentchanges' => 'A lista de mudanças recentes nesta wiki.',
+'tooltip-n-recentchanges' => 'Uma lista de mudanças recentes no wiki',
 'tooltip-n-randompage' => 'Abrir uma página aleatoriamente',
 'tooltip-n-help' => 'Um local reservado para auxílio.',
 'tooltip-t-whatlinkshere' => 'Lista de todas as páginas que ligam-se a esta',
@@ -2955,6 +2962,7 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'tooltip-compareselectedversions' => 'Ver as diferenças entre as duas versões selecionadas desta página.',
 'tooltip-watch' => 'Adicionar esta página à sua lista de páginas vigiadas',
 'tooltip-watchlistedit-normal-submit' => 'Remover títulos',
+'tooltip-watchlistedit-raw-submit' => 'Atualizar a lista de páginas vigiadas',
 'tooltip-recreate' => 'Recriar a página apesar de ter sido eliminada',
 'tooltip-upload' => 'Iniciar o carregamento',
 'tooltip-rollback' => '"{{int:rollbacklink}}" reverte, com um só clique, as edições do último editor desta página.',
@@ -3000,7 +3008,7 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
 'spamprotectionmatch' => 'O seguinte texto ativou o filtro de spam: $1',
 'spambot_username' => 'MediaWiki limpeza de spam',
 'spam_reverting' => 'Revertendo para a última versão que não contém links para $1',
-'spam_blanking' => 'Todas revisões contendo hiperligações para $1, limpando',
+'spam_blanking' => 'Todas revisões contendo links para $1, limpando',
 
 # Info page
 'pageinfo-title' => 'Informações sobre "$1"',
@@ -3526,7 +3534,10 @@ Caso o arquivo tenha sido modificado a partir do seu estado original, alguns det
 # E-mail address confirmation
 'confirmemail' => 'Confirmar endereço de E-mail',
 'confirmemail_noemail' => 'Não possui um endereço de e-mail válido indicado nas suas [[Special:Preferences|preferências de usuário]].',
-'confirmemail_text' => 'Esta wiki requer que valide o seu endereço de e-mail antes de utilizar as funcionalidades que requerem um endereço de e-mail. Ative o botão abaixo para enviar uma confirmação para o seu endereço de e-mail. A mensagem incluíra um endereço que contém um código; carregue o endereço no seu navegador para confirmar que o seu endereço de e-mail encontra-se válido.',
+'confirmemail_text' => '{{SITENAME}} requer o seu endereço de e-mail esteja validado antes de utilizar as funcionalidades que requerem um endereço de e-mail.
+Ative o botão abaixo para enviar uma confirmação para o seu endereço de e-mail.
+A mensagem incluirá um link que contém um código;
+acesse o link no seu navegador para confirmar que o seu endereço de e-mail é válido.',
 'confirmemail_pending' => 'Um código de confirmação já foi enviado para você; caso tenha criado sua conta recentemente, é recomendável aguardar alguns minutos para o receber antes de tentar pedir um novo código.',
 'confirmemail_send' => 'Enviar código de confirmação',
 'confirmemail_sent' => 'E-mail de confirmação enviado.',
@@ -3701,7 +3712,7 @@ Você também pode [[Special:EditWatchlist|editar a lista da maneira convenciona
 'version-hook-subscribedby' => 'Subscrito por',
 'version-version' => '(Versão $1)',
 'version-license' => 'Licença',
-'version-poweredby-credits' => "Esta é um wiki '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-credits' => "Este é um wiki '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'outros',
 'version-license-info' => 'O MediaWiki é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.
 
@@ -3815,7 +3826,7 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 # New logging system
 'logentry-delete-delete' => '$1 apagou a página $3',
 'logentry-delete-restore' => '$1 restaurou a página $3',
-'logentry-delete-event' => '$1 alterou a visibilidade {{PLURAL:$5|de uma entrada|das $5 entradas}} em $3: $4',
+'logentry-delete-event' => '$1 alterou a visibilidade {{PLURAL:$5|de uma entrada|de $5 entradas}} do registro $3: $4',
 'logentry-delete-revision' => '$1 alterou a visibilidade {{PLURAL:$5|de uma revisão|das $5 revisões}} em $3: $4',
 'logentry-delete-event-legacy' => '$1 alterou a visibilidade de uma entrada em $3',
 'logentry-delete-revision-legacy' => '$1 alterou a visibilidade de uma revisão em $3',
@@ -3856,7 +3867,7 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'feedback-close' => 'Feito',
 
 # API errors
-'api-error-badaccess-groups' => 'Você não tem permissão para enviar arquivos para esta wiki.',
+'api-error-badaccess-groups' => 'Você não tem permissão para enviar arquivos para este wiki.',
 'api-error-badtoken' => 'Erro interno: token inválido.',
 'api-error-copyuploaddisabled' => 'O upload por URL está desativado neste servidor.',
 'api-error-duplicate' => 'Já {{PLURAL:$1|há [$2 outro arquivo]|existem [$2 outros arquivos]}} com o mesmo conteúdo',
@@ -3873,7 +3884,7 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'api-error-hookaborted' => 'A modificação que você tentou realizar foi abortada pelo hook de uma extensão.',
 'api-error-http' => 'Erro interno: não foi possível conectar ao servidor.',
 'api-error-illegal-filename' => 'O nome do arquivo não é permitido.',
-'api-error-internal-error' => 'Erro interno: ocorreu um erro indeterminado na wiki ao processar o arquivo que você enviou.',
+'api-error-internal-error' => 'Erro interno: ocorreu algum erro ao processar o arquivo que você enviou ao wiki.',
 'api-error-invalid-file-key' => 'Erro interno: o arquivo não foi encontrado no armazenamento temporário.',
 'api-error-missingparam' => 'Erro interno: parâmetros em falta no pedido.',
 'api-error-missingresult' => 'Erro interno: não foi possível determinar se a cópia foi feita.',
@@ -3890,7 +3901,7 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'api-error-unknown-error' => 'Erro interno: ocorreu um erro indeterminado ao tentar enviar o arquivo.',
 'api-error-unknown-warning' => 'Aviso desconhecido: $1',
 'api-error-unknownerror' => 'Erro desconhecido: "$1".',
-'api-error-uploaddisabled' => 'Esta wiki está com uploads de arquivos desativados.',
+'api-error-uploaddisabled' => 'Este wiki está com o upload de arquivos desabilitado.',
 'api-error-verification-error' => 'Este arquivo pode estar corrompido ou ter a extensão errada.',
 
 );
index 299eec9..5850127 100644 (file)
@@ -19,6 +19,7 @@
  * @author Bangin
  * @author Bennylin
  * @author Beta16
+ * @author Bilalokms
  * @author Boivie
  * @author Brest
  * @author BrokenArrow
@@ -1905,8 +1906,8 @@ Extensions making use of it:
 'backend-fail-notexists' => 'Parameters:
 * $1 is a filename.',
 'backend-fail-hashes' => 'Definition of "[[w:en:Hash_function|hashes]]".',
-'backend-fail-notsame' => 'Parameters:
-* $1 is a filename.',
+'backend-fail-notsame' => 'Parametreler:
+* $1 bir dosya ismi.',
 'backend-fail-invalidpath' => 'Parameters:
 * $1 is a storage path.',
 'backend-fail-delete' => 'Parameters:
index 8359bb6..c7adf5c 100644 (file)
@@ -48,6 +48,7 @@
  * @author Kv75
  * @author Lockal
  * @author MaxSem
+ * @author Ola
  * @author Ole Yves
  * @author Putnik
  * @author Rave
@@ -983,7 +984,7 @@ $2
 'updated' => '(Обновлена)',
 'note' => "'''Примечание:'''",
 'previewnote' => "'''Помните, что это только предварительный просмотр.'''
-Ваши изменения ещё не были записаны! [[#editform|→ продолжить редактирование]]",
+Ваши изменения ещё не были сохранены! [[#editform|→ продолжить редактирование]]",
 'previewconflict' => 'Этот предварительный просмотр отражает текст в верхнем окне редактирования так, как он будет выглядеть, если вы решите записать его.',
 'session_fail_preview' => "'''К сожалению, сервер не смог обработать вашу правку из-за потери идентификатора сессии.
 Пожалуйста, попробуйте ещё раз.
index cc9c740..5149c0e 100644 (file)
@@ -665,9 +665,9 @@ $2',
 'ns-specialprotected' => 'Stránky v mennom pristore {{ns:special}} nie je možné upravovať.',
 'titleprotected' => "Používateľ [[User:$1|$1]] zabránil vytváraniu stránky s týmto názvom.
 Udaný dôvod: ''$2''.",
-'filereadonlyerror' => "Nebolo možné modifikovať súbor „$1“, protože úložisko „$2“ je momentálne v režime len na čítanie.
+'filereadonlyerror' => 'Nebolo možné modifikovať súbor „$1“, pretože úložisko „$2“ je momentálne v režime len na čítanie.
 
-Udaný dôvod: „''$3''“.",
+Správca, ktorý ho zamkol ponúkol toto vysvetlenie: „$3“.',
 
 # Virus scanner
 'virus-badscanner' => "Chybná konfigurácia: neznámy antivírus: ''$1''",
@@ -758,6 +758,7 @@ Z tohto dôvodu nemôžu návštevníci z tejto IP adresy momentálne vytvoriť
 'emailconfirmlink' => 'Potvrďte vašu e-mailovú adresu',
 'invalidemailaddress' => 'Emailovú adresu nemožno akceptovať, pretože sa zdá, že má neplatný formát. Zadajte adresu v správnom tvare alebo nechajte príslušné políčko prázdne.',
 'cannotchangeemail' => 'Na tejto wiki nie je možné meniť e-mailové adresy používateľského konta.',
+'emaildisabled' => 'Táto lokalita nedokáže posielať emaily.',
 'accountcreated' => 'Účet vytvorený',
 'accountcreatedtext' => 'Používateľský účet $1 bol vytvorený.',
 'createaccount-title' => 'Vytvorenie účtu na {{GRAMMAR:lokál|{{SITENAME}}}}',
@@ -975,6 +976,7 @@ Ak to nebude fungovať, skúste sa [[Special:UserLogout|odhlásiť]] a znovu pri
 'token_suffix_mismatch' => "'''Vaša úprava bola zamietnutá, pretože váš klient pokazil znaky s diakritikou v editačnom symbole (token). Úprava bola zamietnutá, aby sa zabránilo poškodeniu textu stránky. Toto sa občas stáva, keď používate chybnú anonymnú proxy službu cez webové rozhranie.'''",
 'edit_form_incomplete' => "'''Niektoré časti editačného formulára nedosiahli server. Prosím, znova skontrolujte, že vaše úpravy sú nepoškodené a skúste to znova.'''",
 'editing' => 'Úprava stránky $1',
+'creating' => 'Vytvára sa $1',
 'editingsection' => 'Úprava stránky $1 (sekcia)',
 'editingcomment' => 'Úprava stránky $1 (nová sekcia)',
 'editconflict' => 'Konflikt pri úprave: $1',
@@ -1040,6 +1042,7 @@ Zdá sa, že bola zmazaná.',
 'edit-no-change' => 'Vaša úprava bola ignorovaná, pretože ste v texte nič nezmenili.',
 'edit-already-exists' => 'Nebolo možné vytvoriť novú stránku.
 Už existuje.',
+'defaultmessagetext' => 'Predvolený text správy',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Upozornenie: Táto stránka obsahuje príliš mnoho volaní funkcií syntaktického analyzátora, ktoré nadmerne zaťažujú server.
@@ -1918,6 +1921,10 @@ Môžete si pozrieť [[Special:WhatLinksHere/$2|úplný zoznam]].',
 'sharedupload' => 'Tento zdieľaný súbor je z $1 a je možné ho používať na iných projektoch.',
 'sharedupload-desc-there' => 'Tento zdieľaný súbor je z $1 a je možné ho používať na iných projektoch. Ďalšie informácie nájdete na [$2 popisnej stránke súboru].',
 'sharedupload-desc-here' => 'Tento zdieľaný súbor je z $1 a je možné ho používať na iných projektoch. Nižšie sú zobrazené informácie z [$2 popisnej stránky súboru].',
+'sharedupload-desc-edit' => 'Tento súbor je z $1 a môžu ho používať iné projekty.
+Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
+'sharedupload-desc-create' => 'Tento súbor je z $1 a môžu ho používať iné projekty.
+Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
 'filepage-nofile' => 'Neexistuje žiadny súbor s takýmto názvom.',
 'filepage-nofile-link' => 'Súbor s takýmto názvom neexistuje, ale môžete ho [$1 nahrať].',
 'uploadnewversion-linktext' => 'Nahrať novú verziu tohto súboru',
@@ -2128,6 +2135,7 @@ Môžete zúžiť rozsah, ak zvolíte typ záznamu, používateľské meno alebo
 'allpagesprefix' => 'Zobraziť stránky s predponou:',
 'allpagesbadtitle' => 'Zadaný názov stránky je neplatný alebo mal medzijazykový alebo interwiki prefix. Môže obsahovať jeden alebo viac znakov, ktoré nie je možné použiť v názve stránky.',
 'allpages-bad-ns' => '{{SITENAME}} nemá menný priestor „$1“.',
+'allpages-hide-redirects' => 'Skryť presmerovania',
 
 # Special:Categories
 'categories' => 'Kategórie',
index 849c2cc..a4ede7c 100644 (file)
@@ -595,7 +595,8 @@ Mamnuucida ugu danbeyso in oo soo galo hoostaan ee ku qorantahay',
 '''wali lama keydin!'''",
 'updated' => '(waa la opdate gareeyay)',
 'note' => "'''fiiro gaar ah:'''",
-'previewnote' => "'''Waxa aad aragtid waa horfiirin; wixii aad bedeshay lama keydinin!'''",
+'previewnote' => "'''Ogaaw kan waa horfiirin oo kaliya.'''
+Bedelyadaada wali lama keydin!  [[#editform|→ Wax ka sii badal]]",
 'session_fail_preview' => "'''Waan ka xunahay! Wixii aad bedeshay ma'suurto galin in la'keydiyo cilad dhacday awgeed.
 Fadlan markale isku day. Hadii aysan weli shaqaynin, ka bax ee markale soo gudagal.'''",
 'session_fail_preview_html' => "'''Waan ka xunahay! Wixii aad bedeshay ma'suurto galin in la'keydiyo cilad dhacday awgeed.'''
@@ -604,6 +605,7 @@ Fadlan markale isku day. Hadii aysan weli shaqaynin, ka bax ee markale soo gudag
 
 '''Hadii wax ka bedlkaan uu yahay mid xaq ah, fadlan markale isku day. Hadii aysan weli shaqaynin, is kuday inaad  ka baxdo ee markale soo gudagal.'''",
 'editing' => 'Waxaa badaloosaa $1',
+'creating' => 'Sameynaa $1',
 'editingsection' => 'Waxaa wax ka badaloosaa $1 (qeyb yar)',
 'editingcomment' => 'Waxaa wax ka badaloosaa $1 (qeyb yar)',
 'editconflict' => 'Isku dhac badalaadka: $1',
@@ -637,6 +639,9 @@ Tirtiraha iyo wareejinta gudagalaha boggaan waxaad ka arki kartaa hoostaan.',
 Tusmooyinka qaar lagumo dari doono.",
 'post-expand-template-inclusion-category' => "Boggaga ku xad gudbay weyninka tusmo'da",
 
+# "Undo" feature
+'undo-summary' => 'Noqay bedelaadka $1 ee sameeyay  [[Special:Contributions/$2|$2]] ([[User talk:$2|hadal]])',
+
 # Account creation failure
 'cantcreateaccounttitle' => "Ma' sameynkaro gudagal (akoon)",
 'cantcreateaccount-text' => "Akoon'ka sameeyaha leh ciwaankaan  IP:ka ('''$1''') waxaa mamnuucay [[User:$3|$3]].
@@ -645,6 +650,7 @@ Sababta uu qoray $3 waa ''$2''",
 
 # History pages
 'viewpagelogs' => 'Fiiri guadagalayaasha boggaan',
+'nohistory' => 'Boggaan malahan taariikhda bedelaadka',
 'currentrev' => 'Bedelkii ugu danbeeyay',
 'currentrev-asof' => 'Kala duwanaanshihii ugu danbeeyay oo dhacay $1',
 'revisionasof' => 'Bedelaadkkii ahaa $1',
index b674c0d..bfe7626 100644 (file)
@@ -3457,7 +3457,7 @@ $5
 'sqlite-no-fts' => '$1 முழு-உரை தேடல் ஆதரவு இல்லாமல்',
 
 # New logging system
-'logentry-delete-delete' => 'பக்கம் $3 ஐ $1 நீக்கினார்',
+'logentry-delete-delete' => '$3 பக்கத்தை $1 நீக்கினார்',
 'logentry-delete-restore' => '$1 பயனரால் $3 பக்கம் மீட்டமைக்கப்பட்டது',
 'logentry-delete-event' => '$1 மாற்றிய காட்சித்தன்மை  {{PLURAL:$5| ஒரு நிகழ்வு குறிப்பேடு| $5  நிகழ்வுகள் குறிப்பேடு}} இதில்   $3 :$4',
 'logentry-delete-revision' => '$1 மாற்றப்பட்ட  காட்சித்தன்மைக்கு  {{PLURAL:$5| ஒருபரிசீலனை| $5  பரிசீலனைகளுக்கும்}} இந்த பக்கம்  $3 :$4',
index 68af6ea..dca7caf 100644 (file)
@@ -657,6 +657,7 @@ $2',
 'passwordreset-disabled' => 'ఈ వికీలో సంకేతపదాల మార్పును అచేతనం చేసాం.',
 'passwordreset-pretext' => '{{PLURAL:$1||డేటా శకలాల్లోంచి ఒకదాన్ని ఇవ్వండి}}',
 'passwordreset-username' => 'వాడుకరిపేరు:',
+'passwordreset-domain' => 'డొమైన్:',
 'passwordreset-email' => 'ఈ-మెయిలు చిరునామా:',
 'passwordreset-emailtitle' => '{{SITENAME}}లో ఖాతా వివరాలు',
 'passwordreset-emailtext-ip' => 'ఎవరో (బహుశా మీరే, ఐపీ అడ్రసు $1 నుంచి)  {{SITENAME}} ($4) లో మీ ఖాతా వివరాలను చెప్పమంటూ అడిగారు. కింది వాడుకరి {{PLURAL:$3|ఖాతా|ఖాతాలు}}
@@ -795,8 +796,8 @@ $2
 అభిమత .css మరియు .js పుటల శీర్షికలు ఇంగ్లీషు చిన్నబడి అక్షరాల లోనే ఉండాలని గుర్తుంచుకోండి, ఉదాహరణకు ఇలా {{ns:user}}:Foo/vector.css అంతేగానీ, {{ns:user}}:Foo/Vector.css ఇలా కాదు.",
 'updated' => '(నవీకరించబడింది)',
 'note' => "'''గమనిక:'''",
-'previewnote' => "'''ఇది మునుజూపు మాత్రమే;
-మారà±\8dà°ªà±\81లని à°\87à°\82à°\95à°¾ à°­à°¦à±\8dరపరà°\9aà°²à±\87à°¦à±\81!'''",
+'previewnote' => "'''ఇది మునుజూపు మాత్రమేనని గుర్తుంచుకోండి.'''
+à°®à±\80 à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°\87à°\82à°\95à°¾ à°­à°¦à±\8dరమవà±\8dవలà±\87à°¦à±\81! [[#editform|â\86\92 à°¸à°µà°°à°£à°¨à±\81 à°\95à±\8aనసాà°\97à°¿à°\82à°\9aà°\82à°¡à°¿]]",
 'previewconflict' => 'భద్రపరచిన తరువాత పై టెక్స్ట్‌ ఏరియాలోని టెక్స్టు ఇలాగ కనిపిస్తుంది.',
 'session_fail_preview' => "'''క్షమించండి! సెషను డేటా పోవడం వలన మీ మార్పులను స్వీకరించలేకపోతున్నాం.'''
 దయచేసి మళ్ళీ ప్రయత్నించండి.
@@ -1893,6 +1894,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'allpagesprefix' => 'ఈ ఆదిపదం కలిగిన పేజీలను చూపించు:',
 'allpagesbadtitle' => 'మీరిచ్చిన పేజీ పేరు సరైనది కాకపోయి ఉండాలి లేదా దానికి భాషాంతర లేదా అంతర్వికీ ఆదిపదమైనా ఉండి ఉండాలి. పేర్లలో వాడకూడని కారెక్టర్లు ఆ పేరులో ఉండి ఉండవచ్చు.',
 'allpages-bad-ns' => '{{SITENAME}} లో "$1" అనే నేమ్&zwnj;స్పేస్ లేదు.',
+'allpages-hide-redirects' => 'దారిమార్పులను దాచు',
 
 # Special:Categories
 'categories' => 'వర్గాలు',
@@ -3491,6 +3493,7 @@ $5
 # API errors
 'api-error-badaccess-groups' => 'ఈ వికీ లోనికి దస్త్రాలను ఎక్కించే అనుమతి మీకు లేదు.',
 'api-error-empty-file' => 'మీరు దాఖలుచేసిన ఫైల్ ఖాళీది.',
+'api-error-emptypage' => 'కొత్త మరియు ఖాళీ పేజీలను సృష్టించడానికి అనుమతి లేదు.',
 'api-error-filename-tooshort' => 'దస్త్రపు పేరు మరీ చిన్నగా ఉంది.',
 'api-error-filetype-banned' => 'ఈ రకపు దస్త్రాలని నిషేధించారు.',
 'api-error-http' => 'అంతర్గత దోషము: సేవకానికి అనుసంధానమవలేకపోతున్నది.',
index 48ab680..c3f42db 100644 (file)
@@ -445,6 +445,7 @@ Hasabyňyz açyldy.
 'createaccount' => 'Täze hasap aç',
 'gotaccount' => "Eýýäm hasap açdyňyzmy? '''$1'''.",
 'gotaccountlink' => 'Onda giriberiň!',
+'userlogin-resetlink' => 'Giriş maglumatlaryňyzy ýatdan çykardyňyzmy?',
 'createaccountmail' => 'e-poçta bilen',
 'createaccountreason' => 'Sebäp:',
 'badretype' => 'Girizen parollaryňyz biri-birine gabat gelmeýär.',
@@ -646,7 +647,7 @@ Salgylanmak üçin iň soňky blokirleme gündeligi ýazgysy aşakda berilýär:
 Hususy .css we .js sahypalarynyň setir harp bilen ýazylýandygyny ýatda saklaň, ýagny {{ns:user}}:Ulanyjy/Vector.css däl-de, eýsem {{ns:user}}:Ulanyjy/vector.css.",
 'updated' => '(Täzelenen)',
 'note' => "'''Bellik:'''",
-'previewnote' => "'''Bu bir ýöne deslapky syn. Üýtgeşmeleriňiz heniz ýazdyrylan däldir!'''",
+'previewnote' => "'''Ýatda saklaň, bu bir ýöne deslapky syn.''' Üýtgeşmeleriňiz heniz ýazdyrylan däldir! [[#editform|→ Redaktirläberiň]]",
 'previewconflict' => 'Bu deslapky syn redaktirleme penjiresiniň üstünde ýerleşip, ol ýazdyran mahalyňyz sahypanyň nähili görünjekdigini görkezýär.',
 'session_fail_preview' => "'''Bagyşlaň! Sessiýa maglumatynyň ýitirilmegi zerarly serwer özgerdişiňizi işläp bilenok.'''
 Gaýtadan synanyşmagyňyzy haýyş edýäris.
@@ -1099,8 +1100,8 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
 'prefs-help-gender' => 'Hökmany däl: programma tarapyndan ulanyjynyň jynsyna görä ýüzlenmek üçin ulanylýar. Bu maglumat köpçülige açyk boljakdyr.',
 'email' => 'E-poçta',
 'prefs-help-realname' => 'Hakyky at (hökmany däl): eger hakyky adyňyz berseňiz, onda eden işleriňiz görkezilende ulanyljakdyr.',
-'prefs-help-email' => 'E-poçta adresi hökmany däl; ýöne parolyňyz ýadyňyzdan çykan ýagdaýynda e-poçta adresiňize täze parol iberilmegine mümkinçilik berýär.
-Şeýle-de ol başga ulanyjylaryň ulanyjy we pikir alyşma sahypalaryňyzyň üsti bilen kimdigiňizi bilmezden siziň bilen habarlaşyp bilmeklerine şert döredýär.',
+'prefs-help-email' => 'E-poçta adresi hökmany däl, ýöne parolyňyz ýadyňyzdan çykan ýagdaýynda e-poçta adresiňize täze parol iberilmegine mümkinçilik berýär.',
+'prefs-help-email-others' => 'Ulanyjy ýa-da çekişme sahypaňyzdaky bir çykgydyň üsti bilen başga ulanyjylaryň size e-poçta ibermegine rugsat hem berip bilersiňiz. Başga ulanyjylar siziň bilen habarlaşan wagty e-poçta adresiňiz görkezilmez.',
 'prefs-help-email-required' => 'E-poçta adresi talap edilýär.',
 'prefs-info' => 'Esasy maglumat',
 'prefs-i18n' => 'Halkaralaşdyryş',
@@ -1518,7 +1519,7 @@ Bir sütüniň adyna tyklap sortirowkanyň tertibini üýtgedip bilersiňiz.',
 'filehist-filesize' => 'Faýl ölçegi',
 'filehist-comment' => 'Teswirleme',
 'filehist-missing' => 'Faýl ýok',
-'imagelinks' => 'Faýlyň çykgytlary',
+'imagelinks' => 'Faýlyň ulanylyşy',
 'linkstoimage' => 'Bu faýla çykgydy bar bolan {{PLURAL:$1|sahypa|$1 sahypa}}:',
 'linkstoimage-more' => '$1 gowrak {{PLURAL:$1|sahypa|sahypa}} bu faýla çykgyt berýär.
 Aşakdaky sanaw diňe şu faýla çykgyt berýän {{PLURAL:$1|ilkinji faýly |ilkinji $1 faýly}} görkezýär.
@@ -1683,7 +1684,7 @@ Ol indi [[$2]] sahypasyna gönükdirýär.',
 'listusers-editsonly' => 'Diňe özgerdiş eden ulanyjylary görkez',
 'listusers-creationsort' => 'Döredilen senesi boýunça tertiple',
 'usereditcount' => '$1 {{PLURAL:$1|özgerdiş|özgerdiş}}',
-'usercreated' => '$2, $1 senesinde döredildi',
+'usercreated' => '$2, $1 senesinde {{GENDER:$3|döredildi}}.',
 'newpages' => 'Täze sahypalar',
 'newpages-username' => 'Ulanyjy ady:',
 'ancientpages' => 'Iň köne sahypalar',
@@ -2094,6 +2095,7 @@ $1',
 'sp-contributions-newbies-title' => 'Täze hasaplar üçin ulanyjy goşantlary',
 'sp-contributions-blocklog' => 'Blokirleme gündeligi',
 'sp-contributions-deleted' => 'öçürilen ulanyjy goşantlary',
+'sp-contributions-uploads' => 'ýüklemeler',
 'sp-contributions-logs' => 'gündelikler',
 'sp-contributions-talk' => 'çekişme',
 'sp-contributions-userrights' => 'ulanyjy hukuklary dolandyryşy',
@@ -2590,7 +2592,7 @@ Ondan soňraky çykgyt(lar) kadadan çykma hökmünde kabul edilýär, meselem:
 'metadata-help' => 'Bu faýlda, ähtimal, dijital fotoapparat ýa-da skaner tarapyndan goşulan goşmaça maglumatlar bardyr. Eger faýl soňradan redaktirlenen bolsa, onda käbir maglumatlar häzirki redaktirlenen faýly görä köneligine galan bolup biler.',
 'metadata-expand' => 'Jikme-jiklikleri görkez',
 'metadata-collapse' => 'Jikme-jiklikleri görkezme',
-'metadata-fields' => 'Bu habarlaşykda sanalýan EXIF meta-maglumat meýdançalary meta-maglumat tablisasy çöken mahaly surat görkeziş sahypalarynda ulanylýar. Galanlary gaýybana tertipde gizlenilýär.
+'metadata-fields' => 'Bu habarda sanalýan şekil meta-maglumat meýdançalary meta-maglumat tablisasy düýrlenen mahaly şekil sahypasynyň displeýine goşular. Galanlary gaýybana tertipde gizlenilýär.
 * make
 * model
 * datetimeoriginal
index 7f356ae..a638c35 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author 82-145
  * @author Bekiroflaz
+ * @author Bilalokms
  * @author Bombola
  * @author Cekli829
  * @author Dbl2010
@@ -996,6 +997,7 @@ Değişikliğiniz, sayfa metninde bozulmayı önlemek için geri çevrildi.
 Eğer sorunlu bir web-tabanlı anonim proksi servisi kullanıyorsanız bu olay bazen gerçekleşebilir.'''",
 'edit_form_incomplete' => "'''Değişiklik formu için bazı sunuculara erişilemedi; yaptığınız değişiklikler bozulmamıştır, gözden geçirip tekrar deneyiniz.'''",
 'editing' => '"$1" sayfasını değiştirmektesiniz',
+'creating' => 'Oluşturuluyor $1',
 'editingsection' => '"$1" sayfasında bölüm değiştirmektesiniz',
 'editingcomment' => '$1 değiştiriliyor (yeni bölüm)',
 'editconflict' => 'Değişiklik çakışması: $1',
@@ -1015,7 +1017,7 @@ Yaptığınız katkının başka katılımcılar tarafından acımasızca deği
 Ayrıca buraya katkıda bulunarak, bu katkının kendiniz tarafından yazıldığına ya da kamuya açık bir kaynaktan ya da başka bir özgür/ücretsiz kaynaktan kopyalandığına güvence vermiş oluyorsunuz. '''Buraya, telif sahibinin izni olmadan telif hakkı ile korunan eserleri eklemeyiz! '''",
 'copyrightwarning2' => 'Lütfen, {{SITENAME}} sitesine bulunacağınız tüm katkıların diğer üyeler tarafından düzenlenebileceğini, değiştirilebileceğini ya da silinebileceğini hatırlayın. Yazılarınızın merhametsizce değiştirilebilmesine rıza göstermiyorsanız buraya katkıda bulunmayın. <br />
 Ayrıca bu ekleyeceğiniz yazıyı sizin yazdığınızı ya da serbest kopyalama izni veren bir kaynaktan kopyaladığınızı bize taahhüt etmektesiniz (ayrıntılar için referans: $1).',
-'longpageerror' => "'''HATA: Girdiğiniz metnin uzunluğu $1 kilobayt, ve en fazla uzunluktan $2 kilobayt daha fazladır.
+'longpageerror' => "'''HATA: Girdiğiniz metnin uzunluğu {{PLURAL:$1|bir kilobayt|$1 kilobayt}}, ve en fazla uzunluktan {{PLURAL:$2|bir kilobayt|$2 kilobayt}} daha fazladır.
 Kaydedilmesi mümkün değildir.'''",
 'readonlywarning' => "'''DİKKAT: Bakım nedeni ile veritabanı şu anda kilitlidir. Bu sebeple değişiklikleriniz şu anda kaydedilememektedir. Yazdıklarınızı başka bir editöre alıp saklayabilir ve daha sonra tekrar buraya getirip kaydedebilirsiniz'''
 
@@ -1058,6 +1060,7 @@ Silinmiş görünüyor.',
 'edit-no-change' => 'Değişikliğiniz yoksayıldı, çünkü metinde bir değişiklik yapılmadı.',
 'edit-already-exists' => 'Yeni sayfa oluşturulamıyor.
 Sayfa zaten mevcut.',
+'defaultmessagetext' => 'Varsayılan mesaj metni',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Uyarı: Bu sayfa çok fazla zengin derleyici fonksiyonu çağrısı içeriyor.
@@ -1637,6 +1640,7 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'newsectionsummary' => '/* $1 */ yeni başlık',
 'rc-enhanced-expand' => 'Ayrıntıları göster (JavaScript gerekir)',
 'rc-enhanced-hide' => 'Ayrıntıları gizle',
+'rc-old-title' => 'ilk olarak oluşturulan "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'İlgili değişiklikler',
@@ -1795,6 +1799,7 @@ Eğer sorun tekrarlanırsa, bir [[Special:ListUsers/sysop|hizmetli]] ile temasa
 'upload-http-error' => 'Bir HTTP hatası oluştu: $1',
 
 # File backend
+'backend-fail-notexists' => '$1 dosyası mevcut değil.',
 'backend-fail-delete' => '"$1" dosyası silinemedi.',
 'backend-fail-opentemp' => 'Geçici dosya açılamadı.',
 'backend-fail-closetemp' => 'Geçici dosya kapanamadı.',
index e4ffdb9..ea30b66 100644 (file)
@@ -941,8 +941,8 @@ $2
 Пам'ятайте, що користувацькі .css та .js сторінки повинні мати назву, що складається лише з малих літер, наприклад «{{ns:user}}:Хтось/vector.css», а не «{{ns:user}}:Хтось/Vector.css».",
 'updated' => '(Оновлена)',
 'note' => "'''Зауваження:'''",
-'previewnote' => "'''Це Ð»Ð¸Ñ\88е Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\96й Ð¿ÐµÑ\80еглÑ\8fд,
-текст ще не збережений!'''",
+'previewnote' => "'''Ð\9fам'Ñ\8fÑ\82айÑ\82е, Ñ\89о Ñ\86е Ð»Ð¸Ñ\88е Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\96й Ð¿ÐµÑ\80еглÑ\8fд.'''
+Ваші зміни ще не були збережені! [[#editform|→ Продовжити редагування]]",
 'previewconflict' => 'Цей попередній перегляд відображає текст з верхнього вікна редагування так, як він буде виглядіти, якщо ви вирішите зберегти його.',
 'session_fail_preview' => "'''Система не може зберегти ваші редагування, оскільки втрачені дані сеансу. Будь ласка, повторіть вашу спробу.
 Якщо помилка буде повторюватись, спробуйте [[Special:UserLogout|вийти з системи]] і зайти знову.'''",
index 1ab293b..4da0ece 100644 (file)
@@ -277,6 +277,7 @@ $messages = array(
 'delete' => 'Čuta poiš',
 'deletethispage' => "Čuta nece lehtpol'",
 'undelete_short' => "Endištada {{PLURAL:$1|üks' redakcii|$1 redakcijad}}",
+'viewdeleted_short' => 'Kc. {{PLURAL:$1|čutud redakcii|$1 čutud redakcijad}}',
 'protect' => 'Kaita',
 'protect_change' => 'toižetada',
 'protectthispage' => "Kaita nece lehtpol'",
@@ -583,7 +584,10 @@ Aigaline peitsana: $2',
 'passwordreset-emailsent' => 'Muštatai kirjeine oigetihe e-počtadme',
 
 # Special:ChangeEmail
+'changeemail' => 'Toižetada e-počtan adres',
+'changeemail-no-info' => 'Miše kirjutada necil lehtpolel, teile pidab kirjutadas sistemha.',
 'changeemail-newemail' => "Uz' e-počtan adres",
+'changeemail-none' => '(ei ole)',
 'changeemail-submit' => 'Toižetada e-počtan adres',
 'changeemail-cancel' => 'Heitta',
 
@@ -692,6 +696,7 @@ Alemba om anttud jälgmäine kirjutuz blokiruindaiglehtesespäi:",
 Teiden toižetused ei olgoi völ kirjutadud! [[#editform|→ jatkta redakrtiruind]]",
 'previewconflict' => "Tekst redaktiruindan üläiknas kuvazub neche ezikacundha muga, kut se nägub lopkirjutamižen jäl'ghe.",
 'editing' => '$1-lehtpolen redaktiruind',
+'creating' => 'Sätas $1',
 'editingsection' => '$1-lehtpolen redaktiruind (jaguz)',
 'editingcomment' => "$1-lehtpolen redaktiruind (uz' jaguz)",
 'editconflict' => 'Redaktiruindan konflikt: $1',
@@ -754,6 +759,7 @@ Voib olda, se om jo čutud.",
 'edit-no-change' => 'Teiden redakcii ignoriruidihe, sikš miše tekst ei ole toižetadud.',
 'edit-already-exists' => "Ei voi säta uz' lehtpol'.
 Wikiš om jo mugoi lehtpol'.",
+'defaultmessagetext' => 'Tekst augotižjärgendusen mödhe',
 
 # Parser/template warnings
 'expensive-parserfunction-category' => 'Lehtpoled, kudambil kävutadas äjahko resursokahid funkcijoid',
@@ -901,6 +907,7 @@ Tö ei voigoi kävutada sidä.',
 # Diffs
 'history-title' => '"$1"-lehtpolen toižetusiden istorii',
 'difference' => '(Erod versijoiden keskes)',
+'difference-multipage' => '(Lehtpoliden erinend)',
 'lineno' => 'Rivi $1:',
 'compareselectedversions' => 'Rindatada valitud versijad',
 'showhideselectedversions' => 'Ozutada/peitta valitud versijad',
@@ -1051,6 +1058,7 @@ Otkat sil'mnägubale üks-se, miše {{SITENAME}}-saitan sädäimišt voib olda v
 'prefs-files' => 'Failad',
 'prefs-custom-css' => 'Ičeze CSS',
 'prefs-custom-js' => 'Ičeze JS',
+'prefs-common-css-js' => 'Ühthižed CSS/JavaScript kaikiden temiden täht:',
 'prefs-reset-intro' => "Tö sat kävutada nece lehtpol', miše pördutada teiden järgendused saitan ezijärgendusidennoks.
 Necidä tegendad ei sa toižetada.",
 'prefs-emailconfirm-label' => 'E-počtan vahvištand:',
@@ -1269,6 +1277,7 @@ Ku tö kirjutat sen, nece nimi kävutadas, miše ozutada lehtpolen toižetajad.'
 'rc_categories' => 'Vaiše kategorijoišpäi (erigoitkat znamaižel "|")',
 'rc_categories_any' => 'Eraz',
 'rc-change-size' => '$1',
+'rc-change-size-new' => "$1 {{PLURAL:$1|bait|baitad}} jäl'ges toižetamišt",
 'newsectionsummary' => "/* $1 */ uz' jaguz",
 'rc-enhanced-expand' => 'Ozutada detalid (JavaScript)',
 'rc-enhanced-hide' => 'Peitta detalid',
@@ -2871,7 +2880,7 @@ Necen vahvištoitandkodan kävutamižen lopstrok om $4.',
 'autosumm-blank' => 'Lehtpolen südäiolend om čutud',
 'autosumm-replace' => "Lehtpolen südäiolend om vajehtud '$1'-südäiolendaks",
 'autoredircomment' => 'Om läbioigetud [[$1]]-lehtpolele',
-'autosumm-new' => "Om sätud uz' lehtpol', kudamban suruz om '$1'",
+'autosumm-new' => "Om sätud uz' lehtpol', kudamban südäiolend om '$1'",
 
 # Size units
 'size-bytes' => '$1 b',
index f3a7e35..7daf652 100644 (file)
@@ -661,6 +661,7 @@ $2',
 'invalidemailaddress' => 'דער ע-פאסט אדרעס קען נישט אקצעפטירט ווערן ווייל ער שיינט צו האבן אן אומגילטיגן פֿארמאט.
 ביטע אריינלייגן א גוט-פארמאטירטן אדרעס אדער ליידיגט אויס דאס פֿעלד.',
 'cannotchangeemail' => "מ'קען נישט ענדערן קאנטע ע־פאסט אדרעסן אין דער וויקי.",
+'emaildisabled' => 'דאס וועבזייטל קען נישט שיקן ע־בריוון.',
 'accountcreated' => 'די קאָנטע איז באַשאַפֿן',
 'accountcreatedtext' => 'די באניצער קאנטע פאר $1 איז באַשאַפֿן געווארן.',
 'createaccount-title' => 'קאנטע באשאפֿן אין {{SITENAME}}',
@@ -864,7 +865,8 @@ $2
 'userinvalidcssjstitle' => "'''ווארענונג:''' סאיז נישטא קיין סקין \"\$1\". גדענקט אז קאסטעם .css און .js בלעטער נוצען לאוער קעיס טיטול, e.g. {{ns:user}}:Foo/vector.css ווי אנדערשט צו {{ns:user}}:Foo/Vector.css.",
 'updated' => '(דערהיינטיגט)',
 'note' => "'''באמערקונג:'''",
-'previewnote' => "'''דאס איז נאָר אין אַ פֿאָרויסיקע ווייזונג, דער אַרטיקל איז דערווייל נאָך נישט געהיט!'''",
+'previewnote' => "'''געדענקט אז דאס איז נאָר אין אַ פֿאָרויסיקע ווייזונג.'''
+אייערע ענדערונגען זענען נאָך נישט געהיט! [[#editform|→ ווייטער רעדאקטירן]]",
 'previewconflict' => 'די פֿאראויסיגע ווייזונג רעפלעקטירט דעם טעקסט און דער אויבערשטע טעקסט ענדערונג אָפטיילונג וויאזוי דאס וועט אויסזען אויב וועט איר דאס אָפהיטן.',
 'session_fail_preview' => "'''אנטשולדיגט! מען האט נישט געקענט פראצעסירן אייער ענדערונג צוליב א פארלוסט פון סעסיע דאטע. ביטע פרובירט נאכאמאל. אויב ס'ארבעט נאך אלס ניט, פרובירט [[Special:UserLogout|ארויסלאגירן]] און זיך צוריק אריינלאגירן.",
 'session_fail_preview_html' => "''''''אַנטשולדיקט! מיר קענען נישט פּראָצעסירן אײַער ענדערונג צוליב א פֿאַרלוסט פֿון סעסיע דאַטע.''''''
@@ -876,6 +878,7 @@ $2
 די ענדערונג איז געווארן אפגעווארפן כדי נישט צו אנמאכן א חורבן אין די טעקסט פונעם בלאט.
 דאס געשענט מייסטענס ווען איר נוצט אן אנאניאמער פראקסי סערווער.",
 'editing' => 'ענדערן $1',
+'creating' => 'שאפֿן $1',
 'editingsection' => 'ענדערט $1 (אפטיילונג)',
 'editingcomment' => 'רעדאַקטירן $1 (נײַע אפטיילונג)',
 'editconflict' => 'ענדערן קאנפליקט: $1',
@@ -941,6 +944,7 @@ $2
 'edit-no-change' => "מ'האט איגנארירט אײַער רעדאַקטירונג, ווײַל קיין שום ענדערונג איז נישט געמאַכט צום טעקסט.",
 'edit-already-exists' => 'נישט מעגליך צו שאַפֿן נייע בלאט.
 ער עקזיסטירט שוין.',
+'defaultmessagetext' => 'גרונטלעכער מעלדונג טעקסט',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''אזהרה:''' דער בלאט אנטהאלט צופיל טייערע פארזירער רופן.
@@ -1652,6 +1656,7 @@ $1",
 
 # HTTP errors
 'http-invalid-url' => 'אומגילטיג URL: $1',
+'http-request-error' => 'HTTP בקשה דורכגעפאלן צוליב אומבאוואוסטער פעלער.',
 'http-read-error' => 'HTTP לייענען גרײַז.',
 'http-timed-out' => 'HTTP בקשה אויסגעגאַנגען.',
 'http-curl-error' => 'גרײַז בײַם ברענגען URL: $1',
@@ -2624,6 +2629,11 @@ $1',
 'import-logentry-interwiki' => 'אריבערגעוויקיט $1',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}} פֿון $2',
 
+# JavaScriptTest
+'javascripttest-disabled' => 'די  פֿונקציע איז אומאַקטיווירט.',
+'javascripttest-title' => 'דורכפירנדיק $1 בדיקות',
+'javascripttest-pagetext-skins' => 'קלויבט א באניצער־אייבערפלאך מיט וואס דורכצופירן די בדיקות:',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'אייער באניצער בלאט',
 'tooltip-pt-anonuserpage' => 'באַניצער בלאַט פון דעם IP אַדרעס',
@@ -2684,6 +2694,8 @@ $1',
 'tooltip-diff' => 'ווײַזן אייערע ענדערונגען צום טעקסט',
 'tooltip-compareselectedversions' => 'פארגלײַכם די צוויי ווערסיעס פון דעם בלאט',
 'tooltip-watch' => 'לייגט צו דעם בלאט צו אייער אויפֿפאסונג ליסטע',
+'tooltip-watchlistedit-normal-submit' => 'אַראָפנעמען בלעטער',
+'tooltip-watchlistedit-raw-submit' => 'דערהיינטיגן אויפפאסונג ליסטע',
 'tooltip-recreate' => 'ווידערשאַפֿן דעם בלאַט כאטש ער איז אַמאל אויסגעמעקט',
 'tooltip-upload' => 'הייב אן אויפלאדן',
 'tooltip-rollback' => '"צוריקדרייען" דרײט צוריק רעדאַקטירונג(ען) צו דעם בלאַט פֿונעם לעצטן בײַשטײַערער מיט אײן קװעטש',
@@ -3164,6 +3176,12 @@ $5
 'confirm_purge_button' => 'אויספֿירן',
 'confirm-purge-top' => 'אויסקלארן די קאשעי פון דעם בלאט?',
 
+# action=watch/unwatch
+'confirm-watch-button' => 'יאָ',
+'confirm-watch-top' => 'צולייגן דעם בלאט צו אייער אויפֿפאסונג ליסטע?',
+'confirm-unwatch-button' => 'יאָ',
+'confirm-unwatch-top' => 'אראפנעמען דעם בלאט פון אייער אויפפאסונג ליסטע?',
+
 # Multipage image navigation
 'imgmultipageprev' => '→ פֿריערדיגער בלאַט',
 'imgmultipagenext' => 'צום קומענדיגן בלאט ←',
index 643fc5f..ed2dae7 100644 (file)
@@ -36,14 +36,15 @@ require_once( 'writeMessagesArray.inc' );
  * @param bool $removeUnknown Remove the unknown messages?
  * @param bool $removeDupes Remove the duplicated messages?
  * @param $dupeMsgSource string The source file intended to remove from the array.
+ * @param $messagesFolder String: path to a folder to store the MediaWiki messages.
  */
-function rebuildLanguage( $languages, $code, $write, $listUnknown, $removeUnknown, $removeDupes, $dupeMsgSource ) {
+function rebuildLanguage( $languages, $code, $write, $listUnknown, $removeUnknown, $removeDupes, $dupeMsgSource, $messagesFolder ) {
        $messages = $languages->getMessages( $code );
        $messages = $messages['all'];
        if ( $removeDupes ) {
                $messages = removeDupes( $messages, $dupeMsgSource );
        }
-       MessageWriter::writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown );
+       MessageWriter::writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown, $messagesFolder );
 }
 
 /**
@@ -85,6 +86,7 @@ Options:
        * no-unknown: Do not list the unknown messages.
        * remove-unknown: Remove unknown messages.
        * remove-duplicates: Remove duplicated messages based on a PHP source file.
+       * messages-folder: An alternative folder with MediaWiki messages.
 
 TEXT;
        exit( 1 );
@@ -109,6 +111,7 @@ $wgWriteToFile = !isset( $options['dry-run'] );
 $wgListUnknownMessages = !isset( $options['no-unknown'] );
 $wgRemoveUnknownMessages = isset( $options['remove-unknown'] );
 $wgRemoveDuplicateMessages = isset( $options['remove-duplicates'] );
+$messagesFolder = isset( $options['messages-folder'] ) ? $options['messages-folder'] : false;
 
 # Get language objects
 $languages = new languages();
@@ -116,8 +119,8 @@ $languages = new languages();
 # Write all the language
 if ( $wgCode == 'all' ) {
        foreach ( $languages->getLanguages() as $languageCode ) {
-               rebuildLanguage( $languages, $languageCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource );
+               rebuildLanguage( $languages, $languageCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource, $messagesFolder );
        }
 } else {
-       rebuildLanguage( $languages, $wgCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource );
+       rebuildLanguage( $languages, $wgCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource, $messagesFolder );
 }
index c5d13c9..cd36847 100644 (file)
@@ -41,16 +41,28 @@ class MessageWriter {
         * @param $write Boolean: write to the messages file?
         * @param $listUnknown Boolean: list the unknown messages?
         * @param $removeUnknown Boolean: whether to remove unkown messages
+        * @param $messagesFolder String: path to a folder to store the MediaWiki messages. Defaults to the current install.
         */
-       public static function writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown ) {
+       public static function writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown, $messagesFolder = false ) {
                # Rewrite the messages array
                $messages = self::writeMessagesArray( $messages, $code == 'en', false, $removeUnknown );
                $messagesText = $messages[0];
                $sortedMessages = $messages[1];
 
                # Write to the file
-               $filename = Language::getMessagesFileName( $code );
-               $contents = file_get_contents( $filename );
+               if ( $messagesFolder )
+                       $filename = Language::getFileName( "$messagesFolder/Messages", $code );
+               else
+                       $filename = Language::getMessagesFileName( $code );
+
+               if ( file_exists( $filename ) )
+                       $contents = file_get_contents( $filename );
+               else
+                       $contents = '<?php
+$messages = array(
+);
+';
+
                if( strpos( $contents, '$messages' ) !== false ) {
                        $contents = explode( '$messages', $contents );
                        if( $messagesText == '$messages' . $contents[1] ) {
index eebbab2..e477705 100644 (file)
@@ -431,7 +431,8 @@ var mw = ( function ( $, undefined ) {
                        function addInlineCSS( css ) {
                                var $style, style, $newStyle;
                                $style = getMarker().prev();
-                               if ( $style.is( 'style' ) && $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
+                               // Disable <style> tag recycling/concatenation because of bug 34669
+                               if ( false && $style.is( 'style' ) && $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
                                        // There's already a dynamic <style> tag present, append to it. This recycling of
                                        // <style> tags is for bug 31676 (can't have more than 32 <style> tags in IE)
                                        style = $style.get( 0 );
index 1f0cf87..fdb53c2 100644 (file)
@@ -9290,6 +9290,63 @@ Ignore pipe between table row attributes
 
 !! end
 
+!!test
+Gallery override link with WikiLink (bug 34852)
+!! input
+<gallery>
+File:foobar.jpg|caption|alt=galleryalt|link=InterWikiLink
+</gallery>
+!! result
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/InterWikiLink"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+<p>caption
+</p>
+                       </div>
+               </div></li>
+</ul>
+
+!! end
+
+!!test
+Gallery override link with absolute external link (bug 34852)
+!! input
+<gallery>
+File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
+</gallery>
+!! result
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+<p>caption
+</p>
+                       </div>
+               </div></li>
+</ul>
+
+!! end
+
+!!test
+Gallery override link with malicious javascript (bug 34852)
+!! input
+<gallery>
+File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascript code!');
+</gallery>
+!! result
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+<p>caption
+</p>
+                       </div>
+               </div></li>
+</ul>
+
+!! end
+
 TODO:
 more images
 more tables
index da44797..2e95f55 100644 (file)
@@ -23,10 +23,11 @@ class FileBackendTest extends MediaWikiTestCase {
                                foreach ( $wgFileBackends as $conf ) {
                                        if ( $conf['name'] == $name ) {
                                                $useConfig = $conf;
+                                               break;
                                        }
                                }
                                $useConfig['name'] = 'localtesting'; // swap name
-                               $class = $conf['class'];
+                               $class = $useConfig['class'];
                                self::$backendToUse = new $class( $useConfig );
                                $this->singleBackend = self::$backendToUse;
                        }
@@ -823,7 +824,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        $size = $this->backend->getFileSize( array( 'src' => $path ) );
                        $time = $this->backend->getFileTimestamp( array( 'src' => $path ) );
                        $stat = $this->backend->getFileStat( array( 'src' => $path ) );
-                       
+
                        $this->assertFalse( $size, "Correct file size of '$path'" );
                        $this->assertFalse( $time, "Correct file timestamp of '$path'" );
                        $this->assertFalse( $stat, "Correct file stat of '$path'" );