}
/**
- * T23672: Add Accept-Language to Vary and Key headers if there's no 'variant' parameter in GET.
+ * T23672: Add Accept-Language to Vary header if there's no 'variant' parameter in GET.
*
* For example:
* /w/index.php?title=Main_page will vary based on Accept-Language; but
namespace MediaWiki\Rest;
abstract class Handler {
+ /** @var Router */
+ private $router;
+
/** @var RequestInterface */
private $request;
/**
* Initialise with dependencies from the Router. This is called after construction.
+ * @internal
*/
- public function init( RequestInterface $request, array $config,
+ public function init( Router $router, RequestInterface $request, array $config,
ResponseFactory $responseFactory
) {
+ $this->router = $router;
$this->request = $request;
$this->config = $config;
$this->responseFactory = $responseFactory;
}
+ /**
+ * Get the Router. The return type declaration causes it to raise
+ * a fatal error if init() has not yet been called.
+ */
+ protected function getRouter(): Router {
+ return $this->router;
+ }
+
/**
* Get the current request. The return type declaration causes it to raise
* a fatal error if init() has not yet been called.
* the new URL in the future. 301 redirects tend to get cached and are hard to undo.
* Client behavior for methods other than GET/HEAD is not well-defined and this type
* of response should be avoided in such cases.
- * @param string $target Redirect URL (can be relative)
+ * @param string $target Redirect target (an absolute URL)
* @return Response
*/
public function createPermanentRedirect( $target ) {
return $response;
}
+ /**
+ * Creates a temporary (302) redirect.
+ * HTTP 302 was underspecified and has been superseded by 303 (when the redirected request
+ * should be a GET, regardless of what the current request is) and 307 (when the method should
+ * not be changed), but might still be needed for HTTP 1.0 clients or to match legacy behavior.
+ * @param string $target Redirect target (an absolute URL)
+ * @return Response
+ * @see self::createTemporaryRedirect()
+ * @see self::createSeeOther()
+ */
+ public function createLegacyTemporaryRedirect( $target ) {
+ $response = $this->createRedirectBase( $target );
+ $response->setStatus( 302 );
+ return $response;
+ }
+
/**
* Creates a temporary (307) redirect.
* This indicates that the operation the client was trying to perform can temporarily
* be achieved by using a different URL. Clients will preserve the request method when
* retrying the request with the new URL.
- * @param string $target Redirect URL (can be relative)
+ * @param string $target Redirect target (an absolute URL)
* @return Response
*/
public function createTemporaryRedirect( $target ) {
* This indicates that the target resource might be of interest to the client, without
* necessarily implying that it is the same resource. The client will always use GET
* (or HEAD) when following the redirection. Useful for GET-after-POST.
- * @param string $target Redirect URL (can be relative)
+ * @param string $target Redirect target (an absolute URL)
* @return Response
*/
public function createSeeOther( $target ) {
$spec = $match['userData'];
$objectFactorySpec = array_intersect_key( $spec,
[ 'factory' => true, 'class' => true, 'args' => true ] );
+ /** @var $handler Handler (annotation for PHPStorm) */
$handler = ObjectFactory::getObjectFromSpec( $objectFactorySpec );
- $handler->init( $request, $spec, $this->responseFactory );
+ $handler->init( $this, $request, $spec, $this->responseFactory );
try {
return $this->executeHandler( $handler );
"apihelp-query+languageinfo-summary": "Devolver información sobre los idiomas disponibles.",
"apihelp-query+languageinfo-paramvalue-prop-code": "El código lingüístico (es específico de MediaWiki, pero existen coincidencias con otras normas.)",
"apihelp-query+languageinfo-paramvalue-prop-dir": "La dirección de escritura del idioma (bien <code>ltr</code> o bien <code>rtl</code>).",
+ "apihelp-query+languageinfo-example-simple": "Obtener los códigos lingüísticos de todos los idiomas admitidos.",
"apihelp-query+languageinfo-example-autonym-name-de": "Obtener los endónimos y los nombres alemanes de todos los idiomas compatibles.",
"apihelp-query+languageinfo-example-fallbacks-variants-oc": "Obtener los idiomas de reserva y las variantes del occitano.",
"apihelp-query+languageinfo-example-bcp47-dir": "Obtener el código lingüístico BCP-47 y la dirección de todos los idiomas compatibles.",
"api-help-param-deprecated": "En desuso.",
"api-help-param-required": "Este parámetro es obligatorio.",
"api-help-datatypes-header": "Tipos de datos",
- "api-help-datatypes": "Las entradas en MediaWiki deberían estar en UTF-8 según la norma NFC. MediaWiki puede tratar de convertir otros formatos, pero esto puede provocar errores en algunas operaciones (tales como las [[Special:ApiHelp/edit|ediciones]] con controles MD5).\n\nAlgunos tipos de parámetros en las solicitudes de API requieren de una explicación más detallada:\n;boolean\n:Los parámetros booleanos trabajo como cajas de verificación de HTML: si el parámetro está definido, independientemente de su valor, se considera verdadero. Para un valor falso, se debe omitir el parámetro por completo.\n;marca de tiempo\n:Las marcas de tiempo se pueden definir en varios formatos. Se recomienda seguir la norma ISO 8601 de fecha y hora. Todas las horas están en UTC, ignorándose cualquier indicación de zona horaria.\n:* Fecha y hora en ISO 8601, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (los signos de puntuación y la <kbd>Z</kbd> son opcionales)\n:* Fecha y hora en ISO 8601 con fracciones de segundo (que se omiten), <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (los guiones, los dos puntos y la <kbd>Z</kbd> son opcionales)\n:* Formato MediaWiki, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Formato genérico de número, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (la zona horaria opcional, sea <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd> o <kbd>-<var>##</var></kbd> se omite)\n:* Formato EXIF, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*Formato RFC 2822 (la zona horaria es opcional), <kbd><var>lun</var>, <var>15</var> <var>ene</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato RFC 850 (la zona horaria es opcional), <kbd><var>lunes</var>, <var>15</var>-<var>ene</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato ctime de C, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* Número de segundos desde 1970-01-01T00:00:00Z en forma de número entero de entre 1 y 13 cifras (sin <kbd>0</kbd>)\n:* La cadena <kbd>now</kbd>\n\n;separador alternativo de valores múltiples\n:Los parámetros que toman valores múltiples se envían normalmente utilizando la barra vertical para separar los valores, p. ej., <kbd>param=valor1|valor2</kbd> o <kbd>param=valor1%7Cvalor2</kbd>. Si un valor tiene que contener el carácter de barra vertical, utiliza U+001F (separador de unidades) como separador ''y'' prefija el valor con, p. ej. <kbd>param=%1Fvalor1%1Fvalor2</kbd>.",
+ "api-help-datatypes": "El formato de entrada de MediaWiki debe ser UTF-8 normalizado por NFC. MediaWiki puede intentar convertir otros formatos, pero ello podría causar que algunas operaciones, como las [[Special:ApiHelp/edit|ediciones]] con comprobaciones MD5, fallen.\n\nAlgunos tipos de parámetros para las solicitudes de API requieren una explicación más a fondo:\n;boolean\n:Los parámetros booleanos funcionan como las casillas de verificación en HTML: si se especifica el parámetro, sin importar su valor, se considera verdadero. Para un valor falso, omítase el parámetro completamente.\n;timestamp\n:Los cronomarcadores pueden especificarse en varios formatos; para obtener detalles, consúltense [[mw:Special:MyLanguage/Timestamp|los formatos de entrada de la biblioteca Timestamp documentados en mediawiki.org]]. Se recomienda el formato ISO 8601: <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd>. Además, es posible utilizar la cadena <kbd>now</kbd> para especificar la fecha y la hora actuales.\n;separador alternativo para valores múltiples\n:Normalmente, los parámetros que reciben varios valores se envían con estos separados por una pleca; p. ej., <kbd>parámetro=valor1|valor2</kbd> o <kbd>parámetro=valor1%7Cvalor2</kbd>. Si un valor debe contener una pleca, utilícese U+001F (separador de unidades) como el separador ''y'' prefíjese el valor con U+001F; p. ej., <kbd>parámetro=%1Fvalor1%1Fvalor2</kbd>.",
"api-help-param-type-limit": "Tipo: entero o <kbd>max</kbd>",
"api-help-param-type-integer": "Tipo: {{PLURAL:$1|1=entero|2=lista de enteros}}",
"api-help-param-type-boolean": "Tipo: booleano/lógico ([[Special:ApiHelp/main#main/datatypes|detalles]])",
$states[$name] = 'missing';
}
- // Generate output
- $isRaw = false;
-
$filter = $context->getOnly() === 'styles' ? 'minify-css' : 'minify-js';
foreach ( $modules as $name => $module ) {
$states[$name] = 'error';
unset( $modules[$name] );
}
- $isRaw |= $module->isRaw();
}
// Update module states
- if ( $context->shouldIncludeScripts() && !$context->getRaw() && !$isRaw ) {
- if ( count( $modules ) && $context->getOnly() === 'scripts' ) {
+ if ( $context->shouldIncludeScripts() && !$context->getRaw() ) {
+ if ( $modules && $context->getOnly() === 'scripts' ) {
// Set the state of modules loaded as only scripts to ready as
// they don't have an mw.loader.implement wrapper that sets the state
foreach ( $modules as $name => $module ) {
}
// Set the state of modules we didn't respond to with mw.loader.implement
- if ( count( $states ) ) {
+ if ( $states ) {
$stateScript = self::makeLoaderStateScript( $states );
if ( !$context->getDebug() ) {
$stateScript = self::filter( 'minify-js', $stateScript );
private static function makeContext( ResourceLoaderContext $mainContext, $group, $type,
array $extraQuery = []
) {
- // Create new ResourceLoaderContext so that $extraQuery may trigger isRaw().
+ // Create new ResourceLoaderContext so that $extraQuery is supported (eg. for 'sync=1').
$req = new FauxRequest( array_merge( $mainContext->getRequest()->getValues(), $extraQuery ) );
// Set 'only' if not combined
$req->setVal( 'only', $type === ResourceLoaderModule::TYPE_COMBINED ? null : $type );
);
}
} else {
- // See if we have one or more raw modules
- $isRaw = false;
- foreach ( $moduleSet as $key => $module ) {
- $isRaw |= $module->isRaw();
- }
-
// Special handling for the user group; because users might change their stuff
// on-wiki like user pages, or user preferences; we need to find the highest
// timestamp of these user-changeable modules so we can ensure cache misses on change
// Decide whether to use 'style' or 'script' element
if ( $only === ResourceLoaderModule::TYPE_STYLES ) {
$chunk = Html::linkedStyle( $url );
- } elseif ( $context->getRaw() || $isRaw ) {
+ } elseif ( $context->getRaw() ) {
+ // This request is asking for the module to be delivered standalone,
+ // (aka "raw") without communicating to any mw.loader client.
+ // Use cases:
+ // - startup (naturally because this is what will define mw.loader)
+ // - html5shiv (loads synchronously in old IE before the async startup module arrives)
+ // - QUnit (needed in SpecialJavaScriptTest before async startup)
$chunk = Html::element( 'script', [
- // In SpecialJavaScriptTest, QUnit must load synchronous
+ // The 'sync' option is only supported in combination with 'raw'.
'async' => !isset( $extraQuery['sync'] ),
'src' => $url
] );
}
return $this->hash;
}
+
+ /**
+ * Get the request base parameters, omitting any defaults.
+ *
+ * @internal For internal use by ResourceLoaderStartUpModule only
+ * @return array
+ */
+ public function getReqBase() {
+ $reqBase = [];
+ if ( $this->getLanguage() !== self::DEFAULT_LANG ) {
+ $reqBase['lang'] = $this->getLanguage();
+ }
+ if ( $this->getSkin() !== self::DEFAULT_SKIN ) {
+ $reqBase['skin'] = $this->getSkin();
+ }
+ if ( $this->getDebug() ) {
+ $reqBase['debug'] = 'true';
+ }
+ return $reqBase;
+ }
}
/** @var bool Link to raw files in debug mode */
protected $debugRaw = true;
- /** @var bool Whether mw.loader.state() call should be omitted */
- protected $raw = false;
-
protected $targets = [ 'desktop' ];
/** @var bool Whether CSSJanus flipping should be skipped for this module */
break;
// Single booleans
case 'debugRaw':
- case 'raw':
case 'noflip':
$this->{$member} = (bool)$option;
break;
return $contents;
}
- /**
- * @return bool
- */
- public function isRaw() {
- return $this->raw;
- }
-
/**
* Disable module content versioning.
*
'templates',
'skipFunction',
'debugRaw',
- 'raw',
] as $member ) {
$options[$member] = $this->{$member};
}
|| $this->dependencies
|| $this->messages
|| $this->skipFunction
- || $this->raw
);
return $canBeStylesOnly ? self::LOAD_STYLES : self::LOAD_GENERAL;
}
return 'local';
}
- /**
- * Whether this module's JS expects to work without the client-side ResourceLoader module.
- * Returning true from this function will prevent mw.loader.state() call from being
- * appended to the bottom of the script.
- *
- * @return bool
- */
- public function isRaw() {
- return false;
- }
-
/**
* Get a list of modules this module depends on.
*
continue;
}
- if ( $module->isRaw() ) {
- // Don't register "raw" modules (like 'startup') client-side because depending on them
- // is illegal anyway and would only lead to them being loaded a second time,
- // causing any state to be lost.
+ if ( $module instanceof ResourceLoaderStartUpModule ) {
+ // Don't register 'startup' to the client because loading it lazily or depending
+ // on it doesn't make sense, because the startup module *is* the client.
+ // Registering would be a waste of bandwidth and memory and risks somehow causing
+ // it to load a second time.
// ATTENTION: Because of the line below, this is not going to cause infinite recursion.
// Think carefully before making changes to this code!
return $out;
}
- /**
- * @return bool
- */
- public function isRaw() {
- return true;
- }
-
/**
* @private For internal use by SpecialJavaScriptTest
* @since 1.32
// Perform replacements for mediawiki.js
$mwLoaderPairs = [
+ '$VARS.reqBase' => ResourceLoader::encodeJsonForScript( $context->getReqBase() ),
'$VARS.baseModules' => ResourceLoader::encodeJsonForScript( $this->getBaseModules() ),
'$VARS.maxQueryLength' => ResourceLoader::encodeJsonForScript(
$conf->get( 'ResourceLoaderMaxQueryLength' )
$headers = [];
foreach ( $this->getProviders() as $provider ) {
foreach ( $provider->getVaryHeaders() as $header => $options ) {
- if ( !isset( $headers[$header] ) ) {
- $headers[$header] = [];
- }
- if ( is_array( $options ) ) {
- $headers[$header] = array_unique( array_merge( $headers[$header], $options ) );
- }
+ # Note that the $options value returned has been deprecated
+ # and is ignored.
+ $headers[$header] = null;
}
}
$this->varyHeaders = $headers;
* }
* @endcode
*
+ * Note that the $options argument to OutputPage::addVaryHeader() has
+ * been deprecated and should always be null.
+ *
* @return array
*/
public function getVaryHeaders();
}
/**
- * Returns wiki text showing the third party software versions (apache, php, mysql).
+ * @since 1.34
*
- * @return string
+ * @return array
*/
- public static function softwareInformation() {
+ public static function getSoftwareInformation() {
$dbr = wfGetDB( DB_REPLICA );
// Put the software in an array of form 'name' => 'version'. All messages should
// be loaded here, so feel free to use wfMessage in the 'name'. Raw HTML or
// wikimarkup can be used.
- $software = [];
- $software['[https://www.mediawiki.org/ MediaWiki]'] = self::getVersionLinked();
+ $software = [
+ '[https://www.mediawiki.org/ MediaWiki]' => self::getVersionLinked()
+ ];
+
if ( wfIsHHVM() ) {
$software['[https://hhvm.com/ HHVM]'] = HHVM_VERSION . " (" . PHP_SAPI . ")";
} else {
$software['[https://php.net/ PHP]'] = PHP_VERSION . " (" . PHP_SAPI . ")";
}
+
$software[$dbr->getSoftwareLink()] = $dbr->getServerInfo();
if ( defined( 'INTL_ICU_VERSION' ) ) {
// Allow a hook to add/remove items.
Hooks::run( 'SoftwareInfo', [ &$software ] );
+ return $software;
+ }
+
+ /**
+ * Returns HTML showing the third party software versions (apache, php, mysql).
+ *
+ * @return string HTML table
+ */
+ public static function softwareInformation() {
$out = Xml::element(
'h2',
[ 'id' => 'mw-version-software' ],
wfMessage( 'version-software' )->text()
) .
- Xml::openElement( 'table', [ 'class' => 'wikitable plainlinks', 'id' => 'sv-software' ] ) .
- "<tr>
- <th>" . wfMessage( 'version-software-product' )->text() . "</th>
- <th>" . wfMessage( 'version-software-version' )->text() . "</th>
- </tr>\n";
+ Xml::openElement( 'table', [ 'class' => 'wikitable plainlinks', 'id' => 'sv-software' ] ) .
+ "<tr>
+ <th>" . wfMessage( 'version-software-product' )->text() . "</th>
+ <th>" . wfMessage( 'version-software-version' )->text() . "</th>
+ </tr>\n";
- foreach ( $software as $name => $version ) {
+ foreach ( self::getSoftwareInformation() as $name => $version ) {
$out .= "<tr>
<td>" . $name . "</td>
<td dir=\"ltr\">" . $version . "</td>
"restrictionsfield-help": "عنوان أيبي أو نطاق CIDR واحد لكل سطر. لتفعيل كل شيء، استخدم:\n<pre>0.0.0.0/0\n::/0</pre>",
"edit-error-short": "خطأ: $1",
"edit-error-long": "الأخطاء:\n\n$1",
+ "specialmute": "كتم الصوت",
+ "specialmute-success": "تم تحديث تفضيلات كتم الصوت بنجاح، شاهد كل المستخدمين الصامتين في [[Special:Preferences]].",
+ "specialmute-submit": "تأكيد",
+ "specialmute-label-mute-email": "كتم رسائل البريد الإلكتروني من هذا المستخدم",
+ "specialmute-header": "يُرجَى تحديد تفضيلات كتم الصوت لـ{{BIDI:[[User:$1]]}}.",
+ "specialmute-error-invalid-user": "لا يمكن العثور على اسم المستخدم المطلوب.",
+ "specialmute-error-email-blacklist-disabled": "لم يتم تمكين كتم المستخدمين من إرسال رسائل البريد الإلكتروني إليك.",
+ "specialmute-error-email-preferences": "يجب تأكيد عنوان بريدك الإلكتروني قبل أن تتمكن من كتم صوت المستخدم، يمكنك القيام بذلك من [[Special:Preferences]].",
+ "specialmute-email-footer": "[$1 إدارة تفضيلات البريد الإلكتروني لـ{{BIDI:$2}}.]",
+ "specialmute-login-required": "يُرجَى تسجيل الدخول لتغيير تفضيلات الصمت الخاصة بك.",
"revid": "المراجعة $1",
"pageid": "معرف الصفحة $1",
"interfaceadmin-info": "$1\n\nتم فصل صلاحيات تحرير ملفات CSS/JS/JSON على مستوى الموقع مؤخرً من صلاحية <code>editinterface</code>، إذا لم تفهم سبب حصولك على هذا الخطأ، فراجع [[mw:MediaWiki_1.32/interface-admin]].",
"restrictionsfield-help": "Адзін IP-адрас ці CIDR-дыяпазон на радок. Каб дазволіць усё, ужывайце:<pre>0.0.0.0/0\n::/0</pre>",
"edit-error-short": "Памылка: $1",
"edit-error-long": "Памылкі:\n\n$1",
+ "specialmute": "Заглушаныя ўдзельнікі",
"revid": "вэрсія $1",
"pageid": "Ідэнтыфікатар старонкі $1",
"interfaceadmin-info": "$1\n\nДазволы на рэдагаваньне агульнасайтавых CSS/JS/JSON-файлаў былі нядаўна вылучаныя з права <code>editinterface</code>. Калі вы не разумееце, чаму атрымліваеце гэтую памылку, глядзіце [[mw:MediaWiki_1.32/interface-admin]].",
"credentialsform-account": "Kontonavn:",
"edit-error-short": "Fejl: $1",
"edit-error-long": "Fejl:\n\n$1",
+ "specialmute-submit": "Bekræft",
"revid": "version $1",
"pageid": "side id: $1",
"gotointerwiki": "Forlader {{SITENAME}}",
"deletionlog": "Καταγραφές διαγραφών",
"log-name-create": "Αρχείο καταγραφών δημιουργίας σελίδων",
"log-description-create": "Παρακάτω υπάρχει ένας κατάλογος των πιο πρόσφατων δημιουργιών σελίδας.",
- "logentry-create-create": "$1 δημιούργησε τη σελίδα $3",
+ "logentry-create-create": "{{GENDER:$2|Ο|Η}} $1 δημιούργησε τη σελίδα $3",
"reverted": "Επαναφορά σε προηγούμενη αναθεώρηση",
"deletecomment": "Λόγος:",
"deleteotherreason": "Άλλος/πρόσθετος λόγος:",
"restrictionsfield-help": "Unu IP-adreso aŭ CIDR-intervalo per linio. Por permesigi ĉion, uzu:<pre>0.0.0.0/0</code>\n<code>::/0</pre>",
"edit-error-short": "Eraro: $1",
"edit-error-long": "Eraroj:\n\n$1",
+ "specialmute": "Silentigi",
+ "specialmute-submit": "Konfirmi",
+ "specialmute-label-mute-email": "Kaŝi retmesaĝojn el ĉi tiu uzanto",
+ "specialmute-error-invalid-user": "La petita uzantnomo ne troviĝis.",
+ "specialmute-email-footer": "[$1 Administri preferojn pri retpoŝto por {{BIDI:$2}}.]",
"revid": "revizio $1",
"pageid": "Identigilo de paĝo $1",
"interfaceadmin-info": "$1\n\nPermesoj pri redaktado de tut-retejaj CSS/JavaScript/JSON-dosieroj estis lastatempe disigitaj for de la rajto <code>editinterface</code>. Se vi ne komprenas kial vi ricevis ĉi tiun eraron, vidu la paĝon [[mw:MediaWiki_1.32/interface-admin]].",
"history": "Historial",
"history_short": "Historial",
"history_small": "historial",
- "updatedmarker": "actualizado desde mi última visita",
+ "updatedmarker": "actualizado desde tu última visita",
"printableversion": "Versión para imprimir",
"permalink": "Enlace permanente",
"print": "Imprimir",
"restrictionsfield-help": "Una dirección IP o intervalo de CIDR por renglón. Para activarlo todo, utiliza <pre>0.0.0.0/0\n::/0</pre>",
"edit-error-short": "Error: $1",
"edit-error-long": "Errores:\n\n$1",
+ "specialmute": "Silenciar",
+ "specialmute-submit": "Confirmar",
+ "specialmute-error-invalid-user": "No se encontró el nombre de usuario solicitado.",
"revid": "revisión $1",
"pageid": "ID de página $1",
"interfaceadmin-info": "$1\n\nLos permisos para editar los archivos con formato CSS, JS y JSON en todo el sitio han sido recientemente separados del permiso <code>editinterface</code>. Si no comprendes por qué recibes este error, por favor lee [[mw:MediaWiki_1.32/interface-admin]].",
"exif-make": "ഛായാഗ്രാഹി നിർമ്മാതാവ്",
"exif-model": "ഛായാഗ്രാഹി മോഡൽ",
"exif-software": "ഉപയോഗിച്ച സോഫ്റ്റ്വെയർ",
- "exif-artist": "ഛായാഗ്രാഹകൻ",
+ "exif-artist": "ഛായാഗ്രാഹക(ൻ)",
"exif-copyright": "പകർപ്പവകാശ ഉടമ",
"exif-exifversion": "എക്സിഫ് (Exif) പതിപ്പ്",
"exif-flashpixversion": "പിന്തുണയുള്ള ഫ്ലാഷ്പിക്സ് പതിപ്പ്",
"history": "تاریخچهٔ صفحه",
"history_short": "تاریخچه",
"history_small": "تاریخچه",
- "updatedmarker": "بهروزشده از آخرین باری که سرزدهام",
+ "updatedmarker": "بهروزشده از آخرین باری که سرزدهاید",
"printableversion": "نسخهٔ قابل چاپ",
"permalink": "پیوند پایدار",
"print": "چاپ",
"autoblockedtext": "دسترسی نشانی آیپی شما قطع شدهاست، زیرا این نشانی آیپی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شدهاست.\nدلیل ارائهشده چنین است:\n\n:''$2''\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما میتوانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمیتوانید از قابلیت «{{int:emailuser}}» استفاده کنید مگر آنکه نشانی ایمیل معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این قابلیت برای شما قطع نشده باشد.\nنشانی آیپی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواستهایی که در این باره مطرح میکنید ذکر کنید.",
"systemblockedtext": "نام کاربری یا نشانی آیپی شما خودکار توسط مدیاویکی مسدود شدهاست.\nدلیل ارائهشده:\n\n:<em>$2</em>\n\n* آغاز بلاک: $8\n* پایان بلاک: $6\n* قطع دسترسیشده مورد نظر: $7\n\nنشانی آیپی کنونی شما $3 است.\nخواهشمند است تمام جزئیات بالا را در هر پرسوجویی که انجام میدهید قرار دهید.",
"blockednoreason": "دلیلی مشخص نشدهاست",
+ "blockedtext-composite": "<strong>نام کاربری یا نشانی آیپی شما خودکار توسط مدیاویکی مسدود شدهاست.</strong>\nدلیل ارائهشده:\n\n:<em>$2</em>\n\n* آغاز بلاک: $8\n* پایان بلاک: $6\n\nنشانی آیپی کنونی شما $3 است.\nخواهشمند است تمام جزئیات بالا را در هر پرسوجویی که انجام میدهید قرار دهید.",
+ "blockedtext-composite-reason": "حساب/آیپی شما به چند طریق بسته شدهاست",
"whitelistedittext": "برای ویرایش مقالهها باید $1.",
"confirmedittext": "شما باید، پیش از ویرایش صفحات، آدرس ایمیل خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.",
"nosuchsectiontitle": "چنین بخشی پیدا نشد",
"restrictionsfield-help": "یک نشانی آیپی یا بازهٔ سیآیدیار در هر خط وارد کنید. برای فعال کردن همهچیز، این مقدار را استفاده کنید: <code>0.0.0.0/0</code><br /><code>::/0</code>",
"edit-error-short": "خطا: $1",
"edit-error-long": "خطاها:\n\n$1",
+ "specialmute": "بیصدا",
+ "specialmute-success": "تنظیمات بیصدا به روز شد. دیدن فهرست همهٔ کاربرانی که در [[Special:Preferences|ترجیحاتتان]] به عنوان بیصدا انتخاب کردید.",
+ "specialmute-submit": "تأیید",
+ "specialmute-label-mute-email": "بیصدا کردن ایمیل از این کاربر",
+ "specialmute-header": "لطفاً ترجیحات بیصدا برای {{BIDI:[[User:$1]]}} را انتخاب کنید.",
+ "specialmute-error-invalid-user": "نام کاربری درخواست شده یافت نشد.",
+ "specialmute-error-email-blacklist-disabled": "بیصدا کردن کاربران برای ارسال ایمیل فعال نشدهاست.",
+ "specialmute-error-email-preferences": "پیش از بیصدا کردن دیگر کاربران باید آدرس ایمیلیتان را تائید کنید. که از [[Special:Preferences|ترجیحاتتان]] مقدور است.",
+ "specialmute-email-footer": "[$1 مدیریت ترجیحات ایمیل برای {{BIDI:$2}}.]",
+ "specialmute-login-required": "لطفاً برای تغییر ترجیحات بیصدا به سامانه وارد شوید.",
"revid": "نسخهٔ $1",
"pageid": "شناسهٔ صفحهٔ $1",
"interfaceadmin-info": "\n$1\n\nدسترسیها برای ویرایش فایلهای CSS/JS/JSON که اخیراً از دسترسی <code>editinterface</code> جدا شدهاند. اگر نمی دانید که چرا این خطا رخ دادهاست [[mw:MediaWiki_1.32/interface-admin]] را مطالعه کنید.",
"rcfilters-filter-previousrevision-label": "Net de lêste ferzje",
"rcfilters-filter-previousrevision-description": "Alle wizigings dy't net de \"lêste ferzje\" binne.",
"rcfilters-filter-excluded": "Utsein",
+ "rcfilters-tag-prefix-namespace-inverted": "<strong>:net</strong> $1",
"rcfilters-exclude-button-off": "Seleksje omkeare",
"rcfilters-exclude-button-on": "Omkearde seleksje",
"rcfilters-view-tags": "Lebele bewurkings",
"restrictionsfield-help": "Egy IP-cím vagy CIDR-tartomány soronként. Minden engedélyezéséhez használd a következő tartományokat:\n<pre>\n0.0.0.0/0\n::/0\n</pre>",
"edit-error-short": "Hiba: $1",
"edit-error-long": "Hibák:\n\n$1",
+ "specialmute": "Némítás",
+ "specialmute-submit": "Megerősítés",
+ "specialmute-label-mute-email": "E-mailek némítása ettől a felhasználótól",
+ "specialmute-error-invalid-user": "A kért felhasználónév nem található.",
+ "specialmute-error-email-blacklist-disabled": "Felhasználók e-mailküldési lehetőségének némítása nincs bekapcsolva.",
+ "specialmute-error-email-preferences": "Először meg kell erősítened az e-mail-címedet, mielőtt lenémíthatnál egy felhasználót. Ezt a [[Special:Preferences]] oldalon tudod megtenni.",
+ "specialmute-email-footer": "[$1 {{BIDI:$2}} e-mail beállításainak kezelése.]",
+ "specialmute-login-required": "Kérjük, jelentkezz be a némítási beállításaid módosításához.",
"revid": "$1 változat",
"pageid": "$1 lapazonosító",
"interfaceadmin-info": "$1\n\nA CSS/JS/JSON lapok szerkesztéséhez szükséges jogosultság a közelmúltban elválasztásra került a <code>editinterface</code> jogtól. Amennyiben nem érted, miért látod ezt az üzenetet, [[mw:MediaWiki_1.32/interface-admin|itt tudhatsz meg többet]].",
"restrictionsfield-help": "Un indirizzo IP o intervallo CIDR per linea. Per consentire tutto, utilizza:<pre>0.0.0.0/0\n::/0</pre>",
"edit-error-short": "Errore: $1",
"edit-error-long": "Errori:\n\n$1",
+ "specialmute": "Muto",
+ "specialmute-submit": "Conferma",
+ "specialmute-error-invalid-user": "Impossibile trovare il nome utente richiesto.",
"revid": "versione $1",
"pageid": "ID della pagina $1",
"rawhtml-notallowed": "I tag <html> non possono essere utilizzati al di fuori delle normali pagine.",
"restrictionsfield-help": "줄 단위의 하나의 IP 주소 또는 CIDR 대역입니다. 모든 곳에 적용하려면, 다음을 사용하세요:<pre>0.0.0.0/0\n::/0</pre>",
"edit-error-short": "오류: $1",
"edit-error-long": "오류:\n\n$1",
+ "specialmute": "알림 미표시",
+ "specialmute-success": "알림 미표시 환경 설정이 성공적으로 업데이트되었습니다. [[Special:Preferences]]에서 알림이 표시되지 않는 모든 사용자를 확인하십시오.",
+ "specialmute-submit": "확인",
+ "specialmute-label-mute-email": "이 사용자의 이메일 알림을 표시하지 않습니다",
+ "specialmute-header": "{{BIDI:[[User:$1]]}}의 알림 미표시 환경 설정을 선택해 주십시오.",
+ "specialmute-error-invalid-user": "요청한 사용자 이름을 찾을 수 없습니다.",
+ "specialmute-error-email-blacklist-disabled": "이메일 보내기로부터 사용자 알림 미표시가 활성화되어 있지 않습니다.",
+ "specialmute-error-email-preferences": "사용자의 알림을 미표시 처리하기 전에 이메일 주소를 확인해야 합니다. [[Special:Preferences]]에서 이 작업을 할 수 있습니다.",
+ "specialmute-email-footer": "[$1 {{BIDI:$2}}의 이메일 환경 설정을 관리합니다.]",
+ "specialmute-login-required": "알림 미표시 환경 설정을 변경하려면 로그인해 주십시오.",
"revid": "$1 판",
"pageid": "페이지 ID $1",
"interfaceadmin-info": "$1\n\n사이트 전체에 쓰이는 CSS/JS/JSON 파일의 편집 권한이 최근 <code>editinterface</code> 권한에서 분리되었습니다. 왜 이 오류가 발생하는지 이해가 되지 않는다면, [[mw:MediaWiki_1.32/interface-admin]]을 참고하십시오.",
"restrictionsfield-label": "Zougeloossen IP-Beräicher:",
"edit-error-short": "Feeler: $1",
"edit-error-long": "Feeler:\n\n$1",
+ "specialmute": "Toun aus",
+ "specialmute-submit": "Confirméieren",
+ "specialmute-error-invalid-user": "De Gefrote Benotzernumm gouf net fonnt.",
"revid": "Versioun $1",
"gotointerwiki": "{{SITENAME}} verloossen",
"gotointerwiki-invalid": "De spezifizéierten Titel ass net valabel.",
"restrictionsfield-help": "Една IP-адреса или CIDR-опсег по ред. За да овозможите сè, користете<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
"edit-error-short": "Грешка: $1",
"edit-error-long": "Грешки:\n\n$1",
+ "specialmute": "Искл. известувања",
+ "specialmute-success": "Промените се успешно направени. Погледајте ги сите исклучени корисници на [[Special:Preferences]].",
+ "specialmute-submit": "Потврди",
+ "specialmute-label-mute-email": "Исклучи е-пошта од корисников",
+ "specialmute-header": "Изберете поставки за известувања од {{BIDI:[[User:$1]]}}.",
+ "specialmute-error-invalid-user": "Не можев да го најдам корисничкото име.",
+ "specialmute-error-email-blacklist-disabled": "Исклучувањето на е-пошта од корисници не е овозможено.",
+ "specialmute-error-email-preferences": "Ќе мора да ја потврдите вашата е-пошта пред да исклучите известувања од други. Тоа се прави на страницата [[Special:Preferences]].",
+ "specialmute-email-footer": "[$1 Раководење со поставки за е-пошта од {{BIDI:$2}}.]",
+ "specialmute-login-required": "Најавете се за да ги направите промените.",
"revid": "преработка $1",
"pageid": "назнака на страницата $1",
"interfaceadmin-info": "$1\n\nДозволите за уредување на CSS/JS/JSON податотеки низ цело вики неодамна се одвоени од правото <code>editinterface</code>. Ако не разбирате зошто ја добивате оваа грешка, погл. [[mw:MediaWiki_1.32/interface-admin]].",
"restrictionsfield-help": "Een IP-adres of CIDR bereik per lijn. Om alles toe te staan, gebruik:<pre>0.0.0.0/0\n::/0</pre>",
"edit-error-short": "Fout: $1",
"edit-error-long": "Fouten:\n\n$1",
+ "specialmute": "Negeren",
+ "specialmute-success": "Het bijwerken van uw voorkeur voor het negeren is geslaagd. Bekijk een lijst met alle genegeerde gebruikers in [[Special:Preferences|uw voorkeuren]].",
+ "specialmute-submit": "Bevestig",
+ "specialmute-label-mute-email": "Negeer e-mails van deze gebruiker",
+ "specialmute-header": "Selecteer uw voorkeur voor het negeren van {{BIDI:[[User:$1]]}}.",
+ "specialmute-error-invalid-user": "De ingevoerde gebruikersnaam kon niet worden gevonden.",
+ "specialmute-error-email-blacklist-disabled": "Het negeren van e-mails verstuurd door andere gebruikers is niet ingeschakeld.",
+ "specialmute-error-email-preferences": "U moet uw e-mailadres bevestigen voordat u een gebruiker kunt negeren. U kunt dit doen in [[Special:Preferences|uw voorkeuren]].",
+ "specialmute-email-footer": "[$1 E-mail voorkeuren beheren voor {{BIDI:$2}}.]",
+ "specialmute-login-required": "U moet aanmelden om voorkeuren voor het negeren van gebruikers in te stellen.",
"revid": "versie $1",
"pageid": "Pagina-ID $1",
"interfaceadmin-info": "$1\n\nRechten voor het bewerken van wikibrede CSS/JS/JSON-bestanden zijn recentelijk gescheiden van het <code>editinterface</code> recht. Als u niet begrijpt waarom u deze foutmelding te zien krijgt, ga dan naar [[mw:MediaWiki_1.32/interface-admin]].",
"rcfilters-quickfilters": "ߞߎ߲߬ߕߐ߰ ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲ ߠߎ߬",
"rcfilters-quickfilters-placeholder-title": "ߛߌ߲ߘߌߣߍ߲ ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲߬ ߕߍ߫ ߡߎߣߎ߲߬",
"rcfilters-savedqueries-defaultlabel": "ߞߎ߲߬ߕߐ߰ ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲ ߠߎ߬",
+ "rcfilters-savedqueries-rename": "ߊ߬ ߕߐ߯ߟߊ߫",
+ "rcfilters-savedqueries-setdefault": "ߊ߬ ߞߍ߫ ߓߐߛߎ߲ ߘߌ߫",
+ "rcfilters-savedqueries-unsetdefault": "ߊ߬ ߓߐ߫ ߓߐߛߎ߲ ߘߐ߫",
+ "rcfilters-savedqueries-remove": "ߊ߬ ߖߏ߰ߛߌ߬",
+ "rcfilters-savedqueries-new-name-label": "ߕߐ߮",
+ "rcfilters-savedqueries-cancel-label": "ߊ߬ ߘߐߛߊ߬",
"rcfilters-filterlist-whatsthis": "ߣߌ߲߬ ߦߋ߫ ߓߊ߯ߙߊ߫ ߟߊ߫ ߘߌ߬؟",
"rcfilters-highlightbutton-title": "ߞߐߝߟߌ߫ ߡߊߦߋߙߋ߲ߣߍ߲ ߠߎ߬",
"rcfilters-highlightmenu-title": "ߞߐ߬ߟߐ ߘߏ߫ ߓߊߓߌ߬ߟߊ߬",
"boteditletter": "ߓ",
"rc-change-size-new": "$1 {{PLURAL:$1|ߝߌ߬ߘߊ߲|ߝߌ߬ߘߊ߲ ߠߎ߬}} ߢߟߊߞߎߘߦߊ ߞߐ߫",
"newsectionsummary": "/* $1 */ ߞߣߐߘߐ߫ ߞߎߘߊ߫",
+ "rc-enhanced-expand": "ߝߊߙߊ߲ߝߊ߯ߛߌ ߟߎ߬ ߦߌ߬ߘߊ߬",
+ "rc-enhanced-hide": "ߝߊߙߊ߲ߝߊ߯ߛߌ ߟߎ߬ ߢߡߊߘߏ߲߰",
"rc-old-title": "ߊ߬ ߓߊߞߘߐ ߟߊߘߊ߲߫ ߣߍ߲߫ ߦߋ߫ ߕߊ߲߬ ߠߋ߫ \"$1\"",
"recentchangeslinked": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߜߋ߲߬ߞߘߎ߬ߢߐ߲߰ߡߊ ߟߎ߬",
"recentchangeslinked-toolbox": "ߢߟߊߞߎߘߦߊߟߌ߫ ߜߋ߲߬ߞߘߎ߬ߡߊ ߟߎ߬",
"recentchangeslinked-page": "ߞߐߜߍ ߕߐ߮:",
"recentchangeslinked-to": "ߞߐߜߍ ߛߘߌ߬ߜߋ߲ ߠߎ߬ ߦߌ߬ߘߊ߬߸ ߞߊ߬ ߞߐߜߍ ߣߌ߬ ߞߋߟߋ߲ߘߌ߫",
"upload": "ߞߐߕߐ߮ ߟߊߦߟߍ",
+ "uploadbtn": "ߞߐߕߐ߮ ߟߊߦߟߍ߬",
"uploadlogpage": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߘߏ߫ ߟߊߦߟߍ߬",
"filename": "ߞߐߕߐ߮ ߕߐ߮",
"filedesc": "ߟߊߘߛߏߣߍ߲",
"restrictionsfield-help": "Jeden adres IP lub zakres CIDR w wierszu. Aby zaznaczyć wszystkie, użyj:<pre>0.0.0.0/0\n::/0</pre>",
"edit-error-short": "Błąd: $1",
"edit-error-long": "Błędy:\n\n$1",
+ "specialmute": "Ignoruj",
+ "specialmute-success": "Twoje preferencje ignorowania zostały pomyślnie zaktualizowane. Zobacz wszystkich ignorowanych użytkowników w [[Special:Preferences|preferencjach]].",
+ "specialmute-submit": "Potwierdź",
+ "specialmute-label-mute-email": "Ignoruj e-maile od tego użytkownika",
+ "specialmute-header": "Wybierz swoje preferencje ignorowania dla {{BIDI:[[User:$1]]}}.",
+ "specialmute-error-invalid-user": "Pożądana nazwa użytkownika nie została odnaleziona.",
+ "specialmute-error-email-blacklist-disabled": "Ignorowanie e-maili od użytkowników nie jest włączone.",
+ "specialmute-error-email-preferences": "Musisz potwierdzić swój adres e-mail zanim będziesz {{GENDER:|mógł|mogła}} ignorować użytkownika. Możesz to zrobić w [[Special:Preferences|preferencjach]].",
+ "specialmute-email-footer": "[$1 Zarządzaj preferencjami ignorowania dla {{BIDI:$2}}.]",
+ "specialmute-login-required": "Zaloguj się, aby zmienić swoje preferencje wyignorowania.",
"revid": "wersja $1",
"pageid": "ID strony: $1",
"interfaceadmin-info": "$1\n\nUprawnienia do edycji plików CSS/JS/JSON całej witryny zostały wydzielone z dotychczasowego uprawnienia <code>editinterface</code>. Jeżeli nie rozumiesz, dlaczego otrzymujesz ten komunikat, przeczytaj [[mw:MediaWiki_1.32/interface-admin]].",
"restrictionsfield-help": "Um endereço IP ou intervalo CIDR por linha. Para ativar tudo, use\n<pre>0.0.0.0/0\n::/0</pre>",
"edit-error-short": "Erro: $1",
"edit-error-long": "Erros:\n$1",
+ "specialmute": "Silenciar",
+ "specialmute-success": "Suas preferências de silêncio foram atualizadas com sucesso. Ver todos os usuários silenciados em [[Special:Preferences]].",
+ "specialmute-submit": "Confirmar",
+ "specialmute-label-mute-email": "Silenciar e-mails deste usuário",
+ "specialmute-header": "Por favor, selecione suas preferências de mudo para {{BIDI:[[User:$1]]}}.",
+ "specialmute-error-invalid-user": "O nome de usuário solicitado não foi encontrado.",
+ "specialmute-error-email-blacklist-disabled": "O silenciamento de usuários do envio de e-mails não está ativado.",
+ "specialmute-error-email-preferences": "Você deve confirmar seu endereço de e-mail antes de poder silenciar um usuário. Você pode fazer isso de [[Special:Preferences]].",
+ "specialmute-email-footer": "[$1 Gerenciar preferências de email para {{BIDI:$2}}.]",
+ "specialmute-login-required": "Por favor, entre para alterar suas preferências de mudo.",
"revid": "revisão $1",
"pageid": "ID da página $1",
"interfaceadmin-info": "$1\n\nAs permissões para edição de arquivos CSS/JS/JSON em todo o site foram separadas recentemente do direito <code>editinterface</code>. Se você não entende porque está recebendo este erro, veja [[mw:MediaWiki_1.32/interface-admin]].",
"edit-error-long": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|edit-error-short}}\n{{Identical|Error}}",
"specialmute": "The name of the special page [[Special:Mute]].",
"specialmute-success": "The content of [[Special:Mute]] with a successful message indicating that your mute preferences have been updated after the form has been submitted.",
- "specialmute-submit": "Submit button on [[Special:Mute]] form.",
+ "specialmute-submit": "Submit button on [[Special:Mute]] form.\n{{Identical|Confirm}}",
"specialmute-label-mute-email": "Label for the checkbox that mutes/unmutes emails from the specified user.",
"specialmute-header": "Used as header text on [[Special:Mute]]. Shown before the form with the muting options.\n* $1 - User selected for muting",
"specialmute-error-invalid-user": "Error displayed when the username cannot be found.",
"virus-scanfailed": "condrolle fallite (codece $1)",
"virus-unknownscanner": "antivirus scanusciute:",
"logouttext": "'''Tu tè scollegate.'''\n\nNote Bbuene ca certe pàggene ponne condinuà a essere viste cumme ce tu ste angore collegate, fine a quanne a cache d'u browser no se sdevache.",
+ "logging-out-notify": "Ste isse, aspitte.",
"logout-failed": "Non ge puè assè mò: $1",
"cannotlogoutnow-title": "Non ge puè assè mò",
"cannotlogoutnow-text": "Non ge puè assè quanne ste ause $1.",
"uploadstash-bad-path-unknown-type": "Tipe scanusciute \"$1\".",
"uploadstash-bad-path-unrecognized-thumb-name": "Nome d'a miniature non acchiate.",
"uploadstash-bad-path-bad-format": "'A chiave \"$1\" non ge ste jndr'à 'nu formate appropriate.",
+ "uploadstash-file-not-found-no-thumb": "No ge se pò avè 'a miniature.",
+ "uploadstash-file-not-found-no-local-path": "Nisciune percorse locale pa vôsce in scale.",
+ "uploadstash-file-not-found-no-object": "Non ge pozze ccrejà 'nu oggette file locale pa miniature.",
+ "uploadstash-file-not-found-no-remote-thumb": "Recupere d'a miniature schiute a male: $1\nURL = $2",
"uploadstash-no-extension": "L'estenzione jè vacande.",
"uploadstash-zero-length": "'U file tène lunghezze zero.",
"invalid-chunk-offset": "distanze d'u chunk invalide",
"blocklist-userblocks": "Scunne le blocche sus a le cunde de l'utinde",
"blocklist-tempblocks": "Scunne le blocche temboranèe",
"blocklist-addressblocks": "Scunne le blocche de le IP singole",
+ "blocklist-type": "Tipe:",
+ "blocklist-type-opt-all": "Tutte",
+ "blocklist-type-opt-sitewide": "Tutte 'u site",
+ "blocklist-type-opt-partial": "Parziale",
"blocklist-rangeblocks": "Scunne le indervalle de blocche",
"blocklist-timestamp": "Orarie de stambe",
"blocklist-target": "Destinazione",
"blocklink": "blocche",
"unblocklink": "sblocche",
"change-blocklink": "cange 'u blocche",
+ "empty-username": "(nisciune nome utende disponibbele)",
"contribslink": "condrebbute",
"emaillink": "manne 'n'e-mail",
"autoblocker": "Autobloccate purcè l'indirizze IP tune ha state ausate urtemamende da \"[[User:$1|$1]]\".\n'U mutive date pu blocche de $1 ète \"$2\"",
"block-log-flags-hiddenname": "nome de l'utende scunnute",
"range_block_disabled": "L'abbilità de le amministrature de ccrejà blocche a indervalle jè disabbilitate.",
"ipb_expiry_invalid": "L'orarije de scadenze non g'è valide.",
+ "ipb_expiry_old": "L'ore de scadenza jè jndr'à 'u passate.",
"ipb_expiry_temp": "Le blocche sus a le nome de l'utinde scunnute onna essere permanende.",
"ipb_hide_invalid": "Non ge se pò scangellà stu cunde utende; tène cchiù de troppe {{PLURAL:$1|'nu cangiamede|$1 cangiaminde}}.",
"ipb_already_blocked": "\"$1\" jè ggià blocchete",
"linkaccounts-submit": "Colleghe le cunde",
"unlinkaccounts": "Scolleghe le cunde",
"unlinkaccounts-success": "'U cunde ha state scollegate.",
+ "specialmute": "Citte",
+ "specialmute-submit": "Conferme",
+ "specialmute-error-invalid-user": "'U nome utende rechieste non g'è state acchiate.",
"revid": "revisione $1",
"pageid": "ID d'a pàgene $1",
"rawhtml-notallowed": "Le tag <html> non ge ponne essere ausate fore da le pàggene normale.",
"gotointerwiki-invalid": "'U titole specificate non g'è valide.",
"pagedata-bad-title": "Titole invalide: $1.",
"passwordpolicies-group": "Gruppe",
- "passwordpolicies-policies": "Politeche"
+ "passwordpolicies-policies": "Politeche",
+ "userlogout-continue": "Vue ccù isse?"
}
"restrictionsfield-help": "По одному IP-адресу или CIDR-диапазону в строке. Чтобы разрешить всё, используйте:<pre>0.0.0.0/0\n::/0</pre>",
"edit-error-short": "Ошибка: $1",
"edit-error-long": "Ошибки:\n\n$1",
+ "specialmute": "Откл. уведомления",
+ "specialmute-success": "Изменения были успешно сделаны. Просмотрите всех отключённых участников на [[Special:Preferences]].",
+ "specialmute-submit": "Подтвердить",
+ "specialmute-label-mute-email": "Отключить эл. почту от этого участника",
+ "specialmute-header": "Пожалуйста, выберите настройки уведомлений от {{BIDI:[[User:$1]]}}.",
+ "specialmute-error-invalid-user": "Указанное вами имя участника не может быть найдено.",
+ "specialmute-error-email-preferences": "Вы должны подтвердить вашу электронную почту, прежде чем отключить уведомление от других. Это можно сделать на странице [[Special:Preferences]].",
+ "specialmute-email-footer": "[$1 Управление настройками эл. почты для {{BIDI:$2}}.]",
+ "specialmute-login-required": "Пожалуйста, войдите, чтобы совершить изменения.",
"revid": "версия $1",
"pageid": "ID страницы $1",
"interfaceadmin-info": "$1\n\nПрава на редактирование общесайтных CSS/JS/JSON-файлов были недавно вынесены из права <code>editinterface</code>. Если вы не понимаете, почему вы наткнулись на эту ошибку, см. [[mw:MediaWiki_1.32/interface-admin]].",
"restrictionsfield-help": "Jedna IP-adresa ili CIDR-opseg po redu. Da omogućite sve, koristite<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
"edit-error-short": "Greška: $1",
"edit-error-long": "Greške:\n\n$1",
+ "specialmute": "Iskl. obavještenja",
+ "specialmute-success": "Promjene su uspješno napravljene. Pogledajte sve isključene korisnike na [[Special:Preferences]].",
+ "specialmute-submit": "Potvrdi / Потврди",
+ "specialmute-label-mute-email": "Isključi e-poštu od ovog korisnika",
+ "specialmute-header": "Izaberite postavke za obavještenja od {{BIDI:[[User:$1]]}}.",
+ "specialmute-error-invalid-user": "Nisam mogao naći korisničko ime.",
+ "specialmute-error-email-blacklist-disabled": "Isključavanje e-pošte od korisnika nije omogućeno.",
+ "specialmute-error-email-preferences": "Morat ćete potvrditi svoju e-poštu prije isključivanja obavijesti od drugih. To je učinjeno na stranici [[Special:Preferences]].",
+ "specialmute-email-footer": "[$1 Upravljanje postavkama e-pošte od {{BIDI:$2}}.]",
+ "specialmute-login-required": "Molimo Vas prijavite se da biste napravili promjene.",
"revid": "izmjena $1",
"pageid": "ID stranice $1",
"interfaceadmin-info": "$1\n\nDozvole za uređivanje CSS/JS/JSON datoteka preko cijelog wikija nedavno su odvojene od prava <code>editinterface</code>. Ako ne razumijete zašto ste dobili ovu grešku, pogl. [[mw:MediaWiki_1.32/interface-admin]].",
$this->output( "MediaWiki {$wgVersion} Updater\n\n" );
+ foreach ( SpecialVersion::getSoftwareInformation() as $name => $version ) {
+ $this->output( "{$name}: {$version}\n" );
+ }
+
wfWaitForSlaves();
if ( !$this->hasOption( 'skip-compat-checks' ) ) {
'scripts' => [
'resources/lib/html5shiv/html5shiv.js'
],
- 'raw' => true,
],
/* EasyDeflate */
batch.sort();
// Query parameters common to all requests
- reqBase = {
- skin: mw.config.get( 'skin' ),
- lang: mw.config.get( 'wgUserLanguage' ),
- debug: mw.config.get( 'debug' )
- };
+ reqBase = $VARS.reqBase;
// Split module list by source and by group.
splits = Object.create( null );
* @param array[] $calls For each array, call addVaryHeader() with those arguments
* @param string[] $cookies Array of cookie names to vary on
* @param string $vary Text of expected Vary header (including the 'Vary: ')
- * @param string $key Text of expected Key header (including the 'Key: ')
*/
public function testVaryHeaders( array $calls, array $cookies, $vary ) {
// Get rid of default Vary fields
$this->assertSame( 301, $response->getStatusCode() );
}
+ public function testCreateLegacyTemporaryRedirect() {
+ $rf = new ResponseFactory;
+ $response = $rf->createLegacyTemporaryRedirect( 'http://www.example.com/' );
+ $this->assertSame( [ 'http://www.example.com/' ], $response->getHeader( 'Location' ) );
+ $this->assertSame( 302, $response->getStatusCode() );
+ }
+
public function testCreateTemporaryRedirect() {
$rf = new ResponseFactory;
$response = $rf->createTemporaryRedirect( 'http://www.example.com/' );
"util",
"{blankVer}"
]
-] );',
- ] ],
- [ [
- 'msg' => 'Omit raw modules from registry',
- 'modules' => [
- 'test.raw' => new ResourceLoaderTestModule( [ 'isRaw' => true ] ),
- 'test.blank' => new ResourceLoaderTestModule(),
- ],
- 'out' => '
-mw.loader.addSource( {
- "local": "/w/load.php"
-} );
-mw.loader.register( [
- [
- "test.blank",
- "{blankVer}"
- ]
] );',
] ],
[ [
'simple scripts' => [ true,
[ 'scripts' => 'example.js' ]
],
- 'simple scripts, raw and targets' => [ true, [
+ 'simple scripts with targets' => [ true, [
'scripts' => [ 'a.js', 'b.js' ],
- 'raw' => true,
'targets' => [ 'desktop', 'mobile' ],
] ],
'FileModule' => [ true,
] );
$expect = [
- 'Foo' => [],
- 'Bar' => [ 'X', 'Bar1', 3 => 'Bar2' ],
- 'Quux' => [ 'Quux' ],
- 'Baz' => [],
+ 'Foo' => null,
+ 'Bar' => null,
+ 'Quux' => null,
+ 'Baz' => null,
];
$this->assertEquals( $expect, $manager->getVaryHeaders() );
}
/**
- * Verify that nothing explicitly depends on raw modules (such as "query").
+ * Verify that nothing depends on "startup".
*
- * Depending on them is unsupported as they are not registered client-side by the startup module.
+ * Depending on it is unsupported as it cannot be loaded by the client.
*
* @todo Modules can dynamically choose dependencies based on context. This method does not
* test such dependencies. The same goes for testMissingDependencies() and
$illegalDeps = [];
foreach ( $data['modules'] as $moduleName => $module ) {
- if ( $module->isRaw() ) {
+ if ( $module instanceof ResourceLoaderStartUpModule ) {
$illegalDeps[] = $moduleName;
}
}