<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[38897] trunk/src/wp-includes: TinyMCE: make keyboard shortcuts more discoverable by adding them to the buttons tooltips and in the Formats drop-down.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/38897">38897</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/38897","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>azaozz</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2016-10-25 01:39:15 +0000 (Tue, 25 Oct 2016)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>TinyMCE: make keyboard shortcuts more discoverable by adding them to the buttons tooltips and in the Formats drop-down.

Props mor10, azaozz.
Fixes <a href="https://core.trac.wordpress.org/ticket/38063">#38063</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpincludesclasswpeditorphp">trunk/src/wp-includes/class-wp-editor.php</a></li>
<li><a href="#trunksrcwpincludescsseditorcss">trunk/src/wp-includes/css/editor.css</a></li>
<li><a href="#trunksrcwpincludesjstinymcepluginswordpresspluginjs">trunk/src/wp-includes/js/tinymce/plugins/wordpress/plugin.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpincludesclasswpeditorphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/class-wp-editor.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-editor.php 2016-10-25 01:12:03 UTC (rev 38896)
+++ trunk/src/wp-includes/class-wp-editor.php   2016-10-25 01:39:15 UTC (rev 38897)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -26,6 +26,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        private static $editor_buttons_css = true;
</span><span class="cx" style="display: block; padding: 0 10px">        private static $drag_drop_upload = false;
</span><span class="cx" style="display: block; padding: 0 10px">        private static $old_dfw_compat = false;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        private static $translation;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        private function __construct() {}
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -357,7 +358,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                /** This filter is documented in wp-admin/includes/media.php */
</span><span class="cx" style="display: block; padding: 0 10px">                                $no_captions = (bool) apply_filters( 'disable_captions', '' );
</span><span class="cx" style="display: block; padding: 0 10px">                                $ext_plugins = '';
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                $shortcut_labels = array();
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                foreach ( self::get_translation() as $name => $value ) {
+                                       if ( is_array( $value ) ) {
+                                               $shortcut_labels[$name] = $value[1];
+                                       }
+                               }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                                 if ( $set['teeny'] ) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -550,7 +558,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                        'wpeditimage_disable_captions' => $no_captions,
</span><span class="cx" style="display: block; padding: 0 10px">                                        'wpeditimage_html5_captions' => current_theme_supports( 'html5', 'caption' ),
</span><span class="cx" style="display: block; padding: 0 10px">                                        'plugins' => implode( ',', $plugins ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'wp_lang_attr' => get_bloginfo( 'language' )
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 'wp_lang_attr' => get_bloginfo( 'language' ),
+                                       'wp_shortcut_labels' => wp_json_encode( $shortcut_labels ),
</ins><span class="cx" style="display: block; padding: 0 10px">                                 );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                if ( ! empty( $mce_external_plugins ) ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -812,73 +821,64 @@
</span><span class="cx" style="display: block; padding: 0 10px">                ) );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        /**
-        * Translates the default TinyMCE strings and returns them as JSON encoded object ready to be loaded with tinymce.addI18n().
-        * Can be used directly (_WP_Editors::wp_mce_translation()) by passing the same locale as set in the TinyMCE init object.
-        *
-        * @static
-        * @param string $mce_locale The locale used for the editor.
-        * @param bool $json_only optional Whether to include the JavaScript calls to tinymce.addI18n() and tinymce.ScriptLoader.markDone().
-        * @return string Translation object, JSON encoded.
-        */
-       public static function wp_mce_translation( $mce_locale = '', $json_only = false ) {
-
-               $mce_translation = array(
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ private static function get_translation() {
+               if ( empty( self::$translation ) ) {
+                       self::$translation = array(
</ins><span class="cx" style="display: block; padding: 0 10px">                         // Default TinyMCE strings
</span><span class="cx" style="display: block; padding: 0 10px">                        'New document' => __( 'New document' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Formats' => _x( 'Formats', 'TinyMCE' ),
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        'Headings' => _x( 'Headings', 'TinyMCE' ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'Heading 1' => __( 'Heading 1' ),
-                       'Heading 2' => __( 'Heading 2' ),
-                       'Heading 3' => __( 'Heading 3' ),
-                       'Heading 4' => __( 'Heading 4' ),
-                       'Heading 5' => __( 'Heading 5' ),
-                       'Heading 6' => __( 'Heading 6' ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'Heading 1' => array( __( 'Heading 1' ), 'access1' ),
+                       'Heading 2' => array( __( 'Heading 2' ), 'access2' ),
+                       'Heading 3' => array( __( 'Heading 3' ), 'access3' ),
+                       'Heading 4' => array( __( 'Heading 4' ), 'access4' ),
+                       'Heading 5' => array( __( 'Heading 5' ), 'access5' ),
+                       'Heading 6' => array( __( 'Heading 6' ), 'access6' ),
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        /* translators: block tags */
</span><span class="cx" style="display: block; padding: 0 10px">                        'Blocks' => _x( 'Blocks', 'TinyMCE' ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'Paragraph' => __( 'Paragraph' ),
-                       'Blockquote' => __( 'Blockquote' ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'Paragraph' => array( __( 'Paragraph' ), 'access7' ),
+                       'Blockquote' => array( __( 'Blockquote' ), 'accessQ' ),
</ins><span class="cx" style="display: block; padding: 0 10px">                         'Div' => _x( 'Div', 'HTML tag' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Pre' => _x( 'Pre', 'HTML tag' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Preformatted' => _x( 'Preformatted', 'HTML tag' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Address' => _x( 'Address', 'HTML tag' ),
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        'Inline' => _x( 'Inline', 'HTML elements' ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'Underline' => __( 'Underline' ),
-                       'Strikethrough' => __( 'Strikethrough' ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'Underline' => array( __( 'Underline' ), 'metaU' ),
+                       'Strikethrough' => array( __( 'Strikethrough' ), 'accessD' ),
</ins><span class="cx" style="display: block; padding: 0 10px">                         'Subscript' => __( 'Subscript' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Superscript' => __( 'Superscript' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Clear formatting' => __( 'Clear formatting' ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'Bold' => __( 'Bold' ),
-                       'Italic' => __( 'Italic' ),
-                       'Code' => __( 'Code' ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'Bold' => array( __( 'Bold' ), 'metaB' ),
+                       'Italic' => array( __( 'Italic' ), 'metaI' ),
+                       'Code' => array( __( 'Code' ), 'accessX' ),
</ins><span class="cx" style="display: block; padding: 0 10px">                         'Source code' => __( 'Source code' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Font Family' => __( 'Font Family' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Font Sizes' => __( 'Font Sizes' ),
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'Align center' => __( 'Align center' ),
-                       'Align right' => __( 'Align right' ),
-                       'Align left' => __( 'Align left' ),
-                       'Justify' => __( 'Justify' ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'Align center' => array( __( 'Align center' ), 'accessC' ),
+                       'Align right' => array( __( 'Align right' ), 'accessR' ),
+                       'Align left' => array( __( 'Align left' ), 'accessL' ),
+                       'Justify' => array( __( 'Justify' ), 'accessJ' ),
</ins><span class="cx" style="display: block; padding: 0 10px">                         'Increase indent' => __( 'Increase indent' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Decrease indent' => __( 'Decrease indent' ),
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'Cut' => __( 'Cut' ),
-                       'Copy' => __( 'Copy' ),
-                       'Paste' => __( 'Paste' ),
-                       'Select all' => __( 'Select all' ),
-                       'Undo' => __( 'Undo' ),
-                       'Redo' => __( 'Redo' ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'Cut' => array( __( 'Cut' ), 'metaX' ),
+                       'Copy' => array( __( 'Copy' ), 'metaC' ),
+                       'Paste' => array( __( 'Paste' ), 'metaV' ),
+                       'Select all' => array( __( 'Select all' ), 'metaA' ),
+                       'Undo' => array( __( 'Undo' ), 'metaZ' ),
+                       'Redo' => array( __( 'Redo' ), 'metaY' ),
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        'Ok' => __( 'OK' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Cancel' => __( 'Cancel' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Close' => __( 'Close' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Visual aids' => __( 'Visual aids' ),
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'Bullet list' => __( 'Bulleted list' ),
-                       'Numbered list' => __( 'Numbered list' ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'Bullet list' => array( __( 'Bulleted list' ), 'accessU' ),
+                       'Numbered list' => array( __( 'Numbered list' ), 'accessO' ),
</ins><span class="cx" style="display: block; padding: 0 10px">                         'Square' => _x( 'Square', 'list style' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Default' => _x( 'Default', 'list style' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Circle' => _x( 'Circle', 'list style' ),
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -904,7 +904,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'Author' => __( 'Author' ),
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        // Media, image plugins
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'Insert/edit image' => __( 'Insert/edit image' ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'Insert/edit image' => array( __( 'Insert/edit image' ), 'accessM' ),
</ins><span class="cx" style="display: block; padding: 0 10px">                         'General' => __( 'General' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Advanced' => __( 'Advanced' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Source' => __( 'Source' ),
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -938,8 +938,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'Horizontal line' => __( 'Horizontal line' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Horizontal space' => __( 'Horizontal space' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Restore last draft' => __( 'Restore last draft' ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'Insert/edit link' => __( 'Insert/edit link' ),
-                       'Remove link' => __( 'Remove link' ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'Insert/edit link' => array( __( 'Insert/edit link' ), 'metaK' ),
+                       'Remove link' => array( __( 'Remove link' ), 'accessS' ),
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        'Color' => __( 'Color' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Custom color' => __( 'Custom color' ),
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1043,11 +1043,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'Format' => _x( 'Format', 'TinyMCE menu' ),
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        // WordPress strings
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'Toolbar Toggle' => __( 'Toolbar Toggle' ),
-                       'Insert Read More tag' => __( 'Insert Read More tag' ),
-                       'Insert Page Break tag' => __( 'Insert Page Break tag' ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'Toolbar Toggle' => array( __( 'Toolbar Toggle' ), 'accessZ' ),
+                       'Insert Read More tag' => array( __( 'Insert Read More tag' ), 'accessT' ),
+                       'Insert Page Break tag' => array( __( 'Insert Page Break tag' ), 'accessP' ),
</ins><span class="cx" style="display: block; padding: 0 10px">                         'Read more...' => __( 'Read more...' ), // Title on the placeholder inside the editor (no ellipsis)
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'Distraction-free writing mode' => __( 'Distraction-free writing mode' ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'Distraction-free writing mode' => array( __( 'Distraction-free writing mode' ), 'accessW' ),
</ins><span class="cx" style="display: block; padding: 0 10px">                         'No alignment' => __( 'No alignment' ), // Tooltip for the 'alignnone' button in the image toolbar
</span><span class="cx" style="display: block; padding: 0 10px">                        'Remove' => __( 'Remove' ), // Tooltip for the 'remove' button in the image toolbar
</span><span class="cx" style="display: block; padding: 0 10px">                        'Edit ' => __( 'Edit' ), // Tooltip for the 'edit' button in the image toolbar
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1056,7 +1056,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'Link options'  => __( 'Link options' ), // Tooltip for the 'link options' button in the inline link dialog
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        // Shortcuts help modal
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'Keyboard Shortcuts' => __( 'Keyboard Shortcuts' ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'Keyboard Shortcuts' => array( __( 'Keyboard Shortcuts' ), 'accessH' ),
</ins><span class="cx" style="display: block; padding: 0 10px">                         'Default shortcuts,' => __( 'Default shortcuts,' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Additional shortcuts,' => __( 'Additional shortcuts,' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'Focus shortcuts:' => __( 'Focus shortcuts:' ),
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1079,7 +1079,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                __( 'The following formatting shortcuts are replaced when pressing Enter. Press Escape or the Undo button to undo.' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'The next group of formatting shortcuts are applied as you type or when you insert them around plain text in the same paragraph. Press Escape or the Undo button to undo.' =>
</span><span class="cx" style="display: block; padding: 0 10px">                                __( 'The next group of formatting shortcuts are applied as you type or when you insert them around plain text in the same paragraph. Press Escape or the Undo button to undo.' ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 );
+               }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                /**
</span><span class="cx" style="display: block; padding: 0 10px">                 * Link plugin (not included):
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1092,10 +1093,31 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 *      Url
</span><span class="cx" style="display: block; padding: 0 10px">                 */
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                return self::$translation;
+       }
+
+       /**
+        * Translates the default TinyMCE strings and returns them as JSON encoded object ready to be loaded with tinymce.addI18n().
+        * Can be used directly (_WP_Editors::wp_mce_translation()) by passing the same locale as set in the TinyMCE init object.
+        *
+        * @static
+        * @param string $mce_locale The locale used for the editor.
+        * @param bool $json_only optional Whether to include the JavaScript calls to tinymce.addI18n() and tinymce.ScriptLoader.markDone().
+        * @return string Translation object, JSON encoded.
+        */
+       public static function wp_mce_translation( $mce_locale = '', $json_only = false ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( ! $mce_locale ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $mce_locale = self::$mce_locale;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                $mce_translation = self::get_translation();
+               
+               foreach ( $mce_translation as $name => $value ) {
+                       if ( is_array( $value ) ) {
+                               $mce_translation[$name] = $value[0];
+                       }
+               }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 /**
</span><span class="cx" style="display: block; padding: 0 10px">                 * Filters translated strings prepared for TinyMCE.
</span><span class="cx" style="display: block; padding: 0 10px">                 *
</span></span></pre></div>
<a id="trunksrcwpincludescsseditorcss"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/css/editor.css</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/css/editor.css      2016-10-25 01:12:03 UTC (rev 38896)
+++ trunk/src/wp-includes/css/editor.css        2016-10-25 01:39:15 UTC (rev 38897)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -588,6 +588,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> .mce-menu .mce-menu-item-normal.mce-active,
</span><span class="cx" style="display: block; padding: 0 10px"> .mce-menu .mce-menu-item-preview.mce-active {
</span><span class="cx" style="display: block; padding: 0 10px">        background: #0073aa; /* See color scheme. */
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        color: #fff;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .mce-menu .mce-menu-item-preview.mce-active {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -650,6 +651,15 @@
</span><span class="cx" style="display: block; padding: 0 10px">        margin-left: -2px;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+/* Keyboard shortcuts position */
+.mce-menu.mce-menu-align .mce-menu-item-normal {
+       position: relative;
+}
+
+.mce-menu.mce-menu-align .mce-menu-shortcut {
+       bottom: 0.5em;
+}
+
</ins><span class="cx" style="display: block; padding: 0 10px"> /* Buttons in modals */
</span><span class="cx" style="display: block; padding: 0 10px"> .mce-primary button,
</span><span class="cx" style="display: block; padding: 0 10px"> .mce-primary button i {
</span></span></pre></div>
<a id="trunksrcwpincludesjstinymcepluginswordpresspluginjs"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/js/tinymce/plugins/wordpress/plugin.js</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/js/tinymce/plugins/wordpress/plugin.js      2016-10-25 01:12:03 UTC (rev 38896)
+++ trunk/src/wp-includes/js/tinymce/plugins/wordpress/plugin.js        2016-10-25 01:39:15 UTC (rev 38897)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -231,48 +231,75 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        meta = tinymce.Env.mac ? __( 'Cmd + letter:' ) : __( 'Ctrl + letter:' ),
</span><span class="cx" style="display: block; padding: 0 10px">                        table1 = [],
</span><span class="cx" style="display: block; padding: 0 10px">                        table2 = [],
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        row1 = {},
+                       row2 = {},
+                       i1 = 0,
+                       i2 = 0,
+                       labels = editor.settings.wp_shortcut_labels,
</ins><span class="cx" style="display: block; padding: 0 10px">                         header, html, dialog, $wrap;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                each( [
-                       { c: 'Copy',      x: 'Cut'              },
-                       { v: 'Paste',     a: 'Select all'       },
-                       { z: 'Undo',      y: 'Redo'             },
-                       { b: 'Bold',      i: 'Italic'           },
-                       { u: 'Underline', k: 'Insert/edit link' }
-               ], function( row ) {
-                       table1.push( tr( row ) );
-               } );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( ! labels ) {
+                       return;
+               }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                each( [
-                       { 1: 'Heading 1',             2: 'Heading 2'                     },
-                       { 3: 'Heading 3',             4: 'Heading 4'                     },
-                       { 5: 'Heading 5',             6: 'Heading 6'                     },
-                       { l: 'Align left',            c: 'Align center'                  },
-                       { r: 'Align right',           j: 'Justify'                       },
-                       { d: 'Strikethrough',         q: 'Blockquote'                    },
-                       { u: 'Bullet list',           o: 'Numbered list'                 },
-                       { a: 'Insert/edit link',      s: 'Remove link'                   },
-                       { m: 'Insert/edit image',     t: 'Insert Read More tag'          },
-                       { h: 'Keyboard Shortcuts',    x: 'Code'                          },
-                       { p: 'Insert Page Break tag', w: 'Distraction-free writing mode' }
-               ], function( row ) {
-                       table2.push( tr( row ) );
-               } );
-
-               function tr( row ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         function tr( row, columns ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         var out = '<tr>';
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        var i = 0;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        columns = columns || 1;
+
</ins><span class="cx" style="display: block; padding: 0 10px">                         each( row, function( text, key ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                if ( ! text ) {
-                                       out += '<td></td><td></td>';
-                               } else {
-                                       out += '<td><kbd>' + key + '</kbd></td><td>' + __( text ) + '</td>';
-                               }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         out += '<td><kbd>' + key + '</kbd></td><td>' + __( text ) + '</td>';
+                               i++;
</ins><span class="cx" style="display: block; padding: 0 10px">                         });
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        while ( i < columns ) {
+                               out += '<td></td><td></td>';
+                               i++;
+                       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                         return out + '</tr>';
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                each ( labels, function( label, name ) {
+                       var letter;
+
+                       if ( label.indexOf( 'meta' ) !== -1 ) {
+                               i1++;
+                               letter = label.replace( 'meta', '' ).toLowerCase();
+
+                               if ( letter ) {
+                                       row1[ letter ] = name;
+
+                                       if ( i1 % 2 === 0 ) {
+                                               table1.push( tr( row1, 2 ) );
+                                               row1 = {};
+                                       }
+                               }
+                       } else if ( label.indexOf( 'access' ) !== -1 ) {
+                               i2++;
+                               letter = label.replace( 'access', '' ).toLowerCase();
+
+                               if ( letter ) {
+                                       row2[ letter ] = name;
+
+                                       if ( i2 % 2 === 0 ) {
+                                               table2.push( tr( row2, 2 ) );
+                                               row2 = {};
+                                       }
+                               }
+                       }
+               } );
+
+               // Add remaining single entries.
+               if ( i1 % 2 > 0 ) {
+                       table1.push( tr( row1, 2 ) );
+               }
+
+               if ( i2 % 2 > 0 ) {
+                       table2.push( tr( row2, 2 ) );
+               }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 header = [ __( 'Letter' ), __( 'Action' ), __( 'Letter' ), __( 'Action' ) ];
</span><span class="cx" style="display: block; padding: 0 10px">                header = '<tr><th>' + header.join( '</th><th>' ) + '</th></tr>';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -521,6 +548,41 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                });
</span><span class="cx" style="display: block; padding: 0 10px">                        });
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+               if ( editor.settings.wp_shortcut_labels ) {
+                       var labels = {};
+                       var access = 'Shift+Alt+';
+                       var meta = 'Ctrl+';
+
+                       // For Mac: shift = \u2303, ctrl = \u21E7, cmd = \u2318, alt = \u2325
+
+                       if ( tinymce.Env.mac ) {
+                               access = '\u2303\u2325 ';
+                               meta = '\u2318';
+                       }
+
+                       each( editor.settings.wp_shortcut_labels, function( value, name ) {
+                               labels[ name ] = value.replace( 'access', access ).replace( 'meta', meta );
+                       } );
+
+                       each( editor.theme.panel.find('button'), function( button ) {
+                               if ( button && button.settings.tooltip && labels.hasOwnProperty( button.settings.tooltip ) ) {
+                                       // Need to translate now. We are changing the string so it won't match and cannot be translated later.
+                                       button.settings.tooltip = editor.translate( button.settings.tooltip ) + ' (' + labels[ button.settings.tooltip ] + ')';
+                               }
+                       } );
+
+                       // listbox for the "blocks" drop-down
+                       each( editor.theme.panel.find('listbox'), function( listbox ) {
+                               if ( listbox && listbox.settings.text === 'Paragraph' ) {
+                                       each( listbox.settings.values, function( item ) {
+                                               if ( item.text && labels.hasOwnProperty( item.text ) ) {
+                                                       item.shortcut = '(' + labels[ item.text ] + ')';
+                                               }
+                                       } );
+                               }
+                       } );
+               }
</ins><span class="cx" style="display: block; padding: 0 10px">         });
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        editor.on( 'SaveContent', function( event ) {
</span></span></pre>
</div>
</div>

</body>
</html>