Merge "Promote LivePreview from its experimental state"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sun, 7 Dec 2014 21:59:12 +0000 (21:59 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sun, 7 Dec 2014 21:59:12 +0000 (21:59 +0000)
1  2 
languages/i18n/en.json
languages/i18n/qqq.json
resources/Resources.php

diff --combined languages/i18n/en.json
@@@ -28,7 -28,7 +28,7 @@@
        "tog-shownumberswatching": "Show the number of watching users",
        "tog-oldsig": "Existing signature:",
        "tog-fancysig": "Treat signature as wikitext (without an automatic link)",
-       "tog-uselivepreview": "Use live preview (experimental)",
+       "tog-uselivepreview": "Use live preview",
        "tog-forceeditsummary": "Prompt me when entering a blank edit summary",
        "tog-watchlisthideown": "Hide my edits from the watchlist",
        "tog-watchlisthidebots": "Hide bot edits from the watchlist",
        "filerenameerror": "Could not rename file \"$1\" to \"$2\".",
        "filedeleteerror": "Could not delete file \"$1\".",
        "directorycreateerror": "Could not create directory \"$1\".",
 +      "directoryreadonlyerror": "Directory \"$1\" is read-only.",
 +      "directorynotreadableerror": "Directory \"$1\" is not readable.",
        "filenotfound": "Could not find file \"$1\".",
        "unexpected": "Unexpected value: \"$1\"=\"$2\".",
        "formerror": "Error: Could not submit form.",
        "right-protect": "Change protection levels and edit cascade-protected pages",
        "right-editprotected": "Edit pages protected as \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Edit pages protected as \"{{int:protect-level-autoconfirmed}}\"",
 +      "right-editcontentmodel": "Edit the content model of a page",
        "right-editinterface": "Edit the user interface",
        "right-editusercssjs": "Edit other users' CSS and JavaScript files",
        "right-editusercss": "Edit other users' CSS files",
        "action-viewmywatchlist": "view your watchlist",
        "action-viewmyprivateinfo": "view your private information",
        "action-editmyprivateinfo": "edit your private information",
 +      "action-editcontentmodel": "edit the content model of a page",
        "nchanges": "$1 {{PLURAL:$1|change|changes}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|since last visit}}",
        "enhancedrc-history": "history",
        "movepage-moved-redirect": "A redirect has been created.",
        "movepage-moved-noredirect": "The creation of a redirect has been suppressed.",
        "articleexists": "A page of that name already exists, or the name you have chosen is not valid.\nPlease choose another name.",
 -      "cantmove-titleprotected": "You cannot move a page to this location because the new title has been protected from creation",
 +      "cantmove-titleprotected": "You cannot move a page to this location because the new title has been protected from creation.",
        "movetalk": "Move associated talk page",
        "move-subpages": "Move subpages (up to $1)",
        "move-talk-subpages": "Move subpages of talk page (up to $1)",
        "delete_and_move_confirm": "Yes, delete the page",
        "delete_and_move_reason": "Deleted to make way for move from \"[[$1]]\"",
        "selfmove": "Source and destination titles are the same;\ncannot move a page over itself.",
 -      "immobile-source-namespace": "Cannot move pages in namespace \"$1\"",
 -      "immobile-target-namespace": "Cannot move pages into namespace \"$1\"",
 +      "immobile-source-namespace": "Cannot move pages in namespace \"$1\".",
 +      "immobile-target-namespace": "Cannot move pages into namespace \"$1\".",
        "immobile-target-namespace-iw": "Interwiki link is not a valid target for page move.",
        "immobile-source-page": "This page is not movable.",
        "immobile-target-page": "Cannot move to that destination title.",
        "bad-target-model": "The desired destination uses a different content model. Cannot convert from $1 to $2.",
 -      "imagenocrossnamespace": "Cannot move file to non-file namespace",
 -      "nonfile-cannot-move-to-file": "Cannot move non-file to file namespace",
 -      "imagetypemismatch": "The new file extension does not match its type",
 -      "imageinvalidfilename": "The target filename is invalid",
 +      "imagenocrossnamespace": "Cannot move file to non-file namespace.",
 +      "nonfile-cannot-move-to-file": "Cannot move non-file to file namespace.",
 +      "imagetypemismatch": "The new file extension does not match its type.",
 +      "imageinvalidfilename": "The target filename is invalid.",
        "fix-double-redirects": "Update any redirects that point to the original title",
        "move-leave-redirect": "Leave a redirect behind",
        "protectedpagemovewarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can move it.\nThe latest log entry is provided below for reference:",
        "specialpages-group-wiki": "Data and tools",
        "specialpages-group-redirects": "Redirecting special pages",
        "specialpages-group-spam": "Spam tools",
 +      "specialpages-group-developer": "Developer tools",
        "blankpage": "Blank page",
        "intentionallyblankpage": "This page is intentionally left blank.",
        "external_image_whitelist": " #Leave this line exactly as it is<pre>\n#Put regular expression fragments (just the part that goes between the //) below\n#These will be matched with the URLs of external (hotlinked) images\n#Those that match will be displayed as images, otherwise only a link to the image will be shown\n#Lines beginning with # are treated as comments\n#This is case-insensitive\n\n#Put all regex fragments above this line. Leave this line exactly as it is</pre>",
        "expand_templates_generate_xml": "Show XML parse tree",
        "expand_templates_generate_rawhtml": "Show raw HTML",
        "expand_templates_preview": "Preview",
 +      "expand_templates_preview_fail_html": "<em>Because {{SITENAME}} has raw HTML enabled and there was a loss of session data, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate preview attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
 +      "expand_templates_preview_fail_html_anon": "<em>Because {{SITENAME}} has raw HTML enabled and you are not logged in, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate preview attempt, please [[Special:UserLogin|log in]] and try again.</strong>",
        "pagelanguage": "Page language selector",
        "pagelang-name": "Page",
        "pagelang-language": "Language",
        "log-name-pagelang": "Change language log",
        "log-description-pagelang": "This is a log of changes in page languages.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|changed}} page language for $3 from $4 to $5.",
 -      "default-skin-not-found": "Whoops! The default skin for your wiki, defined in <code dir=\"ltr\">$wgDefaultSkin</code> as <code>$1</code>, is not available.\n\nYour installation seems to include the following skins. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable them and choose the default.\n\n$2\n\n; If you have just installed MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code dir=\"ltr\">skins/</code> directory of your MediaWiki installation.\n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n; If you have just upgraded MediaWiki:\n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following lines into <code>LocalSettings.php</code> to enable all currently installed skins:\n\n<pre dir=\"ltr\">$3</pre>\n\n; If you have just modified <code>LocalSettings.php</code>:\n: Double-check the skin names for typos.",
 -      "default-skin-not-found-no-skins": "Whoops! The default skin for your wiki, defined in <code>$wgDefaultSkin</code> as <code>$1</code>, is not available.\n\nYou have no installed skins.\n\n; If you have just installed or upgraded MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. MediaWiki 1.24 and newer doesn't include any skins in the main repository. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code dir=\"ltr\">skins/</code> directory of your MediaWiki installation.\n: Doing this should not interfere with your git repository if you're a MediaWiki developer. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable skins and choose the default.\n",
 +      "default-skin-not-found": "Whoops! The default skin for your wiki, defined in <code dir=\"ltr\">$wgDefaultSkin</code> as <code>$1</code>, is not available.\n\nYour installation seems to include the following skins. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable them and choose the default.\n\n$2\n\n; If you have just installed MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code dir=\"ltr\">skins/</code> directory of your MediaWiki installation.\n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n; If you have just upgraded MediaWiki:\n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following lines into <code>LocalSettings.php</code> to enable all currently installed skins:\n\n<pre dir=\"ltr\">$3</pre>\n\n; If you have just modified <code>LocalSettings.php</code>:\n: Double-check the skin names for typos.",
 +      "default-skin-not-found-no-skins": "Whoops! The default skin for your wiki, defined in <code>$wgDefaultSkin</code> as <code>$1</code>, is not available.\n\nYou have no installed skins.\n\n; If you have just installed or upgraded MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. MediaWiki 1.24 and newer doesn't include any skins in the main repository. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code dir=\"ltr\">skins/</code> directory of your MediaWiki installation.\n: Doing this should not interfere with your git repository if you're a MediaWiki developer. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable skins and choose the default.\n",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (enabled)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''disabled''')",
        "mediastatistics": "Media statistics",
diff --combined languages/i18n/qqq.json
        "tog-shownumberswatching": "Toggle option used in [[Special:Preferences]], in the section for recent changes. When this option is activated, the entries in recent changes includes the number of users who watch pages. {{Gender}}",
        "tog-oldsig": "Used in [[Special:Preferences]], tab User profile. {{Gender}}",
        "tog-fancysig": "In user preferences under the signature box.  {{Gender}}",
-       "tog-uselivepreview": "{{Gender}}\nToggle option used in [[Special:Preferences]].\n\nLive preview is an experimental feature (unavailable by default) to use edit preview without loading the page again.",
+       "tog-uselivepreview": "{{Gender}}\nToggle option used in [[Special:Preferences]].\n\nLive preview is a feature to use edit preview without loading the page again.",
        "tog-forceeditsummary": "Toggle option used in [[Special:Preferences]] to force an edit ''{{msg-mw|summary}}''. {{Gender}}",
        "tog-watchlisthideown": "[[Special:Preferences]], tab 'Watchlist'. Offers user to hide own edits from watchlist. {{Gender}}",
        "tog-watchlisthidebots": "[[Special:Preferences]], tab 'Watchlist'. Offers user to hide bot edits from watchlist. {{Gender}}",
        "filecopyerror": "Parameters:\n* $1 - source file name\n* $2 - destination file name",
        "filerenameerror": "Parameters:\n* $1 - old file name\n* $2 - new file name",
        "filedeleteerror": "Parameters:\n* $1 - file name",
 -      "directorycreateerror": "Parameters:\n* $1 - directory name",
 +      "directorycreateerror": "Error message returned when the directory cannot be created. Parameters:\n* $1 - directory name",
 +      "directoryreadonlyerror": "Error message returned when the directory is read-only. Parameters:\n* $1 - directory name",
 +      "directorynotreadableerror": "Error message returned when the directory isn't readable. Parameters:\n* $1 - directory name",
        "filenotfound": "Parameters:\n* $1 - file name",
        "unexpected": "This message indicates the value $2 is unexpected for $1. Parameters:\n* $1 - name\n* $2 - value",
        "formerror": "Generic error message show to a user when they try to submit information that could not be processed for any reason.",
        "changepassword-summary": "{{ignored}}",
        "resetpass_announce": "Used in [[Special:UserLogin]].",
        "resetpass_text": "{{optional}}",
 -      "resetpass_header": "Header on box on special page [[Special:ChangePassword]].\n\n{{Identical|Reset password}}",
 +      "resetpass_header": "Header on box on special page [[Special:ChangePassword]].\n\n{{Identical|Change password}}",
        "oldpassword": "Used on the 'User profile' tab of 'my preferences'. This is the text next to an entry box for the old password in the 'change password' section.\n{{Identical|Old password}}",
        "newpassword": "{{Identical|New password}}",
        "retypenew": "Appears on the 'User profile' tab of the 'Preferences' special page in the 'Change password' section. It appears next to the text box for entering the new password a second time.",
        "searchprofile-advanced-tooltip": "Used as tooltip for the option {{msg-mw|Searchprofile-advanced}} in [[Special:Search]].\n\nSee also:\n* {{msg-mw|Searchprofile-advanced|message}}\n* {{msg-mw|Searchprofile-advanced-tooltip|tooltip}}",
        "search-result-size": "Shown per line of a [[Special:Search|search result]]\n* $1 - the size of the page in bytes, but no need to add \"byte\" or similar as the unit is added by special function\n* $2 - the sum of all words in this page",
        "search-result-category-size": "Parameters:\n* $1 - number of members in this category. $1 is equal to $2+$3.\n* $2 - number of subcategories\n* $3 - number of files",
 -      "search-redirect": "\"Redirect\" is a noun here, not a verb.\n\nParameters:\n* $1 - a link to the redirect to the page (so, $1 is the page that the search result is redirected '''from''')",
 +      "search-redirect": "\"Redirect\" is a noun here, not a verb.\n\nParameters:\n* $1 - a link to the redirect to the page (so, $1 is the page that the search result is redirected '''from''')\n{{Identical|Redirect}}",
        "search-section": "This text will be shown on the search result listing after the page title of a result if the search algorithm thinks that section is more relevant than the rest of the page. $1 is a section title.\n{{Identical|Section}}",
        "search-category": "This text will be shown on the search result listing after the page title of a result if the search algorithm thinks that the page being in a particular category is relevant.\n\nParameters:\n* $1 - the category's name with any matching portion highlighted\n{{Identical|Category}}",
        "search-file-match": "This text will be shown on the search result listing after the page title of a result if the search engine got search results from the contents of files, rather than the pages.",
        "right-protect": "{{doc-right|protect}}",
        "right-editprotected": "{{doc-right|editprotected}}\nRefers to {{msg-mw|Protect-level-sysop}}.\n\nSee also:\n* {{msg-mw|Right-editsemiprotected}}",
        "right-editsemiprotected": "{{doc-right|editsemiprotected}}\nRefers to {{msg-mw|Protect-level-autoconfirmed}}.\n\nSee also:\n* {{msg-mw|Right-editprotected}}",
 +      "right-editcontentmodel": "{{doc-right|editcontentmodel}}",
        "right-editinterface": "{{doc-right|editinterface}}",
        "right-editusercssjs": "{{doc-right|editusercssjs}}",
        "right-editusercss": "{{doc-right|editusercss}}\nSee also:\n* {{msg-mw|Right-editmyusercss}}",
        "action-viewmywatchlist": "{{doc-action|viewmywatchlist}}\n{{Identical|View your watchlist}}",
        "action-viewmyprivateinfo": "{{doc-action|viewmyprivateinfo}}",
        "action-editmyprivateinfo": "{{doc-action|editmyprivateinfo}}",
 +      "action-editcontentmodel": "{{doc-action|editcontentmodel}}",
        "nchanges": "Appears on enhanced watchlist and recent changes when page has more than one change on given date, linking to a diff of the changes.\n\nParameters:\n* $1 - the number of changes on that day (2 or more)\nThree messages are shown side-by-side: ({{msg-mw|Nchanges}} | {{msg-mw|Enhancedrc-since-last-visit}} | {{msg-mw|Enhancedrc-history}}).",
        "enhancedrc-since-last-visit": "Appears on enhanced watchlist and recent changes when page has more than one change on given date and at least one that the user hasn't seen yet, linking to a diff of the unviewed changes.\n\nParameters:\n* $1 - the number of unviewed changes (1 or more)\nThree messages are shown side-by-side: ({{msg-mw|nchanges}} | {{msg-mw|enhancedrc-since-last-visit}} | {{msg-mw|enhancedrc-history}}).",
        "enhancedrc-history": "Appears on enhanced watchlist and recent changes when page has more than one change on given date, linking to its history.\n\nThis is the same as {{msg-mw|hist}}, but not abbreviated.\n\nThree messages are shown side-by-side: ({{msg-mw|nchanges}} | {{msg-mw|enhancedrc-since-last-visit}} | {{msg-mw|enhancedrc-history}}).\n{{Identical|History}}",
        "img-auth-nopathinfo": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Missing PATH_INFO - see english description\n{{Doc-important|This is plain text. Do not use any wiki syntax.}}",
        "img-auth-notindir": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: When the specified path is not in upload directory.",
        "img-auth-badtitle": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Bad title, $1 is the invalid title",
 -      "img-auth-nologinnWL": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Logged in and file not whitelisted. $1 is the file not in whitelist.",
 +      "img-auth-nologinnWL": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Logged in and file not whitelisted.  $1 is the file not in whitelist.",
        "img-auth-nofile": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Non existent file, $1 is the file that does not exist.",
        "img-auth-isdir": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Trying to access a directory instead of a file, $1 is the directory.",
        "img-auth-streaming": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Is now streaming file specified by $1.",
        "specialpages-group-wiki": "{{doc-special-group|like=[[Special:Version]], [[Special:Statistics]], [[Special:LockDB]], etc}}",
        "specialpages-group-redirects": "{{doc-special-group|that=redirect to another location|like=[[Special:Randompage]], [[Special:Mypage]], [[Special:Mytalk]], etc}}",
        "specialpages-group-spam": "{{doc-special-group}}",
 +      "specialpages-group-developer": "{{doc-special-group|that=are related to tools for developers}}",
        "blankpage": "{{doc-special|BlankPage|unlisted=1}}\nSee also:\n* {{msg-mw|Intentionallyblankpage|text}}",
        "intentionallyblankpage": "Text displayed in [[Special:BlankPage]].\n\nSee also:\n* {{msg-mw|Intentionallyblankpage|page title}}",
        "external_image_whitelist": "As usual please leave all the wiki markup, including the spaces, as they are. You can translate the text, including 'Leave this line exactly as it is'. The first line of this messages has one (1) leading space.\n\nSee definition of [[w:Regular_expression|regular expression]] on Wikipedia.",
        "expand_templates_generate_xml": "Used as checkbox label.",
        "expand_templates_generate_rawhtml": "Used as checkbox label.",
        "expand_templates_preview": "{{Identical|Preview}}",
 +      "expand_templates_preview_fail_html": "Used as error message in Preview section of [[Special:ExpandTemplates]] page.",
 +      "expand_templates_preview_fail_html_anon": "Used as error message in Preview section of [[Special:ExpandTemplates]] page.",
        "pagelanguage": "Title for page Special:PageLanguage",
        "pagelang-name": "Input label for page name on Special:PageLanguage\n{{Identical|Page}}",
        "pagelang-language": "Language selector label for Special:PageLanguage\n{{Identical|Language}}",
diff --combined resources/Resources.php
@@@ -44,7 -44,6 +44,7 @@@ return array
        'user.cssprefs' => array( 'class' => 'ResourceLoaderUserCSSPrefsModule' ),
  
        // Populate mediawiki.user placeholders with information about the current user
 +      'user.defaults' => array( 'class' => 'ResourceLoaderUserDefaultsModule' ),
        'user.options' => array( 'class' => 'ResourceLoaderUserOptionsModule' ),
        'user.tokens' => array( 'class' => 'ResourceLoaderUserTokensModule' ),
  
        /* jQuery */
  
        'jquery' => array(
 -              'scripts' => ( $GLOBALS['wgIncludejQueryMigrate'] ?
 -                      array(
 -                              'resources/lib/jquery/jquery.js',
 -                              'resources/lib/jquery/jquery.migrate.js'
 -                      ) :
 -                      array(
 -                              'resources/lib/jquery/jquery.js'
 -                      ) ),
 +              'scripts' => array(
 +                      'resources/lib/jquery/jquery.js',
 +              ),
                'raw' => true,
                'targets' => array( 'desktop', 'mobile' ),
        ),
                'dependencies' => array(
                        'mediawiki.hlist',
                ),
 +              'position' => 'top',
        ),
        'mediawiki.template' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.template.js',
        'mediawiki.apipretty' => array(
                'styles' => 'resources/src/mediawiki/mediawiki.apipretty.css',
                'targets' => array( 'desktop', 'mobile' ),
 +              'position' => 'top',
        ),
        'mediawiki.api' => array(
                'scripts' => 'resources/src/mediawiki.api/mediawiki.api.js',
        'mediawiki.debug' => array(
                'scripts' => array(
                        'resources/src/mediawiki/mediawiki.debug.js',
 -                      'resources/src/mediawiki/mediawiki.debug.profile.js'
                ),
                'styles' => array(
                        'resources/src/mediawiki/mediawiki.debug.less',
 -                      'resources/src/mediawiki/mediawiki.debug.profile.css'
                ),
                'dependencies' => array(
                        'jquery.footHovzer',
                'scripts' => 'resources/src/mediawiki/mediawiki.htmlform.js',
                'dependencies' => array(
                        'jquery.mwExtension',
 +                      'jquery.byteLimit',
 +              ),
 +              'messages' => array(
 +                      'htmlform-chosen-placeholder',
 +                      // @todo Load this message in content language
 +                      'colon-separator',
                ),
 -              'messages' => array( 'htmlform-chosen-placeholder' ),
        ),
        'mediawiki.icon' => array(
                'styles' => 'resources/src/mediawiki/mediawiki.icon.less',
                        'jquery.client',
                        'jquery.placeholder',
                        'jquery.suggestions',
 +                      'jquery.getAttrs',
                        'mediawiki.api',
                ),
        ),
                'dependencies' => array(
                        'jquery.form',
                        'jquery.spinner',
+                       'mediawiki.api',
                        'mediawiki.action.history.diff',
+                       'mediawiki.util',
+                       'mediawiki.jqueryMsg',
+               ),
+               'messages' => array(
+                       'otherlanguages',
+                       'tooltip-p-lang',
+                       'summary-preview',
+                       'parentheses',
                ),
        ),
 +      'mediawiki.action.edit.stash' => array(
 +              'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.stash.js',
 +              'dependencies' => array(
 +                      'jquery.getAttrs',
 +                      'mediawiki.api',
 +              ),
 +      ),
        'mediawiki.action.history' => array(
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.history.js',
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.history.css',
                'group' => 'mediawiki.action.history',
        ),
        'mediawiki.action.history.diff' => array(
 -              'styles' => 'resources/src/mediawiki.action/mediawiki.action.history.diff.css',
 +              'styles' => array(
 +                      'resources/src/mediawiki.action/mediawiki.action.history.diff.css',
 +                      'resources/src/mediawiki.action/mediawiki.action.history.diff.print.css' => array( 'media' => 'print' ),
 +              ),
                'group' => 'mediawiki.action.history',
                'targets' => array( 'desktop', 'mobile' ),
        ),
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
        ),
 +      'mediawiki.ui.radio' => array(
 +              'skinStyles' => array(
 +                      'default' => array(
 +                              'resources/src/mediawiki.ui/components/radio.less',
 +                      ),
 +              ),
 +              'position' => 'top',
 +              'targets' => array( 'desktop', 'mobile' ),
 +      ),
        // Lightweight module for anchor styles
        'mediawiki.ui.anchor' => array(
                'skinStyles' => array(