Merge "Simplify code for updating tooltips with accesskey tips"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 24 May 2016 21:10:08 +0000 (21:10 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 24 May 2016 21:10:08 +0000 (21:10 +0000)
49 files changed:
autoload.php
docs/hooks.txt
includes/DefaultSettings.php
includes/DummyLinker.php
includes/Linker.php
includes/MediaWikiServices.php
includes/ServiceWiring.php
includes/api/i18n/es.json
includes/api/i18n/gl.json
includes/api/i18n/it.json
includes/auth/AbstractPasswordPrimaryAuthenticationProvider.php
includes/filerepo/file/LocalFile.php
includes/gallery/TraditionalImageGallery.php
includes/libs/HtmlArmor.php [new file with mode: 0644]
includes/linker/LinkRenderer.php [new file with mode: 0644]
includes/linker/LinkRendererFactory.php [new file with mode: 0644]
includes/revisiondelete/RevDelArchiveList.php
includes/revisiondelete/RevDelRevisionList.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialWithoutinterwiki.php
includes/user/User.php
languages/i18n/ba.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/et.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/gor.json
languages/i18n/he.json
languages/i18n/inh.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/ko.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/nl.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/qqq.json
languages/i18n/shn.json
languages/i18n/sv.json
languages/i18n/uk.json
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/TestUser.php
tests/phpunit/includes/libs/HtmlArmorTest.php [new file with mode: 0644]
tests/phpunit/includes/linker/LinkRendererFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/linker/LinkRendererTest.php [new file with mode: 0644]

index c68b703..f635bc1 100644 (file)
@@ -557,6 +557,7 @@ $wgAutoloadLocalClasses = [
        'HistoryPager' => __DIR__ . '/includes/actions/HistoryAction.php',
        'Hooks' => __DIR__ . '/includes/Hooks.php',
        'Html' => __DIR__ . '/includes/Html.php',
+       'HtmlArmor' => __DIR__ . '/includes/libs/HtmlArmor.php',
        'HtmlFormatter' => __DIR__ . '/includes/HtmlFormatter.php',
        'Http' => __DIR__ . '/includes/HttpFunctions.php',
        'HttpError' => __DIR__ . '/includes/exception/HttpError.php',
@@ -834,6 +835,8 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Interwiki\\InterwikiLookup' => __DIR__ . '/includes/interwiki/InterwikiLookup.php',
        'MediaWiki\\Languages\\Data\\Names' => __DIR__ . '/languages/data/Names.php',
        'MediaWiki\\Languages\\Data\\ZhConversion' => __DIR__ . '/languages/data/ZhConversion.php',
+       'MediaWiki\\Linker\\LinkRenderer' => __DIR__ . '/includes/linker/LinkRenderer.php',
+       'MediaWiki\\Linker\\LinkRendererFactory' => __DIR__ . '/includes/linker/LinkRendererFactory.php',
        'MediaWiki\\Linker\\LinkTarget' => __DIR__ . '/includes/linker/LinkTarget.php',
        'MediaWiki\\Logger\\LegacyLogger' => __DIR__ . '/includes/debug/logger/LegacyLogger.php',
        'MediaWiki\\Logger\\LegacySpi' => __DIR__ . '/includes/debug/logger/LegacySpi.php',
index 9d2b3c2..c91354d 100644 (file)
@@ -1783,7 +1783,8 @@ $title: The page's Title.
 $out: The output page.
 $cssClassName: CSS class name of the language selector.
 
-'LinkBegin': Used when generating internal and interwiki links in
+'LinkBegin': DEPRECATED! Use HtmlPageLinkRendererBegin instead.
+Used when generating internal and interwiki links in
 Linker::link(), before processing starts.  Return false to skip default
 processing and return $ret. See documentation for Linker::link() for details on
 the expected meanings of parameters.
@@ -1800,7 +1801,8 @@ $target: the Title that the link is pointing to
 &$options: array of options.  Can include 'known', 'broken', 'noclasses'.
 &$ret: the value to return if your hook returns false.
 
-'LinkEnd': Used when generating internal and interwiki links in Linker::link(),
+'LinkEnd': DEPRECATED! Use HtmlPageLinkRendererEnd hook instead
+Used when generating internal and interwiki links in Linker::link(),
 just before the function returns a value.  If you return true, an <a> element
 with HTML attributes $attribs and contents $html will be returned.  If you
 return false, $ret will be returned.
@@ -1835,6 +1837,35 @@ $file: the File object or false if broken link
 &$attribs: the attributes to be applied
 &$ret: the value to return if your hook returns false
 
+'LinkRendererBegin':
+Used when generating internal and interwiki links in
+LinkRenderer, before processing starts.  Return false to skip default
+processing and return $ret.
+$linkRenderer: the LinkRenderer object
+$target: the LinkTarget that the link is pointing to
+&$html: the contents that the <a> tag should have (raw HTML); null means
+  "default".
+&$customAttribs: the HTML attributes that the <a> tag should have, in
+  associative array form, with keys and values unescaped.  Should be merged
+  with default values, with a value of false meaning to suppress the
+  attribute.
+&$query: the query string to add to the generated URL (the bit after the "?"),
+  in associative array form, with keys and values unescaped.
+&$ret: the value to return if your hook returns false.
+
+'LinkRendererEnd':
+Used when generating internal and interwiki links in LinkRenderer,
+just before the function returns a value.  If you return true, an <a> element
+with HTML attributes $attribs and contents $html will be returned.  If you
+return false, $ret will be returned.
+$linkRenderer: the LinkRenderer object
+$target: the LinkTarget object that the link is pointing to
+$isKnown: boolean indicating whether the page is known or not
+&$html: the final (raw HTML) contents of the <a> tag, after processing.
+&$attribs: the final HTML attributes of the <a> tag, after processing, in
+  associative array form.
+&$ret: the value to return if your hook returns false.
+
 'LinksUpdate': At the beginning of LinksUpdate::doUpdate() just before the
 actual update.
 &$linksUpdate: the LinksUpdate object
index d2f55b6..3257b3a 100644 (file)
@@ -4545,9 +4545,40 @@ $wgAuthManagerAutoConfig = [
 ];
 
 /**
- * If it has been this long since the last authentication, recommend
- * re-authentication before security-sensitive operations (e.g. password or
- * email changes). Set negative to disable.
+ * Time frame for re-authentication.
+ *
+ * With only password-based authentication, you'd just ask the user to re-enter
+ * their password to verify certain operations like changing the password or
+ * changing the account's email address. But under AuthManager, the user might
+ * not have a password (you might even have to redirect the browser to a
+ * third-party service or something complex like that), you might want to have
+ * both factors of a two-factor authentication, and so on. So, the options are:
+ * - Incorporate the whole multi-step authentication flow within everything
+ *   that needs to do this.
+ * - Consider it good if they used Special:UserLogin during this session within
+ *   the last X seconds.
+ * - Come up with a third option.
+ *
+ * MediaWiki currently takes the second option. This setting configures the
+ * "X seconds".
+ *
+ * This allows for configuring different time frames for different
+ * "operations". The operations used in MediaWiki core include:
+ * - LinkAccounts
+ * - UnlinkAccount
+ * - ChangeCredentials
+ * - RemoveCredentials
+ * - ChangeEmail
+ *
+ * Additional operations may be used by extensions, either explicitly by
+ * calling AuthManager::securitySensitiveOperationStatus(),
+ * ApiAuthManagerHelper::securitySensitiveOperation() or
+ * SpecialPage::checkLoginSecurityLevel(), or implicitly by overriding
+ * SpecialPage::getLoginSecurityLevel() or by subclassing
+ * AuthManagerSpecialPage.
+ *
+ * The key 'default' is used if a requested operation isn't defined in the array.
+ *
  * @since 1.27
  * @var int[] operation => time in seconds. A 'default' key must always be provided.
  */
@@ -4556,8 +4587,18 @@ $wgReauthenticateTime = [
 ];
 
 /**
- * Whether to allow security-sensitive operations when authentication is not possible.
+ * Whether to allow security-sensitive operations when re-authentication is not possible.
+ *
+ * If AuthManager::canAuthenticateNow() is false (e.g. the current
+ * SessionProvider is not able to change users, such as when OAuth is in use),
+ * AuthManager::securitySensitiveOperationStatus() cannot sensibly return
+ * SEC_REAUTH. Setting an operation true here will have it return SEC_OK in
+ * that case, while setting it false will have it return SEC_FAIL.
+ *
+ * The key 'default' is used if a requested operation isn't defined in the array.
+ *
  * @since 1.27
+ * @see $wgReauthenticateTime
  * @var bool[] operation => boolean. A 'default' key must always be provided.
  */
 $wgAllowSecuritySensitiveOperationIfCannotReauthenticate = [
index 6545c4a..d9330ee 100644 (file)
@@ -72,7 +72,7 @@ class DummyLinker {
                $html = null,
                $customAttribs = [],
                $query = [],
-               $options = [ 'known', 'noclasses' ]
+               $options = [ 'known' ]
        ) {
                return Linker::linkKnown(
                        $target,
index 20ff09d..990ad15 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 use MediaWiki\Linker\LinkTarget;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Some internal bits split of from Skin.php. These functions are used
@@ -210,55 +211,33 @@ class Linker {
                        wfDeprecated( __METHOD__ . ' with parameter $query as string (should be array)', '1.20' );
                        $query = wfCgiToArray( $query );
                }
-               $options = (array)$options;
-
-               $dummy = new DummyLinker; // dummy linker instance for bc on the hooks
 
-               $ret = null;
-               if ( !Hooks::run( 'LinkBegin',
-                       [ $dummy, $target, &$html, &$customAttribs, &$query, &$options, &$ret ] )
-               ) {
-                       return $ret;
-               }
-
-               # Normalize the Title if it's a special page
-               $target = self::normaliseSpecialPage( $target );
-
-               # If we don't know whether the page exists, let's find out.
-               if ( !in_array( 'known', $options, true ) && !in_array( 'broken', $options, true ) ) {
-                       if ( $target->isKnown() ) {
-                               $options[] = 'known';
-                       } else {
-                               $options[] = 'broken';
+               $services = MediaWikiServices::getInstance();
+               $options = (array)$options;
+               if ( $options ) {
+                       // Custom options, create new LinkRenderer
+                       if ( !isset( $options['stubThreshold'] ) ) {
+                               global $wgUser;
+                               $options['stubThreshold'] = $wgUser->getStubThreshold();
                        }
+                       $linkRenderer = $services->getLinkRendererFactory()
+                               ->createFromLegacyOptions( $options );
+               } else {
+                       $linkRenderer = $services->getLinkRenderer();
                }
 
-               $oldquery = [];
-               if ( in_array( "forcearticlepath", $options, true ) && $query ) {
-                       $oldquery = $query;
-                       $query = [];
-               }
-
-               # Note: we want the href attribute first, for prettiness.
-               $attribs = [ 'href' => self::linkUrl( $target, $query, $options ) ];
-               if ( in_array( 'forcearticlepath', $options, true ) && $oldquery ) {
-                       $attribs['href'] = wfAppendQuery( $attribs['href'], $oldquery );
-               }
-
-               $attribs = array_merge(
-                       $attribs,
-                       self::linkAttribs( $target, $customAttribs, $options )
-               );
-               if ( is_null( $html ) ) {
-                       $html = self::linkText( $target );
+               if ( $html !== null ) {
+                       $text = new HtmlArmor( $html );
+               } else {
+                       $text = $html; // null
                }
-
-               $ret = null;
-               if ( Hooks::run( 'LinkEnd', [ $dummy, $target, $options, &$html, &$attribs, &$ret ] ) ) {
-                       $ret = Html::rawElement( 'a', $attribs, $html );
+               if ( in_array( 'known', $options, true ) ) {
+                       return $linkRenderer->makeKnownLink( $target, $text, $customAttribs, $query );
+               } elseif ( in_array( 'broken', $options, true ) ) {
+                       return $linkRenderer->makeBrokenLink( $target, $text, $customAttribs, $query );
+               } else {
+                       return $linkRenderer->makeLink( $target, $text, $customAttribs, $query );
                }
-
-               return $ret;
        }
 
        /**
@@ -269,135 +248,11 @@ class Linker {
         */
        public static function linkKnown(
                $target, $html = null, $customAttribs = [],
-               $query = [], $options = [ 'known', 'noclasses' ]
+               $query = [], $options = [ 'known' ]
        ) {
                return self::link( $target, $html, $customAttribs, $query, $options );
        }
 
-       /**
-        * Returns the Url used to link to a Title
-        *
-        * @param LinkTarget $target
-        * @param array $query Query parameters
-        * @param array $options
-        * @return string
-        */
-       private static function linkUrl( LinkTarget $target, $query, $options ) {
-               # We don't want to include fragments for broken links, because they
-               # generally make no sense.
-               if ( in_array( 'broken', $options, true ) && $target->hasFragment() ) {
-                       $target = $target->createFragmentTarget( '' );
-               }
-
-               # If it's a broken link, add the appropriate query pieces, unless
-               # there's already an action specified, or unless 'edit' makes no sense
-               # (i.e., for a nonexistent special page).
-               if ( in_array( 'broken', $options, true ) && empty( $query['action'] )
-                       && $target->getNamespace() !== NS_SPECIAL ) {
-                       $query['action'] = 'edit';
-                       $query['redlink'] = '1';
-               }
-
-               if ( in_array( 'http', $options, true ) ) {
-                       $proto = PROTO_HTTP;
-               } elseif ( in_array( 'https', $options, true ) ) {
-                       $proto = PROTO_HTTPS;
-               } else {
-                       $proto = PROTO_RELATIVE;
-               }
-
-               $title = Title::newFromLinkTarget( $target );
-               $ret = $title->getLinkURL( $query, false, $proto );
-               return $ret;
-       }
-
-       /**
-        * Returns the array of attributes used when linking to the Title $target
-        *
-        * @param Title $target
-        * @param array $attribs
-        * @param array $options
-        *
-        * @return array
-        */
-       private static function linkAttribs( $target, $attribs, $options ) {
-               global $wgUser;
-               $defaults = [];
-
-               if ( !in_array( 'noclasses', $options, true ) ) {
-                       # Now build the classes.
-                       $classes = [];
-
-                       if ( in_array( 'broken', $options, true ) ) {
-                               $classes[] = 'new';
-                       }
-
-                       if ( $target->isExternal() ) {
-                               $classes[] = 'extiw';
-                       }
-
-                       if ( !in_array( 'broken', $options, true ) ) { # Avoid useless calls to LinkCache (see r50387)
-                               $colour = self::getLinkColour(
-                                       $target,
-                                       isset( $options['stubThreshold'] ) ? $options['stubThreshold'] : $wgUser->getStubThreshold()
-                               );
-                               if ( $colour !== '' ) {
-                                       $classes[] = $colour; # mw-redirect or stub
-                               }
-                       }
-                       if ( $classes != [] ) {
-                               $defaults['class'] = implode( ' ', $classes );
-                       }
-               }
-
-               # Get a default title attribute.
-               if ( $target->getPrefixedText() == '' ) {
-                       # A link like [[#Foo]].  This used to mean an empty title
-                       # attribute, but that's silly.  Just don't output a title.
-               } elseif ( in_array( 'known', $options, true ) ) {
-                       $defaults['title'] = $target->getPrefixedText();
-               } else {
-                       // This ends up in parser cache!
-                       $defaults['title'] = wfMessage( 'red-link-title', $target->getPrefixedText() )
-                               ->inContentLanguage()
-                               ->text();
-               }
-
-               # Finally, merge the custom attribs with the default ones, and iterate
-               # over that, deleting all "false" attributes.
-               $ret = [];
-               $merged = Sanitizer::mergeAttributes( $defaults, $attribs );
-               foreach ( $merged as $key => $val ) {
-                       # A false value suppresses the attribute, and we don't want the
-                       # href attribute to be overridden.
-                       if ( $key != 'href' && $val !== false ) {
-                               $ret[$key] = $val;
-                       }
-               }
-               return $ret;
-       }
-
-       /**
-        * Default text of the links to the Title $target
-        *
-        * @param Title $target
-        *
-        * @return string
-        */
-       private static function linkText( $target ) {
-               if ( !$target instanceof Title ) {
-                       wfWarn( __METHOD__ . ': Requires $target to be a Title object.' );
-                       return '';
-               }
-               // If the target is just a fragment, with no title, we return the fragment
-               // text.  Otherwise, we return the title text itself.
-               if ( $target->getPrefixedText() === '' && $target->hasFragment() ) {
-                       return htmlspecialchars( $target->getFragment() );
-               }
-
-               return htmlspecialchars( $target->getPrefixedText() );
-       }
-
        /**
         * Make appropriate markup for a link to the current article. This is
         * currently rendered as the bold link text. The calling sequence is the
@@ -940,7 +795,15 @@ class Linker {
                        $redir = RepoGroup::singleton()->getLocalRepo()->checkRedirect( $title );
 
                        if ( $redir ) {
-                               return self::linkKnown( $title, $encLabel, [], wfCgiToArray( $query ) );
+                               // We already know it's a redirect, so mark it
+                               // accordingly
+                               return self::link(
+                                       $title,
+                                       $encLabel,
+                                       [ 'class' => 'mw-redirect' ],
+                                       wfCgiToArray( $query ),
+                                       [ 'known', 'noclasses' ]
+                               );
                        }
 
                        $href = self::getUploadUrl( $title, $query );
@@ -950,7 +813,7 @@ class Linker {
                                $encLabel . '</a>';
                }
 
-               return self::linkKnown( $title, $encLabel, [], wfCgiToArray( $query ) );
+               return self::link( $title, $encLabel, [], wfCgiToArray( $query ), [ 'known', 'noclasses' ] );
        }
 
        /**
index 1b8a759..6613db1 100644 (file)
@@ -11,6 +11,8 @@ use LBFactory;
 use LinkCache;
 use Liuggio\StatsdClient\Factory\StatsdDataFactory;
 use LoadBalancer;
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\Services\SalvageableService;
 use MediaWiki\Services\ServiceContainer;
 use MWException;
@@ -516,6 +518,25 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'LinkCache' );
        }
 
+       /**
+        * @since 1.28
+        * @return LinkRendererFactory
+        */
+       public function getLinkRendererFactory() {
+               return $this->getService( 'LinkRendererFactory' );
+       }
+
+       /**
+        * LinkRenderer instance that can be used
+        * if no custom options are needed
+        *
+        * @since 1.28
+        * @return LinkRenderer
+        */
+       public function getLinkRenderer() {
+               return $this->getService( 'LinkRenderer' );
+       }
+
        /**
         * @since 1.28
         * @return TitleFormatter
index 6bdacf0..2250935 100644 (file)
@@ -38,6 +38,8 @@
  */
 
 use MediaWiki\Interwiki\ClassicInterwikiLookup;
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\MediaWikiServices;
 
 return [
@@ -159,6 +161,18 @@ return [
                );
        },
 
+       'LinkRendererFactory' => function( MediaWikiServices $services ) {
+               return new LinkRendererFactory(
+                       $services->getTitleFormatter()
+               );
+       },
+
+       'LinkRenderer' => function( MediaWikiServices $services ) {
+               global $wgUser;
+
+               return $services->getLinkRendererFactory()->createForUser( $wgUser );
+       },
+
        'GenderCache' => function( MediaWikiServices $services ) {
                return new GenderCache();
        },
index 5d65c44..657fe3e 100644 (file)
        "apihelp-query+allusers-example-Y": "Listar usuarios que empiecen por <kbd>Y</kbd>.",
        "apihelp-query+filerepoinfo-example-login": "Captura de las solicitudes que puede ser utilizadas al comienzo de inicio de sesión.",
        "apihelp-query+backlinks-param-pageid": "Identificador de página que buscar. No puede usarse junto con <var>$1title</var>",
+       "apihelp-query+backlinks-param-filterredir": "Cómo filtrar redirecciones. Si se establece a <kbd>nonredirects</kbd> cuando está activo <var>$1redirect</var>, esto sólo se aplica al segundo nivel.",
        "apihelp-query+backlinks-param-limit": "Cuántas páginas en total se devolverán. Si está activo <var>$1redirect</var>, el límite aplica a cada nivel por separado (lo que significa que se pueden devolver hasta 2 * <var>$1limit</var> resultados).",
        "apihelp-query+backlinks-example-simple": "Mostrar enlaces a <kbd>Main page</kbd>.",
        "apihelp-query+backlinks-example-generator": "Obtener información acerca de las páginas enlazadas a <kbd>Main page</kbd>.",
index be92dc2..79ae607 100644 (file)
@@ -39,6 +39,8 @@
        "apihelp-block-param-watchuser": "Vixiar a páxina de usuario ou direccións IP e a de conversa deste usuario",
        "apihelp-block-example-ip-simple": "Bloquear dirección IP <kbd>192.0.2.5</kbd> durante tres días coa razón <kbd>Primeiro aviso</kbd>.",
        "apihelp-block-example-user-complex": "Bloquear indefinidamente ó usuario <kbd>Vandal</kbd> coa razón <kbd>Vandalism</kbd>, e impedir a creación de novas contas e envío de correos electrónicos.",
+       "apihelp-changeauthenticationdata-description": "Cambiar os datos de autenticación do usuario actual.",
+       "apihelp-changeauthenticationdata-example-password": "Intento de cambiar o contrasinal do usuario actua a <kbd>ExemploContrasinal</kbd>.",
        "apihelp-checktoken-description": "Verificar a validez dun identificador de <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Tipo de identificador a probar.",
        "apihelp-checktoken-param-token": "Símbolo a testar",
@@ -46,6 +48,8 @@
        "apihelp-checktoken-example-simple": "Verificar a validez de un identificador   <kbd>csrf</kbd>.",
        "apihelp-clearhasmsg-description": "Limpar a bandeira <code>hasmsg</code> para o usuario actual",
        "apihelp-clearhasmsg-example-1": "Limpar a bandeira <code>hasmsg</code> para o usuario actual",
+       "apihelp-clientlogin-description": "Conectarse á wiki usando o fluxo interactivo.",
+       "apihelp-clientlogin-example-login": "Comezar o proceso de conexión á wiki como o usuario <kbd>Exemplo</kbd> con contrasinal <kbd>ExemploContrasinal</kbd>.",
        "apihelp-compare-description": "Obter as diferencias entre dúas páxinas.\n\nDebe indicar un número de revisión, un título de páxina, ou un ID de páxina tanto para \"from\" como para \"to\".",
        "apihelp-compare-param-fromtitle": "Primeiro título para comparar.",
        "apihelp-compare-param-fromid": "Identificador da primeira páxina a comparar.",
@@ -55,6 +59,7 @@
        "apihelp-compare-param-torev": "Segunda revisión a comparar.",
        "apihelp-compare-example-1": "Mostrar diferencias entre a revisión 1 e a 2",
        "apihelp-createaccount-description": "Crear unha nova conta de usuario.",
+       "apihelp-createaccount-example-create": "Comezar o proceso de crear un usuario <kbd>Exemplo</kbd> con contrasinal <kbd>ExemploContrasinal</kbd>.",
        "apihelp-createaccount-param-name": "Nome de usuario.",
        "apihelp-createaccount-param-password": "Contrasinal (ignorado se <var>$1mailpassword</var> está activo)",
        "apihelp-createaccount-param-domain": "Dominio para autenticación externa (opcional)",
        "apihelp-import-param-namespace": "Importar a este espazo de nomes. Non se pode usar de forma conxunta con  <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importar como subpáxina desta páxina. Non se pode usar de forma conxunta con <var>$1namespace</var>.",
        "apihelp-import-example-import": "Importar [[meta:Help:ParserFunctions]] ó espazo de nomes 100 con todo o historial.",
+       "apihelp-linkaccount-description": "Vincular unha conta dun provedor externo ó usuario actual.",
+       "apihelp-linkaccount-example-link": "Comezar o proceso de vincular a unha conta de <kbd>Exemplo</kbd>.",
        "apihelp-login-description": "No caso dunha conexión correcta, as cookies necesarias incluiranse nas cabeceiras HTTP de resposta. No caso dunha conexión fallida, os intentos posteriores poden ser reducidos para limitar ataques automaticos de roubo de contrasinais.",
        "apihelp-login-param-name": "Nome de usuario.",
        "apihelp-login-param-password": "Contrasinal",
        "apihelp-query+allusers-param-activeusers": "Só listar usuarios activos {{PLURAL:$1|no último día|nos $1 últimos días}}.",
        "apihelp-query+allusers-param-attachedwiki": "Con <kbd>$1prop=centralids</kbd>, \ntamén indica se o usuario está acoplado á wiki identificada por este identificador.",
        "apihelp-query+allusers-example-Y": "Listar usuarios que comecen por <kbd>Y</kbd>.",
+       "apihelp-query+authmanagerinfo-description": "Recuperar información sobre o estado de autenticación actual.",
+       "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Comprobar se o estado de autenticación actual do usuario é abondo para a operación especificada como sensible dende o punto de vista da seguridade.",
+       "apihelp-query+authmanagerinfo-param-requestsfor": "Recuperar a información sobre as peticións de autenticación necesarias para a acción de autenticación especificada.",
+       "apihelp-query+filerepoinfo-example-login": "Recuperar as peticións que poden ser usadas ó comezo dunha conexión.",
+       "apihelp-query+filerepoinfo-example-login-merged": "Recuperar as peticións que poden ser usadas ó comezo dunha conexión, xunto cos campos de formulario integrados.",
+       "apihelp-query+filerepoinfo-example-securitysensitiveoperation": "Probar se a autenticación é abondo para a acción <kbd>foo</kbd>.",
        "apihelp-query+backlinks-description": "Atopar todas as páxinas que ligan coa páxina dada.",
        "apihelp-query+backlinks-param-title": "Título a buscar. Non pode usarse xunto con <var>$1pageid</var>.",
        "apihelp-query+backlinks-param-pageid": "Identificador de páxina a buscar. Non pode usarse xunto con <var>$1title</var>.",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "Devolve unha lista de identificadores de variable.",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "Devolve unha lista de protocolos que están permitidos nas ligazóns externas.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Devolve os valores por defecto das preferencias de usuario.",
+       "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "Devolve a configuración do diálogo de subas.",
        "apihelp-query+siteinfo-param-filteriw": "Só devolver entradas locais ou só non locais da correspondencia interwiki.",
        "apihelp-query+siteinfo-param-showalldb": "Listar todos os servidores de base de datos, non só o que teña máis retardo.",
        "apihelp-query+siteinfo-param-numberingroup": "Listar o número de usuarios nos grupos de usuarios.",
        "apihelp-query+users-paramvalue-prop-emailable": "Marca se o usuario pode e quere recibir correos usando [[Special:Emailuser]].",
        "apihelp-query+users-paramvalue-prop-gender": "Marca o xénero do usuario. Devolve \"home\", \"muller\" ou \"descoñecido\".",
        "apihelp-query+users-paramvalue-prop-centralids": "Engade os identificadores centrais e o estado de acoplamento do usuario.",
+       "apihelp-query+users-paramvalue-prop-cancreate": "Indica se unha conta pode ser creada para nomes de usuario válidos pero non rexistrados.",
        "apihelp-query+users-param-attachedwiki": "Con <kbd>$1prop=centralids</kbd>, \nindica que o usuario está acoplado á wiki identificada por este identificador.",
        "apihelp-query+users-param-users": "Lista de usuarios para os que obter información.",
        "apihelp-query+users-param-token": "Usar <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> no canto diso.",
        "apihelp-query+watchlistraw-param-totitle": "Título (co prefixo de espazo de nomes) no que rematar de enumerar.",
        "apihelp-query+watchlistraw-example-simple": "Listar páxinas na lista de vixiancia do usuario actual.",
        "apihelp-query+watchlistraw-example-generator": "Buscar a información de páxina das páxinas da lista de vixiancia do usuario actual.",
+       "apihelp-removeauthenticationdata-description": "Elimina os datos de autenticación do usuario actual.",
+       "apihelp-removeauthenticationdata-example-simple": "Intenta eliminar os datos de usuario actual para <kbd>FooAuthenticationRequest</kbd>.",
+       "apihelp-resetpassword-description": "Envía un correo de inicialización de contrasinal a un usuario.",
+       "apihelp-resetpassword-param-user": "Usuario sendo reinicializado.",
        "apihelp-revisiondelete-description": "Borrar e restaurar revisións.",
        "apihelp-revisiondelete-param-type": "Tipo de borrado de revisión a ser tratada.",
        "apihelp-revisiondelete-param-target": "Título de páxina para o borrado da revisión, se requerido para o tipo.",
index 6b0cab6..2a16530 100644 (file)
@@ -12,7 +12,8 @@
                        "Macofe",
                        "Nemo bis",
                        "JackLantern",
-                       "Urielejh"
+                       "Urielejh",
+                       "Matteocng"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentazione]] (in inglese)\n* [[mw:API:FAQ|FAQ]] (in inglese)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunci sull'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug & richieste]\n</div>\n<strong>Stato:</strong> tutte le funzioni e caratteristiche mostrate su questa pagina dovrebbero funzionare, ma le API sono ancora in fase attiva di sviluppo, e potrebbero cambiare in qualsiasi momento. Iscriviti alla [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la mailing list sugli annunci delle API MediaWiki] per essere informato sugli aggiornamenti.\n\n<strong>Istruzioni sbagliate:</strong> quando vengono impartite alle API delle istruzioni sbagliate, un'intestazione HTTP verrà inviata col messaggio \"MediaWiki-API-Error\" e, sia il valore dell'intestazione, sia il codice d'errore, verranno impostati con lo stesso valore. Per maggiori informazioni leggi [[mw:API:Errors_and_warnings|API:Errori ed avvertimenti]] (in inglese).\n\n<strong>Test:</strong> per testare facilmente le richieste API, vedi [[Special:ApiSandbox]].",
@@ -41,6 +42,7 @@
        "apihelp-checktoken-example-simple": "Verifica la validità di un token <kbd>csrf</kbd>.",
        "apihelp-clearhasmsg-description": "Cancella il flag <code>hasmsg</code> per l'utente corrente.",
        "apihelp-clearhasmsg-example-1": "Cancella il flag <code>hasmsg</code> per l'utente corrente.",
+       "apihelp-clientlogin-example-login2": "Continua l'accesso dopo una risposta dell'<samp>UI</samp> per l'autenticazione a due fattori, fornendo un <var>OATHToken</var> di <kbd>987654</kbd>.",
        "apihelp-compare-description": "Ottieni le differenze tra 2 pagine.\n\nUn numero di revisione, il titolo di una pagina, o un ID di pagina deve essere indicato sia per il \"da\" che per lo \"a\".",
        "apihelp-compare-param-fromtitle": "Primo titolo da confrontare.",
        "apihelp-compare-param-fromid": "Primo ID di pagina da confrontare.",
        "api-help-examples": "{{PLURAL:$1|Esempio|Esempi}}:",
        "api-help-permissions": "{{PLURAL:$1|Permesso|Permessi}}:",
        "api-help-open-in-apisandbox": "<small>[apri in una sandbox]</small>",
+       "api-help-authmanager-general-usage": "La procedura generale per usare questo modulo é:\n# Ottenere i campi disponibili da <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$4</kbd>, e un token <kbd>$5</kbd> da <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.\n# Mostra i campi all'utente e ottieni i dati che invia.\n# Esegui un post a questo modulo, fornendo <var>$1returnurl</var> e ogni campo rilevante.\n# Controlla <samp>status</samp> nella response.\n#* Se hai ricevuto <samp>PASS</samp> o <samp>FAIL</samp>, hai finito. L'operazione nel primo caso è andata a buon fine, nel secondo no.\n#* Se hai ricevuto <samp>UI</samp>, mostra i nuovi campi all'utente e ottieni i dati che invia. Esegui un post a questo modulo con <var>$1continue</var> e i campi rilevanti settati, quindi ripeti il punto 4.\n#* Se hai ricevuto <samp>REDIRECT</samp>, dirigi l'utente a <samp>redirecttarget</samp> e aspetta che ritorni a <var>$1returnurl</var>. A quel punto esegui un post a questo modulo con <var>$1continue</var> e ogni campo passato all'URL di ritorno, e ripeti il punto 4.\n#* Se hai ricevuto <samp>RESTART</samp>, vuol dire che l'autenticazione ha funzionato ma non abbiamo un account collegato. Potresti considerare questo caso come <samp>UI</samp> o come <samp>FAIL</samp>.",
        "api-credits-header": "Crediti"
 }
index 900d2e5..f5bfc2a 100644 (file)
@@ -34,7 +34,7 @@ abstract class AbstractPasswordPrimaryAuthenticationProvider
        extends AbstractPrimaryAuthenticationProvider
 {
        /** @var bool Whether this provider should ABSTAIN (false) or FAIL (true) on password failure */
-       protected $authoritative = true;
+       protected $authoritative;
 
        private $passwordFactory = null;
 
index 2a15fd7..20fec24 100644 (file)
@@ -1928,7 +1928,9 @@ class LocalFile extends File {
                                        $dbw->rollback( __METHOD__ );
                                }
                                throw new LocalFileLockError(
-                                       "Could not acquire lock for '{$this->getName()}' ($waited sec)." );
+                                       "Could not acquire lock for '{$this->getName()} ($waited sec): " .
+                                       $status->getWikiText( false, false, 'en' )
+                               );
                        }
                        // Release the lock *after* commit to avoid row-level contention
                        $this->locked++;
index f00e260..2fb2281 100644 (file)
@@ -59,6 +59,16 @@ class TraditionalImageGallery extends ImageGalleryBase {
                        $output .= "\n\t<li class='gallerycaption'>{$this->mCaption}</li>";
                }
 
+               if ( $this->mShowFilename ) {
+                       // Preload LinkCache info for when generating links
+                       // of the filename below
+                       $lb = new LinkBatch();
+                       foreach ( $this->mImages as $img ) {
+                               $lb->addObj( $img[0] );
+                       }
+                       $lb->execute();
+               }
+
                $lang = $this->getRenderLang();
                # Output each image...
                foreach ( $this->mImages as $pair ) {
@@ -176,6 +186,7 @@ class TraditionalImageGallery extends ImageGalleryBase {
                        }
 
                        $textlink = $this->mShowFilename ?
+                               // Preloaded into LinkCache above
                                Linker::linkKnown(
                                        $nt,
                                        htmlspecialchars( $lang->truncate( $nt->getText(), $this->mCaptionLength ) )
diff --git a/includes/libs/HtmlArmor.php b/includes/libs/HtmlArmor.php
new file mode 100644 (file)
index 0000000..511e1c9
--- /dev/null
@@ -0,0 +1,56 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @license GPL-2.0+
+ * @author Kunal Mehta <legoktm@member.fsf.org>
+ */
+
+/**
+ * Marks HTML that shouldn't be escaped
+ *
+ * @since 1.28
+ */
+class HtmlArmor {
+
+       /**
+        * @var string
+        */
+       private $value;
+
+       /**
+        * @param string $value
+        */
+       public function __construct( $value ) {
+               $this->value = $value;
+       }
+
+       /**
+        * Provide a string or HtmlArmor object
+        * and get safe HTML back
+        *
+        * @param string|HtmlArmor $input
+        * @return string safe for usage in HTML
+        */
+       public static function getHtml( $input ) {
+               if ( $input instanceof HtmlArmor ) {
+                       return $input->value;
+               } else {
+                       return htmlspecialchars( $input );
+               }
+       }
+}
diff --git a/includes/linker/LinkRenderer.php b/includes/linker/LinkRenderer.php
new file mode 100644 (file)
index 0000000..0261365
--- /dev/null
@@ -0,0 +1,451 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @license GPL-2.0+
+ * @author Kunal Mehta <legoktm@member.fsf.org>
+ */
+namespace MediaWiki\Linker;
+
+use DummyLinker;
+use Hooks;
+use Html;
+use HtmlArmor;
+use Linker;
+use MediaWiki\MediaWikiServices;
+use Sanitizer;
+use Title;
+use TitleFormatter;
+
+/**
+ * Class that generates HTML <a> links for pages.
+ *
+ * @since 1.28
+ */
+class LinkRenderer {
+
+       /**
+        * Whether to force the pretty article path
+        *
+        * @var bool
+        */
+       private $forceArticlePath = false;
+
+       /**
+        * A PROTO_* constant or false
+        *
+        * @var string|bool|int
+        */
+       private $expandUrls = false;
+
+       /**
+        * Whether extra classes should be added
+        *
+        * @var bool
+        */
+       private $noClasses = false;
+
+       /**
+        * @var int
+        */
+       private $stubThreshold = 0;
+
+       /**
+        * @var TitleFormatter
+        */
+       private $titleFormatter;
+
+       /**
+        * Whether to run the legacy Linker hooks
+        *
+        * @var bool
+        */
+       private $runLegacyBeginHook = true;
+
+       /**
+        * @param TitleFormatter $titleFormatter
+        */
+       public function __construct( TitleFormatter $titleFormatter ) {
+               $this->titleFormatter = $titleFormatter;
+       }
+
+       /**
+        * @param bool $force
+        */
+       public function setForceArticlePath( $force ) {
+               $this->forceArticlePath = $force;
+       }
+
+       /**
+        * @return bool
+        */
+       public function getForceArticlePath() {
+               return $this->forceArticlePath;
+       }
+
+       /**
+        * @param string|bool|int $expand A PROTO_* constant or false
+        */
+       public function setExpandURLs( $expand ) {
+               $this->expandUrls = $expand;
+       }
+
+       /**
+        * @return string|bool|int a PROTO_* constant or false
+        */
+       public function getExpandURLs() {
+               return $this->expandUrls;
+       }
+
+       /**
+        * @param bool $no
+        */
+       public function setNoClasses( $no ) {
+               $this->noClasses = $no;
+       }
+
+       /**
+        * @return bool
+        */
+       public function getNoClasses() {
+               return $this->noClasses;
+       }
+
+       /**
+        * @param int $threshold
+        */
+       public function setStubThreshold( $threshold ) {
+               $this->stubThreshold = $threshold;
+       }
+
+       /**
+        * @return int
+        */
+       public function getStubThreshold() {
+               return $this->stubThreshold;
+       }
+
+       /**
+        * @param bool $run
+        */
+       public function setRunLegacyBeginHook( $run ) {
+               $this->runLegacyBeginHook = $run;
+       }
+
+       /**
+        * @param LinkTarget $target
+        * @param string|HtmlArmor|null $text
+        * @param array $extraAttribs
+        * @param array $query
+        * @return string
+        */
+       public function makeLink(
+               LinkTarget $target, $text = null, array $extraAttribs = [], array $query = []
+       ) {
+               $title = Title::newFromLinkTarget( $target );
+               if ( $title->isKnown() ) {
+                       return $this->makeKnownLink( $target, $text, $extraAttribs, $query );
+               } else {
+                       return $this->makeBrokenLink( $target, $text, $extraAttribs, $query );
+               }
+       }
+
+       /**
+        * Get the options in the legacy format
+        *
+        * @param bool $isKnown Whether the link is known or broken
+        * @return array
+        */
+       private function getLegacyOptions( $isKnown ) {
+               $options = [ 'stubThreshold' => $this->stubThreshold ];
+               if ( $this->noClasses ) {
+                       $options[] = 'noclasses';
+               }
+               if ( $this->forceArticlePath ) {
+                       $options[] = 'forcearticlepath';
+               }
+               if ( $this->expandUrls === PROTO_HTTP ) {
+                       $options[] = 'http';
+               } elseif ( $this->expandUrls === PROTO_HTTPS ) {
+                       $options[] = 'https';
+               }
+
+               $options[] = $isKnown ? 'known' : 'broken';
+
+               return $options;
+       }
+
+       private function runBeginHook( LinkTarget $target, &$text, &$extraAttribs, &$query, $isKnown ) {
+               $ret = null;
+               if ( !Hooks::run( 'HtmlPageLinkRendererBegin',
+                       [ $this, $target, &$text, &$extraAttribs, &$query, &$ret ] )
+               ) {
+                       return $ret;
+               }
+
+               // Now run the legacy hook
+               return $this->runLegacyBeginHook( $target, $text, $extraAttribs, $query, $isKnown );
+       }
+
+       private function runLegacyBeginHook( LinkTarget $target, &$text, &$extraAttribs, &$query,
+               $isKnown
+       ) {
+               if ( !$this->runLegacyBeginHook || !Hooks::isRegistered( 'LinkBegin' ) ) {
+                       // Disabled, or nothing registered
+                       return null;
+               }
+
+               $realOptions = $options = $this->getLegacyOptions( $isKnown );
+               $ret = null;
+               $dummy = new DummyLinker();
+               $title = Title::newFromLinkTarget( $target );
+               $realHtml = $html = HtmlArmor::getHtml( $text );
+               if ( !Hooks::run( 'LinkBegin',
+                       [ $dummy, $title, &$html, &$extraAttribs, &$query, &$options, &$ret ] )
+               ) {
+                       return $ret;
+               }
+
+               if ( $html !== null && $html !== $realHtml ) {
+                       // &$html was modified, so re-armor it as $text
+                       $text = new HtmlArmor( $html );
+               }
+
+               // Check if they changed any of the options, hopefully not!
+               if ( $options !== $realOptions ) {
+                       $factory = MediaWikiServices::getInstance()->getLinkRendererFactory();
+                       // They did, so create a separate instance and have that take over the rest
+                       $newRenderer = $factory->createFromLegacyOptions( $options );
+                       // Don't recurse the hook...
+                       $newRenderer->setRunLegacyBeginHook( false );
+                       if ( in_array( 'known', $options, true ) ) {
+                               return $newRenderer->makeKnownLink( $title, $text, $extraAttribs, $query );
+                       } elseif ( in_array( 'broken', $options, true ) ) {
+                               return $newRenderer->makeBrokenLink( $title, $text, $extraAttribs, $query );
+                       } else {
+                               return $newRenderer->makeLink( $title, $text, $extraAttribs, $query );
+                       }
+               }
+
+               return null;
+       }
+
+       /**
+        * @param LinkTarget $target
+        * @param string|HtmlArmor|null $text
+        * @param array $extraAttribs
+        * @param array $query
+        * @return string
+        */
+       public function makeKnownLink(
+               LinkTarget $target, $text = null, array $extraAttribs = [], array $query = []
+       ) {
+               // Run begin hook
+               $ret = $this->runBeginHook( $target, $text, $extraAttribs, $query, true );
+               if ( $ret !== null ) {
+                       return $ret;
+               }
+               $target = $this->normalizeTarget( $target );
+               $url = $this->getLinkURL( $target, $query );
+               $attribs = [];
+               if ( !$this->noClasses ) {
+                       $classes = [];
+                       if ( $target->isExternal() ) {
+                               $classes[] = 'extiw';
+                       }
+                       $title = Title::newFromLinkTarget( $target );
+                       $colour = Linker::getLinkColour( $title, $this->stubThreshold );
+                       if ( $colour !== '' ) {
+                               $classes[] = $colour;
+                       }
+                       if ( $classes ) {
+                               $attribs['class'] = implode( ' ', $classes );
+                       }
+               }
+
+               $prefixedText = $this->titleFormatter->getPrefixedText( $target );
+               if ( $prefixedText !== '' ) {
+                       $attribs['title'] = $prefixedText;
+               }
+
+               $attribs = [
+                       'href' => $url,
+               ] + $this->mergeAttribs( $attribs, $extraAttribs );
+
+               if ( $text === null ) {
+                       $text = $this->getLinkText( $target );
+               }
+
+               return $this->buildAElement( $target, $text, $attribs, true );
+       }
+
+       /**
+        * @param LinkTarget $target
+        * @param string|HtmlArmor|null $text
+        * @param array $extraAttribs
+        * @param array $query
+        * @return string
+        */
+       public function makeBrokenLink(
+               LinkTarget $target, $text = null, array $extraAttribs = [], array $query = []
+       ) {
+               // Run legacy hook
+               $ret = $this->runBeginHook( $target, $text, $extraAttribs, $query, false );
+               if ( $ret !== null ) {
+                       return $ret;
+               }
+
+               # We don't want to include fragments for broken links, because they
+               # generally make no sense.
+               if ( $target->hasFragment() ) {
+                       $target = $target->createFragmentTarget( '' );
+               }
+               $target = $this->normalizeTarget( $target );
+
+               if ( !isset( $query['action'] ) && $target->getNamespace() !== NS_SPECIAL ) {
+                       $query['action'] = 'edit';
+                       $query['redlink'] = '1';
+               }
+
+               $url = $this->getLinkURL( $target, $query );
+               $attribs = $this->noClasses ? [] : [ 'class' => 'new' ];
+               $prefixedText = $this->titleFormatter->getPrefixedText( $target );
+               if ( $prefixedText !== '' ) {
+                       // This ends up in parser cache!
+                       $attribs['title'] = wfMessage( 'red-link-title', $prefixedText )
+                               ->inContentLanguage()
+                               ->text();
+               }
+
+               $attribs = [
+                       'href' => $url,
+               ] + $this->mergeAttribs( $attribs, $extraAttribs );
+
+               if ( $text === null ) {
+                       $text = $this->getLinkText( $target );
+               }
+
+               return $this->buildAElement( $target, $text, $attribs, false );
+       }
+
+       /**
+        * Builds the final <a> element
+        *
+        * @param LinkTarget $target
+        * @param string|HtmlArmor $text
+        * @param array $attribs
+        * @param bool $isKnown
+        * @return null|string
+        */
+       private function buildAElement( LinkTarget $target, $text, array $attribs, $isKnown ) {
+               $ret = null;
+               if ( !Hooks::run( 'HtmlPageLinkRendererEnd',
+                       [ $this, $target, $isKnown, &$text, &$attribs, &$ret ] )
+               ) {
+                       return $ret;
+               }
+
+               $html = HtmlArmor::getHtml( $text );
+
+               // Run legacy hook
+               if ( Hooks::isRegistered( 'LinkEnd' ) ) {
+                       $dummy = new DummyLinker();
+                       $title = Title::newFromLinkTarget( $target );
+                       $options = $this->getLegacyOptions( $isKnown );
+                       if ( !Hooks::run( 'LinkEnd',
+                               [ $dummy, $title, $options, &$html, &$attribs, &$ret ] )
+                       ) {
+                               return $ret;
+                       }
+               }
+
+               return Html::rawElement( 'a', $attribs, $html );
+       }
+
+       /**
+        * @param LinkTarget $target
+        * @return string non-escaped text
+        */
+       private function getLinkText( LinkTarget $target ) {
+               $prefixedText = $this->titleFormatter->getPrefixedText( $target );
+               // If the target is just a fragment, with no title, we return the fragment
+               // text.  Otherwise, we return the title text itself.
+               if ( $prefixedText === '' && $target->hasFragment() ) {
+                       return $target->getFragment();
+               }
+
+               return $prefixedText;
+       }
+
+       private function getLinkURL( LinkTarget $target, array $query = [] ) {
+               // TODO: Use a LinkTargetResolver service instead of Title
+               $title = Title::newFromLinkTarget( $target );
+               $proto = $this->expandUrls !== false
+                       ? $this->expandUrls
+                       : PROTO_RELATIVE;
+               if ( $this->forceArticlePath ) {
+                       $realQuery = $query;
+                       $query = [];
+               } else {
+                       $realQuery = [];
+               }
+               $url = $title->getLinkURL( $query, false, $proto );
+
+               if ( $this->forceArticlePath && $realQuery ) {
+                       $url = wfAppendQuery( $url, $realQuery );
+               }
+
+               return $url;
+       }
+
+       /**
+        * Normalizes the provided target
+        *
+        * @todo move the code from Linker actually here
+        * @param LinkTarget $target
+        * @return LinkTarget
+        */
+       private function normalizeTarget( LinkTarget $target ) {
+               return Linker::normaliseSpecialPage( $target );
+       }
+
+       /**
+        * Merges two sets of attributes
+        *
+        * @param array $defaults
+        * @param array $attribs
+        *
+        * @return array
+        */
+       private function mergeAttribs( $defaults, $attribs ) {
+               if ( !$attribs ) {
+                       return $defaults;
+               }
+               # Merge the custom attribs with the default ones, and iterate
+               # over that, deleting all "false" attributes.
+               $ret = [];
+               $merged = Sanitizer::mergeAttributes( $defaults, $attribs );
+               foreach ( $merged as $key => $val ) {
+                       # A false value suppresses the attribute
+                       if ( $val !== false ) {
+                               $ret[$key] = $val;
+                       }
+               }
+               return $ret;
+       }
+
+}
diff --git a/includes/linker/LinkRendererFactory.php b/includes/linker/LinkRendererFactory.php
new file mode 100644 (file)
index 0000000..3a30772
--- /dev/null
@@ -0,0 +1,92 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @license GPL-2.0+
+ * @author Kunal Mehta <legoktm@member.fsf.org>
+ */
+namespace MediaWiki\Linker;
+
+use TitleFormatter;
+use User;
+
+/**
+ * Factory to create LinkRender objects
+ * @since 1.28
+ */
+class LinkRendererFactory {
+
+       /**
+        * @var TitleFormatter
+        */
+       private $titleFormatter;
+
+       /**
+        * @param TitleFormatter $titleFormatter
+        */
+       public function __construct( TitleFormatter $titleFormatter ) {
+               $this->titleFormatter = $titleFormatter;
+       }
+
+       /**
+        * @return LinkRenderer
+        */
+       public function create() {
+               return new LinkRenderer( $this->titleFormatter );
+       }
+
+       /**
+        * @param User $user
+        * @return LinkRenderer
+        */
+       public function createForUser( User $user ) {
+               $linkRenderer = $this->create();
+               $linkRenderer->setStubThreshold( $user->getStubThreshold() );
+
+               return $linkRenderer;
+       }
+
+       /**
+        * @param array $options
+        * @return LinkRenderer
+        */
+       public function createFromLegacyOptions( array $options ) {
+               $linkRenderer = $this->create();
+
+               if ( in_array( 'noclasses', $options, true ) ) {
+                       $linkRenderer->setNoClasses( true );
+               }
+
+               if ( in_array( 'forcearticlepath', $options, true ) ) {
+                       $linkRenderer->setForceArticlePath( true );
+               }
+
+               if ( in_array( 'http', $options, true ) ) {
+                       $linkRenderer->setExpandURLs( PROTO_HTTP );
+               } elseif ( in_array( 'https', $options, true ) ) {
+                       $linkRenderer->setExpandURLs( PROTO_HTTPS );
+               }
+
+               if ( isset( $options['stubThreshold'] ) ) {
+                       $linkRenderer->setStubThreshold(
+                               $options['stubThreshold']
+                       );
+               }
+
+               return $linkRenderer;
+       }
+}
index 9bb1dc5..72c460e 100644 (file)
@@ -41,15 +41,32 @@ class RevDelArchiveList extends RevDelRevisionList {
                        $timestamps[] = $db->timestamp( $id );
                }
 
-               return $db->select( 'archive', Revision::selectArchiveFields(),
-                               [
-                                       'ar_namespace' => $this->title->getNamespace(),
-                                       'ar_title' => $this->title->getDBkey(),
-                                       'ar_timestamp' => $timestamps
-                               ],
-                               __METHOD__,
-                               [ 'ORDER BY' => 'ar_timestamp DESC' ]
-                       );
+               $tables = [ 'archive' ];
+               $fields = Revision::selectArchiveFields();
+               $conds = [
+                       'ar_namespace' => $this->title->getNamespace(),
+                       'ar_title' => $this->title->getDBkey(),
+                       'ar_timestamp' => $timestamps,
+               ];
+               $join_conds = [];
+               $options = [ 'ORDER BY' => 'ar_timestamp DESC' ];
+
+               ChangeTags::modifyDisplayQuery(
+                       $tables,
+                       $fields,
+                       $conds,
+                       $join_conds,
+                       $options,
+                       ''
+               );
+
+               return $db->select( $tables,
+                       $fields,
+                       $conds,
+                       __METHOD__,
+                       $options,
+                       $join_conds
+               );
        }
 
        public function newItem( $row ) {
index bc2b2e9..27e5148 100644 (file)
@@ -94,13 +94,33 @@ class RevDelRevisionList extends RevDelList {
                        return $live;
                }
 
-               // Check if any requested revisions are available fully deleted.
-               $archived = $db->select( [ 'archive' ], Revision::selectArchiveFields(),
-                       [
-                               'ar_rev_id' => $ids
+               $archiveQueryInfo = [
+                       'tables' => [ 'archive' ],
+                       'fields' => Revision::selectArchiveFields(),
+                       'conds' => [
+                               'ar_rev_id' => $ids,
                        ],
+                       'options' => [ 'ORDER BY' => 'ar_rev_id DESC' ],
+                       'join_conds' => [],
+               ];
+
+               ChangeTags::modifyDisplayQuery(
+                       $archiveQueryInfo['tables'],
+                       $archiveQueryInfo['fields'],
+                       $archiveQueryInfo['conds'],
+                       $archiveQueryInfo['join_conds'],
+                       $archiveQueryInfo['options'],
+                       ''
+               );
+
+               // Check if any requested revisions are available fully deleted.
+               $archived = $db->select(
+                       $archiveQueryInfo['tables'],
+                       $archiveQueryInfo['fields'],
+                       $archiveQueryInfo['conds'],
                        __METHOD__,
-                       [ 'ORDER BY' => 'ar_rev_id DESC' ]
+                       $archiveQueryInfo['options'],
+                       $archiveQueryInfo['join_conds']
                );
 
                if ( $archived->numRows() == 0 ) {
index 9891f86..6db4f2c 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup SpecialPage
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Implements Special:Prefixindex
@@ -191,7 +192,10 @@ class SpecialPrefixindex extends SpecialAllPages {
                        }
 
                        $res = $dbr->select( 'page',
-                               [ 'page_namespace', 'page_title', 'page_is_redirect' ],
+                               array_merge(
+                                       [ 'page_namespace', 'page_title' ],
+                                       LinkCache::getSelectFields()
+                               ),
                                $conds,
                                __METHOD__,
                                [
@@ -206,26 +210,27 @@ class SpecialPrefixindex extends SpecialAllPages {
                        $n = 0;
                        if ( $res->numRows() > 0 ) {
                                $out = Html::openElement( 'ul', [ 'class' => 'mw-prefixindex-list' ] );
+                               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
 
                                $prefixLength = strlen( $prefix );
-                               while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
-                                       $t = Title::makeTitle( $s->page_namespace, $s->page_title );
-                                       if ( $t ) {
-                                               $displayed = $t->getText();
-                                               // Try not to generate unclickable links
-                                               if ( $this->stripPrefix && $prefixLength !== strlen( $displayed ) ) {
-                                                       $displayed = substr( $displayed, $prefixLength );
-                                               }
-                                               $link = ( $s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
-                                                       Linker::linkKnown(
-                                                               $t,
-                                                               htmlspecialchars( $displayed ),
-                                                               $s->page_is_redirect ? [ 'class' => 'mw-redirect' ] : []
-                                                       ) .
-                                                       ( $s->page_is_redirect ? '</div>' : '' );
-                                       } else {
-                                               $link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
+                               foreach ( $res as $row ) {
+                                       if ( $n >= $this->maxPerPage ) {
+                                               break;
                                        }
+                                       $title = Title::newFromRow( $row );
+                                       // Make sure it gets into LinkCache
+                                       $linkCache->addGoodLinkObjFromRow( $title, $row );
+                                       $displayed = $title->getText();
+                                       // Try not to generate unclickable links
+                                       if ( $this->stripPrefix && $prefixLength !== strlen( $displayed ) ) {
+                                               $displayed = substr( $displayed, $prefixLength );
+                                       }
+                                       $link = ( $title->isRedirect() ? '<div class="allpagesredirect">' : '' ) .
+                                               Linker::linkKnown(
+                                                       $title,
+                                                       htmlspecialchars( $displayed )
+                                               ) .
+                                               ( $title->isRedirect() ? '</div>' : '' );
 
                                        $out .= "<li>$link</li>\n";
                                        $n++;
index cca54b3..259d1f9 100644 (file)
@@ -57,8 +57,8 @@ class WithoutInterwikiPage extends PageQueryPage {
                        ]
                ];
 
-               $htmlForm = HTMLForm::factory( 'inline', $formDescriptor, $this->getContext() );
-               $htmlForm->setWrapperLegendMsg( 'withoutinterwiki-legend' )
+               $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() );
+               $htmlForm->setWrapperLegend( '' )
                        ->setSubmitTextMsg( 'withoutinterwiki-submit' )
                        ->setMethod( 'get' )
                        ->prepareForm()
index ce2ac83..70adc32 100644 (file)
@@ -674,12 +674,26 @@ class User implements IDBAccessObject {
         * This can optionally create the user if it doesn't exist, and "steal" the
         * account if it does exist.
         *
+        * "Stealing" an existing user is intended to make it impossible for normal
+        * authentication processes to use the account, effectively disabling the
+        * account for normal use:
+        * - Email is invalidated, to prevent account recovery by emailing a
+        *   temporary password and to disassociate the account from the existing
+        *   human.
+        * - The token is set to a magic invalid value, to kill existing sessions
+        *   and to prevent $this->setToken() calls from resetting the token to a
+        *   valid value.
+        * - SessionManager is instructed to prevent new sessions for the user, to
+        *   do things like deauthorizing OAuth consumers.
+        * - AuthManager is instructed to revoke access, to invalidate or remove
+        *   passwords and other credentials.
+        *
         * @param string $name Username
         * @param array $options Options are:
         *  - validate: As for User::getCanonicalName(), default 'valid'
         *  - create: Whether to create the user if it doesn't already exist, default true
-        *  - steal: Whether to reset the account's password and email if it
-        *    already exists, default false
+        *  - steal: Whether to "disable" the account for normal use if it already
+        *    exists, default false
         * @return User|null
         * @since 1.27
         */
@@ -715,9 +729,8 @@ class User implements IDBAccessObject {
                }
                $user = self::newFromRow( $row );
 
-               // A user is considered to exist as a non-system user if it has a
-               // password set, or a temporary password set, or an email set, or a
-               // non-invalid token.
+               // A user is considered to exist as a non-system user if it can
+               // authenticate, or has an email set, or has a non-invalid token.
                if ( !$user->mEmail && $user->mToken === self::INVALID_TOKEN ) {
                        if ( $wgDisableAuthManager ) {
                                $passwordFactory = new PasswordFactory();
@@ -1467,6 +1480,24 @@ class User implements IDBAccessObject {
                return $toPromote;
        }
 
+       /**
+        * Builds update conditions. Additional conditions may be added to $conditions to
+        * protected against race conditions using a compare-and-set (CAS) mechanism
+        * based on comparing $this->mTouched with the user_touched field.
+        *
+        * @param DatabaseBase $db
+        * @param array $conditions WHERE conditions for use with DatabaseBase::update
+        * @return array WHERE conditions for use with DatabaseBase::update
+        */
+       protected function makeUpdateConditions( DatabaseBase $db, array $conditions ) {
+               if ( $this->mTouched ) {
+                       // CAS check: only update if the row wasn't changed sicne it was loaded.
+                       $conditions['user_touched'] = $db->timestamp( $this->mTouched );
+               }
+
+               return $conditions;
+       }
+
        /**
         * Bump user_touched if it didn't change since this object was loaded
         *
@@ -1484,16 +1515,14 @@ class User implements IDBAccessObject {
                }
 
                // Get a new user_touched that is higher than the old one
-               $oldTouched = $this->mTouched;
                $newTouched = $this->newTouchedTimestamp();
 
                $dbw = wfGetDB( DB_MASTER );
                $dbw->update( 'user',
                        [ 'user_touched' => $dbw->timestamp( $newTouched ) ],
-                       [
+                       $this->makeUpdateConditions( $dbw, [
                                'user_id' => $this->mId,
-                               'user_touched' => $dbw->timestamp( $oldTouched ) // CAS check
-                       ],
+                       ] ),
                        __METHOD__
                );
                $success = ( $dbw->affectedRows() > 0 );
@@ -3908,7 +3937,6 @@ class User implements IDBAccessObject {
                // Get a new user_touched that is higher than the old one.
                // This will be used for a CAS check as a last-resort safety
                // check against race conditions and slave lag.
-               $oldTouched = $this->mTouched;
                $newTouched = $this->newTouchedTimestamp();
 
                $dbw = wfGetDB( DB_MASTER );
@@ -3922,10 +3950,9 @@ class User implements IDBAccessObject {
                                'user_token' => strval( $this->mToken ),
                                'user_email_token' => $this->mEmailToken,
                                'user_email_token_expires' => $dbw->timestampOrNull( $this->mEmailTokenExpires ),
-                       ], [ /* WHERE */
+                       ], $this->makeUpdateConditions( $dbw, [ /* WHERE */
                                'user_id' => $this->mId,
-                               'user_touched' => $dbw->timestamp( $oldTouched ) // CAS check
-                       ], __METHOD__
+                       ] ), __METHOD__
                );
 
                if ( !$dbw->affectedRows() ) {
index 358562f..4a41ef2 100644 (file)
        "confirm-watch-top": "Был битте күҙәтеү исемлегенә өҫтәргәме?",
        "confirm-unwatch-button": "Тамам",
        "confirm-unwatch-top": "Был битте күҙәтеү исемлегенән сығарырғамы?",
+       "confirm-rollback-button": "Яҡшы",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← алдағы бит",
        "imgmultipagenext": "киләһе бит →",
        "authmanager-email-label": "Электрон почта адресы",
        "authmanager-email-help": "Электрон почта адресы",
        "authmanager-realname-label": "Ысын исемегеҙ",
+       "authprovider-resetpass-skip-label": "Ҡалдырып торорға",
        "changecredentials-submit": "Үҙгәртергә",
+       "changecredentials-submit-cancel": "Кире алырға",
+       "removecredentials-submit": "Юйырға",
        "removecredentials-submit-cancel": "Кире алырға"
 }
index f8362e4..f142421 100644 (file)
        "createacct-email-ph": "Zadejte svou e-mailovou adresu",
        "createacct-another-email-ph": "Zadejte e-mailovou adresu",
        "createaccountmail": "Použít dočasné náhodné heslo a odeslat ho na uvedenou e-mailovou adresu",
+       "createaccountmail-help": "Lze využít k založení účtu pro jinou osobu bez prozrazení hesla.",
        "createacct-realname": "Skutečné jméno (nepovinné)",
        "createaccountreason": "Důvod:",
        "createacct-reason": "Důvod",
        "createacct-reason-ph": "Proč si vytváříte další účet",
+       "createacct-reason-help": "Zpráva zobrazená v knize nových uživatelů",
        "createacct-submit": "Vytvořit účet",
        "createacct-another-submit": "Vytvořit účet",
+       "createacct-continue-submit": "Pokračovat v zakládání účtu",
+       "createacct-another-continue-submit": "Pokračovat v zakládání účtu",
        "createacct-benefit-heading": "{{grammar:4sg|{{SITENAME}}}} tvoří lidé jako vy.",
        "createacct-benefit-body1": "{{PLURAL:$1|editace|editace|editací}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stránka|stránky|stránek}}",
        "passwordreset-emailsentusername": "Pokud je u tohoto účtu nastavena e-mailová adresa, bude vám zaslán e-mail pro získání nového hesla.",
        "passwordreset-emailsent-capture": "Byl odeslán e-mail pro získání nového hesla, který je zobrazen níže.",
        "passwordreset-emailerror-capture": "Byl vygenerován e-mail pro získání nového hesla, který je zobrazen níže, ale {{GENDER:$2|uživateli|uživatelce}} se ho nepodařilo odeslat: $1",
+       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Byl odeslán e-mail|Byly odeslány e-maily}} pro získání nového hesla. {{PLURAL:$1|Uživatelské jméno a heslo jsou zobrazeny|Seznam uživatelských jmen a hesel je zobrazen}} níže.",
+       "passwordreset-emailerror-capture2": "{{GENDER:$2|Uživateli|Uživatelce}} se nepodařilo odeslat e-mail: $1 {{PLURAL:$3|Uživatelské jméno a heslo jsou zobrazeny|Seznam uživatelských jmen a hesel je zobrazen}} níže.",
+       "passwordreset-nocaller": "Musí být uveden volající",
+       "passwordreset-nosuchcaller": "Volající neexistuje: $1",
+       "passwordreset-ignored": "Žádost o nové heslo nebyla zpracována. Možná není nakonfigurován žádný poskytovatel?",
+       "passwordreset-invalideamil": "Neplatná e-mailová adresa",
+       "passwordreset-nodata": "Nebylo zadáno uživatelské jméno ani e-mailová adresa",
        "changeemail": "Změna nebo odstranění e-mailové adresy",
        "changeemail-header": "Vyplněním tohoto formuláře můžete změnit svou e-mailovou adresu. Pokud chcete ze svého účtu odstranit vazbu na všechny e-mailové adresy, ponechte při odeslání formuláře novou e-mailovou adresu prázdnou.",
        "changeemail-passwordrequired": "Pro potvrzení této změny musíte zadat své heslo.",
        "trackingcategories-msg": "Sledovací kategorie",
        "trackingcategories-name": "Název hlášení",
        "trackingcategories-desc": "Kritéria pro vložení do kategorie",
+       "restricted-displaytitle-ignored": "Stránky s ignorovanými zobrazovanými názvy",
+       "restricted-displaytitle-ignored-desc": "Stránka obsahuje příkaz <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, který se ignoruje, protože není ekvivalentní skutečnému názvu stránky.",
        "noindex-category-desc": "Stránka není indexována roboty, protože obsahuje kouzelné slovo <code><nowiki>__NOINDEX__</nowiki></code> a je ve jmenném prostoru, ve kterém je tento příznak dovolen.",
        "index-category-desc": "Stránka obsahuje kouzelné slovo <code><nowiki>__INDEX__</nowiki></code> (a je ve jmenném prostoru, ve kterém je tento příznak dovolen), takže je indexována roboty, přestože by normálně nebyla.",
        "post-expand-template-inclusion-category-desc": "Stránka je po rozbalení všech šablon větší než <code>$wgMaxArticleSize</code>, takže některé šablony rozbaleny nebyly.",
        "rollbacklinkcount": "vrácení $1 {{PLURAL:$1|editace|editací}} zpět",
        "rollbacklinkcount-morethan": "vrácení více než $1 {{PLURAL:$1|editace|editací}} zpět",
        "rollbackfailed": "Nešlo vrátit zpět",
+       "rollback-missingparam": "V požadavku chybí povinné parametry.",
        "cantrollback": "Nelze vrátit zpět poslední editaci, neboť poslední přispěvatel je jediným autorem této stránky.",
        "alreadyrolled": "Nelze vrátit zpět poslední editaci [[:$1]] od uživatele [[User:$2|$2]] ([[User talk:$2|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), protože někdo jiný již stránku editoval nebo vrátil tuto změnu zpět.\n\nPoslední editaci této stránky {{GENDER:$3|provedl|provedla|provedl uživatel}} [[User:$3|$3]] ([[User talk:$3|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Shrnutí editace bylo: <em>$1</em>.",
        "revertpage": "Editace uživatele „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskuse]]) vráceny do předchozího stavu, jehož autorem je „[[User:$1|$1]]“",
        "revertpage-nouser": "Editace skrytého uživatele vráceny do předchozího stavu, jehož {{GENDER:$1|autorem|autorkou}} je „[[User:$1|$1]]“",
        "rollback-success": "Editace uživatele $1 byly vráceny na poslední verzi od uživatele $2.",
+       "rollback-success-notify": "Editace uživatele $1 byly vráceny;\nobnovena poslední verze od uživatele $2. [$3 Zobrazit změny]",
        "sessionfailure-title": "Chyba relace",
        "sessionfailure": "Zřejmě je nějaký problém s vaším přihlášením;\nvámi požadovaná činnost byla stornována jako prevence před neoprávněným přístupem.\nStiskněte tlačítko „zpět“, obnovte stránku, ze které jste přišli, a zkuste činnost znovu.",
        "changecontentmodel": "Změna modelu obsahu stránky",
        "confirm-watch-top": "Přidat tuto stránku mezi sledované?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Vyjmout tuto stránku ze sledovaných?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Vrátit editace této stránky?",
        "ellipsis": "…",
        "percent": "$1&#160;%",
        "quotation-marks": "„$1“",
        "log-action-filter-suppress-block": "Utajení uživatele zablokováním",
        "log-action-filter-suppress-reblock": "Utajení uživatele novým zablokováním",
        "log-action-filter-upload-upload": "Nové načtení",
-       "log-action-filter-upload-overwrite": "Znovunačtení"
+       "log-action-filter-upload-overwrite": "Znovunačtení",
+       "authmanager-authn-not-in-progress": "Autentizace neprobíhá nebo se ztratila data sezení. Začněte prosím znovu od začátku.",
+       "authmanager-authn-no-primary": "Uvedené přihlašovací údaje se nepodařilo autentizovat.",
+       "authmanager-authn-no-local-user": "Uvedené přihlašovací údaje neodpovídají žádnému uživateli této wiki.",
+       "authmanager-authn-no-local-user-link": "Uvedené přihlašovací údaje jsou platné, ale nejsou přiřazeny žádnému uživateli na této wiki. Přihlašte se jiným způsobem nebo si založte nový uživatelský účet a budete mít možnost s tímto účtem propojit vaše stávající přihlašovací údaje.",
+       "authmanager-authn-autocreate-failed": "Automatické založení lokálního účtu se nezdařilo: $1",
+       "authmanager-change-not-supported": "Uvedené přihlašovací údaje nelze změnit, protože by je nikdo nepoužíval.",
+       "authmanager-create-disabled": "Zakládání účtů je zakázáno.",
+       "authmanager-create-from-login": "Pro založení účtu vyplňte níže uvedená pole.",
+       "authmanager-create-not-in-progress": "Zakládání účtu neprobíhá nebo se ztratila data sezení. Začněte prosím znovu od začátku.",
+       "authmanager-create-no-primary": "Uvedené přihlašovací údaje nelze použít pro založení účtu.",
+       "authmanager-link-no-primary": "Uvedené přihlašovací údaje nelze použít pro propojení účtů.",
+       "authmanager-link-not-in-progress": "Propojování účtů neprobíhá nebo se ztratila data sezení. Začněte prosím znovu od začátku.",
+       "authmanager-authplugin-setpass-failed-title": "Změna hesla se nezdařila",
+       "authmanager-authplugin-setpass-bad-domain": "Neplatná doména.",
+       "authmanager-autocreate-noperm": "Automatické zakládání účtů není povoleno.",
+       "authmanager-autocreate-exception": "Automatické založení účtu je dočasně zakázáno kvůli předchozím chybám.",
+       "authmanager-userdoesnotexist": "Uživatelský účet „$1“ není zaregistrován.",
+       "authmanager-userlogin-remembermypassword-help": "Zda se má heslo zapamatovat déle než jen po dobu tohoto sezení.",
+       "authmanager-username-help": "Uživatelské jméno pro autentizaci.",
+       "authmanager-password-help": "Heslo pro autentizaci.",
+       "authmanager-domain-help": "Doména pro externí autentizaci.",
+       "authmanager-retype-help": "Heslo znovu pro potvrzení.",
+       "authmanager-email-label": "E-mail",
+       "authmanager-email-help": "E-mailová adresa",
+       "authmanager-realname-label": "Skutečné jméno",
+       "authmanager-realname-help": "Skutečné jméno uživatele",
+       "authmanager-provider-password": "Autentizace pomocí hesla",
+       "authmanager-provider-password-domain": "Autentizace pomocí hesla a domény",
+       "authmanager-provider-temporarypassword": "Dočasné heslo"
 }
index d31cb7f..d85d458 100644 (file)
        "rollbacklinkcount": "{{PLURAL:$1|Eine Version|$1 Versionen}} zurücksetzen",
        "rollbacklinkcount-morethan": "Mehr als {{PLURAL:$1|eine Version|$1 Versionen}} zurücksetzen",
        "rollbackfailed": "Zurücksetzen gescheitert",
+       "rollback-missingparam": "In der Anfrage fehlen erforderliche Parameter.",
        "cantrollback": "Die Änderung kann nicht zurückgesetzt werden, da es keine früheren Autoren gibt.",
        "alreadyrolled": "Das Zurücksetzen der Änderungen von [[User:$2|$2]] ([[User talk:$2|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) an [[:$1]] ist gescheitert, da in der Zwischenzeit ein anderer Benutzer die Seite geändert hat.\n\nDie letzte Änderung stammt von [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Die Änderungszusammenfassung lautet: <em>$1</em>.",
        "revertpage": "Änderungen von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) wurden auf die letzte Version von [[User:$1|$1]] zurückgesetzt",
        "revertpage-nouser": "Änderungen von einem versteckten Benutzer rückgängig gemacht und letzte Version von {{GENDER:$1|[[User:$1|$1]]}} wiederhergestellt",
        "rollback-success": "Die Änderungen von $1 wurden rückgängig gemacht und die letzte Version von $2 wurde wiederhergestellt.",
+       "rollback-success-notify": "Bearbeitungen von $1 rückgängig gemacht;\nzurückgeändert auf die letzte Version von $2. [$3 Änderungen zeigen]",
        "sessionfailure-title": "Sitzungsfehler",
        "sessionfailure": "Es gab ein Problem bei der Übertragung deiner Benutzerdaten.\nDiese Aktion wurde daher sicherheitshalber abgebrochen, um eine falsche Zuordnung deiner Änderungen zu einem anderen Benutzer zu verhindern.\nBitte gehe zurück zur vorherigen Seite, lade sie erneut und versuche, den Vorgang erneut auszuführen.",
        "changecontentmodel": "Inhaltsmodell einer Seite ändern",
        "confirm-watch-top": "Diese Seite zur persönlichen Beobachtungsliste hinzufügen?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Diese Seite von der persönlichen Beobachtungsliste entfernen?",
+       "confirm-rollback-button": "Okay",
+       "confirm-rollback-top": "Bearbeitungen an dieser Seite zurücksetzen?",
        "ellipsis": "…",
        "percent": "$1&#160;%",
        "quotation-marks": "„$1“",
index 02ddf8f..5c38e89 100644 (file)
        "viewsource": "Vaata lähteteksti",
        "viewsource-title": "Lehekülje $1 lähteteksti vaatamine",
        "actionthrottled": "Toiming nurjus",
-       "actionthrottledtext": "Väärtarvituse vastase meetmena pole sul lühikse aja jooksul seda toimingut liiga palju kordi lubatud sooritada. Sa oled lühikse aja jooskul seda toimingut liiga palju kordi sooritanud.\nPalun proovi mõne minuti pärast uuesti.",
+       "actionthrottledtext": "Väärtarvituse vastase meetmena pole sul lubatud lühikese aja jooksul seda toimingut liiga palju kordi sooritada. Oled piirangu ületanud. Palun proovi mõne aja pärast uuesti.",
        "protectedpagetext": "See lehekülg on lukustatud, et ei tehtaks muudatusi ega sooritataks muid toiminguid.",
        "viewsourcetext": "Saad vaadata ja kopeerida selle lehekülje lähteteksti.",
        "viewyourtext": "Saad vaadata ja kopeerida sellel leheküljel tehtud <strong>enda muudatuste</strong> lähteteksti.",
index 1551939..cac6649 100644 (file)
        "passwordreset-emailerror-capture2": "L’envoi de courriel à {{GENDER:$2|l’utilisateur|l’utilisatrice}} a échoué : $1 {{PLURAL:$3|Le nom d’utilisateur et le mot de passe sont affichés|La liste des noms d’utilisateur et des mots de passe est affichée}} ci-dessous.",
        "passwordreset-nocaller": "Un appelant doit être fourni",
        "passwordreset-nosuchcaller": "L’appelant n’existe pas : $1",
-       "passwordreset-ignored": "La réinitialisation du mot de passe n’a pas été gérée. Peut-être aucun fournisseur n’a été configuré ?",
+       "passwordreset-ignored": "La réinitialisation du mot de passe n’a pas été gérée. Peut-être qu'aucun fournisseur n’a été configuré ?",
        "passwordreset-invalideamil": "Adresse de messagerie non valide",
        "passwordreset-nodata": "Aucun nom d’utilisateur ni adresse de messagerie n’a été fourni",
        "changeemail": "Changer ou supprimer l’adresse de courriel",
        "rollbacklinkcount": "révoquer $1 {{PLURAL:$1|modification|modifications}}",
        "rollbacklinkcount-morethan": "révoquer plus de $1 {{PLURAL:$1|modification|modifications}}",
        "rollbackfailed": "La révocation a échoué",
+       "rollback-missingparam": "il manque des paramètres nécessaires à la demande.",
        "cantrollback": "Impossible de révoquer la modification ;\nle dernier contributeur est le seul auteur de cette page.",
        "alreadyrolled": "Impossible de révoquer la dernière modification de la page « [[:$1]] » effectuée par [[User:$2|$2]] ([[User talk:$2|Discuter]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ;\nquelqu'un d'autre a déjà modifié ou révoqué la page.\n\nLa dernière modification de la page a été effectuée par [[User:$3|$3]] ([[User talk:$3|Discuter]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Le résumé de la modification était : <em>$1</em>.",
        "revertpage": "Révocation des modifications de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]]) vers la dernière version de [[User:$1|$1]]",
        "revertpage-nouser": "Révocation des modifications par un utilisateur masqué à la dernière version par {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Révocation des modifications effectuées par $1 ;\nrétablissement de la dernière version par $2.",
+       "rollback-success-notify": "Modifications annulées par $1 ;\nretour à la dernière révision par $2. [$3 indique les changements]",
        "sessionfailure-title": "Erreur de session",
        "sessionfailure": "Votre session de connexion semble avoir des problèmes ;\ncette action a été annulée en prévention d'un piratage de session.\nVeuillez cliquer sur « Précédent », rechargez la page d'où vous venez, puis réessayez.",
        "changecontentmodel": "Modifier le modèle de contenu d’une page",
        "confirm-watch-top": "Ajouter cette page à votre liste de suivi ?",
        "confirm-unwatch-button": "Valider",
        "confirm-unwatch-top": "Supprimer cette page de votre liste de suivi ?",
+       "confirm-rollback-button": "Valider",
+       "confirm-rollback-top": "Annuler les modifications de cette page?",
        "semicolon-separator": "&nbsp;;&#32;",
        "colon-separator": "&nbsp;:&#32;",
        "percent": "$1&#160;%",
index 16b9d7b..e9c1643 100644 (file)
        "revertpage": "Desfixéronse as edicións de [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]]); cambiado á última versión feita por [[User:$1|$1]]",
        "revertpage-nouser": "Desfixéronse as edicións dun usuario agochado; cambiado á última versión feita por {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Desfixéronse as edicións de $1;\nvolveuse á última edición, feita por $2.",
+       "rollback-success-notify": "Modificacións anuladas por $1; restaurado á última revisión de $2. [$3 Mostrar os cambios]",
        "sessionfailure-title": "Erro de sesión",
        "sessionfailure": "Parece que hai un problema co rexistro da súa sesión;\nesta acción cancelouse como precaución fronte ao secuestro de sesións.\nPrema no botón \"atrás\", volva cargar a páxina da que proviña e inténteo de novo.",
        "changecontentmodel": "Cambiar o modelo do contido dunha páxina",
        "confirm-watch-top": "Quere engadir esta páxina á lista de vixilancia?",
        "confirm-unwatch-button": "Aceptar",
        "confirm-unwatch-top": "Quere eliminar esta páxina da lista de vixilancia?",
+       "confirm-rollback-button": "Aceptar",
+       "confirm-rollback-top": "Reverter as edicións desta páxina?",
        "colon-separator": ":&#32;",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← páxina anterior",
        "authmanager-create-not-in-progress": "O proceso de creación da conta non está en progreso ou perdéronse os datos da sesión. Empece de novo desde o principio.",
        "authmanager-create-no-primary": "As credenciais subministradas non poden usarse para a creación da conta.",
        "authmanager-link-no-primary": "As credenciais subministradas non poden usarse para a ligazón da conta.",
+       "authmanager-link-not-in-progress": "A vinculación da conta non está en progreso ou perdéronse os datos da sesión. Empece de novo desde o principio.",
        "authmanager-authplugin-setpass-failed-title": "Fallou o cambio do contrasinal",
        "authmanager-authplugin-setpass-failed-message": "O complemento de autenticación denegou o cambio de contrasinal.",
        "authmanager-authplugin-create-fail": "O complemento de autenticación denegou a creación da conta.",
        "authmanager-autocreate-noperm": "A creación automatica de contas non está permitida.",
        "authmanager-autocreate-exception": "A creación automatica de contas foi desactivada temporalmente debido a erros previos.",
        "authmanager-userdoesnotexist": "O usuario \"$1\" non está rexistrado.",
+       "authmanager-userlogin-remembermypassword-help": "Indique se o contrasinal debe lembrarse máis alá da duración da sesión.",
        "authmanager-username-help": "Nome de usuario para autenticación.",
        "authmanager-password-help": "Contrasinal para autenticación.",
        "authmanager-domain-help": "Dominio para autenticación externa.",
        "authmanager-realname-label": "Nome real",
        "authmanager-realname-help": "Nome real do usuario",
        "authmanager-provider-password": "Autenticación baseada en contrasinal",
+       "authmanager-provider-password-domain": "Autenticación por contrasinal e dominio",
        "authmanager-provider-temporarypassword": "Contrasinal temporal",
        "authprovider-confirmlink-request-label": "Contas que deben ser ligadas",
        "authprovider-confirmlink-success-line": "$1: ligado correctamente.",
        "authprovider-confirmlink-failed": "A ligazón das contas non foi correctamente: $1",
        "authprovider-resetpass-skip-label": "Omitir",
        "authprovider-resetpass-skip-help": "Saltar a reinicialización do contrasinal.",
+       "authform-nosession-login": "A autenticación foi correcta, pero o seu navegador non pode \"lembrar\" ter iniciado sesión.\n\n$1",
+       "authform-nosession-signup": "A conta foi creada, pero o seu navegador non \"lembra\" ter iniciado sesión.\n\n$1",
+       "authform-newtoken": "Identificador perdido. $1",
+       "authform-notoken": "Identificador perdido",
+       "authform-wrongtoken": "Identificador incorrecto",
        "specialpage-securitylevel-not-allowed-title": "Non permitido",
+       "specialpage-securitylevel-not-allowed": "Sentímolo, non ten permitido usar esta páxina porque a súa identidade non puido verificarse.",
+       "authpage-cannot-login": "Imposible comezar a conexión.",
+       "authpage-cannot-login-continue": "Imposible continuar a conexión. O máis probable é que a súa sesión teña expirado.",
+       "authpage-cannot-create": "Non se pode iniciar a creación da conta.",
+       "authpage-cannot-create-continue": "Imposible continua a creación da conta. A súa sesión semella ter expirado.",
+       "authpage-cannot-link": "Imposible comezar a vinculación da conta.",
+       "authpage-cannot-link-continue": "Imposible continuar coa vinculación da conta. Semella que a súa sesión expirou.",
+       "cannotauth-not-allowed-title": "Permiso rexeitado",
+       "cannotauth-not-allowed": "Non ten permiso para usar esta páxina",
+       "changecredentials": "Cambiar as credenciais",
        "changecredentials-submit": "Cambiar",
        "changecredentials-submit-cancel": "Cancelar",
+       "changecredentials-invalidsubpage": "$1 non é un tipo de información de identificación válido.",
+       "changecredentials-success": "As súas credenciais foron cambiadas.",
+       "removecredentials": "Eliminar credenciais",
        "removecredentials-submit": "Eliminar",
        "removecredentials-submit-cancel": "Cancelar",
-       "credentialsform-account": "Nome da conta:"
+       "removecredentials-invalidsubpage": "$1 non é un tipo de información de identificación válido.",
+       "removecredentials-success": "As súas credenciais foron eliminadas.",
+       "credentialsform-provider": "Tipo de información de identificación:",
+       "credentialsform-account": "Nome da conta:",
+       "cannotlink-no-provider-title": "Non hai contas vinculables",
+       "cannotlink-no-provider": "Non hai contas vinculables.",
+       "linkaccounts": "Vincular contas",
+       "linkaccounts-success-text": "A conta foi vinculada.",
+       "linkaccounts-submit": "Vincular contas",
+       "unlinkaccounts": "Desvincular contas",
+       "unlinkaccounts-success": "A conta foi desvinculada."
 }
index 9a488db..5e29820 100644 (file)
        "badaccess-group0": "Yi'o diya o iijini mohutu kalaja u hepohilemu",
        "badaccess-groups": "Huhutu hepohilemu bilatasiyaliyo to pengguna {{PLURAL:$2|lembo'a}}$1.",
        "versionrequired": "Paralu MediaWiki persi $1",
-       "versionrequiredtext": "Paralu MediaWiki persi $1 wonu momake halaman botiye. Bilohi [[Spesial:Version|halaman versi]].",
+       "versionrequiredtext": "MediaWiki versi $1 paraluwolo wonu mopohuna lo halaman botiye.\nBilohi [[Special:Version|halaman versi]]",
        "ok": "OK",
        "retrievedfrom": "Yilotapu lonto \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|woluwo ulemu}} $1 ($2)",
        "nonwrite-api-promise-error": "Lunggongo HTTP 'Promise-Non-Write-API-Action' ma yilawo dabo hihile pilohutu ode modul loluladu API.",
        "internalerror": "Tilala todelomiyo",
        "internalerror_info": "Tilala todelomiyo:$1",
+       "internalerror-fatal-exception": "Ja wayitiyo fatal mengetik \"$1\"",
        "filecopyerror": "Jamowali mohemi tuwango \"$1\" de \"$2\"",
        "filerenameerror": "Jamowali moganti tanggulo tuwango \"$1\" de \"$2\"",
        "filedeleteerror": "Jamowali moluluta tuwango \"$1\"",
index c9975ac..910d323 100644 (file)
@@ -75,7 +75,7 @@
        "tog-watchlisthideanons": "הסתרת עריכות של משתמשים אנונימיים ברשימת המעקב",
        "tog-watchlisthidepatrolled": "הסתרת עריכות בדוקות ברשימת המעקב",
        "tog-watchlisthidecategorization": "הסתרת שינויים בקטגוריות של דפים",
-       "tog-ccmeonemails": "לשלוח אליי העתקים של הודעות דוא\"ל שאני {{GENDER:|שולח|שולחת}} למשתמשים אחרים",
+       "tog-ccmeonemails": "לשלוח אליי העתקים של הודעות דוא\"ל שאני {{GENDER:|שולח|שולחת}} למשתמשים",
        "tog-diffonly": "ביטול הצגת תוכן הדף מתחת להשוואת הגרסאות",
        "tog-showhiddencats": "הצגת קטגוריות מוסתרות",
        "tog-norollbackdiff": "לא להציג את ההבדלים בין הגרסאות לאחר ביצוע שחזור",
        "login-migrated-generic": "חשבון המשתמש שלך הועבר, ושם המשתמש שלך כבר לא קיים באתר ויקי זה.",
        "loginlanguagelabel": "שפה: $1",
        "suspicious-userlogout": "בקשתך לצאת מהחשבון נדחתה כיוון שנראה שהיא נשלחה על־ידי דפדפן שבור או שרת פרוקסי עם זיכרון מטמון.",
-       "createacct-another-realname-tip": "×\94ש×\9d ×\94×\90×\9e×\99ת×\99 ×\94×\95×\90 ×\90×\95פצ×\99×\95× ×\90×\9c×\99.\n×\90×\9d ×ª×\91×\97ר×\95 ×\9cספק×\95, ×\94×\95×\90 ×\99ש×\9eש ×\9c×\99×\99×\97×\95ס ×¢×\91×\95×\93ת ×\94×\9eשת×\9eש ×\90×\9c×\99×\95.",
+       "createacct-another-realname-tip": "×\9c×\90 ×\97×\95×\91×\94 ×\9c×\9e×\9c×\90 ×\90ת ×\94ש×\9d ×\94×\90×\9e×\99ת×\99.\n×\90×\9d ×¡×\95פק, ×\94×\95×\90 ×¢×©×\95×\99 ×\9cש×\9eש ×\9b×\93×\99 ×\9c×\99×\99×\97ס ×\9c×\9a ×\90ת ×¢×\91×\95×\93ת×\9a.",
        "pt-login": "כניסה לחשבון",
        "pt-login-button": "כניסה לחשבון",
        "pt-login-continue-button": "המשך כניסה לחשבון",
        "anontalkpagetext": "----\n<em>זהו דף שיחה של משתמש אנונימי שעדיין לא יצר חשבון במערכת, או שהוא לא משתמש בו.</em>\nלכן עלינו להשתמש בכתובת ה־IP המספרית כדי לזהותו.\nייתכן שכתובת IP זו תהיה משותפת למספר משתמשים.\nאם אתם משתמשים אנונימיים ומרגישים שקיבלתם הודעות בלתי רלוונטיות, אנא [[Special:CreateAccount|צרו חשבון]] או [[Special:UserLogin|היכנסו לחשבון]] כדי להימנע מבלבולים עתידיים עם משתמשים אנונימיים נוספים.",
        "noarticletext": "אין כרגע טקסט בדף הזה.\nבאפשרותך [[Special:Search/{{PAGENAME}}|לחפש את כותרת הדף]] בדפים אחרים,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} לחפש את הדף ביומנים],\nאו [{{fullurl:{{FULLPAGENAME}}|action=edit}} ליצור את הדף]</span>.",
        "noarticletext-nopermission": "אין כרגע טקסט בדף הזה.\nבאפשרותך [[Special:Search/{{PAGENAME}}|לחפש את כותרת הדף]] בדפים אחרים או <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} לחפש את הדף ביומנים]</span>, אך אין לך הרשאה ליצור את הדף.",
-       "missing-revision": "גרסה #$1 של הדף \"{{FULLPAGENAME}}\" אינה קיימת.\n\nזה נגרם בדרך כלל על־ידי לחיצה על קישור ישן לגרסה קודמת של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
+       "missing-revision": "גרסה #$1 של הדף \"{{FULLPAGENAME}}\" אינה קיימת.\n\nזה נגרם בדרך־כלל עקב לחיצה על קישור ישן לגרסה של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
        "userpage-userdoesnotexist": "חשבון המשתמש \"$1\" אינו רשום.\nאנא בִדקו אם ברצונכם ליצור/לערוך את הדף הזה.",
        "userpage-userdoesnotexist-view": "חשבון המשתמש \"$1\" אינו רשום.",
        "blocked-notice-logextract": "{{GENDER:$1|המשתמש הזה חסום|המשתמשת הזו חסומה}} כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
        "history-feed-item-nocomment": "$1 ב־$2",
        "history-feed-empty": "הדף המבוקש לא נמצא.\nייתכן שהוא נמחק, או ששמו שונה.\nבאפשרותך לנסות [[Special:Search|לחפש]] דפים רלוונטיים חדשים.",
        "history-edit-tags": "עריכת התגיות של הגרסאות שנבחרו",
-       "rev-deleted-comment": "(תקציר העריכה הוסר)",
+       "rev-deleted-comment": "(תקצ×\99ר ×\94ער×\99×\9b×\94 ×\94×\95סתר)",
        "rev-deleted-user": "(שם המשתמש הוסר)",
-       "rev-deleted-event": "(פר×\98×\99×\9d ×\9e×\94×\99×\95×\9e×\9f ×\94×\95סר×\95)",
+       "rev-deleted-event": "(פע×\95×\9cת ×\94×\99×\95×\9e×\9f ×\94×\95סתר×\94)",
        "rev-deleted-user-contribs": "[שם המשתמש או כתובת ה־IP הוסרו – העריכה הוסתרה מדף התרומות]",
        "rev-deleted-text-permission": "גרסת הדף הזאת <strong>נמחקה</strong>.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
        "rev-suppressed-text-permission": "גרסת הדף הזאת <strong>הועלמה</strong>.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההעלמות].",
        "rev-suppressed-no-diff": "אינכם יכולים לצפות בהבדלים בין הגרסאות שציינתם משום שאחת מהן '''נמחקה'''.",
        "rev-deleted-unhide-diff": "אחת מהגרסאות שביקשתם להשוות '''נמחקה'''.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].\nאתם עדיין יכולים [$1 לצפות בהבדלים בין הגרסאות] אם ברצונכם להמשיך.",
        "rev-suppressed-unhide-diff": "אחת מהגרסאות שביקשתם להשוות <strong>הועלמה</strong>.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההעלמות].\nאתם עדיין יכולים [$1 לצפות בהבדלים בין הגרסאות] אם ברצונכם להמשיך.",
-       "rev-deleted-diff-view": "אחת מהגרסאות שביקשתם להשוות '''נמחקה'''.\nאתם עדיין יכולים לצפות בהבדלים בין הגרסאות; ניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
+       "rev-deleted-diff-view": "אחת מהגרסאות שביקשת להשוות <strong>הוסתרה</strong>.\nעדיין באפשרותך לצפות בהבדלים בין הגרסאות; ניתן למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
        "rev-suppressed-diff-view": "אחת מהגרסאות שביקשתם להשוות <strong>הועלמה</strong>.\nאתם יכולים לצפות בהבדלים בין הגרסאות; ניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההעלמות].",
        "rev-delundel": "שינוי מצב התצוגה",
        "rev-showdeleted": "הצגה",
        "revdelete-no-file": "הקובץ שציינת אינו קיים.",
        "revdelete-show-file-confirm": "האם אתם בטוחים שברצונכם לצפות בגרסה המחוקה של הקובץ \"<nowiki>$1</nowiki>\" מתאריך $3, $2?",
        "revdelete-show-file-submit": "כן",
-       "revdelete-selected-text": "{{PLURAL:$1|הגרסה שנבחרה|הגרסאות שנבחרו}} מתוך [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|הגרסה שנבחרה|הגרסאות שנבחרו}} מתוך הדף [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|גרסת הקובץ שנבחרה|גרסאות הקובץ שנבחרו}} מתוך [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|פעולת היומן שנבחרה|פעולות היומן שנבחרו}}:",
-       "revdelete-text-text": "×\92רס×\90×\95ת ×©× ×\9e×\97ק×\95 ×¢×\93×\99×\99×\9f ×ª×\95פענ×\94 ×\91×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\93×£, ×\90×\9a ×\97×\9cק×\99×\9d ×\9e×\94ת×\95×\9b×\9f ×©×\9c×\94×\9f ×\9c×\90 ×\99×\94×\99×\95 ×\96×\9e×\99× ×\99×\9d לציבור.",
-       "revdelete-text-file": "×\92רס×\90×\95ת ×§×\91צ×\99×\9d ×©× ×\9e×\97ק×\95 ×¢×\93×\99×\99×\9f ×ª×\95פענ×\94 ×\91×\94×\99ס×\98×\95ר×\99×\99ת ×\94ק×\95×\91×¥, ×\90×\9a ×\97×\9cק×\99×\9d ×\9e×\94ת×\95×\9b×\9f ×©×\9c×\94×\9f ×\9c×\90 ×\99×\94×\99×\95 ×\96×\9e×\99× ×\99×\9d לציבור.",
-       "logdelete-text": "פע×\95×\9c×\95ת ×\99×\95×\9e×\9f ×©× ×\9e×\97ק×\95 ×¢×\93×\99×\99×\9f ×ª×\95פענ×\94 ×\91×\93פ×\99 ×\94×\99×\95×\9e× ×\99×\9d, ×\90×\9a ×\97×\9cק×\99×\9d ×\9e×\94ת×\95×\9b×\9f ×©×\9c×\94×\9f ×\9c×\90 ×\99×\94×\99×\95 ×\96×\9e×\99× ×\99×\9d לציבור.",
-       "revdelete-text-others": "×\9eפע×\99×\9c×\99 ×\9eער×\9bת ×\90×\97ר×\99×\9d ×¢×\93×\99×\99×\9f ×\99×\95×\9b×\9c×\95 ×\9c×\92שת ×\9cת×\95×\9b×\9f ×\94נסתר ×\9b×\93×\99 לשחזר אותו, אלא אם כן תוגדרנה הגבלות נוספות.",
+       "revdelete-text-text": "×\92רס×\90×\95ת ×©×\94×\95סתר×\95 ×¢×\93×\99×\99×\9f ×\99×\95פ×\99×¢×\95 ×\91×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\93×£, ×\90×\91×\9c ×\94ת×\95×\9b×\9f ×©×\9c×\94×\9f ×\9c×\90 ×\99×\94×\99×\94 ×\96×\9e×\99×\9f לציבור.",
+       "revdelete-text-file": "×\92רס×\90×\95ת ×§×\91צ×\99×\9d ×©×\94×\95סתר×\95 ×¢×\93×\99×\99×\9f ×\99×\95פ×\99×¢×\95 ×\91×\94×\99ס×\98×\95ר×\99×\99ת ×\94ק×\95×\91×¥, ×\90×\91×\9c ×\94ת×\95×\9b×\9f ×©×\9c×\94×\9f ×\9c×\90 ×\99×\94×\99×\94 ×\96×\9e×\99×\9f לציבור.",
+       "logdelete-text": "פע×\95×\9c×\95ת ×\99×\95×\9e×\9f ×©×\94×\95סתר×\95 ×¢×\93×\99×\99×\9f ×\99×\95פ×\99×¢×\95 ×\91×\93פ×\99 ×\94×\99×\95×\9e× ×\99×\9d, ×\90×\91×\9c ×\94ת×\95×\9b×\9f ×©×\9c×\94×\9f ×\9c×\90 ×\99×\94×\99×\94 ×\96×\9e×\99×\9f לציבור.",
+       "revdelete-text-others": "×\9eפע×\99×\9c×\99 ×\9eער×\9bת ×\90×\97ר×\99×\9d ×¢×\93×\99×\99×\9f ×\99×\95×\9b×\9c×\95 ×\9c×\92שת ×\9cת×\95×\9b×\9f ×\94×\9e×\95סתר ×\95×\90×£ לשחזר אותו, אלא אם כן תוגדרנה הגבלות נוספות.",
        "revdelete-confirm": "אנא אשרו שזה אכן מה שאתם מתכוונים לעשות, שאתם מבינים את התוצאות של מעשה כזה, ושהמעשה מבוצע בהתאם ל[[{{MediaWiki:Policy-url}}|נוהלי האתר]].",
        "revdelete-suppress-text": "יש להשתמש בהעלמה '''אך ורק''' במקרים הבאים:\n* מידע שעלול להיות לשון הרע\n* חשיפת מידע אישי\n*: <em>כתובות בתים ומספרי טלפון, מספרי זהות, וכו'</em>",
        "revdelete-legend": "הגדרת הגבלות התצוגה",
        "revdelete-hide-text": "תוכן הגרסה",
        "revdelete-hide-image": "הסתרת תוכן הקובץ",
-       "revdelete-hide-name": "×\94סתרת ×\93×£ ×\94×\99×¢×\93 ×\95×\94פר×\9e×\98ר×\99×\9d",
+       "revdelete-hide-name": "הסתרת היעד והפרמטרים",
        "revdelete-hide-comment": "תקציר העריכה",
        "revdelete-hide-user": "שם המשתמש או כתובת ה־IP של העורך",
-       "revdelete-hide-restricted": "×\94×¢×\9c×\9eת ×\94×\9e×\99×\93×¢ ×\92×\9d ×\9e×\9eפע×\99×\9c×\99 ×\94×\9eער×\9bת",
+       "revdelete-hide-restricted": "העלמת המידע גם ממפעילי מערכת",
        "revdelete-radio-same": "(ללא שינוי)",
        "revdelete-radio-set": "מוסתר",
        "revdelete-radio-unset": "גלוי",
        "logdelete-success": "מצב התצוגה של פעולת היומן שוּנה.",
        "logdelete-failure": "לא ניתן היה לשנות את מצב התצוגה של היומן:\n$1",
        "revdel-restore": "שינוי מצב התצוגה",
-       "pagehist": "היסטוריית הדף",
+       "pagehist": "×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\92רס×\90×\95ת ×©×\9c ×\94×\93×£",
        "deletedhist": "הגרסאות המחוקות",
        "revdelete-hide-current": "שגיאה בהסתרת הפריט מתאריך $2, $1: זו הגרסה הנוכחית.\nלא ניתן להסתיר אותה.",
        "revdelete-show-no-access": "שגיאה בהצגת הפריט מתאריך $2, $1: פריט זה סומן כ\"מוגבל\".\nאין לך גישה אליו.",
        "revdelete-reason-dropdown": "* סיבות מחיקה נפוצות\n** הפרת זכויות יוצרים\n** תקציר עריכה או מידע אישי לא הולמים\n** שם משתמש לא הולם\n** מידע שעלול להיות לשון הרע",
        "revdelete-otherreason": "סיבה אחרת/נוספת:",
        "revdelete-reasonotherlist": "סיבה אחרת",
-       "revdelete-edit-reasonlist": "ער×\99×\9bת ×¡×\99×\91×\95ת ×\94×\9e×\97×\99קה",
+       "revdelete-edit-reasonlist": "ער×\99×\9bת ×¡×\99×\91×\95ת ×\94×\94סתרה",
        "revdelete-offender": "מחבר הגרסה:",
        "suppressionlog": "יומן העלמות",
        "suppressionlogtext": "להלן רשימת המחיקות והחסימות הכוללות תוכן המוסתר ממפעילי המערכת.\nראו את [[Special:BlockList|רשימת החסומים]] לרשימת החסימות הפעילות כעת.",
        "diff-multi-sameuser": "({{PLURAL:$1|גרסת ביניים אחת|$1 גרסאות ביניים}} של אותו משתמש {{PLURAL:$1|אינה מוצגת|אינן מוצגות}})",
        "diff-multi-otherusers": "({{PLURAL:$1|גרסת ביניים אחת|$1 גרסאות ביניים}} של {{PLURAL:$2|משתמש אחר אחד|$2 משתמשים}} {{PLURAL:$1|אינה מוצגת|אינן מוצגות}})",
        "diff-multi-manyusers": "({{PLURAL:$1|גרסת ביניים אחת|$1 גרסאות ביניים}} של יותר {{PLURAL:$2|ממשתמש אחד|מ־$2 משתמשים}} {{PLURAL:$1|אינה מוצגת|אינן מוצגות}})",
-       "difference-missing-revision": "{{PLURAL:$2|×\92רס×\94 ×\90×\97ת|$2 ×\92רס×\90×\95ת}} ×©×\9c ×\94×\94×\91×\93×\9c ×\94×\96×\94 ×\91×\99×\9f ×©×ª×\99 ×\92רס×\90×\95ת ($1) {{PLURAL:$2|×\9c×\90 × ×\9eצ×\90×\94\9c×\90 × ×\9eצ×\90×\95}}.\n\n×\96×\94 × ×\92ר×\9d ×\91×\93ר×\9a ×\9b×\9c×\9c ×¢×\9cÖ¾×\99×\93×\99 ×\9c×\97×\99צ×\94 ×¢×\9c ×§×\99ש×\95ר ×\99ש×\9f ×\9c×\94×\91×\93×\9c בין גרסאות של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
+       "difference-missing-revision": "{{PLURAL:$2|×\92רס×\94 ×\90×\97ת|$2 ×\92רס×\90×\95ת}} ×\9eת×\95×\9a ×\94×\92רס×\90×\95ת ×\94×\9e×\99×\95×¢×\93×\95ת ×\9c×\94ש×\95×\95×\90×\94 ($1) {{PLURAL:$2|×\9c×\90 × ×\9eצ×\90×\94\9c×\90 × ×\9eצ×\90×\95}}.\n\n×\96×\94 × ×\92ר×\9d ×\91×\93ר×\9aÖ¾×\9b×\9c×\9c ×¢×§×\91 ×\9c×\97×\99צ×\94 ×¢×\9c ×§×\99ש×\95ר ×\99ש×\9f ×\9c×\94×\91×\93×\9c×\99×\9d בין גרסאות של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
        "searchresults": "תוצאות החיפוש",
        "searchresults-title": "תוצאות החיפוש \"$1\"",
        "titlematches": "כותרות דפים תואמות",
        "recentchangesdays-max": "לכל היותר {{PLURAL:$1|יום אחד|יומיים|$1 ימים}}",
        "recentchangescount": "מספר העריכות שמוצגות כברירת מחדל:",
        "prefs-help-recentchangescount": "ההעדפה הזאת כוללת את דף השינויים האחרונים, דפי היסטוריית גרסאות ויומנים.",
-       "prefs-help-watchlist-token2": "×\96×\94×\95 ×\94×\9eפת×\97 ×\94ס×\95×\93×\99 ×\9c×\94×\96× ×\94 ×©×\9c ×¨×©×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a.\n×\9b×\9c ×\9e×\99 ×©×\99×\95×\93×¢ ×\90×\95ת×\95 ×\99×\95×\9b×\9c ×\9cקר×\95×\90 ×\90ת ×¨×©×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a, ×\9c×\9b×\9f ×\90×\99×\9f ×\9cשתף ×\90×\95ת×\95.\n[[Special:ResetTokens|×\90×\9d ×\99ש ×\91×\9b×\9a ×¦×\95ר×\9a, ×\90פשר ×\9c×\90פס ×\90×\95ת×\95 ×\9b×\90ן]].",
+       "prefs-help-watchlist-token2": "×\96×\94×\95 ×\94×\9eפת×\97 ×\94ס×\95×\93×\99 ×\9c×\94×\96× ×\94 ×©×\9c ×¨×©×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a.\n×\9b×\9c ×\9e×\99 ×©×\99×\95×\93×¢ ×\90×\95ת×\95 ×\99×\9b×\95×\9c ×\9cקר×\95×\90 ×\90ת ×¨×©×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a, ×\9c×\9b×\9f ×\90×\99×\9f ×\9cשתף ×\90×\95ת×\95.\n×\9c×\9eקר×\94 ×\94צ×\95ר×\9a, ×\90פשר [[Special:ResetTokens|×\9c×\90פס ×\90ת ×\94×\90ס×\99×\9e×\95ן]].",
        "savedprefs": "ההעדפות שלך נשמרו.",
        "savedrights": "ההרשאות של {{GENDER:$1|המשתמש|המשתמשת}} \"$1\" נשמרו.",
        "timezonelegend": "אזור זמן:",
        "timezoneregion-europe": "אירופה",
        "timezoneregion-indian": "האוקיינוס ההודי",
        "timezoneregion-pacific": "האוקיינוס השקט",
-       "allowemail": "×\9c×\90פשר ×\9c×\9eשת×\9eש×\99×\9d ×\90×\97ר×\99×\9d ×\9cש×\9c×\95×\97 ×\9c×\99 ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99",
+       "allowemail": "לאפשר למשתמשים לשלוח לי דואר אלקטרוני",
        "prefs-searchoptions": "חיפוש",
        "prefs-namespaces": "מרחבי שם",
        "default": "ברירת מחדל",
        "gender-unknown": "באזכורים שלך בממשק, המערכת תשתמש במידת האפשר בלשון שאינה תלוית־מגדר",
        "gender-male": "הוא עורך דפים בוויקי",
        "gender-female": "היא עורכת דפים בוויקי",
-       "prefs-help-gender": "×\90×\99×\9f חובה למלא העדפה זו.\nהמערכת משתמשת במידע הזה כדי לפנות אליך/אלייך ולציין את שם המשתמש שלך במין הדקדוקי הנכון.\nהמידע יהיה ציבורי.",
+       "prefs-help-gender": "×\9c×\90 חובה למלא העדפה זו.\nהמערכת משתמשת במידע הזה כדי לפנות אליך/אלייך ולציין את שם המשתמש שלך במין הדקדוקי הנכון.\nהמידע יהיה ציבורי.",
        "email": "דוא\"ל",
-       "prefs-help-realname": "×\90×\99×\9f ×\97×\95×\91×\94 ×\9c×\9e×\9c×\90 ×\90ת ×\94ש×\9d ×\94×\90×\9e×\99ת×\99.\n×\94ש×\9d ×\94×\90×\9e×\99ת×\99 עשוי לשמש כדי לייחס לך את עבודתך.",
+       "prefs-help-realname": "×\9c×\90 ×\97×\95×\91×\94 ×\9c×\9e×\9c×\90 ×\90ת ×\94ש×\9d ×\94×\90×\9e×\99ת×\99.\n×\90×\9d ×¡×\95פק, ×\94×\95×\90 עשוי לשמש כדי לייחס לך את עבודתך.",
        "prefs-help-email": "כתובת דואר אלקטרוני היא אופציונלית, אבל היא חיונית לאיפוס הסיסמה במקרה ש{{GENDER:|תשכח|תשכחי}} אותה.",
-       "prefs-help-email-others": "×\91×\90פשר×\95ת×\9a ×\92×\9d ×\9c×\91×\97×\95ר ×\9c×\90פשר ×\9c×\90×\97ר×\99×\9d ×\9c×\99צ×\95ר ×\90×\99ת×\9a ×§×©×¨ ×\91×\90×\9eצע×\95ת ×\93×\95×\90\"×\9c ×\93ר×\9a ×§×\99ש×\95ר ×\91×\93×£ ×\94×\9eשת×\9eש ×\90×\95 ×\91×\93×£ ×\94ש×\99×\97×\94 ×©×\9c×\9a.\n×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×©×\9c×\9a ×\9c×\90 ×ª×\99×\97שף ×\9bש×\9eשת×\9eש×\99×\9d ×\90×\97רים ייצרו איתך קשר.",
+       "prefs-help-email-others": "×\91×\90פשר×\95ת×\9a ×\92×\9d ×\9c×\91×\97×\95ר ×\9c×\90פשר ×\9c×\9eשת×\9eש×\99×\9d ×\9c×\99צ×\95ר ×\90×\99ת×\9a ×§×©×¨ ×\91×\90×\9eצע×\95ת ×\93×\95×\90\"×\9c ×\93ר×\9a ×§×\99ש×\95ר ×\91×\93×£ ×\94×\9eשת×\9eש ×\90×\95 ×\91×\93×£ ×\94ש×\99×\97×\94 ×©×\9c×\9a.\n×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×©×\9c×\9a ×\9c×\90 ×ª×\99×\97שף ×\9bש×\9eשת×\9eשים ייצרו איתך קשר.",
        "prefs-help-email-required": "כתובת דואר אלקטרוני נדרשת לכתיבה באתר.",
        "prefs-info": "מידע בסיסי",
        "prefs-i18n": "בינאום",
        "trackingcategories-msg": "קטגוריית מעקב",
        "trackingcategories-name": "שם ההודעה",
        "trackingcategories-desc": "הקריטריון להכללה בקטגוריה",
-       "restricted-displaytitle-ignored": "×\93פ×\99×\9d ×©×\9b×\95תרת ×\94תצ×\95×\92×\94 ×©×\9c×\94×\9f אינה מופעלת",
-       "restricted-displaytitle-ignored-desc": "×\91×\93×£ ×\94×\96×\94 ×\9e×\95×\92×\93רת ×\9b×\95תרת ×ª×¦×\95×\92×\94 (<code><nowiki>{{DISPLAYTITLE}}</nowiki></code>) ×©×\90×\99× ×\94 ×\9e×\95פע×\9cת, ×\9b×\99 ×\94×\99×\90 ×\90×\99× ×\94 ×©×\95×\95ת־ער×\9a ×\9cש×\9d ×\94×\90×\9eת×\99 של הדף.",
+       "restricted-displaytitle-ignored": "×\93פ×\99×\9d ×©×\9b×\95תרת ×\94תצ×\95×\92×\94 ×©×\9c×\94×\9d אינה מופעלת",
+       "restricted-displaytitle-ignored-desc": "×\91×\93×£ ×\94×\96×\94 ×\9e×\95×\92×\93רת ×\9b×\95תרת ×ª×¦×\95×\92×\94 (<code><nowiki>{{DISPLAYTITLE}}</nowiki></code>) ×©×\90×\99× ×\94 ×\9e×\95פע×\9cת, ×\9b×\99 ×\94×\99×\90 ×\90×\99× ×\94 ×ª×\95×\90×\9eת ×\9c×\9b×\95תרת ×\94×\90×\9e×\99ת×\99ת של הדף.",
        "noindex-category-desc": "הדף אינו מאונדקס על‏‏־ידי רובוטים כיוון שהוא כולל את מילת הקסם <code><nowiki>__NOINDEX__</nowiki></code> והוא במרחב שם שבו דגל כזה מותר לשימוש.",
        "index-category-desc": "הדף כולל את מילת הקסם <code><nowiki>__INDEX__</nowiki></code> (והוא במרחב שם שבו דגל כזה מותר לשימוש), ולכן הוא מאונדקס על‏‏֫־ידי רובוטים אף שכברירת מחדל הוא לא היה מאונדקס על ידם.",
        "post-expand-template-inclusion-category-desc": "גודל הדף גדול מ‏‏־<code>$wgMaxArticleSize</code> לאחר הרחבת כל התבניות, ולכן כמה תבניות לא הורחבו.",
        "trackingcategories-disabled": "הקטגוריה מבוטלת",
        "mailnologin": "אין כתובת לשליחה",
        "mailnologintext": "יש [[Special:UserLogin|להיכנס לחשבון]] ולהגדיר כתובת דואר אלקטרוני תקינה ב[[Special:Preferences|העדפות המשתמש]] כדי לשלוח דואר אלקטרוני למשתמשים אחרים.",
-       "emailuser": "שליחת דואר אלקטרוני למשתמש זה",
+       "emailuser": "שליחת דוא\"ל ל{{GENDER:{{BASEPAGENAME}}|משתמש זה|משתמשת זו}}",
        "emailuser-title-target": "שליחת דוא\"ל {{GENDER:$1|למשתמש זה|למשתמשת זו}}",
        "emailuser-title-notarget": "שליחת דוא\"ל למשתמש",
-       "emailpagetext": "× ×\99ת×\9f ×\9c×\94שת×\9eש ×\91×\98×\95פס ×\9b×\93×\99 ×\9cש×\9c×\95×\97 ×\94×\95×\93עת ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 {{GENDER:$1|×\9c×\9eשת×\9eש ×\96×\94\9c×\9eשת×\9eשת ×\96×\95}}.\n×\9bת×\95×\91ת ×\94×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 ×©×\9bת×\91ת ב[[Special:Preferences|העדפות המשתמש שלך]] תופיע ככתובת שההודעה נשלחה ממנה, כדי לאפשר תגובה ישירה.",
+       "emailpagetext": "× ×\99ת×\9f ×\9c×\94שת×\9eש ×\91×\98×\95פס ×©×\9c×\94×\9c×\9f ×\9b×\93×\99 ×\9cש×\9c×\95×\97 ×\94×\95×\93עת ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 {{GENDER:$1|×\9c×\9eשת×\9eש ×\96×\94\9c×\9eשת×\9eשת ×\96×\95}}.\n×\9bת×\95×\91ת ×\94×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 ×©×\94×\96× ת ב[[Special:Preferences|העדפות המשתמש שלך]] תופיע ככתובת שההודעה נשלחה ממנה, כדי לאפשר תגובה ישירה.",
        "defemailsubject": "דוא\"ל מ{{grammar:תחילית|{{SITENAME}}}} מהמשתמש \"$1\"",
        "usermaildisabled": "שליחת דוא\"ל למשתמשים מבוטלת",
        "usermaildisabledtext": "אינכם מורשים לשלוח דואר אלקטרוני למשתמשים אחרים באתר זה",
        "emailtarget": "יש להקליד את שם המשתמש של הנמען",
        "emailusername": "שם משתמש:",
        "emailusernamesubmit": "שליחה",
-       "email-legend": "ש×\9c×\99×\97ת ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×\9c×\9eשת×\9eש ×\90×\97ר ×©×\9c {{SITENAME}}",
+       "email-legend": "ש×\9c×\99×\97ת ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×\9c×\9eשת×\9eש ×\91{{GRAMMAR:ת×\97×\99×\9c×\99ת|{{SITENAME}}}}",
        "emailfrom": "מאת:",
        "emailto": "אל:",
        "emailsubject": "נושא:",
        "emailmessage": "הודעה:",
        "emailsend": "שליחה",
-       "emailccme": "× ×\90 ×\9cש×\9c×\95×\97 ×\9c×\99 ×\91×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×\94עתק ×©×\9c ×\94×\95×\93עתי.",
+       "emailccme": "שִ×\9c×\97×\95 ×\9c×\99 ×\94עתק ×©×\9c ×\94×\94×\95×\93×¢×\94 ×©×\9cי.",
        "emailccsubject": "העתק של הודעתך למשתמש $1: $2",
        "emailsent": "הדואר נשלח",
        "emailsenttext": "הודעת הדואר האלקטרוני שלך נשלחה.",
        "rollbacklinkcount": "שחזור {{PLURAL:$1|עריכה אחת|$1 עריכות}}",
        "rollbacklinkcount-morethan": "שחזור יותר מ{{PLURAL:$1|עריכה אחת|־$1 עריכות}}",
        "rollbackfailed": "השחזור נכשל",
+       "rollback-missingparam": "חסר פרמטר נדרש בבקשה.",
        "cantrollback": "לא ניתן לשחזר את העריכה;\nהתורם האחרון הוא היחיד שכתב בדף זה.",
        "alreadyrolled": "לא ניתן לשחזר את העריכה של [[User:$2|$2]] ([[User talk:$2|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) בדף [[:$1]]; הדף כבר נערך או שוחזר.\n\nהעריכה האחרונה הייתה של [[User:$3|$3]] ([[User talk:$3|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "תקציר העריכה היה: <em>$1</em>.",
        "revertpage": "שוחזר מעריכות של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]]) לעריכה האחרונה של [[User:$1|$1]]",
        "revertpage-nouser": "שוחזר מעריכות של משתמש מוסתר לעריכה האחרונה של {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "שוחזר מעריכות של $1 לעריכה האחרונה של $2",
+       "rollback-success-notify": "עריכות של $1 שוחזרו;\nנוחזר לגרסה האחרונה מאת $2 [$3 הצגת שינויים]",
        "sessionfailure-title": "בעיה בחיבור",
        "sessionfailure": "נראה שיש בעיה בחיבורכם לאתר;\nפעולתכם בוטלה כאמצעי זהירות נגד התחזות לתקשורת ממחשבכם.\nאנא חזרו לדף הקודם, העלו אותו מחדש ונסו שוב.",
        "changecontentmodel": "שינוי מודל התוכן של דף",
        "sp-contributions-blocked-notice": "{{GENDER:$1|המשתמש הזה חסום|המשתמשת הזו חסומה}} כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
        "sp-contributions-blocked-notice-anon": "כתובת IP זו חסומה כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
        "sp-contributions-search": "חיפוש תרומות",
-       "sp-contributions-username": "ש×\9d ×\9eשת×\9eש ×\90×\95 ×\9bת×\95×\91ת IP:",
+       "sp-contributions-username": "×\9bת×\95×\91ת IP ×\90×\95 ×©×\9d ×\9eשת×\9eש:",
        "sp-contributions-toponly": "הצגת עריכות שהן הגרסאות האחרונות בלבד",
        "sp-contributions-newonly": "הצגת עריכות שהן יצירות של דפים בלבד",
        "sp-contributions-submit": "חיפוש",
        "block-log-flags-noautoblock": "חסימה אוטומטית מבוטלת",
        "block-log-flags-noemail": "שליחת דוא\"ל נחסמה",
        "block-log-flags-nousertalk": "עריכת דף השיחה האישי נחסמה",
-       "block-log-flags-angry-autoblock": "×\97ס×\99×\9e×\94 ×\90×\95×\98×\95×\9e×\98×\99ת ×\9eש×\95×\9b×\9c×\9cת מופעלת",
+       "block-log-flags-angry-autoblock": "×\97ס×\99×\9e×\94 ×\90×\95×\98×\95×\9e×\98×\99ת ×\9eתק×\93×\9eת מופעלת",
        "block-log-flags-hiddenname": "שם המשתמש הוסתר",
        "range_block_disabled": "האפשרות לחסום טווח כתובות אינה פעילה.",
        "ipb_expiry_invalid": "זמן פקיעת החסימה אינו תקין.",
        "tooltip-ca-unprotect": "שינוי ההגנה על דף זה",
        "tooltip-ca-delete": "מחיקת דף זה",
        "tooltip-ca-undelete": "שחזור עריכות שנעשו בדף זה לפני שנמחק",
-       "tooltip-ca-move": "×\94×¢×\91רת דף זה",
+       "tooltip-ca-move": "ש×\99× ×\95×\99 ×\94ש×\9d ×©×\9c דף זה",
        "tooltip-ca-watch": "הוספת דף זה לרשימת המעקב שלך",
        "tooltip-ca-unwatch": "הסרת דף זה מרשימת המעקב שלך",
        "tooltip-search": "חיפוש ב{{grammar:תחילית|{{SITENAME}}}}",
        "tooltip-t-recentchangeslinked": "השינויים האחרונים שבוצעו בדפים המקושרים מדף זה",
        "tooltip-feed-rss": "הזנת RSS עבור דף זה",
        "tooltip-feed-atom": "הזנת Atom עבור דף זה",
-       "tooltip-t-contributions": "{{GENDER:$1|תרומותיו של משתמש זה|תרומותיה של משתמשת זו}}",
+       "tooltip-t-contributions": "רשימת העריכות שנעשו על־ידי {{GENDER:$1|משתמש זה|משתמשת זו}}",
        "tooltip-t-emailuser": "שליחת דואר אלקטרוני {{GENDER:$1|למשתמש זה|למשתמשת זו}}",
        "tooltip-t-info": "מידע נוסף על דף זה",
        "tooltip-t-upload": "העלאת קבצים",
        "tooltip-summary": "להכנסת תקציר קצר",
        "common.css": "/* הסגנונות הנכתבים כאן ישפיעו על כל העיצובים */",
        "print.css": "/* הסגנונות הנכתבים כאן ישפיעו על הפלט בהדפסה בלבד */",
-       "noscript.css": "/* הסגנונות הנכתבים כאן ישפיעו על משתמשים עם JavaScript מבוטל */",
+       "noscript.css": "/* הסגנונות הנכתבים כאן ישפיעו על משתמשים עם ג'אווה-סקריפט מבוטל */",
        "group-autoconfirmed.css": "/* הסגנונות הנכתבים כאן ישפיעו על משתמשים ותיקים בלבד */",
        "group-user.css": "/* הסגנונות הנכתבים כאן ישפיעו על משתמשים רשומים בלבד */",
        "group-bot.css": "/* הסגנונות הנכתבים כאן ישפיעו על בוטים בלבד */",
        "group-sysop.css": "/* הסגנונות הנכתבים כאן ישפיעו על מפעילי מערכת בלבד */",
        "group-bureaucrat.css": "/* הסגנונות הנכתבים כאן ישפיעו על ביורוקרטים בלבד */",
-       "common.js": "/* ×\9b×\9c ×¡×§×¨×\99פ×\98 JavaScript ×©× ×\9bת×\91 ×\9b×\90×\9f ×\99ר×\95×¥ ×¢×\91×\95ר ×\9b×\9c ×\94×\9eשת×\9eש×\99×\9d ×\91×\9b×\9c ×\98×¢×\99נת ×¢×\9e×\95×\93 */",
-       "group-autoconfirmed.js": "/* ×\9b×\9c ×¡×§×¨×\99פ×\98 JavaScript ×©× ×\9bת×\91 ×\9b×\90×\9f ×\99ר×\95×¥ עבור משתמשים ותיקים בלבד */",
-       "group-user.js": "/* ×\9b×\9c ×¡×§×¨×\99פ×\98 JavaScript ×©× ×\9bת×\91 ×\9b×\90×\9f ×\99ר×\95×¥ עבור משתמשים רשומים בלבד */",
-       "group-bot.js": "/* ×\9b×\9c ×¡×§×¨×\99פ×\98 JavaScript ×©× ×\9bת×\91 ×\9b×\90×\9f ×\99ר×\95×¥ עבור בוטים בלבד */",
-       "group-sysop.js": "/* ×\9b×\9c ×¡×§×¨×\99פ×\98 JavaScript ×©× ×\9bת×\91 ×\9b×\90×\9f ×\99ר×\95×¥ עבור מפעילי מערכת בלבד */",
-       "group-bureaucrat.js": "/* ×\9b×\9c ×¡×§×¨×\99פ×\98 JavaScript ×©× ×\9bת×\91 ×\9b×\90×\9f ×\99ר×\95×¥ עבור ביורוקרטים בלבד */",
+       "common.js": "/* ×\9b×\9c ×\94סקר×\99פ×\98×\99×\9d ×©× ×\9bת×\91×\99×\9d ×\9b×\90×\9f ×\99×\99×\98×¢× ×\95 ×¢×\91×\95ר ×\9b×\9c ×\94×\9eשת×\9eש×\99×\9d ×\91×\9b×\9c ×\98×¢×\99נת ×¢×\9e×\95×\93. */",
+       "group-autoconfirmed.js": "/* ×\9b×\9c ×\94סקר×\99פ×\98×\99×\9d ×\94× ×\9bת×\91×\99×\9d ×\9b×\90×\9f ×\99×\99×\98×¢× ×\95 עבור משתמשים ותיקים בלבד */",
+       "group-user.js": "/* ×\9b×\9c ×\94סקר×\99פ×\98×\99×\9d ×\94× ×\9bת×\91×\99×\9d ×\9b×\90×\9f ×\99×\99×\98×¢× ×\95 עבור משתמשים רשומים בלבד */",
+       "group-bot.js": "/* ×\9b×\9c ×\94סקר×\99פ×\98×\99×\9d ×\94× ×\9bת×\91×\99×\9d ×\9b×\90×\9f ×\99×\99×\98×¢× ×\95 עבור בוטים בלבד */",
+       "group-sysop.js": "/* ×\9b×\9c ×\94סקר×\99פ×\98×\99×\9d ×\94× ×\9bת×\91×\99×\9d ×\9b×\90×\9f ×\99×\99×\98×¢× ×\95 עבור מפעילי מערכת בלבד */",
+       "group-bureaucrat.js": "/* ×\9b×\9c ×\94סקר×\99פ×\98×\99×\9d ×\94× ×\9bת×\91×\99×\9d ×\9b×\90×\9f ×\99×\99×\98×¢× ×\95 עבור ביורוקרטים בלבד */",
        "anonymous": "{{PLURAL:$1|משתמש אנונימי|משתמשים אנונימיים}} של {{SITENAME}}",
        "siteuser": "משתמש {{SITENAME}} $1",
        "anonuser": "משתמש אנונימי של {{SITENAME}} $1",
        "patrol-log-header": "יומן זה מציג גרסאות שנבדקו.",
        "log-show-hide-patrol": "$1 יומן שינויים בדוקים",
        "log-show-hide-tag": "$1 יומן תגיות",
-       "deletedrevision": "×\9e×\97ק ×\92רס×\94 ×\99שנ×\94 $1",
+       "deletedrevision": "×\9e×\97×\99קת ×\92רס×\94 ×\99שנ×\94 ($1)",
        "filedeleteerror-short": "שגיאה במחיקת הקובץ: $1",
        "filedeleteerror-long": "שגיאות שאירעו בעת מחיקת הקובץ:\n\n$1",
        "filedelete-missing": "מחיקת הקובץ \"$1\" נכשלה, כיוון שהוא אינו קיים.",
        "confirm-watch-top": "להוסיף את הדף הזה לרשימת המעקב שלך?",
        "confirm-unwatch-button": "אישור",
        "confirm-unwatch-top": "להסיר את הדף הזה מרשימת המעקב שלך?",
+       "confirm-rollback-button": "אישור",
+       "confirm-rollback-top": "לשחזור את השינויים לדף הזה?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "→ לדף הקודם",
        "imgmultipagenext": "לדף הבא ←",
index 2b37f1d..b5f4aa9 100644 (file)
        "tog-hidepatrolled": "Къайладаккха ха дера чакхдаьнна дола хувцамаш керда хувцамашта юкъера",
        "tog-newpageshidepatrolled": "Къайлаяьккха ха дера чакхъянна йола оагIонаш керда оагIонашта юкъера",
        "tog-hidecategorization": "Къайлаяха оагӀонай категореш",
-       "tog-extendwatchlist": "Хьашеръяь йола зем бара список, массадола хувцамаш ше чулоацаш, тхьара даь хувцамаш хинна ца Iеш.",
-       "tog-usenewrc": "Ð\9aеÑ\80да Ñ\85Ñ\83вÑ\86амаÑ\88ка Ð° Ñ\85Ñ\8cаÑ\82|аÑ\8fздаÑ\80а Ð·ÐµÐ¼Ð±Ð°ÐºÐºÑ\85аÑ\80га Ð° Ñ\8dÑ\80гадаккÑ\85аÑ\80аÑ\88 Ñ\82оабаде (JavaScript Ñ\8dÑ\88а)",
+       "tog-extendwatchlist": "Хьашеръяь йола зем бара список, массадола хувцамаш ше чулоацаш, тIеххьара даь хувцамаш хинна ца Iеш.",
+       "tog-usenewrc": "Ð¥Ñ\83вÑ\86амаÑ\88 Ñ\82оабаÑ\88 ÐµÑ\88 Ð»ÐµÐ»Ð°Ð´Ðµ ÐºÐµÑ\80да Ð½Ð¸Ð¹Ñ\81даÑ\80аÑ\88ка Ð°, Ð·ÐµÐ¼ Ð±Ð°Ñ\80а Ñ\81пиÑ\81ка Ñ\87Ñ\83 Ð°",
        "tog-numberheadings": "Автоматически заголовкашта нумераци хьае",
-       "tog-showtoolbar": "Ð\93IиÑ\80Ñ\81ай панель хьахьокха хувцам беч хана",
+       "tog-showtoolbar": "Ð\93IиÑ\80Ñ\81ий панель хьахьокха хувцам беч хана",
        "tog-editondblclick": "Нисъе оагӀонаш шозза IотӀатоӀаеча (JavaScript)",
        "tog-editsectiononrightclick": "Нийсде дакъа шозза дахка аьтта тоIаер тӀатоӀайича заголовка тIа (JavaScript)",
-       "tog-watchcreations": "Зем бара списка т|атоха аз хьаяь оаг|онаши чуяьккха файлаши",
-       "tog-watchdefault": "Зем бара списка т|атоха аз хийца оаг|онаши файлай йоазонца сурташ оттадари",
-       "tog-watchmoves": "Зем бара списка т|атоха аз цIи хийца оаг|онаши файлаши",
-       "tog-watchdeletion": "Зем бара списка т|атоха аз дIаяьккха оаг|онаши файлаши",
-       "tog-minordefault": "Ð\9cаÑ\81Ñ\81аза Ð·Iамига Ð´Ð°Ñ\80аш санна белгалде хувцамаш.",
+       "tog-watchcreations": "Зем бара списка тIатоха аз хьаяь оагIонаши чуяьккха файлаши",
+       "tog-watchdefault": "Зем бара списка тIатоха аз хийца оагIонаши файлай йоазонца сурташ оттадари",
+       "tog-watchmoves": "Зем бара списка тIатоха аз цIи хийца оагIонаши файлаши",
+       "tog-watchdeletion": "Зем бара списка тIатоха аз дIаяьккха оагIонаши файлаши",
+       "tog-minordefault": "Ð\9cаÑ\81Ñ\81аза Ð·Iамига Ð´Ð¾Ð»аш санна белгалде хувцамаш.",
        "tog-previewontop": "Хьалххе бӀаргтохар хьагойта хувцама кора хьалхашкахь",
        "tog-previewonfirst": "Хувцама дехьавоалаш хан хьалххе бӀаргтохар хьагойта",
-       "tog-enotifwatchlistpages": "Tеркама хьат|аяздар чура оаг|онаши паьлаши хувцамаех лаьца д-хоамне т|а дайта хьа",
-       "tog-enotifusertalkpages": "Са Ð´Ñ\83вÑ\86ама Ð¾Ð°Ð³|он Ñ\82|а Ñ\85Ñ\83вÑ\86амаÑ\88 Ñ\85илÑ\87а, Ð´-Ñ\85оамнеÑ\86 Ñ\85Ñ\8cаÑ\85оам Ð±Ðµ",
-       "tog-enotifminoredits": "Ð\93еÑ\82Ñ\82аÑ\80а Ð·|амига Ñ\85Ñ\83вÑ\86амаÑ\88 Ñ\85илÑ\87а Ð°, Ð´-Ñ\85оамнеÑ\86 Ñ\85Ñ\8cаÑ\85оам Ð±Ðµ",
+       "tog-enotifwatchlistpages": "Электронни почте гIолла сога хоам бе зем бара списка чура оагIонай а файлаш хувцарах",
+       "tog-enotifusertalkpages": "ЭлекÑ\82Ñ\80онни Ð¿Ð¾Ñ\87Ñ\82е Ð³Iолла Ñ\81ога Ñ\85оам Ð±Ðµ Ñ\81а Ð´Ñ\83вÑ\86а Ð¾Ñ\82Ñ\82адаÑ\80а Ð¾Ð°Ð³IÑ\83в Ñ\85ийÑ\86аÑ\87а",
+       "tog-enotifminoredits": "Ð\9eагIонаÑ\88Ñ\82а Ð° Ñ\84айлаÑ\88Ñ\82а Ð´Ð°Ñ\8c Ñ\85Ñ\83вÑ\86амаÑ\88 Ð³ÐµÑ\82Ñ\82аÑ\80а Ð·Iамига Ð´Ð°Ð»Ðµ Ð° Ñ\85оам Ð±Ðµ Ñ\81ога",
        "tog-enotifrevealaddr": "З|ы хоамаш т|а са д-хоамни ц|ей-меттиг гойта",
        "tog-shownumberswatching": "Шоай теркама хьат|аяздар чу оаг|ув чуяьккха доакьошхоша таьрахь гойта",
        "tog-oldsig": "Дола кулгайоазув:",
        "createacct-another-username-ph": "Чуйоалае доакъашхочун цӀи",
        "yourpassword": "КъайладIоагӀа:",
        "userlogin-yourpassword": "Пароль",
+       "userlogin-yourpassword-ph": "Iочуязъе хьа пароль",
        "createacct-yourpassword-ph": "Iочуязъе пароль",
        "yourpasswordagain": "КъайладIоагӀа юха Ӏоязаде:",
        "createacct-yourpasswordagain-ph": "Кхы цхьаькхаза Iочуязъе пароль",
        "remembermypassword": "(укх $1 {{PLURAL:$1|1=ден|деношкахь}}) мара са чувалара/чуялара дагалоаца дезаш дац",
+       "userlogin-remembermypassword": "Система чу виса",
        "yourdomainname": "Шун цӀеноагӀув:",
        "login": "Чувала/яла",
        "nav-login-createaccount": "ЦӀи яьккха/Ший oагӀув ела",
        "logout": "Аравала/яла",
        "userlogout": "Аравала/яла",
        "notloggedin": "Оаш шоай цӀи хьааьннадац",
+       "userlogin-noaccount": "Доакъашхочун учета яздар дице хьа?",
+       "userlogin-joinproject": "ДIахоттале {{SITENAME}}аца",
        "nologin": "Леламе дIаяздар дац? '''$1'''.",
        "nologinlink": "Леламе дIаяздар кхолла",
        "createaccount": "Учёта яздар хьакхолла",
        "gotaccount": "Укхаза дӀаязабенна дий шо? '''$1'''.",
        "gotaccountlink": "Чувала/яла",
        "userlogin-resetlink": "Чувала/яла цӀии дIоагӀаи дийцаденнадий?",
+       "userlogin-resetpassword-link": "ТIеракхосс хьа пароль?",
+       "userlogin-helplink2": "Система чуваларах новкъостал",
        "createaccountmail": "КъайладIоагIа д-хоамнец хьадайта",
        "createaccountreason": "Бахьан:",
        "createacct-reason": "Бахьан",
        "emailconfirmlink": "Доаржален хоамни хьожадорг дIачIоагIаде",
        "loginlanguagelabel": "Мотт: $1",
        "pt-login": "Чувала/яла",
+       "pt-login-button": "Чувала/яла",
        "pt-createaccount": "Учёта яздар хьакхолла",
        "pt-userlogout": "Аравала/яла",
        "changepassword": "КъайладIоaгIа дIахувцар",
        "retypenew": "Керда къайладIоагӀа юха Ӏоязаде:",
        "resetpass-submit-loggedin": "КъайладIоагӀа дӀахувца",
        "resetpass-submit-cancel": "Юхавал/ялa",
+       "passwordreset": "Пароль тIеракхоссар",
        "passwordreset-username": "Дакъалаьцархочунна цӀи:",
        "passwordreset-email": "Д-хоамни моттиг:",
        "bold_sample": "Ах-сома текст",
        "deleteotherreason": "Кхыдола бахьан/тIатохар:",
        "deletereasonotherlist": "Кхыдола бахьан",
        "rollbacklink": "юхаяккха",
+       "rollbacklinkcount": "юхататта $1 {{PLURAL:$1|нийсдар}}",
        "protectlogpage": "ГIон тептар",
        "protectedarticle": "\"[[$1]]\" оагIув лорам деж я",
        "modifiedarticleprotection": "\"[[$1]]\" оагIувни лорама лагIа хувцаяьннай",
        "htmlform-reset": "Хувцамаш юхадаккха",
        "htmlform-selectorother-other": "Кхыдола",
        "logentry-delete-delete": "$1 {{GENDER:$2|дIаяккхай}} оагIув $3",
+       "logentry-move-move": "$1 {{GENDER:$2|цӀи хийцай}} $3 → $4",
        "logentry-newusers-create": "{{GENDER:$2|Доакъашхочо кхеллай}} учёта яздар $1",
+       "logentry-upload-upload": "$1 {{GENDER:$2|чуяьккхай}} $3",
        "rightsnone": "(а)",
        "revdelete-summary": "хувцамий лоацам",
        "searchsuggest-search": "Лахар",
index c887479..61fd9da 100644 (file)
@@ -97,7 +97,8 @@
                        "JackLantern",
                        "Mpiva",
                        "Urielejh",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Matteocng"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "trackingcategories-msg": "Categoria di monitoraggio",
        "trackingcategories-name": "Nome del messaggio",
        "trackingcategories-desc": "Criteri per l'inclusione nella categoria",
+       "restricted-displaytitle-ignored": "Pagine con titoli ignorati.",
+       "restricted-displaytitle-ignored-desc": "La pagina ha un <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> ignorato perché non è equivalente all'effettivo titolo della pagina.",
        "noindex-category-desc": "La pagina non è indicizzata dai robot perché contiene la parola magica <code><nowiki>__NOINDEX__</nowiki></code> e si trova in un namespace dove tale flag è consentito.",
        "index-category-desc": "La pagina contiene <code><nowiki>__INDEX__</nowiki></code> (e si trova in un namespace dove tale flag è consentito) e quindi è indicizzata dai robot, anche se normalmente non lo sarebbe.",
        "post-expand-template-inclusion-category-desc": "La dimensione della pagina sarà più grande di <code>$wgMaxArticleSize</code> dopo aver espanso tutti i template, e dunque alcuni non si espanderanno.",
        "rollbacklinkcount": "rollback di {{PLURAL:$1|una modifica|$1 modifiche}}",
        "rollbacklinkcount-morethan": "rollback di più di {{PLURAL:$1|una modifica|$1 modifiche}}",
        "rollbackfailed": "Rollback fallito",
+       "rollback-missingparam": "Parametri obbligatori mancanti nella richiesta.",
        "cantrollback": "Impossibile annullare le modifiche; l'utente che le ha effettuate è l'unico ad aver contribuito alla pagina.",
        "alreadyrolled": "Non è possibile annullare le modifiche apportate alla pagina [[:$1]] da parte di [[User:$2|$2]] ([[User talk:$2|discussione]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); un altro utente ha già modificato la pagina oppure ha effettuato il rollback.\n\nLa modifica più recente alla pagina è stata apportata da [[User:$3|$3]] ([[User talk:$3|discussione]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "L'oggetto della modifica era: <em>$1</em>.",
        "revertpage": "Annullate le modifiche di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]]), riportata alla versione precedente di [[User:$1|$1]]",
        "revertpage-nouser": "Annullate le modifiche di un utente nascosto, riportata alla versione precedente di {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Annullate le modifiche di $1; pagina riportata all'ultima versione di $2.",
+       "rollback-success-notify": "Annullate le modifiche di $1;\npagina riportata all'ultima revisione di $2. [$3 Mostra le modifiche]",
        "sessionfailure-title": "Sessione fallita",
        "sessionfailure": "Si è verificato un problema nella sessione che identifica l'accesso; il sistema non ha eseguito il comando impartito per precauzione. Tornare alla pagina precedente con il tasto 'Indietro' del proprio browser, ricaricare la pagina e riprovare.",
        "changecontentmodel": "Modifica il modello di contenuto di una pagina",
        "confirm-watch-top": "Aggiungi questa pagina alla tua lista degli osservati speciali?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Elimina questa pagina dalla tua lista degli osservati speciali?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Ripristinare le modifiche a questa pagina?",
        "percent": "$1&#160;%",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← pagina precedente",
index bc063df..028fb88 100644 (file)
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|トーク]]) による編集を [[User:$1|$1]] による直前の版へ差し戻しました",
        "revertpage-nouser": "非表示の利用者による編集を {{GENDER:$1|[[User:$1|$1]]}} による直前の版へ差し戻しました",
        "rollback-success": "$1による編集を差し戻しました。\n$2による直前の版へ変更されました。",
+       "rollback-success-notify": "$1による編集を差し戻しました。\n$2による直前の版へ変更されました。[$3 変更を表示]",
        "sessionfailure-title": "セッションの失敗",
        "sessionfailure": "ログインのセッションに問題が発生しました。\nセッション乗っ取りを防ぐため、操作を取り消しました。\n前のページへ戻って再度読み込んだ後に、もう一度試してください。",
        "changecontentmodel": "ページのコンテンツ・モデルの変更",
        "lockdbsuccesstext": "データベースをロックしました。<br />\nメンテナンスが完了したら、忘れずに[[Special:UnlockDB|ロックを除去]]してください。",
        "unlockdbsuccesstext": "データベースのロックを解除しました。",
        "lockfilenotwritable": "データベースのロック ファイルが書き込み禁止です。\nデータベースをロックまたはロック解除するには、ウェブ サーバーがこれに書き込める必要があります。",
+       "databaselocked": "データベースは既にロックされています。",
        "databasenotlocked": "データベースはロックされていません。",
        "lockedbyandtime": "($1 が $2 $3 から)",
        "move-page": "「$1」の移動",
        "log-action-filter-protect-modify": "保護の設定変更",
        "log-action-filter-protect-unprotect": "保護解除",
        "log-action-filter-upload-upload": "新規アップロード",
-       "log-action-filter-upload-overwrite": "再アップロード"
+       "log-action-filter-upload-overwrite": "再アップロード",
+       "authmanager-authn-autocreate-failed": "ローカルアカウントの自動作成が失敗しました: $1",
+       "authmanager-userdoesnotexist": "利用者アカウント「$1」は登録されていません。"
 }
index a81ba1c..f493da3 100644 (file)
        "rollbacklinkcount": "{{PLURAL:$1|편집}} $1회 되돌리기",
        "rollbacklinkcount-morethan": "{{PLURAL:$1|편집}} $1회 이상 되돌리기",
        "rollbackfailed": "되돌리기 실패",
+       "rollback-missingparam": "요청에 필요한 변수가 존재하지 않습니다.",
        "cantrollback": "편집을 되돌릴 수 없습니다.\n문서를 편집한 사용자가 한 명뿐입니다.",
        "alreadyrolled": "[[:$1]]에서 [[User:$2|$2]] ([[User talk:$2|토론]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])의 편집을 되돌릴 수 없습니다.\n누군가가 이미 문서를 고치거나 되돌렸습니다.\n\n마지막으로 이 문서를 편집한 사용자는 [[User:$3|$3]] ([[User talk:$3|토론]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])입니다.",
        "editcomment": "편집 요약: <em>$1</em>",
        "confirm-watch-top": "이 문서를 주시문서 목록에 추가할까요?",
        "confirm-unwatch-button": "확인",
        "confirm-unwatch-top": "이 문서를 주시문서 목록에서 뺄까요?",
+       "confirm-rollback-button": "확인",
        "quotation-marks": "“$1”",
        "imgmultipageprev": "← 이전 페이지",
        "imgmultipagenext": "다음 페이지 →",
index bb347df..b612fe1 100644 (file)
        "whatlinkshere-prev": "{{PLURAL:$1|veurige|veurige $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|volgende|volgende $1}}",
        "whatlinkshere-links": "← verwiezingen",
-       "whatlinkshere-hideredirs": "Redirects $1",
+       "whatlinkshere-hideredirs": "$1 deurverwiezingen",
        "whatlinkshere-hidetrans": "Vörlageninbinnungen $1",
        "whatlinkshere-hidelinks": "Lenken $1",
        "whatlinkshere-hideimages": "$1 bestaandsverwiezingen",
index abe72dc..a840651 100644 (file)
        "whatlinkshere-prev": "{{PLURAL:$1|vörige|vörige $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|nächste|nächste $1}}",
        "whatlinkshere-links": "← Lenken",
-       "whatlinkshere-hideredirs": "$1 deurverwiezingen",
+       "whatlinkshere-hideredirs": "$1 Redirects",
        "whatlinkshere-hidetrans": "$1 in-evoegden mallen",
        "whatlinkshere-hidelinks": "$1 verwiezingen",
        "whatlinkshere-hideimages": "$1 bestaandsverwiezingen",
index 4520927..fa9dcb9 100644 (file)
        "anoneditwarning": "<strong>Waarschuwing:</strong> u bent niet aangemeld.\nUw IP-adres wordt opgeslagen als u wijzigingen op deze pagina maakt. Wanneer u <strong>[$1 aanmeldt]</strong> of <strong>[$2 een gebruiker aanmaakt]</strong> verschijnen uw bewerkingen onder uw gebruikersnaam, naast andere voordelen.",
        "anonpreviewwarning": "''U bent niet aangemeld.''\n''Door uw bewerking op te slaan wordt uw IP-adres opgeslagen in de paginageschiedenis.''",
        "missingsummary": "'''Let op:''' u hebt geen bewerkingssamenvatting opgegeven.\nAls u nogmaals op \"{{int:savearticle}}\" klikt wordt de bewerking zonder samenvatting opgeslagen.",
-       "selfredirect": "<strong>Waarschuwing:</strong> U heeft een doorverwijzing gemaakt naar dezelfde pagina. Mogelijk heeft u de verkeerde bestemming voor de doorverwijzing gebruikt, of bewerkt u de verkeerde pagina. Door nogmaals op \"{{int:savearticle}}\" te klikken word de doorverwijzing alsnog aangemaakt.",
+       "selfredirect": "<strong>Waarschuwing:</strong> U heeft een doorverwijzing gemaakt naar deze pagina. Mogelijk heeft u de verkeerde bestemming voor de doorverwijzing gebruikt, of bewerkt u de verkeerde pagina. Door nogmaals op \"{{int:savearticle}}\" te klikken word de doorverwijzing alsnog aangemaakt.",
        "missingcommenttext": "Plaats uw reactie hieronder.",
        "missingcommentheader": "<strong>Let op:</strong> u hebt geen onderwerp/kop voor deze opmerking opgegeven.\nAls u opnieuw op \"{{int:savearticle}}\" klikt, wordt uw wijziging zonder een onderwerp/kop opgeslagen.",
        "summary-preview": "Bewerkingssamenvatting nakijken:",
        "timezone-local": "Lokale tijd",
        "duplicate-defaultsort": "'''Waarschuwing:''' de standaardsortering \"$2\" krijgt voorrang voor de sortering \"$1\".",
        "duplicate-displaytitle": "<strong>Waarschuwing:</strong>Titelweergave \"$2\" overschrijft eerdere titelweergave \"$1\".",
+       "restricted-displaytitle": "<strong>Waarschuwing:</strong> Titelweergave \"$1\" werd genegeerd omdat het niet overeenkomt met de werkelijke titel van de pagina.",
        "invalid-indicator-name": "<strong>Fout:</strong> de eigenschap <code>name</code> van de paginastatusindicators mag niet leeg zijn.",
        "version": "Versie",
        "version-extensions": "Geïnstalleerde uitbreidingen",
index 6862c00..e1c45bf 100644 (file)
        "confirm-watch-top": "Dodać tę stronę do listy obserwowanych?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Usunąć tę stronę z listy obserwowanych?",
+       "confirm-rollback-button": "OK",
        "percent": "$1%",
        "quotation-marks": "„$1”",
        "imgmultipageprev": "← poprzednia strona",
index 37569e0..f58bee7 100644 (file)
        "newarticle": "(Neuv)",
        "newarticletext": "A l'é andaje dapress a na liura a na pàgina che a esist ancor nen.\nPër creé la pàgina, ch'a ancamin-a a scrive ant lë spassi sì-sota (vëdde la [$1 pàgina d'agiut] për savèjne ëd pì).\nS'a l'é rivà sì për eror, ch'a sgnaca ël boton '''andaré''' ëd sò navigador.",
        "anontalkpagetext": "----\n<em>Costa a l'é la pàgina ëd ciaciarade për n'utent anònim che a l'é ancó pa duvertasse un cont, ò pura che a lo deuvra nen.</em>\nAlora i l'oma da dovré ël nùmer d'adrëssa IP për deje n'identificassion a chiel o chila.\nN'adrëssa IP përparèj a peul esse partagià da vàire utent.\nSe chiel a l'é n'utent anònim e a l'ha l'impression d'arsèive dij coment sensa sust, për piasì [[Special:CreateAccount|ch'a crea un cont]] o [[Special:UserLogin|ch'a rintra ant ël sistema]] për evité dë fé confusion con d'àutri utent anònim.''",
-       "noarticletext": "Al moment costa pàgina a l'é veuida.\nA peul [[Special:Search/{{PAGENAME}}|sërché cost tìtol]] andrinta a d'àutre pàgine, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché ant ij registr colegà],\no purament [{{fullurl:{{FULLPAGENAME}}|action=edit}} modìfiché sta pàgina]</span>.",
+       "noarticletext": "Al moment costa pàgina a l'é veuida.\nA peul [[Special:Search/{{PAGENAME}}|sërché cost tìtol]] andrinta a d'àutre pàgine, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché ant ij registr colegà],\no purament [{{fullurl:{{FULLPAGENAME}}|action=edit}} creé sta pàgina]</span>.",
        "noarticletext-nopermission": "Al moment a-i é gnun test ansima a costa pàgina.\nA peul [[Special:Search/{{PAGENAME}}|sërché ës tìtol ëd pàgina]] an d'àutre pàgine,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché ant j'argistr colegà]</span>, ma a l'ha pa ël përmess ëd creé costa pàgina.",
        "missing-revision": "La revision nùmer $1 dla pàgina antitolà «{{FULLPAGENAME}}» a esist pa.\n\nSòn a l'é normalment causà da l'andèje dapress a na vej liura stòrica a na pàgina ch'a l'é stàita scancelà. Ij detaj a peulo esse trovà ant ël [registr ëd jë scancelament ëd {{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}].",
        "userpage-userdoesnotexist": "Lë stranòm «<nowiki>$1</nowiki>» a l'é pa registrà. Për piasì ch'a varda se da bon a veul creé o modifiché costa pàgina.",
        "tooltip-t-recentchangeslinked": "Ùltime modìfiche dle pàgine andoa as peul andesse da costa.",
        "tooltip-feed-rss": "Fluss RSS për costa pàgina",
        "tooltip-feed-atom": "Fluss Atom për costa pàgina.",
-       "tooltip-t-contributions": "Vardé la lista dle contribussion ëd cost utent",
+       "tooltip-t-contributions": "Vardé la lista dle contribussion ëd {{GENDER:$1|cost utent}}",
        "tooltip-t-emailuser": "Mandeje un mëssagi ëd pòsta a st'utent",
        "tooltip-t-info": "Pi d'anformassio su costa pàgina",
        "tooltip-t-upload": "Carié n'archivi ëd figure ò son.",
index 34758eb..069b685 100644 (file)
        "passwordreset-emailsent-capture": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
        "passwordreset-emailerror-capture": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailsent-capture}}",
        "passwordreset-emailsent-capture2": "Used in [[Special:PasswordReset]].\n\nParameters:\n* $1 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
-       "passwordreset-emailerror-capture2": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\n* $3 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailsent-capture}}",
+       "passwordreset-emailerror-capture2": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\n* $3 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {{msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
        "passwordreset-nocaller": "Shown when a password reset was requested but the caller was not provided. This is an internal error.",
        "passwordreset-nosuchcaller": "Shown when a password reset was requested but the username of the caller could not be resolved to a user. This is an internal error.\n\nParameters:\n* $1 - username of the caller",
        "passwordreset-ignored": "Shown when password reset was unsuccessful due to configuration problems.",
        "trackingcategories-name": "Header for the message column of the table on [[Special:TrackingCategories]]. This column lists the name of the tracking category in the content language.",
        "trackingcategories-desc": "Header for the message column of the table on [[Special:TrackingCategories]]. This column lists the inclusion criteria for the category.",
        "restricted-displaytitle-ignored": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages are placed automatically if a page has an ignored display title.\n\nSee also:\n* {{msg-mw|restricted-displaytitle-ignored-desc}}\n*{{msg-mw|restricted-displaytitle}}",
-       "restricted-displaytitle-ignored-desc": "Pages with ignored display titles category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|restricted-displaytitle-ignored}}",
+       "restricted-displaytitle-ignored-desc": "Pages with ignored display titles category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|restricted-displaytitle-ignored}}\n* {{msg-mw|restricted-displaytitle}}",
        "noindex-category-desc": "No-index category-description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Noindex-category}}",
        "index-category-desc": "Index category-description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Index-category}}",
        "post-expand-template-inclusion-category-desc": "Post expand template inclusion category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Post-expand-template-inclusion-category}}",
        "emailsubject": "Field in [[Special:EmailUser]].\n\n{{Identical|Subject}}",
        "emailmessage": "Field in [[Special:EmailUser]].\n\n{{Identical|Message}}",
        "emailsend": "Button name in [[Special:EmailUser]].\n\n{{Identical|Send}}",
-       "emailccme": "Used at [[Special:Preferences]] > E-mail",
+       "emailccme": "Used at [[Special:EmailUser]]",
        "emailccsubject": "Used in [[Special:EmailUser]].\n\nSubject of the carbon-copied email for the sender sent through MediaWiki.\n\nParameters:\n* $1 - target username\n* $2 - email subject",
        "emailsent": "Title of [[Special:EmailUser]] when it says you it sent an email",
        "emailsenttext": "Confirmation page: when you send an email, [[Special:EmailUser]] says you this (Your email has been sent).\n\nParameters:\n* $1 - (Optional) the recipient's username, for local customizations",
        "rollbacklinkcount": "{{doc-actionlink}}\nText of the rollback link showing the number of edits to be rolled back. See also {{msg-mw|rollbacklink}}.\n\nParameters:\n* $1 - the number of edits that will be rolled back. If $1 is over the value of <code>$wgShowRollbackEditCount</code> (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.\n\nThe rollback link is displayed with a tooltip {{msg-mw|Tooltip-rollback}}",
        "rollbacklinkcount-morethan": "{{doc-actionlink}}\nText of the rollback link when a greater number of edits is to be rolled back. See also {{msg-mw|rollbacklink}}.\n\nWhen the number of edits rolled back is smaller than [[mw:Special:MyLanguage/Manual:$wgShowRollbackEditCount|$wgShowRollbackEditCount]], {{msg-mw|rollbacklinkcount}} is used instead.\n\nParameters:\n* $1 - number of edits",
        "rollbackfailed": "{{Identical|Rollback}}",
-       "rollback-missingparam": "Used as error message rollback is accessed without the required parameters\n\nSee also:\n* {{msg-mw|Rollbackfailed}}\n.",
+       "rollback-missingparam": "Used as error message rollback is accessed without the required parameters\n\nSee also:\n* {{msg-mw|Rollbackfailed}}",
        "cantrollback": "Used as error message when rollback fails due to there not being a valid revision to revert back to.\n\nSee also:\n* {{msg-mw|Notvisiblerev}}\n{{Identical|Revert}}\n{{Identical|Rollback}}",
        "alreadyrolled": "Appear when there's rollback and/or edit collision.\n\nRefers to:\n* {{msg-mw|Pipe-separator}}\n* {{msg-mw|Contribslink}}\nParameters:\n* $1 - the page to be rolled back\n* $2 - the editor to be rolled-back of that page\n* $3 - the editor that cause collision\n{{Identical|Rollback}}",
        "editcomment": "Only shown if there is an edit {{msg-mw|Summary}}. Parameters:\n* $1 - the edit summary",
index 117d823..61acf4b 100644 (file)
        "yourtext": "လိၵ်ႈၸဝ်ႈၵဝ်ႇ",
        "storedversion": "ၵၢၼ်ၶူၼ်ႉလူ ဢၼ်ဢဝ်ၶိုၼ်း",
        "yourdiff": "ၸိူဝ်းပႅၵ်ႇပိူင်ႈ",
+       "longpageerror": "<strong>လွင်ႈၽိတ်းပိူင်ႈ : လိၵ်ႈၸိူဝ်းဢၼ်ၸဝ်ႈၵဝ်ႇ မၵ်းမၼ်ႈသႂ်ႇပၼ်မႃးၼၼ်ႉ တၢင်းယၢဝ်းမၼ်း မီး {{PLURAL:$1|ၼိုင်ႈ kilobyte|$1 kilobytes}}, မၼ်းတိူဝ်းယၢဝ်ၢးလိူဝ်သေ  {{PLURAL:$2|ၼိုင်ႈ kilobyte|$2 kilobytes}}.</strong>\nမၼ်းတေဢမ်ႇၸၢင်ႈ သိမ်းဝႆႉပၼ်လႆႈ။",
+       "readonlywarning": "<strong>ၽၢင်ႉ : ယွင်ၶေႃႈမုၼ်းၼႆႉ ထုၵ်ႇၶတ်းဝႆႉ တွၼ်ႈတႃႇ ၵၢၼ်မူၼ်ႉ​​မေး၊ ယွၼ်ႉၼၼ်လႄႈ ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈ သိမ်းဝႆႉ ၵၢၼ်လႅၵ်ႈလၢႆႈ ၸဝ်ႈၵဝ်ႇ ယၢမ်းလဵဝ်</strong>\nၸဝ်ႈဝ်ႇ တေလူဝ်ႇ ထုတ်ႇ ၵေႃႇပီႇ သေ ပႃႉသႂ်ႇ ၽဵတ်ႉသႂ်ႇဝႆႉ တီႈၼႂ်း ၾၢႆႇလိၵ်ႈ သေ သိမ်းဝႆႉ တွၼ်ႈတႃႇၶိုၼ်းၸႂ်ႉဝၢႆးလင်။\nၵေႃႉၵုမ်းထိင်ပိူင်သၢင်ႈ ၵေႃႉဢၼ်ၶတ်းဝႆႉၼႆႉ မၼ်းပၼ်လွင်ႈတၢင်းမၼ်းဝႆႉဝႃႈ : $1",
+       "protectedpagewarning": "<strong>ၽၢင်ႉ : ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇႁႄႉၵင်ႈဝႆႉ၊ ယွၼ်ႉၼၼ်လႄႈ ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ၽူႈၵုမ်းၵၢၼ် ၶဝ်ၵူၺ်းတေၸၢင်ႈမီး သုၼ်ႇမႄးထတ်းလႆႈ။</strong>\nသဵၼ်ႈမၢႆၵမ်းလိုၼ်းၸိူဝ်းၼႆႉ ပၼ်ဝႆႉၽၢႆႇတႂ်ႈၼႆႉ တွၼ်ႈတႃႇႁႂ်ႈပဵၼ် ၵၢၼ်ဢိင် :",
+       "semiprotectedpagewarning": "<strong>မၢႆတွင်း:</strong> ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇႁႄႉၵင်ႈဝႆႉ၊ ယွၼ်ႉၼၼ်လႄႈ ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်တၢင်ႇမၢႆၽၢင်ဝႆႉၼၼ်ႉၵူၺ်း တေၸၢင်ႈ မႄးထတ်းလႆႈ။ \nသဵၼ်ႈမၢႆၵမ်းလိုၼ်းၸိူဝ်းၼႆႉ ပၼ်ဝႆႉၽၢႆႇတႂ်ႈၼႆႉ တွၼ်ႈတႃႇႁႂ်ႈပဵၼ် ၵၢၼ်ဢိင် :",
+       "cascadeprotectedwarning": "<strong>ၽၢင်ႉ :</strong> ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇႁႄႉၵင်ႈဝႆႉလႄႈ ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ၽူႈၵုမ်းၵၢၼ်ၶဝ်ၵူၺ်း တေမီးသုၼ်ႇ မႄးထတ်းလႆႈ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ မၼ်းၶဝ်ႈပႃးဝႆႉ ၼႂ်းၵိင်ႇၽႄ ၸိူဝ်းပဵၼ် ဢၼ်ထုၵ်ႇႁႄႉၵင်ႈဝႆႉ {{PLURAL:$1|page|pages}}:",
+       "titleprotectedwarning": "<strong>ၽၢင်ႉ : ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇႁႄႉၵင်ႈဝႆႉ ယွၼ်ႉၼၼ် [[Special:ListGroupRights|specific rights]] ၸိူဝ်းၼႆႉ ထုၵ်ႇၵေႃႇသၢင်ႈဝႆႉ။</strong>\nသဵၼ်ႈမၢႆၵမ်းလိုၼ်းၸိူဝ်းၼႆႉ ပၼ်ဝႆႉၽၢႆႇတႂ်ႈၼႆႉ တွၼ်ႈတႃႇႁႂ်ႈပဵၼ် ၵၢၼ်ဢိင် :",
        "templatesused": "{{PLURAL:$1|Template|ပိူင်တမ်း}} ၸႂ်ႉဝႆႉတီႈၼႃႈလိၵ်ႈၼႆႉ:",
+       "templatesusedpreview": "{{PLURAL:$1|ပိူင်တမ်း|ပိူင်တမ်း၊}} ၸႂ်ႉဝႆႉတီႈၼႂ်း ၵၢၼ်တူၺ်းလူင်ႈၼႃႈ :",
+       "templatesusedsection": "{{PLURAL:$1|ပိူင်တမ်း|ပိူင်တမ်း၊}} ၸႂ်ႉဝႆႉ တီႈၼႂ်း ၵၼ်ၼႆႉ :",
        "template-protected": "ႁႄႉၵင်ႈဝႆႉ",
        "template-semiprotected": "(ႁႄႉၵၼ်ႈဝႆႉ ၵမ်ႈၽွင်ႈ)",
        "hiddencategories": "ၼႃႈလိၵ်ႈဢၼ်ၼႆႉ မၼ်းပဵၼ် ၼႃႈလိၵ်ႈၶဝ်ႈၸုမ်း {{PLURAL:$1|1 hidden category|$1 ၵၼ်သိူင်ႇဝႆႉ}}:",
+       "sectioneditnotsupported-title": "ၵၢၼ်မႄးထတ်း တွၼ်ႈၵၼ် ဢမ်ႇလႆႈ ၵမ်ႉထႅမ်ဝႆႉပၼ်။",
+       "sectioneditnotsupported-text": "ၵၢၼ်မႄးထတ်း တွၼ်ႈၵၼ် ဢမ်ႇလႆႈ ၵမ်ႉထႅမ်ဝႆႉပၼ် တီႈၼႃႈလိၵ်ႈၼႆ့။",
        "permissionserrors": "ၵၢၼ်လူတ်းပွႆႇ ၽိတ်းပိူင်ႈ",
        "permissionserrorstext": "ၸဝ်ႈၵဝ်ႇဢမ်ႇမီးသုၼ်ႇ တႃႇႁဵတ်းဢၼ်ၼၼ်ႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ {{PLURAL:$1|လွင်ႈတၢင်း|လွင်ႈတၢင်းၸိူဝ်း}} ၼႆႉ:",
        "permissionserrorstext-withaction": "ၸဝ်ႈၵဝ်ႇဢမ်ႇမီးသုၼ်ႇ တႃႇ $2, တွၼ်ႈတႃႇ ၸိူဝ်း ဢၼ်ပဵၼ် {{PLURAL:$1|reason|လွင်ႈတၢင်း}}:",
        "contentmodelediterror": "ၸဝ်ႈၵဝ်ႇတေဢမ်ႇၸၢင်ႈ မႄးထတ်း ၵၢၼ်ၶူၼ်ႉလူဢၼ်ၼႆႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး မၼ်းၼႆႉပဵၼ်  <code>$1</code>, ဢၼ် ပႅၵ်ႇပိူင်ႈၵၼ်တၢင်း ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး ၶွင်ႈၼႃႈလိၵ်ႈ <code>$2</code> ၼႆႉ။",
        "moveddeleted-notice": "ၼႃႈလိၵ်ႈၼႆႉ မွတ်ႇပႅတ်ႈၵႂႃႇယဝ်ႉ။ လွင်ႈမွတ်ႇပႅတ်ႈလႄႈ လွင်ႈၶၢႆႉသၢႆမၢႆ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈၼႆႉ ၵမ်ႉထႅမ်ဝႆႉပၼ် ၼင်ႇပႃႈတႂ်ႈၼႆႉယူႇ။ မၼ်းပဵၼ် တွၼ်ႈတႃႇ ႁဵတ်းၽိုၼ်ဢိင်ယဝ်ႉ။",
+       "moveddeleted-notice-recent": "ယိၼ်းၶီၸွမ်ႈယူႇ၊ ၼႃႈလိၵ်ႈၼႆႉ တိုၵ်ႉႁႃထုၵ်ႇမွတ်ႇပႅတ်ႈ (ၼႂ်းၶၢဝ်းတၢင်း မိူဝ်ႈပူၼ်ႉမႃး 24 ၸူဝ်ႈမူင်း) ၼႆႉၵူၺ်း။ သဵၼ်ႈမၢႆ မွတ်ႇပႅတ်ႈ လႄႈ ၶၢႆႉဢွင်ႈတီႈ ၸိူဝ်းၼၼ်ႉ လႆႈၵမ်ႉထႅမ်ဝႆႉပၼ်ၼင်ႇၽၢႆႇတႂ်ႈ ႁႂ်ႈၸၢင်ႈပဵၼ် ၵၢၼ်ၽိုၼ်ဢိင်။",
+       "log-fulllog": "တူၺ်း သဵၼ်ႈမၢႆဢၼ်တဵမ်ထူၼ်ႈ",
+       "edit-hook-aborted": "ၵၢၼ်မႄးထတ်း ထုၵ်ႇလူတ်းပႅတ်တင်းၶေႃၵွင်ႉ။\nမၼ်းဢမ်ႇပၼ်ဝႆႉ ၶေႃႈသပ်းလႅင်းသင်။",
+       "edit-gone-missing": "ဢမ်ႇၸၢင်ႈႁဵတ်း ဢၢပ်ႉတိတ်ႉၼႃႈလိၵ်ႈ။\nမၼ်းဢၢပ်ႇ မွတ်ႇပႅတ်ႇဝႆႉယဝ်ႉ။",
        "edit-conflict": "မႄးထတ်း လွင်ႈယုင်ႈယၢင်ႈ",
+       "edit-no-change": "ၵၢၼ်မႄးထတ်းၸဝ်ႈၵဝ်ႇၼၼ်ႉ ထုၵ်ႇၶၢမ်ႈပႅတ်ႈၵႂႃႇ။ ယွၼ်ႉပိူဝ်ႈဝႃႈ တီႈလိၵ်ႈၸိူဝ်းၼႆႉ ဢမ်ႇလႆႈႁၼ် မီးလွင်ႈလႅၵ်ႈလၢႆႈသင်။",
        "postedit-confirmation-created": "ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇၵေႃႇသၢင်ႈယဝ်ႉယဝ်ႈ။",
        "postedit-confirmation-restored": "ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇဢဝ်ၶိုၼ်းယဝ်ႉယဝ်ႈ။",
        "postedit-confirmation-saved": "လွင်ႈမႄးထတ်းၸဝ်ႈၵဝ်ႇ သိမ်းပၼ်ယဝ်ႉယဝ်ႈ။",
        "userrights-reason": "လွင်ႈတၢင်း :",
        "userrights-no-interwiki": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇၶႂၢင်းပၼ် တွၼ်ႈတႃႇ မႄးထတ်း သုၼ်ႇၽူႈၸႂ်ႉတိုဝ်းၵႃႈတီႈဝီႇၶီႇ တၢင်ႇဢၼ်။",
        "userrights-nodatabase": "ယွင်ၶေႃႈမုၼ်း $1 ၼႆႉဢမ်ႇမီး ဢမ်ႇၼၼ် မၼ်းဢမ်ႇၸႂ်ႈ လူဝ်ႇၵႄႇ။",
+       "userrights-changeable-col": "ၸုမ်း ၸိူဝ်းၸဝ်ႈၵဝ်ႇ ၸၢင်ႈလႅၵ်ႈလၢႆႈ",
+       "userrights-unchangeable-col": "ၸုမ်း ၸိူဝ်းၸဝ်ႈၵဝ်ႇ ဢမ်ႇၸၢင်ႈလႅၵ်ႈလၢႆႈ",
+       "userrights-conflict": "လွင်ႈလႅၵ်ႈလၢႆႈ သုၼ်ႇၽူႈၸႂ်ႉတိုဝ်းၼၼ်ႉ မီးလွင်ႈယုင်ႈယၢင်ႈဝႆႉ။ ၶႅၼ်းတေႃႈ ၶိုၼ်းထတ်းတူၺ်းပၼ် သေ ၶိုၼ်းၼႄႉၼွၼ်းပၼ် လွင်ႈလႅၵ်ႈလၢႆႈၸဝ်ႈၵဝ်ႇလႄႈ။",
+       "userrights-removed-self": "ၸဝ်ႈၵဝ်ႇထွၼ်ပႅတ်ႇ သုၼ်ႇလႆႈတူဝ်ၸဝ်ႈၵဝ်ႇ။ ယွၼ်ႉၼၼ်လႄႈ ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈၶဝ်ႈၸႂ်ႉ ၼႃႈလိၵ်ႈၼႆႉလႆႈယဝ်ႉ။",
+       "group": "ၸုမ်း :",
+       "group-user": "ၽူႈၸႂ်ႉတိုဝ်း",
+       "group-autoconfirmed": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းၼႄႉၼွၼ်းတူဝ်ႁင်းၵူၺ်း",
+       "group-bot": "ပွတ်ႉ",
+       "group-sysop": "ၽူႈၵုမ်းၵၢၼ်ၶဝ်",
+       "group-bureaucrat": "ၸဝ်ႈၼႃႈတီႈၶဝ်",
+       "group-suppress": "ၽူႈတဵၵ်းတဵင်ၶဝ်",
+       "group-all": "(တင်းမူတ်း)",
+       "group-user-member": "{{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းၼႄႉၼွၼ်းတူဝ်ႁင်းၵူၺ်း}}",
+       "group-bot-member": "{{GENDER:$1|ပွတ်ႉ}}",
+       "group-sysop-member": "{{GENDER:$1|ၽူႈၵုမ်းၵၢၼ်}}",
+       "group-bureaucrat-member": "{{GENDER:$1|ၸဝ်ႈၼႃႈတီႈ}}",
+       "group-suppress-member": "{{GENDER:$1|ၽူႈတဵၵ်းတဵင်}}",
+       "grouppage-user": "{{ns:project}}:ၽူႈၸႂ်ႉတိုဝ်းၶဝ်",
+       "grouppage-autoconfirmed": "{{ns:project}}:ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းၼႄႉၼွၼ်းတူဝ်ႁင်းၵူၺ်း",
+       "grouppage-bot": "{{ns:project}}:ပွတ်ႉၶဝ်",
+       "grouppage-sysop": "{{ns:project}}:ၽူႈၵုမ်းၵၢၼ်ၶဝ်",
+       "grouppage-bureaucrat": "{{ns:project}}:ၸဝ်ႈၼႃႈတီႈၶဝ်",
+       "grouppage-suppress": "{{ns:project}}:တဵၵ်းတဵင်",
+       "right-read": "လူ ၼႃႈလိၵ်ႈ",
+       "right-edit": "မႄးထတ်း ၼႃႈလိၵ်ႈ",
+       "right-createtalk": "ၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ ဢုပ်ႇဢူဝ်းၵၼ်",
+       "right-createaccount": "ၵေႃႇသၢင်ႈ ဢၶွင်ႉ ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်မႂ်ႇ",
+       "right-autocreateaccount": "ဢဝ် ဢၶွင်ႉၽူႈၸႂ်ႉတိုဝ်း ၽၢႆႇၼွၵ်ႈသေ ၶဝ်ႈလွၵ်ႉဢိၼ်ႇႁင်း​တူဝ်",
+       "right-minoredit": "မၢႆၵၢၼ်မႄးထတ်း ၼင်ႇ ၵၢၼ်ၼွႆႉ",
+       "right-move": "ၶၢႆႉ ၼႃႈလိၵ်ႈ",
+       "right-move-subpages": "ၶၢႆ့ၼႃႈလိၵ်ႈ ဢိၵ်ႇ ၼႃႈလိၵ်ႈၽႄၶဝ်",
+       "right-move-rootuserpages": "ၶၢႆ့ၼႃႈလိၵ်ႉ ၽူႈၸႂ်ႉတိုဝ်း ငဝ်ႈႁၢၵ်ႈ",
+       "right-move-categorypages": "ၶၢႆ့ၼႃႈလိၵ်ႈ တွၼ်ႈၵၼ်",
+       "right-movefile": "ၶၢႆ့ၾၢႆႇ",
+       "right-suppressredirect": "ၽွင်းတိုၵ်ႉၶၢႆ့ၼႃႈလိၵ်ႈယူႇၼၼ်ႉ ​တေဢမ်ႇသၢင်ႈ တူဝ်ပိၼ်ႇၸီႉ ၵႃႈတီႈ ၼႃႈလိၵ်ႈ ငဝ်ႈငႃႇ",
+       "right-upload": "လူတ်ႇၶိုၼ်ႈ ၾၢႆႇ",
+       "right-reupload": "သႂ်ႇတဵင်ၵႂႃႇ ၼိူဝ် ၾၢႆႇဢၼ်မီးဝႆႉၼၼ်ႉ",
+       "right-reupload-own": "ဢဝ် ဢၼ်သေၵေႃႉၵေႃႉ လူတ်ႇၶိုၼ်ႈမႃးၼၼ်ႉ သႂ်ႇတဵင်ၵႂႃႇၼိူဝ်ၾၢႆႇ ဢၼ်မီးဝႆ့",
+       "right-upload_by_url": "လုၵ်ႉတီႈ URL သေ လူတ်ႇၶိုၼ်ႈ ၾၢႆႇ",
+       "right-purge": "ၽဵဝ်ႈလၢင်ႈ ၶေႃႈမုၼ်းသၢႆႉ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈၼႆႉ ဢမ်ႇတၢပ်ႇလူဝ်ႇ ၶေႃႈၼႄႉၼွၼ်း။",
        "right-writeapi": "ၸႂ်ႉတိုဝ်း လွင်ႈတႅမ်ႈ API",
+       "right-delete": "မွတ်ႇပႅတ်ႈ ၼႃႈလိၵ်ႈ",
+       "right-bigdelete": "မွတ်ႇပႅတ်ႈၼႃႈ ဢၼ်ၸိူၵ်းမီးဝႆႉ ပိုၼ်းယႂ်ႇၵႂၢင်ႈ",
+       "right-deletelogentry": "မွတ်ႇပႅတ်ႈ လႄႈ ဢမ်ႇမွတ်ႇပႅတ်ႈ သဵၼ်ႈမၢႆသႂ်ႇသေ မၵ်းမၼ်ႈဝႆႉ",
+       "right-deleterevision": "မွတ်ႇပႅတ်ႈ လႄႈ ဢမ်ႇမွတ်ႇပႅတ်ႈ ပိူဝ်းသျိၼ်းၼႃႈလိၵ်ႈ ၸိူဝ်းမၵ်းမၼ်ႈဝႆႉ",
+       "right-deletedhistory": "တူၺ်း ပိုၼ်းၸိူဝ်းသႂ်ႇဝႆႉ ဢၼ်လႆႈမွတ်ႇပႅတ်ႈၵႂႃႇ၊ ဢမ်ႇတၢပ်ႈလူဝ်ႇ လိၵ်ႈဢၼ်ၵွင်ႉၵၢႆႇ ၶဝ်ဝႆႉ။",
+       "right-deletedtext": "တူၺ်း လိၵ်ႈၸိူဝ်းမွတ်ႇပႅတ်ႈဝႆႉ​လႄႈ လႅၵ်ႈလၢႆႈပၼ် ၼႂ်းၵႄႈ ပိူဝ်းသျိၼ်း ၸိူဝ်းမွတ်ႇပႅတ်ႈဝႆႉ။",
+       "right-browsearchive": "ၶူၼ်ႉႁႃ ၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇပႅတ်ႈၵႂႃႇ",
+       "right-undelete": "ဢဝ်ၶိုၼ်း ၼႃႈလိၵ်ႈ",
+       "right-suppressrevision": "တူၺ်း၊ သိူင်ႇလပ်ႉ လႄႈ ၼႄၶိုၼ်း ၶေႃႈၶူၼ်ႉလူ ၼႃႈလိၵ်ႈၸိူဝ်းမၵ်းမၼ်ႈဝႆႉ ၵႃႈတီႈ ၽူႈၸႂ်ႉတိုဝ်း သေၵေႃႉၵေႃႉ",
+       "right-viewsuppressed": "တူၺ်း ၶေႃႈၶူၼ်ႉလူ ဢၼ်သိူင်ႇဝႆႉ ၵႃႈတီႈ ၽူႈၸႂ်ႉတိုဝ်း သေၵေႃႉၵေႃႉ",
+       "right-suppressionlog": "တူၺ်း သဵၼ်ႈမၢႆႇ သုၼ်ႇတူဝ်",
+       "right-block": "​ႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၸိူဝ်း ၵႃႈတီႈ ၵၢၼ်မႄးထတ်း",
+       "right-blockemail": "ႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်း ၵႃႈတီႈ သူင်ႇဢီးမေးလ်",
+       "right-hideuser": "ႁႄႉတတ်း ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း၊ လပ်ႉမၼ်းဝႆႉ ၵႃႈတီႈ ၵူၼ်ႈတၢင်းၼမ်",
+       "right-unblockself": "ၶိုၼ်းပိုတ်ႇႁႄႉတတ်း ပၼ် ႁင်းၸဝ်ႈၵဝ်ႇ",
+       "right-editprotected": "မႄးထတ်း ၼႃႈလိၵ်ႈၸိူဝ်း ႁႄႉၵင်ႈဝႆႉ ၼင်ႇ \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "မႄးထတ်းၼႃႈလိၵ်ႈၸိူဝ်း ႁႄႉၵင်ႈဝႆႉၼင်ႇ \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "မႄးထတ်း ၽၢင်ႁၢင်ႈတူဝ်ၶဝ်ႈပႃး ၶွင်ၼႃႈလိၵ်ႈ",
+       "right-editinterface": "မႄးထတ်း ယူင်ႉႁၢင်ႈ ၽူႈၸႂ်ႉတိုဝ်း",
+       "right-editusercssjs": "မႄးထတ်းၾၢႆႇ CSS လႄႈ JavaScript ၶွင် ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၸိူဝ်း",
+       "right-editusercss": "မႄးထတ်း ၾၢႆႇ CSS ၶွင် ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၸိူဝ်း",
+       "right-edituserjs": "မႄးထတ်း ၾၢႆႇ JavaScript ၶွင် ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၸိူဝ်း",
+       "right-editmyusercss": "မႄးထတ်း ၾၢႆႇ CSS ၶွင်ႁင်းၸဝ်ႈၵဝ်ႇ",
+       "right-editmyuserjs": "မႄးထတ်း ၾၢႆႇ JavaScript ၶွင်ႁင်းၸဝ်ႈၵဝ်ႇ",
+       "right-viewmywatchlist": "တူၺ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း ႁင်းၶွင်ၵဝ်ႇ",
+       "right-editmywatchlist": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း ႁင်းတူဝ်ၵဝ်ႇ။ မၢႆတွင်းဝႆႉဝႃႈ လွင်ႈႁဵတ်းသၢင်ႈ ၵမ်ႈၽွင်ႈၼႆႉ ႁူမ်ႈဝႃႈဢမ်ႇမီးသုၼ်ႇၵေႃႈ တိုၵ်ႉတေထႅမ်သႂ်ႇ ၼႃႈလိၵ်ႈၵႂႃႇယူႇ။",
+       "right-viewmyprivateinfo": "တူၺ်း ၶေႃႈမုၼ်း သုၼ်ႇတူဝ် ၸဝ်ႈၵဝ်ႇ (တူဝ်ယၢင်ႇ ႁဵင်းလိၵ်ႈ ဢီးမေးလ်၊ ၸိုဝ်ႈ​တေႉတေႉ)",
+       "right-editmyprivateinfo": "မႄးထတ်း ၶေႃႈမုၼ်းသုၼ်ႇတူဝ် ၸဝ်ႈၵဝ်ႇ (တူဝ်ယၢင်ႇ ႁဵင်းလိၵ်ႈ ဢီးမေးလ်၊ ၸိုဝ်ႈတေႉတေႉ)",
+       "right-editmyoptions": "မႄးထတ်း ငဝ်ႈၵုမ်းပိူင် ၶွင်တူဝ်ၵဝ်ႇ",
+       "right-import": "ဢဝ်ၼႃႈလိၵ်ႈ ၸိူဝ်းလုၵ်ႉၵႃႈတီႈ ဝီႇၶီႇတၢင်ႇၸိူဝ်း သႂ်ႇၶဝ်ႈ",
+       "right-importupload": "ဢဝ်ၼႃႈလိၵ်ႈၸိူဝ်း ၵႃႈတီႈၾၢႆႇလူတ်ႇၶိုၼ်ႈၼၼ်ႉ သႂ်ႇၶဝ်ႈ",
+       "right-unwatchedpages": "တူၺ်းသဵၼ်ႈမၢႆ ၼႃႈလိၵ်ႈတူၺ်း ဢမ်ႇပႆႇလႆႈတူၺ်းဝႆႉၼၼ်ႉ",
+       "right-mergehistory": "ဢဝ်ပိုၼ်းၶွင်ၼႃႈလိၵ်ႈ ႁူမ်ႈၵၼ်",
+       "right-userrights": "မႄးထတ်းသုၼ်ႇလႆႈ တႃႇၽူႈၸႂ်ႉတိုဝ်း တင်းသဵင်ႈ",
+       "right-userrights-interwiki": "မႄးထတ်း သုၼ်ႇလႆႈ ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်မီးဝႆႉယူႇ ၵႃႈတီႈၼိူဝ် ဝီႇၶီႇတၢင်ႇၸိူဝ်း",
+       "right-siteadmin": "ၶတ်းသေႃး လႄႈ ဢမ်ႇၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်း",
+       "right-sendemail": "သူင်ႇဢီးမေးလ်ၸူး ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၸိူဝ်း",
+       "right-passwordreset": "တူၺ်း ဢီးမေး တင်ႈၶိုၼ်း ၶေႃႈလပ်ႉ",
+       "right-managechangetags": "ၵေႃႇသၢင်ႈ လႄႈ (ဢမ်ႇ) တူင်ႉတိုၼ်ႇ  [[Special:Tags|tags]]",
+       "right-deletechangetags": "မွတ်ႇပႅတ်ႈ  [[Special:Tags|tags]] ၵႃႈတီႈ ယွင်ၶေႃႈမုၼ်း",
+       "grant-generic": "\"$1\" ထုပ်ႉႁေႃႇ သုၼ်ႇလႆႈ",
+       "grant-group-page-interaction": "ႁႂ်ႈမီးၽွၼ်းလီတင်း ၼႃႈလိၵ်ႈ",
+       "grant-group-file-interaction": "ႁႂ်ႈမီးၽွင်းလီတင်း သိုဝ်ႇၶၢဝ်ႇ",
+       "grant-group-watchlist-interaction": "ႁႂ်းမီးၽွၼ်းလီတင်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၸဝ်ႈၵဝ်ႇ",
+       "grant-group-email": "သူင်ႇ ဢီးမေးလ်",
+       "grant-group-high-volume": "ႁဵၼ်းၵၢၼ်တူင်ႉၼိုင် ဢၼ်ႁႅင်းယႂ်ႇ",
+       "grant-blockusers": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းႁႄႉတတ်း လႄႈ ဢမ်ႇႁႄႉတတ်း",
+       "grant-createaccount": "ၵေႃႇသၢင်ႈဢၶွင်ႉ",
+       "grant-createeditmovepage": "ၵေႃႇသၢင်ႈ၊ မႄးထတ်း လႄႈ ၶၢႆႉဢွင်ႈ ၼႃႈလိၵ်ႈ",
+       "grant-delete": "မွတ်ႇ ၼႃႈလိၵ်ႈ၊ ၶူၼ်ႉလူ လႄ သဵၼ်ႈမၢႆ သႂ်ႇၶဝ်ႈ",
+       "grant-editinterface": "မႄးထတ်း လွၵ်းၸိုဝ်ႈ သိုဝ်ႇၶၢဝ်ႇဝီႇၶီႇ လႄႈ ၽူႈၸႂ်ႉတိုဝ်း CSS/JavaScript",
+       "grant-editmycssjs": "မႄးထတ်း ၽူႈၸႂ်ႉတိုဝ်း CSS/JavaScript ၸဝ်ႈၵဝ်ႇ",
+       "grant-editmyoptions": "မႄးထတ်း ငဝ်ႈၵုမ်းပိူင် ၽူႈၸႂ်ႉတိုဝ်း ၶွင်ၸဝ်ႈၵဝ်ႇ",
+       "grant-editmywatchlist": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၸဝ်ႈၵဝ်ႇ",
+       "grant-editpage": "မႄးထတ်း ၼႃႈလိၵ်ႈ မီးယူႇ ယၢမ်းလဵဝ်ၼႆႉ",
+       "grant-editprotected": "မႄးထတ်း ၼႃႈလိၵ်ႈၸိူဝ်း ႁႄႉၵင်ႈဝႆႉ",
+       "grant-highvolume": "ၵၢၼ်မႄးထတ်း ဢၼ်ယႂ်ႇၵႂၢင်ႈ",
+       "grant-oversight": "လပ်ႉဝႆႉ ၽူႈၸႂ်ႉတိုဝ်း လႄႈ တဵၵ်းတဵင် ၶေႃႈၶူၼ်ႉလူ",
+       "grant-sendemail": "သူင်ႇဢီးမေးလ်ၸူး ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၸိူဝ်း",
+       "grant-uploadeditmovefile": "လူတ်ႇၶိုၼ်ႈ၊  တၢင်တီႈ လႄႈ ၶၢႆႉၾၢႆႇ",
+       "grant-uploadfile": "လူတ်ႇၶိုၼ်ႈ ၾၢႆႇဢၼ်မႂ်ႇ",
+       "grant-basic": "သုၼ်ႇပိုၼ်ႉထၢၼ်",
+       "grant-viewdeleted": "တူၺ်း ၾၢႆႇလႄႈ ၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇပႅတ်ႈယဝ်ႉ။",
+       "grant-viewmywatchlist": "တူၺ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း ႁင်းၶွင်ၵဝ်ႇ",
        "newuserlogpage": "သၢႆမၢႆလွင်ႈၵေႃႇသၢင်ႈ ၽူႈၸႂ်ႉတိုဝ်း",
+       "newuserlogpagetext": "ဢၼ်ၼႆႉပဵၼ် သဵၼ်ႈမၢႆ လွင်ႈၵေႃႇသၢင်ႈ ၽူႈၸႂ်ႉတိုဝ်း။",
+       "rightslog": "သဵၼ်ႈမၢႆ သုၼ်ႇလႆႈ ၽူႈၸႂ်ႉတိုဝ်း",
+       "rightslogtext": "ဢၼ်ၼႆႉပဵၼ် သဵၼ်ႈမၢႆ လွင်ႈလႅၵ်ႈလၢႆႈ သုၼ်ႈလႆႈ ၽူႈၸႂ်ႉတိုဝ်း",
+       "action-read": "လူၼႃႈလိၵ်ႈၼႆႉ",
        "action-edit": "မူၼ်ႉမႄး ၼႃႈလိၵ်ႈၼႆႉ",
+       "action-createpage": "ၵေႃႈသၢင်ႈ ၼႃႈလိၵ်ႈ",
+       "action-createtalk": "ၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ ဢုပ်ႇဢူဝ်းၵၼ်",
+       "action-createaccount": "ၵေႃႇသၢင်ႈ ဢၶွင်ႉၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ၼႆႉ",
+       "action-autocreateaccount": "ၵေႃႇသၢင်ႈ ဢၶွင်ႉၽူႈၸႂ်ႉတိုဝ်း ၽၢႆႇၼွၵ်ႈ ႁင်းတူဝ်",
+       "action-history": "တူၺ်း ပိုၼ်းၼႃႈလိၵ်ႈဢၼ်ၼႆႉ",
+       "action-minoredit": "မၢႆလွင်ႈမႄးထတ်း ဢၼ်ၼႆႉ ႁႂ်ႈပဵၼ် ၵၢၼ်ၼွႆႉ",
+       "action-move": "ၶၢႆႉဢွင်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
+       "action-move-subpages": "ၶၢႆႉဢွင်ႈ ၼႃႈလိၵ်ႈၼႆႉ လႄႈ ဢိၵ်ႇတင်း ၼႃႈလိၵ်ႈၽႄမၼ်း",
+       "action-move-rootuserpages": "ၶၢႆ့ၼႃႈလိၵ်ႉ ၽူႈၸႂ်ႉတိုဝ်း ငဝ်ႈႁၢၵ်ႈ",
+       "action-move-categorypages": "ၶၢႆ့ၼႃႈလိၵ်ႈ တွၼ်ႈၵၼ်",
+       "action-movefile": "ၶၢႆႉဢွင်ႈ ၾၢႆႇဢၼ်ၼႆႉ",
+       "action-upload": "လူတ်ႇၶိုၼ်ႈ ၾၢႆႇဢၼ်ၼႆႉ",
+       "action-reupload": "သႂ်ႇတဵင်ၵႂႃႇ ၼိူဝ် ၾၢႆႇဢၼ်မီးဝႆႉၼၼ်ႉ",
+       "action-reupload-shared": "ဢဝ်ၾၢႆႇၼႆႉ သႂ်ႇတဵင်ၵႂႃႇ ၵႃႈတီႈၼိူဝ် ယွင်ဢၼ်ၽႄႈၸႂ်ႉဝႆႉၼၼ်ႉ",
+       "action-upload_by_url": "လုၵ်ႉၵႃႈတီႈ URL သေ လူတ်ႇၶိုၼ်ႈ ၾၢႆႇဢၼ်ၼႆႉ",
+       "action-writeapi": "ၸႂ်ႉတိုဝ်း လွင်ႈတႅမ်ႈ API",
+       "action-delete": "မွတ်ႇပႅတ်ႈၼႃႈလိၵ်ႈၼႆႉ",
+       "action-deleterevision": "မွတ်ႇပႅတ်ႈ ၶေႃႈၶူၼ်ႉလူဢၼ်ၼႆႉ",
+       "action-deletedhistory": "တူၺ်း ပိုၼ်းၸိူဝ်းမွတ်ႇပႅတ်ႈ ၶွင်ၼႃႈလိၵ်ႈၼႆႉ",
+       "action-browsearchive": "ၶူၼ်ႉႁႃ ၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇပႅတ်ႈၵႂႃႇ",
+       "action-undelete": "ဢဝ်ၶိုၼ်း ၼႃႈလိၵ်ႈၼႆ့",
+       "action-suppressrevision": "တူၺ်းထတ်းၶိုၼ်း လႄႈ ၶိုၼ်းဢဝ် ၶေႃႈၶူၼ်ႉႁႃဢၼ်လပ်ႉသိူင်ႇဝႆႉ",
+       "action-suppressionlog": "တူၺ်း သဵၼ်ႈမၢႆ သုၼ်ႇတူဝ်",
+       "action-block": "​ႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၸိူဝ်း ၵႃႈတီႈ ၵၢၼ်မႄးထတ်း",
+       "action-protect": "လႅၵ်ႈလၢႆႈၸၼ်ႉထၢၼ်ႈ ၵၢၼ်ႁႄႉၵင်ႈ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈၼႆႉ",
+       "action-import": "ဢဝ်ၼႃႈလိၵ်ႈ ၸိူဝ်းလုၵ်ႉၵႃႈတီႈ ဝီႇၶီႇတၢင်ႇၸိူဝ်း သႂ်ႇၶဝ်ႈ",
+       "action-importupload": "ဢဝ်ၼႃႈလိၵ်ႈၸိူဝ်း ၵႃႈတီႈၾၢႆႇလူတ်ႇၶိုၼ်ႈၼၼ်ႉ သႂ်ႇၶဝ်ႈ",
+       "action-unwatchedpages": "တူၺ်းသဵၼ်ႈမၢႆ ၼႃႈလိၵ်ႈတူၺ်း ဢမ်ႇပႆႇလႆႈတူၺ်းဝႆႉၼၼ်ႉ",
+       "action-mergehistory": "ဢဝ်ပိုၼ်းၶွင်ၼႃႈလိၵ်ႈ ႁူမ်ႈၵၼ်",
+       "action-userrights": "မႄးထတ်းသုၼ်ႇလႆႈ တႃႇၽူႈၸႂ်ႉတိုဝ်း တင်းသဵင်ႈ",
+       "action-userrights-interwiki": "မႄးထတ်း သုၼ်ႇလႆႈ ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်မီးဝႆႉယူႇ ၵႃႈတီႈၼိူဝ် ဝီႇၶီႇတၢင်ႇၸိူဝ်း",
+       "action-siteadmin": "ၶတ်းသေႃး လႄႈ ဢမ်ႇၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်း",
+       "action-sendemail": "သူင်ႇ ဢီးမေးလ်",
+       "action-editmywatchlist": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၸဝ်ႈၵဝ်ႇ",
+       "action-viewmywatchlist": "တူၺ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း ႁင်းၶွင်ၵဝ်ႇ",
+       "action-viewmyprivateinfo": "တူၺ်း လွၼ်ႉၶၢဝ်ႇသုၼ်ႇတူဝ် ၸဝ်ႈၵဝ်ႇ",
+       "action-editmyprivateinfo": "မႄးထတ်း လွၼ်ႉၶၢဝ်ႇသုၼ်ႇတူဝ် ၸဝ်ႈၵဝ်ႇ",
+       "action-editcontentmodel": "မႄးထတ်း ၽၢင်ႁၢင်ႈတူဝ်ၶဝ်ႈပႃး ၶွင်ၼႃႈလိၵ်ႈ",
+       "action-managechangetags": "ၵေႃႇသၢင်ႈ လႄႈ (ဢမ်ႇ)တူင်ႉတိုၼ်ႇ တူဝ်တိင်",
+       "action-applychangetags": "တိင်ၸပ်းၸွမ်းၼင်ႇ လွင်ႈလႅၵ်ႈလၢႆႈၸဝ်ႈၵဝ်ႇ",
+       "action-deletechangetags": "မွတ်ႇပႅတ်ႈ တိင်ႇၸိူဝ်းမီးယူႇ ၵႃႈတီႈ ယွင်ၶေႃႈမုၼ်း",
+       "nchanges": "$1 {{PLURAL:$1|လႅၵ်ႈလၢႆႈ|ၸိူဝ်းလႅၵ်ႈလၢႆႈ}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ၸဵမ်မိူဝ်ႈ ၵႂႃႇဢႅတ်ႇပွၵ်ႈၵမ်းလိုၼ်း}}",
        "enhancedrc-history": "ပိုၼ်း",
        "recentchanges": "မီးလွင်ႈလႅၵ်ႈလၢႆႈပႆႇႁိုင်",
        "recentchanges-legend": "ၵၼ်လိူၵ်ႈသၢင်ႈ လွင်ႈလႅၵ်ႈလၢႆႈဢၼ်ပူၼ်ႉမႃး",
        "recentchanges-summary": "ၸွမ်းတူၺ်းႁွႆး ဢၼ်ပဵၼ်ၵၢၼ် တိုၵ်ႉႁႃလႅၵ်ႈလၢႆႈၵႂႃႇ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈ ဝီႇၶီႇၼႆႉ။",
+       "recentchanges-feed-description": "ၸွမ်းတူၺ်းႁွႆး ဢၼ်ပဵၼ်ၵၢၼ် တိုၵ်ႉႁႃလႅၵ်ႈလၢႆႈၵႂႃႇ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈ ဝီႇၶီႇၼႆႉ။",
        "recentchanges-label-newpage": "လွင်ႈမႄးထတ်းဢၼ်ၼႆႉ ၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈဢၼ်မႂ်ႇယဝ်ႉ",
        "recentchanges-label-minor": "ပဵၼ်လွင်ႈမူၼ်ႉမႄးဢိတ်းဢီႈ",
        "recentchanges-label-bot": "လွင်ႈမႄးထတ်းဢၼ်ၼႆႉ ပမၼ်းပဵၼ် bot ၵေႃႉႁဵတ်းၵႂႃႇ",
        "recentchanges-label-plusminus": "သႅၼ်းၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇလႅၵ်ႈလၢႆႈ ၸွမ်းၼင်ႇ မၢႆ bytes ဢၼ်ၼႆႉ",
        "recentchanges-legend-heading": "<strong>ဢပုမ်ႇ:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (တူၺ်းပႃးထႅင်ႈ [[Special:NewPages|သဵၼ်ႈမၢႆ ၼႃႈလိၵ်ႈဢၼ်မႂ်ႇ]])",
+       "recentchanges-submit": "ၼႄ",
        "rclistfrom": "ၼႄ လွင်ႈ​လႅၵ်ႈလၢႆႈဢၼ်မႂ်ႇ တႄႇတီႈ $2, $3",
        "rcshowhideminor": "$1 လွင်ႈမူၼ်ႉမႄး ဢိတ်းဢီႈ",
        "rcshowhideminor-show": "ၼႄ",
        "rcshowhidebots-show": "ၼႄ",
        "rcshowhidebots-hide": "သိူင်ႇ",
        "rcshowhideliu": "$1 ၽူႈၸႂ်ႉ ဢၼ်တၢင်ႇမၢႆၽၢင်ဝႆႉ",
+       "rcshowhideliu-show": "ၼႄ",
        "rcshowhideliu-hide": "သိူင်ႇ",
        "rcshowhideanons": "$1 ၽူႈၸႂ်ႉတိုဝ်းဢမ်ႇသႂ်ႇၸိုဝ်ႈ",
        "rcshowhideanons-show": "ၼႄ",
        "rcshowhideanons-hide": "သိူင်ႇ",
+       "rcshowhidepatr-show": "ၼႄ",
+       "rcshowhidepatr-hide": "သိူင်ႇ",
        "rcshowhidemine": "$1 ဢၼ်ၵဝ်ၶႃႈ မူၼ်ႉမႄး",
        "rcshowhidemine-show": "ၼႄ",
        "rcshowhidemine-hide": "သိူင်ႇ",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
+       "number_of_watching_users_pageview": "[$1 ပႂ်ႉတူၺ်း {{PLURAL:$1|ၽူႈၸႂ်ႉတိုဝ်း|ၽူႈၸႂ်ႉတိုဝ်းၶဝ်}}]",
        "rc_categories_any": "လိူၵ်ႈသေဢၼ်ဢၼ်",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ဝၢႆးသေလႅၵ်ႈလၢႆႈ",
+       "newsectionsummary": "/* $1 */ ၵၼ်ဢၼ်မႂ်ႇ",
+       "rc-enhanced-expand": "ၼႄပၼ် ႁူဝ်ယွႆႈမၼ်း",
+       "rc-enhanced-hide": "သိူင်ႇဝႆႉ ႁူဝ်ယွႆႈမၼ်း",
+       "rc-old-title": "ၵေႃႇသၢင်ႈဝႆႉၼင်ႇ ငဝ်ႈတိုၼ်းမၼ်း \"$1\"",
        "recentchangeslinked": "တၢင်း​လႅၵ်ႈ​လၢႆႈ ဢၼ်​ၵဵဝ်ႇ​ၵွင်ႉ",
+       "recentchangeslinked-feed": "တၢင်း​လႅၵ်ႈ​လၢႆႈ ဢၼ်​ၵဵဝ်ႇ​ၵွင်ႉ",
        "recentchangeslinked-toolbox": "တၢင်း​လႅၵ်ႈ​လၢႆႈ ဢၼ်​ၵဵဝ်ႇ​ၵွင်ႉ",
        "recentchangeslinked-title": "ၵၢၼ်လႅၵ်ႈလၢႆႈ ဢၼ်ၵပ်းၵၢႆႇလူၺ်ႈ  \"$1\"",
        "recentchangeslinked-summary": "ဢၼ်ၼႆႉၼႆႉပဵၼ် သဵၼ်ႈမၢႆ လွင်ႈလႅၵ်ႈလၢႆႈ ၸိူဝ်းဢၼ်တိုၵ်ႉႁႃ လႅၵ်ႈလၢႆႈမႃးၸူး ၼႃႈလိၵ်ႈ ဢၼ်မၵ်းမၼ်ႈဝႆႉၼႆႉ (ဢမ်ႇၼၼ် ၸူး ၽူႈၶဝ်ႈၸုမ်း ဢၼ်မီးၼႂ်း ၵၼ် ဢၼ်လႆႈမၵ်းမၼ်ႈဝႆႉ).\nၼႃးလိၵ်ႈ ၸိူဝ်းမီးၼိူဝ် [[Special:Watchlist|your watchlist]] ၼႆႉ <strong>တေလမ်ၼႃႈ</strong>ဝႆ့။",
        "recentchangeslinked-page": "ၸိုဝ်ႈၼႃႈလိၵ်ႈ",
        "recentchangeslinked-to": "ၼႄပၼ် လွၵ်ႈလႅၵ်ႈလၢႆႈ ၸူး ၼႃႈလိၵ်ႈ ဢၼ်ၵွင်ႉသိုပ်ႇ",
        "recentchanges-page-added-to-category": "[[:$1]] သႂ်ႇၼႂ်း ပၢႆးယဝ်ႉ",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] and [[Special:WhatLinksHere/$1|{{PLURAL:$2|one page|$2 pages}}]] ဢဝ်သႂ်ႇၼႂ်း ပၢႆး",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] ထႅမ်သႂ်ႇဝႆႉယဝ်ႉ တီႈၼႂ်းတွၼ်ႈၵၼ်, [[Special:WhatLinksHere/$1|ၼႃႈလိၵ်ႈၼႆႉ မၼ်းၶဝ်ႈပႃးဝႆႉ ၵႃႈတီႈၼႂ်း ၼႃႈလိၵ်ႈ တၢင်ႇၸိူဝ်း]]",
        "recentchanges-page-removed-from-category": "[[:$1]] ဢဝ်ဢွၵ်ႇတမ်ႈတီႈ ပၢႆး",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] and {{PLURAL:$2|one page|$2 pages}} ဢဝ်ဢွၵ်ႇ တမ်ႈတီႈ ၼႂ်းပၢႆး",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]]ထွၼ်ပႅတ်ႈယဝ်ႉ ၵႃႈတီႈ တွၼ်ႈၵၼ်, [[Special:WhatLinksHere/$1|ၼႃႈလိၵ်ႈၼႆႉ မၼ်းၶဝ်ႈပႃးဝႆႉ ၵႃႈတီႈၼႂ်း ၼႃႈလိၵ်ႈ တၢင်ႇၸိူဝ်း]]",
+       "autochange-username": "သိုဝ်ႇၶၢဝ်ႇဝီႇၶီႇ လႅၵ်ႈလၢႆႈ ႁင်းတူဝ်",
        "upload": "လူတ်ႇၶိုၼ်ႈၾၢႆႇ",
+       "uploadbtn": "လူတ်ႇၶိုၼ်ႈၾၢႆႇ",
+       "reuploaddesc": "ယႃႉပႅတ်ႈ ၵၢၼ်လူတ်ႇၶိုၼ်ႈသေ ၶိုၼ်းဝၢႆပွၵ်ႈၸူး ၼႃးလိၵ်ႈ လူတ်ႇၶိုၼ်ႈ",
+       "uploadnologin": "ဢမ်ႇလႆႈၶဝ်ႈလွၵ်ႉဢိၼ်ႇဝႆ့",
+       "uploadnologintext": "ၶႅၼ်းတေႃႈ  $1 တႃႇလူတ်ႇၶိုၼ်ႈ ၾၢႆႇ။",
+       "upload_directory_missing": "ၾူဝ်ႇတိူဝ်ႇ လူတ်ႇၶိုၼ်ႈဢၼ် ($1) ၼႆႉၼႆႉ မၼ်းႁၢႆဝႆႉ​လႄႈ မၼ်းတေဢမ်ႇၸၢင်ႈၵႂႃႇ ၵေႃႇသၢင်ႈလႆႈတီႈ သႃႇပိူဝ်ႇဝႅပ်ႉ။",
+       "upload_directory_read_only": "ၾူဝ်ႇတိူဝ်ႇလူတ်ႇၶိုၼ်ႈ ($1) ဢၼ်ၼႆႉၼႆႉ မၼ်းတေဢမ်ႇၸၢင်ႈတႅမ်ႈ တင်း သႃႇပိူဝ်ႇဝႅပ်ႉ",
+       "uploaderror": "ၵၢၼ်လူတ်ႇၶိုၼ်ႈ ၽိတ်းပိူင်ႈ",
+       "upload-recreate-warning": "<strong>ၽၢင်ႉ : ၾၢႆႇဢၼ်ၼင်ႇၸိုဝ်ႈၼၼ်ႉ ထုၵ်ႇမွတ်ႇပႅတ်ႈ ဢမ်ႇ ထုၵ်ႇၶၢႆႉဢွင်ႈတီႈယဝ်ႉ။</strong>\n\nသဵၼ်ႈမၢႆ မွတ်ႇပႅတ်ႈ လႄ သဵၼ်ႈမၢႆ ၶၢႆႉတီႈတွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈၼႆႉ လႆႈၵမ်ႉထႅမ်ဝႆႉပၼ် တီးၼႆႉသေ ယိူင်းဢၢၼ်းႁႂ်ႈ ငၢႆႈလူမ်ၸႂ် :",
+       "uploadlogpage": "သဵၼ်ႈမၢႆ လူတ်ႇၶိုၼ်ႈ",
+       "filename": "ၸိုဝ်ႈၾၢႆႇ",
        "filedesc": "ႁူဝ်ႁုပ်ႈ",
+       "fileuploadsummary": "ႁူဝ်ႁုပ်ႈ",
+       "filereuploadsummary": "လွင်ႈလႅၵ်ႈလၢႆႈ ၾၢႆႇ :",
+       "filestatus": "သၢႆငၢႆ သုၼ်ႇထုတ်ႇၸႂ်ႉ :",
+       "filesource": "ငဝ်ႈငႃႇ :",
+       "ignorewarning": "ၶၢမ်ႈပႅတ်ႈ ၶေႃႈၽၢင်ႉသေ ပဵၼ်ႁိုဝ်ၵေႃႈ သိမ်းၾၢႆႇဝႆႉ",
+       "ignorewarnings": "ၶၢမ်ႈပႅတ်ႈ ၶေႃႈၽၢင်ႉ ၵူႈဢၼ်ဢၼ်",
+       "minlength1": "ၸိုဝ်ႈၾၢႆႇ ၼႆႉ တီႈဢေႇသုတ်းတေလႆႈပႃး လိၵ်ႈၼိုင်ႈတူဝ်",
+       "filename-toolong": "ၸိုဝ်ႈၾၢႆႇၼႆႉ တေဢမ်ႇလႆႈယၢဝ်းပူၼ်ႉလိူဝ် 240 bytes",
+       "badfilename": "ၸိုဝ်ႈၾၢႆႇၼႆႉ ထုၵ်ႇလႅၵ်ႈလၢႆႈပဵၼ်ၸူး \"$1\" ယဝ်ႈ။",
+       "empty-file": "ၾၢႆႇဢၼ်ၸဝ်ႈၵဝ်ႇ မၵ်းမၼ်ႈယိုၼ်ႈမႃးၼၼ်ႉ မၼ်းပဝ်ႇဝႆႉ။",
+       "file-too-large": "ၾၢႆႇဢၼ်ၸဝ်ႈၵဝ်ႇ မၵ်းမၼ်ႈယိုၼ်ႈမႃးၼၼ်ႉ မႂ်းယႂ်ႇႁႅင်းၼႃႇ။",
+       "filename-tooshort": "ၸိုဝ်ႈၾၢႆႇၼႆႉ ပွတ်းႁႅင်းၼႃႇၽႅဝ်။",
+       "filetype-banned": "လိူင်ႈၾၢႆႇမဵဝ်းၼႆႉ ၼႆႉ ထုၵ်ႇဢိုတ်းတတ်းဝႆႉ။",
+       "verification-error": "ၾၢႆႇဢၼ်ၼႆႉၼႆႉ မၼ်းဢမ်ႇၶၢမ်ႈပူၼ်ႉလႆႈ ၵၢၼ်ၼႄႉၼွၼ်း။",
+       "illegal-filename": "ၸိုဝ်ႈၾၢႆႇဢၼ်ၼႆႉ မၼ်းဢမ်ႇၶႂၢင်းပၼ်ႁႂ်ႈၸႂ်ႉ။",
+       "overwrite": "လွင်ဢဝ်တဵင်သႂ်ႇ ၾၢႆႇဢၼ်မီးဝႆႉၼႆႉၵေႃႈ ဢမ်ႇလႆႈၶႂၢင်ႈပၼ်ဝႆႉ။",
+       "unknown-error": "လွင်ႈၽိတ်းပိူင်ႈ ဢၼ်ဢမ်ႇလၢမ်းလႆႈၼၼ်ႉ ဢွၵ်ႇပဵၼ်ဝႆႉ။",
+       "tmp-create-error": "ဢမ်ႇၸၢင်ႈၵေႃႇသၢင်ႈ ၾၢႆႇတိုဝ်းၸူဝ်ႈၵႅပ်ႉ။",
+       "tmp-write-error": "ၵၢၼ်တႅမ်ႈ ၾၢႆႇၸႂ်ႉတိုဝ်း ၸူဝ်ႈၵႅပ်ႉၼႆႉ ၽိတ်းပိူင်ႈဝႆႉ။",
+       "windows-nonascii-filename": "ဝီႇၶီႇၼႆႉ မၼ်းဢမ်ႇၵမ်ႉထႅမ်ဝႆႉပၼ် ၸိုဝ်ႈၾၢႆႇ ဢၼ်ၸႂ်ႉပႃးတင်း တူဝ်လိၵ်ႈၶိုၵ်ႉတွၼ်း။",
+       "uploadwarning": "ၶေႃႈၽၢင်ႉတႃႇ ၵၢၼ်လူတ်ႇၶိုၼ်ႈ",
+       "uploadwarning-text": "ၶႅၼ်းတေႃႈ မႄးပၼ်ၶိုၼ်း ၶေႃႈသပ်းလႅင်း ၾၢႆႇ ဢၼ်ၽၢႆႇတႂ်ႈၼႆႉသေ ၶိုၼ်းၶတ်းၸႂ်တူၺ်းထႅင်ႈလႄႈ။",
+       "savefile": "သိမ်း ၾၢႆႇ",
+       "uploaddisabled": "ၵၢၼ်လူတ်ႇၶိုၼ်ႈ ထုၵ်ႇဢိုတ်းဝႆႉ။",
+       "copyuploaddisabled": "ၵၢၼ်လူတ်ႇၶိုၼ်ႈၵႃႈတီႈ URL ၼႆႉ ထုၵ်ႇဢိုတ်းဝႆႉ။",
+       "uploaddisabledtext": "ၵၢၼ်လူတ်ႇၾၢႆႇၶိုၼ်ႈၼႆႉ ထုၵ်ႇဢိုတ်းဝႆႉ။",
+       "php-uploaddisabledtext": "ၵၢၼ်လူတ်ႇၾၢႆႇၶိုၼ်ႈၼႆႉ ထုၵ်ႇဢိုတ်းဝႆႉ ၵႃႈတီႈၼႂ်း PHP ။\nၶႅၼ်းတေႃႇ ၵႂႃႇၵူတ်ႇတူၺ်း ၵၢၼ်တင်ႈတႃႈ ၵၢၼ်လူတ်ႇၶိုၼ်ႈၾၢႆႇ။",
+       "upload-source": "ၾၢႆႇငဝ်ႈငႃႇ",
+       "sourcefilename": "ၸိုဝ်ႈၾၢႆႇငဝ်ႈငႃႇ :",
+       "sourceurl": "URL ငဝ်ႈငႃႈ :",
+       "destfilename": "ၸိုဝ်ႈၾၢႆႇ ယိူင်းၸူး :",
+       "upload-maxfilesize": "သႅၼ်းၾၢႆ ဢၼ်ယႂ်ႇသုတ်း : $1",
+       "upload-description": "ၶေႃႈသပ်းလႅင်း ၾၢႆႇ",
+       "upload-options": "ၵၼ်လိူၵ်ႈသၢင်ႈ ၵၢၼ်လူတ်ႇၶိုၼ်ႈ",
+       "watchthisupload": "ပႂ်ႉတူၺ်းၾၢႆႇဢၼ်ၼႆႉ",
        "upload-dialog-title": "လူတ်ႇၶိုၼ်ႈၾၢႆႇ",
        "upload-dialog-button-cancel": "ဢမ်ႇႁဵတ်း",
        "upload-dialog-button-done": "ယဝ်ႉ",
        "upload-form-label-infoform-description": "ၶေႃႈသပ်းလႅင်း",
        "upload-form-label-usage-title": "ၶေႃႈၸႂ်ႉ",
        "upload-form-label-usage-filename": "ၸိုဝ်ႈၾၢႆႇ",
+       "upload-form-label-own-work": "ဢၼ်ၼႆႉပဵၼ် ၼႃႈၵၢၼ်တူဝ်ၶႃႈ။",
+       "upload-form-label-infoform-categories": "လိူင်ႈ",
+       "upload-form-label-infoform-date": "ဝၼ်းထီႉ",
        "license-header": "ဝႆၶႂၢင်း",
+       "listfiles-delete": "မွတ်ႇပႅတ်ႈ",
        "imgfile": "ၾၢႆႇ",
        "file-anchor-link": "ၾၢႆႇ",
        "filehist": "ပိုၼ်းၾၢႆႇ",
index 22f78ae..6ffd463 100644 (file)
        "rollbacklinkcount": "rulla tillbaka $1 {{PLURAL:$1|redigering|redigeringar}}",
        "rollbacklinkcount-morethan": "rulla tillbaka mer än $1 {{PLURAL:$1|redigering|redigeringar}}",
        "rollbackfailed": "Tillbakarullning misslyckades",
+       "rollback-missingparam": "Nödvändiga parametrar i begäran saknas.",
        "cantrollback": "Det gick inte att rulla tillbaka, då sidan endast redigerats av en användare.",
        "alreadyrolled": "Det gick inte att rulla tillbaka den senaste redigeringen av [[User:$2|$2]] ([[User talk:$2|diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) på sidan [[:$1|$1]]. Någon annan har redan rullat tillbaka eller redigerat sidan.\n\nSidan ändrades senast av [[User:$3|$3]] ([[User talk:$3|diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]).",
        "editcomment": "Redigeringskommentaren var: <em>$1</em>.",
        "confirm-watch-top": "Lägg till denna sida till din bevakningslista?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Ta bort denna sida från din bevakningslista?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Återställ redigeringar på denna sida?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← föregående sida",
        "imgmultipagenext": "nästa sida →",
        "authmanager-create-from-login": "Fyll i fälten nedan för att skapa ditt konto.",
        "authmanager-create-no-primary": "De angivna inloggningsuppgifterna kunde inte användas för att skapa ett konto.",
        "authmanager-link-no-primary": "De angivna inloggningsuppgifterna kunde inte användas för att länka ett konto.",
+       "authmanager-link-not-in-progress": "Kontolänkning pågår inte eller så har sessionsdata förlorats. Var god börja om från början igen.",
        "authmanager-authplugin-setpass-failed-title": "Kunde inte ändra lösenordet",
        "authmanager-authplugin-setpass-bad-domain": "Ogiltig domän.",
        "authmanager-autocreate-noperm": "Det är inte tillåtet att skapa konton automatiskt.",
        "authprovider-confirmlink-request-label": "Konton som bör vara länkade",
        "authprovider-confirmlink-success-line": "$1: Länkning genomförd.",
        "authprovider-confirmlink-failed": "Konto kunde inte länkas helt och hållet: $1",
+       "authprovider-confirmlink-ok-help": "Fortsätt efter att felmeddelanden om länkning har visats.",
        "authprovider-resetpass-skip-label": "Hoppa över",
        "authprovider-resetpass-skip-help": "Hoppa över återställningen av lösenord.",
        "authform-nosession-login": "Autentiseringen lyckades, men din webbläsare kan inte \"komma ihåg\" att du är inloggad.\n\n$1",
        "authform-nosession-signup": "Kontot skapades, men din webbläsare kan inte \"komma ihåg\" att du är inloggad.\n\n$1",
        "specialpage-securitylevel-not-allowed-title": "Inte tillåtet",
        "specialpage-securitylevel-not-allowed": "Tyvärr, du har inte tillåtelse att använda denna sida eftersom din identitet inte kunde verifieras.",
+       "authpage-cannot-login": "Det gick inte att starta inloggning.",
+       "authpage-cannot-login-continue": "Det gick inte att fortsätta inloggning. Din session har mest sannolikt gått ut.",
+       "authpage-cannot-link": "Det gick inte att starta kontolänkning.",
+       "authpage-cannot-link-continue": "Det gick inte att starta kontolänkning. Din session har mest sannolikt gått ut.",
        "cannotauth-not-allowed-title": "Tillgång nekad",
        "cannotauth-not-allowed": "Du har inte behörighet att använda denna sida",
        "changecredentials": "Ändra inloggningsuppgifter",
index 84d200d..abae5fc 100644 (file)
        "subject-preview": "Тема буде:",
        "previewerrortext": "Сталася помилка при спробі попереднього перегляду Ваших змін.",
        "blockedtitle": "Користувача заблоковано",
-       "blockedtext": "'''Ваш обліковий запис або IP-адреса заблоковані.'''\n\nБлокування виконане адміністратором $1.\nЗазначена наступна причина: ''$2''.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Блокування виконав: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністратору, якщо ви не зареєстровані або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.",
+       "blockedtext": "<strong>Ваш обліковий запис або IP-адреса заблоковані.</strong>\n\nБлокування виконане адміністратором $1.\nПричина блокування: <em>$2</em>.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Діапазон блокування: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністратору, якщо ви не зареєстровані або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.",
        "autoblockedtext": "Ваша IP-адреса автоматично заблокована у зв'язку з тим, що вона раніше використовувалася кимось із заблокованих користувачів. Адміністратор ($1), що її заблокував, зазначив наступну причину блокування:\n\n:''$2''\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Блокування виконав: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністраторові, якщо ви не зареєстровані у проекті або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте його у своїх запитах.",
        "blockednoreason": "не вказано причини",
        "whitelistedittext": "Ви повинні $1, щоб редагувати сторінки.",
        "blocklist-timestamp": "Часова позначка",
        "blocklist-target": "Мета",
        "blocklist-expiry": "Закінчується",
-       "blocklist-by": "Ð\92иконав Ð±Ð»Ð¾ÐºÑ\83ваннÑ\8f",
+       "blocklist-by": "Ð\90дмÑ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80, Ñ\89о Ð·Ð°Ð±Ð»Ð¾ÐºÑ\83вав",
        "blocklist-params": "Параметри блокування",
        "blocklist-reason": "Причина",
        "ipblocklist-submit": "Пошук",
index 1be2d62..c2bb78d 100644 (file)
@@ -342,7 +342,8 @@ class ParserTest {
                $services->resetServiceForTesting( 'TitleFormatter' );
                $services->resetServiceForTesting( 'TitleParser' );
                $services->resetServiceForTesting( '_MediaWikiTitleCodec' );
-
+               $services->resetServiceForTesting( 'LinkRenderer' );
+               $services->resetServiceForTesting( 'LinkRendererFactory' );
        }
 
        public function setupRecorder( $options ) {
index 5fffde3..910e9ae 100644 (file)
@@ -13953,7 +13953,7 @@ Redirected image
 !! wikitext
 [[Image:Barfoo.jpg]]
 !! html/php
-<p><a href="/wiki/File:Barfoo.jpg" title="File:Barfoo.jpg">File:Barfoo.jpg</a>
+<p><a href="/wiki/File:Barfoo.jpg" title="File:Barfoo.jpg" class="mw-redirect">File:Barfoo.jpg</a>
 </p>
 !! end
 
index 0e646ea..0e13721 100644 (file)
@@ -1,6 +1,8 @@
 <?php
 use Liuggio\StatsdClient\Factory\StatsdDataFactory;
 use MediaWiki\Interwiki\InterwikiLookup;
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Services\DestructibleService;
 use MediaWiki\Services\SalvageableService;
@@ -315,6 +317,8 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        'WatchedItemStore' => [ 'WatchedItemStore', WatchedItemStore::class ],
                        'GenderCache' => [ 'GenderCache', GenderCache::class ],
                        'LinkCache' => [ 'LinkCache', LinkCache::class ],
+                       'LinkRenderer' => [ 'LinkRenderer', LinkRenderer::class ],
+                       'LinkRendererFactory' => [ 'LinkRendererFactory', LinkRendererFactory::class ],
                        '_MediaWikiTitleCodec' => [ '_MediaWikiTitleCodec', MediaWikiTitleCodec::class ],
                        'TitleFormatter' => [ 'TitleFormatter', TitleFormatter::class ],
                        'TitleParser' => [ 'TitleParser', TitleParser::class ],
index 247b6e4..8b8cbcd 100644 (file)
@@ -78,6 +78,12 @@ class TestUser {
                        $this->user->removeGroup( $group );
                }
                if ( $change ) {
+                       // Disable CAS check before saving. The User object may have been initialized from cached
+                       // information that may be out of whack with the database during testing. If tests were
+                       // perfectly isolated, this would not happen. But if it does happen, let's just ignore the
+                       // inconsistency, and just write the data we want - during testing, we are not worried
+                       // about data loss.
+                       $this->user->mTouched = '';
                        $this->user->saveSettings();
                }
        }
diff --git a/tests/phpunit/includes/libs/HtmlArmorTest.php b/tests/phpunit/includes/libs/HtmlArmorTest.php
new file mode 100644 (file)
index 0000000..5f176e0
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @covers HtmlArmor
+ */
+class HtmlArmorTest extends PHPUnit_Framework_TestCase {
+
+       public static function provideHtmlArmor() {
+               return [
+                       [
+                               'foobar',
+                               'foobar',
+                       ],
+                       [
+                               '<script>alert("evil!");</script>',
+                               '&lt;script&gt;alert(&quot;evil!&quot;);&lt;/script&gt;',
+                       ],
+                       [
+                               new HtmlArmor( '<script>alert("evil!");</script>' ),
+                               '<script>alert("evil!");</script>',
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideHtmlArmor
+        */
+       public function testHtmlArmor( $input, $expected ) {
+               $this->assertEquals(
+                       $expected,
+                       HtmlArmor::getHtml( $input )
+               );
+       }
+}
diff --git a/tests/phpunit/includes/linker/LinkRendererFactoryTest.php b/tests/phpunit/includes/linker/LinkRendererFactoryTest.php
new file mode 100644 (file)
index 0000000..bd3103b
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\Linker\LinkRendererFactory;
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @covers LinkRendererFactory
+ */
+class LinkRendererFactoryTest extends MediaWikiLangTestCase {
+
+       /**
+        * @var TitleFormatter
+        */
+       private $titleFormatter;
+
+       public function setUp() {
+               parent::setUp();
+               $this->titleFormatter = MediaWikiServices::getInstance()->getTitleFormatter();
+       }
+
+       public static function provideCreateFromLegacyOptions() {
+               return [
+                       [
+                               [ 'noclasses' ],
+                               'getNoClasses',
+                               true
+                       ],
+                       [
+                               [ 'forcearticlepath' ],
+                               'getForceArticlePath',
+                               true
+                       ],
+                       [
+                               [ 'http' ],
+                               'getExpandURLs',
+                               PROTO_HTTP
+                       ],
+                       [
+                               [ 'https' ],
+                               'getExpandURLs',
+                               PROTO_HTTPS
+                       ],
+                       [
+                               [ 'stubThreshold' => 150 ],
+                               'getStubThreshold',
+                               150
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideCreateFromLegacyOptions
+        */
+       public function testCreateFromLegacyOptions( $options, $func, $val ) {
+               $factory = new LinkRendererFactory( $this->titleFormatter );
+               $linkRenderer = $factory->createFromLegacyOptions(
+                       $options
+               );
+               $this->assertInstanceOf( LinkRenderer::class, $linkRenderer );
+               $this->assertEquals( $val, $linkRenderer->$func(), $func );
+       }
+
+       public function testCreate() {
+               $factory = new LinkRendererFactory( $this->titleFormatter );
+               $this->assertInstanceOf( LinkRenderer::class, $factory->create() );
+       }
+
+       public function testCreateForUser() {
+               $user = $this->getMock( User::class, [ 'getStubThreshold' ] );
+               $user->expects( $this->once() )
+                       ->method( 'getStubThreshold' )
+                       ->willReturn( 15 );
+               $factory = new LinkRendererFactory( $this->titleFormatter );
+               $linkRenderer = $factory->createForUser( $user );
+               $this->assertInstanceOf( LinkRenderer::class, $linkRenderer );
+               $this->assertEquals( 15, $linkRenderer->getStubThreshold() );
+       }
+}
diff --git a/tests/phpunit/includes/linker/LinkRendererTest.php b/tests/phpunit/includes/linker/LinkRendererTest.php
new file mode 100644 (file)
index 0000000..a74db20
--- /dev/null
@@ -0,0 +1,134 @@
+<?php
+
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @covers LinkRenderer
+ */
+class LinkRendererTest extends MediaWikiLangTestCase {
+
+       /**
+        * @var TitleFormatter
+        */
+       private $titleFormatter;
+
+       public function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( [
+                       'wgArticlePath' => '/wiki/$1',
+                       'wgServer' => '//example.org',
+                       'wgCanonicalServer' => 'http://example.org',
+                       'wgScriptPath' => '/w',
+                       'wgScript' => '/w/index.php',
+               ] );
+               $this->titleFormatter = MediaWikiServices::getInstance()->getTitleFormatter();
+       }
+
+       public function testMergeAttribs() {
+               $target = new TitleValue( NS_SPECIAL, 'Blankpage' );
+               $linkRenderer = new LinkRenderer( $this->titleFormatter );
+               $link = $linkRenderer->makeBrokenLink( $target, null, [
+                       // Appended to class
+                       'class' => 'foobar',
+                       // Suppresses href attribute
+                       'href' => false,
+                       // Extra attribute
+                       'bar' => 'baz'
+               ] );
+               $this->assertEquals(
+                       '<a href="/wiki/Special:BlankPage" class="new foobar" '
+                       . 'title="Special:BlankPage (page does not exist)" bar="baz">'
+                       . 'Special:BlankPage</a>',
+                       $link
+               );
+       }
+
+       public function testMakeKnownLink() {
+               $target = new TitleValue( NS_MAIN, 'Foobar' );
+               $linkRenderer = new LinkRenderer( $this->titleFormatter );
+
+               // Query added
+               $this->assertEquals(
+                       '<a href="/w/index.php?title=Foobar&amp;foo=bar" '. 'title="Foobar">Foobar</a>',
+                       $linkRenderer->makeKnownLink( $target, null, [], [ 'foo' => 'bar' ] )
+               );
+
+               // forcearticlepath
+               $linkRenderer->setForceArticlePath( true );
+               $this->assertEquals(
+                       '<a href="/wiki/Foobar?foo=bar" title="Foobar">Foobar</a>',
+                       $linkRenderer->makeKnownLink( $target, null, [], [ 'foo' => 'bar' ] )
+               );
+
+               // expand = HTTPS
+               $linkRenderer->setForceArticlePath( false );
+               $linkRenderer->setExpandURLs( PROTO_HTTPS );
+               $this->assertEquals(
+                       '<a href="https://example.org/wiki/Foobar" title="Foobar">Foobar</a>',
+                       $linkRenderer->makeKnownLink( $target )
+               );
+       }
+
+       public function testMakeBrokenLink() {
+               $target = new TitleValue( NS_MAIN, 'Foobar' );
+               $special = new TitleValue( NS_SPECIAL, 'Foobar' );
+               $linkRenderer = new LinkRenderer( $this->titleFormatter );
+
+               // action=edit&redlink=1 added
+               $this->assertEquals(
+                       '<a href="/w/index.php?title=Foobar&amp;action=edit&amp;redlink=1" '
+                       . 'class="new" title="Foobar (page does not exist)">Foobar</a>',
+                       $linkRenderer->makeBrokenLink( $target )
+               );
+
+               // action=edit&redlink=1 not added due to action query parameter
+               $this->assertEquals(
+                       '<a href="/w/index.php?title=Foobar&amp;action=foobar" class="new" '
+                       . 'title="Foobar (page does not exist)">Foobar</a>',
+                       $linkRenderer->makeBrokenLink( $target, null, [], [ 'action' => 'foobar' ] )
+               );
+
+               // action=edit&redlink=1 not added due to NS_SPECIAL
+               $this->assertEquals(
+                       '<a href="/wiki/Special:Foobar" class="new" title="Special:Foobar '
+                       . '(page does not exist)">Special:Foobar</a>',
+                       $linkRenderer->makeBrokenLink( $special )
+               );
+
+               // fragment stripped
+               $this->assertEquals(
+                       '<a href="/w/index.php?title=Foobar&amp;action=edit&amp;redlink=1" '
+                       . 'class="new" title="Foobar (page does not exist)">Foobar</a>',
+                       $linkRenderer->makeBrokenLink( $target->createFragmentTarget( 'foobar' ) )
+               );
+       }
+
+       public function testMakeLink() {
+               $linkRenderer = new LinkRenderer( $this->titleFormatter );
+               $foobar = new TitleValue( NS_SPECIAL, 'Foobar' );
+               $blankpage = new TitleValue( NS_SPECIAL, 'Blankpage' );
+               $this->assertEquals(
+                       '<a href="/wiki/Special:Foobar" class="new" title="Special:Foobar '
+                       . '(page does not exist)">foo</a>',
+                       $linkRenderer->makeLink( $foobar, 'foo' )
+               );
+
+               $this->assertEquals(
+                       '<a href="/wiki/Special:BlankPage" title="Special:BlankPage">blank</a>',
+                       $linkRenderer->makeLink( $blankpage, 'blank' )
+               );
+
+               $this->assertEquals(
+                       '<a href="/wiki/Special:Foobar" class="new" title="Special:Foobar '
+                       . '(page does not exist)">&lt;script&gt;evil()&lt;/script&gt;</a>',
+                       $linkRenderer->makeLink( $foobar, '<script>evil()</script>' )
+               );
+
+               $this->assertEquals(
+                       '<a href="/wiki/Special:Foobar" class="new" title="Special:Foobar '
+                       . '(page does not exist)"><script>evil()</script></a>',
+                       $linkRenderer->makeLink( $foobar, new HtmlArmor( '<script>evil()</script>' ) )
+               );
+       }
+}