<!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>[45505] trunk: I18N: Allow the length of automatically generated excerpts to be localized.</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 { white-space: pre-line; 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/45505">45505</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/45505","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>johnbillion</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2019-06-08 18:41:08 +0000 (Sat, 08 Jun 2019)</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'>I18N: Allow the length of automatically generated excerpts to be localized.

This introduces three new strings that can be used to control the maximum length of automatically generated excerpts for posts, comments, and draft post previews in the dashboard. Optionally combined with the existing word count type control this allows languages which include many multibyte characters to specify more appropriate maximum excerpt lengths.

Props miyauchi, birgire, johnbillion

Fixes <a href="https://core.trac.wordpress.org/ticket/44541">#44541</a></pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminincludesdashboardphp">trunk/src/wp-admin/includes/dashboard.php</a></li>
<li><a href="#trunksrcwpincludescommenttemplatephp">trunk/src/wp-includes/comment-template.php</a></li>
<li><a href="#trunksrcwpincludesformattingphp">trunk/src/wp-includes/formatting.php</a></li>
<li><a href="#trunktestsphpunitdatalanguagesja_JPmo">trunk/tests/phpunit/data/languages/ja_JP.mo</a></li>
<li><a href="#trunktestsphpunitdatalanguagesja_JPpo">trunk/tests/phpunit/data/languages/ja_JP.po</a></li>
<li><a href="#trunktestsphpunittestsformattingWPTrimWordsphp">trunk/tests/phpunit/tests/formatting/WPTrimWords.php</a></li>
<li><a href="#trunktestsphpunittestsl10nphp">trunk/tests/phpunit/tests/l10n.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadminincludesdashboardphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/dashboard.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/dashboard.php 2019-06-08 17:09:02 UTC (rev 45504)
+++ trunk/src/wp-admin/includes/dashboard.php   2019-06-08 18:41:08 UTC (rev 45505)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -584,6 +584,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px">        echo '<h2 class="hide-if-no-js">' . __( 'Your Recent Drafts' ) . "</h2>\n<ul>";
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /* translators: Maximum number of words used in a preview of a draft on the dashboard. */
+       $draft_length = intval( _x( '10', 'draft_length' ) );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         $drafts = array_slice( $drafts, 0, 3 );
</span><span class="cx" style="display: block; padding: 0 10px">        foreach ( $drafts as $draft ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $url   = get_edit_post_link( $draft->ID );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -592,7 +595,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                /* translators: %s: post title */
</span><span class="cx" style="display: block; padding: 0 10px">                echo '<div class="draft-title"><a href="' . esc_url( $url ) . '" aria-label="' . esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;' ), $title ) ) . '">' . esc_html( $title ) . '</a>';
</span><span class="cx" style="display: block; padding: 0 10px">                echo '<time datetime="' . get_the_time( 'c', $draft ) . '">' . get_the_time( __( 'F j, Y' ), $draft ) . '</time></div>';
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( $the_content = wp_trim_words( $draft->post_content, 10 ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( $the_content = wp_trim_words( $draft->post_content, $draft_length ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         echo '<p>' . $the_content . '</p>';
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">                echo "</li>\n";
</span></span></pre></div>
<a id="trunksrcwpincludescommenttemplatephp"></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/comment-template.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/comment-template.php        2019-06-08 17:09:02 UTC (rev 45504)
+++ trunk/src/wp-includes/comment-template.php  2019-06-08 18:41:08 UTC (rev 45505)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -577,11 +577,9 @@
</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">- * Retrieve the excerpt of the current comment.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * Retrieves the excerpt of the given comment.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * Will cut each word and only output the first 20 words with '&hellip;' at the end.
- * If the word count is less than 20, then no truncating is done and no '&hellip;'
- * will appear.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * Returns a maximum of 20 words with an ellipsis appended if necessary.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 1.5.0
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -588,31 +586,26 @@
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @param int|WP_Comment $comment_ID  WP_Comment or ID of the comment for which to get the excerpt.
</span><span class="cx" style="display: block; padding: 0 10px">  *                                    Default current comment.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @return string The maybe truncated comment with 20 words or less.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @return string The possibly truncated comment excerpt.
</ins><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function get_comment_excerpt( $comment_ID = 0 ) {
</span><span class="cx" style="display: block; padding: 0 10px">        $comment      = get_comment( $comment_ID );
</span><span class="cx" style="display: block; padding: 0 10px">        $comment_text = strip_tags( str_replace( array( "\n", "\r" ), ' ', $comment->comment_content ) );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $words        = explode( ' ', $comment_text );
</del><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /* translators: Maximum number of words used in a comment excerpt. */
+       $comment_excerpt_length = intval( _x( '20', 'comment_excerpt_length' ) );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * Filters the amount of words used in the comment excerpt.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * Filters the maximum number of words used in the comment excerpt.
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 4.4.0
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @param int $comment_excerpt_length The amount of words you want to display in the comment excerpt.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $comment_excerpt_length = apply_filters( 'comment_excerpt_length', 20 );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $comment_excerpt_length = apply_filters( 'comment_excerpt_length', $comment_excerpt_length );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $use_ellipsis = count( $words ) > $comment_excerpt_length;
-       if ( $use_ellipsis ) {
-               $words = array_slice( $words, 0, $comment_excerpt_length );
-       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $excerpt = wp_trim_words( $comment_text, $comment_excerpt_length, '&hellip;' );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $excerpt = trim( join( ' ', $words ) );
-       if ( $use_ellipsis ) {
-               $excerpt .= '&hellip;';
-       }
</del><span class="cx" style="display: block; padding: 0 10px">         /**
</span><span class="cx" style="display: block; padding: 0 10px">         * Filters the retrieved comment excerpt.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span></span></pre></div>
<a id="trunksrcwpincludesformattingphp"></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/formatting.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/formatting.php      2019-06-08 17:09:02 UTC (rev 45504)
+++ trunk/src/wp-includes/formatting.php        2019-06-08 18:41:08 UTC (rev 45505)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3680,9 +3680,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="cx" style="display: block; padding: 0 10px">  * Generates an excerpt from the content, if needed.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * The excerpt word amount will be 55 words and if the amount is greater than
- * that, then the string ' [&hellip;]' will be appended to the excerpt. If the string
- * is less than 55 words, then the content will be returned as is.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * Returns a maximum of 55 words with an ellipsis appended if necessary.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * The 55 word limit can be modified by plugins/themes using the {@see 'excerpt_length'} filter
</span><span class="cx" style="display: block; padding: 0 10px">  * The ' [&hellip;]' string can be modified by plugins/themes using the {@see 'excerpt_more'} filter
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3707,14 +3705,18 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $text = apply_filters( 'the_content', $text );
</span><span class="cx" style="display: block; padding: 0 10px">                $text = str_replace( ']]>', ']]&gt;', $text );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                /* translators: Maximum number of words used in a post excerpt. */
+               $excerpt_length = intval( _x( '55', 'excerpt_length' ) );
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                 * Filters the number of words in an excerpt.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+          * Filters the maximum number of words in a post excerpt.
</ins><span class="cx" style="display: block; padding: 0 10px">                  *
</span><span class="cx" style="display: block; padding: 0 10px">                 * @since 2.7.0
</span><span class="cx" style="display: block; padding: 0 10px">                 *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                 * @param int $number The number of words. Default 55.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+          * @param int $number The maximum number of words. Default 55.
</ins><span class="cx" style="display: block; padding: 0 10px">                  */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $excerpt_length = apply_filters( 'excerpt_length', 55 );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $excerpt_length = apply_filters( 'excerpt_length', $excerpt_length );
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 /**
</span><span class="cx" style="display: block; padding: 0 10px">                 * Filters the string in the "more" link displayed after a trimmed excerpt.
</span><span class="cx" style="display: block; padding: 0 10px">                 *
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3725,6 +3727,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $excerpt_more = apply_filters( 'excerpt_more', ' ' . '[&hellip;]' );
</span><span class="cx" style="display: block; padding: 0 10px">                $text         = wp_trim_words( $text, $excerpt_length, $excerpt_more );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><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">         * Filters the trimmed excerpt string.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span></span></pre></div>
<a id="trunktestsphpunitdatalanguagesja_JPmo"></a>
<div class="binary"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/data/languages/ja_JP.mo</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<a id="trunktestsphpunitdatalanguagesja_JPpo"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/data/languages/ja_JP.po</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/data/languages/ja_JP.po       2019-06-08 17:09:02 UTC (rev 45504)
+++ trunk/tests/phpunit/data/languages/ja_JP.po 2019-06-08 18:41:08 UTC (rev 45505)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -40,3 +40,30 @@
</span><span class="cx" style="display: block; padding: 0 10px"> #: wp-includes/script-loader.php:620
</span><span class="cx" style="display: block; padding: 0 10px"> msgid "Update %s now"
</span><span class="cx" style="display: block; padding: 0 10px"> msgstr "今すぐ %s を更新"
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+#. translators: If your word count is based on single characters (e.g. East
+#. Asian characters), enter 'characters_excluding_spaces' or
+#. 'characters_including_spaces'. Otherwise, enter 'words'. Do not translate
+#. into your own language.
+#: wp-includes/formatting.php:3372 wp-includes/script-loader.php:1100
+msgctxt "Word count type. Do not translate!"
+msgid "words"
+msgstr "characters_including_spaces"
+
+#. translators: Maximum number of words used in a post excerpt.
+#: wp-includes/formatting.php:3640
+msgctxt "excerpt_length"
+msgid "55"
+msgstr "110"
+
+#. translators: Maximum number of words used in a comment excerpt.
+#: wp-includes/comment-template.ph:599
+msgctxt "comment_excerpt_length"
+msgid "20"
+msgstr "40"
+
+#. translators: Maximum number of words used in a preview of a draft on the dashboard.
+#: wp-admin/includes/dashboard.php:591
+msgctxt "draft_length"
+msgid "10"
+msgstr "40"
</ins></span></pre></div>
<a id="trunktestsphpunittestsformattingWPTrimWordsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/formatting/WPTrimWords.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/formatting/WPTrimWords.php      2019-06-08 17:09:02 UTC (rev 45504)
+++ trunk/tests/phpunit/tests/formatting/WPTrimWords.php        2019-06-08 18:41:08 UTC (rev 45505)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -4,6 +4,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @group formatting
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> class Tests_Formatting_WPTrimWords extends WP_UnitTestCase {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * Long Dummy Text.
+        *
+        * @since 5.0.0
+        *
+        * @var string $long_text
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         private $long_text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce varius lacinia vehicula. Etiam sapien risus, ultricies ac posuere eu, convallis sit amet augue. Pellentesque urna massa, lacinia vel iaculis eget, bibendum in mauris. Aenean eleifend pulvinar ligula, a convallis eros gravida non. Suspendisse potenti. Pellentesque et odio tortor. In vulputate pellentesque libero, sed dapibus velit mollis viverra. Pellentesque id urna euismod dolor cursus sagittis.';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        function test_trims_to_55_by_default() {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -42,4 +50,27 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $text = 'This is some short text.';
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertEquals( $text, wp_trim_words( $text ) );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * @ticket 44541
+        */
+       function test_trims_to_20_counted_by_chars() {
+               switch_to_locale( 'ja_JP' );
+               $expected = substr( $this->long_text, 0, 20 ) . '&hellip;';
+               $actual   = wp_trim_words( $this->long_text, 20 );
+               restore_previous_locale();
+               $this->assertEquals( $expected, $actual );
+       }
+
+       /**
+        * @ticket 44541
+        */
+       function test_trims_to_20_counted_by_chars_with_double_width_chars() {
+               switch_to_locale( 'ja_JP' );
+               $text     = str_repeat( 'あ', 100 );
+               $expected = str_repeat( 'あ', 19 ) . '&hellip;';
+               $actual   = wp_trim_words( $text, 19 );
+               restore_previous_locale();
+               $this->assertEquals( $expected, $actual );
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre></div>
<a id="trunktestsphpunittestsl10nphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/l10n.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/l10n.php        2019-06-08 17:09:02 UTC (rev 45504)
+++ trunk/tests/phpunit/tests/l10n.php  2019-06-08 18:41:08 UTC (rev 45505)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -7,6 +7,15 @@
</span><span class="cx" style="display: block; padding: 0 10px"> class Tests_L10n extends WP_UnitTestCase {
</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">+         * Long Dummy Text.
+        *
+        * @since 5.0.0
+        *
+        * @var string $long_text
+        */
+       private $long_text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.';
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * @ticket 35961
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        function test_n_noop() {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -260,4 +269,251 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertNotEmpty( $array['Project-Id-Version'] );
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertNotEmpty( $array['X-Generator'] );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * @ticket 44541
+        */
+       function test_length_of_excerpt_should_be_counted_by_words() {
+               global $post;
+
+               switch_to_locale( 'en_US' );
+
+               $args = array(
+                       'post_content' => $this->long_text,
+                       'post_excerpt' => '',
+               );
+
+               $post = $this->factory()->post->create_and_get( $args );
+               setup_postdata( $post );
+
+               $expect = "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat [&hellip;]</p>\n";
+               the_excerpt();
+
+               restore_previous_locale();
+
+               $this->expectOutputString( $expect );
+       }
+
+       /**
+        * @ticket 44541
+        */
+       function test_length_of_excerpt_should_be_counted_by_chars() {
+               global $post;
+
+               switch_to_locale( 'ja_JP' );
+
+               $args = array(
+                       'post_content' => $this->long_text,
+                       'post_excerpt' => '',
+               );
+
+               $post = $this->factory()->post->create_and_get( $args );
+               setup_postdata( $post );
+
+               $expect = "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore  [&hellip;]</p>\n";
+               the_excerpt();
+
+               restore_previous_locale();
+
+               $this->expectOutputString( $expect );
+       }
+
+       /**
+        * @ticket 44541
+        */
+       function test_length_of_excerpt_should_be_counted_by_chars_in_japanese() {
+               global $post;
+
+               switch_to_locale( 'ja_JP' );
+
+               $args = array(
+                       'post_content' => str_repeat( 'あ', 200 ),
+                       'post_excerpt' => '',
+               );
+
+               $post = $this->factory()->post->create_and_get( $args );
+               setup_postdata( $post );
+
+               $expect = '<p>' . str_repeat( 'あ', 110 ) . " [&hellip;]</p>\n";
+               the_excerpt();
+
+               restore_previous_locale();
+
+               $this->expectOutputString( $expect );
+       }
+
+       /**
+        * @ticket 44541
+        */
+       function test_length_of_excerpt_rss_should_be_counted_by_words() {
+               global $post;
+
+               switch_to_locale( 'en_US' );
+
+               $args = array(
+                       'post_content' => $this->long_text,
+                       'post_excerpt' => '',
+               );
+
+               $post = $this->factory()->post->create_and_get( $args );
+               setup_postdata( $post );
+
+               $expect = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat [&#8230;]';
+               the_excerpt_rss();
+
+               restore_previous_locale();
+
+               $this->expectOutputString( $expect );
+       }
+
+       /**
+        * @ticket 44541
+        */
+       function test_length_of_excerpt_rss_should_be_counted_by_chars() {
+               global $post;
+
+               switch_to_locale( 'ja_JP' );
+
+               $args = array(
+                       'post_content' => $this->long_text,
+                       'post_excerpt' => '',
+               );
+
+               $post = $this->factory()->post->create_and_get( $args );
+               setup_postdata( $post );
+
+               $expect = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore  [&#8230;]';
+
+               the_excerpt_rss();
+
+               restore_previous_locale();
+
+               $this->expectOutputString( $expect );
+       }
+
+       /**
+        * @ticket 44541
+        */
+       function test_length_of_draft_should_be_counted_by_words() {
+               require_once ABSPATH . 'wp-admin/includes/dashboard.php';
+
+               switch_to_locale( 'en_US' );
+
+               $args = array(
+                       'post_content' => $this->long_text,
+                       'post_excerpt' => '',
+                       'post_status'  => 'draft',
+               );
+
+               $this->factory()->post->create( $args );
+
+               $expect = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do&hellip;';
+               wp_dashboard_recent_drafts();
+
+               restore_previous_locale();
+
+               $this->expectOutputRegex( '/' . $expect . '/' );
+       }
+
+       /**
+        * @ticket 44541
+        */
+       function test_length_of_draft_should_be_counted_by_chars() {
+               require_once ABSPATH . 'wp-admin/includes/dashboard.php';
+
+               switch_to_locale( 'ja_JP' );
+
+               $args = array(
+                       'post_content' => $this->long_text,
+                       'post_excerpt' => '',
+                       'post_status'  => 'draft',
+               );
+
+               $post = $this->factory()->post->create( $args );
+
+               $expect = 'Lorem ipsum dolor sit amet, consectetur &hellip;';
+               wp_dashboard_recent_drafts();
+
+               restore_previous_locale();
+
+               $this->expectOutputRegex( '/' . $expect . '/' );
+       }
+
+       /**
+        * @ticket 44541
+        */
+       function test_length_of_draft_should_be_counted_by_chars_in_japanese() {
+               require_once ABSPATH . 'wp-admin/includes/dashboard.php';
+
+               switch_to_locale( 'ja_JP' );
+
+               $args = array(
+                       'post_content' => str_repeat( 'あ', 200 ),
+                       'post_excerpt' => '',
+                       'post_status'  => 'draft',
+               );
+
+               $this->factory()->post->create( $args );
+
+               $expect = str_repeat( 'あ', 40 ) . '&hellip;';
+               wp_dashboard_recent_drafts();
+
+               restore_previous_locale();
+
+               $this->expectOutputRegex( '/' . $expect . '/' );
+       }
+
+       /**
+        * @ticket 44541
+        */
+       function test_length_of_comment_excerpt_should_be_counted_by_words() {
+               switch_to_locale( 'en_US' );
+
+               $args            = array(
+                       'comment_content' => $this->long_text,
+               );
+               $comment_id      = $this->factory()->comment->create( $args );
+               $expect          = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut&hellip;';
+               $comment_excerpt = get_comment_excerpt( $comment_id );
+
+               restore_previous_locale();
+
+               $this->assertSame( $expect, $comment_excerpt );
+       }
+
+       /**
+        * @ticket 44541
+        */
+       function test_length_of_comment_excerpt_should_be_counted_by_chars() {
+               switch_to_locale( 'ja_JP' );
+
+               $args            = array(
+                       'comment_content' => $this->long_text,
+               );
+               $comment_id      = $this->factory()->comment->create( $args );
+               $expect          = 'Lorem ipsum dolor sit amet, consectetur &hellip;';
+               $comment_excerpt = get_comment_excerpt( $comment_id );
+
+               restore_previous_locale();
+
+               $this->assertSame( $expect, $comment_excerpt );
+       }
+
+       /**
+        * @ticket 44541
+        */
+       function test_length_of_comment_excerpt_should_be_counted_by_chars_in_Japanese() {
+               switch_to_locale( 'ja_JP' );
+
+               $args            = array(
+                       'comment_content' => str_repeat( 'あ', 200 ),
+               );
+               $comment_id      = $this->factory()->comment->create( $args );
+               $expect          = str_repeat( 'あ', 40 ) . '&hellip;';
+               $comment_excerpt = get_comment_excerpt( $comment_id );
+
+               restore_previous_locale();
+
+               $this->assertSame( $expect, $comment_excerpt );
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre>
</div>
</div>

</body>
</html>