Changeset 12063
- Timestamp:
- 09/15/2022 03:13:17 PM (4 years ago)
- Location:
- sites/trunk/wordpress.org/public_html/wp-content/plugins/gp-translation-helpers
- Files:
-
- 2 added
- 10 edited
-
css/discussion.css (modified) (2 diffs)
-
gp-translation-helpers.php (modified) (2 diffs)
-
helpers/helper-translation-discussion.php (modified) (7 diffs)
-
includes/class-gp-notifications.php (modified) (5 diffs)
-
includes/class-gp-route-translation-helpers.php (modified) (1 diff)
-
includes/class-gp-translation-helpers.php (modified) (6 diffs)
-
includes/class-wporg-notifications.php (modified) (4 diffs)
-
js/reject-feedback.js (modified) (8 diffs)
-
templates/discussions-dashboard.php (added)
-
templates/gp-templates-overrides/locale-projects.php (added)
-
templates/gp-templates-overrides/translation-row-editor-meta-status.php (modified) (1 diff)
-
templates/original-permalink.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
sites/trunk/wordpress.org/public_html/wp-content/plugins/gp-translation-helpers/css/discussion.css
r11999 r12063 148 148 float: right; 149 149 } 150 .gp-btn-style:hover, #respond form .form-submit .submit:hover {150 .gp-btn-style:hover, #respond form .form-submit .submit:hover, .other-comments:hover{ 151 151 background-color: var(--gp-color-btn-primary-hover-bg); 152 152 border-color: var(--gp-color-btn-primary-hover-border); … … 249 249 margin: 2px !important; 250 250 } 251 .other-comments{ 252 font-size: .7em; 253 background: #0285ba; 254 color: #fff !important; 255 padding: 3px; 256 text-decoration: none; 257 display: inline-block; 258 text-decoration: none !important; 259 margin-top: 8px; 260 } 261 .discussions-table-head{ 262 background-color: var(--gp-color-canvas-subtle) !important; 263 } 264 .bulk-comment-item{ 265 font-size: .8em; 266 } -
sites/trunk/wordpress.org/public_html/wp-content/plugins/gp-translation-helpers/gp-translation-helpers.php
r12003 r12063 8 8 * Plugin URI: https://github.com/GlotPress/gp-translation-helpers 9 9 * Description: GlotPress plugin to discuss the strings that are being translated in GlotPress. 10 * Version: 0.0. 210 * Version: 0.0.3 11 11 * Requires PHP: 7.4 12 12 * Author: the GlotPress team … … 40 40 add_action( 'gp_init', array( 'WPorg_GlotPress_Notifications', 'init' ) ); // todo: include this class in a different plugin. 41 41 add_action( 'gp_init', array( 'WPorg_GlotPress_Customizations', 'init' ) ); // todo: include this class in a different plugin. 42 add_filter( 'gp_enable_changesrequested_status', '__return_true' ); // todo: remove this filter when this plugin will be merged in the GlotPress core. -
sites/trunk/wordpress.org/public_html/wp-content/plugins/gp-translation-helpers/helpers/helper-translation-discussion.php
r12003 r12063 41 41 42 42 /** 43 * Indicates whether we're currently using a temporary post. 44 * 45 * @since 0.0.2 46 * @var object|null 47 */ 48 public static $temporary_post = null; 49 50 /** 43 51 * The post type used to store the comments. 44 52 * … … 90 98 $this->register_post_type_and_taxonomy(); 91 99 add_filter( 'pre_comment_approved', array( $this, 'comment_moderation' ), 10, 2 ); 100 add_filter( 'comments_open', array( $this, 'comments_open_override' ), 10, 2 ); 92 101 add_filter( 'map_meta_cap', array( $this, 'map_comment_meta_caps' ), 10, 4 ); 93 102 add_filter( 'user_has_cap', array( $this, 'give_user_read_cap' ), 10, 3 ); … … 253 262 254 263 /** 264 * Enable showing the comment form on non-existing posts. 265 * 266 * @param boolean $open Whether the comments are open or not. 267 * @param int $post_id The post id. 268 * 269 * @return bool Whether the comments are open or not. 270 */ 271 public function comments_open_override( $open, $post_id ) { 272 if ( self::is_temporary_post_id( $post_id ) ) { 273 return true; 274 } 275 276 // If we just had to define a temporary post, the post id can also be 0. 277 // This is due to a code change in core in this commit: 278 // https://github.com/WordPress/WordPress/commit/1069ac4afda821742cf7f600412aacc139013a55 279 if ( self::$temporary_post && 0 === $post_id ) { 280 return true; 281 } 282 return $open; 283 } 284 285 /** 255 286 * Updates the comment's approval status before it is set. 256 287 * … … 366 397 public static function maybe_get_temporary_post( $post_id ) { 367 398 if ( self::is_temporary_post_id( $post_id ) ) { 368 return new Gth_Temporary_Post( $post_id ); 399 self::$temporary_post = new Gth_Temporary_Post( $post_id ); 400 return self::$temporary_post; 369 401 } 370 402 … … 527 559 'translation_id' => isset( $this->data['translation_id'] ) ? $this->data['translation_id'] : null, 528 560 'locale_slug' => $this->data['locale_slug'], 529 'original_permalink' => $this->data['original_permalink'],530 561 'original_id' => $this->data['original_id'], 531 562 'project' => $this->data['project'], … … 654 685 'replyto' => sprintf( $args['reply_to_text'], $comment->comment_author ), 655 686 ); 687 688 if ( get_option( 'page_comments' ) ) { 689 $permalink = str_replace( '#comment-' . $comment->comment_ID, '', get_comment_link( $comment ) ); 690 } else { 691 $permalink = get_permalink( $post->ID ); 692 } 656 693 657 694 $data_attribute_string = ''; … … 672 709 'moderation-hash' => false, 673 710 ), 674 $ args['original_permalink']711 $permalink 675 712 ) 676 713 ) . '#' . $args['respond_id'], -
sites/trunk/wordpress.org/public_html/wp-content/plugins/gp-translation-helpers/includes/class-gp-notifications.php
r12003 r12063 34 34 if ( ( '0' !== $comment->comment_parent ) ) { // Notify to the thread only if the comment is in a thread. 35 35 self::send_emails_to_thread_commenters( $comment, $comment_meta ); 36 }37 if ( ( '0' === $comment->comment_parent ) && array_key_exists( 'reject_reason', $comment_meta ) && ( ! empty( $comment_meta['reject_reason'] ) ) ) { // Notify a rejection without parent comments.38 self::send_rejection_email_to_translator( $comment, $comment_meta );39 36 } 40 37 $root_comment = self::get_root_comment_in_a_thread( $comment ); … … 50 47 break; 51 48 } 49 } elseif ( ( '0' === $comment->comment_parent ) ) { // Notify an approval, rejection or fuzzy without parent comments. 50 self::send_action_email_to_translator( $comment, $comment_meta ); 52 51 } 53 52 } … … 104 103 105 104 /** 106 * Sends the reject notificationto the translator.105 * Sends the action notification (approval, rejection, fuzzy) to the translator. 107 106 * 108 107 * @since 0.0.2 … … 113 112 * @return void 114 113 */ 115 public static function send_ rejection_email_to_translator( WP_Comment $comment, array $comment_meta ) {114 public static function send_action_email_to_translator( WP_Comment $comment, array $comment_meta ) { 116 115 $translation_id = $comment_meta['translation_id']; 117 116 $translation = GP::$translation->get( $translation_id ); 118 $translator = get_user_by( 'id', $translation->user_id _last_modified);117 $translator = get_user_by( 'id', $translation->user_id ); 119 118 if ( false === $translator ) { 120 $translator = get_user_by( 'id', $translation->user_id ); 121 } 122 self::send_emails( $comment, $comment_meta, array( $translator->user_email ) ); 119 $translator = get_user_by( 'id', $translation->user_id_last_modified ); 120 } 121 if ( false === $translator ) { 122 self::send_emails( $comment, $comment_meta, array( $translator->user_email ) ); 123 } 123 124 } 124 125 … … 422 423 } 423 424 } 425 if ( isset( $comment_meta['reject_reason'][0] ) && ! empty( maybe_unserialize( $comment_meta['reject_reason'][0] ) ) ) { 426 $reasons = array(); 427 $comment_reasons = Helper_Translation_Discussion::get_comment_reasons(); 428 $reasons = array_map( 429 function( $reason ) use ( $comment_reasons ) { 430 if ( array_key_exists( $reason, $comment_reasons ) ) { 431 return $comment_reasons[ $reason ]['name']; 432 } 433 }, 434 maybe_unserialize( $comment_meta['reject_reason'][0] ) 435 ); 436 /* translators: The reason(s) for rejection. */ 437 $output .= '- ' . wp_kses( sprintf( __( '<strong>Reason(s):</strong> %s', 'glotpress' ), implode( ', ', $reasons ) ), array( 'strong' => array() ) ) . '<br/>'; 438 } 424 439 /* translators: The comment made. */ 425 440 $output .= '- ' . wp_kses( sprintf( __( '<strong>Comment:</strong> %s', 'glotpress' ), $comment->comment_content ), array( 'strong' => array() ) ) . '<br/>'; -
sites/trunk/wordpress.org/public_html/wp-content/plugins/gp-translation-helpers/includes/class-gp-route-translation-helpers.php
r11837 r12063 24 24 $this->helpers = GP_Translation_Helpers::load_helpers(); 25 25 $this->template_path = dirname( __FILE__ ) . '/../templates/'; 26 } 27 28 /** 29 * Loads the 'discussions-dashboard' template. 30 * 31 * @since 0.0.2 32 * 33 * @param string|null $locale_slug Optional. The locale slug. E.g. "es". 34 * 35 * @return void 36 */ 37 public function discussions_dashboard( $locale_slug ) { 38 if ( ! is_user_logged_in() ) { 39 $this->die_with_404(); 40 } 41 $all_comments_count = count( 42 get_comments( 43 array( 44 'meta_key' => 'locale', 45 'meta_value' => $locale_slug, 46 ) 47 ) 48 ); 49 $comments_per_page = 12; 50 $total_pages = (int) ceil( $all_comments_count / $comments_per_page ); 51 $page_num_from_query = get_query_var( 'page' ); 52 $page_number = ( ! empty( $page_num_from_query ) && is_int( $page_num_from_query ) ) ? $page_num_from_query : 1; 53 $gp_locale = GP_Locales::by_slug( $locale_slug ); 54 $args = array( 55 'number' => $comments_per_page, 56 'meta_key' => 'locale', 57 'meta_value' => $locale_slug, 58 'paged' => $page_number, 59 ); 60 61 $comments_query = new WP_Comment_Query( $args ); 62 $comments = $comments_query->comments; 63 64 $this->tmpl( 'discussions-dashboard', get_defined_vars() ); 26 65 } 27 66 -
sites/trunk/wordpress.org/public_html/wp-content/plugins/gp-translation-helpers/includes/class-gp-translation-helpers.php
r12014 r12063 68 68 gp_enqueue_style( 'thickbox' ); 69 69 70 wp_register_style( 'gp-discussion-css', plugins_url( '/../css/discussion.css', __FILE__ ), array(), '20220801' ); 70 wp_register_style( 71 'gp-discussion-css', 72 plugins_url( 'css/discussion.css', __DIR__ ), 73 array(), 74 filemtime( plugin_dir_path( __DIR__ ) . 'css/discussion.css' ) 75 ); 71 76 gp_enqueue_style( 'gp-discussion-css' ); 72 77 … … 76 81 'gp_tmpl_load_locations', 77 82 function( $locations, $template, $args, $template_path ) { 78 if ( 'translation-row-editor-meta-status' === $template ) {83 if ( 'translation-row-editor-meta-status' === $template || 'locale-projects' === $template ) { 79 84 array_unshift( $locations, dirname( dirname( __FILE__ ) ) . '/templates/gp-templates-overrides/' ); 80 85 } else { … … 190 195 ); 191 196 192 wp_register_style( 'gp-translation-helpers-css', plugins_url( 'css/translation-helpers.css', __DIR__ ), '', '20220801' ); // todo: add the version as global element. 197 wp_register_style( 198 'gp-translation-helpers-css', 199 plugins_url( 'css/translation-helpers.css', __DIR__ ), 200 array(), 201 filemtime( plugin_dir_path( __DIR__ ) . 'css/translation-helpers.css' ) 202 ); 193 203 gp_enqueue_style( 'gp-translation-helpers-css' ); 194 204 195 wp_register_script( 'gp-translation-helpers', plugins_url( '/js/translation-helpers.js', __DIR__ ), array( 'gp-editor' ), '20220801', true ); 205 wp_register_script( 206 'gp-translation-helpers', 207 plugins_url( 'js/translation-helpers.js', __DIR__ ), 208 array( 'gp-editor' ), 209 filemtime( plugin_dir_path( __DIR__ ) . 'js/translation-helpers.js' ), 210 true 211 ); 196 212 gp_enqueue_scripts( array( 'gp-translation-helpers' ) ); 197 213 … … 312 328 GP::$router->prepend( "/$project/-get-translation-helpers/$id", array( 'GP_Route_Translation_Helpers', 'ajax_translation_helpers' ), 'get' ); 313 329 GP::$router->prepend( "/$project/$locale/$dir/-get-translation-helpers/$id", array( 'GP_Route_Translation_Helpers', 'ajax_translation_helpers_locale' ), 'get' ); 330 GP::$router->prepend( "/locale/$locale/$dir/discussions/?", array( 'GP_Route_Translation_Helpers', 'discussions_dashboard' ), 'get' ); 314 331 } 315 332 … … 364 381 } 365 382 366 wp_register_script( 'gp-comment-feedback-js', plugins_url( '/../js/reject-feedback.js', __FILE__ ), array( 'jquery', 'gp-common', 'gp-editor', 'thickbox' ), '20220812' ); 383 wp_register_script( 384 'gp-comment-feedback-js', 385 plugins_url( 'js/reject-feedback.js', __DIR__ ), 386 array( 'jquery', 'gp-common', 'gp-editor', 'thickbox' ), 387 filemtime( plugin_dir_path( __DIR__ ) . 'js/reject-feedback.js' ) 388 ); 367 389 gp_enqueue_script( 'gp-comment-feedback-js' ); 368 390 … … 403 425 $comment = sanitize_text_field( $_POST['data']['comment'] ); 404 426 405 if ( ! $locale_slug || ! $translation_id_array || ! $original_id_array || ( ! $comment_reason && ! $comment ) ) { 406 wp_send_json_error(); 427 if ( ! $locale_slug ) { 428 wp_send_json_error( 'Oops! Locale slug missing' ); 429 } 430 if ( ! $translation_id_array ) { 431 wp_send_json_error( 'Oops! Translation ID missing' ); 432 } 433 if ( ! $original_id_array ) { 434 wp_send_json_error( 'Oops! Original ID missing' ); 435 } 436 if ( ! $comment_reason && ! $comment ) { 437 wp_send_json_error( 'Oops! No comment and reason found' ); 407 438 } 408 439 -
sites/trunk/wordpress.org/public_html/wp-content/plugins/gp-translation-helpers/includes/class-wporg-notifications.php
r12003 r12063 326 326 } 327 327 } 328 if ( isset( $comment_meta['reject_reason'][0] ) && ! empty( maybe_unserialize( $comment_meta['reject_reason'][0] ) ) ) { 329 $reasons = array(); 330 $comment_reasons = Helper_Translation_Discussion::get_comment_reasons(); 331 $reasons = array_map( 332 function( $reason ) use ( $comment_reasons ) { 333 if ( array_key_exists( $reason, $comment_reasons ) ) { 334 return $comment_reasons[ $reason ]['name']; 335 } 336 }, 337 maybe_unserialize( $comment_meta['reject_reason'][0] ) 338 ); 339 $output .= '- <strong>' . esc_html__( 'Reason(s): ' ) . '</strong>' . esc_html( implode( ', ', $reasons ) ) . '<br>'; 340 } 328 341 $output .= '- <strong>' . esc_html__( 'Comment: ' ) . '</strong>' . esc_html( $comment->comment_content ) . '</pre>'; 329 342 $output .= '<br><br>'; … … 430 443 */ 431 444 private static function get_opted_in_email_addresses( array $email_addresses ): array { 432 foreach ( $email_addresses as $email_address ) { 433 if ( self::is_global_optout_email_address( $email_address ) ) { 434 $index = array_search( $email_address, $email_addresses, true ); 435 if ( false !== $index ) { 436 unset( $email_addresses[ $index ] ); 437 } 445 foreach ( $email_addresses as $index => $email_address ) { 446 if ( ! is_string( $email_address ) || empty( $email_address ) || self::is_global_optout_email_address( $email_address ) ) { 447 unset( $email_addresses[ $index ] ); 438 448 } 439 449 } … … 451 461 */ 452 462 private static function is_global_optout_email_address( string $email_address ): bool { 463 if ( empty( $email_address ) || ! is_email( $email_address ) ) { 464 return false; 465 } 453 466 $user = get_user_by( 'email', $email_address ); 454 467 $gp_default_sort = get_user_option( 'gp_default_sort', $user->ID ); … … 602 615 $user = wp_get_current_user(); 603 616 617 if ( ! $user->user_email ) { 618 return __( "You will not receive notifications because you don't have an e-mail address set." ); 619 } 604 620 if ( self::is_global_optout_email_address( $user->user_email ) ) { 605 $output = __( 'You will not receive notifications because you have not yet opted-in. ' );621 $output = __( 'You will not receive notifications because you have not yet opted-in.' ); 606 622 $output .= ' <a href="https://translate.wordpress.org/settings/">' . __( 'Start receiving notifications.' ) . '</a>'; 607 623 return $output; -
sites/trunk/wordpress.org/public_html/wp-content/plugins/gp-translation-helpers/js/reject-feedback.js
r12014 r12063 1 /* global $gp, $gp_comment_feedback_settings, document, tb_show */1 /* global $gp, $gp_comment_feedback_settings, document, tb_show, console */ 2 2 ( function( $, $gp ) { 3 3 $( document ).ready( … … 16 16 '</div>' + 17 17 '<button id="modal-reject-btn" class="modal-btn gp-btn-style">Reject</button>' + 18 '<button id="modal-requestchanges-btn" class="modal-btn gp-btn-style" style="display: none;" class="modal-btn">Request changes</button>' + 18 19 '</form>' + 19 20 '</div>'; … … 24 25 $( $gp.editor.table ).off( 'click', 'summary' ); 25 26 26 $( '#bulk-actions-toolbar-top .button, #bulk-actions-toolbar .button' ).click( function( e ) {27 $( '#bulk-actions-toolbar-top .button, #bulk-actions-toolbar-bottom .button' ).click( function( e ) { 27 28 rowIds = $( 'input:checked', $( 'table#translations th.checkbox' ) ).map( function() { 28 29 var selectedRow = $( this ).parents( 'tr.preview' ); … … 57 58 } ); 58 59 59 $( 'body' ).on( 'click', '#modal-reject-btn', function( e ) { 60 /** 61 * Changes the value for the rejected status in the top toolbar to "changes requested" 62 * 63 * @param {Object} thisObj The object that dispatches this call. 64 */ 65 function updateBulkRejectStatus( thisObj ) { 66 var form = thisObj.closest( 'form' ); 67 var commentText = form.find( 'textarea[name="modal_feedback_comment"]' ).val(); 68 var numberOfCheckedReasons = form.find( 'input[name="modal_feedback_reason"]:checked' ).length; 69 if ( commentText || numberOfCheckedReasons ) { 70 $( 'form#bulk-actions-toolbar-top option[value="reject"]' ).attr( 'value', 'changesrequested' ).text( 'Changes requested' ); 71 } 72 } 73 74 $( 'body' ).on( 'click', '#modal-reject-btn, #modal-requestchanges-btn', function( e ) { 60 75 var comment = ''; 61 76 var commentReason = []; … … 70 85 71 86 comment = form.find( 'textarea[name="modal_feedback_comment"]' ).val(); 72 87 updateBulkRejectStatus( $( this ) ); 73 88 if ( ( ! comment.trim().length && ! commentReason.length ) || ( ! translationIds.length || ! originalIds.length ) ) { 74 89 $( 'form.filters-toolbar.bulk-actions, form#bulk-actions-toolbar-top' ).submit(); … … 85 100 } ); 86 101 102 $( '.feedback-reason-list' ).on( 'click', function( e ) { 103 toggleButtons( $( this ), e ); 104 } ); 105 $( '.feedback-comment' ).on( 'input', function( e ) { 106 toggleButtons( $( this ), e ); 107 } ); 108 109 /** 110 * Hide and show one of each two buttons in the individual rejection: "Reject" and "Request changes". 111 * 112 * If the user has checked some reason or has entered some text in the textarea, 113 * this function hides the "Reject" button and shows the "Request changes" one. 114 * Otherwise, does the opposite. 115 * 116 * @param {Object} thisObj The object that dispatches this call. 117 * @param {document#event} event The event. 118 */ 119 function toggleButtons( thisObj, event ) { 120 var form = thisObj.closest( 'form' ); 121 var commentText = form.find( 'textarea[name="feedback_comment"]' ).val(); 122 var div = thisObj.closest( '.meta' ); 123 var rejectButton = $( '.reject', div ); 124 var changesRequestedtButton = $( '.changesrequested', div ); 125 var numberOfCheckedReasons = form.find( 'input[name="feedback_reason"]:checked' ).length; 126 127 if ( commentText.trim() !== '' || numberOfCheckedReasons ) { 128 rejectButton.hide(); 129 changesRequestedtButton.show(); 130 } else { 131 rejectButton.show(); 132 changesRequestedtButton.hide(); 133 } 134 event.stopImmediatePropagation(); 135 } 136 137 $( '.modal-item' ).on( 'click', function( e ) { 138 toggleModalButtons( $( this ), e ); 139 } ); 140 $( 'textarea[name="modal_feedback_comment"]' ).on( 'input', function( e ) { 141 toggleModalButtons( $( this ), e ); 142 } ); 143 144 /** 145 * Hide and show one of each two buttons in the reject modal: "Reject" and "Request changes". 146 * 147 * In the modal, if the user has checked some reason or has entered some text in the textarea, 148 * this function hides the "Reject" button and shows the "Request changes" one. 149 * Otherwise, does the opposite. 150 * 151 * @param {Object} thisObj The object that dispatches this call. 152 * @param {document#event} event The event. 153 */ 154 function toggleModalButtons( thisObj, event ) { 155 var form = thisObj.closest( 'form' ); 156 var commentText = form.find( 'textarea[name="modal_feedback_comment"]' ).val(); 157 var div = thisObj.closest( '#TB_ajaxContent' ); 158 var rejectButton = $( '#modal-reject-btn', div ); 159 var changesRequestedtButton = $( '#modal-requestchanges-btn', div ); 160 var numberOfCheckedReasons = form.find( 'input[name="modal_feedback_reason"]:checked' ).length; 161 162 if ( commentText.trim() !== '' || numberOfCheckedReasons ) { 163 rejectButton.hide(); 164 changesRequestedtButton.show(); 165 } else { 166 rejectButton.show(); 167 changesRequestedtButton.hide(); 168 } 169 event.stopImmediatePropagation(); 170 } 171 87 172 $( '.tooltip' ).tooltip( { 88 173 tooltipClass: 'hoverTooltip', … … 101 186 $gp.editor.hooks.set_status_rejected = function() { 102 187 setStatus( $( this ), 'rejected' ); 188 }; 189 190 $gp.editor.hooks.set_status_changesrequested = function() { 191 setStatus( $( this ), 'changesrequested' ); 103 192 }; 104 193 … … 165 254 ).fail( 166 255 function( xhr, msg ) { 256 /* eslint no-console: ["error", { allow: ["error"] }] */ 257 console.error( data ); 167 258 msg = 'An error has occurred'; 168 259 if ( xhr.responseText ) { 169 260 msg += ': ' + xhr.responseText; 170 261 } 171 msg += '. Please, take a screenshot , send it to the developers, and reload the page to see if it still worked.';262 msg += '. Please, take a screenshot of the output in the browser console, send it to the developers, and reload the page to see if it works.'; 172 263 $gp.notices.error( msg ); 173 264 } -
sites/trunk/wordpress.org/public_html/wp-content/plugins/gp-translation-helpers/templates/gp-templates-overrides/translation-row-editor-meta-status.php
r11992 r12063 20 20 <?php if ( 'rejected' !== $translation->translation_status ) : ?> 21 21 <button class="reject" data-nonce="<?php echo esc_attr( wp_create_nonce( 'update-translation-status-rejected_' . $translation->id ) ); ?>" title="<?php esc_attr_e( 'Reject this translation. The existing translation will be kept as part of the translation history.', 'glotpress' ); ?>"><strong>−</strong> <?php _ex( 'Reject', 'Action', 'glotpress' ); ?></button> 22 <button class="changesrequested" style="display: none;" data-nonce="<?php echo esc_attr( wp_create_nonce( 'update-translation-status-changesrequested_' . $translation->id ) ); ?>" title="<?php esc_attr_e( 'Request changes for this translation. The existing translation will be kept as part of the translation history.', 'glotpress' ); ?>"><strong>−</strong> <?php _ex( 'Request changes', 'Action', 'glotpress' ); ?></button> 22 23 <?php endif; ?> 23 24 <?php if ( 'fuzzy' !== $translation->translation_status ) : ?> -
sites/trunk/wordpress.org/public_html/wp-content/plugins/gp-translation-helpers/templates/original-permalink.php
r11837 r12063 116 116 <a href="<?php echo esc_url( $translate_url ); ?>"><?php esc_html_e( 'This string has no translation in this language.' ); ?></a> 117 117 </p> 118 <?php else : ?>119 <p>120 <?php esc_html_e( 'This string has no translation in this language.' ); ?>121 </p>122 118 <?php endif; ?> 123 119 <div class="translations" row="<?php echo esc_attr( $row_id . ( $translation ? '-' . $translation->id : '' ) ); ?>" replytocom="<?php echo esc_attr( gp_get( 'replytocom' ) ); ?>" >
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)