<exclude-pattern>*/includes/specials/SpecialMostinterwikis\.php</exclude-pattern>
<exclude-pattern>*/includes/cache/CacheDependency\.php</exclude-pattern>
<exclude-pattern>*/includes/cache/CacheHelper\.php</exclude-pattern>
+ <exclude-pattern>*/includes/compat/XMPReader\.php</exclude-pattern>
<exclude-pattern>*/includes/diff/DairikiDiff\.php</exclude-pattern>
<exclude-pattern>*/includes/specials/SpecialAncientpages\.php</exclude-pattern>
<exclude-pattern>*/includes/specials/SpecialBrokenRedirects\.php</exclude-pattern>
<exclude-pattern>*/includes/AuthPlugin\.php</exclude-pattern>
<exclude-pattern>*/includes/cache/CacheDependency\.php</exclude-pattern>
<exclude-pattern>*/includes/cache/CacheHelper\.php</exclude-pattern>
+ <exclude-pattern>*/includes/compat/XMPReader\.php</exclude-pattern>
<exclude-pattern>*/includes/deferred/CdnCacheUpdate\.php</exclude-pattern>
<exclude-pattern>*/includes/diff/DairikiDiff\.php</exclude-pattern>
<exclude-pattern>*/includes/diff/DiffEngine\.php</exclude-pattern>
==== Upgraded external libraries ====
* Updated QUnit from 2.4.0 to 2.6.0.
+* Updated wikimedia/scoped-callback from 1.0.0 to 2.0.0.
+** ScopedCallback objects can no longer be serialized.
==== New external libraries ====
+* Added wikimedia/xmp-reader 0.5.1
* …
==== Removed and replaced external libraries ====
values `true` and `false` respectively.
* The $parserMemc global and wfGetParserCacheStorage(), deprecated since 1.30,
were removed. Use the ParserCache class instead.
+* ScopedCallback (deprecated in 1.28) was removed. Use Wikimedia\ScopedCallback
+ instead.
=== Deprecations in 1.32 ===
* Use of a StartProfiler.php file is deprecated in favour of placing
constant INTL_ICU_VERSION directly in all versions that MediaWiki supports.
* Parser::fetchFile() is deprecated. Use ::fetchFileAndTitle() instead.
* The ApiQueryContributions class has been renamed to ApiQueryUserContribs.
+* The XMPInfo, XMPReader, and XMPValidate classes have been deprecated in favor
+ of the namespaced classes provided by the wikimedia/xmp-reader library.
=== Other changes in 1.32 ===
* …
'SVGReader' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
'SamplingStatsdClient' => __DIR__ . '/includes/libs/stats/SamplingStatsdClient.php',
'Sanitizer' => __DIR__ . '/includes/parser/Sanitizer.php',
- 'ScopedCallback' => __DIR__ . '/includes/compat/ScopedCallback.php',
'ScopedLock' => __DIR__ . '/includes/libs/lockmanager/ScopedLock.php',
'SearchApi' => __DIR__ . '/includes/api/SearchApi.php',
'SearchDatabase' => __DIR__ . '/includes/search/SearchDatabase.php',
'WrapOldPasswords' => __DIR__ . '/maintenance/wrapOldPasswords.php',
'XCFHandler' => __DIR__ . '/includes/media/XCF.php',
'XMLRCFeedFormatter' => __DIR__ . '/includes/rcfeed/XMLRCFeedFormatter.php',
- 'XMPInfo' => __DIR__ . '/includes/libs/xmp/XMPInfo.php',
- 'XMPReader' => __DIR__ . '/includes/libs/xmp/XMP.php',
- 'XMPValidate' => __DIR__ . '/includes/libs/xmp/XMPValidate.php',
+ 'XMPInfo' => __DIR__ . '/includes/compat/XMPReader.php',
+ 'XMPReader' => __DIR__ . '/includes/compat/XMPReader.php',
+ 'XMPValidate' => __DIR__ . '/includes/compat/XMPReader.php',
'Xhprof' => __DIR__ . '/includes/libs/Xhprof.php',
'XhprofData' => __DIR__ . '/includes/libs/XhprofData.php',
'Xml' => __DIR__ . '/includes/Xml.php',
"wikimedia/relpath": "2.1.1",
"wikimedia/remex-html": "1.0.3",
"wikimedia/running-stat": "1.2.1",
- "wikimedia/scoped-callback": "1.0.0",
+ "wikimedia/scoped-callback": "2.0.0",
"wikimedia/utfnormal": "2.0.0",
"wikimedia/timestamp": "1.0.0",
"wikimedia/wait-condition-loop": "1.0.1",
"wikimedia/wrappedstring": "3.0.0",
+ "wikimedia/xmp-reader": "0.5.1",
"zordius/lightncandy": "0.23"
},
"require-dev": {
switch ( $this->mode ) {
case 'get':
- $this->func_name = isset( $_GET["rs"] ) ? $_GET["rs"] : '';
+ $this->func_name = $_GET["rs"] ?? '';
if ( !empty( $_GET["rsargs"] ) ) {
$this->args = $_GET["rsargs"];
} else {
}
break;
case 'post':
- $this->func_name = isset( $_POST["rs"] ) ? $_POST["rs"] : '';
+ $this->func_name = $_POST["rs"] ?? '';
if ( !empty( $_POST["rsargs"] ) ) {
$this->args = $_POST["rsargs"];
} else {
protected function initFromRow( $row ) {
$this->setTarget( $row->ipb_address );
$this->setBlocker( User::newFromAnyId(
- $row->ipb_by, $row->ipb_by_text, isset( $row->ipb_by_actor ) ? $row->ipb_by_actor : null
+ $row->ipb_by, $row->ipb_by_text, $row->ipb_by_actor ?? null
) );
$this->mTimestamp = wfTimestamp( TS_MW, $row->ipb_timestamp );
private function getCommentInternal( IDatabase $db = null, $key, $row, $fallback = false ) {
$row = (array)$row;
if ( array_key_exists( "{$key}_text", $row ) && array_key_exists( "{$key}_data", $row ) ) {
- $cid = isset( $row["{$key}_cid"] ) ? $row["{$key}_cid"] : null;
+ $cid = $row["{$key}_cid"] ?? null;
$text = $row["{$key}_text"];
$data = $row["{$key}_data"];
} elseif ( $this->stage === MIGRATION_OLD ) {
$query = $query . '&' . $extraQueryRedirect;
}
}
- $anchor = isset( $resultDetails['sectionanchor'] ) ? $resultDetails['sectionanchor'] : '';
+ $anchor = $resultDetails['sectionanchor'] ?? '';
$out->redirect( $this->mTitle->getFullURL( $query ) . $anchor );
return false;
$checkboxesDef = $this->getCheckboxesDefinition( $checked );
foreach ( $checkboxesDef as $name => $options ) {
- $legacyName = isset( $options['legacy-name'] ) ? $options['legacy-name'] : $name;
+ $legacyName = $options['legacy-name'] ?? $name;
$title = null;
$accesskey = null;
'align' => 'inline',
'label' => new OOUI\HtmlSnippet( $this->context->msg( $options['label-message'] )->parse() ),
'title' => $title,
- 'id' => isset( $options['label-id'] ) ? $options['label-id'] : null,
+ 'id' => $options['label-id'] ?? null,
]
);
}
$prefix = $wgCookiePrefix;
}
$name = $prefix . $key;
- return isset( $this->cookies[$name] ) ? $this->cookies[$name] : $default;
+ return $this->cookies[$name] ?? $default;
}
/**
if ( is_string( $a ) && is_string( $b ) ) {
return strcmp( $a, $b );
} elseif ( count( $a ) !== count( $b ) ) {
- return count( $a ) < count( $b ) ? -1 : 1;
+ return count( $a ) <=> count( $b );
} else {
reset( $a );
reset( $b );
$frames = array_map( function ( $frame ) use ( $frameFormat ) {
$file = !empty( $frame['file'] ) ? basename( $frame['file'] ) : '-';
- $line = isset( $frame['line'] ) ? $frame['line'] : '-';
+ $line = $frame['line'] ?? '-';
$call = $frame['function'];
if ( !empty( $frame['class'] ) ) {
$call = $frame['class'] . $frame['type'] . $call;
}
$includeStderr = isset( $options['duplicateStderr'] ) && $options['duplicateStderr'];
- $profileMethod = isset( $options['profileMethod'] ) ? $options['profileMethod'] : wfGetCaller();
+ $profileMethod = $options['profileMethod'] ?? wfGetCaller();
try {
$result = Shell::command( [] )
unset( $attribs['type'] );
}
if ( $element === 'input' ) {
- $type = isset( $attribs['type'] ) ? $attribs['type'] : null;
- $value = isset( $attribs['value'] ) ? $attribs['value'] : null;
+ $type = $attribs['type'] ?? null;
+ $value = $attribs['value'] ?? null;
if ( $type === 'checkbox' || $type === 'radio' ) {
// The default value for checkboxes and radio buttons is 'on'
// not ''. By stripping value="" we break radio boxes that
if ( isset( $params['label'] ) ) {
$ret .= self::element(
'label', [
- 'for' => isset( $selectAttribs['id'] ) ? $selectAttribs['id'] : null,
+ 'for' => $selectAttribs['id'] ?? null,
], $params['label']
) . ' ';
}
}
// Clean up parameters
- $page = isset( $handlerParams['page'] ) ? $handlerParams['page'] : false;
+ $page = $handlerParams['page'] ?? false;
if ( !isset( $frameParams['align'] ) ) {
$frameParams['align'] = '';
}
$params = [
'alt' => $frameParams['alt'],
'title' => $frameParams['title'],
- 'valign' => isset( $frameParams['valign'] ) ? $frameParams['valign'] : false,
+ 'valign' => $frameParams['valign'] ?? false,
'img-class' => $frameParams['class'] ];
if ( isset( $frameParams['border'] ) ) {
$params['img-class'] .= ( $params['img-class'] !== '' ? ' ' : '' ) . 'thumbborder';
) {
$exists = $file && $file->exists();
- $page = isset( $handlerParams['page'] ) ? $handlerParams['page'] : false;
+ $page = $handlerParams['page'] ?? false;
if ( !isset( $frameParams['align'] ) ) {
$frameParams['align'] = 'right';
}
*/
public static function getNamespaceContentModel( $index ) {
global $wgNamespaceContentModels;
- return isset( $wgNamespaceContentModels[$index] )
- ? $wgNamespaceContentModels[$index]
- : null;
+ return $wgNamespaceContentModels[$index] ?? null;
}
/**
public function compareStringLength( $s1, $s2 ) {
$l1 = strlen( $s1 );
$l2 = strlen( $s2 );
- if ( $l1 < $l2 ) {
- return 1;
- } elseif ( $l1 > $l2 ) {
- return -1;
- } else {
- return 0;
- }
+ return $l2 <=> $l1; // descending
}
/**
try {
$statsdServer = explode( ':', $config->get( 'StatsdServer' ) );
$statsdHost = $statsdServer[0];
- $statsdPort = isset( $statsdServer[1] ) ? $statsdServer[1] : 8125;
+ $statsdPort = $statsdServer[1] ?? 8125;
$statsdSender = new SocketSender( $statsdHost, $statsdPort );
$statsdClient = new SamplingStatsdClient( $statsdSender, true, false );
$statsdClient->setSamplingRates( $config->get( 'StatsdSamplingRates' ) );
echo $templateParser->processTemplate(
'NoLocalSettings',
[
- 'wgVersion' => ( isset( $wgVersion ) ? $wgVersion : 'VERSION' ),
+ 'wgVersion' => ( $wgVersion ?? 'VERSION' ),
'path' => $path,
'localSettingsExists' => file_exists( MW_CONFIG_FILE ),
'installerStarted' => $installerStarted
// Register a callback for $this->contentOverrides on the first call
$this->addContentOverrideCallback( function ( LinkTarget $target ) {
$key = $target->getNamespace() . ':' . $target->getDBkey();
- return isset( $this->contentOverrides[$key] )
- ? $this->contentOverrides[$key]
- : null;
+ return $this->contentOverrides[$key] ?? null;
} );
}
if ( $type == ResourceLoaderModule::TYPE_COMBINED ) {
return min( array_values( $this->mAllowedModules ) );
} else {
- return isset( $this->mAllowedModules[$type] )
- ? $this->mAllowedModules[$type]
- : ResourceLoaderModule::ORIGIN_ALL;
+ return $this->mAllowedModules[$type] ?? ResourceLoaderModule::ORIGIN_ALL;
}
}
*/
public static function setupOOUI( $skinName = 'default', $dir = 'ltr' ) {
$themes = ResourceLoaderOOUIModule::getSkinThemeMap();
- $theme = isset( $themes[$skinName] ) ? $themes[$skinName] : $themes['default'];
+ $theme = $themes[$skinName] ?? $themes['default'];
// For example, 'OOUI\WikimediaUITheme'.
$themeClass = "OOUI\\{$theme}Theme";
OOUI\Theme::setSingleton( new $themeClass() );
uksort( $logosPerDppx, function ( $a , $b ) {
$a = floatval( $a );
$b = floatval( $b );
-
- if ( $a == $b ) {
- return 0;
- }
// Sort from smallest to largest (e.g. 1x, 1.5x, 2x)
- return ( $a < $b ) ? -1 : 1;
+ return $a <=> $b;
} );
foreach ( $logosPerDppx as $dppx => $src ) {
$searchParts = explode( '/', $search, 2 );
$searchKey = $searchParts[0];
- $subpageSearch = isset( $searchParts[1] ) ? $searchParts[1] : null;
+ $subpageSearch = $searchParts[1] ?? null;
// Handle subpage search separately.
if ( $subpageSearch !== null ) {
return $row['title'];
}
- $pageId = isset( $row['page'] ) ? $row['page'] : 0;
- $revId = isset( $row['id'] ) ? $row['id'] : 0;
+ $pageId = $row['page'] ?? 0;
+ $revId = $row['id'] ?? 0;
} else {
- $pageId = isset( $row->rev_page ) ? $row->rev_page : 0;
- $revId = isset( $row->rev_id ) ? $row->rev_id : 0;
+ $pageId = $row->rev_page ?? 0;
+ $revId = $row->rev_id ?? 0;
}
try {
foreach ( $config['paths'] as $prefix => $serviceConfig ) {
$class = $serviceConfig['class'];
// Merge in the global defaults
- $constructArg = isset( $serviceConfig['options'] )
- ? $serviceConfig['options']
- : [];
+ $constructArg = $serviceConfig['options'] ?? [];
$constructArg += $config['global'];
// Make the VRS service available at the mount point
$vrsClient->mount( $prefix, [ 'class' => $class, 'config' => $constructArg ] );
try {
$user = User::newFromAnyId(
- isset( $row->ar_user ) ? $row->ar_user : null,
- isset( $row->ar_user_text ) ? $row->ar_user_text : null,
- isset( $row->ar_actor ) ? $row->ar_actor : null
+ $row->ar_user ?? null,
+ $row->ar_user_text ?? null,
+ $row->ar_actor ?? null
);
} catch ( InvalidArgumentException $ex ) {
wfWarn( __METHOD__ . ': ' . $ex->getMessage() );
Assert::parameterType( 'object', $row, '$row' );
if ( !$title ) {
- $pageId = isset( $row->rev_page ) ? $row->rev_page : 0; // XXX: also check page_id?
- $revId = isset( $row->rev_id ) ? $row->rev_id : 0;
+ $pageId = $row->rev_page ?? 0; // XXX: also check page_id?
+ $revId = $row->rev_id ?? 0;
$title = $this->getTitle( $pageId, $revId, $queryFlags );
}
try {
$user = User::newFromAnyId(
- isset( $row->rev_user ) ? $row->rev_user : null,
- isset( $row->rev_user_text ) ? $row->rev_user_text : null,
- isset( $row->rev_actor ) ? $row->rev_actor : null
+ $row->rev_user ?? null,
+ $row->rev_user_text ?? null,
+ $row->rev_actor ?? null
);
} catch ( InvalidArgumentException $ex ) {
wfWarn( __METHOD__ . ': ' . $ex->getMessage() );
}
if ( !$title ) {
- $pageId = isset( $fields['page'] ) ? $fields['page'] : 0;
- $revId = isset( $fields['id'] ) ? $fields['id'] : 0;
+ $pageId = $fields['page'] ?? 0;
+ $revId = $fields['id'] ?? 0;
$title = $this->getTitle( $pageId, $revId, $queryFlags );
}
isset( $fields['comment'] )
&& !( $fields['comment'] instanceof CommentStoreComment )
) {
- $commentData = isset( $fields['comment_data'] ) ? $fields['comment_data'] : null;
+ $commentData = $fields['comment_data'] ?? null;
if ( $fields['comment'] instanceof Message ) {
$fields['comment'] = CommentStoreComment::newUnsavedComment(
} else {
try {
$user = User::newFromAnyId(
- isset( $fields['user'] ) ? $fields['user'] : null,
- isset( $fields['user_text'] ) ? $fields['user_text'] : null,
- isset( $fields['actor'] ) ? $fields['actor'] : null
+ $fields['user'] ?? null,
+ $fields['user_text'] ?? null,
+ $fields['actor'] ?? null
);
} catch ( InvalidArgumentException $ex ) {
$user = null;
* @return int Result of string comparison, or namespace comparison
*/
public static function compare( LinkTarget $a, LinkTarget $b ) {
- if ( $a->getNamespace() == $b->getNamespace() ) {
- return strcmp( $a->getText(), $b->getText() );
- } else {
- return $a->getNamespace() - $b->getNamespace();
- }
+ return $a->getNamespace() <=> $b->getNamespace()
+ ?: strcmp( $a->getText(), $b->getText() );
}
/**
if ( !$this->mRestrictionsLoaded ) {
$this->loadRestrictions();
}
- return isset( $this->mRestrictions[$action] )
- ? $this->mRestrictions[$action]
- : [];
+ return $this->mRestrictions[$action] ?? [];
}
/**
if ( !$this->mRestrictionsLoaded ) {
$this->loadRestrictions();
}
- return isset( $this->mRestrictionsExpiry[$action] ) ? $this->mRestrictionsExpiry[$action] : false;
+ return $this->mRestrictionsExpiry[$action] ?? false;
}
/**
$a = parse_url( $url );
Wikimedia\restoreWarnings();
if ( $a ) {
- $path = isset( $a['path'] ) ? $a['path'] : '';
+ $path = $a['path'] ?? '';
global $wgScript;
if ( $path == $wgScript && $want !== 'all' ) {
// This method is called from various error handlers and should be kept simple.
if ( !self::$reqId ) {
- self::$reqId = isset( $_SERVER['UNIQUE_ID'] )
- ? $_SERVER['UNIQUE_ID'] : wfRandomString( 24 );
+ self::$reqId = $_SERVER['UNIQUE_ID'] ?? wfRandomString( 24 );
}
return self::$reqId;
* @return mixed Old value if one was present, null otherwise
*/
public function setVal( $key, $value ) {
- $ret = isset( $this->data[$key] ) ? $this->data[$key] : null;
+ $ret = $this->data[$key] ?? null;
$this->data[$key] = $value;
return $ret;
}
* @return string
*/
public function getMethod() {
- return isset( $_SERVER['REQUEST_METHOD'] ) ? $_SERVER['REQUEST_METHOD'] : 'GET';
+ return $_SERVER['REQUEST_METHOD'] ?? 'GET';
}
/**
$path .= '?' . $urlParts['query'];
}
- $canonicalServer = isset( $urlParts['scheme'] ) ? $urlParts['scheme'] : 'http';
+ $canonicalServer = $urlParts['scheme'] ?? 'http';
$canonicalServer .= '://' . $urlParts['host'];
return new WikiReference( $canonicalServer, $path );
# Sometimes rev_len isn't populated
if ( $rev->getSize() !== null ) {
# Size is always public data
- $prevSize = isset( $this->parentLens[$row->rev_parent_id] )
- ? $this->parentLens[$row->rev_parent_id]
- : 0;
+ $prevSize = $this->parentLens[$row->rev_parent_id] ?? 0;
$sDiff = ChangesList::showCharacterDifference( $prevSize, $rev->getSize() );
$fSize = Linker::formatRevisionSize( $rev->getSize() );
$s .= ' <span class="mw-changeslist-separator">. .</span> ' . "$fSize $sDiff";
$this->module = $module;
$params = $module->extractRequestParams();
- $this->messageFormat = isset( $params['messageformat'] ) ? $params['messageformat'] : 'wikitext';
+ $this->messageFormat = $params['messageformat'] ?? 'wikitext';
}
/**
];
}
- $default = isset( $paramSettings[self::PARAM_DFLT] )
- ? $paramSettings[self::PARAM_DFLT]
- : null;
- $multi = isset( $paramSettings[self::PARAM_ISMULTI] )
- ? $paramSettings[self::PARAM_ISMULTI]
- : false;
- $multiLimit1 = isset( $paramSettings[self::PARAM_ISMULTI_LIMIT1] )
- ? $paramSettings[self::PARAM_ISMULTI_LIMIT1]
- : null;
- $multiLimit2 = isset( $paramSettings[self::PARAM_ISMULTI_LIMIT2] )
- ? $paramSettings[self::PARAM_ISMULTI_LIMIT2]
- : null;
- $type = isset( $paramSettings[self::PARAM_TYPE] )
- ? $paramSettings[self::PARAM_TYPE]
- : null;
- $dupes = isset( $paramSettings[self::PARAM_ALLOW_DUPLICATES] )
- ? $paramSettings[self::PARAM_ALLOW_DUPLICATES]
- : false;
- $deprecated = isset( $paramSettings[self::PARAM_DEPRECATED] )
- ? $paramSettings[self::PARAM_DEPRECATED]
- : false;
- $deprecatedValues = isset( $paramSettings[self::PARAM_DEPRECATED_VALUES] )
- ? $paramSettings[self::PARAM_DEPRECATED_VALUES]
- : [];
- $required = isset( $paramSettings[self::PARAM_REQUIRED] )
- ? $paramSettings[self::PARAM_REQUIRED]
- : false;
- $allowAll = isset( $paramSettings[self::PARAM_ALL] )
- ? $paramSettings[self::PARAM_ALL]
- : false;
+ $default = $paramSettings[self::PARAM_DFLT] ?? null;
+ $multi = $paramSettings[self::PARAM_ISMULTI] ?? false;
+ $multiLimit1 = $paramSettings[self::PARAM_ISMULTI_LIMIT1] ?? null;
+ $multiLimit2 = $paramSettings[self::PARAM_ISMULTI_LIMIT2] ?? null;
+ $type = $paramSettings[self::PARAM_TYPE] ?? null;
+ $dupes = $paramSettings[self::PARAM_ALLOW_DUPLICATES] ?? false;
+ $deprecated = $paramSettings[self::PARAM_DEPRECATED] ?? false;
+ $deprecatedValues = $paramSettings[self::PARAM_DEPRECATED_VALUES] ?? [];
+ $required = $paramSettings[self::PARAM_REQUIRED] ?? false;
+ $allowAll = $paramSettings[self::PARAM_ALL] ?? false;
// When type is not given, and no choices, the type is the same as $default
if ( !isset( $type ) ) {
}
break;
case 'integer': // Force everything using intval() and optionally validate limits
- $min = isset( $paramSettings[self::PARAM_MIN] ) ? $paramSettings[self::PARAM_MIN] : null;
- $max = isset( $paramSettings[self::PARAM_MAX] ) ? $paramSettings[self::PARAM_MAX] : null;
- $enforceLimits = isset( $paramSettings[self::PARAM_RANGE_ENFORCE] )
- ? $paramSettings[self::PARAM_RANGE_ENFORCE] : false;
+ $min = $paramSettings[self::PARAM_MIN] ?? null;
+ $max = $paramSettings[self::PARAM_MAX] ?? null;
+ $enforceLimits = $paramSettings[self::PARAM_RANGE_ENFORCE] ?? false;
if ( is_array( $value ) ) {
$value = array_map( 'intval', $value );
if ( $multi ) {
self::dieDebug( __METHOD__, "Multi-values not supported for $encParamName" );
}
- $min = isset( $paramSettings[self::PARAM_MIN] ) ? $paramSettings[self::PARAM_MIN] : 0;
+ $min = $paramSettings[self::PARAM_MIN] ?? 0;
if ( $value == 'max' ) {
$value = $this->getMain()->canApiHighLimits()
? $paramSettings[self::PARAM_MAX2]
'api-help-param-token',
$this->needsToken(),
],
- ] + ( isset( $params['token'] ) ? $params['token'] : [] );
+ ] + ( $params['token'] ?? [] );
}
// Avoid PHP 7.1 warning of passing $this by reference
$settings = [];
}
- $d = isset( $desc[$param] ) ? $desc[$param] : '';
+ $d = $desc[$param] ?? '';
if ( is_array( $d ) ) {
// Special handling for prop parameters
$d = array_map( function ( $line ) {
}
$valueMsgs = $settings[self::PARAM_HELP_MSG_PER_VALUE];
- $deprecatedValues = isset( $settings[self::PARAM_DEPRECATED_VALUES] )
- ? $settings[self::PARAM_DEPRECATED_VALUES]
- : [];
+ $deprecatedValues = $settings[self::PARAM_DEPRECATED_VALUES] ?? [];
foreach ( $settings[self::PARAM_TYPE] as $value ) {
if ( isset( $valueMsgs[$value] ) ) {
if ( !$msg instanceof IApiMessage ) {
$key = $msg->getKey();
$params = $msg->getParams();
- array_unshift( $params, isset( self::$messageMap[$key] ) ? self::$messageMap[$key] : $key );
+ array_unshift( $params, self::$messageMap[$key] ?? $key );
$msg = ApiMessage::create( $params );
}
$flagText = '[' . implode( ', ', $flags ) . ']';
}
- $blockedFile = isset( $report['blocked-uri'] ) ? $report['blocked-uri'] : 'n/a';
- $page = isset( $report['document-uri'] ) ? $report['document-uri'] : 'n/a';
+ $blockedFile = $report['blocked-uri'] ?? 'n/a';
+ $page = $report['document-uri'] ?? 'n/a';
$line = isset( $report['line-number'] ) ? ':' . $report['line-number'] : '';
$warningText = $flagText .
' Received CSP report: <' . $blockedFile .
public function formatException( $exception, array $options = [] ) {
return $this->formatMessage(
$this->getMessageFromException( $exception, $options ),
- isset( $options['format'] ) ? $options['format'] : null
+ $options['format'] ?? null
);
}
' [' . $this->getConfig()->get( 'LanguageCode' ) . ']';
$feedUrl = SpecialPage::getTitleFor( 'Watchlist' )->getFullURL();
- $feedFormat = isset( $params['feedformat'] ) ? $params['feedformat'] : 'rss';
+ $feedFormat = $params['feedformat'] ?? 'rss';
$msg = wfMessage( 'watchlist' )->inContentLanguage()->escaped();
$feed = new $feedClasses[$feedFormat] ( $feedTitle, $msg, $feedUrl );
} else {
$titleUrl = $title->getFullURL( $curidParam );
}
- $comment = isset( $info['comment'] ) ? $info['comment'] : null;
+ $comment = $info['comment'] ?? null;
// Create an anchor to section.
// The anchor won't work for sections that have dupes on page
$value = (array)$value;
}
if ( is_array( $value ) ) {
- $contentKey = isset( $value[ApiResult::META_CONTENT] )
- ? $value[ApiResult::META_CONTENT]
- : '*';
- $subelementKeys = isset( $value[ApiResult::META_SUBELEMENTS] )
- ? $value[ApiResult::META_SUBELEMENTS]
- : [];
+ $contentKey = $value[ApiResult::META_CONTENT] ?? '*';
+ $subelementKeys = $value[ApiResult::META_SUBELEMENTS] ?? [];
if ( isset( $value[ApiResult::META_BC_SUBELEMENTS] ) ) {
$subelementKeys = array_merge(
$subelementKeys, $value[ApiResult::META_BC_SUBELEMENTS]
);
}
- $preserveKeys = isset( $value[ApiResult::META_PRESERVE_KEYS] )
- ? $value[ApiResult::META_PRESERVE_KEYS]
- : [];
+ $preserveKeys = $value[ApiResult::META_PRESERVE_KEYS] ?? [];
$indexedTagName = isset( $value[ApiResult::META_INDEXED_TAG_NAME] )
? self::mangleName( $value[ApiResult::META_INDEXED_TAG_NAME], $preserveKeys )
: '_v';
- $bcBools = isset( $value[ApiResult::META_BC_BOOLS] )
- ? $value[ApiResult::META_BC_BOOLS]
- : [];
+ $bcBools = $value[ApiResult::META_BC_BOOLS] ?? [];
$indexSubelements = isset( $value[ApiResult::META_TYPE] )
? $value[ApiResult::META_TYPE] !== 'array'
: false;
}
$out->addHTML( $html );
- $helptitle = isset( $options['helptitle'] ) ? $options['helptitle'] : null;
+ $helptitle = $options['helptitle'] ?? null;
$html = self::fixHelpLinks( $out->getHTML(), $helptitle, $haveModules );
$out->clearHTML();
$out->addHTML( $html );
// Type documentation
if ( !isset( $settings[ApiBase::PARAM_TYPE] ) ) {
- $dflt = isset( $settings[ApiBase::PARAM_DFLT] )
- ? $settings[ApiBase::PARAM_DFLT]
- : null;
+ $dflt = $settings[ApiBase::PARAM_DFLT] ?? null;
if ( is_bool( $dflt ) ) {
$settings[ApiBase::PARAM_TYPE] = 'boolean';
} elseif ( is_string( $dflt ) || is_null( $dflt ) ) {
if ( is_array( $type ) ) {
$count = count( $type );
- $deprecatedValues = isset( $settings[ApiBase::PARAM_DEPRECATED_VALUES] )
- ? $settings[ApiBase::PARAM_DEPRECATED_VALUES]
- : [];
- $links = isset( $settings[ApiBase::PARAM_VALUE_LINKS] )
- ? $settings[ApiBase::PARAM_VALUE_LINKS]
- : [];
+ $deprecatedValues = $settings[ApiBase::PARAM_DEPRECATED_VALUES] ?? [];
+ $links = $settings[ApiBase::PARAM_VALUE_LINKS] ?? [];
$values = array_map( function ( $v ) use ( $links, $deprecatedValues ) {
$attr = [];
if ( $v !== '' ) {
$info[] = implode( ' ', $extra );
}
- $allowAll = isset( $settings[ApiBase::PARAM_ALL] )
- ? $settings[ApiBase::PARAM_ALL]
- : false;
+ $allowAll = $settings[ApiBase::PARAM_ALL] ?? false;
if ( $allowAll || $settings[ApiBase::PARAM_TYPE] === 'namespace' ) {
if ( $settings[ApiBase::PARAM_TYPE] === 'namespace' ) {
$allSpecifier = ApiBase::ALL_DEFAULT_STRING;
}
// Add default
- $default = isset( $settings[ApiBase::PARAM_DFLT] )
- ? $settings[ApiBase::PARAM_DFLT]
- : null;
+ $default = $settings[ApiBase::PARAM_DFLT] ?? null;
if ( $default === '' ) {
$info[] = $context->msg( 'api-help-param-default-empty' )
->parse();
foreach ( $modules as $name => $moduleSpec ) {
if ( is_array( $moduleSpec ) ) {
$class = $moduleSpec['class'];
- $factory = ( isset( $moduleSpec['factory'] ) ? $moduleSpec['factory'] : null );
+ $factory = ( $moduleSpec['factory'] ?? null );
} else {
$class = $moduleSpec;
$factory = null;
if ( $params['change'] ) {
foreach ( $params['change'] as $entry ) {
$array = explode( '=', $entry, 2 );
- $changes[$array[0]] = isset( $array[1] ) ? $array[1] : null;
+ $changes[$array[0]] = $array[1] ?? null;
}
}
if ( isset( $params['optionname'] ) ) {
- $newValue = isset( $params['optionvalue'] ) ? $params['optionvalue'] : null;
+ $newValue = $params['optionvalue'] ?? null;
$changes[$params['optionname']] = $newValue;
}
if ( !$changed && !count( $changes ) ) {
}
if ( !isset( $settings[ApiBase::PARAM_TYPE] ) ) {
- $dflt = isset( $settings[ApiBase::PARAM_DFLT] )
- ? $settings[ApiBase::PARAM_DFLT]
- : null;
+ $dflt = $settings[ApiBase::PARAM_DFLT] ?? null;
if ( is_bool( $dflt ) ) {
$settings[ApiBase::PARAM_TYPE] = 'boolean';
} elseif ( is_string( $dflt ) || is_null( $dflt ) ) {
$allowAll = true;
$allSpecifier = ApiBase::ALL_DEFAULT_STRING;
} else {
- $allowAll = isset( $settings[ApiBase::PARAM_ALL] )
- ? $settings[ApiBase::PARAM_ALL]
- : false;
+ $allowAll = $settings[ApiBase::PARAM_ALL] ?? false;
$allSpecifier = ( is_string( $allowAll ) ? $allowAll : ApiBase::ALL_DEFAULT_STRING );
}
if ( $allowAll && $item['multi'] &&
$settings = self::$settings[$this->getModuleName()];
$name = $this->getModuleName();
$path = $this->getModulePath();
- $title = isset( $settings['exampletitle'] ) ? $settings['exampletitle'] : 'Main Page';
+ $title = $settings['exampletitle'] ?? 'Main Page';
$etitle = rawurlencode( $title );
return [
}
$this->addOption( 'LIMIT', $params['limit'] + 1 );
- $offset = isset( $params['offset'] ) ? $params['offset'] : 0;
+ $offset = $params['offset'] ?? 0;
if ( $offset ) {
$this->addOption( 'OFFSET', $params['offset'] );
}
$fit = $this->appendMagicWords( $p );
break;
case 'interwikimap':
- $filteriw = isset( $params['filteriw'] ) ? $params['filteriw'] : false;
+ $filteriw = $params['filteriw'] ?? false;
$fit = $this->appendInterwikiMap( $p, $filteriw );
break;
case 'dbrepllag':
}
$params = $this->extractRequestParams();
- $langCode = isset( $params['inlanguagecode'] ) ? $params['inlanguagecode'] : '';
+ $langCode = $params['inlanguagecode'] ?? '';
$langNames = Language::fetchLanguageNames( $langCode );
$getPrefixes = MediaWikiServices::getInstance()->getInterwikiLookup()->getAllPrefixes( $local );
}
if ( SpecialVersion::getExtLicenseFileName( $extensionPath ) ) {
- $ret['license-name'] = isset( $ext['license-name'] ) ? $ext['license-name'] : '';
+ $ret['license-name'] = $ext['license-name'] ?? '';
$ret['license'] = SpecialPage::getTitleFor(
'Version',
"License/{$ext['name']}"
public function appendLanguages( $property ) {
$params = $this->extractRequestParams();
- $langCode = isset( $params['inlanguagecode'] ) ? $params['inlanguagecode'] : '';
+ $langCode = $params['inlanguagecode'] ?? '';
$langNames = Language::fetchLanguageNames( $langCode );
$data = [];
if ( $batchSize === 1 ) { // One user, can't be different
$ret = 0;
} elseif ( $this->orderBy === 'id' ) {
- $ret = $a[0]->rev_user - $b[0]->rev_user;
+ $ret = $a[0]->rev_user <=> $b[0]->rev_user;
} elseif ( $this->orderBy === 'name' ) {
$ret = strcmp( $a[0]->rev_user_text, $b[0]->rev_user_text );
} else {
- $ret = $a[0]->rev_actor - $b[0]->rev_actor;
+ $ret = $a[0]->rev_actor <=> $b[0]->rev_actor;
}
if ( !$ret ) {
}
if ( !$ret ) {
- $ret = $a[0]->rev_id - $b[0]->rev_id;
+ $ret = $a[0]->rev_id <=> $b[0]->rev_id;
}
return $neg * $ret;
&& !is_null( $row->rev_len )
&& !is_null( $row->rev_parent_id )
) {
- $parentLen = isset( $this->parentLens[$row->rev_parent_id] )
- ? $this->parentLens[$row->rev_parent_id]
- : 0;
+ $parentLen = $this->parentLens[$row->rev_parent_id] ?? 0;
$vals['sizediff'] = intval( $row->rev_len - $parentLen );
}
* @return array|object
*/
protected static function applyTransformations( array $dataIn, array $transforms ) {
- $strip = isset( $transforms['Strip'] ) ? $transforms['Strip'] : 'none';
+ $strip = $transforms['Strip'] ?? 'none';
if ( $strip === 'base' ) {
$transforms['Strip'] = 'none';
}
- $transformTypes = isset( $transforms['Types'] ) ? $transforms['Types'] : null;
+ $transformTypes = $transforms['Types'] ?? null;
if ( $transformTypes !== null && !is_array( $transformTypes ) ) {
throw new InvalidArgumentException( __METHOD__ . ':Value for "Types" must be an array' );
}
case 'kvp':
case 'BCkvp':
- $key = isset( $metadata[self::META_KVP_KEY_NAME] )
- ? $metadata[self::META_KVP_KEY_NAME]
- : $transformTypes['ArmorKVP'];
+ $key = $metadata[self::META_KVP_KEY_NAME] ?? $transformTypes['ArmorKVP'];
$valKey = isset( $transforms['BC'] ) ? '*' : 'value';
$assocAsObject = !empty( $transformTypes['AssocAsObject'] );
$merge = !empty( $metadata[self::META_KVP_MERGE] );
'name' => $name,
'preferred' => wfBoolToStr( $name == 'MediaWiki' ),
'apiLink' => $info['apiLink'],
- 'blogID' => isset( $info['blogID'] ) ? $info['blogID'] : '',
+ 'blogID' => $info['blogID'] ?? '',
];
$settings = [];
if ( isset( $info['docs'] ) ) {
$pa = new PageArchive( $titleObj, $this->getConfig() );
$retval = $pa->undelete(
- ( isset( $params['timestamps'] ) ? $params['timestamps'] : [] ),
+ ( $params['timestamps'] ?? [] ),
$params['reason'],
$params['fileids'],
false,
$warning = $warnings['exists'];
unset( $warnings['exists'] );
/** @var LocalFile $localFile */
- $localFile = isset( $warning['normalizedFile'] )
- ? $warning['normalizedFile']
- : $warning['file'];
+ $localFile = $warning['normalizedFile'] ?? $warning['file'];
$warnings[$warning['warning']] = $localFile->getName();
}
$this->requireOnlyOneParameter( $params, 'user', 'userid' );
- $user = isset( $params['user'] ) ? $params['user'] : '#' . $params['userid'];
+ $user = $params['user'] ?? '#' . $params['userid'];
$form = $this->getUserRightsPage();
$form->setContext( $this->getContext() );
*/
public function buildSearchEngine( array $params = null ) {
if ( $params != null ) {
- $type = isset( $params['backend'] ) ? $params['backend'] : null;
+ $type = $params['backend'] ?? null;
if ( $type === self::$BACKEND_NULL_PARAM ) {
$type = null;
}
"apihelp-query+recentchanges-param-limit": "返回总计更新数。",
"apihelp-query+recentchanges-param-type": "显示的更改类型。",
"apihelp-query+recentchanges-param-toponly": "只列举作为最新修订的更改。",
+ "apihelp-query+recentchanges-param-title": "过滤记录至这些与页面相关的。",
"apihelp-query+recentchanges-param-generaterevisions": "当作为生成器使用时,生成修订ID而不是标题。不带关联修订ID的最近更改记录(例如大多数日志记录)将不会生成任何东西。",
"apihelp-query+recentchanges-example-simple": "最近更改列表。",
"apihelp-query+recentchanges-example-generator": "获取有关最近未巡查更改的页面信息。",
}
// Checks passed, create the user...
- $from = isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : 'CLI';
+ $from = $_SERVER['REQUEST_URI'] ?? 'CLI';
$this->logger->info( __METHOD__ . ': creating new user ({username}) - from: {from}', [
'username' => $username,
'from' => $from,
$spec = [ 'sort2' => $i++ ] + $spec + [ 'sort' => 0 ];
}
unset( $spec );
+ // Sort according to the 'sort' field, and if they are equal, according to 'sort2'
usort( $specs, function ( $a, $b ) {
- return ( (int)$a['sort'] ) - ( (int)$b['sort'] )
- ?: $a['sort2'] - $b['sort2'];
+ return $a['sort'] <=> $b['sort']
+ ?: $a['sort2'] <=> $b['sort2'];
} );
$ret = [];
}
}
- $needReq = isset( $data->req ) ? $data->req : new PasswordAuthenticationRequest();
+ $needReq = $data->req ?? new PasswordAuthenticationRequest();
if ( !$needReq->action ) {
$needReq->action = AuthManager::ACTION_CHANGE;
}
public function __construct( $params = [] ) {
$this->throttleSettings = array_intersect_key( $params,
[ 'accountCreationThrottle' => true, 'passwordAttemptThrottle' => true ] );
- $this->cache = isset( $params['cache'] ) ? $params['cache'] :
- \ObjectCache::getLocalClusterInstance();
+ $this->cache = $params['cache'] ?? \ObjectCache::getLocalClusterInstance();
}
public function setConfig( Config $config ) {
/* Undefined if there is a valid username which for some reason doesn't
* exist in the database.
*/
- return isset( $this->cache[$username] ) ? $this->cache[$username] : $this->getDefault();
+ return $this->cache[$username] ?? $this->getDefault();
}
/**
$this->wanCache->makeKey( 'messages', $code, 'hash', 'v1' ),
[
'hash' => $cache['HASH'],
- 'latest' => isset( $cache['LATEST'] ) ? $cache['LATEST'] : 0
+ 'latest' => $cache['LATEST'] ?? 0
],
WANObjectCache::TTL_INDEFINITE
);
$this->doQuery( [ $userId ] ); // cache miss
}
- return isset( $this->cache[$userId][$prop] )
- ? $this->cache[$userId][$prop]
- : false; // user does not exist?
+ return $this->cache[$userId][$prop] ?? false; // user does not exist?
}
/**
$flagInfos[$key]['letter'] = $value['letter'];
$flagInfos[$key]['title'] = $value['title'];
// Allow customized class name, fall back to flag name
- $flagInfos[$key]['class'] = isset( $value['class'] ) ? $value['class'] : $key;
+ $flagInfos[$key]['class'] = $value['class'] ?? $key;
}
}
'id' => $rc->mAttribs['rc_this_oldid'],
'user' => $rc->mAttribs['rc_user'],
'user_text' => $rc->mAttribs['rc_user_text'],
- 'actor' => isset( $rc->mAttribs['rc_actor'] ) ? $rc->mAttribs['rc_actor'] : null,
+ 'actor' => $rc->mAttribs['rc_actor'] ?? null,
'deleted' => $rc->mAttribs['rc_deleted']
] );
$s .= ' ' . Linker::generateRollback( $rev, $this->getContext() );
* @return ChangesListFilter|null Specified filter, or null if it is not registered
*/
public function getFilter( $name ) {
- return isset( $this->filters[$name] ) ? $this->filters[$name] : null;
+ return $this->filters[$name] ?? null;
}
/**
}
usort( $this->filters, function ( $a, $b ) {
- return $b->getPriority() - $a->getPriority();
+ return $b->getPriority() <=> $a->getPriority();
} );
foreach ( $this->filters as $filterName => $filter ) {
# Default values for RC flags
$collectedRcFlags = [];
foreach ( $recentChangesFlags as $key => $value ) {
- $flagGrouping = ( isset( $recentChangesFlags[$key]['grouping'] ) ?
- $recentChangesFlags[$key]['grouping'] : 'any' );
+ $flagGrouping = ( $recentChangesFlags[$key]['grouping'] ?? 'any' );
switch ( $flagGrouping ) {
case 'all':
$collectedRcFlags[$key] = true;
// Roll up flags
foreach ( $line['recentChangesFlagsRaw'] as $key => $value ) {
- $flagGrouping = ( isset( $recentChangesFlags[$key]['grouping'] ) ?
- $recentChangesFlags[$key]['grouping'] : 'any' );
+ $flagGrouping = ( $recentChangesFlags[$key]['grouping'] ?? 'any' );
switch ( $flagGrouping ) {
case 'all':
if ( !$value ) {
# Convert mAttribs['rc_user'] etc for ActorMigration
$user = User::newFromAnyId(
- isset( $row['rc_user'] ) ? $row['rc_user'] : null,
- isset( $row['rc_user_text'] ) ? $row['rc_user_text'] : null,
- isset( $row['rc_actor'] ) ? $row['rc_actor'] : null
+ $row['rc_user'] ?? null,
+ $row['rc_user_text'] ?? null,
+ $row['rc_actor'] ?? null
);
unset( $row['rc_user'], $row['rc_user_text'], $row['rc_actor'] );
$row += ActorMigration::newMigration()->getInsertValues( $dbw, 'rc_user', $user );
*/
public function getParam( $name ) {
$params = $this->parseParams();
- return isset( $params[$name] ) ? $params[$name] : null;
+ return $params[$name] ?? null;
}
/**
$this->mAttribs['rc_comment_data'] = null;
$user = User::newFromAnyId(
- isset( $this->mAttribs['rc_user'] ) ? $this->mAttribs['rc_user'] : null,
- isset( $this->mAttribs['rc_user_text'] ) ? $this->mAttribs['rc_user_text'] : null,
- isset( $this->mAttribs['rc_actor'] ) ? $this->mAttribs['rc_actor'] : null
+ $this->mAttribs['rc_user'] ?? null,
+ $this->mAttribs['rc_user_text'] ?? null,
+ $this->mAttribs['rc_actor'] ?? null
);
$this->mAttribs['rc_user'] = $user->getId();
$this->mAttribs['rc_user_text'] = $user->getName();
if ( $name === 'rc_user' || $name === 'rc_user_text' || $name === 'rc_actor' ) {
$user = User::newFromAnyId(
- isset( $this->mAttribs['rc_user'] ) ? $this->mAttribs['rc_user'] : null,
- isset( $this->mAttribs['rc_user_text'] ) ? $this->mAttribs['rc_user_text'] : null,
- isset( $this->mAttribs['rc_actor'] ) ? $this->mAttribs['rc_actor'] : null
+ $this->mAttribs['rc_user'] ?? null,
+ $this->mAttribs['rc_user_text'] ?? null,
+ $this->mAttribs['rc_actor'] ?? null
);
if ( $name === 'rc_user' ) {
return $user->getId();
}
}
- return isset( $this->mAttribs[$name] ) ? $this->mAttribs[$name] : null;
+ return $this->mAttribs[$name] ?? null;
}
/**
// store the tag usage statistics
$tagUsage = self::tagUsageStatistics();
- $hitcount = isset( $tagUsage[$tag] ) ? $tagUsage[$tag] : 0;
+ $hitcount = $tagUsage[$tag] ?? 0;
// do it!
$deleteResult = self::deleteTagEverywhere( $tag );
public function __construct( $server, $options = [] ) {
$parts = explode( ':', $server, 2 );
$this->host = $parts[0];
- $this->port = isset( $parts[1] ) ? $parts[1] : 80;
+ $this->port = $parts[1] ?? 80;
}
/**
wfDebug( "Primary collision '$letter' '{$letterMap[$key]}' (comparison: $comp)\n" );
// If that also has a collision, use codepoint as a tiebreaker.
if ( $comp === 0 ) {
- // TODO Use <=> operator when PHP 7 is allowed.
- $comp = UtfNormal\Utils::utf8ToCodepoint( $letter ) -
+ $comp = UtfNormal\Utils::utf8ToCodepoint( $letter ) <=>
UtfNormal\Utils::utf8ToCodepoint( $letterMap[$key] );
}
if ( $comp < 0 ) {
+++ /dev/null
-<?php
-/**
- * Compatibility class for pre-namespace, pre-library class name
- *
- * 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
- */
-
-/**
- * @deprecated since 1.28 use Wikimedia\ScopedCallback
- *
- * @since 1.21
- */
-class ScopedCallback extends Wikimedia\ScopedCallback {
-}
--- /dev/null
+<?php
+/**
+ * Back-compat for pre-librarized XMP classes
+ *
+ * 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.
+ */
+
+use Wikimedia\XMPReader\Info;
+use Wikimedia\XMPReader\Reader;
+use Wikimedia\XMPReader\Validate;
+
+/**
+ * @deprecated since 1.32
+ */
+class XMPInfo extends Info {
+}
+
+/**
+ * @deprecated since 1.32
+ */
+class XMPReader extends Reader {
+}
+
+/**
+ * @deprecated since 1.32
+ */
+class XMPValidate extends Validate {
+}
if ( !isset( $this->singletons['loggers'][$channel] ) ) {
// Fallback to using the '@default' configuration if an explict
// configuration for the requested channel isn't found.
- $spec = isset( $this->config['loggers'][$channel] ) ?
- $this->config['loggers'][$channel] :
- $this->config['loggers']['@default'];
+ $spec = $this->config['loggers'][$channel] ?? $this->config['loggers']['@default'];
$monolog = $this->createLogger( $channel, $spec );
$this->singletons['loggers'][$channel] = $monolog;
);
}
- $prev = isset( $prev['previous'] ) ? $prev['previous'] : null;
+ $prev = $prev['previous'] ?? null;
}
}
return $str;
public function getSlave( $cluster ) {
global $wgDefaultExternalStore;
- $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
+ $wiki = $this->params['wiki'] ?? false;
$lb = $this->getLoadBalancer( $cluster );
if ( !in_array( "DB://" . $cluster, (array)$wgDefaultExternalStore ) ) {
* @return MaintainableDBConnRef
*/
public function getMaster( $cluster ) {
- $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
+ $wiki = $this->params['wiki'] ?? false;
$lb = $this->getLoadBalancer( $cluster );
$db = $lb->getMaintenanceConnectionRef( DB_MASTER, [], $wiki );
return [
$path[2], // cluster
$path[3], // id
- isset( $path[4] ) ? $path[4] : false // itemID
+ $path[4] ?? false // itemID
];
}
}
// Make sure ID is roughly lexicographically increasing for performance
$id = str_pad( UIDGenerator::newTimestampedUID128( 32 ), 26, '0', STR_PAD_LEFT );
// Segregate items by wiki ID for the sake of bookkeeping
- $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : wfWikiID();
+ $wiki = $this->params['wiki'] ?? wfWikiID();
$url = $be->getContainerStoragePath( 'data' ) . '/' . rawurlencode( $wiki );
$url .= ( $be instanceof FSFileBackend )
$repoName = $info['name'];
// Local vars that used to be FSRepo members...
$directory = $info['directory'];
- $deletedDir = isset( $info['deletedDir'] )
- ? $info['deletedDir']
- : false; // deletion disabled
- $thumbDir = isset( $info['thumbDir'] )
- ? $info['thumbDir']
- : "{$directory}/thumb";
- $transcodedDir = isset( $info['transcodedDir'] )
- ? $info['transcodedDir']
- : "{$directory}/transcoded";
+ $deletedDir = $info['deletedDir'] ?? false; // deletion disabled
+ $thumbDir = $info['thumbDir'] ?? "{$directory}/thumb";
+ $transcodedDir = $info['transcodedDir'] ?? "{$directory}/transcoded";
// Get the FS backend configuration
$autoBackends[] = [
'name' => $backendName,
"{$repoName}-deleted" => $deletedDir,
"{$repoName}-temp" => "{$directory}/temp"
],
- 'fileMode' => isset( $info['fileMode'] ) ? $info['fileMode'] : 0644,
+ 'fileMode' => $info['fileMode'] ?? 0644,
'directoryMode' => $wgDirectoryMode,
];
}
}
// Optional settings that have a default
- $this->initialCapital = isset( $info['initialCapital'] )
- ? $info['initialCapital']
- : MWNamespace::isCapitalized( NS_FILE );
- $this->url = isset( $info['url'] )
- ? $info['url']
- : false; // a subclass may set the URL (e.g. ForeignAPIRepo)
+ $this->initialCapital = $info['initialCapital'] ?? MWNamespace::isCapitalized( NS_FILE );
+ $this->url = $info['url'] ?? false; // a subclass may set the URL (e.g. ForeignAPIRepo)
if ( isset( $info['thumbUrl'] ) ) {
$this->thumbUrl = $info['thumbUrl'];
} else {
$this->thumbUrl = $this->url ? "{$this->url}/thumb" : false;
}
- $this->hashLevels = isset( $info['hashLevels'] )
- ? $info['hashLevels']
- : 2;
- $this->deletedHashLevels = isset( $info['deletedHashLevels'] )
- ? $info['deletedHashLevels']
- : $this->hashLevels;
+ $this->hashLevels = $info['hashLevels'] ?? 2;
+ $this->deletedHashLevels = $info['deletedHashLevels'] ?? $this->hashLevels;
$this->transformVia404 = !empty( $info['transformVia404'] );
- $this->abbrvThreshold = isset( $info['abbrvThreshold'] )
- ? $info['abbrvThreshold']
- : 255;
+ $this->abbrvThreshold = $info['abbrvThreshold'] ?? 255;
$this->isPrivate = !empty( $info['isPrivate'] );
// Give defaults for the basic zones...
- $this->zones = isset( $info['zones'] ) ? $info['zones'] : [];
+ $this->zones = $info['zones'] ?? [];
foreach ( [ 'public', 'thumb', 'transcoded', 'temp', 'deleted' ] as $zone ) {
if ( !isset( $this->zones[$zone]['container'] ) ) {
$this->zones[$zone]['container'] = "{$this->name}-{$zone}";
if ( isset( $options['bypassCache'] ) ) {
$options['latest'] = $options['bypassCache']; // b/c
}
- $time = isset( $options['time'] ) ? $options['time'] : false;
+ $time = $options['time'] ?? false;
$flags = !empty( $options['latest'] ) ? File::READ_LATEST : 0;
# First try the current version of the file to see if it precedes the timestamp
$img = $this->newFile( $title );
* @return File|bool False on failure
*/
public function findFileFromKey( $sha1, $options = [] ) {
- $time = isset( $options['time'] ) ? $options['time'] : false;
+ $time = $options['time'] ?? false;
# First try to find a matching current version of a file...
if ( !$this->fileFactoryKey ) {
return false; // find-by-sha1 not supported
*/
public function getTempHashPath( $suffix ) {
$parts = explode( '!', $suffix, 2 ); // format is <timestamp>!<name> or just <name>
- $name = isset( $parts[1] ) ? $parts[1] : $suffix; // hash path is not based on timestamp
+ $name = $parts[1] ?? $suffix; // hash path is not based on timestamp
return self::getHashPathForLevel( $name, $this->hashLevels );
}
list( $src, $dstRel, $archiveRel ) = $ntuple;
$srcPath = ( $src instanceof FSFile ) ? $src->getPath() : $src;
- $options = isset( $ntuple[3] ) ? $ntuple[3] : [];
+ $options = $ntuple[3] ?? [];
// Resolve source to a storage path if virtual
$srcPath = $this->resolveToStoragePath( $srcPath );
if ( !$this->validateFilename( $dstRel ) ) {
}
// Set any desired headers to be use in GET/HEAD responses
- $headers = isset( $options['headers'] ) ? $options['headers'] : [];
+ $headers = $options['headers'] ?? [];
// Archive destination file if it exists.
// This will check if the archive file also exists and fail if does.
parent::__construct( $info );
// https://commons.wikimedia.org/w/api.php
- $this->mApiBase = isset( $info['apibase'] ) ? $info['apibase'] : null;
+ $this->mApiBase = $info['apibase'] ?? null;
if ( isset( $info['apiThumbCacheExpiry'] ) ) {
$this->apiThumbCacheExpiry = $info['apiThumbCacheExpiry'];
&& empty( $options['private'] )
&& empty( $options['latest'] )
) {
- $time = isset( $options['time'] ) ? $options['time'] : '';
+ $time = $options['time'] ?? '';
if ( $this->cache->has( $dbkey, $time, 60 ) ) {
return $this->cache->get( $dbkey, $time );
}
*/
function getUnscaledThumb( $handlerParams = [] ) {
$hp =& $handlerParams;
- $page = isset( $hp['page'] ) ? $hp['page'] : false;
+ $page = $hp['page'] ?? false;
$width = $this->getWidth( $page );
if ( !$width ) {
return $this->iconThumb();
// Note, the this->canRender() check above implies
// that we have a handler, and it can do makeParamString.
$otherParams = $this->handler->makeParamString( $params );
- $width = isset( $params['width'] ) ? $params['width'] : -1;
- $height = isset( $params['height'] ) ? $params['height'] : -1;
+ $width = $params['width'] ?? -1;
+ $height = $params['height'] ?? -1;
$thumbUrl = $this->repo->getThumbUrlFromCache(
$this->getName(),
* @return bool|string
*/
function getDescriptionUrl() {
- return isset( $this->mInfo['descriptionurl'] )
- ? $this->mInfo['descriptionurl']
- : false;
+ return $this->mInfo['descriptionurl'] ?? false;
}
/**
->getComment( 'description', (object)$decoded )->text;
$decoded['user'] = User::newFromAnyId(
- isset( $decoded['user'] ) ? $decoded['user'] : null,
- isset( $decoded['user_text'] ) ? $decoded['user_text'] : null,
- isset( $decoded['actor'] ) ? $decoded['actor'] : null
+ $decoded['user'] ?? null,
+ $decoded['user_text'] ?? null,
+ $decoded['actor'] ?? null
);
unset( $decoded['user_text'], $decoded['actor'] );
if ( isset( $info['user'] ) || isset( $info['user_text'] ) || isset( $info['actor'] ) ) {
$this->user = User::newFromAnyId(
- isset( $info['user'] ) ? $info['user'] : null,
- isset( $info['user_text'] ) ? $info['user_text'] : null,
- isset( $info['actor'] ) ? $info['actor'] : null
+ $info['user'] ?? null,
+ $info['user_text'] ?? null,
+ $info['actor'] ?? null
);
}
function toHTML() {
if ( $this->mPerRow > 0 ) {
$maxwidth = $this->mPerRow * ( $this->mWidths + $this->getAllPadding() );
- $oldStyle = isset( $this->mAttribs['style'] ) ? $this->mAttribs['style'] : '';
+ $oldStyle = $this->mAttribs['style'] ?? '';
# _width is ignored by any sane browser. IE6 doesn't know max-width
# so it uses _width instead
$this->mAttribs['style'] = "max-width: {$maxwidth}px;_width: {$maxwidth}px;" .
$this->mFlatFields = [];
foreach ( $descriptor as $fieldname => $info ) {
- $section = isset( $info['section'] )
- ? $info['section']
- : '';
+ $section = $info['section'] ?? '';
if ( isset( $info['type'] ) && $info['type'] === 'file' ) {
$this->mUseMultipart = true;
if ( $section === null ) {
return $this->mHeader;
} else {
- return isset( $this->mSectionHeaders[$section] ) ? $this->mSectionHeaders[$section] : '';
+ return $this->mSectionHeaders[$section] ?? '';
}
}
if ( $section === null ) {
return $this->mFooter;
} else {
- return isset( $this->mSectionFooters[$section] ) ? $this->mSectionFooters[$section] : '';
+ return $this->mSectionFooters[$section] ?? '';
}
}
$data = [
'name' => $args[0],
'value' => $args[1],
- 'id' => isset( $args[2] ) ? $args[2] : null,
- 'attribs' => isset( $args[3] ) ? $args[3] : null,
+ 'id' => $args[2] ?? null,
+ 'attribs' => $args[3] ?? null,
];
} else {
if ( !isset( $data['name'] ) ) {
public function initializeHTMLFormElement( array $config = [] ) {
// Properties
- $this->hideIf = isset( $config['hideIf'] ) ? $config['hideIf'] : null;
- $this->modules = isset( $config['modules'] ) ? $config['modules'] : [];
+ $this->hideIf = $config['hideIf'] ?? null;
+ $this->modules = $config['modules'] ?? [];
// Initialization
if ( $this->hideIf ) {
'mw-htmlform-nolabel' => ( $label === '' )
];
- $horizontalLabel = isset( $this->mParams['horizontal-label'] )
- ? $this->mParams['horizontal-label'] : false;
+ $horizontalLabel = $this->mParams['horizontal-label'] ?? false;
if ( $horizontalLabel ) {
$field = ' ' . $inputHtml . "\n$errors";
$displayFormat = $this->mParent->getDisplayFormat();
$html = '';
- $horizontalLabel = isset( $this->mParams['horizontal-label'] )
- ? $this->mParams['horizontal-label'] : false;
+ $horizontalLabel = $this->mParams['horizontal-label'] ?? false;
if ( $displayFormat === 'table' ) {
$html =
$this->relativeField->getInputOOUI( $value ),
[
'id' => $this->mID,
- 'required' => isset( $this->mParams['required'] ) ? $this->mParams['required'] : false,
+ 'required' => $this->mParams['required'] ?? false,
]
);
}
*/
class HTMLFloatField extends HTMLTextField {
public function getSize() {
- return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 20;
+ return $this->mParams['size'] ?? 20;
}
public function validate( $value, $alldata ) {
* @return string
*/
protected function getInputHTMLForKey( $key, array $values ) {
- $displayFormat = isset( $this->mParams['format'] )
- ? $this->mParams['format']
- : $this->mParent->getDisplayFormat();
+ $displayFormat = $this->mParams['format'] ?? $this->mParent->getDisplayFormat();
// Conveniently, PHP method names are case-insensitive.
$getFieldHtmlMethod = $displayFormat == 'table' ? 'getTableRow' : ( 'get' . $displayFormat );
if ( !isset( $fields['delete'] ) ) {
$name = "{$this->mName}[$key][delete]";
- $label = isset( $this->mParams['delete-button-message'] )
- ? $this->mParams['delete-button-message']
- : 'htmlform-cloner-delete';
+ $label = $this->mParams['delete-button-message'] ?? 'htmlform-cloner-delete';
$field = HTMLForm::loadInputFromParameters( $name, [
'type' => 'submit',
'formnovalidate' => true,
], $html );
$name = "{$this->mName}[create]";
- $label = isset( $this->mParams['create-button-message'] )
- ? $this->mParams['create-button-message']
- : 'htmlform-cloner-create';
+ $label = $this->mParams['create-button-message'] ?? 'htmlform-cloner-create';
$field = HTMLForm::loadInputFromParameters( $name, [
'type' => 'submit',
'formnovalidate' => true,
'or' => false,
'classes' => [ 'mw-htmlform-select-and-other-field' ],
'data' => [
- 'maxlengthUnit' => isset( $this->mParams['maxlength-unit'] )
- ? $this->mParams['maxlength-unit'] : 'bytes'
+ 'maxlengthUnit' => $this->mParams['maxlength-unit'] ?? 'bytes'
],
] );
}
}
public function getSize() {
- return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 45;
+ return $this->mParams['size'] ?? 45;
}
public function validate( $value, $alldata ) {
$this->getOptions();
if ( !in_array( 'other', $this->mOptions, true ) ) {
$msg =
- isset( $params['other'] )
- ? $params['other']
- : wfMessage( 'htmlform-selectorother-other' )->text();
+ $params['other'] ?? wfMessage( 'htmlform-selectorother-other' )->text();
// Have 'other' always as first element
$this->mOptions = [ $msg => 'other' ] + $this->mOptions;
}
*/
class HTMLSizeFilterField extends HTMLIntField {
public function getSize() {
- return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 9;
+ return $this->mParams['size'] ?? 9;
}
public function getInputHTML( $value ) {
}
public function getCols() {
- return isset( $this->mParams['cols'] ) ? $this->mParams['cols'] : static::DEFAULT_COLS;
+ return $this->mParams['cols'] ?? static::DEFAULT_COLS;
}
public function getRows() {
- return isset( $this->mParams['rows'] ) ? $this->mParams['rows'] : static::DEFAULT_ROWS;
+ return $this->mParams['rows'] ?? static::DEFAULT_ROWS;
}
public function getSpellCheck() {
- $val = isset( $this->mParams['spellcheck'] ) ? $this->mParams['spellcheck'] : null;
+ $val = $this->mParams['spellcheck'] ?? null;
if ( is_bool( $val ) ) {
// "spellcheck" attribute literally requires "true" or "false" to work.
return $val === true ? 'true' : 'false';
}
public function getSize() {
- return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 45;
+ return $this->mParams['size'] ?? 45;
}
public function getSpellCheck() {
- $val = isset( $this->mParams['spellcheck'] ) ? $this->mParams['spellcheck'] : null;
+ $val = $this->mParams['spellcheck'] ?? null;
if ( is_bool( $val ) ) {
// "spellcheck" attribute literally requires "true" or "false" to work.
return $val === true ? 'true' : 'false';
}
protected function getType( &$attribs ) {
- $type = isset( $attribs['type'] ) ? $attribs['type'] : 'text';
+ $type = $attribs['type'] ?? 'text';
unset( $attribs['type'] );
# Implement tiny differences between some field variants
} elseif ( $tag == 'revision' || $tag == 'upload' ) {
if ( !isset( $title ) ) {
$title = $this->processTitle( $pageInfo['title'],
- isset( $pageInfo['ns'] ) ? $pageInfo['ns'] : null );
+ $pageInfo['ns'] ?? null );
// $title is either an array of two titles or false.
if ( is_array( $title ) ) {
*/
private function processUpload( $pageInfo, $uploadInfo ) {
$revision = new WikiRevision( $this->config );
- $text = isset( $uploadInfo['text'] ) ? $uploadInfo['text'] : '';
+ $text = $uploadInfo['text'] ?? '';
$revision->setTitle( $pageInfo['_title'] );
$revision->setID( $pageInfo['id'] );
$this->setVar( '_InstallUser',
$option['installdbuser'] );
$this->setVar( '_InstallPassword',
- isset( $option['installdbpass'] ) ? $option['installdbpass'] : "" );
+ $option['installdbpass'] ?? "" );
// Assume that if we're given the installer user, we'll create the account.
$this->setVar( '_CreateDBAccount', true );
// Copy $wgAuthenticationTokenVersion too, if it exists
$this->setVar( 'wgAuthenticationTokenVersion',
- isset( $vars['wgAuthenticationTokenVersion'] )
- ? $vars['wgAuthenticationTokenVersion']
- : null
+ $vars['wgAuthenticationTokenVersion'] ?? null
);
return $status;
"config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] зьяўляецца галоўнай мэтай MediaWiki і падтрымліваецца лепей за ўсё. MediaWiki таксама працуе з [{{int:version-db-mariadb-url}} MariaDB] і [{{int:version-db-percona-url}} Percona Server], якія сумяшчальныя з MySQL. ([https://secure.php.net/manual/en/mysqli.installation.php Як скампіляваць PHP з падтрымкай MySQL])",
"config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] — папулярная сыстэма базы зьвестак з адкрытым кодам, якая зьяўляецца альтэрнатывай MySQL. ([https://secure.php.net/manual/en/pgsql.installation.php Як кампіляваць PHP з падтрымкай PostgreSQL])",
"config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] — невялікая сыстэма базы зьвестак, якая мае вельмі добрую падтрымку. ([https://secure.php.net/manual/en/pdo.installation.php Як кампіляваць PHP з падтрымкай SQLite], выкарыстоўвае PDO)",
- "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] зьяўляецца камэрцыйнай прафэсійнай базай зьвестак. ([http://www.php.net/manual/en/oci8.installation.php Як скампіляваць PHP з падтрымкай OCI8])",
+ "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] зьяўляецца камэрцыйнай прафэсійнай базай зьвестак. ([https://secure.php.net/manual/en/oci8.installation.php Як скампіляваць PHP з падтрымкай OCI8])",
"config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] — камэрцыйная база зьвестак для Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Як скампіляваць PHP з падтрымкай SQLSRV])",
"config-header-mysql": "Налады MySQL",
"config-header-postgres": "Налады PostgreSQL",
"config-license-help": "Шматлікія адкрытыя вікі публікуюць увесь унёсак у праект на ўмовах [https://freedomdefined.org/Definition вольнай ліцэнзіі].\nГэта дазваляе ствараць эфэкт супольнай уласнасьці і садзейнічае доўгатэрміноваму ўнёску.\nДля прыватных і карпаратыўных вікі гэта не зьяўляецца неабходнасьцю.\n\nКалі Вы жадаеце выкарыстоўваць тэкст зь Вікіпэдыі, і жадаеце, каб Вікіпэдыя магла прымаць тэксты, скапіяваныя з Вашай вікі, Вам неабходна выбраць ліцэнзію <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nРаней Вікіпэдыя выкарыстоўвала ліцэнзію GNU Free Documentation.\nЯна ўсё яшчэ дзейнічае, але яна ўтрымлівае некаторыя моманты, якія ўскладняюць паўторнае выкарыстаньне і інтэрпрэтацыю матэрыялаў.",
"config-email-settings": "Налады электроннай пошты",
"config-enable-email": "Дазволіць выходзячыя электронныя лісты",
- "config-enable-email-help": "Ð\9aалÑ\96 Ð\92Ñ\8b жадаеÑ\86е, каб пÑ\80аÑ\86авала Ñ\8dлекÑ\82Ñ\80оннаÑ\8f поÑ\88Ñ\82а, неабÑ\85одна Ñ\81канÑ\84Ñ\96гÑ\83Ñ\80аваÑ\86Ñ\8c PHP [Config-dbsupport-oracle/manual/en/mail.configuration.php адпаведнÑ\8bм Ñ\87Ñ\8bнам].\nÐ\9aалÑ\96 Ð\92Ñ\8b не жадаеÑ\86е вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\86Ñ\8c магÑ\87Ñ\8bмаÑ\81Ñ\8cÑ\86Ñ\96 Ñ\8dлекÑ\82Ñ\80оннай поÑ\88Ñ\82Ñ\8b, Ð\92Ñ\8b можаÑ\86е Ñ\8fе адклÑ\8eÑ\87Ñ\8bÑ\86Ñ\8c.",
+ "config-enable-email-help": "Ð\9aалÑ\96 вÑ\8b жадаеÑ\86е, каб пÑ\80аÑ\86авала Ñ\8dлекÑ\82Ñ\80оннаÑ\8f поÑ\88Ñ\82а, неабÑ\85одна Ñ\81канÑ\84Ñ\96гÑ\83Ñ\80аваÑ\86Ñ\8c PHP [https://secure.php.net/manual/en/mail.configuration.php адпаведнÑ\8bм Ñ\87Ñ\8bнам].\nÐ\9aалÑ\96 вÑ\8b не жадаеÑ\86е вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\86Ñ\8c магÑ\87Ñ\8bмаÑ\81Ñ\8cÑ\86Ñ\96 Ñ\8dлекÑ\82Ñ\80оннай поÑ\88Ñ\82Ñ\8b, вÑ\8b можаÑ\86е Ñ\96Ñ\85 адклÑ\8eÑ\87Ñ\8bÑ\86Ñ\8c Ñ\82Ñ\83Ñ\82.",
"config-email-user": "Дазволіць электронную пошту для сувязі паміж удзельнікамі",
"config-email-user-help": "Дазволіць усім удзельнікам дасылаць адзін аднаму электронныя лісты, калі ўключаная адпаведная магчымасьць ў іх наладах.",
"config-email-usertalk": "Уключыць абвяшчэньні пра паведамленьні на старонцы абмеркаваньня",
private function loadFromArray( $mc ) {
if ( isset( $mc['iw_url'] ) ) {
$url = $mc['iw_url'];
- $local = isset( $mc['iw_local'] ) ? $mc['iw_local'] : 0;
- $trans = isset( $mc['iw_trans'] ) ? $mc['iw_trans'] : 0;
- $api = isset( $mc['iw_api'] ) ? $mc['iw_api'] : '';
- $wikiId = isset( $mc['iw_wikiid'] ) ? $mc['iw_wikiid'] : '';
+ $local = $mc['iw_local'] ?? 0;
+ $trans = $mc['iw_trans'] ?? 0;
+ $api = $mc['iw_api'] ?? '';
+ $wikiId = $mc['iw_wikiid'] ?? '';
return new Interwiki( null, $url, $api, $wikiId, $local, $trans );
}
* @since 1.27
*/
public function getRequestId() {
- return isset( $this->params['requestId'] )
- ? $this->params['requestId']
- : null;
+ return $this->params['requestId'] ?? null;
}
/**
*/
public function getRootJobParams() {
return [
- 'rootJobSignature' => isset( $this->params['rootJobSignature'] )
- ? $this->params['rootJobSignature']
- : null,
- 'rootJobTimestamp' => isset( $this->params['rootJobTimestamp'] )
- ? $this->params['rootJobTimestamp']
- : null
+ 'rootJobSignature' => $this->params['rootJobSignature'] ?? null,
+ 'rootJobTimestamp' => $this->params['rootJobTimestamp'] ?? null
];
}
protected function __construct( array $params ) {
$this->wiki = $params['wiki'];
$this->type = $params['type'];
- $this->claimTTL = isset( $params['claimTTL'] ) ? $params['claimTTL'] : 0;
- $this->maxTries = isset( $params['maxTries'] ) ? $params['maxTries'] : 3;
+ $this->claimTTL = $params['claimTTL'] ?? 0;
+ $this->maxTries = $params['maxTries'] ?? 3;
if ( isset( $params['order'] ) && $params['order'] !== 'any' ) {
$this->order = $params['order'];
} else {
throw new MWException( __CLASS__ . " does not support '{$this->order}' order." );
}
$this->dupCache = wfGetCache( CACHE_ANYTHING );
- $this->aggr = isset( $params['aggregator'] )
- ? $params['aggregator']
- : new JobQueueAggregatorNull( [] );
- $this->readOnlyReason = isset( $params['readOnlyReason'] )
- ? $params['readOnlyReason']
- : false;
+ $this->aggr = $params['aggregator'] ?? new JobQueueAggregatorNull( [] );
+ $this->readOnlyReason = $params['readOnlyReason'] ?? false;
}
/**
protected function __construct( array $params ) {
parent::__construct( $params );
- $this->cluster = isset( $params['cluster'] ) ? $params['cluster'] : false;
+ $this->cluster = $params['cluster'] ?? false;
$this->cache = ObjectCache::getMainWANInstance();
}
*/
protected function __construct( array $params ) {
parent::__construct( $params );
- $section = isset( $params['sectionsByWiki'][$this->wiki] )
- ? $params['sectionsByWiki'][$this->wiki]
- : 'default';
+ $section = $params['sectionsByWiki'][$this->wiki] ?? 'default';
if ( !isset( $params['partitionsBySection'][$section] ) ) {
throw new MWException( "No configuration for section '$section'." );
}
- $this->maxPartitionsTry = isset( $params['maxPartitionsTry'] )
- ? $params['maxPartitionsTry']
- : 2;
+ $this->maxPartitionsTry = $params['maxPartitionsTry'] ?? 2;
// Get the full partition map
$partitionMap = $params['partitionsBySection'][$section];
arsort( $partitionMap, SORT_NUMERIC );
parent::__construct( $params );
$params['redisConfig']['serializer'] = 'none'; // make it easy to use Lua
$this->server = $params['redisServer'];
- $this->compression = isset( $params['compression'] ) ? $params['compression'] : 'none';
+ $this->compression = $params['compression'] ?? 'none';
$this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
if ( empty( $params['daemonized'] ) ) {
throw new InvalidArgumentException(
$conf = [ 'wiki' => $params['wiki'], 'type' => $params['type'] ];
$this->mainQueue = JobQueue::factory( $params['mainqueue'] + $conf );
$this->debugQueue = JobQueue::factory( $params['debugqueue'] + $conf );
- $this->onlyWriteToDebugQueue = isset( $params['readonly'] ) ? $params['readonly'] : false;
+ $this->onlyWriteToDebugQueue = $params['readonly'] ?? false;
// We need to construct parent after creating the main and debug queue
// because super constructor calls some methods we delegate to the main queue.
$response = [ 'jobs' => [], 'reached' => 'none-ready' ];
- $type = isset( $options['type'] ) ? $options['type'] : false;
- $maxJobs = isset( $options['maxJobs'] ) ? $options['maxJobs'] : false;
- $maxTime = isset( $options['maxTime'] ) ? $options['maxTime'] : false;
+ $type = $options['type'] ?? false;
+ $maxJobs = $options['maxJobs'] ?? false;
+ $maxTime = $options['maxTime'] ?? false;
$noThrottle = isset( $options['throttle'] ) && !$options['throttle'];
// Bail if job type is invalid
public function getRootJobParams() {
return [
- 'rootJobSignature' => isset( $this->params['rootJobSignature'] )
- ? $this->params['rootJobSignature']
- : null,
- 'rootJobTimestamp' => isset( $this->params['rootJobTimestamp'] )
- ? $this->params['rootJobTimestamp']
- : null
+ 'rootJobSignature' => $this->params['rootJobSignature'] ?? null,
+ 'rootJobTimestamp' => $this->params['rootJobTimestamp'] ?? null
];
}
*/
public function __construct( array $params ) {
parent::__construct( $params );
- $this->servers = isset( $params['redisServers'] )
- ? $params['redisServers']
- : [ $params['redisServer'] ]; // b/c
+ $this->servers = $params['redisServers'] ?? [ $params['redisServer'] ]; // b/c
$params['redisConfig']['serializer'] = 'none';
$this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
$this->logger = \MediaWiki\Logger\LoggerFactory::getInstance( 'redis' );
}
$factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
- $timestamp = isset( $this->params['timestamp'] ) ? $this->params['timestamp'] : null;
+ $timestamp = $this->params['timestamp'] ?? null;
$page = WikiPage::factory( $this->title ); // title when deleted
$update = new LinksDeletionUpdate( $page, $pageId, $timestamp );
// not expected to invalidate these cache entries too often.
$touchTimestamp = wfTimestampNow();
// If page_touched is higher than this, then something else already bumped it after enqueue
- $condTimestamp = isset( $this->params['rootJobTimestamp'] )
- ? $this->params['rootJobTimestamp']
- : $touchTimestamp;
+ $condTimestamp = $this->params['rootJobTimestamp'] ?? $touchTimestamp;
$dbw = wfGetDB( DB_MASTER );
$factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
$this->params['text'],
$this->params['watch'],
$user,
- isset( $this->params['tags'] ) ? $this->params['tags'] : []
+ $this->params['tags'] ?? []
);
if ( !$status->isGood() ) {
UploadBase::setSessionStatus(
$realBSize = $bSize;
}
- $extraParams = isset( $opts['params'] ) ? $opts['params'] : [];
+ $extraParams = $opts['params'] ?? [];
$jobs = [];
// Combine the first range (of size $bSize) backlinks into leaf jobs
507 => 'Insufficient Storage',
511 => 'Network Authentication Required',
];
- return isset( $statusMessage[$code] ) ? $statusMessage[$code] : null;
+ return $statusMessage[$code] ?? null;
}
/**
// Now get the token type from our type array
$token = substr( $s, $pos, $end - $pos ); // so $end - $pos == strlen( $token )
- $type = isset( $tokenTypes[$token] ) ? $tokenTypes[$token] : self::TYPE_LITERAL;
+ $type = $tokenTypes[$token] ?? self::TYPE_LITERAL;
if ( $newlineFound && isset( $semicolon[$state][$type] ) ) {
// This token triggers the semicolon insertion mechanism of javascript. While we
}
parent::__construct( $baseIterator );
$this->vCallback = $vCallback;
- $this->aCallback = isset( $options['accept'] ) ? $options['accept'] : null;
+ $this->aCallback = $options['accept'] ?? null;
}
public function next() {
throw new Exception( "Request has no 'url' field set." );
}
$this->logger->debug( "{$req['method']}: {$req['url']}" );
- $req['query'] = isset( $req['query'] ) ? $req['query'] : [];
+ $req['query'] = $req['query'] ?? [];
$headers = []; // normalized headers
if ( isset( $req['headers'] ) ) {
foreach ( $req['headers'] as $name => $value ) {
$req['body'] = '';
$req['headers']['content-length'] = 0;
}
- $req['flags'] = isset( $req['flags'] ) ? $req['flags'] : [];
+ $req['flags'] = $req['flags'] ?? [];
$handles[$index] = $this->getCurlHandle( $req, $opts );
if ( count( $reqs ) > 1 ) {
// https://github.com/guzzle/guzzle/issues/349
$ch = curl_init();
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT,
- isset( $opts['connTimeout'] ) ? $opts['connTimeout'] : $this->connTimeout );
- curl_setopt( $ch, CURLOPT_PROXY, isset( $req['proxy'] ) ? $req['proxy'] : $this->proxy );
+ $opts['connTimeout'] ?? $this->connTimeout );
+ curl_setopt( $ch, CURLOPT_PROXY, $req['proxy'] ?? $this->proxy );
curl_setopt( $ch, CURLOPT_TIMEOUT,
- isset( $opts['reqTimeout'] ) ? $opts['reqTimeout'] : $this->reqTimeout );
+ $opts['reqTimeout'] ?? $this->reqTimeout );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt( $ch, CURLOPT_MAXREDIRS, 4 );
curl_setopt( $ch, CURLOPT_HEADER, 0 );
public function __construct( array $params = [] ) {
$this->clearMarks();
- $this->setLogger( isset( $params['logger'] ) ? $params['logger'] : new NullLogger() );
+ $this->setLogger( $params['logger'] ?? new NullLogger() );
}
/**
*/
private function sortEntries() {
uasort( $this->entries, function ( $a, $b ) {
- return 10000 * ( $a['startTime'] - $b['startTime'] );
+ return $a['startTime'] <=> $b['startTime'];
} );
}
* @return array|null Entry named $name or null if it does not exist.
*/
public function getEntryByName( $name ) {
- return isset( $this->entries[$name] ) ? $this->entries[$name] : null;
+ return $this->entries[$name] ?? null;
}
}
// IPv6 bracketed host
$host = $m[1];
$port = intval( $m[2] );
- $prefix = isset( $m[3] ) ? $m[3] : false;
+ $prefix = $m[3] ?? false;
$domain = AF_INET6;
} elseif ( preg_match( '!^udp:(?://)?([a-zA-Z0-9.-]+):(\d+)(?:/(.*))?$!', $info, $m ) ) {
$host = $m[1];
$host = gethostbyname( $host );
}
$port = intval( $m[2] );
- $prefix = isset( $m[3] ) ? $m[3] : false;
+ $prefix = $m[3] ?? false;
$domain = AF_INET;
} else {
throw new InvalidArgumentException( __METHOD__ . ': Invalid UDP specification' );
return function ( $a, $b ) use ( $key, $sub ) {
if ( isset( $a[$key] ) && isset( $b[$key] ) ) {
// Descending sort: larger values will be first in result.
- // Assumes all values are numeric.
// Values for 'main()' will not have sub keys
$valA = is_array( $a[$key] ) ? $a[$key][$sub] : $a[$key];
$valB = is_array( $b[$key] ) ? $b[$key][$sub] : $b[$key];
- return $valB - $valA;
+ return $valB <=> $valA;
} else {
// Sort datum with the key before those without
return isset( $a[$key] ) ? -1 : 1;
$deps[$installed['name']] = [
'version' => ComposerJson::normalizeVersion( $installed['version'] ),
'type' => $installed['type'],
- 'licenses' => isset( $installed['license'] ) ? $installed['license'] : [],
- 'authors' => isset( $installed['authors'] ) ? $installed['authors'] : [],
- 'description' => isset( $installed['description'] ) ? $installed['description'] : '',
+ 'licenses' => $installed['license'] ?? [],
+ 'authors' => $installed['authors'] ?? [],
+ 'description' => $installed['description'] ?? '',
];
}
$deps[$installed['name']] = [
'version' => ComposerJson::normalizeVersion( $installed['version'] ),
'type' => $installed['type'],
- 'licenses' => isset( $installed['license'] ) ? $installed['license'] : [],
- 'authors' => isset( $installed['authors'] ) ? $installed['authors'] : [],
- 'description' => isset( $installed['description'] ) ? $installed['description'] : '',
+ 'licenses' => $installed['license'] ?? [],
+ 'authors' => $installed['authors'] ?? [],
+ 'description' => $installed['description'] ?? '',
];
}
}
}
- $this->fileMode = isset( $config['fileMode'] ) ? $config['fileMode'] : 0644;
- $this->dirMode = isset( $config['directoryMode'] ) ? $config['directoryMode'] : 0777;
+ $this->fileMode = $config['fileMode'] ?? 0644;
+ $this->dirMode = $config['directoryMode'] ?? 0777;
if ( isset( $config['fileOwner'] ) && function_exists( 'posix_getuid' ) ) {
$this->fileOwner = $config['fileOwner'];
// cache this, assuming it doesn't change
throw new InvalidArgumentException(
"Backend domain ID not provided for '{$this->name}'." );
}
- $this->lockManager = isset( $config['lockManager'] )
- ? $config['lockManager']
- : new NullLockManager( [] );
- $this->fileJournal = isset( $config['fileJournal'] )
- ? $config['fileJournal']
- : FileJournal::factory( [ 'class' => NullFileJournal::class ], $this->name );
+ $this->lockManager = $config['lockManager'] ?? new NullLockManager( [] );
+ $this->fileJournal = $config['fileJournal']
+ ?? FileJournal::factory( [ 'class' => NullFileJournal::class ], $this->name );
$this->readOnly = isset( $config['readOnly'] )
? (string)$config['readOnly']
: '';
$this->concurrency = isset( $config['concurrency'] )
? (int)$config['concurrency']
: 50;
- $this->obResetFunc = isset( $config['obResetFunc'] )
- ? $config['obResetFunc']
- : [ $this, 'resetOutputBuffer' ];
- $this->streamMimeFunc = isset( $config['streamMimeFunc'] )
- ? $config['streamMimeFunc']
- : null;
- $this->statusWrapper = isset( $config['statusWrapper'] ) ? $config['statusWrapper'] : null;
-
- $this->profiler = isset( $config['profiler'] ) ? $config['profiler'] : null;
- $this->logger = isset( $config['logger'] ) ? $config['logger'] : new \Psr\Log\NullLogger();
- $this->statusWrapper = isset( $config['statusWrapper'] ) ? $config['statusWrapper'] : null;
- $this->tmpDirectory = isset( $config['tmpDirectory'] ) ? $config['tmpDirectory'] : null;
+ $this->obResetFunc = $config['obResetFunc'] ?? [ $this, 'resetOutputBuffer' ];
+ $this->streamMimeFunc = $config['streamMimeFunc'] ?? null;
+ $this->statusWrapper = $config['statusWrapper'] ?? null;
+
+ $this->profiler = $config['profiler'] ?? null;
+ $this->logger = $config['logger'] ?? new \Psr\Log\NullLogger();
+ $this->statusWrapper = $config['statusWrapper'] ?? null;
+ $this->tmpDirectory = $config['tmpDirectory'] ?? null;
}
public function setLogger( LoggerInterface $logger ) {
*/
protected function resolveFSFileObjects( array $ops ) {
foreach ( $ops as &$op ) {
- $src = isset( $op['src'] ) ? $op['src'] : null;
+ $src = $op['src'] ?? null;
if ( $src instanceof FSFile ) {
$op['srcRef'] = $src;
$op['src'] = $src->getPath();
*/
public function __construct( array $config ) {
parent::__construct( $config );
- $this->syncChecks = isset( $config['syncChecks'] )
- ? $config['syncChecks']
- : self::CHECK_SIZE;
- $this->autoResync = isset( $config['autoResync'] )
- ? $config['autoResync']
- : false;
+ $this->syncChecks = $config['syncChecks'] ?? self::CHECK_SIZE;
+ $this->autoResync = $config['autoResync'] ?? false;
$this->asyncWrites = isset( $config['replication'] ) && $config['replication'] === 'async';
// Construct backends here rather than via registration
// to keep these backends hidden from outside the proxy.
*/
public function __construct( array $config ) {
parent::__construct( $config );
- $this->mimeCallback = isset( $config['mimeCallback'] )
- ? $config['mimeCallback']
- : null;
+ $this->mimeCallback = $config['mimeCallback'] ?? null;
$this->srvCache = new EmptyBagOStuff(); // disabled by default
$this->memCache = WANObjectCache::newEmpty(); // disabled by default
$this->cheapCache = new ProcessCacheLRU( self::CACHE_CHEAP_SIZE );
$stat = $this->doGetFileStat( $params );
if ( is_array( $stat ) ) { // file exists
// Strongly consistent backends can automatically set "latest"
- $stat['latest'] = isset( $stat['latest'] ) ? $stat['latest'] : $latest;
+ $stat['latest'] = $stat['latest'] ?? $latest;
$this->cheapCache->set( $path, 'stat', $stat );
$this->setFileCache( $path, $stat ); // update persistent cache
if ( isset( $stat['sha1'] ) ) { // some backends store SHA-1 as metadata
$status = $this->newStatus();
// Always set some fields for subclass convenience
- $params['options'] = isset( $params['options'] ) ? $params['options'] : [];
- $params['headers'] = isset( $params['headers'] ) ? $params['headers'] : [];
+ $params['options'] = $params['options'] ?? [];
+ $params['headers'] = $params['headers'] ?? [];
// Don't stream it out as text/html if there was a PHP error
if ( ( empty( $params['headless'] ) || $params['headers'] ) && headers_sent() ) {
}
if ( is_array( $stat ) ) { // file exists
// Strongly consistent backends can automatically set "latest"
- $stat['latest'] = isset( $stat['latest'] ) ? $stat['latest'] : $latest;
+ $stat['latest'] = $stat['latest'] ?? $latest;
$this->cheapCache->set( $path, 'stat', $stat );
$this->setFileCache( $path, $stat ); // update persistent cache
if ( isset( $stat['sha1'] ) ) { // some backends store SHA-1 as metadata
$batchId = $journal->getTimestampedUUID();
$ignoreErrors = !empty( $opts['force'] );
$journaled = empty( $opts['nonJournaled'] );
- $maxConcurrency = isset( $opts['concurrency'] ) ? $opts['concurrency'] : 1;
+ $maxConcurrency = $opts['concurrency'] ?? 1;
$entries = []; // file journal entry list
$predicates = FileOp::newPredicates(); // account for previous ops in prechecks
*/
public function __construct( $path, array $params = [] ) {
$this->path = $path;
- $this->obResetFunc = isset( $params['obResetFunc'] )
- ? $params['obResetFunc']
- : [ __CLASS__, 'resetOutputBuffers' ];
- $this->streamMimeFunc = isset( $params['streamMimeFunc'] )
- ? $params['streamMimeFunc']
- : [ __CLASS__, 'contentTypeFromPath' ];
+ $this->obResetFunc = $params['obResetFunc'] ?? [ __CLASS__, 'resetOutputBuffers' ];
+ $this->streamMimeFunc = $params['streamMimeFunc'] ?? [ __CLASS__, 'contentTypeFromPath' ];
}
/**
$this->swiftUser = $config['swiftUser'];
$this->swiftKey = $config['swiftKey'];
// Optional settings
- $this->authTTL = isset( $config['swiftAuthTTL'] )
- ? $config['swiftAuthTTL']
- : 15 * 60; // some sane number
- $this->swiftTempUrlKey = isset( $config['swiftTempUrlKey'] )
- ? $config['swiftTempUrlKey']
- : '';
- $this->swiftStorageUrl = isset( $config['swiftStorageUrl'] )
- ? $config['swiftStorageUrl']
- : null;
- $this->shardViaHashLevels = isset( $config['shardViaHashLevels'] )
- ? $config['shardViaHashLevels']
- : '';
- $this->rgwS3AccessKey = isset( $config['rgwS3AccessKey'] )
- ? $config['rgwS3AccessKey']
- : '';
- $this->rgwS3SecretKey = isset( $config['rgwS3SecretKey'] )
- ? $config['rgwS3SecretKey']
- : '';
+ $this->authTTL = $config['swiftAuthTTL'] ?? 15 * 60; // some sane number
+ $this->swiftTempUrlKey = $config['swiftTempUrlKey'] ?? '';
+ $this->swiftStorageUrl = $config['swiftStorageUrl'] ?? null;
+ $this->shardViaHashLevels = $config['shardViaHashLevels'] ?? '';
+ $this->rgwS3AccessKey = $config['rgwS3AccessKey'] ?? '';
+ $this->rgwS3SecretKey = $config['rgwS3SecretKey'] ?? '';
// HTTP helper client
$this->http = new MultiHttpClient( [] );
// Cache container information to mask latency
} else {
$this->srvCache = new EmptyBagOStuff();
}
- $this->readUsers = isset( $config['readUsers'] )
- ? $config['readUsers']
- : [];
- $this->writeUsers = isset( $config['writeUsers'] )
- ? $config['writeUsers']
- : [];
- $this->secureReadUsers = isset( $config['secureReadUsers'] )
- ? $config['secureReadUsers']
- : [];
- $this->secureWriteUsers = isset( $config['secureWriteUsers'] )
- ? $config['secureWriteUsers']
- : [];
+ $this->readUsers = $config['readUsers'] ?? [];
+ $this->writeUsers = $config['writeUsers'] ?? [];
+ $this->secureReadUsers = $config['secureReadUsers'] ?? [];
+ $this->secureWriteUsers = $config['secureWriteUsers'] ?? [];
}
public function getFeatures() {
}
$sha1Hash = Wikimedia\base_convert( sha1( $params['content'] ), 16, 36, 31 );
- $contentType = isset( $params['headers']['content-type'] )
- ? $params['headers']['content-type']
- : $this->getContentType( $params['dst'], $params['content'], null );
+ $contentType = $params['headers']['content-type']
+ ?? $this->getContentType( $params['dst'], $params['content'], null );
$reqs = [ [
'method' => 'PUT',
return $status;
}
$sha1Hash = Wikimedia\base_convert( $sha1Hash, 16, 36, 31 );
- $contentType = isset( $params['headers']['content-type'] )
- ? $params['headers']['content-type']
- : $this->getContentType( $params['dst'], null, $params['src'] );
+ $contentType = $params['headers']['content-type']
+ ?? $this->getContentType( $params['dst'], null, $params['src'] );
$handle = fopen( $params['src'], 'rb' );
if ( $handle === false ) { // source doesn't exist?
return null;
}
- $ttl = isset( $params['ttl'] ) ? $params['ttl'] : 86400;
+ $ttl = $params['ttl'] ?? 86400;
$expires = time() + $ttl;
if ( $this->swiftTempUrlKey != '' ) {
foreach ( $reqs as $stage => &$req ) {
list( $container, $relPath ) = $req['url'];
$req['url'] = $this->storageUrl( $auth, $container, $relPath );
- $req['headers'] = isset( $req['headers'] ) ? $req['headers'] : [];
+ $req['headers'] = $req['headers'] ?? [];
$req['headers'] = $this->authTokenHeaders( $auth ) + $req['headers'];
$httpReqsByStage[$stage][$index] = $req;
}
'mtime' => $this->convertSwiftDate( $rhdrs['last-modified'], TS_MW ),
// Empty objects actually return no content-length header in Ceph
'size' => isset( $rhdrs['content-length'] ) ? (int)$rhdrs['content-length'] : 0,
- 'sha1' => isset( $metadata['sha1base36'] ) ? $metadata['sha1base36'] : null,
+ 'sha1' => $metadata['sha1base36'] ?? null,
// Note: manifiest ETags are not an MD5 of the file
'md5' => ctype_xdigit( $rhdrs['etag'] ) ? $rhdrs['etag'] : null,
'xattr' => [ 'metadata' => $metadata, 'headers' => $headers ]
* 'ttlDays' : days to keep log entries around (false means "forever")
*/
protected function __construct( array $config ) {
- $this->ttlDays = isset( $config['ttlDays'] ) ? $config['ttlDays'] : false;
+ $this->ttlDays = $config['ttlDays'] ?? false;
}
/**
* @return mixed Returns null if the parameter is not set
*/
final public function getParam( $name ) {
- return isset( $this->params[$name] ) ? $this->params[$name] : null;
+ return $this->params[$name] ?? null;
}
/**
// Tracks peers that couldn't be queried recently to avoid lengthy
// connection timeouts. This is useless if each bucket has one peer.
- $this->statusCache = isset( $config['srvCache'] )
- ? $config['srvCache']
- : new HashBagOStuff();
+ $this->statusCache = $config['srvCache'] ?? new HashBagOStuff();
}
/**
* This only applies if locks are not tied to a connection/process.
*/
public function __construct( array $config ) {
- $this->domain = isset( $config['domain'] ) ? $config['domain'] : 'global';
+ $this->domain = $config['domain'] ?? 'global';
if ( isset( $config['lockTTL'] ) ) {
$this->lockTTL = max( 5, $config['lockTTL'] );
} elseif ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' ) {
}
$this->session = md5( implode( '-', $random ) );
- $this->logger = isset( $config['logger'] ) ? $config['logger'] : new \Psr\Log\NullLogger();
+ $this->logger = $config['logger'] ?? new \Psr\Log\NullLogger();
}
/**
$this->srvsByBucket = array_filter( $config['srvsByBucket'], 'is_array' );
$this->srvsByBucket = array_values( $this->srvsByBucket ); // consecutive
- $memcConfig = isset( $config['memcConfig'] ) ? $config['memcConfig'] : [];
+ $memcConfig = $config['memcConfig'] ?? [];
$memcConfig += [ 'class' => MemcachedPhpBagOStuff::class ]; // default
$class = $memcConfig['class'];
$this->typeFile = $params['typeFile'];
$this->infoFile = $params['infoFile'];
$this->xmlTypes = $params['xmlTypes'];
- $this->initCallback = isset( $params['initCallback'] )
- ? $params['initCallback']
- : null;
- $this->detectCallback = isset( $params['detectCallback'] )
- ? $params['detectCallback']
- : null;
- $this->guessCallback = isset( $params['guessCallback'] )
- ? $params['guessCallback']
- : null;
- $this->extCallback = isset( $params['extCallback'] )
- ? $params['extCallback']
- : null;
- $this->logger = isset( $params['logger'] )
- ? $params['logger']
- : new \Psr\Log\NullLogger();
+ $this->initCallback = $params['initCallback'] ?? null;
+ $this->detectCallback = $params['detectCallback'] ?? null;
+ $this->guessCallback = $params['guessCallback'] ?? null;
+ $this->extCallback = $params['extCallback'] ?? null;
+ $this->logger = $params['logger'] ?? new \Psr\Log\NullLogger();
$this->loadFiles();
}
public function getTypesForExtension( $ext ) {
$ext = strtolower( $ext );
- $r = isset( $this->mExtToMime[$ext] ) ? $this->mExtToMime[$ext] : null;
+ $r = $this->mExtToMime[$ext] ?? null;
return $r;
}
$callbackReturn = call_user_func(
$externalCallback,
$parsedDTD['type'],
- isset( $parsedDTD['publicid'] ) ? $parsedDTD['publicid'] : null,
- isset( $parsedDTD['systemid'] ) ? $parsedDTD['systemid'] : null
+ $parsedDTD['publicid'] ?? null,
+ $parsedDTD['systemid'] ?? null
);
}
if ( $callbackReturn ) {
/** @var callable[] */
protected $busyCallbacks = [];
+ /** @var float|null */
+ private $wallClockOverride;
+
/** @var int[] Map of (ATTR_* class constant => QOS_* class constant) */
protected $attrMap = [];
$this->keyspace = $params['keyspace'];
}
- $this->asyncHandler = isset( $params['asyncHandler'] )
- ? $params['asyncHandler']
- : null;
+ $this->asyncHandler = $params['asyncHandler'] ?? null;
if ( !empty( $params['reportDupes'] ) && is_callable( $this->asyncHandler ) ) {
$this->reportDupes = true;
}
- $this->syncTimeout = isset( $params['syncTimeout'] ) ? $params['syncTimeout'] : 3;
+ $this->syncTimeout = $params['syncTimeout'] ?? 3;
}
/**
return null;
}
- $lSince = microtime( true ); // lock timestamp
+ $lSince = $this->getCurrentTime(); // lock timestamp
return new ScopedCallback( function () use ( $key, $lSince, $expiry ) {
$latency = 0.050; // latency skew (err towards keeping lock present)
- $age = ( microtime( true ) - $lSince + $latency );
+ $age = ( $this->getCurrentTime() - $lSince + $latency );
if ( ( $age + $latency ) >= $expiry ) {
$this->logger->warning( "Lock for $key held too long ($age sec)." );
return; // expired; it's not "safe" to delete the key
*/
protected function convertExpiry( $exptime ) {
if ( $exptime != 0 && $exptime < ( 10 * self::TTL_YEAR ) ) {
- return time() + $exptime;
+ return (int)$this->getCurrentTime() + $exptime;
} else {
return $exptime;
}
*/
protected function convertToRelative( $exptime ) {
if ( $exptime >= ( 10 * self::TTL_YEAR ) ) {
- $exptime -= time();
+ $exptime -= (int)$this->getCurrentTime();
if ( $exptime <= 0 ) {
$exptime = 1;
}
* @since 1.28
*/
public function getQoS( $flag ) {
- return isset( $this->attrMap[$flag] ) ? $this->attrMap[$flag] : self::QOS_UNKNOWN;
+ return $this->attrMap[$flag] ?? self::QOS_UNKNOWN;
}
/**
return $map;
}
+
+ /**
+ * @return float UNIX timestamp
+ * @codeCoverageIgnore
+ */
+ protected function getCurrentTime() {
+ return $this->wallClockOverride ?: microtime( true );
+ }
+
+ /**
+ * @param float|null &$time Mock UNIX timestamp for testing
+ * @codeCoverageIgnore
+ */
+ public function setMockTime( &$time ) {
+ $this->wallClockOverride =& $time;
+ }
}
function __construct( $params = [] ) {
parent::__construct( $params );
- $this->maxCacheKeys = isset( $params['maxKeys'] ) ? $params['maxKeys'] : INF;
+ $this->maxCacheKeys = $params['maxKeys'] ?? INF;
if ( $this->maxCacheKeys <= 0 ) {
throw new InvalidArgumentException( '$maxKeys parameter must be above zero' );
}
public function clear() {
$this->bag = [];
}
-
- protected function getCurrentTime() {
- return time();
- }
}
* @return mixed
*/
public function __construct( $args ) {
- $this->set_servers( isset( $args['servers'] ) ? $args['servers'] : array() );
- $this->_debug = isset( $args['debug'] ) ? $args['debug'] : false;
+ $this->set_servers( $args['servers'] ?? array() );
+ $this->_debug = $args['debug'] ?? false;
$this->stats = array();
- $this->_compress_threshold = isset( $args['compress_threshold'] ) ? $args['compress_threshold'] : 0;
- $this->_persistent = isset( $args['persistent'] ) ? $args['persistent'] : false;
+ $this->_compress_threshold = $args['compress_threshold'] ?? 0;
+ $this->_persistent = $args['persistent'] ?? false;
$this->_compress_enable = true;
$this->_have_zlib = function_exists( 'gzcompress' );
$this->_host_dead = array();
$this->_timeout_seconds = 0;
- $this->_timeout_microseconds = isset( $args['timeout'] ) ? $args['timeout'] : 500000;
+ $this->_timeout_microseconds = $args['timeout'] ?? 500000;
- $this->_connect_timeout = isset( $args['connect_timeout'] ) ? $args['connect_timeout'] : 0.1;
+ $this->_connect_timeout = $args['connect_timeout'] ?? 0.1;
$this->_connect_attempts = 2;
- $this->_logger = isset( $args['logger'] ) ? $args['logger'] : new NullLogger();
+ $this->_logger = $args['logger'] ?? new NullLogger();
}
// }}}
*/
protected function getMasterLinkStatus( RedisConnRef $conn ) {
$info = $conn->info();
- return isset( $info['master_link_status'] )
- ? $info['master_link_status']
- : null;
+ return $info['master_link_status'] ?? null;
}
/**
/** @var int Key fetched */
private $warmupKeyMisses = 0;
+ /** @var float|null */
+ private $wallClockOverride;
+
/** Max time expected to pass between delete() and DB commit finishing */
const MAX_COMMIT_DELAY = 3;
/** Max replication+snapshot lag before applying TTL_LAGGED or disallowing set() */
*/
public function __construct( array $params ) {
$this->cache = $params['cache'];
- $this->purgeChannel = isset( $params['channels']['purge'] )
- ? $params['channels']['purge']
- : self::DEFAULT_PURGE_CHANNEL;
- $this->purgeRelayer = isset( $params['relayers']['purge'] )
- ? $params['relayers']['purge']
- : new EventRelayerNull( [] );
- $this->region = isset( $params['region'] ) ? $params['region'] : 'main';
- $this->cluster = isset( $params['cluster'] ) ? $params['cluster'] : 'wan-main';
+ $this->purgeChannel = $params['channels']['purge'] ?? self::DEFAULT_PURGE_CHANNEL;
+ $this->purgeRelayer = $params['relayers']['purge'] ?? new EventRelayerNull( [] );
+ $this->region = $params['region'] ?? 'main';
+ $this->cluster = $params['cluster'] ?? 'wan-main';
$this->mcrouterAware = !empty( $params['mcrouterAware'] );
- $this->setLogger( isset( $params['logger'] ) ? $params['logger'] : new NullLogger() );
- $this->stats = isset( $params['stats'] ) ? $params['stats'] : new NullStatsdDataFactory();
- $this->asyncHandler = isset( $params['asyncHandler'] ) ? $params['asyncHandler'] : null;
+ $this->setLogger( $params['logger'] ?? new NullLogger() );
+ $this->stats = $params['stats'] ?? new NullStatsdDataFactory();
+ $this->asyncHandler = $params['asyncHandler'] ?? null;
}
/**
$curTTLs = [];
$asOfs = [];
$values = $this->getMulti( [ $key ], $curTTLs, $checkKeys, $asOfs );
- $curTTL = isset( $curTTLs[$key] ) ? $curTTLs[$key] : null;
- $asOf = isset( $asOfs[$key] ) ? $asOfs[$key] : null;
+ $curTTL = $curTTLs[$key] ?? null;
+ $asOf = $asOfs[$key] ?? null;
- return isset( $values[$key] ) ? $values[$key] : false;
+ return $values[$key] ?? false;
}
/**
*/
final public function set( $key, $value, $ttl = 0, array $opts = [] ) {
$now = $this->getCurrentTime();
- $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : self::TSE_NONE;
- $staleTTL = isset( $opts['staleTTL'] ) ? $opts['staleTTL'] : self::STALE_TTL_NONE;
+ $lockTSE = $opts['lockTSE'] ?? self::TSE_NONE;
+ $staleTTL = $opts['staleTTL'] ?? self::STALE_TTL_NONE;
$age = isset( $opts['since'] ) ? max( 0, $now - $opts['since'] ) : 0;
- $lag = isset( $opts['lag'] ) ? $opts['lag'] : 0;
+ $lag = $opts['lag'] ?? 0;
// Do not cache potentially uncommitted data as it might get rolled back
if ( !empty( $opts['pending'] ) ) {
* @note Callable type hints are not used to avoid class-autoloading
*/
final public function getWithSetCallback( $key, $ttl, $callback, array $opts = [] ) {
- $pcTTL = isset( $opts['pcTTL'] ) ? $opts['pcTTL'] : self::TTL_UNCACHEABLE;
+ $pcTTL = $opts['pcTTL'] ?? self::TTL_UNCACHEABLE;
// Try the process cache if enabled and the cache callback is not within a cache callback.
// Process cache use in nested callbacks is not lag-safe with regard to HOLDOFF_TTL since
// the in-memory value is further lagged than the shared one since it uses a blind TTL.
if ( $pcTTL >= 0 && $this->callbackDepth == 0 ) {
- $group = isset( $opts['pcGroup'] ) ? $opts['pcGroup'] : self::PC_PRIMARY;
+ $group = $opts['pcGroup'] ?? self::PC_PRIMARY;
$procCache = $this->getProcessCache( $group );
$value = $procCache->get( $key );
} else {
* @note Callable type hints are not used to avoid class-autoloading
*/
protected function doGetWithSetCallback( $key, $ttl, $callback, array $opts, &$asOf = null ) {
- $lowTTL = isset( $opts['lowTTL'] ) ? $opts['lowTTL'] : min( self::LOW_TTL, $ttl );
- $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : self::TSE_NONE;
- $staleTTL = isset( $opts['staleTTL'] ) ? $opts['staleTTL'] : self::STALE_TTL_NONE;
- $graceTTL = isset( $opts['graceTTL'] ) ? $opts['graceTTL'] : self::GRACE_TTL_NONE;
- $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : [];
- $busyValue = isset( $opts['busyValue'] ) ? $opts['busyValue'] : null;
- $popWindow = isset( $opts['hotTTR'] ) ? $opts['hotTTR'] : self::HOT_TTR;
- $ageNew = isset( $opts['ageNew'] ) ? $opts['ageNew'] : self::AGE_NEW;
- $minTime = isset( $opts['minAsOf'] ) ? $opts['minAsOf'] : self::MIN_TIMESTAMP_NONE;
+ $lowTTL = $opts['lowTTL'] ?? min( self::LOW_TTL, $ttl );
+ $lockTSE = $opts['lockTSE'] ?? self::TSE_NONE;
+ $staleTTL = $opts['staleTTL'] ?? self::STALE_TTL_NONE;
+ $graceTTL = $opts['graceTTL'] ?? self::GRACE_TTL_NONE;
+ $checkKeys = $opts['checkKeys'] ?? [];
+ $busyValue = $opts['busyValue'] ?? null;
+ $popWindow = $opts['hotTTR'] ?? self::HOT_TTR;
+ $ageNew = $opts['ageNew'] ?? self::AGE_NEW;
+ $minTime = $opts['minAsOf'] ?? self::MIN_TIMESTAMP_NONE;
$versioned = isset( $opts['version'] );
// Get a collection name to describe this class of key
ArrayIterator $keyedIds, $ttl, callable $callback, array $opts = []
) {
$valueKeys = array_keys( $keyedIds->getArrayCopy() );
- $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : [];
+ $checkKeys = $opts['checkKeys'] ?? [];
// Load required keys into process cache in one go
$this->warmupCache = $this->getRawKeysForWarmup(
) {
$idsByValueKey = $keyedIds->getArrayCopy();
$valueKeys = array_keys( $idsByValueKey );
- $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : [];
+ $checkKeys = $opts['checkKeys'] ?? [];
unset( $opts['lockTSE'] ); // incompatible
unset( $opts['busyValue'] ); // incompatible
return [ false, null ];
}
- $flags = isset( $wrapped[self::FLD_FLAGS] ) ? $wrapped[self::FLD_FLAGS] : 0;
+ $flags = $wrapped[self::FLD_FLAGS] ?? 0;
if ( ( $flags & self::FLG_STALE ) == self::FLG_STALE ) {
// Treat as expired, with the cache time as the expiration
$age = $now - $wrapped[self::FLD_TIME];
protected function determineKeyClass( $key ) {
$parts = explode( ':', $key );
- return isset( $parts[1] ) ? $parts[1] : $parts[0]; // sanity
- }
-
- /**
- * @return float UNIX timestamp
- * @codeCoverageIgnore
- */
- protected function getCurrentTime() {
- return microtime( true );
+ return $parts[1] ?? $parts[0]; // sanity
}
/**
private function getNonProcessCachedKeys( array $keys, array $opts ) {
$keysFound = [];
if ( isset( $opts['pcTTL'] ) && $opts['pcTTL'] > 0 && $this->callbackDepth == 0 ) {
- $pcGroup = isset( $opts['pcGroup'] ) ? $opts['pcGroup'] : self::PC_PRIMARY;
+ $pcGroup = $opts['pcGroup'] ?? self::PC_PRIMARY;
$procCache = $this->getProcessCache( $pcGroup );
foreach ( $keys as $key ) {
if ( $procCache->get( $key ) !== false ) {
return $warmupCache;
}
+
+ /**
+ * @return float UNIX timestamp
+ * @codeCoverageIgnore
+ */
+ protected function getCurrentTime() {
+ return $this->wallClockOverride ?: microtime( true );
+ }
+
+ /**
+ * @param float|null &$time Mock UNIX timestamp for testing
+ * @codeCoverageIgnore
+ */
+ public function setMockTime( &$time ) {
+ $this->wallClockOverride =& $time;
+ $this->cache->setMockTime( $time );
+ }
}
throw new UnexpectedValueException( "No channel specified." );
}
- $this->initialStartWindow = isset( $params['initialStartWindow'] )
- ? $params['initialStartWindow']
- : 3600;
- $this->logger = isset( $params['logger'] )
- ? $params['logger']
- : new NullLogger();
+ $this->initialStartWindow = $params['initialStartWindow'] ?? 3600;
+ $this->logger = $params['logger'] ?? new NullLogger();
}
public function setLogger( LoggerInterface $logger ) {
*/
protected function mergePositions( $curValue, array $shutdownPositions, &$cpIndex = null ) {
/** @var DBMasterPos[] $curPositions */
- $curPositions = isset( $curValue['positions'] ) ? $curValue['positions'] : [];
+ $curPositions = $curValue['positions'] ?? [];
// Use the newest positions for each DB master
foreach ( $shutdownPositions as $db => $pos ) {
if (
}
}
- $cpIndex = isset( $curValue['writeIndex'] ) ? $curValue['writeIndex'] : 0;
+ $cpIndex = $curValue['writeIndex'] ?? 0;
return [
'positions' => $curPositions,
$this->sessionVars = $params['variables'];
- $this->srvCache = isset( $params['srvCache'] )
- ? $params['srvCache']
- : new HashBagOStuff();
+ $this->srvCache = $params['srvCache'] ?? new HashBagOStuff();
$this->profiler = $params['profiler'];
$this->trxProfiler = $params['trxProfiler'];
* @since 1.18
*/
final public static function factory( $dbType, $p = [], $connect = self::NEW_CONNECTED ) {
- $class = self::getClass( $dbType, isset( $p['driver'] ) ? $p['driver'] : null );
+ $class = self::getClass( $dbType, $p['driver'] ?? null );
if ( class_exists( $class ) && is_subclass_of( $class, IDatabase::class ) ) {
// Resolve some defaults for b/c
- $p['host'] = isset( $p['host'] ) ? $p['host'] : false;
- $p['user'] = isset( $p['user'] ) ? $p['user'] : false;
- $p['password'] = isset( $p['password'] ) ? $p['password'] : false;
- $p['dbname'] = isset( $p['dbname'] ) ? $p['dbname'] : false;
- $p['flags'] = isset( $p['flags'] ) ? $p['flags'] : 0;
- $p['variables'] = isset( $p['variables'] ) ? $p['variables'] : [];
- $p['tablePrefix'] = isset( $p['tablePrefix'] ) ? $p['tablePrefix'] : '';
- $p['schema'] = isset( $p['schema'] ) ? $p['schema'] : '';
- $p['cliMode'] = isset( $p['cliMode'] )
- ? $p['cliMode']
- : ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' );
- $p['agent'] = isset( $p['agent'] ) ? $p['agent'] : '';
+ $p['host'] = $p['host'] ?? false;
+ $p['user'] = $p['user'] ?? false;
+ $p['password'] = $p['password'] ?? false;
+ $p['dbname'] = $p['dbname'] ?? false;
+ $p['flags'] = $p['flags'] ?? 0;
+ $p['variables'] = $p['variables'] ?? [];
+ $p['tablePrefix'] = $p['tablePrefix'] ?? '';
+ $p['schema'] = $p['schema'] ?? '';
+ $p['cliMode'] = $p['cliMode'] ?? ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' );
+ $p['agent'] = $p['agent'] ?? '';
if ( !isset( $p['connLogger'] ) ) {
$p['connLogger'] = new NullLogger();
}
if ( !isset( $p['queryLogger'] ) ) {
$p['queryLogger'] = new NullLogger();
}
- $p['profiler'] = isset( $p['profiler'] ) ? $p['profiler'] : null;
+ $p['profiler'] = $p['profiler'] ?? null;
if ( !isset( $p['trxProfiler'] ) ) {
$p['trxProfiler'] = new TransactionProfiler();
}
if ( isset( $options['LIMIT'] ) ) {
$sql = $this->limitResult( $sql, $options['LIMIT'],
- isset( $options['OFFSET'] ) ? $options['OFFSET'] : false );
+ $options['OFFSET'] ?? false );
}
$sql = "$sql $postLimitTail";
if ( !$var ) {
$column = null;
} elseif ( count( $var ) == 1 ) {
- $column = isset( $var[0] ) ? $var[0] : reset( $var );
+ $column = $var[0] ?? reset( $var );
} else {
throw new DBUnexpectedError( $this, __METHOD__ . ': got multiple columns.' );
}
* @return string
*/
protected function indexName( $index ) {
- return isset( $this->indexAliases[$index] )
- ? $this->indexAliases[$index]
- : $index;
+ return $this->indexAliases[$index] ?? $index;
}
public function addQuotes( $s ) {
// $conds. Then union them together (using UNION ALL, because the
// product *should* already be distinct).
$orderBy = $this->makeOrderBy( $options );
- $limit = isset( $options['LIMIT'] ) ? $options['LIMIT'] : null;
- $offset = isset( $options['OFFSET'] ) ? $options['OFFSET'] : false;
+ $limit = $options['LIMIT'] ?? null;
+ $offset = $options['OFFSET'] ?? false;
$all = empty( $options['NOTALL'] ) && !in_array( 'NOTALL', $options );
if ( !$this->unionSupportsOrderAndLimit() ) {
unset( $options['ORDER BY'], $options['LIMIT'], $options['OFFSET'] );
for ( $i = 0; $i < $length; ++$i ) {
$char = $encoded[$i];
if ( $char === '?' ) {
- $nextChar = isset( $encoded[$i + 1] ) ? $encoded[$i + 1] : null;
+ $nextChar = $encoded[$i + 1] ?? null;
if ( $nextChar === 'h' ) {
$decoded .= '-';
++$i;
$this->populateColumnCaches();
}
- return isset( $this->binaryColumnCache[$tableRaw] )
- ? $this->binaryColumnCache[$tableRaw]
- : [];
+ return $this->binaryColumnCache[$tableRaw] ?? [];
}
/**
$this->populateColumnCaches();
}
- return isset( $this->bitColumnCache[$tableRaw] )
- ? $this->bitColumnCache[$tableRaw]
- : [];
+ return $this->bitColumnCache[$tableRaw] ?? [];
}
private function populateColumnCaches() {
* @param array $params
*/
function __construct( array $params ) {
- $this->lagDetectionMethod = isset( $params['lagDetectionMethod'] )
- ? $params['lagDetectionMethod']
- : 'Seconds_Behind_Master';
- $this->lagDetectionOptions = isset( $params['lagDetectionOptions'] )
- ? $params['lagDetectionOptions']
- : [];
+ $this->lagDetectionMethod = $params['lagDetectionMethod'] ?? 'Seconds_Behind_Master';
+ $this->lagDetectionOptions = $params['lagDetectionOptions'] ?? [];
$this->useGTIDs = !empty( $params['useGTIDs' ] );
foreach ( [ 'KeyPath', 'CertPath', 'CAFile', 'CAPath', 'Ciphers' ] as $name ) {
$var = "ssl{$name}";
$this->$var = $params[$var];
}
}
- $this->sqlMode = isset( $params['sqlMode'] ) ? $params['sqlMode'] : '';
+ $this->sqlMode = $params['sqlMode'] ?? '';
$this->utf8Mode = !empty( $params['utf8Mode'] );
$this->insertSelectIsSafe = isset( $params['insertSelectIsSafe'] )
? (bool)$params['insertSelectIsSafe'] : null;
* - keywordTableMap : Map of reserved table names to alternative table names to use
*/
public function __construct( array $params ) {
- $this->port = isset( $params['port'] ) ? $params['port'] : false;
- $this->keywordTableMap = isset( $params['keywordTableMap'] )
- ? $params['keywordTableMap']
- : [];
+ $this->port = $params['port'] ?? false;
+ $this->keywordTableMap = $params['keywordTableMap'] ?? [];
parent::__construct( $params );
}
* @return string Value of $name or remapped name if $name is a reserved keyword
*/
public function remappedTableName( $name ) {
- return isset( $this->keywordTableMap[$name] ) ? $this->keywordTableMap[$name] : $name;
+ return $this->keywordTableMap[$name] ?? $name;
}
/**
}
$e = $this->conn->errorInfo();
- return isset( $e[2] ) ? $e[2] : '';
+ return $e[2] ?? '';
}
/**
$this->is_multiple = $info->multiple_key;
$this->is_key = ( $this->is_pk || $this->is_unique || $this->is_multiple );
$this->type = $info->type;
- $this->binary = isset( $info->binary ) ? $info->binary : false;
- $this->is_numeric = isset( $info->numeric ) ? $info->numeric : false;
- $this->is_blob = isset( $info->blob ) ? $info->blob : false;
- $this->is_unsigned = isset( $info->unsigned ) ? $info->unsigned : false;
- $this->is_zerofill = isset( $info->zerofill ) ? $info->zerofill : false;
+ $this->binary = $info->binary ?? false;
+ $this->is_numeric = $info->numeric ?? false;
+ $this->is_blob = $info->blob ?? false;
+ $this->is_unsigned = $info->unsigned ?? false;
+ $this->is_zerofill = $info->zerofill ?? false;
}
/**
$this->readOnlyReason = $conf['readOnlyReason'];
}
- $this->srvCache = isset( $conf['srvCache'] ) ? $conf['srvCache'] : new EmptyBagOStuff();
- $this->memStash = isset( $conf['memStash'] ) ? $conf['memStash'] : new EmptyBagOStuff();
- $this->wanCache = isset( $conf['wanCache'] )
- ? $conf['wanCache']
- : WANObjectCache::newEmpty();
+ $this->srvCache = $conf['srvCache'] ?? new EmptyBagOStuff();
+ $this->memStash = $conf['memStash'] ?? new EmptyBagOStuff();
+ $this->wanCache = $conf['wanCache'] ?? WANObjectCache::newEmpty();
foreach ( self::$loggerFields as $key ) {
- $this->$key = isset( $conf[$key] ) ? $conf[$key] : new \Psr\Log\NullLogger();
+ $this->$key = $conf[$key] ?? new \Psr\Log\NullLogger();
}
- $this->errorLogger = isset( $conf['errorLogger'] )
- ? $conf['errorLogger']
- : function ( Exception $e ) {
- trigger_error( get_class( $e ) . ': ' . $e->getMessage(), E_USER_WARNING );
- };
- $this->deprecationLogger = isset( $conf['deprecationLogger'] )
- ? $conf['deprecationLogger']
- : function ( $msg ) {
- trigger_error( $msg, E_USER_DEPRECATED );
- };
-
- $this->profiler = isset( $conf['profiler'] ) ? $conf['profiler'] : null;
- $this->trxProfiler = isset( $conf['trxProfiler'] )
- ? $conf['trxProfiler']
- : new TransactionProfiler();
+ $this->errorLogger = $conf['errorLogger'] ?? function ( Exception $e ) {
+ trigger_error( get_class( $e ) . ': ' . $e->getMessage(), E_USER_WARNING );
+ };
+ $this->deprecationLogger = $conf['deprecationLogger'] ?? function ( $msg ) {
+ trigger_error( $msg, E_USER_DEPRECATED );
+ };
+
+ $this->profiler = $conf['profiler'] ?? null;
+ $this->trxProfiler = $conf['trxProfiler'] ?? new TransactionProfiler();
$this->requestInfo = [
- 'IPAddress' => isset( $_SERVER[ 'REMOTE_ADDR' ] ) ? $_SERVER[ 'REMOTE_ADDR' ] : '',
- 'UserAgent' => isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : '',
+ 'IPAddress' => $_SERVER[ 'REMOTE_ADDR' ] ?? '',
+ 'UserAgent' => $_SERVER['HTTP_USER_AGENT'] ?? '',
'ChronologyProtection' => 'true',
// phpcs:ignore MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals -- library can't use $wgRequest
- 'ChronologyPositionIndex' => isset( $_GET['cpPosIndex'] ) ? $_GET['cpPosIndex'] : null
+ 'ChronologyPositionIndex' => $_GET['cpPosIndex'] ?? null
];
- $this->cliMode = isset( $conf['cliMode'] )
- ? $conf['cliMode']
- : ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' );
- $this->hostname = isset( $conf['hostname'] ) ? $conf['hostname'] : gethostname();
- $this->agent = isset( $conf['agent'] ) ? $conf['agent'] : '';
+ $this->cliMode = $conf['cliMode'] ?? ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' );
+ $this->hostname = $conf['hostname'] ?? gethostname();
+ $this->agent = $conf['agent'] ?? '';
$this->ticket = mt_rand();
}
public function __construct( array $conf ) {
parent::__construct( $conf );
- $this->servers = isset( $conf['servers'] ) ? $conf['servers'] : [];
+ $this->servers = $conf['servers'] ?? [];
foreach ( $this->servers as $i => $server ) {
if ( $i == 0 ) {
$this->servers[$i]['master'] = true;
}
}
- $this->externalClusters = isset( $conf['externalClusters'] )
- ? $conf['externalClusters']
- : [];
- $this->loadMonitorClass = isset( $conf['loadMonitorClass'] )
- ? $conf['loadMonitorClass']
- : 'LoadMonitor';
- $this->maxLag = isset( $conf['maxLag'] ) ? $conf['maxLag'] : self::MAX_LAG_DEFAULT;
+ $this->externalClusters = $conf['externalClusters'] ?? [];
+ $this->loadMonitorClass = $conf['loadMonitorClass'] ?? 'LoadMonitor';
+ $this->maxLag = $conf['maxLag'] ?? self::MAX_LAG_DEFAULT;
}
/**
: DatabaseDomain::newUnspecified();
$this->setLocalDomain( $localDomain );
- $this->waitTimeout = isset( $params['waitTimeout'] )
- ? $params['waitTimeout']
- : self::MAX_WAIT_DEFAULT;
+ $this->waitTimeout = $params['waitTimeout'] ?? self::MAX_WAIT_DEFAULT;
$this->readIndex = -1;
$this->conns = [
} else {
$this->wanCache = WANObjectCache::newEmpty();
}
- $this->profiler = isset( $params['profiler'] ) ? $params['profiler'] : null;
+ $this->profiler = $params['profiler'] ?? null;
if ( isset( $params['trxProfiler'] ) ) {
$this->trxProfiler = $params['trxProfiler'];
} else {
$this->trxProfiler = new TransactionProfiler();
}
- $this->errorLogger = isset( $params['errorLogger'] )
- ? $params['errorLogger']
- : function ( Exception $e ) {
- trigger_error( get_class( $e ) . ': ' . $e->getMessage(), E_USER_WARNING );
- };
- $this->deprecationLogger = isset( $params['deprecationLogger'] )
- ? $params['deprecationLogger']
- : function ( $msg ) {
- trigger_error( $msg, E_USER_DEPRECATED );
- };
+ $this->errorLogger = $params['errorLogger'] ?? function ( Exception $e ) {
+ trigger_error( get_class( $e ) . ': ' . $e->getMessage(), E_USER_WARNING );
+ };
+ $this->deprecationLogger = $params['deprecationLogger'] ?? function ( $msg ) {
+ trigger_error( $msg, E_USER_DEPRECATED );
+ };
foreach ( [ 'replLogger', 'connLogger', 'queryLogger', 'perfLogger' ] as $key ) {
- $this->$key = isset( $params[$key] ) ? $params[$key] : new NullLogger();
+ $this->$key = $params[$key] ?? new NullLogger();
}
- $this->host = isset( $params['hostname'] )
- ? $params['hostname']
- : ( gethostname() ?: 'unknown' );
- $this->cliMode = isset( $params['cliMode'] )
- ? $params['cliMode']
- : ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' );
- $this->agent = isset( $params['agent'] ) ? $params['agent'] : '';
+ $this->host = $params['hostname'] ?? ( gethostname() ?: 'unknown' );
+ $this->cliMode = $params['cliMode'] ?? ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' );
+ $this->agent = $params['agent'] ?? '';
if ( isset( $params['chronologyCallback'] ) ) {
$this->chronologyCallback = $params['chronologyCallback'];
foreach ( $lags as $i => $lag ) {
if ( $i != 0 ) {
# How much lag this server nominally is allowed to have
- $maxServerLag = isset( $this->servers[$i]['max lag'] )
- ? $this->servers[$i]['max lag']
- : $this->maxLag; // default
+ $maxServerLag = $this->servers[$i]['max lag'] ?? $this->maxLag; // default
# Constrain that futher by $maxLag argument
$maxServerLag = min( $maxServerLag, $maxLag );
public function getServerAttributes( $i ) {
return Database::attributesFromType(
$this->getServerType( $i ),
- isset( $this->servers[$i]['driver'] ) ? $this->servers[$i]['driver'] : null
+ $this->servers[$i]['driver'] ?? null
);
}
$server['agent'] = $this->agent;
// Use DBO_DEFAULT flags by default for LoadBalancer managed databases. Assume that the
// application calls LoadBalancer::commitMasterChanges() before the PHP script completes.
- $server['flags'] = isset( $server['flags'] ) ? $server['flags'] : IDatabase::DBO_DEFAULT;
+ $server['flags'] = $server['flags'] ?? IDatabase::DBO_DEFAULT;
// Create a live connection object
try {
}
public function getServerType( $i ) {
- return isset( $this->servers[$i]['type'] ) ? $this->servers[$i]['type'] : 'unknown';
+ return $this->servers[$i]['type'] ?? 'unknown';
}
public function getMasterPos() {
public function approveMasterChanges( array $options ) {
$this->assertTransactionRoundStage( self::ROUND_FINALIZED );
- $limit = isset( $options['maxWriteDuration'] ) ? $options['maxWriteDuration'] : 0;
+ $limit = $options['maxWriteDuration'] ?? 0;
$this->trxRoundStage = self::ROUND_ERROR; // "failed" until proven otherwise
$this->forEachOpenMasterConnection( function ( IDatabase $conn ) use ( $limit ) {
'load' => 1,
]
],
- 'trxProfiler' => isset( $params['trxProfiler'] ) ? $params['trxProfiler'] : null,
- 'srvCache' => isset( $params['srvCache'] ) ? $params['srvCache'] : null,
- 'wanCache' => isset( $params['wanCache'] ) ? $params['wanCache'] : null
+ 'trxProfiler' => $params['trxProfiler'] ?? null,
+ 'srvCache' => $params['srvCache'] ?? null,
+ 'wanCache' => $params['wanCache'] ?? null
] );
if ( isset( $params['readOnlyReason'] ) ) {
$this->wanCache = $wCache;
$this->replLogger = new NullLogger();
- $this->movingAveRatio = isset( $options['movingAveRatio'] )
- ? $options['movingAveRatio']
- : 0.1;
- $this->lagWarnThreshold = isset( $options['lagWarnThreshold'] )
- ? $options['lagWarnThreshold']
- : self::LAG_WARN_THRESHOLD;
+ $this->movingAveRatio = $options['movingAveRatio'] ?? 0.1;
+ $this->lagWarnThreshold = $options['lagWarnThreshold'] ?? self::LAG_WARN_THRESHOLD;
}
public function setLogger( LoggerInterface $logger ) {
$close = true; // new connection
}
- $lastWeight = isset( $staleValue['weightScales'][$i] )
- ? $staleValue['weightScales'][$i]
- : 1.0;
+ $lastWeight = $staleValue['weightScales'][$i] ?? 1.0;
$coefficient = $this->getWeightScale( $i, $conn ?: null );
$newWeight = $movAveRatio * $coefficient + ( 1 - $movAveRatio ) * $lastWeight;
) {
parent::__construct( $lb, $srvCache, $wCache, $options );
- $this->warmCacheRatio = isset( $options['warmCacheRatio'] )
- ? $options['warmCacheRatio']
- : 0.0;
+ $this->warmCacheRatio = $options['warmCacheRatio'] ?? 0.0;
}
protected function getWeightScale( $index, IDatabase $conn = null ) {
__CLASS__ . ' requires a Redis client library. ' .
'See https://www.mediawiki.org/wiki/Redis#Setup' );
}
- $this->logger = isset( $options['logger'] )
- ? $options['logger']
- : new \Psr\Log\NullLogger();
+ $this->logger = $options['logger'] ?? new \Psr\Log\NullLogger();
$this->connectTimeout = $options['connectTimeout'];
$this->readTimeout = $options['readTimeout'];
$this->persistent = $options['persistent'];
* @return string The name of the service behind this VRS object.
*/
public function getName() {
- return isset( $this->params['name'] ) ? $this->params['name'] : static::class;
+ return $this->params['name'] ?? static::class;
}
/**
$cmpFunc = function ( $a, $b ) {
$al = substr_count( $a, '/' );
$bl = substr_count( $b, '/' );
- if ( $al === $bl ) {
- return 0; // should not actually happen
- }
- return ( $al < $bl ) ? 1 : -1; // largest prefix first
+ return $bl <=> $al; // largest prefix first
};
$matches = []; // matching prefixes (mount points)
+++ /dev/null
-<?php
-/**
- * Reader for XMP data containing properties relevant to images.
- *
- * 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
- */
-
-use Psr\Log\LoggerAwareInterface;
-use Psr\Log\LoggerInterface;
-use Psr\Log\NullLogger;
-use Wikimedia\ScopedCallback;
-
-/**
- * Class for reading xmp data containing properties relevant to
- * images, and spitting out an array that FormatMetadata accepts.
- *
- * Note, this is not meant to recognize every possible thing you can
- * encode in XMP. It should recognize all the properties we want.
- * For example it doesn't have support for structures with multiple
- * nesting levels, as none of the properties we're supporting use that
- * feature. If it comes across properties it doesn't recognize, it should
- * ignore them.
- *
- * The public methods one would call in this class are
- * - parse( $content )
- * Reads in xmp content.
- * Can potentially be called multiple times with partial data each time.
- * - parseExtended( $content )
- * Reads XMPExtended blocks (jpeg files only).
- * - getResults
- * Outputs a results array.
- *
- * Note XMP kind of looks like rdf. They are not the same thing - XMP is
- * encoded as a specific subset of rdf. This class can read XMP. It cannot
- * read rdf.
- */
-class XMPReader implements LoggerAwareInterface {
- /** @var array XMP item configuration array */
- protected $items;
-
- /** @var array Array to hold the current element (and previous element, and so on) */
- private $curItem = [];
-
- /** @var bool|string The structure name when processing nested structures. */
- private $ancestorStruct = false;
-
- /** @var bool|string Temporary holder for character data that appears in xmp doc. */
- private $charContent = false;
-
- /** @var array Stores the state the xmpreader is in (see MODE_FOO constants) */
- private $mode = [];
-
- /** @var array Array to hold results */
- private $results = [];
-
- /** @var bool If we're doing a seq or bag. */
- private $processingArray = false;
-
- /** @var bool|string Used for lang alts only */
- private $itemLang = false;
-
- /** @var resource A resource handle for the XML parser */
- private $xmlParser;
-
- /** @var bool|string Character set like 'UTF-8' */
- private $charset = false;
-
- /** @var int */
- private $extendedXMPOffset = 0;
-
- /** @var int Flag determining if the XMP is safe to parse **/
- private $parsable = 0;
-
- /** @var string Buffer of XML to parse **/
- private $xmlParsableBuffer = '';
-
- /**
- * These are various mode constants.
- * they are used to figure out what to do
- * with an element when its encountered.
- *
- * For example, MODE_IGNORE is used when processing
- * a property we're not interested in. So if a new
- * element pops up when we're in that mode, we ignore it.
- */
- const MODE_INITIAL = 0;
- const MODE_IGNORE = 1;
- const MODE_LI = 2;
- const MODE_LI_LANG = 3;
- const MODE_QDESC = 4;
-
- // The following MODE constants are also used in the
- // $items array to denote what type of property the item is.
- const MODE_SIMPLE = 10;
- const MODE_STRUCT = 11; // structure (associative array)
- const MODE_SEQ = 12; // ordered list
- const MODE_BAG = 13; // unordered list
- const MODE_LANG = 14;
- const MODE_ALT = 15; // non-language alt. Currently not implemented, and not needed atm.
- const MODE_BAGSTRUCT = 16; // A BAG of Structs.
-
- const NS_RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
- const NS_XML = 'http://www.w3.org/XML/1998/namespace';
-
- // States used while determining if XML is safe to parse
- const PARSABLE_UNKNOWN = 0;
- const PARSABLE_OK = 1;
- const PARSABLE_BUFFERING = 2;
- const PARSABLE_NO = 3;
-
- /**
- * @var LoggerInterface
- */
- private $logger;
-
- /**
- * @var string
- */
- private $filename;
-
- /**
- * Primary job is to initialize the XMLParser
- * @param LoggerInterface|null $logger
- * @param string $filename
- */
- function __construct( LoggerInterface $logger = null, $filename = 'unknown' ) {
- if ( !function_exists( 'xml_parser_create_ns' ) ) {
- // this should already be checked by this point
- throw new RuntimeException( 'XMP support requires XML Parser' );
- }
- if ( $logger ) {
- $this->setLogger( $logger );
- } else {
- $this->setLogger( new NullLogger() );
- }
- $this->filename = $filename;
-
- $this->items = XMPInfo::getItems();
-
- $this->resetXMLParser();
- }
-
- public function setLogger( LoggerInterface $logger ) {
- $this->logger = $logger;
- }
-
- /**
- * free the XML parser.
- *
- * @note It is unclear to me if we really need to do this ourselves
- * or if php garbage collection will automatically free the xmlParser
- * when it is no longer needed.
- */
- private function destroyXMLParser() {
- if ( $this->xmlParser ) {
- xml_parser_free( $this->xmlParser );
- $this->xmlParser = null;
- }
- }
-
- /**
- * Main use is if a single item has multiple xmp documents describing it.
- * For example in jpeg's with extendedXMP
- */
- private function resetXMLParser() {
- $this->destroyXMLParser();
-
- $this->xmlParser = xml_parser_create_ns( 'UTF-8', ' ' );
- xml_parser_set_option( $this->xmlParser, XML_OPTION_CASE_FOLDING, 0 );
- xml_parser_set_option( $this->xmlParser, XML_OPTION_SKIP_WHITE, 1 );
-
- xml_set_element_handler( $this->xmlParser,
- [ $this, 'startElement' ],
- [ $this, 'endElement' ] );
-
- xml_set_character_data_handler( $this->xmlParser, [ $this, 'char' ] );
-
- $this->parsable = self::PARSABLE_UNKNOWN;
- $this->xmlParsableBuffer = '';
- }
-
- /**
- * Check if this instance supports using this class
- * @return bool
- */
- public static function isSupported() {
- return function_exists( 'xml_parser_create_ns' ) && class_exists( 'XMLReader' );
- }
-
- /** Get the result array. Do some post-processing before returning
- * the array, and transform any metadata that is special-cased.
- *
- * @return array Array of results as an array of arrays suitable for
- * FormatMetadata::getFormattedData().
- */
- public function getResults() {
- // xmp-special is for metadata that affects how stuff
- // is extracted. For example xmpNote:HasExtendedXMP.
-
- // It is also used to handle photoshop:AuthorsPosition
- // which is weird and really part of another property,
- // see 2:85 in IPTC. See also pg 21 of IPTC4XMP standard.
- // The location fields also use it.
-
- $data = $this->results;
-
- if ( isset( $data['xmp-special']['AuthorsPosition'] )
- && is_string( $data['xmp-special']['AuthorsPosition'] )
- && isset( $data['xmp-general']['Artist'][0] )
- ) {
- // Note, if there is more than one creator,
- // this only applies to first. This also will
- // only apply to the dc:Creator prop, not the
- // exif:Artist prop.
-
- $data['xmp-general']['Artist'][0] =
- $data['xmp-special']['AuthorsPosition'] . ', '
- . $data['xmp-general']['Artist'][0];
- }
-
- // Go through the LocationShown and LocationCreated
- // changing it to the non-hierarchal form used by
- // the other location fields.
-
- if ( isset( $data['xmp-special']['LocationShown'][0] )
- && is_array( $data['xmp-special']['LocationShown'][0] )
- ) {
- // the is_array is just paranoia. It should always
- // be an array.
- foreach ( $data['xmp-special']['LocationShown'] as $loc ) {
- if ( !is_array( $loc ) ) {
- // To avoid copying over the _type meta-fields.
- continue;
- }
- foreach ( $loc as $field => $val ) {
- $data['xmp-general'][$field . 'Dest'][] = $val;
- }
- }
- }
- if ( isset( $data['xmp-special']['LocationCreated'][0] )
- && is_array( $data['xmp-special']['LocationCreated'][0] )
- ) {
- // the is_array is just paranoia. It should always
- // be an array.
- foreach ( $data['xmp-special']['LocationCreated'] as $loc ) {
- if ( !is_array( $loc ) ) {
- // To avoid copying over the _type meta-fields.
- continue;
- }
- foreach ( $loc as $field => $val ) {
- $data['xmp-general'][$field . 'Created'][] = $val;
- }
- }
- }
-
- // We don't want to return the special values, since they're
- // special and not info to be stored about the file.
- unset( $data['xmp-special'] );
-
- // Convert GPSAltitude to negative if below sea level.
- if ( isset( $data['xmp-exif']['GPSAltitudeRef'] )
- && isset( $data['xmp-exif']['GPSAltitude'] )
- ) {
- // Must convert to a real before multiplying by -1
- // XMPValidate guarantees there will always be a '/' in this value.
- list( $nom, $denom ) = explode( '/', $data['xmp-exif']['GPSAltitude'] );
- $data['xmp-exif']['GPSAltitude'] = $nom / $denom;
-
- if ( $data['xmp-exif']['GPSAltitudeRef'] == '1' ) {
- $data['xmp-exif']['GPSAltitude'] *= -1;
- }
- unset( $data['xmp-exif']['GPSAltitudeRef'] );
- }
-
- return $data;
- }
-
- /**
- * Main function to call to parse XMP. Use getResults to
- * get results.
- *
- * Also catches any errors during processing, writes them to
- * debug log, blanks result array and returns false.
- *
- * @param string $content XMP data
- * @param bool $allOfIt If this is all the data (true) or if its split up (false). Default true
- * @throws RuntimeException
- * @return bool Success.
- */
- public function parse( $content, $allOfIt = true ) {
- if ( !$this->xmlParser ) {
- $this->resetXMLParser();
- }
- try {
-
- // detect encoding by looking for BOM which is supposed to be in processing instruction.
- // see page 12 of http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart3.pdf
- if ( !$this->charset ) {
- $bom = [];
- if ( preg_match( '/\xEF\xBB\xBF|\xFE\xFF|\x00\x00\xFE\xFF|\xFF\xFE\x00\x00|\xFF\xFE/',
- $content, $bom )
- ) {
- switch ( $bom[0] ) {
- case "\xFE\xFF":
- $this->charset = 'UTF-16BE';
- break;
- case "\xFF\xFE":
- $this->charset = 'UTF-16LE';
- break;
- case "\x00\x00\xFE\xFF":
- $this->charset = 'UTF-32BE';
- break;
- case "\xFF\xFE\x00\x00":
- $this->charset = 'UTF-32LE';
- break;
- case "\xEF\xBB\xBF":
- $this->charset = 'UTF-8';
- break;
- default:
- // this should be impossible to get to
- throw new RuntimeException( "Invalid BOM" );
- }
- } else {
- // standard specifically says, if no bom assume utf-8
- $this->charset = 'UTF-8';
- }
- }
- if ( $this->charset !== 'UTF-8' ) {
- // don't convert if already utf-8
- Wikimedia\suppressWarnings();
- $content = iconv( $this->charset, 'UTF-8//IGNORE', $content );
- Wikimedia\restoreWarnings();
- }
-
- // Ensure the XMP block does not have an xml doctype declaration, which
- // could declare entities unsafe to parse with xml_parse (T85848/T71210).
- if ( $this->parsable !== self::PARSABLE_OK ) {
- if ( $this->parsable === self::PARSABLE_NO ) {
- throw new RuntimeException( 'Unsafe doctype declaration in XML.' );
- }
-
- $content = $this->xmlParsableBuffer . $content;
- if ( !$this->checkParseSafety( $content ) ) {
- if ( !$allOfIt && $this->parsable !== self::PARSABLE_NO ) {
- // parse wasn't Unsuccessful yet, so return true
- // in this case.
- return true;
- }
- $msg = ( $this->parsable === self::PARSABLE_NO ) ?
- 'Unsafe doctype declaration in XML.' :
- 'No root element found in XML.';
- throw new RuntimeException( $msg );
- }
- }
-
- $ok = xml_parse( $this->xmlParser, $content, $allOfIt );
- if ( !$ok ) {
- $code = xml_get_error_code( $this->xmlParser );
- $error = xml_error_string( $code );
- $line = xml_get_current_line_number( $this->xmlParser );
- $col = xml_get_current_column_number( $this->xmlParser );
- $offset = xml_get_current_byte_index( $this->xmlParser );
-
- $this->logger->info(
- '{method} : Error reading XMP content: {error} ' .
- '(file: {file}, line: {line} column: {column} ' .
- 'byte offset: {offset})',
- [
- 'method' => __METHOD__,
- 'error_code' => $code,
- 'error' => $error,
- 'file' => $this->filename,
- 'line' => $line,
- 'column' => $col,
- 'offset' => $offset,
- 'content' => $content,
- ] );
- $this->results = []; // blank if error.
- $this->destroyXMLParser();
- return false;
- }
- } catch ( Exception $e ) {
- $this->logger->warning(
- '{method} {exception}',
- [
- 'method' => __METHOD__,
- 'exception' => $e,
- 'file' => $this->filename,
- 'content' => $content,
- ]
- );
- $this->results = [];
- return false;
- }
- if ( $allOfIt ) {
- $this->destroyXMLParser();
- }
-
- return true;
- }
-
- /** Entry point for XMPExtended blocks in jpeg files
- *
- * @todo In serious need of testing
- * @see http://www.adobe.ge/devnet/xmp/pdfs/XMPSpecificationPart3.pdf XMP spec part 3 page 20
- * @param string $content XMPExtended block minus the namespace signature
- * @return bool If it succeeded.
- */
- public function parseExtended( $content ) {
- // @todo FIXME: This is untested. Hard to find example files
- // or programs that make such files..
- $guid = substr( $content, 0, 32 );
- if ( !isset( $this->results['xmp-special']['HasExtendedXMP'] )
- || $this->results['xmp-special']['HasExtendedXMP'] !== $guid
- ) {
- $this->logger->info( __METHOD__ .
- " Ignoring XMPExtended block due to wrong guid (guid= '{guid}')",
- [
- 'guid' => $guid,
- 'file' => $this->filename,
- ]
- );
-
- return false;
- }
- $len = unpack( 'Nlength/Noffset', substr( $content, 32, 8 ) );
-
- if ( !$len ||
- $len['length'] < 4 ||
- $len['offset'] < 0 ||
- $len['offset'] > $len['length']
- ) {
- $this->logger->info(
- __METHOD__ . 'Error reading extended XMP block, invalid length or offset.',
- [ 'file' => $this->filename ]
- );
-
- return false;
- }
-
- // we're not very robust here. we should accept it in the wrong order.
- // To quote the XMP standard:
- // "A JPEG writer should write the ExtendedXMP marker segments in order,
- // immediately following the StandardXMP. However, the JPEG standard
- // does not require preservation of marker segment order. A robust JPEG
- // reader should tolerate the marker segments in any order."
- // On the other hand, the probability that an image will have more than
- // 128k of metadata is rather low... so the probability that it will have
- // > 128k, and be in the wrong order is very low...
-
- if ( $len['offset'] !== $this->extendedXMPOffset ) {
- $this->logger->info( __METHOD__ . 'Ignoring XMPExtended block due to wrong order. (Offset was '
- . $len['offset'] . ' but expected ' . $this->extendedXMPOffset . ')',
- [ 'file' => $this->filename ]
- );
-
- return false;
- }
-
- if ( $len['offset'] === 0 ) {
- // if we're starting the extended block, we've probably already
- // done the XMPStandard block, so reset.
- $this->resetXMLParser();
- }
-
- $this->extendedXMPOffset += $len['length'];
-
- $actualContent = substr( $content, 40 );
-
- if ( $this->extendedXMPOffset === strlen( $actualContent ) ) {
- $atEnd = true;
- } else {
- $atEnd = false;
- }
-
- $this->logger->debug(
- __METHOD__ . 'Parsing a XMPExtended block',
- [ 'file' => $this->filename ]
- );
-
- return $this->parse( $actualContent, $atEnd );
- }
-
- /**
- * Character data handler
- * Called whenever character data is found in the xmp document.
- *
- * does nothing if we're in MODE_IGNORE or if the data is whitespace
- * throws an error if we're not in MODE_SIMPLE (as we're not allowed to have character
- * data in the other modes).
- *
- * As an example, this happens when we encounter XMP like:
- * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
- * and are processing the 0/10 bit.
- *
- * @param resource $parser XMLParser reference to the xml parser
- * @param string $data Character data
- * @throws RuntimeException On invalid data
- */
- function char( $parser, $data ) {
- $data = trim( $data );
- if ( trim( $data ) === "" ) {
- return;
- }
-
- if ( !isset( $this->mode[0] ) ) {
- throw new RuntimeException( 'Unexpected character data before first rdf:Description element' );
- }
-
- if ( $this->mode[0] === self::MODE_IGNORE ) {
- return;
- }
-
- if ( $this->mode[0] !== self::MODE_SIMPLE
- && $this->mode[0] !== self::MODE_QDESC
- ) {
- throw new RuntimeException( 'character data where not expected. (mode ' . $this->mode[0] . ')' );
- }
-
- // to check, how does this handle w.s.
- if ( $this->charContent === false ) {
- $this->charContent = $data;
- } else {
- $this->charContent .= $data;
- }
- }
-
- /**
- * Check if a block of XML is safe to pass to xml_parse, i.e. doesn't
- * contain a doctype declaration which could contain a dos attack if we
- * parse it and expand internal entities (T85848).
- *
- * @param string $content xml string to check for parse safety
- * @return bool true if the xml is safe to parse, false otherwise
- */
- private function checkParseSafety( $content ) {
- $reader = new XMLReader();
- $result = null;
-
- // For XMLReader to parse incomplete/invalid XML, it has to be open()'ed
- // instead of using XML().
- $reader->open(
- 'data://text/plain,' . urlencode( $content ),
- null,
- LIBXML_NOERROR | LIBXML_NOWARNING | LIBXML_NONET
- );
-
- $oldDisable = libxml_disable_entity_loader( true );
- /** @noinspection PhpUnusedLocalVariableInspection */
- $reset = new ScopedCallback(
- 'libxml_disable_entity_loader',
- [ $oldDisable ]
- );
- $reader->setParserProperty( XMLReader::SUBST_ENTITIES, false );
-
- // Even with LIBXML_NOWARNING set, XMLReader::read gives a warning
- // when parsing truncated XML, which causes unit tests to fail.
- Wikimedia\suppressWarnings();
- while ( $reader->read() ) {
- if ( $reader->nodeType === XMLReader::ELEMENT ) {
- // Reached the first element without hitting a doctype declaration
- $this->parsable = self::PARSABLE_OK;
- $result = true;
- break;
- }
- if ( $reader->nodeType === XMLReader::DOC_TYPE ) {
- $this->parsable = self::PARSABLE_NO;
- $result = false;
- break;
- }
- }
- Wikimedia\restoreWarnings();
-
- if ( !is_null( $result ) ) {
- return $result;
- }
-
- // Reached the end of the parsable xml without finding an element
- // or doctype. Buffer and try again.
- $this->parsable = self::PARSABLE_BUFFERING;
- $this->xmlParsableBuffer = $content;
- return false;
- }
-
- /** When we hit a closing element in MODE_IGNORE
- * Check to see if this is the element we started to ignore,
- * in which case we get out of MODE_IGNORE
- *
- * @param string $elm Namespace of element followed by a space and then tag name of element.
- */
- private function endElementModeIgnore( $elm ) {
- if ( $this->curItem[0] === $elm ) {
- array_shift( $this->curItem );
- array_shift( $this->mode );
- }
- }
-
- /**
- * Hit a closing element when in MODE_SIMPLE.
- * This generally means that we finished processing a
- * property value, and now have to save the result to the
- * results array
- *
- * For example, when processing:
- * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
- * this deals with when we hit </exif:DigitalZoomRatio>.
- *
- * Or it could be if we hit the end element of a property
- * of a compound data structure (like a member of an array).
- *
- * @param string $elm Namespace, space, and tag name.
- */
- private function endElementModeSimple( $elm ) {
- if ( $this->charContent !== false ) {
- if ( $this->processingArray ) {
- // if we're processing an array, use the original element
- // name instead of rdf:li.
- list( $ns, $tag ) = explode( ' ', $this->curItem[0], 2 );
- } else {
- list( $ns, $tag ) = explode( ' ', $elm, 2 );
- }
- $this->saveValue( $ns, $tag, $this->charContent );
-
- $this->charContent = false; // reset
- }
- array_shift( $this->curItem );
- array_shift( $this->mode );
- }
-
- /**
- * Hit a closing element in MODE_STRUCT, MODE_SEQ, MODE_BAG
- * generally means we've finished processing a nested structure.
- * resets some internal variables to indicate that.
- *
- * Note this means we hit the closing element not the "</rdf:Seq>".
- *
- * @par For example, when processing:
- * @code{,xml}
- * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
- * </rdf:Seq> </exif:ISOSpeedRatings>
- * @endcode
- *
- * This method is called when we hit the "</exif:ISOSpeedRatings>" tag.
- *
- * @param string $elm Namespace . space . tag name.
- * @throws RuntimeException
- */
- private function endElementNested( $elm ) {
- /* cur item must be the same as $elm, unless if in MODE_STRUCT
- * in which case it could also be rdf:Description */
- if ( $this->curItem[0] !== $elm
- && !( $elm === self::NS_RDF . ' Description'
- && $this->mode[0] === self::MODE_STRUCT )
- ) {
- throw new RuntimeException( "nesting mismatch. got a </$elm> but expected a </" .
- $this->curItem[0] . '>' );
- }
-
- // Validate structures.
- list( $ns, $tag ) = explode( ' ', $elm, 2 );
- if ( isset( $this->items[$ns][$tag]['validate'] ) ) {
- $info =& $this->items[$ns][$tag];
- $finalName = isset( $info['map_name'] )
- ? $info['map_name'] : $tag;
-
- if ( is_array( $info['validate'] ) ) {
- $validate = $info['validate'];
- } else {
- $validator = new XMPValidate( $this->logger );
- $validate = [ $validator, $info['validate'] ];
- }
-
- if ( !isset( $this->results['xmp-' . $info['map_group']][$finalName] ) ) {
- // This can happen if all the members of the struct failed validation.
- $this->logger->debug(
- __METHOD__ . " <$ns:$tag> has no valid members.",
- [ 'file' => $this->filename ]
- );
- } elseif ( is_callable( $validate ) ) {
- $val =& $this->results['xmp-' . $info['map_group']][$finalName];
- call_user_func_array( $validate, [ $info, &$val, false ] );
- if ( is_null( $val ) ) {
- // the idea being the validation function will unset the variable if
- // its invalid.
- $this->logger->info(
- __METHOD__ . " <$ns:$tag> failed validation.",
- [ 'file' => $this->filename ]
- );
- unset( $this->results['xmp-' . $info['map_group']][$finalName] );
- }
- } else {
- $this->logger->warning(
- __METHOD__ . " Validation function for $finalName (" .
- $validate[0] . '::' . $validate[1] . '()) is not callable.',
- [ 'file' => $this->filename ]
- );
- }
- }
-
- array_shift( $this->curItem );
- array_shift( $this->mode );
- $this->ancestorStruct = false;
- $this->processingArray = false;
- $this->itemLang = false;
- }
-
- /**
- * Hit a closing element in MODE_LI (either rdf:Seq, or rdf:Bag )
- * Add information about what type of element this is.
- *
- * Note we still have to hit the outer "</property>"
- *
- * @par For example, when processing:
- * @code{,xml}
- * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
- * </rdf:Seq> </exif:ISOSpeedRatings>
- * @endcode
- *
- * This method is called when we hit the "</rdf:Seq>".
- * (For comparison, we call endElementModeSimple when we
- * hit the "</rdf:li>")
- *
- * @param string $elm Namespace . ' ' . element name
- * @throws RuntimeException
- */
- private function endElementModeLi( $elm ) {
- list( $ns, $tag ) = explode( ' ', $this->curItem[0], 2 );
- $info = $this->items[$ns][$tag];
- $finalName = isset( $info['map_name'] )
- ? $info['map_name'] : $tag;
-
- array_shift( $this->mode );
-
- if ( !isset( $this->results['xmp-' . $info['map_group']][$finalName] ) ) {
- $this->logger->debug(
- __METHOD__ . " Empty compund element $finalName.",
- [ 'file' => $this->filename ]
- );
-
- return;
- }
-
- if ( $elm === self::NS_RDF . ' Seq' ) {
- $this->results['xmp-' . $info['map_group']][$finalName]['_type'] = 'ol';
- } elseif ( $elm === self::NS_RDF . ' Bag' ) {
- $this->results['xmp-' . $info['map_group']][$finalName]['_type'] = 'ul';
- } elseif ( $elm === self::NS_RDF . ' Alt' ) {
- // extra if needed as you could theoretically have a non-language alt.
- if ( $info['mode'] === self::MODE_LANG ) {
- $this->results['xmp-' . $info['map_group']][$finalName]['_type'] = 'lang';
- }
- } else {
- throw new RuntimeException(
- __METHOD__ . " expected </rdf:seq> or </rdf:bag> but instead got $elm."
- );
- }
- }
-
- /**
- * End element while in MODE_QDESC
- * mostly when ending an element when we have a simple value
- * that has qualifiers.
- *
- * Qualifiers aren't all that common, and we don't do anything
- * with them.
- *
- * @param string $elm Namespace and element
- */
- private function endElementModeQDesc( $elm ) {
- if ( $elm === self::NS_RDF . ' value' ) {
- list( $ns, $tag ) = explode( ' ', $this->curItem[0], 2 );
- $this->saveValue( $ns, $tag, $this->charContent );
-
- return;
- } else {
- array_shift( $this->mode );
- array_shift( $this->curItem );
- }
- }
-
- /**
- * Handler for hitting a closing element.
- *
- * generally just calls a helper function depending on what
- * mode we're in.
- *
- * Ignores the outer wrapping elements that are optional in
- * xmp and have no meaning.
- *
- * @param resource $parser
- * @param string $elm Namespace . ' ' . element name
- * @throws RuntimeException
- */
- function endElement( $parser, $elm ) {
- if ( $elm === ( self::NS_RDF . ' RDF' )
- || $elm === 'adobe:ns:meta/ xmpmeta'
- || $elm === 'adobe:ns:meta/ xapmeta'
- ) {
- // ignore these.
- return;
- }
-
- if ( $elm === self::NS_RDF . ' type' ) {
- // these aren't really supported properly yet.
- // However, it appears they almost never used.
- $this->logger->info(
- __METHOD__ . ' encountered <rdf:type>',
- [ 'file' => $this->filename ]
- );
- }
-
- if ( strpos( $elm, ' ' ) === false ) {
- // This probably shouldn't happen.
- // However, there is a bug in an adobe product
- // that forgets the namespace on some things.
- // (Luckily they are unimportant things).
- $this->logger->info(
- __METHOD__ . " Encountered </$elm> which has no namespace. Skipping.",
- [ 'file' => $this->filename ]
- );
-
- return;
- }
-
- if ( count( $this->mode ) === 0 ) {
- // This should never ever happen and means
- // there is a pretty major bug in this class.
- throw new RuntimeException( 'Encountered end element with no mode' );
- }
-
- if ( count( $this->curItem ) == 0 && $this->mode[0] !== self::MODE_INITIAL ) {
- // just to be paranoid. Should always have a curItem, except for initially
- // (aka during MODE_INITAL).
- throw new RuntimeException( "Hit end element </$elm> but no curItem" );
- }
-
- switch ( $this->mode[0] ) {
- case self::MODE_IGNORE:
- $this->endElementModeIgnore( $elm );
- break;
- case self::MODE_SIMPLE:
- $this->endElementModeSimple( $elm );
- break;
- case self::MODE_STRUCT:
- case self::MODE_SEQ:
- case self::MODE_BAG:
- case self::MODE_LANG:
- case self::MODE_BAGSTRUCT:
- $this->endElementNested( $elm );
- break;
- case self::MODE_INITIAL:
- if ( $elm === self::NS_RDF . ' Description' ) {
- array_shift( $this->mode );
- } else {
- throw new RuntimeException( 'Element ended unexpectedly while in MODE_INITIAL' );
- }
- break;
- case self::MODE_LI:
- case self::MODE_LI_LANG:
- $this->endElementModeLi( $elm );
- break;
- case self::MODE_QDESC:
- $this->endElementModeQDesc( $elm );
- break;
- default:
- $this->logger->info(
- __METHOD__ . " no mode (elm = $elm)",
- [ 'file' => $this->filename ]
- );
- break;
- }
- }
-
- /**
- * Hit an opening element while in MODE_IGNORE
- *
- * XMP is extensible, so ignore any tag we don't understand.
- *
- * Mostly ignores, unless we encounter the element that we are ignoring.
- * in which case we add it to the item stack, so we can ignore things
- * that are nested, correctly.
- *
- * @param string $elm Namespace . ' ' . tag name
- */
- private function startElementModeIgnore( $elm ) {
- if ( $elm === $this->curItem[0] ) {
- array_unshift( $this->curItem, $elm );
- array_unshift( $this->mode, self::MODE_IGNORE );
- }
- }
-
- /**
- * Start element in MODE_BAG (unordered array)
- * this should always be <rdf:Bag>
- *
- * @param string $elm Namespace . ' ' . tag
- * @throws RuntimeException If we have an element that's not <rdf:Bag>
- */
- private function startElementModeBag( $elm ) {
- if ( $elm === self::NS_RDF . ' Bag' ) {
- array_unshift( $this->mode, self::MODE_LI );
- } else {
- throw new RuntimeException( "Expected <rdf:Bag> but got $elm." );
- }
- }
-
- /**
- * Start element in MODE_SEQ (ordered array)
- * this should always be <rdf:Seq>
- *
- * @param string $elm Namespace . ' ' . tag
- * @throws RuntimeException If we have an element that's not <rdf:Seq>
- */
- private function startElementModeSeq( $elm ) {
- if ( $elm === self::NS_RDF . ' Seq' ) {
- array_unshift( $this->mode, self::MODE_LI );
- } elseif ( $elm === self::NS_RDF . ' Bag' ) {
- # T29105
- $this->logger->info(
- __METHOD__ . ' Expected an rdf:Seq, but got an rdf:Bag. Pretending' .
- ' it is a Seq, since some buggy software is known to screw this up.',
- [ 'file' => $this->filename ]
- );
- array_unshift( $this->mode, self::MODE_LI );
- } else {
- throw new RuntimeException( "Expected <rdf:Seq> but got $elm." );
- }
- }
-
- /**
- * Start element in MODE_LANG (language alternative)
- * this should always be <rdf:Alt>
- *
- * This tag tends to be used for metadata like describe this
- * picture, which can be translated into multiple languages.
- *
- * XMP supports non-linguistic alternative selections,
- * which are really only used for thumbnails, which
- * we don't care about.
- *
- * @param string $elm Namespace . ' ' . tag
- * @throws RuntimeException If we have an element that's not <rdf:Alt>
- */
- private function startElementModeLang( $elm ) {
- if ( $elm === self::NS_RDF . ' Alt' ) {
- array_unshift( $this->mode, self::MODE_LI_LANG );
- } else {
- throw new RuntimeException( "Expected <rdf:Seq> but got $elm." );
- }
- }
-
- /**
- * Handle an opening element when in MODE_SIMPLE
- *
- * This should not happen often. This is for if a simple element
- * already opened has a child element. Could happen for a
- * qualified element.
- *
- * For example:
- * <exif:DigitalZoomRatio><rdf:Description><rdf:value>0/10</rdf:value>
- * <foo:someQualifier>Bar</foo:someQualifier> </rdf:Description>
- * </exif:DigitalZoomRatio>
- *
- * This method is called when processing the <rdf:Description> element
- *
- * @param string $elm Namespace and tag names separated by space.
- * @param array $attribs Attributes of the element.
- * @throws RuntimeException
- */
- private function startElementModeSimple( $elm, $attribs ) {
- if ( $elm === self::NS_RDF . ' Description' ) {
- // If this value has qualifiers
- array_unshift( $this->mode, self::MODE_QDESC );
- array_unshift( $this->curItem, $this->curItem[0] );
-
- if ( isset( $attribs[self::NS_RDF . ' value'] ) ) {
- list( $ns, $tag ) = explode( ' ', $this->curItem[0], 2 );
- $this->saveValue( $ns, $tag, $attribs[self::NS_RDF . ' value'] );
- }
- } elseif ( $elm === self::NS_RDF . ' value' ) {
- // This should not be here.
- throw new RuntimeException( __METHOD__ . ' Encountered <rdf:value> where it was unexpected.' );
- } else {
- // something else we don't recognize, like a qualifier maybe.
- $this->logger->info( __METHOD__ .
- " Encountered element <{element}> where only expecting character data as value of {curitem}",
- [
- 'element' => $elm,
- 'curitem' => $this->curItem[0],
- 'file' => $this->filename,
- ]
- );
- array_unshift( $this->mode, self::MODE_IGNORE );
- array_unshift( $this->curItem, $elm );
- }
- }
-
- /**
- * Start an element when in MODE_QDESC.
- * This generally happens when a simple element has an inner
- * rdf:Description to hold qualifier elements.
- *
- * For example in:
- * <exif:DigitalZoomRatio><rdf:Description><rdf:value>0/10</rdf:value>
- * <foo:someQualifier>Bar</foo:someQualifier> </rdf:Description>
- * </exif:DigitalZoomRatio>
- * Called when processing the <rdf:value> or <foo:someQualifier>.
- *
- * @param string $elm Namespace and tag name separated by a space.
- */
- private function startElementModeQDesc( $elm ) {
- if ( $elm === self::NS_RDF . ' value' ) {
- return; // do nothing
- } else {
- // otherwise its a qualifier, which we ignore
- array_unshift( $this->mode, self::MODE_IGNORE );
- array_unshift( $this->curItem, $elm );
- }
- }
-
- /**
- * Starting an element when in MODE_INITIAL
- * This usually happens when we hit an element inside
- * the outer rdf:Description
- *
- * This is generally where most properties start.
- *
- * @param string $ns Namespace
- * @param string $tag Tag name (without namespace prefix)
- * @param array $attribs Array of attributes
- * @throws RuntimeException
- */
- private function startElementModeInitial( $ns, $tag, $attribs ) {
- if ( $ns !== self::NS_RDF ) {
- if ( isset( $this->items[$ns][$tag] ) ) {
- if ( isset( $this->items[$ns][$tag]['structPart'] ) ) {
- // If this element is supposed to appear only as
- // a child of a structure, but appears here (not as
- // a child of a struct), then something weird is
- // happening, so ignore this element and its children.
-
- $this->logger->info(
- 'Encountered <{element}> outside of its expected parent. Ignoring.',
- [ 'element' => "$ns:$tag", 'file' => $this->filename ]
- );
-
- array_unshift( $this->mode, self::MODE_IGNORE );
- array_unshift( $this->curItem, $ns . ' ' . $tag );
-
- return;
- }
- $mode = $this->items[$ns][$tag]['mode'];
- array_unshift( $this->mode, $mode );
- array_unshift( $this->curItem, $ns . ' ' . $tag );
- if ( $mode === self::MODE_STRUCT ) {
- $this->ancestorStruct = isset( $this->items[$ns][$tag]['map_name'] )
- ? $this->items[$ns][$tag]['map_name'] : $tag;
- }
- if ( $this->charContent !== false ) {
- // Something weird.
- // Should not happen in valid XMP.
- throw new RuntimeException( 'tag nested in non-whitespace characters.' );
- }
- } else {
- // This element is not on our list of allowed elements so ignore.
- $this->logger->debug( __METHOD__ . ' Ignoring unrecognized element <{element}>.',
- [ 'element' => "$ns:$tag", 'file' => $this->filename ] );
- array_unshift( $this->mode, self::MODE_IGNORE );
- array_unshift( $this->curItem, $ns . ' ' . $tag );
-
- return;
- }
- }
- // process attributes
- $this->doAttribs( $attribs );
- }
-
- /**
- * Hit an opening element when in a Struct (MODE_STRUCT)
- * This is generally for fields of a compound property.
- *
- * Example of a struct (abbreviated; flash has more properties):
- *
- * <exif:Flash> <rdf:Description> <exif:Fired>True</exif:Fired>
- * <exif:Mode>1</exif:Mode></rdf:Description></exif:Flash>
- *
- * or:
- *
- * <exif:Flash rdf:parseType='Resource'> <exif:Fired>True</exif:Fired>
- * <exif:Mode>1</exif:Mode></exif:Flash>
- *
- * @param string $ns Namespace
- * @param string $tag Tag name (no ns)
- * @param array $attribs Array of attribs w/ values.
- * @throws RuntimeException
- */
- private function startElementModeStruct( $ns, $tag, $attribs ) {
- if ( $ns !== self::NS_RDF ) {
- if ( isset( $this->items[$ns][$tag] ) ) {
- if ( isset( $this->items[$ns][$this->ancestorStruct]['children'] )
- && !isset( $this->items[$ns][$this->ancestorStruct]['children'][$tag] )
- ) {
- // This assumes that we don't have inter-namespace nesting
- // which we don't in all the properties we're interested in.
- throw new RuntimeException( " <$tag> appeared nested in <" . $this->ancestorStruct
- . "> where it is not allowed." );
- }
- array_unshift( $this->mode, $this->items[$ns][$tag]['mode'] );
- array_unshift( $this->curItem, $ns . ' ' . $tag );
- if ( $this->charContent !== false ) {
- // Something weird.
- // Should not happen in valid XMP.
- throw new RuntimeException( "tag <$tag> nested in non-whitespace characters (" .
- $this->charContent . ")." );
- }
- } else {
- array_unshift( $this->mode, self::MODE_IGNORE );
- array_unshift( $this->curItem, $ns . ' ' . $tag );
-
- return;
- }
- }
-
- if ( $ns === self::NS_RDF && $tag === 'Description' ) {
- $this->doAttribs( $attribs );
- array_unshift( $this->mode, self::MODE_STRUCT );
- array_unshift( $this->curItem, $this->curItem[0] );
- }
- }
-
- /**
- * opening element in MODE_LI
- * process elements of arrays.
- *
- * Example:
- * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
- * </rdf:Seq> </exif:ISOSpeedRatings>
- * This method is called when we hit the <rdf:li> element.
- *
- * @param string $elm Namespace . ' ' . tagname
- * @param array $attribs Attributes. (needed for BAGSTRUCTS)
- * @throws RuntimeException If gets a tag other than <rdf:li>
- */
- private function startElementModeLi( $elm, $attribs ) {
- if ( ( $elm ) !== self::NS_RDF . ' li' ) {
- throw new RuntimeException( "<rdf:li> expected but got $elm." );
- }
-
- if ( !isset( $this->mode[1] ) ) {
- // This should never ever ever happen. Checking for it
- // to be paranoid.
- throw new RuntimeException( 'In mode Li, but no 2xPrevious mode!' );
- }
-
- if ( $this->mode[1] === self::MODE_BAGSTRUCT ) {
- // This list item contains a compound (STRUCT) value.
- array_unshift( $this->mode, self::MODE_STRUCT );
- array_unshift( $this->curItem, $elm );
- $this->processingArray = true;
-
- if ( !isset( $this->curItem[1] ) ) {
- // be paranoid.
- throw new RuntimeException( 'Can not find parent of BAGSTRUCT.' );
- }
- list( $curNS, $curTag ) = explode( ' ', $this->curItem[1] );
- $this->ancestorStruct = isset( $this->items[$curNS][$curTag]['map_name'] )
- ? $this->items[$curNS][$curTag]['map_name'] : $curTag;
-
- $this->doAttribs( $attribs );
- } else {
- // Normal BAG or SEQ containing simple values.
- array_unshift( $this->mode, self::MODE_SIMPLE );
- // need to add curItem[0] on again since one is for the specific item
- // and one is for the entire group.
- array_unshift( $this->curItem, $this->curItem[0] );
- $this->processingArray = true;
- }
- }
-
- /**
- * Opening element in MODE_LI_LANG.
- * process elements of language alternatives
- *
- * Example:
- * <dc:title> <rdf:Alt> <rdf:li xml:lang="x-default">My house
- * </rdf:li> </rdf:Alt> </dc:title>
- *
- * This method is called when we hit the <rdf:li> element.
- *
- * @param string $elm Namespace . ' ' . tag
- * @param array $attribs Array of elements (most importantly xml:lang)
- * @throws RuntimeException If gets a tag other than <rdf:li> or if no xml:lang
- */
- private function startElementModeLiLang( $elm, $attribs ) {
- if ( $elm !== self::NS_RDF . ' li' ) {
- throw new RuntimeException( __METHOD__ . " <rdf:li> expected but got $elm." );
- }
- if ( !isset( $attribs[self::NS_XML . ' lang'] )
- || !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $attribs[self::NS_XML . ' lang'] )
- ) {
- throw new RuntimeException( __METHOD__
- . " <rdf:li> did not contain, or has invalid xml:lang attribute in lang alternative" );
- }
-
- // Lang is case-insensitive.
- $this->itemLang = strtolower( $attribs[self::NS_XML . ' lang'] );
-
- // need to add curItem[0] on again since one is for the specific item
- // and one is for the entire group.
- array_unshift( $this->curItem, $this->curItem[0] );
- array_unshift( $this->mode, self::MODE_SIMPLE );
- $this->processingArray = true;
- }
-
- /**
- * Hits an opening element.
- * Generally just calls a helper based on what MODE we're in.
- * Also does some initial set up for the wrapper element
- *
- * @param resource $parser
- * @param string $elm Namespace "<space>" element
- * @param array $attribs Attribute name => value
- * @throws RuntimeException
- */
- function startElement( $parser, $elm, $attribs ) {
- if ( $elm === self::NS_RDF . ' RDF'
- || $elm === 'adobe:ns:meta/ xmpmeta'
- || $elm === 'adobe:ns:meta/ xapmeta'
- ) {
- /* ignore. */
- return;
- } elseif ( $elm === self::NS_RDF . ' Description' ) {
- if ( count( $this->mode ) === 0 ) {
- // outer rdf:desc
- array_unshift( $this->mode, self::MODE_INITIAL );
- }
- } elseif ( $elm === self::NS_RDF . ' type' ) {
- // This doesn't support rdf:type properly.
- // In practise I have yet to see a file that
- // uses this element, however it is mentioned
- // on page 25 of part 1 of the xmp standard.
- // Also it seems as if exiv2 and exiftool do not support
- // this either (That or I misunderstand the standard)
- $this->logger->info(
- __METHOD__ . ' Encountered <rdf:type> which isn\'t currently supported',
- [ 'file' => $this->filename ]
- );
- }
-
- if ( strpos( $elm, ' ' ) === false ) {
- // This probably shouldn't happen.
- $this->logger->info(
- __METHOD__ . " Encountered <$elm> which has no namespace. Skipping.",
- [ 'file' => $this->filename ]
- );
-
- return;
- }
-
- list( $ns, $tag ) = explode( ' ', $elm, 2 );
-
- if ( count( $this->mode ) === 0 ) {
- // This should not happen.
- throw new RuntimeException( 'Error extracting XMP, '
- . "encountered <$elm> with no mode" );
- }
-
- switch ( $this->mode[0] ) {
- case self::MODE_IGNORE:
- $this->startElementModeIgnore( $elm );
- break;
- case self::MODE_SIMPLE:
- $this->startElementModeSimple( $elm, $attribs );
- break;
- case self::MODE_INITIAL:
- $this->startElementModeInitial( $ns, $tag, $attribs );
- break;
- case self::MODE_STRUCT:
- $this->startElementModeStruct( $ns, $tag, $attribs );
- break;
- case self::MODE_BAG:
- case self::MODE_BAGSTRUCT:
- $this->startElementModeBag( $elm );
- break;
- case self::MODE_SEQ:
- $this->startElementModeSeq( $elm );
- break;
- case self::MODE_LANG:
- $this->startElementModeLang( $elm );
- break;
- case self::MODE_LI_LANG:
- $this->startElementModeLiLang( $elm, $attribs );
- break;
- case self::MODE_LI:
- $this->startElementModeLi( $elm, $attribs );
- break;
- case self::MODE_QDESC:
- $this->startElementModeQDesc( $elm );
- break;
- default:
- throw new RuntimeException( 'StartElement in unknown mode: ' . $this->mode[0] );
- }
- }
-
- // phpcs:disable Generic.Files.LineLength
- /**
- * Process attributes.
- * Simple values can be stored as either a tag or attribute
- *
- * Often the initial "<rdf:Description>" tag just has all the simple
- * properties as attributes.
- *
- * @par Example:
- * @code
- * <rdf:Description rdf:about="" xmlns:exif="http://ns.adobe.com/exif/1.0/" exif:DigitalZoomRatio="0/10">
- * @endcode
- *
- * @param array $attribs Array attribute=>value
- * @throws RuntimeException
- */
- // phpcs:enable
- private function doAttribs( $attribs ) {
- // first check for rdf:parseType attribute, as that can change
- // how the attributes are interperted.
-
- if ( isset( $attribs[self::NS_RDF . ' parseType'] )
- && $attribs[self::NS_RDF . ' parseType'] === 'Resource'
- && $this->mode[0] === self::MODE_SIMPLE
- ) {
- // this is equivalent to having an inner rdf:Description
- $this->mode[0] = self::MODE_QDESC;
- }
- foreach ( $attribs as $name => $val ) {
- if ( strpos( $name, ' ' ) === false ) {
- // This shouldn't happen, but so far some old software forgets namespace
- // on rdf:about.
- $this->logger->info(
- __METHOD__ . ' Encountered non-namespaced attribute: ' .
- " $name=\"$val\". Skipping. ",
- [ 'file' => $this->filename ]
- );
- continue;
- }
- list( $ns, $tag ) = explode( ' ', $name, 2 );
- if ( $ns === self::NS_RDF ) {
- if ( $tag === 'value' || $tag === 'resource' ) {
- // resource is for url.
- // value attribute is a weird way of just putting the contents.
- $this->char( $this->xmlParser, $val );
- }
- } elseif ( isset( $this->items[$ns][$tag] ) ) {
- if ( $this->mode[0] === self::MODE_SIMPLE ) {
- throw new RuntimeException( __METHOD__
- . " $ns:$tag found as attribute where not allowed" );
- }
- $this->saveValue( $ns, $tag, $val );
- } else {
- $this->logger->debug(
- __METHOD__ . " Ignoring unrecognized element <$ns:$tag>.",
- [ 'file' => $this->filename ]
- );
- }
- }
- }
-
- /**
- * Given an extracted value, save it to results array
- *
- * note also uses $this->ancestorStruct and
- * $this->processingArray to determine what name to
- * save the value under. (in addition to $tag).
- *
- * @param string $ns Namespace of tag this is for
- * @param string $tag Tag name
- * @param string $val Value to save
- */
- private function saveValue( $ns, $tag, $val ) {
- $info =& $this->items[$ns][$tag];
- $finalName = isset( $info['map_name'] )
- ? $info['map_name'] : $tag;
- if ( isset( $info['validate'] ) ) {
- if ( is_array( $info['validate'] ) ) {
- $validate = $info['validate'];
- } else {
- $validator = new XMPValidate( $this->logger );
- $validate = [ $validator, $info['validate'] ];
- }
-
- if ( is_callable( $validate ) ) {
- call_user_func_array( $validate, [ $info, &$val, true ] );
- // the reasoning behind using &$val instead of using the return value
- // is to be consistent between here and validating structures.
- if ( is_null( $val ) ) {
- $this->logger->info(
- __METHOD__ . " <$ns:$tag> failed validation.",
- [ 'file' => $this->filename ]
- );
-
- return;
- }
- } else {
- $this->logger->warning(
- __METHOD__ . " Validation function for $finalName (" .
- $validate[0] . '::' . $validate[1] . '()) is not callable.',
- [ 'file' => $this->filename ]
- );
- }
- }
-
- if ( $this->ancestorStruct && $this->processingArray ) {
- // Aka both an array and a struct. ( self::MODE_BAGSTRUCT )
- $this->results['xmp-' . $info['map_group']][$this->ancestorStruct][][$finalName] = $val;
- } elseif ( $this->ancestorStruct ) {
- $this->results['xmp-' . $info['map_group']][$this->ancestorStruct][$finalName] = $val;
- } elseif ( $this->processingArray ) {
- if ( $this->itemLang === false ) {
- // normal array
- $this->results['xmp-' . $info['map_group']][$finalName][] = $val;
- } else {
- // lang array.
- $this->results['xmp-' . $info['map_group']][$finalName][$this->itemLang] = $val;
- }
- } else {
- $this->results['xmp-' . $info['map_group']][$finalName] = $val;
- }
- }
-}
+++ /dev/null
-<?php
-/**
- * Definitions for XMPReader class.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Media
- */
-
-/**
- * This class is just a container for a big array
- * used by XMPReader to determine which XMP items to
- * extract.
- */
-class XMPInfo {
- /** Get the items array
- * @return array XMP item configuration array.
- */
- public static function getItems() {
- return self::$items;
- }
-
- /**
- * XMPInfo::$items keeps a list of all the items
- * we are interested to extract, as well as
- * information about the item like what type
- * it is.
- *
- * Format is an array of namespaces,
- * each containing an array of tags
- * each tag is an array of information about the
- * tag, including:
- * * map_group - What group (used for precedence during conflicts).
- * * mode - What type of item (self::MODE_SIMPLE usually, see above for
- * all values).
- * * validate - Method to validate input. Could also post-process the
- * input. A string value is assumed to be a method of
- * XMPValidate. Can also take a array( 'className', 'methodName' ).
- * * choices - Array of potential values (format of 'value' => true ).
- * Only used with validateClosed.
- * * rangeLow and rangeHigh - Alternative to choices for numeric ranges.
- * Again for validateClosed only.
- * * children - For MODE_STRUCT items, allowed children.
- * * structPart - Indicates that this element can only appear as a member
- * of a structure.
- *
- * Currently this just has a bunch of EXIF values as this class is only half-done.
- */
- static private $items = [
- 'http://ns.adobe.com/exif/1.0/' => [
- 'ApertureValue' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'BrightnessValue' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'CompressedBitsPerPixel' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'DigitalZoomRatio' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'ExposureBiasValue' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'ExposureIndex' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'ExposureTime' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'FlashEnergy' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational',
- ],
- 'FNumber' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'FocalLength' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'FocalPlaneXResolution' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'FocalPlaneYResolution' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'GPSAltitude' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational',
- ],
- 'GPSDestBearing' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'GPSDestDistance' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'GPSDOP' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'GPSImgDirection' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'GPSSpeed' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'GPSTrack' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'MaxApertureValue' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'ShutterSpeedValue' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- 'SubjectDistance' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational'
- ],
- /* Flash */
- 'Flash' => [
- 'mode' => XMPReader::MODE_STRUCT,
- 'children' => [
- 'Fired' => true,
- 'Function' => true,
- 'Mode' => true,
- 'RedEyeMode' => true,
- 'Return' => true,
- ],
- 'validate' => 'validateFlash',
- 'map_group' => 'exif',
- ],
- 'Fired' => [
- 'map_group' => 'exif',
- 'validate' => 'validateBoolean',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- ],
- 'Function' => [
- 'map_group' => 'exif',
- 'validate' => 'validateBoolean',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- ],
- 'Mode' => [
- 'map_group' => 'exif',
- 'validate' => 'validateClosed',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'choices' => [ '0' => true, '1' => true,
- '2' => true, '3' => true ],
- 'structPart' => true,
- ],
- 'Return' => [
- 'map_group' => 'exif',
- 'validate' => 'validateClosed',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'choices' => [ '0' => true,
- '2' => true, '3' => true ],
- 'structPart' => true,
- ],
- 'RedEyeMode' => [
- 'map_group' => 'exif',
- 'validate' => 'validateBoolean',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- ],
- /* End Flash */
- 'ISOSpeedRatings' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SEQ,
- 'validate' => 'validateInteger'
- ],
- /* end rational things */
- 'ColorSpace' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ '1' => true, '65535' => true ],
- ],
- 'ComponentsConfiguration' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SEQ,
- 'validate' => 'validateClosed',
- 'choices' => [ '1' => true, '2' => true, '3' => true, '4' => true,
- '5' => true, '6' => true ]
- ],
- 'Contrast' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ '0' => true, '1' => true, '2' => true ]
- ],
- 'CustomRendered' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ '0' => true, '1' => true ]
- ],
- 'DateTimeOriginal' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateDate',
- ],
- 'DateTimeDigitized' => [ /* xmp:CreateDate */
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateDate',
- ],
- /* todo: there might be interesting information in
- * exif:DeviceSettingDescription, but need to find an
- * example
- */
- 'ExifVersion' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'ExposureMode' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'rangeLow' => 0,
- 'rangeHigh' => 2,
- ],
- 'ExposureProgram' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'rangeLow' => 0,
- 'rangeHigh' => 8,
- ],
- 'FileSource' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ '3' => true ]
- ],
- 'FlashpixVersion' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'FocalLengthIn35mmFilm' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateInteger',
- ],
- 'FocalPlaneResolutionUnit' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ '2' => true, '3' => true ],
- ],
- 'GainControl' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'rangeLow' => 0,
- 'rangeHigh' => 4,
- ],
- /* this value is post-processed out later */
- 'GPSAltitudeRef' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ '0' => true, '1' => true ],
- ],
- 'GPSAreaInformation' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'GPSDestBearingRef' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ 'T' => true, 'M' => true ],
- ],
- 'GPSDestDistanceRef' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ 'K' => true, 'M' => true,
- 'N' => true ],
- ],
- 'GPSDestLatitude' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateGPS',
- ],
- 'GPSDestLongitude' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateGPS',
- ],
- 'GPSDifferential' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ '0' => true, '1' => true ],
- ],
- 'GPSImgDirectionRef' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ 'T' => true, 'M' => true ],
- ],
- 'GPSLatitude' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateGPS',
- ],
- 'GPSLongitude' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateGPS',
- ],
- 'GPSMapDatum' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'GPSMeasureMode' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ '2' => true, '3' => true ]
- ],
- 'GPSProcessingMethod' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'GPSSatellites' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'GPSSpeedRef' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ 'K' => true, 'M' => true,
- 'N' => true ],
- ],
- 'GPSStatus' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ 'A' => true, 'V' => true ]
- ],
- 'GPSTimeStamp' => [
- 'map_group' => 'exif',
- // Note: in exif, GPSDateStamp does not include
- // the time, where here it does.
- 'map_name' => 'GPSDateStamp',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateDate',
- ],
- 'GPSTrackRef' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ 'T' => true, 'M' => true ]
- ],
- 'GPSVersionID' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'ImageUniqueID' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'LightSource' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- /* can't use a range, as it skips... */
- 'choices' => [ '0' => true, '1' => true,
- '2' => true, '3' => true, '4' => true,
- '9' => true, '10' => true, '11' => true,
- '12' => true, '13' => true,
- '14' => true, '15' => true,
- '17' => true, '18' => true,
- '19' => true, '20' => true,
- '21' => true, '22' => true,
- '23' => true, '24' => true,
- '255' => true,
- ],
- ],
- 'MeteringMode' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'rangeLow' => 0,
- 'rangeHigh' => 6,
- 'choices' => [ '255' => true ],
- ],
- /* Pixel(X|Y)Dimension are rather useless, but for
- * completeness since we do it with exif.
- */
- 'PixelXDimension' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateInteger',
- ],
- 'PixelYDimension' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateInteger',
- ],
- 'Saturation' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'rangeLow' => 0,
- 'rangeHigh' => 2,
- ],
- 'SceneCaptureType' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'rangeLow' => 0,
- 'rangeHigh' => 3,
- ],
- 'SceneType' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ '1' => true ],
- ],
- // Note, 6 is not valid SensingMethod.
- 'SensingMethod' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'rangeLow' => 1,
- 'rangeHigh' => 5,
- 'choices' => [ '7' => true, 8 => true ],
- ],
- 'Sharpness' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'rangeLow' => 0,
- 'rangeHigh' => 2,
- ],
- 'SpectralSensitivity' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- // This tag should perhaps be displayed to user better.
- 'SubjectArea' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SEQ,
- 'validate' => 'validateInteger',
- ],
- 'SubjectDistanceRange' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'rangeLow' => 0,
- 'rangeHigh' => 3,
- ],
- 'SubjectLocation' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SEQ,
- 'validate' => 'validateInteger',
- ],
- 'UserComment' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_LANG,
- ],
- 'WhiteBalance' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ '0' => true, '1' => true ]
- ],
- ],
- 'http://ns.adobe.com/tiff/1.0/' => [
- 'Artist' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'BitsPerSample' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SEQ,
- 'validate' => 'validateInteger',
- ],
- 'Compression' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ '1' => true, '6' => true ],
- ],
- /* this prop should not be used in XMP. dc:rights is the correct prop */
- 'Copyright' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_LANG,
- ],
- 'DateTime' => [ /* proper prop is xmp:ModifyDate */
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateDate',
- ],
- 'ImageDescription' => [ /* proper one is dc:description */
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_LANG,
- ],
- 'ImageLength' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateInteger',
- ],
- 'ImageWidth' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateInteger',
- ],
- 'Make' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'Model' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- /**** Do not extract this property
- * It interferes with auto exif rotation.
- * 'Orientation' => array(
- * 'map_group' => 'exif',
- * 'mode' => XMPReader::MODE_SIMPLE,
- * 'validate' => 'validateClosed',
- * 'choices' => array( '1' => true, '2' => true, '3' => true, '4' => true, 5 => true,
- * '6' => true, '7' => true, '8' => true ),
- *),
- ******/
- 'PhotometricInterpretation' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ '2' => true, '6' => true ],
- ],
- 'PlanerConfiguration' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ '1' => true, '2' => true ],
- ],
- 'PrimaryChromaticities' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SEQ,
- 'validate' => 'validateRational',
- ],
- 'ReferenceBlackWhite' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SEQ,
- 'validate' => 'validateRational',
- ],
- 'ResolutionUnit' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ '2' => true, '3' => true ],
- ],
- 'SamplesPerPixel' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateInteger',
- ],
- 'Software' => [ /* see xmp:CreatorTool */
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- /* ignore TransferFunction */
- 'WhitePoint' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SEQ,
- 'validate' => 'validateRational',
- ],
- 'XResolution' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational',
- ],
- 'YResolution' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRational',
- ],
- 'YCbCrCoefficients' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SEQ,
- 'validate' => 'validateRational',
- ],
- 'YCbCrPositioning' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateClosed',
- 'choices' => [ '1' => true, '2' => true ],
- ],
- /********
- * Disable extracting this property (T33944)
- * Several files have a string instead of a Seq
- * for this property. XMPReader doesn't handle
- * mismatched types very gracefully (it marks
- * the entire file as invalid, instead of just
- * the relavent prop). Since this prop
- * doesn't communicate all that useful information
- * just disable this prop for now, until such
- * XMPReader is more graceful (T34172)
- * 'YCbCrSubSampling' => array(
- * 'map_group' => 'exif',
- * 'mode' => XMPReader::MODE_SEQ,
- * 'validate' => 'validateClosed',
- * 'choices' => array( '1' => true, '2' => true ),
- * ),
- */
- ],
- 'http://ns.adobe.com/exif/1.0/aux/' => [
- 'Lens' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'SerialNumber' => [
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'OwnerName' => [
- 'map_group' => 'exif',
- 'map_name' => 'CameraOwnerName',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- ],
- 'http://purl.org/dc/elements/1.1/' => [
- 'title' => [
- 'map_group' => 'general',
- 'map_name' => 'ObjectName',
- 'mode' => XMPReader::MODE_LANG
- ],
- 'description' => [
- 'map_group' => 'general',
- 'map_name' => 'ImageDescription',
- 'mode' => XMPReader::MODE_LANG
- ],
- 'contributor' => [
- 'map_group' => 'general',
- 'map_name' => 'dc-contributor',
- 'mode' => XMPReader::MODE_BAG
- ],
- 'coverage' => [
- 'map_group' => 'general',
- 'map_name' => 'dc-coverage',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'creator' => [
- 'map_group' => 'general',
- 'map_name' => 'Artist', // map with exif Artist, iptc byline (2:80)
- 'mode' => XMPReader::MODE_SEQ,
- ],
- 'date' => [
- 'map_group' => 'general',
- // Note, not mapped with other date properties, as this type of date is
- // non-specific: "A point or period of time associated with an event in
- // the lifecycle of the resource"
- 'map_name' => 'dc-date',
- 'mode' => XMPReader::MODE_SEQ,
- 'validate' => 'validateDate',
- ],
- /* Do not extract dc:format, as we've got better ways to determine MIME type */
- 'identifier' => [
- 'map_group' => 'deprecated',
- 'map_name' => 'Identifier',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'language' => [
- 'map_group' => 'general',
- 'map_name' => 'LanguageCode', /* mapped with iptc 2:135 */
- 'mode' => XMPReader::MODE_BAG,
- 'validate' => 'validateLangCode',
- ],
- 'publisher' => [
- 'map_group' => 'general',
- 'map_name' => 'dc-publisher',
- 'mode' => XMPReader::MODE_BAG,
- ],
- // for related images/resources
- 'relation' => [
- 'map_group' => 'general',
- 'map_name' => 'dc-relation',
- 'mode' => XMPReader::MODE_BAG,
- ],
- 'rights' => [
- 'map_group' => 'general',
- 'map_name' => 'Copyright',
- 'mode' => XMPReader::MODE_LANG,
- ],
- // Note: source is not mapped with iptc source, since iptc
- // source describes the source of the image in terms of a person
- // who provided the image, where this is to describe an image that the
- // current one is based on.
- 'source' => [
- 'map_group' => 'general',
- 'map_name' => 'dc-source',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'subject' => [
- 'map_group' => 'general',
- 'map_name' => 'Keywords', /* maps to iptc 2:25 */
- 'mode' => XMPReader::MODE_BAG,
- ],
- 'type' => [
- 'map_group' => 'general',
- 'map_name' => 'dc-type',
- 'mode' => XMPReader::MODE_BAG,
- ],
- ],
- 'http://ns.adobe.com/xap/1.0/' => [
- 'CreateDate' => [
- 'map_group' => 'general',
- 'map_name' => 'DateTimeDigitized',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateDate',
- ],
- 'CreatorTool' => [
- 'map_group' => 'general',
- 'map_name' => 'Software',
- 'mode' => XMPReader::MODE_SIMPLE
- ],
- 'Identifier' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_BAG,
- ],
- 'Label' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'ModifyDate' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'map_name' => 'DateTime',
- 'validate' => 'validateDate',
- ],
- 'MetadataDate' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- // map_name to be consistent with other date names.
- 'map_name' => 'DateTimeMetadata',
- 'validate' => 'validateDate',
- ],
- 'Nickname' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'Rating' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateRating',
- ],
- ],
- 'http://ns.adobe.com/xap/1.0/rights/' => [
- 'Certificate' => [
- 'map_group' => 'general',
- 'map_name' => 'RightsCertificate',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'Marked' => [
- 'map_group' => 'general',
- 'map_name' => 'Copyrighted',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateBoolean',
- ],
- 'Owner' => [
- 'map_group' => 'general',
- 'map_name' => 'CopyrightOwner',
- 'mode' => XMPReader::MODE_BAG,
- ],
- // this seems similar to dc:rights.
- 'UsageTerms' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_LANG,
- ],
- 'WebStatement' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- ],
- // XMP media management.
- 'http://ns.adobe.com/xap/1.0/mm/' => [
- // if we extract the exif UniqueImageID, might
- // as well do this too.
- 'OriginalDocumentID' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- // It might also be useful to do xmpMM:LastURL
- // and xmpMM:DerivedFrom as you can potentially,
- // get the url of this document/source for this
- // document. However whats more likely is you'd
- // get a file:// url for the path of the doc,
- // which is somewhat of a privacy issue.
- ],
- 'http://creativecommons.org/ns#' => [
- 'license' => [
- 'map_name' => 'LicenseUrl',
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'morePermissions' => [
- 'map_name' => 'MorePermissionsUrl',
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'attributionURL' => [
- 'map_group' => 'general',
- 'map_name' => 'AttributionUrl',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'attributionName' => [
- 'map_group' => 'general',
- 'map_name' => 'PreferredAttributionName',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- ],
- // Note, this property affects how jpeg metadata is extracted.
- 'http://ns.adobe.com/xmp/note/' => [
- 'HasExtendedXMP' => [
- 'map_group' => 'special',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- ],
- /* Note, in iptc schemas, the legacy properties are denoted
- * as deprecated, since other properties should used instead,
- * and properties marked as deprecated in the standard are
- * are marked as general here as they don't have replacements
- */
- 'http://ns.adobe.com/photoshop/1.0/' => [
- 'City' => [
- 'map_group' => 'deprecated',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'map_name' => 'CityDest',
- ],
- 'Country' => [
- 'map_group' => 'deprecated',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'map_name' => 'CountryDest',
- ],
- 'State' => [
- 'map_group' => 'deprecated',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'map_name' => 'ProvinceOrStateDest',
- ],
- 'DateCreated' => [
- 'map_group' => 'deprecated',
- // marking as deprecated as the xmp prop preferred
- 'mode' => XMPReader::MODE_SIMPLE,
- 'map_name' => 'DateTimeOriginal',
- 'validate' => 'validateDate',
- // note this prop is an XMP, not IPTC date
- ],
- 'CaptionWriter' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'map_name' => 'Writer',
- ],
- 'Instructions' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'map_name' => 'SpecialInstructions',
- ],
- 'TransmissionReference' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'map_name' => 'OriginalTransmissionRef',
- ],
- 'AuthorsPosition' => [
- /* This corresponds with 2:85
- * By-line Title, which needs to be
- * handled weirdly to correspond
- * with iptc/exif. */
- 'map_group' => 'special',
- 'mode' => XMPReader::MODE_SIMPLE
- ],
- 'Credit' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'Source' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'Urgency' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'Category' => [
- // Note, this prop is deprecated, but in general
- // group since it doesn't have a replacement.
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'map_name' => 'iimCategory',
- ],
- 'SupplementalCategories' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_BAG,
- 'map_name' => 'iimSupplementalCategory',
- ],
- 'Headline' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE
- ],
- ],
- 'http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/' => [
- 'CountryCode' => [
- 'map_group' => 'deprecated',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'map_name' => 'CountryCodeDest',
- ],
- 'IntellectualGenre' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- // Note, this is a six digit code.
- // See: http://cv.iptc.org/newscodes/scene/
- // Since these aren't really all that common,
- // we just show the number.
- 'Scene' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_BAG,
- 'validate' => 'validateInteger',
- 'map_name' => 'SceneCode',
- ],
- /* Note: SubjectCode should be an 8 ascii digits.
- * it is not really an integer (has leading 0's,
- * cannot have a +/- sign), but validateInteger
- * will let it through.
- */
- 'SubjectCode' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_BAG,
- 'map_name' => 'SubjectNewsCode',
- 'validate' => 'validateInteger'
- ],
- 'Location' => [
- 'map_group' => 'deprecated',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'map_name' => 'SublocationDest',
- ],
- 'CreatorContactInfo' => [
- /* Note this maps to 2:118 in iim
- * (Contact) field. However those field
- * types are slightly different - 2:118
- * is free form text field, where this
- * is more structured.
- */
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_STRUCT,
- 'map_name' => 'Contact',
- 'children' => [
- 'CiAdrExtadr' => true,
- 'CiAdrCity' => true,
- 'CiAdrCtry' => true,
- 'CiEmailWork' => true,
- 'CiTelWork' => true,
- 'CiAdrPcode' => true,
- 'CiAdrRegion' => true,
- 'CiUrlWork' => true,
- ],
- ],
- 'CiAdrExtadr' => [ /* address */
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- ],
- 'CiAdrCity' => [ /* city */
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- ],
- 'CiAdrCtry' => [ /* country */
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- ],
- 'CiEmailWork' => [ /* email (possibly separated by ',') */
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- ],
- 'CiTelWork' => [ /* telephone */
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- ],
- 'CiAdrPcode' => [ /* postal code */
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- ],
- 'CiAdrRegion' => [ /* province/state */
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- ],
- 'CiUrlWork' => [ /* url. Multiple may be separated by comma. */
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- ],
- /* End contact info struct properties */
- ],
- 'http://iptc.org/std/Iptc4xmpExt/2008-02-29/' => [
- 'Event' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- ],
- 'OrganisationInImageName' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_BAG,
- 'map_name' => 'OrganisationInImage'
- ],
- 'PersonInImage' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_BAG,
- ],
- 'MaxAvailHeight' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateInteger',
- 'map_name' => 'OriginalImageHeight',
- ],
- 'MaxAvailWidth' => [
- 'map_group' => 'general',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'validate' => 'validateInteger',
- 'map_name' => 'OriginalImageWidth',
- ],
- // LocationShown and LocationCreated are handled
- // specially because they are hierarchical, but we
- // also want to merge with the old non-hierarchical.
- 'LocationShown' => [
- 'map_group' => 'special',
- 'mode' => XMPReader::MODE_BAGSTRUCT,
- 'children' => [
- 'WorldRegion' => true,
- 'CountryCode' => true, /* iso code */
- 'CountryName' => true,
- 'ProvinceState' => true,
- 'City' => true,
- 'Sublocation' => true,
- ],
- ],
- 'LocationCreated' => [
- 'map_group' => 'special',
- 'mode' => XMPReader::MODE_BAGSTRUCT,
- 'children' => [
- 'WorldRegion' => true,
- 'CountryCode' => true, /* iso code */
- 'CountryName' => true,
- 'ProvinceState' => true,
- 'City' => true,
- 'Sublocation' => true,
- ],
- ],
- 'WorldRegion' => [
- 'map_group' => 'special',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- ],
- 'CountryCode' => [
- 'map_group' => 'special',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- ],
- 'CountryName' => [
- 'map_group' => 'special',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- 'map_name' => 'Country',
- ],
- 'ProvinceState' => [
- 'map_group' => 'special',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- 'map_name' => 'ProvinceOrState',
- ],
- 'City' => [
- 'map_group' => 'special',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- ],
- 'Sublocation' => [
- 'map_group' => 'special',
- 'mode' => XMPReader::MODE_SIMPLE,
- 'structPart' => true,
- ],
-
- /* Other props that might be interesting but
- * Not currently extracted:
- * ArtworkOrObject, (info about objects in picture)
- * DigitalSourceType
- * RegistryId
- */
- ],
-
- /* Plus props we might want to consider:
- * (Note: some of these have unclear/incomplete definitions
- * from the iptc4xmp standard).
- * ImageSupplier (kind of like iptc source field)
- * ImageSupplierId (id code for image from supplier)
- * CopyrightOwner
- * ImageCreator
- * Licensor
- * Various model release fields
- * Property release fields.
- */
- ];
-}
+++ /dev/null
-<?php
-/**
- * Methods for validating XMP properties.
- *
- * 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
- */
-
-use Psr\Log\LoggerInterface;
-use Psr\Log\LoggerAwareInterface;
-use Wikimedia\Timestamp\ConvertibleTimestamp;
-
-/**
- * This contains some static methods for
- * validating XMP properties. See XMPInfo and XMPReader classes.
- *
- * Each of these functions take the same parameters
- * * an info array which is a subset of the XMPInfo::items array
- * * A value (passed as reference) to validate. This can be either a
- * simple value or an array
- * * A boolean to determine if this is validating a simple or complex values
- *
- * It should be noted that when an array is being validated, typically the validation
- * function is called once for each value, and then once at the end for the entire array.
- *
- * These validation functions can also be used to modify the data. See the gps and flash one's
- * for example.
- *
- * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf starting at pg 28
- * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf starting at pg 11
- */
-class XMPValidate implements LoggerAwareInterface {
-
- /**
- * @var LoggerInterface
- */
- private $logger;
-
- public function __construct( LoggerInterface $logger ) {
- $this->setLogger( $logger );
- }
-
- public function setLogger( LoggerInterface $logger ) {
- $this->logger = $logger;
- }
- /**
- * Function to validate boolean properties ( True or False )
- *
- * @param array $info Information about current property
- * @param mixed &$val Current value to validate
- * @param bool $standalone If this is a simple property or array
- */
- public function validateBoolean( $info, &$val, $standalone ) {
- if ( !$standalone ) {
- // this only validates standalone properties, not arrays, etc
- return;
- }
- if ( $val !== 'True' && $val !== 'False' ) {
- $this->logger->info( __METHOD__ . " Expected True or False but got $val" );
- $val = null;
- }
- }
-
- /**
- * function to validate rational properties ( 12/10 )
- *
- * @param array $info Information about current property
- * @param mixed &$val Current value to validate
- * @param bool $standalone If this is a simple property or array
- */
- public function validateRational( $info, &$val, $standalone ) {
- if ( !$standalone ) {
- // this only validates standalone properties, not arrays, etc
- return;
- }
- if ( !preg_match( '/^(?:-?\d+)\/(?:\d+[1-9]|[1-9]\d*)$/D', $val ) ) {
- $this->logger->info( __METHOD__ . " Expected rational but got $val" );
- $val = null;
- }
- }
-
- /**
- * function to validate rating properties -1, 0-5
- *
- * if its outside of range put it into range.
- *
- * @see MWG spec
- * @param array $info Information about current property
- * @param mixed &$val Current value to validate
- * @param bool $standalone If this is a simple property or array
- */
- public function validateRating( $info, &$val, $standalone ) {
- if ( !$standalone ) {
- // this only validates standalone properties, not arrays, etc
- return;
- }
- if ( !preg_match( '/^[-+]?\d*(?:\.?\d*)$/D', $val )
- || !is_numeric( $val )
- ) {
- $this->logger->info( __METHOD__ . " Expected rating but got $val" );
- $val = null;
-
- return;
- } else {
- $nVal = (float)$val;
- if ( $nVal < 0 ) {
- // We do < 0 here instead of < -1 here, since
- // the values between 0 and -1 are also illegal
- // as -1 is meant as a special reject rating.
- $this->logger->info( __METHOD__ . " Rating too low, setting to -1 (Rejected)" );
- $val = '-1';
-
- return;
- }
- if ( $nVal > 5 ) {
- $this->logger->info( __METHOD__ . " Rating too high, setting to 5" );
- $val = '5';
-
- return;
- }
- }
- }
-
- /**
- * function to validate integers
- *
- * @param array $info Information about current property
- * @param mixed &$val Current value to validate
- * @param bool $standalone If this is a simple property or array
- */
- public function validateInteger( $info, &$val, $standalone ) {
- if ( !$standalone ) {
- // this only validates standalone properties, not arrays, etc
- return;
- }
- if ( !preg_match( '/^[-+]?\d+$/D', $val ) ) {
- $this->logger->info( __METHOD__ . " Expected integer but got $val" );
- $val = null;
- }
- }
-
- /**
- * function to validate properties with a fixed number of allowed
- * choices. (closed choice)
- *
- * @param array $info Information about current property
- * @param mixed &$val Current value to validate
- * @param bool $standalone If this is a simple property or array
- */
- public function validateClosed( $info, &$val, $standalone ) {
- if ( !$standalone ) {
- // this only validates standalone properties, not arrays, etc
- return;
- }
-
- // check if its in a numeric range
- $inRange = false;
- if ( isset( $info['rangeLow'] )
- && isset( $info['rangeHigh'] )
- && is_numeric( $val )
- && ( intval( $val ) <= $info['rangeHigh'] )
- && ( intval( $val ) >= $info['rangeLow'] )
- ) {
- $inRange = true;
- }
-
- if ( !isset( $info['choices'][$val] ) && !$inRange ) {
- $this->logger->info( __METHOD__ . " Expected closed choice, but got $val" );
- $val = null;
- }
- }
-
- /**
- * function to validate and modify flash structure
- *
- * @param array $info Information about current property
- * @param mixed &$val Current value to validate
- * @param bool $standalone If this is a simple property or array
- */
- public function validateFlash( $info, &$val, $standalone ) {
- if ( $standalone ) {
- // this only validates flash structs, not individual properties
- return;
- }
- if ( !( isset( $val['Fired'] )
- && isset( $val['Function'] )
- && isset( $val['Mode'] )
- && isset( $val['RedEyeMode'] )
- && isset( $val['Return'] )
- ) ) {
- $this->logger->info( __METHOD__ . " Flash structure did not have all the required components" );
- $val = null;
- } else {
- $val = ( 0 | ( $val['Fired'] === 'True' )
- | ( intval( $val['Return'] ) << 1 )
- | ( intval( $val['Mode'] ) << 3 )
- | ( ( $val['Function'] === 'True' ) << 5 )
- | ( ( $val['RedEyeMode'] === 'True' ) << 6 ) );
- }
- }
-
- /**
- * function to validate LangCode properties ( en-GB, etc )
- *
- * This is just a naive check to make sure it somewhat looks like a lang code.
- *
- * @see BCP 47
- * @see https://wwwimages2.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/
- * XMP%20SDK%20Release%20cc-2014-12/XMPSpecificationPart1.pdf page 22 (section 8.2.2.4)
- *
- * @param array $info Information about current property
- * @param mixed &$val Current value to validate
- * @param bool $standalone If this is a simple property or array
- */
- public function validateLangCode( $info, &$val, $standalone ) {
- if ( !$standalone ) {
- // this only validates standalone properties, not arrays, etc
- return;
- }
- if ( !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $val ) ) {
- // this is a rather naive check.
- $this->logger->info( __METHOD__ . " Expected Lang code but got $val" );
- $val = null;
- }
- }
-
- /**
- * function to validate date properties, and convert to (partial) Exif format.
- *
- * Dates can be one of the following formats:
- * YYYY
- * YYYY-MM
- * YYYY-MM-DD
- * YYYY-MM-DDThh:mmTZD
- * YYYY-MM-DDThh:mm:ssTZD
- * YYYY-MM-DDThh:mm:ss.sTZD
- *
- * @param array $info Information about current property
- * @param mixed &$val Current value to validate. Converts to TS_EXIF as a side-effect.
- * in cases where there's only a partial date, it will give things like
- * 2011:04.
- * @param bool $standalone If this is a simple property or array
- */
- public function validateDate( $info, &$val, $standalone ) {
- if ( !$standalone ) {
- // this only validates standalone properties, not arrays, etc
- return;
- }
- $res = [];
- if ( !preg_match(
- /* ahh! scary regex... */
- // phpcs:ignore Generic.Files.LineLength
- '/^([0-3]\d{3})(?:-([01]\d)(?:-([0-3]\d)(?:T([0-2]\d):([0-6]\d)(?::([0-6]\d)(?:\.\d+)?)?([-+]\d{2}:\d{2}|Z)?)?)?)?$/D',
- $val, $res )
- ) {
- $this->logger->info( __METHOD__ . " Expected date but got $val" );
- $val = null;
- } else {
- /*
- * $res is formatted as follows:
- * 0 -> full date.
- * 1 -> year, 2-> month, 3-> day, 4-> hour, 5-> minute, 6->second
- * 7-> Timezone specifier (Z or something like +12:30 )
- * many parts are optional, some aren't. For example if you specify
- * minute, you must specify hour, day, month, and year but not second or TZ.
- */
-
- /*
- * First of all, if year = 0000, Something is wrongish,
- * so don't extract. This seems to happen when
- * some programs convert between metadata formats.
- */
- if ( $res[1] === '0000' ) {
- $this->logger->info( __METHOD__ . " Invalid date (year 0): $val" );
- $val = null;
-
- return;
- }
-
- if ( !isset( $res[4] ) ) { // hour
- // just have the year month day (if that)
- $val = $res[1];
- if ( isset( $res[2] ) ) {
- $val .= ':' . $res[2];
- }
- if ( isset( $res[3] ) ) {
- $val .= ':' . $res[3];
- }
-
- return;
- }
-
- if ( !isset( $res[7] ) || $res[7] === 'Z' ) {
- // if hour is set, then minute must also be or regex above will fail.
- $val = $res[1] . ':' . $res[2] . ':' . $res[3]
- . ' ' . $res[4] . ':' . $res[5];
- if ( isset( $res[6] ) && $res[6] !== '' ) {
- $val .= ':' . $res[6];
- }
-
- return;
- }
-
- // Extra check for empty string necessary due to TZ but no second case.
- $stripSeconds = false;
- if ( !isset( $res[6] ) || $res[6] === '' ) {
- $res[6] = '00';
- $stripSeconds = true;
- }
-
- // Do timezone processing. We've already done the case that tz = Z.
-
- // We know that if we got to this step, year, month day hour and min must be set
- // by virtue of regex not failing.
-
- $unix = ConvertibleTimestamp::convert( TS_UNIX,
- $res[1] . $res[2] . $res[3] . $res[4] . $res[5] . $res[6]
- );
- $offset = intval( substr( $res[7], 1, 2 ) ) * 60 * 60;
- $offset += intval( substr( $res[7], 4, 2 ) ) * 60;
- if ( substr( $res[7], 0, 1 ) === '-' ) {
- $offset = -$offset;
- }
- $val = ConvertibleTimestamp::convert( TS_EXIF, $unix + $offset );
-
- if ( $stripSeconds ) {
- // If seconds weren't specified, remove the trailing ':00'.
- $val = substr( $val, 0, -3 );
- }
- }
- }
-
- /** function to validate, and more importantly
- * translate the XMP DMS form of gps coords to
- * the decimal form we use.
- *
- * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf
- * section 1.2.7.4 on page 23
- *
- * @param array $info Unused (info about prop)
- * @param string &$val GPS string in either DDD,MM,SSk or
- * or DDD,MM.mmk form
- * @param bool $standalone If its a simple prop (should always be true)
- */
- public function validateGPS( $info, &$val, $standalone ) {
- if ( !$standalone ) {
- return;
- }
-
- $m = [];
- if ( preg_match(
- '/(\d{1,3}),(\d{1,2}),(\d{1,2})([NWSE])/D',
- $val, $m )
- ) {
- $coord = intval( $m[1] );
- $coord += intval( $m[2] ) * ( 1 / 60 );
- $coord += intval( $m[3] ) * ( 1 / 3600 );
- if ( $m[4] === 'S' || $m[4] === 'W' ) {
- $coord = -$coord;
- }
- $val = $coord;
-
- return;
- } elseif ( preg_match(
- '/(\d{1,3}),(\d{1,2}(?:.\d*)?)([NWSE])/D',
- $val, $m )
- ) {
- $coord = intval( $m[1] );
- $coord += floatval( $m[2] ) * ( 1 / 60 );
- if ( $m[3] === 'S' || $m[3] === 'W' ) {
- $coord = -$coord;
- }
- $val = $coord;
-
- return;
- } else {
- $this->logger->info( __METHOD__
- . " Expected GPSCoordinate, but got $val." );
- $val = null;
-
- return;
- }
- }
-}
// new key (5::duration/6::flags) or old key (0/optional 1)
if ( $entry->isLegacy() ) {
$rawDuration = $parameters[0];
- $rawFlags = isset( $parameters[1] ) ? $parameters[1] : '';
+ $rawFlags = $parameters[1] ?? '';
} else {
$rawDuration = $parameters['5::duration'];
$rawFlags = $parameters['6::flags'];
if ( count( $oldGroups ) ) {
$params[3] = [ 'raw' => $this->formatRightsList( $oldGroups,
- isset( $allParams['oldmetadata'] ) ? $allParams['oldmetadata'] : [] ) ];
+ $allParams['oldmetadata'] ?? [] ) ];
} else {
$params[3] = $this->msg( 'rightsnone' )->text();
}
// Array_values is used here because of T44211
// see use of array_unique in UserrightsPage::doSaveUserGroups on $newGroups.
$params[4] = [ 'raw' => $this->formatRightsList( array_values( $newGroups ),
- isset( $allParams['newmetadata'] ) ? $allParams['newmetadata'] : [] ) ];
+ $allParams['newmetadata'] ?? [] ) ];
} else {
$params[4] = $this->msg( 'rightsnone' )->text();
}
if ( isset( $oldmetadata[$index] ) ) {
$result += $oldmetadata[$index];
}
- $result['expiry'] = ApiResult::formatExpiry( isset( $result['expiry'] ) ?
- $result['expiry'] : null );
+ $result['expiry'] = ApiResult::formatExpiry( $result['expiry'] ?? null );
return $result;
}, array_keys( $params['4:array:oldgroups'] ) );
if ( isset( $newmetadata[$index] ) ) {
$result += $newmetadata[$index];
}
- $result['expiry'] = ApiResult::formatExpiry( isset( $result['expiry'] ) ?
- $result['expiry'] : null );
+ $result['expiry'] = ApiResult::formatExpiry( $result['expiry'] ?? null );
return $result;
}, array_keys( $params['5:array:newgroups'] ) );
global $wgSMTP, $wgEnotifMaxRecips, $wgAdditionalMailParams;
$mime = null;
- $replyto = isset( $options['replyTo'] ) ? $options['replyTo'] : null;
- $contentType = isset( $options['contentType'] ) ?
- $options['contentType'] : 'text/plain; charset=UTF-8';
- $headers = isset( $options['headers'] ) ? $options['headers'] : [];
+ $replyto = $options['replyTo'] ?? null;
+ $contentType = $options['contentType'] ?? 'text/plain; charset=UTF-8';
+ $headers = $options['headers'] ?? [];
// Allow transformation of content, such as encrypting/signing
$error = false;
*/
use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\XMPReader\Reader as XMPReader;
/**
* Class to deal with reconciling and extracting metadata from bitmap images.
}
}
- $meta->getExif( $filename, isset( $seg['byteOrder'] ) ? $seg['byteOrder'] : 'BE' );
+ $meta->getExif( $filename, $seg['byteOrder'] ?? 'BE' );
return $meta->getMetadataArray();
}
* @return bool|string
*/
public function makeParamString( $params ) {
- $page = isset( $params['page'] ) ? $params['page'] : 1;
+ $page = $params['page'] ?? 1;
if ( !isset( $params['width'] ) ) {
return false;
}
* @ingroup Media
*/
+use Wikimedia\XMPReader\Reader as XMPReader;
+
/**
* Class for reading jpegs and extracting metadata.
* see also BitmapMetadataHandler.
throw new MWException( __METHOD__ . ' called in the old style' );
}
- $alt = isset( $options['alt'] ) ? $options['alt'] : '';
+ $alt = $options['alt'] ?? '';
- $query = isset( $options['desc-query'] ) ? $options['desc-query'] : '';
+ $query = $options['desc-query'] ?? '';
$attribs = [
'alt' => $alt,
class TransformParameterError extends MediaTransformError {
function __construct( $params ) {
parent::__construct( 'thumbnail_error',
- max( isset( $params['width'] ) ? $params['width'] : 0, 120 ),
- max( isset( $params['height'] ) ? $params['height'] : 0, 120 ),
+ max( $params['width'] ?? 0, 120 ),
+ max( $params['height'] ?? 0, 120 ),
wfMessage( 'thumbnail_invalid_params' )
);
}
);
parent::__construct( 'thumbnail_error',
- max( isset( $params['width'] ) ? $params['width'] : 0, 120 ),
- max( isset( $params['height'] ) ? $params['height'] : 0, 120 ),
+ max( $params['width'] ?? 0, 120 ),
+ max( $params['height'] ?? 0, 120 ),
$msg
);
}
$clientHeight = $params['height'];
$physicalWidth = $params['physicalWidth'];
$physicalHeight = $params['physicalHeight'];
- $lang = isset( $params['lang'] ) ? $params['lang'] : $this->getDefaultRenderLanguage( $image );
+ $lang = $params['lang'] ?? $this->getDefaultRenderLanguage( $image );
if ( $flags & self::TRANSFORM_LATER ) {
return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
'mimeType' => $image->getMimeType(),
'dstPath' => $dstPath,
'dstUrl' => $dstUrl,
- 'interlace' => isset( $params['interlace'] ) ? $params['interlace'] : false,
+ 'interlace' => $params['interlace'] ?? false,
];
if ( isset( $params['quality'] ) && $params['quality'] === 'low' ) {
} elseif ( isset( $params['class'] ) ) {
$class = $params['class'];
// Automatically set the 'async' update handler
- $params['asyncHandler'] = isset( $params['asyncHandler'] )
- ? $params['asyncHandler']
- : 'DeferredUpdates::addCallableUpdate';
+ $params['asyncHandler'] = $params['asyncHandler'] ?? 'DeferredUpdates::addCallableUpdate';
// Enable reportDupes by default
- $params['reportDupes'] = isset( $params['reportDupes'] )
- ? $params['reportDupes']
- : true;
+ $params['reportDupes'] = $params['reportDupes'] ?? true;
// Do b/c logic for SqlBagOStuff
if ( is_a( $class, SqlBagOStuff::class, true ) ) {
if ( isset( $params['server'] ) && !isset( $params['servers'] ) ) {
$cache = MediaWikiServices::getInstance()->getLocalServerObjectCache();
if ( $cache instanceof EmptyBagOStuff ) {
if ( is_array( $fallback ) ) {
- $fallback = isset( $fallback['fallback'] ) ? $fallback['fallback'] : CACHE_NONE;
+ $fallback = $fallback['fallback'] ?? CACHE_NONE;
}
$cache = self::getInstance( $fallback );
}
if ( is_string( $tag ) ) {
$this->serverTags[$index] = $tag;
} else {
- $this->serverTags[$index] = isset( $info['host'] ) ? $info['host'] : "#$index";
+ $this->serverTags[$index] = $info['host'] ?? "#$index";
}
++$index;
}
if ( $this->serverInfos ) {
// Use custom database defined by server connection info
$info = $this->serverInfos[$serverIndex];
- $type = isset( $info['type'] ) ? $info['type'] : 'mysql';
- $host = isset( $info['host'] ) ? $info['host'] : '[unknown]';
+ $type = $info['type'] ?? 'mysql';
+ $host = $info['host'] ?? '[unknown]';
$this->logger->debug( __CLASS__ . ": connecting to $host" );
// Use a blank trx profiler to ignore expections as this is a cache
$info['trxProfiler'] = new TransactionProfiler();
* @return int Result of string comparison, or namespace comparison
*/
protected function compare( $a, $b ) {
- if ( $a->page_namespace == $b->page_namespace ) {
- return strcmp( $a->page_title, $b->page_title );
- } else {
- return $a->page_namespace - $b->page_namespace;
- }
+ return $a->page_namespace <=> $b->page_namespace
+ ?: strcmp( $a->page_title, $b->page_title );
}
/**
$option = 0;
}
- return isset( $wgImageLimits[$option] )
- ? $wgImageLimits[$option]
- : [ 800, 600 ]; // if nothing is set, fallback to a hardcoded default
+ // if nothing is set, fallback to a hardcoded default
+ return $wgImageLimits[$option] ?? [ 800, 600 ];
}
/**
}
// raise error, when the edit is an edit without a new version
- $statusRev = isset( $status->value['revision'] )
- ? $status->value['revision']
- : null;
+ $statusRev = $status->value['revision'] ?? null;
if ( !( $statusRev instanceof Revision ) ) {
$resultDetails = [ 'current' => $current ];
return [ [ 'alreadyrolled',
$info = $this->getQueryInfo();
$tables = $info['tables'];
$fields = $info['fields'];
- $conds = isset( $info['conds'] ) ? $info['conds'] : [];
- $options = isset( $info['options'] ) ? $info['options'] : [];
- $join_conds = isset( $info['join_conds'] ) ? $info['join_conds'] : [];
+ $conds = $info['conds'] ?? [];
+ $options = $info['options'] ?? [];
+ $join_conds = $info['join_conds'] ?? [];
$sortColumns = array_merge( [ $this->mIndexField ], $this->mExtraSortFields );
if ( $descending ) {
$options['ORDER BY'] = $sortColumns;
$fieldNames = $this->getFieldNames();
foreach ( $fieldNames as $field => $name ) {
- $value = isset( $row->$field ) ? $row->$field : null;
+ $value = $row->$field ?? null;
$formatted = strval( $this->formatValue( $field, $value ) );
if ( $formatted == '' ) {
$name = trim( $frame->expand( $bits['name'], PPFrame::STRIP_COMMENTS ) );
$value = trim( $frame->expand( $bits['value'] ) );
if ( preg_match( '/^(?:["\'](.+)["\']|""|\'\')$/s', $value, $m ) ) {
- $value = isset( $m[1] ) ? $m[1] : '';
+ $value = $m[1] ?? '';
}
$attributes[$name] = $value;
}
foreach ( $entries as $index => $entry ) {
$pdbk = $entry['pdbk'];
$title = $entry['title'];
- $query = isset( $entry['query'] ) ? $entry['query'] : [];
+ $query = $entry['query'] ?? [];
$key = "$ns:$index";
$searchkey = "<!--LINK'\" $key-->";
$displayText = $entry['text'];
// Add on template profiling data in human/machine readable way
$dataByFunc = $this->mProfiler->getFunctionStats();
uasort( $dataByFunc, function ( $a, $b ) {
- return $a['real'] < $b['real']; // descending order
+ return $b['real'] <=> $a['real']; // descending order
} );
$profileReport = [];
foreach ( array_slice( $dataByFunc, 0, 10 ) as $item ) {
if ( is_string( $stuff['text'] ) ) {
$text = strtr( $text, "\x7f", "?" );
}
- $finalTitle = isset( $stuff['finalTitle'] ) ? $stuff['finalTitle'] : $title;
+ $finalTitle = $stuff['finalTitle'] ?? $title;
if ( isset( $stuff['deps'] ) ) {
foreach ( $stuff['deps'] as $dep ) {
$this->mOutput->addTemplate( $dep['title'], $dep['page_id'], $dep['rev_id'] );
if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) {
throw new MWException( "Invalid character {$m[0]} in setHook('$tag', ...) call" );
}
- $oldVal = isset( $this->mTagHooks[$tag] ) ? $this->mTagHooks[$tag] : null;
+ $oldVal = $this->mTagHooks[$tag] ?? null;
$this->mTagHooks[$tag] = $callback;
if ( !in_array( $tag, $this->mStripList ) ) {
$this->mStripList[] = $tag;
if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) {
throw new MWException( "Invalid character {$m[0]} in setTransparentHook('$tag', ...) call" );
}
- $oldVal = isset( $this->mTransparentTagHooks[$tag] ) ? $this->mTransparentTagHooks[$tag] : null;
+ $oldVal = $this->mTransparentTagHooks[$tag] ?? null;
$this->mTransparentTagHooks[$tag] = $callback;
return $oldVal;
if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) {
throw new MWException( "Invalid character {$m[0]} in setFunctionTagHook('$tag', ...) call" );
}
- $old = isset( $this->mFunctionTagHooks[$tag] ) ?
- $this->mFunctionTagHooks[$tag] : null;
+ $old = $this->mFunctionTagHooks[$tag] ?? null;
$this->mFunctionTagHooks[$tag] = [ $callback, $flags ];
if ( !in_array( $tag, $this->mStripList ) ) {
Hooks::run( 'ParserMakeImageParams', [ $title, $file, &$params, $this ] );
# Linker does the rest
- $time = isset( $options['time'] ) ? $options['time'] : false;
+ $time = $options['time'] ?? false;
$ret = Linker::makeImageLink( $this, $title, $file, $params['frame'], $params['handler'],
$time, $descQuery, $this->mOptions->getThumbSize() );
* @note You need to use getProperties() to check for boolean and null properties.
*/
public function getProperty( $name ) {
- return isset( $this->mProperties[$name] ) ? $this->mProperties[$name] : false;
+ return $this->mProperties[$name] ?? false;
}
public function unsetProperty( $name ) {
if ( $level === false ) {
return $this->title->getPrefixedDBkey();
} else {
- return isset( $this->titleCache[$level] ) ? $this->titleCache[$level] : false;
+ return $this->titleCache[$level] ?? false;
}
}
if ( $level === false ) {
return $this->title->getPrefixedDBkey();
} else {
- return isset( $this->titleCache[$level] ) ? $this->titleCache[$level] : false;
+ return $this->titleCache[$level] ?? false;
}
}
*/
static function attributeWhitelist( $element ) {
$list = self::setupAttributeWhitelist();
- return isset( $list[$element] )
- ? $list[$element]
- : [];
+ return $list[$element] ?? [];
}
/**
}
protected function shouldUseHashExtension() {
- return isset( $this->config['use-hash-extension'] ) ?
- $this->config['use-hash-extension'] : function_exists( 'hash_pbkdf2' );
+ return $this->config['use-hash-extension'] ?? function_exists( 'hash_pbkdf2' );
}
public function crypt( $password ) {
PoolCounter::QUEUE_FULL => 'pool-queuefull',
PoolCounter::TIMEOUT => 'pool-timeout' ];
- $status = Status::newFatal( isset( $errors[$status->value] )
- ? $errors[$status->value]
- : 'pool-errorunknown' );
+ $status = Status::newFatal( $errors[$status->value] ?? 'pool-errorunknown' );
$this->logError( $status );
return $this->error( $status );
}
$info['disabled'] = 'disabled';
}
$field = HTMLForm::loadInputFromParameters( $name, $info, $dummyForm ); // For validation
- $globalDefault = isset( $defaultOptions[$name] )
- ? $defaultOptions[$name]
- : null;
+ $globalDefault = $defaultOptions[$name] ?? null;
// If it validates, set it as the default
if ( isset( $info['default'] ) ) {
if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
( isset( $info['class'] ) && $info['class'] == \HTMLMultiSelectField::class ) ) {
$options = HTMLFormField::flattenOptions( $info['options'] );
- $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+ $prefix = $info['prefix'] ?? $name;
$val = [];
foreach ( $options as $value ) {
( isset( $info['class'] ) && $info['class'] == \HTMLCheckMatrix::class ) ) {
$columns = HTMLFormField::flattenOptions( $info['columns'] );
$rows = HTMLFormField::flattenOptions( $info['rows'] );
- $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+ $prefix = $info['prefix'] ?? $name;
$val = [];
foreach ( $columns as $column ) {
protected function getFunctionReport() {
$data = $this->getFunctionStats();
usort( $data, function ( $a, $b ) {
- if ( $a['real'] === $b['real'] ) {
- return 0;
- }
- return ( $a['real'] > $b['real'] ) ? -1 : 1; // descending
+ return $b['real'] <=> $a['real']; // descending
} );
$width = 140;
public function __construct( array $params = [] ) {
parent::__construct( $params );
- $flags = isset( $params['flags'] ) ? $params['flags'] : 0;
+ $flags = $params['flags'] ?? 0;
$options = isset( $params['exclude'] )
? [ 'ignored_functions' => $params['exclude'] ] : [];
Xhprof::enable( $flags, $options );
protected function getFunctionReport() {
$data = $this->getFunctionStats();
usort( $data, function ( $a, $b ) {
- if ( $a['real'] === $b['real'] ) {
- return 0;
- }
- return ( $a['real'] > $b['real'] ) ? -1 : 1; // descending
+ return $b['real'] <=> $a['real']; // descending
} );
$width = 140;
* @param array $stats
*/
public function log( array $stats ) {
- $prefix = isset( $this->params['prefix'] ) ? $this->params['prefix'] : '';
+ $prefix = $this->params['prefix'] ?? '';
$contextStats = MediaWikiServices::getInstance()->getStatsdDataFactory();
foreach ( $stats as $stat ) {
function __construct( Profiler $collector, array $params ) {
parent::__construct( $collector, $params );
- $this->thresholdMs = isset( $params['thresholdMs'] )
- ? $params['thresholdMs']
- : 1.0;
+ $this->thresholdMs = $params['thresholdMs'] ?? 1.0;
}
public function log( array $stats ) {
if ( $this->collector->getTemplated() ) {
} );
// Sort descending by time elapsed
usort( $stats, function ( $a, $b ) {
- return $a['real'] < $b['real'];
+ return $b['real'] <=> $a['real'];
} );
array_walk( $stats,
if ( wfIsCLI() ) {
print "<!--\n{$out}\n-->\n";
} elseif ( $contentType === 'text/html' ) {
- $visible = isset( $this->params['visible'] ) ?
- $this->params['visible'] : false;
+ $visible = $this->params['visible'] ?? false;
if ( $visible ) {
print "<pre>{$out}</pre>";
} else {
}
public function getRequirements( array $info ) {
- return isset( $info['requires'] ) ? $info['requires'] : [];
+ return $info['requires'] ?? [];
}
protected function extractHooks( array $info ) {
}
protected function extractResourceLoaderModules( $dir, array $info ) {
- $defaultPaths = isset( $info['ResourceFileModulePaths'] )
- ? $info['ResourceFileModulePaths']
- : false;
+ $defaultPaths = $info['ResourceFileModulePaths'] ?? false;
if ( isset( $defaultPaths['localBasePath'] ) ) {
if ( $defaultPaths['localBasePath'] === '' ) {
// Avoid double slashes (e.g. /extensions/Example//path)
protected function extractCredits( $path, array $info ) {
$credits = [
'path' => $path,
- 'type' => isset( $info['type'] ) ? $info['type'] : 'other',
+ 'type' => $info['type'] ?? 'other',
];
foreach ( self::$creditsAttributes as $attr ) {
if ( isset( $info[$attr] ) ) {
$strContent = isset( $styles['css'] ) ? implode( '', $styles['css'] ) : '';
break;
default:
- $scripts = isset( $content['scripts'] ) ? $content['scripts'] : '';
+ $scripts = $content['scripts'] ?? '';
if ( is_string( $scripts ) ) {
if ( $name === 'site' || $name === 'user' ) {
// Legacy scripts that run in the global scope without a closure.
$strContent = self::makeLoaderImplementScript(
$implementKey,
$scripts,
- isset( $content['styles'] ) ? $content['styles'] : [],
+ $content['styles'] ?? [],
isset( $content['messagesBlob'] ) ? new XmlJsCode( $content['messagesBlob'] ) : [],
- isset( $content['templates'] ) ? $content['templates'] : []
+ $content['templates'] ?? []
);
break;
}
$collatedFiles[$default][] = $value;
} elseif ( is_array( $value ) ) {
// File name as the key, options array as the value
- $optionValue = isset( $value[$option] ) ? $value[$option] : $default;
+ $optionValue = $value[$option] ?? $default;
if ( !isset( $collatedFiles[$optionValue] ) ) {
$collatedFiles[$optionValue] = [];
}
public function getImage( $name, ResourceLoaderContext $context ) {
$this->loadFromDefinition();
$images = $this->getImages( $context );
- return isset( $images[$name] ) ? $images[$name] : null;
+ return $images[$name] ?? null;
}
/**
if ( !isset( $this->imageObjects[$skin] ) ) {
$this->imageObjects[$skin] = [];
if ( !isset( $this->images[$skin] ) ) {
- $this->images[$skin] = isset( $this->images['default'] ) ?
- $this->images['default'] :
- [];
+ $this->images[$skin] = $this->images['default'] ?? [];
}
foreach ( $this->images[$skin] as $name => $options ) {
$fileDescriptor = is_string( $options ) ? $options : $options['file'];
if ( !isset( $this->globalVariants[$skin] ) ) {
$this->globalVariants[$skin] = [];
if ( !isset( $this->variants[$skin] ) ) {
- $this->variants[$skin] = isset( $this->variants['default'] ) ?
- $this->variants['default'] :
- [];
+ $this->variants[$skin] = $this->variants['default'] ?? [];
}
foreach ( $this->variants[$skin] as $name => $config ) {
if ( isset( $config['global'] ) && $config['global'] ) {
$themes = self::getSkinThemeMap();
// For backwards-compatibility, allow missing 'themeImages'
- $module = isset( $this->definition['themeImages'] ) ? $this->definition['themeImages'] : '';
+ $module = $this->definition['themeImages'] ?? '';
$definition = [];
foreach ( $themes as $skin => $theme ) {
if ( $options['type'] !== 'style' ) {
continue;
}
- $media = isset( $options['media'] ) ? $options['media'] : 'all';
+ $media = $options['media'] ?? 'all';
$style = $this->getContent( $titleText, $context );
if ( strval( $style ) === '' ) {
continue;
$bitPars = $params['value'];
$comment = $params['comment'];
- $perItemStatus = isset( $params['perItemStatus'] ) ? $params['perItemStatus'] : false;
+ $perItemStatus = $params['perItemStatus'] ?? false;
// CAS-style checks are done on the _deleted fields so the select
// does not need to use FOR UPDATE nor be in the atomic section
'oldBits' => $virtualOldBits,
'comment' => $comment,
'ids' => $idsForLog,
- 'tags' => isset( $params['tags'] ) ? $params['tags'] : [],
+ 'tags' => $params['tags'] ?? [],
] + $authorFields
);
throw new NoSuchServiceException( $name );
}
- return isset( $this->services[$name] ) ? $this->services[$name] : null;
+ return $this->services[$name] ?? null;
}
/**
);
}
- $prefix = isset( $this->sessionCookieOptions['prefix'] )
- ? $this->sessionCookieOptions['prefix']
- : $this->config->get( 'CookiePrefix' );
+ $prefix = $this->sessionCookieOptions['prefix'] ?? $this->config->get( 'CookiePrefix' );
$id = $request->getCookie( $this->sessionCookieName, $prefix );
return SessionManager::validateSessionId( $id ) ? $id : null;
}
return [];
}
- $prefix = isset( $this->sessionCookieOptions['prefix'] )
- ? $this->sessionCookieOptions['prefix']
- : $this->config->get( 'CookiePrefix' );
+ $prefix = $this->sessionCookieOptions['prefix'] ?? $this->config->get( 'CookiePrefix' );
return [ $prefix . $this->sessionCookieName ];
}
// Now merge the data into the Session object.
$changed = false;
- $cache = isset( $this->sessionFieldCache[$id] ) ? $this->sessionFieldCache[$id] : [];
+ $cache = $this->sessionFieldCache[$id] ?? [];
foreach ( $data as $key => $value ) {
if ( !array_key_exists( $key, $cache ) ) {
if ( $session->exists( $key ) ) {
* @return int Negative if $a < $b, positive if $a > $b, zero if equal
*/
public static function compare( $a, $b ) {
- return $a->getPriority() - $b->getPriority();
+ return $a->getPriority() <=> $b->getPriority();
}
}
*/
public function getProvider( $name ) {
$providers = $this->getProviders();
- return isset( $providers[$name] ) ? $providers[$name] : null;
+ return $providers[$name] ?? null;
}
/**
$splitCommand = explode( ' ', $command, 2 );
$this->logger->debug(
"firejail: Command {$splitCommand[0]} {params} has no restrictions",
- [ 'params' => isset( $splitCommand[1] ) ? $splitCommand[1] : '' ]
+ [ 'params' => $splitCommand[1] ?? '' ]
);
return parent::buildFinalCommand( $command );
}
*/
class Shell {
- /**
- * Apply a default set of restrictions for improved
- * security out of the box.
- *
- * Equal to NO_ROOT | SECCOMP | PRIVATE_DEV | NO_LOCALSETTINGS
- *
- * @note This value will change over time to provide increased security
- * by default, and is not guaranteed to be backwards-compatible.
- * @since 1.31
- */
- const RESTRICT_DEFAULT = 39;
-
/**
* Disallow any root access. Any setuid binaries
* will be run without elevated access.
*/
const NO_LOCALSETTINGS = 32;
+ /**
+ * Apply a default set of restrictions for improved
+ * security out of the box.
+ *
+ * @note This value will change over time to provide increased security
+ * by default, and is not guaranteed to be backwards-compatible.
+ * @since 1.31
+ */
+ const RESTRICT_DEFAULT = self::NO_ROOT | self::SECCOMP | self::PRIVATE_DEV |
+ self::NO_LOCALSETTINGS;
+
/**
* Don't apply any restrictions
*
if ( isset( $item['text'] ) ) {
$text = $item['text'];
} else {
- $text = wfMessage( isset( $item['msg'] ) ? $item['msg'] : $key )->text();
+ $text = wfMessage( $item['msg'] ?? $key )->text();
}
$html = htmlspecialchars( $text );
}
while ( count( $wrapper ) > 0 ) {
$element = array_pop( $wrapper );
- $html = Html::rawElement( $element['tag'], isset( $element['attributes'] )
- ? $element['attributes']
- : null, $html );
+ $html = Html::rawElement( $element['tag'], $element['attributes'] ?? null, $html );
}
}
if ( isset( $item['itemtitle'] ) ) {
$attrs['title'] = $item['itemtitle'];
}
- return Html::rawElement( isset( $options['tag'] ) ? $options['tag'] : 'li', $attrs, $html );
+ return Html::rawElement( $options['tag'] ?? 'li', $attrs, $html );
}
function makeSearchInput( $attrs = [] ) {
unset( $buttonAttrs['height'] );
$imgAttrs = [
'src' => $attrs['src'],
- 'alt' => isset( $attrs['alt'] )
- ? $attrs['alt']
- : wfMessage( 'searchbutton' )->text(),
- 'width' => isset( $attrs['width'] ) ? $attrs['width'] : null,
- 'height' => isset( $attrs['height'] ) ? $attrs['height'] : null,
+ 'alt' => $attrs['alt'] ?? wfMessage( 'searchbutton' )->text(),
+ 'width' => $attrs['width'] ?? null,
+ 'height' => $attrs['height'] ?? null,
];
return Html::rawElement( 'button', $buttonAttrs, Html::element( 'img', $imgAttrs ) );
default:
if ( is_string( $icon ) ) {
$html = $icon;
} else { // Assuming array
- $url = isset( $icon["url"] ) ? $icon["url"] : null;
+ $url = $icon["url"] ?? null;
unset( $icon["url"] );
if ( isset( $icon["src"] ) && $withImage === 'withImage' ) {
// do this the lazy way, just pass icon data as an attribute array
if ( count( $newtalks ) == 1 && $newtalks[0]['wiki'] === wfWikiID() ) {
$uTalkTitle = $user->getTalkPage();
- $lastSeenRev = isset( $newtalks[0]['rev'] ) ? $newtalks[0]['rev'] : null;
+ $lastSeenRev = $newtalks[0]['rev'] ?? null;
$nofAuthors = 0;
if ( $lastSeenRev !== null ) {
$plural = true; // Default if we have a last seen revision: if unknown, use plural
$field['__index'] = $i++;
}
uasort( $formDescriptor, function ( $first, $second ) {
- return self::getField( $first, 'weight', 0 ) - self::getField( $second, 'weight', 0 )
- ?: $first['__index'] - $second['__index'];
+ return self::getField( $first, 'weight', 0 ) <=> self::getField( $second, 'weight', 0 )
+ ?: $first['__index'] <=> $second['__index'];
} );
foreach ( $formDescriptor as &$field ) {
unset( $field['__index'] );
* @return ChangesListFilterGroup|null Group, or null if not registered
*/
public function getFilterGroup( $groupName ) {
- return isset( $this->filterGroups[$groupName] ) ?
- $this->filterGroups[$groupName] :
- null;
+ return $this->filterGroups[$groupName] ?? null;
}
// Currently, this intentionally only includes filters that display
];
usort( $this->filterGroups, function ( $a, $b ) {
- return $b->getPriority() - $a->getPriority();
+ return $b->getPriority() <=> $a->getPriority();
} );
foreach ( $this->filterGroups as $groupName => $group ) {
unset( $legendItems['unpatrolled'] );
}
foreach ( $legendItems as $key => $item ) { # generate items of the legend
- $label = isset( $item['legend'] ) ? $item['legend'] : $item['title'];
+ $label = $item['legend'] ?? $item['title'];
$letter = $item['letter'];
- $cssClass = isset( $item['class'] ) ? $item['class'] : $key;
+ $cssClass = $item['class'] ?? $key;
$legend .= Html::element( 'dt',
[ 'class' => $cssClass ], $context->msg( $letter )->text()
$i = 0;
foreach ( $res as $row ) {
$i++;
- $namespace = isset( $row->namespace ) ? $row->namespace : NS_FILE;
+ $namespace = $row->namespace ?? NS_FILE;
$title = Title::makeTitleSafe( $namespace, $row->title );
if ( $title instanceof Title && $title->getNamespace() == NS_FILE ) {
$gallery->add( $title, $this->getCellHtml( $row ) );
// keep the ordering from getCoreFieldDescriptors() where there is no explicit weight
foreach ( $coreFieldDescriptors as $fieldName => $coreField ) {
- $requestField = isset( $formDescriptor[$fieldName] ) ?
- $formDescriptor[$fieldName] : [];
+ $requestField = $formDescriptor[$fieldName] ?? [];
// remove everything that is not in the fieldinfo, is not marked as a supplemental field
// to something in the fieldinfo, is not B/C for the pre-AuthManager templates,
}
$title = Title::makeTitle( intval( $row->namespace ), $row->title );
if ( $title ) {
- $date = isset( $row->timestamp ) ? $row->timestamp : '';
+ $date = $row->timestamp ?? '';
$comments = '';
if ( $title ) {
$talkpage = $title->getTalkPage();
}
function feedItemAuthor( $row ) {
- return isset( $row->user_text ) ? $row->user_text : '';
+ return $row->user_text ?? '';
}
function feedTitle() {
$linkRenderer = $this->getLinkRenderer();
foreach ( $allGroups as $group ) {
- $permissions = isset( $groupPermissions[$group] )
- ? $groupPermissions[$group]
- : [];
+ $permissions = $groupPermissions[$group] ?? [];
$groupname = ( $group == '*' ) // Replace * with a more descriptive groupname
? 'all'
: $group;
$grouplink = '';
}
- $revoke = isset( $revokePermissions[$group] ) ? $revokePermissions[$group] : [];
- $addgroups = isset( $addGroups[$group] ) ? $addGroups[$group] : [];
- $removegroups = isset( $removeGroups[$group] ) ? $removeGroups[$group] : [];
- $addgroupsSelf = isset( $groupsAddToSelf[$group] ) ? $groupsAddToSelf[$group] : [];
- $removegroupsSelf = isset( $groupsRemoveFromSelf[$group] )
- ? $groupsRemoveFromSelf[$group]
- : [];
+ $revoke = $revokePermissions[$group] ?? [];
+ $addgroups = $addGroups[$group] ?? [];
+ $removegroups = $removeGroups[$group] ?? [];
+ $addgroupsSelf = $groupsAddToSelf[$group] ?? [];
+ $removegroupsSelf = $groupsRemoveFromSelf[$group] ?? [];
$id = $group == '*' ? false : Sanitizer::escapeIdForAttribute( $group );
$out->addHTML( Html::rawElement( 'tr', [ 'id' => $id ], "
$this->totalCount = $this->totalBytes = 0;
foreach ( $res as $row ) {
$mediaStats = $this->splitFakeTitle( $row->title );
- $this->totalCount += isset( $mediaStats[2] ) ? $mediaStats[2] : 0;
- $this->totalBytes += isset( $mediaStats[3] ) ? $mediaStats[3] : 0;
+ $this->totalCount += $mediaStats[2] ?? 0;
+ $this->totalBytes += $mediaStats[3] ?? 0;
}
$res->seek( 0 );
}
}
protected function feedItemAuthor( $row ) {
- return isset( $row->rc_user_text ) ? $row->rc_user_text : '';
+ return $row->rc_user_text ?? '';
}
protected function feedItemDesc( $row ) {
* @return Status
*/
public function onSubmit( array $data ) {
- $username = isset( $data['Username'] ) ? $data['Username'] : null;
- $email = isset( $data['Email'] ) ? $data['Email'] : null;
+ $username = $data['Username'] ?? null;
+ $email = $data['Email'] ?? null;
$this->method = $username ? 'username' : 'email';
$this->result = Status::wrap(
}
if ( $add ) {
foreach ( $add as $index => $group ) {
- $expiry = isset( $groupExpiries[$group] ) ? $groupExpiries[$group] : null;
+ $expiry = $groupExpiries[$group] ?? null;
if ( !$user->addGroup( $group, $expiry ) ) {
unset( $add[$index] );
}
}
$software[$dbr->getSoftwareLink()] = $dbr->getServerInfo();
- $software['[http://site.icu-project.org/ ICU]'] = INTL_ICU_VERSION;
+ if ( defined( 'INTL_ICU_VERSION' ) ) {
+ $software['[http://site.icu-project.org/ ICU]'] = INTL_ICU_VERSION;
+ }
// Allow a hook to add/remove items.
Hooks::run( 'SoftwareInfo', [ &$software ] );
public static function getExtensionTypeName( $type ) {
$types = self::getExtensionTypes();
- return isset( $types[$type] ) ? $types[$type] : $types['other'];
+ return $types[$type] ?? $types['other'];
}
/**
* @return int
*/
public function compare( $a, $b ) {
- if ( $a['name'] === $b['name'] ) {
- return 0;
- } else {
- return $this->getLanguage()->lc( $a['name'] ) > $this->getLanguage()->lc( $b['name'] )
- ? 1
- : -1;
- }
+ return $this->getLanguage()->lc( $a['name'] ) <=> $this->getLanguage()->lc( $b['name'] );
}
/**
$description = $out->parseInline( $description );
// ... now get the authors for this extension
- $authors = isset( $extension['author'] ) ? $extension['author'] : [];
+ $authors = $extension['author'] ?? [];
$authors = $this->listAuthors( $authors, $extension['name'], $extensionPath );
// Finally! Create the table
} else {
$plink = $this->getLinkRenderer()->makeLink( $nt, $text );
- $currentValue = isset( $this->currentCategoryCounts[$result->title] )
- ? $this->currentCategoryCounts[$result->title]
- : 0;
+ $currentValue = $this->currentCategoryCounts[$result->title] ?? 0;
$cachedValue = intval( $result->value ); // T76910
// If the category has been created or emptied since the list was refreshed, strike it
$out->addHTML( $this->getFilterPanel() );
}
$msgKey = is_int( $namespace ) ? 'nolinkshere-ns-2' : 'nolinkshere-2';
- $link = $this->getLinkRenderer()->makeKnownLink(
+ $link = $this->getLinkRenderer()->makeLink(
$this->target,
null,
[],
$this->target->isRedirect() ? [ 'redirect' => 'no' ] : []
);
- $errMsg = $this->msg( $msgKey )->rawParams( $link )->parseAsBlock();
+ $errMsg = $this->msg( $msgKey )
+ ->params( $this->target->getPrefixedText() )
+ ->rawParams( $link )
+ ->parseAsBlock();
$out->addHTML( $errMsg );
$out->setStatusCode( 404 );
}
$out->addHTML( $this->whatlinkshereForm() );
$out->addHTML( $this->getFilterPanel() );
- $link = $this->getLinkRenderer()->makeKnownLink(
+ $link = $this->getLinkRenderer()->makeLink(
$this->target,
null,
[],
$this->target->isRedirect() ? [ 'redirect' => 'no' ] : []
);
- $msg = $this->msg( 'linkshere-2' )->rawParams( $link )->parseAsBlock();
+ $msg = $this->msg( 'linkshere-2' )
+ ->params( $this->target->getPrefixedText() )
+ ->rawParams( $link )
+ ->parseAsBlock();
$out->addHTML( $msg );
$prevnext = $this->getPrevNext( $prevId, $nextId );
* @return int
*/
function getSize() {
- return isset( $this->mParams['size'] )
- ? $this->mParams['size']
- : 60;
+ return $this->mParams['size'] ?? 60;
}
}
foreach ( $this->mFlatFields as $fieldname => $field ) {
if ( $field instanceof HTMLNestedFilterable ) {
$info = $field->mParams;
- $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
+ $prefix = $info['prefix'] ?? $fieldname;
foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
$data["$prefix$key"] = $value;
}
foreach ( $this->mFlatFields as $fieldname => $field ) {
if ( $field instanceof HTMLNestedFilterable ) {
$info = $field->mParams;
- $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
+ $prefix = $info['prefix'] ?? $fieldname;
foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
$data["$prefix$key"] = $value;
}
$this->mWatch = !empty( $options['watch'] );
$this->mForReUpload = !empty( $options['forreupload'] );
- $this->mSessionKey = isset( $options['sessionkey'] ) ? $options['sessionkey'] : '';
+ $this->mSessionKey = $options['sessionkey'] ?? '';
$this->mHideIgnoreWarning = !empty( $options['hideignorewarning'] );
$this->mDestWarningAck = !empty( $options['destwarningack'] );
- $this->mDestFile = isset( $options['destfile'] ) ? $options['destfile'] : '';
+ $this->mDestFile = $options['destfile'] ?? '';
- $this->mComment = isset( $options['description'] ) ?
- $options['description'] : '';
+ $this->mComment = $options['description'] ?? '';
- $this->mTextTop = isset( $options['texttop'] )
- ? $options['texttop'] : '';
+ $this->mTextTop = $options['texttop'] ?? '';
- $this->mTextAfterSummary = isset( $options['textaftersummary'] )
- ? $options['textaftersummary'] : '';
+ $this->mTextAfterSummary = $options['textaftersummary'] ?? '';
$sourceDescriptor = $this->getSourceSection();
$descriptor = $sourceDescriptor
$this->messages[$msg] = $this->msg( $msg )->escaped();
}
- $this->target = isset( $options['target'] ) ? $options['target'] : '';
- $this->contribs = isset( $options['contribs'] ) ? $options['contribs'] : 'users';
- $this->namespace = isset( $options['namespace'] ) ? $options['namespace'] : '';
- $this->tagFilter = isset( $options['tagfilter'] ) ? $options['tagfilter'] : false;
- $this->nsInvert = isset( $options['nsInvert'] ) ? $options['nsInvert'] : false;
- $this->associated = isset( $options['associated'] ) ? $options['associated'] : false;
+ $this->target = $options['target'] ?? '';
+ $this->contribs = $options['contribs'] ?? 'users';
+ $this->namespace = $options['namespace'] ?? '';
+ $this->tagFilter = $options['tagfilter'] ?? false;
+ $this->nsInvert = $options['nsInvert'] ?? false;
+ $this->associated = $options['associated'] ?? false;
$this->deletedOnly = !empty( $options['deletedOnly'] );
$this->topOnly = !empty( $options['topOnly'] );
* @return array Options array with processed start and end date filter options
*/
public static function processDateFilter( array $opts ) {
- $start = isset( $opts['start'] ) ? $opts['start'] : '';
- $end = isset( $opts['end'] ) ? $opts['end'] : '';
- $year = isset( $opts['year'] ) ? $opts['year'] : '';
- $month = isset( $opts['month'] ) ? $opts['month'] : '';
+ $start = $opts['start'] ?? '';
+ $end = $opts['end'] ?? '';
+ $year = $opts['year'] ?? '';
+ $month = $opts['month'] ?? '';
if ( $start !== '' && $end !== '' && $start > $end ) {
$temp = $start;
'comment' => CommentStore::getStore()->getComment( 'ar_comment', $row )->text,
'user' => $row->ar_user,
'user_text' => $row->ar_user_text,
- 'actor' => isset( $row->ar_actor ) ? $row->ar_actor : null,
+ 'actor' => $row->ar_actor ?? null,
'timestamp' => $row->ar_timestamp,
'minor_edit' => $row->ar_minor_edit,
'deleted' => $row->ar_deleted,
$user = User::newFromId( $uid );
return $user->getGroupMemberships();
} else {
- return isset( $cache[$uid] ) ? $cache[$uid] : [];
+ return $cache[$uid] ?? [];
}
}
# look up scanner configuration
$command = $wgAntivirusSetup[$wgAntivirus]['command'];
$exitCodeMap = $wgAntivirusSetup[$wgAntivirus]['codemap'];
- $msgPattern = isset( $wgAntivirusSetup[$wgAntivirus]['messagepattern'] ) ?
- $wgAntivirusSetup[$wgAntivirus]['messagepattern'] : null;
+ $msgPattern = $wgAntivirusSetup[$wgAntivirus]['messagepattern'] ?? null;
if ( strpos( $command, "%f" ) === false ) {
# simple pattern: append file to scan
'bp_user' => 0,
'bp_app_id' => isset( $data['appId'] ) ? trim( $data['appId'] ) : '',
'bp_token' => '**unsaved**',
- 'bp_restrictions' => isset( $data['restrictions'] )
- ? $data['restrictions']
- : MWRestrictions::newDefault(),
- 'bp_grants' => isset( $data['grants'] ) ? $data['grants'] : [],
+ 'bp_restrictions' => $data['restrictions'] ?? MWRestrictions::newDefault(),
+ 'bp_grants' => $data['grants'] ?? [],
];
if (
if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
( isset( $info['class'] ) && $info['class'] == HTMLMultiSelectField::class ) ) {
$opts = HTMLFormField::flattenOptions( $info['options'] );
- $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+ $prefix = $info['prefix'] ?? $name;
foreach ( $opts as $value ) {
$multiselectOptions["$prefix$value"] = true;
( isset( $info['class'] ) && $info['class'] == HTMLCheckMatrix::class ) ) {
$columns = HTMLFormField::flattenOptions( $info['columns'] );
$rows = HTMLFormField::flattenOptions( $info['rows'] );
- $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+ $prefix = $info['prefix'] ?? $name;
foreach ( $columns as $column ) {
foreach ( $rows as $row ) {
$joinConds
);
- $limit = isset( $dbOptions['LIMIT'] ) ? $dbOptions['LIMIT'] : INF;
+ $limit = $dbOptions['LIMIT'] ?? INF;
$items = [];
$startFrom = null;
foreach ( $res as $row ) {
$config['title'],
[
'relative' => true,
- 'namespace' => isset( $config['namespace']['value'] ) ?
- $config['namespace']['value'] :
- null,
+ 'namespace' => $config['namespace']['value'] ?? null,
]
) );
parent::__construct( $options );
$this->noDatePicker = $options['noDatePicker'];
- $this->required = isset( $options['required'] ) ? $options['required'] : false;
+ $this->required = $options['required'] ?? false;
// Properties
$this->relativeInput = $relativeInput;
parent::__construct( $config );
// Properties
- $this->includeAllValue = isset( $config['includeAllValue'] ) ? $config['includeAllValue'] : null;
- $this->exclude = isset( $config['exclude'] ) ? $config['exclude'] : [];
+ $this->includeAllValue = $config['includeAllValue'] ?? null;
+ $this->exclude = $config['exclude'] ?? [];
// Initialization
$this->addClasses( [ 'mw-widget-namespaceInputWidget' ] );
protected function getNamespaceDropdownOptions( array $config ) {
$namespaceOptionsParams = [
- 'all' => isset( $config['includeAllValue'] ) ? $config['includeAllValue'] : null,
- 'exclude' => isset( $config['exclude'] ) ? $config['exclude'] : null
+ 'all' => $config['includeAllValue'] ?? null,
+ 'exclude' => $config['exclude'] ?? null
];
$namespaceOptions = \Html::namespaceSelectorOptions( $namespaceOptionsParams );
}
// get the language object to process
- $langObj = isset( self::$mLangObjCache[$code] )
- ? self::$mLangObjCache[$code]
- : self::newFromCode( $code );
+ $langObj = self::$mLangObjCache[$code] ?? self::newFromCode( $code );
// merge the language object in to get it up front in the cache
self::$mLangObjCache = array_merge( [ $code => $langObj ], self::$mLangObjCache );
*/
public function getNsText( $index ) {
$ns = $this->getNamespaces();
- return isset( $ns[$index] ) ? $ns[$index] : false;
+ return $ns[$index] ?? false;
}
/**
$ns = $wgExtraGenderNamespaces +
(array)self::$dataCache->getItem( $this->mCode, 'namespaceGenderAliases' );
- return isset( $ns[$index][$gender] ) ? $ns[$index][$gender] : $this->getNsText( $index );
+ return $ns[$index][$gender] ?? $this->getNsText( $index );
}
/**
function getLocalNsIndex( $text ) {
$lctext = $this->lc( $text );
$ids = $this->getNamespaceIds();
- return isset( $ids[$lctext] ) ? $ids[$lctext] : false;
+ return $ids[$lctext] ?? false;
}
/**
return $ns;
}
$ids = $this->getNamespaceIds();
- return isset( $ids[$lctext] ) ? $ids[$lctext] : false;
+ return $ids[$lctext] ?? false;
}
/**
if ( $gender === 'female' ) {
return $forms[1];
}
- return isset( $forms[2] ) ? $forms[2] : $forms[0];
+ return $forms[2] ?? $forms[0];
}
/**
"whatlinkshere": "Peunawôt balék",
"whatlinkshere-title": "Laman nyang mupawôt u $1",
"whatlinkshere-page": "Miëng:",
- "linkshere-2": "Laman-laman nyoë meupawôt u '''$1''':",
- "nolinkshere-2": "Hana halaman nyang teukaw'et u '''$1'''.",
+ "linkshere-2": "Laman-laman nyoë meupawôt u '''$2''':",
+ "nolinkshere-2": "Hana halaman nyang teukaw'et u '''$2'''.",
"isredirect": "laman peuninah",
"istemplate": "ngön seunaleuëk",
"isimage": "peunawôt beureukaih",
"whatlinkshere": "Мы нэкӀубгъом къэзыщэрэ зэпыщэхэр",
"whatlinkshere-title": "\"$1\"-м къэзыщэрэ нэкӀубгъохэр",
"whatlinkshere-page": "НэкӀубгъо:",
- "linkshere-2": "Мы нэкӀубгъомэ зэпыщэр мыщ къащэ <strong>$1</strong>:",
+ "linkshere-2": "Мы нэкӀубгъомэ зэпыщэр мыщ къащэ <strong>$2</strong>:",
"isredirect": "езгъэкӀокӀырэ нэкӀубгъо",
"istemplate": "хэлъхьаныгъэ",
"isimage": "файл зэпыщэ",
"sp-contributions-toponly": "أظهر أعلى المراجعات فقط",
"whatlinkshere-title": "الصفحات التي تصل إلى \"$1\"",
"whatlinkshere-page": "الپاج:",
- "linkshere-2": "الصفحات التالية تصل إلى '''$1''':",
- "nolinkshere-2": "لا توجد صفحات تصل إلى '''$1'''.",
+ "linkshere-2": "الصفحات التالية تصل إلى '''$2''':",
+ "nolinkshere-2": "لا توجد صفحات تصل إلى '''$2'''.",
"isredirect": "صفحة تحويل",
"istemplate": "مضمن",
"isimage": "وصلة ملف",
"whatlinkshere": "Skakels hierheen",
"whatlinkshere-title": "Bladsye wat na \"$1\" skakel",
"whatlinkshere-page": "Bladsy:",
- "linkshere-2": "Die volgende bladsye skakel na '''$1''':",
- "nolinkshere-2": "Geen bladsye skakel na '''$1'''.",
- "nolinkshere-ns-2": "Geen bladsye skakel na '''$1''' in die verkose naamruimte nie.",
+ "linkshere-2": "Die volgende bladsye skakel na '''$2''':",
+ "nolinkshere-2": "Geen bladsye skakel na '''$2'''.",
+ "nolinkshere-ns-2": "Geen bladsye skakel na '''$2''' in die verkose naamruimte nie.",
"isredirect": "aanstuurblad",
"istemplate": "insluiting",
"isimage": "lêerskakel",
"whatlinkshere": "masasiket katukuh uyniyay a kasabelih",
"whatlinkshere-title": "masasiket tayza \"$1\" a kasabelih",
"whatlinkshere-page": "Kasabelih:",
- "linkshere-2": "isasaay a kasabelih masasiket tazuma tu <strong>$1</strong>:",
- "nolinkshere-2": "No pages link to <strong>$1</strong>.",
- "nolinkshere-ns-2": "mapili’ay a pangangananay a salaedan inayi’ kasabelih masasiket tu $1.",
+ "linkshere-2": "isasaay a kasabelih masasiket tazuma tu <strong>$2</strong>:",
+ "nolinkshere-2": "No pages link to <strong>$2</strong>.",
+ "nolinkshere-ns-2": "mapili’ay a pangangananay a salaedan inayi’ kasabelih masasiket tu $2.",
"isredirect": "miliyaw patatuzu’",
"istemplate": "palaculen tu kasabelih",
"isimage": "tangan-tangan misiket",
"whatlinkshere": "Vegzat me këtu",
"whatlinkshere-title": "Faqe që lidhen me \"$1\"",
"whatlinkshere-page": "Faqja:",
- "linkshere-2": "Faqet e mâposhtme lidhen në '''$1''':",
+ "linkshere-2": "Faqet e mâposhtme lidhen në '''$2''':",
"isredirect": "faqe përcjellëse",
"istemplate": "përfshirë",
"isimage": "vegëz në figurë",
"whatlinkshere": "ወዲህ የሚያያዝ",
"whatlinkshere-title": "ከ «$1» ጋር የሚያያዙ ገጾች",
"whatlinkshere-page": "ለገጽ (አርዕስት)፦",
- "linkshere-2": "የሚከተሉት ገጾች ወደ '''$1''' ተያይዘዋል።",
- "nolinkshere-2": "ወደ '''$1''' የተያያዘ ገጽ የለም።",
- "nolinkshere-ns-2": "ባመለከቱት ክፍለ-ዊኪ ወደ '''$1''' የተያያዘ ገጽ የለም።",
+ "linkshere-2": "የሚከተሉት ገጾች ወደ '''$2''' ተያይዘዋል።",
+ "nolinkshere-2": "ወደ '''$2''' የተያያዘ ገጽ የለም።",
+ "nolinkshere-ns-2": "ባመለከቱት ክፍለ-ዊኪ ወደ '''$2''' የተያያዘ ገጽ የለም።",
"isredirect": "መምሪያ መንገድ",
"istemplate": "የተሰካ",
"isimage": "የምስል ማያያዣ",
"whatlinkshere": "Pachinas que enlazan con ista",
"whatlinkshere-title": "Pachinas que tienen vinclos ta $1",
"whatlinkshere-page": "Pachina:",
- "linkshere-2": "As siguients pachinas tienen vinclos enta '''$1''':",
- "nolinkshere-2": "Garra pachina tiene vinclos ta '''$1'''.",
- "nolinkshere-ns-2": "Garra pachina d'o espacio de nombres trigato tiene vinclos ta '''$1'''.",
+ "linkshere-2": "As siguients pachinas tienen vinclos enta '''$2''':",
+ "nolinkshere-2": "Garra pachina tiene vinclos ta '''$2'''.",
+ "nolinkshere-ns-2": "Garra pachina d'o espacio de nombres trigato tiene vinclos ta '''$2'''.",
"isredirect": "pachina reendrezata",
"istemplate": "incluyida",
"isimage": "Vinclo ta un fichero",
"whatlinkshere": "Hwæt hæfþ hlencan hider",
"whatlinkshere-title": "Trametas þā habbaþ hlencan tō \"$1\"",
"whatlinkshere-page": "Tramet:",
- "linkshere-2": "Þā folgiendan trametas habbaþ hlencan tō: '''$1'''",
- "nolinkshere-2": "Nǣnge trametas habbaþ hlencan tō '''$1'''.",
+ "linkshere-2": "Þā folgiendan trametas habbaþ hlencan tō: '''$2'''",
+ "nolinkshere-2": "Nǣnge trametas habbaþ hlencan tō '''$2'''.",
"isredirect": "edlǣdunge tramet",
"istemplate": "bysene nytt",
"isimage": "ymelan hlenca",
"whatlinkshere": "एन्जां की जुड़तै",
"whatlinkshere-title": "$1 सं॑ जुड़लऽ पन्ना",
"whatlinkshere-page": "पन्ना:",
- "linkshere-2": "नीचे के सब पन्ना '''$1''' स॑ जुड़लऽ:",
- "nolinkshere-2": "<strong>$1</strong> स॑ कोय भी पन्ना नै जुड़लऽ छै।",
+ "linkshere-2": "नीचे के सब पन्ना '''$2''' स॑ जुड़लऽ:",
+ "nolinkshere-2": "<strong>$2</strong> स॑ कोय भी पन्ना नै जुड़लऽ छै।",
"isredirect": "पुन: निर्दिष्ट पन्ना",
"istemplate": "मिलाबऽ",
"isimage": "फाइल लिंक",
"whatlinkshere": "ماذا يصل هنا",
"whatlinkshere-title": "الصفحات التي تصل إلى \"$1\"",
"whatlinkshere-page": "الصفحة:",
- "linkshere-2": "الصفحات التالية تصل إلى '''$1''':",
- "nolinkshere-2": "لا توجد صفحات تصل إلى '''$1'''.",
- "nolinkshere-ns-2": "لا تصل أي صفحة إلى '''$1''' في النطاق المختار.",
+ "linkshere-2": "الصفحات التالية تصل إلى '''$2''':",
+ "nolinkshere-2": "لا توجد صفحات تصل إلى '''$2'''.",
+ "nolinkshere-ns-2": "لا تصل أي صفحة إلى '''$2''' في النطاق المختار.",
"isredirect": "صفحة تحويل",
"istemplate": "مضمن",
"isimage": "وصلة ملف",
"whatlinkshere": "ܡܐ ܐܣܪ ܠܗܪܟܐ",
"whatlinkshere-title": "ܦܐܬܬ̈ܐ ܕܐܣܝܪܝܢ ܥܡ \"$1\"",
"whatlinkshere-page": "ܦܐܬܐ:",
- "linkshere-2": "ܦܐܬܬ̈ܐ ܗܠܝܢ ܐܣܝܪܝܢ ܥܡ '''$1''':",
- "nolinkshere-2": "ܠܝܬ ܦܐܬܬ̈ܐ ܐܣܪܝܢ ܥܡ '''$1'''.",
- "nolinkshere-ns-2": "ܠܝܬ ܦܐܬܬ̈ܐ ܐܣܪܝܢ ܥܡ '''$1''' ܒܚܩܠܐ ܓܒܝܐ.",
+ "linkshere-2": "ܦܐܬܬ̈ܐ ܗܠܝܢ ܐܣܝܪܝܢ ܥܡ '''$2''':",
+ "nolinkshere-2": "ܠܝܬ ܦܐܬܬ̈ܐ ܐܣܪܝܢ ܥܡ '''$2'''.",
+ "nolinkshere-ns-2": "ܠܝܬ ܦܐܬܬ̈ܐ ܐܣܪܝܢ ܥܡ '''$2''' ܒܚܩܠܐ ܓܒܝܐ.",
"isredirect": "ܦܐܬܐ ܕܨܘܝܒܐ",
"istemplate": "ܚܒܝܫܬܐ",
"isimage": "ܐܣܘܪܐ ܕܠܦܦܐ",
"whatlinkshere": "Lasulu faw püle",
"whatlinkshere-title": "Wülngiñ nülkükawlelu \"$1\"",
"whatlinkshere-page": "Pakina:",
- "linkshere-2": "Tüfachi wülngiñ nülkükawley '''$1''':",
- "nolinkshere-2": "Chem wülngiñ no rume nülkükawlelu '''$1'''.",
+ "linkshere-2": "Tüfachi wülngiñ nülkükawley '''$2''':",
+ "nolinkshere-2": "Chem wülngiñ no rume nülkükawlelu '''$2'''.",
"isredirect": "wüñongünen wülngiñ",
"istemplate": "yomtukudungu",
"isimage": "Adentun lasun",
"whatlinkshere": "شنوّ يوصّل ل هنا",
"whatlinkshere-title": "الباجات اللي تقين في \"$1\"",
"whatlinkshere-page": "الباجه:",
- "linkshere-2": "هاذ الباجات يوصلو إلى '''$1''':",
- "nolinkshere-2": "ما كانش باجه فيها وصيله ل'''$1'''.",
+ "linkshere-2": "هاذ الباجات يوصلو إلى '''$2''':",
+ "nolinkshere-2": "ما كانش باجه فيها وصيله ل'''$2'''.",
"isredirect": "باجت تحويل",
"istemplate": "تضمين",
"isimage": "وصيلة ملف",
"whatlinkshere": "Ṣefḫaṫ mlaqyin",
"whatlinkshere-title": "Ṣ-Ṣefḫaṫ li mlaqyin mĝa \"$1\"",
"whatlinkshere-page": "ṣfḫa:",
- "linkshere-2": "Had ṣ-ṣefḫaṫ kayddiw le '''$1''':",
- "nolinkshere-2": "ḫṫa ċi ṣfḫa ma ka-twṣṣel l-'''$1'''.",
- "nolinkshere-ns-2": "ḫṫṫĝ ṣfḫa ma ka-twṣṣal l-'''$1''' f-nnitaq lli ĥṫariṫi",
+ "linkshere-2": "Had ṣ-ṣefḫaṫ kayddiw le '''$2''':",
+ "nolinkshere-2": "ḫṫa ċi ṣfḫa ma ka-twṣṣel l-'''$2'''.",
+ "nolinkshere-ns-2": "ḫṫṫĝ ṣfḫa ma ka-twṣṣal l-'''$2''' f-nnitaq lli ĥṫariṫi",
"isredirect": "Ṫeḫwil ṣ-ṣefḫa",
"istemplate": "Daĥel",
"isimage": "wṣlṫ l-milef",
"whatlinkshere": "ايه بيوصل هنا",
"whatlinkshere-title": "الصفحات اللى بتوصل لـ \"$1\"",
"whatlinkshere-page": "الصفحة:",
- "linkshere-2": "الصفحات دى فيها وصله ل '''$1''':",
- "nolinkshere-2": "مافيش صفحات بتوصل ل '''$1'''.",
- "nolinkshere-ns-2": "مافيش صفحات بتوصل لـ '''$1''' فى النطاق اللى انت اختارته.",
+ "linkshere-2": "الصفحات دى فيها وصله ل '''$2''':",
+ "nolinkshere-2": "مافيش صفحات بتوصل ل '''$2'''.",
+ "nolinkshere-ns-2": "مافيش صفحات بتوصل لـ '''$2''' فى النطاق اللى انت اختارته.",
"isredirect": "صفحة تحويل",
"istemplate": "متضمن",
"isimage": "وصلة ملف",
"whatlinkshere": "ইয়ালৈ থকা সংযোগসমূহ",
"whatlinkshere-title": "\"$1\"লৈ সংযোজিত পৃষ্ঠাসমূহ",
"whatlinkshere-page": "পৃষ্ঠা:",
- "linkshere-2": "এই পৃষ্ঠাটো '''$1''' ৰ লগত সংযোজিত:",
- "nolinkshere-2": "'''$1''' ৰ লগত কোনো পৃষ্ঠা সংযোজিত নহয়।",
- "nolinkshere-ns-2": "নিৰ্বাচিত নামস্থানৰ কোনো পৃষ্ঠাৰ পৰা $1লৈ সংযোগ নাই ।",
+ "linkshere-2": "এই পৃষ্ঠাটো '''$2''' ৰ লগত সংযোজিত:",
+ "nolinkshere-2": "'''$2''' ৰ লগত কোনো পৃষ্ঠা সংযোজিত নহয়।",
+ "nolinkshere-ns-2": "নিৰ্বাচিত নামস্থানৰ কোনো পৃষ্ঠাৰ পৰা $2লৈ সংযোগ নাই ।",
"isredirect": "পুনঃনিৰ্দেশনা পৃষ্ঠা",
"istemplate": "অন্তৰ্ভুক্ত কৰক",
"isimage": "নথিৰ সংযোগ",
"whatlinkshere": "Lo qu'enllaza equí",
"whatlinkshere-title": "Páxines qu’enllacien a «$1»",
"whatlinkshere-page": "Páxina:",
- "linkshere-2": "Les páxines siguientes enllacien a '''$1''':",
- "nolinkshere-2": "Nenguna páxina enllaza a '''$1'''.",
- "nolinkshere-ns-2": "Nenguna páxina enllaza con <strong>$1</strong> nel espaciu de nomes escoyíu.",
+ "linkshere-2": "Les páxines siguientes enllacien a '''$2''':",
+ "nolinkshere-2": "Nenguna páxina enllaza a '''$2'''.",
+ "nolinkshere-ns-2": "Nenguna páxina enllaza con <strong>$2</strong> nel espaciu de nomes escoyíu.",
"isredirect": "páxina de redireición",
"istemplate": "tresclusión",
"isimage": "enllaz al ficheru",
"whatlinkshere": "Kaskina ickwemakina ka witci acteki",
"whatlinkshere-title": "Masinahikan nte mia ka ici tapitik \"$1\"",
"whatlinkshere-page": "Masinahikan:",
- "linkshere-2": "Masinhikan ka ici tapitik <strong>$1</strong>:",
+ "linkshere-2": "Masinhikan ka ici tapitik <strong>$2</strong>:",
"isredirect": "masinhikan ke kweskiticohemikok",
"istemplate": "ka ki acotcipitcikatek",
"isimage": "e ici tapitik masinahikaniwoc",
"whatlinkshere": "Gluyarakiraf bueem",
"whatlinkshere-title": "Bu gluyasu va \"$1\"",
"whatlinkshere-page": "Bu :",
- "linkshere-2": "Van batu bu vlevef bueem va gluyasiki ruldar : '''$1'''",
- "nolinkshere-2": "Van batu bu nedoyu bu va gluyasiki ruldar : '''$1'''",
- "nolinkshere-ns-2": "Koe kiblayano yoltxo meku bu gluyasikikirafu gu '''$1'''.",
+ "linkshere-2": "Van batu bu vlevef bueem va gluyasiki ruldar : '''$2'''",
+ "nolinkshere-2": "Van batu bu nedoyu bu va gluyasiki ruldar : '''$2'''",
+ "nolinkshere-ns-2": "Koe kiblayano yoltxo meku bu gluyasikikirafu gu '''$2'''.",
"isredirect": "graskarabu",
"istemplate": "kodoplekura",
"isimage": "skedasiki va ewava",
"whatlinkshere": "हिँया का जोडान अहै",
"whatlinkshere-title": "$1 से जोडान पन्ना",
"whatlinkshere-page": "पन्ना:",
- "linkshere-2": "नीचे दिहा पन्ना '''$1''' से जोडान है:",
- "nolinkshere-2": "'''$1''' से कुछ नाइ जोडान् है।",
- "nolinkshere-ns-2": "चुनल नामस्थानसे '''$1''' से कवनो पन्ना नाइ जोडान् है।",
+ "linkshere-2": "नीचे दिहा पन्ना '''$2''' से जोडान है:",
+ "nolinkshere-2": "'''$2''' से कुछ नाइ जोडान् है।",
+ "nolinkshere-ns-2": "चुनल नामस्थानसे '''$2''' से कवनो पन्ना नाइ जोडान् है।",
"isredirect": "पुनर्निर्देशन पन्ना",
"istemplate": "मिलावा जाय",
"isimage": "फ़ाइल कय कड़ी",
"whatlinkshere": "Bu səhifəyə bağlantılar",
"whatlinkshere-title": "\"$1\" məqaləsinə keçid verən səhifələr",
"whatlinkshere-page": "Səhifə:",
- "linkshere-2": "'''$1''' səhifəsinə keçid verən səhifələr:",
- "nolinkshere-2": "<strong>$1</strong> səhifəsinə keçid verən səhifə yoxdur.",
- "nolinkshere-ns-2": "Seçilmiş ad aralığında heç bir səhifə '''$1''' səhifəsinə keçid vermir.",
+ "linkshere-2": "'''$2''' səhifəsinə keçid verən səhifələr:",
+ "nolinkshere-2": "<strong>$2</strong> səhifəsinə keçid verən səhifə yoxdur.",
+ "nolinkshere-ns-2": "Seçilmiş ad aralığında heç bir səhifə '''$2''' səhifəsinə keçid vermir.",
"isredirect": "İstiqamətləndirmə səhifəsi",
"istemplate": "daxil olmuş",
"isimage": "şəkil üçün keçid",
"whatlinkshere": "بۇ صفحهيه باغلانتیلار",
"whatlinkshere-title": "«$1»-ه باغلانان صفحهلر",
"whatlinkshere-page": "صفحه:",
- "linkshere-2": "آشاغیداکی صفحهلر '''$1'''-ه باغلانیب:",
- "nolinkshere-2": "<strong>$1</strong>-ه هئچ بیر صفحه باغلانماییبدیر.",
- "nolinkshere-ns-2": "سئچیلمیش آدفضاسیندا، هئچ صحیفه '''$1'''-ه باغلانتیسی یوخدور.",
+ "linkshere-2": "آشاغیداکی صفحهلر '''$2'''-ه باغلانیب:",
+ "nolinkshere-2": "<strong>$2</strong>-ه هئچ بیر صفحه باغلانماییبدیر.",
+ "nolinkshere-ns-2": "سئچیلمیش آدفضاسیندا، هئچ صحیفه '''$2'''-ه باغلانتیسی یوخدور.",
"isredirect": "یوللاندیرما صفحهسی",
"istemplate": "داخیل اولموش",
"isimage": "فایلا باغلانتی",
"whatlinkshere": "Бында һылтанмалар",
"whatlinkshere-title": "«$1» битенә һылтанған биттәр",
"whatlinkshere-page": "Бит:",
- "linkshere-2": "'''$1''' битенә киләһе биттәр һылтана:",
- "nolinkshere-2": "'''$1''' битенә бер бит тә һылтанмай.",
- "nolinkshere-ns-2": "'''$1''' битенә һайланған исемдәр арауығынан бер бит тә һылтанмай.",
+ "linkshere-2": "'''$2''' битенә киләһе биттәр һылтана:",
+ "nolinkshere-2": "'''$2''' битенә бер бит тә һылтанмай.",
+ "nolinkshere-ns-2": "'''$2''' битенә һайланған исемдәр арауығынан бер бит тә һылтанмай.",
"isredirect": "йүнәлтеү бите",
"istemplate": "ҡушылған",
"isimage": "файл һылтанмаһы",
"whatlinkshere": "Links af de Seitn",
"whatlinkshere-title": "Seitn, wo af „$1“ valinka",
"whatlinkshere-page": "Seitn:",
- "linkshere-2": "De foigandn Seitn valinka af '''„$1“''':",
- "nolinkshere-2": "Koa Seitn valinkt af '''„$1“'''.",
+ "linkshere-2": "De foigandn Seitn valinka af '''„$2“''':",
+ "nolinkshere-2": "Koa Seitn valinkt af '''„$2“'''.",
"isredirect": "Weidaloatungsseitn",
"istemplate": "Vorlogneinbindung",
"isimage": "Dateilink",
"whatlinkshere": "ای لینکی که ادا هست",
"whatlinkshere-title": "صفحاتی که لینگ بوتگنت په \"$1\"",
"whatlinkshere-page": "صفحه:",
- "linkshere-2": "جهلیگی صفحات لینک بوت '''$1''':",
- "nolinkshere-2": "هچ لینک صفحه ای په '''$1'''.",
- "nolinkshere-ns-2": "هج صفحه ای لینک نهنت په '''$1''' ته ای انتخابی نام فضا",
+ "linkshere-2": "جهلیگی صفحات لینک بوت '''$2''':",
+ "nolinkshere-2": "هچ لینک صفحه ای په '''$2'''.",
+ "nolinkshere-ns-2": "هج صفحه ای لینک نهنت په '''$2''' ته ای انتخابی نام فضا",
"isredirect": "صفحه غیر مستقیم",
"istemplate": "همراهی",
"isimage": "لینک عکس",
"whatlinkshere": "Ano an mga makasugpon digde",
"whatlinkshere-title": "Mga pahina na nakasugpon sa \"$1\"",
"whatlinkshere-page": "Pahina:",
- "linkshere-2": "An mga minasunod na pahina isinusugpon sa '''$1''':",
- "nolinkshere-2": "Mayong mga pahinang kasugpon sa '''$1'''.",
- "nolinkshere-ns-2": "Mayong pahina na nakatakod sa '''$1''' sa piniling ngaran-espacio.",
+ "linkshere-2": "An mga minasunod na pahina isinusugpon sa '''$2''':",
+ "nolinkshere-2": "Mayong mga pahinang kasugpon sa '''$2'''.",
+ "nolinkshere-ns-2": "Mayong pahina na nakatakod sa '''$2''' sa piniling ngaran-espacio.",
"isredirect": "palikwaton an pahina",
"istemplate": "pinagkabalihan",
"isimage": "kasugpon nin sagunson",
"ignorewarnings": "Ігнараваць усе папярэджаньні",
"minlength1": "Назва файлу павінна ўтрымліваць хаця б адну літару.",
"illegalfilename": "Назва файлу «$1» зьмяшчае сымбалі, якія нельга выкарыстоўваць у назвах старонак. Калі ласка, зьмяніце назву файлу і паспрабуйце загрузіць яго зноў.",
- "filename-toolong": "Назвы файлаў ня могуць быць даўжэй 240 байтаў.",
+ "filename-toolong": "Назвы файлаў ня могуць быць даўжэй за 240 байтаў.",
"badfilename": "Назва файла была зьмененая на «$1».",
"filetype-mime-mismatch": "Пашырэньне файла «.$1» не адпавядае выяўленаму MIME-тыпу файла ($2).",
"filetype-badmime": "Загрузка файлаў тыпу MIME «$1» забароненая.",
"whatlinkshere": "Спасылкі на старонку",
"whatlinkshere-title": "Старонкі, якія спасылаюцца на $1",
"whatlinkshere-page": "Старонка:",
- "linkshere-2": "Наступныя старонкі спасылаюцца на <strong>$1</strong>:",
- "nolinkshere-2": "Ніводная старонка не спасылаецца на <strong>$1</strong>.",
- "nolinkshere-ns-2": "Ніводная старонка не спасылаецца на '''$1''' з выбранай прасторы назваў.",
+ "linkshere-2": "Наступныя старонкі спасылаюцца на <strong>$2</strong>:",
+ "nolinkshere-2": "Ніводная старонка не спасылаецца на <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Ніводная старонка не спасылаецца на <strong>$2</strong> з абранай прасторы назваў.",
"isredirect": "старонка-перанакіраваньне",
"istemplate": "уключэньне",
"isimage": "спасылка на файл",
"passwordpolicies-policy-minimumpasswordlengthtologin": "Пароль мусіць мець даўжыню найменш $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}, каб уваходзіць у сыстэму",
"passwordpolicies-policy-passwordcannotmatchusername": "Пароль ня можа супадаць зь імем ўдзельніка",
"passwordpolicies-policy-passwordcannotmatchblacklist": "Пароль ня можа супадаць з паролямі з чорнага сьпісу",
- "passwordpolicies-policy-maximalpasswordlength": "Пароль мусіць быць даўжынёй менш за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}"
+ "passwordpolicies-policy-maximalpasswordlength": "Пароль мусіць быць даўжынёй менш за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}",
+ "passwordpolicies-policy-passwordcannotbepopular": "Пароль ня можа {{PLURAL:$1|супадаць з самым папулярным паролем|быць зь сьпісу $1 папулярных пароляў}}"
}
"whatlinkshere": "Сюды спасылаюцца",
"whatlinkshere-title": "Старонкі, якія спасылаюцца на \"$1\"",
"whatlinkshere-page": "Старонка:",
- "linkshere-2": "Наступныя старонкі спасылаюцца на <strong>$1</strong>:",
- "nolinkshere-2": "Няма старонак, якія б спасылаліся на '''$1'''.",
- "nolinkshere-ns-2": "Няма старонак, якія б спасылаліся на '''$1''' у гэтай прасторы назваў.",
+ "linkshere-2": "Наступныя старонкі спасылаюцца на <strong>$2</strong>:",
+ "nolinkshere-2": "Няма старонак, якія б спасылаліся на '''$2'''.",
+ "nolinkshere-ns-2": "Няма старонак, якія б спасылаліся на '''$2''' у гэтай прасторы назваў.",
"isredirect": "старонка-перасылка",
"istemplate": "уключэнне",
"isimage": "Спасылка на выяву",
"whatlinkshere": "Какво сочи насам",
"whatlinkshere-title": "Страници, които сочат към „$1“",
"whatlinkshere-page": "Страница:",
- "linkshere-2": "Следните страници сочат към <strong>$1</strong>:",
- "nolinkshere-2": "Няма страници, сочещи към <strong>$1</strong>.",
- "nolinkshere-ns-2": "Няма страници, сочещи към $1 в избраното именно пространство.",
+ "linkshere-2": "Следните страници сочат към <strong>$2</strong>:",
+ "nolinkshere-2": "Няма страници, сочещи към <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Няма страници, сочещи към $2 в избраното именно пространство.",
"isredirect": "пренасочваща страница",
"istemplate": "включване",
"isimage": "препратка към файла",
"whatlinkshere": "لینک په ای تاکدیما",
"whatlinkshere-title": "تاکدیمان که گو «$1» لینک دارنت",
"whatlinkshere-page": "تاکدیم:",
- "linkshere-2": "جهلگین دیم بئ '''$1''' ئا لینک داریت:",
- "nolinkshere-2": "هیچ دیمی بئ '''$1''' ئا لینک نه داریت.",
- "nolinkshere-ns-2": "هیچ دیمی شه انتخاب بوته ئین نامی فضائان بئ '''$1''' ئا لینک نداریت.",
+ "linkshere-2": "جهلگین دیم بئ '''$2''' ئا لینک داریت:",
+ "nolinkshere-2": "هیچ دیمی بئ '''$2''' ئا لینک نه داریت.",
+ "nolinkshere-ns-2": "هیچ دیمی شه انتخاب بوته ئین نامی فضائان بئ '''$2''' ئا لینک نداریت.",
"isredirect": "تاکدیمی تغییرمسیر داتین",
"istemplate": "تراگنجانشهان",
"isimage": "فایل لینک",
"whatlinkshere": "इहाँ का जुड़ल बा",
"whatlinkshere-title": "पन्ना जेवन \"$1\" से जुड़ल बा",
"whatlinkshere-page": "पन्ना:",
- "linkshere-2": "<strong>$1</strong> से नीचे दिहल पन्ना जुड़ल बाने:",
- "nolinkshere-2": "'''$1''' से कौनो पन्ना नइखे जुड़ल।",
- "nolinkshere-ns-2": "चुनल गईल सन्दर्भ में '''$1''' से कौनो पन्ना ना जुड़ेला।",
+ "linkshere-2": "<strong>$2</strong> से नीचे दिहल पन्ना जुड़ल बाने:",
+ "nolinkshere-2": "'''$2''' से कौनो पन्ना नइखे जुड़ल।",
+ "nolinkshere-ns-2": "चुनल गईल सन्दर्भ में '''$2''' से कौनो पन्ना ना जुड़ेला।",
"isredirect": "अनुप्रेषित पन्ना",
"istemplate": "ट्रांस्क्लूजन",
"isimage": "फाइल कड़ी",
"whatlinkshere": "Tautan apa di sia",
"whatlinkshere-title": "Tungkaran-tungkaran nang batautan ka ''$1''",
"whatlinkshere-page": "Tungkaran:",
- "linkshere-2": "Tungkaran-tungkaran barikut batautan ka '''$1''':",
- "nolinkshere-2": "Kadada tutungkaran tataut ka '''$1'''.",
- "nolinkshere-ns-2": "Kadada tutungkaran tataut ka '''$1''' dalam ruang-ngaran nang dipilih.",
+ "linkshere-2": "Tungkaran-tungkaran barikut batautan ka '''$2''':",
+ "nolinkshere-2": "Kadada tutungkaran tataut ka '''$2'''.",
+ "nolinkshere-ns-2": "Kadada tutungkaran tataut ka '''$2''' dalam ruang-ngaran nang dipilih.",
"isredirect": "tungkaran paugahan",
"istemplate": "transklusi",
"isimage": "tautan barakas",
"botpasswords-existing": "বিদ্যমান বট পাসওয়ার্ড",
"botpasswords-createnew": "একটি নতুন বট পাসওয়ার্ড তৈরি করুন",
"botpasswords-editexisting": "একটি বিদ্যমান বট পাসওয়ার্ড পরিবর্তন করুন",
+ "botpasswords-label-needsreset": "(পাসওয়ার্ড পুনঃস্থাপন করা প্রয়োজন)",
"botpasswords-label-appid": "বটের নাম:",
"botpasswords-label-create": "তৈরি করুন",
"botpasswords-label-update": "হালনাগাদ করুন",
"botpasswords-restriction-failed": "বট পাসওয়ার্ডের সীমাবদ্ধতার কারণে অ্যাকাউন্টে প্রবেশের এই প্রচেষ্টাটিকে প্রতিরোধ করা হয়েছে।",
"botpasswords-invalid-name": "নির্দিষ্টকৃত ব্যবহারকারী নামটিতে বট পাসওয়ার্ড পৃথকীকারক অক্ষরটি (\"$1\") নেই।",
"botpasswords-not-exist": "ব্যবহারকারী \"$1\"-এর \"$2\" নামক বট পাসওয়ার্ডটি নেই।",
+ "botpasswords-needs-reset": "{{GENDER:$1|ব্যবহারকারী}} \"$1\"-এর \"$2\" নামের বটের জন্য বট পাসওয়ার্ড অবশ্যই পুনঃস্থাপন করা প্রয়োজন।",
"resetpass_forbidden": "পাসওয়ার্ড পরিবর্তন করা সম্ভব নয়",
"resetpass_forbidden-reason": "পাসওয়ার্ড পরিবর্তন করা যাবে না: $1",
"resetpass-no-info": "এই পাতাটিতে সরাসরি প্রবেশাধিকার পেতে আপনাকে অবশ্যই অ্যাকাউন্টে প্রবেশ করতে হবে।",
"listusers-creationsort": "তৈরির তারিখ অনুসারে সাজাও",
"listusers-desc": "বড় থেকে ছোট ক্রম অনুযায়ী সাজাও",
"usereditcount": "$1 {{PLURAL:$1|সম্পাদনা|সম্পাদনা}}",
- "usercreated": "{{GENDER:$3|তà§\88রি হয়à§\87à¦\9bà§\87}} $1 তারিà¦\96, সময়: $2",
+ "usercreated": "{{GENDER:$3|তà§\88রি হবার}} তারিà¦\96 $1, সময় $2",
"newpages": "নতুন পাতাসমূহ",
"newpages-submit": "দেখাও",
"newpages-username": "ব্যবহারকারী নাম:",
"whatlinkshere": "সংযোগকারী পাতাসমূহ",
"whatlinkshere-title": "যে পাতাগুলি থেকে \"$1\"-এর প্রতি সংযোগ আছে",
"whatlinkshere-page": "পাতা:",
- "linkshere-2": "নিচের পাতাসমূহ '''$1''' পাতায় সংযুক্ত আছে:",
- "nolinkshere-2": "কোনো পাতা থেকে '''$1''' পাতায় সংযোগ নেই।",
- "nolinkshere-ns-2": "নির্বাচিত নামস্থানে '''$1'''-এর প্রতি কোন পাতা থেকে সংযোগ নেই।",
+ "linkshere-2": "নিচের পাতাসমূহ <strong>$2</strong> পাতায় সংযুক্ত আছে:",
+ "nolinkshere-2": "কোনো পাতা থেকে <strong>$2</strong> পাতায় সংযোগ নেই।",
+ "nolinkshere-ns-2": "নির্বাচিত নামস্থানে <strong>$2</strong> -এর প্রতি কোন পাতা থেকে সংযোগ নেই।",
"isredirect": "পুনর্নির্দেশ",
"istemplate": "অন্তর্ভুক্তি",
"isimage": "ফাইল সংযোগ",
"pagedata-title": "পাতার উপাত্ত",
"pagedata-not-acceptable": "কোন মিলে যাওয়া বিন্যাস পাওয়া যায় নি। সমর্থিত MIME ধরনগুলি হল: $1",
"pagedata-bad-title": "অপ্রযোজ্য শিরোনাম: \"$1\"",
+ "unregistered-user-config": "নিরাপত্তার কারণে জাভাস্ক্রিপ্ট, CSS এবং JSON ব্যবহারকারী উপপাতাগুলি অনিবন্ধিত ব্যবহারকারীদের জন্য লোড করা যাবে না।",
+ "passwordpolicies": "পাসওয়ার্ড নীতি",
+ "passwordpolicies-summary": "এটি এই উইকিতে সংজ্ঞায়িত ব্যবহারকারী দলের কার্যকর পাসওয়ার্ড নীতিগুলির একটি তালিকা।",
"passwordpolicies-group": "দল",
"passwordpolicies-policies": "নীতিসমূহ",
- "passwordpolicies-policy-minimalpasswordlength": "পাসওয়ার্ড অবশ্যই {{PLURAL:$1|১ অক্ষরের|$1 অক্ষরের}} হতে হবে"
+ "passwordpolicies-policy-minimalpasswordlength": "পাসওয়ার্ড অবশ্যই {{PLURAL:$1|১ অক্ষরের|$1 অক্ষরের}} হতে হবে",
+ "passwordpolicies-policy-passwordcannotmatchusername": "পাসওয়ার্ড ব্যবহারকারী নামের মত একই হতে পারে না",
+ "passwordpolicies-policy-passwordcannotmatchblacklist": "পাসওয়ার্ড বিশেষত কালো তালিকাভুক্ত পাসওয়ার্ডের সাথে মিলতে পারবে না",
+ "passwordpolicies-policy-maximalpasswordlength": "পাসওয়ার্ড $1 {{PLURAL:$1|অক্ষরের}} চেয়ে কম দীর্ঘ হতে হবে"
}
"whatlinkshere": "གང་དང་སྦྲེལ་བ།",
"whatlinkshere-title": "\"$1\" ལ སྦྲེལ་ཡོད་པའི་ཤོག་ངོས།",
"whatlinkshere-page": "ཤོག་ངོས།",
- "linkshere-2": "གཤམ་གྱི་ཤོག་ངོས་རྣམས་ '''$1''': ལ་སྦྲེལ་ཡོད།",
- "nolinkshere-2": "<strong>$1</strong> ཤོག་ངོས་གཅིག་ཀྱང་སྦྲེལ་མཐུད་མི་འདུག།",
+ "linkshere-2": "གཤམ་གྱི་ཤོག་ངོས་རྣམས་ '''$2''': ལ་སྦྲེལ་ཡོད།",
+ "nolinkshere-2": "<strong>$2</strong> ཤོག་ངོས་གཅིག་ཀྱང་སྦྲེལ་མཐུད་མི་འདུག།",
"isimage": "ཡིག་རིས་སྦྲེལ་མཐུད།",
"whatlinkshere-links": "← སྦྲེལ་མཐུད།",
"whatlinkshere-hideredirs": "$1 ཁ་ཕྱོགས་བསྐྱར་སྟོན།",
"whatlinkshere": "যে পাতাহানিত্ত এহানাত মিলাপ আসে",
"whatlinkshere-title": "পাতাহানি $1 -ত মিলাপ আসে",
"whatlinkshere-page": "পাতা:",
- "linkshere-2": "থাঙনার পাতাহানি '''$1'''র লগে মিলাপ আসে:",
- "nolinkshere-2": "পাতা '''$1'''হানাত কোন মিলাপ নেই।",
+ "linkshere-2": "থাঙনার পাতাহানি '''$2'''র লগে মিলাপ আসে:",
+ "nolinkshere-2": "পাতা '''$2'''হানাত কোন মিলাপ নেই।",
"isredirect": "বুলনদের পাতা",
"istemplate": "বরানি",
"isimage": "ফাইল মিলাপ",
"tog-editondblclick": "ڤیرایشت بٱلگاٛیل ڤا دو کئرٱت پۊرنیڌن",
"tog-editsectiononrightclick": "ڤیرایشت ڤابیڌن ڤا راست پۊرنیڌن ری بٱرجا داسۊن هر جاگٱ",
"tog-watchcreations": "اٛزاف کردن او بٱلگاٛیلی کاٛ خوم راست کردوماٛ و او جانیایلی کاٛ خوم لاهامسۊناٛ مئن سئیل بٱرگ خوم",
- "tog-watchdefault": "اضاف کردن اوصفحاتی که خوم اصلاح کردم به فهرست نمایشی",
+ "tog-watchdefault": "اٛزاف کردن بٱلگاٛیٱل و جانیایٱلی کاٛ مو مئن سئیل برگوم ڤیرایشدسۊن کردوماٛ",
"tog-watchmoves": "اضاف کردن صفحاتی که خوم جابجا کردم به فهرست نمایشی",
"tog-watchdeletion": "اضاف کردن صفحاتی که خوم پاک کردم به فهرست نمایشی خوم",
"tog-minordefault": "علامت نهادن به اصلاحات ناقص",
"tog-enotifminoredits": "امیل به مو سی صفحات ناقص اصلاح شده",
"tog-enotifrevealaddr": "دیاری کردن تیرنشۊن ٱنجوماناماٛ مو مئن دیارکاری ایمیلی",
"tog-shownumberswatching": "نشودادن شماره کاربران درحال کار یاتماشا",
- "tog-oldsig": "اÙ\85ضا اÛ\8cسنی",
+ "tog-oldsig": "اÙ\9bÙ\85زا اÛ\8cسئنی",
"tog-fancysig": "امضایل ناتموم",
"tog-uselivepreview": "پیش سئیل زندە ڤن ڤا کار",
"tog-forceeditsummary": "یادآوری سریع به مو هنگام اصلاح عقیم وخلاصه",
"whatlinkshere": "لینک های ای صفحه",
"whatlinkshere-title": "صفحات آن لینک به \"$1\"",
"whatlinkshere-page": "بألگە",
- "linkshere-2": "لینک صفحات ذیل الذکر به '''$1''':",
- "nolinkshere-2": "هیچ صفحه ای پیوند نداردبه '''$1'''.",
+ "linkshere-2": "لینک صفحات ذیل الذکر به '''$2''':",
+ "nolinkshere-2": "هیچ صفحه ای پیوند نداردبه '''$2'''.",
"isredirect": "صفحه تغییر مسیر",
"istemplate": "استفاده وابیده داخل صفحه",
"isimage": "جانیا هوم پیوند",
"whatlinkshere": "Pajennoù liammet",
"whatlinkshere-title": "Pajennoù liammet ouzh \"$1\"",
"whatlinkshere-page": "Pajenn :",
- "linkshere-2": "Ar pajennoù a-is zo enno ul liamm a gas war-du '''$1''':",
- "nolinkshere-2": "N'eus pajenn ebet enni ul liamm war-du '''$1'''.",
- "nolinkshere-ns-2": "Pajenn ebet n'eo liammet ouzh '''$1''' en esaouenn anv dibabet.",
+ "linkshere-2": "Ar pajennoù a-is zo enno ul liamm a gas war-du '''$2''':",
+ "nolinkshere-2": "N'eus pajenn ebet enni ul liamm war-du '''$2'''.",
+ "nolinkshere-ns-2": "Pajenn ebet n'eo liammet ouzh '''$2''' en esaouenn anv dibabet.",
"isredirect": "pajenn adkas",
"istemplate": "enframmet",
"isimage": "Liamm war-zu ar restr",
"whatlinkshere": "Šta vodi ovamo",
"whatlinkshere-title": "Stranice koje vode na \"$1\"",
"whatlinkshere-page": "Stranica:",
- "linkshere-2": "Sljedeće stranice vode na <strong>$1</strong>:",
- "nolinkshere-2": "Nijedna stranica nije povezana sa <strong>$1</strong>.",
- "nolinkshere-ns-2": "Nijedna stranica nije povezana sa <strong>$1</strong> u izabranom imenskom prostoru.",
+ "linkshere-2": "Sljedeće stranice vode na <strong>$2</strong>:",
+ "nolinkshere-2": "Nijedna stranica nije povezana sa <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Nijedna stranica nije povezana sa <strong>$2</strong> u izabranom imenskom prostoru.",
"isredirect": "preusmjerenje",
"istemplate": "uključivanje",
"isimage": "veza na datoteku",
"whatlinkshere": "Tautan aha ison",
"whatlinkshere-title": "Alaman puna tautan tu \"$1\"",
"whatlinkshere-page": "Alaman:",
- "linkshere-2": "Onma alaman namartaut tu <strong>$1</strong>:",
- "nolinkshere-2": "Inda adong alaman na martaut tu <strong>$1</strong>.",
+ "linkshere-2": "Onma alaman namartaut tu <strong>$2</strong>:",
+ "nolinkshere-2": "Inda adong alaman na martaut tu <strong>$2</strong>.",
"isredirect": "Alaman pangalihan",
"istemplate": "transklusi",
"isimage": "Tautan berkas",
"whatlinkshere": "Què hi enllaça",
"whatlinkshere-title": "Pàgines que enllacen amb «$1»",
"whatlinkshere-page": "Pàgina:",
- "linkshere-2": "Les següents pàgines enllacen amb '''$1''':",
- "nolinkshere-2": "Cap pàgina no enllaça amb '''$1'''.",
- "nolinkshere-ns-2": "No s'enllaça cap pàgina a '''$1''' en l'espai de noms triat.",
+ "linkshere-2": "Les següents pàgines enllacen amb '''$2''':",
+ "nolinkshere-2": "Cap pàgina no enllaça amb '''$2'''.",
+ "nolinkshere-ns-2": "No s'enllaça cap pàgina a '''$2''' en l'espai de noms triat.",
"isredirect": "pàgina redirigida",
"istemplate": "inclusió",
"isimage": "enllaç a fitxer",
"whatlinkshere": "Diē-nē̤ lièng gáu cē̤-nē̤",
"whatlinkshere-title": "鏈接遘$1其頁面",
"whatlinkshere-page": "頁面:",
- "linkshere-2": "下底其頁面鏈接遘'''$1''':",
- "nolinkshere-2": "無頁鏈接遘'''$1'''。",
+ "linkshere-2": "下底其頁面鏈接遘'''$2''':",
+ "nolinkshere-2": "無頁鏈接遘'''$2'''。",
"isredirect": "重定向頁面",
"isimage": "文件鏈接",
"whatlinkshere-prev": "{{PLURAL:$1|前|前$1}}",
"whatlinkshere": "Кхуза хьажоргаш",
"whatlinkshere-title": "«$1» тӀе хьажоргаш йолу агӀонаш",
"whatlinkshere-page": "АгӀо:",
- "linkshere-2": "ТӀаьхьайогӀу агӀонаш оцу '''$1''': хьажоргца ю",
- "nolinkshere-2": "ХӀокху '''$1''' агӀона тӀе кхечу агӀонашкахь хьажоргаш яц.",
- "nolinkshere-ns-2": "Хаьржинчу меттигехь яц '''$1''' цӀе йолу агӀонаш",
+ "linkshere-2": "ТӀаьхьайогӀу агӀонаш оцу '''$2''': хьажоргца ю",
+ "nolinkshere-2": "ХӀокху '''$2''' агӀона тӀе кхечу агӀонашкахь хьажоргаш яц.",
+ "nolinkshere-ns-2": "Хаьржинчу меттигехь яц '''$2''' цӀе йолу агӀонаш",
"isredirect": "агӀо-дӀасахьажорг",
"istemplate": "юкъаялийнарш",
"isimage": "Файлан хьажорг",
"whatlinkshere": "Unsay mga misumpay dinhi",
"whatlinkshere-title": "Mga panid nga misumpay ngadto sa \"$1\"",
"whatlinkshere-page": "Panid:",
- "linkshere-2": "Ang mosunod nga mga panid misumpay sa '''$1''':",
+ "linkshere-2": "Ang mosunod nga mga panid misumpay sa '''$2''':",
"isredirect": "panid sa redirekta",
"istemplate": "transklusyon",
"isimage": "sumpay sa payl",
"whatlinkshere": "Håfa ha na'chetton guini",
"whatlinkshere-title": "I påhina siha ni mana'chetton yan \"$1\"",
"whatlinkshere-page": "Påhina:",
- "linkshere-2": "Umachetton i sigienten påhina siha yan '''$1''':",
- "nolinkshere-2": "Taya' umachetton yan '''$1'''.",
+ "linkshere-2": "Umachetton i sigienten påhina siha yan '''$2''':",
+ "nolinkshere-2": "Taya' umachetton yan '''$2'''.",
"isredirect": "dirihi i påhina",
"istemplate": "sinaonao",
"whatlinkshere-prev": "{{PLURAL:$1|ni må'pos|$1 ni manmå'pos}}",
"whatlinkshere": "بەستەرەکان بە ئێرەوە",
"whatlinkshere-title": "ئەو پەڕانەی بەستەریان ھەیە بۆ «$1»",
"whatlinkshere-page": "پەڕە:",
- "linkshere-2": "پەڕەکانی ژێرەوە بەستەر دراون بۆ <strong>$1</strong>:",
- "nolinkshere-2": "ھیچ پەڕەیەک بەستەری نییە بۆ <strong>$1</strong>.",
- "nolinkshere-ns-2": "ھیچ پەڕەیەک بەستەری نییە بۆ <strong>$1</strong> لە بۆشایی ناوی هەڵبژێرراودا.",
+ "linkshere-2": "پەڕەکانی ژێرەوە بەستەر دراون بۆ <strong>$2</strong>:",
+ "nolinkshere-2": "ھیچ پەڕەیەک بەستەری نییە بۆ <strong>$2</strong>.",
+ "nolinkshere-ns-2": "ھیچ پەڕەیەک بەستەری نییە بۆ <strong>$2</strong> لە بۆشایی ناوی هەڵبژێرراودا.",
"isredirect": "پەڕەی ڕەوانەکەر",
"istemplate": "بەکارھێنراو",
"isimage": "بەستەری پەڕگە",
"sp-contributions-submit": "Circà",
"whatlinkshere": "Pagine chì leganu quì",
"whatlinkshere-title": "Pagine ligate à \"$1\"",
- "linkshere-2": "E seguente pagine sò culligate à '''$1''':",
+ "linkshere-2": "E seguente pagine sò culligate à '''$2''':",
"istemplate": "inclusione",
"whatlinkshere-prev": "{{PLURAL:$1|precidente|precidenti $1}}",
"whatlinkshere-next": "{{PLURAL:$1|seguente|seguenti $1}}",
"whatlinkshere": "Ang nagatabid diri",
"whatlinkshere-title": "Mga pahina nga naga-link sa $1",
"whatlinkshere-page": "Pahina:",
- "linkshere-2": "Ang mga gasunod nga pahina ga-link sa '''$1''':",
+ "linkshere-2": "Ang mga gasunod nga pahina ga-link sa '''$2''':",
"isredirect": "pahina pangdirekta",
"istemplate": "transklusyon",
"isimage": "Link sang litrato",
"whatlinkshere": "Бу саифеге багълантылар",
"whatlinkshere-title": "«$1» саифесине багъланты олгъан саифелер",
"whatlinkshere-page": "Саифе:",
- "linkshere-2": "'''$1''' саифесине багъланты берген саифелер:",
- "nolinkshere-2": "'''$1''' саифесине багъланты берген саифе ёкъ.",
- "nolinkshere-ns-2": "Сайлангъан исим фезасында '''$1''' саифесине багълангъан саифе ёкътыр.",
+ "linkshere-2": "'''$2''' саифесине багъланты берген саифелер:",
+ "nolinkshere-2": "'''$2''' саифесине багъланты берген саифе ёкъ.",
+ "nolinkshere-ns-2": "Сайлангъан исим фезасында '''$2''' саифесине багълангъан саифе ёкътыр.",
"isredirect": "Ёллама саифеси",
"istemplate": "кирсетильме",
"isimage": "файл багълантысы",
"whatlinkshere": "Bu saifege bağlantılar",
"whatlinkshere-title": "“$1” saifesine bağlantı bergen saifeler",
"whatlinkshere-page": "Saife:",
- "linkshere-2": "'''$1''' saifesine bağlantı bergen saifeler:",
- "nolinkshere-2": "'''$1''' saifesine bağlantı bergen saife yoq.",
- "nolinkshere-ns-2": "Saylanğan isim fezasında '''$1''' saifesine bağlanğan saife yoqtır.",
+ "linkshere-2": "'''$2''' saifesine bağlantı bergen saifeler:",
+ "nolinkshere-2": "'''$2''' saifesine bağlantı bergen saife yoq.",
+ "nolinkshere-ns-2": "Saylanğan isim fezasında '''$2''' saifesine bağlanğan saife yoqtır.",
"isredirect": "Yollama saifesi",
"istemplate": "kirsetilme",
"isimage": "fayl bağlantısı",
"whatlinkshere": "Odkazuje sem",
"whatlinkshere-title": "Stránky odkazující na „$1“",
"whatlinkshere-page": "Strana:",
- "linkshere-2": "Na <strong>$1</strong> odkazují tyto stránky:",
- "nolinkshere-2": "Žádná stránka na <strong>$1</strong> neodkazuje.",
- "nolinkshere-ns-2": "Ve zvoleném jmenném prostoru na <strong>$1</strong> neodkazuje žádná stránka.",
+ "linkshere-2": "Na <strong>$2</strong> odkazují tyto stránky:",
+ "nolinkshere-2": "Žádná stránka na <strong>$2</strong> neodkazuje.",
+ "nolinkshere-ns-2": "Ve zvoleném jmenném prostoru na <strong>$2</strong> neodkazuje žádná stránka.",
"isredirect": "přesměrování",
"istemplate": "vložení",
"isimage": "vložení souboru",
"whatlinkshere": "Lënkùjącé",
"whatlinkshere-title": "Starnë lënkùjącé do \"$1\"",
"whatlinkshere-page": "Starna:",
- "linkshere-2": "Do '''$1''' lënkùją hewòtné starnë:",
- "nolinkshere-2": "Niżódnô starna nie lënkùje do '''$1'''.",
+ "linkshere-2": "Do '''$2''' lënkùją hewòtné starnë:",
+ "nolinkshere-2": "Niżódnô starna nie lënkùje do '''$2'''.",
"isredirect": "starna przeczerowaniô",
"istemplate": "doparłãczony",
"isimage": "lënk do lopka",
"whatlinkshere": "дос҄ьдєщьнѩ съвѧꙁиѥ",
"whatlinkshere-title": "страницѧ ижє съ ⁖ $1 ⁖ съвѧꙁи имѫтъ",
"whatlinkshere-page": "страница :",
- "linkshere-2": "сѩ страницѧ съ <strong>$1</strong> съвѧꙁи имѫтъ :",
+ "linkshere-2": "сѩ страницѧ съ <strong>$2</strong> съвѧꙁи имѫтъ :",
"isredirect": "прѣнаправлѥниѥ",
"istemplate": "внѫтри страницѧ",
"isimage": "дѣла съвѧꙁь",
"sp-contributions-submit": "Шыра",
"whatlinkshere": "Кунта каçаканнисем",
"whatlinkshere-title": "\"$1\" çине каçакан страницăсем",
- "linkshere-2": "<strong>$1</strong> çине каçакан страницăсем:",
- "nolinkshere-2": "'''$1''' страница çине ытти страницăсенчен килме пулмасть.",
+ "linkshere-2": "<strong>$2</strong> çине каçакан страницăсем:",
+ "nolinkshere-2": "'''$2''' страница çине ытти страницăсенчен килме пулмасть.",
"whatlinkshere-prev": "{{PLURAL:$1|унчченхи|унчченхи $1}}",
"whatlinkshere-next": "{{PLURAL:$1|урăххи|урăххисем $1}}",
"whatlinkshere-links": "← каçаканнисем",
"whatlinkshere": "Beth sy'n cysylltu yma",
"whatlinkshere-title": "Tudalennau sy'n cysylltu â \"$1\"",
"whatlinkshere-page": "Tudalen:",
- "linkshere-2": "Mae'r tudalennau isod yn cysylltu â '''$1''':",
- "nolinkshere-2": "Nid oes cyswllt ar unrhyw dudalen arall syn arwain at '''$1'''.",
- "nolinkshere-ns-2": "Nid oes cyswllt ar unrhyw dudalen yn y parth dewisedig sy'n arwain at '''$1'''.",
+ "linkshere-2": "Mae'r tudalennau isod yn cysylltu â '''$2''':",
+ "nolinkshere-2": "Nid oes cyswllt ar unrhyw dudalen arall syn arwain at '''$2'''.",
+ "nolinkshere-ns-2": "Nid oes cyswllt ar unrhyw dudalen yn y parth dewisedig sy'n arwain at '''$2'''.",
"isredirect": "tudalen ailgyfeirio",
"istemplate": "cynhwysiad",
"isimage": "cyswllt ffeil",
"EeveeSylveon",
"Kenn.jensen",
"Saederup92",
- "Fitoschido"
+ "Fitoschido",
+ "Jorn Ari"
]
},
"tog-underline": "Understreg henvisninger:",
"whatlinkshere": "Hvad henviser hertil",
"whatlinkshere-title": "Sider der linker til \"$1\"",
"whatlinkshere-page": "Side:",
- "linkshere-2": "De følgende sider henviser til '''„$1“''':",
- "nolinkshere-2": "Ingen sider henviser til '''„$1“'''.",
- "nolinkshere-ns-2": "Ingen side henviser til '''„$1“''' i det valgte navnerum.",
+ "linkshere-2": "De følgende sider henviser til <strong>$2</strong>:",
+ "nolinkshere-2": "Ingen sider henviser til <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Ingen sider henviser til <strong>$2</strong> i det valgte navnerum.",
"isredirect": "omdirigeringsside",
"istemplate": "indlejring",
"isimage": "filhenvisning",
"blanknamespace": "(Seiten)",
"contributions-title": "Benutzerbeiträge von «$1»",
"whatlinkshere-title": "Seiten, die auf «$1» verlinken",
- "linkshere-2": "Die folgenden Seiten verlinken auf '''«$1»''':",
- "nolinkshere-2": "Keine Seite verlinkt auf '''«$1»'''.",
- "nolinkshere-ns-2": "Keine Seite verlinkt auf '''«$1»''' im gewählten Namensraum.",
+ "linkshere-2": "Die folgenden Seiten verlinken auf '''«$2»''':",
+ "nolinkshere-2": "Keine Seite verlinkt auf '''«$2»'''.",
+ "nolinkshere-ns-2": "Keine Seite verlinkt auf '''«$2»''' im gewählten Namensraum.",
"ipb-confirmhideuser": "Du bist gerade dabei, einen Benutzer im Modus «Benutzer verstecken» zu sperren. Dies führt dazu, dass der Benutzername in allen Listen und Logbüchern unterdrückt wird. Möchtest du das wirklich tun?",
"ipb-unblock-addr": "«$1» freigeben",
"ipb-blocklist-contribs": "Benutzerbeiträge von «$1»",
"whatlinkshere": "Links auf diese Seite",
"whatlinkshere-title": "Seiten, die auf „$1“ verlinken",
"whatlinkshere-page": "Seite:",
- "linkshere-2": "Die folgenden Seiten verlinken auf <strong>$1</strong>:",
- "nolinkshere-2": "Keine Seite verlinkt auf '''„$1“'''.",
- "nolinkshere-ns-2": "Keine Seite verlinkt auf '''„$1“''' im gewählten Namensraum.",
+ "linkshere-2": "Die folgenden Seiten verlinken auf <strong>$2</strong>:",
+ "nolinkshere-2": "Keine Seiten verlinken auf <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Keine Seiten verlinken auf <strong>$2</strong> in dem ausgewählten Namensraum.",
"isredirect": "Weiterleitungsseite",
"istemplate": "Vorlageneinbindung",
"isimage": "Dateilink",
"whatlinkshere": "Linkê tedeestey",
"whatlinkshere-title": "Wesiqe da \"$1\" rê gıre dayen perri",
"whatlinkshere-page": "Pele:",
- "linkshere-2": "Pera <strong>$1</strong> rê gıre dayen perri",
- "nolinkshere-2": "Per da '''$1''' rê pera ke gıre dana çıniya.",
- "nolinkshere-ns-2": "Cayo ke namey rê weçinayo de qet perre '''$1''' rê link nêbena.",
+ "linkshere-2": "Pera <strong>$2</strong> rê gıre dayen perri",
+ "nolinkshere-2": "Per da '''$2''' rê pera ke gıre dana çıniya.",
+ "nolinkshere-ns-2": "Cayo ke namey rê weçinayo de qet perre '''$2''' rê link nêbena.",
"isredirect": "pera hetenayışi",
"istemplate": "Açarnayene",
"isimage": "gırey dosye",
"whatlinkshere": "Wótkaze na toś ten bok",
"whatlinkshere-title": "Boki, kótarež wótkazuju na \"$1\"",
"whatlinkshere-page": "bok:",
- "linkshere-2": "Toś te boki wótkazuju na '''„$1“''':",
- "nolinkshere-2": "Žedne boki njewótkazuju na '''$1'''.",
- "nolinkshere-ns-2": "Žedne boki we wubranem mjenjowem rumje njewótkazuju na '''$1'''.",
+ "linkshere-2": "Toś te boki wótkazuju na '''„$2“''':",
+ "nolinkshere-2": "Žedne boki njewótkazuju na '''$2'''.",
+ "nolinkshere-ns-2": "Žedne boki we wubranem mjenjowem rumje njewótkazuju na '''$2'''.",
"isredirect": "dalejpósrědnjujucy bok",
"istemplate": "zawězanje pśedłogi",
"isimage": "datajowy wótkaz",
"whatlinkshere": "Nunu poingoput hiti",
"whatlinkshere-title": "Bolikon di poingoput id \"$1\"",
"whatlinkshere-page": "Bolikon:",
- "linkshere-2": "Bolikon diti poingoput kumaa id '''$1''':",
- "nolinkshere-2": "Ingaa bolikon poingoput id '''$1'''.",
+ "linkshere-2": "Bolikon diti poingoput kumaa id '''$2''':",
+ "nolinkshere-2": "Ingaa bolikon poingoput id '''$2'''.",
"isredirect": "bolikon pinotilombus",
"istemplate": "alanai",
"isimage": "noputan do upa",
"whatlinkshere": "याँखाइ कि जोणीन्छ",
"whatlinkshere-title": "$1 सित जोडियाऽ पन्नाअन",
"whatlinkshere-page": "पानो",
- "linkshere-2": "निम्न पानाहरू '''$1''' मी जुडन्छ :",
- "nolinkshere-ns-2": "चुनियाको नामस्थानमी '''$1''' सित जुड्न्या पानाहरू नाइथिन्।",
+ "linkshere-2": "निम्न पानाहरू '''$2''' मी जुडन्छ :",
+ "nolinkshere-ns-2": "चुनियाको नामस्थानमी '''$2''' सित जुड्न्या पानाहरू नाइथिन्।",
"isredirect": "अनुप्रेषित पानो",
"istemplate": "पारदर्शिता",
"isimage": "फाइल लिङ्क",
"whatlinkshere": "A pûnten ché",
"whatlinkshere-title": "Pàgini che pûnten a \"$1\"",
"whatlinkshere-page": "Pàgina:",
- "linkshere-2": "Al pàgini segvèinti a gh'àn di colegamèint a '''$1'''.",
- "nolinkshere-2": "Nisóna pàgina la gh'à dèinter colegamèint che pûnten a '''$1'''.",
+ "linkshere-2": "Al pàgini segvèinti a gh'àn di colegamèint a '''$2'''.",
+ "nolinkshere-2": "Nisóna pàgina la gh'à dèinter colegamèint che pûnten a '''$2'''.",
"isredirect": "Pàgina redirect",
"istemplate": "uniòun",
"isimage": "Colegamèint vêrs al file",
"whatlinkshere": "Τι συνδέει εδώ",
"whatlinkshere-title": "Σελίδες που συνδέουν στη σελίδα «$1»",
"whatlinkshere-page": "Σελίδα:",
- "linkshere-2": "Οι ακόλουθες σελίδες συνδέουν στη σελίδα '''$1''':",
- "nolinkshere-2": "Δεν υπάρχουν σελίδες που να συνδέουν στη σελίδα '''$1'''.",
- "nolinkshere-ns-2": "Καμία σελίδα δεν συνδέει στο '''$1''' στον επιλεγμένο ονοματοχώρο.",
+ "linkshere-2": "Οι ακόλουθες σελίδες συνδέουν στη σελίδα <strong>$2</strong>:",
+ "nolinkshere-2": "Δεν υπάρχουν σελίδες που να συνδέουν στη σελίδα <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Καμία σελίδα δεν συνδέει στο <strong>$2</strong> στον επιλεγμένο ονοματοχώρο.",
"isredirect": "σελίδα ανακατεύθυνσης",
"istemplate": "ενσωμάτωση",
"isimage": "σύνδεσμος αρχείου",
"whatlinkshere-title": "Pages that link to \"$1\"",
"whatlinkshere-summary": "",
"whatlinkshere-page": "Page:",
- "linkshere-2": "The following pages link to <strong>$1</strong>:",
- "nolinkshere-2": "No pages link to <strong>$1</strong>.",
- "nolinkshere-ns-2": "No pages link to <strong>$1</strong> in the chosen namespace.",
+ "linkshere-2": "The following pages link to <strong>$2</strong>:",
+ "nolinkshere-2": "No pages link to <strong>$2</strong>.",
+ "nolinkshere-ns-2": "No pages link to <strong>$2</strong> in the chosen namespace.",
"isredirect": "redirect page",
"istemplate": "transclusion",
"isimage": "file link",
"whatlinkshere": "Ligiloj ĉi tien",
"whatlinkshere-title": "Paĝoj ligantaj al \"$1\"",
"whatlinkshere-page": "Paĝo:",
- "linkshere-2": "La jenaj paĝoj ligas al '''$1''':",
- "nolinkshere-2": "Neniu paĝo ligas al '''$1'''.",
- "nolinkshere-ns-2": "Neniuj paĝoj ligas al '''$1''' en la elektita nomspaco.",
+ "linkshere-2": "La jenaj paĝoj ligas al '''$2''':",
+ "nolinkshere-2": "Neniu paĝo ligas al '''$2'''.",
+ "nolinkshere-ns-2": "Neniuj paĝoj ligas al '''$2''' en la elektita nomspaco.",
"isredirect": "alidirektilo",
"istemplate": "inkludo",
"isimage": "ligilo al dosiero",
"whatlinkshere": "Lo que enlaza aquí",
"whatlinkshere-title": "Páginas que enlazan con «$1»",
"whatlinkshere-page": "Página:",
- "linkshere-2": "Las siguientes páginas enlazan a <strong>$1</strong>:",
- "nolinkshere-2": "Ninguna página enlaza con <strong>$1</strong>.",
- "nolinkshere-ns-2": "Ninguna página enlaza con <strong>$1</strong> en el espacio de nombres elegido.",
+ "linkshere-2": "Las siguientes páginas enlazan a <strong>$2</strong>:",
+ "nolinkshere-2": "Ninguna página enlaza con <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Ninguna página enlaza con <strong>$2</strong> en el espacio de nombres elegido.",
"isredirect": "página redirigida",
"istemplate": "inclusión",
"isimage": "enlace de archivo",
"botpasswords-existing": "Olemasolevad robotiparoolid",
"botpasswords-createnew": "Uue robotiparooli loomine",
"botpasswords-editexisting": "Olemasoleva robotiparooli muutmine",
+ "botpasswords-label-needsreset": "(parool vajab lähtestamist)",
"botpasswords-label-appid": "Robotinimi:",
"botpasswords-label-create": "Loo",
"botpasswords-label-update": "Uuenda",
"botpasswords-restriction-failed": "Robotiparooli piirangud takistavad sisselogimist.",
"botpasswords-invalid-name": "Määratud kasutajanimi ei sisalda robotiparooli eraldajat (\"$1\").",
"botpasswords-not-exist": "Kasutaja \"$1\" robotinimele \"$2\" vastav robotiparool puudub.",
+ "botpasswords-needs-reset": "Kasutaja \"$1\" robotinime \"$2\" robotiparool tuleb lähtestada.",
"resetpass_forbidden": "Paroole ei saa muuta",
"resetpass_forbidden-reason": "Paroole ei saa muuta: $1",
"resetpass-no-info": "Pead olema sisselogitud, et sellele lehele pääseda.",
"subject-preview": "Resümee eelvaade:",
"previewerrortext": "Sinu muudatuste eelvaatluse juures esines tõrge.",
"blockedtitle": "Kasutaja on blokeeritud",
- "blockedtext": "'''Sinu kasutajanimi või IP-aadress on blokeeritud.'''\n\nBlokeeris $1.\nTema põhjendus on järgmine: ''$2''.\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nPane tähele, et sa ei saa kasutajale teadet saata, kui sa pole kinnitanud oma [[Special:Preferences|eelistuste lehel]] kehtivat e-posti aadressi.\n\nSinu praegune IP-aadress on $3 ning blokeeringu number on #$5. Lisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
- "autoblockedtext": "Sinu IP-aadress blokeeriti automaatselt, sest seda kasutas teine kasutaja, kelle $1 blokeeris.\nPõhjendus on järgmine:\n\n:''$2''\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nPane tähele, et sa ei saa teisele kasutajale teadet saata, kui sa pole kinnitanud oma [[Special:Preferences|eelistuste lehel]] kehtivat e-posti aadressi ega ole selle kasutamisest blokeeritud.\n\nSinu praegune IP-aadress on $3 ja blokeeringu number #$5. Lisa need andmed kõigile järelpärimistele, mida kavatsed teha.",
+ "blockedtext": "<strong>Sinu kasutajanimi või IP-aadress on blokeeritud.</strong>\n\nBlokeeris $1.\nTema põhjendus on järgmine: <em>$2</em>.\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nSa ei saa kasutada funktsiooni \"{{int:emailuser}}\", kui [[Special:Preferences|konto eelistustes]] pole määratud kehtivat e-posti aadressi või kui sul on keelatud seda funktsiooni kasutada.\n\nSinu praegune IP-aadress on $3 ja blokeeringu number on #$5. Palun lisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
+ "autoblockedtext": "Sinu IP-aadress blokeeriti automaatselt, sest seda kasutas teine kasutaja, kelle $1 blokeeris.\nPõhjendus on järgmine:\n\n:<em>$2</em>\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nPane tähele, et sa ei saa kasutada funktsiooni \"{{int:emailuser}}\", kui [[Special:Preferences|konto eelistustes]] pole määratud kehtivat e-posti aadressi või kui sul on keelatud seda funktsiooni kasutada.\n\nSinu praegune IP-aadress on $3 ja blokeeringu number #$5. Palun lisa need andmed kõigile järelpärimistele, mida kavatsed teha.",
"systemblockedtext": "MediaWiki tarkvara on sinu kasutajanime või IP-aadressi automaatselt blokeerinud.\nToodud on järgmine põhjus:\n\n:<em>$2</em>\n\n* Blokeerimisaeg: $8\n* Blokeeringu aegumistähtaeg: $6\n* Sooviti blokeerida: $7\n\nSinu praegune IP-aadress on $3.\nLisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
"blockednoreason": "põhjendust ei ole kirja pandud",
"whitelistedittext": "Lehekülgede toimetamiseks pead $1.",
"recentchangescount": "Mitut muudatust viimaste muudatuste loendis, lehekülgede ajalugudes ja logides vaikimisi näidata:",
"prefs-help-recentchangescount": "Suurim võimalik väärtus: 1000",
"prefs-help-watchlist-token2": "See on sinu jälgimisloendi veebivoo salavõti.\nIgaüks, kes seda teab, saab lugeda sinu jälgimisloendit. Seega ära jaga seda.\n[[Special:ResetTokens|Klõpsa siia, kui sul on vaja see lähtestada]].",
- "prefs-help-tokenmanagement": "#REDIRECT [[MediaWiki:Prefs-help-watchlist-token2/et]]",
+ "prefs-help-tokenmanagement": "Saad vaadata ja lähtestada salavõtit, mis võimaldab juurdepääsu konto jälgimisloendi veebivoole. Igaüks, kes võtit teab, saab lugeda sinu jälgimisloendit. Seega ära jaga seda.",
"savedprefs": "Sinu eelistused on salvestatud.",
"savedrights": "Kasutaja $1 rühmad on salvestatud.",
"timezonelegend": "Ajavöönd:",
"recentchangeslinked-feed": "Seotud muudatused",
"recentchangeslinked-toolbox": "Seotud muudatused",
"recentchangeslinked-title": "Leheküljega \"$1\" seotud muudatused",
- "recentchangeslinked-summary": "Sisesta lehekülje pealkri, et näha muudatusi lehekülgedel, mis viitavad sellele leheküljele, või millele viidatakse sellel leheküljel. Et näha kategooria liikmeid, sisesta \"Kategooria:Kategooria pealkiri\". Sinu [[Special:Watchlist|jälgimisloendi]] leheküljed on <strong>rasvases kirjas</strong>.",
+ "recentchangeslinked-summary": "Sisesta lehekülje pealkri, et näha muudatusi lehekülgedel, mis viitavad sellele leheküljele, või millele viidatakse sellel leheküljel. Et näha kategooria liikmeid, sisesta \"{{ns:category}}:Kategooria pealkiri\". Sinu [[Special:Watchlist|jälgimisloendi]] leheküljed on <strong>rasvases kirjas</strong>.",
"recentchangeslinked-page": "Lehekülje nimi:",
"recentchangeslinked-to": "Näita hoopis muudatusi lehekülgedel, mis sellele lehele lingivad",
"recentchanges-page-added-to-category": "kategooriasse lisatud \"[[:$1]]\"",
"protectedtitles-submit": "Kuva pealkirjad",
"listusers": "Kasutajate loend",
"listusers-editsonly": "Näita vaid kasutajaid, kes on teinud muudatusi",
+ "listusers-temporarygroupsonly": "Näita vaid kasutajaid, kelle rühmaliikmesus on ajutine",
"listusers-creationsort": "Järjesta konto loomise aja järgi",
"listusers-desc": "Järjesta laskuvalt",
"usereditcount": "$1 {{PLURAL:$1|redigeerimine|redigeerimist}}",
"apisandbox-dynamic-parameters-add-label": "Lisa parameeter:",
"apisandbox-dynamic-parameters-add-placeholder": "Parameetri nimi",
"apisandbox-dynamic-error-exists": "Parameeter nimega \"$1\" on juba olemas.",
+ "apisandbox-templated-parameter-reason": "Seda [[Special:ApiHelp/main#main/templatedparams|mallparameetrit]] pakutakse välja $2 {{PLURAL:$1|väärtuse|väärtuste}} põhjal.",
"apisandbox-deprecated-parameters": "Vananenud parameetrid",
"apisandbox-fetch-token": "Hangi luba automaatselt",
"apisandbox-add-multi": "Lisa",
"whatlinkshere": "Lingid siia",
"whatlinkshere-title": "Leheküljed, mis viitavad lehele \"$1\"",
"whatlinkshere-page": "Lehekülg:",
- "linkshere-2": "Lehele '''$1''' viitavad järgmised leheküljed:",
- "nolinkshere-2": "Lehele '''$1''' ei viita ükski lehekülg.",
- "nolinkshere-ns-2": "Leheküljele <strong>$1</strong> ei ole valitud nimeruumis linke.",
+ "linkshere-2": "Lehele '''$2''' viitavad järgmised leheküljed:",
+ "nolinkshere-2": "Lehele '''$2''' ei viita ükski lehekülg.",
+ "nolinkshere-ns-2": "Leheküljele <strong>$2</strong> ei ole valitud nimeruumis linke.",
"isredirect": "ümbersuunamislehekülg",
"istemplate": "kasutamine mallina",
"isimage": "faililink",
"pagedata-title": "Lehekülje andmed",
"pagedata-text": "See lehekülg varustab leheküljed andmeliidesega. Palun too internetiaadressis ära lehekülje pealkiri, kasutades alamlehekülje süntaksit.\n* Sisu kooskõlastatakse vastavalt sinu kliendi Accept-päisele. See tähendab seda, et andmeid pakutakse vormingus, mida sinu klient eelistab.",
"pagedata-not-acceptable": "Vastavat vormingut ei leitud. Toetatud MIME tüübid: $1",
- "pagedata-bad-title": "Vigane pealkiri: $1."
+ "pagedata-bad-title": "Vigane pealkiri: $1.",
+ "unregistered-user-config": "Registreerumata kasutajad ei saa turvakaalutluse tõttu kasutaja JavaScripti, CSS- ja JSON-alamlehekülgi laadida.",
+ "passwordpolicies": "Paroolireeglid",
+ "passwordpolicies-summary": "Siin on loetletud vikis kasutusel olevate kasutajarühmade suhtes kehtivad paroolireeglid.",
+ "passwordpolicies-group": "Rühm",
+ "passwordpolicies-policies": "Reeglid",
+ "passwordpolicies-policy-minimalpasswordlength": "Parool peab olema vähemalt $1 {{PLURAL:$1|märgi}} pikkune.",
+ "passwordpolicies-policy-minimumpasswordlengthtologin": "Parool peab olema vähemalt $1 {{PLURAL:$1|märgi}} pikkune, et saaks sisse logida.",
+ "passwordpolicies-policy-passwordcannotmatchusername": "Parool ei tohi olla sama mis kasutajanimi.",
+ "passwordpolicies-policy-passwordcannotmatchblacklist": "Parool ei tohi olla kantud musta nimekirja.",
+ "passwordpolicies-policy-maximalpasswordlength": "Parool peab olema $1 {{PLURAL:$1|märgist}} lühem.",
+ "passwordpolicies-policy-passwordcannotbepopular": "Parool ei tohi olla {{PLURAL:$1|populaarne parool|$1 populaarse parooli loendis}}."
}
"whatlinkshere": "Honanzko lotura duten orriak",
"whatlinkshere-title": "$1(e)ra lotura duten orriak",
"whatlinkshere-page": "Orria:",
- "linkshere-2": "Hauek dute '''$1''' orrialderako lotura:",
- "nolinkshere-2": "Ez dago '''$1''' lotura duen orrialderik.",
- "nolinkshere-ns-2": "Hautatutako izen-tartean ez dago '''$1''' orrialderako lotura duenik.",
+ "linkshere-2": "Hauek dute '''$2''' orrialderako lotura:",
+ "nolinkshere-2": "Ez dago '''$2''' lotura duen orrialderik.",
+ "nolinkshere-ns-2": "Hautatutako izen-tartean ez dago '''$2''' orrialderako lotura duenik.",
"isredirect": "birbideratze orrialdea",
"istemplate": "erabilpena",
"isimage": "fitxategi lotura",
"whatlinkshere": "Lo que atija aquina",
"whatlinkshere-title": "Páhinas que atihan a $1",
"whatlinkshere-page": "Páhina:",
- "linkshere-2": "Las siguientis páhinas atihan a '''$1''':",
- "nolinkshere-2": "Denguna páhina atiha a '''$1'''.",
- "nolinkshere-ns-2": "Nu ai denguna páhina qu´atihi a '''$1''' nel espaciu e nombris lihiu.",
+ "linkshere-2": "Las siguientis páhinas atihan a '''$2''':",
+ "nolinkshere-2": "Denguna páhina atiha a '''$2'''.",
+ "nolinkshere-ns-2": "Nu ai denguna páhina qu´atihi a '''$2''' nel espaciu e nombris lihiu.",
"isredirect": "Rederihil páhina",
"istemplate": "inclusión",
"isimage": "atihu la imahin",
"whatlinkshere": "پیوندها به این صفحه",
"whatlinkshere-title": "صفحههایی که به «$1» پیوند دارند",
"whatlinkshere-page": "صفحه:",
- "linkshere-2": "صفحههای زیر به '''$1''' پیوند دارند:",
- "nolinkshere-2": "هیچ صفحهای به '''$1''' پیوند ندارد.",
- "nolinkshere-ns-2": "هیچ صفحهای از فضای نام انتخاب شده به '''$1''' پیوند ندارد.",
+ "linkshere-2": "صفحههای زیر به '''$2''' پیوند دارند:",
+ "nolinkshere-2": "هیچ صفحهای به '''$2''' پیوند ندارد.",
+ "nolinkshere-ns-2": "هیچ صفحهای از فضای نام انتخاب شده به '''$2''' پیوند ندارد.",
"isredirect": "صفحهٔ تغییرمسیر",
"istemplate": "تراگنجانشها",
"isimage": "پیوند به پرونده",
"whatlinkshere": "Tänne viittaavat sivut",
"whatlinkshere-title": "Sivut, jotka viittaavat sivulle $1",
"whatlinkshere-page": "Sivu:",
- "linkshere-2": "Seuraavilta sivuilta on linkki sivulle <strong>$1</strong>:",
- "nolinkshere-2": "Sivulle <strong>$1</strong> ei ole linkkejä.",
- "nolinkshere-ns-2": "Sivulle <strong>$1</strong> ei ole linkkejä valitussa nimiavaruudessa.",
+ "linkshere-2": "Seuraavilta sivuilta on linkki sivulle <strong>$2</strong>:",
+ "nolinkshere-2": "Sivulle <strong>$2</strong> ei ole linkkejä.",
+ "nolinkshere-ns-2": "Sivulle <strong>$2</strong> ei ole linkkejä valitussa nimiavaruudessa.",
"isredirect": "ohjaussivu",
"istemplate": "sisällytetty",
"isimage": "tiedostolinkki",
"whatlinkshere": "Hvat slóðar higar",
"whatlinkshere-title": "Síður sum slóða til \"$1\"",
"whatlinkshere-page": "Síða:",
- "linkshere-2": "Hesar síður slóða til '''$1''':",
- "nolinkshere-2": "Ongar síður slóða til '''$1'''.",
- "nolinkshere-ns-2": "Ongar síður slóða til '''$1''' í tí valda navnarúminum.",
+ "linkshere-2": "Hesar síður slóða til '''$2''':",
+ "nolinkshere-2": "Ongar síður slóða til '''$2'''.",
+ "nolinkshere-ns-2": "Ongar síður slóða til '''$2''' í tí valda navnarúminum.",
"isredirect": "ávísingarsíða",
"istemplate": "leggjast innan í",
"isimage": "fílu slóð",
"whatlinkshere": "Pages liées",
"whatlinkshere-title": "Pages qui pointent vers « $1 »",
"whatlinkshere-page": "Page :",
- "linkshere-2": "Les pages ci-dessous contiennent un lien vers <strong>$1</strong> :",
- "nolinkshere-2": "Aucune page ne contient de lien vers <strong>$1</strong>.",
- "nolinkshere-ns-2": "Aucune page ne contient de lien vers <strong>$1</strong> dans l'espace de noms choisi.",
+ "linkshere-2": "Les pages ci-dessous contiennent un lien vers <strong>$2</strong> :",
+ "nolinkshere-2": "Aucune page ne contient de lien vers <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Aucune page ne contient de liens vers <strong>$2</strong> dans l'espace de noms choisi.",
"isredirect": "page de redirection",
"istemplate": "inclusion",
"isimage": "lien vers le fichier",
"whatlinkshere": "Pâges liyêes",
"whatlinkshere-title": "Pâges que pouentont vers « $1 »",
"whatlinkshere-page": "Pâge :",
- "linkshere-2": "Cetes pâges contegnont un lim de vers <strong>$1</strong> :",
- "nolinkshere-2": "Niona pâge contint de lim de vers <strong>$1</strong>.",
- "nolinkshere-ns-2": "Niona pâge contint de lim de vers <strong>$1</strong> dedens l’èspâço de noms chouèsi.",
+ "linkshere-2": "Cetes pâges contegnont un lim de vers <strong>$2</strong> :",
+ "nolinkshere-2": "Niona pâge contint de lim de vers <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Niona pâge contint de lim de vers <strong>$2</strong> dedens l’èspâço de noms chouèsi.",
"isredirect": "pâge de redirèccion",
"istemplate": "transcllusion",
"isimage": "lim de vers lo fichiér",
"whatlinkshere": "Ferwisangen üüb detdiar sidj",
"whatlinkshere-title": "Sidjen, diar üüb \"$1\" ferwise",
"whatlinkshere-page": "Sidj:",
- "linkshere-2": "Jodiar sidjen ferwise üüb '''„$1“''':",
- "nolinkshere-2": "Nian sidj ferwiset üüb $1",
- "nolinkshere-ns-2": "Nian sidj ferwiset üüb '''„$1“''' uun di ütjsoocht nöömrüm.",
+ "linkshere-2": "Jodiar sidjen ferwise üüb '''„$2“''':",
+ "nolinkshere-2": "Nian sidj ferwiset üüb $2",
+ "nolinkshere-ns-2": "Nian sidj ferwiset üüb '''„$2“''' uun di ütjsoocht nöömrüm.",
"isredirect": "widjerfeerang",
"istemplate": "iinbünjen föörlaagen",
"isimage": "Dateilink",
"whatlinkshere": "Leams a cheste vôs",
"whatlinkshere-title": "Pagjinis che a son leadis a \"$1\"",
"whatlinkshere-page": "Pagjine:",
- "linkshere-2": "Lis pagjinis ca sot a son leadis a '''$1''':",
- "nolinkshere-2": "Nissune pagjine e à leams a '''$1'''.",
- "nolinkshere-ns-2": "No son pagjine leadis a '''$1''' intal spazi dai nons sielt.",
+ "linkshere-2": "Lis pagjinis ca sot a son leadis a '''$2''':",
+ "nolinkshere-2": "Nissune pagjine e à leams a '''$2'''.",
+ "nolinkshere-ns-2": "No son pagjine leadis a '''$2''' intal spazi dai nons sielt.",
"isredirect": "pagjine di reindirizament",
"istemplate": "includude",
"isimage": "leam a figure",
"whatlinkshere": "Wat is hjirmei keppele?",
"whatlinkshere-title": "Siden dy't keppele binne mei \"$1\"",
"whatlinkshere-page": "Side:",
- "linkshere-2": "Dizze siden binne keppele oan '''$1''':",
- "nolinkshere-2": "Der binne gjin siden oan '''$1''' keppele.",
- "nolinkshere-ns-2": "Gjin siden yn de keazen nammeromte keppelje nei '''$1'''.",
+ "linkshere-2": "Dizze siden binne keppele oan '''$2''':",
+ "nolinkshere-2": "Der binne gjin siden oan '''$2''' keppele.",
+ "nolinkshere-ns-2": "Gjin siden yn de keazen nammeromte keppelje nei '''$2'''.",
"isredirect": "synonym",
"istemplate": "opnaam",
"isimage": "triemkeppeling",
"whatlinkshere": "Naisc leis an lch seo",
"whatlinkshere-title": "Naisc le $1",
"whatlinkshere-page": "Leathanach:",
- "linkshere-2": "Tá nasc chuig '''$1''' ar na leathanaigh seo a leanas:",
- "nolinkshere-2": "Níl leathanach ar bith ann a bhfuil nasc chuig '''$1''' air.",
- "nolinkshere-ns-2": "Níl leathanach ar bith ann san ainmspás roghnaithe a bhfuil nasc chuig '''$1''' air.",
+ "linkshere-2": "Tá nasc chuig '''$2''' ar na leathanaigh seo a leanas:",
+ "nolinkshere-2": "Níl leathanach ar bith ann a bhfuil nasc chuig '''$2''' air.",
+ "nolinkshere-ns-2": "Níl leathanach ar bith ann san ainmspás roghnaithe a bhfuil nasc chuig '''$2''' air.",
"isredirect": "Leathanach athsheolaidh",
"istemplate": "iniamh",
"isimage": "nasc comhad",
"whatlinkshere": "Baalantılar sayfaa",
"whatlinkshere-title": "$1 baalantısı olan sayfalar",
"whatlinkshere-page": "Yaprak:",
- "linkshere-2": "Buraya baalantısı var olan sayfalar '''$1''':",
- "nolinkshere-2": "Yok buraya baalanan sayfa '''$1'''.",
+ "linkshere-2": "Buraya baalantısı var olan sayfalar '''$2''':",
+ "nolinkshere-2": "Yok buraya baalanan sayfa '''$2'''.",
"isredirect": "yönnendirmäk sayfası",
"istemplate": "eklemää",
"isimage": "fayl baalantısı",
"whatlinkshere": "有什哩连到个首",
"whatlinkshere-title": "连到 $1 𠮶页面",
"whatlinkshere-page": "页面:",
- "linkshere-2": "下底𠮶页面链接到$1:",
- "nolinkshere-2": "冇页面链接到$1。",
- "nolinkshere-ns-2": "选正𠮶空间名内冇页面链接到$1。",
+ "linkshere-2": "下底𠮶页面链接到$2:",
+ "nolinkshere-2": "冇页面链接到$2。",
+ "nolinkshere-ns-2": "选正𠮶空间名内冇页面链接到$2。",
"isredirect": "重定向页面",
"istemplate": "含到",
"isimage": "档案连结",
"whatlinkshere": "有什哩連到箇首",
"whatlinkshere-title": "連到 $1 嗰頁面",
"whatlinkshere-page": "頁面:",
- "linkshere-2": "下底嗰頁面連結到$1:",
- "nolinkshere-2": "冇頁面連結到$1。",
- "nolinkshere-ns-2": "選正嗰空間名內冇頁面連結到$1。",
+ "linkshere-2": "下底嗰頁面連結到$2:",
+ "nolinkshere-2": "冇頁面連結到$2。",
+ "nolinkshere-ns-2": "選正嗰空間名內冇頁面連結到$2。",
"isredirect": "重定向頁",
"istemplate": "含到",
"isimage": "檔案連結",
"whatlinkshere": "Paj lyé",
"whatlinkshere-title": "Paj ki ka pwenté bò'd « $1 »",
"whatlinkshere-page": "Paj :",
- "linkshere-2": "Paj-ya ki anba ka kontni roun lyen vèr <strong>$1</strong> :",
- "nolinkshere-2": "Pyès paj pa gen kontni dé lyen vèr <strong>$1</strong>.",
+ "linkshere-2": "Paj-ya ki anba ka kontni roun lyen vèr <strong>$2</strong> :",
+ "nolinkshere-2": "Pyès paj pa gen kontni dé lyen vèr <strong>$2</strong>.",
"isredirect": "paj di roudirèksyon",
"istemplate": "enklizyon",
"isimage": "Lyen vèr fiché-a",
"whatlinkshere": "Na tha a' ceangal a-nall an-seo",
"whatlinkshere-title": "Duilleagan a tha a' ceangal ri \"$1\"",
"whatlinkshere-page": "Duilleag:",
- "linkshere-2": "Tha na duilleagan a leanas a' ceangal ri <strong>$1</strong>:",
- "nolinkshere-2": "Chan eil ceangal air duilleag sam bith a tha a' dol gu <strong>$1</strong>.",
- "nolinkshere-ns-2": "Chan eil ceangal gu <strong>$1</strong> ann an duilleag sam bith san ainm-spàs a thagh thu.",
+ "linkshere-2": "Tha na duilleagan a leanas a' ceangal ri <strong>$2</strong>:",
+ "nolinkshere-2": "Chan eil ceangal air duilleag sam bith a tha a' dol gu <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Chan eil ceangal gu <strong>$2</strong> ann an duilleag sam bith san ainm-spàs a thagh thu.",
"isredirect": "duilleag ath-sheòlaidh",
"istemplate": "transclusion",
"isimage": "ceangal faidhle",
"whatlinkshere": "Páxinas que ligan con esta",
"whatlinkshere-title": "Páxinas que ligan con \"$1\"",
"whatlinkshere-page": "Páxina:",
- "linkshere-2": "As seguintes páxinas ligan con \"'''$1'''\":",
- "nolinkshere-2": "Ningunha páxina liga con \"'''$1'''\".",
- "nolinkshere-ns-2": "Ningunha páxina liga con \"'''$1'''\" no espazo de nomes elixido.",
+ "linkshere-2": "As seguintes páxinas ligan con \"'''$2'''\":",
+ "nolinkshere-2": "Ningunha páxina liga con \"'''$2'''\".",
+ "nolinkshere-ns-2": "Ningunha páxina liga con \"'''$2'''\" no espazo de nomes elixido.",
"isredirect": "páxina redirixida",
"istemplate": "inclusión",
"isimage": "ligazón ao ficheiro",
"whatlinkshere": "هرچي خال ببؤ ائره",
"whatlinkshere-title": "ولگؤني گه «$1»ˇ أمرأ خال دأنن",
"whatlinkshere-page": "ولگ:",
- "linkshere-2": "جيري ولگؤن '''$1'''ˇ أمرأ خال دأنن:",
+ "linkshere-2": "جيري ولگؤن '''$2'''ˇ أمرأ خال دأنن:",
"isredirect": "تغييرمسيرˇ ولگ",
"isimage": "فاىلˇ خال",
"whatlinkshere-prev": "{{PLURAL:$1|قبلي|$1 قبلي مؤرد}}",
"whatlinkshere": "हाका कितें जुळटा",
"whatlinkshere-title": " \"$1\" हाका जोडणी आशिल्लीं पानां",
"whatlinkshere-page": "पान:",
- "linkshere-2": "मुखावेली पानां '''$1''': हाका जोडणी करतात",
- "nolinkshere-2": "$1हाका खंयच्याच पानाची जोडणी ना",
+ "linkshere-2": "मुखावेली पानां '''$2''': हाका जोडणी करतात",
+ "nolinkshere-2": "$2हाका खंयच्याच पानाची जोडणी ना",
"isredirect": "पुनर्निर्देशन पान",
"istemplate": "$1 दूसरात-समावेस",
"isimage": "फायलीचो दुवो",
"whatlinkshere": "Hanga kitem zoddta",
"whatlinkshere-title": "\"$1\" haka zoddlelim panam",
"whatlinkshere-page": "Pan:",
- "linkshere-2": "Sokoilim panam <strong>$1</strong> ak zoddtat:",
- "nolinkshere-2": "Khoincheim pan '''$1''' ak zoddna.",
+ "linkshere-2": "Sokoilim panam <strong>$2</strong> ak zoddtat:",
+ "nolinkshere-2": "Khoincheim pan '''$2''' ak zoddna.",
"isredirect": "punornirdexon pan",
"istemplate": "Durasth-somaves",
"isimage": "failichem zoddop",
"whatlinkshere": "Wumbuta",
"whatlinkshere-title": "Halaman botiye o wumbuta ode \"$1\"",
"whatlinkshere-page": "Halaman",
- "linkshere-2": "Halaman botiye woluwo wumbuta ode <strong>$1<strong>:",
- "nolinkshere-2": "Diya'a halaman wumbuta ode <strong>$1</strong>",
+ "linkshere-2": "Halaman botiye woluwo wumbuta ode <strong>$2<strong>:",
+ "nolinkshere-2": "Diya'a halaman wumbuta ode <strong>$2</strong>",
"isredirect": "halaman pilobaleyalo",
"istemplate": "tranklusi",
"isimage": "wumbuta lo berkas",
"tog-enotifusertalkpages": "𐍃𐌰𐌽𐌳𐌴𐌹 𐌼𐌹𐌺 𐌴-𐌱𐍉𐌺𐍉𐍃 𐌾𐌰𐌱𐌰𐌹 𐌼𐌴𐌹𐌽𐍃 𐌻𐌰𐌿𐍆𐍃 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌹𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌳𐌰",
"tog-shownumberswatching": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐍂𐌰𐌸𐌾𐍉𐌽 𐍅𐌹𐍄𐌰𐌽𐌳𐌰𐌹𐌶𐌴 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌴",
"tog-oldsig": "𐌸𐌴𐌹𐌽𐌰 𐍅𐌹𐍃𐌰𐌽𐌳𐌴𐌹 𐌿𐍆𐌼𐌴𐌻𐌴𐌹𐌽𐍃",
+ "tog-showhiddencats": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐌰𐌽𐌰𐌻𐌰𐌿𐌲𐌽𐌰 𐌺𐌿𐌽𐌾𐌰",
+ "tog-prefershttps": "𐌱𐍂𐌿𐌺𐌴𐌹 𐍃𐌹𐌽𐍄𐌴𐌹𐌽𐍉 𐌰𐍂𐍅𐌾𐌰𐌹𐌶𐍉𐍃 𐌲𐌰𐍅𐌹𐍃𐌰𐌹𐍃 𐌸𐌰𐌽 𐌰𐍄𐌹𐌳𐌳𐌾𐌰",
"underline-always": "𐍃𐌹𐌽𐍄𐌴𐌹𐌽𐍉",
"underline-never": "𐌽𐌹 𐌰𐌹𐍅",
+ "editfont-serif": "𐍃𐌰𐌹𐍂𐌹𐍆 𐍆𐌰𐌿𐌽𐍄",
"sunday": "𐌰𐍆𐌰𐍂𐍃𐌰𐌱𐌱𐌰𐍄𐍉",
"monday": "𐌼𐌴𐌽𐌹𐌽𐍃 𐌳𐌰𐌲𐍃",
"tuesday": "𐍄𐌴𐌹𐍅𐌹𐍃 𐌳𐌰𐌲𐍃",
"february-date": "𐍆𐌰𐌹𐌱𐍂𐌿𐌰𐍂𐌴𐌹𐍃 $1",
"march-date": "𐌼𐌰𐍂𐍄𐌹𐌿𐍃 $1",
"april-date": "𐌰𐍀𐍂𐌹𐌻𐌹𐍃 $1",
+ "may-date": "𐌼𐌰𐌹𐌿𐍃 $1",
"september-date": "𐍃𐌰𐌹𐍀𐍄𐌰𐌹𐌼𐌱𐌰𐌹𐍂 $1",
"november-date": "𐌽𐌰𐌿𐌱𐌰𐌹𐌼𐌱𐌰𐌹𐍂 $1",
"pagecategories": "{{PLURAL:$1|𐌺𐌿𐌽𐌹|𐌺𐌿𐌽𐌾𐌰}}",
"category-subcat-count": "{{PLURAL:$2|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 𐌸𐌰𐍄𐌴𐌹𐌽𐌴𐌹 𐌹𐍆𐍄𐌿𐌼 𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽 𐌺𐌿𐌽𐌹|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 {{PLURAL:$1|𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽 𐌺𐌿𐌽𐌹|𐌹𐍆𐍄𐌿𐌼𐌰 $1 𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽𐌰 𐌺𐌿𐌽𐌾𐌰}}, 𐌰𐌻𐌻𐌰𐌹𐌶𐌴 $2 𐌺𐌿𐌽𐌾𐌴.}}",
"category-subcat-count-limited": "𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 𐌹𐍆𐍄𐌿𐌼𐍉𐌽/𐌹𐍆𐍄𐌿𐌼𐍉𐌽𐌰\n{{PLURAL:$1|𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽 𐌺𐌿𐌽𐌹|$1 𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽𐌰 𐌺𐌿𐌽𐌾𐌰}}.",
"category-article-count": "{{PLURAL:$2|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 𐌸𐌰𐍄𐌰𐌹𐌽𐌴𐌹 𐌹𐍆𐍄𐌿𐌼𐌰𐌽 𐌻𐌰𐌿𐍆.|𐌹𐍆𐍄𐌿𐌼𐌰(𐌽𐍃) {{PLURAL:$1|𐌻𐌰𐌿𐍆𐍃 𐌹𐍃𐍄|$1 𐌻𐌰𐌿𐌱𐍉𐍃 𐍃𐌹𐌽𐌳}} 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌺𐌿𐌽𐌾𐌰, 𐌰𐌻𐌻𐌰𐌹𐌶𐌴 $2 𐌻𐌰𐌿𐌱𐌴.}}",
+ "broken-file-category": "𐌻𐌰𐌿𐌱𐍉𐍃 𐌼𐌹𐌸 𐌱𐍂𐌹𐌺𐌰𐌽𐌰𐌹𐌼 𐍆𐌰𐌾𐌻𐌰𐌲𐌰𐍅𐌹𐍃𐍃𐌹𐌼",
"about": "𐌱𐌹",
"article": "𐌷𐌰𐌱𐌰𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
"newwindow": "(𐌿𐍃𐌻𐌿𐌺𐌹𐌸 𐌹𐌽 𐌽𐌹𐌿𐌾𐌰𐌼𐌼𐌰 𐌰𐌿𐌲𐌰𐌳𐌰𐌿𐍂𐌹𐌽)",
"cancel": "𐍃𐍅𐌴𐌹𐌱",
"moredotdotdot": "𐌼𐌰𐌹𐍃...",
+ "morenotlisted": "𐍃𐍉 𐍅𐌹𐌺𐍉 𐌼𐌰𐌲 𐍅𐌹𐍃𐌰𐌽 𐌿𐌽𐌲𐌰𐍆𐌰𐌿𐍂𐌳𐌰.",
"mypage": "𐌻𐌰𐌿𐍆𐍃",
"mytalk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹",
+ "anontalk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹",
"navigation": "𐌻𐌰𐌿𐌱𐌰𐌲𐌰𐍅𐌹𐍃𐍃𐌴𐌹𐍃",
"and": "𐌾𐌰𐌷",
+ "faq": "𐍆𐌹𐌻𐌿 𐍆𐍂𐌰𐌹𐌷𐌽𐌰𐌽𐍉𐍃 𐌱𐌹𐌳𐍉𐍃",
"actions": "𐍄𐍉𐌾𐌰",
"namespaces": "𐌽𐌰𐌼𐌰𐍂𐌿𐌼𐌰",
"variants": "𐌼𐌹𐍃𐍃𐌰𐌻𐌴𐌹𐌺",
+ "navigation-heading": "𐌱𐌰𐌿𐍄𐌰",
"errorpagetitle": "𐌰𐌹𐍂𐌶𐌴𐌹",
"returnto": "𐌲𐌰𐍅𐌰𐌽𐌳𐌴𐌹 𐌳𐌿 $1.",
"tagline": "𐍆𐍂𐌰𐌼 {{SITENAME}}",
"view": "𐍃𐌰𐌹𐍈",
"view-foreign": "𐍃𐌰𐌹𐍈 𐌰𐌽𐌰 $1",
"edit": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
+ "edit-local": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐍃𐍄𐌰𐌳𐌹𐍃 𐍃𐌺𐌴𐌹𐍂𐌴𐌹𐌽",
"create": "𐍃𐌺𐌰𐍀𐌴𐌹",
+ "create-local": "𐌰𐌽𐌰𐌰𐌹𐌰𐌿𐌺 𐍃𐍄𐌰𐌳𐌹𐍃 𐍃𐌺𐌴𐌹𐍂𐌴𐌹𐌽",
"delete": "𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌴𐌹",
"protect": "𐍆𐍂𐌹𐌸",
"protect_change": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
"talk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹",
"views": "𐍃𐌹𐌿𐌽𐌴𐌹𐍃",
"toolbox": "𐍃𐌰𐍂𐍅𐌰𐌽𐍃",
+ "tool-link-emailuser": "𐍃𐌰𐌽𐌳𐌴𐌹 𐌴-𐌱𐍉𐌺𐍉𐍃 𐌳𐌿 {{{{GENDER:$1|𐌼𐌰𐌽𐌽}}",
+ "imagepage": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐍆𐌰𐌾𐌻𐌰𐌻𐌰𐌿𐍆",
"mediawikipage": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐍅𐌰𐌿𐍂𐌳𐌰𐌻𐌰𐌿𐍆",
"viewhelppage": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐌷𐌹𐌻𐍀𐌰𐌻𐌰𐌿𐍆",
+ "viewtalkpage": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰",
"otherlanguages": "𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐍂𐌰𐌶𐌳𐍉𐌼",
"redirectedfrom": "(𐌹𐍃 {{GENDER:𐍄𐌹𐌿𐌷𐌰𐌽𐍃|𐍄𐌹𐌿𐌷𐌰𐌽𐌰}} 𐌷𐌹𐌳𐍂𐌴 𐍆𐍂𐌰𐌼 $1)",
"redirectpagesub": "𐌰𐌻𐌾𐌰𐍂 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
- "lastmodifiedat": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌸𐌰𐍄𐌰 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌸𐍃 𐍅𐌰𐍃 ($1) ($2).",
+ "lastmodifiedat": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌸𐌰𐍄𐌰 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌸𐍃 𐍅𐌰𐍃 $1, 𐌰𐍄 $2.",
"protectedpage": "𐍆𐍂𐌹𐌸𐍉𐌽𐍃 𐌻𐌰𐌿𐍆𐍃",
"jumpto": "𐌲𐌰𐌲𐌲 𐌳𐌿:",
"jumptonavigation": "𐌻𐌰𐌿𐌱𐌰𐌲𐌰𐍅𐌹𐍃𐍃𐌴𐌹𐍃",
"jumptosearch": "𐍃𐍉𐌺𐌴𐌹",
+ "view-pool-error": "𐌰𐍆𐌻𐌴𐍄 𐌿𐌽𐍃, 𐍃𐌺𐌰𐌻𐌺𐌹𐌽𐍉𐌽𐌳𐍃 𐌽𐌿 𐌿𐍆𐌰𐍂𐍆𐌹𐌻𐌿 𐌱𐍂𐌿𐌷𐍄𐌹𐌳𐌰𐌹 𐍃𐌹𐌽𐌳. 𐌿𐍆𐌰𐍂𐍆𐌹𐌻𐌿 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌴 𐍃𐍉𐌺𐌾𐌰𐌽𐌳 𐌳𐌿 𐌱𐌰𐌽𐌳𐍅𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆. 𐌱𐌹𐌳𐌾𐌰𐌼 𐌸𐌿𐌺, 𐌱𐌴𐌹𐌳 𐌻𐌰𐌲𐌲𐌹𐍃 𐌼𐌴𐌻𐌹𐍃 𐍆𐌰𐌿𐍂𐌸𐌹𐌶𐌴𐌹 𐌰𐍆𐍄𐍂𐌰 𐍃𐍉𐌺𐌾𐌰𐌹𐍃 𐌳𐌿 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽 𐌰𐌽𐌰 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰. \n\n$1",
"pool-errorunknown": "𐌽𐌰𐍃𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
+ "poolcounter-usage-error": "𐌱𐍂𐌿𐌺𐌴𐌹𐌽𐌰𐌹𐍃 𐌰𐌹𐍂𐌶𐌴𐌹: $1",
"aboutsite": "𐌱𐌹 {{SITENAME}}",
"aboutpage": "Project:𐌱𐌹",
"copyrightpage": "{{ns:project}}:𐌱𐍂𐌿𐌺𐌴𐌹𐌽𐌹𐍂𐌰𐌹𐌷𐍄𐌴𐌹𐍃",
"portal-url": "Project:𐌲𐌰𐌵𐌿𐌼𐌸𐍃 𐌲𐌰𐌼𐌰𐌹𐌽𐌳𐌿𐌸𐌰𐌹𐍃",
"privacy": "𐍃𐌿𐌽𐌳𐍂𐌰𐌻𐌴𐌹𐌺𐌴𐌹𐌽𐍃 𐌲𐌰𐍂𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
"privacypage": "Project:𐍃𐌿𐌽𐌳𐍂𐌰𐌻𐌴𐌹𐌺𐌴𐌹𐌽𐍃 𐌲𐌰𐍂𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
+ "badaccess": "𐌰𐌽𐌳𐌻𐌴𐍄𐌹𐍃 𐌰𐌹𐍂𐌶𐌴𐌹",
+ "badaccess-group0": "𐌽𐌹𐍃𐍄 𐌰𐌽𐌳𐌻𐌴𐍄 𐌸𐌿𐍃 𐌳𐌿 𐌿𐍃𐍄𐌹𐌿𐌷𐌰𐌽 𐍄𐌰𐌿𐌹 𐌸𐌰𐍄𐌴𐌹 𐌸𐌿 𐍅𐌹𐌻𐌳𐌴𐍃.",
+ "badaccess-groups": "𐍄𐌰𐌿𐌹 𐌸𐌰𐍄𐌴𐌹 𐌸𐌿 𐍅𐌹𐌻𐌳𐌴𐍃 𐌹𐍃𐍄 𐌼𐌰𐍂𐌺𐍉𐌸 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌰𐌼 𐌹𐌽 {{PLURAL:$2|𐌺𐌿𐌽𐌾𐌰|𐌰𐌹𐌽𐌰𐌼𐌼𐌰 𐌺𐌿𐌽𐌾𐌴}}: $1.",
+ "versionrequired": "𐌿𐍃𐌼𐌴𐍂𐌾𐌰 $1 𐌼𐌰𐌹𐌳𐌾𐌰𐍅𐌹𐌺𐌾𐌹𐍃 𐍃𐌺𐌿𐌻𐌳 𐌹𐍃𐍄",
"retrievedfrom": "𐌲𐌰𐌽𐌿𐌼𐌰𐌽 𐍆𐍂𐌰𐌼 \"$1\"",
"youhavenewmessages": "{{PLURAL:$3|𐌷𐌰𐌱𐌰𐌹𐍃}} $1 ($2).",
+ "youhavenewmessagesmanyusers": "𐌷𐌰𐌱𐌰𐌹𐍃 $1 𐌼𐌰𐌽𐌰𐌲𐌰𐌹𐌶𐌴 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌴 ($2).",
"newmessageslinkplural": "{{PLURAL:$1|𐌽𐌹𐍅𐌹 𐍅𐌰𐌿𐍂𐌳|999=𐌽𐌹𐌿𐌾𐌰 𐍅𐌰𐌿𐍂𐌳𐌰}}",
"newmessagesdifflinkplural": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰/𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃 {{PLURAL:$1|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃|999=𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃}}",
"youhavenewmessagesmulti": "𐌷𐌰𐌱𐌰𐌹𐍃 𐌽𐌹𐌿𐌾𐌰 𐍅𐌰𐌿𐍂𐌳𐌰 𐌰𐌽𐌰 $1",
"toc": "𐌹𐌽𐌽𐌰𐌽𐌰",
"showtoc": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹",
"hidetoc": "𐌰𐍆𐍆𐌹𐌻𐌷",
+ "collapsible-expand": "𐌿𐍆𐌸𐌰𐌽𐌴𐌹",
"confirmable-confirm": "𐌹𐍃 {{GENDER:$1:𐌸𐌿}} 𐌰𐍂𐌽𐌹𐌱𐌰?",
"confirmable-yes": "𐌾𐌰",
"confirmable-no": "𐌽𐌴",
+ "thisisdeleted": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐌸𐌰𐌿 𐌲𐌰𐌵𐌹𐌿𐌾𐌰𐌽 $1?",
+ "viewdeleted": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 $1?",
"site-rss-feed": "$1 RSS 𐍂𐌹𐌽𐌽𐍉",
"site-atom-feed": "$1 𐌰𐍄𐌰𐌿𐌼 𐍂𐌹𐌽𐌽𐍉",
"page-atom-feed": "\"$1\" 𐌰𐍄𐌰𐌿𐌼 𐍂𐌹𐌽𐌽𐍉",
"red-link-title": "$1 (𐌻𐌰𐌿𐍆𐍃 𐌽𐌹𐍃𐍄)",
"nstab-main": "𐌻𐌰𐌿𐍆𐍃",
"nstab-user": "𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌹𐍃 𐌻𐌰𐌿𐍆𐍃",
+ "nstab-media": "𐌼𐌰𐌹𐌳𐌾𐌰𐌻𐌰𐌿𐍆𐍃",
"nstab-special": "𐌿𐍃𐍃𐌹𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
"nstab-project": "𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐌰𐌻𐌰𐌿𐍆𐍃",
"nstab-image": "𐍆𐌰𐌾𐌻",
"nstab-help": "𐌷𐌹𐌻𐍀𐌰𐌻𐌰𐌿𐍆𐍃",
"nstab-category": "𐌺𐌿𐌽𐌹",
"mainpage-nstab": "𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌴𐌹𐌽𐌹𐌻𐌰𐌿𐍆𐍃",
+ "nosuchaction": "𐍃𐍅𐌰𐌻𐌴𐌹𐌺 𐍄𐌰𐌿𐌹 𐌽𐌹𐍃𐍄",
"nosuchspecialpage": "𐌽𐌹𐍃𐍄 𐍃𐍅𐌰𐌻𐌴𐌹𐌺𐍃 𐌿𐍃𐍃𐌹𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
"error": "𐌰𐌹𐍂𐌶𐌴𐌹",
+ "databaseerror": "𐌰𐌹𐍂𐌶𐌴𐌹𐌽𐍃 𐌳𐌰𐍄𐌰𐌷𐌿𐌶𐌳𐌹𐍃",
+ "databaseerror-function": "𐍆𐌿𐌽𐌺𐍄𐍃𐌾𐍉: $1",
"databaseerror-error": "𐌰𐌹𐍂𐌶𐌴𐌹: $1",
+ "readonly": "𐌳𐌰𐍄𐌰𐌷𐌿𐌶𐌳 𐌻𐌿𐌺𐌰𐌽 𐌹𐍃𐍄",
+ "enterlockreason": "𐌲𐌹𐍆 𐍅𐌰𐌹𐌷𐍄 𐌻𐌿𐌺𐌰, 𐌾𐌰𐌷 𐍃𐍅𐌰 𐌻𐌰𐌲𐌲𐌰𐌱𐌰 𐍆𐌰𐌿𐍂𐌸𐌹𐌶𐌴𐌹 𐌻𐌿𐌺 𐌿𐍃𐌼𐌴𐍂𐌽𐌰𐌹",
"missing-article": "𐌳𐌰𐍄𐌰𐌷𐌿𐌶𐌳 𐌽𐌹 𐌱𐌹𐌲𐌰𐍄 𐌱𐍉𐌺𐍉𐍃 𐌻𐌰𐌿𐌱𐌹𐍃 𐌸𐌹𐌶𐌴𐌹 𐍃𐌺𐌿𐌻𐌳𐌴𐌳𐌹 𐌱𐌹𐌲𐌹𐍄𐌰𐌽, 𐌷𐌰𐌹𐍄𐌰𐌽𐍃 \"$1\" $2. \n\n𐌸𐌰𐍄𐌰 𐌿𐍆𐍄𐌰 𐍅𐌰𐌹𐍂𐌸𐌹𐌸 𐌾𐌰𐌱𐌰𐌹 𐌻𐌰𐌹𐍃𐍄𐌾𐌰𐌳𐌰 𐍆𐌰𐌹𐍂𐌽𐌾𐌰 𐌳𐌹𐍆𐍆 𐌸𐌰𐌿 𐍃𐍀𐌹𐌻𐌻𐌰𐌲𐌰𐍅𐌹𐍃𐍃 𐍃𐌴𐌹 𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌹𐌳𐌰 𐌹𐍃𐍄. 𐌾𐌰𐌱𐌰𐌹 𐌽𐌹𐍃𐍄, 𐌼𐌰𐌷𐍄𐍃 𐌹𐍃𐍄 𐌴𐌹 𐌱𐌹𐌲𐌴𐍄𐌴𐌹𐍃 𐌰𐌹𐍂𐌶𐌴𐌹𐌽 𐌹𐌽 𐍃𐌰𐌿𐍆𐍄𐍅𐌰𐌹𐍂𐌰. \n\n𐌱𐌹𐌳𐌾𐌰𐌼 𐌸𐌿𐌺, 𐌼𐌴𐍂𐌴𐌹 𐌸𐌰𐍄𐌰 𐌳𐌿 [[Special:ListUsers/sysop\n|𐍂𐌴𐌹𐌺]] 𐌲𐌹𐍆𐌿𐌷 𐌲𐌰𐍅𐌹𐍃.",
"badarticleerror": "𐌸𐍉 𐍅𐌰𐌹𐌷𐍄 𐌽𐌹 𐌼𐌰𐌲𐍄 𐍄𐌰𐌿𐌾𐌰𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.",
"cannotdelete-title": "𐌽𐌹 𐌼𐌰𐌲 𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌾𐌰𐌽 𐌻𐌰𐌿𐌱𐌰 \"$1\"",
"badtitle": "𐌿𐌽𐍂𐌰𐌹𐌷𐍄𐌰𐍄𐌰 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹",
"badtitletext": "𐍆𐍂𐌰𐌹𐌷𐌰𐌽𐍃 𐌻𐌰𐌿𐍆𐍃 𐍅𐌰𐍃 𐌿𐌽𐌲𐌰𐌼𐌰𐌲𐌰𐌽𐌳𐍃, 𐌻𐌰𐌿𐍃, 𐌰𐌹𐌸𐌸𐌰𐌿 𐌿𐌽𐍂𐌰𐌹𐌷𐍄𐌰𐌱𐌰 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐍃 𐌼𐌹𐌸𐍂𐌰𐌶𐌳𐌰 𐌸𐌰𐌿 𐌼𐌹𐌸-𐍅𐌹𐌺𐌹 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹. 𐌼𐌰𐌲𐌹 𐌷𐌰𐌱𐌰𐌽 𐌰𐌹𐌽𐌰 𐌸𐌰𐌿 𐌼𐌰𐌽𐌰𐌲𐌹𐌶𐍉𐍃 𐌱𐍉𐌺𐍉𐍃 𐌱𐍂𐌿𐌺𐌹𐌳𐍉𐍃 𐌹𐌽 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌾𐌰𐌼.",
"viewsource": "𐍃𐌰𐌹𐍈 𐌱𐍂𐌿𐌽𐌽𐌰𐌽",
+ "viewsource-title": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐌱𐍂𐌿𐌽𐌽𐌰𐌽 𐍆𐌰𐌿𐍂 $1",
"protectedpagetext": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌷𐌰𐌱𐌰𐌹𐌸 𐌼𐌿𐌽𐌳, 𐌴𐌹 𐌽𐌹 𐍅𐌰𐌹𐍂𐌸𐌴𐌹𐌽𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌸𐌰𐌿 𐌰𐌽𐌸𐌰𐍂𐍉𐍃 𐍅𐌰𐌹𐌷𐍄𐍃 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
+ "viewsourcetext": "𐌼𐌰𐌲𐍄 𐌱𐌰𐌽𐌳𐍅𐌾𐌰𐌽 𐌾𐌰𐌷 𐌺𐌰𐌿𐍀𐌾𐌰 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌹𐍃 𐌻𐌰𐌿𐌱𐌹𐍃.",
+ "mycustomcssprotected": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐌳𐌿 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 CSS 𐌻𐌰𐌿𐍆.",
+ "mycustomjsonprotected": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐌳𐌿 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 JSON 𐌻𐌰𐌿𐍆.",
"mycustomjsprotected": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐌳𐌿 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 JavaScript 𐌻𐌰𐌿𐍆.",
+ "ns-specialprotected": "𐌿𐍃𐍃𐌹𐌽𐌳𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌽𐌹 𐌼𐌰𐌲𐌿𐌽 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐌰.",
+ "cannotlogoutnow-title": "𐌰𐍆𐌻𐌴𐌹𐌸𐌰𐌽 𐌽𐌿 𐌼𐌰𐌷𐍄𐍃 𐌽𐌹𐍃𐍄",
+ "cannotlogoutnow-text": "𐌸𐌰𐌽 $1 𐌱𐍂𐌿𐌺𐌾𐌰𐌳𐌰 𐌰𐍆𐌻𐌴𐌹𐌸𐌰𐌽 𐌼𐌰𐌷𐍄𐍃 𐌽𐌹𐍃𐍄.",
"welcomeuser": "𐍅𐌰𐌹𐌻𐌰 𐌰𐌽𐌳𐌰𐌽𐌴𐌼𐍃, $1!",
"yourname": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉:",
"userlogin-yourname": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉",
"createacct-yourpasswordagain": "𐌲𐌰𐍃𐌹𐌲𐌻𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳",
"createacct-yourpasswordagain-ph": "𐌼𐌴𐌻𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳 𐌰𐍆𐍄𐍂𐌰",
"userlogin-remembermypassword": "𐌲𐌰𐍆𐌰𐍃𐍄 𐌼𐌹𐌺 {{GENDER:𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌽𐌰|𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰}}",
+ "userlogin-signwithsecure": "𐌱𐍂𐌿𐌺𐌴𐌹 𐌰𐍂𐌽𐌾𐌰𐌹𐌶𐍉𐍃 𐌲𐌰𐍅𐌹𐍃𐌰𐌹𐍃",
"cannotloginnow-title": "𐌽𐌿 𐌽𐌹 𐌼𐌰𐌲𐍄 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽",
"login": "𐌰𐍄𐌲𐌰𐌲𐌲",
"nav-login-createaccount": "𐌰𐍄𐌲𐌰𐌲𐌲 / 𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
"userlogin-helplink2": "𐌷𐌹𐌻𐍀𐌰 𐌼𐌹𐌸 𐌰𐍄𐌲𐌰𐌲𐌲𐌰",
"createacct-emailoptional": "𐌴-𐌱𐍉𐌺𐍉𐍃 (𐌼𐌰𐌷𐍄𐌴𐌹𐌲𐍉𐍃)",
"createacct-email-ph": "𐌼𐌴𐌻𐌴𐌹 𐌸𐌴𐌹𐌽𐍉𐍃 𐌴-𐌱𐍉𐌺𐍉𐍃",
+ "createacct-another-email-ph": "𐌼𐌴𐌻𐌴𐌹 𐌴-𐌱𐍉𐌺𐍉𐍃",
"createacct-reason": "𐌲𐍂𐌿𐌽𐌳𐌿𐍃",
"createacct-submit": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌸𐌴𐌹𐌽𐌰 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
"createacct-benefit-heading": "{{SITENAME}} 𐍄𐌰𐍅𐌹𐌸 𐌹𐍃𐍄 𐍆𐍂𐌰𐌼 𐌼𐌰𐌽𐌽𐌰𐌼 𐍃𐍅𐌴 𐌸𐌿𐌺.",
"difference-multipage": "(𐌰𐌽𐌸𐌰𐍂𐌻𐌴𐌹𐌺𐌾𐌰 𐌼𐌹𐌸 𐌻𐌰𐌿𐌱𐌰𐌼)",
"lineno": "𐍃𐍄𐍂𐌹𐌺𐍃 $1:",
"editundo": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌰𐍆𐍄𐍂𐌰",
+ "diff-empty": "(𐌽𐌹 𐌰𐌽𐌸𐌰𐍂𐌻𐌴𐌹𐌺𐌴𐌹)",
"diff-multi-sameuser": "({{PLURAL:$1|𐌰𐌹𐌽𐌰 𐌼𐌹𐌳𐌿𐌼𐌰𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍃|$1 𐌼𐌹𐌳𐌿𐌼𐌰 𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍉𐍃}} 𐍆𐍂𐌰𐌼 𐍃𐌰𐌼𐌹𐌽 𐌱𐍂𐌿𐌺𐌾𐌹𐌽 𐌽𐌹 𐌰𐍄𐌰𐌿𐌲𐌹𐌳𐌰/𐌰𐍄𐌰𐌿𐌲𐌹𐌳𐍉𐍃)",
"searchresults": "𐍃𐍉𐌺𐌴𐌹𐌽𐌰𐌹𐍃 𐍄𐍉𐌾𐌰",
"searchresults-title": "𐍃𐍉𐌺𐌴𐌹𐌽𐌰𐌹𐍃 𐍄𐍉𐌾𐌰 𐍆𐌰𐌿𐍂 \"$1\"",
"nchanges": "$1 {{PLURAL:$1|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃}}",
"enhancedrc-history": "𐍃𐍀𐌹𐌻𐌻",
"recentchanges": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
+ "recentchanges-legend": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰𐌹𐌶𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉 𐌼𐌰𐌷𐍄𐌴𐌹𐍃",
"recentchanges-summary": "𐌰𐍆𐌰𐍂𐌻𐌰𐌹𐍃𐍄𐌴𐌹 𐌸𐌰𐌹𐌼 𐌰𐌽𐌳𐍅𐌰𐌹𐍂𐌸𐌹𐍃𐍄𐍉𐌼 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐌼 𐌳𐌿 𐍅𐌹𐌺𐌾𐌰 𐌰𐌽𐌰 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.",
"recentchanges-label-newpage": "𐍃𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐌲𐌰𐍃𐌺𐍉𐍀 𐌽𐌹𐌿𐌾𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
"recentchanges-label-minor": "𐌸𐌰𐍄𐌰 𐌹𐍃𐍄 𐌻𐌴𐌹𐍄𐌹𐌻𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
"recentchanges-label-bot": "𐍃𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐍄𐍉𐌾𐌰𐌳𐌰 𐍅𐌰𐍂𐌸 𐍆𐍂𐌰𐌼 𐌼𐌰𐌷𐍄𐌹𐍃𐌺𐌰𐌻𐌺𐌰 (𐌱𐌰𐌿𐍄)",
+ "recentchanges-label-unpatrolled": "𐍃𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐌽𐌰𐌿𐌷 𐌽𐌹𐍃𐍄 𐍅𐌰𐍂𐌳𐌹𐌳𐌰",
"recentchanges-label-plusminus": "𐌻𐌰𐌿𐌱𐌰𐌼𐌹𐌺𐌹𐌻𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌳𐌰 𐌼𐌹𐌸 𐌸𐌹𐌶𐌰𐌹 𐍂𐌰𐌸𐌾𐍉𐌽 𐌱𐌹𐍄𐍉",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (𐍃𐌰𐌹𐍈 𐌾𐌰𐌷[[Special:NewPages|𐍅𐌹𐌺𐍉 𐌽𐌹𐌿𐌾𐌰𐌹𐌶𐌴 𐌻𐌰𐌿𐌱𐌴]])",
"rcfilters-limit-title": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌳𐌿 𐌱𐌰𐌽𐌳𐍅𐌾𐌰𐌽",
"rcshowhideanons": "$1 𐌰𐍆𐍆𐌹𐌻𐌷𐌰𐌽𐌰𐌹 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐍃",
"rcshowhideanons-show": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹",
"rcshowhideanons-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
+ "rcshowhidepatr": "$1 𐍅𐌰𐍂𐌳𐌹𐌳𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
"rcshowhidemine": "$1 𐌼𐌴𐌹𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
"rcshowhidemine-show": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹",
"rcshowhidemine-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
"newpageletter": "N",
"boteditletter": "b",
"rc-change-size-new": "$1 {{PLURAL:$1|𐌱𐌰𐌾𐍄|𐌱𐌰𐌾𐍄𐌰}} 𐌰𐍆𐌰𐍂 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌰𐌹",
+ "rc-old-title": "𐌸𐌰𐍄𐌴𐌹 𐍆𐍂𐌿𐌼𐌹𐍃𐍄 𐌲𐌰𐍃𐌺𐌰𐍀𐌰𐌽 𐌹𐍃𐍄 𐍃𐍅𐌰 \"$1\"",
"recentchangeslinked": "𐌲𐌰𐌱𐌿𐌽𐌳𐌰𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
"recentchangeslinked-feed": "𐌲𐌰𐌱𐌿𐌽𐌳𐌰𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
"recentchangeslinked-toolbox": "𐌲𐌰𐌱𐌿𐌽𐌳𐌰𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
"booksources": "𐌱𐍉𐌺𐌰𐌱𐍂𐌿𐌽𐌽𐌰𐌽𐍃",
"booksources-search-legend": "𐍃𐍉𐌺𐌴𐌹 𐌱𐍉𐌺𐌰𐌱𐍂𐌿𐌽𐌽𐌰𐌽𐍃",
"booksources-search": "𐍃𐍉𐌺𐌴𐌹",
- "specialloguserlabel": "Niutand:",
+ "specialloguserlabel": "𐍄𐌰𐌿𐌾𐌰𐌽𐌳𐍃:",
"speciallogtitlelabel": "Namo:",
"log": "𐌻𐌰𐌿𐌲𐌰",
"all-logs-page": "𐌰𐌻𐌻𐌰 𐌰𐌽𐌳𐌰𐌿𐌲𐌾𐍉 𐌻𐌰𐌿𐌲𐌰",
"allpagessubmit": "𐌲𐌰𐌲𐌲",
"categories": "𐌺𐌿𐌽𐌾𐌰",
"linksearch-ns": "𐌽𐌰𐌼𐌰𐍂𐌿𐌼:",
+ "listgrouprights-members": "(𐍅𐌹𐌺𐍉 𐌲𐌰𐌳𐌰𐌹𐌻𐌰𐌽𐌴)",
"emailuser": "{{GENDER: 𐍃𐌰𐌽𐌳𐌴𐌹 𐌴-𐌱𐍉𐌺𐍉𐍃 𐌳𐌿 𐌸𐌰𐌼𐌼𐌰 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳|𐍃𐌰𐌽𐌳𐌴𐌹 𐌴-𐌱𐍉𐌺𐍉𐍃 𐌳𐌿 𐌸𐌹𐌶𐌰𐌹 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌾𐌰𐌹}}",
"watchlist": "𐍅𐌹𐍄𐌰𐍅𐌹𐌺𐍉",
"mywatchlist": "𐍅𐌹𐍄𐌰𐍅𐌹𐌺𐍉",
"watchthispage": "𐌰𐍄𐍅𐌹𐍄 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
"unwatch": "𐌿𐌽𐍅𐌹𐍄",
"watchlist-details": "{{PLURAL:$1|$1 𐌻𐌰𐌿𐍆𐍃|$1 𐌻𐌰𐌿𐌱𐍉𐍃}} 𐌰𐌽𐌰 𐌸𐌴𐌹𐌽𐌰𐌹 𐍅𐌹𐍄𐌰𐍅𐌹𐌺𐍉𐌽, 𐌽𐌹 𐍃𐌿𐌽𐌳𐍂𐍉 𐍂𐌰𐌷𐌽𐌾𐌰𐌽𐌳𐌰 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰𐌻𐌰𐌿𐌱𐍉𐍃.",
+ "wlheader-showupdated": "𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌳𐌰𐌹 𐍃𐌹𐌽𐌳 𐍆𐍂𐌰𐌼 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰𐌼𐌼𐌰 𐌼𐌴𐌻𐌰 𐌸𐌰𐍄𐌴𐌹 𐌲𐌰𐍅𐌴𐌹𐍃𐍉𐌳𐌴𐍃 𐌱𐌰𐌽𐌳𐍅𐌹𐌳𐌰𐌹 𐍃𐌹𐌽𐌳 𐌹𐌽 <strong>𐍃𐍅𐌹𐌽𐌸𐌰𐌹𐌼 𐌱𐍉𐌺𐍉𐌼</strong>.",
"watching": "𐍅𐌹𐍄𐌰𐌽𐌳𐍃...",
"unwatching": "𐌿𐌽𐍅𐌹𐍄𐌰𐌽𐌳𐍃...",
"created": "𐌲𐌰𐍃𐌺𐌰𐍀𐌾𐌰𐌽",
"contributions": "𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴𐌹𐍃 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌹𐍃 {{{{GENDER:$1|User}}",
"mycontris": "𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴𐌹𐍃",
"contribsub2": "𐍆𐌰𐌿𐍂 $1 ($2)",
+ "nocontribs": "𐌽𐌹 𐌱𐌹𐌲𐌹𐍄𐌰𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌲𐌰𐌻𐌴𐌹𐌺𐍉𐌽𐌳𐌴𐌹𐌽𐍃 𐌸𐌰𐌹𐌼 𐌱𐌹𐌳𐍉𐌼.",
"uctop": "(𐌷𐌰𐌿𐌱𐌹𐌸)",
"month": "𐍆𐍂𐌰𐌼 𐌼𐌴𐌽𐍉𐌸 (𐌾𐌰𐌷 𐌰𐌹𐍂𐌹𐍃):",
"year": "𐍆𐍂𐌰𐌼 𐌾𐌴𐍂𐌰 (𐌾𐌰𐌷 𐌰𐌹𐍂𐌹𐍃):",
"sp-contributions-newbies-sub": "𐌽𐌹𐌿𐌾𐌰𐌹𐌼 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌼",
"sp-contributions-blocklog": "𐍆𐌰𐌿𐍂𐌳𐌰𐌼𐌼𐌴𐌹𐌽𐌰𐌹𐍃 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌹𐌽𐍃.",
+ "sp-contributions-uploads": "𐌰𐍄𐌱𐌰𐌹𐍂𐌹𐌳𐍉𐍃 𐍅𐌰𐌹𐌷𐍄𐍃",
"sp-contributions-talk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹",
+ "sp-contributions-username": "IP 𐍃𐍄𐌰𐌸𐍃 𐌸𐌰𐌿 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉:",
"sp-contributions-submit": "𐍃𐍉𐌺𐌴𐌹",
"whatlinkshere": "𐌰𐌻𐌻𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺 𐌷𐌹𐌳𐍂𐌴",
"whatlinkshere-title": "𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐍄𐌰𐌹𐌺𐌽𐌾𐌰𐌽𐌳 𐌳𐌿 \"$1\"",
"whatlinkshere-page": "𐌻𐌰𐌿𐍆𐍃:",
- "linkshere-2": "𐌹𐍆𐍄𐌿𐌼𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺 <strong>$1</strong>:",
+ "linkshere-2": "𐌹𐍆𐍄𐌿𐌼𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺 <strong>$2</strong>:",
"isredirect": "𐌰𐌻𐌾𐌰𐍂 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
"istemplate": "𐍄𐍂𐌰𐌽𐍃𐌺𐌻𐌿𐍃𐌾𐍉",
+ "isimage": "𐍆𐌰𐌾𐌻𐌰𐌲𐌰𐍅𐌹𐍃𐍃",
"whatlinkshere-prev": "{{PLURAL:$1|𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰|𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰𐌽𐍃 $1}}",
"whatlinkshere-next": "{{PLURAL:$1|𐌹𐍆𐍄𐌿𐌼𐌰|𐌹𐍆𐍄𐌿𐌼𐌰𐌽𐍃 $1}}",
"whatlinkshere-links": "← 𐌲𐌰𐍅𐌹𐍃𐍃𐌴𐌹𐍃",
"pageinfo-display-title": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌾𐌰",
"pageinfo-article-id": "𐌻𐌰𐌿𐌱𐌹𐍃 𐌹𐌳",
"pageinfo-robot-index": "𐌰𐌽𐌳𐌻𐌴𐍄𐌰𐌽",
+ "pageinfo-robot-noindex": "𐌰𐌽𐌳𐌻𐌴𐍄𐌰𐌽 𐌽𐌹𐍃𐍄",
+ "pageinfo-subpages-name": "𐍂𐌰𐌸𐌾𐍉 𐌼𐌹𐌽𐌽𐌹𐌶𐌰𐌽𐌴 𐌻𐌰𐌿𐌱𐌴 𐌸𐌹𐍃 𐌻𐌰𐌿𐌹𐍃",
"pageinfo-firstuser": "𐌻𐌰𐌿𐌱𐌰𐍃𐌺𐌰𐍀𐌾𐌰𐌽𐌳𐍃",
"pageinfo-lastuser": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐍃",
+ "pageinfo-edits": "𐌰𐌻𐌻𐌰 𐍂𐌰𐌸𐌾𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉",
+ "pageinfo-authors": "𐌰𐌻𐌻𐌰 𐍂𐌰𐌸𐌾𐍉 𐌼𐌹𐍃𐍃𐌰𐌻𐌴𐌹𐌺𐌰𐌹𐌶𐌴 𐌱𐍉𐌺𐌰𐍂𐌾𐌴",
"pageinfo-recent-edits": "𐌰𐌽𐌳𐍅𐌰𐌹𐍂𐌸𐌰 𐍂𐌰𐌸𐌾𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉 (𐌹𐌽 $1)",
"pageinfo-recent-authors": "𐌰𐌽𐌳𐍅𐌰𐌹𐍂𐌸𐌰 𐍂𐌰𐌸𐌾𐍉 𐌼𐌹𐍃𐍃𐌰𐌻𐌴𐌹𐌺𐌰𐌹𐌶𐌴 𐌼𐌴𐌻𐌾𐌰𐌽𐌳𐌴",
"pageinfo-magic-words": "{{PLURAL:$1|𐌻𐌿𐌱𐌾𐌰𐌻𐌴𐌹𐍃|𐌻𐌿𐌱𐌾𐌰𐌻𐌴𐌹𐍃𐌰}} {{PLURAL:$1|𐍅𐌰𐌿𐍂𐌳|𐍅𐌰𐌿𐍂𐌳𐌰}} ($1)",
+ "pageinfo-hidden-categories": "{{PLURAL:$1|𐌰𐌽𐌰𐌻𐌰𐌿𐌲𐌽 𐌺𐌿𐌽𐌹|𐌰𐌽𐌰𐌻𐌰𐌿𐌲𐌽𐌰 𐌺𐌿𐌽𐌾𐌰}} ($1)",
"pageinfo-toolboxlink": "𐌺𐌿𐌽𐌸𐌹 𐌻𐌰𐌿𐌱𐌹𐍃",
"pageinfo-contentpage-yes": "𐌾𐌰𐌹",
"previousdiff": "← 𐍆𐌰𐌹𐍂𐌽𐌹𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
"nextdiff": "𐌽𐌹𐌿𐌾𐌹𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 →",
+ "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|𐌻𐌰𐌿𐍆𐍃|𐌻𐌰𐌿𐌱𐍉𐍃}}",
"file-info-size": "$1 × $2 𐍀𐌹𐌺𐍃𐌴𐌻𐌰, 𐍆𐌴𐌹𐌻𐍅𐌰𐌷𐍃𐍄𐌿𐍃: $3, 𐌼𐌹𐌼𐌴 𐌺𐌿𐌽𐌹: $4",
"show-big-image": "𐍆𐍂𐌿𐌼𐌹𐍃𐍄 𐍆𐌰𐌾𐌻",
"show-big-image-preview": "𐌼𐌹𐌺𐌹𐌻𐌴𐌹 𐌸𐌹𐌶𐍉𐍃 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽𐌰𐌹𐍃: $1.",
"show-big-image-size": "$1 × $2 𐍆𐍂𐌹𐍃𐌰𐌷𐍄𐌹𐍃𐍄𐌰𐌱𐌴𐌹𐍃",
"ilsubmit": "𐍃𐍉𐌺𐌴𐌹",
"metadata": "𐌿𐍆𐌰𐍂𐌳𐌰𐍄𐌰",
+ "exif-software": "𐌱𐍂𐌿𐌺𐌹𐌸 𐍃𐌰𐌿𐍆𐍄𐍅𐌰𐌹𐍂",
+ "exif-exifversion": "Exif 𐌿𐍃𐌼𐌴𐍂𐌹",
"exif-colorspace": "𐍆𐌰𐍂𐍅𐌰𐍂𐌿𐌼",
"exif-orientation-1": "𐌱𐌹 𐌱𐌹𐌿𐌷𐍄𐌾𐌰",
"namespacesall": "𐌰𐌻𐌻",
"imgmultigo": "𐌲𐌰𐌲𐌲!",
"imgmultigoto": "𐌲𐌰𐌲𐌲 𐌳𐌿 𐌻𐌰𐌿𐌱𐌰 $1",
"table_pager_limit_submit": "Affgaggan",
+ "watchlisttools-view": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌲𐌰𐌲𐌰𐌷𐌰𐍆𐍄𐌹𐌳𐍉𐍃 𐌳𐌿 𐌸𐌰𐌼𐌼𐌰",
"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰]])",
"version-other": "Anþar",
"version-poweredby-translators": "translatewiki.net 𐌲𐌰𐍃𐌺𐌴𐌹𐍂𐌾𐌰𐌽𐍃",
"redirect-submit": "𐌲𐌰𐌲𐌲",
"redirect-value": "𐍅𐌰𐌹𐍂𐌸:",
+ "redirect-page": "𐌻𐌰𐌿𐌱𐌹𐍃 ID",
"redirect-revision": "𐌰𐍆𐍄𐍂𐌰𐍃𐌹𐌿𐌽𐍃 𐌻𐌰𐌿𐌱𐌹𐍃",
"redirect-file": "𐍆𐌰𐌾𐌻𐌰𐌽𐌰𐌼𐍉",
"specialpages": "𐌿𐍃𐍃𐌹𐌽𐌳𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|𐍃𐍉𐌺𐌴𐌹𐌽𐌹𐍅𐌰𐌿𐍂𐌳|𐍃𐍉𐌺𐌴𐌹𐌽𐌹𐍅𐌰𐌿𐍂𐌳𐌰}}]]: $2)",
"tags-source-header": "𐌱𐍂𐌿𐌽𐌽𐌰",
"tags-actions-header": "𐍄𐍉𐌾𐌰",
+ "tags-active-yes": "𐌾𐌰𐌹",
"tags-source-none": "𐌽𐌹 𐌾𐌿 𐌱𐍂𐌿𐌺𐌾𐌰𐌳𐌰",
"tags-edit": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
"tags-delete": "𐌿𐍃𐌽𐌹𐌼",
"whatlinkshere": "Τὰ ἐνθάδε ἄγοντα",
"whatlinkshere-title": "Δέλτοι συνεζευγμέναι μετὰ τοῦ \"$1\"",
"whatlinkshere-page": "Δέλτος:",
- "linkshere-2": "Τάδε ἄγουσι πρὸς '''$1''':",
- "nolinkshere-2": "Οὐδένα ἄγουσι πρὸς '''$1'''.",
- "nolinkshere-ns-2": "Οὐδεμία δέλτος συνδέεται τῇ '''$1''' ἐν τῷ ἐπιλεγμένῳ ὀνοματείῳ.",
+ "linkshere-2": "Τάδε ἄγουσι πρὸς '''$2''':",
+ "nolinkshere-2": "Οὐδένα ἄγουσι πρὸς '''$2'''.",
+ "nolinkshere-ns-2": "Οὐδεμία δέλτος συνδέεται τῇ '''$2''' ἐν τῷ ἐπιλεγμένῳ ὀνοματείῳ.",
"isredirect": "ἀναδιευθύνειν δέλτον",
"istemplate": "περίκλεισις",
"isimage": "σύνδεσμος ἀρχείου",
"whatlinkshere": "Was verwyst do druff?",
"whatlinkshere-title": "Sytene, wo uf „$1“ verlinke",
"whatlinkshere-page": "Syte:",
- "linkshere-2": "Die Sytene hen e Link, wu zu '''„$1“''' fiere:",
- "nolinkshere-2": "Kei Artikel verwyyst uf '''„$1“'''.",
- "nolinkshere-ns-2": "Kei Syte verwyyst uf '''„$1“''' im gwehlte Namensruum.",
+ "linkshere-2": "Die Sytene hen e Link, wu zu '''„$2“''' fiere:",
+ "nolinkshere-2": "Kei Artikel verwyyst uf '''„$2“'''.",
+ "nolinkshere-ns-2": "Kei Syte verwyyst uf '''„$2“''' im gwehlte Namensruum.",
"isredirect": "Wyterleitigssyte",
"istemplate": "Vorlageybindig",
"isimage": "Dateigleich",
"whatlinkshere": "અહી શું જોડાય છે",
"whatlinkshere-title": "\"$1\" ને જોડતા પાનાં",
"whatlinkshere-page": "પાનું:",
- "linkshere-2": "નીચેના પાનાઓ '''$1''' સાથે જોડાય છે:",
- "nolinkshere-2": "'''$1'''ની સાથે કોઇ પાના જોડાતા નથી.",
- "nolinkshere-ns-2": "પસંદ કરેલ નામ સ્થળમાં કોઇ પાના '''$1''' સાથે જોડાયેલ નથી.",
+ "linkshere-2": "નીચેના પાનાઓ '''$2''' સાથે જોડાય છે:",
+ "nolinkshere-2": "'''$2'''ની સાથે કોઇ પાના જોડાતા નથી.",
+ "nolinkshere-ns-2": "પસંદ કરેલ નામ સ્થળમાં કોઇ પાના '''$2''' સાથે જોડાયેલ નથી.",
"isredirect": "દિશાનિર્દેશ કરેલ પાનું",
"istemplate": "સમાવેશ",
"isimage": "ફાઇલની કડી",
"whatlinkshere": "Cre ta kiangley rish shoh",
"whatlinkshere-title": "Duillagyn ta kianglt rish $1",
"whatlinkshere-page": "Duillag:",
- "linkshere-2": "Ta ny duillagyn shoh kianglt rish '''$1''':",
- "nolinkshere-2": "Cha nel duillag erbee kianglt rish '''$1'''.",
+ "linkshere-2": "Ta ny duillagyn shoh kianglt rish '''$2''':",
+ "nolinkshere-2": "Cha nel duillag erbee kianglt rish '''$2'''.",
"isredirect": "duillag aa-enmyssit",
"istemplate": "goaill stiagh",
"isimage": "kiangley coadan",
"whatlinkshere": "Mahaɗan wannan shafi",
"whatlinkshere-title": "Shafuna masu mahaɗi da \"$1\"",
"whatlinkshere-page": "Shafi:",
- "linkshere-2": "Waɗannan shafuna sun haɗu da '''$1''':",
+ "linkshere-2": "Waɗannan shafuna sun haɗu da '''$2''':",
"isredirect": "shafin turawa",
"istemplate": "gami",
"isimage": "majigi shigagge",
"whatlinkshere": "Nâi-têu lièn to liá-têu",
"whatlinkshere-title": "Lièn-chiap to \"$1\" ke ya̍p-mien",
"whatlinkshere-page": "Ya̍p-mien:",
- "linkshere-2": "Hâ-poi ya̍p-mien lièn-chiap to <strong>$1</strong>:",
- "nolinkshere-2": "無頁面鏈接到'''$1'''。",
- "nolinkshere-ns-2": "Chhai só-sién ke miàng-sṳ khûng-kiên tú mò ya̍p-mien lièn-chiap to $1.",
+ "linkshere-2": "Hâ-poi ya̍p-mien lièn-chiap to <strong>$2</strong>:",
+ "nolinkshere-2": "無頁面鏈接到'''$2'''。",
+ "nolinkshere-ns-2": "Chhai só-sién ke miàng-sṳ khûng-kiên tú mò ya̍p-mien lièn-chiap to $2.",
"isredirect": "chhùng-thin-hiong ya̍p",
"istemplate": "pâu-hàm",
"isimage": "vùn-khien lièn-chiap",
"whatlinkshere": "He aha ka mea e loulou iho ai",
"whatlinkshere-title": "Nā ʻAoʻao e loulou iā \"$1\"",
"whatlinkshere-page": "‘Ao‘ao:",
- "linkshere-2": "Loulou kēia mau ʻaoʻao iā <strong>$1</strong>:",
- "nolinkshere-2": "ʻAʻohe ‘ao‘ao e loulou iā '''$1'''.",
+ "linkshere-2": "Loulou kēia mau ʻaoʻao iā <strong>$2</strong>:",
+ "nolinkshere-2": "ʻAʻohe ‘ao‘ao e loulou iā '''$2'''.",
"isredirect": "ʻaoʻao kia hou",
"istemplate": "kumo",
"isimage": "loulou waihona",
"whatlinkshere": "דפים המקושרים לכאן",
"whatlinkshere-title": "דפים המקשרים לדף \"$1\"",
"whatlinkshere-page": "דף:",
- "linkshere-2": "הדפים שלהלן מקשרים לדף <strong>$1</strong>:",
- "nolinkshere-2": "אין דפים המקשרים לדף <strong>$1</strong>.",
- "nolinkshere-ns-2": "אין דפים המקשרים לדף <strong>$1</strong> במרחב השם שנבחר.",
+ "linkshere-2": "הדפים שלהלן מקשרים לדף <strong>$2</strong>:",
+ "nolinkshere-2": "אין דפים המקשרים לדף <strong>$2</strong>.",
+ "nolinkshere-ns-2": "אין דפים המקשרים לדף <strong>$2</strong> במרחב השם שנבחר.",
"isredirect": "דף הפניה",
"istemplate": "הכללה",
"isimage": "קישור לקובץ",
"blockipsuccesstext": "{{GENDER:$1|המשתמש|המשתמשת}} [[Special:Contributions/$1|$1]] {{GENDER:$1|נחסם|נחסמה}}.<br />\nניתן לעיין ב[[Special:BlockList|רשימת החסומים]] כדי לצפות בחסימות.",
"ipb-blockingself": "החשבון שלך ייחסם! האם ברצונך לעשות זאת?",
"ipb-confirmhideuser": "החשבון ייחסם עם האפשרות \"הסתרת משתמש\". זה יעלים את שם המשתמש בכל הרשימות ופעולות היומן. האם ברצונך לעשות זאת?",
- "ipb-confirmaction": "אם {{GENDER:|אתה בטוח שברצונך|את בטוחה שברצונך|אתם בטוחים שברצונכם}} לעשות זאת, אנא {{GENDER:|סמן|סמני|סמנו}} את השדה \"{{int:ipb-confirm}}\" שמופיע למטה.",
+ "ipb-confirmaction": "אם באמת התכוונת לעשות זאת, יש לסמן את השדה \"{{int:ipb-confirm}}\" שמופיע למטה.",
"ipb-edit-dropdown": "עריכת סיבות החסימה",
"ipb-unblock-addr": "שחרור חסימה של $1",
- "ipb-unblock": "שחרור חסימה של משתמש או כתובת IP",
+ "ipb-unblock": "ש×\97ר×\95ר ×\97ס×\99×\9e×\94 ש×\9c ×\9eשת×\9eש ×\90×\95 ש×\9c ×\9bת×\95×\91ת IP",
"ipb-blocklist": "הצגת החסימות הנוכחיות",
"ipb-blocklist-contribs": "תרומות של {{GENDER:$1|$1}}",
- "ipb-blocklist-duration-left": "× ×\95תר×\95 $1",
+ "ipb-blocklist-duration-left": "×\94×\96×\9e×\9f ×©× ×\95תר: $1",
"unblockip": "שחרור חסימה של משתמש",
- "unblockiptext": "{{GENDER:|השתמש|השתמשי|השתמשו}} בטופס שלהלן כדי להחזיר את הרשאות הכתיבה לכתובת IP חסומה או למשתמש חסום.",
+ "unblockiptext": "ניתן להשתמש בטופס שלהלן כדי להחזיר את הרשאות הכתיבה לכתובת IP חסומה או למשתמש חסום.",
"ipusubmit": "הסרת חסימה זו",
"unblocked": "[[User:$1|$1]] {{GENDER:$1|שוחרר מחסימתו|שוחררה מחסימתה}}.",
- "unblocked-range": "$1 שוחרר מחסימתו.",
+ "unblocked-range": "חסימת הטווח $1 שוחררה.",
"unblocked-id": "חסימה מספר $1 שוחררה.",
- "unblocked-ip": "[[Special:Contributions/$1|$1]] שוחררה מחסימתה.",
+ "unblocked-ip": "הכתובת [[Special:Contributions/$1|$1]] שוחררה מחסימתה.",
"blocklist": "משתמשים חסומים",
"autoblocklist": "חסימות אוטומטיות",
"autoblocklist-submit": "חיפוש",
"whatlinkshere": "यहाँ क्या जुड़ता है",
"whatlinkshere-title": "$1 से जुड़े हुए पृष्ठ",
"whatlinkshere-page": "पृष्ठ:",
- "linkshere-2": "नीचे दिये हुए पृष्ठ '''$1''' से जुडते हैं:",
- "nolinkshere-2": "<strong>$1</strong> से कोई भी पन्ना नहीं जुड़ा है।",
- "nolinkshere-ns-2": "चुने हुए नामस्थानसे '''$1''' को जुडने वाले पृष्ठ नहीं हैं।",
+ "linkshere-2": "नीचे दिये हुए पृष्ठ '''$2''' से जुडते हैं:",
+ "nolinkshere-2": "<strong>$2</strong> से कोई भी पन्ना नहीं जुड़ा है।",
+ "nolinkshere-ns-2": "चुने हुए नामस्थानसे '''$2''' को जुडने वाले पृष्ठ नहीं हैं।",
"isredirect": "पुनर्निर्देशन पृष्ठ",
"istemplate": "मिलाईयें",
"isimage": "फ़ाइल प्रयोग",
"whatlinkshere": "Hian konchij jurre hae",
"whatlinkshere-title": "Panna jon ki $1 se jurre hai",
"whatlinkshere-page": "Panna:",
- "linkshere-2": "Niche waala panna '''$1''' se jorre hai:",
- "nolinkshere-2": "Koi panna '''$1''' ke nai jorre hai.",
- "nolinkshere-ns-2": "Chuna gais namespace me koi panna '''$1''' se nai jiurre hai.",
+ "linkshere-2": "Niche waala panna '''$2''' se jorre hai:",
+ "nolinkshere-2": "Koi panna '''$2''' ke nai jorre hai.",
+ "nolinkshere-ns-2": "Chuna gais namespace me koi panna '''$2''' se nai jiurre hai.",
"isredirect": "panna ke redirect karo",
"istemplate": "milao",
"isimage": "file ke jorr",
"whatlinkshere": "Ang nagatabid diri",
"whatlinkshere-title": "Mga pahina nga naga tabid sa $1",
"whatlinkshere-page": "Pahina:",
- "linkshere-2": "Ang mga sumunod nga pahina ay nagatabid sa '''$1''':",
- "nolinkshere-2": "Waay panid nga nakasugpon sa '''$1'''.",
+ "linkshere-2": "Ang mga sumunod nga pahina ay nagatabid sa '''$2''':",
+ "nolinkshere-2": "Waay panid nga nakasugpon sa '''$2'''.",
"isredirect": "pahina sa ginadirekta liwat",
"istemplate": "transklusyon",
"isimage": "Ang sugpon sang file",
"prefs-dateformat": "Format datuma",
"prefs-timeoffset": "Vremensko poravnavanje",
"prefs-advancedediting": "Napredne mogućnosti",
+ "prefs-developertools": "Razvijateljski alati",
"prefs-editor": "Uređivač",
"prefs-preview": "Prikaži kako će izgledati",
"prefs-advancedrc": "Napredne mogućnosti",
"protectedtitles-submit": "Prikaži nazive",
"listusers": "Popis suradnika",
"listusers-editsonly": "Prikaži samo suradnike s uređivanjem",
+ "listusers-temporarygroupsonly": "Pokaži samo suradnike u privremenim suradničkim skupinama",
"listusers-creationsort": "Razvrstaj po datumu stvaranja",
"listusers-desc": "Sortiraj obrnutim redoslijedom",
"usereditcount": "$1 {{PLURAL:$1|uređivanje|uređivanja|uređivanja}}",
"whatlinkshere": "Što vodi ovamo",
"whatlinkshere-title": "Stranice koje vode na »$1«",
"whatlinkshere-page": "Stranica:",
- "linkshere-2": "Sljedeće stranice povezuju ovamo ($1):",
- "nolinkshere-2": "Nijedna stranica ne vodi ovamo (tj. nema poveznica na stranicu $1).",
- "nolinkshere-ns-2": "Nijedna stranica ne vodi na '''$1''' u odabranom imenskom prostoru.",
+ "linkshere-2": "Sljedeće stranice povezuju ovamo ($2):",
+ "nolinkshere-2": "Nijedna stranica ne vodi ovamo (tj. nema poveznica na stranicu $2).",
+ "nolinkshere-ns-2": "Nijedna stranica ne vodi na '''$2''' u odabranom imenskom prostoru.",
"isredirect": "stranica za preusmjeravanje",
"istemplate": "kao predložak",
"isimage": "poveznica na datoteku",
"whatlinkshere": "Links uff die Seit",
"whatlinkshere-title": "Seite, die uff \"$1\" verlinke",
"whatlinkshere-page": "Seit:",
- "linkshere-2": "Die follichende Seite verlinke uff '''\"$1\"''':",
- "nolinkshere-2": "Ken Seit verlinkt uff '''„$1“'''.",
- "nolinkshere-ns-2": "Ken Seit verlinkt uff '''\"$1\"''' im gewählte Noomeraum.",
+ "linkshere-2": "Die follichende Seite verlinke uff '''\"$2\"''':",
+ "nolinkshere-2": "Ken Seit verlinkt uff '''„$2“'''.",
+ "nolinkshere-ns-2": "Ken Seit verlinkt uff '''\"$2\"''' im gewählte Noomeraum.",
"isredirect": "Weiterleitungsseit",
"istemplate": "Voarlooche-einbinnunge (transclusões)",
"isimage": "Dateilink",
"whatlinkshere": "Što wotkazuje sem",
"whatlinkshere-title": "Strony, kotrež na „$1“ wotkazuja",
"whatlinkshere-page": "Strona:",
- "linkshere-2": "Sćěhowace strony na stronu '''$1''' wotkazuja:",
- "nolinkshere-2": "Žane strony na '''$1''' njewotkazuja.",
- "nolinkshere-ns-2": "Žane strony njewotkazuja na '''$1''' we wubranym mjenowym rumje.",
+ "linkshere-2": "Sćěhowace strony na stronu '''$2''' wotkazuja:",
+ "nolinkshere-2": "Žane strony na '''$2''' njewotkazuja.",
+ "nolinkshere-ns-2": "Žane strony njewotkazuja na '''$2''' we wubranym mjenowym rumje.",
"isredirect": "daleposrědkowanje",
"istemplate": "zapřijeće předłohi",
"isimage": "Datajowy wotkaz",
"whatlinkshere": "Paj ki gen lyen vè paj sa a",
"whatlinkshere-title": "Paj ki genyen lyen ki ap mennen nan \"$1\"",
"whatlinkshere-page": "Paj :",
- "linkshere-2": "Paj yo ki anba ap mene nan <b>$1</b> :",
- "nolinkshere-2": "Pyès paj genyen lyen pou paj sa a <b>$1</b>.",
+ "linkshere-2": "Paj yo ki anba ap mene nan <b>$2</b> :",
+ "nolinkshere-2": "Pyès paj genyen lyen pou paj sa a <b>$2</b>.",
"isredirect": "paj redireksyon",
"istemplate": "anndan",
"isimage": "lyen fichye a",
"whatlinkshere": "Mi hivatkozik erre",
"whatlinkshere-title": "A(z) „$1” lapra hivatkozó lapok",
"whatlinkshere-page": "Lap:",
- "linkshere-2": "Az alábbi lapok hivatkoznak erre: $1",
- "nolinkshere-2": "$1: erre a lapra egyetlen más lap sem hivatkozik.",
- "nolinkshere-ns-2": "A kiválasztott névtérben egyetlen oldal sem hivatkozik a(z) '''$1''' lapra.",
+ "linkshere-2": "Az alábbi lapok hivatkoznak erre: $2",
+ "nolinkshere-2": "$2: erre a lapra egyetlen más lap sem hivatkozik.",
+ "nolinkshere-ns-2": "A kiválasztott névtérben egyetlen oldal sem hivatkozik a(z) '''$2''' lapra.",
"isredirect": "átirányítás",
"istemplate": "beillesztve",
"isimage": "fájlhivatkozás",
"whatlinkshere": "Այստեղ հղվող էջերը",
"whatlinkshere-title": "Էջեր, որոնք հղում են դեպի «$1»",
"whatlinkshere-page": "Էջ.",
- "linkshere-2": "Հետևյալ էջերը հղում են '''$1''' էջին.",
- "nolinkshere-2": "Ուրիշ էջերից '''$1''' էջին հղումներ չկան։",
- "nolinkshere-ns-2": "Ընտրված անվանատարածքում '''$1''' էջին հղվող էջեր չկան։",
+ "linkshere-2": "Հետևյալ էջերը հղում են '''$2''' էջին.",
+ "nolinkshere-2": "Ուրիշ էջերից '''$2''' էջին հղումներ չկան։",
+ "nolinkshere-ns-2": "Ընտրված անվանատարածքում '''$2''' էջին հղվող էջեր չկան։",
"isredirect": "վերահղման էջ",
"istemplate": "ներառում",
"isimage": "ֆայլի հղում",
"whatlinkshere": "Paginas ligate a iste",
"whatlinkshere-title": "Paginas con ligamines verso $1",
"whatlinkshere-page": "Pagina:",
- "linkshere-2": "Le sequente paginas contine ligamines a <strong>$1</strong>:",
- "nolinkshere-2": "Nulle pagina contine un ligamine verso <strong>$1</strong>.",
- "nolinkshere-ns-2": "Nulle pagina liga a <strong>$1</strong> in le spatio de nomines seligite.",
+ "linkshere-2": "Le sequente paginas contine ligamines a <strong>$2</strong>:",
+ "nolinkshere-2": "Nulle pagina contine un ligamine verso <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Nulle pagina liga a <strong>$2</strong> in le spatio de nomines seligite.",
"isredirect": "pagina de redirection",
"istemplate": "transclusion",
"isimage": "ligamine al file",
"whatlinkshere": "Pranala balik",
"whatlinkshere-title": "Halaman yang memiliki pranala ke \"$1\"",
"whatlinkshere-page": "Halaman:",
- "linkshere-2": "Halaman-halaman berikut ini memiliki pranala ke '''$1''':",
- "nolinkshere-2": "Tidak ada halaman yang memiliki pranala ke '''$1'''.",
- "nolinkshere-ns-2": "Tidak ada halaman yang memiliki pranala ke '''$1''' pada ruang nama yang dipilih.",
+ "linkshere-2": "Halaman-halaman berikut ini memiliki pranala ke '''$2''':",
+ "nolinkshere-2": "Tidak ada halaman yang memiliki pranala ke '''$2'''.",
+ "nolinkshere-ns-2": "Tidak ada halaman yang memiliki pranala ke '''$2''' pada ruang nama yang dipilih.",
"isredirect": "halaman pengalihan",
"istemplate": "tranklusi",
"isimage": "pranala berkas",
"whatlinkshere": "Referenties a ti-ci págine",
"whatlinkshere-title": "Págines quo liga por \"$1\"",
"whatlinkshere-page": "Págine:",
- "linkshere-2": "Li sequent págines liga por '''$1''':",
- "nolinkshere-2": "Nequant págine liga por '''$1'''.",
+ "linkshere-2": "Li sequent págines liga por '''$2''':",
+ "nolinkshere-2": "Nequant págine liga por '''$2'''.",
"isredirect": "págine de redirecterion",
"istemplate": "inclusion",
"isimage": "referentie a un file",
"whatlinkshere": "Ihe na bia nga",
"whatlinkshere-title": "Ihü ná gá \"$1\" shí jikodo",
"whatlinkshere-page": "Ihü:",
- "linkshere-2": "Ihüá na gá '''$1''':",
- "nolinkshere-2": "Ọ díghị ihü na jikodo gá '''$1'''.",
- "nolinkshere-ns-2": "Ọ díghị ihü na jikodo gá '''$1''' na áhàámá nke Í chọrọ.",
+ "linkshere-2": "Ihüá na gá '''$2''':",
+ "nolinkshere-2": "Ọ díghị ihü na jikodo gá '''$2'''.",
+ "nolinkshere-ns-2": "Ọ díghị ihü na jikodo gá '''$2''' na áhàámá nke Í chọrọ.",
"isredirect": "ihü nke nkúfù",
"istemplate": "ọ jè ákwúkwó usòrò",
"isimage": "jikodo nnunuuche",
"whatlinkshere": "Dagiti nakasilpo ditoy",
"whatlinkshere-title": "Pampanid a nakasilpo iti \"$1\"",
"whatlinkshere-page": "Panid:",
- "linkshere-2": "Dagiti sumaganad a panid ket nakasilpo iti <strong>$1</strong>:",
- "nolinkshere-2": "Awan ti pampanid a nakasilpo iti <strong>$1</strong>.",
- "nolinkshere-ns-2": "Awan ti pampanid a nakasilpo iti <strong>$1</strong> iti napili a nagan ti espasio.",
+ "linkshere-2": "Dagiti sumaganad a panid ket nakasilpo iti <strong>$2</strong>:",
+ "nolinkshere-2": "Awan ti pampanid a nakasilpo iti <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Awan ti pampanid a nakasilpo iti <strong>$2</strong> iti napili a nagan ti espasio.",
"isredirect": "baw-ing a panid",
"istemplate": "mailak-am",
"isimage": "silpo ti papeles",
"grouppage-bureaucrat": "{{ns:project}}:Бюрократаш",
"right-read": "оагӀонашка хьажар",
"right-edit": "оагӀонаш нийсъяр",
+ "right-createpage": "дувцара оагIонаш йоаца оагӀонаш кхоллар",
"right-createtalk": "дувца оттадара оагӀонаш кхоллар",
+ "right-createaccount": "доакъашхошта керда дагара йоазонаш кхоллар",
"right-move": "оагIонай цIераш хувцар",
"right-movefile": "файлай цӀераш хувцар",
+ "right-autoconfirmed": "IP-цIай тIара сухала доазув дар Iехадар",
"right-writeapi": "дIаяздеш лелае API",
+ "right-editsemiprotected": "оагIонаш тоаяр, лораяь йола иштта «{{int:protect-level-autoconfirmed}}»",
+ "right-viewmywatchlist": "ший зема хьаязъяьрага хьажар",
+ "right-editmywatchlist": "ший зема хьаязъяьр хувцар",
+ "right-viewmyprivateinfo": "шийх лаьца долчунга хьажар (масала, электронни пошта цIай, боккъонца йола цӀи)",
+ "right-editmyprivateinfo": "хьайх лаьца дар хувцар (масала, электронни пошта цIай, боккъонца йола цӀи)",
+ "right-editmyoptions": "ший хьадаь оттамаш хувцар",
+ "right-noratelimit": "сухала доазув дар Iехадар",
"newuserlogpage": "Доакъашхой дIаязбаь таптар",
"rightslog": "Доакъашхочун бокъоний тéптар",
"action-read": "ер оагӀув éшар",
"linksearch-line": "$1 яхача оагIонна тIатовжам $2 чура",
"activeusers": "Хьинаре доакъашхой",
"activeusers-submit": "Хьахьокха хьинаре бола доакъашхой",
- "listgrouprights": "Доакъашхой тоабай бокъонаш",
+ "listgrouprights": "Доакъашхой тоабан бокъонаш",
+ "listgrouprights-summary": "ЛохегIа Iохьоахаяьй укх вике чу йола доакъашхой тоабаш. Белгалъяьй цар торонаши бокъонаши.\nИштта, эшаш хила мег [[{{MediaWiki:Listgrouprights-helppage}}|кхыбола хоам]] а.",
+ "listgrouprights-key": "Легенда:\n* <span class=\"listgrouprights-granted\">ДIаенна бокъонаш</span>\n* <span class=\"listgrouprights-revoked\">ДӀаяьха бакъонаш</span>",
+ "listgrouprights-group": "Тоаба",
+ "listgrouprights-rights": "Бокъонаш",
"listgrouprights-members": "(доакъашхой хьаязъяьр)",
"listgrouprights-namespaceprotection-namespace": "ЦIерий моттиг",
+ "listgrants-rights": "Бокъонаш",
"emailuser": "Доакъашхочоа каьхат",
"usermessage-editor": "Системан дIакхоачадар",
"watchlist": "Зем",
"protect-cascadeon": "Каскадни лорадар оттадаь йолча {{PLURAL:$1|1=кIалхагIа белгалъяь оагIон чу|кIалхагIа белгалъяь оагIонаш чу}} юкъеяьккха хилара бахьане ер оагIув хIанза лораяь я. Укх оагIон лорадара дарж хувцаро каскадни лорадар меттахдоаккхадац.",
"protect-default": "Лорадар доацаш",
"protect-fallback": "Могадаьд алхха ше «$1» волача доакъашхошта",
- "protect-level-autoconfirmed": "Могадаьд алхха ше-ше къоабалбаь хинна доакъашхошта",
+ "protect-level-autoconfirmed": "Могадаьд алхха автохьатIаийца доакъашхошта",
"protect-level-sysop": "Могадаьд алхха администраторашта",
"protect-summary-cascade": "каскадни",
"protect-expiring": "чакхъйоала $1 (UTC)",
"whatlinkshere": "Тӏатовжамаш укхаза",
"whatlinkshere-title": "«$1» яхача оагӏонна тӏатовжаш йола оагӏонаш",
"whatlinkshere-page": "ОагIув:",
- "linkshere-2": "«'''$1'''» ← укхунна тӀахьожавеш я тӀехьайоагӀа оагӀонаш:",
- "nolinkshere-2": "Кхыйолча оагӏонашкара '''$1''' яхача оагӏон тIатовжамаш доацаш да.",
+ "linkshere-2": "«'''$2'''» ← укхунна тӀахьожавеш я тӀехьайоагӀа оагӀонаш:",
+ "nolinkshere-2": "Кхыйолча оагӏонашкара '''$2''' яхача оагӏон тIатовжамаш доацаш да.",
"isredirect": "дIа-хьа хьожавара оагIув",
"istemplate": "юкъейоалаяр",
"isimage": "Файлови тӏатовжам",
"exif-exposureprogram-1": "Кара",
"exif-scenecapturetype-1": "Ландшафт",
"exif-scenecapturetype-2": "Сага сурт",
+ "exif-dc-rights": "Бокъонаш",
"exif-iimcategory-edu": "Дешарца Iомадар",
"exif-iimcategory-evn": "Гонахье",
"exif-iimcategory-hth": "УнахцIано",
"tog-watchlisthideminor": "Celez mikra redaktaji de la surveyaji",
"tog-watchlisthideliu": "Celar l'editadi dal uzanti enrejistrita qui esas en la listo",
"tog-watchlistreloadautomatically": "Rimontrez automatale la listo, kande filtrilo modifikesos (bezonas JavaScript)",
- "tog-watchlistunwatchlinks": "Add direct unwatch/watch links to watchlist entries (bezonas l'uzo di JavaScript)",
+ "tog-watchlistunwatchlinks": "Adjuntar direkta ligili ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) a la listi di pagini modifikita (bezonas l'uzo di JavaScript)",
"tog-watchlisthideanons": "Celar de la listo l'editadi facita da anonima redakteri",
"tog-watchlisthidepatrolled": "Celez patroliita chanji en la surveyo-listo",
"tog-watchlisthidecategorization": "Celar la kategorizeso di pagini",
"badarticleerror": "Ica ago ne povas facesar en ca pagino.",
"cannotdelete": "Ne es posibla efacar la pagino od arkivo \"$1\".\nForsan, ulu ja efacis ol.",
"cannotdelete-title": "Ne povas efacar pagino \"$1\"",
+ "delete-hook-aborted": "L'efaco di la pagino abortesis da ula extenso (\"hook\").\nNe existas expliko pri to.",
"no-null-revision": "Ne povis krear nova nula-revizo por pagino \"$1\"",
"badtitle": "Nekorekta titulo",
"badtitletext": "La solicitita pagino esas nevalida, vakua od esas\nnekorekta interlinguale od interwikale ligilo.",
"cascadeprotected": "Ica pagino protektesis kontre l'editado pro ke lua kontenajo transskribesas en la sequanta {{PLURAL:$1|pagino, qua esas|pagini, qui esas}} protektita kande selektesis por ol la formo di \"protekto en kaskado\":\n$2",
"namespaceprotected": "Vu ne es permisita redaktar pagini en la nomaro <strong>$1</strong>.",
"customcssprotected": "Vu ne es permisita redaktar ita CSS pagino nam ol kontenas personal ajustaji di altra uzero.",
+ "customjsonprotected": "Vu ne havas permiso por redaktar ica pagino JSON pro ke ol kontenas personal ajustaji di altra uzero.",
"customjsprotected": "Vu ne es permisita redaktar ita JavaScript pagino nam ol kontenas personal ajustaji di altra uzero.",
"mycustomcssprotected": "Vu ne es permisita redaktar ita CSS pagino.",
+ "mycustomjsonprotected": "Vu ne es permisita redaktar ita pagino JSON.",
"mycustomjsprotected": "Vu ne es permisita redaktar ita JavaScript pagino.",
"myprivateinfoprotected": "Vu ne es permisita redaktar vua privata informajo.",
"mypreferencesprotected": "Vu ne es permisita redaktar vua preferaji.",
"notextmatches": "Nula paginala texto fitas",
"prevn": "antea {{PLURAL:$1|$1}}",
"nextn": "sequanta {{PLURAL:$1|$1}}",
+ "prev-page": "Antea pagino",
"prevn-title": "Antea $1 {{PLURAL:$1|rezultajo|rezultaji}}",
"nextn-title": "Sequanta $1 {{PLURAL:$1|rezultajo|rezultaji}}",
"shown-title": "Montrez $1 {{PLURAL:$1|rezulto|rezulti}} per pagino",
"enotif_anon_editor": "anonima uzero $1",
"deletepage": "Efacar pagino",
"confirm": "Konfirmez",
- "excontent": "La kontenajo esis: '$1'",
+ "excontent": "La kontenajo esis: \"$1\"",
"excontentauthor": "la kontenajo esis: \"$1\", e l'unika redaktero esis \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
"exbeforeblank": "La kontenajo ante efaco esis: '$1'",
"delete-confirm": "Efacar \"$1\"",
"whatlinkshere": "Quo ligesas adhike",
"whatlinkshere-title": "Pagini qui ligas ad \"$1\"",
"whatlinkshere-page": "Pagino:",
- "linkshere-2": "Ca pagini esas ligilizita ad '''$1''':",
- "nolinkshere-2": "Nula pagino ligas ad '''$1'''.",
+ "linkshere-2": "Ca pagini esas ligilizita ad '''$2''':",
+ "nolinkshere-2": "Nula pagino ligas ad '''$2'''.",
"isredirect": "ridirektanta pagino",
"istemplate": "inkluzo",
"isimage": "arkivo-ligilo",
"whatlinkshere": "Hvað tengist hingað",
"whatlinkshere-title": "Síður sem tengjast „$1“",
"whatlinkshere-page": "Síða:",
- "linkshere-2": "Eftirfarandi síður tengjast á '''$1''':",
- "nolinkshere-2": "Engar síður tengjast á '''$1'''.",
- "nolinkshere-ns-2": "Engar síður tengjast '''$1''' í þessu nafnrými.",
+ "linkshere-2": "Eftirfarandi síður tengjast á '''$2''':",
+ "nolinkshere-2": "Engar síður tengjast á '''$2'''.",
+ "nolinkshere-ns-2": "Engar síður tengjast '''$2''' í þessu nafnrými.",
"isredirect": "endurbeind síða",
"istemplate": "innifalið",
"isimage": "skráartengill",
"whatlinkshere": "Puntano qui",
"whatlinkshere-title": "Pagine che puntano a \"$1\"",
"whatlinkshere-page": "Pagina:",
- "linkshere-2": "Le seguenti pagine contengono dei collegamenti a <strong>$1</strong>:",
- "nolinkshere-2": "Nessuna pagina contiene collegamenti che puntano a '''$1'''.",
- "nolinkshere-ns-2": "Non vi sono pagine che puntano a '''$1''' nel namespace selezionato.",
+ "linkshere-2": "Le seguenti pagine contengono dei collegamenti a <strong>$2</strong>:",
+ "nolinkshere-2": "Nessuna pagina contiene collegamenti che puntano a '''$2'''.",
+ "nolinkshere-ns-2": "Non vi sono pagine che puntano a '''$2''' nel namespace selezionato.",
"isredirect": "redirect",
"istemplate": "inclusione",
"isimage": "collegamento al file",
"whatlinkshere": "リンク元",
"whatlinkshere-title": "「$1」へリンクしているページ",
"whatlinkshere-page": "ページ:",
- "linkshere-2": "以下のページが、<strong>$1</strong> にリンクしています:",
- "nolinkshere-2": "<strong>$1</strong> にリンクしているページはありません。",
- "nolinkshere-ns-2": "指定した名前空間内に、<strong>$1</strong> にリンクしているページはありません。",
+ "linkshere-2": "以下のページが、<strong>$2</strong> にリンクしています:",
+ "nolinkshere-2": "<strong>$2</strong> にリンクしているページはありません。",
+ "nolinkshere-ns-2": "指定した名前空間内に、<strong>$2</strong> にリンクしているページはありません。",
"isredirect": "転送ページ",
"istemplate": "参照読み込み",
"isimage": "ファイルへのリンク",
"whatlinkshere": "Wa lingk ya",
"whatlinkshere-title": "Piej wa lingk tu \"$1\"",
"whatlinkshere-page": "Piej:",
- "linkshere-2": "Di falarin piejdem lingk tu '''$1''':",
+ "linkshere-2": "Di falarin piejdem lingk tu '''$2''':",
"isredirect": "riidirek piej",
"istemplate": "chranskluujan",
"isimage": "fail lingk",
"whatlinkshere": "Hwa henwise hertil",
"whatlinkshere-title": "Side som linke te $1",
"whatlinkshere-page": "Siid:",
- "linkshere-2": "Di följenje side henwise te '''„$1“''':",
- "nolinkshere-2": "Ien side henwise te '''„$1“'''.",
+ "linkshere-2": "Di följenje side henwise te '''„$2“''':",
+ "nolinkshere-2": "Ien side henwise te '''„$2“'''.",
"isredirect": "omdirigiirengssiid",
"istemplate": "inlejreng",
"isimage": "filhenwisneng",
"whatlinkshere": "Sing nggayut mréné",
"whatlinkshere-title": "Kaca mawa pranala nggayut \"$1\"",
"whatlinkshere-page": "Kaca:",
- "linkshere-2": "Kaca-kaca ing ngisor iki nggayut menyang <strong>$1</strong>:",
- "nolinkshere-2": "Ora ana kaca sing nduwé pranala menyang '''$1'''.",
- "nolinkshere-ns-2": " Ora ana kaca sing nduwé pranala menyang '''$1''' ing bilik jeneng sing kapilih.",
+ "linkshere-2": "Kaca-kaca ing ngisor iki nggayut menyang <strong>$2</strong>:",
+ "nolinkshere-2": "Ora ana kaca sing nduwé pranala menyang '''$2'''.",
+ "nolinkshere-ns-2": " Ora ana kaca sing nduwé pranala menyang '''$2''' ing bilik jeneng sing kapilih.",
"isredirect": "kaca lih-lihan",
"istemplate": "tranklusi",
"isimage": "pranala barkas",
"whatlinkshere": "ბმული გვერდზე",
"whatlinkshere-title": "გვერდები, რომლებიც შეიცავენ „$1“-ის ბმულებს",
"whatlinkshere-page": "გვერდი:",
- "linkshere-2": "მომდევნო გვერდები შეიცავენ ბმულებს '''$1'''-ზე:",
- "nolinkshere-2": "'''$1'''-ზე ბმული არ არის.",
- "nolinkshere-ns-2": "არჩეულ სახელთა სივრცეში არ არის გვერდები, რომლებიც მისამართდება '''$1'''.",
+ "linkshere-2": "მომდევნო გვერდები შეიცავენ ბმულებს '''$2'''-ზე:",
+ "nolinkshere-2": "'''$2'''-ზე ბმული არ არის.",
+ "nolinkshere-ns-2": "არჩეულ სახელთა სივრცეში არ არის გვერდები, რომლებიც მისამართდება '''$2'''.",
"isredirect": "გადამისამართების გვერდი",
"istemplate": "ჩართვა",
"isimage": "ბმული ფაილზე",
"whatlinkshere": "Siltelgen betler",
"whatlinkshere-title": "\"$1\" betine siltelgen betler",
"whatlinkshere-page": "Bet:",
- "linkshere-2": "To'mendegi betler mınag'an siltelgen: '''$1''':",
- "nolinkshere-2": "'''$1''' degenge hesh bet siltemeydi.",
+ "linkshere-2": "To'mendegi betler mınag'an siltelgen: '''$2''':",
+ "nolinkshere-2": "'''$2''' degenge hesh bet siltemeydi.",
"isredirect": "burıwshı bet",
"istemplate": "qosıw",
"isimage": "fayl siltewi",
"whatlinkshere": "Ayen i d-yettawi ɣer da",
"whatlinkshere-title": "Isebtaren i sɛan azday ɣer « $1 »",
"whatlinkshere-page": "Asebter :",
- "linkshere-2": "Isebtar-agi sɛan azday ɣer '''$1''':",
- "nolinkshere-2": "Ulac asebter i yesɛan azday ɣer '''$1'''.",
- "nolinkshere-ns-2": "Ulac asebter i yesɛan azday ɣer '''$1''' deg yisem n taɣult i textareḍ.",
+ "linkshere-2": "Isebtar-agi sɛan azday ɣer '''$2''':",
+ "nolinkshere-2": "Ulac asebter i yesɛan azday ɣer '''$2'''.",
+ "nolinkshere-ns-2": "Ulac asebter i yesɛan azday ɣer '''$2''' deg yisem n taɣult i textareḍ.",
"isredirect": "Asebter n usemmimeḍ",
"istemplate": "asekcam",
"isimage": "azday ɣer afaylu",
"whatlinkshere": "ТехьэпӀэхэр мыбдеж",
"whatlinkshere-title": "«$1» техьэ напэкІуэцІхэр",
"whatlinkshere-page": "НапэкIуэцI:",
- "linkshere-2": "Мыбым '''$1''' тохьэ напэкӀуэцӀхэр:",
+ "linkshere-2": "Мыбым '''$2''' тохьэ напэкӀуэцӀхэр:",
"isredirect": "напэкIуэцI-егъэкIуэкIа",
"istemplate": "хэгъэхьэныгъэ",
"isimage": "сурэтым и техьэпӀэ",
"whatlinkshere": "Takayɩhatʋ kɩtamtʋ",
"whatlinkshere-title": "Takayɩhatʋ ndʋ tɩtamsɩna \\ $1 \\ yɔ",
"whatlinkshere-page": "Takayɩhayʋʋ :",
- "linkshere-2": "Takayɩhatʋ ndʋ tɩwɛ pɩ-tɛɛ yɔ tɩwɛna kpasɩ <strong>$1<strong> yɔɔ:",
+ "linkshere-2": "Takayɩhatʋ ndʋ tɩwɛ pɩ-tɛɛ yɔ tɩwɛna kpasɩ <strong>$2<strong> yɔɔ:",
"isredirect": "Kɩpɩsɩnaʋ takayɩhayʋʋ",
"istemplate": "tɛɣʋ",
"isimage": "takayaɣ yɔɔ kpayaɣ",
"whatlinkshere": "ھیارا کیہ کیہ لنک شینی",
"whatlinkshere-title": "لنک شدہ صفحات \"$1\"",
"whatlinkshere-page": " صفحہ:",
- "linkshere-2": " '''$1''' درج ذیل صفحات لنک کوری شینی:",
- "nolinkshere-2": "'''$1''' کیہ روابط نیکی",
+ "linkshere-2": " '''$2''' درج ذیل صفحات لنک کوری شینی:",
+ "nolinkshere-2": "'''$2''' کیہ روابط نیکی",
"isredirect": "خور ژاغا آلدو صفحہ",
"istemplate": "ٹرانسکلوژن",
"isimage": "ھوٹوان لنک",
"whatlinkshere": "Çı itay rê gırê beno",
"whatlinkshere-title": "Pelê ke be \"$1\"i bestninê pa",
"whatlinkshere-page": "Pele:",
- "linkshere-2": "Ni pelgi '''$1'''i asnenê:",
- "nolinkshere-2": "Pelgê ke '''$1'''i asnenê çinê.",
+ "linkshere-2": "Ni pelgi '''$2'''i asnenê:",
+ "nolinkshere-2": "Pelgê ke '''$2'''i asnenê çinê.",
"isredirect": "pela ciheti",
"istemplate": "ilawekerdis",
"isimage": "girê dosya",
"whatlinkshere": "سىلتەلگەن بەتتەر",
"whatlinkshere-title": "$1 دەگەنگە سىلتەلگەن بەتتەر",
"whatlinkshere-page": "بەت:",
- "linkshere-2": "'''$1''' دەگەنگە مىنا بەتتەر سىلتەيدى:",
- "nolinkshere-2": "'''$1''' دەگەنگە ەش بەت سىلتەمەيدى.",
- "nolinkshere-ns-2": "تاڭدالعان ەسىم اياسىندا '''$1''' دەگەنگە ەشقانداي بەت سىلتەمەيدى.",
+ "linkshere-2": "'''$2''' دەگەنگە مىنا بەتتەر سىلتەيدى:",
+ "nolinkshere-2": "'''$2''' دەگەنگە ەش بەت سىلتەمەيدى.",
+ "nolinkshere-ns-2": "تاڭدالعان ەسىم اياسىندا '''$2''' دەگەنگە ەشقانداي بەت سىلتەمەيدى.",
"isredirect": "ايداتۋ بەتى",
"istemplate": "كىرىكبەت",
"isimage": "سۋرەت سىلتەمەسى",
"whatlinkshere": "Мұнда сілтейтін беттер",
"whatlinkshere-title": "$1 дегенге сілтейтін беттер",
"whatlinkshere-page": "Бет:",
- "linkshere-2": "'''$1''' дегенге мына беттер сілтейді:",
- "nolinkshere-2": "'''$1''' дегенге еш бет сілтемейді.",
- "nolinkshere-ns-2": "Таңдалған есім кеңістігінде '''$1''' дегенге ешқандай бет сілтемейді.",
+ "linkshere-2": "'''$2''' дегенге мына беттер сілтейді:",
+ "nolinkshere-2": "'''$2''' дегенге еш бет сілтемейді.",
+ "nolinkshere-ns-2": "Таңдалған есім кеңістігінде '''$2''' дегенге ешқандай бет сілтемейді.",
"isredirect": "бағыттау беті",
"istemplate": "кіріcтірілген",
"isimage": "файл сілтемесі",
"whatlinkshere": "Mında silteýtin better",
"whatlinkshere-title": "$1 degenge silteýtin better",
"whatlinkshere-page": "Bet:",
- "linkshere-2": "'''$1''' degenge mına better silteýdi:",
- "nolinkshere-2": "'''$1''' degenge eş bet siltemeýdi.",
- "nolinkshere-ns-2": "Tañdalğan esim ayasında '''$1''' degenge eşqandaý bet siltemeýdi.",
+ "linkshere-2": "'''$2''' degenge mına better silteýdi:",
+ "nolinkshere-2": "'''$2''' degenge eş bet siltemeýdi.",
+ "nolinkshere-ns-2": "Tañdalğan esim ayasında '''$2''' degenge eşqandaý bet siltemeýdi.",
"isredirect": "aýdatw beti",
"istemplate": "kirikbet",
"isimage": "swret siltemesi",
"whatlinkshere": "អ្វីដែលភ្ជាប់មកទីនេះ",
"whatlinkshere-title": "ទំព័រនានាដែលតភ្ជាប់ទៅ \"$1\"",
"whatlinkshere-page": "ទំព័រ៖",
- "linkshere-2": "ទំព័រដូចតទៅនេះតភ្ជាប់មក '''$1''' ៖",
- "nolinkshere-2": "គ្មានទំព័រណាមួយតភ្ជាប់ទៅ '''$1''' ទេ។",
- "nolinkshere-ns-2": "គ្មានទំព័រណាមួយតភ្ជាប់ទៅ '''$1''' ក្នុងប្រភេទដែលបានជ្រើសរើស។",
+ "linkshere-2": "ទំព័រដូចតទៅនេះតភ្ជាប់មក '''$2''' ៖",
+ "nolinkshere-2": "គ្មានទំព័រណាមួយតភ្ជាប់ទៅ '''$2''' ទេ។",
+ "nolinkshere-ns-2": "គ្មានទំព័រណាមួយតភ្ជាប់ទៅ '''$2''' ក្នុងប្រភេទដែលបានជ្រើសរើស។",
"isredirect": "ទំព័របញ្ជូនបន្ត",
"istemplate": "ការដាក់បញ្ចូល",
"isimage": "តំណភ្ជាប់ឯកសារ",
"whatlinkshere": "ಇಲ್ಲಿಗೆ ಯಾವ ಸಂಪರ್ಕ ಕೂಡುತ್ತದೆ",
"whatlinkshere-title": "\"$1\" ಪುಟಕ್ಕೆ ಸಂಪರ್ಕ ಹೊಂದಿರುವ ಪುಟಗಳು",
"whatlinkshere-page": "ಪುಟ:",
- "linkshere-2": "'''$1'''ಗೆ ಈ ಪುಟಗಳು ಸಂಪರ್ಕ ಹೊಂದಿವೆ:",
- "nolinkshere-2": "'''$1''' ಗೆ ಯಾವ ಪುಟಗಳೂ ಸಂಪರ್ಕ ಹೊಂದಿಲ್ಲ.",
- "nolinkshere-ns-2": "ಆಯ್ಕೆ ಮಾಡಿದ ಪುಟಪ್ರಬೇಧದಲ್ಲಿ ಯಾವ ಪುಟವೂ '''$1''' ಅಲ್ಲಿಗೆ ಸಂಪರ್ಕ ಹೊಂದಿಲ್ಲ.",
+ "linkshere-2": "'''$2'''ಗೆ ಈ ಪುಟಗಳು ಸಂಪರ್ಕ ಹೊಂದಿವೆ:",
+ "nolinkshere-2": "'''$2''' ಗೆ ಯಾವ ಪುಟಗಳೂ ಸಂಪರ್ಕ ಹೊಂದಿಲ್ಲ.",
+ "nolinkshere-ns-2": "ಆಯ್ಕೆ ಮಾಡಿದ ಪುಟಪ್ರಬೇಧದಲ್ಲಿ ಯಾವ ಪುಟವೂ '''$2''' ಅಲ್ಲಿಗೆ ಸಂಪರ್ಕ ಹೊಂದಿಲ್ಲ.",
"isredirect": "ಪುನರ್ನಿರ್ದೇಶನ ಪುಟ",
"istemplate": "ಸೇರ್ಪಡೆ",
"isimage": "ಚಿತ್ರಕ್ಕೆ ಕೊಂಡಿ",
"createaccountmail-help": "비밀번호를 기억하지 않고도 다른 사용자를 위한 계정을 만들 수 있습니다.",
"createacct-realname": "실명 (선택 사항)",
"createacct-reason": "이유",
- "createacct-reason-ph": "왜 다른 계정을 만들어야 합니까",
+ "createacct-reason-ph": "ì\99\9c ë\8b¤ë¥¸ ê³\84ì \95ì\9d\84 ë\98\90 ë§\8cë\93¤ì\96´ì\95¼ í\95©ë\8b\88ê¹\8c",
"createacct-reason-help": "계정 생성 로그에 표시되는 메시지",
"createacct-submit": "계정 만들기",
"createacct-another-submit": "계정 만들기",
"whatlinkshere": "여기를 가리키는 문서",
"whatlinkshere-title": "\"$1\" 문서를 가리키는 문서 목록",
"whatlinkshere-page": "문서:",
- "linkshere-2": "다음 문서가 '''$1''' 문서를 가리키고 있습니다:",
- "nolinkshere-2": "'''$1''' 문서를 가리키는 문서가 없습니다.",
- "nolinkshere-ns-2": "선택한 이름공간에는 '''$1''' 문서를 가리키는 문서가 없습니다.",
+ "linkshere-2": "다음 문서가 '''$2''' 문서를 가리키고 있습니다:",
+ "nolinkshere-2": "'''$2''' 문서를 가리키는 문서가 없습니다.",
+ "nolinkshere-ns-2": "선택한 이름공간에는 '''$2''' 문서를 가리키는 문서가 없습니다.",
"isredirect": "넘겨주기 문서",
"istemplate": "끼워넣기",
"isimage": "연결된 파일",
"whatlinkshere": "Бетге джибериуле",
"whatlinkshere-title": "«$1» бетге джиберген бетле",
"whatlinkshere-page": "Бет:",
- "linkshere-2": "'''$1''' битге джиберген бетле:",
- "nolinkshere-2": "'''$1'' бетге башха бетле джибермейдиле.",
- "nolinkshere-ns-2": "Сайланнган атла аламда '''$1''' бетге джиберген бет джокъду.",
+ "linkshere-2": "'''$2''' битге джиберген бетле:",
+ "nolinkshere-2": "'''$2'' бетге башха бетле джибермейдиле.",
+ "nolinkshere-ns-2": "Сайланнган атла аламда '''$2''' бетге джиберген бет джокъду.",
"isredirect": "джибериу бет",
"istemplate": "къошуу",
"isimage": "файлгъа джибериу",
"whatlinkshere": "Linkit tänne",
"whatlinkshere-title": "Šivut, kumpaset viitatah šivulla \"$1\"",
"whatlinkshere-page": "Šivu:",
- "linkshere-2": "Šeuruavilta šivuilta on linkki šivulla <strong>$1</strong>:",
+ "linkshere-2": "Šeuruavilta šivuilta on linkki šivulla <strong>$2</strong>:",
"isredirect": "ohjauššivu",
"istemplate": "šisällytetty",
"isimage": "failin linkki",
"whatlinkshere": "Wat noh heh link",
"whatlinkshere-title": "Sigge, woh Lengks op „$1“ dren sen",
"whatlinkshere-page": "Sigg:",
- "linkshere-2": "Dat sin de Sigge, di op <strong>„$1“</strong> lengke donn:",
- "nolinkshere-2": "Kein Sigg link noh <strong>„$1“</strong>.",
- "nolinkshere-ns-2": "Nix link op <strong>„$1“</strong> en dämm Appachtemang.",
+ "linkshere-2": "Dat sin de Sigge, di op <strong>„$2“</strong> lengke donn:",
+ "nolinkshere-2": "Kein Sigg link noh <strong>„$2“</strong>.",
+ "nolinkshere-ns-2": "Nix link op <strong>„$2“</strong> en dämm Appachtemang.",
"isredirect": "Ömleidongssigg",
"istemplate": "weed enjeföch",
"isimage": "weed aanjezeisch",
"whatlinkshere": "Girêdanên li ser vê rûpelê",
"whatlinkshere-title": "Rûpelên ku yê berve \"$1\" tên",
"whatlinkshere-page": "Rûpel:",
- "linkshere-2": "Ev rûpel tên ser vê rûpelê '''$1''':",
- "nolinkshere-2": "Ne ji rûpelekê lînk tên ser '''$1'''.",
- "nolinkshere-ns-2": "Ne lînkek berve '''$1''' di vê namespace'a da tê.",
+ "linkshere-2": "Ev rûpel tên ser vê rûpelê '''$2''':",
+ "nolinkshere-2": "Ne ji rûpelekê lînk tên ser '''$2'''.",
+ "nolinkshere-ns-2": "Ne lînkek berve '''$2''' di vê namespace'a da tê.",
"isredirect": "rûpelê beralî bike",
"istemplate": "tê bikaranîn",
"isimage": "girêdana wêneyî",
"whatlinkshere": "Мунда байланылгъан",
"whatlinkshere-title": "\"$1\" бетге байлангъан сагьифалар",
"whatlinkshere-page": "Сагьифа:",
- "linkshere-2": "Гелеген сагьифалар бугъар байлавлу <strong>$1</strong>:",
- "nolinkshere-2": "Бугъар байлавлу сагьифалар ёкъ <strong>$1</strong>:",
+ "linkshere-2": "Гелеген сагьифалар бугъар байлавлу <strong>$2</strong>:",
+ "nolinkshere-2": "Бугъар байлавлу сагьифалар ёкъ <strong>$2</strong>:",
"isredirect": "ёллав-сагьифа",
"istemplate": "къошув",
"isimage": "сапламлы байланыв",
"whatlinkshere": "Pyth a gevren dhe omma",
"whatlinkshere-title": "Folennow ow kevrenna dhe \"$1\"",
"whatlinkshere-page": "Folen:",
- "linkshere-2": "Yma an folennow a syw ow kevrenna dhe '''$1''':",
- "nolinkshere-2": "Nyns eus folen vyth ow kevrenna dhe '''$1'''.",
+ "linkshere-2": "Yma an folennow a syw ow kevrenna dhe '''$2''':",
+ "nolinkshere-2": "Nyns eus folen vyth ow kevrenna dhe '''$2'''.",
"isredirect": "folen daskedyans",
"istemplate": "treuskludyans",
"isimage": "kevren an restren",
"whatlinkshere": "Шилтемелерди бул жакка",
"whatlinkshere-title": "\"$1\" -га шилтеме берген барактар",
"whatlinkshere-page": "Барак:",
- "linkshere-2": "'''$1''' барагына шилтеме берген барактар:",
- "nolinkshere-2": "'''$1''' барагына шилтеме берген барак жок.",
+ "linkshere-2": "'''$2''' барагына шилтеме берген барактар:",
+ "nolinkshere-2": "'''$2''' барагына шилтеме берген барак жок.",
"isredirect": "багыттама барак",
"istemplate": "бириктирүү",
"isimage": "файл шилтемеси",
"whatlinkshere": "Nexus ad paginam",
"whatlinkshere-title": "Paginae quae ad \"$1\" nectuntur",
"whatlinkshere-page": "Pagina:",
- "linkshere-2": "Paginae sequentes ad '''$1''' nectunt:",
- "nolinkshere-2": "Nullae paginae ad '''$1''' nectunt.",
- "nolinkshere-ns-2": "Nullae paginae spatii nominalis selecti ad '''$1''' nectunt.",
+ "linkshere-2": "Paginae sequentes ad '''$2''' nectunt:",
+ "nolinkshere-2": "Nullae paginae ad '''$2''' nectunt.",
+ "nolinkshere-ns-2": "Nullae paginae spatii nominalis selecti ad '''$2''' nectunt.",
"isredirect": "pagina redirectionis",
"istemplate": "inclusio",
"isimage": "nexus fasciculi",
"whatlinkshere": "Hojas atadas",
"whatlinkshere-title": "Hojas que dan link a \"$1\"",
"whatlinkshere-page": "Hoja:",
- "linkshere-2": "Las hojas venideras dan link a '''$1''':",
- "nolinkshere-2": "Dinguna ója tiene atamientos kon '''$1'''",
+ "linkshere-2": "Las hojas venideras dan link a '''$2''':",
+ "nolinkshere-2": "Dinguna ója tiene atamientos kon '''$2'''",
"isredirect": "Hoja redirigida",
"istemplate": "inclusión",
"isimage": "atamiento de la dosya",
"whatlinkshere": "Linken op dës Säit",
"whatlinkshere-title": "Säiten, déi mat \"$1\" verlinkt sinn",
"whatlinkshere-page": "Säit:",
- "linkshere-2": "Déi folgend Säite linken op '''$1''':",
- "nolinkshere-2": "Keng Säit ass mat '''$1''' verlinkt.",
- "nolinkshere-ns-2": "Keng Säite linken op '''$1''' am gewielten Nummraum.",
+ "linkshere-2": "Déi folgend Säite linken op <strong>$2</strong>:",
+ "nolinkshere-2": "Keng Säit ass mat <strong>$2</strong> verlinkt.",
+ "nolinkshere-ns-2": "Keng Säite linken op <strong>$2</strong> am gewielten Nummraum.",
"isredirect": "Viruleedung",
"istemplate": "an dëser Säit dran",
"isimage": "Link op de Fichier",
"whatlinkshere": "Иниз вуч элячIзава",
"whatlinkshere-title": "\"$1\" - даз элячlзавай ччинар",
"whatlinkshere-page": "Ччин:",
- "linkshere-2": "Гуьгъуьнин ччинар '''$1''': - даз элячlзава",
- "nolinkshere-2": "'''$1''' ччиниз са ччинни элячIзавач.",
+ "linkshere-2": "Гуьгъуьнин ччинар '''$2''': - даз элячlзава",
+ "nolinkshere-2": "'''$2''' ччиниз са ччинни элячIзавач.",
"isredirect": "Рахкъурунин ччин",
"istemplate": "кутун",
"isimage": "Файлдин элячlун",
"listduplicatedfiles": "Lista de fixes jemelo",
"listduplicatedfiles-summary": "Esta es un lista de fixes de cual sua revisa la plu resente es identica con la revisa la plu resente de alga otra fix. Sola fixes local es considerada.",
"listduplicatedfiles-entry": "[[:File:$1|$1]] ave [[$3|{{PLURAL:$2|un jemelo|$2 jemelos}}]].",
- "unusedtemplates": "modeles nonusada",
+ "unusedtemplates": "Modeles nonusada",
"unusedtemplatestext": "Esta paje lista tota pajes en la spasio de nom {{ns:template}} cual no es incluida en un otra paje.\nNo oblida esplora otra lias a la stensiles ante sutrae los.",
"unusedtemplateswlh": "otra lias",
"randompage": "Paje acaso",
"whatlinkshere": "Lias a esta paje",
"whatlinkshere-title": "Pajes cual lia a \"$1\"",
"whatlinkshere-page": "Paje:",
- "linkshere-2": "La pajes seguente lia a <strong>$1</strong>:",
- "nolinkshere-2": "No pajes lia a <strong>$1</strong>.",
- "nolinkshere-ns-2": "No pajes lia a <strong>$1</strong> en la spasio de nom elejeda.",
+ "linkshere-2": "La pajes seguente lia a <strong>$2</strong>:",
+ "nolinkshere-2": "No pajes lia a <strong>$2</strong>.",
+ "nolinkshere-ns-2": "No pajes lia a <strong>$2</strong> en la spasio de nom elejeda.",
"isredirect": "paje redirijente",
"istemplate": "transclui",
"isimage": "lia de fix",
"whatlinkshere": "Empapula ezikuggusa ku luno",
"whatlinkshere-title": "Empapula eziriko enyunzi ezigguka ku $1",
"whatlinkshere-page": "Lupapula:",
- "linkshere-2": "Zino z'empapula eziriko enyunzi ezigguka ku '''$1''':",
- "nolinkshere-2": "Tewali mpapula eziriko enyunzi ezigguka ku '''$1'''.",
+ "linkshere-2": "Zino z'empapula eziriko enyunzi ezigguka ku '''$2''':",
+ "nolinkshere-2": "Tewali mpapula eziriko enyunzi ezigguka ku '''$2'''.",
"isredirect": "lupapula olukutwalabutwazi ku lunnaalwo",
"istemplate": "kitundu ekyeyazike",
"isimage": "lukozesa ekifaananyi kino",
"whatlinkshere": "Links nao dees pagina",
"whatlinkshere-title": "Pagina's die verwieze nao \"$1\"",
"whatlinkshere-page": "Pagina:",
- "linkshere-2": "De volgende pagina's verwieze nao '''$1''':",
- "nolinkshere-2": "D'r zint gein pazjena's mit links nao '''$1''' haer.",
- "nolinkshere-ns-2": "Geine inkele pazjena link nao '''$1''' in de gekaoze naamruumde.",
+ "linkshere-2": "De volgende pagina's verwieze nao '''$2''':",
+ "nolinkshere-2": "D'r zint gein pazjena's mit links nao '''$2''' haer.",
+ "nolinkshere-ns-2": "Geine inkele pazjena link nao '''$2''' in de gekaoze naamruumde.",
"isredirect": "redirect pagina",
"istemplate": "ingevoog es sjabloon",
"isimage": "bestandjslink",
"whatlinkshere": "Cöse se colega chì",
"whatlinkshere-title": "Pàgine c'apontàn a $1",
"whatlinkshere-page": "Pàgina:",
- "linkshere-2": "E pàgine segoenti apontan a '''$1''':",
- "nolinkshere-2": "Nisciùnn-a pàgina a se collega con '''$1'''.",
- "nolinkshere-ns-2": "Pagine ch'apontan a '''$1''' into namespace seleçionou no ghe n'è.",
+ "linkshere-2": "E pàgine segoenti apontan a '''$2''':",
+ "nolinkshere-2": "Nisciùnn-a pàgina a se collega con '''$2'''.",
+ "nolinkshere-ns-2": "Pagine ch'apontan a '''$2''' into namespace seleçionou no ghe n'è.",
"isredirect": "Paggina de rindirissamento",
"istemplate": "Incluxon",
"isimage": "Colegaménto a-o file",
"whatlinkshere": "پیوندەل وە ئێ وەڵگە",
"whatlinkshere-title": "وۀلگۀلئ گإ وۀ «$1» پیوۀند دِرِن",
"whatlinkshere-page": ":وةڵگە(پەڕە)",
- "linkshere-2": "The following pages link to <strong>$1</strong>:",
- "nolinkshere-2": "هیچ صفحهای به '''$1''' پیوند ندارد.",
- "nolinkshere-ns-2": "هیچ صفحهای از فضای نام انتخاب شده به '''$1''' پیوند ندارد.",
+ "linkshere-2": "The following pages link to <strong>$2</strong>:",
+ "nolinkshere-2": "هیچ صفحهای به '''$2''' پیوند ندارد.",
+ "nolinkshere-ns-2": "هیچ صفحهای از فضای نام انتخاب شده به '''$2''' پیوند ندارد.",
"isredirect": "وەڵگە ڕێ گؤەڕن(تغییرمسییر)",
"istemplate": " تراگنجانشها",
"isimage": "پیوند پرونده",
"whatlinkshere": "Pagin che se culeghen chì",
"whatlinkshere-title": "Paginn che menen a \"$1\"",
"whatlinkshere-page": "Pagina:",
- "linkshere-2": "I paginn chì de sota gh'hann di ligam che porten a '''$1''':",
+ "linkshere-2": "I paginn chì de sota gh'hann di ligam che porten a '''$2''':",
"isredirect": "redirezión",
"istemplate": "inclüsión",
"isimage": "ligam a un archivi",
"sp-contributions-submit": "ຊອກຫາ",
"whatlinkshere": "ໜ້າທີ່ເຊື່ອມຕໍ່ມາໜ້ານີ້",
"whatlinkshere-title": "ໜ້າທີ່ເຊື່ອມຕໍ່ຫາ $1",
- "linkshere-2": "ບັນດາໜ້າຕໍ່ໄປ ລິ້ງຄ໌ ຫາ ''$1''':",
- "nolinkshere-2": "ບໍ່ມີໜ້າລິ້ງຄ໌ ຫາ '''$1'''.",
- "nolinkshere-ns-2": "ບໍ່ມີໜ້າລິ້ງຄ໌ ຫາ '''$1''' ໃນ ຂອບເຂດຊື່ ທີ່ ທ່ານເລືອກ.",
+ "linkshere-2": "ບັນດາໜ້າຕໍ່ໄປ ລິ້ງຄ໌ ຫາ ''$2''':",
+ "nolinkshere-2": "ບໍ່ມີໜ້າລິ້ງຄ໌ ຫາ '''$2'''.",
+ "nolinkshere-ns-2": "ບໍ່ມີໜ້າລິ້ງຄ໌ ຫາ '''$2''' ໃນ ຂອບເຂດຊື່ ທີ່ ທ່ານເລືອກ.",
"isredirect": "ໜ້າໂອນ",
"istemplate": "ລວມ",
"whatlinkshere-prev": "{{PLURAL:$1|ກ່ອນ|ກ່ອນ $1}}",
"whatlinkshere": "Ling'ki di bye petulo",
"whatlinkshere-title": "Petulo bye ling'ki di $1",
"whatlinkshere-page": "Petulo:",
- "linkshere-2": "Bye petulo ling'ki di '''$1''':",
- "nolinkshere-2": "0 petulo ling'ki di '''$1'''.",
- "nolinkshere-ns-2": "0 petulo ling'ki di '''$1''' bye sa di bye fatukile efro.",
+ "linkshere-2": "Bye petulo ling'ki di '''$2''':",
+ "nolinkshere-2": "0 petulo ling'ki di '''$2'''.",
+ "nolinkshere-ns-2": "0 petulo ling'ki di '''$2''' bye sa di bye fatukile efro.",
"isredirect": "petulo abezi",
"istemplate": "yang'idole",
"whatlinkshere-prev": "{{PLURAL:$1|kona|kona $1}}",
"whatlinkshere": "کوم هوم پیۋندیا هان ایچاٛ",
"whatlinkshere-title": "بلگه ای که د $1 هوم پیوند بیه",
"whatlinkshere-page": "بلگٱ",
- "linkshere-2": "بلگیا نهایی د '''$1''' هوم پیوند بیه",
- "nolinkshere-2": "هیژ بگله ای د '''$1''' هوم پیوند نبیه",
- "nolinkshere-ns-2": "هیچ بلگه ای د نومجا انتخاو بیه وه'''$1''' هوم پیوند ناره.",
+ "linkshere-2": "بلگیا نهایی د '''$2''' هوم پیوند بیه",
+ "nolinkshere-2": "هیژ بگله ای د '''$2''' هوم پیوند نبیه",
+ "nolinkshere-ns-2": "هیچ بلگه ای د نومجا انتخاو بیه وه'''$2''' هوم پیوند ناره.",
"isredirect": "بلگه دوباره ورگشتن",
"istemplate": "نشونی دئن",
"isimage": "جانیا هوم پیوند",
"whatlinkshere": "Susiję puslapiai",
"whatlinkshere-title": "Puslapiai, kurie nurodo į „$1“",
"whatlinkshere-page": "Puslapis:",
- "linkshere-2": "Šie puslapiai rodo į '''$1''':",
- "nolinkshere-2": "Į '''$1''' nuorodų nėra.",
- "nolinkshere-ns-2": "Nurodytoje vardų srityje nei vienas puslapis nenurodo į '''$1'''.",
+ "linkshere-2": "Šie puslapiai rodo į '''$2''':",
+ "nolinkshere-2": "Į '''$2''' nuorodų nėra.",
+ "nolinkshere-ns-2": "Nurodytoje vardų srityje nei vienas puslapis nenurodo į '''$2'''.",
"isredirect": "nukreipiamasis puslapis",
"istemplate": "įterpimas",
"isimage": "rinkmenos nuoroda",
"whatlinkshere": "Hemi zawmpuite",
"whatlinkshere-title": "$1-a thlunzawm phêkte",
"whatlinkshere-page": "Phêk:",
- "linkshere-2": "A hnuaia phêkte hian '''$1''' hi an thlunzawm:",
- "nolinkshere-2": "'''$1'''-a zawm phek pakhat mah a awm lo.",
+ "linkshere-2": "A hnuaia phêkte hian '''$2''' hi an thlunzawm:",
+ "nolinkshere-2": "'''$2'''-a zawm phek pakhat mah a awm lo.",
"isredirect": "Hruailuhna phêk",
"istemplate": "ziahhnan",
"isimage": "taksa thlunzawmna",
"whatlinkshere": "لینکل ئی بألگە",
"whatlinkshere-title": "بألگل کە لینک دائنە ڤە \"$1\"",
"whatlinkshere-page": "بألگە:",
- "linkshere-2": "لینک ھ بألگل دوٙمین الذیکر ڤە '''$1''':",
+ "linkshere-2": "لینک ھ بألگل دوٙمین الذیکر ڤە '''$2''':",
"isredirect": "بألگە تأغییر مأسیر",
"istemplate": "ئیستیفادھ ڤابیدھ داخل بألگە",
"isimage": "لینک ھ فایل",
"botpasswords-existing": "Esošās botu paroles",
"botpasswords-createnew": "Izveidot jaunu bota paroli",
"botpasswords-editexisting": "Rediģētu esošu bota paroli",
+ "botpasswords-label-needsreset": "(paroli nepieciešams atiestatīt)",
"botpasswords-label-appid": "Bota nosaukums:",
"botpasswords-label-create": "Izveidot",
"botpasswords-label-update": "Atjaunināt",
"whatlinkshere": "Norādes uz šo rakstu",
"whatlinkshere-title": "Lapas, kurās ir saites uz lapu \"$1\"",
"whatlinkshere-page": "Lapa:",
- "linkshere-2": "Šajās lapās ir norādes uz lapu '''$1''':",
- "nolinkshere-2": "Nevienā lapā nav norāžu uz lapu '''$1'''.",
- "nolinkshere-ns-2": "Neviena lapa nenorāda uz '''$1''' izvēlētajā vārdtelpā.",
+ "linkshere-2": "Šajās lapās ir norādes uz lapu '''$2''':",
+ "nolinkshere-2": "Nevienā lapā nav norāžu uz lapu '''$2'''.",
+ "nolinkshere-ns-2": "Neviena lapa nenorāda uz '''$2''' izvēlētajā vārdtelpā.",
"isredirect": "pāradresācijas lapa",
"istemplate": "izsaukts",
"isimage": "faila saite",
"whatlinkshere": "取佐",
"whatlinkshere-title": "「$1」取佐",
"whatlinkshere-page": "題",
- "linkshere-2": "取佐'''$1'''如下:",
- "nolinkshere-2": "無頁取佐'''$1'''。",
- "nolinkshere-ns-2": "名冊內無頁取佐'''$1'''。",
+ "linkshere-2": "取佐'''$2'''如下:",
+ "nolinkshere-2": "無頁取佐'''$2'''。",
+ "nolinkshere-ns-2": "名冊內無頁取佐'''$2'''。",
"isredirect": "渡",
"istemplate": "含",
"isimage": "檔佐",
"whatlinkshere": "Butʼkʼaşa na ixvenu kʼontʼaktʼepe",
"whatlinkshere-title": "\"$1\" maddeşa kʼontʼaktʼi na ikips butʼkʼape",
"whatlinkshere-page": "Butʼkʼa:",
- "linkshere-2": "'''$1''' butʼkʼaşa kʼontʼaktʼi na ikips butʼkʼape:",
+ "linkshere-2": "'''$2''' butʼkʼaşa kʼontʼaktʼi na ikips butʼkʼape:",
"isredirect": "redirektʼiş butʼkʼa",
"istemplate": "okʼatu",
"isimage": "dosyaşi kʼontʼaktʼi",
"whatlinkshere": "एतय कोन लिङ्क अछि",
"whatlinkshere-title": "\"$1\" सँ सम्बन्धित पन्नासभ",
"whatlinkshere-page": "पन्ना:",
- "linkshere-2": "ई सभ पन्ना सम्बन्धित अछि '''$1''':",
- "nolinkshere-2": "'''$1''' पर कोनो पन्नाक लागि नै अछि।",
- "nolinkshere-ns-2": "कोनो पन्नाक लागि '''$1''' चुनल नामगाममे नै अछि।",
+ "linkshere-2": "ई सभ पन्ना सम्बन्धित अछि '''$2''':",
+ "nolinkshere-2": "'''$2''' पर कोनो पन्नाक लागि नै अछि।",
+ "nolinkshere-ns-2": "कोनो पन्नाक लागि '''$2''' चुनल नामगाममे नै अछि।",
"isredirect": "पुनर्निर्देशन पृष्ठ",
"istemplate": "परागत",
"isimage": "फाइल लिङ्क",
"whatlinkshere": "Pranala Kaca Kiye",
"whatlinkshere-title": "Kaca-kaca sing duwe pranala maring \"$1\"",
"whatlinkshere-page": "Kaca:",
- "linkshere-2": "Kaca-kaca kiye duwe pranala maring '''$1''':",
- "nolinkshere-2": "Ora ana kaca sing nduwé pranala maring '''$1'''.",
+ "linkshere-2": "Kaca-kaca kiye duwe pranala maring '''$2''':",
+ "nolinkshere-2": "Ora ana kaca sing nduwé pranala maring '''$2'''.",
"isredirect": "kaca pangalihan",
"istemplate": "karo cithakan",
"isimage": "pranala berkas",
"whatlinkshere": "Сюлмафкст тяза",
"whatlinkshere-title": "Лопат конат сюлмафт \"$1\" мархта",
"whatlinkshere-page": "Лопа:",
- "linkshere-2": "Ся лопатне сюлмафт '''$1''' мархта:",
- "nolinkshere-2": "Лопат, конат сюлмафт '''$1''' мархта ашет.",
- "nolinkshere-ns-2": "Аш лопат сюлмафт '''$1''' мархта кочкаф лемботмоста.",
+ "linkshere-2": "Ся лопатне сюлмафт '''$2''' мархта:",
+ "nolinkshere-2": "Лопат, конат сюлмафт '''$2''' мархта ашет.",
+ "nolinkshere-ns-2": "Аш лопат сюлмафт '''$2''' мархта кочкаф лемботмоста.",
"isredirect": "умборондафтф лопа",
"istemplate": "сувафтома",
"isimage": "↓архтофксонь сюлмафкссь",
"whatlinkshere": "Pejy mirohy eto",
"whatlinkshere-title": "Pejy mirohy any amin'i « $1 »",
"whatlinkshere-page": "Pejy :",
- "linkshere-2": "Ireo pejy ireo dia manana rohy mankany amin'i '''$1'''",
- "nolinkshere-2": "Tsy nahitana pejy mirohy any amin'i '''$1'''.",
- "nolinkshere-ns-2": "Tsy nahitana pejy mirohy any amin'i $1 ao amin'ny anaran-tsehatra nofidiana.",
+ "linkshere-2": "Ireo pejy ireo dia manana rohy mankany amin'i '''$2'''",
+ "nolinkshere-2": "Tsy nahitana pejy mirohy any amin'i '''$2'''.",
+ "nolinkshere-ns-2": "Tsy nahitana pejy mirohy any amin'i $2 ao amin'ny anaran-tsehatra nofidiana.",
"isredirect": "pejy fihodinana",
"istemplate": "tsofo-pejy",
"isimage": "rohy mankany amin'ilay rakitra",
"whatlinkshere": "Тышке кондышо кылвер-влак",
"whatlinkshere-title": "\"$1\" дене лаштык-влак кылым палемдат",
"whatlinkshere-page": "Лаштык:",
- "linkshere-2": "'''$1''' лаштык дене кылдалтше лаштык-влак:",
- "nolinkshere-2": "'''$1''' лаштык дене тетла нимогай лаштык кылдалтын огыл",
- "nolinkshere-ns-2": "Тыгай лӱм-влакын кумдыкышто '''$1''' лаштык дене нимогай лаштык-влак огыт кылдалт.",
+ "linkshere-2": "'''$2''' лаштык дене кылдалтше лаштык-влак:",
+ "nolinkshere-2": "'''$2''' лаштык дене тетла нимогай лаштык кылдалтын огыл",
+ "nolinkshere-ns-2": "Тыгай лӱм-влакын кумдыкышто '''$2''' лаштык дене нимогай лаштык-влак огыт кылдалт.",
"isredirect": "вес вере колтышо лаштык",
"istemplate": "пуртымаш",
"isimage": "файлыш кылвер",
"whatlinkshere": "Pautan baliak",
"whatlinkshere-title": "Laman nan takaik ka \"$1\"",
"whatlinkshere-page": "Laman:",
- "linkshere-2": "Laman-laman ko bakaik ka '''$1''':",
- "nolinkshere-2": "Indak ado laman nan punyo tautan ka '''$1'''.",
- "nolinkshere-ns-2": "Indak ado pautan laman ka '''$1''' pado ruang namo nan dipiliah.",
+ "linkshere-2": "Laman-laman ko bakaik ka '''$2''':",
+ "nolinkshere-2": "Indak ado laman nan punyo tautan ka '''$2'''.",
+ "nolinkshere-ns-2": "Indak ado pautan laman ka '''$2''' pado ruang namo nan dipiliah.",
"isredirect": "laman pangaliahan",
"istemplate": "transklusi",
"isimage": "pautan berkas",
"whatlinkshere": "Што води овде",
"whatlinkshere-title": "Страници со врски што водат до „$1“",
"whatlinkshere-page": "Страница:",
- "linkshere-2": "Следните страници водат кон „'''$1'''“:",
- "nolinkshere-2": "Нема страници што водат кон '''$1'''.",
- "nolinkshere-ns-2": "Нема страници што водат кон '''$1''' во избраниот именски простор.",
+ "linkshere-2": "Следните страници водат кон <strong>$2</strong>:",
+ "nolinkshere-2": "Нема страници што водат кон <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Нема страници што водат кон <strong>$2</strong> во избраниот именски простор.",
"isredirect": "пренасочувачка страница",
"istemplate": "превметнување",
"isimage": "врска до податотеката",
"whatlinkshere": "ഈ താളിലേക്കുള്ള കണ്ണികൾ",
"whatlinkshere-title": "\"$1\" എന്ന താളിലേക്കുള്ള കണ്ണികൾ",
"whatlinkshere-page": "താൾ:",
- "linkshere-2": "താഴെക്കൊടുത്തിരിക്കുന്ന താളുകളിൽ നിന്നും '''$1''' എന്ന താളിലേക്ക് കണ്ണികളുണ്ട്:",
- "nolinkshere-2": "'''$1''' എന്ന താളിലേക്ക് കണ്ണികളൊന്നും നിലവിലില്ല.",
- "nolinkshere-ns-2": "തിരഞ്ഞെടുത്ത നാമമേഖലയിൽ '''$1''' എന്ന താളിലേക്ക് മറ്റൊരു താളുകളിൽനിന്നും കണ്ണികളില്ല.",
+ "linkshere-2": "താഴെക്കൊടുത്തിരിക്കുന്ന താളുകളിൽ നിന്നും '''$2''' എന്ന താളിലേക്ക് കണ്ണികളുണ്ട്:",
+ "nolinkshere-2": "'''$2''' എന്ന താളിലേക്ക് കണ്ണികളൊന്നും നിലവിലില്ല.",
+ "nolinkshere-ns-2": "തിരഞ്ഞെടുത്ത നാമമേഖലയിൽ '''$2''' എന്ന താളിലേക്ക് മറ്റൊരു താളുകളിൽനിന്നും കണ്ണികളില്ല.",
"isredirect": "തിരിച്ചുവിടൽ താൾ",
"istemplate": "ഉൾപ്പെടുത്തൽ",
"isimage": "പ്രമാണത്തിന്റെ കണ്ണി",
"whatlinkshere": "Энд холбогдсон хуудсууд",
"whatlinkshere-title": "\"$1\"-д холбоостой хуудаснууд",
"whatlinkshere-page": "Хуудас:",
- "linkshere-2": "Дараах хуудсууд '''$1'''-тай холбогдсон байна:",
- "nolinkshere-2": "'''$1'''-тай холбогдсон хуудас байхгүй байна.",
- "nolinkshere-ns-2": "Сонгосон нэрний зайд '''$1''' руу холбогдсон хуудас байхгүй байна.",
+ "linkshere-2": "Дараах хуудсууд '''$2'''-тай холбогдсон байна:",
+ "nolinkshere-2": "'''$2'''-тай холбогдсон хуудас байхгүй байна.",
+ "nolinkshere-ns-2": "Сонгосон нэрний зайд '''$2''' руу холбогдсон хуудас байхгүй байна.",
"isredirect": "чиглүүлэгч",
"istemplate": "оруулалт",
"isimage": "файлын холбоос",
"whatlinkshere": "येथे काय जोडले आहे",
"whatlinkshere-title": "\"$1\" ला जुळलेली पाने",
"whatlinkshere-page": "पान:",
- "linkshere-2": "खालील लेख '''$1''' या पानांशी जोडले आहेत:",
- "nolinkshere-2": "'''$1''' येथे कोणत्याही पानांचे दुवे नाहीत.",
- "nolinkshere-ns-2": "निवडलेल्या नामविश्वातील कोणतीही पाने <strong>$1</strong>ला दुवा देत नाहीत .",
+ "linkshere-2": "खालील लेख '''$2''' या पानांशी जोडले आहेत:",
+ "nolinkshere-2": "'''$2''' येथे कोणत्याही पानांचे दुवे नाहीत.",
+ "nolinkshere-ns-2": "निवडलेल्या नामविश्वातील कोणतीही पाने <strong>$2</strong>ला दुवा देत नाहीत .",
"isredirect": "पुनर्निर्देशित पान",
"istemplate": "आंतर्न्यास (ट्रांसक्लूजन)",
"isimage": "संचिका दुवा",
"whatlinkshere": "Pautan ke laman ini",
"whatlinkshere-title": "Laman yang mengandungi pautan ke \"$1\"",
"whatlinkshere-page": "Laman:",
- "linkshere-2": "Laman-laman berikut mengandungi pautan ke '''$1''':",
- "nolinkshere-2": "Tiada laman yang mengandungi pautan ke '''$1'''.",
- "nolinkshere-ns-2": "Tiada laman yang mengandungi pautan ke '''$1''' dalam ruang nama yang dinyatakan.",
+ "linkshere-2": "Laman-laman berikut mengandungi pautan ke '''$2''':",
+ "nolinkshere-2": "Tiada laman yang mengandungi pautan ke '''$2'''.",
+ "nolinkshere-ns-2": "Tiada laman yang mengandungi pautan ke '''$2''' dalam ruang nama yang dinyatakan.",
"isredirect": "laman lencongan",
"istemplate": "penyertaan",
"isimage": "pautan fail",
"whatlinkshere": "Li jwasslu 'l hawn",
"whatlinkshere-title": "Paġni li jippuntaw lejn $1",
"whatlinkshere-page": "Paġna:",
- "linkshere-2": "Il-paġni segwenti jorbtu lejn '''$1''':",
- "nolinkshere-2": "L-ebda paġna ma twassal għal '''$1'''.",
- "nolinkshere-ns-2": "L-ebda paġna ma tipponta lejn '''$1''' fl-ispazju tal-isem magħżul.",
+ "linkshere-2": "Il-paġni segwenti jorbtu lejn '''$2''':",
+ "nolinkshere-2": "L-ebda paġna ma twassal għal '''$2'''.",
+ "nolinkshere-ns-2": "L-ebda paġna ma tipponta lejn '''$2''' fl-ispazju tal-isem magħżul.",
"isredirect": "paġna ta' rindirizz",
"istemplate": "inklużjoni",
"isimage": "ħolqa lejn il-fajl",
"whatlinkshere": "L que lhiga eiqui",
"whatlinkshere-title": "Páiginas que lhígan a \"$1\"",
"whatlinkshere-page": "Páigina:",
- "linkshere-2": "Estas páiginas ténen lhigaçones pa <strong>$1</strong>:",
- "nolinkshere-2": "Nun eisisten lhigaçones pa '''$1'''.",
+ "linkshere-2": "Estas páiginas ténen lhigaçones pa <strong>$2</strong>:",
+ "nolinkshere-2": "Nun eisisten lhigaçones pa '''$2'''.",
"isredirect": "páigina de ancaminamiento",
"istemplate": "ancluson",
"isimage": "lhigaçon pa l fexeiro",
"whatlinkshere": "ဘယ်ကလင့်ခ်ထားလဲ",
"whatlinkshere-title": "\"$1\" သို့ ချိတ်ဆက်ထားသော စာမျက်နှာများ",
"whatlinkshere-page": "စာမျက်နှာ -",
- "linkshere-2": "အောက်ပါစာမျက်နှာများသည် <strong>$1</strong> သို့ ချိတ်ဆက်ထားသည် -",
- "nolinkshere-2": "<strong>$1</strong> သို့ လင့်ခ်ထားသော စာမျက်နှာ မရှိပါ။",
+ "linkshere-2": "အောက်ပါစာမျက်နှာများသည် <strong>$2</strong> သို့ ချိတ်ဆက်ထားသည် -",
+ "nolinkshere-2": "<strong>$2</strong> သို့ လင့်ခ်ထားသော စာမျက်နှာ မရှိပါ။",
"isredirect": "ပြန်ညွှန်းသော စာမျက်နှာ",
"istemplate": "ထည့်သွင်းကူးယူချက်",
"isimage": "ဖိုင်လင့်",
"whatlinkshere": "Мезе тезэнь сюлмави",
"whatlinkshere-title": "$1 марто сюлмазь лопатне",
"whatlinkshere-page": "Лопась:",
- "linkshere-2": "Сыця лопатьне сюлмававить '''$1''' марто:",
- "nolinkshere-2": "Кодаткак лопат асульмавить '''$1''' марто.",
+ "linkshere-2": "Сыця лопатьне сюлмававить '''$2''' марто:",
+ "nolinkshere-2": "Кодаткак лопат асульмавить '''$2''' марто.",
"isredirect": "Лиякс витнинк-петнинк лопанть",
"istemplate": "совавтомс",
"isimage": "файлань сюлмавома пене",
"whatlinkshere": "لینکئون ِاینتا صفحه",
"whatlinkshere-title": "وألـگئونی که \"$1\" ره لـیـنک ههدانه",
"whatlinkshere-page": "صفحه:",
- "linkshere-2": "اینان صفحهئون به '''$1''' لینک هدانه:",
+ "linkshere-2": "اینان صفحهئون به '''$2''' لینک هدانه:",
"isredirect": "دکشیین صفحه",
"istemplate": "تراگنجانشئون",
"isimage": "فایل ِلینک",
"whatlinkshere": "In tlein quitzonhuilia nican",
"whatlinkshere-title": "Zāzaniltin quitzonhuiliah $1",
"whatlinkshere-page": "Tlahcuilolamatl:",
- "linkshere-2": "Inīn zāzaniltin quitzonhuiliah '''$1''' īhuīc:",
- "nolinkshere-2": "Ahtle quitzonhuilia '''$1''' īhuīc.",
+ "linkshere-2": "Inīn zāzaniltin quitzonhuiliah '''$2''' īhuīc:",
+ "nolinkshere-2": "Ahtle quitzonhuilia '''$2''' īhuīc.",
"isredirect": "Tlacueptli tlahcuilolamatl",
"isimage": "īxiptlahtli tzonhuiliztli",
"whatlinkshere-prev": "{{PLURAL:$1|achtopa|$1 achtopa}}",
"whatlinkshere": "Tó-ūi liân kàu chia",
"whatlinkshere-title": "Liân khì \"$1\" ê ia̍h-bīn",
"whatlinkshere-page": "Ia̍h:",
- "linkshere-2": "Í-hā '''$1''' liân kàu chia:",
- "nolinkshere-2": "Bô poàⁿ ia̍h liân kàu '''$1'''.",
+ "linkshere-2": "Í-hā '''$2''' liân kàu chia:",
+ "nolinkshere-2": "Bô poàⁿ ia̍h liân kàu '''$2'''.",
"isredirect": "choán-ia̍h",
"isimage": "tóng-àn liân-kiat",
"whatlinkshere-prev": "{{PLURAL:$1|chêng|chêng $1 ê}}",
"whatlinkshere": "Paggene ca cullegano a chesta",
"whatlinkshere-title": "Paggene ca cullegano a $1",
"whatlinkshere-page": "Paggena:",
- "linkshere-2": "'E paggene ccà abbascio cunteneno jonte ca spuntano a '''$1'''.",
- "nolinkshere-2": "Nisciuna paggena cuntene jonte ca spuntasse a <strong>$1</strong>.",
- "nolinkshere-ns-2": "Nun ce stanno paggene ca spuntassero '''$1''' dint' 'o namespace scigliuto.",
+ "linkshere-2": "'E paggene ccà abbascio cunteneno jonte ca spuntano a '''$2'''.",
+ "nolinkshere-2": "Nisciuna paggena cuntene jonte ca spuntasse a <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Nun ce stanno paggene ca spuntassero '''$2''' dint' 'o namespace scigliuto.",
"isredirect": "redirect a paggena",
"istemplate": "'nclusione",
"isimage": "Cullegamente a file multimediale",
"whatlinkshere": "Lenker hit",
"whatlinkshere-title": "Sider som lenker til «$1»",
"whatlinkshere-page": "Side:",
- "linkshere-2": "Følgende sider lenker til '''$1''':",
- "nolinkshere-2": "Ingen sider lenker til '''$1'''.",
- "nolinkshere-ns-2": "Ingen sider lenker til '''$1''' i valgte navnerom.",
+ "linkshere-2": "Følgende sider lenker til '''$2''':",
+ "nolinkshere-2": "Ingen sider lenker til '''$2'''.",
+ "nolinkshere-ns-2": "Ingen sider lenker til '''$2''' i valgte navnerom.",
"isredirect": "omdirigeringsside",
"istemplate": "transklusjon",
"isimage": "fillenke",
"unprotect": "Beveyliging wysigen",
"newpage": "Nieje zied",
"talkpagelinktext": "Oaverleg",
- "specialpage": "Spesiale zied",
+ "specialpage": "Speciale syde",
"personaltools": "Persoonlike instellingen",
"talk": "Oaverleg",
"views": "Weergaven",
"nstab-main": "Artikel",
"nstab-user": "Gebruker",
"nstab-media": "Media",
- "nstab-special": "Spesiale zied",
- "nstab-project": "Projektzied",
- "nstab-image": "Bestaand",
- "nstab-mediawiki": "Tiejige",
+ "nstab-special": "Speciale syde",
+ "nstab-project": "Projektsyde",
+ "nstab-image": "Bestand",
+ "nstab-mediawiki": "Bericht",
"nstab-template": "Mal",
- "nstab-help": "Hulpe",
- "nstab-category": "Kategorie",
+ "nstab-help": "Hülpe",
+ "nstab-category": "Kategory",
"mainpage-nstab": "Vöärblad",
"nosuchaction": "De op-egeven haandeling besteet niet",
"nosuchactiontext": "De opdrachte in t webadres in ongeldig.\nJe hebben t webadres misschien verkeerd in-etikt of de verkeerde verwiezing evolgd.\nDit kan oek dujen op n fout in de programmatuur van {{SITENAME}}.",
"whatlinkshere": "Verwysingen hyrhinne",
"whatlinkshere-title": "Ziejen die verwiezen naor \"$1\"",
"whatlinkshere-page": "Zied:",
- "linkshere-2": "Disse ziejen verwiezen naor '''$1''':",
- "nolinkshere-2": "Gien enkele zied verwis naor '''$1'''.",
- "nolinkshere-ns-2": "Gien enkele zied verwis naor '''$1''' in de ekeuzen naamruumte.",
+ "linkshere-2": "Disse ziejen verwiezen naor '''$2''':",
+ "nolinkshere-2": "Gien enkele zied verwis naor '''$2'''.",
+ "nolinkshere-ns-2": "Gien enkele zied verwis naor '''$2''' in de ekeuzen naamruumte.",
"isredirect": "deurverwiezing",
"istemplate": "in-evoegd as mal",
"isimage": "bestaandsverwiezing",
"whatlinkshere": "Wat wiest na disse Siet hen",
"whatlinkshere-title": "Sieden, de na „$1“ wiest",
"whatlinkshere-page": "Siet:",
- "linkshere-2": "Disse Sieden wiest na '''„$1“''':",
- "nolinkshere-2": "Kene Siet wiest na '''„$1“'''.",
- "nolinkshere-ns-2": "Kene Sieden wiest na '''$1''' in’n utwählten Naamruum.",
+ "linkshere-2": "Disse Sieden wiest na '''„$2“''':",
+ "nolinkshere-2": "Kene Siet wiest na '''„$2“'''.",
+ "nolinkshere-ns-2": "Kene Sieden wiest na '''$2''' in’n utwählten Naamruum.",
"isredirect": "Wiederleiden",
"istemplate": "inbunnen dör Vörlaag",
"isimage": "Dateilenk",
"whatlinkshere": "यहाँ के जोडिन्छ",
"whatlinkshere-title": "$1 सँग जोडिएका पानाहरू",
"whatlinkshere-page": "पृष्ठ:",
- "linkshere-2": "निम्न पृष्ठहरू '''$1''' मा जोडिन्छ :",
- "nolinkshere-2": " '''$1'''मा लिंक भएका कुनै पृष्ठहरू छैनन्",
- "nolinkshere-ns-2": "चुनिएको नामस्थानमा '''$1''' सित जोडिने पृष्ठहरू छैनन्।",
+ "linkshere-2": "निम्न पृष्ठहरू '''$2''' मा जोडिन्छ :",
+ "nolinkshere-2": " '''$2'''मा लिंक भएका कुनै पृष्ठहरू छैनन्",
+ "nolinkshere-ns-2": "चुनिएको नामस्थानमा '''$2''' सित जोडिने पृष्ठहरू छैनन्।",
"isredirect": "अनुप्रेषित पृष्ठ",
"istemplate": "पारदर्शिता",
"isimage": "फाइल लिङ्क",
"whatlinkshere": "Verwijzingen naar deze pagina",
"whatlinkshere-title": "Pagina's die verwijzen naar \"$1\"",
"whatlinkshere-page": "Pagina:",
- "linkshere-2": "De volgende pagina's verwijzen naar '''$1''':",
- "nolinkshere-2": "Geen enkele pagina verwijst naar '''$1'''.",
- "nolinkshere-ns-2": "Geen enkele pagina in de gekozen naamruimte verwijst naar '''$1'''.",
+ "linkshere-2": "De volgende pagina's verwijzen naar <strong>$2</strong>:",
+ "nolinkshere-2": "Geen enkele pagina verwijst naar <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Geen enkele pagina in de gekozen naamruimte verwijst naar <strong>$2</strong>.",
"isredirect": "doorverwijspagina",
"istemplate": "ingevoegd als sjabloon",
"isimage": "bestandskoppeling",
"whatlinkshere": "Lenkjer hit",
"whatlinkshere-title": "Sider som har lenkje til «$1»",
"whatlinkshere-page": "Side:",
- "linkshere-2": "Desse sidene har lenkjer til '''$1''':",
- "nolinkshere-2": "Ingen sider har lenkjer til '''$1'''.",
- "nolinkshere-ns-2": "Ingen sider har lenkje til '''$1''' i det valde namnerommet.",
+ "linkshere-2": "Desse sidene har lenkjer til '''$2''':",
+ "nolinkshere-2": "Ingen sider har lenkjer til '''$2'''.",
+ "nolinkshere-ns-2": "Ingen sider har lenkje til '''$2''' i det valde namnerommet.",
"isredirect": "omdirigeringsside",
"istemplate": "inkludert som mal",
"isimage": "fillenkje",
"whatlinkshere": "Ke eng yeo e hlomaganyago mo",
"whatlinkshere-title": "Matlakala a go hlomaganya go \"$1\"",
"whatlinkshere-page": "Letlakala:",
- "linkshere-2": "Matlaka a latelago a hlomaganya le '''$1''':",
- "nolinkshere-2": "Ga go letlakala leo le hlomaganyago go '''$1'''.",
+ "linkshere-2": "Matlaka a latelago a hlomaganya le '''$2''':",
+ "nolinkshere-2": "Ga go letlakala leo le hlomaganyago go '''$2'''.",
"isredirect": "''redirect'' letlakala",
"istemplate": "tsentšho",
"isimage": "Hlomaganyo ya Faele",
"whatlinkshere": "natj beda nitja",
"whatlinkshere-title": "Bibol beda $1",
"whatlinkshere-page": "Bibol:",
- "linkshere-2": "Ngawaliny bibol beda-ang <strong>$1</strong>",
- "nolinkshere-2": "Uart bibol beda <strong>$1</strong>.",
+ "linkshere-2": "Ngawaliny bibol beda-ang <strong>$2</strong>",
+ "nolinkshere-2": "Uart bibol beda <strong>$2</strong>.",
"isredirect": "Dtallangiritch bibol",
"istemplate": "transclusion",
"isimage": "file beda",
"botpasswords-updated-body": "Lo senhal pel robòt « $1 » de l'{{GENDER:$2|utilizaire|utilizaira}} « $2 » es estat mes a jorn.",
"botpasswords-deleted-title": "Senhal de robòts suprimit",
"botpasswords-deleted-body": "Lo senhal pel robòt « $1 » de l'{{GENDER:$2|utilizaire|utilizaira}} « $2 » es suprimit.",
+ "botpasswords-newpassword": "Lo mot de passa novèl per se connectar a <strong>$1</strong> es <strong>$2</strong>. <em>Vos cal lo registrar per lo vos remembrar mai tard.</em> <br> (Per los robòts vièlhs qu'an de besonh que lo nom per se connectar siá lo meteis que lo nom d'utilizaire, podètz tanben emplegar <strong>$3</strong> coma nom d'utilizaire e <strong>$4</strong> coma mot de passa.)",
"botpasswords-no-provider": "BotPasswordsSessionProvider es pas disponible.",
"botpasswords-restriction-failed": "Las restriccions de mot de passa de bots empachan aquela connexion.",
"botpasswords-invalid-name": "Lo nom d'usatgièr especificat conten pas de separador de mot de passa de robòt (\"$1\").",
"botpasswords-not-exist": "L'usatgièr «$1» a pas de mot de passa de robòt nomenat «$2».",
+ "botpasswords-needs-reset": "Cal tornar inicializar lo mot de passa pel robòt nomenat \"$2\" de l'utilizaire {{GENDER:$1|user}} \"$1\".",
"resetpass_forbidden": "Los senhals pòdon pas èsser cambiats",
"resetpass_forbidden-reason": "Los senhaus pòdon pas èsser cambiats : $1",
"resetpass-no-info": "Vos cal èsser connectat per aver accès a aquesta pagina.",
"whatlinkshere": "Paginas ligadas a aquesta",
"whatlinkshere-title": "Paginas que puntan cap a « $1 »",
"whatlinkshere-page": "Pagina :",
- "linkshere-2": "Las paginas çaijós contenon un ligam cap a '''$1''':",
- "nolinkshere-2": "Cap de pagina conten pas de ligam cap a '''$1'''.",
- "nolinkshere-ns-2": "Cap de pagina conten pas de ligam cap a '''$1''' dins l’espaci de nom causit.",
+ "linkshere-2": "Las paginas çaijós contenon un ligam cap a '''$2''':",
+ "nolinkshere-2": "Cap de pagina conten pas de ligam cap a '''$2'''.",
+ "nolinkshere-ns-2": "Cap de pagina conten pas de ligam cap a '''$2''' dins l’espaci de nom causit.",
"isredirect": "pagina de redireccion",
"istemplate": "inclusion",
"isimage": "ligam cap al fichièr",
"whatlinkshere": "Linkit tänne",
"whatlinkshere-title": "Sivut, kudamat kosketah sivuu \"$1\"",
"whatlinkshere-page": "Sivu:",
- "linkshere-2": "Nämmä sivut linkittiäkseh sivuh <strong>$1</strong>:",
+ "linkshere-2": "Nämmä sivut linkittiäkseh sivuh <strong>$2</strong>:",
"isredirect": "uvvellehohjavussivu",
"istemplate": "sizällyttämine",
"isimage": "failan linku",
"whatlinkshere": "ଏଠାରେ ଥିବା ଲିଙ୍କ",
"whatlinkshere-title": "\"$1\" କୁ ପୃଷ୍ଠା ଲିଙ୍କ",
"whatlinkshere-page": "ପୃଷ୍ଠା:",
- "linkshere-2": "ଏହି ପୃଷ୍ଠା ସବୁ <strong>$1</strong> ସହ ଯୋଡ଼ା ଯାଇଅଛି:",
- "nolinkshere-2": "'''$1''' ସହିତ କୌଣସିଟି ପୃଷ୍ଠା ଯୋଡ଼ାଯାଇନାହିଁ ।",
- "nolinkshere-ns-2": "ବଛା ଯାଇଥିବା ନେମସ୍ପେସରେ '''$1''' ନାଆଁ ସହ କୌଣସି ବି ପୃଷ୍ଠା ଯୋଡ଼ାଯାଇନାହିଁ ।",
+ "linkshere-2": "ଏହି ପୃଷ୍ଠା ସବୁ <strong>$2</strong> ସହ ଯୋଡ଼ା ଯାଇଅଛି:",
+ "nolinkshere-2": "'''$2''' ସହିତ କୌଣସିଟି ପୃଷ୍ଠା ଯୋଡ଼ାଯାଇନାହିଁ ।",
+ "nolinkshere-ns-2": "ବଛା ଯାଇଥିବା ନେମସ୍ପେସରେ '''$2''' ନାଆଁ ସହ କୌଣସି ବି ପୃଷ୍ଠା ଯୋଡ଼ାଯାଇନାହିଁ ।",
"isredirect": "ଆଉଥରେ ଫେରିବା ପୃଷ୍ଠା",
"istemplate": "ଆଧାର ସହ ଭିତରେ ରଖିବା",
"isimage": "ଫାଇଲର ଲିଙ୍କ",
"whatlinkshere": "Чи æрвиты ардæм",
"whatlinkshere-title": "Фæрстæ, кæдон æрвитынц ардæм: «$1»",
"whatlinkshere-page": "Фарс:",
- "linkshere-2": "Ацы фæрстæ æрвитынц '''$1''':",
- "nolinkshere-2": "Никæцы фарс æрвиты ардæм: '''$1'''.",
- "nolinkshere-ns-2": "Амынд номдоны мидæг никæцы фарс æрвиты ардæм <strong>$1</strong>.",
+ "linkshere-2": "Ацы фæрстæ æрвитынц '''$2''':",
+ "nolinkshere-2": "Никæцы фарс æрвиты ардæм: '''$2'''.",
+ "nolinkshere-ns-2": "Амынд номдоны мидæг никæцы фарс æрвиты ардæм <strong>$2</strong>.",
"isredirect": "æрвитæн фарс",
"istemplate": "æфтыдæй",
"isimage": "файлмæ æрвитæн",
"whatlinkshere": "ਇੱਥੇ ਕੀ ਆ ਕੇ ਜੁੜਦਾ ਹੈ",
"whatlinkshere-title": "$1 ਨਾਲ ਜੋੜਨ ਵਾਲੇ ਸਫ਼ੇ",
"whatlinkshere-page": "ਸਫ਼ਾ:",
- "linkshere-2": "ਇਹ ਪੰਨੇ '''$1''' ਨਾਲ ਜੋੜਦੇ ਹਨ:",
- "nolinkshere-2": "ਕੋਈ ਵੀ ਸਫ਼ਾ '''$1''' ਨਾਲ ਨਹੀਂ ਜੋੜਦਾ।",
+ "linkshere-2": "ਇਹ ਪੰਨੇ '''$2''' ਨਾਲ ਜੋੜਦੇ ਹਨ:",
+ "nolinkshere-2": "ਕੋਈ ਵੀ ਸਫ਼ਾ '''$2''' ਨਾਲ ਨਹੀਂ ਜੋੜਦਾ।",
"isredirect": "ਰੀਡਿਰੈਕਟ ਸਫ਼ਾ",
"istemplate": "ਟਾਕਰਾ ਕਰੋ",
"isimage": "ਫ਼ਾਈਲ ਲਿੰਕ",
"whatlinkshere": "Deng pakasuglung keti",
"whatlinkshere-title": "Deng bulung a makasuglung king \"$1\"",
"whatlinkshere-page": "Bulung:",
- "linkshere-2": "Pakasuglung la king '''$1''' deng makatuking bulung:",
- "nolinkshere-2": "Alang bulung a makasuglung king '''$1'''.",
- "nolinkshere-ns-2": "Alang bulung a makatuglung king '''$1''' ketang mepiling pirinan lagyu (namespace).",
+ "linkshere-2": "Pakasuglung la king '''$2''' deng makatuking bulung:",
+ "nolinkshere-2": "Alang bulung a makasuglung king '''$2'''.",
+ "nolinkshere-ns-2": "Alang bulung a makatuglung king '''$2''' ketang mepiling pirinan lagyu (namespace).",
"isredirect": "Bulung ning pamanaliling direksiun",
"istemplate": "misingit",
"isimage": "Isuglung king larawan",
"whatlinkshere": "Cha lie quoé ichi",
"whatlinkshere-title": "Paches qu'il ont des loïens aveuc \"$1\"",
"whatlinkshere-page": "Pache:",
- "linkshere-2": "Chés paches-lo il sont érliées à '''$1''':",
- "nolinkshere-2": "i n'y o poin d'pache aveuc un loïen vers '''$1'''.",
- "nolinkshere-ns-2": "i n'y o poin d'pache aveuc un loïen vers '''$1''' dins echl'éspace d'noms coési.",
+ "linkshere-2": "Chés paches-lo il sont érliées à '''$2''':",
+ "nolinkshere-2": "i n'y o poin d'pache aveuc un loïen vers '''$2'''.",
+ "nolinkshere-ns-2": "i n'y o poin d'pache aveuc un loïen vers '''$2''' dins echl'éspace d'noms coési.",
"isredirect": "pache érdirigée",
"istemplate": "transclusion",
"isimage": "Loïen aveuc l'fichié",
"whatlinkshere": "Was dohea zaische dud",
"whatlinkshere-title": "Saide wu uff \"$1\" valing'gn",
"whatlinkshere-page": "Said:",
- "linkshere-2": "Die Saide valing'gn uff '''$1''':",
- "nolinkshere-2": "Kä Said zaischd uff '''$1'''.",
+ "linkshere-2": "Die Saide valing'gn uff '''$2''':",
+ "nolinkshere-2": "Kä Said zaischd uff '''$2'''.",
"isredirect": "Waidalaidungsaid",
"istemplate": "Vorlacheoibindung",
"isimage": "Dadailing'g",
"whatlinkshere": "Linkujące",
"whatlinkshere-title": "Strony linkujące do „$1”",
"whatlinkshere-page": "Strona:",
- "linkshere-2": "Następujące strony odwołują się do '''$1''':",
- "nolinkshere-2": "Żadna strona nie odwołuje się do '''$1'''.",
- "nolinkshere-ns-2": "Żadna strona nie odwołuje się do '''$1''' w wybranej przestrzeni nazw.",
+ "linkshere-2": "Następujące strony odwołują się do <strong>$2</strong>:",
+ "nolinkshere-2": "Żadna strona nie odwołuje się do <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Żadna strona nie odwołuje się do <strong>$2</strong> w wybranej przestrzeni nazw.",
"isredirect": "strona przekierowująca",
"istemplate": "dołączony szablon",
"isimage": "link do pliku",
"whatlinkshere": "Pàgine con dj'anliure che a men-o a costa-sì",
"whatlinkshere-title": "Pàgine ch'a men-o a «$1»",
"whatlinkshere-page": "Pàgina:",
- "linkshere-2": "Le pàgine sì-sota a l'han andrinta dj'anliure che a men-o a '''$1''':",
- "nolinkshere-2": "A-i é pa gnun-a pàgina che a l'abia dj'anliure che a men-o a '''$1'''.",
- "nolinkshere-ns-2": "An cost ëspassi nominal-sì a-i é gnun-e pàgine con dj'anliure ch'a men-o a '''$1'''.",
+ "linkshere-2": "Le pàgine sì-sota a l'han andrinta dj'anliure che a men-o a '''$2''':",
+ "nolinkshere-2": "A-i é pa gnun-a pàgina che a l'abia dj'anliure che a men-o a '''$2'''.",
+ "nolinkshere-ns-2": "An cost ëspassi nominal-sì a-i é gnun-e pàgine con dj'anliure ch'a men-o a '''$2'''.",
"isredirect": "ridiression",
"istemplate": "inclusion",
"isimage": "anliura a l'archivi",
"whatlinkshere": "ایتھے کیدا جوڑ اے",
"whatlinkshere-title": "او صفے جہڑے \"$1\" نال جڑے نیں",
"whatlinkshere-page": "صفہ:",
- "linkshere-2": "تھلے دتے گۓ صفے اس دے نال جڑدے نے '''$1''':",
- "nolinkshere-2": "'''$1''' دے نال کسے دا جوڑ نہیں",
- "nolinkshere-ns-2": "چنے ناں چ کسے صفے دا '''$1''' نال جوڑ نئیں۔",
+ "linkshere-2": "تھلے دتے گۓ صفے اس دے نال جڑدے نے '''$2''':",
+ "nolinkshere-2": "'''$2''' دے نال کسے دا جوڑ نہیں",
+ "nolinkshere-ns-2": "چنے ناں چ کسے صفے دا '''$2''' نال جوڑ نئیں۔",
"isredirect": "ریڈائرکٹ صفہ",
"istemplate": "ملن",
"isimage": "مورت دا جوڑ",
"whatlinkshere": "Ντο δεκνίζ' αδακές",
"whatlinkshere-title": "Σελίδας ντο συνδέουν ση σελίδαν $1",
"whatlinkshere-page": "Σελίδαν:",
- "linkshere-2": "Αβούτα τα σελίδας δεκνίζνε σο '''$1''':",
- "nolinkshere-2": "'Κ ευρέθεν σελίδα το δεκνίζ' ση σελίδαν '''$1'''.",
+ "linkshere-2": "Αβούτα τα σελίδας δεκνίζνε σο '''$2''':",
+ "nolinkshere-2": "'Κ ευρέθεν σελίδα το δεκνίζ' ση σελίδαν '''$2'''.",
"isredirect": "σελίδαν διπλού σύνδεσμονος",
"istemplate": "ενσωμάτωση",
"isimage": "σύνδεσμον εικόνας",
"whatlinkshere": "Ka autenginna stwi",
"whatlinkshere-title": "Pāusan autengināntei prei \"$1\"",
"whatlinkshere-page": "Pāusan:",
- "linkshere-2": "Ripīntei pāusai autenginna prei '''$1''':",
- "nolinkshere-2": "Niaīnan pāusan ni autenginna prei '''$1'''.",
- "nolinkshere-ns-2": "Niaīnan pāusan ni autenginna prei '''$1''' en etrīnktai tītelin plattibin.",
+ "linkshere-2": "Ripīntei pāusai autenginna prei '''$2''':",
+ "nolinkshere-2": "Niaīnan pāusan ni autenginna prei '''$2'''.",
+ "nolinkshere-ns-2": "Niaīnan pāusan ni autenginna prei '''$2''' en etrīnktai tītelin plattibin.",
"isredirect": "prawesnas pāusan",
"istemplate": "entensīsenis",
"isimage": "autengīnsenis prei bildin",
"whatlinkshere": "د دې مخ تړنې",
"whatlinkshere-title": "هغه مخونه چې د \"$1\" سره تړنې لري",
"whatlinkshere-page": "مخ:",
- "linkshere-2": "دغه لانديني مخونه د '''$1''' سره تړنې لري:",
- "nolinkshere-2": "د '''$1''' سره هېڅ يو مخ هم تړنې نه لري .",
+ "linkshere-2": "دغه لانديني مخونه د '''$2''' سره تړنې لري:",
+ "nolinkshere-2": "د '''$2''' سره هېڅ يو مخ هم تړنې نه لري .",
"isredirect": "د مخ گرځونې مخ",
"istemplate": "ورگډېدنه",
"isimage": "د دوتنې تړنه",
"whatlinkshere": "Páginas afluentes",
"whatlinkshere-title": "Páginas que têm links para \"$1\"",
"whatlinkshere-page": "Página:",
- "linkshere-2": "As seguintes páginas possuem links para '''$1''':",
- "nolinkshere-2": "Não há afluentes para '''$1''' com as condições especificadas.",
- "nolinkshere-ns-2": "Não há links para '''$1''' no espaço nominal selecionado.",
+ "linkshere-2": "As seguintes páginas têm link para <strong>$2</strong>:",
+ "nolinkshere-2": "Não existem afluentes para <strong>$2</strong> com as condições especificadas.",
+ "nolinkshere-ns-2": "Não existem afluentes para <strong>$2</strong> no espaço nominal selecionado.",
"isredirect": "página de redirecionamento",
"istemplate": "transclusão",
"isimage": "link para o arquivo",
"whatlinkshere": "Páginas afluentes",
"whatlinkshere-title": "Páginas com hiperligações para \"$1\"",
"whatlinkshere-page": "Página:",
- "linkshere-2": "As seguintes páginas têm hiperligações para <strong>$1</strong>:",
- "nolinkshere-2": "Não existem afluentes para <strong>$1</strong> com as condições especificadas.",
- "nolinkshere-ns-2": "Não existem afluentes para <strong>$1</strong> no espaço nominal selecionado.",
+ "linkshere-2": "As seguintes páginas têm hiperligações para <strong>$2</strong>:",
+ "nolinkshere-2": "Não existem afluentes para <strong>$2</strong> com as condições especificadas.",
+ "nolinkshere-ns-2": "Não existem afluentes para <strong>$2</strong> no espaço nominal selecionado.",
"isredirect": "página de redirecionamento",
"istemplate": "inclusão",
"isimage": "hiperligação para ficheiro",
"Acamicamacaraca",
"Avatar6",
"Akapochtli",
- "ديفيد"
+ "ديفيد",
+ "Daimona Eaytoy"
]
},
"sidebar": "{{notranslate}}",
"whatlinkshere-title": "Title of the special page [[Special:WhatLinksHere]]. This page appears when you click on the 'What links here' button in the toolbox. $1 is the name of the page concerned.",
"whatlinkshere-summary": "{{doc-specialpagesummary|whatlinkshere}}",
"whatlinkshere-page": "{{Identical|Page}}",
- "linkshere-2": "This message is the header line of the [[Special:WhatLinksHere/$1]] page generated by clicking \"What links here\" in the sidebar toolbox.\n\nIt is followed by a navigation bar built using {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - HTML link to the page.",
- "nolinkshere-2": "Used in [[Special:WhatLinksHere]] if empty. Parameters:\n* $1 - HTML link to the page\nSee also:\n* {{msg-mw|Nolinkshere-ns-html}}",
- "nolinkshere-ns-2": "Used in [[Special:WhatLinksHere]] if empty. Parameters:\n* $1 - HTML link to the page\nSee also:\n* {{msg-mw|Nolinkshere-html}}",
+ "linkshere-2": "This message is the header line of the [[Special:WhatLinksHere/$1]] page generated by clicking \"What links here\" in the sidebar toolbox.\n\nIt is followed by a navigation bar built using {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - Plain page title\n* $2 - HTML link to the page.",
+ "nolinkshere-2": "Used in [[Special:WhatLinksHere]] if empty. Parameters:\n* $1 - Plain page title\n* $2 - HTML link to the page.\nSee also:\n* {{msg-mw|Nolinkshere-ns-2}}",
+ "nolinkshere-ns-2": "Used in [[Special:WhatLinksHere]] if empty. Parameters:\n* $1 - Plain page title\n* $2 - HTML link to the page.\nSee also:\n* {{msg-mw|Nolinkshere-2}}",
"isredirect": "Displayed in [[Special:WhatLinksHere]] (see [{{fullurl:Special:WhatLinksHere/Project:Translator|hidelinks=1}} Special:WhatLinksHere/Project:Translator] for example).\n\n{{Identical|Redirect page}}",
"istemplate": "Means that a page (a template, specifically) is used as <code><nowiki>{{Page name}}</nowiki></code>.\nDisplayed in [[Special:WhatLinksHere]] (see [[Special:WhatLinksHere/Template:New portal]] for example).\nIf you are not sure how to translate this term, think of something like \"inclusion\", \"embedding\", or \"insertion\".\n{{Identical|Transclusion}}",
"isimage": "This message is displayed on [[Special:WhatLinksHere]] for images. It means that the image is used on the page (as opposed to just being linked to like an non-image page).\n{{Identical|File link}}",
"whatlinkshere": "Kayman t'inkimuq",
"whatlinkshere-title": "$1 sutiyuq p'anqaman t'inkimuqkuna",
"whatlinkshere-page": "P'anqa:",
- "linkshere-2": "'''$1''' sutiyuq p'anqamanqa kay qatiq p'anqakunam t'inkimun:",
- "nolinkshere-2": "Manam kachkanchu '''$1'''-man t'inkiq p'anqa.",
- "nolinkshere-ns-2": "Manam kachkanchu '''$1'''-man t'inkiq p'anqa akllasqa suti k'itipi.",
+ "linkshere-2": "'''$2''' sutiyuq p'anqamanqa kay qatiq p'anqakunam t'inkimun:",
+ "nolinkshere-2": "Manam kachkanchu '''$2'''-man t'inkiq p'anqa.",
+ "nolinkshere-ns-2": "Manam kachkanchu '''$2'''-man t'inkiq p'anqa akllasqa suti k'itipi.",
"isredirect": "pusapusqa p'anqa",
"istemplate": "ch'aqtasqa",
"isimage": "willañiqi t'inki",
"whatlinkshere": "Kayman tinkikuna",
"whatlinkshere-title": "$1-man tinkiyuk pankakuna",
"whatlinkshere-page": "Panka:",
- "linkshere-2": "Chay pankakunaka '''$1'''-man tinkiyukmi kan:",
- "nolinkshere-2": "Mana pankaka '''$1'''-man tinkikunchu.",
+ "linkshere-2": "Chay pankakunaka '''$2'''-man tinkiyukmi kan:",
+ "nolinkshere-2": "Mana pankaka '''$2'''-man tinkikunchu.",
"isredirect": "pushashka panka",
"istemplate": "Ukupi tiyak panka (''inclusión'')",
"isimage": "rikcha tinki",
"whatlinkshere": "ⵎⵉⵏ ⵉⵇⵇⵏⴻⵏ ⵖⵔ ⴷⴰ",
"whatlinkshere-title": "Tasniwin id-izedyen ɣar \"$1\"",
"whatlinkshere-page": "ⵜⴰⵙⵏⴰ:",
- "linkshere-2": "Tasna ya tzedi ɣa '''$1''':",
- "nolinkshere-2": "war tlli ca n Tasna tqqen-d da '''$1'''.",
+ "linkshere-2": "Tasna ya tzedi ɣa '''$2''':",
+ "nolinkshere-2": "war tlli ca n Tasna tqqen-d da '''$2'''.",
"isredirect": "Tasna n (redirect)",
"istemplate": "Asidef",
"isimage": "amaqqan usatul",
"whatlinkshere": "Colliaziuns sin questa pagina",
"whatlinkshere-title": "Paginas ch'èn colliadas cun \"$1\"",
"whatlinkshere-page": "Pagina:",
- "linkshere-2": "Suandantas paginas èn colliadas cun '''$1''':",
- "nolinkshere-2": "Naginas paginas èn colliadas cun '''$1'''.",
- "nolinkshere-ns-2": "Naginas paginas èn colliadas cun '''$1''' en il tip da pagina tschernì.",
+ "linkshere-2": "Suandantas paginas èn colliadas cun '''$2''':",
+ "nolinkshere-2": "Naginas paginas èn colliadas cun '''$2'''.",
+ "nolinkshere-ns-2": "Naginas paginas èn colliadas cun '''$2''' en il tip da pagina tschernì.",
"isredirect": "Pagina che renviescha",
"istemplate": "Integraziun da models",
"isimage": "colliaziun da datoteca",
"whatlinkshere": "Ce trimite aici",
"whatlinkshere-title": "Pagini care conțin legături spre „$1”",
"whatlinkshere-page": "Pagină:",
- "linkshere-2": "Următoarele pagini conțin legături către <strong>$1</strong>:",
- "nolinkshere-2": "Nici o pagină nu trimite la '''$1'''.",
- "nolinkshere-ns-2": "Nici o pagină din spațiul de nume ales nu trimite la '''$1'''.",
+ "linkshere-2": "Următoarele pagini conțin legături către <strong>$2</strong>:",
+ "nolinkshere-2": "Nici o pagină nu trimite la '''$2'''.",
+ "nolinkshere-ns-2": "Nici o pagină din spațiul de nume ales nu trimite la '''$2'''.",
"isredirect": "pagină de redirecționare",
"istemplate": "prin includerea formatului",
"isimage": "legătură către fișier",
"whatlinkshere": "Appondene aqquà",
"whatlinkshere-title": "Pàggene ca appondene a \"$1\"",
"whatlinkshere-page": "Pàgene:",
- "linkshere-2": "Le pàggene ca avènene appondene a '''$1''':",
- "nolinkshere-2": "Nisciuna pàgene apponde a '''$1'''.",
- "nolinkshere-ns-2": "Nisciuna pàgene apponde a '''$1''' jndr'à 'u namespace scacchiete.",
+ "linkshere-2": "Le pàggene ca avènene appondene a '''$2''':",
+ "nolinkshere-2": "Nisciuna pàgene apponde a '''$2'''.",
+ "nolinkshere-ns-2": "Nisciuna pàgene apponde a '''$2''' jndr'à 'u namespace scacchiete.",
"isredirect": "pàgene de ridirezionamende",
"istemplate": "inclusione",
"isimage": "collegamende a 'u file",
"whatlinkshere": "Ссылки сюда",
"whatlinkshere-title": "Страницы, ссылающиеся на «$1»",
"whatlinkshere-page": "Страница:",
- "linkshere-2": "Следующие страницы ссылаются на «'''$1'''»:",
- "nolinkshere-2": "На страницу '''$1''' отсутствуют ссылки с других страниц.",
- "nolinkshere-ns-2": "В выбранном пространстве имён нет страниц, ссылающихся на '''$1'''.",
+ "linkshere-2": "Следующие страницы ссылаются на <strong>$2</strong>:",
+ "nolinkshere-2": "На страницу <strong>$2</strong> отсутствуют ссылки с других страниц.",
+ "nolinkshere-ns-2": "В выбранном пространстве имён нет страниц, ссылающихся на '''$2'''.",
"isredirect": "страница-перенаправление",
"istemplate": "включение",
"isimage": "файловая ссылка",
"whatlinkshere": "Одказы на тоту сторінку",
"whatlinkshere-title": "Сторінкы, што ся одказують на \"$1\"",
"whatlinkshere-page": "Сторінка:",
- "linkshere-2": "Наслїдуючі сторінкы ся одказують на '''$1''':",
- "nolinkshere-2": "Жадна сторінка на '''$1''' не одказує.",
- "nolinkshere-ns-2": "У выбранім просторї назв на '''$1''' не одказує жадна сторінка.",
+ "linkshere-2": "Наслїдуючі сторінкы ся одказують на '''$2''':",
+ "nolinkshere-2": "Жадна сторінка на '''$2''' не одказує.",
+ "nolinkshere-ns-2": "У выбранім просторї назв на '''$2''' не одказує жадна сторінка.",
"isredirect": "сторінка напрямлена",
"istemplate": "вложіня",
"isimage": "Одказ на файл",
"whatlinkshere": "अनेन सह सम्बद्धाः",
"whatlinkshere-title": "\"$1\" सम्बद्धानि पृष्ठानि",
"whatlinkshere-page": "पृष्ठम्:",
- "linkshere-2": "'''$1''' इत्यनेन सह अधो लिखितानां पृष्ठानां परिसन्धिं करोतु:",
- "nolinkshere-2": "'''$1''' इत्यनेन सह न किमपि पृष्ठं परिसन्धितम्",
- "nolinkshere-ns-2": "चितनामस्थानात् '''$1''' इत्येनं योजनयोग्यं पृष्ठं नास्ति ।",
+ "linkshere-2": "'''$2''' इत्यनेन सह अधो लिखितानां पृष्ठानां परिसन्धिं करोतु:",
+ "nolinkshere-2": "'''$2''' इत्यनेन सह न किमपि पृष्ठं परिसन्धितम्",
+ "nolinkshere-ns-2": "चितनामस्थानात् '''$2''' इत्येनं योजनयोग्यं पृष्ठं नास्ति ।",
"isredirect": "अनुप्रेषण-पृष्ठम्",
"istemplate": "अन्यलेखभागः (transclusion)",
"isimage": "सञ्चिकासम्बन्धः",
"whatlinkshere": "Манна сигэнэллэр",
"whatlinkshere-title": "Сирэй манна сигэнэр \"$1\"",
"whatlinkshere-page": "Сирэй:",
- "linkshere-2": "'''$1''' билэҕэ манна көрдөрүллүбүт сирэйдэр сигэнэллэр:",
- "nolinkshere-2": "'''$1''' сирэйгэ сигэнэр сирэйдэр суохтар.",
- "nolinkshere-ns-2": "Талыллыбыт бөлөххө (namespace) бу '''$1''' сирэйгэ сигэнэр сирэйдэр суохтар.",
+ "linkshere-2": "'''$2''' билэҕэ манна көрдөрүллүбүт сирэйдэр сигэнэллэр:",
+ "nolinkshere-2": "'''$2''' сирэйгэ сигэнэр сирэйдэр суохтар.",
+ "nolinkshere-ns-2": "Талыллыбыт бөлөххө (namespace) бу '''$2''' сирэйгэ сигэнэр сирэйдэр суохтар.",
"isredirect": "көлбөрүтэр сирэй",
"istemplate": "иһинээҕи",
"isimage": "билэ сигэтэ",
"whatlinkshere": "ᱱᱚᱸᱰᱮ ᱫᱚ ᱪᱮᱫ ᱡᱚᱱᱚᱲ ᱠᱳ",
"whatlinkshere-title": "ᱚᱠᱟ ᱥᱟᱦᱴᱟ ᱠᱚᱫᱚ \"$1\" ᱨᱮ ᱡᱚᱱᱚᱲ ᱢᱮᱱᱟᱜ-ᱟ",
"whatlinkshere-page": "ᱥᱟᱦᱴᱟ:",
- "linkshere-2": "ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ ᱥᱟᱦᱴᱟᱠᱚ ᱫᱚ <strong>$1</strong> ᱥᱟᱶ ᱡᱚᱱᱚᱲ ᱢᱮᱱᱟᱜ-ᱟ :",
- "nolinkshere-2": "ᱥᱟᱦᱴᱟ ᱡᱚᱱᱚᱲ ᱵᱟᱱᱩᱜ-ᱟ ᱱᱤᱭᱟᱹ <strong>$1</strong>.",
+ "linkshere-2": "ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ ᱥᱟᱦᱴᱟᱠᱚ ᱫᱚ <strong>$2</strong> ᱥᱟᱶ ᱡᱚᱱᱚᱲ ᱢᱮᱱᱟᱜ-ᱟ :",
+ "nolinkshere-2": "ᱥᱟᱦᱴᱟ ᱡᱚᱱᱚᱲ ᱵᱟᱱᱩᱜ-ᱟ ᱱᱤᱭᱟᱹ <strong>$2</strong>.",
"isredirect": "ᱵᱟᱝ ᱥᱚᱡᱽᱦᱮ ᱥᱟᱦᱴᱟ",
"istemplate": "ᱥᱮᱞᱮᱫ",
"isimage": "ᱨᱮᱫ ᱡᱚᱱᱚᱲ",
"whatlinkshere": "Pàginas chi ligant a custa",
"whatlinkshere-title": "Pàginas chi ligant a \"$1\"",
"whatlinkshere-page": "Pàgina:",
- "linkshere-2": "Is pàginas chi sighint ligant a '''$1''':",
- "nolinkshere-2": "Peruna pàgina ligat a '''$1'''.",
- "nolinkshere-ns-2": "Peruna pàgina ligat a '''$1''' in su nùmene-logu seberadu.",
+ "linkshere-2": "Is pàginas chi sighint ligant a '''$2''':",
+ "nolinkshere-2": "Peruna pàgina ligat a '''$2'''.",
+ "nolinkshere-ns-2": "Peruna pàgina ligat a '''$2''' in su nùmene-logu seberadu.",
"isredirect": "pàgina de reindiritzamentu",
"istemplate": "inclusione",
"isimage": "ligòngiu a documentu",
"whatlinkshere": "Chi punta ccà",
"whatlinkshere-title": "Pàggini ca pùntanu a \"$1\"",
"whatlinkshere-page": "Pàggina:",
- "linkshere-2": "Sti pàggini hannu nu liami a '''$1''':",
- "nolinkshere-2": "Nudda pàggina havi nu liami a '''$1'''.",
- "nolinkshere-ns-2": "Nun ci sugnu pàggini chi puntano a '''$1''' ntô namespace silizziunatu.",
+ "linkshere-2": "Sti pàggini hannu nu liami a '''$2''':",
+ "nolinkshere-2": "Nudda pàggina havi nu liami a '''$2'''.",
+ "nolinkshere-ns-2": "Nun ci sugnu pàggini chi puntano a '''$2''' ntô namespace silizziunatu.",
"isredirect": "pàggina di rinnirizzamentu",
"istemplate": "nclusioni",
"isimage": "lijami ô file",
"whatlinkshere": "Whit airts here",
"whatlinkshere-title": "Pages that link til \"$1\"",
"whatlinkshere-page": "Page:",
- "linkshere-2": "The follaein pages link til <strong>$1</strong>:",
- "nolinkshere-2": "Nae pages link wi '''$1'''.",
- "nolinkshere-ns-2": "No pages aiet til <strong>$1</strong> in the chosen namespace.",
+ "linkshere-2": "The follaein pages link til <strong>$2</strong>:",
+ "nolinkshere-2": "Nae pages link wi '''$2'''.",
+ "nolinkshere-ns-2": "No pages aiet til <strong>$2</strong> in the chosen namespace.",
"isredirect": "reguidal page",
"istemplate": "transclusion",
"isimage": "file airtin",
"whatlinkshere": "هتان ڇا ڳنڍيل آهي",
"whatlinkshere-title": "\"$1\" سان ڳنڍيندڙ صفحا",
"whatlinkshere-page": "صفحو:",
- "linkshere-2": "هيٺيان صفحا <strong>$1</strong> سان ڳنڍيل آهن:",
- "nolinkshere-2": "'''$1''' سان ڪو بہ صفحو ڳنڍيل ناهي.",
+ "linkshere-2": "هيٺيان صفحا <strong>$2</strong> سان ڳنڍيل آهن:",
+ "nolinkshere-2": "'''$2''' سان ڪو بہ صفحو ڳنڍيل ناهي.",
"isredirect": "چورڻو صفحو",
"istemplate": "شموليت",
"isimage": "فائيل جو ڳنڍڻو",
"whatlinkshere": "Puntani inogghi",
"whatlinkshere-title": "Pàgini chi pùntani a \"$1\"",
"whatlinkshere-page": "Pàgina:",
- "linkshere-2": "Li sighenti pàgini cuntenani cullegamenti a '''$1''':",
- "nolinkshere-2": "Nisciuna pàgina cunteni dei cullegamenti chi pùntani a '''$1'''.",
- "nolinkshere-ns-2": "Nò vi so pàgini chi pùntani a '''$1''' i' lu namespace sciubaraddu.",
+ "linkshere-2": "Li sighenti pàgini cuntenani cullegamenti a '''$2''':",
+ "nolinkshere-2": "Nisciuna pàgina cunteni dei cullegamenti chi pùntani a '''$2'''.",
+ "nolinkshere-ns-2": "Nò vi so pàgini chi pùntani a '''$2''' i' lu namespace sciubaraddu.",
"isredirect": "rinviu",
"istemplate": "incrusioni",
"isimage": "Cullegamentu a file",
"whatlinkshere": "بەسیارەگان وە ئێرە",
"whatlinkshere-title": "ئەو پەڕەیلە ک وە «$1» بەسیار دێرن",
"whatlinkshere-page": "پەڕە:",
- "linkshere-2": "ئەی پەڕەیلە بەستیار دێرن وە '''$1''':",
- "nolinkshere-2": "هۊچ لاپەڕەێگ بەسیار وە '''$1''' نەێرێد .",
+ "linkshere-2": "ئەی پەڕەیلە بەستیار دێرن وە '''$2''':",
+ "nolinkshere-2": "هۊچ لاپەڕەێگ بەسیار وە '''$2''' نەێرێد .",
"isredirect": "پەڕەێ ڕەوانەکەر",
"istemplate": "ناوتەپیاێەگان (transclusions)",
"isimage": "بەسیار پەڕگە",
"sp-contributions-submit": "Oza",
"whatlinkshere": "Siiddut mat čujuhit deike",
"whatlinkshere-title": "Siiddut mat čujuhit $1",
- "linkshere-2": "Čuovvovaš siidduin lea liŋka siidui <strong>$1</strong>:",
- "nolinkshere-2": "Siidui <strong>$1</strong> eai leat liŋkkat.",
- "nolinkshere-ns-2": "Siidui <strong>$1</strong> eai leat liŋkkat válljejuvvon nammagomuvuođas.",
+ "linkshere-2": "Čuovvovaš siidduin lea liŋka siidui <strong>$2</strong>:",
+ "nolinkshere-2": "Siidui <strong>$2</strong> eai leat liŋkkat.",
+ "nolinkshere-ns-2": "Siidui <strong>$2</strong> eai leat liŋkkat válljejuvvon nammagomuvuođas.",
"isredirect": "ođđasitstivrensiidu",
"istemplate": "lasihuvvon mállevuođđui",
"whatlinkshere-prev": "← {{PLURAL:$1|ovddit siidu|$1 ovddit siiddu}}",
"whatlinkshere": "Kaŋ ga dobu ne",
"whatlinkshere-title": "Moɲey kaŋ ga dobu \"$1\" ga",
"whatlinkshere-page": "Moo:",
- "linkshere-2": "Moɲey wey ga dobu <strong>$1</strong> ga:",
- "nolinkshere-2": "Mooyaŋ kul ši dobu <strong>$1</strong> ga.",
- "nolinkshere-ns-2": "Mooyaŋ kul ši dobu <strong>$1</strong> ga maafarru suubantaa ra.",
+ "linkshere-2": "Moɲey wey ga dobu <strong>$2</strong> ga:",
+ "nolinkshere-2": "Mooyaŋ kul ši dobu <strong>$2</strong> ga.",
+ "nolinkshere-ns-2": "Mooyaŋ kul ši dobu <strong>$2</strong> ga maafarru suubantaa ra.",
"isredirect": "moo kuubi",
"istemplate": "kanandiyan",
"isimage": "tuku dobu",
"whatlinkshere": "Sosėjė̄ straipsnē",
"whatlinkshere-title": "Poslapē, katrėi ruod i \"$1\"",
"whatlinkshere-page": "Poslapis:",
- "linkshere-2": "Anėi poslapē ruod i '''$1''':",
- "nolinkshere-2": "I '''$1''' nūruodu nier.",
- "nolinkshere-ns-2": "Nurodītuo vardū srėtī anė vėins poslapis neruod i '''$1'''.",
+ "linkshere-2": "Anėi poslapē ruod i '''$2''':",
+ "nolinkshere-2": "I '''$2''' nūruodu nier.",
+ "nolinkshere-ns-2": "Nurodītuo vardū srėtī anė vėins poslapis neruod i '''$2'''.",
"isredirect": "nusokėma poslapis",
"istemplate": "īspraudėms",
"isimage": "abruozdielė nūruoda",
"whatlinkshere": "Što upućuje ovamo",
"whatlinkshere-title": "Stranice koje vode / Странице које воде до $1",
"whatlinkshere-page": "Stranica:",
- "linkshere-2": "Sljedeće stranice vode na '''$1''':",
- "nolinkshere-2": "Nema linkova na '''$1'''.",
- "nolinkshere-ns-2": "Nijedna stranica nije povezana sa '''$1''' u odabranom imenskom prostoru.",
+ "linkshere-2": "Sljedeće stranice vode na '''$2''':",
+ "nolinkshere-2": "Nema linkova na '''$2'''.",
+ "nolinkshere-ns-2": "Nijedna stranica nije povezana sa '''$2''' u odabranom imenskom prostoru.",
"isredirect": "preusmjeri stranicu",
"istemplate": "kao šablon",
"isimage": "link na datoteku",
"whatlinkshere": "ⵎⴰⴷ ⵉⵜⵜⴰⵡⵉⵏ ⵙ ⵖⵉⴷ",
"whatlinkshere-title": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⵜⵜⴰⵡⵉⵏⵉⵏ ⵙ \"$1\"",
"whatlinkshere-page": "ⵜⴰⵙⵏⴰ:",
- "linkshere-2": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴷ ⴹⴼⴰⵔⵏⵉⵏ ⴰⵔ ⵜⵜⴰⵡⵉⵏⵜ ⵙ <strong>$1</strong>:",
- "nolinkshere-2": "ⵓⵍⴰ ⴽⵔⴰ ⵏ ⵜⴰⵙⵏⴰ ⵓⵔ ⴰⵔ ⵜⴻⵜⵜⴰⵡⵉ ⵙ <strong>$1</strong>.",
- "nolinkshere-ns-2": "Ur tlla kra n tasna izdin d '''$1''' ɣ tɣult l-ittuystayn.",
+ "linkshere-2": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴷ ⴹⴼⴰⵔⵏⵉⵏ ⴰⵔ ⵜⵜⴰⵡⵉⵏⵜ ⵙ <strong>$2</strong>:",
+ "nolinkshere-2": "ⵓⵍⴰ ⴽⵔⴰ ⵏ ⵜⴰⵙⵏⴰ ⵓⵔ ⴰⵔ ⵜⴻⵜⵜⴰⵡⵉ ⵙ <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Ur tlla kra n tasna izdin d '''$2''' ɣ tɣult l-ittuystayn.",
"isredirect": "Tasna immutin",
"istemplate": "Illa gis",
"isimage": "ⴰⵍⵉⵏⴽ ⵏ ⵓⴼⴰⵢⵍⵓ",
"whatlinkshere": "ႁဵင်းၵွင်ႉ ဢၼ်မီးတီႈၼႆႈပဵၼ်သင်",
"whatlinkshere-title": "ၼႃႈလိၵ်ႈၸိူဝ်းလိင်ႉၸူး \"$1\"",
"whatlinkshere-page": "ၼႃႈလိၵ်ႈ",
- "linkshere-2": "ၼႃႈလိၵ်ႈၽၢႆႇတႂ်ႈၼႆႉ မၼ်းၵွင်ႉသၢၼ် ဝႆႉၸူး <strong>$1</strong>:",
- "nolinkshere-2": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူး<strong>$1</strong>.",
- "nolinkshere-ns-2": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူး <strong>$1</strong>တီႈၼႂ်း လွၵ်းၸိုဝ်ႈ ဢၼ်လိူၵ်ႈဝႆႉၼၼ်ႉ။",
+ "linkshere-2": "ၼႃႈလိၵ်ႈၽၢႆႇတႂ်ႈၼႆႉ မၼ်းၵွင်ႉသၢၼ် ဝႆႉၸူး <strong>$2</strong>:",
+ "nolinkshere-2": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူး<strong>$2</strong>.",
+ "nolinkshere-ns-2": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူး <strong>$2</strong>တီႈၼႂ်း လွၵ်းၸိုဝ်ႈ ဢၼ်လိူၵ်ႈဝႆႉၼၼ်ႉ။",
"isredirect": "ပိၼ်ႇႁူဝ်ၼႃႈလိၵ်ႈ",
"istemplate": "တူဝ်ၶဝ်ႈပႃး",
"isimage": "ၾၢႆႇၵွင်ႉ",
"whatlinkshere": "මෙතනට සබැඳෙන්නේ කුමක්ද",
"whatlinkshere-title": "\"$1\" වෙත සබැඳෙන පිටු",
"whatlinkshere-page": "පිටුව:",
- "linkshere-2": "ඉදිරියෙහි දැක්වෙන පිටු, '''$1''' වෙත සබැඳෙයි:",
- "nolinkshere-2": "'''$1''' වෙත කිසිදු පිටුවක් සබැඳී නොමැත.",
- "nolinkshere-ns-2": "තෝරාගෙන ඇති නාම-අවකාශය තුලදී, කිසිදු පිටුවක්, '''$1''' වෙත නොබැඳෙයි.",
+ "linkshere-2": "ඉදිරියෙහි දැක්වෙන පිටු, '''$2''' වෙත සබැඳෙයි:",
+ "nolinkshere-2": "'''$2''' වෙත කිසිදු පිටුවක් සබැඳී නොමැත.",
+ "nolinkshere-ns-2": "තෝරාගෙන ඇති නාම-අවකාශය තුලදී, කිසිදු පිටුවක්, '''$2''' වෙත නොබැඳෙයි.",
"isredirect": "පිටුව යළි-යොමුකරන්න",
"istemplate": "අන්තහ්කරණය",
"isimage": "ගොනු සබැඳිය",
"whatlinkshere": "Odkazy na túto stránku",
"whatlinkshere-title": "Stránky odkazujúce na „$1“",
"whatlinkshere-page": "Page:",
- "linkshere-2": "Nasledujúce stránky odkazujú na '''$1''':",
- "nolinkshere-2": "Žiadne stránky neodkazujú na '''$1'''.",
- "nolinkshere-ns-2": "Žiadne stránky neodkazujú na '''$1''' vo zvolenom mennom priestore.",
+ "linkshere-2": "Nasledujúce stránky odkazujú na '''$2''':",
+ "nolinkshere-2": "Žiadne stránky neodkazujú na '''$2'''.",
+ "nolinkshere-ns-2": "Žiadne stránky neodkazujú na '''$2''' vo zvolenom mennom priestore.",
"isredirect": "presmerovacia stránka",
"istemplate": "použitá",
"isimage": "odkaz na súbor",
"whatlinkshere": "مربوط ورقے",
"whatlinkshere-title": "«$1» دے نال جُڑے ہوے ورقے",
"whatlinkshere-page": "ورقہ",
- "linkshere-2": "<strong>$1</strong> نال درج ذیل ورقے مربوط ہن:",
- "nolinkshere-2": "<strong>$1</strong> نال کوئی ورقہ مربوط کائنی۔",
+ "linkshere-2": "<strong>$2</strong> نال درج ذیل ورقے مربوط ہن:",
+ "nolinkshere-2": "<strong>$2</strong> نال کوئی ورقہ مربوط کائنی۔",
"isredirect": "ورقہ ریڈائریکٹ کرو",
"istemplate": "شامل شدہ",
"isimage": "فائل دا ربط",
"whatlinkshere-title": "Strani, ki se povezujejo na $1",
"whatlinkshere-page": "Stran:",
"linkshere-2": "Na '''$1''' kažejo naslednje strani:",
- "nolinkshere-2": "Nobena stran ne kaže na '''$1'''.",
- "nolinkshere-ns-2": "Nobena stran se ne povezuje na '''$1''' v izbranem imenskem prostoru.",
+ "nolinkshere-2": "Nobena stran ne kaže na '''$2'''.",
+ "nolinkshere-ns-2": "Nobena stran se ne povezuje na '''$2''' v izbranem imenskem prostoru.",
"isredirect": "preusmeritvena stran",
"istemplate": "vključitev",
"isimage": "povezava na datoteko",
"whatlinkshere-title": "Seyta, de uff „$1“ verlinka",
"whatlinkshere-page": "Seite:",
"linkshere-2": "De folgenden Seyta verlinka uff '''„$1“''':",
- "nolinkshere-2": "Kenne Seite verlinkt uff '''„$1“'''.",
- "nolinkshere-ns-2": "Kenne Seite verlinkt uff '''„$1“''' eim gewählta Noamasraum.",
+ "nolinkshere-2": "Kenne Seite verlinkt uff '''„$2“'''.",
+ "nolinkshere-ns-2": "Kenne Seite verlinkt uff '''„$2“''' eim gewählta Noamasraum.",
"isredirect": "Weiterleitungsseyte",
"istemplate": "Vorlageneinbindung",
"isimage": "Dateilink",
"whatlinkshere-title": "Boggaga la xiriiro \"$1\"",
"whatlinkshere-page": "Bogga:",
"linkshere-2": "Bogyaashaan waxey la xiriiraan '''$1''':",
- "nolinkshere-2": "Boggag la xiriiro '''$1''' ma jirto.",
+ "nolinkshere-2": "Boggag la xiriiro '''$2''' ma jirto.",
"isredirect": "bogga loo sii toosiyay",
"istemplate": "ku jiri kara",
"isimage": "faylka la xiriiro",
"whatlinkshere-title": "Faqe që lidhen tek $1",
"whatlinkshere-page": "Faqja:",
"linkshere-2": "Faqet e mëposhtme lidhen këtu '''$1''':",
- "nolinkshere-2": "Asnjë faqe nuk lidhet tek '''$1'''.",
- "nolinkshere-ns-2": "Nuk ka faqe në hapësirën e zgjedhur që lidhen tek '''$1'''.",
+ "nolinkshere-2": "Asnjë faqe nuk lidhet tek '''$2'''.",
+ "nolinkshere-ns-2": "Nuk ka faqe në hapësirën e zgjedhur që lidhen tek '''$2'''.",
"isredirect": "faqe përcjellëse",
"istemplate": "përfshirë",
"isimage": "Lidhja e dokumentit",
"whatlinkshere-title": "Странице које су повезане са „$1”",
"whatlinkshere-page": "Страница:",
"linkshere-2": "Следеће странице имају везу до <strong>$1</strong>:",
- "nolinkshere-2": "Ниједна страница није повезана са: <strong>$1</strong>.",
- "nolinkshere-ns-2": "Ниједна страница не води до '''$1''' у изабраном именском простору.",
+ "nolinkshere-2": "Ниједна страница није повезана са: <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Ниједна страница не води до '''$2''' у изабраном именском простору.",
"isredirect": "преусмерење",
"istemplate": "укључивање",
"isimage": "веза до датотеке",
"whatlinkshere-title": "Stranice koje su povezane sa „$1”",
"whatlinkshere-page": "Stranica:",
"linkshere-2": "Sledeće stranice imaju vezu do '''$1''':",
- "nolinkshere-2": "Nijedna stranica nije povezana sa: '''$1'''.",
- "nolinkshere-ns-2": "Nijedna stranica ne vodi do '''$1''' u izabranom imenskom prostoru.",
+ "nolinkshere-2": "Nijedna stranica nije povezana sa: '''$2'''.",
+ "nolinkshere-ns-2": "Nijedna stranica ne vodi do '''$2''' u izabranom imenskom prostoru.",
"isredirect": "preusmerenje",
"istemplate": "uključivanje",
"isimage": "veza ka datoteci",
"whatlinkshere": "San e miti kon dyaso",
"whatlinkshere-title": "Papira di e sori go na $1",
"linkshere-2": "Den papira disi e miti go na '''$1''':",
- "nolinkshere-2": "No wan papira e miti kon na '''$1'''.",
+ "nolinkshere-2": "No wan papira e miti kon na '''$2'''.",
"isredirect": "papira fu drai go",
"istemplate": "poti leki wan template",
"whatlinkshere-prev": "{{PLURAL:$1|a wan|den $1}} di psa",
"whatlinkshere-title": "Sieden, do der ap \"$1\" linkje",
"whatlinkshere-page": "Siede:",
"linkshere-2": "Do foulgjende Sieden ferwiese hierhäär: '''$1''': <br /><small>(Moonige Sieden wäide eventuell moorfooldich liested, konnen in säildene Falle oawers uk miste. Dät kumt fon oolde Failere in dän Software häär, man skoadet fääre niks.)</small>",
- "nolinkshere-2": "Naan Artikkel ferwiest hierhäär: '''$1'''.",
- "nolinkshere-ns-2": "Neen Siede ferlinket ap '''„$1“''' in dän wäälde Noomensruum.",
+ "nolinkshere-2": "Naan Artikkel ferwiest hierhäär: '''$2'''.",
+ "nolinkshere-ns-2": "Neen Siede ferlinket ap '''„$2“''' in dän wäälde Noomensruum.",
"isredirect": "Fäärelaitengs-Siede",
"istemplate": "Foarloagenienbiendenge",
"isimage": "Doatäilink",
"whatlinkshere-title": "«$1» питкә йебәргән питләр",
"whatlinkshere-page": "Пит:",
"linkshere-2": "''$1''' питкә киләсе питләр тайанатылар:",
- "nolinkshere-2": "$1 питкә пер питтән тә ссылка йуҡ.",
+ "nolinkshere-2": "$2 питкә пер питтән тә ссылка йуҡ.",
"isredirect": "йусыҡлау пит",
"istemplate": "ҡушылыу",
"isimage": "файллы ссылка",
"whatlinkshere-title": "Kaca anu nutumbu ka \"$1\"",
"whatlinkshere-page": "Kaca:",
"linkshere-2": "Kaca di handap ieu numbu ka '''$1''':",
- "nolinkshere-2": "Euweuh kaca anu nutumbu ka <strong>$1</strong>.",
- "nolinkshere-ns-2": "Euweuh kaca anu nutumbu ka <strong>$1</strong> dina ruang-nama anu dipilih.",
+ "nolinkshere-2": "Euweuh kaca anu nutumbu ka <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Euweuh kaca anu nutumbu ka <strong>$2</strong> dina ruang-nama anu dipilih.",
"isredirect": "Kaca alihan",
"istemplate": "ku citakan",
"isimage": "tutumbu berkas",
"whatlinkshere-title": "Sidor som länkar till \"$1\"",
"whatlinkshere-page": "Sida:",
"linkshere-2": "Följande sidor länkar till <strong>$1</strong>:",
- "nolinkshere-2": "Inga sidor länkar till <strong>$1</strong>.",
- "nolinkshere-ns-2": "Inga sidor i den angivna namnrymden länkar till <strong>$1</strong>.",
+ "nolinkshere-2": "Inga sidor länkar till <strong>$2</strong>.",
+ "nolinkshere-ns-2": "Inga sidor i den angivna namnrymden länkar till <strong>$2</strong>.",
"isredirect": "omdirigeringssida",
"istemplate": "inkluderad som mall",
"isimage": "fillänk",
"whatlinkshere-title": "Kurasa zilizounganishwa na \"$1\"",
"whatlinkshere-page": "Ukurasa:",
"linkshere-2": "Kurasa zifuatazo zimeunganishwa na '''$1''':",
- "nolinkshere-2": "Hakuna kurasa zilizounganishwa na '''$1'''.",
- "nolinkshere-ns-2": "!!FUZZY!!!!FUZZY!!Hakuna kurasa zilizounganishwa na '''$1''' katika eneo la wiki lililochaguliwa.",
+ "nolinkshere-2": "Hakuna kurasa zilizounganishwa na '''$2'''.",
+ "nolinkshere-ns-2": "Hakuna kurasa zilizounganishwa na '''$2''' katika eneo la wiki lililochaguliwa.",
"isredirect": "elekeza ukurasa",
"istemplate": "jumuisho",
"isimage": "kiungo cha faili",
"whatlinkshere-title": "Zajty, kere linkujům na \"$1\"",
"whatlinkshere-page": "Zajta:",
"linkshere-2": "Nastympůjůnce zajty sóm adrésůwane do '''$1''':",
- "nolinkshere-2": "Żodno zajta ńy je adrésowana do '''$1'''.",
- "nolinkshere-ns-2": "Žodno zajta ńy je adresowano do '''$1''' we wybrany přestřyni mjan.",
+ "nolinkshere-2": "Żodno zajta ńy je adrésowana do '''$2'''.",
+ "nolinkshere-ns-2": "Žodno zajta ńy je adresowano do '''$2''' we wybrany přestřyni mjan.",
"isredirect": "překerowujůnca zajta",
"istemplate": "dołůnczony muster",
"isimage": "Link do plika",
"whatlinkshere-title": "\"$1\" பக்கத்துக்கு இணைக்கப்பட்டவை",
"whatlinkshere-page": "பக்கம்:",
"linkshere-2": "'''$1''' பின்வரும் பக்கங்களில் இப்பக்கம் இணைக்கப்பட்டுள்ளது:",
- "nolinkshere-2": "'''$1''' எந்தப் பக்கத்திலும் இந்தப் பக்கம் இணைக்கப்படவில்லை.",
- "nolinkshere-ns-2": "தெரிவு செய்யப்பட்ட பெயர்வெளியில் '''$1''' பக்கத்துக்கு இணைக்கப்பட்ட பக்கங்கள் எதுவுமில்லை.",
+ "nolinkshere-2": "'''$2''' எந்தப் பக்கத்திலும் இந்தப் பக்கம் இணைக்கப்படவில்லை.",
+ "nolinkshere-ns-2": "தெரிவு செய்யப்பட்ட பெயர்வெளியில் '''$2''' பக்கத்துக்கு இணைக்கப்பட்ட பக்கங்கள் எதுவுமில்லை.",
"isredirect": "வழிமாற்றுப் பக்கம்",
"istemplate": "உள்ளிடப்பட்டுள்ளது",
"isimage": "கோப்பு இணைப்பு",
"whatlinkshere-title": "Aniy ’mubuy sa zngayan tay \"$1\"",
"whatlinkshere-page": "Zngayan",
"linkshere-2": "Zngayan tay suruw qaniy ga aniy p’ubuy sa <strong>$1</strong>:",
- "nolinkshere-2": "Ungat zngazyan ’mubuy squw <strong>$1</strong>.",
+ "nolinkshere-2": "Ungat zngazyan ’mubuy squw <strong>$2</strong>.",
"isredirect": "t’ringun pawsa’ sa zngayan",
"istemplate": "’nagal sa",
"isimage": "’ubuy sa biru’ na ana nanu’ zayzyuwaw",
"whatlinkshere-title": "\"$1\" ಕ್ಕ್ ಸಂಪರ್ಕ ಕೊರ್ಪಿನ ಪುಟೊಕುಲು",
"whatlinkshere-page": "ಪುಟೊ:",
"linkshere-2": "</strong>$1<strong>ಗ್ ಈ ತಿರ್ತ್ದ ಪುಟೊಕುಲು ಕೊಂಡಿ ಕೊರ್ಪುಂಡು.",
- "nolinkshere-2": "'''$1''' ಗ್ ವಾ ಪುಟೊಕುಲೆಡ್ಲಾ ಲಿಂಕ್ ಇಜ್ಜಿ.",
+ "nolinkshere-2": "'''$2''' ಗ್ ವಾ ಪುಟೊಕುಲೆಡ್ಲಾ ಲಿಂಕ್ ಇಜ್ಜಿ.",
"isredirect": "ಪಿರ ನಿರ್ದೇಶನೊದ ಪುಟೊ",
"istemplate": "ಸೇರಾವುನೆ",
"isimage": "ಫೈಲ್ದ ಕೊಂಡಿ",
"whatlinkshere-title": "\"$1\"కి లింకున్న పుటలు",
"whatlinkshere-page": "పేజీ:",
"linkshere-2": "కింది పేజీల నుండి <strong>$1</strong>కు లింకులు ఉన్నాయి:",
- "nolinkshere-2": "'''$1'''కు ఏ పేజీ నుండీ లింకు లేదు.",
- "nolinkshere-ns-2": "'''$1''' పేజీకి లింకయ్యే పేజీలు ఎంచుకున్న నేంస్పేసులో లేవు.",
+ "nolinkshere-2": "'''$2'''కు ఏ పేజీ నుండీ లింకు లేదు.",
+ "nolinkshere-ns-2": "'''$2''' పేజీకి లింకయ్యే పేజీలు ఎంచుకున్న నేంస్పేసులో లేవు.",
"isredirect": "దారిమార్పు పుట",
"istemplate": "పేజీకి జతపరిచారు",
"isimage": "దస్త్రపు లంకె",
"whatlinkshere-title": "Саҳифаҳое ки ба $1 пайванд доранд",
"whatlinkshere-page": "Саҳифа:",
"linkshere-2": "Саҳифаҳои зерин ба '''$1''' пайванданд:",
- "nolinkshere-2": "Ягон саҳифа ба '''$1''' пайванд нест.",
- "nolinkshere-ns-2": "Ҳеҷ саҳифа аз фазоиноми интихобшуда ба '''$1''' пайванд надорад.",
+ "nolinkshere-2": "Ягон саҳифа ба '''$2''' пайванд нест.",
+ "nolinkshere-ns-2": "Ҳеҷ саҳифа аз фазоиноми интихобшуда ба '''$2''' пайванд надорад.",
"isredirect": "саҳифаи тағйири масир",
"istemplate": "истифодашуда дар саҳифа",
"isimage": "пайванд ба парванда",
"whatlinkshere-title": "Sahifahoe ki ba $1 pajvand dorand",
"whatlinkshere-page": "Sahifa:",
"linkshere-2": "Sahifahoi zerin ba '''$1''' pajvandand:",
- "nolinkshere-2": "Jagon sahifa ba '''$1''' pajvand nest.",
- "nolinkshere-ns-2": "Heç sahifa az fazoinomi intixobşuda ba '''$1''' pajvand nadorad.",
+ "nolinkshere-2": "Jagon sahifa ba '''$2''' pajvand nest.",
+ "nolinkshere-ns-2": "Heç sahifa az fazoinomi intixobşuda ba '''$2''' pajvand nadorad.",
"isredirect": "sahifai taƣjiri masir",
"istemplate": "istifodaşuda dar sahifa",
"isimage": "pajvandi aks",
"whatlinkshere-title": "หน้าที่ลิงก์มา \"$1\"",
"whatlinkshere-page": "หน้า:",
"linkshere-2": "หน้าต่อไปนี้ลิงก์มา <strong>$1</strong>:",
- "nolinkshere-2": "ไม่มีหน้าใดลิงก์มา <strong>$1</strong>",
- "nolinkshere-ns-2": "ไม่มีหน้าใดลิงก์มา <strong>$1</strong> ในเนมสเปซที่เลือก",
+ "nolinkshere-2": "ไม่มีหน้าใดลิงก์มา <strong>$2</strong>",
+ "nolinkshere-ns-2": "ไม่มีหน้าใดลิงก์มา <strong>$2</strong> ในเนมสเปซที่เลือก",
"isredirect": "หน้าเปลี่ยนทาง",
"istemplate": "โดยใช้แม่แบบ",
"isimage": "ลิงก์ไฟล์",
"whatlinkshere-title": "\"$1\" makalasyna çykgyt berýän sahypalar",
"whatlinkshere-page": "Sahypa:",
"linkshere-2": "'''$1''' sahypasyna çykgyt berýän sahypalar:",
- "nolinkshere-2": "'''$1''' sahypasyna çykgyt berýän sahypa ýok.",
- "nolinkshere-ns-2": "Saýlanyp alynan at giňişliginde hiçbir sahypa '''$1''' sahypasyna çykgyt bermeýär.",
+ "nolinkshere-2": "'''$2''' sahypasyna çykgyt berýän sahypa ýok.",
+ "nolinkshere-ns-2": "Saýlanyp alynan at giňişliginde hiçbir sahypa '''$2''' sahypasyna çykgyt bermeýär.",
"isredirect": "gönükdirme sahypasy",
"istemplate": "atanaklaýyn girizme",
"isimage": "faýl çykgydy",
"whatlinkshere-title": "Mga pahinang kumakawing sa $1",
"whatlinkshere-page": "Pahina:",
"linkshere-2": "Nakakawing ang sumusunod na mga pahina sa '''$1''':",
- "nolinkshere-2": "Walang pahinang nakakawing sa '''$1'''.",
- "nolinkshere-ns-2": "Walang pahinang nakakawing sa '''$1''' mula sa loob ng napiling espasyo ng pangalan.",
+ "nolinkshere-2": "Walang pahinang nakakawing sa '''$2'''.",
+ "nolinkshere-ns-2": "Walang pahinang nakakawing sa '''$2''' mula sa loob ng napiling espasyo ng pangalan.",
"isredirect": "pahinang panturo/panuto",
"istemplate": "pagsasali",
"isimage": "link ng file",
"whatlinkshere-title": "Сәһифон, сәбон вардән бә \"$1\"",
"whatlinkshere-page": "Сәһифә:",
"linkshere-2": "Ым сәһифон сәбон вардән ијо ''$1''':",
- "nolinkshere-2": "Бә ым сәһифә ҹо сәһифонку сәбонон нин '''$1'''.",
+ "nolinkshere-2": "Бә ым сәһифә ҹо сәһифонку сәбонон нин '''$2'''.",
"isredirect": "унвони дәгиш кардә сәһифәје",
"istemplate": "әловә",
"isimage": "фајлинә сәбон",
"whatlinkshere-page": "Sayfa:",
"linkshere-2": "'''$1''' sayfasına bağlantısı olan sayfalar:",
"nolinkshere-2": "'''$1''' sayfasına bağlantı veren sayfa yok.",
- "nolinkshere-ns-2": "Seçilen ad alanında hiçbir sayfa '''$1''' sayfasına bağlanmıyor.",
+ "nolinkshere-ns-2": "Seçilen ad alanında hiçbir sayfa '''$2''' sayfasına bağlanmıyor.",
"isredirect": "yönlendirme sayfası",
"istemplate": "dönüştürülme",
"isimage": "dosya bağlantısı",
"whatlinkshere-page": "بەت:",
"linkshere-2": "تۆۋەندىكى بەتلەر '''$1'''غا ئۇلانغان:",
"nolinkshere-2": "'''$1'''غا ئۇلانغان بەت يوق.",
- "nolinkshere-ns-2": "تاللانغان ئات بوشلۇقىدا '''$1''' غا ئۇلانغان بەت يوق.",
+ "nolinkshere-ns-2": "تاللانغان ئات بوشلۇقىدا '''$2''' غا ئۇلانغان بەت يوق.",
"isredirect": "قايتا نىشان بەلگىلەنگەن بەت",
"istemplate": "ئۆز ئىچىگە ئالغان",
"isimage": "ھۆججەت ئۇلانما",
"whatlinkshere-page": "Сторінка:",
"linkshere-2": "Такі сторінки посилаються на '''$1''':",
"nolinkshere-2": "На статтю '''$1''' не вказує жодна стаття.",
- "nolinkshere-ns-2": "У вибраному просторі назв нема сторінок, що посилаються на '''$1'''.",
+ "nolinkshere-ns-2": "У вибраному просторі назв нема сторінок, що посилаються на '''$2'''.",
"isredirect": "сторінка-перенаправлення",
"istemplate": "включення",
"isimage": "посилання на файл",
"whatlinkshere-page": "صفحہ:",
"linkshere-2": "<strong>$1</strong> سے درج ذیل صفحات مربوط ہیں:",
"nolinkshere-2": "<strong>$1</strong> سے کوئی صفحہ مربوط نہیں ہے۔",
- "nolinkshere-ns-2": "منتخب نام فضا میں <strong>$1</strong> سے مربوط کوئی صفحہ نہیں ہے۔",
+ "nolinkshere-ns-2": "منتخب نام فضا میں <strong>$2</strong> سے مربوط کوئی صفحہ نہیں ہے۔",
"isredirect": "رجوع مکرر صفحہ",
"istemplate": "شامل شدہ",
"isimage": "فائل کا ربط",
"whatlinkshere-page": "Sahifa:",
"linkshere-2": "Quyidagi sahifalar '''$1''' sahifasiga bogʻlangan:",
"nolinkshere-2": "'''$1''' sahifasiga hech qaysi sahifa bog‘lanmagan.",
- "nolinkshere-ns-2": "Tanlangan nomfazoda '''$1'''ga bog‘langan sahifalar mavjud emas.",
+ "nolinkshere-ns-2": "Tanlangan nomfazoda '''$2'''ga bog‘langan sahifalar mavjud emas.",
"isredirect": "yoʻnaltiruvchi sahifa",
"istemplate": "qoʻshimcha",
"isimage": "faylli havola",
"whatlinkshere-page": "Pagina:",
"linkshere-2": "Ste pagine qua le ponta a '''$1''':",
"nolinkshere-2": "Nissuna pagina la contien colegamenti che punta a '''$1'''.",
- "nolinkshere-ns-2": "No ghe xe pagine che punta a '''$1''' nel namespace selezionà.",
+ "nolinkshere-ns-2": "No ghe xe pagine che punta a '''$2''' nel namespace selezionà.",
"isredirect": "Pagina de rimando",
"istemplate": "inclusion",
"isimage": "colegamento verso file",
"whatlinkshere-page": "Lehtpol’:",
"linkshere-2": "Nened lehtpoled kosketadas '''$1''':",
"nolinkshere-2": "'''$1'''-lehtpol't ei kosketa ni üks' lehtpol'.",
- "nolinkshere-ns-2": "'''$1'''-lehtpol't ei kosketa ni üks' lehtpol' valitud nimiavarudes.",
+ "nolinkshere-ns-2": "'''$2'''-lehtpol't ei kosketa ni üks' lehtpol' valitud nimiavarudes.",
"isredirect": "Oigendai lehtpol'",
"istemplate": "mülütand",
"isimage": "Kosketuz failale",
"whatlinkshere-page": "Trang:",
"linkshere-2": "Các trang sau liên kết đến '''$1''':",
"nolinkshere-2": "Không có trang nào liên kết đến '''$1'''.",
- "nolinkshere-ns-2": "Không có trang nào liên kết đến '''$1''' trong không gian tên đã chọn.",
+ "nolinkshere-ns-2": "Không có trang nào liên kết đến '''$2''' trong không gian tên đã chọn.",
"isredirect": "trang đổi hướng",
"istemplate": "được nhúng vào",
"isimage": "liên kết tập tin",
"whatlinkshere-page": "Pad:",
"linkshere-2": "Pads sököl payümons ko '''$1''':",
"nolinkshere-2": "Pads nonik peyümons lü '''$1'''.",
- "nolinkshere-ns-2": "Pads nonik yumons lü pad: '''$1''' in nemaspad pevälöl.",
+ "nolinkshere-ns-2": "Pads nonik yumons lü pad: '''$2''' in nemaspad pevälöl.",
"isredirect": "lüodükömapad",
"istemplate": "ninükam",
"isimage": "yüm ragiva",
"whatlinkshere-page": "Leht:",
"linkshere-2": "Lehe <b>$1</b> pääle näütäseq lingiq lehti päält:",
"nolinkshere-2": "Lehe <b>$1</b> pääle näütä-i linke ütegi lehe päält.",
- "nolinkshere-ns-2": "Valitun nimeruumin näütä-i ütegi lehe päält linke lehe '''$1''' pääle.",
+ "nolinkshere-ns-2": "Valitun nimeruumin näütä-i ütegi lehe päält linke lehe '''$2''' pääle.",
"isredirect": "ümbresaatmislehekülg",
"istemplate": "pruugit näüdüssen",
"isimage": "teedüstülink",
"whatlinkshere-page": "Xët :",
"linkshere-2": "Xët yii ci suuf am nañ ab lëkkalekaay buy jëm <b>$1</b> :",
"nolinkshere-2": "Amul wenn xët wu lëkkalook wii <b>$1</b>.",
- "nolinkshere-ns-2": "Amul wenn xët wu lëkkalook wii '''$1''' ci barabu tur bi nga tànn.",
+ "nolinkshere-ns-2": "Amul wenn xët wu lëkkalook wii '''$2''' ci barabu tur bi nga tànn.",
"isredirect": "Xëtu jubluwaat",
"istemplate": "mboole",
"isimage": "lëkkalekaayu dencukaay bi",
"whatlinkshere-page": "בלאַט:",
"linkshere-2": "די פאָלגנדיקע בלעטער פאַרבינדן צום בלאַט '''$1''':",
"nolinkshere-2": "קיין שום בלאַט פאַרבינדט נישט צו '''$1'''.",
- "nolinkshere-ns-2": "קיין בלעטער פאַרבינדן נישט צו '''$1''' אינעם אויסגעקליבענעם נאָמענטייל.",
+ "nolinkshere-ns-2": "קיין בלעטער פאַרבינדן נישט צו <strong>$2</strong> אינעם אויסגעקליבענעם נאָמענטייל.",
"isredirect": "ווײַטערפירן בלאט",
"istemplate": "אײַנשליסן",
"isimage": "!טעקע לינק",
"whatlinkshere-page": "Ojúewé:",
"linkshere-2": "Àwọn ojúewé wọ̀nyí jápọ̀ mọ́ '''$1''':",
"nolinkshere-2": "Kò sí ojúewé tó jápọ̀ mọ́ '''$1'''.",
- "nolinkshere-ns-2": "Kò sí ojúewé kankan tó jápọ̀ mọ́ '''$1''' nínú orúkọàyè yíyàn.",
+ "nolinkshere-ns-2": "Kò sí ojúewé kankan tó jápọ̀ mọ́ '''$2''' nínú orúkọàyè yíyàn.",
"isredirect": "àtúnjúwe ojúewé",
"istemplate": "ìkómọ́ra",
"isimage": "ìjápọ̀ fáìlì",
"whatlinkshere-page": "頁:",
"linkshere-2": "呢啲頁連結到'''$1''':",
"nolinkshere-2": "無一頁連結到'''$1'''。",
- "nolinkshere-ns-2": "響已經揀咗嘅空間名無嘢連結到'''$1'''。",
+ "nolinkshere-ns-2": "響已經揀咗嘅空間名無嘢連結到'''$2'''。",
"isredirect": "跳轉頁",
"istemplate": "包含",
"isimage": "檔案連結",
"whatlinkshere-page": "页面:",
"linkshere-2": "以下页面链接至<strong>$1</strong>:",
"nolinkshere-2": "没有页面链接至<strong>$1</strong>。",
- "nolinkshere-ns-2": "在所选的名字空间内没有页面链接到<strong>$1</strong>。",
+ "nolinkshere-ns-2": "在所选的名字空间内没有页面链接到<strong>$2</strong>。",
"isredirect": "重定向页面",
"istemplate": "嵌入",
"isimage": "文件链接",
"whatlinkshere-page": "頁面:",
"linkshere-2": "以下頁面連結至 <strong>$1</strong>:",
"nolinkshere-2": "沒有頁面連結至 <strong>$1</strong>。",
- "nolinkshere-ns-2": "已選擇的命名空間中沒有頁面連結到 $1。",
+ "nolinkshere-ns-2": "已選擇的命名空間中沒有頁面連結到 <strong>$2</strong>。",
"isredirect": "重新導向頁面",
"istemplate": "引用",
"isimage": "檔案連結",
/**
* Do the actual work. All child classes will need to implement this
+ *
+ * @return bool|null True for success, false for failure. Not returning
+ * a value, or returning null, is also interpreted as success. Returning
+ * false for failure will cause doMaintenance.php to exit the process
+ * with a non-zero exit status.
*/
abstract public function execute();
protected function cleanupTable( $tableParams ) {
$table = $tableParams[0];
$prefix = $tableParams[1];
- $idField = isset( $tableParams['idField'] ) ?
- $tableParams['idField'] :
- "{$prefix}_id";
- $nsField = isset( $tableParams['nsField'] ) ?
- $tableParams['nsField'] :
- "{$prefix}_namespace";
- $titleField = isset( $tableParams['titleField'] ) ?
- $tableParams['titleField'] :
- "{$prefix}_title";
+ $idField = $tableParams['idField'] ?? "{$prefix}_id";
+ $nsField = $tableParams['nsField'] ?? "{$prefix}_namespace";
+ $titleField = $tableParams['titleField'] ?? "{$prefix}_title";
$this->outputStatus( "Looking for invalid $titleField entries in $table...\n" );
$dPathSha1 = sha1( $dPath );
if ( $this->statCache !== null ) {
// All dst files are already in stat cache
- $dstStat = isset( $this->statCache[$dPathSha1] )
- ? $this->statCache[$dPathSha1]
- : false;
+ $dstStat = $this->statCache[$dPathSha1] ?? false;
} else {
$dstStat = $dst->getFileStat( [ 'src' => $dPath ] );
}
$maintenance->setAgentAndTriggers();
// Do the work
-$maintenance->execute();
+$success = $maintenance->execute();
// Potentially debug globals
$maintenance->globals();
$lbFactory->commitMasterChanges( 'doMaintenance' );
$lbFactory->shutdown( $lbFactory::SHUTDOWN_NO_CHRONPROT );
}
+
+// Exit with an error status if execute() returned false
+if ( $success === false ) {
+ exit( 1 );
+}
// Sort results by version, then by filename, then by name.
foreach ( $this->foundNodes as $version => &$nodes ) {
uasort( $nodes, function ( $a, $b ) {
- return ( $a['filename'] . $a['name'] ) < ( $b['filename'] . $b['name'] ) ? -1 : 1;
+ return ( $a['filename'] . $a['name'] ) <=> ( $b['filename'] . $b['name'] );
} );
}
ksort( $this->foundNodes );
* @return string
*/
function priority( $namespace ) {
- return isset( $this->priorities[$namespace] )
- ? $this->priorities[$namespace]
- : $this->guessPriority( $namespace );
+ return $this->priorities[$namespace] ?? $this->guessPriority( $namespace );
}
/**
$debug = isset( $options['debug'] );
$help = isset( $options['help'] );
-$cache = isset( $options['cache'] ) ? $options['cache'] : null;
+$cache = $options['cache'] ?? null;
if ( $help ) {
mccShowUsage();
// break the tie by sorting by name
$origSpaces = $spaces;
uksort( $spaces, function ( $a, $b ) use ( $origSpaces ) {
- if ( $origSpaces[$a] < $origSpaces[$b] ) {
- return -1;
- } elseif ( $origSpaces[$a] > $origSpaces[$b] ) {
- return 1;
- } elseif ( $a < $b ) {
- return -1;
- } elseif ( $a > $b ) {
- return 1;
- } else {
- return 0;
- }
+ return $origSpaces[$a] <=> $origSpaces[$b]
+ ?: $a <=> $b;
} );
$ok = true;
} else {
// Use nice safe, sane, prefixes
preg_match( '/^[a-zA-Z]+_$/', $this->getOption( 'old' ), $m );
- $old = isset( $m[0] ) ? $m[0] : false;
+ $old = $m[0] ?? false;
}
// Allow for no new prefix
if ( $this->getOption( 'new', 0 ) === '0' ) {
} else {
// Use nice safe, sane, prefixes
preg_match( '/^[a-zA-Z]+_$/', $this->getOption( 'new' ), $m );
- $new = isset( $m[0] ) ? $m[0] : false;
+ $new = $m[0] ?? false;
}
if ( $old === false || $new === false ) {
} else {
$maxID = $dbw->selectField( 'text', 'MAX(old_id)', '', $fname );
}
- $minID = isset( $options['s'] ) ? $options['s'] : 1;
+ $minID = $options['s'] ?? 1;
moveToExternal( $cluster, $maxID, $minID );
}
$limit = 1000;
$untilHappy = true;
}
-$type = isset( $options['type'] ) ? $options['type'] : ConcatenatedGzipHistoryBlob::class;
+$type = $options['type'] ?? ConcatenatedGzipHistoryBlob::class;
$dbr = $this->getDB( DB_REPLICA );
$revQuery = Revision::getQueryInfo( [ 'page', 'text' ] );
return [
'cluster' => $m[1],
'id' => intval( $m[2] ),
- 'hash' => isset( $m[3] ) ? $m[3] : null
+ 'hash' => $m[3] ?? null
];
}
foreach ( QueryPage::getPages() as $page ) {
list( $class, $special ) = $page;
- $limit = isset( $page[2] ) ? $page[2] : null;
+ $limit = $page[2] ?? null;
# --list : just show the name of pages
if ( $this->hasOption( 'list' ) ) {
global $sort;
switch ( $sort ) {
+ // Sorted ascending:
case 'name':
return strcmp( $a->name(), $b->name() );
+ // Sorted descending:
case 'time':
- return $a->time() > $b->time() ? -1 : 1;
+ return $b->time() <=> $a->time();
case 'memory':
- return $a->memory() > $b->memory() ? -1 : 1;
+ return $b->memory() <=> $a->memory();
case 'count':
- return $a->count() > $b->count() ? -1 : 1;
+ return $b->count() <=> $a->count();
case 'time_per_call':
- return $a->timePerCall() > $b->timePerCall() ? -1 : 1;
+ return $b->timePerCall() <=> $a->timePerCall();
case 'memory_per_call':
- return $a->memoryPerCall() > $b->memoryPerCall() ? -1 : 1;
+ return $b->memoryPerCall() <=> $a->memoryPerCall();
case 'calls_per_req':
- return $a->callsPerRequest() > $b->callsPerRequest() ? -1 : 1;
+ return $b->callsPerRequest() <=> $a->callsPerRequest();
case 'time_per_req':
- return $a->timePerRequest() > $b->timePerRequest() ? -1 : 1;
+ return $b->timePerRequest() <=> $a->timePerRequest();
case 'memory_per_req':
- return $a->memoryPerRequest() > $b->memoryPerRequest() ? -1 : 1;
+ return $b->memoryPerRequest() <=> $a->memoryPerRequest();
}
}
&.oo-ui-toggleWidget-on {
position: relative;
overflow: hidden;
+ z-index: 0;
+
&:after {
content: '';
mix-blend-mode: screen;
$this->keepUploads = !empty( $options['keep-uploads'] );
- $this->fileBackendName = isset( $options['file-backend'] ) ?
- $options['file-backend'] : false;
+ $this->fileBackendName = $options['file-backend'] ?? false;
$this->runDisabled = !empty( $options['run-disabled'] );
$this->runParsoid = !empty( $options['run-parsoid'] );
if ( is_int( $name ) ) {
$value();
} else {
- $saved[$name] = isset( $GLOBALS[$name] ) ? $GLOBALS[$name] : null;
+ $saved[$name] = $GLOBALS[$name] ?? null;
$GLOBALS[$name] = $value;
}
}
* @return bool
*/
public function isSetupDone( $funcName ) {
- return isset( $this->setupDone[$funcName] ) ? $this->setupDone[$funcName] : false;
+ return $this->setupDone[$funcName] ?? false;
}
/**
}
$local = isset( $opts['local'] );
- $preprocessor = isset( $opts['preprocessor'] ) ? $opts['preprocessor'] : null;
+ $preprocessor = $opts['preprocessor'] ?? null;
$parser = $this->getParser( $preprocessor );
$title = Title::newFromText( $titleText );
'maintenance/cleanupTable.inc',
'maintenance/CodeCleanerGlobalsPass.inc',
'maintenance/commandLine.inc',
- 'maintenance/importImages.inc',
'maintenance/sqlite.inc',
'maintenance/userDupes.inc',
- 'maintenance/userOptions.inc',
'maintenance/language/checkLanguage.inc',
'maintenance/language/languages.inc',
]
$singletons = $wrappedProvider->singletons;
if ( $provider instanceof MonologSpi ) {
if ( !isset( $this->loggers[$channel] ) ) {
- $this->loggers[$channel] = isset( $singletons['loggers'][$channel] )
- ? $singletons['loggers'][$channel] : null;
+ $this->loggers[$channel] = $singletons['loggers'][$channel] ?? null;
}
$singletons['loggers'][$channel] = $logger;
} elseif ( $provider instanceof LegacySpi ) {
if ( !isset( $this->loggers[$channel] ) ) {
- $this->loggers[$channel] = isset( $singletons[$channel] ) ? $singletons[$channel] : null;
+ $this->loggers[$channel] = $singletons[$channel] ?? null;
}
$singletons[$channel] = $logger;
} else {
*/
private function setUpSchema( IMaintainableDatabase $db ) {
// Undo any active overrides.
- $oldOverrides = isset( $db->_schemaOverrides ) ? $db->_schemaOverrides
- : self::$schemaOverrideDefaults;
+ $oldOverrides = $db->_schemaOverrides ?? self::$schemaOverrideDefaults;
if ( $oldOverrides['alter'] || $oldOverrides['create'] || $oldOverrides['drop'] ) {
$this->undoSchemaOverrides( $db, $oldOverrides );
uasort(
$array,
function ( $a, $b ) {
- return serialize( $a ) > serialize( $b ) ? 1 : -1;
+ return serialize( $a ) <=> serialize( $b );
}
);
}
+++ /dev/null
-<?php
-
-$result = [ 'xmp-exif' =>
- [
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => '9'
- ]
-];
+++ /dev/null
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:DigitalZoomRatio="0/10">
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
+++ /dev/null
-<?php
-
-$result = [ 'xmp-exif' =>
- [
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => '9'
- ]
-];
+++ /dev/null
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:DigitalZoomRatio="0/10">
-<exif:Flash>
-<rdf:Description exif:Return="0">
-<exif:Fired>True</exif:Fired> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></rdf:Description></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
+++ /dev/null
-<?php
-
-$result = [ 'xmp-exif' =>
- [
- 'DigitalZoomRatio' => '0/10',
- ]
-];
+++ /dev/null
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<!--
-This file has an invalid flash compoenent (one of the values are a qualifier)
--->
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
->
-<exif:DigitalZoomRatio>
-
-<rdf:Description>
-<rdf:value>
-0/10
-</rdf:value>
-<exif:foobarbaz>fred</exif:foobarbaz>
-
-</rdf:Description>
-
-</exif:DigitalZoomRatio>
-
-<exif:Flash>
-<rdf:Description exif:Return="0">
-<exif:Mode><rdf:Description>
-<rdf:value>1</rdf:value>
-<exif:Fired>False</exif:Fired> <!-- qualifier. should be ignored-->
-</rdf:Description>
-</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></rdf:Description></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
+++ /dev/null
-<?php
-
-$result = [ 'xmp-exif' =>
- [
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => '9'
- ]
-];
+++ /dev/null
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
->
-<exif:DigitalZoomRatio>
-
-<rdf:Description>
-<rdf:value>
-0/10
-</rdf:value>
-<exif:foobarbaz>fred</exif:foobarbaz>
-
-</rdf:Description>
-
-</exif:DigitalZoomRatio>
-
-<exif:Flash>
-<rdf:Description exif:Return="0">
-<exif:Fired>True</exif:Fired>
-<exif:Mode><rdf:Description>
-<rdf:value>1</rdf:value>
-<exif:Fired>False</exif:Fired> <!-- qualifier. should be ignored-->
-</rdf:Description>
-</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></rdf:Description></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
+++ /dev/null
-<?php
-
-$result = [ 'xmp-exif' =>
- [
- 'DigitalZoomRatio' => '0/10',
- ]
-];
+++ /dev/null
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<!-- Valid output is just the DigitalZoomRatio
-as the flash is a qualifier
--->
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/">
- <exif:DigitalZoomRatio>
-<rdf:Description>
-<rdf:value>
-0/10
-</rdf:value>
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash>
-</rdf:Description>
-</exif:DigitalZoomRatio>
-</rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-
-<?xpacket end="w"?>
+++ /dev/null
-<?php
-
-$result = [ 'xmp-exif' =>
- [
- 'DigitalZoomRatio' => '0/10',
- ]
-];
+++ /dev/null
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/">
- <exif:DigitalZoomRatio>
-<rdf:Description rdf:value="0/10">
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash>
-</rdf:Description>
-</exif:DigitalZoomRatio>
-</rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-
-<?xpacket end="w"?>
+++ /dev/null
-<?php
-
-$result = [ 'xmp-exif' =>
- [
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => '9'
- ]
-];
+++ /dev/null
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/">
-<exif:DigitalZoomRatio>
-0/10
-</exif:DigitalZoomRatio>
-</rdf:Description>
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/">
-
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
+++ /dev/null
-<?php
-$result = [
- 'xmp-exif' =>
- [
- 'CameraOwnerName' => 'Me!',
- ],
- 'xmp-general' =>
- [
- 'LicenseUrl' => 'http://creativecommons.com/cc-by-2.9',
- 'ImageDescription' =>
- [
- 'x-default' => 'Test image for the cc: xmp: xmpRights: namespaces in xmp',
- '_type' => 'lang',
- ],
- 'ObjectName' =>
- [
- 'x-default' => 'xmp core/xmp rights/cc ns test',
- '_type' => 'lang',
- ],
- 'DateTimeDigitized' => '2005:04:03',
- 'Software' => 'The one true editor: Vi (ok i used gimp)',
- 'Identifier' =>
- [
- 0 => 'http://example.com/identifierurl',
- 1 => 'urn:sha1:342524abcdef',
- '_type' => 'ul',
- ],
- 'Label' => 'Test image',
- 'DateTimeMetadata' => '2011:05:12',
- 'DateTime' => '2007:03:04 06:34:10',
- 'Nickname' => 'My little xmp test image',
- 'Rating' => '5',
- 'RightsCertificate' => 'http://example.com/rights-certificate/',
- 'Copyrighted' => 'True',
- 'CopyrightOwner' =>
- [
- 0 => 'Bawolff is copyright owner',
- '_type' => 'ul',
- ],
- 'UsageTerms' =>
- [
- 'x-default' => 'do whatever you want',
- 'en-gb' => 'Do whatever you want in british english',
- '_type' => 'lang',
- ],
- 'WebStatement' => 'http://example.com/web_statement',
- ],
- 'xmp-deprecated' =>
- [
- 'Identifier' => 'http://example.com/identifierurl/wrong',
- ],
-];
+++ /dev/null
-<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
-<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 7.30'>
-<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
-
- <rdf:Description rdf:about=''
- xmlns:aux='http://ns.adobe.com/exif/1.0/aux/'>
- <aux:OwnerName>Me!</aux:OwnerName>
- </rdf:Description>
-
- <rdf:Description rdf:about=''
- xmlns:cc='http://creativecommons.org/ns#'>
- <cc:license>http://creativecommons.com/cc-by-2.9</cc:license>
- </rdf:Description>
-
- <rdf:Description rdf:about=''
- xmlns:dc='http://purl.org/dc/elements/1.1/'>
- <dc:description>
- <rdf:Alt>
- <rdf:li xml:lang='x-default'>Test image for the cc: xmp: xmpRights: namespaces in xmp</rdf:li>
- </rdf:Alt>
- </dc:description>
- <dc:identifier>http://example.com/identifierurl/wrong</dc:identifier>
- <dc:title>
- <rdf:Alt>
- <rdf:li xml:lang='x-default'>xmp core/xmp rights/cc ns test</rdf:li>
- </rdf:Alt>
- </dc:title>
- </rdf:Description>
-
- <rdf:Description rdf:about=''
- xmlns:xmp='http://ns.adobe.com/xap/1.0/'>
- <xmp:CreateDate>2005-04-03</xmp:CreateDate>
- <xmp:CreatorTool>The one true editor: Vi (ok i used gimp)</xmp:CreatorTool>
- <xmp:Identifier>
- <rdf:Bag>
- <rdf:li>http://example.com/identifierurl
-</rdf:li>
- <rdf:li>urn:sha1:342524abcdef</rdf:li>
- </rdf:Bag>
- </xmp:Identifier>
- <xmp:Label>Test image</xmp:Label>
- <xmp:MetadataDate>2011-05-12</xmp:MetadataDate>
- <xmp:ModifyDate>2007-03-04T12:34:10-06:00</xmp:ModifyDate>
- <xmp:Nickname>My little xmp test image</xmp:Nickname>
- <xmp:Rating>7</xmp:Rating>
- </rdf:Description>
-
- <rdf:Description rdf:about=''
- xmlns:xmpRights='http://ns.adobe.com/xap/1.0/rights/'>
- <xmpRights:Certificate>http://example.com/rights-certificate/</xmpRights:Certificate>
- <xmpRights:Marked>True</xmpRights:Marked>
- <xmpRights:Owner>
- <rdf:Bag>
- <rdf:li>Bawolff is copyright owner</rdf:li>
- </rdf:Bag>
- </xmpRights:Owner>
- <xmpRights:UsageTerms>
- <rdf:Alt>
- <rdf:li xml:lang='x-default'>do whatever you want</rdf:li>
- <rdf:li xml:lang='en-GB'>Do whatever you want in british english</rdf:li>
- </rdf:Alt>
- </xmpRights:UsageTerms>
- <xmpRights:WebStatement>http://example.com/web_statement</xmpRights:WebStatement>
- </rdf:Description>
-</rdf:RDF>
-</x:xmpmeta>
-<?xpacket end='r'?>
+++ /dev/null
-This directory contains a bunch of XMP files
-as well as a bunch of php files containing what the
-parsed version of the XMP looks like.
+++ /dev/null
-<?php
-
-$result = [
- 'xmp-general' => [
- 'Artist' => [
- '_type' => 'ul',
- 0 => 'The author',
- ]
- ]
-];
+++ /dev/null
-<?xpacket begin=""?> <x:xmpmeta xmlns:x="adobe:ns:meta/"> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/"> <dc:creator> <rdf:Bag> <rdf:li>The author</rdf:li> </rdf:Bag> </dc:creator> </rdf:Description> </rdf:RDF> </x:xmpmeta>
+++ /dev/null
-<?php
-
-$result = [];
+++ /dev/null
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <!DOCTYPE x:xmpmeta [ <!ENTITY lol "lollollollollollollollollollollol"> ]>
-<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:DigitalZoomRatio="0/10">
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
+++ /dev/null
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:DigitalZoomRatio="0/10">
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
+++ /dev/null
-<?php
-
-$result = [ 'xmp-exif' =>
- [
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => '127'
- ]
-];
+++ /dev/null
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:DigitalZoomRatio="0/10">
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>3</exif:Return> <exif:Mode>3</exif:Mode> <exif:Function>True</exif:Function> <exif:RedEyeMode>True</exif:RedEyeMode></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
+++ /dev/null
-<?php
-
-$result = [ 'xmp-exif' =>
- [
- 'GPSAltitude' => -3.14159265301,
- 'GPSDOP' => '5/1',
- 'GPSLatitude' => 88.51805555,
- 'GPSLongitude' => -21.12356945,
- 'GPSVersionID' => '2.2.0.0'
- ]
-];
+++ /dev/null
-<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
-<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 7.30'>
-<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
-
- <rdf:Description rdf:about=''
- xmlns:exif='http://ns.adobe.com/exif/1.0/'>
- <exif:GPSAltitude>103993/33102</exif:GPSAltitude>
- <exif:GPSAltitudeRef>1</exif:GPSAltitudeRef>
- <exif:GPSDOP>5/1</exif:GPSDOP>
- <exif:GPSLatitude>88,31.083333N</exif:GPSLatitude>
- <exif:GPSLongitude>21,7.414167W</exif:GPSLongitude>
- <exif:GPSVersionID>2.2.0.0</exif:GPSVersionID>
- </rdf:Description>
-
-</rdf:RDF>
-</x:xmpmeta>
-<?xpacket end='w'?>
+++ /dev/null
-<?php
-
-$result = [ 'xmp-exif' =>
- [
- 'DigitalZoomRatio' => '0/10',
- ]
-];
+++ /dev/null
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:DigitalZoomRatio="0/10">
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode>
-
- </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
+++ /dev/null
-<?php
-
-$result = [ 'xmp-exif' =>
- [
- 'FNumber' => '28/10',
- ]
-];
+++ /dev/null
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<!-- Testing it handles random non-namespaced properties in files ok.
- Some older photoshop's did not include the rdf: prefix on about. -->
-<rdf:Description
- about=""
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:FNumber="28/10">
-</rdf:Description>
-</rdf:RDF>
-<?xpacket end="w"?>
+++ /dev/null
-<?php
-$result = [];
+++ /dev/null
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/not-exif-namespace"
- exif:FNumber="2/10">
-</rdf:Description>
-</rdf:RDF>
-<?xpacket end="w"?>
+++ /dev/null
-<?php
-
-$result = [
- 'xmp-exif' =>
- [
- 'DigitalZoomRatio' => '0/10',
- ],
- 'xmp-general' =>
- [
- 'Label' => ''
- ],
-];
+++ /dev/null
-<?php
-
-$result = [
- 'xmp-exif' =>
- [
- 'DigitalZoomRatio' => '0/10',
- ],
- 'xmp-general' =>
- [
- 'Label' => ''
- ],
-];
+++ /dev/null
-<?php
-
-$result = [
- 'xmp-exif' =>
- [
- 'DigitalZoomRatio' => '0/10',
- ],
- 'xmp-general' =>
- [
- 'Label' => ''
- ],
-];
+++ /dev/null
-<?php
-
-$result = [
- 'xmp-exif' =>
- [
- 'DigitalZoomRatio' => '0/10',
- ],
- 'xmp-general' =>
- [
- 'Label' => ''
- ],
-];
+++ /dev/null
-<?php
-
-$result = [ 'xmp-exif' =>
- [
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => '9'
- ]
-];
+++ /dev/null
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- xmlns:xmpNote="http://ns.adobe.com/xmp/note/"
- exif:DigitalZoomRatio="0/10"
- xmpNote:HasExtendedXMP="28C74E0AC2D796886759006FBE2E57B7">
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
+++ /dev/null
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:FNumber="2/10">
-</rdf:Description>
-</rdf:RDF>
-<?xpacket end="w"?>
$expected = $this->extractExpect( $server, $expectations );
// save up global
- $old = isset( $_SERVER['SERVER_SOFTWARE'] )
- ? $_SERVER['SERVER_SOFTWARE']
- : null;
+ $old = $_SERVER['SERVER_SOFTWARE'] ?? null;
$_SERVER['SERVER_SOFTWARE'] = $server;
wfUrlencode( null );
$ret[] = [
$case[0],
$case[1], $case[2],
- isset( $case[3] ) ? $case[3] : ''
+ $case[3] ?? ''
];
}
public function testSearch( array $case ) {
$this->searchProvision( null );
- $namespaces = isset( $case['namespaces'] ) ? $case['namespaces'] : [];
+ $namespaces = $case['namespaces'] ?? [];
if ( wfGetDB( DB_REPLICA )->getType() === 'postgres' ) {
// Postgres will sort lexicographically on utf8 code units (" " before "/")
public function testSearchWithOffset( array $case ) {
$this->searchProvision( null );
- $namespaces = isset( $case['namespaces'] ) ? $case['namespaces'] : [];
+ $namespaces = $case['namespaces'] ?? [];
$searcher = new StringPrefixSearch;
$results = $searcher->search( $case['query'], 3, $namespaces, 1 );
sort( $groups );
$key = implode( ',', $groups );
- $testUser = isset( self::$testUsers[$key] )
- ? self::$testUsers[$key]
- : false;
+ $testUser = self::$testUsers[$key] ?? false;
if ( !$testUser || !$testUser->getUser()->isLoggedIn() ) {
$id = self::getNextId();
$input !== null ? [ 'myParam' => $input ] : [] ) );
$wrapper->mMainModule = new ApiMain( $context );
- $parseLimits = isset( $options['parseLimits'] ) ?
- $options['parseLimits'] : true;
+ $parseLimits = $options['parseLimits'] ?? true;
if ( !empty( $options['apihighlimits'] ) ) {
$context->setUser( self::$users['sysop']->getUser() );
];
foreach ( $integerTests as $test ) {
- $desc = isset( $test[2] ) ? $test[2] : $test[0];
+ $desc = $test[2] ?? $test[0];
$warnings = isset( $test[3] ) ?
[ [ 'apiwarn-badutf8', 'myParam' ] ] : [];
$returnArray["\"$desc\" as integer"] = [
$value = self::$repl[$m[1]];
} else {
$value = preg_replace_callback( '/{{REPL:(.+?)}}/', function ( $m ) {
- return isset( self::$repl[$m[1]] ) ? self::$repl[$m[1]] : $m[0];
+ return self::$repl[$m[1]] ?? $m[0];
}, $value );
}
} elseif ( is_array( $value ) || is_object( $value ) ) {
$module->expects( $this->any() )
->method( 'getConditionalRequestData' )
->will( $this->returnCallback( function ( $condition ) use ( $conditions ) {
- return isset( $conditions[$condition] ) ? $conditions[$condition] : null;
+ return $conditions[$condition] ?? null;
} ) );
$ret = $priv->checkConditionalRequestHeaders( $module );
$module->expects( $this->any() )
->method( 'getConditionalRequestData' )
->will( $this->returnCallback( function ( $condition ) use ( $conditions ) {
- return isset( $conditions[$condition] ) ? $conditions[$condition] : null;
+ return $conditions[$condition] ?? null;
} ) );
$priv->mModule = $module;
foreach ( [ 'Last-Modified', 'ETag' ] as $header ) {
$this->assertEquals(
- isset( $headers[$header] ) ? $headers[$header] : null,
+ $headers[$header] ?? null,
$response->getHeader( $header ),
$header
);
if ( $options['name'] !== 'mockfm' ) {
$ct = 'text/x-mock';
$file = 'api-result.mock';
- $status = isset( $options['status'] ) ? $options['status'] : null;
+ $status = $options['status'] ?? null;
} elseif ( isset( $params['wrappedhtml'] ) ) {
$ct = 'text/mediawiki-api-prettyprint-wrapped';
$file = 'api-result-wrapped.json';
if ( is_string( $options ) ) {
$options = [ 'class' => $options ];
}
- $printerName = isset( $options['name'] ) ? $options['name'] : $this->printerName;
+ $printerName = $options['name'] ?? $this->printerName;
$context = new RequestContext;
$context->setRequest( new FauxRequest( $params, true ) );
$main = new ApiMain( $context );
if ( isset( $options['class'] ) ) {
- $factory = isset( $options['factory'] ) ? $options['factory'] : null;
+ $factory = $options['factory'] ?? null;
$main->getModuleManager()->addModule( $printerName, 'format', $options['class'], $factory );
}
$result = $main->getResult();
];
$options = getopt( null, $getOptSpec );
- $format = isset( $options['format'] ) ? $options['format'] : 'jpg';
+ $format = $options['format'] ?? 'jpg';
unset( $options['format'] );
$number = isset( $options['number'] ) ? intval( $options['number'] ) : 10;
$this->assertArrayHasKey( 'query', $apiResult[0], "Batching with limit $limit" );
$this->assertArrayHasKey( 'usercontribs', $apiResult[0]['query'],
"Batching with limit $limit" );
- $continue = isset( $apiResult[0]['continue'] ) ? $apiResult[0]['continue'] : null;
+ $continue = $apiResult[0]['continue'] ?? null;
foreach ( $apiResult[0]['query']['usercontribs'] as $page ) {
$count++;
$batchedIds[$page['user']][] = $page['revid'];
}
$state = $session->getSecret( 'AuthManager::authnState' );
- $maybeLink = isset( $state['maybeLink'] ) ? $state['maybeLink'] : [];
+ $maybeLink = $state['maybeLink'] ?? [];
if ( $link && $response->status === AuthenticationResponse::RESTART ) {
$this->assertEquals(
$response->createRequest->maybeLink,
*/
public function testUserName( $userKey, $expectedGender ) {
$genderCache = MediaWikiServices::getInstance()->getGenderCache();
- $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
+ $username = self::$nameMap[$userKey] ?? $userKey;
$gender = $genderCache->getGenderOf( $username );
$this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
}
* @covers GenderCache::getGenderOf
*/
public function testUserObjects( $userKey, $expectedGender ) {
- $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
+ $username = self::$nameMap[$userKey] ?? $userKey;
$genderCache = MediaWikiServices::getInstance()->getGenderCache();
$gender = $genderCache->getGenderOf( $username );
$this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
* @covers GenderCache::getGenderOf
*/
public function testStripSubpages( $userKey, $expectedGender ) {
- $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
+ $username = self::$nameMap[$userKey] ?? $userKey;
$genderCache = MediaWikiServices::getInstance()->getGenderCache();
$gender = $genderCache->getGenderOf( "$username/subpage" );
$this->assertEquals( $gender, $expectedGender, "GenderCache must strip of subpages" );
$this->profiler = new ProfilerStub( [] );
$this->trxProfiler = new TransactionProfiler();
- $this->cliMode = isset( $opts['cliMode'] ) ? $opts['cliMode'] : true;
+ $this->cliMode = $opts['cliMode'] ?? true;
$this->connLogger = new \Psr\Log\NullLogger();
$this->queryLogger = new \Psr\Log\NullLogger();
$this->errorLogger = function ( Exception $e ) {
}
protected function wasKnownStatementRollbackError() {
- return isset( $this->lastError['wasKnownStatementRollbackError'] )
- ? $this->lastError['wasKnownStatementRollbackError']
- : false;
+ return $this->lastError['wasKnownStatementRollbackError'] ?? false;
}
function fieldInfo( $table, $field ) {
use MediaWikiCoversValidator;
use PHPUnit4And6Compat;
- /** @var TimeAdjustableWANObjectCache */
+ /** @var WANObjectCache */
private $cache;
/** @var BagOStuff */
private $internalCache;
protected function setUp() {
parent::setUp();
- $this->cache = new TimeAdjustableWANObjectCache( [
- 'cache' => new TimeAdjustableHashBagOStuff(),
+ $this->cache = new WANObjectCache( [
+ 'cache' => new HashBagOStuff(),
'pool' => 'testcache-hash',
'relayer' => new EventRelayerNull( [] )
] );
$this->assertEquals( $value, $v, "Value returned" );
$this->assertEquals( 0, $wasSet, "Value not regenerated" );
- $priorTime = microtime( true ); // reference time
- $cache->setTime( $priorTime );
+ $mockWallClock = microtime( true );
+ $priorTime = $mockWallClock; // reference time
+ $cache->setMockTime( $mockWallClock );
- $cache->addTime( 1 );
+ $mockWallClock += 1;
$wasSet = 0;
$v = $cache->getWithSetCallback(
$t2 = $cache->getCheckKeyTime( $cKey2 );
$this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check keys generated on miss' );
- $priorTime = $cache->addTime( 0.01 );
-
+ $mockWallClock += 0.01;
+ $priorTime = $mockWallClock; // reference time
$wasSet = 0;
$v = $cache->getWithSetCallback(
$key, 30, $func, [ 'checkKeys' => [ $cKey1, $cKey2 ] ] + $extOpts
return 'xxx' . $wasSet;
};
- $now = microtime( true ); // reference time
+ $mockWallClock = microtime( true );
+ $priorTime = $mockWallClock; // reference time
$wasSet = 0;
$key = wfRandomString();
$this->assertEquals( false, $oldValReceived, "Callback got no stale value" );
$this->assertEquals( null, $oldAsOfReceived, "Callback got no stale value" );
- $cache->addTime( 40 );
+ $mockWallClock += 40;
$v = $cache->getWithSetCallback(
$key, 30, $checkFunc, [ 'staleTTL' => 50 ] + $extOpts );
$this->assertEquals( 'xxx2', $v, "Value still returned after expired" );
$this->assertEquals( 'xxx1', $oldValReceived, "Callback got stale value" );
$this->assertNotEquals( null, $oldAsOfReceived, "Callback got stale value" );
- $cache->addTime( 260 );
+ $mockWallClock += 260;
$v = $cache->getWithSetCallback(
$key, 30, $checkFunc, [ 'staleTTL' => 50 ] + $extOpts );
$this->assertEquals( 'xxx3', $v, "Value still returned after expired" );
$this->assertEquals( false, $oldValReceived, "Callback got no stale value" );
$this->assertEquals( null, $oldAsOfReceived, "Callback got no stale value" );
+ $mockWallClock = ( $priorTime - $cache::HOLDOFF_TTL - 1 );
$wasSet = 0;
$key = wfRandomString();
$checkKey = $cache->makeKey( 'template', 'X' );
- $cache->setTime( $now - $cache::HOLDOFF_TTL - 1 );
$cache->touchCheckKey( $checkKey ); // init check key
- $cache->setTime( $now );
+ $mockWallClock = $priorTime;
$v = $cache->getWithSetCallback(
$key,
$cache::TTL_INDEFINITE,
$this->assertEquals( false, $oldValReceived, "Callback got no stale value" );
$this->assertEquals( null, $oldAsOfReceived, "Callback got no stale value" );
- $cache->addTime( $cache::TTL_HOUR ); // some time passes
+ $mockWallClock += $cache::TTL_HOUR; // some time passes
$v = $cache->getWithSetCallback(
$key,
$cache::TTL_INDEFINITE,
$this->assertEquals( 1, $wasSet, "Cached value returned" );
$cache->touchCheckKey( $checkKey ); // make key stale
- $cache->addTime( 0.01 ); // ~1 week left of grace (barely stale to avoid refreshes)
+ $mockWallClock += 0.01; // ~1 week left of grace (barely stale to avoid refreshes)
$v = $cache->getWithSetCallback(
$key,
$this->assertEquals( 1, $wasSet, "Value still returned after expired (in grace)" );
// Change of refresh increase to unity as staleness approaches graceTTL
-
- $cache->addTime( $cache::TTL_WEEK ); // 8 days of being stale
+ $mockWallClock += $cache::TTL_WEEK; // 8 days of being stale
$v = $cache->getWithSetCallback(
$key,
$cache::TTL_INDEFINITE,
$asycList[] = $callback;
};
$cache = new NearExpiringWANObjectCache( [
- 'cache' => new TimeAdjustableHashBagOStuff(),
+ 'cache' => new HashBagOStuff(),
'pool' => 'empty',
'asyncHandler' => $asyncHandler
] );
- $now = microtime( true ); // reference time
- $cache->setTime( $now );
+ $mockWallClock = microtime( true );
+ $priorTime = $mockWallClock; // reference time
+ $cache->setMockTime( $mockWallClock );
$wasSet = 0;
$key = wfRandomString();
- $checkKey = wfRandomString();
$opts = [ 'lowTTL' => 100 ];
$v = $cache->getWithSetCallback( $key, 300, $func, $opts );
$this->assertEquals( $value, $v, "Value returned" );
$this->assertEquals( 1, $wasSet, "Cached value used" );
$this->assertEquals( $v, $value, "Value cached" );
- $cache->setTime( $now + 250 );
+ $mockWallClock += 250;
$v = $cache->getWithSetCallback( $key, 300, $func, $opts );
$this->assertEquals( $value, $v, "Value returned" );
$this->assertEquals( 1, $wasSet, "Stale value used" );
$this->assertEquals( $value, $v, "New value stored" );
$cache = new PopularityRefreshingWANObjectCache( [
- 'cache' => new TimeAdjustableHashBagOStuff(),
+ 'cache' => new HashBagOStuff(),
'pool' => 'empty'
] );
- $cache->setTime( $now );
+ $mockWallClock = $priorTime;
+ $cache->setMockTime( $mockWallClock );
$wasSet = 0;
$key = wfRandomString();
$v = $cache->getWithSetCallback( $key, 60, $func, $opts );
$this->assertEquals( $value, $v, "Value returned" );
$this->assertEquals( 1, $wasSet, "Value calculated" );
- $cache->setTime( $now + 30 );
+
+ $mockWallClock += 30;
+
$v = $cache->getWithSetCallback( $key, 60, $func, $opts );
$this->assertEquals( 1, $wasSet, "Value cached" );
+ $mockWallClock = $priorTime;
$wasSet = 0;
$key = wfRandomString();
$opts = [ 'hotTTR' => 10 ];
- $cache->setTime( $now );
$v = $cache->getWithSetCallback( $key, 60, $func, $opts );
$this->assertEquals( $value, $v, "Value returned" );
$this->assertEquals( 1, $wasSet, "Value calculated" );
- $cache->setTime( $now + 30 );
+
+ $mockWallClock += 30;
+
$v = $cache->getWithSetCallback( $key, 60, $func, $opts );
$this->assertEquals( $value, $v, "Value returned" );
$this->assertEquals( 2, $wasSet, "Value re-calculated" );
$this->assertEquals( 1, $wasSet, "Value not regenerated" );
$this->assertEquals( 0, $cache->getWarmupKeyMisses(), "Keys warmed in process cache" );
- $priorTime = microtime( true ); // reference time
- $cache->setTime( $priorTime );
+ $mockWallClock = microtime( true );
+ $priorTime = $mockWallClock; // reference time
+ $cache->setMockTime( $mockWallClock );
- $cache->addTime( 1 );
+ $mockWallClock += 1;
$wasSet = 0;
$keyedIds = new ArrayIterator( [ $keyB => 'efef' ] );
$t2 = $cache->getCheckKeyTime( $cKey2 );
$this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check keys generated on miss' );
- $priorTime = $cache->addTime( 0.01 );
+ $mockWallClock += 0.01;
+ $priorTime = $mockWallClock;
$value = "@43636$";
$wasSet = 0;
$keyedIds = new ArrayIterator( [ $keyC => 43636 ] );
$this->assertEquals( 1, $wasSet, "Value not regenerated" );
$this->assertEquals( 0, $cache->getWarmupKeyMisses(), "Keys warmed in process cache" );
- $priorTime = microtime( true ); // reference time
- $cache->setTime( $priorTime );
+ $mockWallClock = microtime( true );
+ $priorTime = $mockWallClock; // reference time
+ $cache->setMockTime( $mockWallClock );
- $cache->addTime( 1 );
+ $mockWallClock += 1;
$wasSet = 0;
$keyedIds = new ArrayIterator( [ $keyB => 'efef' ] );
$t2 = $cache->getCheckKeyTime( $cKey2 );
$this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check keys generated on miss' );
- $priorTime = $cache->addTime( 0.01 );
+ $mockWallClock += 0.01;
+ $priorTime = $mockWallClock;
$value = "@43636$";
$wasSet = 0;
$keyedIds = new ArrayIterator( [ $keyC => 43636 ] );
$cKey1 = wfRandomString();
$cKey2 = wfRandomString();
- $priorTime = microtime( true ); // reference time
- $cache->setTime( $priorTime );
+ $mockWallClock = microtime( true );
+ $priorTime = $mockWallClock; // reference time
+ $cache->setMockTime( $mockWallClock );
- $cache->addTime( 1 );
+ $mockWallClock += 1;
$curTTLs = [];
$this->assertEquals(
$this->assertLessThanOrEqual( 0, $curTTLs[$key1], 'Key 1 has current TTL <= 0' );
$this->assertLessThanOrEqual( 0, $curTTLs[$key2], 'Key 2 has current TTL <= 0' );
- $cache->addTime( 1 );
+ $mockWallClock += 1;
$curTTLs = [];
$this->assertEquals(
$value1 = wfRandomString();
$value2 = wfRandomString();
- $cache->setTime( microtime( true ) );
+ $mockWallClock = microtime( true );
+ $cache->setMockTime( $mockWallClock );
// Fake initial check key to be set in the past. Otherwise we'd have to sleep for
// several seconds during the test to assert the behaviour.
$cache->touchCheckKey( $checkKey, WANObjectCache::HOLDOFF_NONE );
}
- $cache->addTime( 0.100 );
+ $mockWallClock += 0.100;
$cache->set( 'key1', $value1, 10 );
$cache->set( 'key2', $value2, 10 );
$this->assertGreaterThanOrEqual( 9.5, $curTTLs['key2'], 'Initial ttls' );
$this->assertLessThanOrEqual( 10.5, $curTTLs['key2'], 'Initial ttls' );
- $cache->addTime( 0.100 );
+ $mockWallClock += 0.100;
$cache->touchCheckKey( $check1 );
$curTTLs = [];
$cache = $this->cache;
$key = wfRandomString();
- $priorTime = microtime( true ); // reference time
- $cache->setTime( $priorTime );
+ $mockWallClock = microtime( true );
+ $priorTime = $mockWallClock; // reference time
+ $cache->setMockTime( $mockWallClock );
- $newTime = $cache->addTime( 0.100 );
+ $mockWallClock += 0.100;
$t0 = $cache->getCheckKeyTime( $key );
$this->assertGreaterThanOrEqual( $priorTime, $t0, 'Check key auto-created' );
- $priorTime = $newTime;
- $newTime = $cache->addTime( 0.100 );
+ $priorTime = $mockWallClock;
+ $mockWallClock += 0.100;
$cache->touchCheckKey( $key );
$t1 = $cache->getCheckKeyTime( $key );
$this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key created' );
$t2 = $cache->getCheckKeyTime( $key );
$this->assertEquals( $t1, $t2, 'Check key time did not change' );
- $cache->addTime( 0.100 );
+ $mockWallClock += 0.100;
$cache->touchCheckKey( $key );
$t3 = $cache->getCheckKeyTime( $key );
$this->assertGreaterThan( $t2, $t3, 'Check key time increased' );
$t4 = $cache->getCheckKeyTime( $key );
$this->assertEquals( $t3, $t4, 'Check key time did not change' );
- $cache->addTime( 0.100 );
+ $mockWallClock += 0.100;
$cache->resetCheckKey( $key );
$t5 = $cache->getCheckKeyTime( $key );
$this->assertGreaterThan( $t4, $t5, 'Check key time increased' );
}
}
-class TimeAdjustableHashBagOStuff extends HashBagOStuff {
- private $timeOverride = 0;
-
- public function setTime( $time ) {
- $this->timeOverride = $time;
- }
-
- protected function getCurrentTime() {
- return $this->timeOverride ?: parent::getCurrentTime();
- }
-}
-
-class TimeAdjustableWANObjectCache extends WANObjectCache {
- private $timeOverride = 0;
-
- public function setTime( $time ) {
- $this->timeOverride = $time;
- if ( $this->cache instanceof TimeAdjustableHashBagOStuff ) {
- $this->cache->setTime( $time );
- }
- }
-
- public function addTime( $time ) {
- $this->timeOverride += $time;
- if ( $this->cache instanceof TimeAdjustableHashBagOStuff ) {
- $this->cache->setTime( $this->timeOverride );
- }
-
- return $this->timeOverride;
- }
-
- protected function getCurrentTime() {
- return $this->timeOverride ?: parent::getCurrentTime();
- }
-}
-
-class NearExpiringWANObjectCache extends TimeAdjustableWANObjectCache {
+class NearExpiringWANObjectCache extends WANObjectCache {
const CLOCK_SKEW = 1;
protected function worthRefreshExpiring( $curTTL, $lowTTL ) {
}
}
-class PopularityRefreshingWANObjectCache extends TimeAdjustableWANObjectCache {
+class PopularityRefreshingWANObjectCache extends WANObjectCache {
protected function worthRefreshPopular( $asOf, $ageNew, $timeTillRefresh, $now ) {
return ( ( $now - $asOf ) > $timeTillRefresh );
}
$this->database->select(
$sql['tables'],
$sql['fields'],
- isset( $sql['conds'] ) ? $sql['conds'] : [],
+ $sql['conds'] ?? [],
__METHOD__,
- isset( $sql['options'] ) ? $sql['options'] : [],
- isset( $sql['join_conds'] ) ? $sql['join_conds'] : []
+ $sql['options'] ?? [],
+ $sql['join_conds'] ?? []
);
$this->assertLastSql( $sqlText );
}
$this->database->selectRowCount(
$sql['tables'],
$sql['field'],
- isset( $sql['conds'] ) ? $sql['conds'] : [],
+ $sql['conds'] ?? [],
__METHOD__,
- isset( $sql['options'] ) ? $sql['options'] : [],
- isset( $sql['join_conds'] ) ? $sql['join_conds'] : []
+ $sql['options'] ?? [],
+ $sql['join_conds'] ?? []
);
$this->assertLastSql( $sqlText );
}
$sql['values'],
$sql['conds'],
__METHOD__,
- isset( $sql['options'] ) ? $sql['options'] : []
+ $sql['options'] ?? []
);
$this->assertLastSql( $sqlText );
}
$sql['table'],
$sql['rows'],
__METHOD__,
- isset( $sql['options'] ) ? $sql['options'] : []
+ $sql['options'] ?? []
);
$this->assertLastSql( $sqlText );
}
$sql['varMap'],
$sql['conds'],
__METHOD__,
- isset( $sql['insertOptions'] ) ? $sql['insertOptions'] : [],
- isset( $sql['selectOptions'] ) ? $sql['selectOptions'] : [],
- isset( $sql['selectJoinConds'] ) ? $sql['selectJoinConds'] : []
+ $sql['insertOptions'] ?? [],
+ $sql['selectOptions'] ?? [],
+ $sql['selectJoinConds'] ?? []
);
$this->assertLastSql( $sqlTextNative );
$sql['varMap'],
$sql['conds'],
__METHOD__,
- isset( $sql['insertOptions'] ) ? $sql['insertOptions'] : [],
- isset( $sql['selectOptions'] ) ? $sql['selectOptions'] : [],
- isset( $sql['selectJoinConds'] ) ? $sql['selectJoinConds'] : []
+ $sql['insertOptions'] ?? [],
+ $sql['selectOptions'] ?? [],
+ $sql['selectJoinConds'] ?? []
);
$this->assertLastSqlDb( implode( '; ', [ $sqlSelect, 'BEGIN', $sqlInsert, 'COMMIT' ] ), $dbWeb );
}
$params['table'],
$params['vars'],
$params['permute_conds'],
- isset( $params['extra_conds'] ) ? $params['extra_conds'] : '',
+ $params['extra_conds'] ?? '',
'FNAME',
- isset( $params['options'] ) ? $params['options'] : [],
- isset( $params['join_conds'] ) ? $params['join_conds'] : []
+ $params['options'] ?? [],
+ $params['join_conds'] ?? []
) );
$this->assertEquals( $expect, $sql );
}
+++ /dev/null
-<?php
-
-/**
- * @group Media
- * @covers XMPReader
- */
-class XMPTest extends PHPUnit\Framework\TestCase {
-
- use MediaWikiCoversValidator;
-
- protected function setUp() {
- parent::setUp();
- # Requires libxml to do XMP parsing
- if ( !extension_loaded( 'exif' ) ) {
- $this->markTestSkipped( "PHP extension 'exif' is not loaded, skipping." );
- }
- }
-
- /**
- * Put XMP in, compare what comes out...
- *
- * @param string $xmp The actual xml data.
- * @param array $expected Expected result of parsing the xmp.
- * @param string $info Short sentence on what's being tested.
- *
- * @throws Exception
- * @dataProvider provideXMPParse
- *
- * @covers XMPReader::parse
- */
- public function testXMPParse( $xmp, $expected, $info ) {
- if ( !is_string( $xmp ) || !is_array( $expected ) ) {
- throw new Exception( "Invalid data provided to " . __METHOD__ );
- }
- $reader = new XMPReader;
- $reader->parse( $xmp );
- $this->assertEquals( $expected, $reader->getResults(), $info, 0.0000000001 );
- }
-
- public static function provideXMPParse() {
- $xmpPath = __DIR__ . '/../../../data/xmp/';
- $data = [];
-
- // $xmpFiles format: array of arrays with first arg file base name,
- // with the actual file having .xmp on the end for the xmp
- // and .result.php on the end for a php file containing the result
- // array. Second argument is some info on what's being tested.
- $xmpFiles = [
- [ '1', 'parseType=Resource test' ],
- [ '2', 'Structure with mixed attribute and element props' ],
- [ '3', 'Extra qualifiers (that should be ignored)' ],
- [ '3-invalid', 'Test ignoring qualifiers that look like normal props' ],
- [ '4', 'Flash as qualifier' ],
- [ '5', 'Flash as qualifier 2' ],
- [ '6', 'Multiple rdf:Description' ],
- [ '7', 'Generic test of several property types' ],
- [ 'flash', 'Test of Flash property' ],
- [ 'invalid-child-not-struct', 'Test child props not in struct or ignored' ],
- [ 'no-recognized-props', 'Test namespace and no recognized props' ],
- [ 'no-namespace', 'Test non-namespaced attributes are ignored' ],
- [ 'bag-for-seq', "Allow bag's instead of seq's. (T29105)" ],
- [ 'utf16BE', 'UTF-16BE encoding' ],
- [ 'utf16LE', 'UTF-16LE encoding' ],
- [ 'utf32BE', 'UTF-32BE encoding' ],
- [ 'utf32LE', 'UTF-32LE encoding' ],
- [ 'xmpExt', 'Extended XMP missing second part' ],
- [ 'gps', 'Handling of exif GPS parameters in XMP' ],
- ];
-
- $xmpFiles[] = [ 'doctype-included', 'XMP includes doctype' ];
-
- foreach ( $xmpFiles as $file ) {
- $xmp = file_get_contents( $xmpPath . $file[0] . '.xmp' );
- // I'm not sure if this is the best way to handle getting the
- // result array, but it seems kind of big to put directly in the test
- // file.
- $result = null;
- include $xmpPath . $file[0] . '.result.php';
- $data[] = [ $xmp, $result, '[' . $file[0] . '.xmp] ' . $file[1] ];
- }
-
- return $data;
- }
-
- /** Test ExtendedXMP block support. (Used when the XMP has to be split
- * over multiple jpeg segments, due to 64k size limit on jpeg segments.
- *
- * @todo This is based on what the standard says. Need to find a real
- * world example file to double check the support for this is right.
- *
- * @covers XMPReader::parseExtended
- */
- public function testExtendedXMP() {
- $xmpPath = __DIR__ . '/../../../data/xmp/';
- $standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
- $extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
-
- $md5sum = '28C74E0AC2D796886759006FBE2E57B7'; // of xmpExt2.xmp
- $length = pack( 'N', strlen( $extendedXMP ) );
- $offset = pack( 'N', 0 );
- $extendedPacket = $md5sum . $length . $offset . $extendedXMP;
-
- $reader = new XMPReader();
- $reader->parse( $standardXMP );
- $reader->parseExtended( $extendedPacket );
- $actual = $reader->getResults();
-
- $expected = [
- 'xmp-exif' => [
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => 9,
- 'FNumber' => '2/10',
- ]
- ];
-
- $this->assertEquals( $expected, $actual );
- }
-
- /**
- * This test has an extended XMP block with a wrong guid (md5sum)
- * and thus should only return the StandardXMP, not the ExtendedXMP.
- *
- * @covers XMPReader::parseExtended
- */
- public function testExtendedXMPWithWrongGUID() {
- $xmpPath = __DIR__ . '/../../../data/xmp/';
- $standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
- $extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
-
- $md5sum = '28C74E0AC2D796886759006FBE2E57B9'; // Note last digit.
- $length = pack( 'N', strlen( $extendedXMP ) );
- $offset = pack( 'N', 0 );
- $extendedPacket = $md5sum . $length . $offset . $extendedXMP;
-
- $reader = new XMPReader();
- $reader->parse( $standardXMP );
- $reader->parseExtended( $extendedPacket );
- $actual = $reader->getResults();
-
- $expected = [
- 'xmp-exif' => [
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => 9,
- ]
- ];
-
- $this->assertEquals( $expected, $actual );
- }
-
- /**
- * Have a high offset to simulate a missing packet,
- * which should cause it to ignore the ExtendedXMP packet.
- *
- * @covers XMPReader::parseExtended
- */
- public function testExtendedXMPMissingPacket() {
- $xmpPath = __DIR__ . '/../../../data/xmp/';
- $standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
- $extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
-
- $md5sum = '28C74E0AC2D796886759006FBE2E57B7'; // of xmpExt2.xmp
- $length = pack( 'N', strlen( $extendedXMP ) );
- $offset = pack( 'N', 2048 );
- $extendedPacket = $md5sum . $length . $offset . $extendedXMP;
-
- $reader = new XMPReader();
- $reader->parse( $standardXMP );
- $reader->parseExtended( $extendedPacket );
- $actual = $reader->getResults();
-
- $expected = [
- 'xmp-exif' => [
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => 9,
- ]
- ];
-
- $this->assertEquals( $expected, $actual );
- }
-
- /**
- * Test for multi-section, hostile XML
- * @covers XMPReader::checkParseSafety
- */
- public function testCheckParseSafety() {
- // Test for detection
- $xmpPath = __DIR__ . '/../../../data/xmp/';
- $file = fopen( $xmpPath . 'doctype-included.xmp', 'rb' );
- $valid = false;
- $reader = new XMPReader();
- do {
- $chunk = fread( $file, 10 );
- $valid = $reader->parse( $chunk, feof( $file ) );
- } while ( !feof( $file ) );
- $this->assertFalse( $valid, 'Check that doctype is detected in fragmented XML' );
- $this->assertEquals(
- [],
- $reader->getResults(),
- 'Check that doctype is detected in fragmented XML'
- );
- fclose( $file );
- unset( $reader );
-
- // Test for false positives
- $file = fopen( $xmpPath . 'doctype-not-included.xmp', 'rb' );
- $valid = false;
- $reader = new XMPReader();
- do {
- $chunk = fread( $file, 10 );
- $valid = $reader->parse( $chunk, feof( $file ) );
- } while ( !feof( $file ) );
- $this->assertTrue(
- $valid,
- 'Check for false-positive detecting doctype in fragmented XML'
- );
- $this->assertEquals(
- [
- 'xmp-exif' => [
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => '9'
- ]
- ],
- $reader->getResults(),
- 'Check that doctype is detected in fragmented XML'
- );
- }
-}
+++ /dev/null
-<?php
-
-use Psr\Log\NullLogger;
-
-/**
- * @group Media
- */
-class XMPValidateTest extends PHPUnit\Framework\TestCase {
-
- use MediaWikiCoversValidator;
-
- /**
- * @dataProvider provideDates
- * @covers XMPValidate::validateDate
- */
- public function testValidateDate( $value, $expected ) {
- // The method should modify $value.
- $validate = new XMPValidate( new NullLogger() );
- $validate->validateDate( [], $value, true );
- $this->assertEquals( $expected, $value );
- }
-
- public static function provideDates() {
- /* For reference valid date formats are:
- * YYYY
- * YYYY-MM
- * YYYY-MM-DD
- * YYYY-MM-DDThh:mmTZD
- * YYYY-MM-DDThh:mm:ssTZD
- * YYYY-MM-DDThh:mm:ss.sTZD
- * (Time zone is optional)
- */
- return [
- [ '1992', '1992' ],
- [ '1992-04', '1992:04' ],
- [ '1992-02-01', '1992:02:01' ],
- [ '2011-09-29', '2011:09:29' ],
- [ '1982-12-15T20:12', '1982:12:15 20:12' ],
- [ '1982-12-15T20:12Z', '1982:12:15 20:12' ],
- [ '1982-12-15T20:12+02:30', '1982:12:15 22:42' ],
- [ '1982-12-15T01:12-02:30', '1982:12:14 22:42' ],
- [ '1982-12-15T20:12:11', '1982:12:15 20:12:11' ],
- [ '1982-12-15T20:12:11Z', '1982:12:15 20:12:11' ],
- [ '1982-12-15T20:12:11+01:10', '1982:12:15 21:22:11' ],
- [ '2045-12-15T20:12:11', '2045:12:15 20:12:11' ],
- [ '1867-06-01T15:00:00', '1867:06:01 15:00:00' ],
- /* some invalid ones */
- [ '2001--12', null ],
- [ '2001-5-12', null ],
- [ '2001-5-12TZ', null ],
- [ '2001-05-12T15', null ],
- [ '2001-12T15:13', null ],
- ];
- }
-}
// no log_id because no insert in database
'log_type' => $data['type'],
'log_action' => $data['action'],
- 'log_timestamp' => isset( $data['timestamp'] ) ? $data['timestamp'] : wfTimestampNow(),
- 'log_user' => isset( $data['user'] ) ? $data['user'] : 0,
- 'log_user_text' => isset( $data['user_text'] ) ? $data['user_text'] : 'User',
- 'log_actor' => isset( $data['actor'] ) ? $data['actor'] : 0,
- 'log_namespace' => isset( $data['namespace'] ) ? $data['namespace'] : NS_MAIN,
- 'log_title' => isset( $data['title'] ) ? $data['title'] : 'Main_Page',
- 'log_page' => isset( $data['page'] ) ? $data['page'] : 0,
- 'log_comment_text' => isset( $data['comment'] ) ? $data['comment'] : '',
+ 'log_timestamp' => $data['timestamp'] ?? wfTimestampNow(),
+ 'log_user' => $data['user'] ?? 0,
+ 'log_user_text' => $data['user_text'] ?? 'User',
+ 'log_actor' => $data['actor'] ?? 0,
+ 'log_namespace' => $data['namespace'] ?? NS_MAIN,
+ 'log_title' => $data['title'] ?? 'Main_Page',
+ 'log_page' => $data['page'] ?? 0,
+ 'log_comment_text' => $data['comment'] ?? '',
'log_comment_data' => null,
'log_params' => $legacy
? LogPage::makeParamBlob( $data['params'] )
: LogEntryBase::makeParamBlob( $data['params'] ),
- 'log_deleted' => isset( $data['deleted'] ) ? $data['deleted'] : 0,
+ 'log_deleted' => $data['deleted'] ?? 0,
];
}
$this->setMwGlobals( 'wgResourceLoaderSources', $case['sources'] );
}
- $extraQuery = isset( $case['extraQuery'] ) ? $case['extraQuery'] : [];
+ $extraQuery = $case['extraQuery'] ?? [];
$context = $this->getResourceLoaderContext( $extraQuery );
$rl = $context->getResourceLoader();
$rl->register( $case['modules'] );
$output->method( 'redirect' )->willReturnCallback(
function ( $url ) use ( &$redirectQuery, &$redirected ) {
$urlParts = wfParseUrl( $url );
- $query = isset( $urlParts[ 'query' ] ) ? $urlParts[ 'query' ] : '';
+ $query = $urlParts[ 'query' ] ?? '';
parse_str( $query, $redirectQuery );
$redirected = true;
}
$params = array_map( 'cssfilter', $_GET );
// Defaults
-$selector = isset( $params['selector'] ) ? $params['selector'] : '.mw-test-example';
-$property = isset( $params['prop'] ) ? $params['prop'] : 'float';
-$value = isset( $params['val'] ) ? $params['val'] : 'right';
+$selector = $params['selector'] ?? '.mw-test-example';
+$property = $params['prop'] ?? 'float';
+$value = $params['val'] ?? 'right';
$wait = isset( $params['wait'] ) ? (int)$params['wait'] : 0; // seconds
sleep( $wait );
$headers = []; // HTTP headers to send
- $fileName = isset( $params['f'] ) ? $params['f'] : '';
+ $fileName = $params['f'] ?? '';
// Backwards compatibility parameters
if ( isset( $params['w'] ) ) {
}
}
- $rel404 = isset( $params['rel404'] ) ? $params['rel404'] : null;
+ $rel404 = $params['rel404'] ?? null;
unset( $params['r'] ); // ignore 'r' because we unconditionally pass File::RENDER
unset( $params['f'] ); // We're done with 'f' parameter.
unset( $params['rel404'] ); // moved to $rel404
if ( $wgShowHostnames ) {
header( 'X-MW-Thumbnail-Renderer: ' . wfHostname() );
$url = htmlspecialchars(
- isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '',
+ $_SERVER['REQUEST_URI'] ?? '',
ENT_NOQUOTES
);
$hostname = htmlspecialchars( wfHostname(), ENT_NOQUOTES );