* $wgCascadingRestrictionLevels was added.
* ftps, ssh, sftp, xmpp, sip, sips, tel, sms, bitcoin, magnet, urn, and geo
have been whitelisted inside of $wgUrlProtocols.
+* $wgDocType and $wgDTD have been removed and are no longer used for the DOCTYPE.
+* $wgHtml5 is no longer used by core. Setting it to false will no longer disable HTML5.
+ It is still set to true for extension compatibility but doing so in extensions is deprecated.
+* $wgXhtmlDefaultNamespace is no longer used by core. Setting it will no longer change the
+ xmlns used by MediaWiki. Reliance on this variable by extensions is deprecated.
=== New features in 1.22 ===
* (bug 44525) mediawiki.jqueryMsg can now parse (whitelisted) HTML elements and attributes.
uses ES5 getter/setter to emit a warning when they are used.
* $wgCascadingRestrictionLevels was added, allowing one to specify restriction levels
which can be cascading (previously 'sysop' was hard-coded as the only one).
+* XHTML5 support has been improved. If you set $wgMimeType = 'application/xhtml+xml'
+ MediaWiki will try outputting markup acording to XHTML5 rules.
=== Bug fixes in 1.22 ===
* Disable Special:PasswordReset when $wgEnableEmail is false. Previously one
* (bug 46626) xmldoublequote parameter was removed. Because of a bug, the
parameter has had no effect since MediaWiki 1.16, and so its removal is
unlikely to impact existing clients.
+* (bug 47216) action=query&meta=siteinfo&siprop=skins will now indicate which
+ skin is the default and which are unusable (e.g. listed in $wgSkipSkins).
* (bug 25325) Added support for wlshow filtering (bots/anon/minor/patrolled)
to action=feedwatchlist.
* WDDX formatted output will actually be formatted (and normal output will no
user ID, or file name. The old Special:Filepath page was reimplemented
to redirect through Special:Redirect.
* Monobook: Removed the old conditional stylesheets for Opera 6, 7 and 9.
+* Support for XHTML 1.0 has been removed. MediaWiki now only outputs (X)HTML5.
== Compatibility ==
$wgMimeType = 'text/html';
/**
- * The content type used in script tags. This is mostly going to be ignored if
- * $wgHtml5 is true, at least for actual HTML output, since HTML5 doesn't
- * require a MIME type for JavaScript or CSS (those are the default script and
- * style languages).
+ * The content type used in script tags. This is mostly going to be ignored at
+ * least for actual HTML output, since HTML5 doesn't require a MIME type for
+ * JavaScript or CSS (those are the default script and style languages).
*/
$wgJsMimeType = 'text/javascript';
/**
- * The HTML document type. Ignored if $wgHtml5 is true, since <!DOCTYPE html>
- * doesn't actually have a doctype part to put this variable's contents in.
- */
-$wgDocType = '-//W3C//DTD XHTML 1.0 Transitional//EN';
-
-/**
- * The URL of the document type declaration. Ignored if $wgHtml5 is true,
- * since HTML5 has no DTD, and <!DOCTYPE html> doesn't actually have a DTD part
- * to put this variable's contents in.
- */
-$wgDTD = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd';
-
-/**
- * The default xmlns attribute. Ignored if $wgHtml5 is true (or it's supposed
- * to be), since we don't currently support XHTML5, and in HTML5 (i.e., served
- * as text/html) the attribute has no effect, so why bother?
+ * The default xmlns attribute. The option to define this has been removed.
+ * The value of this variable is no longer used by core and is set to a fixed
+ * value in Setup.php for compatibility with extensions that depend on the value
+ * of this variable being set. Such a dependency however is deprecated.
+ * @deprecated since 1.22
*/
-$wgXhtmlDefaultNamespace = 'http://www.w3.org/1999/xhtml';
+$wgXhtmlDefaultNamespace = null;
/**
- * Should we output an HTML5 doctype? If false, use XHTML 1.0 Transitional
- * instead, and disable HTML5 features. This may eventually be removed and set
- * to always true. If it's true, a number of other settings will be irrelevant
- * and have no effect.
+ * Previously used to determine if we should output an HTML5 doctype.
+ * This is no longer used as we always output HTML5 now. For compatibility with
+ * extensions that still check the value of this config it's value is now forced
+ * to true by Setup.php.
+ * @deprecated since 1.22
*/
$wgHtml5 = true;
/**
* Defines the value of the version attribute in the <html> tag, if any.
- * This is ignored if $wgHtml5 is false. If $wgAllowRdfaAttributes and
- * $wgHtml5 are both true, and this evaluates to boolean false (like if it's
- * left at the default null value), it will be auto-initialized to the correct
- * value for RDFa+HTML5. As such, you should have no reason to ever actually
- * set this to anything.
+ * If $wgAllowRdfaAttributes is true, and this evaluates to boolean false
+ * (like if it's left at the default null value), it will be auto-initialized
+ * to the correct value for RDFa+HTML5. As such, you should have no reason to
+ * ever actually set this to anything.
*/
$wgHtml5Version = null;
$wgAllowRdfaAttributes = false;
/**
- * Enabled HTML5 microdata attributes for use in wikitext, if $wgHtml5 is also true.
+ * Enabled HTML5 microdata attributes for use in wikitext.
*/
$wgAllowMicrodataAttributes = false;
* Normally we wouldn't have to define this in the root "<html>"
* element, but IE needs it there in some circumstances.
*
- * This is ignored if $wgHtml5 is true, for the same reason as
- * $wgXhtmlDefaultNamespace.
+ * This is ignored if $wgMimeType is set to a non-XML mimetype.
*/
$wgXhtmlNamespaces = array();
/**
* Since wfMsg() and co suck, they don't return false if the message key they
- * looked up didn't exist but a XHTML string, this function checks for the
+ * looked up didn't exist but instead the key wrapped in <>'s, this function checks for the
* nonexistence of messages by checking the MessageCache::get() result directly.
*
* @deprecated since 1.18. Use Message::isDisabled().
* A checkbox matrix
* Operates similarly to HTMLMultiSelectField, but instead of using an array of
* options, uses an array of rows and an array of columns to dynamically
- * construct a matrix of options.
+ * construct a matrix of options. The tags used to identify a particular cell
+ * are of the form "columnName-rowName"
+ *
+ * Options:
+ * columns: Required list of columns in the matrix.
+ * rows: Required list of rows in the matrix.
+ * force-options-on: Accepts array of column-row tags to be displayed as enabled
+ * but unavailable to change
+ * force-options-off: Accepts array of column-row tags to be displayed as disabled
+ * but unavailable to change.
*/
-class HTMLCheckMatrix extends HTMLFormField {
+class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
+
+ static private $requiredParams = array(
+ // Required by underlying HTMLFormField
+ 'fieldname',
+ // Required by HTMLCheckMatrix
+ 'rows', 'columns'
+ );
+
+ public function __construct( $params ) {
+ $missing = array_diff( self::$requiredParams, array_keys( $params ) );
+ if ( $missing ) {
+ throw HTMLFormFieldRequiredOptionsException::create( $this, $missing );
+ }
+ parent::__construct( $params );
+ }
function validate( $value, $alldata ) {
$rows = $this->mParams['rows'];
foreach ( $rows as $rowLabel => $rowTag ) {
$rowContents = Html::rawElement( 'td', array(), $rowLabel );
foreach ( $columns as $columnTag ) {
- // Knock out any options that are not wanted
- if ( isset( $this->mParams['remove-options'] )
- && in_array( "$columnTag-$rowTag", $this->mParams['remove-options'] ) )
- {
- $rowContents .= Html::rawElement( 'td', array(), ' ' );
- } else {
- // Construct the checkbox
- $thisAttribs = array(
- 'id' => "{$this->mID}-$columnTag-$rowTag",
- 'value' => $columnTag . '-' . $rowTag
- );
- $checkbox = Xml::check(
- $this->mName . '[]',
- in_array( $columnTag . '-' . $rowTag, (array)$value, true ),
- $attribs + $thisAttribs );
- $rowContents .= Html::rawElement( 'td', array(), $checkbox );
+ $thisTag = "$columnTag-$rowTag";
+ // Construct the checkbox
+ $thisAttribs = array(
+ 'id' => "{$this->mID}-$thisTag",
+ 'value' => $thisTag,
+ );
+ $checked = in_array( $thisTag, (array)$value, true);
+ if ( $this->isTagForcedOff( $thisTag ) ) {
+ $checked = false;
+ $thisAttribs['disabled'] = 1;
+ } elseif ( $this->isTagForcedOn( $thisTag ) ) {
+ $checked = true;
+ $thisAttribs['disabled'] = 1;
}
+ $rowContents .= Html::rawElement(
+ 'td',
+ array(),
+ Xml::check( "{$this->mName}[]", $checked, $attribs + $thisAttribs )
+ );
}
$tableContents .= Html::rawElement( 'tr', array(), "\n$rowContents\n" );
}
return $html;
}
+ protected function isTagForcedOff( $tag ) {
+ return isset( $this->mParams['force-options-off'] )
+ && in_array( $tag, $this->mParams['force-options-off'] );
+ }
+
+ protected function isTagForcedOn( $tag ) {
+ return isset( $this->mParams['force-options-on'] )
+ && in_array( $tag, $this->mParams['force-options-on'] );
+ }
+
/**
* Get the complete table row for the input, including help text,
* labels, and whatever.
return array();
}
}
+
+ function filterDataForSubmit( $data ) {
+ $columns = HTMLFormField::flattenOptions( $this->mParams['columns'] );
+ $rows = HTMLFormField::flattenOptions( $this->mParams['rows'] );
+ $res = array();
+ foreach ( $columns as $column ) {
+ foreach ( $rows as $row ) {
+ // Make sure option hasn't been forced
+ $thisTag = "$column-$row";
+ if ( $this->isTagForcedOff( $thisTag ) ) {
+ $res[$thisTag] = false;
+ } elseif ($this->isTagForcedOn( $thisTag ) ) {
+ $res[$thisTag] = true;
+ } else {
+ $res[$thisTag] = in_array( $thisTag, $data );
+ }
+ }
+ }
+
+ return $res;
+ }
}
/**
/**
* Multi-select field
*/
-class HTMLMultiSelectField extends HTMLFormField {
+class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable {
function validate( $value, $alldata ) {
$p = parent::validate( $value, $alldata );
}
}
+ function filterDataForSubmit( $data ) {
+ $options = HTMLFormField::flattenOptions( $this->mParams['options'] );
+
+ $res = array();
+ foreach ( $options as $opt ) {
+ $res["$opt"] = in_array( $opt, $data );
+ }
+
+ return $res;
+ }
+
protected function needsLabel() {
return false;
}
return '';
}
}
+
+interface HTMLNestedFilterable {
+ /**
+ * Support for seperating multi-option preferences into multiple preferences
+ * Due to lack of array support.
+ * @param $data array
+ */
+ function filterDataForSubmit( $data );
+}
+
+class HTMLFormFieldRequiredOptionsException extends MWException {
+ static public function create( HTMLFormField $field, array $missing ) {
+ return new self( sprintf(
+ "Form type `%s` expected the following parameters to be set: %s",
+ get_class( $field ),
+ implode( ', ', $missing )
+ ) );
+ }
+}
*
* There are two important configuration options this class uses:
*
- * $wgHtml5: If this is set to false, then all output should be valid XHTML 1.0
- * Transitional.
+ * $wgMimeType: If this is set to an xml mimetype then output should be
+ * valid XHTML5.
* $wgWellFormedXml: If this is set to true, then all output should be
* well-formed XML (quotes on attributes, self-closing tags, etc.).
*
'itemscope',
);
- private static $HTMLFiveOnlyAttribs = array(
- 'autocomplete',
- 'autofocus',
- 'max',
- 'min',
- 'multiple',
- 'pattern',
- 'placeholder',
- 'required',
- 'step',
- 'spellcheck',
- );
-
/**
* Returns an HTML element in a string. The major advantage here over
* manually typing out the HTML is that it will escape all attribute
* @return string
*/
public static function openElement( $element, $attribs = array() ) {
- global $wgHtml5, $wgWellFormedXml;
+ global $wgWellFormedXml;
$attribs = (array)$attribs;
// This is not required in HTML5, but let's do it anyway, for
// consistency and better compression.
'image',
'reset',
'button',
- );
- // Allow more input types in HTML5 mode
- if ( $wgHtml5 ) {
- $validTypes = array_merge( $validTypes, array(
- 'datetime',
- 'datetime-local',
- 'date',
- 'month',
- 'time',
- 'week',
- 'number',
- 'range',
- 'email',
- 'url',
- 'search',
- 'tel',
- 'color',
- ) );
- }
+ // HTML input types
+ 'datetime',
+ 'datetime-local',
+ 'date',
+ 'month',
+ 'time',
+ 'week',
+ 'number',
+ 'range',
+ 'email',
+ 'url',
+ 'search',
+ 'tel',
+ 'color',
+ );
if ( isset( $attribs['type'] )
&& !in_array( $attribs['type'], $validTypes ) ) {
unset( $attribs['type'] );
}
}
- if ( !$wgHtml5 && $element == 'textarea' && isset( $attribs['maxlength'] ) ) {
- unset( $attribs['maxlength'] );
- }
-
// According to standard the default type for <button> elements is "submit".
// Depending on compatibility mode IE might use "button", instead.
// We enforce the standard "submit".
* @return array An array of attributes functionally identical to $attribs
*/
private static function dropDefaults( $element, $attribs ) {
- // Don't bother doing anything if we aren't outputting HTML5; it's too
- // much of a pain to maintain two sets of defaults.
- global $wgHtml5;
- if ( !$wgHtml5 ) {
- return $attribs;
- }
// Whenever altering this array, please provide a covering test case
// in HtmlTest::provideElementsWithAttributesHavingDefaultValues
* (starting with a space if at least one attribute is output)
*/
public static function expandAttributes( $attribs ) {
- global $wgHtml5, $wgWellFormedXml;
+ global $wgWellFormedXml;
$ret = '';
$attribs = (array)$attribs;
$key = $value;
}
- // Not technically required in HTML5, but required in XHTML 1.0,
- // and we'd like consistency and better compression anyway.
+ // Not technically required in HTML5 but we'd like consistency
+ // and better compression anyway.
$key = strtolower( $key );
- // Here we're blacklisting some HTML5-only attributes...
- if ( !$wgHtml5 && in_array( $key, self::$HTMLFiveOnlyAttribs ) ) {
- continue;
- }
-
// Bug 23769: Blacklist all form validation attributes for now. Current
// (June 2010) WebKit has no UI, so the form just refuses to submit
// without telling the user why, which is much worse than failing
}
if ( in_array( $key, self::$boolAttribs ) ) {
- // In XHTML 1.0 Transitional, the value needs to be equal to the
- // key. In HTML5, we can leave the value empty instead. If we
- // don't need well-formed XML, we can omit the = entirely.
+ // In HTML5, we can leave the value empty. If we don't need
+ // well-formed XML, we can omit the = entirely.
if ( !$wgWellFormedXml ) {
$ret .= " $key";
- } elseif ( $wgHtml5 ) {
- $ret .= " $key=\"\"";
} else {
- $ret .= " $key=\"$key\"";
+ $ret .= " $key=\"\"";
}
} else {
// Apparently we need to entity-encode \n, \r, \t, although the
* @return string Raw HTML
*/
public static function inlineScript( $contents ) {
- global $wgHtml5, $wgJsMimeType, $wgWellFormedXml;
+ global $wgWellFormedXml;
$attrs = array();
- if ( !$wgHtml5 ) {
- $attrs['type'] = $wgJsMimeType;
- }
-
if ( $wgWellFormedXml && preg_match( '/[<&]/', $contents ) ) {
$contents = "/*<![CDATA[*/$contents/*]]>*/";
}
* @return string Raw HTML
*/
public static function linkedScript( $url ) {
- global $wgHtml5, $wgJsMimeType;
-
$attrs = array( 'src' => $url );
- if ( !$wgHtml5 ) {
- $attrs['type'] = $wgJsMimeType;
- }
-
return self::element( 'script', $attrs );
}
/**
* Convenience function to produce an "<input>" element. This supports the
- * new HTML5 input types and attributes, and will silently strip them if
- * $wgHtml5 is false.
+ * new HTML5 input types and attributes.
*
* @param $name string name attribute
* @param $value mixed value attribute
* Convenience function to produce an "<input>" element.
*
* This supports leaving out the cols= and rows= which Xml requires and are
- * required by HTML4/XHTML but not required by HTML5 and will silently set
- * cols="" and rows="" if $wgHtml5 is false and cols and rows are omitted
- * (HTML4 validates present but empty cols="" and rows="" as valid).
+ * required by HTML4/XHTML but not required by HTML5.
*
* @param $name string name attribute
* @param $value string value attribute
* @return string Raw HTML
*/
public static function textarea( $name, $value = '', $attribs = array() ) {
- global $wgHtml5;
-
$attribs['name'] = $name;
- if ( !$wgHtml5 ) {
- if ( !isset( $attribs['cols'] ) ) {
- $attribs['cols'] = "";
- }
-
- if ( !isset( $attribs['rows'] ) ) {
- $attribs['rows'] = "";
- }
- }
-
if ( substr( $value, 0, 1 ) == "\n" ) {
// Workaround for bug 12130: browsers eat the initial newline
// assuming that it's just for show, but they do keep the later
public static function htmlHeader( $attribs = array() ) {
$ret = '';
- global $wgMimeType;
-
- if ( self::isXmlMimeType( $wgMimeType ) ) {
- $ret .= "<?xml version=\"1.0\" encoding=\"UTF-8\" ?" . ">\n";
- }
+ global $wgHtml5Version, $wgMimeType, $wgXhtmlNamespaces;
- global $wgHtml5, $wgHtml5Version, $wgDocType, $wgDTD;
- global $wgXhtmlNamespaces, $wgXhtmlDefaultNamespace;
+ $isXHTML = self::isXmlMimeType( $wgMimeType );
- if ( $wgHtml5 ) {
- $ret .= "<!DOCTYPE html>\n";
+ if ( $isXHTML ) { // XHTML5
+ // XML mimetyped markup should have an xml header.
+ // However a DOCTYPE is not needed.
+ $ret .= "<?xml version=\"1.0\" encoding=\"UTF-8\" ?" . ">\n";
- if ( $wgHtml5Version ) {
- $attribs['version'] = $wgHtml5Version;
- }
- } else {
- $ret .= "<!DOCTYPE html PUBLIC \"$wgDocType\" \"$wgDTD\">\n";
- $attribs['xmlns'] = $wgXhtmlDefaultNamespace;
+ // Add the standard xmlns
+ $attribs['xmlns'] = 'http://www.w3.org/1999/xhtml';
+ // And support custom namespaces
foreach ( $wgXhtmlNamespaces as $tag => $ns ) {
$attribs["xmlns:$tag"] = $ns;
}
+ } else { // HTML5
+ // DOCTYPE
+ $ret .= "<!DOCTYPE html>\n";
+ }
+
+ if ( $wgHtml5Version ) {
+ $attribs['version'] = $wgHtml5Version;
}
$html = Html::openElement( 'html', $attribs );
* @return Boolean
*/
public static function isXmlMimeType( $mimetype ) {
- switch ( $mimetype ) {
- case 'text/xml':
- case 'application/xhtml+xml':
- case 'application/xml':
- return true;
- default:
- return false;
- }
+ # http://www.whatwg.org/specs/web-apps/current-work/multipage/infrastructure.html#xml-mime-type
+ # * text/xml
+ # * application/xml
+ # * Any mimetype with a subtype ending in +xml (this implicitly includes application/xhtml+xml)
+ return (bool) preg_match( '!^(text|application)/xml$|^.+/.+\+xml$!', $mimetype );
}
/**
header( 'Cache-Control: no-cache' );
- $out = <<<EOT
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" dir="ltr">
-<head>
-<title>HTML validation error</title>
-<style>
-.highlight { background-color: #ffc }
-li { white-space: pre }
-</style>
-</head>
-<body>
-<h1>HTML validation error</h1>
-<ul>
-EOT;
+ $out = Html::element( 'h1', null, 'HTML validation error' );
+ $out .= Html::openElement( 'ul' );
$error = strtok( $errors, "\n" );
$badLines = array();
if ( preg_match( '/^line (\d+)/', $error, $m ) ) {
$lineNum = intval( $m[1] );
$badLines[$lineNum] = true;
- $out .= "<li><a href=\"#line-{$lineNum}\">" . htmlspecialchars( $error ) . "</a></li>\n";
+ $out .= Html::rawElement( 'li', null,
+ Html::element( 'a', array( 'href' => "#line-{$lineNum}" ), $error ) ) . "\n";
}
$error = strtok( "\n" );
}
- $out .= '</ul>';
- $out .= '<pre>' . htmlspecialchars( $errors ) . '</pre>';
- $out .= "<ol>\n";
+ $out .= Html::closeElement( 'ul' );
+ $out .= Html::element( 'pre', null, $errors );
+ $out .= Html::openElement( 'ol' ) . "\n";
$line = strtok( $s, "\n" );
$i = 1;
while ( $line !== false ) {
+ $attrs = array();
if ( isset( $badLines[$i] ) ) {
- $out .= "<li class=\"highlight\" id=\"line-$i\">";
- } else {
- $out .= '<li>';
+ $attrs['class'] = 'highlight';
+ $attrs['id'] = "line-$i";
}
- $out .= htmlspecialchars( $line ) . "</li>\n";
+ $out .= Html::element( 'li', $attrs, $line ) . "\n";
$line = strtok( "\n" );
$i++;
}
- $out .= '</ol></body></html>';
+ $out .= Html::closeElement( 'ol' );
+
+ $style = <<<CSS
+.highlight { background-color: #ffc }
+li { white-space: pre }
+CSS;
+
+ $out = Html::htmlHeader( array( 'lang' => 'en', 'dir' => 'ltr' ) ) .
+ Html::rawElement( 'head', null,
+ Html::element( 'title', null, 'HTML validation error' ) .
+ Html::inlineStyle( $style ) ) .
+ Html::rawElement( 'body', null, $out ) .
+ Html::closeElement( 'html' );
+
return $out;
}
* @return String: The doctype, opening "<html>", and head element.
*/
public function headElement( Skin $sk, $includeStyle = true ) {
- global $wgContLang;
+ global $wgContLang, $wgMimeType;
$userdir = $this->getLanguage()->getDir();
$sitedir = $wgContLang->getDir();
$ret .= "$openHead\n";
}
+ if ( !Html::isXmlMimeType( $wgMimeType ) ) {
+ // Add <meta charset="UTF-8">
+ // This should be before <title> since it defines the charset used by
+ // text including the text inside <title>.
+ // The spec recommends defining XHTML5's charset using the XML declaration
+ // instead of meta.
+ // Our XML declaration is output by Html::htmlHeader.
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#attr-meta-http-equiv-content-type
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#charset
+ $ret .= Html::element( 'meta', array( 'charset' => 'UTF-8' ) );
+ }
+
$ret .= Html::element( 'title', null, $this->getHTMLTitle() ) . "\n";
$ret .= implode( "\n", array(
- $this->getHeadLinks( null, true ),
+ $this->getHeadLinks(),
$this->buildCssLinks(),
$this->getHeadScripts(),
$this->getHeadItems()
}
/**
- * @param bool $addContentType Whether "<meta>" specifying content type should be returned
- *
* @return array in format "link name or number => 'link html'".
*/
- public function getHeadLinksArray( $addContentType = false ) {
+ public function getHeadLinksArray() {
global $wgUniversalEditButton, $wgFavicon, $wgAppleTouchIcon, $wgEnableAPI,
- $wgSitename, $wgVersion, $wgHtml5, $wgMimeType,
+ $wgSitename, $wgVersion,
$wgFeed, $wgOverrideSiteFeed, $wgAdvertisedFeedTypes,
$wgDisableLangConversion, $wgCanonicalLanguageLinks,
$wgRightsPage, $wgRightsUrl;
$canonicalUrl = $this->mCanonicalUrl;
- if ( $addContentType ) {
- if ( $wgHtml5 ) {
- # More succinct than <meta http-equiv=Content-Type>, has the
- # same effect
- $tags['meta-charset'] = Html::element( 'meta', array( 'charset' => 'UTF-8' ) );
- } else {
- $tags['meta-content-type'] = Html::element( 'meta', array(
- 'http-equiv' => 'Content-Type',
- 'content' => "$wgMimeType; charset=UTF-8"
- ) );
- $tags['meta-content-style-type'] = Html::element( 'meta', array( // bug 15835
- 'http-equiv' => 'Content-Style-Type',
- 'content' => 'text/css'
- ) );
- }
- }
-
$tags['meta-generator'] = Html::element( 'meta', array(
'name' => 'generator',
'content' => "MediaWiki $wgVersion",
}
/**
- * @param $unused
- * @param bool $addContentType Whether "<meta>" specifying content type should be returned
- *
* @return string HTML tag links to be put in the header.
*/
- public function getHeadLinks( $unused = null, $addContentType = false ) {
- return implode( "\n", $this->getHeadLinksArray( $addContentType ) );
+ public function getHeadLinks() {
+ return implode( "\n", $this->getHeadLinksArray() );
}
/**
header( 'Pragma: no-cache' );
$finalOutput = <<<HTML
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns='http://www.w3.org/1999/xhtml' lang='en'>
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
<head>
+ <meta charset="UTF-8" />
<title>MediaWiki {$mwVersion}</title>
- <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
- <style type='text/css' media='screen'>
+ <style media='screen'>
body {
color: #000;
background-color: #fff;
}
/**
+ * Separate multi-option preferences into multiple preferences, since we
+ * have to store them separately
* @param $data array
* @return array
*/
function filterDataForSubmit( $data ) {
- // Support for separating multi-option preferences into multiple preferences
- // Due to lack of array support.
foreach ( $this->mFlatFields as $fieldname => $field ) {
- $info = $field->mParams;
-
- if ( $field instanceof HTMLMultiSelectField ) {
- $options = HTMLFormField::flattenOptions( $info['options'] );
+ if ( $field instanceof HTMLNestedFilterable ) {
+ $info = $field->mParams;
$prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
-
- foreach ( $options as $opt ) {
- $data["$prefix$opt"] = in_array( $opt, $data[$fieldname] );
+ foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
+ $data["$prefix-$key"] = $value;
}
-
- unset( $data[$fieldname] );
-
- } elseif ( $field instanceof HTMLCheckMatrix ) {
- $columns = HTMLFormField::flattenOptions( $info['columns'] );
- $rows = HTMLFormField::flattenOptions( $info['rows'] );
- $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
- foreach ( $columns as $column ) {
- foreach ( $rows as $row ) {
- // Make sure option hasn't been removed
- if ( !isset( $info['remove-options'] )
- || !in_array( "$column-$row", $info['remove-options'] ) )
- {
- $data["$prefix-$column-$row"] = in_array( "$column-$row", $data[$fieldname] );
- }
- }
- }
-
unset( $data[$fieldname] );
}
}
<?php
/**
- * XHTML sanitizer for %MediaWiki.
+ * HTML sanitizer for %MediaWiki.
*
* Copyright © 2002-2005 Brion Vibber <brion@pobox.com> et al
* http://www.mediawiki.org/
*/
/**
- * XHTML sanitizer for MediaWiki
+ * HTML sanitizer for MediaWiki
* @ingroup Parser
*/
class Sanitizer {
* @return string
*/
static function removeHTMLtags( $text, $processCallback = null, $args = array(), $extratags = array(), $removetags = array() ) {
- global $wgUseTidy, $wgHtml5, $wgAllowMicrodataAttributes, $wgAllowImageTag;
+ global $wgUseTidy, $wgAllowMicrodataAttributes, $wgAllowImageTag;
static $htmlpairsStatic, $htmlsingle, $htmlsingleonly, $htmlnest, $tabletags,
$htmllist, $listtags, $htmlsingleallowed, $htmlelementsStatic, $staticInitialised;
// Base our staticInitialised variable off of the global config state so that if the globals
// are changed (like in the screwed up test system) we will re-initialise the settings.
- $globalContext = implode( '-', compact( 'wgHtml5', 'wgAllowMicrodataAttributes', 'wgAllowImageTag' ) );
+ $globalContext = implode( '-', compact( 'wgAllowMicrodataAttributes', 'wgAllowImageTag' ) );
if ( !$staticInitialised || $staticInitialised != $globalContext ) {
$htmlpairsStatic = array( # Tags that must be closed
'strike', 'strong', 'tt', 'var', 'div', 'center',
'blockquote', 'ol', 'ul', 'dl', 'table', 'caption', 'pre',
'ruby', 'rt', 'rb', 'rp', 'p', 'span', 'abbr', 'dfn',
- 'kbd', 'samp'
+ 'kbd', 'samp', 'data', 'time', 'mark'
);
- if ( $wgHtml5 ) {
- $htmlpairsStatic = array_merge( $htmlpairsStatic, array( 'data', 'time', 'mark' ) );
- }
$htmlsingle = array(
'br', 'hr', 'li', 'dt', 'dd'
);
$htmlsingleonly = array( # Elements that cannot have close tags
'br', 'hr'
);
- if ( $wgHtml5 && $wgAllowMicrodataAttributes ) {
+ if ( $wgAllowMicrodataAttributes ) {
$htmlsingle[] = $htmlsingleonly[] = 'meta';
$htmlsingle[] = $htmlsingleonly[] = 'link';
}
* @todo Check for unique id attribute :P
*/
static function validateAttributes( $attribs, $whitelist ) {
- global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes, $wgHtml5;
+ global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes;
$whitelist = array_flip( $whitelist );
$hrefExp = '/^(' . wfUrlProtocols() . ')[^\s]+$/';
continue;
}
- # Allow any attribute beginning with "data-", if in HTML5 mode
- if ( !( $wgHtml5 && preg_match( '/^data-/i', $attribute ) ) && !isset( $whitelist[$attribute] ) ) {
+ # Allow any attribute beginning with "data-"
+ if ( !preg_match( '/^data-/i', $attribute ) && !isset( $whitelist[$attribute] ) ) {
continue;
}
* @return String
*/
static function escapeId( $id, $options = array() ) {
- global $wgHtml5, $wgExperimentalHtmlIds;
+ global $wgExperimentalHtmlIds;
$options = (array)$options;
- if ( $wgHtml5 && $wgExperimentalHtmlIds && !in_array( 'legacy', $options ) ) {
+ if ( $wgExperimentalHtmlIds && !in_array( 'legacy', $options ) ) {
$id = Sanitizer::decodeCharReferences( $id );
$id = preg_replace( '/[ \t\n\r\f_\'"&#%]+/', '_', $id );
$id = trim( $id, '_' );
* @return Array
*/
static function setupAttributeWhitelist() {
- global $wgAllowRdfaAttributes, $wgHtml5, $wgAllowMicrodataAttributes;
+ global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes;
static $whitelist, $staticInitialised;
- $globalContext = implode( '-', compact( 'wgAllowRdfaAttributes', 'wgHtml5', 'wgAllowMicrodataAttributes' ) );
+ $globalContext = implode( '-', compact( 'wgAllowRdfaAttributes', 'wgAllowMicrodataAttributes' ) );
if ( isset( $whitelist ) && $staticInitialised == $globalContext ) {
return $whitelist;
) );
}
- if ( $wgHtml5 && $wgAllowMicrodataAttributes ) {
+ if ( $wgAllowMicrodataAttributes ) {
# add HTML5 microdata tags as specified by http://www.whatwg.org/specs/web-apps/current-work/multipage/microdata.html#the-microdata-model
$common = array_merge( $common, array(
'itemid', 'itemprop', 'itemref', 'itemscope', 'itemtype'
# 15.3
'hr' => array_merge( $common, array( 'noshade', 'size', 'width' ) ),
- # XHTML Ruby annotation text module, simple ruby only.
- # http://www.w3c.org/TR/ruby/
+ # HTML Ruby annotation text module, simple ruby only.
+ # http://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#the-ruby-element
'ruby' => $common,
# rbc
# rtc
# HTML 5 section 4.6
'bdi' => $common,
- );
-
- if ( $wgHtml5 ) {
# HTML5 elements, defined by:
# http://www.whatwg.org/specs/web-apps/current-work/multipage/
- $whitelist += array(
- 'data' => array_merge( $common, array( 'value' ) ),
- 'time' => array_merge( $common, array( 'datetime' ) ),
- 'mark' => $common,
-
- // meta and link are only permitted by removeHTMLtags when Microdata
- // is enabled so we don't bother adding a conditional to hide these
- // Also meta and link are only valid in WikiText as Microdata elements
- // (ie: validateTag rejects tags missing the attributes needed for Microdata)
- // So we don't bother including $common attributes that have no purpose.
- 'meta' => array( 'itemprop', 'content' ),
- 'link' => array( 'itemprop', 'href' ),
- );
- }
+ 'data' => array_merge( $common, array( 'value' ) ),
+ 'time' => array_merge( $common, array( 'datetime' ) ),
+ 'mark' => $common,
+
+ // meta and link are only permitted by removeHTMLtags when Microdata
+ // is enabled so we don't bother adding a conditional to hide these
+ // Also meta and link are only valid in WikiText as Microdata elements
+ // (ie: validateTag rejects tags missing the attributes needed for Microdata)
+ // So we don't bother including $common attributes that have no purpose.
+ 'meta' => array( 'itemprop', 'content' ),
+ 'link' => array( 'itemprop', 'href' ),
+ );
$staticInitialised = $globalContext;
$wgActions[$action] = false;
}
-if ( !$wgHtml5Version && $wgHtml5 && $wgAllowRdfaAttributes ) {
+# We always output html5 since 1.22, override any change made by local settings
+$wgHtml5 = true;
+
+# Setting wgXhtmlDefaultNamespace is not supported since 1.22.
+# However we define it here for extensions that depend on its value.
+$wgXhtmlDefaultNamespace = 'http://www.w3.org/1999/xhtml';
+
+if ( !$wgHtml5Version && $wgAllowRdfaAttributes ) {
# see http://www.w3.org/TR/rdfa-in-html/#document-conformance
if ( $wgMimeType == 'application/xhtml+xml' ) {
$wgHtml5Version = 'XHTML+RDFa 1.0';
global $wgContLang;
global $wgScript, $wgStylePath;
global $wgMimeType, $wgJsMimeType;
- global $wgXhtmlDefaultNamespace, $wgXhtmlNamespaces, $wgHtml5Version;
+ global $wgXhtmlNamespaces, $wgHtml5Version;
global $wgDisableCounters, $wgSitename, $wgLogo;
global $wgMaxCredits, $wgShowCreditsIfMax;
global $wgPageShowWatchingUsers;
$tpl->set( 'jsvarurl', false );
- $tpl->setRef( 'xhtmldefaultnamespace', $wgXhtmlDefaultNamespace );
+ $tpl->set( 'xhtmldefaultnamespace', 'http://www.w3.org/1999/xhtml' );
$tpl->set( 'xhtmlnamespaces', $wgXhtmlNamespaces );
$tpl->set( 'html5version', $wgHtml5Version );
$tpl->set( 'headlinks', $out->getHeadLinks() );
*
* @param $item String
*/
- private function setItemLoaded( $item ) {
+ protected function setItemLoaded( $item ) {
if ( is_array( $this->mLoadedItems ) ) {
$this->mLoadedItems[$item] = true;
}
* @param &$expiration \mixed Accepts the expiration time
* @return String New token
*/
- private function confirmationToken( &$expiration ) {
+ protected function confirmationToken( &$expiration ) {
global $wgUserEmailConfirmationTokenExpiry;
$now = time();
$expires = $now + $wgUserEmailConfirmationTokenExpiry;
* @param string $token Accepts the email confirmation token
* @return String New token URL
*/
- private function confirmationTokenUrl( $token ) {
+ protected function confirmationTokenUrl( $token ) {
return $this->getTokenUrl( 'ConfirmEmail', $token );
}
* @param string $token Accepts the email confirmation token
* @return String New token URL
*/
- private function invalidationTokenUrl( $token ) {
+ protected function invalidationTokenUrl( $token ) {
return $this->getTokenUrl( 'InvalidateEmail', $token );
}
*
* @return array Array of HTML attributes suitable for feeding to
* Html::element(), directly or indirectly. (Don't feed to Xml::*()!
- * That will potentially output invalid XHTML 1.0 Transitional, and will
- * get confused by the boolean attribute syntax used.)
+ * That will get confused by the boolean attribute syntax used.)
*/
public static function passwordChangeInputAttribs() {
global $wgMinimalPasswordLength;
}
if ( array_key_exists( 'continue', $params ) ) {
$ret[] = array(
- array(
- 'code' => 'badcontinue',
- 'info' => 'Invalid continue param. You should pass the original value returned by the previous query'
- ) );
+ 'code' => 'badcontinue',
+ 'info' => 'Invalid continue param. You should pass the original value returned by the previous query'
+ );
}
}
public function appendSkins( $property ) {
$data = array();
+ $usable = Skin::getUsableSkins();
+ $default = Skin::normalizeKey( 'default' );
foreach ( Skin::getSkinNames() as $name => $displayName ) {
$skin = array( 'code' => $name );
ApiResult::setContent( $skin, $displayName );
+ if ( !isset( $usable[$name] ) ) {
+ $skin['unusable'] = '';
+ }
+ if ( $name === $default ) {
+ $skin['default'] = '';
+ }
$data[] = $skin;
}
$this->getResult()->setIndexedTagName( $data, 'skin' );
if ( preg_match_all( '/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xs',
$line, $m ) )
{
- $words = array_merge( $words, $m[0] );
- $stripped = array_merge( $stripped, $m[1] );
+ foreach ( $m[0] as $word ) {
+ $words[] = $word;
+ }
+ foreach ( $m[1] as $stripped_word ) {
+ $stripped[] = $stripped_word;
+ }
}
}
}
* in the queue and/or sleep for a brief time period. These can be used
* to represent "no-op" jobs or test lock contention and performance.
*
+ * @par Example:
+ * Inserting a null job in the configured job queue:
+ * @code
+ * $ php maintenance/eval.php
+ * > $queue = JobQueueGroup::singleton();
+ * > $job = new NullJob( Title::newMainPage(), array( 'lives' => 10 ) );
+ * > $queue->push( $job );
+ * @endcode
+ * You can then confirm the job has been enqueued by using the showJobs.php
+ * maintenance utility:
+ * @code
+ * $ php maintenance/showJobs.php --group
+ * null: 1 queue; 0 claimed (0 active, 0 abandoned)
+ * $
+ * @endcode
+ *
* @ingroup JobQueue
*/
class NullJob extends Job {
/**
* PHP Parser - Processes wiki markup (which uses a more user-friendly
* syntax, such as "[[link]]" for making links), and provides a one-way
- * transformation of that wiki markup it into XHTML output / markup
+ * transformation of that wiki markup it into (X)HTML output / markup
* (which in turn the browser understands, and can display).
*
* There are seven main entry points into the Parser class:
* @private
*/
function formatHeadings( $text, $origText, $isMain = true ) {
- global $wgMaxTocLevel, $wgHtml5, $wgExperimentalHtmlIds;
+ global $wgMaxTocLevel, $wgExperimentalHtmlIds;
# Inhibit editsection links if requested in the page
if ( isset( $this->mDoubleUnderscores['noeditsection'] ) ) {
# Save headline for section edit hint before it's escaped
$headlineHint = $safeHeadline;
- if ( $wgHtml5 && $wgExperimentalHtmlIds ) {
+ if ( $wgExperimentalHtmlIds ) {
# For reverse compatibility, provide an id that's
# HTML4-compatible, like we used to.
#
// Collect all items that belong to the same header
foreach ( $items as $key => $value ) {
- $name = $this->msg( $key )->inContentLanguage()->parse();
+ $name = $this->msg( $key )->parse();
$number = htmlspecialchars( $value );
$return .= $this->formatRow( $name, $this->getLanguage()->formatNum( $number ), array( 'class' => 'mw-statistics-hook' ) );
$installerStarted = ( $success && isset( $_SESSION['installData'] ) );
}
?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns='http://www.w3.org/1999/xhtml' lang='en'>
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
<head>
+ <meta charset="UTF-8" />
<title>MediaWiki <?php echo htmlspecialchars( $wgVersion ) ?></title>
- <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
- <style type='text/css' media='screen'>
+ <style media='screen'>
html, body {
color: #000;
background-color: #fff;
<label for='wpName2'>
<?php $this->msg( 'userlogin-yourname' ); ?>
- <span class="mw-ui-flush-right"><?php echo $this->getMsg( 'createacct-helpusername-link' )->parse(); ?></span>
+ <span class="mw-ui-flush-right"><?php echo $this->getMsg( 'createacct-helpusername' )->parse(); ?></span>
</label>
<?php echo Html::input( 'wpName', $this->data['name'], 'text', array(
'class' => 'mw-input loginText',
'createacct-reason-ph' => "Hoekom u nog 'n rekening skep",
'createacct-captcha' => 'Veiligheidskontrole',
'createacct-captcha-help-url' => "{{ns:Project}}:Versoek 'n gebruiker",
-'createacct-imgcaptcha-help' => "Kan nie die beeld sien nie? [[{{MediaWiki:createacct-captcha-help-url}}|Vra dan 'n gebruiker aan]]",
'createacct-imgcaptcha-ph' => 'Sleutel die teks hierbo in',
'createacct-submit' => 'Skep u rekening',
'createacct-benefit-heading' => '{{SITENAME}} word deur mense soos u geskep.',
'createacct-reason-ph' => 'আপুনি কিয় আন এটা একাউণ্ট সৃষ্টি কৰিছে',
'createacct-captcha' => 'সুৰক্ষা পৰীক্ষা',
'createacct-captcha-help-url' => '{{ns:Project}}:এটা একাউণ্টৰ বাবে অনুৰোধ কৰক',
-'createacct-imgcaptcha-help' => 'ছবিখন দেখা পোৱা নাই? [[{{MediaWiki:createacct-captcha-help-url}}|এটা একাউণ্টৰ বাবে অনুৰোধ কৰক]]',
'createacct-imgcaptcha-ph' => 'ওপৰত দেখা পোৱা পাঠ্য লিখক',
'createacct-submit' => 'আপোনাৰ একাউণ্ট সৃষ্টি কৰক',
'createacct-benefit-heading' => 'আপোনাৰ দৰে মানুহেই {{SITENAME}} তৈয়াৰ কৰিছে',
'yourname' => "Nome d'usuariu:",
'userlogin-yourname' => "Nome d'usuariu",
'userlogin-yourname-ph' => "Escriba'l so nome d'usuariu",
-'createacct-helpusername-url' => '{{ns:Project}}:Política_de_nomes',
+'createacct-helpusername-url' => "{{ns:Project}}:Política_de_nomes_d'usuariu",
'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(ayudame a escoyer)]]',
'yourpassword' => 'Contraseña:',
'userlogin-yourpassword' => 'Contraseña',
'createacct-yourpasswordagain' => 'Confirmar la contraseña',
'createacct-yourpasswordagain-ph' => 'Escriba nuevamente la contraseña',
'remembermypassword' => "Recordar la mio identificación nesti restolador (un máximu {{PLURAL:$1|d'un día|de $1 díes}})",
-'userlogin-remembermypassword' => 'Recordame',
-'userlogin-signwithsecure' => 'Aniciar sesión con un sirvidor seguru',
+'userlogin-remembermypassword' => 'Caltener abierta la sesión',
+'userlogin-signwithsecure' => 'Usar una conexón segura',
'securelogin-stick-https' => "Siguir coneutáu al HTTPS dempués d'identificase",
'yourdomainname' => 'El to dominiu:',
'password-change-forbidden' => 'Nun se pueden camudar les contraseñes nesta wiki.',
'gotaccount' => '¿Ya tienes una cuenta? $1.',
'gotaccountlink' => 'Identificase',
'userlogin-resetlink' => "¿Escaecisti los datos d'identificación?",
+'userlogin-resetpassword-link' => 'Reaniciar la contraseña',
'helplogin-url' => 'Help:Aniciar sesión',
'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Ayuda p'aniciar sesión]]",
'createacct-join' => 'Escriba abaxo la so información.',
'createacct-realname' => 'Nome real (opcional)',
'createaccountreason' => 'Motivu:',
'createacct-reason' => 'Motivu',
+'createacct-reason-ph' => 'Por qué quier crear otra cuenta',
'createacct-captcha' => 'Comprobación de seguridá',
-'createacct-captcha-help-url' => '{{ns:Project}}:Solicitar una cuenta',
-'createacct-imgcaptcha-help' => '¿Nun pue ver la imaxe? [[{{MediaWiki:createacct-captcha-help-url}}|Solicite una cuenta]]',
+'createacct-captcha-help-url' => '{{ns:Project}}:Solicite una cuenta',
'createacct-imgcaptcha-ph' => "Escriba'l testu qu'apaez arriba",
+'createacct-submit' => 'Crear la cuenta',
'createacct-benefit-heading' => '{{SITENAME}} failu xente como vusté.',
-'createacct-benefit-body1' => 'ediciones',
-'createacct-benefit-body2' => 'Páxines',
-'createacct-benefit-body3' => 'collaboradores esti mes',
+'createacct-benefit-body1' => '{{PLURAL:$1|edición|ediciones}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|páxina|páxines}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|collaborador|collaboradores}} de recién',
'badretype' => "Les claves qu'escribisti nun concuayen.",
'userexists' => "El nome d'usuariu conseñáu yá ta usándose.
Por favor escueyi un nome diferente.",
'resetpass-wrong-oldpass' => 'Clave provisional o actual non válida.
Seique yá camudaras correutamente la clave o que pidieras una nueva clave provisional.',
'resetpass-temp-password' => 'Clave provisional:',
+'resetpass-abort-generic' => "Una estensión encaboxó'l cambiu de la contraseña.",
# Special:PasswordReset
'passwordreset' => 'Reaniciar clave',
'userrights-notallowed' => "La to cuenta nun tien permisu p'amestar o desaniciar permisos d'usuariu.",
'userrights-changeable-col' => 'Grupos que pues camudar',
'userrights-unchangeable-col' => 'Grupos que nun pues camudar',
+'userrights-conflict' => "¡Hai un conflictu de permisos d'usuariu! Por favor, vuelva a aplicar los cambios.",
# Groups
'group' => 'Grupu:',
'version-entrypoints-header-entrypoint' => "Puntu d'entrada",
'version-entrypoints-header-url' => 'URL',
+# Special:Redirect
+'redirect' => "Redireición por nome de ficheru, o ID d'usuariu o de revisión",
+'redirect-legend' => 'Redirixir a un ficheru o una páxina',
+'redirect-summary' => "Esta páxina especial redirixe a un ficheru (dando'l nome), una páxina (dando una ID de revisión) o una páxina d'usuariu (dando una ID d'usuariu).",
+'redirect-submit' => 'Dir',
+'redirect-lookup' => 'Buscar:',
+'redirect-value' => 'Valor:',
+'redirect-user' => "ID d'usuariu:",
+'redirect-revision' => 'Revisión de páxina',
+'redirect-file' => 'Nome del ficheru',
+'redirect-not-exists' => "Nun s'alcontró'l valor",
+
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Buscar archivos duplicaos',
'fileduplicatesearch-summary' => 'Busca archivos duplicaos basándose nos sos valores fragmentarios.',
'htmlform-selectorother-other' => 'Otros',
'htmlform-no' => 'Non',
'htmlform-yes' => 'Sí',
+'htmlform-chosen-placeholder' => 'Seleicione una opción',
# SQLite database support
'sqlite-has-fts' => '$1 con sofitu pa gueta en testu completu',
'createacct-reason' => 'Rason',
'createacct-captcha' => 'Rikisang panseguridad',
'createacct-captcha-help-url' => '{{ns:Project}}:Maghagad nin panindog',
-'createacct-imgcaptcha-help' => 'Dae nahihiling an imahe? [[{{MediaWiki:createacct-captcha-help-url}}|Maghagad nin panindog]]',
'createacct-imgcaptcha-ph' => 'Pakikaag an tekstong nahihiling mo sa ibabaw',
'createacct-benefit-heading' => '{{SITENAME}} pinaghimo kan mga tawong siring mo.',
'createacct-benefit-body1' => 'mga pagliliwat',
'createacct-reason-ph' => 'Зь якой мэтай вы ствараеце іншы рахунак',
'createacct-captcha' => 'Праверка бясьпекі',
'createacct-captcha-help-url' => '{{ns:Project}}:Запыты на стварэньне рахункаў',
-'createacct-imgcaptcha-help' => 'Ня бачыце рысунак? [[{{MediaWiki:createacct-captcha-help-url}}|Запытайце рахунак]]',
'createacct-imgcaptcha-ph' => 'Увядзіце тэкст, што бачыце вышэй',
'createacct-submit' => 'Стварыць рахунак',
'createacct-benefit-heading' => '{{SITENAME}} створаная людзьмі, такімі як вы.',
'createacct-reason-ph' => 'কেন আপনি আরেকটি অ্যাকাউন্ট তৈরি করছেন',
'createacct-captcha' => 'নিরাপত্তা পরীক্ষা',
'createacct-captcha-help-url' => '{{ns:Project}}:অ্যাকাউন্টের জন্য অনুরোধ',
-'createacct-imgcaptcha-help' => 'ছবিটি দেখতে পাচ্ছেন না? [[{{MediaWiki:createacct-captcha-help-url}}|নতুন অ্যাকাউন্টের অনুরোধ করুন]]',
'createacct-imgcaptcha-ph' => 'উপরে যে লেখা দেখতে পাচ্ছেন তা লিখুন',
'createacct-submit' => 'আপনার অ্যাকাউন্ট তৈরি করুন',
'createacct-benefit-heading' => '{{SITENAME}} আপনার মত লোকেরই তৈরি।',
'createacct-reason' => 'Motiu',
'createacct-captcha' => 'Control de seguretat',
'createacct-captcha-help-url' => '{{ns:Project}}:Sol·licitar un compte',
-'createacct-imgcaptcha-help' => 'No podeu veure la imatge? [[{{MediaWiki:createacct-captcha-help-url}}|Sol·liciteu un compte]]',
'createacct-imgcaptcha-ph' => 'Introduïu el text que apareix a dalt',
'createacct-benefit-heading' => '{{SITENAME}} és feta per gent com tu.',
'createacct-benefit-body1' => 'edicions',
Нагахьсан гlулкх цуьнах доьзна дацахь, хьуна карийна гlирс латточехь гlалат.
Дехар до, хаам бе оцуьнах [[Special:ListUsers/sysop|адаманкуьйгалхога]], гойтуш URL.',
-'missingarticle-rev' => '(варси № $1)',
+'missingarticle-rev' => '(верси № $1)',
'missingarticle-diff' => '(тейп тайпнара: $1, $2)',
'internalerror' => 'Чоьхьара гlалат',
'internalerror_info' => 'Чоьхьара гlалат: $1',
# History pages
'viewpagelogs' => 'Гайта хlокху агlонан тептар',
-'currentrev-asof' => 'Хlинцлера варси оцу $1',
-'revisionasof' => 'Ð\92арси $1',
+'currentrev-asof' => 'ХӀинцлера верси оцу $1',
+'revisionasof' => 'Ð\92ерси $1',
'previousrevision' => '← Хьалха йоьдург',
'nextrevision' => 'Тlаьхьайогlург →',
-'currentrevisionlink' => 'Ð¥lинÑ\86леÑ\80а варси',
+'currentrevisionlink' => 'Ð¥lинÑ\86леÑ\80а верси',
'cur' => 'карара.',
'next' => 'кхин',
'last' => 'хьалх.',
'filehist-thumb' => 'Жима',
'filehist-thumbtext' => 'Жимо башхо оцу $1',
'filehist-user' => 'Декъашхо',
-'filehist-dimensions' => 'Ð¥lÑ\83ман барам',
+'filehist-dimensions' => 'Файлан барам',
'filehist-comment' => 'Билгалдаккхар',
'imagelinks' => 'Хьажоригаш оцу файлан',
'linkstoimage' => '{{PLURAL:$1|Тlаьхьайогlу $1 агlо тlетойжина|Тlаьхьайогlу $1 агlонаш тlетойжина|Тlаьхьайогlу $1 агlонаш тlетойжина}} хlокху хlуман:',
+'nolinkstoimage' => 'АгӀонашчохь файл лелош яц.',
'sharedupload' => 'Хlара хlума оцун $1 чура ю иза хила мега лелош кхечу кхолламашкахь.',
'uploadnewversion-linktext' => 'Чуяккха керла башхо хlокху хlуман',
'shared-repo-name-wikimediacommons' => 'Викидlайуллуче',
</div>",
'filedelete-comment' => 'Бахьан:',
'filedelete-submit' => 'ДӀаяккха',
+'filedelete-success' => '$1 дӀаяккхи.',
'filedelete-otherreason' => 'Кхин бахьан:',
'filedelete-reason-otherlist' => 'Кхин бахьан',
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|байт|байташ|байт}}',
'ncategories' => '$1 {{PLURAL:$1|категори|категореш|категореш}}',
-'nmembers' => '$1 {{PLURAL:$1|файл|файлана|файлаш}}',
+'nmembers' => '$1 {{PLURAL:$1|файл|файл|файлаш}}',
'specialpage-empty' => 'Дехаро хlумма ца елла.',
'lonelypages' => 'Байлахь йисина агIонаш',
'uncategorizedpages' => 'Категори йоцу агIонаш',
'mostimages' => 'Массарел дуккха лелайо файлаш',
'mostrevisions' => 'Сих сиха нисйина йолу агIонаш',
'prefixindex' => 'Хьалха агlонашан цlераш хlотто йеза',
+'prefixindex-namespace' => 'Хьалха агӀонашан цӀераш хӀотто еза («{{ns:$1}}»)',
'shortpages' => 'Боцоа яззамаш',
'longpages' => 'Беха яззамаш',
'deadendpages' => 'Дика йоцу агIонаш',
'allpagesprefix' => 'Лаха агlонаш, дlайуьлалуш йолу:',
'allpagesbadtitle' => 'Цамагош йолу агlон цlе. Коьрта могlан юкъах ю юкъарвики меттанашан юкъе тlечlагlйина йолу хьаьрк йа магийна доцу оцу коьрта моlанца сабол элп йа кхин.',
'allpages-bad-ns' => '{{SITENAME}} кху чохь ана цlераш яц «$1».',
+'allpages-hide-redirects' => 'Къайлаяха дӀасахьажийнарш',
# Special:Categories
'categories' => 'Кадегарш',
'imagemaxsize' => "Суьртан бараман доза тохар:<br />''(Файла агӀона куц дийцар)''",
'thumbsize' => 'Жима дина суьртан барам:',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|агlо|агlонаш|агlонаш}}',
-'file-info-size' => '$1 × $2 сиртакх, хlуман барам: $3, MIME-тайп: $4',
+'file-info-size' => '$1 × $2 {{PLURAL:$2|пиксель|пикселш|пикселш}}, файлан барам: $3, MIME-тайп: $4',
'file-nohires' => 'Кхи йоккха гlоле башхо яц.',
-'svg-long-desc' => 'SVG-Ñ\85lÑ\83ма, Ñ\85lоÑ\82Ñ\82амÑ\86а $1 Ã\97 $2 Ñ\86инÑ\82аÑ\88, Ñ\85lÑ\83ман барам: $3',
+'svg-long-desc' => 'SVG-Ñ\84айл, лаÑ\80Ñ\82Ó\80аÑ\85Ñ\8c Ñ\8e $1 Ã\97 $2 {{PLURAL:$2|пикÑ\81елÑ\8c|пикÑ\81елÑ\88|пикÑ\81елÑ\88}}, Ñ\84айлан барам: $3',
'show-big-image' => 'Сурт цlанал лаккхара бакъонца',
# Special:NewFiles
# Metadata
'metadata' => 'Метахаамаш',
-'metadata-help' => 'Хlокху хlуманца кхин тlе хаам бу, даиман чуйоккхуш йолу терахьца чоьнашца йа тlейоккхучуьнца. Нагахь хlуман тlаьхьа хийцам биняхь, тlаккха цlхьаболу барам цlхьаьна ца ба мега хlинцлера суртаца.',
+'metadata-help' => 'ХӀокху файлаца кхин тӀе хаам бу, даиман чуйоккхуш йолу терахьца чоьнашца йа тӀейоккхучуьнца. Нагахь файлан тӀаьхьа хийцам биняхь, тӀаккха цӀхьаболу барам цӀхьаьна ца ба мега хӀинцалера суьртаца.',
'metadata-expand' => 'Гайта кхин тlе болу хаам',
'metadata-collapse' => 'Къайла баккха кхин тlе болу хаам',
'metadata-fields' => 'Метахааман майда, хьахийна йолу хlокху могlамца, lад-йитича гойтур ю суьрти агlонца, йисинарш хира ю къайлаха.
'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дийцаре]])',
# Special:Version
-'version' => 'Ð\92арси MediaWiki',
+'version' => 'Ð\92ерси MediaWiki',
'version-other' => 'Кхин',
# Special:FileDuplicateSearch
'createacct-reason-ph' => 'Proč si vytváříte další účet',
'createacct-captcha' => 'Bezpečnostní kontrola',
'createacct-captcha-help-url' => '{{ns:Project}}:Žádost o účet',
-'createacct-imgcaptcha-help' => 'Nevidíte obrázek? [[{{MediaWiki:createacct-captcha-help-url}}|Požádejte o účet]]',
'createacct-imgcaptcha-ph' => 'Opište výše zobrazený text',
'createacct-submit' => 'Vytvořit účet',
'createacct-benefit-heading' => '{{grammar:4sg|{{SITENAME}}}} tvoří lidé jako vy.',
'createacct-reason-ph' => 'Pam ydych yn creu cyfrif arall?',
'createacct-captcha' => 'Gwiriad diogelwch',
'createacct-captcha-help-url' => '{{ns:Project}}:Gwneud cais am gyfri',
-'createacct-imgcaptcha-help' => 'Methu gweld y ddelwedd? [[{{MediaWiki:createacct-captcha-help-url}}|Gwnewch gais am gyfrif]]',
'createacct-imgcaptcha-ph' => 'Nodwch y testun a welwch uchod',
'createacct-submit' => 'Creer y cyfrif',
'createacct-benefit-heading' => 'Ffrwyth llafur pobl fel chi yw {{SITENAME}}.',
'createacct-reason-ph' => 'Hvorfor vil du oprette endnu en konto',
'createacct-captcha' => 'Sikkerhedskontrol',
'createacct-captcha-help-url' => '{{ns:Project}}:Anmodning om konto',
-'createacct-imgcaptcha-help' => 'Billede ej tilgængeligt [[{{MediaWiki:createacct-captcha-help-url}}|Opret konto]]',
'createacct-imgcaptcha-ph' => 'Indtast venligst ovenstående tekst',
'createacct-submit' => 'Opret din konto',
'createacct-benefit-heading' => '{{SITENAME}} laves af mennesker som dig.',
'createacct-reason-ph' => 'Warum du ein anderes Benutzerkonto erstellst',
'createacct-captcha' => 'Sicherheitsprüfung',
'createacct-captcha-help-url' => '{{ns:Project}}:Benutzerkontenanträge',
-'createacct-imgcaptcha-help' => 'Das Bild ist nicht sichtbar? [[{{MediaWiki:createacct-captcha-help-url}}|Beantrage ein Benutzerkonto]].',
'createacct-imgcaptcha-ph' => 'Gib den Text ein, den du oben siehst.',
'createacct-submit' => 'Dein Benutzerkonto erstellen',
'createacct-benefit-heading' => '{{SITENAME}} wird von Leuten wie dir erstellt.',
'gotaccount' => "Hesabê şıma esto? '''$1'''.",
'gotaccountlink' => 'Cı kewe',
'userlogin-resetlink' => 'Melumatê cıkewtışi xo vira kerdê?',
+'userlogin-resetpassword-link' => 'Parolaya xo reset ke',
'helplogin-url' => 'Help:Qeydbiyayış',
'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Desteg be qeydbiyayış ra]]',
'createacct-join' => 'Cêr melumatê xo cı ke',
'createacct-realname' => 'Nameyo raştıkên (mecburi niyo)',
'createaccountreason' => 'Sebeb:',
'createacct-reason' => 'Sebeb',
+'createacct-reason-ph' => 'Şımaye çı xo re zewbi hesab vırazeni?',
'createacct-captcha' => 'Qontrolê asayişi',
'createacct-captcha-help-url' => '{{ns:Project}}:Yew hesab bıwaze',
-'createacct-imgcaptcha-help' => 'Resım nêvêniya? [[{{MediaWiki:createacct-captcha-help-url}}|Yew hesab bıwaze]]',
'createacct-imgcaptcha-ph' => 'Nuşteyo ke cor aseno ey cı ke',
'createacct-submit' => 'Hesabê xo vıraze',
'createacct-benefit-body1' => '{{PLURAL:$1|vurnayış|vurnayışi}}',
'linksearch-ok' => 'Cı geyre',
'linksearch-text' => 'Jokeri ê zey "*.wikipedia.org"i benê ke bıgureniyê.
Tewr senık yew sewiya serêna cayê tesiri lazıma, mesela "*.org".<br />
-Qeydeyê destegbiyayey: <code>$1</code> (qet yew qeydeyo hesabiyaye http:// ke name nêbiyo).',
+Qeydeyê {{PLURAL:$2|protoqol|protoqoli}}:destegbiyayey: <code>$1</code> (qet yew qeydeyo hesabiyaye http:// ke name nêbiyo).',
'linksearch-line' => '$1, $2 ra link biya',
'linksearch-error' => 'jokeri têna nameyê makina ya serekini de aseni/eseni.',
# Special:ActiveUsers
'activeusers' => 'Listey karberan de aktivan',
'activeusers-intro' => 'Ena yew listeya karberê ke $1 {{PLURAL:$1|roc|rocan}} ra tepya iştiraq kerdo ênan mocneno.',
-'activeusers-count' => 'Karberi {{PLURAL:$3|roce peyni de|$3 roca peyni de}} $1 {{PLURAL:$1|vurnayış|vurnayışi}} kerdê',
+'activeusers-count' => '$1 peyni {{PLURAL:$3|roz de|$3 rozan de}} $1 {{PLURAL:$1|hereket|hereketi}} kerdê',
'activeusers-from' => 'Enê karberi ra tepya bımocne:',
'activeusers-hidebots' => 'Botan bınımne',
'activeusers-hidesysops' => 'İdarekerdoğan bınımne',
'watchnologintext' => 'qey vurnayişê listeya temaşakerdışi [[Special:UserLogin|gani şıma hesab akeri]].',
'addwatch' => 'Listeyê seyri deke',
'addedwatchtext' => 'Ma pele "[[:$1]]" zerri [[Special:Watchlist|watchlist]]ê tı kerd de.
-Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni. Hem zi çı dem ma tu ri heber dun, zerri [[Special:RecentChanges|list of recent changes]] name pele beno qalın. Tı ri beno qolay çıta vurnaye biyo.',
+Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.',
'removewatch' => 'Listedê mınê seyr kerdışi ra hewad',
'removedwatchtext' => 'Ena pela "[[:$1]]" biya wedariya [[Special:Watchlist|listeyê seyr-kerdışi şıma]].',
'watch' => 'Temaşe ke',
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Article path]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Script path]',
+# Special:Redirect
+'redirect' => "Hetenayışa dosyay, karberi yana rewizyona ID'i",
+'redirect-legend' => 'Hetenayışa dosya yana pela',
+'redirect-submit' => 'Şo',
+'redirect-lookup' => 'Bewni',
+'redirect-value' => 'Erc:',
+'redirect-user' => "ID'ê Karberi",
+'redirect-revision' => 'Rewizyona pela',
+'redirect-file' => 'Namey dosya',
+'redirect-not-exists' => 'Erc nêvineyê',
+
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Dosyayanê zey pêyan cı geyrê',
'fileduplicatesearch-summary' => 'Dosyanê çıftan bınê têmiyankewteyan de bıgeyre.',
'htmlform-selectorother-other' => 'Bin',
'htmlform-no' => 'Nê',
'htmlform-yes' => 'Eya',
+'htmlform-chosen-placeholder' => 'Opsiyon weçine',
# SQLite database support
'sqlite-has-fts' => '$1 tam-metn destegê cı geyrayışiya piya',
'createacct-reason-ph' => 'Γιατί δημιουργείτε έναν άλλο λογαριασμό',
'createacct-captcha' => 'Έλεγχος ασφαλείας',
'createacct-captcha-help-url' => '{{ns:Project}}:Κάντε αίτηση για σύνδεση',
-'createacct-imgcaptcha-help' => 'Δεν μπορειτε να δείτε την εικόνα; [[{{MediaWiki:createacct-captcha-βοήθεια-url}}|Κάντε αίτηση για σύνδεση]]',
'createacct-imgcaptcha-ph' => 'Εισαγωγή του κειμένου που βλέπετε παραπάνω',
'createacct-benefit-body1' => 'επεξεργασίες',
'createacct-benefit-body2' => 'σελίδες',
begin with * or ** are discarded, furthermore lines that do begin with ** and
do not contain | are also discarded, but do not depend on this behavior for
future releases. Also note that since each list value is wrapped in a unique
-XHTML id it should only appear once and include characters that are legal
-XHTML id names.
+(X)HTML id it should only appear once and include characters that are legal
+(X)HTML id names.
*/
'sidebar' => '
* navigation
'yourname' => 'Username:',
'userlogin-yourname' => 'Username',
'userlogin-yourname-ph' => 'Enter your username',
-'createacct-helpusername-url' => '{{ns:Project}}:Username_policy',
-'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(help me choose)]]',
+'createacct-helpusername' => '', # do not translate or duplicate this message to other languages
'yourpassword' => 'Password:',
'userlogin-yourpassword' => 'Password',
'userlogin-yourpassword-ph' => 'Enter your password',
'createacct-reason' => 'Reason',
'createacct-reason-ph' => 'Why you are creating another account',
'createacct-captcha' => 'Security check',
-'createacct-captcha-help-url' => '{{ns:Project}}:Request an account',
-'createacct-imgcaptcha-help' => "Can't see the image? [[{{MediaWiki:createacct-captcha-help-url}}|Request an account]]",
+'createacct-imgcaptcha-help' => '', # do not translate or duplicate this message to other languages
'createacct-imgcaptcha-ph' => 'Enter the text you see above',
'createacct-submit' => 'Create your account',
'createacct-benefit-heading' => '{{SITENAME}} is made by people like you.',
'createacct-reason-ph' => 'Por qué estás creando otra cuenta',
'createacct-captcha' => 'Comprobación de seguridad',
'createacct-captcha-help-url' => '{{ns:Project}}:Solicitar una cuenta',
-'createacct-imgcaptcha-help' => '¿No ves la imagen? [[{{MediaWiki:createacct-captcha-help-url}}|Solicitar una cuenta]]',
'createacct-imgcaptcha-ph' => 'Escribe el texto de arriba',
'createacct-submit' => 'Crea tu cuenta',
'createacct-benefit-heading' => '{{SITENAME}} lo construye gente como tú.',
'createacct-reason-ph' => 'Miks lood teist kontot?',
'createacct-captcha' => 'Turvakontroll',
'createacct-captcha-help-url' => '{{ns:Project}}:Kontotaotlus',
-'createacct-imgcaptcha-help' => 'Kas sa ei näe pilti? [[{{MediaWiki:createacct-captcha-help-url}}|Taotle kontot]]',
'createacct-imgcaptcha-ph' => 'Sisesta ülalnähtav tekst',
'createacct-submit' => 'Loo oma konto',
'createacct-benefit-heading' => '{{SITENAME}} on sinusuguste inimeste tehtud.',
'createacct-reason-ph' => 'Tunnuksen luomisen syy',
'createacct-captcha' => 'Turvatarkastus',
'createacct-captcha-help-url' => '{{ns:Project}}:Pyydä tunnusta',
-'createacct-imgcaptcha-help' => 'Et näe kuvaa? [[{{MediaWiki:createacct-captcha-help-url}}|Pyydä tunnusta]]',
'createacct-imgcaptcha-ph' => 'Kirjoita teksti, jonka näet edellä',
'createacct-submit' => 'Luo tunnus',
'createacct-benefit-heading' => '{{SITENAME}} on sinun kaltaisesi ihmisten tekemä.',
'createacct-reason' => 'Orsøk',
'createacct-captcha' => 'Trygdarkekk',
'createacct-captcha-help-url' => '{{ns:Project}}:Bílegg eina konto',
-'createacct-imgcaptcha-help' => 'Sært tú ikki myndina? [[{{MediaWiki:createacct-captcha-help-url}}|Bið um eina konto]]',
'createacct-imgcaptcha-ph' => 'Skriva tekstin ið tú sært omanfyri',
'createacct-benefit-heading' => '{{SITENAME}} er gjørd av fólki sum tær.',
'createacct-benefit-body1' => 'rættingar',
'createacct-reason-ph' => 'Pourquoi créez-vous un autre compte',
'createacct-captcha' => 'Contrôle de sécurité',
'createacct-captcha-help-url' => '{{ns:Project}}:Demander un compte',
-'createacct-imgcaptcha-help' => "Vous ne pouvez pas voir l'image ? [[{{MediaWiki:createacct-captcha-help-url}}|Demandez la création d'un compte]]",
'createacct-imgcaptcha-ph' => 'Entrez le texte que vous voyez ci-dessus',
'createacct-submit' => 'Créez votre compte',
'createacct-benefit-heading' => '{{SITENAME}} est écrit par des gens comme vous.',
'createacct-reason-ph' => 'Huaram dü en ööder brükerkonto iinrachtst',
'createacct-captcha' => 'Seekerhaidspreew',
'createacct-captcha-help-url' => '{{ns:Project}}:Am en brükerkonto uunfraage',
-'createacct-imgcaptcha-help' => 'Könst det bil ei sä ? [[{{MediaWiki:createacct-captcha-help-url}}|Am en brükerkonto uunfraage]]',
'createacct-imgcaptcha-ph' => 'Skriiw di tekst, diar dü boowen schochst',
'createacct-submit' => 'Din brükerkonto iinracht',
'createacct-benefit-heading' => '{{SITENAME}} woort faan lidj üs di maaget.',
'createacct-reason-ph' => 'Por que crea outra conta?',
'createacct-captcha' => 'Comprobación de seguridade',
'createacct-captcha-help-url' => '{{ns:Project}}:Solicitar unha conta',
-'createacct-imgcaptcha-help' => 'Non pode ver a imaxe? [[{{MediaWiki:createacct-captcha-help-url}}|Solicite unha conta]]',
'createacct-imgcaptcha-ph' => 'Insira o texto que ve enriba',
'createacct-submit' => 'Crear a conta',
'createacct-benefit-heading' => 'Xente coma vostede elabora {{SITENAME}}.',
'yourpassword' => 'ગુપ્ત સંજ્ઞા:',
'userlogin-yourpassword' => 'ગુપ્ત સંજ્ઞા',
'userlogin-yourpassword-ph' => 'ગુપ્ત સંજ્ઞા લખો',
+'createacct-yourpassword-ph' => 'પાસવર્ડ દાખલ કરો',
'yourpasswordagain' => 'ગુપ્ત સંજ્ઞા (પાસવર્ડ) ફરી લખો',
+'createacct-yourpasswordagain' => 'પાસવર્ડની ખાતરી કરો',
+'createacct-yourpasswordagain-ph' => 'પાસવર્ડ ફરીથી દાખલ કરો',
'remembermypassword' => 'આ કોમ્યૂટર પર મારી લૉગ ઇન વિગતો ધ્યાનમાં રાખો (વધુમાં વધુ $1 {{PLURAL:$1|દિવસ|દિવસ}} માટે)',
-'userlogin-remembermypassword' => 'મને યાદ રાખો',
+'userlogin-remembermypassword' => 'મને પ્રવેશિત રાખો',
+'userlogin-signwithsecure' => 'સલામત જોડાણ વાપરો',
'securelogin-stick-https' => 'લોગ-ઈન કર્યા પછી HTTPS સાથે જોડાયેલા રહો.',
'yourdomainname' => 'તમારૂં ડોમેઇન:',
'password-change-forbidden' => 'તમે આ વિકિ માટે પાસવર્ડ્સ બદલી શકતા નથી.',
'gotaccount' => "પહેલેથી ખાતું ખોલેલું છે? '''$1'''.",
'gotaccountlink' => 'પ્રવેશ કરો',
'userlogin-resetlink' => 'પોતાની પ્રવેશ માહિતી ભૂલી ગયા છો?',
+'userlogin-resetpassword-link' => 'તમારો પાસવર્ડ બદલો',
+'helplogin-url' => 'Help:પ્રવેશ માટે',
+'createacct-join' => 'તમારી માહિતી નીચે દાખલ કરો.',
+'createacct-emailrequired' => 'ઇમેલ સરનામું',
+'createacct-emailoptional' => 'ઇમેલ સરનામું (વૈકલ્પિક)',
+'createacct-email-ph' => 'તમારું ઇમેલ સરનામું દાખલ કરો',
'createaccountmail' => 'કામચલાઉ ગમે-તેમ પાસવર્ડ વાપરો અને તેને નીચે આપેલ ઇમેલ સરનામા પર મોકલો',
+'createacct-realname' => 'સાચું નામ (વૈકલ્પિક)',
'createaccountreason' => 'કારણ:',
+'createacct-reason' => 'કારણ',
+'createacct-captcha' => 'સલામતી ચકાસણી',
+'createacct-captcha-help-url' => '{{ns:Project}}:ખાતાની વિનંતી કરો',
+'createacct-imgcaptcha-ph' => 'તમે જે લખાણ જુઓ છો તે દાખલ કરો',
+'createacct-submit' => 'તમારું ખાતું બનાવો',
+'createacct-benefit-body1' => '{{PLURAL:$1|ફેરફાર|ફેરફારો}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|પાનું|પાનાંઓ}}',
+'createacct-benefit-body3' => 'તાજેતરનાં {{PLURAL:$1|યોગદાનકર્તા|યોગદાનકર્તાઓ}}',
'badretype' => 'તમે દાખલ કરેલ ગુપ્તસંજ્ઞા મળતી આવતી નથી.',
'userexists' => 'દાખલ કરેલું સભ્ય નુ નામ વપરાશમાં છે.</br>
કૃપયા અન્ય નામ પસંદ કરો.',
'loginerror' => 'પ્રવેશ ત્રુટિ',
+'createacct-error' => 'ખાતું બનાવવામાં ક્ષતિ આવી',
'createaccounterror' => 'ખાતું ખોલી શકાયું નથી: $1',
'nocookiesnew' => 'તમારુ સભ્ય ખાતું બની ગયું છે પણ તમે પ્રવેશ (લોગ ઇન) કર્યો નથી.
'pageinfo-robot-noindex' => 'અનુક્રમિય નહી',
'pageinfo-views' => 'જોનારાની સંખ્યા',
'pageinfo-watchers' => 'પાના નીરીક્ષકોની સંખ્યા',
+'pageinfo-redirects-name' => 'આ પાનાં પર વાળો',
'pageinfo-subpages-name' => 'આ પાનાંનું ઉપપાનું',
'pageinfo-firstuser' => 'પૃષ્ઠ સર્જક',
'pageinfo-firsttime' => 'પૃષ્ઠ સર્જનની તારીખ',
'ago' => '$1 પહેલાં',
'just-now' => 'હમણાં',
+# Human-readable timestamps
+'monday-at' => '$1 પર સોમવાર',
+'tuesday-at' => '$1 પર મંગળવાર',
+'wednesday-at' => '$1 પર બુધવાર',
+'thursday-at' => '$1 પર ગુરુવાર',
+'friday-at' => '$1 પર શુક્રવાર',
+'saturday-at' => '$1 પર શનિવાર',
+'sunday-at' => '$1 પર રવિવાર',
+'yesterday-at' => '$1 પર ગઇકાલ',
+
# Bad image list
'bad_image_list' => 'ફોર્મેટ નીચે મુજબ છે:
'version-entrypoints-header-entrypoint' => 'પ્રવેશ સ્થળ',
'version-entrypoints-header-url' => 'URL',
+# Special:Redirect
+'redirect-submit' => 'જાઓ',
+'redirect-revision' => 'પાનાંની આવૃત્તિ',
+'redirect-file' => 'ફાઇલ નામ',
+'redirect-not-exists' => 'કિંમત મળી નહી',
+
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'નકલ ફાઇલ શોધો',
'fileduplicatesearch-summary' => 'હેશ કિંમત પર આધારિત આબેહૂબ ફાઇલો શોધો.',
'htmlform-selectorother-other' => 'અન્ય',
'htmlform-no' => 'ના',
'htmlform-yes' => 'હા',
+'htmlform-chosen-placeholder' => 'વિકલ્પ પસંદ કરો',
# SQLite database support
'sqlite-has-fts' => '$1 પૂર્ણ શબ્દ શોધ સહીત',
'logentry-delete-revision' => '$1 બદલાઈ ના દૃશ્યતા {{PLURAL: $5 | સુધારણા | $5 આવૃત્તિઓ}} $3 પાનાં પર: $4',
'logentry-delete-event-legacy' => '$1 બદલાઈ $3 પર લોગ ઘટનાઓ દૃશ્યતા',
'logentry-delete-revision-legacy' => '$1 બદલાઈ પાનાં પર આવૃત્તિઓની દૃશ્યતા $3',
-'logentry-suppress-delete' => '$1 દબાવà«\80 પાનà«\81àª\82 $3',
+'logentry-suppress-delete' => '$1 àª\8f $3 પાનà«\81àª\82 {{GENDER:$2|દબાવà«\8dયà«\81àª\82}}',
'logentry-suppress-event' => '$1 (છાની માહિતી) બદલાઈ {{PLURAL: $5 | લોગ ઘટના | $5 લોગ}} ની દ્રશ્યતા $3 : $4',
'logentry-suppress-revision' => '$1 બદલાઈ ના દૃશ્યતા {{PLURAL: $5 | આવૃત્તિ એ | $5 આવૃત્તિઓ}}: $4 $3 પાનાં પર',
'logentry-suppress-event-legacy' => '$1 ગુપ્ત બદલો $3 પર લોગ ઘટનાઓ દૃશ્યતા',
'createacct-reason-ph' => '汝做麽嘅愛創建另一隻帳號',
'createacct-captcha' => '安全檢查',
'createacct-captcha-help-url' => '{{ns:Project}}:請求建立用戶',
-'createacct-imgcaptcha-help' => '看毋到圖像係無?[[{{MediaWiki:createacct-captcha-help-url}}|請求建立用戶]]',
'createacct-imgcaptcha-ph' => '輸入汝在上背看到嘅字符',
'createacct-submit' => '建立帳號',
'createacct-benefit-heading' => '{{SITENAME}}是由撈您共樣嘅人建立。',
'createacct-reason-ph' => 'סיבה ליצירת חשבון נוסף',
'createacct-captcha' => 'בדיקת אבטחה',
'createacct-captcha-help-url' => '{{ns:Project}}:בקשה לחשבון',
-'createacct-imgcaptcha-help' => 'לא רואים את התמונה? [[{{MediaWiki:createacct-captcha-help-url}}|בקשו חשבון]]',
'createacct-imgcaptcha-ph' => 'יש להקליד את הטקסט המופיע למעלה',
'createacct-submit' => 'יצירת החשבון',
'createacct-benefit-heading' => 'את האתר {{SITENAME}} יוצרים אנשים כמוך.',
'createacct-reason-ph' => 'Mengapa Anda membuat akun lain',
'createacct-captcha' => 'Pemeriksaan keamanan',
'createacct-captcha-help-url' => '{{ns:Project}}:Mohon buatkan akun',
-'createacct-imgcaptcha-help' => 'Tidak dapat melihat gambar? [[{{MediaWiki:createacct-captcha-help-url}}|Mohon buatkan akun]]',
'createacct-imgcaptcha-ph' => 'Masukkan teks yang Anda lihat di atas',
'createacct-submit' => 'Buat akun Anda',
'createacct-benefit-heading' => '{{SITENAME}} dibuat oleh orang-orang seperti Anda.',
'createacct-reason-ph' => "Perché stai creando un'altra utenza",
'createacct-captcha' => 'Controllo di sicurezza',
'createacct-captcha-help-url' => '{{ns:Project}}:Richieste di utenze',
-'createacct-imgcaptcha-help' => "Non riesci a vedere l'immagine? [[{{MediaWiki:createacct-captcha-help-url}}|Richiedi un'utenza]]",
'createacct-imgcaptcha-ph' => 'Inserisci il testo che vedi sopra',
'createacct-submit' => 'Crea la tua utenza',
'createacct-benefit-heading' => '{{SITENAME}} è fatta da persone come te.',
'createacct-reason-ph' => 'アカウントを作成する理由',
'createacct-captcha' => '自動作成防止チェック',
'createacct-captcha-help-url' => '{{ns:Project}}:アカウント申請',
-'createacct-imgcaptcha-help' => '画像が表示されない場合は[[{{MediaWiki:createacct-captcha-help-url}}|アカウント作成を依頼してください]]',
'createacct-imgcaptcha-ph' => '上に表示されている文字列を入力',
'createacct-submit' => 'アカウントを作成',
'createacct-benefit-heading' => '{{SITENAME}}は、あなたのような人々が創っています。',
'createacct-reason-ph' => 'មូលហេតុដែលអ្នកចង់បង្កើតគណនីមួយទៀត',
'createacct-captcha' => 'ត្រួតពិនិត្យសុវត្ថិភាព',
'createacct-captcha-help-url' => '{{ns:Project}}:ការស្នើសុំគណនីមួយ',
-'createacct-imgcaptcha-help' => 'តើអ្នកមើលមិនឃើញរូបឬ? [[{{MediaWiki:createacct-captcha-help-url}}|សូមស្នើសុំគណនីមួយ]]',
'createacct-imgcaptcha-ph' => 'បញ្ចូលឃ្លាដែលអ្នកឃើញខាងលើ',
'createacct-submit' => 'បង្កើតគណនីរបស់អ្នក',
'createacct-benefit-heading' => '{{SITENAME}} ត្រូវបង្កើតឡើងដោយបុគ្គលដូចអ្នកជាដើម។',
'createacct-reason-ph' => '왜 다른 계정을 만들어야 합니까',
'createacct-captcha' => '보안 검사',
'createacct-captcha-help-url' => '{{ns:Project}}:계정 요청',
-'createacct-imgcaptcha-help' => '그림을 볼 수 없습니까? [[{{MediaWiki:createacct-captcha-help-url}}|계정을 요청할 수 있습니다]]',
'createacct-imgcaptcha-ph' => '위에 보이는 텍스트를 입력하세요',
'createacct-submit' => '계정 만들기',
'createacct-benefit-heading' => '{{SITENAME}}(은)는 여러분과 같은 사람으로 이루어집니다.',
'createacct-reason-ph' => 'Fir wat Dir een anere Benotzerkonnt uleet',
'createacct-captcha' => 'Sécherheets-Check',
'createacct-captcha-help-url' => '{{ns:Project}}:E Benotzerkont ufroen',
-'createacct-imgcaptcha-help' => "Dir kënnt d'Bild net gesinn? [[{{MediaWiki:createacct-captcha-help-url}}|Frot e Benotzerkont]]",
'createacct-imgcaptcha-ph' => 'Gitt den Text an deen Dir hei driwwer gesitt',
'createacct-submit' => 'Äre Benotzerkont uleeën',
'createacct-benefit-heading' => '{{SITENAME}} gëtt vu Leit wéi Iech gemaach.',
'policy-url' => 'Project:Kabijakan',
'portal' => 'Portal komunitas',
'portal-url' => 'Project:Portal komunitas',
-'privacy' => 'Kacipehan privasi',
-'privacypage' => 'Project:Kacipehan privasi',
+'privacy' => 'Kabijakan privasi',
+'privacypage' => 'Project:Kabijakan privasi',
'badaccess' => 'Kasalahan hak akses',
'badaccess-group0' => 'Sanak indak diizinkan untuak malakuan tindakan ko.',
'createacct-reason-ph' => 'Manga Sanak mambuek akun lain',
'createacct-captcha' => 'Pamarisoan kaamanan',
'createacct-captcha-help-url' => '{{ns:Project}}:Pamintaan mambuek akun',
-'createacct-imgcaptcha-help' => 'Indak dapek mancaliak gambar? [[{{MediaWiki:createacct-captcha-help-url}}|Mintaklah mambuek akun]]',
'createacct-imgcaptcha-ph' => 'Masuakan teks nan Sanak caliak di ateh',
'createacct-submit' => 'Buek akun Sanak',
'createacct-benefit-heading' => '{{SITENAME}} dibuek dek urang-urang saroman Sanak.',
'createacct-reason-ph' => 'Зошто правите друга сметка',
'createacct-captcha' => 'Безбедносна проверка',
'createacct-captcha-help-url' => '{{ns:Project}}:Барање_на_сметка',
-'createacct-imgcaptcha-help' => 'Не можете да ја видите сликата? [[{{MediaWiki:createacct-captcha-help-url}}|Побарајте сметка]]',
'createacct-imgcaptcha-ph' => 'Внесете го гореприкажаниот текст',
'createacct-submit' => 'Направи ја',
'createacct-benefit-heading' => '{{SITENAME}} е дело на луѓе како вас.',
'createacct-reason-ph' => 'താങ്കൾ എന്തുകൊണ്ടാണ് മറ്റൊരു അംഗത്വം എടുക്കുന്നത്',
'createacct-captcha' => 'സുരക്ഷാ പരിശോധന',
'createacct-captcha-help-url' => '{{ns:Project}}:അംഗത്വമാവശ്യപ്പെടുക',
-'createacct-imgcaptcha-help' => 'ചിത്രം കാണാനാവുന്നില്ലേ? [[{{MediaWiki:createacct-captcha-help-url}}|അംഗത്വമാവശ്യപ്പെടുക]]',
'createacct-imgcaptcha-ph' => 'മുകളിൽ കാണുന്ന എഴുത്ത് ഇവിടെ നൽകുക',
'createacct-submit' => 'താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കുക',
'createacct-benefit-heading' => 'താങ്കളെപ്പോലെയുള്ളവരാണ് {{SITENAME}} പടുത്തുയർത്തിയിരിക്കുന്നത്.',
'createacct-reason-ph' => 'Waarom u een andere gebruiker aanmaakt',
'createacct-captcha' => 'Veiligheidscontrole',
'createacct-captcha-help-url' => '{{ns:Project}}:Gebruiker_aanvragen',
-'createacct-imgcaptcha-help' => 'Kunt u de afbeelding niet zien? [[{{MediaWiki:createacct-captcha-help-url}}|Vraag dan een gebruiker aan]]',
'createacct-imgcaptcha-ph' => 'Geef de tekst in die u hierboven ziet',
'createacct-submit' => 'Gebruiker aanmaken',
'createacct-benefit-heading' => '{{SITENAME}} wordt gemaakt door mensen zoals u.',
'createacct-reason-ph' => 'Цæмæн аразыс æндæр аккаунт?',
'createacct-captcha' => 'Æдасдзинад бæлвырдгæнæн',
'createacct-captcha-help-url' => '{{ns:Project}}:Аккаунт æрдомæн',
-'createacct-imgcaptcha-help' => 'Ныв нæ уыныс? [[{{MediaWiki:createacct-captcha-help-url}}|Аккаунт æрдом]]',
'createacct-imgcaptcha-ph' => 'Уæлдæр цы текст уыныс, уый бафысс',
'createacct-submit' => 'Сараз дæ аккаунт',
'createacct-benefit-heading' => '{{SITENAME}} сарæзтой дæ хуызæн адæм.',
'jul' => 'luj',
'aug' => 'ost',
'sep' => 'stè',
-'oct' => 'Otó',
-'nov' => 'Nov',
+'oct' => 'otó',
+'nov' => 'nov',
'dec' => 'Dzè',
# Categories related messages
'createacct-reason-ph' => 'Por que você está criando outra conta',
'createacct-captcha' => 'Verificação de segurança',
'createacct-captcha-help-url' => '{{ns:Project}}:Solicitar uma conta',
-'createacct-imgcaptcha-help' => 'Não consegue ver a imagem? [[{{MediaWiki:createacct-captcha-help-url}}|Solicitar uma conta]]',
'createacct-imgcaptcha-ph' => 'Digite o texto acima',
'createacct-submit' => 'Crie sua conta',
'createacct-benefit-heading' => '{{SITENAME}} é feita por pessoas como você.',
'userlogin-yourname-ph' => 'Placeholder text in new userlogin/create account form field.
See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1] and [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
-'createacct-helpusername-url' => 'The URL of a page providing username guidance for the wiki.
-Used as a link in the {{msg-mw|Createacct-helpusername}} on WMF wikis.',
-'createacct-helpusername-link' => 'Message in new create account form providing guidance for username.
+'createacct-helpusername' => 'Message in new create account form providing guidance for username.
See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
'yourpassword' => 'In user preferences
See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
'createacct-captcha' => 'Label in vertical-layout create account form for CAPTCHA input field when repositioned by JavaScript.',
-'createacct-captcha-help-url' => 'The URL of a page providing CAPTCHA assistance for the wiki.
-
-Used as a link in {{msg-mw|Createacct-imgcaptcha-help}}.',
-'createacct-imgcaptcha-help' => 'Help text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.',
'createacct-imgcaptcha-ph' => 'Placehodler text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.',
'createacct-submit' => 'Submit button on vertical-layout create account form.
'createacct-reason-ph' => 'De ce creați un alt cont',
'createacct-captcha' => 'Verificare de securitate',
'createacct-captcha-help-url' => '{{ns:Project}}:Solicitare cont',
-'createacct-imgcaptcha-help' => 'Nu puteți vedea imaginea? [[{{MediaWiki:createacct-captcha-help-url}}|Solicitați un cont]]',
'createacct-imgcaptcha-ph' => 'Introduceți textul pe care îl vedeți deasupra',
'createacct-submit' => 'Creați-vă contul',
'createacct-benefit-heading' => '{{SITENAME}} este un proiect clădit de oameni ca dumneavoastră.',
'createacct-reason-ph' => "Purcé tu ste ccreje 'n'otre cunde utende?",
'createacct-captcha' => 'Verifiche de securezze',
'createacct-captcha-help-url' => "{{ns:Project}}:Cirche 'nu cunde",
-'createacct-imgcaptcha-help' => "Non ge puè 'ndrucà l'immaggine? [[{{MediaWiki:createacct-captcha-help-url}}|Cirche 'nu cunde]]",
'createacct-imgcaptcha-ph' => "Mitte 'u teste tune aqquà sus",
'createacct-submit' => "Ccreje 'u cunde utende tune",
'createacct-benefit-heading' => '{{SITENAME}} jè fatte da crestiane cumme a te.',
'createacct-reason-ph' => 'Zakaj ustvarjate drug račun',
'createacct-captcha' => 'Varnostno preverjanje',
'createacct-captcha-help-url' => '{{ns:Project}}:Prošnja za račun',
-'createacct-imgcaptcha-help' => 'Ne vidite slike? [[{{MediaWiki:createacct-captcha-help-url}}|Zaprosite za račun]]',
'createacct-imgcaptcha-ph' => 'Vnesite zgornje besedilo',
'createacct-submit' => 'Ustvarite svoj račun',
'createacct-benefit-heading' => '{{GRAMMAR:tožilnik|{{SITENAME}}}} ustvarjajo ljudje, kot ste vi.',
'createacct-reason-ph' => 'Varför du skapar ett annat konto',
'createacct-captcha' => 'Säkerhetskontroll',
'createacct-captcha-help-url' => '{{ns:Project}}:Begär ett konto',
-'createacct-imgcaptcha-help' => 'Kan du inte se bilden? [[{{MediaWiki:createacct-captcha-help-url}}|Begär ett konto]]',
'createacct-imgcaptcha-ph' => 'Fyll i texten du ser ovan',
'createacct-submit' => 'Skapa ditt konto',
'createacct-benefit-heading' => '{{SITENAME}} är skapad av människor som dig.',
'createacct-reason-ph' => 'మీరు మరో ఖాతాను ఎందుకు సృష్టించుకుంటున్నారు',
'createacct-captcha' => 'భద్రతా తనిఖీ',
'createacct-captcha-help-url' => '{{ns:Project}}:ఖాతా కొరకు అభ్యర్థించండి',
-'createacct-imgcaptcha-help' => 'బొమ్మను చూడలేకున్నారా? [[{{MediaWiki:createacct-captcha-help-url}}|ఒక ఖాతా కొరకు అభ్యర్థించండి]]',
'createacct-imgcaptcha-ph' => 'పైన కనబడే మాటలను ఇక్కడ ఇవ్వండి',
'createacct-submit' => 'మీ ఖాతాను సృష్టించుకోండి',
'createacct-benefit-heading' => '{{SITENAME}}ను తయారుచేసేది మీలాంటి ప్రజలే.',
'createacct-reason' => 'Причина',
'createacct-captcha' => 'Перевірка безпеки',
'createacct-captcha-help-url' => '{{ns:Project}}:Запити на облікові записи',
-'createacct-imgcaptcha-help' => 'Не бачите зображення? [[{{MediaWiki:createacct-captcha-help-url}}|Зробіть запит на обліковий запис]]',
'createacct-imgcaptcha-ph' => 'Введіть текст, що Ви бачите вище',
'createacct-benefit-heading' => '{{SITENAME}} створюється такі ж люди як Ви.',
'createacct-benefit-body1' => 'редагування',
'createacct-reason' => 'وجہ',
'createacct-captcha' => 'حفاظتی تدبیر',
'createacct-captcha-help-url' => '{{ns:Project}}: ایک اکاؤنٹ کی درخواست کریں',
-'createacct-imgcaptcha-help' => 'یہ تصویر نہیں دیکھ سکتے؟
-[[{{MediaWiki:createacct-captcha-help-url}}|اکاؤنٹ بنانے کے لیے درخواست کریں]]',
'createacct-imgcaptcha-ph' => 'آپ اوپر دیکھ متن داخل کریں',
'createacct-benefit-heading' => '{{SITENAME}} آپ جیسے لوگوں کی طرف سے بنایا گیا ہے ۔',
'createacct-benefit-body1' => 'ترمیم',
'createacct-reason-ph' => "Com'èla te sì drio crear n'altra utensa",
'createacct-captcha' => 'Controlo de sicuresa',
'createacct-captcha-help-url' => '{{ns:Project}}:Dimanda na utensa',
-'createacct-imgcaptcha-help' => "No sito mia bon de védar l'imagine? [[{{MediaWiki:createacct-captcha-help-url}}|Dimanda na utensa]]",
'createacct-imgcaptcha-ph' => 'Inserissi el testo che te vedi de sora',
'createacct-submit' => 'Crea la to utensa',
'createacct-benefit-heading' => '{{SITENAME}} xe fato da gente come ti.',
'createacct-reason-ph' => 'Nhập lý do tạo một tài khoản khác',
'createacct-captcha' => 'Kiểm tra an toàn',
'createacct-captcha-help-url' => '{{ns:Project}}:Yêu cầu tạo tài khoản',
-'createacct-imgcaptcha-help' => 'Bạn không thấy hình ảnh? [[{{MediaWiki:createacct-captcha-help-url}}|Yêu cầu có tài khoản]]',
'createacct-imgcaptcha-ph' => 'Nhập dòng chữ bạn thấy bên dưới',
'createacct-submit' => 'Tạo tài khoản',
'createacct-benefit-heading' => '{{SITENAME}} được xây dựng bởi những người như bạn.',
'createacct-reason-ph' => 'פֿארוואס שאפֿט איר נאך א קאנטע',
'createacct-captcha' => 'פארזיכערן קאנטראל',
'createacct-captcha-help-url' => '{{ns:Project}}:בעטן א קאנטע',
-'createacct-imgcaptcha-help' => 'בילד נישט זעבאר? [[{{MediaWiki:createacct-captcha-help-url}}|Request an account]]',
'createacct-imgcaptcha-ph' => 'קלאפט ארײַן דעם טעקסט איר זעט אויבן',
'createacct-submit' => 'שאפֿט אײַער קאנטע',
'createacct-benefit-heading' => '{{SITENAME}} איז געמאכט דורך מענטשן ווי איר.',
'createaccountreason' => 'Ìdíẹ̀:',
'createacct-reason' => 'Ìdí',
'createacct-captcha-help-url' => '{{ns:Project}}:Ẹ tọrọ àkópamọ́',
-'createacct-imgcaptcha-help' => 'Ṣé àwòrán kò hàn dáadáa sí yín? [[{{MediaWiki:createacct-captcha-help-url}}|Ẹ tọrọ àkópamọ́]]',
'createacct-imgcaptcha-ph' => 'Ẹ kọ ìkọ̀rọ̀ tí ẹ rí lókè',
'createacct-benefit-heading' => 'Àwọn ènìyàn bíi yín ni wọ́n dá {{SITENAME}}.',
'createacct-benefit-body1' => 'àtúnṣe',
'createacct-reason-ph' => '为什么您要创建另一个帐户',
'createacct-captcha' => '安全检查',
'createacct-captcha-help-url' => '{{ns:Project}}:账号请求',
-'createacct-imgcaptcha-help' => '无法看到图像吗?[[{{MediaWiki:createacct-captcha-help-url}}|去请求一个帐户]]',
'createacct-imgcaptcha-ph' => '输入您在上面看到的文本',
'createacct-submit' => '创建您的账户',
'createacct-benefit-heading' => '{{SITENAME}} 是由像你这样的人建立的。',
'createacct-reason-ph' => '您為甚麼要創建另一個帳號',
'createacct-captcha' => '安全驗證',
'createacct-captcha-help-url' => '{{ns:Project}}:請求建立用戶',
-'createacct-imgcaptcha-help' => '無法看到圖像嗎?[[{{MediaWiki:createacct-captcha-help-url}}|請求建立用戶]]',
'createacct-imgcaptcha-ph' => '輸入您在上面看到的字符',
'createacct-submit' => '建立帳號',
'createacct-benefit-heading' => '{{SITENAME}}是由像您一樣的人建立。',
if ( !$valid ) print "\nW3C web validation failed - view details with: html2text " . DIRECTORY . "/" . $testname . ".validator_output.html";
}
- // Get tidy to check the page, unless we already know it produces non-XHTML output.
+ // Get tidy to check the page, unless we already know it produces non-(X)HTML output.
if ( $test->tidyValidate() ) {
$valid = tidyCheckFile( $testname . HTML_FILE ) && $valid;
}
'deletedarticle',
// 'uploadedimage',
// 'overwroteimage',
+ 'createacct-helpusername',
+ 'createacct-imgcaptcha-help',
'userlogout-summary',
'changeemail-summary',
'changepassword-summary',
'yourname',
'userlogin-yourname',
'userlogin-yourname-ph',
- 'createacct-helpusername-url',
- 'createacct-helpusername-link',
+ 'createacct-helpusername',
'yourpassword',
'userlogin-yourpassword',
'userlogin-yourpassword-ph',
'createacct-reason',
'createacct-reason-ph',
'createacct-captcha',
- 'createacct-captcha-help-url',
'createacct-imgcaptcha-help',
'createacct-imgcaptcha-ph',
'createacct-submit',
$output = $content->getParserOutput( $title, null, $options );
file_put_contents( $filename,
- "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" " .
- "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" .
- "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" .
+ "<!DOCTYPE html>\n" .
+ "<html lang=\"en\" dir=\"ltr\">\n" .
"<head>\n" .
- "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n" .
+ "<meta charset=\"UTF-8\" />\n" .
"<title>" . htmlspecialchars( $display ) . "</title>\n" .
"</head>\n" .
"<body>\n" .
font-weight: bold;
}
-/* shuffled CAPTCHA */
+/**** shuffled CAPTCHA ****/
#wpCaptchaWord {
margin-top: 6px;
}
text-align: center;
}
-.mw-createacct-captcha-image-container {
- background-color: #fff;
- min-height: 95px;
-}
-
.mw-createacct-captcha-assisted {
display: block;
margin-top: 0.5em;
}
+/* Put a border around the fancycaptcha-image-container. */
.mw-createacct-captcha-and-reload {
border: 1px solid #c9c9c9;
- display: table-cell;
+ display: table-cell; /* Other display formats end up too wide */
width: 270px;
background-color: #FFF;
}
-.mw-createacct-captcha-and-reload .confirmedit-captcha-reload {
- display: block;
- float: right;
+/* Make the fancycaptcha-image-container full-width within its parent. */
+.fancycaptcha-image-container
+{
+ width: 100%;
}
-/* Benefits column CSS to the right (if it fits) of the form. */
+/**** Benefits column CSS to the right (if it fits) of the form. ****/
.mw-ui-container #userloginForm {
float: left;
}
$submit = $content.find( '#wpCreateaccount' ),
tabIndex,
$captchaStuff,
+ $captchaImageContainer,
+ // JavaScript can't yet parse the message createacct-imgcaptcha-help when it
+ // contains a MediaWiki transclusion, so PHP parses it and sends the HTML.
helpMsg = mw.config.get( 'wgCreateacctImgcaptchaHelp' ),
- captchaImage;
+ helpHtml = '';
/*
* CAPTCHA
if ( $captchaStuff.length ) {
- // The FancyCaptcha image has this class in the ConfirmEdit extension
+ // The FancyCaptcha has this class in the ConfirmEdit extension
// after 2013-04-18.
- captchaImage = $captchaStuff.find( 'img.fancycaptcha-image' );
- if ( captchaImage.length !== 1 ) {
+ $captchaImageContainer = $captchaStuff.find( '.fancycaptcha-image-container' );
+ if ( $captchaImageContainer.length !== 1 ) {
return;
}
$captchaStuff.remove();
- // Insert another div before the submit button.
+ if ( helpMsg) {
+ helpHtml = '<small class="mw-createacct-captcha-assisted">' + helpMsg + '</small>';
+ }
+
+ // Insert another div before the submit button that will include the
+ // repositioned FancyCaptcha div, an input field, and possible help.
$submit.closest( 'div' )
.before( [
'<div>',
'<label for="wpCaptchaWord">' + mw.message( 'createacct-captcha' ).escaped() + '</label>',
'<div class="mw-createacct-captcha-container">',
- '<div class="mw-createacct-captcha-and-reload">',
- '<div class="mw-createacct-captcha-image-container">',
- '<img id="mw-createacct-captcha" alt="PLACEHOLDER">',
- '</div>',
- '</div>',
+ '<div class="mw-createacct-captcha-and-reload" />',
'<input id="wpCaptchaWord" name="wpCaptchaWord" type="text" placeholder="' +
mw.message( 'createacct-imgcaptcha-ph' ).escaped() +
'" tabindex="' + tabIndex + '" autocapitalize="off" autocorrect="off">',
- '<small class="mw-createacct-captcha-assisted">' + helpMsg + '</small>',
+ helpHtml,
'</div>',
'</div>'
].join( '' )
);
- // Replace the placeholder img with the img from the old CAPTCHA.
- captchaImage.replaceAll( $content.find( '#mw-createacct-captcha' ) );
-
- // Append CAPTCHA reload, if any.
- $( '.mw-createacct-captcha-and-reload' ).append( $captchaStuff.find( '.confirmedit-captcha-reload' ) );
+ // Stick the FancyCaptcha container inside our bordered and framed parents.
+ $captchaImageContainer
+ .prependTo( $content.find( '.mw-createacct-captcha-and-reload' ) );
// Find the input field, add the text (if any) of the existing CAPTCHA
// field (although usually it's blanked out on every redisplay),
.after( $captchaStuff.find( '#wpCaptchaId' ) );
}
- });
+ } );
}( mediaWiki, jQuery ) );
</p>
!! end
+!! test
+Parsoid link trail escaping
+!! options
+parsoid=html2wt,html2html
+!! input
+[[apple]]<nowiki/>s
+!! result
+<p><a rel="mw:WikiLink" href="Apple">apple</a>s</p>
+!! end
+
+!! test
+Parsoid link prefix escaping
+!! options
+language=is
+parsoid=html2wt,html2html
+!! input
+Aðrir mótmælenda<nowiki/>[[söfnuður]]
+!! result
+<p>Aðrir mótmælenda<a rel="mw:WikiLink" href="Söfnuður">söfnuður</a></p>
+!! end
+
!! test
Parsoid-centric test: Whitespace in ext- and wiki-links should be preserved
!! input
--- /dev/null
+<?php
+
+/**
+ * Unit tests for the HTMLCheckMatrix form field
+ */
+class HtmlCheckMatrixTest extends MediaWikiTestCase {
+ static private $defaultOptions = array(
+ 'rows' => array( 'r1', 'r2' ),
+ 'columns' => array( 'c1', 'c2' ),
+ 'fieldname' => 'test',
+ );
+
+ public function testPlainInstantiation() {
+ try {
+ $form = new HTMLCheckMatrix( array() );
+ } catch ( MWException $e ) {
+ $this->assertInstanceOf( 'HTMLFormFieldRequiredOptionsException', $e );
+ return;
+ }
+
+ $this->fail('Expected MWException indicating missing parameters but none was thrown.');
+ }
+
+ public function testInstantiationWithMinimumRequiredParameters() {
+ $form = new HTMLCheckMatrix( self::$defaultOptions );
+ $this->assertTrue(true); // form instantiation must throw exception on failure
+ }
+
+ public function testValidateCallsUserDefinedValidationCallback() {
+ $called = false;
+ $field = new HTMLCheckMatrix( self::$defaultOptions + array(
+ 'validation-callback' => function() use ( &$called ) {
+ $called = true;
+ return false;
+ },
+ ) );
+ $this->assertEquals( false, $this->validate( $field, array() ) );
+ $this->assertTrue( $called );
+ }
+
+ public function testValidateRequiresArrayInput() {
+ $field = new HTMLCheckMatrix( self::$defaultOptions );
+ $this->assertEquals( false, $this->validate( $field, null ) );
+ $this->assertEquals( false, $this->validate( $field, true ) );
+ $this->assertEquals( false, $this->validate( $field, 'abc' ) );
+ $this->assertEquals( false, $this->validate( $field, new stdClass ) );
+ $this->assertEquals( true, $this->validate( $field, array() ) );
+ }
+
+ public function testValidateAllowsOnlyKnownTags() {
+ $field = new HTMLCheckMatrix( self::$defaultOptions );
+ $this->assertInternalType('string', $this->validate( $field, array( 'foo' ) ) );
+ }
+
+ public function testValidateAcceptsPartialTagList() {
+ $field = new HTMLCheckMatrix( self::$defaultOptions );
+ $this->assertTrue( $this->validate( $field, array() ) );
+ $this->assertTrue( $this->validate( $field, array( 'c1-r1' ) ) );
+ $this->assertTrue( $this->validate( $field, array( 'c1-r1', 'c1-r2', 'c2-r1', 'c2-r2' ) ) );
+ }
+
+ /**
+ * This form object actually has no visibility into what happens later on, but essentially
+ * if the data submitted by the user passes validate the following is run:
+ * foreach ( $field->filterDataForSubmit( $data ) as $k => $v ) {
+ * $user->setOption( $k, $v );
+ * }
+ */
+ public function testValuesForcedOnRemainOn() {
+ $field = new HTMLCheckMatrix( self::$defaultOptions + array(
+ 'force-options-on' => array( 'c2-r1' ),
+ ) );
+ $expected = array(
+ 'c1-r1' => false,
+ 'c1-r2' => false,
+ 'c2-r1' => true,
+ 'c2-r2' => false,
+ );
+ $this->assertEquals($expected, $field->filterDataForSubmit( array() ) );
+ }
+
+ public function testValuesForcedOffRemainOff() {
+ $field = new HTMLCheckMatrix( self::$defaultOptions + array(
+ 'force-options-off' => array( 'c1-r2', 'c2-r2' ),
+ ) );
+ $expected = array(
+ 'c1-r1' => true,
+ 'c1-r2' => false,
+ 'c2-r1' => true,
+ 'c2-r2' => false,
+ );
+ // array_keys on the result simulates submitting all fields checked
+ $this->assertEquals($expected, $field->filterDataForSubmit( array_keys($expected) ) );
+ }
+
+ protected function validate( HTMLFormField $field, $submitted ) {
+ return $field->validate(
+ $submitted,
+ array( self::$defaultOptions['fieldname'] => $submitted )
+ );
+ }
+}
'wgLanguageCode' => $langCode,
'wgContLang' => $langObj,
'wgLang' => $langObj,
- 'wgHtml5' => true,
'wgWellFormedXml' => false,
) );
}
);
}
+ public function dataXmlMimeType() {
+ return array(
+ // ( $mimetype, $isXmlMimeType )
+ # HTML is not an XML MimeType
+ array( 'text/html', false ),
+ # XML is an XML MimeType
+ array( 'text/xml', true ),
+ array( 'application/xml', true ),
+ # XHTML is an XML MimeType
+ array( 'application/xhtml+xml', true ),
+ # Make sure other +xml MimeTypes are supported
+ # SVG is another random MimeType even though we don't use it
+ array( 'image/svg+xml', true ),
+ # Complete random other MimeTypes are not XML
+ array( 'text/plain', false ),
+ );
+ }
+
+ /**
+ * @dataProvider dataXmlMimeType
+ */
+ public function testXmlMimeType( $mimetype, $isXmlMimeType ) {
+ $this->assertEquals( $isXmlMimeType, Html::isXmlMimeType( $mimetype ) );
+ }
+
public function testExpandAttributesSkipsNullAndFalse() {
### EMPTY ########
Html::expandAttributes( array( 'selected' => true ) ),
'Boolean attributes have empty string value when value is true (wgWellFormedXml)'
);
-
- $this->setMwGlobals( 'wgHtml5', false );
-
- $this->assertEquals(
- ' selected="selected"',
- Html::expandAttributes( array( 'selected' => true ) ),
- 'Boolean attributes have their key as value when value is true (wgWellFormedXml, wgHTML5 = false)'
- );
}
/**
*/
function testRemovehtmltagsOnHtml5Tags( $tag, $escaped ) {
$this->setMwGlobals( array(
- # Enable HTML5 mode
- 'wgHtml5' => true,
'wgUseTidy' => false
) );
protected function setUp() {
parent::setUp();
$this->setMwGlobals( array(
- 'wgHtml5' => true,
'wgWellFormedXml' => true,
) );
$this->select = new XmlSelect();
$this->setMwGlobals( array(
'wgLang' => $langObj,
- 'wgHtml5' => true,
'wgWellFormedXml' => true,
) );
}
$tmpGlobals['wgRawHtml'] = false;
$tmpGlobals['wgUseTidy'] = false;
$tmpGlobals['wgAlwaysUseTidy'] = false;
- $tmpGlobals['wgHtml5'] = true;
$tmpGlobals['wgWellFormedXml'] = true;
$tmpGlobals['wgAllowMicrodataAttributes'] = true;
$tmpGlobals['wgExperimentalHtmlIds'] = false;
'createtalk' => true,
) );
$tmpGlobals['wgNamespaceProtection'] = array( NS_MEDIAWIKI => 'editinterface' );
- $tmpGlobals['wgMemc'] = new EmptyBagOStuff;
- $tmpGlobals['messageMemc'] = wfGetMessageCacheStorage();
- $tmpGlobals['parserMemc'] = wfGetParserCacheStorage();
$tmpGlobals['wgParser'] = new StubObject( 'wgParser', $GLOBALS['wgParserConf']['class'], array( $GLOBALS['wgParserConf'] ) );
RepoGroup::destroySingleton();
FileBackendGroup::destroySingleton();
+ // Remove temporary pages from the link cache
+ LinkCache::singleton()->clear();
+
+ // Restore message cache (temporary pages and $wgUseDatabaseMessages)
+ MessageCache::destroyInstance();
+
parent::tearDown();
}
__METHOD__
);
- # Clear the message cache
- MessageCache::singleton()->clear();
-
$user = User::newFromId( 0 );
LinkCache::singleton()->clear(); # Avoids the odd failure at creating the nullRevision
}
MagicWord::clearCache();
+
+ # The entries saved into RepoGroup cache with previous globals will be wrong.
RepoGroup::destroySingleton();
FileBackendGroup::destroySingleton();
# Publish the articles after we have the final language set
$this->publishTestArticles();
- # The entries saved into RepoGroup cache with previous globals will be wrong.
- RepoGroup::destroySingleton();
- FileBackendGroup::destroySingleton();
MessageCache::destroyInstance();
return $context;
foreach ( $this->savedGlobals as $var => $val ) {
$GLOBALS[$var] = $val;
}
-
- RepoGroup::destroySingleton();
- LinkCache::singleton()->clear();
}
/**