Merge "Save pages content in the default format of their content type"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 16 Sep 2014 17:43:45 +0000 (17:43 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 16 Sep 2014 17:43:45 +0000 (17:43 +0000)
125 files changed:
docs/hooks.txt
includes/AutoLoader.php
includes/EditPage.php
includes/Linker.php
includes/content/TextContent.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/media/Bitmap.php
includes/media/ExifBitmap.php
includes/media/MediaHandler.php
includes/media/TransformationalImageHandler.php [new file with mode: 0644]
includes/media/XCF.php
includes/resourceloader/ResourceLoaderEditToolbarModule.php [new file with mode: 0644]
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/specialpage/WantedQueryPage.php
includes/specials/SpecialPageLanguage.php
includes/specials/SpecialUpload.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWantedfiles.php
languages/Language.php
languages/i18n/ar.json
languages/i18n/ckb.json
languages/i18n/egl.json
languages/i18n/en.json
languages/i18n/fa.json
languages/i18n/hak.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/id.json
languages/i18n/it.json
languages/i18n/ka.json
languages/i18n/kk-cyrl.json
languages/i18n/lrc.json
languages/i18n/lzh.json
languages/i18n/mk.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/sc.json
languages/i18n/scn.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/yi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesEn.php
languages/messages/MessagesKsh.php
languages/messages/MessagesRu.php
maintenance/dictionary/mediawiki.dic
resources/Resources.php
resources/lib/oojs-ui/oojs-ui-apex.css
resources/lib/oojs-ui/oojs-ui-minerva.css
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/oojs-ui.svg.css
resources/src/mediawiki.action/mediawiki.action.edit.css [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.js
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_bold.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_headline.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_italic.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_link.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_nowiki.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/be-tarask/button_bold.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/be-tarask/button_italic.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/be-tarask/button_link.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/de/button_bold.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/de/button_italic.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_bold.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_extlink.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_headline.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_hr.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_image.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_italic.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_link.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_media.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_nowiki.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_sig.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_bold.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_headline.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_italic.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_link.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_nowiki.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ksh/LICENSE [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ksh/button_italic.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ru/LICENSE [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ru/button_bold.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ru/button_italic.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ru/button_link.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.toolbar/mediawiki.action.edit.toolbar.less [new file with mode: 0644]
resources/src/mediawiki.legacy/shared.css
skins/common/images/ar/button_bold.png [deleted file]
skins/common/images/ar/button_headline.png [deleted file]
skins/common/images/ar/button_italic.png [deleted file]
skins/common/images/ar/button_link.png [deleted file]
skins/common/images/ar/button_nowiki.png [deleted file]
skins/common/images/be-tarask/button_bold.png [deleted file]
skins/common/images/be-tarask/button_italic.png [deleted file]
skins/common/images/be-tarask/button_link.png [deleted file]
skins/common/images/button_bold.png [deleted file]
skins/common/images/button_extlink.png [deleted file]
skins/common/images/button_headline.png [deleted file]
skins/common/images/button_hr.png [deleted file]
skins/common/images/button_image.png [deleted file]
skins/common/images/button_italic.png [deleted file]
skins/common/images/button_link.png [deleted file]
skins/common/images/button_media.png [deleted file]
skins/common/images/button_nowiki.png [deleted file]
skins/common/images/button_sig.png [deleted file]
skins/common/images/cyrl/LICENSE [deleted file]
skins/common/images/cyrl/button_bold.png [deleted file]
skins/common/images/cyrl/button_italic.png [deleted file]
skins/common/images/cyrl/button_link.png [deleted file]
skins/common/images/de/button_bold.png [deleted file]
skins/common/images/de/button_italic.png [deleted file]
skins/common/images/fa/button_bold.png [deleted file]
skins/common/images/fa/button_headline.png [deleted file]
skins/common/images/fa/button_italic.png [deleted file]
skins/common/images/fa/button_link.png [deleted file]
skins/common/images/fa/button_nowiki.png [deleted file]
skins/common/images/ksh/LICENSE [deleted file]
skins/common/images/ksh/button_S_italic.png [deleted file]
tests/phpunit/LessFileCompilationTest.php
tests/phpunit/includes/media/ExifRotationTest.php

index 9ac2271..d5fb2af 100644 (file)
@@ -1550,6 +1550,10 @@ $title: The page's Title.
   Currently unused, but planned to provide support for marking individual
   language links in the UI, e.g. for featured articles.
 
+'LanguageSelector': Hook to change the language selector available on a page.
+$out: The output page.
+$cssClassName: CSS class name of the language selector.
+
 'LinkBegin': Used when generating internal and interwiki links in
 Linker::link(), before processing starts.  Return false to skip default
 processing and return $ret. See documentation for Linker::link() for details on
index 7c5de2a..d79b2b1 100644 (file)
@@ -754,6 +754,7 @@ $wgAutoloadLocalClasses = array(
        'SVGReader' => 'includes/media/SVGMetadataExtractor.php',
        'ThumbnailImage' => 'includes/media/MediaTransformOutput.php',
        'TiffHandler' => 'includes/media/Tiff.php',
+       'TransformationalImageHandler' => 'includes/media/TransformationalImageHandler.php',
        'TransformParameterError' => 'includes/media/MediaTransformOutput.php',
        'XCFHandler' => 'includes/media/XCF.php',
        'XMPInfo' => 'includes/media/XMPInfo.php',
@@ -878,6 +879,7 @@ $wgAutoloadLocalClasses = array(
                'includes/resourceloader/DerivativeResourceLoaderContext.php',
        'ResourceLoader' => 'includes/resourceloader/ResourceLoader.php',
        'ResourceLoaderContext' => 'includes/resourceloader/ResourceLoaderContext.php',
+       'ResourceLoaderEditToolbarModule' => 'includes/resourceloader/ResourceLoaderEditToolbarModule.php',
        'ResourceLoaderFileModule' => 'includes/resourceloader/ResourceLoaderFileModule.php',
        'ResourceLoaderFilePageModule' => 'includes/resourceloader/ResourceLoaderFilePageModule.php',
        'ResourceLoaderFilePath' => 'includes/resourceloader/ResourceLoaderFilePath.php',
index f6342c5..3370622 100644 (file)
@@ -3232,6 +3232,7 @@ HTML
                        $attrs['class'] = 'mw-ui-button mw-ui-quiet';
                }
                $edithelp = Html::element( 'a', $attrs, wfMessage( 'edithelp' )->text() ) .
+                       wfMessage( 'word-separator' )->escaped() .
                        wfMessage( 'newwindow' )->parse();
 
                $wgOut->addHTML( "      <span class='cancelLink'>{$cancel}</span>\n" );
@@ -3554,22 +3555,22 @@ HTML
         * @return string
         */
        static function getEditToolbar() {
-               global $wgStylePath, $wgContLang, $wgLang, $wgOut;
+               global $wgContLang, $wgOut;
                global $wgEnableUploads, $wgForeignFileRepos;
 
                $imagesAvailable = $wgEnableUploads || count( $wgForeignFileRepos );
 
                /**
                 * $toolarray is an array of arrays each of which includes the
-                * filename of the button image (without path), the opening
-                * tag, the closing tag, optionally a sample text that is
+                * opening tag, the closing tag, optionally a sample text that is
                 * inserted between the two when no selection is highlighted
                 * and.  The tip text is shown when the user moves the mouse
                 * over the button.
+                *
+                * Images are defined in ResourceLoaderEditToolbarModule.
                 */
                $toolarray = array(
                        array(
-                               'image'  => $wgLang->getImageFile( 'button-bold' ),
                                'id'     => 'mw-editbutton-bold',
                                'open'   => '\'\'\'',
                                'close'  => '\'\'\'',
@@ -3577,7 +3578,6 @@ HTML
                                'tip'    => wfMessage( 'bold_tip' )->text(),
                        ),
                        array(
-                               'image'  => $wgLang->getImageFile( 'button-italic' ),
                                'id'     => 'mw-editbutton-italic',
                                'open'   => '\'\'',
                                'close'  => '\'\'',
@@ -3585,7 +3585,6 @@ HTML
                                'tip'    => wfMessage( 'italic_tip' )->text(),
                        ),
                        array(
-                               'image'  => $wgLang->getImageFile( 'button-link' ),
                                'id'     => 'mw-editbutton-link',
                                'open'   => '[[',
                                'close'  => ']]',
@@ -3593,7 +3592,6 @@ HTML
                                'tip'    => wfMessage( 'link_tip' )->text(),
                        ),
                        array(
-                               'image'  => $wgLang->getImageFile( 'button-extlink' ),
                                'id'     => 'mw-editbutton-extlink',
                                'open'   => '[',
                                'close'  => ']',
@@ -3601,7 +3599,6 @@ HTML
                                'tip'    => wfMessage( 'extlink_tip' )->text(),
                        ),
                        array(
-                               'image'  => $wgLang->getImageFile( 'button-headline' ),
                                'id'     => 'mw-editbutton-headline',
                                'open'   => "\n== ",
                                'close'  => " ==\n",
@@ -3609,7 +3606,6 @@ HTML
                                'tip'    => wfMessage( 'headline_tip' )->text(),
                        ),
                        $imagesAvailable ? array(
-                               'image'  => $wgLang->getImageFile( 'button-image' ),
                                'id'     => 'mw-editbutton-image',
                                'open'   => '[[' . $wgContLang->getNsText( NS_FILE ) . ':',
                                'close'  => ']]',
@@ -3617,7 +3613,6 @@ HTML
                                'tip'    => wfMessage( 'image_tip' )->text(),
                        ) : false,
                        $imagesAvailable ? array(
-                               'image'  => $wgLang->getImageFile( 'button-media' ),
                                'id'     => 'mw-editbutton-media',
                                'open'   => '[[' . $wgContLang->getNsText( NS_MEDIA ) . ':',
                                'close'  => ']]',
@@ -3625,7 +3620,6 @@ HTML
                                'tip'    => wfMessage( 'media_tip' )->text(),
                        ) : false,
                        array(
-                               'image'  => $wgLang->getImageFile( 'button-nowiki' ),
                                'id'     => 'mw-editbutton-nowiki',
                                'open'   => "<nowiki>",
                                'close'  => "</nowiki>",
@@ -3633,7 +3627,6 @@ HTML
                                'tip'    => wfMessage( 'nowiki_tip' )->text(),
                        ),
                        array(
-                               'image'  => $wgLang->getImageFile( 'button-sig' ),
                                'id'     => 'mw-editbutton-signature',
                                'open'   => '--~~~~',
                                'close'  => '',
@@ -3641,7 +3634,6 @@ HTML
                                'tip'    => wfMessage( 'sig_tip' )->text(),
                        ),
                        array(
-                               'image'  => $wgLang->getImageFile( 'button-hr' ),
                                'id'     => 'mw-editbutton-hr',
                                'open'   => "\n----\n",
                                'close'  => '',
@@ -3657,7 +3649,8 @@ HTML
                        }
 
                        $params = array(
-                               $wgStylePath . '/common/images/' . $tool['image'],
+                               // Images are defined in ResourceLoaderEditToolbarModule
+                               false,
                                // Note that we use the tip both for the ALT tag and the TITLE tag of the image.
                                // Older browsers show a "speedtip" type message only for ALT.
                                // Ideally these should be different, realistically they
index d9f4255..012bc1b 100644 (file)
@@ -897,7 +897,7 @@ class Linker {
         */
        public static function processResponsiveImages( $file, $thumb, $hp ) {
                global $wgResponsiveImages;
-               if ( $wgResponsiveImages ) {
+               if ( $wgResponsiveImages && $thumb && !$thumb->isError() ) {
                        $hp15 = $hp;
                        $hp15['width'] = round( $hp['width'] * 1.5 );
                        $hp20 = $hp;
index d292880..c479f20 100644 (file)
@@ -160,7 +160,7 @@ class TextContent extends AbstractContent {
                $text = $this->getNativeData();
                $pst = rtrim( $text );
 
-               return ( $text === $pst ) ? $this : new static( $pst );
+               return ( $text === $pst ) ? $this : new static( $pst, $this->getModel() );
        }
 
        /**
index c810f68..5fda7bd 100644 (file)
@@ -473,6 +473,9 @@ class HTMLForm extends ContextSource {
                        if ( !empty( $field->mParams['nodata'] ) ) {
                                continue;
                        }
+                       if ( $field->isHidden( $this->mFieldData ) ) {
+                               continue;
+                       }
                        if ( $field->validate(
                                        $this->mFieldData[$fieldname],
                                        $this->mFieldData )
index 70b1535..4cf2394 100644 (file)
@@ -113,7 +113,7 @@ abstract class HTMLFormField {
                                }
                                $data = $data[$key];
                        }
-                       $testValue = $data;
+                       $testValue = (string)$data;
                        break;
                }
 
index b2802dd..e81b37d 100644 (file)
  *
  * @ingroup Media
  */
-class BitmapHandler extends ImageHandler {
-       /**
-        * @param File $image
-        * @param array $params Transform parameters. Entries with the keys 'width'
-        * and 'height' are the respective screen width and height, while the keys
-        * 'physicalWidth' and 'physicalHeight' indicate the thumbnail dimensions.
-        * @return bool
-        */
-       function normaliseParams( $image, &$params ) {
-               if ( !parent::normaliseParams( $image, $params ) ) {
-                       return false;
-               }
-
-               # Obtain the source, pre-rotation dimensions
-               $srcWidth = $image->getWidth( $params['page'] );
-               $srcHeight = $image->getHeight( $params['page'] );
-
-               # Don't make an image bigger than the source
-               if ( $params['physicalWidth'] >= $srcWidth ) {
-                       $params['physicalWidth'] = $srcWidth;
-                       $params['physicalHeight'] = $srcHeight;
-
-                       # Skip scaling limit checks if no scaling is required
-                       # due to requested size being bigger than source.
-                       if ( !$image->mustRender() ) {
-                               return true;
-                       }
-               }
-
-               # Check if the file is smaller than the maximum image area for thumbnailing
-               $checkImageAreaHookResult = null;
-               wfRunHooks(
-                       'BitmapHandlerCheckImageArea',
-                       array( $image, &$params, &$checkImageAreaHookResult )
-               );
-
-               if ( is_null( $checkImageAreaHookResult ) ) {
-                       global $wgMaxImageArea;
-
-                       if ( $srcWidth * $srcHeight > $wgMaxImageArea
-                               && !( $image->getMimeType() == 'image/jpeg'
-                                       && self::getScalerType( false, false ) == 'im' )
-                       ) {
-                               # Only ImageMagick can efficiently downsize jpg images without loading
-                               # the entire file in memory
-                               return false;
-                       }
-               } else {
-                       return $checkImageAreaHookResult;
-               }
-
-               return true;
-       }
-
-       /**
-        * Extracts the width/height if the image will be scaled before rotating
-        *
-        * This will match the physical size/aspect ratio of the original image
-        * prior to application of the rotation -- so for a portrait image that's
-        * stored as raw landscape with 90-degress rotation, the resulting size
-        * will be wider than it is tall.
-        *
-        * @param array $params Parameters as returned by normaliseParams
-        * @param int $rotation The rotation angle that will be applied
-        * @return array ($width, $height) array
-        */
-       public function extractPreRotationDimensions( $params, $rotation ) {
-               if ( $rotation == 90 || $rotation == 270 ) {
-                       # We'll resize before rotation, so swap the dimensions again
-                       $width = $params['physicalHeight'];
-                       $height = $params['physicalWidth'];
-               } else {
-                       $width = $params['physicalWidth'];
-                       $height = $params['physicalHeight'];
-               }
-
-               return array( $width, $height );
-       }
-
-       /**
-        * @param File $image
-        * @param string $dstPath
-        * @param string $dstUrl
-        * @param array $params
-        * @param int $flags
-        * @return MediaTransformError|ThumbnailImage|TransformParameterError
-        */
-       function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
-               if ( !$this->normaliseParams( $image, $params ) ) {
-                       return new TransformParameterError( $params );
-               }
-
-               # Create a parameter array to pass to the scaler
-               $scalerParams = array(
-                       # The size to which the image will be resized
-                       'physicalWidth' => $params['physicalWidth'],
-                       'physicalHeight' => $params['physicalHeight'],
-                       'physicalDimensions' => "{$params['physicalWidth']}x{$params['physicalHeight']}",
-                       # The size of the image on the page
-                       'clientWidth' => $params['width'],
-                       'clientHeight' => $params['height'],
-                       # Comment as will be added to the Exif of the thumbnail
-                       'comment' => isset( $params['descriptionUrl'] )
-                               ? "File source: {$params['descriptionUrl']}"
-                               : '',
-                       # Properties of the original image
-                       'srcWidth' => $image->getWidth(),
-                       'srcHeight' => $image->getHeight(),
-                       'mimeType' => $image->getMimeType(),
-                       'dstPath' => $dstPath,
-                       'dstUrl' => $dstUrl,
-               );
-
-               if ( isset( $params['quality'] ) && $params['quality'] === 'low' ) {
-                       $scalerParams['quality'] = 30;
-               }
-
-               # Determine scaler type
-               $scaler = self::getScalerType( $dstPath );
-
-               wfDebug( __METHOD__ . ": creating {$scalerParams['physicalDimensions']} " .
-                       "thumbnail at $dstPath using scaler $scaler\n" );
-
-               if ( !$image->mustRender() &&
-                       $scalerParams['physicalWidth'] == $scalerParams['srcWidth']
-                       && $scalerParams['physicalHeight'] == $scalerParams['srcHeight']
-                       && !isset( $scalerParams['quality'] )
-               ) {
-
-                       # normaliseParams (or the user) wants us to return the unscaled image
-                       wfDebug( __METHOD__ . ": returning unscaled image\n" );
-
-                       return $this->getClientScalingThumbnailImage( $image, $scalerParams );
-               }
-
-               if ( $scaler == 'client' ) {
-                       # Client-side image scaling, use the source URL
-                       # Using the destination URL in a TRANSFORM_LATER request would be incorrect
-                       return $this->getClientScalingThumbnailImage( $image, $scalerParams );
-               }
-
-               if ( $flags & self::TRANSFORM_LATER ) {
-                       wfDebug( __METHOD__ . ": Transforming later per flags.\n" );
-                       $newParams = array(
-                               'width' => $scalerParams['clientWidth'],
-                               'height' => $scalerParams['clientHeight']
-                       );
-                       if ( isset( $params['quality'] ) ) {
-                               $newParams['quality'] = $params['quality'];
-                       }
-                       return new ThumbnailImage( $image, $dstUrl, false, $newParams );
-               }
-
-               # Try to make a target path for the thumbnail
-               if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
-                       wfDebug( __METHOD__ . ": Unable to create thumbnail destination " .
-                               "directory, falling back to client scaling\n" );
-
-                       return $this->getClientScalingThumbnailImage( $image, $scalerParams );
-               }
-
-               # Transform functions and binaries need a FS source file
-               $thumbnailSource = $image->getThumbnailSource( $params );
-
-               $scalerParams['srcPath'] = $thumbnailSource['path'];
-               $scalerParams['srcWidth'] = $thumbnailSource['width'];
-               $scalerParams['srcHeight'] = $thumbnailSource['height'];
-
-               if ( $scalerParams['srcPath'] === false ) { // Failed to get local copy
-                       wfDebugLog( 'thumbnail',
-                               sprintf( 'Thumbnail failed on %s: could not get local copy of "%s"',
-                                       wfHostname(), $image->getName() ) );
-
-                       return new MediaTransformError( 'thumbnail_error',
-                               $scalerParams['clientWidth'], $scalerParams['clientHeight'],
-                               wfMessage( 'filemissing' )->text()
-                       );
-               }
-
-               # Try a hook
-               $mto = null;
-               wfRunHooks( 'BitmapHandlerTransform', array( $this, $image, &$scalerParams, &$mto ) );
-               if ( !is_null( $mto ) ) {
-                       wfDebug( __METHOD__ . ": Hook to BitmapHandlerTransform created an mto\n" );
-                       $scaler = 'hookaborted';
-               }
-
-               switch ( $scaler ) {
-                       case 'hookaborted':
-                               # Handled by the hook above
-                               /** @var MediaTransformOutput $mto */
-                               $err = $mto->isError() ? $mto : false;
-                               break;
-                       case 'im':
-                               $err = $this->transformImageMagick( $image, $scalerParams );
-                               break;
-                       case 'custom':
-                               $err = $this->transformCustom( $image, $scalerParams );
-                               break;
-                       case 'imext':
-                               $err = $this->transformImageMagickExt( $image, $scalerParams );
-                               break;
-                       case 'gd':
-                       default:
-                               $err = $this->transformGd( $image, $scalerParams );
-                               break;
-               }
-
-               # Remove the file if a zero-byte thumbnail was created, or if there was an error
-               $removed = $this->removeBadFile( $dstPath, (bool)$err );
-               if ( $err ) {
-                       # transform returned MediaTransforError
-                       return $err;
-               } elseif ( $removed ) {
-                       # Thumbnail was zero-byte and had to be removed
-                       return new MediaTransformError( 'thumbnail_error',
-                               $scalerParams['clientWidth'], $scalerParams['clientHeight'],
-                               wfMessage( 'unknown-error' )->text()
-                       );
-               } elseif ( $mto ) {
-                       return $mto;
-               } else {
-                       $newParams = array(
-                               'width' => $scalerParams['clientWidth'],
-                               'height' => $scalerParams['clientHeight']
-                       );
-                       if ( isset( $params['quality'] ) ) {
-                               $newParams['quality'] = $params['quality'];
-                       }
-                       return new ThumbnailImage( $image, $dstUrl, $dstPath, $newParams );
-               }
-       }
+class BitmapHandler extends TransformationalImageHandler {
 
        /**
         * Returns which scaler type should be used. Creates parent directories
@@ -265,9 +34,9 @@ class BitmapHandler extends ImageHandler {
         *
         * @param string $dstPath
         * @param bool $checkDstPath
-        * @return string One of client, im, custom, gd, imext
+        * @return string|Callable One of client, im, custom, gd, imext or an array( object, method )
         */
-       protected static function getScalerType( $dstPath, $checkDstPath = true ) {
+       protected function getScalerType( $dstPath, $checkDstPath = true ) {
                global $wgUseImageResize, $wgUseImageMagick, $wgCustomConvertCommand;
 
                if ( !$dstPath && $checkDstPath ) {
@@ -290,25 +59,6 @@ class BitmapHandler extends ImageHandler {
                return $scaler;
        }
 
-       /**
-        * Get a ThumbnailImage that respresents an image that will be scaled
-        * client side
-        *
-        * @param File $image File associated with this thumbnail
-        * @param array $scalerParams Array with scaler params
-        * @return ThumbnailImage
-        *
-        * @todo FIXME: No rotation support
-        */
-       protected function getClientScalingThumbnailImage( $image, $scalerParams ) {
-               $params = array(
-                       'width' => $scalerParams['clientWidth'],
-                       'height' => $scalerParams['clientHeight']
-               );
-
-               return new ThumbnailImage( $image, $image->getURL(), null, $params );
-       }
-
        /**
         * Transform an image using ImageMagick
         *
@@ -544,18 +294,6 @@ class BitmapHandler extends ImageHandler {
                return false; # No error
        }
 
-       /**
-        * Get a MediaTransformError with error 'thumbnail_error'
-        *
-        * @param array $params Parameter array as passed to the transform* functions
-        * @param string $errMsg Error message
-        * @return MediaTransformError
-        */
-       public function getMediaTransformError( $params, $errMsg ) {
-               return new MediaTransformError( 'thumbnail_error', $params['clientWidth'],
-                       $params['clientHeight'], $errMsg );
-       }
-
        /**
         * Transform an image using the built in GD library
         *
@@ -651,131 +389,8 @@ class BitmapHandler extends ImageHandler {
        }
 
        /**
-        * Escape a string for ImageMagick's property input (e.g. -set -comment)
-        * See InterpretImageProperties() in magick/property.c
-        * @param string $s
-        * @return string
-        */
-       function escapeMagickProperty( $s ) {
-               // Double the backslashes
-               $s = str_replace( '\\', '\\\\', $s );
-               // Double the percents
-               $s = str_replace( '%', '%%', $s );
-               // Escape initial - or @
-               if ( strlen( $s ) > 0 && ( $s[0] === '-' || $s[0] === '@' ) ) {
-                       $s = '\\' . $s;
-               }
-
-               return $s;
-       }
-
-       /**
-        * Escape a string for ImageMagick's input filenames. See ExpandFilenames()
-        * and GetPathComponent() in magick/utility.c.
-        *
-        * This won't work with an initial ~ or @, so input files should be prefixed
-        * with the directory name.
-        *
-        * Glob character unescaping is broken in ImageMagick before 6.6.1-5, but
-        * it's broken in a way that doesn't involve trying to convert every file
-        * in a directory, so we're better off escaping and waiting for the bugfix
-        * to filter down to users.
-        *
-        * @param string $path The file path
-        * @param bool|string $scene The scene specification, or false if there is none
-        * @throws MWException
-        * @return string
-        */
-       function escapeMagickInput( $path, $scene = false ) {
-               # Die on initial metacharacters (caller should prepend path)
-               $firstChar = substr( $path, 0, 1 );
-               if ( $firstChar === '~' || $firstChar === '@' ) {
-                       throw new MWException( __METHOD__ . ': cannot escape this path name' );
-               }
-
-               # Escape glob chars
-               $path = preg_replace( '/[*?\[\]{}]/', '\\\\\0', $path );
-
-               return $this->escapeMagickPath( $path, $scene );
-       }
-
-       /**
-        * Escape a string for ImageMagick's output filename. See
-        * InterpretImageFilename() in magick/image.c.
-        * @param string $path The file path
-        * @param bool|string $scene The scene specification, or false if there is none
-        * @return string
-        */
-       function escapeMagickOutput( $path, $scene = false ) {
-               $path = str_replace( '%', '%%', $path );
-
-               return $this->escapeMagickPath( $path, $scene );
-       }
-
-       /**
-        * Armour a string against ImageMagick's GetPathComponent(). This is a
-        * helper function for escapeMagickInput() and escapeMagickOutput().
-        *
-        * @param string $path The file path
-        * @param bool|string $scene The scene specification, or false if there is none
-        * @throws MWException
-        * @return string
-        */
-       protected function escapeMagickPath( $path, $scene = false ) {
-               # Die on format specifiers (other than drive letters). The regex is
-               # meant to match all the formats you get from "convert -list format"
-               if ( preg_match( '/^([a-zA-Z0-9-]+):/', $path, $m ) ) {
-                       if ( wfIsWindows() && is_dir( $m[0] ) ) {
-                               // OK, it's a drive letter
-                               // ImageMagick has a similar exception, see IsMagickConflict()
-                       } else {
-                               throw new MWException( __METHOD__ . ': unexpected colon character in path name' );
-                       }
-               }
-
-               # If there are square brackets, add a do-nothing scene specification
-               # to force a literal interpretation
-               if ( $scene === false ) {
-                       if ( strpos( $path, '[' ) !== false ) {
-                               $path .= '[0--1]';
-                       }
-               } else {
-                       $path .= "[$scene]";
-               }
-
-               return $path;
-       }
-
-       /**
-        * Retrieve the version of the installed ImageMagick
-        * You can use PHPs version_compare() to use this value
-        * Value is cached for one hour.
-        * @return string Representing the IM version.
+        * Callback for transformGd when transforming jpeg images.
         */
-       protected function getMagickVersion() {
-               global $wgMemc;
-
-               $cache = $wgMemc->get( "imagemagick-version" );
-               if ( !$cache ) {
-                       global $wgImageMagickConvertCommand;
-                       $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . ' -version';
-                       wfDebug( __METHOD__ . ": Running convert -version\n" );
-                       $retval = '';
-                       $return = wfShellExec( $cmd, $retval );
-                       $x = preg_match( '/Version: ImageMagick ([0-9]*\.[0-9]*\.[0-9]*)/', $return, $matches );
-                       if ( $x != 1 ) {
-                               wfDebug( __METHOD__ . ": ImageMagick version check failed\n" );
-
-                               return null;
-                       }
-                       $wgMemc->set( "imagemagick-version", $matches[1], 3600 );
-
-                       return $matches[1];
-               }
-
-               return $cache;
-       }
-
        // FIXME: transformImageMagick() & transformImageMagickExt() uses JPEG quality 80, here it's 95?
        static function imageJpegWrapper( $dst_image, $thumbPath, $quality = 95 ) {
                imageinterlace( $dst_image );
@@ -787,8 +402,8 @@ class BitmapHandler extends ImageHandler {
         *
         * @return bool
         */
-       public static function canRotate() {
-               $scaler = self::getScalerType( null, false );
+       public function canRotate() {
+               $scaler = $this->getScalerType( null, false );
                switch ( $scaler ) {
                        case 'im':
                                # ImageMagick supports autorotation
@@ -810,12 +425,12 @@ class BitmapHandler extends ImageHandler {
         * @see $wgEnableAutoRotation
         * @return bool Whether auto rotation is enabled
         */
-       public static function autoRotateEnabled() {
+       public function autoRotateEnabled() {
                global $wgEnableAutoRotation;
 
                if ( $wgEnableAutoRotation === null ) {
-                       // Only enable auto-rotation when the bitmap handler can rotate
-                       $wgEnableAutoRotation = BitmapHandler::canRotate();
+                       // Only enable auto-rotation when we actually can
+                       return $this->canRotate();
                }
 
                return $wgEnableAutoRotation;
@@ -834,7 +449,7 @@ class BitmapHandler extends ImageHandler {
                $rotation = ( $params['rotation'] + $this->getRotation( $file ) ) % 360;
                $scene = false;
 
-               $scaler = self::getScalerType( null, false );
+               $scaler = $this->getScalerType( null, false );
                switch ( $scaler ) {
                        case 'im':
                                $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . " " .
@@ -872,15 +487,4 @@ class BitmapHandler extends ImageHandler {
                                        "$scaler rotation not implemented" );
                }
        }
-
-       /**
-        * Returns whether the file needs to be rendered. Returns true if the
-        * file requires rotation and we are able to rotate it.
-        *
-        * @param File $file
-        * @return bool
-        */
-       public function mustRender( $file ) {
-               return self::canRotate() && $this->getRotation( $file ) != 0;
-       }
 }
index ae1ff9d..b7657cb 100644 (file)
@@ -173,7 +173,7 @@ class ExifBitmapHandler extends BitmapHandler {
 
                // Don't just call $image->getMetadata(); FSFile::getPropsFromPath() calls us with a bogus object.
                // This may mean we read EXIF data twice on initial upload.
-               if ( BitmapHandler::autoRotateEnabled() ) {
+               if ( $this->autoRotateEnabled() ) {
                        $meta = $this->getMetadata( $image, $path );
                        $rotation = $this->getRotationForExif( $meta );
                } else {
@@ -202,7 +202,7 @@ class ExifBitmapHandler extends BitmapHandler {
         * @return int 0, 90, 180 or 270
         */
        public function getRotation( $file ) {
-               if ( !BitmapHandler::autoRotateEnabled() ) {
+               if ( !$this->autoRotateEnabled() ) {
                        return 0;
                }
 
index 13c2a91..64ca011 100644 (file)
@@ -745,10 +745,10 @@ abstract class MediaHandler {
 
        /**
         * True if the handler can rotate the media
-        * @since 1.21
+        * @since 1.24 non-static. From 1.21-1.23 was static
         * @return bool
         */
-       public static function canRotate() {
+       public function canRotate() {
                return false;
        }
 
diff --git a/includes/media/TransformationalImageHandler.php b/includes/media/TransformationalImageHandler.php
new file mode 100644 (file)
index 0000000..13fb52b
--- /dev/null
@@ -0,0 +1,587 @@
+<?php
+/**
+ * Base class for handlers which require transforming images in a
+ * similar way as BitmapHandler does.
+ *
+ * This was split from BitmapHandler on the basis that some extensions
+ * might want to work in a similar way to BitmapHandler, but for
+ * different formats.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
+
+/**
+ * Handler for images that need to be transformed
+ *
+ * @since 1.24
+ * @ingroup Media
+ */
+abstract class TransformationalImageHandler extends ImageHandler {
+       /**
+        * @param File $image
+        * @param array $params Transform parameters. Entries with the keys 'width'
+        * and 'height' are the respective screen width and height, while the keys
+        * 'physicalWidth' and 'physicalHeight' indicate the thumbnail dimensions.
+        * @return bool
+        */
+       function normaliseParams( $image, &$params ) {
+               if ( !parent::normaliseParams( $image, $params ) ) {
+                       return false;
+               }
+
+               # Obtain the source, pre-rotation dimensions
+               $srcWidth = $image->getWidth( $params['page'] );
+               $srcHeight = $image->getHeight( $params['page'] );
+
+               # Don't make an image bigger than the source
+               if ( $params['physicalWidth'] >= $srcWidth ) {
+                       $params['physicalWidth'] = $srcWidth;
+                       $params['physicalHeight'] = $srcHeight;
+
+                       # Skip scaling limit checks if no scaling is required
+                       # due to requested size being bigger than source.
+                       if ( !$image->mustRender() ) {
+                               return true;
+                       }
+               }
+
+               # Check if the file is smaller than the maximum image area for thumbnailing
+               # For historical reasons, hook starts with BitmapHandler
+               $checkImageAreaHookResult = null;
+               wfRunHooks(
+                       'BitmapHandlerCheckImageArea',
+                       array( $image, &$params, &$checkImageAreaHookResult )
+               );
+
+               if ( is_null( $checkImageAreaHookResult ) ) {
+                       global $wgMaxImageArea;
+
+                       if ( $srcWidth * $srcHeight > $wgMaxImageArea
+                               && !( $image->getMimeType() == 'image/jpeg'
+                                       && $this->getScalerType( false, false ) == 'im' )
+                       ) {
+                               # Only ImageMagick can efficiently downsize jpg images without loading
+                               # the entire file in memory
+                               return false;
+                       }
+               } else {
+                       return $checkImageAreaHookResult;
+               }
+
+               return true;
+       }
+
+       /**
+        * Extracts the width/height if the image will be scaled before rotating
+        *
+        * This will match the physical size/aspect ratio of the original image
+        * prior to application of the rotation -- so for a portrait image that's
+        * stored as raw landscape with 90-degress rotation, the resulting size
+        * will be wider than it is tall.
+        *
+        * @param array $params Parameters as returned by normaliseParams
+        * @param int $rotation The rotation angle that will be applied
+        * @return array ($width, $height) array
+        */
+       public function extractPreRotationDimensions( $params, $rotation ) {
+               if ( $rotation == 90 || $rotation == 270 ) {
+                       # We'll resize before rotation, so swap the dimensions again
+                       $width = $params['physicalHeight'];
+                       $height = $params['physicalWidth'];
+               } else {
+                       $width = $params['physicalWidth'];
+                       $height = $params['physicalHeight'];
+               }
+
+               return array( $width, $height );
+       }
+
+       /**
+        * Create a thumbnail.
+        *
+        * This sets up various parameters, and then calls a helper method
+        * based on $this->getScalerType in order to scale the image.
+        *
+        * @param File $image
+        * @param string $dstPath
+        * @param string $dstUrl
+        * @param array $params
+        * @param int $flags
+        * @return MediaTransformError|ThumbnailImage|TransformParameterError
+        */
+       function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
+               if ( !$this->normaliseParams( $image, $params ) ) {
+                       return new TransformParameterError( $params );
+               }
+
+               # Create a parameter array to pass to the scaler
+               $scalerParams = array(
+                       # The size to which the image will be resized
+                       'physicalWidth' => $params['physicalWidth'],
+                       'physicalHeight' => $params['physicalHeight'],
+                       'physicalDimensions' => "{$params['physicalWidth']}x{$params['physicalHeight']}",
+                       # The size of the image on the page
+                       'clientWidth' => $params['width'],
+                       'clientHeight' => $params['height'],
+                       # Comment as will be added to the Exif of the thumbnail
+                       'comment' => isset( $params['descriptionUrl'] )
+                               ? "File source: {$params['descriptionUrl']}"
+                               : '',
+                       # Properties of the original image
+                       'srcWidth' => $image->getWidth(),
+                       'srcHeight' => $image->getHeight(),
+                       'mimeType' => $image->getMimeType(),
+                       'dstPath' => $dstPath,
+                       'dstUrl' => $dstUrl,
+               );
+
+               if ( isset( $params['quality'] ) && $params['quality'] === 'low' ) {
+                       $scalerParams['quality'] = 30;
+               }
+
+               // For subclasses that might be paged.
+               if ( $image->isMultipage() && isset( $params['page'] ) ) {
+                       $scalerParams['page'] = intval( $params['page'] );
+               }
+
+               # Determine scaler type
+               $scaler = $this->getScalerType( $dstPath );
+
+               wfDebug( __METHOD__ . ": creating {$scalerParams['physicalDimensions']} " .
+                       "thumbnail at $dstPath using scaler $scaler\n" );
+
+               if ( !$image->mustRender() &&
+                       $scalerParams['physicalWidth'] == $scalerParams['srcWidth']
+                       && $scalerParams['physicalHeight'] == $scalerParams['srcHeight']
+                       && !isset( $scalerParams['quality'] )
+               ) {
+
+                       # normaliseParams (or the user) wants us to return the unscaled image
+                       wfDebug( __METHOD__ . ": returning unscaled image\n" );
+
+                       return $this->getClientScalingThumbnailImage( $image, $scalerParams );
+               }
+
+               if ( $scaler == 'client' ) {
+                       # Client-side image scaling, use the source URL
+                       # Using the destination URL in a TRANSFORM_LATER request would be incorrect
+                       return $this->getClientScalingThumbnailImage( $image, $scalerParams );
+               }
+
+               if ( $flags & self::TRANSFORM_LATER ) {
+                       wfDebug( __METHOD__ . ": Transforming later per flags.\n" );
+                       $newParams = array(
+                               'width' => $scalerParams['clientWidth'],
+                               'height' => $scalerParams['clientHeight']
+                       );
+                       if ( isset( $params['quality'] ) ) {
+                               $newParams['quality'] = $params['quality'];
+                       }
+                       if ( isset( $params['page'] ) && $params['page'] ) {
+                               $newParams['page'] = $params['page'];
+                       }
+                       return new ThumbnailImage( $image, $dstUrl, false, $newParams );
+               }
+
+               # Try to make a target path for the thumbnail
+               if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
+                       wfDebug( __METHOD__ . ": Unable to create thumbnail destination " .
+                               "directory, falling back to client scaling\n" );
+
+                       return $this->getClientScalingThumbnailImage( $image, $scalerParams );
+               }
+
+               # Transform functions and binaries need a FS source file
+               $thumbnailSource = $this->getThumbnailSource( $image, $params );
+
+               $scalerParams['srcPath'] = $thumbnailSource['path'];
+               $scalerParams['srcWidth'] = $thumbnailSource['width'];
+               $scalerParams['srcHeight'] = $thumbnailSource['height'];
+
+               if ( $scalerParams['srcPath'] === false ) { // Failed to get local copy
+                       wfDebugLog( 'thumbnail',
+                               sprintf( 'Thumbnail failed on %s: could not get local copy of "%s"',
+                                       wfHostname(), $image->getName() ) );
+
+                       return new MediaTransformError( 'thumbnail_error',
+                               $scalerParams['clientWidth'], $scalerParams['clientHeight'],
+                               wfMessage( 'filemissing' )->text()
+                       );
+               }
+
+               # Try a hook. Called "Bitmap" for historical reasons.
+               /** @var $mto MediaTransformOutput */
+               $mto = null;
+               wfRunHooks( 'BitmapHandlerTransform', array( $this, $image, &$scalerParams, &$mto ) );
+               if ( !is_null( $mto ) ) {
+                       wfDebug( __METHOD__ . ": Hook to BitmapHandlerTransform created an mto\n" );
+                       $scaler = 'hookaborted';
+               }
+
+               // $scaler will return a MediaTransformError on failure, or false on success.
+               // If the scaler is succesful, it will have created a thumbnail at the destination
+               // path.
+               if ( is_array( $scaler ) && is_callable( $scaler ) ) {
+                       // Allow subclasses to specify their own rendering methods.
+                       $err = call_user_func( $scaler, $image, $scalerParams );
+               } else {
+                       switch ( $scaler ) {
+                               case 'hookaborted':
+                                       # Handled by the hook above
+                                       $err = $mto->isError() ? $mto : false;
+                                       break;
+                               case 'im':
+                                       $err = $this->transformImageMagick( $image, $scalerParams );
+                                       break;
+                               case 'custom':
+                                       $err = $this->transformCustom( $image, $scalerParams );
+                                       break;
+                               case 'imext':
+                                       $err = $this->transformImageMagickExt( $image, $scalerParams );
+                                       break;
+                               case 'gd':
+                               default:
+                                       $err = $this->transformGd( $image, $scalerParams );
+                                       break;
+                       }
+               }
+
+               # Remove the file if a zero-byte thumbnail was created, or if there was an error
+               $removed = $this->removeBadFile( $dstPath, (bool)$err );
+               if ( $err ) {
+                       # transform returned MediaTransforError
+                       return $err;
+               } elseif ( $removed ) {
+                       # Thumbnail was zero-byte and had to be removed
+                       return new MediaTransformError( 'thumbnail_error',
+                               $scalerParams['clientWidth'], $scalerParams['clientHeight'],
+                               wfMessage( 'unknown-error' )->text()
+                       );
+               } elseif ( $mto ) {
+                       return $mto;
+               } else {
+                       $newParams = array(
+                               'width' => $scalerParams['clientWidth'],
+                               'height' => $scalerParams['clientHeight']
+                       );
+                       if ( isset( $params['quality'] ) ) {
+                               $newParams['quality'] = $params['quality'];
+                       }
+                       if ( isset( $params['page'] ) && $params['page'] ) {
+                               $newParams['page'] = $params['page'];
+                       }
+                       return new ThumbnailImage( $image, $dstUrl, $dstPath, $newParams );
+               }
+       }
+
+       /**
+        * Get the source file for the transform
+        *
+        * @param $file File
+        * @param $params Array
+        * @return Array Array with keys  width, height and path.
+        */
+       protected function getThumbnailSource( $file, $params ) {
+               return $file->getThumbnailSource( $params );
+       }
+
+       /**
+        * Returns what sort of scaler type should be used.
+        *
+        * Values can be one of client, im, custom, gd, imext, or an array
+        * of object, method-name to call that specific method.
+        *
+        * If specifying a custom scaler command with array( Obj, method ),
+        * the method in question should take 2 parameters, a File object,
+        * and a $scalerParams array with various options (See doTransform
+        * for what is in $scalerParams). On error it should return a
+        * MediaTransformError object. On success it should return false,
+        * and simply make sure the thumbnail file is located at
+        * $scalerParams['dstPath'].
+        *
+        * If there is a problem with the output path, it returns "client"
+        * to do client side scaling.
+        *
+        * @param string $dstPath
+        * @param bool $checkDstPath Check that $dstPath is valid
+        * @return string|Callable One of client, im, custom, gd, imext, or a Callable array.
+        */
+       abstract protected function getScalerType( $dstPath, $checkDstPath = true );
+
+       /**
+        * Get a ThumbnailImage that respresents an image that will be scaled
+        * client side
+        *
+        * @param File $image File associated with this thumbnail
+        * @param array $scalerParams Array with scaler params
+        * @return ThumbnailImage
+        *
+        * @todo FIXME: No rotation support
+        */
+       protected function getClientScalingThumbnailImage( $image, $scalerParams ) {
+               $params = array(
+                       'width' => $scalerParams['clientWidth'],
+                       'height' => $scalerParams['clientHeight']
+               );
+
+               return new ThumbnailImage( $image, $image->getURL(), null, $params );
+       }
+
+       /**
+        * Transform an image using ImageMagick
+        *
+        * This is a stub method. The real method is in BitmapHander.
+        *
+        * @param File $image File associated with this thumbnail
+        * @param array $params Array with scaler params
+        *
+        * @return MediaTransformError Error object if error occurred, false (=no error) otherwise
+        */
+       protected function transformImageMagick( $image, $params ) {
+               return $this->getMediaTransformError( $params, "Unimplemented" );
+       }
+
+       /**
+        * Transform an image using the Imagick PHP extension
+        *
+        * This is a stub method. The real method is in BitmapHander.
+        *
+        * @param File $image File associated with this thumbnail
+        * @param array $params Array with scaler params
+        *
+        * @return MediaTransformError Error object if error occurred, false (=no error) otherwise
+        */
+       protected function transformImageMagickExt( $image, $params ) {
+               return $this->getMediaTransformError( $params, "Unimplemented" );
+       }
+
+       /**
+        * Transform an image using a custom command
+        *
+        * This is a stub method. The real method is in BitmapHander.
+        *
+        * @param File $image File associated with this thumbnail
+        * @param array $params Array with scaler params
+        *
+        * @return MediaTransformError Error object if error occurred, false (=no error) otherwise
+        */
+       protected function transformCustom( $image, $params ) {
+               return $this->getMediaTransformError( $params, "Unimplemented" );
+       }
+
+       /**
+        * Get a MediaTransformError with error 'thumbnail_error'
+        *
+        * @param array $params Parameter array as passed to the transform* functions
+        * @param string $errMsg Error message
+        * @return MediaTransformError
+        */
+       public function getMediaTransformError( $params, $errMsg ) {
+               return new MediaTransformError( 'thumbnail_error', $params['clientWidth'],
+                       $params['clientHeight'], $errMsg );
+       }
+
+       /**
+        * Transform an image using the built in GD library
+        *
+        * This is a stub method. The real method is in BitmapHander.
+        *
+        * @param File $image File associated with this thumbnail
+        * @param array $params Array with scaler params
+        *
+        * @return MediaTransformError Error object if error occurred, false (=no error) otherwise
+        */
+       protected function transformGd( $image, $params ) {
+               return $this->getMediaTransformError( $params, "Unimplemented" );
+       }
+
+       /**
+        * Escape a string for ImageMagick's property input (e.g. -set -comment)
+        * See InterpretImageProperties() in magick/property.c
+        * @param string $s
+        * @return string
+        */
+       function escapeMagickProperty( $s ) {
+               // Double the backslashes
+               $s = str_replace( '\\', '\\\\', $s );
+               // Double the percents
+               $s = str_replace( '%', '%%', $s );
+               // Escape initial - or @
+               if ( strlen( $s ) > 0 && ( $s[0] === '-' || $s[0] === '@' ) ) {
+                       $s = '\\' . $s;
+               }
+
+               return $s;
+       }
+
+       /**
+        * Escape a string for ImageMagick's input filenames. See ExpandFilenames()
+        * and GetPathComponent() in magick/utility.c.
+        *
+        * This won't work with an initial ~ or @, so input files should be prefixed
+        * with the directory name.
+        *
+        * Glob character unescaping is broken in ImageMagick before 6.6.1-5, but
+        * it's broken in a way that doesn't involve trying to convert every file
+        * in a directory, so we're better off escaping and waiting for the bugfix
+        * to filter down to users.
+        *
+        * @param string $path The file path
+        * @param bool|string $scene The scene specification, or false if there is none
+        * @throws MWException
+        * @return string
+        */
+       function escapeMagickInput( $path, $scene = false ) {
+               # Die on initial metacharacters (caller should prepend path)
+               $firstChar = substr( $path, 0, 1 );
+               if ( $firstChar === '~' || $firstChar === '@' ) {
+                       throw new MWException( __METHOD__ . ': cannot escape this path name' );
+               }
+
+               # Escape glob chars
+               $path = preg_replace( '/[*?\[\]{}]/', '\\\\\0', $path );
+
+               return $this->escapeMagickPath( $path, $scene );
+       }
+
+       /**
+        * Escape a string for ImageMagick's output filename. See
+        * InterpretImageFilename() in magick/image.c.
+        * @param string $path The file path
+        * @param bool|string $scene The scene specification, or false if there is none
+        * @return string
+        */
+       function escapeMagickOutput( $path, $scene = false ) {
+               $path = str_replace( '%', '%%', $path );
+
+               return $this->escapeMagickPath( $path, $scene );
+       }
+
+       /**
+        * Armour a string against ImageMagick's GetPathComponent(). This is a
+        * helper function for escapeMagickInput() and escapeMagickOutput().
+        *
+        * @param string $path The file path
+        * @param bool|string $scene The scene specification, or false if there is none
+        * @throws MWException
+        * @return string
+        */
+       protected function escapeMagickPath( $path, $scene = false ) {
+               # Die on format specifiers (other than drive letters). The regex is
+               # meant to match all the formats you get from "convert -list format"
+               if ( preg_match( '/^([a-zA-Z0-9-]+):/', $path, $m ) ) {
+                       if ( wfIsWindows() && is_dir( $m[0] ) ) {
+                               // OK, it's a drive letter
+                               // ImageMagick has a similar exception, see IsMagickConflict()
+                       } else {
+                               throw new MWException( __METHOD__ . ': unexpected colon character in path name' );
+                       }
+               }
+
+               # If there are square brackets, add a do-nothing scene specification
+               # to force a literal interpretation
+               if ( $scene === false ) {
+                       if ( strpos( $path, '[' ) !== false ) {
+                               $path .= '[0--1]';
+                       }
+               } else {
+                       $path .= "[$scene]";
+               }
+
+               return $path;
+       }
+
+       /**
+        * Retrieve the version of the installed ImageMagick
+        * You can use PHPs version_compare() to use this value
+        * Value is cached for one hour.
+        * @return string Representing the IM version.
+        */
+       protected function getMagickVersion() {
+               global $wgMemc;
+
+               $cache = $wgMemc->get( "imagemagick-version" );
+               if ( !$cache ) {
+                       global $wgImageMagickConvertCommand;
+                       $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . ' -version';
+                       wfDebug( __METHOD__ . ": Running convert -version\n" );
+                       $retval = '';
+                       $return = wfShellExec( $cmd, $retval );
+                       $x = preg_match( '/Version: ImageMagick ([0-9]*\.[0-9]*\.[0-9]*)/', $return, $matches );
+                       if ( $x != 1 ) {
+                               wfDebug( __METHOD__ . ": ImageMagick version check failed\n" );
+
+                               return null;
+                       }
+                       $wgMemc->set( "imagemagick-version", $matches[1], 3600 );
+
+                       return $matches[1];
+               }
+
+               return $cache;
+       }
+
+       /**
+        * Returns whether the current scaler supports rotation.
+        *
+        * @since 1.24 No longer static
+        * @return bool
+        */
+       public function canRotate() {
+               return false;
+       }
+
+       /**
+        * Should we automatically rotate an image based on exif
+        *
+        * @since 1.24 No longer static
+        * @see $wgEnableAutoRotation
+        * @return bool Whether auto rotation is enabled
+        */
+       public function autoRotateEnabled() {
+               return false;
+       }
+
+       /**
+        * Rotate a thumbnail.
+        *
+        * This is a stub. See BitmapHandler::rotate.
+        *
+        * @param File $file
+        * @param array $params Rotate parameters.
+        *   'rotation' clockwise rotation in degrees, allowed are multiples of 90
+        * @since 1.24 Is non-static. From 1.21 it was static
+        * @return bool
+        */
+       public function rotate( $file, $params ) {
+               return new MediaTransformError( 'thumbnail_error', 0, 0,
+                       "$scaler rotation not implemented" );
+       }
+
+       /**
+        * Returns whether the file needs to be rendered. Returns true if the
+        * file requires rotation and we are able to rotate it.
+        *
+        * @param File $file
+        * @return bool
+        */
+       public function mustRender( $file ) {
+               return $this->canRotate() && $this->getRotation( $file ) != 0;
+       }
+}
index aa77fa8..48b7a47 100644 (file)
@@ -209,7 +209,7 @@ class XCFHandler extends BitmapHandler {
         * @param bool $checkDstPath
         * @return string
         */
-       protected static function getScalerType( $dstPath, $checkDstPath = true ) {
+       protected function getScalerType( $dstPath, $checkDstPath = true ) {
                return "im";
        }
 
diff --git a/includes/resourceloader/ResourceLoaderEditToolbarModule.php b/includes/resourceloader/ResourceLoaderEditToolbarModule.php
new file mode 100644 (file)
index 0000000..2e07911
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Resource loader module for the edit toolbar.
+ *
+ * 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
+ */
+
+/**
+ * ResourceLoader module for the edit toolbar.
+ *
+ * @since 1.24
+ */
+class ResourceLoaderEditToolbarModule extends ResourceLoaderFileModule {
+       /**
+        * Serialize a string (escape and quote) for use as a CSS string value.
+        * http://www.w3.org/TR/2013/WD-cssom-20131205/#serialize-a-string
+        *
+        * @param string $value
+        * @return string
+        */
+       private static function cssSerializeString( $value ) {
+               if ( strstr( $value, "\0" ) ) {
+                       throw new Exception( "Invalid character in CSS string" );
+               }
+               $value = strtr( $value, array( '\\' => '\\\\', '"' => '\\"' ) );
+               $value = preg_replace_callback( '/[\x01-\x1f\x7f-\x9f]/', function ( $match ) {
+                       return '\\' . base_convert( ord( $match[0] ), 10, 16 ) . ' ';
+               }, $value );
+               return '"' . $value . '"';
+       }
+
+       /**
+        * Get language-specific LESS variables for this module.
+        *
+        * @return array
+        */
+       private function getLessVars( ResourceLoaderContext $context ) {
+               $language = Language::factory( $context->getLanguage() );
+
+               // This is very conveniently formatted and we can pass it right through
+               $vars = $language->getImageFiles();
+
+               // lessc tries to be helpful and parse our variables as LESS source code
+               foreach ( $vars as $key => &$value ) {
+                       $value = self::cssSerializeString( $value );
+               }
+
+               return $vars;
+       }
+
+       /**
+        * @param ResourceLoaderContext $context
+        * @return int UNIX timestamp
+        */
+       public function getModifiedTime( ResourceLoaderContext $context ) {
+               return max(
+                       parent::getModifiedTime( $context ),
+                       $this->getHashMtime( $context )
+               );
+       }
+
+       /**
+        * @param ResourceLoaderContext $context
+        * @return string Hash
+        */
+       public function getModifiedHash( ResourceLoaderContext $context ) {
+               return md5(
+                       parent::getModifiedHash( $context ) .
+                       serialize( $this->getLessVars( $context ) )
+               );
+       }
+
+       /**
+        * Get a LESS compiler instance for this module.
+        *
+        * Set our variables in it.
+        *
+        * @throws MWException
+        * @param ResourceLoaderContext $context
+        * @return lessc
+        */
+       protected function getLessCompiler( ResourceLoaderContext $context = null ) {
+               $compiler = parent::getLessCompiler();
+               $compiler->setVariables( $this->getLessVars( $context ) );
+               return $compiler;
+       }
+}
index 6128f19..fee78d1 100644 (file)
@@ -385,7 +385,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        public function getStyles( ResourceLoaderContext $context ) {
                $styles = $this->readStyleFiles(
                        $this->getStyleFiles( $context ),
-                       $this->getFlip( $context )
+                       $this->getFlip( $context ),
+                       $context
                );
                // Collect referenced files
                $this->localFileRefs = array_unique( $this->localFileRefs );
@@ -816,14 +817,14 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *
         * @param array $styles List of media type/list of file paths pairs, to read, remap and
         * concetenate
-        *
         * @param bool $flip
+        * @param ResourceLoaderContext $context (optional)
         *
         * @throws MWException
         * @return array List of concatenated and remapped CSS data from $styles,
         *     keyed by media type
         */
-       public function readStyleFiles( array $styles, $flip ) {
+       public function readStyleFiles( array $styles, $flip, $context = null ) {
                if ( empty( $styles ) ) {
                        return array();
                }
@@ -831,7 +832,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        $uniqueFiles = array_unique( $files, SORT_REGULAR );
                        $styleFiles = array();
                        foreach ( $uniqueFiles as $file ) {
-                               $styleFiles[] = $this->readStyleFile( $file, $flip );
+                               $styleFiles[] = $this->readStyleFile( $file, $flip, $context );
                        }
                        $styles[$media] = implode( "\n", $styleFiles );
                }
@@ -845,11 +846,12 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *
         * @param string $path File path of style file to read
         * @param bool $flip
+        * @param ResourceLoaderContext $context (optional)
         *
         * @return string CSS data in script file
         * @throws MWException If the file doesn't exist
         */
-       protected function readStyleFile( $path, $flip ) {
+       protected function readStyleFile( $path, $flip, $context = null ) {
                $localPath = $this->getLocalPath( $path );
                $remotePath = $this->getRemotePath( $path );
                if ( !file_exists( $localPath ) ) {
@@ -859,7 +861,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                }
 
                if ( $this->getStyleSheetLang( $localPath ) === 'less' ) {
-                       $style = $this->compileLessFile( $localPath );
+                       $compiler = $this->getLessCompiler( $context );
+                       $style = $this->compileLessFile( $localPath, $compiler );
                        $this->hasGeneratedStyles = true;
                } else {
                        $style = file_get_contents( $localPath );
@@ -908,12 +911,29 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @since 1.22
         * @throws Exception If lessc encounters a parse error
         * @param string $fileName File path of LESS source
+        * @param lessc $compiler Compiler to use, if not default
         * @return string CSS source
         */
-       protected function compileLessFile( $fileName ) {
-               $compiler = ResourceLoader::getLessCompiler( $this->getConfig() );
+       protected function compileLessFile( $fileName, $compiler = null ) {
+               if ( !$compiler ) {
+                       $compiler = $this->getLessCompiler();
+               }
                $result = $compiler->compileFile( $fileName );
                $this->localFileRefs += array_keys( $compiler->allParsedFiles() );
                return $result;
        }
+
+       /**
+        * Get a LESS compiler instance for this module in given context.
+        *
+        * Just calls ResourceLoader::getLessCompiler() by default to get a global compiler.
+        *
+        * @param ResourceLoaderContext $context
+        * @throws MWException
+        * @since 1.24
+        * @return lessc
+        */
+       protected function getLessCompiler( ResourceLoaderContext $context = null ) {
+               return ResourceLoader::getLessCompiler( $this->getConfig() );
+       }
 }
index e455ef1..78fe8e0 100644 (file)
@@ -94,7 +94,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgDBname' => $conf->get( 'DBname' ),
                        // This sucks, it is only needed on Special:Upload, but I could
                        // not find a way to add vars only for a certain module
-                       'wgFileCanRotate' => BitmapHandler::canRotate(),
+                       'wgFileCanRotate' => SpecialUpload::rotationEnabled(),
                        'wgAvailableSkins' => Skin::getSkinNames(),
                        'wgExtensionAssetsPath' => $conf->get( 'ExtensionAssetsPath' ),
                        // MediaWiki sets cookies to have this prefix by default
index 678c803..be2f1e8 100644 (file)
@@ -78,15 +78,9 @@ abstract class WantedQueryPage extends QueryPage {
                $title = Title::makeTitleSafe( $result->namespace, $result->title );
                if ( $title instanceof Title ) {
                        if ( $this->isCached() || $this->forceExistenceCheck() ) {
-                               $pageLink = $title->isKnown()
+                               $pageLink = $this->existenceCheck( $title )
                                        ? '<del>' . Linker::link( $title ) . '</del>'
-                                       : Linker::link(
-                                               $title,
-                                               null,
-                                               array(),
-                                               array(),
-                                               array( 'broken' )
-                                       );
+                                       : Linker::link( $title );
                        } else {
                                $pageLink = Linker::link(
                                        $title,
@@ -102,6 +96,25 @@ abstract class WantedQueryPage extends QueryPage {
                }
        }
 
+       /**
+        * Does the Title currently exists
+        *
+        * This method allows a subclass to override this check
+        * (For example, wantedfiles, would want to check if the file exists
+        * not just that a page in the file namespace exists).
+        *
+        * This will only control if the link is crossed out. Whether or not the link
+        * is blue vs red is controlled by if the title exists.
+        *
+        * @note This will only be run if the page is cached (ie $wgMiserMode = true)
+        *   unless forceExistenceCheck() is true.
+        * @since 1.24
+        * @return boolean
+        */
+       protected function existenceCheck( Title $title ) {
+               return $title->isKnown();
+       }
+
        /**
         * Make a "what links here" link for a given title
         *
index 5c8794a..2acf23c 100644 (file)
@@ -76,6 +76,7 @@ class SpecialPageLanguage extends FormSpecialPage {
 
                $page['language'] = array(
                        'id' => 'mw-pl-languageselector',
+                       'cssclass' => 'mw-languageselector',
                        'type' => 'select',
                        'options' => $options,
                        'label-message' => 'pagelang-language',
@@ -92,6 +93,7 @@ class SpecialPageLanguage extends FormSpecialPage {
        public function alterForm( HTMLForm $form ) {
                $form->setDisplayFormat( 'vform' );
                $form->setWrapperLegend( false );
+               wfRunHooks( 'LanguageSelector', array( $this->getOutput(), 'mw-languageselector' ) );
        }
 
        /**
index 13a00ed..55d09dd 100644 (file)
@@ -738,6 +738,18 @@ class SpecialUpload extends SpecialPage {
        protected function getGroupName() {
                return 'media';
        }
+
+       /**
+        * Should we rotate images in the preview on Special:Upload.
+        *
+        * This controls js: mw.config.get( 'wgFileCanRotate' )
+        *
+        * @todo What about non-BitmapHandler handled files?
+        */
+       static public function rotationEnabled() {
+               $bitmapHandler = new BitmapHandler();
+               return $bitmapHandler->autoRotateEnabled();
+       }
 }
 
 /**
index 97c7704..cb3fc11 100644 (file)
@@ -204,7 +204,7 @@ class SpecialVersion extends SpecialPage {
         *
         * @return string
         */
-       static function softwareInformation() {
+       public static function softwareInformation() {
                $dbr = wfGetDB( DB_SLAVE );
 
                // Put the software in an array of form 'name' => 'version'. All messages should
@@ -428,7 +428,7 @@ class SpecialVersion extends SpecialPage {
         *
         * @return string Wikitext
         */
-       function getExtensionCredits() {
+       public function getExtensionCredits() {
                global $wgExtensionCredits;
 
                if (
@@ -482,7 +482,7 @@ class SpecialVersion extends SpecialPage {
         *
         * @return string Wikitext
         */
-       function getSkinCredits() {
+       public function getSkinCredits() {
                global $wgExtensionCredits;
                if ( !isset( $wgExtensionCredits['skin'] ) || count( $wgExtensionCredits['skin'] ) === 0 ) {
                        return '';
@@ -593,7 +593,7 @@ class SpecialVersion extends SpecialPage {
         * @param array $b
         * @return int
         */
-       function compare( $a, $b ) {
+       public function compare( $a, $b ) {
                if ( $a['name'] === $b['name'] ) {
                        return 0;
                } else {
@@ -620,7 +620,7 @@ class SpecialVersion extends SpecialPage {
         *
         * @return string Raw HTML
         */
-       function getCreditsForExtension( array $extension ) {
+       public function getCreditsForExtension( array $extension ) {
                $out = $this->getOutput();
 
                // We must obtain the information for all the bits and pieces!
@@ -905,7 +905,7 @@ class SpecialVersion extends SpecialPage {
         *
         * @return string HTML fragment
         */
-       function listAuthors( $authors, $extName, $extDir ) {
+       public function listAuthors( $authors, $extName, $extDir ) {
                $hasOthers = false;
 
                $list = array();
@@ -1008,7 +1008,7 @@ class SpecialVersion extends SpecialPage {
         *
         * @return string
         */
-       function listToText( $list, $sort = true ) {
+       public function listToText( $list, $sort = true ) {
                if ( !count( $list ) ) {
                        return '';
                }
index 8269b01..937a503 100644 (file)
@@ -93,6 +93,18 @@ class WantedFilesPage extends WantedQueryPage {
                return true;
        }
 
+       /**
+        * Does the file exist?
+        *
+        * Use wfFindFile so we still think file namespace pages without
+        * files are missing, but valid file redirects and foreign files are ok.
+        *
+        * @return boolean
+        */
+       protected function existenceCheck( Title $title ) {
+               return (bool) wfFindFile( $title );
+       }
+
        function getQueryInfo() {
                return array(
                        'tables' => array(
index 9bbccf1..115a918 100644 (file)
@@ -784,6 +784,14 @@ class Language {
                return self::$dataCache->getSubitem( $this->mCode, 'imageFiles', $image );
        }
 
+       /**
+        * @return array
+        * @since 1.24
+        */
+       function getImageFiles() {
+               return self::$dataCache->getItem( $this->mCode, 'imageFiles' );
+       }
+
        /**
         * @return array
         */
index 25941c6..ac102a6 100644 (file)
        "searchall": "الكل",
        "showingresults": "معروض بالأسفل {{PLURAL:$1|'''1''' نتيجة|'''$1''' نتيجة}} بدءا من رقم '''$2'''.",
        "showingresultsinrange": "بالأسفل {{PLURAL:$1|نتيجة واحدة|<strong>$1</strong> نتائج|<strong>$1</strong> نتيجة}} في النطاق من <strong>$2</strong> إلى <strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|النتيجة '''$1''' من'''$3'''|النتائج '''$1 - $2''' من'''$3'''}} ل'''$4'''",
        "search-nonefound": "لا توجد نتائج تطابق الاستعلام.",
        "powersearch-legend": "بحث متقدم",
        "powersearch-ns": "بحث في النطاقات:",
        "userrights-lookup-user": "أدِر مجموعات المستخدم",
        "userrights-user-editname": "أدخل اسم مستخدم:",
        "editusergroup": "عدل مجموعات المستخدم",
-       "editinguser": "تغيير صلاحيات المستخدم '''[[User:$1|$1]]''' $2",
+       "editinguser": "تغيير صلاحيات {{GENDER:$1|المستخدم|المستخدمة}} '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "تعديل مجموعات المستخدم",
        "saveusergroups": "احفظ مجموعات المستخدم",
        "userrights-groupsmember": "عضو في:",
index 2906f50..327d973 100644 (file)
        "unusedtemplates": "داڕێژە بەکارنەھێنراوەکان",
        "unusedtemplatestext": "ئەم پەڕە هەموو پەڕەکانی بۆشاییی ناوی {{ns:template}} بە لیست دەکات کە لە پەڕەی تردا بەکارنەھێنراون.\nلە بیری نەکەی پێش سڕینەوەیان پشکنینی بەستەرەکانی تر بۆ داڕێژەکان بکەی.",
        "unusedtemplateswlh": "بەستەرەکانی تر",
-       "randompage": "پەڕەیەک بە هەڵکەوت",
+       "randompage": "پەڕەی ھەڕەمەکی",
        "randompage-nopages": "هیچ لاپەڕەیەک لەم {{PLURAL:$2|ناوبۆشاییەدا|ناوبۆشاییانەدا}} نیە: $1.",
-       "randomredirect": "ڕەوانەکەری ھەرمەکی",
+       "randomincategory": "پەڕەی پۆلی ھەڕەمەکی",
+       "randomredirect": "ڕەوانەکەری ھەڕەمەکی",
        "randomredirect-nopages": "لە ناوبۆشایی \"$1\" هیچ ڕەوانکەرێک نییە.",
        "statistics": "ئامارەکان",
        "statistics-header-pages": "ئامارەکانی پەڕەکان",
        "version-software-product": "بەرهەم",
        "version-software-version": "وەشان",
        "version-entrypoints-header-url": "ناونیشانی ئینتەرنێتی",
+       "redirect": "ڕەوانەکەر بە پێی پەڕگە، بەکارھێنەر، پەڕە یان پێناسەی پێداچوونەوە",
        "redirect-submit": "بڕۆ",
        "fileduplicatesearch": "گەڕان بۆ پەڕگە دووپات کراوەکان",
        "fileduplicatesearch-summary": "گەڕان بۆ پەڕگە دووبارەکراوەکان لەسەر بنەمای نرخی hash.",
        "specialpages-group-pages": "پێرستەکانی پەڕەکان",
        "specialpages-group-pagetools": "ئامرازەکانی پەڕە",
        "specialpages-group-wiki": "دراوەکان و ئامرازەکان",
-       "specialpages-group-redirects": "پەڕە تایبەتەکانی رەوانکردنەوە",
+       "specialpages-group-redirects": "پەڕە تایبەتەکانی ڕەوانەکردن",
        "specialpages-group-spam": "ئامرازەکانی سپەم",
        "blankpage": "پەڕەی واڵا",
        "intentionallyblankpage": "ئەم پەڕەیە لەقەست واڵا ھێڵراوەتەوە.",
        "logentry-newusers-autocreate": "ھەژماری بەکارھێنەریی $1 بە شێوەی خۆگەڕ {{GENDER:$2|دروست کرا}}",
        "logentry-rights-rights": "$1 ئەندامێتیی $3ی لە $4 بۆ $5 {{GENDER:$2|گۆڕی}}",
        "logentry-upload-upload": "$1 $3ی {{GENDER:$2|بار کرد}}",
+       "logentry-upload-overwrite": "$1 وەشانێکی نوێی $3ی {{GENDER:$2|بار کرد}}",
        "rightsnone": "(ھیچ)",
        "feedback-subject": "بابەت:",
        "feedback-message": "پەیام:",
index 19a7b1b..d9370d7 100644 (file)
        "saveusergroups": "Sêlva gróp utèint",
        "userrights-groupsmember": "Al fà pêrt {{PLURAL:$1|al gróp|ai gróp}}:",
        "userrights-groupsmember-auto": "Al fà pêrt ed sicûr a:",
+       "userrights-reason": "Mutîv:",
        "group": "Gróp:",
        "group-user": "Utèint",
        "group-autoconfirmed": "Utèint cunvalidê da per ló",
index 574d977..bc1c6a1 100644 (file)
@@ -4,8 +4,8 @@
        },
        "sidebar": "\n* navigation\n** mainpage|mainpage-description\n** recentchanges-url|recentchanges\n** randompage-url|randompage\n** helppage|help\n* SEARCH\n* TOOLBOX\n* LANGUAGES",
        "tog-underline": "Link underlining:",
-       "tog-hideminor": "Hide minor edits in recent changes",
-       "tog-hidepatrolled": "Hide patrolled edits in recent changes",
+       "tog-hideminor": "Hide minor edits from recent changes",
+       "tog-hidepatrolled": "Hide patrolled edits from recent changes",
        "tog-newpageshidepatrolled": "Hide patrolled pages from new page list",
        "tog-extendwatchlist": "Expand watchlist to show all changes, not just the most recent",
        "tog-usenewrc": "Group changes by page in recent changes and watchlist",
index 60f9d99..27ced91 100644 (file)
        "contribsub2": "برای {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "حساب کاربری «$1» ثبت نشده‌است.",
        "nocontribs": "هیچ تغییری با این مشخصات یافت نشد.",
-       "uctop": "(نسخه کنونی)",
+       "uctop": "(نسخهٔ کنونی)",
        "month": "در این ماه (و پیش از آن):",
        "year": "در این سال (و پیش از آن):",
        "sp-contributions-newbies": "فقط مشارکت‌های تازه‌کاران نمایش داده شود",
        "logentry-rights-rights-legacy": "$1 گروه عضویت $3 را {{GENDER:$2|تغییر داد}}",
        "logentry-rights-autopromote": "$1 به طور خودکار از $4 به $5 {{GENDER:$2|ارتقاء داد}}",
        "logentry-upload-upload": "$1 $3 را {{GENDER:$2|بارگذاری کرد}}",
-       "logentry-upload-overwrite": "$1 یک نسخهٔ تازه {{GENDER:$2|بارگذاری‌کرد}} $3",
+       "logentry-upload-overwrite": "$1 نسخهٔ تازه‌ای از $3 را {{GENDER:$2|بارگذاری کرد}}",
        "logentry-upload-revert": "$1 {{GENDER:$2|بارگذاری کرد}} $3",
        "rightsnone": "(هیچ)",
        "feedback-bugornote": "اگر آماده‌اید تا مشکلی فنی را با جزئیاتش شرح دهید لطفاً [$1 یک ایراد گزارش دهید]. در غیر این صورت می‌توانید از فرم سادهٔ زیر استفاده کنید. نظر شما به همراه نام کاربری و مرورگرتان به صفحهٔ «[$3 $2]» افزوده خواهد شد.",
index cb43f56..d12cb19 100644 (file)
        "gotaccountlink": "登入",
        "userlogin-resetlink": "毋記得汝嘅登入信息?",
        "userlogin-resetpassword-link": "添忘訖汝嘅密碼?",
-       "userlogin-loggedin": "汝已作為{{GENDER:$1|$1}}登錄。\n利用以下表單以作為另一賬戶登錄。",
        "createacct-emailrequired": "電郵地址:",
        "createacct-emailoptional": "電郵地址(可選)",
        "createacct-email-ph": "設置電郵地址",
        "template-protected": "(保護)",
        "template-semiprotected": "(半保護)",
        "hiddencategories": "邇頁屬於$1隻隱藏分類嘅成員:",
-       "edittools": "<!-- 邇肚嘅文字將分展示在編寫撈上傳表單以下。 -->",
+       "edittools": "<!-- 邇肚嘅文字將分展示在編寫撈上傳表單以下。 -->\n<div id=\"editpage-specialchars\" class=\"plainlinks edittools-version-test003\" style=\"margin-top: 15px; border-width: 1px; border-style: solid; border-color: #aaaaaa; padding: 2px;\"> <span id=\"edittools_main\">'''Insert:''' <charinsert>– — … ‘ “ ’ ” ° ″ ′ ≈ ≠ ≤ ≥ ± − × ÷ ← → · § </charinsert></span><span id=\"edittools_name\">&nbsp;&nbsp;'''Sign your username:''' <charinsert>--~~&#126;~</charinsert> <small>(on [[Help:Talk pages|talk pages]])</small></span> ---- <small id=\"edittools_newsectionshere\"><span id=\"edittools_hide_for_script_test\"><span id=\"edittools_wikimarkup\">'''Wiki markup:''' <charinsert><nowiki>{{</nowiki>+<nowiki>}}</nowiki> </charinsert> &nbsp; <charinsert><nowiki>{{{</nowiki>+<nowiki>}}}</nowiki> </charinsert> &nbsp; <charinsert><nowiki>|</nowiki></charinsert> &nbsp; <charinsert>[+]</charinsert> &nbsp; <charinsert>[[+]]</charinsert> &nbsp; <charinsert>[[Category:+]]</charinsert> &nbsp; <charinsert>#REDIRECT&#32;[[+]]</charinsert> &nbsp; <charinsert>{{Subst:Fôn-ngiàng}}</charinsert> &nbsp; <charinsert>{{Subst:PAGENAME}}</charinsert> &nbsp; <charinsert>&nbsp;</charinsert> &nbsp; <charinsert><s>+</s></charinsert> &nbsp; <charinsert><sup>+</sup></charinsert> &nbsp; <charinsert><sub>+</sub></charinsert> &nbsp; <charinsert><code>+</code></charinsert> &nbsp; <charinsert><blockquote>+</blockquote></charinsert> &nbsp; <charinsert><ref>+</ref></charinsert> &nbsp; <charinsert><nowiki>{{</nowiki>Reflist<nowiki>}}</nowiki></charinsert> &nbsp; <charinsert><references/></charinsert> &nbsp; <charinsert><includeonly>+</includeonly></charinsert> &nbsp; <charinsert><noinclude>+</noinclude></charinsert> &nbsp; <charinsert><nowiki>{{</nowiki>DEFAULTSORT:+<nowiki>}}</nowiki></charinsert> &nbsp; <charinsert>&lt;nowiki>+</nowiki></charinsert> &nbsp; <charinsert><nowiki><!-- </nowiki>+<nowiki> --></nowiki></charinsert>&nbsp; <charinsert><nowiki><span class=\"plainlinks\"></nowiki>+<nowiki></span></nowiki></charinsert>&nbsp;&nbsp;&bull;&nbsp; ([[Wikipedia:Template messages|templates]])<br/></span> <span id=\"edittools_symbols\">'''Symbols:''' <charinsert> ~ | ¡ ¿ † ‡ ↔ ↑ ↓ • ¶</charinsert> &nbsp; <charinsert> # ½ ⅓ ⅔ ¼ ¾ ⅛ ⅜ ⅝ ⅞ ∞ </charinsert> &nbsp; <charinsert> ‘ “ ’ ” «+»</charinsert> &nbsp; <charinsert> ¤ ₳ ฿ ₵ ¢ ₡ ₢ $ ₫ ₯ € ₠ ₣ ƒ ₴ ₭ ₤ ℳ ₥ ₦ № ₧ ₰ £ ៛ ₨ ₪ ৳ ₮ ₩ ¥ </charinsert> &nbsp; <charinsert> ♠ ♣ ♥ ♦ </charinsert>&nbsp; <charinsert>m²</charinsert>&nbsp;<charinsert>m³</charinsert><br/></span> <span id=\"edittools_characters\">'''Characters:''' <span class=\"latinx\"> <charinsert> Á á Ć ć É é Í í Ĺ ĺ Ḿ ḿ Ń ń Ó ó Ŕ ŕ Ś ś Ú ú Ý ý Ź ź </charinsert> &nbsp; <charinsert> À à È è Ì ì M̀ m̀  Ǹ ǹ Ò ò Ù ù </charinsert> &nbsp; <charinsert> Â â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û Ŵ ŵ Ŷ ŷ </charinsert> &nbsp; <charinsert> A̤ a̤ E̤ e̤ I̤ i̤ O̤ o̤ Ṳ ṳ </charinsert> &nbsp;\n<charinsert> A̍ a̍ E̍ e̍ I̍ i̍ O̍ o̍ U̍ u̍ </charinsert> &nbsp; <charinsert> À̤ à̤ È̤ è̤ Ì̤ ì̤ Ò̤ ò̤ Ṳ̀ ṳ̀ </charinsert> &nbsp;\n<charinsert> Á̤ á̤ É̤ é̤ Í̤ í̤ Ó̤ ó̤ Ṳ́ ṳ́ </charinsert> &nbsp; <charinsert> A̤̍ a̤̍ E̤̍ e̤̍ I̤̍ i̤̍ O̤̍ o̤̍ Ṳ̍ ṳ̍ </charinsert> &nbsp;\n<charinsert> Â̤ â̤ Ê̤ ê̤ Î̤ î̤ Ô̤ ô̤ Ṳ̂ ṳ̂ </charinsert> &nbsp; <charinsert> Â â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û Ŵ ŵ Ŷ ŷ </charinsert> &nbsp; <charinsert> Ä ä Ë ë Ï ï Ö ö Ü ü Ÿ ÿ </charinsert> &nbsp; <charinsert> ß </charinsert> &nbsp; <charinsert> Ã ã Ẽ ẽ Ĩ ĩ Ñ ñ Õ õ Ũ ũ Ỹ ỹ</charinsert> &nbsp; <charinsert> Ç ç Ģ ģ Ķ ķ Ļ ļ Ņ ņ Ŗ ŗ Ş ş Ţ ţ </charinsert> &nbsp; <charinsert> Đ đ </charinsert> &nbsp; <charinsert> Ů ů </charinsert> &nbsp; <charinsert> Ǎ ǎ Č č Ď ď Ě ě Ǐ ǐ Ľ ľ Ň ň Ǒ ǒ Ř ř Š š Ť ť Ǔ ǔ Ž ž </charinsert> &nbsp; <charinsert> Ā ā Ē ē Ī ī Ō ō Ū ū Ȳ ȳ Ǣ ǣ </charinsert> &nbsp; <charinsert> ǖ ǘ ǚ ǜ </charinsert> &nbsp; <charinsert> Ă ă Ĕ ĕ Ğ ğ Ĭ ĭ Ŏ ŏ Ŭ ŭ </charinsert> &nbsp; <charinsert> Ċ ċ Ė ė Ġ ġ İ ı Ż ż </charinsert> &nbsp; <charinsert> Ą ą Ę ę Į į Ǫ ǫ Ų ų </charinsert> &nbsp; <charinsert> Ḍ ḍ Ḥ ḥ Ḷ ḷ Ḹ ḹ Ṃ ṃ Ṇ ṇ Ṛ ṛ Ṝ ṝ Ṣ ṣ Ṭ ṭ </charinsert> &nbsp; <charinsert> Ł ł </charinsert> &nbsp; <charinsert> Ő ő Ű ű </charinsert> &nbsp; <charinsert> Ŀ ŀ </charinsert> &nbsp; <charinsert> Ħ ħ </charinsert> &nbsp; <charinsert> Ð ð Þ þ </charinsert> &nbsp; <charinsert> Œ œ </charinsert> &nbsp; <charinsert> Æ æ Ø ø Å å </charinsert> &nbsp; <charinsert> Ə ə </charinsert></span>&nbsp;<span id=\"edittools_latinx_template\">&nbsp;&bull;&nbsp; <charinsert><nowiki>{{</nowiki><nowiki>Unicode|</nowiki>+<nowiki>}}</nowiki></charinsert></span><br/></span> <span id=\"edittools_greek\">'''Hî-lia̍p-vùn:''' <charinsert> Ά ά Έ έ Ή ή Ί ί Ό ό Ύ ύ Ώ ώ </charinsert> &nbsp; <charinsert> Α α Β β Γ γ Δ δ </charinsert> &nbsp; <charinsert> Ε ε Ζ ζ Η η Θ θ </charinsert> &nbsp; <charinsert> Ι ι Κ κ Λ λ Μ μ </charinsert> &nbsp; <charinsert> Ν ν Ξ ξ Ο ο Π π </charinsert> &nbsp; <charinsert> Ρ ρ Σ σ ς Τ τ Υ υ </charinsert> &nbsp; <charinsert> Φ φ Χ χ Ψ ψ Ω ω </charinsert> &nbsp;<span id=\"edittools_greek_template\">•&nbsp; <charinsert><nowiki>{{</nowiki><nowiki>Polytonic|</nowiki>+<nowiki>}}</nowiki></charinsert></span> &nbsp;<span id=\"edittools_greek_example\">•&nbsp; ([[Greek diacritics#Computer encoding|polytonic list]])</span><br/></span> <span id=\"edittools_cyrillic\">'''Cyrillic:''' <charinsert> А а Б б В в Г г </charinsert> &nbsp; <charinsert> Ґ ґ Ѓ ѓ Д д Ђ ђ </charinsert> &nbsp; <charinsert> Е е Ё ё Є є Ж ж </charinsert> &nbsp; <charinsert> З з Ѕ ѕ И и І і </charinsert> &nbsp; <charinsert> Ї ї Й й Ј ј К к </charinsert> &nbsp; <charinsert> Ќ ќ Л л Љ љ М м </charinsert> &nbsp; <charinsert> Н н Њ њ О о П п </charinsert> &nbsp; <charinsert> Р р С с Т т Ћ ћ </charinsert> &nbsp; <charinsert> У у Ў ў Ф ф Х х </charinsert> &nbsp; <charinsert> Ц ц Ч ч Џ џ Ш ш </charinsert> &nbsp; <charinsert> Щ щ Ъ ъ Ы ы Ь ь </charinsert> &nbsp; <charinsert> Э э Ю ю Я я </charinsert> &nbsp;<br/></span> <span id=\"edittools_ipa\">'''IPA:''' <span title=\"Pronunciation in IPA\" class=\"IPA\"><charinsert>t̪ d̪ ʈ ɖ ɟ ɡ ɢ ʡ ʔ </charinsert> &nbsp; <charinsert> ɸ ʃ ʒ ɕ ʑ ʂ ʐ ʝ ɣ ʁ ʕ ʜ ʢ ɦ </charinsert> &nbsp; <charinsert> ɱ ɳ ɲ ŋ ɴ </charinsert> &nbsp; <charinsert> ʋ ɹ ɻ ɰ </charinsert> &nbsp; <charinsert> ʙ ʀ ɾ ɽ </charinsert> &nbsp; <charinsert> ɫ ɬ ɮ ɺ ɭ ʎ ʟ </charinsert> &nbsp; <charinsert> ɥ ʍ ɧ </charinsert> &nbsp; <charinsert> ɓ ɗ ʄ ɠ ʛ </charinsert> &nbsp; <charinsert> ʘ ǀ ǃ ǂ ǁ </charinsert> &nbsp; <charinsert> ɨ ʉ ɯ </charinsert> &nbsp; <charinsert> ɪ ʏ ʊ </charinsert> &nbsp; <charinsert> ɘ ɵ ɤ </charinsert> &nbsp; <charinsert> ə ɚ </charinsert> &nbsp; <charinsert> ɛ ɜ ɝ ɞ ʌ ɔ </charinsert> &nbsp; <charinsert> ɐ ɶ ɑ ɒ </charinsert> &nbsp; <charinsert> ʰ ʷ ʲ ˠ ˤ ⁿ ˡ </charinsert> &nbsp; <charinsert> ˈ ˌ ː ˑ ̪ </charinsert>&nbsp;</span> &nbsp;&bull;&nbsp; <charinsert><nowiki>{{</nowiki><nowiki>IPA|</nowiki>+<nowiki>}}</charinsert></small>\n</div>",
        "nocreatetext": "Chhṳ́ mióng-chham han-chṳ chhóng-chho sîn hong-mien ke kûng-yung. ngì khó-yî fán-fì pin phiên-cho yí-kîn yû ke hong-mien, fe̍t-chá [[Special:UserLogin|tên-liu̍k fe̍t-he chhóng-kien sîn chong-fu]].",
        "nocreate-loggedin": "汝並無權限去創建新頁面。",
        "permissionserrors": "權限差錯",
        "searchrelated": "相關",
        "searchall": "全部",
        "showingresults": "Ha-mien hién-sṳ chhiùng thi-'''$2'''-thiàu khôi-sṳ́ ke '''$1'''-thiàu kiet-kó:",
-       "showingresultsheader": "對'''$4'''嘅{{PLURAL:$5|第'''$1'''到第'''$3'''隻結果|第'''$1 - $2'''隻,共'''$3'''隻結果}}",
        "search-nonefound": "在查詢肚無結果相符。",
        "powersearch-legend": "高級搜尋",
        "powersearch-ns": "在下背嘅名字空間肚搜尋:",
index 0e05dcf..3b0a110 100644 (file)
        "hidetoc": "elrejtés",
        "collapsible-collapse": "becsuk",
        "collapsible-expand": "kinyit",
+       "confirmable-confirm": "Biztos {{GENDER:$1|vagy}} benne?",
+       "confirmable-yes": "Igen",
+       "confirmable-no": "Nem",
        "thisisdeleted": "$1 megtekintése vagy helyreállítása?",
        "viewdeleted": "$1 megtekintése?",
        "restorelink": "{{PLURAL:$1|Egy|$1}} törölt szerkesztés",
index 3a7be8a..a9b16e6 100644 (file)
@@ -16,7 +16,8 @@
                        "Xelgen",
                        "Համլետ",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Lilitik22"
                ]
        },
        "tog-underline": "ընդգծել հղումները՝",
        "tog-hidepatrolled": "Թաքցնել պարեկված խմբագրումները վերջին փոփոխությունների ցանկից",
        "tog-newpageshidepatrolled": "Թաքցնել պարեկված էջերը նոր էջերի ցանկից",
        "tog-extendwatchlist": "Ընդարձակել հսկացանկը՝ ցույց տալով բոլոր փոփոխությունները, այլ ոչ միայն վերջինները",
-       "tog-usenewrc": "Ô½Õ´Õ¢Õ¡Õ¾Õ¸Ö\80Õ¥Õ¬ Ö\83Õ¸Ö\83Õ¸Õ­Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶Õ¶Õ¥Ö\80Õ¨ Õ\8eերջին փոփոխություններում և հսկացանկում (պահանջում է JavaScript)",
+       "tog-usenewrc": "Ô½Õ´Õ¢Õ¡Õ¾Õ¸Ö\80Õ¥Õ¬ Ö\83Õ¸Ö\83Õ¸Õ­Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶Õ¶Õ¥Ö\80Õ¨ Õ¾երջին փոփոխություններում և հսկացանկում (պահանջում է JavaScript)",
        "tog-numberheadings": "Ինքնաթվագրել վերնագրերը",
        "tog-showtoolbar": "Ցույց տալ խմբագրումների գործիքների վահանակը",
        "tog-editondblclick": "Խմբագրել էջերը կրկնակի մատնահարմամբ",
        "tog-editsectiononrightclick": "Խմբագրել բաժինները վերնագրի աջ մատնահարմամբ",
-       "tog-watchcreations": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ½Õ¿Õ¥Õ²Õ®Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¢Õ¥Õ¼Õ¶Õ¡Õ® Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ«Õ¶",
-       "tog-watchdefault": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ«Õ¶",
-       "tog-watchmoves": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ¾Õ¥Ö\80Õ¶Õ¡Õ¾Õ¡Õ¶Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ«Õ¶",
-       "tog-watchdeletion": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ»Õ¶Õ»Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ«Õ´ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ«Õ¶",
-       "tog-minordefault": "Նշել խմբագրումները որպես չնչին ըստ լռության",
+       "tog-watchcreations": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ½Õ¿Õ¥Õ²Õ®Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¢Õ¥Õ¼Õ¶Õ¡Õ® Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ¸Ö\82Õ´",
+       "tog-watchdefault": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ¸Ö\82Õ´",
+       "tog-watchmoves": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ¾Õ¥Ö\80Õ¶Õ¡Õ¾Õ¡Õ¶Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ¸Ö\82Õ´",
+       "tog-watchdeletion": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ»Õ¶Õ»Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ¸Ö\82Õ´",
+       "tog-minordefault": "Խմբագրումները լռելյայն նշել որպես չնչին",
        "tog-previewontop": "Ցույց տալ նախադիտումը խմբագրման դաշտից առաջ",
        "tog-previewonfirst": "Նախադիտել մինչև առաջին խմբագրությունը",
        "tog-enotifwatchlistpages": "էլ-փոստով տեղեկացնել հսկվող էջերում փոփոխությունների մասին",
index 431a3aa..3712ee9 100644 (file)
        "userlogin-resetlink": "Lupa detail info masuk Anda?",
        "userlogin-resetpassword-link": "Lupa kata sandi?",
        "userlogin-helplink2": "Bantuan masuk log",
-       "userlogin-loggedin": "Andan telah masuk log sebagai $1.\nGunakan formulir di bawah untuk masuk log sebagai pengguna lain.",
-       "userlogin-createanother": "Buat akun lain",
        "createacct-emailrequired": "Alamat surel",
        "createacct-emailoptional": "Alamat surel (opsional)",
        "createacct-email-ph": "Masukkan alamat surel Anda",
        "searchall": "semua",
        "showingresults": "Di bawah ini ditampilkan hingga {{PLURAL:$1|'''1''' hasil|'''$1''' hasil}}, dimulai dari #'''$2'''.",
        "showingresultsinrange": "Menampilkan sampai dengan {{PLURAL:$1|<strong>1</strong> hasil|<strong>$1</strong> hasil}} dalam jangkauan #<strong>$2</strong> sampai #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Hasil '''$1''' dari '''$3'''|Hasil '''$1 - $2''' dari '''$3'''}} untuk '''$4'''",
        "search-nonefound": "Tidak ada hasil yang sesuai dengan kriteria.",
        "powersearch-legend": "Pencarian lanjut",
        "powersearch-ns": "Mencari di ruang nama:",
        "powersearch-togglelabel": "Pilih:",
        "powersearch-toggleall": "Semua",
        "powersearch-togglenone": "Tidak ada",
-       "powersearch-remember": "Ingar pilihan untuk pencarian selanjutnya",
+       "powersearch-remember": "Ingat pilihan untuk pencarian selanjutnya",
        "search-external": "Pencarian eksternal",
        "searchdisabled": "Pencarian {{SITENAME}} sementara dimatikan.\nAnda dapat mencari melalui Google untuk sementara waktu.\nPerlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencakup perubahan-perubahan terakhir.",
        "search-error": "Kesalahan terjadi saat mencari: $1",
index 3a6f9b0..0eab06d 100644 (file)
        "unblocked": "L'utente [[User:$1|$1]] è stato sbloccato",
        "unblocked-range": "$1 è stato sbloccato",
        "unblocked-id": "Il blocco $1 è stato rimosso",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] è stato sbloccato.",
        "blocklist": "Utenti bloccati",
        "ipblocklist": "Utenti bloccati",
        "ipblocklist-legend": "Cerca un utente bloccato",
index 71bb713..cbacea8 100644 (file)
        "searchrelated": "მიბმული",
        "searchall": "ყველა",
        "showingresults": "ქვემოთ იხილეთ <b>$1</b>-მდე შედეგი დაწყებული #<b>$2</b>-იდან.",
-       "showingresultsheader": "{{PLURAL:$5|რეზულტატი '''$1'''  '''$3'''-დან|რეზულტატები '''$1 — $2''' -დან '''$3'''}}  '''$4'''-თვის",
        "search-nonefound": "მოთხოვნის შესაბამისობა არ არის ნაპოვნი.",
        "powersearch-legend": "გაფართოებული ძიება",
        "powersearch-ns": "ძიება სახელთა სივრცეებში:",
        "listusers": "მომხმარებლების სია",
        "listusers-editsonly": "აჩვენთ მხოლოდ ის მომხმარებლები, რომლებსაც ერთი შესწორება აქვს გაკეთებული.",
        "listusers-creationsort": "დაალაგეთ შექმნის თარიღის მიხედვით.",
+       "listusers-desc": "კლების მიხედვით დალაგება",
        "usereditcount": "$1 რედაქტირება",
        "usercreated": "{{GENDER:$3|შექმნილია}} $2-ზე $1-ში",
        "newpages": "ახალი გვერდები",
index b61b250..4a01173 100644 (file)
        "tooltip-recreate": "Бет жойылғанына қарамастан қайта бастау",
        "tooltip-upload": "Жүктеуді бастау",
        "tooltip-rollback": "\"Шегіндіру\" сілтемесін бір рет басу арқылы соңға редактордың барлық қатар өңдемелерін өшіру",
+       "tooltip-undo": "«Жоққа шығару» сілтемесін бассаңыз бұл өңдеме болдырылмайды және өңдеу пішіні қарап шығу режимінде ашылады. Ол өңдеу түйіндемесіне себебін қосуға мүмкіндік береді.",
        "tooltip-preferences-save": "Бапталымдарыңызды сақтау",
        "tooltip-summary": "Қысқаша түйіндемесін енгізіңіз",
        "interlanguage-link-title-nonlang": "$1 – $2",
index f7236da..a51a615 100644 (file)
        "index-category": "بلگيا سيائه دار",
        "noindex-category": "بلگيا بی سيائه",
        "broken-file-category": "بلگیایی که هوم پیوند فایلیا اشکسه دارن",
+       "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "دباره",
        "article": "محتوا بلگه",
        "newwindow": "(نيمدری  تازه وا کو)",
        "versionrequired": "یه نسقه د نیازمنیا ویکی رسانه\n$1",
        "versionrequiredtext": "نسقه $1 ویکی مدیا سی وه کار بستن د ای بلگه لازم هئی .\nوه نه بوینیت [[ویجه:نسقه|نسقه بلگه]].",
        "ok": "خوئه",
+       "pagetitle": "$1 - {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "بازيافته د\"$1\"",
        "youhavenewmessages": "شما داريت $1($2)",
        "youhavenewmessagesfromusers": "{{جمی:$4|شما }} $1 د {{جمی:$3|کارور هنی|$3 کاروریا}}داریتو($2).",
        "site-atom-feed": "خور حون Atom سی $1",
        "page-rss-feed": "خورحو RSS سی «$1»",
        "page-atom-feed": "خور حون Atom سی $1",
+       "feed-atom": "اتم",
+       "feed-rss": "آر اس اس",
        "red-link-title": "$1(بلگه وجود ناره)",
        "sort-descending": "كم بيئن منظم",
        "sort-ascending": "زياد بيئن منظم",
        "nocookiesnew": "حساو کاروری راس بی،اما شما وامئن نیامایئته.{{نوم مالگه}} د کوکیا سی اومائن د سیستم کاروریا استفاده می که.کوکیا شما د کار افتائه.لطفن وا کارشو بونیت، اوسه وا نوم کاروری تازه و پسورد هنی بیایت وا مئن.",
        "nocookieslogin": "{{نوم مالگه}} د کوکیا سی وامئن اومائن کاروریا استفاده می که. کوکیا شما د کار افتائه.\nلطف بکید د کارشو بونیت و دوواره تلاش بکید.",
        "nocookiesfornew": "حساو کاروری راس نبیه، سی یه ایما نتونیم سرچشمه ونه مئکم بکیم.\nمطمئن بوئیت که کوکیا فعال بینه، ای بلگه نه د نو سوار بکید و د نو تلاش بکید.",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "شما یه گل نوم کاروری خو ناریت",
        "loginsuccesstitle": "اومائن د سيستم موفق بی",
        "loginsuccess": "شما ایسه وارد بیته {{SITENAME}} د دعنوان \"$1\".'",
        "user-mail-no-body": "سی کل کردن ایمیل وا مینونه حالی یا کؤچک بیئن سی دلیل غیر علقمنی تلاش بکید.",
        "changepassword": "پاسورد نه آلشت بكيت",
        "resetpass_announce": "سی تموم کردن وا مین اومائن، شما باید یه گل پاسورد هنی وارد بکیتو.",
+       "resetpass_text": "<!-- یه گل نیسسه ایچه اضاف بکیت -->",
        "resetpass_header": "پاسورد حساوتونه آلشت بکید",
        "oldpassword": "پاسورد قدیمی:",
        "newpassword": "پاسورد تازه:",
        "headline_tip": "قدم 2 خط سر ون",
        "nowiki_sample": "د ایچه یه گل متن بی شلک وارد بکید",
        "nowiki_tip": "شلک ویکی نه ندید بگر",
+       "image_sample": "Example.jpg",
        "image_tip": "جانیا محاط بيه",
+       "media_sample": "Example.ogg",
        "media_tip": "فایل هوم پیوند",
        "sig_tip": "امضا شما و برچسو وخت",
        "hr_tip": "خط افق ونه(سوا سوا دش استفاده کو)",
        "template-protected": "(حمايت بيه)",
        "template-semiprotected": "(نيم-حفاظت بيه)",
        "hiddencategories": "ای بلگه يه اندوم د{{PLURAL:$1|1 hidden category|$1 hidden categories}}: هئ",
+       "edittools-upload": "-",
        "nocreatetext": "{{نوم مالگه}} سی راس کردن بلگه یا تازه محدود بیه.\nشما تونید روئیت وادما و بلگه ای که هئیش ویرایشت بکید ، یا [[ویجه:وامین اومائن کاریار|بیایت وامین یا یه گل حساو بسازیت]].",
        "nocreate-loggedin": "شما حق ناریت  که بلگه یا تازه نه راس بکید.",
        "sectioneditnotsupported-title": "ویرایشت بخش حمایت نبوئه",
        "mergehistory-comment": " [[:$1]]وا[[:$2]] یکی بیه:$3",
        "mergehistory-same-destination": "سرچشمه و بلگه یا مقصد نبوئه یکی بوئن",
        "mergehistory-reason": "دليل:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "سریک سازی پهرستنومه",
        "pagemerge-logentry": " [[$1]] وا [[$2]] سریک سازی بی (وانیریا که د $3 فره تر هئن)",
        "revertmerge": "بی لوئه",
        "youremail": "ايميل:",
        "username": "{{جنس:$1|نوم کاروری}}:",
        "prefs-memberingroups": "{{جنس:$2|اندوم}}  {{جمی:$1|گرویا|گرویا}}:",
+       "prefs-memberingroups-type": "$1",
        "prefs-registration": "موقع ثوت نام:",
+       "prefs-registration-date-time": "$1",
        "yourrealname": "نوم راستكی:",
        "yourlanguage": "زون:",
        "yourvariant": "محتوا آلشتگر زون:",
        "saveusergroups": "اماییه کردن گرویا کاریاری",
        "userrights-groupsmember": "اندوم:",
        "userrights-groupsmember-auto": "اندوم ضمنی:",
+       "userrights-groupsmember-type": "$1",
        "userrights-groups-help": "شما می تونیت دسه یای که ای کاریار ها دشو آلشت بئیتو:\n* جعوه نشودار وه ای مئنیه که کاریار ها د او دسه.\n* جعوه بی نشون وه ای مئنیه که کاریار د او دسه نئ.\n* نشون* د ای مئنیه که ار شما او دسه نه اضاف بکیتو د نهاتر نموئه ؤردارینش یا برعسگش.",
        "userrights-reason": "دليل:",
        "userrights-no-interwiki": "شما سی ویرایشت حقوق کارور د ویکی یا هنی دسرسی ناریت.",
        "userrights-notallowed": "شما سی اضاف کردن  حقوق کارور یا ورداشتنش دسرسی ناریت.",
        "userrights-changeable-col": "گرویایی که شما تونیت ویرایشت بکید",
        "userrights-unchangeable-col": "گرویایی که شما نتونیت ویرایشت بکید",
+       "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "تعارض دسرسیا کاریاری! لطف بکیت یه گل وارسی انجوم بئیت و آلشتانه پشت راس بکیت.",
        "userrights-removed-self": "شما د خوئی حقوق خوتونه ؤرداشتیته، چی یه که مثلا شما تر نمی تونیت وه ای بلگه دسرسی داشتویت.",
        "group": "گرو",
        "recentchanges-label-plusminus": "انازه بلگه وه شمار ای بایتیا آلشت کرده.",
        "recentchanges-legend-heading": "'''میراث:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنو بوینیت [[ویجه:بلگیا تازه|نوم گه بلگیا تازه]])",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "د هار آلشتیا د $2 هیئن(د بال د $1 نشون دئه بیه)",
        "rclistfrom": "آلشتیا تازه ایی که وا $3 $2 شرو بیه نشونش بئه",
        "rcshowhideminor": "ويرايشتيا کؤچک $1",
        "minoreditletter": "م",
        "newpageletter": "ن",
        "boteditletter": "ب",
+       "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 دینه {{جمی:$1|کاریار|کاریاریا}}]",
        "rc_categories": "دسه یا نه محدود کو(وا \"|\" جگا بوئن",
        "rc_categories_any": "هرکوم",
+       "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{جمی:$1|بایت|بایتیا}} نها آلشت",
        "newsectionsummary": "/* $1 */ بخش تازه",
        "rc-enhanced-expand": "جزيات نشون بيئه",
        "statistics-edits": "ویرایشت بلگه یا د گاتی که  {{SITENAME}} دروس بیه",
        "statistics-edits-average": "میانگین ویرایشت یا سی هر بلگه",
        "statistics-views-total": "همه نه بوینیت",
+       "statistics-views-total-desc": "دیئن بلگه یایی که وجود نارن و بلگه یا ویجه د ور گرته نئ",
        "statistics-views-peredit": "هر ویرایشت نه بوینیت",
        "statistics-users": "ثوت نام بیه [[ویجه:نوم گه کاریاریا|کاریاریا]]",
        "statistics-users-active": "کاروریا کارکو",
+       "statistics-users-active-desc": "کاریاریایی که د {{PLURAL:$1|رو|$1 رو}} دماتر کنشتگر بینه",
        "statistics-mostpopular": "بلگه یایی که بیشتر دیئه بینه",
        "pageswithprop": "بلگه یایی که خاصیت صفحه ها دشو",
        "pageswithprop-legend": "بلگه یایی که خاصیت صفحه ها دشو",
+       "pageswithprop-text": "ای بلگه نومگه ای یه د بلگه یایی که یه گل ویجه گی د یه بلگه خاص نه وه کار می بنن.",
        "pageswithprop-prop": "نوم خاصیت:",
        "pageswithprop-submit": "رو",
+       "pageswithprop-prophidden-long": "جزییات قام بیه یه گل نیسه دراز($1)",
+       "pageswithprop-prophidden-binary": "جزییات انازه قام بیه دوتا دوتایی ($1)",
        "doubleredirects": "واگردونیا دوتایی",
+       "doubleredirectstext": "ای بلگه نومگه ای د بلگه واگردونی نه نشو می یه که وه یه گل بلگه واگردونی هنی هشاره می کن.\nهر خط مینونه دار هوم پیوندیا واگردونی اول و دویم و همچنو مقصد واگردونی دویمه، که معمولند بلگه مقصد راستکی یه و اولین واگردونی واس د وه هشاره بکه.\nچیا <del>خط حرده</del> دروس بینه.",
        "double-redirect-fixed-move": "[[$1]]جا وه جا بیه .\nوه خودکارونه وه روز بیه و ایسه وه د[[$2]] واگردونی بیه.",
+       "double-redirect-fixed-maintenance": "برطرف بیین خودانجوم دوتای د [[$1]] وه [[$2]] د مسیر واداشت.",
        "double-redirect-fixer": "تعمیر کننه واگردونی",
        "brokenredirects": "واگردونیا بی سرانجوم",
        "brokenredirectstext": "واگردونیا نهاتر د بلگه یایی که وجود نارن هوم پیوند بینه.",
        "ntransclusions": "$1 {{جمی:$1|بلگه|بلگيا}} استفاده بیه",
        "specialpage-empty": "نتیجه ای د ای گزارشت نئ.",
        "lonelypages": "بلگه یا تک منه",
+       "lonelypagestext": "د بلگه یا هاری هیچ بلگه هنی د {{SITENAME}} هوم پیوند نبیه و د هیچ بلگه هنی مین چین نبیه.",
        "uncategorizedpages": "بلگه یا دسه بنی نبیه",
        "uncategorizedcategories": "دسه یا دسه بنی نبیه",
        "uncategorizedimages": "فایلیا دسه بنی نبیه",
        "wantedpages": "بلگه یا حاستنی",
        "wantedpages-badtitle": "سرون نامعتور د کومله نتیجه یا:$1",
        "wantedfiles": "فایلیا حاستنی",
+       "wantedfiletext-cat": "جانیایا هاری وه کار گرته بوئن ولی وجود نارن. همچنو شایت جانیایا وه دری وا یه که ایچه هیئشون نومگه کاری بینه.هر گرینج مثبت دورویی  <del>خط مئوره.</del> به اضافه یه، بلگه یایی که که جانیایا بی وجودن نه د خوشو دارن د [[:$1]] نومگه کاری بینه.",
+       "wantedfiletext-cat-noforeign": "جانیایا هاری وه کار گرته بوئن ولی نیئشو. اضافه وه یه بلگه یایی که جانیایا نادیار د خوشو دارن هان د [[:$1]].",
        "wantedfiletext-nocat-noforeign": "جانیایا هاری وه کار گرته بوئن ولی نیئشو.",
        "wantedtemplates": "قالویا حاستنی",
        "mostlinked": "بلگه یا که بیشتر هوم پیوند بینه",
        "shortpages": "بلگه یا کؤچک",
        "longpages": "بلگه یا گپ",
        "deadendpages": "بلگه یا نابود بیئنی",
+       "deadendpagestext": "بلگه یا هاری وه هیچ بلگه هنی د {{SITENAME}} هوم پیوند نبینه.",
        "protectedpages": "بلگه یا حفاظت بيه",
+       "protectedpages-indef": "فقط پر و پیم بیین یا بی زمون",
        "protectedpages-cascade": "فقط پر و پیم بیین تافنمایی",
        "protectedpages-noredirect": "واگردونیا قام بیه",
+       "protectedpagesempty": "د ایسنی هیچ بلگه ای پر و پیم نبیه.",
        "protectedpages-timestamp": "سردیس گات",
        "protectedpages-page": "بلگه",
        "protectedpages-expiry": "تموم بیه آ",
        "protectedpages-performer": "کارور حفاظت بیه",
+       "protectedpages-params": "پارامتریا پر و پیم کردن",
        "protectedpages-reason": "دلیل",
        "protectedpages-unknown-timestamp": "ناشناس",
        "protectedpages-unknown-performer": "کارور ناشناس",
        "protectedtitles": "سرونیا پر و پیم بیه",
+       "protectedtitlesempty": "د ایسنی هیچ سرونی وا ای پارامتریا پر و پیم نبیه",
        "listusers": "نوم گه کارور",
        "listusers-editsonly": "فقط کاروریایی که ویرایشت می کن نشو بیه",
        "listusers-creationsort": "سرجاخودگری د اساس گات دروس بیین",
        "ancientpages": "بلگه یا نهاتر",
        "move": "جاوه جا بوئيت",
        "movethispage": "ای بگله نه جا وه جا كو",
+       "unusedcategoriestext": "ای دسه یا هیئشو ولی د ایسنی هیچ گوتار یا دسه ای ونونه وه کار نمی بنه.",
        "notargettitle": "رسینه جایی نئ",
+       "notargettext": "شما بلگه یا کاریاری مقصدی سی انجوم دئن ای کنشت ریش انتخاو نکردیته.",
        "nopagetitle": "چنی بلگه ای نیئش",
+       "nopagetext": "بلگه حاستنی که شما دیاری کردیته وجود ناره.",
        "pager-newer-n": "{{جمی:$1|وانها تر 1وانها تر $1}}",
        "pager-older-n": "{{جمی:$1|گپسالتر 1|گپسالتر $1}}",
        "suppress": "پائیئن",
+       "querypage-disabled": "ای بلگه ویجه سی دلیلیا انجومکاری ناکشتگر بیه.",
        "booksources": "سرچشمه يل كتاو",
        "booksources-search-legend": "پی جوری سی سرچشمه یا کتاو",
+       "booksources-isbn": "آی اس بی ان:",
        "booksources-go": "رو",
        "specialloguserlabel": "انجومکار:",
        "speciallogtitlelabel": "حاستنی(موضوع یا کاریار):",
        "log": "نیسنن رخ ونیا",
        "all-logs-page": "همه پهرستنومه یا عمومی",
        "logempty": "او چی ای که شما میهایت د پهرستنومه نیئش.",
+       "log-title-wildcard": "بلگه یایی نه پی جوری کو که وا ای سرون شرو موئن",
        "showhideselectedlogentries": "آلشت دئن ورتیه گر پهرستنومه یا انتخاو بیه",
        "allpages": "همه بلگيا",
        "nextpage": "بلگه نهایی($1)",
        "allpagesbadtitle": "عنوان بلگه حاسته بیه معتور نی،یا  یه گل مئن زونی یا مئن ویکی عنوان غلطه.\nیه شایت شومل یکی با یا بیشتر کاراکتریا نبوئه که سی ای موضوعیا استفاده بوئن",
        "allpages-bad-ns": "{{نوم دیارگه}} د ای نوم جا نئ \"$1\".",
        "allpages-hide-redirects": "واگردونیا قام بیه",
+       "cachedspecial-viewing-cached-ttl": "شما د حال و بار دیئن یه گل نسقه ای د ای بلگه که ها د مینجاگیر هیئت که شایت سی $1 دماتر با.",
        "cachedspecial-refresh-now": "دیئن آخری.",
        "categories": "دسه يا",
        "categoriesfrom": "دسه یایی که د شرو بینه نشو بیه:",
        "listusers-noresult": "هیچ کاروری پیدا نبی",
        "listusers-blocked": "(قلف بيه)",
        "activeusers": "نوم گه کاروریا کارکو",
+       "activeusers-count": "$1 {{PLURAL:$1|کنشت|کنشت}} در {{PLURAL:$3|رو|$3 رو}} دماتر",
        "activeusers-from": "کاریاریایی که د شرو بینه نشو بیه:",
        "activeusers-hidebots": "بوتیا قام کو",
        "activeusers-hidesysops": "دیوون داریا نه قام کو",
        "listgrouprights-rights": "حقوقیا",
        "listgrouprights-helppage": "هومیاری:حقوق گرو",
        "listgrouprights-members": "(نوم گه اندومیا)",
+       "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
+       "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
        "listgrouprights-addgroup": "{{جمی:$2|گرویا|گرویا}} اضاف بکیتو: $1",
        "listgrouprights-removegroup": "{{جمی:$2|گرویا|گرویا}} ورداریت: $1",
        "listgrouprights-addgroup-all": "همه گرویا نه اضاف کو",
        "listgrouprights-removegroup-self": "{{جمی:$2|گرویا|گرویا}} نه د حساو ورداریت: $1",
        "listgrouprights-addgroup-self-all": "همه گرویا نه د حساو خوشو اضاف بکیت",
        "listgrouprights-removegroup-self-all": "همه گرویا نه د حساو خوشو ورداریت",
+       "listgrouprights-namespaceprotection-header": "محدودیت نومجا",
        "listgrouprights-namespaceprotection-namespace": "نوم جا",
+       "listgrouprights-namespaceprotection-restrictedto": "دسرسیا مجاز کاریار سی ویرایشت",
        "trackingcategories": "دما گری دسه یا",
        "trackingcategories-msg": "دماگری دسه",
        "trackingcategories-name": "نوم پیغوم",
        "emailpage": "ایمیل کارور",
        "defemailsubject": "{{نوم سیل جا}} ایمیل د کارور \"$1\"",
        "usermaildisabled": "ایمیل کارور د کار افتائه",
+       "usermaildisabledtext": "شما نمی تونیت سی کاریار هنی د ای ویکی انجومانامه کل بکیت",
        "noemailtitle": "هیچ نشونی ایمیلی نئ",
+       "noemailtext": "ای کاریار تیرنشون انجومانامه خووی ناره.",
+       "nowikiemailtext": "ای کاریار میها که د کاریاریا هنی انجومانامه نگره.",
+       "emailnotarget": "نوم کاریاری که وجود ناره یا سی گیرنه نامعتوره",
        "emailtarget": "یه گل نوم کاریاری سی پذریشتگر وارد بکیت",
        "emailusername": "نوم كاروری:",
        "emailusernamesubmit": "دئن",
+       "email-legend": "کل کردن یه گل انجومانامه سی یه گل کاریار هنی د {{SITENAME}}",
        "emailfrom": "د:",
        "emailto": "سی:",
        "emailsubject": "سرون:",
        "emailsenttext": "پیغوم ایمیلی تو کل بیه.",
        "usermessage-summary": "رئتن د سامونه پیغوم",
        "usermessage-editor": "پیغوم فرسن سیستم",
+       "usermessage-template": "ویکی وارسگر:پیغوم کاریار",
        "watchlist": "سیل برگ",
        "mywatchlist": "سیل برگ",
        "watchlistfor2": "سي $1 $2",
        "watchlistanontext": "لطفن بیایت وامین و ویرایشتیا نه د سیل برگتو سیل بکیت.",
        "watchnologin": "وارد نبیه",
        "addwatch": "اضاف کردن د سیل برگ",
+       "addedwatchtext-short": "بلگه \"$1\" وه سیل برگ شما اضاف بیه.",
        "removewatch": "جا وه جا کردن د سیل برگ",
        "removedwatchtext": "بلگه\"[[:$1]]\" د [[Special:سیل برگ|سیل برگ خوتو]] جا وه جا بیه.",
        "removedwatchtext-short": "بلگه \"$1\" د سیل برگ جا وه جا بیه.",
        "watchlist-details": "{{جمی:$1|$1 بلگه|$1 بلگیا}} د سیل برگتو هیش بلگه قسه کردن نی.",
        "wlheader-enotif": "وارسیاری ایمیل فعال بیه.",
        "wlheader-showupdated": "بلگه یایی که د آخرین کرتی که شما دشو دیئن کردیته آلشت بینه د <strong>توپر</strong>نشون دئه بینه",
+       "wlnote": "د هار {{PLURAL:$1|آلشت|<strong>$1</strong> آلشتی}} که د {{PLURAL:$2|ساعت|<strong>$2</strong> ساعت}} دماتر انجوم بیه هیئش، ویرگار آخرین واجوری انجام شده موجود است، ویرگار آخری واجوری: $3، $4",
        "wlshowlast": "آخرین$1 ساعتیا $2و روزیا $3 نشو بیئه",
        "watchlist-options": "گزینیا سیل برگ",
        "watching": "د حال دیئن...",
        "enotif_lastvisited": "همه آلشتیا$1 د اوسه که شما د آخرین بار دیئته بوینیت.",
        "enotif_lastdiff": "سی دیئن ای آلشتیا $1 نه سیل بکیت.",
        "enotif_anon_editor": "کارو ناشناس$1",
+       "created": "دروس بیه",
+       "changed": "آلشت بیه",
        "deletepage": "پاک کردن بلگه",
        "confirm": "مئكم كردن",
        "excontent": "مینونه :\"$1\" بی",
        "actioncomplete": "عملكرد كامل بيه",
        "actionfailed": "عملكرد شكست حرده",
        "dellogpage": "لاگ پاك كردن",
+       "dellogpagetext": "نومگه هاری یه گل نومگه د آخری چیا پاکسا بیه هئ.",
        "deletionlog": "پهرستنومه پاک بیئن",
+       "reverted": "لرسه د نزیکترین وانئری",
        "deletecomment": "دليل:",
        "deleteotherreason": "دليليا هنی:",
        "deletereasonotherlist": "دلیل هنی",
        "deletereason-dropdown": "* دلیلیا پاکسا کردن رسم بیه\n** اسپم\n** خراوکاری\n** رعایت نبین کپی رایت\n** درحاست نیسنه\n** نهاورگشت شکست حرده",
        "delete-edit-reasonlist": "دلیلیا پاکسا کردنه نه ویرایشت بکید",
+       "deleteprotected": "شما نمی تونیت ای بلگه نه پاکسا بکیت سی یه که وه پر و پیم بیه.",
        "rollback": "چواشه کردن ویرایشتیا",
        "rollback_short": "چواشه کردن",
        "rollbacklink": "ورگشتن",
+       "rollbacklinkcount": "چواشه کردن $1 {{PLURAL:$1|ویرایشت|ویرایشتیا}}",
+       "rollbacklinkcount-morethan": "چواشه کردن بیشتر د$1 {{PLURAL:$1|ویرایشت|ویرایشتیا}}",
        "rollbackfailed": "چواشه کردن د خوئی انجوم نبی",
        "editcomment": "ویرایشت چکشه وه: \"''$1''\" بی.",
        "sessionfailure-title": "شکست حردن نشینگه",
        "protect_expiry_invalid": "گات تموم بیین نامعتوره.",
        "protect_expiry_old": "گات تموم بیین مال دماتره.",
        "protect-default": "همه کاروریا اجازه دارن",
+       "protect-summary-desc": "[$1=$2] ($3)",
+       "protect-summary-cascade": "د حال و بال تافنمایی",
+       "protect-expiring": "گات تموم بیین $1 (یو تی سی)",
+       "protect-expiring-local": "گات تموم بیین $1",
+       "protect-expiry-indefinite": "بی زمون",
        "protect-othertime": "وخت هنی:",
        "protect-othertime-op": "گات هنی",
+       "protect-otherreason": "دلیل اضافی/هنی:",
        "protect-otherreason-op": "دلیل هنی",
+       "protect-edit-reasonlist": "دلیلا پر و پیم بیین ویرایشت",
        "protect-expiry-options": "1 ساعت:1 ساعت,1 روز:1 روز,1 هفته:1 هفته,2 هفته:2 هفته,1 ما:1 ما,3 ما:3 ما,6 ما:6 ما,1 سال:1 سال,بی حساو:بی حساو",
        "restriction-type": "دسرسی:",
+       "restriction-level": "ریتراز محدودیت:",
        "minimum-size": "انازه کمترونه",
        "maximum-size": "انازه بیشترونه",
        "pagesize": "(بایتیا)",
        "undeleteviewlink": "ديئن",
        "undeleteinvert": "انتخاو برعسك بوئه",
        "undeletecomment": "دليل:",
+       "undeletedfiles": "{{PLURAL:$1|1 جانیا|$1 جانیایا}} د نو زنه بیه",
        "cannotundelete": "زنه کردن انجوم نبی:$1",
        "undelete-search-title": "بلگه یا پاکسا بیه نه پی جوری کو",
        "undelete-search-box": "پی جوری بلگه یا پاکسا بیه",
        "undelete-search-submit": "پی جوری",
        "undelete-error-short": "خطا پاک نبیئن جانیا:$1",
        "undelete-show-file-submit": "هری",
+       "undelete-revision-row": "$1 $2 ($3) $4 . . $5 $6 $7 $8 $9",
        "namespace": "نوم جا:",
        "invert": "انتخاو برعسك بوئه",
        "blanknamespace": "اصلی",
        "blockip": "نهاگری{{GENDER:$1|کاریار}}",
        "blockip-legend": "نهاگری کاریار",
        "ipaddressorusername": "نوم نشون آی پی يا نوم كاروری:",
+       "ipbexpiry": "تموم بين:",
        "ipbreason": "دليل:",
+       "ipbcreateaccount": "نهاگری دروس کردن حساو",
        "ipbemailban": "نهاگرتن کاریار د کل کردن انجومانامه",
+       "ipbsubmit": "نهاگری ای کاریار",
        "ipbother": "وخت هنی:",
        "ipboptions": "2 ساعتیا:2 ساعت,1 رو:1 رو,3 روزا:3 رو,1 هفته:1 هفته,2 هفته یا:2 هفته,1 ما:1 ما,3 ما:3 میا,6 ما:6 مایا,1 سال:1سال,بی حساو:بی حساو",
        "ipbhidename": "نوم کاروری نه سی ویرایشت یا و نوم گه یا قام کو",
        "ipb-confirm": "پشت راس کردن قلف",
        "badipaddress": "تیرنشون نامعتور آی پی",
        "blockipsuccesssub": "قلف کردن د خوئی انجوم بی",
+       "ipb-edit-dropdown": "ویرایشت دلیلیا نهاگرتن",
        "unblockip": "کارور منع نبیه",
        "ipusubmit": "ای قلف نه ؤردار",
        "blocklist": "كاروريا منع بيه",
        "blocklist-reason": "دلیل",
        "ipblocklist-submit": "پی جوری",
        "ipblocklist-localblock": "نهاگری ولات نشینی",
+       "ipblocklist-otherblocks": "هنی{{PLURAL:$1|نهاگرتن|نهاگرتنیا}}",
+       "infiniteblock": "بی زمون",
+       "emailblock": "انجومانامه ناکشتگر بیه",
        "blocklist-nousertalk": "نبوئه بلگه چک چنه خوتونه ویرایشت بکید",
        "ipblocklist-empty": "جاگه نوم گه حالیه",
        "blocklink": "بسته بوئه",
        "blocklogpage": "قلف",
        "blocklogentry": " [[$1]] وا یه گل وخت تموم بیئن $2 و $3  قلف بیه",
        "block-log-flags-nocreate": "حساو راس کردن عاجز بیه.",
+       "block-log-flags-noemail": "انجومانامه ناکشتگر بیه",
        "block-log-flags-nousertalk": "نبوئه بلگه چک چنه خوتونه ویرایشت بکید",
+       "block-log-flags-hiddenname": "نوم کاروری قام بیه",
+       "ipb_already_blocked": "\"$1\" ایسه نهاگری بیه.",
+       "ipb-otherblocks-header": "هنی{{PLURAL:$1|نهاگرتن|نهاگرتنیا}}",
        "ip_range_invalid": "پوشگر نامعتور آی پی",
        "proxyblocker": "قلف کننه پروکسی",
+       "sorbs": "دی ان اس بی ال",
        "lockdb": "قلف کردن رسینه گا",
        "unlockdb": "رسینه گا قلف نبیه",
        "unlockconfirm": "هره، مه واقعند میهام که رسینه گا وا بوئه.",
        "movearticle": "جا وه جا کردن بلگه:",
        "movenotallowed": "شما وه جا وه جا کردن بلگه دسرسی ناریت",
        "movenotallowedfile": "شما وه جا وه جا کردن جانیایا دسرسی ناریت",
+       "newtitle": "سی سرون هنی:",
        "movepagebtn": "بلگه جا وه جا کو",
        "pagemovedsub": "د خوئی جا وه جا بیه",
        "movepage-moved-redirect": "یه گل واگردونی دروس بیه.",
        "movereason": "دلیل:",
        "revertmove": "لرستن",
        "delete_and_move": "پاکسا و جا وه جا بوئه",
+       "delete_and_move_confirm": "هری بلگه نه پاکسا کو",
+       "immobile-source-page": "ای بلگه جا وه جا کردنی نئ.",
        "export": "وه صحرا ديئن بلگيا",
+       "exportall": "وه صحرا ديئن همه بلگيا",
+       "export-submit": "وه در ديئن",
        "export-addcat": "اضاف کو",
        "export-addns": "اضاف كو",
        "export-download": "ذخیره کردن جانیا",
        "allmessagesname": "نوم",
        "allmessagesdefault": "سفارشت متنی پيش فرض",
        "allmessages-filter-legend": "فیلتر",
+       "allmessages-filter-unmodified": "آلشت نبیه",
        "allmessages-filter-all": "همه",
        "allmessages-filter-modified": "آلشت بیه",
        "allmessages-prefix": "فیلتر بیه وا نهاون:",
        "thumbnail-more": "گپ كردن",
        "filemissing": "گم بیئن جانیا",
        "thumbnail_error": "خطا د راس بیئن بن کلئکی:$1",
+       "import": "وامین اوردن بلگه یا",
+       "import-interwiki-sourcewiki": "سرچشمه ویکی:",
+       "import-interwiki-sourcepage": "بلگه سرچشمه:",
+       "import-interwiki-submit": "وامین اوردن",
+       "import-interwiki-namespace": "نومجا مقصد:",
        "import-upload-filename": "نوم جانیا:",
        "import-comment": "ویر و باور:",
+       "importstart": "د حال و بار وامین اوردن",
+       "import-revision-count": "$1 {{جمی:$1|وانئری|وانئریا}}",
+       "importnopages": "هیچ بلگه ای وامین نیومائه.",
+       "importfailed": "وامین اوردن شکست حرده: <nowiki>$1</nowiki>",
        "importcantopen": "نبوئه جانیا دئه بیه نه وا بکید",
+       "importbadinterwiki": "هوم پیوند مینجاویکی گن",
+       "importsuccess": "وامین اوردن تموم بی!",
        "importnofile": "هیچ جانیا دئه بیه ای سوار نبیه.",
+       "import-noarticle": "هیچ بلگه ای سی وامین اوردن نئ!",
        "import-upload": "سوار کرد دونسمنیا ایکس ام ال",
        "import-token-mismatch": "کمبود د دونسمنیا نشینگه.\nلطفن هنی کوششت بکید.",
        "importlogpage": "پهرستنومه دئن",
+       "javascripttest": "ازمایشت کردن جاوا اسکریپت",
        "tooltip-pt-userpage": "بلگه كارورتو",
        "tooltip-pt-mytalk": "بلگه قسه كردن شما",
        "tooltip-pt-preferences": "اولويتيا شما",
        "tooltip-t-permalink": "چسب ون هميشئی د دوواره بينی ای بلگه",
        "tooltip-ca-nstab-main": "ديئن محتوا بلگه",
        "tooltip-ca-nstab-user": "ديئن بلگه كارور",
+       "tooltip-ca-nstab-media": "دیئن بلگه وارسگر",
        "tooltip-ca-nstab-special": "اي بلگه ويجه يه، شما نتونيت خود اي بلگه نه ويرايشت بكيد",
        "tooltip-ca-nstab-project": "ديئن بلگه پروجه",
        "tooltip-ca-nstab-image": "ديئن بلگه فايل",
+       "tooltip-ca-nstab-mediawiki": "دیئن پیغوم سامونه",
        "tooltip-ca-nstab-template": "ديئن قالو",
+       "tooltip-ca-nstab-help": "ديئن بلگه هومیاری",
        "tooltip-ca-nstab-category": "ديئن بلگه دسه بنی",
        "tooltip-minoredit": "یه نه د عنوان حیرده ویرایشت ثوت کو",
        "tooltip-save": "آلشتياتونه اماییه بكيد",
        "tooltip-diff": "آلشتیا نه که شما د ای متن راس کردیته نشو بیئه",
        "tooltip-compareselectedversions": "فرخیا مینجا دو تا د دو بار دیئن ای بلگه نه بوینیت",
        "tooltip-watch": "ای بلگه نه د سیل برگتو اضاف بکید",
+       "tooltip-watchlistedit-raw-submit": "وه هنگوم سازی سیل برگ",
        "tooltip-upload": "شرو د سوار کرد",
        "tooltip-rollback": "\"ورگشتن\" لرستن د حالت اول  سی ای بلگه  که سی  يه كه هومياری  نيايی اصلاح بيه وا يه پورنسن",
        "tooltip-undo": "انجوم نگرتن ای ویرایشت ورگن و همه فرمیا ویرایشت تانه که حالت پیش سیل واکو.یه اجازه میئه سی اضاف کردن یه دلیل د چکسته.",
        "tooltip-summary": "يه چكسته كؤچك وارد بكيد",
        "interlanguage-link-title": "$1-$2",
+       "interlanguage-link-title-nonlang": "$1 – $2",
        "anonymous": "ناشناس {{جمی:$1|کارور|کاروریا}}  {{سیل جا}}",
        "anonuser": "{{سیل جا}}  کارور ناشناس $1",
+       "others": "دیه رون",
        "siteusers": "{{نوم سیل جا}} {{جمی:$2|کارور|کاروریا}} $1",
+       "creditspage": "اعتوار بلگه",
+       "pageinfo-title": "دونسمنیا سی \"$1\"",
+       "pageinfo-header-basic": "دونسمنیا پایه",
+       "pageinfo-header-edits": "ویرایشت ویرگار",
+       "pageinfo-header-restrictions": "پر و پیم کردن بلگه",
+       "pageinfo-header-properties": "چیا بلگه",
+       "pageinfo-length": "انازه بلگه(وه بایت)",
+       "pageinfo-article-id": "نوم دیار کن بلگه",
        "pageinfo-language": "بلگه مینونه زون",
        "pageinfo-content-model": "شلگ مینونه بلگه",
+       "pageinfo-views": "شماره دیئن یا",
+       "pageinfo-watchers": "شماره سیل کننه بلگه یا",
        "pageinfo-redirects-name": "شماره واگردونیا ای بلگه",
+       "pageinfo-redirects-value": "$1",
+       "pageinfo-firstuser": "بلگه راس کن",
+       "pageinfo-firsttime": "گات دروس بیین بلگه",
+       "pageinfo-lastuser": "آخری ویرایشتگر",
+       "pageinfo-lasttime": "گات آخری ویرایشت",
+       "pageinfo-edits": "شماره همه ویرایشتیا",
+       "pageinfo-toolboxlink": "دونسمنیا بلگه",
        "pageinfo-redirectsto": "واگردونی سی",
+       "pageinfo-redirectsto-info": "دونسمنیا",
+       "pageinfo-contentpage": "اشمارده بیه وه عنوان مینونه بلگه",
+       "pageinfo-contentpage-yes": "هری",
+       "pageinfo-protect-cascading": "پر و پیم بیین تافنمایی د ایچه",
+       "pageinfo-protect-cascading-yes": "هری",
+       "pageinfo-protect-cascading-from": "پر و پیم بیین تافنمایی د",
+       "pageinfo-category-info": "دونسمنیا دسه ای",
+       "pageinfo-category-pages": "شماره بلگيا",
+       "pageinfo-category-subcats": "شماره زیر دسه یا",
        "pageinfo-category-files": "شماره جانیایا",
        "patrol-log-page": "پهرستنومه گشتن",
        "filedeleteerror-short": "خطا پاک نبیئن جانیا:$1",
        "previousdiff": "← ويرايشت كۈهنه تر",
        "nextdiff": "ويرايشت تازه تر",
+       "widthheight": "$1 × $2",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|بلگه|بلگه یا}}",
+       "file-info": "انازه جانیا: $1, MIME type: $2",
        "file-info-size": "$1 × $2 پیکسل, انازه فایل: $3, MIME نوع: $4",
+       "file-info-size-pages": "$1 × $2 pixels, انازه جانیا: $3, MIME type: $4, $5 {{PLURAL:$5|بلگه|بلگه یا}}",
        "file-nohires": "عسك ون بالاتري دش ني",
        "svg-long-desc": "اس وی جی فايل.نومنا $1 $2 پيكسل",
        "show-big-image": "فایل اصلی",
+       "show-big-image-size": "$1 × $2 pixels",
+       "file-info-gif-looped": "حلقه دار",
+       "file-info-png-looped": "حلقه دار",
        "file-info-png-repeat": "$1 بازی کرده{{جمی:$1|وخت|وختیا}}",
        "newimages": "عسگدونی جانیایا تازه",
        "newimages-summary": "ای بلگه یا ویجه همه جانیایا سوار بیه نه نشو می ئین.",
+       "newimages-legend": "فیلتر",
        "newimages-label": "نوم جانیا(یا بشقی د وه):",
+       "noimages": "هیچی سی دیئن نئ",
        "ilsubmit": "پی جوری",
+       "bydate": "وا گات",
        "sp-newimages-showfrom": "جانیایا تازه نه که $2 ، $2 شرو بینه نشو بیه",
+       "video-dims": "$1, $2 × $3",
+       "seconds-abbrev": "$1 s",
+       "minutes-abbrev": "$1 دیقه",
+       "hours-abbrev": "$1 ساعت",
+       "days-abbrev": "$1 گات",
+       "seconds": "{{PLURAL:$1|$1 ثانیه|$1 ثانیه یا}}",
+       "minutes": "{{PLURAL:$1|$1 دیقه|$1 دیقه یا}}",
+       "hours": "{{PLURAL:$1|$1 ساعت|$1 ساعت یا}}",
        "days": "{{جمی:$1|1$ روز|$1 روز}}",
+       "weeks": "{{PLURAL:$1|$1 هفته|$1 هفته یا}}",
        "months": "{{جمی:$1|$1 ما|$1 مایا}}",
        "years": "{{جمی:$1|$1 سال|$1 سال}}",
+       "ago": "$1 دماتر",
+       "just-now": "فقط ایسه",
+       "hours-ago": "$1 {{PLURAL:$1|ساعت |ساعتیا}} دماتر",
+       "minutes-ago": "$1 {{PLURAL:$1|دیقه|دیقه یا}} دماتر",
+       "seconds-ago": "$1 {{PLURAL:$1|ثانیه|ثانیه یا}} دماتر",
        "monday-at": "دوشمه د $1",
        "bad_image_list": "دونسمنديانه وه ای شلگ وارد بكيت:\n\nفقط سرخط يایی که وا * شرو بوئن د وير گرته بوئن. اولی چسب ون مئن هر سرخط، باید چسب ونی وه یک عسگ گن با.\nچسب ونيا نيایی د همو سرخط، وه عنوان چيا استثنادار د وير گرته بوئن",
        "metadata": "داديا  فره گپ",
        "metadata-help": "ای فایل شومل دونسمنیا هنی یه.شایت د دیربین رقم ون یا اسکنری که سی راس کردنشو استفاده بیه،وه ایچه اضاف بیه",
        "metadata-fields": "رشته یا گپ دونسمنیا که د ای پیغوم نوم ون بینه شومل بلگه عسگ ن که وختی که جدول گپ دونسمنیا وا بوئه نشون دئیه بوئن.\nچی یا هنی سی یه که پیش فرضن قام بوئن.\n*راست کو\n*مدل\n*دم وخت اصل\n*وخت آشگار\n*اف ان شماره\n*ایزو نرخ من سرعت\n*فوکالنس\n*هنرمن\n*کپی رایت\n*حالت جی پی اس \n*جی پی اس گپ حالت\n*جی پی اس همه حالت",
+       "metadata-langitem": "<strong>$2:</strong> $1",
+       "metadata-langitem-default": "$1",
+       "exif-imagewidth": "پئنا",
+       "exif-imagelength": "بلنگی",
        "exif-planarconfiguration": "سرجایک کردن رسینه",
        "exif-datetime": "آلشت دئن وخت و دمون جانیا",
        "exif-make": "سازنه دیربین",
+       "exif-artist": "نیسنه",
+       "exif-pixelydimension": "پئنا عسگ",
        "exif-usercomment": "ویر و باوریا کارور",
        "exif-relatedsoundfile": "جانیا دنگ دار مرتوط",
        "exif-datetimeoriginal": "دمون و وخت راس بیئن دونسمنیا",
        "exif-filesource": "سرچشمه جانیا",
        "exif-gpstimestamp": "وخت جی پی اس (ساعت اتمی)",
+       "exif-coordinate-format": "$1° $2′ $3″ $4",
        "exif-jpegfilecomment": "ویر و باور فایل پی ان جی",
+       "exif-keywords": "کلیمه یا کلیتی",
        "exif-countrycodecreated": "رازینه سی ولاتی که عسگ د وه گرته بیه",
        "exif-citycreated": "شهری که عسگ دش گرته بیه",
        "exif-countrycodedest": "رازینه سی ولات نمائشت دئه بیه",
        "exif-citydest": "شهر دیار بیه",
+       "exif-source": "سرچشمه",
        "exif-fixtureidentifier": "نوم ثاوت",
+       "exif-writer": "نیسنه",
        "exif-languagecode": "زون",
+       "exif-iimcategory": "دسه",
        "exif-datetimeexpires": "وا نها دش استفاده نبوئه",
+       "exif-datetimereleased": "ول بیه د",
+       "exif-label": "ری دیار",
        "exif-pngfilecomment": "ویر و باور فایل جی پی ان جی",
        "exif-giffilecomment": "ویر و باور فایل جی آی اف",
+       "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
+       "exif-orientation-1": "عادی",
        "exif-componentsconfiguration-0": "نی یش",
        "exif-exposureprogram-1": "دسی",
+       "exif-meteringmode-0": "نادیار",
+       "exif-meteringmode-1": "میانگین",
+       "exif-lightsource-0": "نادیار",
        "exif-lightsource-1": "روشنایی روز",
+       "exif-focalplaneresolutionunit-2": "ائنج",
        "exif-scenecapturetype-3": "چی شو",
+       "exif-gaincontrol-0": "هیش کوم",
+       "exif-contrast-0": "عادی",
+       "exif-contrast-1": "نرم",
+       "exif-contrast-2": "سفت",
+       "exif-saturation-0": "عادی",
+       "exif-sharpness-0": "عادی",
+       "exif-sharpness-1": "نرم",
+       "exif-sharpness-2": "سفت",
+       "exif-subjectdistancerange-0": "نادیار",
+       "exif-subjectdistancerange-1": "گپ",
        "exif-gpsaltitude-above-sealevel": "$1 {{جمی:$1|متر|متریا}} وارؤ د ریتراز دریا",
        "exif-gpsaltitude-below-sealevel": "$1 {{جمی:$1|متر|متریا}} وارؤ د ریتراز دریا",
+       "exif-gpsdestdistance-m": "مایل",
        "exif-gpsdop-good": "خو ($1)",
        "exif-iimcategory-ace": "هنریا، رهزیشت و زیستگه",
+       "exif-iimcategory-lab": "کار",
        "watchlistall2": "همه شو",
        "namespacesall": "همه شو",
        "monthsall": "همه",
        "confirmemail_send": "کل کردن رازینه پشت راس کاری",
+       "recreate": "د نو راس کردن",
+       "confirm_purge_button": "خوئه",
+       "confirm-watch-button": "خوئه",
+       "confirm-watch-top": "ای بلگه نه د سیل برگتو اضاف می کید؟",
+       "confirm-unwatch-button": "خوئه",
+       "confirm-unwatch-top": "ای بلگه نه د سیل برگتو ؤرمیداریت؟",
+       "semicolon-separator": ";&#32;",
+       "comma-separator": ",&#32;",
+       "colon-separator": ":&#32;",
+       "pipe-separator": "&#32;|&#32;",
+       "word-separator": "&#32;",
+       "ellipsis": "...",
+       "percent": "$1%",
+       "parentheses": "($1)",
+       "brackets": "[$1]",
+       "quotation-marks": "\"$1\"",
+       "imgmultipageprev": "بلگه دمايی",
+       "imgmultipagenext": "بلگه نهایی",
        "imgmultigo": "رؤ!",
+       "img-lang-opt": "$2 ($1)",
        "img-lang-default": "(زون پیش زمینه)",
        "img-lang-go": "رو",
+       "table_pager_next": "بلگه نهایی",
+       "table_pager_prev": "بلگه دمايی",
+       "table_pager_first": "سرآسونه",
+       "table_pager_last": "بلگه آخری",
        "table_pager_limit_submit": "رو",
        "autosumm-replace": "مینونه وا \"َ$1\" جاگزین بی",
        "autoredircomment": "بلگه واگردونی بیه سی[[$1]]",
+       "watchlistedit-normal-title": "ویرایشت سیل برگ",
+       "watchlisttools-clear": "پاک کردن سیل برگ",
        "watchlisttools-view": "آلشتیا مرتوط نه بوینیت",
        "watchlisttools-edit": "سیل برگ بوینیتو و ویرایشت بکید",
        "watchlisttools-raw": "سیل برگ نه ردیفی ویرایشت کو",
+       "iranian-calendar-m1": "فروردین",
+       "iranian-calendar-m2": "اردیبهشت",
+       "iranian-calendar-m3": "خرداد",
+       "iranian-calendar-m4": "تیر",
+       "iranian-calendar-m5": "مرداد",
+       "iranian-calendar-m6": "شهریور",
+       "iranian-calendar-m7": "مئر",
+       "iranian-calendar-m8": "آبان",
+       "iranian-calendar-m9": "آذر",
+       "iranian-calendar-m10": "دی",
+       "iranian-calendar-m11": "بئمن",
+       "iranian-calendar-m12": "اسفند",
+       "hijri-calendar-m1": "محرم",
+       "hijri-calendar-m2": "صفر",
+       "hijri-calendar-m3": "ربیع الاول",
+       "hijri-calendar-m4": "رجو",
+       "timezone-utc": "UTC",
        "duplicate-defaultsort": "زنهار کلیت پیش فرض جور بیه $2 تازه ای یا کلید پیش فرض جوربیه $1 رد بیه.",
+       "version": "نسقه",
+       "version-variables": "آلشت ونا",
        "version-antispam": "نهاگرتن هرزنومه",
+       "version-other": "هنی",
        "version-ext-license": "ليسانس",
+       "version-skin-colheader-name": "پوسه",
        "version-ext-colheader-version": "نسقه",
        "version-ext-colheader-license": "ليسانس",
+       "version-ext-colheader-description": "شرح",
        "version-ext-colheader-credits": "نیسنه یا",
+       "version-poweredby-others": "دیه رون",
+       "version-software-version": "نسقه",
+       "version-entrypoints-header-url": "يو آر ال",
+       "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Article path]",
+       "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Script path]",
        "redirect": "واگردونی وا جانیا،بلگه یا وانیئری نوم دیارکو",
        "redirect-submit": "رو",
+       "redirect-value": "ارزایشت:",
+       "redirect-user": "نوم دياركن کاریار:",
+       "redirect-page": "نوم دیار کن بلگه",
        "redirect-file": "نوم جانیا",
        "fileduplicatesearch-filename": "نوم جانیا:",
+       "fileduplicatesearch-submit": "پی جوری",
+       "fileduplicatesearch-info": "$1 × $2 pixel<br />انازه جانیا: $3<br />MIME type: $4",
        "specialpages": "بلگيا ويجه",
        "specialpages-group-changes": "آلشتیا تازه و پهرستنومه یا",
        "specialpages-group-media": "گزارشتیا رسانه و سوارکردیا",
        "external_image_whitelist": "یه خط نه ول بکید چی وه<pre>",
        "tag-filter": "فيلتر [[Special:Tags|Tag]]:",
        "tags-display-header": "دیاری کردن د نوم گه آلشتیا",
+       "tags-active-header": "کنشتگره؟",
+       "tags-active-yes": "هری",
+       "tags-active-no": "نه",
+       "tags-edit": "ویرایشت",
+       "tags-hitcount": "$1 {{جمی:$1|آلشت|آلشتیا}}",
+       "comparepages": "کنار یک نیاین بلگه یا",
+       "compare-page1": "بلگه 1",
+       "compare-page2": "بلگه 2",
+       "compare-rev1": "دوواره ديئن1",
+       "compare-submit": "کنار یک نیاین",
        "compare-title-not-exists": "سرون مشقص بیه وجود ناره.",
        "compare-revision-not-exists": "وانئری که شما تی دیار کردیته وجود ناره.",
+       "htmlform-submit": "دئن",
+       "htmlform-selectorother-other": "هنی",
+       "htmlform-no": "نه",
+       "htmlform-yes": "هری",
+       "htmlform-cloner-delete": "ؤرداشتن",
        "revdelete-content-hid": "مینونه قام بیه",
        "revdelete-uname-hid": "نوم کاروری قام بیه",
        "revdelete-content-unhid": "مینونه قام نبیه",
        "revdelete-uname-unhid": "نوم کاروری قام نبیه",
+       "rightsnone": "(هيش كوم)",
+       "feedback-subject": "سرون:",
+       "feedback-message": "پيغوم:",
+       "feedback-cancel": "انجوم شیوسن",
        "feedback-submit": "کل کردن نهاهوال حون",
        "feedback-close": "انجوم بی",
        "searchsuggest-search": "پی جوری",
        "api-error-illegal-filename": "نوم جانیا اجازه دئه نئ.",
        "api-error-mustbeloggedin": "شما سی سوارکردن فایلیا با بیایت وامین",
        "duration-days": "$1{{جمی:$1|روز|روزیا}}",
+       "duration-weeks": "$1 {{جمی:$1|هفته|هفته یا}}",
        "duration-years": "$1{{جمی:$1| سال|سالیا}}",
+       "limitreport-ppvisitednodes-value": "$1/$2",
+       "limitreport-ppgeneratednodes-value": "$1/$2",
+       "limitreport-expansiondepth-value": "$1/$2",
+       "limitreport-expensivefunctioncount-value": "$1/$2",
+       "expand_templates_output": "نتیجه",
+       "expand_templates_ok": "خوئه",
        "expand_templates_remove_comments": "جا وه جا بیئن ویر و باوریا",
+       "expand_templates_preview": "پيش سيل",
        "pagelanguage": "بلگه انتخاو زون",
+       "pagelang-name": "بلگه",
        "pagelang-language": "زون",
        "pagelang-use-default": "وه کار بسن زون پیش دیه",
+       "pagelang-select-lang": "انتخاو زون",
        "right-pagelang": "آلشت دئن زون بلگه",
+       "action-pagelang": "آلشت دئن زون بلگه",
        "log-name-pagelang": "آلشت دئن زون پهرستنومه",
        "log-description-pagelang": "ای پهرستنومه در بلگه زونا آلشت گرته.",
+       "default-skin-not-found-row-enabled": "* <رازینه>$1</رازینه> / $2 ('''ناکنشتگر بیه''')",
        "default-skin-not-found-row-disabled": "* <رازینه>$1</رازینه> / $2 ('''ناکنشتگر بیه''')"
 }
index 8482e73..ecf17a3 100644 (file)
        "searchrelated": "關",
        "searchall": "全",
        "showingresults": "見'''$1'''尋,自'''$2'''始:",
-       "showingresultsheader": "見'''$4''',{{PLURAL:$5|'''$1''''''$3'''之尋|'''$1 - $2''',共'''$3'''之尋}}",
        "search-nonefound": "詢中無結。",
        "powersearch-legend": "尋",
        "powersearch-ns": "尋名集:",
        "preferences": "簿註",
        "mypreferences": "簿註",
        "prefs-edits": "數計:",
-       "prefsnologintext2": "ç\99»ç°¿ä»¥æ\94¹簿註",
+       "prefsnologintext2": "ç\99»ç°¿ä»¥æ\9b´簿註",
        "prefs-skin": "面版",
        "skin-preview": "草覽",
        "datedefault": "原註",
index 0273c6f..1ff5e3c 100644 (file)
        "newpage": "Нова страница",
        "talkpage": "Разговор",
        "talkpagelinktext": "Разговор",
-       "specialpage": "СпеÑ\86иÑ\98ална страница",
+       "specialpage": "СлÑ\83жбена страница",
        "personaltools": "Лични алатки",
        "articlepage": "Преглед на содржината",
        "talk": "Разговор",
        "nstab-main": "Страница",
        "nstab-user": "Корисник",
        "nstab-media": "Мултимедијална податотека",
-       "nstab-special": "СпеÑ\86иÑ\98ална страница",
+       "nstab-special": "СлÑ\83жбена страница",
        "nstab-project": "Проектна страница",
        "nstab-image": "Податотека",
        "nstab-mediawiki": "Порака",
        "nstab-category": "Категорија",
        "nosuchaction": "Нема такво дејство",
        "nosuchactiontext": "Дејството укажано во URL-адресата е погрешно.\nМожеби имате грешка во пишувањето на адресата, или пак имате проследено погрешна врска.\nОва може да се должи и на грешка во програмската опрема на {{SITENAME}}.",
-       "nosuchspecialpage": "Ð\9dе Ð¿Ð¾Ñ\81Ñ\82ои Ñ\82аква Ñ\81пеÑ\86иÑ\98ална страница",
-       "nospecialpagetext": "<strong>Ð\9fобаÑ\80авÑ\82е Ð½ÐµÐ¿Ð¾Ñ\81Ñ\82оеÑ\87ка Ñ\81пеÑ\86иÑ\98ална Ñ\81Ñ\82Ñ\80аниÑ\86а.</strong>\n\nСпиÑ\81окоÑ\82 Ð½Ð° Ð¿Ð¾Ñ\81Ñ\82оеÑ\87ки Ñ\81пеÑ\86иÑ\98ални страници: [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nosuchspecialpage": "Ð\9dе Ð¿Ð¾Ñ\81Ñ\82ои Ñ\82аква Ñ\81лÑ\83жбена страница",
+       "nospecialpagetext": "<strong>Ð\9fобаÑ\80авÑ\82е Ð½ÐµÐ¿Ð¾Ñ\81Ñ\82оеÑ\87ка Ñ\81лÑ\83жбена Ñ\81Ñ\82Ñ\80аниÑ\86а.</strong>\n\nСпиÑ\81окоÑ\82 Ð½Ð° Ð¿Ð¾Ñ\81Ñ\82оеÑ\87ки Ñ\81лÑ\83жбени страници: [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Грешка",
        "databaseerror": "Грешка во базата",
        "databaseerror-text": "Се појави грешка во барањето од базата.\nОва може да значи програмска грешка (бубачка).",
        "mycustomjsprotected": "Немате дозвола да ја уредувате оваа страница со JavaScript.",
        "myprivateinfoprotected": "Немате дозвола да ги уредувате вашите лични информации.",
        "mypreferencesprotected": "Немате дозвола да ги уредувате вашите нагодувања.",
-       "ns-specialprotected": "СпеÑ\86иÑ\98ални страници не може да се уредуваат.",
+       "ns-specialprotected": "СлÑ\83жбени страници не може да се уредуваат.",
        "titleprotected": "Овој наслов од страна на [[User:$1|$1]] е заштитен и не може да се создаде.\nПричината за тоа е: ''$2''.",
        "filereadonlyerror": "Не можам да ја изменам податотеката „$1“ бидејќи складиштето „$2“ е во незаписен режим.\n\t\nАдминистраторот што ја заклучи го понуди следново образложение: „''$3''“.",
        "invalidtitle-knownnamespace": "Неважечки наслов со именски простор „$2“ и текст „$3“",
        "large-file": "Се препорачува податотеките да не бидат поголеми од $1; оваа податотека е $2.",
        "largefileserver": "Големината на оваа податотека е поголема од максимално дозволената големина од серверот.",
        "emptyfile": "Податотеката што ја подигнавте е празна.\nОва може да се должи на грешка во нејзиното име.\nПроверете дали навистина сакате да ја подигнете ваквата податотека.",
-       "windows-nonascii-filename": "Опслужувачот не поддржува податотечни имиња со специјални знаци.",
+       "windows-nonascii-filename": "Опслужувачот не поддржува податотечни имиња со псоебни знаци.",
        "fileexists": "Податотека со ова име веќе постои. Проверете <strong>[[:$1]]</strong> ако не {{GENDER:|сте}} сигурни дали сакате да ја промените.\n[[$1|thumb]]",
        "filepageexists": "Описната страница на оваа податотека е веќе создадена на <strong>[[:$1]]</strong>, но не постои податотека со тоа име.\nОписот кој го внесовте нема да стои на описната страница.\nДоколку сакате описот да стои тука, ќе морате да го уредите рачно.\n[[$1|thumb]]",
        "fileexists-extension": "Податотека со слично име веќе постои: [[$2|thumb]]\n* Име на податотека која се подигнува: <strong>[[:$1]]</strong>\n* Име на постоечката податотека: <strong>[[:$2]]</strong>\nДали можеби би сакале да користите покарактеристично име.",
        "upload_source_url": "(податотеката што се ја одбрале од важечка, јавно достапна URL-адреса)",
        "upload_source_file": "(податотеката што се ја одбрале од  вашиот сметач)",
        "listfiles-delete": "избриши",
-       "listfiles-summary": "Ð\9eваа Ñ\81пеÑ\86иÑ\98ална страница ги прикажува сите подигнати податотеки.",
+       "listfiles-summary": "Ð\9eваа Ñ\81лÑ\83жбена страница ги прикажува сите подигнати податотеки.",
        "listfiles_search_for": "Побарај име на податотека:",
        "imgfile": "податотека",
        "listfiles": "Список на податотеки",
        "statistics-edits": "Број на уредувања од започнувањето на {{SITENAME}}",
        "statistics-edits-average": "Просечен број на уредувања по страница",
        "statistics-views-total": "Вкупно посети",
-       "statistics-views-total-desc": "Ð\9dе Ñ\81е Ð²ÐºÐ»Ñ\83Ñ\87ени Ð¿Ñ\80егледÑ\83ваÑ\9aа Ð½Ð° Ð½ÐµÐ¿Ð¾Ñ\81Ñ\82оеÑ\87ки Ð¸ Ñ\81пеÑ\86иÑ\98ални страници",
+       "statistics-views-total-desc": "Ð\9dе Ñ\81е Ð²ÐºÐ»Ñ\83Ñ\87ени Ð¿Ñ\80егледÑ\83ваÑ\9aа Ð½Ð° Ð½ÐµÐ¿Ð¾Ñ\81Ñ\82оеÑ\87ки Ð¸ Ñ\81лÑ\83жбени страници",
        "statistics-views-peredit": "Посети по уредување",
        "statistics-users": "Регистрирани [[Special:ListUsers|корисници]]",
        "statistics-users-active": "Активни корисници",
        "pager-newer-n": "{{PLURAL:$1|понова 1|понови $1}}",
        "pager-older-n": "{{PLURAL:$1|постара 1|постари $1}}",
        "suppress": "Скривање",
-       "querypage-disabled": "Ð\9eваа Ñ\81пеÑ\86иÑ\98ална страница е оневозможена за да не попречува на делотворноста.",
+       "querypage-disabled": "Ð\9eваа Ñ\81лÑ\83жбена страница е оневозможена за да не попречува на делотворноста.",
        "booksources": "Печатени извори",
        "booksources-search-legend": "Пребарување на извори за книга",
        "booksources-isbn": "ISBN:",
        "tooltip-t-contributions": "Список на придонеси на овој корисник",
        "tooltip-t-emailuser": "Испрати е-пошта на овој корисник",
        "tooltip-t-upload": "Подигни податотеки",
-       "tooltip-t-specialpages": "СпиÑ\81ок Ð½Ð° Ñ\81иÑ\82е Ñ\81пеÑ\86иÑ\98ални страници",
+       "tooltip-t-specialpages": "СпиÑ\81ок Ð½Ð° Ñ\81иÑ\82е Ñ\81лÑ\83жбени страници",
        "tooltip-t-print": "Верзија за печатење на оваа страница",
        "tooltip-t-permalink": "Постојана врска до оваа верзија на страницата",
        "tooltip-ca-nstab-main": "Преглед на содржината",
        "tooltip-ca-nstab-user": "Преглед на корисничката страница",
        "tooltip-ca-nstab-media": "Преглед на мултимедијалната податотека",
-       "tooltip-ca-nstab-special": "Ð\9eва Ðµ Ñ\81пеÑ\86иÑ\98ална Ñ\81Ñ\82Ñ\80аниÑ\86а, не можете да ја уредувате",
+       "tooltip-ca-nstab-special": "Ð\9eва Ðµ Ñ\81лÑ\83жбена Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¸ Ð·Ð°Ñ\82оа не можете да ја уредувате",
        "tooltip-ca-nstab-project": "Преглед на проектната страница",
        "tooltip-ca-nstab-image": "Преглед на страницата на податотеката",
        "tooltip-ca-nstab-mediawiki": "Преглед на системската порака",
        "file-no-thumb-animation-gif": "'''Напомена: Поради технички ограничувања, минијатурите на GIF-слики со висока разложеност како оваа нема да се анимираат.'''",
        "newimages": "Галерија на нови податотеки",
        "imagelisttext": "Следи список на '''$1''' {{PLURAL:$1|податотека|податотеки}} подредени $2.",
-       "newimages-summary": "Ð\9eваа Ñ\81пеÑ\86иÑ\98ална страница ги покажува скоро подигнатите податотеки.",
+       "newimages-summary": "Ð\9eваа Ñ\81лÑ\83жбена страница ги покажува скоро подигнатите податотеки.",
        "newimages-legend": "Филтрирај",
        "newimages-label": "Име на податотека (или дел од името):",
        "newimages-showbots": "Прикажувај подигања од ботови",
        "version": "Верзија",
        "version-extensions": "Воспоставени додатоци",
        "version-skins": "Воспоставени рува",
-       "version-specialpages": "СпеÑ\86иÑ\98ални страници",
+       "version-specialpages": "СлÑ\83жбени страници",
        "version-parserhooks": "Расчленувачки куки",
        "version-variables": "Променливи",
        "version-antispam": "Спречување на спам",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath?uselang=mk Скрипта]",
        "redirect": "Пренасочување по податотеки, корисник или назнака на преработка",
        "redirect-legend": "Пренасочување кон податотека или страница",
-       "redirect-summary": "Ð\9eваа Ñ\81пеÑ\86иÑ\98ална страница пренасочува кон податотека (се задава името), страница (се задава назнаката на преработката или страницата) или корисничка странца (се задава бројчената назнака на корисникот). Употреба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Ð\9eваа Ñ\81лÑ\83жбена страница пренасочува кон податотека (се задава името), страница (се задава назнаката на преработката или страницата) или корисничка странца (се задава бројчената назнака на корисникот). Употреба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Оди",
        "redirect-lookup": "Пребарај:",
        "redirect-value": "Вредност:",
        "fileduplicatesearch-result-1": "Податотеката „$1“ нема истоветни дупликати.",
        "fileduplicatesearch-result-n": "Податотеката „$1“ има {{PLURAL:$2|еден истоветен дупликат|$2 истоветни дупликати}}.",
        "fileduplicatesearch-noresults": "Не пронајдов податотека со име „$1“.",
-       "specialpages": "СпеÑ\86иÑ\98ални страници",
+       "specialpages": "СлÑ\83жбени страници",
        "specialpages-note-top": "Легенда",
-       "specialpages-note": "* Ð\9dоÑ\80мални Ñ\81пеÑ\86иÑ\98ални Ñ\81Ñ\82Ñ\80аниÑ\86и.\n* <span class=\"mw-specialpagerestricted\">Ð\9eгÑ\80аниÑ\87ени Ñ\81пеÑ\86иÑ\98ални страници.</span>",
+       "specialpages-note": "* Ð\9dоÑ\80мални Ñ\81лÑ\83жбени Ñ\81Ñ\82Ñ\80аниÑ\86и.\n* <span class=\"mw-specialpagerestricted\">Ð\9eгÑ\80аниÑ\87ени Ñ\81лÑ\83жбени страници.</span>",
        "specialpages-group-maintenance": "Извештаи за одржување",
-       "specialpages-group-other": "Ð\94Ñ\80Ñ\83ги Ñ\81пеÑ\86иÑ\98ални страници",
+       "specialpages-group-other": "Ð\94Ñ\80Ñ\83ги Ñ\81лÑ\83жбени страници",
        "specialpages-group-login": "Најава / регистрација",
        "specialpages-group-changes": "Скорешни промени и дневници",
        "specialpages-group-media": "Извештаи за мултимедијални содржини и подигања",
        "specialpages-group-pages": "Списоци на страници",
        "specialpages-group-pagetools": "Алатки за страници",
        "specialpages-group-wiki": "Податоци и алатки",
-       "specialpages-group-redirects": "Ð\9fÑ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе Ð½Ð° Ñ\81пеÑ\86иÑ\98ални страници",
+       "specialpages-group-redirects": "Ð\9fÑ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе Ð½Ð° Ñ\81лÑ\83жбени страници",
        "specialpages-group-spam": "Алатки против спам",
        "blankpage": "Празна страница",
        "intentionallyblankpage": "Оваа страница намерно е оставена празна",
        "limitreport-expansiondepth": "Најголема длабочина на проширувањето",
        "limitreport-expensivefunctioncount": "Бр. на сложени расчленувачки функции",
        "expandtemplates": "Прошири шаблони",
-       "expand_templates_intro": "Ð\9eваа Ñ\81пеÑ\86иÑ\98ална страница зема еден текст и рекурзивно ги проширува сите шаблони во него.\nИсто така проширува и расчленувачки функции како\n<code><nowiki>{{</nowiki>#language:…}}</code> и променливи како\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nВсушност, го проширува сето она што стои во двојни аглести загради.",
+       "expand_templates_intro": "Ð\9eваа Ñ\81лÑ\83жбена страница зема еден текст и рекурзивно ги проширува сите шаблони во него.\nИсто така проширува и расчленувачки функции како\n<code><nowiki>{{</nowiki>#language:…}}</code> и променливи како\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nВсушност, го проширува сето она што стои во двојни аглести загради.",
        "expand_templates_title": "Наслов на контекстот, за {{FULLPAGENAME}} и тн.:",
        "expand_templates_input": "Влезен текст:",
        "expand_templates_output": "Извод",
index 156e139..ca1f801 100644 (file)
        "unblocked": "[[User:$1|$1]] foi desbloqueado",
        "unblocked-range": "A gama $1 foi desbloqueada",
        "unblocked-id": "O bloqueio de $1 foi removido com sucesso",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] foi desbloqueado.",
        "blocklist": "Utilizadores bloqueados",
        "ipblocklist": "Utilizadores bloqueados",
        "ipblocklist-legend": "Procurar um utilizador bloqueado",
index 953ce2b..956849e 100644 (file)
        "otherlanguages": "This message is shown under the toolbox. It is used if there are interwiki links added to the page, like <code><nowiki>[[</nowiki>en:Interwiki article]]</code>.\n{{Identical|Otherlanguages}}",
        "redirectedfrom": "The text displayed when a certain page is redirected to another page. Parameters:\n* $1 - the name of the page user came from",
        "redirectpagesub": "Displayed under the page title of a page which is a redirect to another page, see [{{fullurl:Project:Translators|redirect=no}} Project:Translators] for example.\n\n{{Identical|Redirect page}}",
-       "redirectto": "Alt text of the arrow icon shown on redirect pages ([[commons:File:Sample redirect page.jpg]]).\n\n{{Identical|Redirect page}}",
+       "redirectto": "Alt text of the arrow icon shown on redirect pages ([[commons:File:Sample redirect page.jpg]]).\n\n{{Identical|Redirect to}}",
        "talkpageheader": "{{notranslate}}",
        "lastmodifiedat": "This message is shown below each page, in the footer with the logos and links.\n\nParameters:\n* $1 - date\n* $2 - time\nSee also:\n* {{msg-mw|Lastmodifiedatby}}",
        "viewcount": "Used as page-view counter. Parameters:\n* $1 - number of pageviews",
index 710042e..3b1be72 100644 (file)
        "searchall": "toate",
        "showingresults": "Mai jos {{PLURAL:$1|apare '''1''' rezultat|apar '''$1''' rezultate|apar '''$1''' de rezultate}} începând cu nr. <b>$2</b>.",
        "showingresultsinrange": "Mai jos se afișează un număr de până la {{PLURAL:$1|<strong>1</strong> rezultat|<strong>$1</strong> rezultate|<strong>$1</strong> de rezultate}} din intervalul #<strong>$2</strong> la #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Rezultatul <strong>$1</strong> din <strong>$3</strong>|Rezultatele <strong>$1 - $2</strong> din <strong>$3</strong>}}",
        "search-nonefound": "Nu sunt rezultate conforme interogării.",
        "powersearch-legend": "Căutare avansată",
        "powersearch-ns": "Căutare în spațiile de nume:",
        "unblocked": "[[User:$1|$1]] a fost deblocat",
        "unblocked-range": "$1 a fost deblocat",
        "unblocked-id": "Blocarea $1 a fost eliminată",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] a fost deblocat.",
        "blocklist": "Utilizatori blocați",
        "ipblocklist": "Utilizatori blocați",
        "ipblocklist-legend": "Găsire utilizator blocat",
index 4e95125..586237a 100644 (file)
        "right-deletedtext": "просмотр удалённого текста и изменений между удалёнными версиями страниц",
        "right-browsearchive": "поиск удалённых страниц",
        "right-undelete": "восстановление страниц",
-       "right-suppressrevision": "Ð\9fÑ\80оÑ\81моÑ\82Ñ\80, Ñ\81крытие и восстановление скрытых версий страниц",
+       "right-suppressrevision": "пÑ\80оÑ\81моÑ\82Ñ\80, Ñ\81окрытие и восстановление скрытых версий страниц",
        "right-viewsuppressed": "Просмотр версий, скрытых от всех участников",
        "right-suppressionlog": "просмотр частных журналов",
        "right-block": "установка ограничений на редактирование для других участников",
        "unblocked": "[[User:$1|$1]] {{GENDER:$1|разблокирован|разблокирована}}",
        "unblocked-range": "$1 был разблокирован",
        "unblocked-id": "Блокировка $1 была снята",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] был разблокирован.",
        "blocklist": "Заблокированные участники",
        "ipblocklist": "Заблокированные участники",
        "ipblocklist-legend": "Поиск заблокированного участника",
index 800d795..0dd8089 100644 (file)
        "prefs-personal": "Datos personales",
        "prefs-rc": "Ùrtimas mudàntzias",
        "prefs-watchlist": "Watchlist",
+       "prefs-watchlist-days-max": "Màssimu $1 {{PLURAL:$1|die|dies}}",
        "prefs-watchlist-edits-max": "Cantidade màssima: 1000",
        "prefs-misc": "Àteras preferèntzias",
        "prefs-resetpass": "Càmbia password",
        "upload-failure-subj": "Problema de carrimentu",
        "upload-file-error": "Faddina a intru",
        "img-auth-nofile": "Su File \"$1\" no esistit.",
+       "img-auth-streaming": "Letura currente de \"$1\".",
        "license": "Litzèntzia:",
        "license-header": "Litzèntzia",
+       "nolicense": "Nisciuna litzèntzia indicada",
        "licenses-edit": "Càmbia su sèberu de sa licèntzia",
        "upload_source_file": "(su file seberadu in su computer tuo)",
        "listfiles-delete": "Cantzella",
        "imgfile": "file",
        "listfiles": "Lista de is files",
+       "listfiles_thumb": "Miniatura",
        "listfiles_date": "Data",
        "listfiles_name": "Nùmene",
        "listfiles_user": "Impitadore",
        "mimetype": "Genia MIME:",
        "download": "scàrriga",
        "listredirects": "Lista de totu is redirects",
+       "unusedtemplateswlh": "àteros ligòngios",
        "randompage": "Pàgina a sa tzurpa",
        "randomincategory-category": "Categoria:",
        "statistics": "Statìsticas",
+       "statistics-header-pages": "Statìsticas subra is pàginas",
        "statistics-header-users": "Statìsticas subra is usuàrios",
        "statistics-pages": "Pàginas",
        "pageswithprop-submit": "Bae",
        "protect-cascade": "Ampara totu is pàginas inclùdias in custa (amparadura ricorsiva)",
        "protect-cantedit": "Non podes cambiare is livellus de amparadura pro sa pàgina, pro ite non tenes su permissu de cambiare sa pàgina etotu.",
        "protect-othertime": "Àteru perìodu:",
+       "protect-othertime-op": "àteru perìodu",
+       "protect-otherreason": "Motivu diversu o agiuntivu:",
        "protect-otherreason-op": "Àteru motivu",
        "protect-expiry-options": "1 ora:1 hour,1 die:1 day,1 chida:1 week,2 chidas:2 weeks,1 mese:1 month,3 meses:3 months,6 meses:6 months,1 annu:1 year,infinidu:infinite",
        "restriction-type": "Permissu:",
        "undeletedrevisions": "{{PLURAL:$1|1 revisione restaurada|$1 revisiones restauradas}}",
        "undeletedrevisions-files": "{{PLURAL:$1|1 revisione|$1 revisiones}} e {{PLURAL:$2|1 file|$2 files}} restaurados",
        "undeletedfiles": "{{PLURAL:$1|1 file restauradu|$1 files restaurados}}",
+       "undelete-search-title": "Chirca pàginas burradas",
        "undelete-search-box": "Chirca pàginas fuliadas",
        "undelete-search-prefix": "Ammustra is pàginas ca su tìtulu cumentzat cun:",
        "undelete-search-submit": "Chirca",
        "undelete-show-file-submit": "Eja",
        "namespace": "Nùmene-logu:",
        "invert": "Fùrria sa seletzione",
+       "namespace_association": "Nùmene-logu assotziadu",
        "blanknamespace": "(Printzipale)",
        "contributions": "Contributos {{GENDER:$1|impitadore}}",
        "contributions-title": "Contributziones de $1",
        "month": "Dae su mese (e in segus):",
        "year": "Dae s'annu (e in segus):",
        "sp-contributions-newbies": "Ammustra feti is contributziones de is contos noos",
+       "sp-contributions-newbies-sub": "Pro is contos noos",
        "sp-contributions-blocklog": "registru de is bloccos",
        "sp-contributions-uploads": "carrigamentos",
        "sp-contributions-logs": "registros",
        "move-leave-redirect": "Lassa unu reindiritzamentu a palas",
        "export": "Esporta pàginas",
        "export-submit": "Esporta",
+       "export-addcat": "Annanghe",
+       "export-addns": "Annanghe",
        "export-download": "Sarba comente file",
        "allmessagesname": "Nùmene",
        "allmessagesdefault": "Testu predefinidu",
        "allmessages-filter-translate": "Tradui",
        "thumbnail-more": "Amannia",
        "thumbnail_error": "Faddina creande sa miniatura: $1",
+       "import-interwiki-sourcewiki": "Wiki de orìgine:",
+       "import-interwiki-sourcepage": "Pàgina de orìgine:",
        "import-interwiki-submit": "Importa",
        "import-interwiki-namespace": "Nùmene-logu de destinatzione:",
        "import-upload-filename": "Nùmene file:",
        "import-comment": "Cummentu:",
        "importstart": "Importande is pàginas...",
        "import-revision-count": "$1 {{PLURAL:$1|revisione|revisiones}}",
+       "importlogpage": "Importatziones",
        "tooltip-pt-userpage": "Sa pàgina impitadore tua",
        "tooltip-pt-mytalk": "Sa pàgina de is cuntierras tuas",
        "tooltip-pt-preferences": "Is preferèntzias chi podes seberare",
        "siteusers": "$1, {{PLURAL:$2|usuàriu|usuàrios}} de {{SITENAME}}",
        "anonusers": "$1, {{PLURAL:$2|usuàriu anònimu|usuàrios anònimos}} de {{SITENAME}}",
        "creditspage": "Autores de sa pàgina",
+       "pageinfo-header-edits": "Istòria de is mudàntzias",
        "pageinfo-article-id": "ID pàgina",
+       "pageinfo-firstuser": "Creadore de sa pàgina",
+       "pageinfo-firsttime": "Data de creatzione de sa pàgina",
+       "pageinfo-lastuser": "Ùrtimu contribudore",
+       "pageinfo-lasttime": "Data de s'ùrtimu càmbiu",
+       "pageinfo-edits": "Nùmeru totale de càmbios",
+       "pageinfo-authors": "Nùmeru totale de autores dislindados",
+       "pageinfo-redirectsto-info": "info",
        "pageinfo-contentpage-yes": "Eja",
        "pageinfo-protect-cascading-yes": "Eja",
+       "pageinfo-category-pages": "Nùmeru de pàginas",
+       "pageinfo-category-subcats": "Nùmeru de sutacategorias",
+       "pageinfo-category-files": "Nùmeru de documentos",
+       "markaspatrolleddiff": "Marca comente cumprobadu",
+       "markaspatrolledtext": "Marca custa pàgina comente cumprobada",
+       "markedaspatrolled": "Marcada comente cumprobada",
        "previousdiff": "← Càmbiu in segus",
        "nextdiff": "Càmbiu in antis →",
+       "thumbsize": "Mannesa de is miniaturas:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|pàgina|pàginas}}",
+       "file-info": "mannesa de su documentu: $1, casta de MIME: $2",
        "file-info-size": "$1 × $2 pixels, mannesa de su file: $3, tipu de MIME: $4",
        "file-nohires": "Non si tenent risolutziones prus artas.",
        "svg-long-desc": "file in formadu SVG, mannesa nominale $1 × $2 pixel, mannesa de su file: $3",
        "show-big-image": "Versione a risolutzione arta",
        "imagelisttext": "Innoe sighendi du est una lista de '''$1''' {{PLURAL:$1|file|files}} ordinada $2.",
+       "newimages-legend": "Filtru",
        "ilsubmit": "Chirca",
        "bydate": "data",
        "video-dims": "$1, $2×$3",
        "seconds-abbrev": "$1s",
        "minutes-abbrev": "$1m",
        "hours-abbrev": "$1h",
+       "seconds": "{{PLURAL:$1|$1 segundu|$1 segundos}}",
+       "minutes": "{{PLURAL:$1|$1 minutu|$1 minutos}}",
+       "hours": "{{PLURAL:$1|$1 ora|$1 oras}}",
+       "days": "{{PLURAL:$1|$1 die|$1 dies}}",
+       "weeks": "{{PLURAL:$1|$1 chida|$1 chidas}}",
+       "months": "{{PLURAL:$1|$1 mese|$1 meses}}",
+       "years": "{{PLURAL:$1|$1 annu|$1 annos}}",
+       "ago": "como $1",
+       "just-now": "immoe-immoe",
+       "hours-ago": "como $1 {{PLURAL:$1|ora|oras}}",
+       "minutes-ago": "como $1 {{PLURAL:$1|minutu|minutos}}",
+       "seconds-ago": "como $1 {{PLURAL:$1|segundu|segundos}}",
+       "monday-at": "Lunis a is $1",
+       "tuesday-at": "Martis a is $1",
+       "wednesday-at": "Mèrcuris a is $1",
+       "thursday-at": "Gioja a is $1",
+       "friday-at": "Chenàbura a is $1",
+       "saturday-at": "Sàbadu a is $1",
+       "sunday-at": "Domìnigu a is $1",
+       "yesterday-at": "Eris a is $1",
        "bad_image_list": "Su formadu est su chi sighit:\n\nBenint consideradas isceti is listas punnadas (lìnias chi incumentzant cun *).\nSu primu ligòngiu in cada una lìnia depet èssere unu ligòngiu a unu documentu malu (o indesideradu).\nIs ligòngios chi sighint in sa matessi lìnia sunt cunsiderados comente etzetziones (est a nàrrere, pàginas in ue si podet usare su documentu).",
        "metadata": "Metadatos",
        "metadata-help": "Custu file cuntènnit informatziones annuntiles, probabilmente annúnghedas dae sa fotocamera o dae su scannerizadore impreadu pro ddu creare o ddu digitalizare. Si su file est istadu mudadu, unos cantos particulares podent non currispòndere a sa realidade.",
        "exif-fnumber-format": "f/$1",
        "exif-flash": "Flash",
        "exif-focallength-format": "$1 mm",
+       "exif-contrast": "Cuntrastu",
+       "exif-saturation": "Saturassione",
+       "exif-gpslatituderef": "Latitùdine nord o sud",
+       "exif-gpslatitude": "Latitùdine",
+       "exif-gpslongituderef": "Longitùdine est o ovest",
+       "exif-gpslongitude": "Longitùdine",
+       "exif-source": "Orìgine",
+       "exif-languagecode": "Limba",
+       "exif-iimcategory": "Categoria",
        "exif-compression-6": "JPEG",
        "exif-photometricinterpretation-2": "RGB",
        "exif-photometricinterpretation-6": "YCbCr",
        "exif-componentsconfiguration-1": "Y",
        "exif-componentsconfiguration-2": "Cb",
        "exif-componentsconfiguration-3": "Cr",
+       "exif-exposureprogram-1": "Ghia",
        "exif-subjectdistance-value": "$1 metros",
+       "exif-meteringmode-255": "Àteru",
+       "exif-lightsource-0": "Isconnottu",
        "exif-lightsource-4": "Lampu",
        "exif-gaincontrol-0": "Nudda",
        "exif-contrast-0": "Normale",
+       "exif-saturation-0": "Normale",
        "exif-sharpness-0": "Normale",
        "watchlistall2": "totu",
        "namespacesall": "totu",
        "monthsall": "totu",
        "confirmemail": "Cunfirma s'indiritzu e-mail",
        "confirm_purge_button": "OK",
+       "confirm-watch-button": "OK",
+       "confirm-unwatch-button": "OK",
        "semicolon-separator": ";&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
        "version-version": "(Versione $1)",
        "version-license": "Licèntzia MediaWiki",
        "version-ext-license": "Licèntzia",
+       "version-ext-colheader-version": "Versione",
        "version-ext-colheader-license": "Licèntzia",
+       "version-ext-colheader-description": "Descritzione",
+       "version-ext-colheader-credits": "Autores",
+       "version-license-title": "Litzèntzia pro $1",
        "version-poweredby-others": "àteros",
        "version-software-version": "Versione",
        "version-entrypoints-header-url": "URL",
        "specialpages-group-login": "Intra / crea contu",
        "specialpages-group-pages": "Listas de is pàginas",
        "tag-filter": "Filtra pro [[Special:Tags|etichetta]]:",
+       "tag-filter-submit": "Filtru",
        "tags-active-yes": "Eja",
        "tags-active-no": "No",
        "tags-edit": "càmbia",
+       "tags-hitcount": "$1 {{PLURAL:$1|càmbiu|càmbios}}",
        "compare-page1": "Pàgina 1",
        "compare-page2": "Pàgina 2",
        "compare-rev1": "Revisione 1",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|carrigadu}} una versione noa de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|carrigadu}} $3",
        "rightsnone": "(nisciunu)",
+       "feedback-subject": "Ogetu:",
+       "feedback-message": "Messàgiu:",
+       "feedback-cancel": "Annudda",
        "feedback-close": "Fatu",
        "searchsuggest-search": "Chirca",
        "expand_templates_ok": "OK",
        "expand_templates_preview": "Antiprima",
        "pagelang-name": "Pàgina",
+       "pagelang-language": "Limba",
        "pagelang-select-lang": "Sèbera limba"
 }
index fb8237a..1c40ffd 100644 (file)
        "searchrelated": "currilati",
        "searchall": "tutti",
        "showingresults": "Ammustra nzinu a {{PLURAL:$1|'''1''' risurtatu|'''$1''' risurtati}} a pàrtiri dô nùmmuru '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Risultatu '''$1''' di '''$3'''|Risultati '''$1 - $2''' di '''$3'''}} pi '''$4'''",
        "search-nonefound": "La circata nun desi nuddu risurtatu.",
        "powersearch-legend": "Ricerca avanzata",
        "powersearch-ns": "Cerca ntê namespace:",
        "logentry-delete-delete": "$1 cancillau la pàggina $3",
        "revdelete-restricted": "ristrizzioni ai suli amministratura attivate",
        "revdelete-unrestricted": "ristrizzioni pi suli amministraturi rimossi",
-       "logentry-move-move": "$1 spustau la pàggina $3 a $4",
+       "logentry-move-move": "$1 {{GENDER:$2|spustau}} la pàggina $3 nti $4",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|spustau}} la pàggina $3 nti $4 cu nu rinnirizzamentu",
        "logentry-newusers-create": "$1 criau na utenza",
        "rightsnone": "(nuddu)",
        "searchsuggest-search": "Risciduta",
index d971b19..7176391 100644 (file)
        "unblockiptext": "Користите образац испод да бисте вратили право писања блокираној IP адреси или корисничком имену.",
        "ipusubmit": "Уклони ову блокаду",
        "unblocked": "[[User:$1|$1]] је деблокиран",
-       "unblocked-range": "$1 је {{GENDER:$1|деблокиран|деблокирана|деблокиран}}",
+       "unblocked-range": "$1 је деблокиран",
        "unblocked-id": "Блокирање $1 је уклоњено",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] је деблокиран.",
        "blocklist": "Блокирани корисници",
        "ipblocklist": "Блокирани корисници",
        "ipblocklist-legend": "Проналажење блокираног корисника",
        "watchlistedit-clear-submit": "Испразни списак надгледања (Ово је трајно!)",
        "watchlistedit-clear-done": "Ваш списак надгледања је испражњен.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 наслов је уклоњен|$1 наслова је уклоњено}}:",
+       "watchlistedit-too-many": "Има превише страница за приказ овде.",
        "watchlisttools-clear": "испразни списак надгледања",
        "watchlisttools-view": "прикажи сродне измене",
        "watchlisttools-edit": "прикажи и уреди списак надгледања",
index fbe7c47..dadc80d 100644 (file)
        "otherlanguages": "Drugi jezici",
        "redirectedfrom": "(preusmereno sa $1)",
        "redirectpagesub": "Preusmerenje",
+       "redirectto": "Preusmerava na:",
        "lastmodifiedat": "Ova stranica je poslednji put izmenjena $1 u $2.",
        "viewcount": "Ova stranica je pregledana {{PLURAL:$1|jedanput|$1 puta|$1 puta}}.",
        "protectedpage": "Zaštićena stranica",
        "searchall": "sve",
        "showingresults": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}} počev od broja <strong>$2</strong>.",
        "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultata <strong>$1 – $2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Nema poklapanja.",
        "powersearch-legend": "Napredna pretraga",
        "powersearch-ns": "Traži u sledećim imenskim prostorima:",
        "unblockiptext": "Koristite obrazac ispod da biste vratili pravo pisanja blokiranoj IP adresi ili korisničkom imenu.",
        "ipusubmit": "Ukloni ovu blokadu",
        "unblocked": "[[User:$1|$1]] je deblokiran",
-       "unblocked-range": "$1 je {{GENDER:$1|deblokiran|deblokirana|deblokiran}}",
+       "unblocked-range": "$1 je deblokiran",
        "unblocked-id": "Blokiranje $1 je uklonjeno",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] je deblokiran.",
        "blocklist": "Blokirani korisnici",
        "ipblocklist": "Blokirani korisnici",
        "ipblocklist-legend": "Pronalaženje blokiranog korisnika",
index bdef564..4840780 100644 (file)
        "editfont-style": "Typsnitt i redigeringsrutan:",
        "editfont-default": "Webbläsarens standard",
        "editfont-monospace": "Fast bredd",
-       "editfont-sansserif": "Sans-serif",
-       "editfont-serif": "Serif",
+       "editfont-sansserif": "Sans-serif-teckensnitt",
+       "editfont-serif": "Serif-teckensnitt",
        "sunday": "söndag",
        "monday": "måndag",
        "tuesday": "tisdag",
        "unblocked": "Blockeringen av [[User:$1|$1]] har hävts",
        "unblocked-range": "$1 har avblockerats",
        "unblocked-id": "Blockeringen $1 har hävts",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] har avblockerats.",
        "blocklist": "Blockerade användare",
        "ipblocklist": "Blockerade användare",
        "ipblocklist-legend": "Sök efter en blockerad användare",
index f07949a..de2af01 100644 (file)
        "searchall": "אלץ",
        "showingresults": "ווייזן ביז {{PLURAL:$1|רעזולטאט '''איינס'''|'''$1''' רעזולטאטן}} אנגעפאנגן פון נומער #'''$2''':",
        "showingresultsinrange": "ווײַזן אונטן ביז {{PLURAL:$1|<strong>1</strong> רעזולטאט|<strong>$1</strong> רעזולטאטן}} אין גרייך #<strong>$2</strong> ביז #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|רעזולטאַט '''$1''' פֿון '''$3'''| רעזולטאַטן '''$1 - $2''' פֿון '''$3'''}} פֿאַר '''$4'''",
        "search-nonefound": "נישטא קיין רעזולטאטן פֿאַר דער שאלה.",
        "powersearch-legend": "ווײַטהאלטן זוכן",
        "powersearch-ns": "זוכן אין נאמענטיילן:",
        "movepagetalktext": "דער רעדן בלאט וועט ווערן באַוועגט אויטאמאֵטיש מיט אים, '''אחוץ:'''\n* ס'איז שוין דא א נישט-ליידיגער בלאט מיטן נייעם נאמען, אדער.\n* איר נעמט  אראפ דעם צייכן פונעם קעסטל אונטן.\n\nאין די פֿעלער, וועט איר דארפֿן באַוועגן אדער צונויפֿגיסן דעם בלאט האַנטלעך, ווען איר ווילט.",
        "movearticle": "באוועג בלאט:",
        "moveuserpage-warning": "'''ווארענונג:''' איר האלט ביי באוועגן א באניצער בלאט. ביטע באמערקט אז נאר דער בלאט ווערט באוועגט אבער דער באניצער נאמען ווערט ''נישט'' געענדערט.",
+       "movecategorypage-warning": "<strong>ווארענונג:</strong> איר האלט ביי באוועגן א קאטעגאריע בלאט. גיט אכט אז נאר דער בלאט וועט ווערן באוועגט, אבער די בלעטער אין דער אלטער קאטעגאריע וועט מען <em>נישט</em> be ארײַנשטעלן אין דער נייער קאטעגאריע.",
        "movenologintext": "איר דארפֿט זיך אײַנשרײַבן און זײַן  [[Special:UserLogin|אַרײַנלאגירט]] צו באַוועגן א בלאַט.",
        "movenotallowed": "איר זענט נישט דערלויבט צו באוועגן בלעטער.",
        "movenotallowedfile": "איר האט נישט קיין רשות צו באוועגן טעקעס.",
index 5ef199e..b1f6786 100644 (file)
        "october-date": "10月$1日",
        "november-date": "11月$1日",
        "december-date": "12月$1日",
-       "pagecategories": "{{PLURAL:$1|分类|$1个分类}}",
+       "pagecategories": "{{PLURAL:$1|分类}}",
        "category_header": "分类“$1”中的页面",
        "subcategories": "子分类",
        "category-media-header": "分类“$1”中的媒体文件",
        "hidetoc": "隐藏",
        "collapsible-collapse": "折叠",
        "collapsible-expand": "展开",
-       "confirmable-confirm": "{{GENDER:$1|}}确定么?",
+       "confirmable-confirm": "{{GENDER:$1|}}确定么?",
        "confirmable-yes": "是",
        "confirmable-no": "否",
        "thisisdeleted": "查看或还原$1?",
index 5cc05f6..c3ccd27 100644 (file)
        "throttled-mailpassword": "密碼重設的電子郵件已經在最近 $1 小時內寄出。\n為防止濫用,$1 小時內只能寄出一次密碼重設信件。",
        "mailerror": "傳送電子郵件錯誤:$1",
        "acct_creation_throttle_hit": "使用您目前的 IP 位址的訪客在最近一天建立了 {{PLURAL:$1|1 個帳號|$1 個帳號}},已超出系統允許的上限。\n因此,目前無法讓使用此 IP 位址的訪客建立帳號。",
-       "emailauthenticated": "您的電子郵件位址已確認於 $2 的 $3。",
+       "emailauthenticated": "您的電子郵件位址已於 $2 $3 確認。",
        "emailnotauthenticated": "您的電子郵件位址尚未確認,\n尚不會寄出以下功能的電子郵件給您。",
        "noemailprefs": "在您的偏好設定中設定電子郵件位址,讓您可以使用這些功能。",
        "emailconfirmlink": "確認您的電子郵件位址",
index ccdd310..7541f31 100644 (file)
@@ -512,16 +512,16 @@ $linkPrefixCharset = 'a-zA-Z\\x{80}-\\x{10ffff}';
  * basis if needed.
  */
 $imageFiles = array(
-       'button-bold'     => 'button_bold.png',
-       'button-italic'   => 'button_italic.png',
-       'button-link'     => 'button_link.png',
-       'button-extlink'  => 'button_extlink.png',
-       'button-headline' => 'button_headline.png',
-       'button-image'    => 'button_image.png',
-       'button-media'    => 'button_media.png',
-       'button-nowiki'   => 'button_nowiki.png',
-       'button-sig'      => 'button_sig.png',
-       'button-hr'       => 'button_hr.png',
+       'button-bold'     => 'en/button_bold.png',
+       'button-italic'   => 'en/button_italic.png',
+       'button-link'     => 'en/button_link.png',
+       'button-extlink'  => 'en/button_extlink.png',
+       'button-headline' => 'en/button_headline.png',
+       'button-image'    => 'en/button_image.png',
+       'button-media'    => 'en/button_media.png',
+       'button-nowiki'   => 'en/button_nowiki.png',
+       'button-sig'      => 'en/button_sig.png',
+       'button-hr'       => 'en/button_hr.png',
 );
 
 /**
index 2f6c650..e338b42 100644 (file)
@@ -209,6 +209,6 @@ $magicWords = array(
 );
 
 $imageFiles = array(
-       'button-italic'   => 'ksh/button_S_italic.png',
+       'button-italic'   => 'ksh/button_italic.png',
 );
 
index 9098d85..a96b766 100644 (file)
@@ -433,9 +433,9 @@ $fallback8bitEncoding = 'windows-1251';
 $linkPrefixExtension = false;
 
 $imageFiles = array(
-       'button-bold'   => 'cyrl/button_bold.png',
-       'button-italic' => 'cyrl/button_italic.png',
-       'button-link'   => 'cyrl/button_link.png',
+       'button-bold'   => 'ru/button_bold.png',
+       'button-italic' => 'ru/button_italic.png',
+       'button-link'   => 'ru/button_link.png',
 );
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюя]+)(.*)$/sDu';
index d043818..df8a34c 100644 (file)
@@ -750,6 +750,7 @@ bmwschema
 bmysql
 bname
 bodycontent
+bogo
 boldening
 bolding
 booksources
@@ -861,6 +862,7 @@ categorypage
 categoryviewer
 catids
 catlinks
+catmsg
 catpage
 catrope
 cattitles
@@ -1677,6 +1679,7 @@ geocoordinate
 geodata
 geosearch
 gerrit
+geshi
 getcookie
 getenv
 getheader
@@ -1810,6 +1813,7 @@ hit
 hitcount
 hitcounter
 hits
+hlist
 hmac
 hobby
 homelink
@@ -2249,6 +2253,7 @@ loginerror
 loginfo
 loginlanguagelinks
 loginlink
+loginout
 loginprompt
 loginreqlink
 loginreqpagetext
@@ -2453,6 +2458,7 @@ moodbar
 moredotdotdot
 morelinkstoimage
 morethan
+mouseup
 move
 movedarticleprotection
 moveddeleted
@@ -2599,6 +2605,7 @@ newpos
 newquery
 newrevid
 news
+newsectionheaderdefaultlevel
 newsectionlink
 newsectionsummary
 newset
@@ -4010,6 +4017,7 @@ test
 testclean
 testdata
 testmailuser
+teston
 testpass
 testrunner
 testswarm
@@ -4156,6 +4164,7 @@ transwiki
 troff
 true
 truespeed
+truncatedtext
 trustworthy
 truteq
 truthy
@@ -4263,6 +4272,7 @@ unseed
 unserialization
 unserialize
 unserialized
+unserializes
 unserializing
 unsetting
 unstub
@@ -4437,6 +4447,7 @@ viewdeleted
 viewhelppage
 viewmyprivateinfo
 viewmywatchlist
+viewport
 viewprevnext
 viewsource
 viewsourcelink
@@ -4612,6 +4623,7 @@ xml
 xmldoublequote
 xmlfm
 xmlimport
+xmlmeta
 xmlns
 xmlselect
 xor
index 64b21cf..9f64da4 100644 (file)
@@ -984,8 +984,10 @@ return array(
 
        'mediawiki.action.edit' => array(
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.js',
+               'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.css',
                'dependencies' => array(
                        'mediawiki.action.edit.styles',
+                       'mediawiki.action.edit.toolbar',
                        'jquery.textSelection',
                        'jquery.byteLimit',
                ),
@@ -995,6 +997,10 @@ return array(
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.styles.css',
                'position' => 'top',
        ),
+       'mediawiki.action.edit.toolbar' => array(
+               'class' => 'ResourceLoaderEditToolbarModule',
+               'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.toolbar/mediawiki.action.edit.toolbar.less',
+       ),
        'mediawiki.action.edit.collapsibleFooter' => array(
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js',
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css',
index c4daa62..53e46d6 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (bd008e8aed)
+ * OOjs UI v0.1.0-pre (49b64bdba7)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-09-11T23:10:10Z
+ * Date: 2014-09-15T22:18:37Z
  */
 /*
  * Blank theme mixins.
 .oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
   z-index: 1;
 }
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+  float: right;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
+  padding: 0.5em 0.75em;
+}
 .oo-ui-fieldLayout:last-child {
   margin-bottom: 0;
 }
   left: 0.25em;
   margin-left: 0;
 }
+.oo-ui-actionWidget.oo-ui-pendingElement-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
 .oo-ui-popupWidget-popup {
   position: absolute;
   overflow: hidden;
   -moz-box-sizing: border-box;
   box-sizing: border-box;
 }
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
 .oo-ui-textInputWidget > .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
   position: absolute;
   color: #777;
   text-shadow: 0 1px 1px #fff;
 }
-.oo-ui-textInputWidget-pending input,
-.oo-ui-textInputWidget-pending textarea {
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
   background-color: transparent;
 }
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
   z-index: 1;
   top: 0;
 }
+.oo-ui-dialog-content > .oo-ui-window-head.oo-ui-pendingElement-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
 .oo-ui-dialog-content > .oo-ui-window-body {
   z-index: 2;
   top: 0;
   padding: 1em;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-  position: fixed;
+  position: absolute;
   right: 0;
   left: 0;
   margin: auto;
index 801dfc6..e817142 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (bd008e8aed)
+ * OOjs UI v0.1.0-pre (49b64bdba7)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-09-11T23:10:10Z
+ * Date: 2014-09-15T22:18:37Z
  */
 /*
  * Blank theme mixins.
 .oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
   z-index: 1;
 }
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+  float: right;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
+  padding: 0.5em 0.75em;
+}
 .oo-ui-fieldLayout:last-child {
   margin-bottom: 0;
 }
   left: 0.25em;
   margin-left: 0;
 }
+.oo-ui-actionWidget.oo-ui-pendingElement-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
 .oo-ui-popupWidget-popup {
   position: absolute;
   overflow: hidden;
   -moz-box-sizing: border-box;
   box-sizing: border-box;
 }
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
 .oo-ui-textInputWidget > .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
   position: absolute;
   z-index: 1;
   top: 0;
 }
+.oo-ui-dialog-content > .oo-ui-window-head.oo-ui-pendingElement-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
 .oo-ui-dialog-content > .oo-ui-window-body {
   z-index: 2;
   top: 0;
   padding: 1em;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-  position: fixed;
+  position: absolute;
   right: 0;
   left: 0;
   margin: auto;
index ea086a1..a3e2375 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (bd008e8aed)
+ * OOjs UI v0.1.0-pre (49b64bdba7)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-09-11T23:10:10Z
+ * Date: 2014-09-15T22:18:37Z
  */
 ( function ( OO ) {
 
@@ -188,6 +188,88 @@ OO.ui.getLocalValue = function ( obj, lang, fallback ) {
 
 } )();
 
+/**
+ * Element that can be marked as pending.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.PendingElement = function OoUiPendingElement( config ) {
+       // Config initialisation
+       config = config || {};
+
+       // Properties
+       this.pending = 0;
+       this.$pending = null;
+
+       // Initialisation
+       this.setPendingElement( config.$pending || this.$element );
+};
+
+/* Setup */
+
+OO.initClass( OO.ui.PendingElement );
+
+/* Methods */
+
+/**
+ * Set the pending element (and clean up any existing one).
+ *
+ * @param {jQuery} $pending The element to set to pending.
+ */
+OO.ui.PendingElement.prototype.setPendingElement = function ( $pending ) {
+       if ( this.$pending ) {
+               this.$pending.removeClass( 'oo-ui-pendingElement-pending' );
+       }
+
+       this.$pending = $pending;
+       if ( this.pending > 0 ) {
+               this.$pending.addClass( 'oo-ui-pendingElement-pending' );
+       }
+};
+
+/**
+ * Check if input is pending.
+ *
+ * @return {boolean}
+ */
+OO.ui.PendingElement.prototype.isPending = function () {
+       return !!this.pending;
+};
+
+/**
+ * Increase the pending stack.
+ *
+ * @chainable
+ */
+OO.ui.PendingElement.prototype.pushPending = function () {
+       if ( this.pending === 0 ) {
+               this.$pending.addClass( 'oo-ui-pendingElement-pending' );
+       }
+       this.pending++;
+
+       return this;
+};
+
+/**
+ * Reduce the pending stack.
+ *
+ * Clamped at zero.
+ *
+ * @chainable
+ */
+OO.ui.PendingElement.prototype.popPending = function () {
+       if ( this.pending === 1 ) {
+               this.$pending.removeClass( 'oo-ui-pendingElement-pending' );
+       }
+       this.pending = Math.max( 0, this.pending - 1 );
+
+       return this;
+};
+
 /**
  * List of actions.
  *
@@ -2056,6 +2138,7 @@ OO.ui.Window.prototype.load = function () {
  * @abstract
  * @class
  * @extends OO.ui.Window
+ * @mixins OO.ui.PendingElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -2064,11 +2147,13 @@ OO.ui.Dialog = function OoUiDialog( config ) {
        // Parent constructor
        OO.ui.Dialog.super.call( this, config );
 
+       // Mixin constructors
+       OO.ui.PendingElement.call( this );
+
        // Properties
        this.actions = new OO.ui.ActionSet();
        this.attachedActions = [];
        this.currentAction = null;
-       this.pending = 0;
 
        // Events
        this.actions.connect( this, {
@@ -2086,6 +2171,7 @@ OO.ui.Dialog = function OoUiDialog( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.Dialog, OO.ui.Window );
+OO.mixinClass( OO.ui.Dialog, OO.ui.PendingElement );
 
 /* Static Properties */
 
@@ -2173,15 +2259,6 @@ OO.ui.Dialog.prototype.onActionsChange = function () {
        }
 };
 
-/**
- * Check if input is pending.
- *
- * @return {boolean}
- */
-OO.ui.Dialog.prototype.isPending = function () {
-       return !!this.pending;
-};
-
 /**
  * Get set of actions.
  *
@@ -2272,6 +2349,7 @@ OO.ui.Dialog.prototype.initialize = function () {
 
        // Initialization
        this.$content.addClass( 'oo-ui-dialog-content' );
+       this.setPendingElement( this.$head );
 };
 
 /**
@@ -2309,38 +2387,6 @@ OO.ui.Dialog.prototype.executeAction = function ( action ) {
                .always( OO.ui.bind( this.popPending, this ) );
 };
 
-/**
- * Increase the pending stack.
- *
- * @chainable
- */
-OO.ui.Dialog.prototype.pushPending = function () {
-       if ( this.pending === 0 ) {
-               this.$content.addClass( 'oo-ui-actionDialog-content-pending' );
-               this.$head.addClass( 'oo-ui-texture-pending' );
-       }
-       this.pending++;
-
-       return this;
-};
-
-/**
- * Reduce the pending stack.
- *
- * Clamped at zero.
- *
- * @chainable
- */
-OO.ui.Dialog.prototype.popPending = function () {
-       if ( this.pending === 1 ) {
-               this.$content.removeClass( 'oo-ui-actionDialog-content-pending' );
-               this.$head.removeClass( 'oo-ui-texture-pending' );
-       }
-       this.pending = Math.max( 0, this.pending - 1 );
-
-       return this;
-};
-
 /**
  * Collection of windows.
  *
@@ -6429,15 +6475,19 @@ OO.ui.FieldLayout = function OoUiFieldLayout( field, config ) {
        if ( config.help ) {
                this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
                        $: this.$,
+                       classes: [ 'oo-ui-fieldLayout-help' ],
                        framed: false,
-                       icon: 'info',
-                       title: config.help
+                       icon: 'info'
                } );
 
-               this.popupButtonWidget.getPopup().$body.append( this.$( '<span>' ).text( config.help ) );
+               this.popupButtonWidget.getPopup().$body.append(
+                       this.$( '<div>' )
+                               .text( config.help )
+                               .addClass( 'oo-ui-fieldLayout-help-content' )
+               );
                this.$help = this.popupButtonWidget.$element;
        } else {
-               this.$help = this.$( '<div>' );
+               this.$help = this.$( [] );
        }
 
        // Events
@@ -8148,6 +8198,7 @@ OO.ui.ButtonWidget.prototype.setTarget = function ( target ) {
  *
  * @class
  * @extends OO.ui.ButtonWidget
+ * @mixins OO.ui.PendingElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -8161,6 +8212,9 @@ OO.ui.ActionWidget = function OoUiActionWidget( config ) {
        // Parent constructor
        OO.ui.ActionWidget.super.call( this, config );
 
+       // Mixin constructors
+       OO.ui.PendingElement.call( this, config );
+
        // Properties
        this.action = config.action || '';
        this.modes = config.modes || [];
@@ -8174,6 +8228,7 @@ OO.ui.ActionWidget = function OoUiActionWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.ActionWidget, OO.ui.ButtonWidget );
+OO.mixinClass( OO.ui.ActionWidget, OO.ui.PendingElement );
 
 /* Events */
 
@@ -8868,6 +8923,7 @@ OO.ui.CheckboxInputWidget.prototype.onEdit = function () {
  * @extends OO.ui.InputWidget
  * @mixins OO.ui.IconElement
  * @mixins OO.ui.IndicatorElement
+ * @mixins OO.ui.PendingElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -8886,9 +8942,9 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        // Mixin constructors
        OO.ui.IconElement.call( this, config );
        OO.ui.IndicatorElement.call( this, config );
+       OO.ui.PendingElement.call( this, config );
 
        // Properties
-       this.pending = 0;
        this.multiline = !!config.multiline;
        this.autosize = !!config.autosize;
        this.maxRows = config.maxRows !== undefined ? config.maxRows : 10;
@@ -8914,6 +8970,7 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
 OO.inheritClass( OO.ui.TextInputWidget, OO.ui.InputWidget );
 OO.mixinClass( OO.ui.TextInputWidget, OO.ui.IconElement );
 OO.mixinClass( OO.ui.TextInputWidget, OO.ui.IndicatorElement );
+OO.mixinClass( OO.ui.TextInputWidget, OO.ui.PendingElement );
 
 /* Events */
 
@@ -9076,47 +9133,6 @@ OO.ui.TextInputWidget.prototype.isAutosizing = function () {
        return !!this.autosize;
 };
 
-/**
- * Check if input is pending.
- *
- * @return {boolean}
- */
-OO.ui.TextInputWidget.prototype.isPending = function () {
-       return !!this.pending;
-};
-
-/**
- * Increase the pending stack.
- *
- * @chainable
- */
-OO.ui.TextInputWidget.prototype.pushPending = function () {
-       if ( this.pending === 0 ) {
-               this.$element.addClass( 'oo-ui-textInputWidget-pending' );
-               this.$input.addClass( 'oo-ui-texture-pending' );
-       }
-       this.pending++;
-
-       return this;
-};
-
-/**
- * Reduce the pending stack.
- *
- * Clamped at zero.
- *
- * @chainable
- */
-OO.ui.TextInputWidget.prototype.popPending = function () {
-       if ( this.pending === 1 ) {
-               this.$element.removeClass( 'oo-ui-textInputWidget-pending' );
-               this.$input.removeClass( 'oo-ui-texture-pending' );
-       }
-       this.pending = Math.max( 0, this.pending - 1 );
-
-       return this;
-};
-
 /**
  * Select the contents of the input.
  *
index 61e7f39..913d5fd 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (bd008e8aed)
+ * OOjs UI v0.1.0-pre (49b64bdba7)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-09-11T23:10:10Z
+ * Date: 2014-09-15T22:18:37Z
  */
 /*
  * Blank theme mixins.
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.css b/resources/src/mediawiki.action/mediawiki.action.edit.css
new file mode 100644 (file)
index 0000000..45ba543
--- /dev/null
@@ -0,0 +1,18 @@
+/*!
+ * Styles for elements of the editing form, loaded only when JavaScript is enabled.
+ */
+
+.mw-toolbar-editbutton {
+       width: 23px;
+       height: 22px;
+       cursor: pointer;
+       vertical-align: middle;
+       /* Cross-browser inline-block */
+       /* Firefox 2 */
+       display: -moz-inline-block;
+       /* Modern browsers */
+       display: inline-block;
+       /* IE7 */
+       zoom: 1;
+       *display: inline;
+}
index e850276..4519b04 100644 (file)
@@ -15,6 +15,8 @@
         * @private
         */
        function insertButton( b, speedTip, tagOpen, tagClose, sampleText, imageId ) {
+               var $button;
+
                // Backwards compatibility
                if ( typeof b !== 'object' ) {
                        b = {
                                imageId: imageId
                        };
                }
-               var $image = $( '<img>' ).attr( {
-                       width: 23,
-                       height: 22,
+
+               if ( b.imageFile ) {
+                       $button = $( '<img>' ).attr( {
                        src: b.imageFile,
                        alt: b.speedTip,
                        title: b.speedTip,
                        id: b.imageId || undefined,
                        'class': 'mw-toolbar-editbutton'
-               } ).click( function ( e ) {
+                       } );
+               } else {
+                       $button = $( '<div>' ).attr( {
+                               title: b.speedTip,
+                               id: b.imageId || undefined,
+                               'class': 'mw-toolbar-editbutton'
+                       } );
+               }
+
+               $button.click( function ( e ) {
                        if ( b.onClick !== undefined ) {
                                b.onClick( e );
                        } else {
@@ -44,7 +55,7 @@
                        return false;
                } );
 
-               $toolbar.append( $image );
+               $toolbar.append( $button );
        }
 
        isReady = false;
@@ -74,7 +85,7 @@
                 * @param {Object} button Object with the following properties.
                 *  You are required to provide *either* the `onClick` parameter, or the three parameters
                 *  `tagOpen`, `tagClose` and `sampleText`, but not both (they're mutually exclusive).
-                * @param {string} button.imageFile Image to use for the button.
+                * @param {string} [button.imageFile] Image to use for the button.
                 * @param {string} button.speedTip Tooltip displayed when user mouses over the button.
                 * @param {Function} [button.onClick] Function to be executed when the button is clicked.
                 * @param {string} [button.tagOpen]
@@ -82,7 +93,8 @@
                 * @param {string} [button.sampleText] Alternative to `onClick`. `tagOpen`, `tagClose` and
                 *  `sampleText` together provide the markup that should be inserted into page text at
                 *  current cursor position.
-                * @param {string} [button.imageId] `id` attribute of the button HTML element.
+                * @param {string} [button.imageId] `id` attribute of the button HTML element. Can be
+         *  used to define the image with CSS if it's not provided as `imageFile`.
                 */
                addButton: function () {
                        if ( isReady ) {
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_bold.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_bold.png
new file mode 100644 (file)
index 0000000..e524f6c
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_bold.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_headline.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_headline.png
new file mode 100644 (file)
index 0000000..398e561
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_headline.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_italic.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_italic.png
new file mode 100644 (file)
index 0000000..6ec73e9
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_italic.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_link.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_link.png
new file mode 100644 (file)
index 0000000..c9c63f6
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_link.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_nowiki.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_nowiki.png
new file mode 100644 (file)
index 0000000..743ea61
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ar/button_nowiki.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/be-tarask/button_bold.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/be-tarask/button_bold.png
new file mode 100644 (file)
index 0000000..5c10cfe
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/be-tarask/button_bold.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/be-tarask/button_italic.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/be-tarask/button_italic.png
new file mode 100644 (file)
index 0000000..72209d7
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/be-tarask/button_italic.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/be-tarask/button_link.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/be-tarask/button_link.png
new file mode 100644 (file)
index 0000000..09c86fb
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/be-tarask/button_link.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/de/button_bold.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/de/button_bold.png
new file mode 100644 (file)
index 0000000..367d5bc
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/de/button_bold.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/de/button_italic.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/de/button_italic.png
new file mode 100644 (file)
index 0000000..fdd8c9f
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/de/button_italic.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_bold.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_bold.png
new file mode 100644 (file)
index 0000000..75c3f10
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_bold.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_extlink.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_extlink.png
new file mode 100644 (file)
index 0000000..458943c
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_extlink.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_headline.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_headline.png
new file mode 100644 (file)
index 0000000..9cf751d
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_headline.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_hr.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_hr.png
new file mode 100644 (file)
index 0000000..47e1ca4
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_hr.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_image.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_image.png
new file mode 100644 (file)
index 0000000..6919296
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_image.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_italic.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_italic.png
new file mode 100644 (file)
index 0000000..527fbd1
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_italic.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_link.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_link.png
new file mode 100644 (file)
index 0000000..eb5634b
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_link.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_media.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_media.png
new file mode 100644 (file)
index 0000000..4194ec1
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_media.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_nowiki.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_nowiki.png
new file mode 100644 (file)
index 0000000..2ba818d
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_nowiki.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_sig.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_sig.png
new file mode 100644 (file)
index 0000000..fe34b3f
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/en/button_sig.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_bold.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_bold.png
new file mode 100644 (file)
index 0000000..c54d094
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_bold.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_headline.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_headline.png
new file mode 100644 (file)
index 0000000..9890d15
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_headline.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_italic.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_italic.png
new file mode 100644 (file)
index 0000000..33f91ed
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_italic.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_link.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_link.png
new file mode 100644 (file)
index 0000000..76b939e
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_link.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_nowiki.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_nowiki.png
new file mode 100644 (file)
index 0000000..743ea61
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/fa/button_nowiki.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ksh/LICENSE b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ksh/LICENSE
new file mode 100644 (file)
index 0000000..47ecfe4
--- /dev/null
@@ -0,0 +1,7 @@
+
+button_italic.png
+-------------------
+Source : http://commons.wikimedia.org/wiki/Image:Button_S_italic.png
+License: Public domain
+Author : Purodha Blissenbach, http://ksh.wikipedia.org/wiki/User:Purodha
+
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ksh/button_italic.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ksh/button_italic.png
new file mode 100644 (file)
index 0000000..15496c0
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ksh/button_italic.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ru/LICENSE b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ru/LICENSE
new file mode 100644 (file)
index 0000000..bedcec6
--- /dev/null
@@ -0,0 +1,17 @@
+button_bold.png
+---------------
+Source : http://commons.wikimedia.org/wiki/Image:Button_bold_ukr.png
+License: Public domain
+Author : Alexey Belomoev
+
+button_italic.png
+------------------------
+Source : http://commons.wikimedia.org/wiki/Image:Button_italic_ukr.png
+License: Public domain
+Author : Alexey Belomoev
+
+button_link.png
+-----------------
+Source : http://commons.wikimedia.org/wiki/Image:Button_internal_link_ukr.png
+License: GPL
+Author : Saproj, Erik Möller
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ru/button_bold.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ru/button_bold.png
new file mode 100644 (file)
index 0000000..eae30d9
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ru/button_bold.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ru/button_italic.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ru/button_italic.png
new file mode 100644 (file)
index 0000000..b958d22
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ru/button_italic.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ru/button_link.png b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ru/button_link.png
new file mode 100644 (file)
index 0000000..12ad373
Binary files /dev/null and b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/images/ru/button_link.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/mediawiki.action.edit.toolbar.less b/resources/src/mediawiki.action/mediawiki.action.edit.toolbar/mediawiki.action.edit.toolbar.less
new file mode 100644 (file)
index 0000000..d65b284
--- /dev/null
@@ -0,0 +1,42 @@
+@import "mediawiki.mixins";
+
+#mw-editbutton-bold {
+       .background-image("images/@{button-bold}");
+}
+
+#mw-editbutton-italic {
+       .background-image("images/@{button-italic}");
+}
+
+#mw-editbutton-link {
+       .background-image("images/@{button-link}");
+}
+
+#mw-editbutton-extlink {
+       .background-image("images/@{button-extlink}");
+}
+
+#mw-editbutton-headline {
+       .background-image("images/@{button-headline}");
+}
+
+#mw-editbutton-image {
+       .background-image("images/@{button-image}");
+}
+
+#mw-editbutton-media {
+       .background-image("images/@{button-media}");
+}
+
+#mw-editbutton-nowiki {
+       .background-image("images/@{button-nowiki}");
+}
+
+// Who decided to make only this single one different than the name of the data item?
+#mw-editbutton-signature {
+       .background-image("images/@{button-sig}");
+}
+
+#mw-editbutton-hr {
+       .background-image("images/@{button-hr}");
+}
index 7896e97..0604773 100644 (file)
@@ -139,10 +139,6 @@ span.texhtml {
        clear: both;
 }
 
-#toolbar img {
-       cursor: pointer;
-}
-
 /**
  * File description page
  */
diff --git a/skins/common/images/ar/button_bold.png b/skins/common/images/ar/button_bold.png
deleted file mode 100644 (file)
index e524f6c..0000000
Binary files a/skins/common/images/ar/button_bold.png and /dev/null differ
diff --git a/skins/common/images/ar/button_headline.png b/skins/common/images/ar/button_headline.png
deleted file mode 100644 (file)
index 398e561..0000000
Binary files a/skins/common/images/ar/button_headline.png and /dev/null differ
diff --git a/skins/common/images/ar/button_italic.png b/skins/common/images/ar/button_italic.png
deleted file mode 100644 (file)
index 6ec73e9..0000000
Binary files a/skins/common/images/ar/button_italic.png and /dev/null differ
diff --git a/skins/common/images/ar/button_link.png b/skins/common/images/ar/button_link.png
deleted file mode 100644 (file)
index c9c63f6..0000000
Binary files a/skins/common/images/ar/button_link.png and /dev/null differ
diff --git a/skins/common/images/ar/button_nowiki.png b/skins/common/images/ar/button_nowiki.png
deleted file mode 100644 (file)
index 743ea61..0000000
Binary files a/skins/common/images/ar/button_nowiki.png and /dev/null differ
diff --git a/skins/common/images/be-tarask/button_bold.png b/skins/common/images/be-tarask/button_bold.png
deleted file mode 100644 (file)
index 5c10cfe..0000000
Binary files a/skins/common/images/be-tarask/button_bold.png and /dev/null differ
diff --git a/skins/common/images/be-tarask/button_italic.png b/skins/common/images/be-tarask/button_italic.png
deleted file mode 100644 (file)
index 72209d7..0000000
Binary files a/skins/common/images/be-tarask/button_italic.png and /dev/null differ
diff --git a/skins/common/images/be-tarask/button_link.png b/skins/common/images/be-tarask/button_link.png
deleted file mode 100644 (file)
index 09c86fb..0000000
Binary files a/skins/common/images/be-tarask/button_link.png and /dev/null differ
diff --git a/skins/common/images/button_bold.png b/skins/common/images/button_bold.png
deleted file mode 100644 (file)
index 75c3f10..0000000
Binary files a/skins/common/images/button_bold.png and /dev/null differ
diff --git a/skins/common/images/button_extlink.png b/skins/common/images/button_extlink.png
deleted file mode 100644 (file)
index 458943c..0000000
Binary files a/skins/common/images/button_extlink.png and /dev/null differ
diff --git a/skins/common/images/button_headline.png b/skins/common/images/button_headline.png
deleted file mode 100644 (file)
index 9cf751d..0000000
Binary files a/skins/common/images/button_headline.png and /dev/null differ
diff --git a/skins/common/images/button_hr.png b/skins/common/images/button_hr.png
deleted file mode 100644 (file)
index 47e1ca4..0000000
Binary files a/skins/common/images/button_hr.png and /dev/null differ
diff --git a/skins/common/images/button_image.png b/skins/common/images/button_image.png
deleted file mode 100644 (file)
index 6919296..0000000
Binary files a/skins/common/images/button_image.png and /dev/null differ
diff --git a/skins/common/images/button_italic.png b/skins/common/images/button_italic.png
deleted file mode 100644 (file)
index 527fbd1..0000000
Binary files a/skins/common/images/button_italic.png and /dev/null differ
diff --git a/skins/common/images/button_link.png b/skins/common/images/button_link.png
deleted file mode 100644 (file)
index eb5634b..0000000
Binary files a/skins/common/images/button_link.png and /dev/null differ
diff --git a/skins/common/images/button_media.png b/skins/common/images/button_media.png
deleted file mode 100644 (file)
index 4194ec1..0000000
Binary files a/skins/common/images/button_media.png and /dev/null differ
diff --git a/skins/common/images/button_nowiki.png b/skins/common/images/button_nowiki.png
deleted file mode 100644 (file)
index 2ba818d..0000000
Binary files a/skins/common/images/button_nowiki.png and /dev/null differ
diff --git a/skins/common/images/button_sig.png b/skins/common/images/button_sig.png
deleted file mode 100644 (file)
index fe34b3f..0000000
Binary files a/skins/common/images/button_sig.png and /dev/null differ
diff --git a/skins/common/images/cyrl/LICENSE b/skins/common/images/cyrl/LICENSE
deleted file mode 100644 (file)
index bedcec6..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-button_bold.png
----------------
-Source : http://commons.wikimedia.org/wiki/Image:Button_bold_ukr.png
-License: Public domain
-Author : Alexey Belomoev
-
-button_italic.png
-------------------------
-Source : http://commons.wikimedia.org/wiki/Image:Button_italic_ukr.png
-License: Public domain
-Author : Alexey Belomoev
-
-button_link.png
------------------
-Source : http://commons.wikimedia.org/wiki/Image:Button_internal_link_ukr.png
-License: GPL
-Author : Saproj, Erik Möller
diff --git a/skins/common/images/cyrl/button_bold.png b/skins/common/images/cyrl/button_bold.png
deleted file mode 100644 (file)
index eae30d9..0000000
Binary files a/skins/common/images/cyrl/button_bold.png and /dev/null differ
diff --git a/skins/common/images/cyrl/button_italic.png b/skins/common/images/cyrl/button_italic.png
deleted file mode 100644 (file)
index b958d22..0000000
Binary files a/skins/common/images/cyrl/button_italic.png and /dev/null differ
diff --git a/skins/common/images/cyrl/button_link.png b/skins/common/images/cyrl/button_link.png
deleted file mode 100644 (file)
index 12ad373..0000000
Binary files a/skins/common/images/cyrl/button_link.png and /dev/null differ
diff --git a/skins/common/images/de/button_bold.png b/skins/common/images/de/button_bold.png
deleted file mode 100644 (file)
index 367d5bc..0000000
Binary files a/skins/common/images/de/button_bold.png and /dev/null differ
diff --git a/skins/common/images/de/button_italic.png b/skins/common/images/de/button_italic.png
deleted file mode 100644 (file)
index fdd8c9f..0000000
Binary files a/skins/common/images/de/button_italic.png and /dev/null differ
diff --git a/skins/common/images/fa/button_bold.png b/skins/common/images/fa/button_bold.png
deleted file mode 100644 (file)
index c54d094..0000000
Binary files a/skins/common/images/fa/button_bold.png and /dev/null differ
diff --git a/skins/common/images/fa/button_headline.png b/skins/common/images/fa/button_headline.png
deleted file mode 100644 (file)
index 9890d15..0000000
Binary files a/skins/common/images/fa/button_headline.png and /dev/null differ
diff --git a/skins/common/images/fa/button_italic.png b/skins/common/images/fa/button_italic.png
deleted file mode 100644 (file)
index 33f91ed..0000000
Binary files a/skins/common/images/fa/button_italic.png and /dev/null differ
diff --git a/skins/common/images/fa/button_link.png b/skins/common/images/fa/button_link.png
deleted file mode 100644 (file)
index 76b939e..0000000
Binary files a/skins/common/images/fa/button_link.png and /dev/null differ
diff --git a/skins/common/images/fa/button_nowiki.png b/skins/common/images/fa/button_nowiki.png
deleted file mode 100644 (file)
index 743ea61..0000000
Binary files a/skins/common/images/fa/button_nowiki.png and /dev/null differ
diff --git a/skins/common/images/ksh/LICENSE b/skins/common/images/ksh/LICENSE
deleted file mode 100644 (file)
index ba56f97..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-
-button_S_italic.png
--------------------
-Source : http://commons.wikimedia.org/wiki/Image:Button_S_italic.png
-License: Public domain
-Author : Purodha Blissenbach, http://ksh.wikipedia.org/wiki/User:Purodha
-
diff --git a/skins/common/images/ksh/button_S_italic.png b/skins/common/images/ksh/button_S_italic.png
deleted file mode 100644 (file)
index 15496c0..0000000
Binary files a/skins/common/images/ksh/button_S_italic.png and /dev/null differ
index 62157d2..71e0f4b 100644 (file)
@@ -6,7 +6,7 @@
  * @see https://github.com/sebastianbergmann/phpunit/blob/master/src/Extensions/PhptTestCase.php
  * @author Sam Smith <samsmith@wikimedia.org>
  */
-class LessFileCompilationTest extends MediaWikiTestCase {
+class LessFileCompilationTest extends ResourceLoaderTestCase {
 
        /**
         * @var string $file
@@ -38,7 +38,13 @@ class LessFileCompilationTest extends MediaWikiTestCase {
                        "$thisString must refer to a readable file"
                );
 
-               $compiler = ResourceLoader::getLessCompiler( RequestContext::getMain()->getConfig() );
+               $rlContext = static::getResourceLoaderContext();
+
+               // Bleh
+               $method = new ReflectionMethod( $this->module, 'getLessCompiler' );
+               $method->setAccessible( true );
+               $compiler = $method->invoke( $this->module, $rlContext );
+
                $this->assertNotNull( $compiler->compileFile( $this->file ) );
        }
 
index 247e352..f0bd42a 100644 (file)
@@ -32,7 +32,7 @@ class ExifRotationTest extends MediaWikiMediaTestCase {
         * @dataProvider provideFiles
         */
        public function testMetadata( $name, $type, $info ) {
-               if ( !BitmapHandler::canRotate() ) {
+               if ( !$this->handler->canRotate() ) {
                        $this->markTestSkipped( "This test needs a rasterizer that can auto-rotate." );
                }
                $file = $this->dataFile( $name, $type );
@@ -40,12 +40,29 @@ class ExifRotationTest extends MediaWikiMediaTestCase {
                $this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
        }
 
+       /**
+        * Same as before, but with auto-rotation set to auto.
+        *
+        * This sets scaler to image magick, which we should detect as
+        * supporting rotation.
+        * @dataProvider provideFiles
+        */
+       public function testMetadataAutoRotate( $name, $type, $info ) {
+               $this->setMwGlobals( 'wgEnableAutoRotation', null );
+               $this->setMwGlobals( 'wgUseImageMagick', true );
+               $this->setMwGlobals( 'wgUseImageResize', true );
+
+               $file = $this->dataFile( $name, $type );
+               $this->assertEquals( $info['width'], $file->getWidth(), "$name: width check" );
+               $this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
+       }
+
        /**
         *
         * @dataProvider provideFiles
         */
        public function testRotationRendering( $name, $type, $info, $thumbs ) {
-               if ( !BitmapHandler::canRotate() ) {
+               if ( !$this->handler->canRotate() ) {
                        $this->markTestSkipped( "This test needs a rasterizer that can auto-rotate." );
                }
                foreach ( $thumbs as $size => $out ) {
@@ -133,6 +150,19 @@ class ExifRotationTest extends MediaWikiMediaTestCase {
                $this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
        }
 
+       /**
+        * Same as before, but with auto-rotation set to auto and an image scaler that doesn't support it.
+        * @dataProvider provideFilesNoAutoRotate
+        */
+       public function testMetadataAutoRotateUnsupported( $name, $type, $info ) {
+               $this->setMwGlobals( 'wgEnableAutoRotation', null );
+               $this->setMwGlobals( 'wgUseImageResize', false );
+
+               $file = $this->dataFile( $name, $type );
+               $this->assertEquals( $info['width'], $file->getWidth(), "$name: width check" );
+               $this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
+       }
+
        /**
         *
         * @dataProvider provideFilesNoAutoRotate