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
'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',
'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',
( ( $this->minoredit && !$this->isNew ) ? EDIT_MINOR : 0 ) |
( $bot ? EDIT_FORCE_BOT : 0 );
- $doEditStatus = $this->mArticle->doEditContent( $content, $this->summary, $flags,
- false, null, $this->contentFormat );
+ $doEditStatus = $this->mArticle->doEditContent(
+ $content,
+ $this->summary,
+ $flags,
+ false,
+ null,
+ $content->getDefaultFormat()
+ );
if ( !$doEditStatus->isOK() ) {
// Failure from doEdit()
$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" );
* @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' => '\'\'\'',
'tip' => wfMessage( 'bold_tip' )->text(),
),
array(
- 'image' => $wgLang->getImageFile( 'button-italic' ),
'id' => 'mw-editbutton-italic',
'open' => '\'\'',
'close' => '\'\'',
'tip' => wfMessage( 'italic_tip' )->text(),
),
array(
- 'image' => $wgLang->getImageFile( 'button-link' ),
'id' => 'mw-editbutton-link',
'open' => '[[',
'close' => ']]',
'tip' => wfMessage( 'link_tip' )->text(),
),
array(
- 'image' => $wgLang->getImageFile( 'button-extlink' ),
'id' => 'mw-editbutton-extlink',
'open' => '[',
'close' => ']',
'tip' => wfMessage( 'extlink_tip' )->text(),
),
array(
- 'image' => $wgLang->getImageFile( 'button-headline' ),
'id' => 'mw-editbutton-headline',
'open' => "\n== ",
'close' => " ==\n",
'tip' => wfMessage( 'headline_tip' )->text(),
),
$imagesAvailable ? array(
- 'image' => $wgLang->getImageFile( 'button-image' ),
'id' => 'mw-editbutton-image',
'open' => '[[' . $wgContLang->getNsText( NS_FILE ) . ':',
'close' => ']]',
'tip' => wfMessage( 'image_tip' )->text(),
) : false,
$imagesAvailable ? array(
- 'image' => $wgLang->getImageFile( 'button-media' ),
'id' => 'mw-editbutton-media',
'open' => '[[' . $wgContLang->getNsText( NS_MEDIA ) . ':',
'close' => ']]',
'tip' => wfMessage( 'media_tip' )->text(),
) : false,
array(
- 'image' => $wgLang->getImageFile( 'button-nowiki' ),
'id' => 'mw-editbutton-nowiki',
'open' => "<nowiki>",
'close' => "</nowiki>",
'tip' => wfMessage( 'nowiki_tip' )->text(),
),
array(
- 'image' => $wgLang->getImageFile( 'button-sig' ),
'id' => 'mw-editbutton-signature',
'open' => '--~~~~',
'close' => '',
'tip' => wfMessage( 'sig_tip' )->text(),
),
array(
- 'image' => $wgLang->getImageFile( 'button-hr' ),
'id' => 'mw-editbutton-hr',
'open' => "\n----\n",
'close' => '',
}
$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
$text = $this->getNativeData();
$pst = rtrim( $text );
- return ( $text === $pst ) ? $this : new static( $pst );
+ return ( $text === $pst ) ? $this : new static( $pst, $this->getModel() );
}
/**
if ( !empty( $field->mParams['nodata'] ) ) {
continue;
}
+ if ( $field->isHidden( $this->mFieldData ) ) {
+ continue;
+ }
if ( $field->validate(
$this->mFieldData[$fieldname],
$this->mFieldData )
}
$data = $data[$key];
}
- $testValue = $data;
+ $testValue = (string)$data;
break;
}
*
* @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
*
* @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 ) {
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
*
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
*
}
/**
- * 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 );
*
* @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
* @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;
$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 ) . " " .
"$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;
- }
}
// 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 {
* @return int 0, 90, 180 or 270
*/
public function getRotation( $file ) {
- if ( !BitmapHandler::autoRotateEnabled() ) {
+ if ( !$this->autoRotateEnabled() ) {
return 0;
}
/**
* 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;
}
--- /dev/null
+<?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;
+ }
+}
* @param bool $checkDstPath
* @return string
*/
- protected static function getScalerType( $dstPath, $checkDstPath = true ) {
+ protected function getScalerType( $dstPath, $checkDstPath = true ) {
return "im";
}
--- /dev/null
+<?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;
+ }
+}
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 );
*
* @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();
}
$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 );
}
*
* @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 ) ) {
}
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 );
* @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() );
+ }
}
'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
$page['language'] = array(
'id' => 'mw-pl-languageselector',
+ 'cssclass' => 'mw-languageselector',
'type' => 'select',
'options' => $options,
'label-message' => 'pagelang-language',
public function alterForm( HTMLForm $form ) {
$form->setDisplayFormat( 'vform' );
$form->setWrapperLegend( false );
+ wfRunHooks( 'LanguageSelector', array( $this->getOutput(), 'mw-languageselector' ) );
}
/**
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();
+ }
}
/**
return self::$dataCache->getSubitem( $this->mCode, 'imageFiles', $image );
}
+ /**
+ * @return array
+ * @since 1.24
+ */
+ function getImageFiles() {
+ return self::$dataCache->getItem( $this->mCode, 'imageFiles' );
+ }
+
/**
* @return array
*/
"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": "عضو في:",
"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": "پەیام:",
"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ó",
},
"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",
"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]» افزوده خواهد شد.",
"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\"> '''Sign your username:''' <charinsert>--~~~~</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> <charinsert><nowiki>{{{</nowiki>+<nowiki>}}}</nowiki> </charinsert> <charinsert><nowiki>|</nowiki></charinsert> <charinsert>[+]</charinsert> <charinsert>[[+]]</charinsert> <charinsert>[[Category:+]]</charinsert> <charinsert>#REDIRECT [[+]]</charinsert> <charinsert>{{Subst:Fôn-ngiàng}}</charinsert> <charinsert>{{Subst:PAGENAME}}</charinsert> <charinsert> </charinsert> <charinsert><s>+</s></charinsert> <charinsert><sup>+</sup></charinsert> <charinsert><sub>+</sub></charinsert> <charinsert><code>+</code></charinsert> <charinsert><blockquote>+</blockquote></charinsert> <charinsert><ref>+</ref></charinsert> <charinsert><nowiki>{{</nowiki>Reflist<nowiki>}}</nowiki></charinsert> <charinsert><references/></charinsert> <charinsert><includeonly>+</includeonly></charinsert> <charinsert><noinclude>+</noinclude></charinsert> <charinsert><nowiki>{{</nowiki>DEFAULTSORT:+<nowiki>}}</nowiki></charinsert> <charinsert><nowiki>+</nowiki></charinsert> <charinsert><nowiki><!-- </nowiki>+<nowiki> --></nowiki></charinsert> <charinsert><nowiki><span class=\"plainlinks\"></nowiki>+<nowiki></span></nowiki></charinsert> • ([[Wikipedia:Template messages|templates]])<br/></span> <span id=\"edittools_symbols\">'''Symbols:''' <charinsert> ~ | ¡ ¿ † ‡ ↔ ↑ ↓ • ¶</charinsert> <charinsert> # ½ ⅓ ⅔ ¼ ¾ ⅛ ⅜ ⅝ ⅞ ∞ </charinsert> <charinsert> ‘ “ ’ ” «+»</charinsert> <charinsert> ¤ ₳ ฿ ₵ ¢ ₡ ₢ $ ₫ ₯ € ₠ ₣ ƒ ₴ ₭ ₤ ℳ ₥ ₦ № ₧ ₰ £ ៛ ₨ ₪ ৳ ₮ ₩ ¥ </charinsert> <charinsert> ♠ ♣ ♥ ♦ </charinsert> <charinsert>m²</charinsert> <charinsert>m³</charinsert><br/></span> <span id=\"edittools_characters\">'''Characters:''' <span class=\"latinx\"> <charinsert> Á á Ć ć É é Í í Ĺ ĺ Ḿ ḿ Ń ń Ó ó Ŕ ŕ Ś ś Ú ú Ý ý Ź ź </charinsert> <charinsert> À à È è Ì ì M̀ m̀ Ǹ ǹ Ò ò Ù ù </charinsert> <charinsert>  â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û Ŵ ŵ Ŷ ŷ </charinsert> <charinsert> A̤ a̤ E̤ e̤ I̤ i̤ O̤ o̤ Ṳ ṳ </charinsert> \n<charinsert> A̍ a̍ E̍ e̍ I̍ i̍ O̍ o̍ U̍ u̍ </charinsert> <charinsert> À̤ à̤ È̤ è̤ Ì̤ ì̤ Ò̤ ò̤ Ṳ̀ ṳ̀ </charinsert> \n<charinsert> Á̤ á̤ É̤ é̤ Í̤ í̤ Ó̤ ó̤ Ṳ́ ṳ́ </charinsert> <charinsert> A̤̍ a̤̍ E̤̍ e̤̍ I̤̍ i̤̍ O̤̍ o̤̍ Ṳ̍ ṳ̍ </charinsert> \n<charinsert> Â̤ â̤ Ê̤ ê̤ Î̤ î̤ Ô̤ ô̤ Ṳ̂ ṳ̂ </charinsert> <charinsert>  â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û Ŵ ŵ Ŷ ŷ </charinsert> <charinsert> Ä ä Ë ë Ï ï Ö ö Ü ü Ÿ ÿ </charinsert> <charinsert> ß </charinsert> <charinsert> à ã Ẽ ẽ Ĩ ĩ Ñ ñ Õ õ Ũ ũ Ỹ ỹ</charinsert> <charinsert> Ç ç Ģ ģ Ķ ķ Ļ ļ Ņ ņ Ŗ ŗ Ş ş Ţ ţ </charinsert> <charinsert> Đ đ </charinsert> <charinsert> Ů ů </charinsert> <charinsert> Ǎ ǎ Č č Ď ď Ě ě Ǐ ǐ Ľ ľ Ň ň Ǒ ǒ Ř ř Š š Ť ť Ǔ ǔ Ž ž </charinsert> <charinsert> Ā ā Ē ē Ī ī Ō ō Ū ū Ȳ ȳ Ǣ ǣ </charinsert> <charinsert> ǖ ǘ ǚ ǜ </charinsert> <charinsert> Ă ă Ĕ ĕ Ğ ğ Ĭ ĭ Ŏ ŏ Ŭ ŭ </charinsert> <charinsert> Ċ ċ Ė ė Ġ ġ İ ı Ż ż </charinsert> <charinsert> Ą ą Ę ę Į į Ǫ ǫ Ų ų </charinsert> <charinsert> Ḍ ḍ Ḥ ḥ Ḷ ḷ Ḹ ḹ Ṃ ṃ Ṇ ṇ Ṛ ṛ Ṝ ṝ Ṣ ṣ Ṭ ṭ </charinsert> <charinsert> Ł ł </charinsert> <charinsert> Ő ő Ű ű </charinsert> <charinsert> Ŀ ŀ </charinsert> <charinsert> Ħ ħ </charinsert> <charinsert> Ð ð Þ þ </charinsert> <charinsert> Œ œ </charinsert> <charinsert> Æ æ Ø ø Å å </charinsert> <charinsert> Ə ə </charinsert></span> <span id=\"edittools_latinx_template\"> • <charinsert><nowiki>{{</nowiki><nowiki>Unicode|</nowiki>+<nowiki>}}</nowiki></charinsert></span><br/></span> <span id=\"edittools_greek\">'''Hî-lia̍p-vùn:''' <charinsert> Ά ά Έ έ Ή ή Ί ί Ό ό Ύ ύ Ώ ώ </charinsert> <charinsert> Α α Β β Γ γ Δ δ </charinsert> <charinsert> Ε ε Ζ ζ Η η Θ θ </charinsert> <charinsert> Ι ι Κ κ Λ λ Μ μ </charinsert> <charinsert> Ν ν Ξ ξ Ο ο Π π </charinsert> <charinsert> Ρ ρ Σ σ ς Τ τ Υ υ </charinsert> <charinsert> Φ φ Χ χ Ψ ψ Ω ω </charinsert> <span id=\"edittools_greek_template\">• <charinsert><nowiki>{{</nowiki><nowiki>Polytonic|</nowiki>+<nowiki>}}</nowiki></charinsert></span> <span id=\"edittools_greek_example\">• ([[Greek diacritics#Computer encoding|polytonic list]])</span><br/></span> <span id=\"edittools_cyrillic\">'''Cyrillic:''' <charinsert> А а Б б В в Г г </charinsert> <charinsert> Ґ ґ Ѓ ѓ Д д Ђ ђ </charinsert> <charinsert> Е е Ё ё Є є Ж ж </charinsert> <charinsert> З з Ѕ ѕ И и І і </charinsert> <charinsert> Ї ї Й й Ј ј К к </charinsert> <charinsert> Ќ ќ Л л Љ љ М м </charinsert> <charinsert> Н н Њ њ О о П п </charinsert> <charinsert> Р р С с Т т Ћ ћ </charinsert> <charinsert> У у Ў ў Ф ф Х х </charinsert> <charinsert> Ц ц Ч ч Џ џ Ш ш </charinsert> <charinsert> Щ щ Ъ ъ Ы ы Ь ь </charinsert> <charinsert> Э э Ю ю Я я </charinsert> <br/></span> <span id=\"edittools_ipa\">'''IPA:''' <span title=\"Pronunciation in IPA\" class=\"IPA\"><charinsert>t̪ d̪ ʈ ɖ ɟ ɡ ɢ ʡ ʔ </charinsert> <charinsert> ɸ ʃ ʒ ɕ ʑ ʂ ʐ ʝ ɣ ʁ ʕ ʜ ʢ ɦ </charinsert> <charinsert> ɱ ɳ ɲ ŋ ɴ </charinsert> <charinsert> ʋ ɹ ɻ ɰ </charinsert> <charinsert> ʙ ʀ ɾ ɽ </charinsert> <charinsert> ɫ ɬ ɮ ɺ ɭ ʎ ʟ </charinsert> <charinsert> ɥ ʍ ɧ </charinsert> <charinsert> ɓ ɗ ʄ ɠ ʛ </charinsert> <charinsert> ʘ ǀ ǃ ǂ ǁ </charinsert> <charinsert> ɨ ʉ ɯ </charinsert> <charinsert> ɪ ʏ ʊ </charinsert> <charinsert> ɘ ɵ ɤ </charinsert> <charinsert> ə ɚ </charinsert> <charinsert> ɛ ɜ ɝ ɞ ʌ ɔ </charinsert> <charinsert> ɐ ɶ ɑ ɒ </charinsert> <charinsert> ʰ ʷ ʲ ˠ ˤ ⁿ ˡ </charinsert> <charinsert> ˈ ˌ ː ˑ ̪ </charinsert> </span> • <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": "在下背嘅名字空間肚搜尋:",
"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",
"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": "էլ-փոստով տեղեկացնել հսկվող էջերում փոփոխությունների մասին",
"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",
"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",
"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": "ახალი გვერდები",
"tooltip-recreate": "Бет жойылғанына қарамастан қайта бастау",
"tooltip-upload": "Жүктеуді бастау",
"tooltip-rollback": "\"Шегіндіру\" сілтемесін бір рет басу арқылы соңға редактордың барлық қатар өңдемелерін өшіру",
+ "tooltip-undo": "«Жоққа шығару» сілтемесін бассаңыз бұл өңдеме болдырылмайды және өңдеу пішіні қарап шығу режимінде ашылады. Ол өңдеу түйіндемесіне себебін қосуға мүмкіндік береді.",
"tooltip-preferences-save": "Бапталымдарыңызды сақтау",
"tooltip-summary": "Қысқаша түйіндемесін енгізіңіз",
"interlanguage-link-title-nonlang": "$1 – $2",
"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": "; ",
+ "comma-separator": ", ",
+ "colon-separator": ": ",
+ "pipe-separator": " | ",
+ "word-separator": " ",
+ "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 ('''ناکنشتگر بیه''')"
}
"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": "原註",
"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": "Извод",
"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",
"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",
"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",
"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": "Поиск заблокированного участника",
"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": "; ",
"comma-separator": ", ",
"colon-separator": ": ",
"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"
}
"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",
"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": "прикажи и уреди списак надгледања",
"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",
"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",
"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": "איר האט נישט קיין רשות צו באוועגן טעקעס.",
"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?",
"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": "確認您的電子郵件位址",
* 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',
);
/**
);
$imageFiles = array(
- 'button-italic' => 'ksh/button_S_italic.png',
+ 'button-italic' => 'ksh/button_italic.png',
);
$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';
bmysql
bname
bodycontent
+bogo
boldening
bolding
booksources
categoryviewer
catids
catlinks
+catmsg
catpage
catrope
cattitles
geodata
geosearch
gerrit
+geshi
getcookie
getenv
getheader
hitcount
hitcounter
hits
+hlist
hmac
hobby
homelink
loginfo
loginlanguagelinks
loginlink
+loginout
loginprompt
loginreqlink
loginreqpagetext
moredotdotdot
morelinkstoimage
morethan
+mouseup
move
movedarticleprotection
moveddeleted
newquery
newrevid
news
+newsectionheaderdefaultlevel
newsectionlink
newsectionsummary
newset
testclean
testdata
testmailuser
+teston
testpass
testrunner
testswarm
troff
true
truespeed
+truncatedtext
trustworthy
truteq
truthy
unserialization
unserialize
unserialized
+unserializes
unserializing
unsetting
unstub
viewhelppage
viewmyprivateinfo
viewmywatchlist
+viewport
viewprevnext
viewsource
viewsourcelink
xmldoublequote
xmlfm
xmlimport
+xmlmeta
xmlns
xmlselect
xor
'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',
),
'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',
/*!
- * OOjs UI v0.1.0-pre (073f37e258)
+ * 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-15T15:00:24Z
+ * Date: 2014-09-15T22:18:37Z
*/
/*
* Blank theme mixins.
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;
/*!
- * OOjs UI v0.1.0-pre (073f37e258)
+ * 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-15T15:00:24Z
+ * Date: 2014-09-15T22:18:37Z
*/
/*
* Blank theme mixins.
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;
/*!
- * OOjs UI v0.1.0-pre (073f37e258)
+ * 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-15T15:00:24Z
+ * Date: 2014-09-15T22:18:37Z
*/
( function ( OO ) {
} )();
+/**
+ * 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.
*
* @abstract
* @class
* @extends OO.ui.Window
+ * @mixins OO.ui.PendingElement
*
* @constructor
* @param {Object} [config] Configuration options
// 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, {
/* Setup */
OO.inheritClass( OO.ui.Dialog, OO.ui.Window );
+OO.mixinClass( OO.ui.Dialog, OO.ui.PendingElement );
/* Static Properties */
}
};
-/**
- * Check if input is pending.
- *
- * @return {boolean}
- */
-OO.ui.Dialog.prototype.isPending = function () {
- return !!this.pending;
-};
-
/**
* Get set of actions.
*
// Initialization
this.$content.addClass( 'oo-ui-dialog-content' );
+ this.setPendingElement( this.$head );
};
/**
.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.
*
*
* @class
* @extends OO.ui.ButtonWidget
+ * @mixins OO.ui.PendingElement
*
* @constructor
* @param {Object} [config] Configuration options
// 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 || [];
/* Setup */
OO.inheritClass( OO.ui.ActionWidget, OO.ui.ButtonWidget );
+OO.mixinClass( OO.ui.ActionWidget, OO.ui.PendingElement );
/* Events */
* @extends OO.ui.InputWidget
* @mixins OO.ui.IconElement
* @mixins OO.ui.IndicatorElement
+ * @mixins OO.ui.PendingElement
*
* @constructor
* @param {Object} [config] Configuration options
// 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;
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 */
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.
*
/*!
- * OOjs UI v0.1.0-pre (073f37e258)
+ * 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-15T15:00:24Z
+ * Date: 2014-09-15T22:18:37Z
*/
/*
* Blank theme mixins.
--- /dev/null
+/*!
+ * 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;
+}
* @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 {
return false;
} );
- $toolbar.append( $image );
+ $toolbar.append( $button );
}
isReady = false;
* @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]
* @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 ) {
--- /dev/null
+
+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
+
--- /dev/null
+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
--- /dev/null
+@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}");
+}
clear: both;
}
-#toolbar img {
- cursor: pointer;
-}
-
/**
* File description page
*/
+++ /dev/null
-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
+++ /dev/null
-
-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
-
* @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
"$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 ) );
}
* @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 );
$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 ) {
$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