[ Index ] |
PHP Cross Reference of GlotPress |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Template for the translations table. 4 * 5 * @package GlotPress 6 * @subpackage Templates 7 */ 8 9 /** @var GP_Translation_Set $translation_set */ 10 11 gp_title( 12 sprintf( 13 /* translators: 1: Translation set name. 2: Project name. */ 14 __( 'Translations < %1$s < %2$s < GlotPress', 'glotpress' ), 15 $translation_set->name, 16 $project->name 17 ) 18 ); 19 gp_breadcrumb( 20 array( 21 gp_project_links_from_root( $project ), 22 gp_link_get( $url, $translation_set->name ), 23 ) 24 ); 25 gp_enqueue_scripts( array( 'gp-editor', 'gp-translations-page' ) ); 26 wp_localize_script( 27 'gp-translations-page', 28 '$gp_translations_options', 29 array( 30 'sort' => __( 'Sort', 'glotpress' ), 31 'filter' => __( 'Filter', 'glotpress' ), 32 ) 33 ); 34 35 // localizer adds var in front of the variable name, so we can't use $gp.editor.options 36 $editor_options = compact( 'can_approve', 'can_write', 'url', 'discard_warning_url', 'set_priority_url', 'set_status_url' ); 37 38 wp_localize_script( 'gp-editor', '$gp_editor_options', $editor_options ); 39 40 gp_tmpl_header(); 41 $i = 0; 42 ?> 43 44 <div class="gp-heading"> 45 <h2> 46 <?php 47 printf( 48 /* translators: 1: Project name. 2: Translation set name. */ 49 __( 'Translation of %1$s: %2$s', 'glotpress' ), 50 esc_html( $project->name ), 51 esc_html( $translation_set->name ) 52 ); 53 ?> 54 </h2> 55 <?php gp_link_set_edit( $translation_set, $project, _x( '(edit)', 'translation set', 'glotpress' ) ); ?> 56 <?php gp_link_set_delete( $translation_set, $project, _x( '(delete)', 'translation set', 'glotpress' ) ); ?> 57 <div class="glossary-links"> 58 <?php 59 $can_create_locale_glossary = GP::$permission->current_user_can( 'admin' ); 60 $locale_glossary_translation_set = GP::$translation_set->by_project_id_slug_and_locale( 0, $translation_set->slug, $translation_set->locale ); 61 $locale_glossary = GP::$glossary->by_set_id( $locale_glossary_translation_set->id ); 62 63 // Locale Glossary link. 64 if ( $locale_glossary ) { 65 ?> 66 <a href="<?php echo esc_url( gp_url_join( gp_url( '/languages' ), $locale->slug, $translation_set->slug, 'glossary' ) ); ?>" class="glossary-link"><?php _e( 'Locale Glossary', 'glotpress' ); ?></a> 67 <?php 68 } elseif ( $can_create_locale_glossary ) { 69 ?> 70 <a href="<?php echo esc_url( gp_url_join( gp_url( '/languages' ), $locale->slug, $translation_set->slug, 'glossary' ) ); ?>" class="glossary-link"><?php _e( 'Create Locale Glossary', 'glotpress' ); ?></a> 71 <?php 72 } 73 74 // Show separator if both links are shown. 75 if ( ( $locale_glossary || $can_create_locale_glossary ) && ( ( $glossary && $glossary->translation_set_id === $translation_set->id ) || $can_approve ) ) { 76 ?> 77 <strong class="separator">•</strong> 78 <?php 79 } 80 81 // Project Glossary link. 82 if ( $glossary && $glossary->translation_set_id === $translation_set->id ) { 83 echo gp_link( $glossary->path(), __( 'Project Glossary', 'glotpress' ), array( 'class' => 'glossary-link' ) ); 84 } elseif ( $can_approve ) { 85 echo gp_link_get( gp_url( '/glossaries/-new', array( 'translation_set_id' => $translation_set->id ) ), __( 'Create Project Glossary', 'glotpress' ), array( 'class' => 'glossary-link' ) ); 86 } 87 ?> 88 </div> 89 </div> 90 91 <div class="filter-toolbar"> 92 <form id="upper-filters-toolbar" class="filters-toolbar" action="" method="get" accept-charset="utf-8"> 93 <div> 94 <a href="#" class="revealing filter"><?php _e( 'Filter ↓', 'glotpress' ); ?></a> <span class="separator">•</span> 95 <a href="#" class="revealing sort"><?php _e( 'Sort ↓', 'glotpress' ); ?></a> <strong class="separator">•</strong> 96 <?php 97 $current_filter = ''; 98 $filter_links = array(); 99 100 // Use array_filter() to remove empty values, store them for use later if a custom filter has been applied. 101 $filters_values_only = array_filter( $filters ); 102 $sort_values_only = array_filter( $sort ); 103 $filters_and_sort = array_merge( $filters_values_only, $sort_values_only ); 104 105 /** 106 * Check to see if a term or user login has been added to the filter or one of the other filter options, if so, 107 * we don't want to match the standard filter links. 108 * 109 * Note: Don't check for the warnings filter here otherwise we won't be able to use this value during the check 110 * to see if the warnings filter link entry is the currently selected filter. 111 */ 112 $additional_filters = array_key_exists( 'term', $filters_and_sort ) || 113 array_key_exists( 'user_login', $filters_and_sort ) || 114 array_key_exists( 'with_comment', $filters_and_sort ) || 115 array_key_exists( 'case_sensitive', $filters_and_sort ) || 116 array_key_exists( 'with_plural', $filters_and_sort ) || 117 array_key_exists( 'with_context', $filters_and_sort ); 118 119 // Because 'warnings' is not a translation status we need to know if we're filtering on it before we check 120 // for what filter links to add. 121 $warnings_filter = array_key_exists( 'warnings', $filters_and_sort ); 122 123 $all_filters = array( 124 'status' => 'current_or_waiting_or_fuzzy_or_untranslated', 125 ); 126 127 $current_filter_class = array( 128 'class' => 'filter-current', 129 ); 130 131 $is_current_filter = ( array() === array_diff( $all_filters, $filters_and_sort ) || array() === $filters_and_sort ) && ! $additional_filters && ! $warnings_filter; 132 $current_filter = $is_current_filter ? 'all' : $current_filter; 133 134 $filter_links[] = gp_link_get( 135 $url, 136 // Translators: %s is the total strings count for the current translation set. 137 sprintf( __( 'All (%s)', 'glotpress' ), number_format_i18n( $translation_set->all_count() ) ), 138 $is_current_filter ? $current_filter_class : array() 139 ); 140 141 $translated_filters = array( 142 'filters[status]' => 'current', 143 ); 144 145 $is_current_filter = array() === array_diff( $translated_filters, $filters_and_sort ) && false === $additional_filters && ! $warnings_filter; 146 $current_filter = $is_current_filter ? 'translated' : $current_filter; 147 148 $filter_links[] = gp_link_get( 149 add_query_arg( $translated_filters, $url ), 150 // Translators: %s is the translated strings count for the current translation set. 151 sprintf( __( 'Translated (%s)', 'glotpress' ), number_format_i18n( $translation_set->current_count() ) ), 152 $is_current_filter ? $current_filter_class : array() 153 ); 154 155 $untranslated_filters = array( 156 'filters[status]' => 'untranslated', 157 ); 158 159 $is_current_filter = array() === array_diff( $untranslated_filters, $filters_and_sort ) && false === $additional_filters && ! $warnings_filter; 160 $current_filter = $is_current_filter ? 'untranslated' : $current_filter; 161 162 $filter_links[] = gp_link_get( 163 add_query_arg( $untranslated_filters, $url ), 164 // Translators: %s is the untranslated strings count for the current translation set. 165 sprintf( __( 'Untranslated (%s)', 'glotpress' ), number_format_i18n( $translation_set->untranslated_count() ) ), 166 $is_current_filter ? $current_filter_class : array() 167 ); 168 169 $waiting_filters = array( 170 'filters[status]' => 'waiting', 171 ); 172 173 $is_current_filter = array() === array_diff( $waiting_filters, $filters_and_sort ) && ! $additional_filters && ! $warnings_filter; 174 $current_filter = $is_current_filter ? 'waiting' : $current_filter; 175 176 $filter_links[] = gp_link_get( 177 add_query_arg( $waiting_filters, $url ), 178 // Translators: %s is the waiting strings count for the current translation set. 179 sprintf( __( 'Waiting (%s)', 'glotpress' ), number_format_i18n( $translation_set->waiting_count() ) ), 180 $is_current_filter ? $current_filter_class : array() 181 ); 182 183 $fuzzy_filters = array( 184 'filters[status]' => 'fuzzy', 185 ); 186 187 $is_current_filter = array() === array_diff( $fuzzy_filters, $filters_and_sort ) && ! $additional_filters && ! $warnings_filter; 188 $current_filter = $is_current_filter ? 'fuzzy' : $current_filter; 189 190 $filter_links[] = gp_link_get( 191 add_query_arg( $fuzzy_filters, $url ), 192 // Translators: %s is the fuzzy strings count for the current translation set. 193 sprintf( __( 'Fuzzy (%s)', 'glotpress' ), number_format_i18n( $translation_set->fuzzy_count() ) ), 194 $is_current_filter ? $current_filter_class : array() 195 ); 196 197 $warning_filters = array( 198 'filters[warnings]' => 'yes', 199 ); 200 201 $is_current_filter = array() === array_diff( $warning_filters, $filters_and_sort ) && ! $additional_filters && ! array_key_exists( 'status', $filters_and_sort ); 202 $current_filter = $is_current_filter ? 'warning' : $current_filter; 203 204 $filter_links[] = gp_link_get( 205 add_query_arg( $warning_filters, $url ), 206 // Translators: %s is the strings with warnings count for the current translation set. 207 sprintf( __( 'Warnings (%s)', 'glotpress' ), number_format_i18n( $translation_set->warnings_count() ) ), 208 $is_current_filter ? $current_filter_class : array() 209 ); 210 211 // If no filter has been selected yet, then add the current filter count to the end of the filter links array. 212 if ( '' === $current_filter ) { 213 // Build an array or query args to add to the link using the current sort/filter options. 214 $custom_filter = array(); 215 216 foreach ( $filters_values_only as $key => $value ) { 217 $custom_filter[ 'filters[' . $key . ']' ] = $value; 218 } 219 220 foreach ( $sort_values_only as $key => $value ) { 221 $custom_filter[ 'sort[' . $key . ']' ] = $value; 222 } 223 224 $filter_links[] = gp_link_get( 225 add_query_arg( $custom_filter, $url ), 226 // Translators: %s is the strings with the current filter count for the current translation set. 227 sprintf( __( 'Current Filter (%s)', 'glotpress' ), number_format_i18n( $total_translations_count ) ), 228 $current_filter_class 229 ); 230 } 231 232 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped 233 echo implode( ' <span class="separator">•</span> ', $filter_links ); 234 ?> 235 </div> 236 <div class="filters-expanded filters hidden"> 237 <div class="filters-expanded-section"> 238 <fieldset> 239 <legend class="screen-reader-text"><?php _e( 'Search:', 'glotpress' ); ?></legend> 240 <label for="filters[term]" class="filter-title"><?php _e( 'Search Term:', 'glotpress' ); ?></label><br /> 241 <input type="text" value="<?php echo gp_esc_attr_with_entities( gp_array_get( $filters, 'term' ) ); ?>" name="filters[term]" id="filters[term]" /><br /> 242 <input type="checkbox" name="filters[case_sensitive]" value="yes" id="filters[case_sensitive][yes]" <?php gp_checked( 'yes' === gp_array_get( $filters, 'case_sensitive' ) ); ?>> <label for='filters[case_sensitive][yes]'><?php _e( 'Case-sensitive search', 'glotpress' ); ?></label> 243 </fieldset> 244 245 <fieldset> 246 <legend class="filter-title"><?php _e( 'Term Scope:', 'glotpress' ); ?></legend> 247 <?php 248 echo gp_radio_buttons( 249 'filters[term_scope]', 250 array( 251 'scope_originals' => __( 'Originals only', 'glotpress' ), 252 'scope_translations' => __( 'Translations only', 'glotpress' ), 253 'scope_context' => __( 'Context only', 'glotpress' ), 254 'scope_references' => __( 'References only', 'glotpress' ), 255 'scope_both' => __( 'Both Originals and Translations', 'glotpress' ), 256 'scope_any' => __( 'Any', 'glotpress' ), 257 ), 258 gp_array_get( $filters, 'term_scope', 'scope_any' ) 259 ); 260 ?> 261 </fieldset> 262 </div> 263 264 <div class="filters-expanded-section"> 265 <fieldset id="filter-status-fields"> 266 <legend class="filter-title"><?php _e( 'Status:', 'glotpress' ); ?></legend> 267 <?php 268 $selected_status = gp_array_get( $filters, 'status', 'current_or_waiting_or_fuzzy_or_untranslated' ); 269 $selected_status_list = explode( '_or_', $selected_status ); 270 ?> 271 <label for="filters[status][current]"> 272 <input type="checkbox" value="current" id="filters[status][current]" <?php gp_checked( 'either' === $selected_status || in_array( 'current', $selected_status_list, true ) ); ?>> 273 <?php _e( 'Current', 'glotpress' ); ?> 274 </label><br /> 275 <label for="filters[status][waiting]"> 276 <input type="checkbox" value="waiting" id="filters[status][waiting]" <?php gp_checked( 'either' === $selected_status || in_array( 'waiting', $selected_status_list, true ) ); ?>> 277 <?php _e( 'Waiting', 'glotpress' ); ?> 278 </label><br /> 279 <label for="filters[status][fuzzy]"> 280 <input type="checkbox" value="fuzzy" id="filters[status][fuzzy]" <?php gp_checked( 'either' === $selected_status || in_array( 'fuzzy', $selected_status_list, true ) ); ?>> 281 <?php _e( 'Fuzzy', 'glotpress' ); ?> 282 </label><br /> 283 <label for="filters[status][untranslated]"> 284 <input type="checkbox" value="untranslated" id="filters[status][untranslated]" <?php gp_checked( in_array( 'untranslated', $selected_status_list, true ) ); ?>> 285 <?php _e( 'Untranslated', 'glotpress' ); ?> 286 </label><br /> 287 <label for="filters[status][rejected]"> 288 <input type="checkbox" value="rejected" id="filters[status][rejected]" <?php gp_checked( 'either' === $selected_status || in_array( 'rejected', $selected_status_list, true ) ); ?>> 289 <?php _e( 'Rejected', 'glotpress' ); ?> 290 </label><br /> 291 <label for="filters[status][old]"> 292 <input type="checkbox" value="old" id="filters[status][old]" <?php gp_checked( 'either' === $selected_status || in_array( 'old', $selected_status_list, true ) ); ?>> 293 <?php _e( 'Old', 'glotpress' ); ?> 294 </label><br /> 295 <button type="button" id="filter-status-select-all" class="button is-link"><?php _e( 'Select all', 'glotpress' ); ?></button> 296 <input type="hidden" id="filter-status-selected" name="filters[status]" value="<?php echo esc_attr( $selected_status ); ?>" /> 297 </fieldset> 298 </div> 299 300 <div class="filters-expanded-section"> 301 <fieldset> 302 <legend class="filter-title"><?php _e( 'Options:', 'glotpress' ); ?></legend> 303 <input type="checkbox" name="filters[with_comment]" value="yes" id="filters[with_comment][yes]" <?php gp_checked( 'yes' === gp_array_get( $filters, 'with_comment' ) ); ?>> <label for='filters[with_comment][yes]'><?php _e( 'With comment', 'glotpress' ); ?></label><br /> 304 <input type="checkbox" name="filters[with_context]" value="yes" id="filters[with_context][yes]" <?php gp_checked( 'yes' === gp_array_get( $filters, 'with_context' ) ); ?>> <label for='filters[with_context][yes]'><?php _e( 'With context', 'glotpress' ); ?></label><br /> 305 <input type="checkbox" name="filters[warnings]" value="yes" id="filters[warnings][yes]" <?php gp_checked( 'yes' === gp_array_get( $filters, 'warnings' ) ); ?>> <label for='filters[warnings][yes]'><?php _e( 'With warnings', 'glotpress' ); ?></label><br /> 306 <input type="checkbox" name="filters[with_plural]" value="yes" id="filters[with_plural][yes]" <?php gp_checked( 'yes' === gp_array_get( $filters, 'with_plural' ) ); ?>> <label for='filters[with_plural][yes]'><?php _e( 'With plural', 'glotpress' ); ?></label> 307 </fieldset> 308 </div> 309 310 <div class="filters-expanded-section"> 311 <label for="filters[user_login]" class="filter-title"><?php _e( 'User:', 'glotpress' ); ?></label><br /> 312 <input type="text" value="<?php echo gp_esc_attr_with_entities( gp_array_get( $filters, 'user_login' ) ); ?>" name="filters[user_login]" id="filters[user_login]" /><br /> 313 </div> 314 315 <?php 316 /** 317 * Fires after the translation set filters options. 318 * 319 * This action is inside a DL element. 320 * 321 * @since 2.1.0 322 */ 323 do_action( 'gp_translation_set_filters_form' ); 324 ?> 325 326 <div class="filters-expanded-actions"> 327 <input type="submit" class="button is-primary" value="<?php esc_attr_e( 'Apply Filters', 'glotpress' ); ?>" name="filter" /> 328 </div> 329 </div> 330 <div class="filters-expanded sort hidden"> 331 <div class="filters-expanded-section"> 332 <fieldset> 333 <legend class="filter-title"><?php _ex( 'By:', 'sort by', 'glotpress' ); ?></legend> 334 <?php 335 $default_sort = get_user_option( 'gp_default_sort' ); 336 if ( ! is_array( $default_sort ) ) { 337 $default_sort = array( 338 'by' => 'priority', 339 'how' => 'desc', 340 ); 341 } 342 343 $sort_bys = wp_list_pluck( gp_get_sort_by_fields(), 'title' ); 344 echo gp_radio_buttons( 'sort[by]', $sort_bys, gp_array_get( $sort, 'by', $default_sort['by'] ) ); 345 ?> 346 </fieldset> 347 </div> 348 349 <div class="filters-expanded-section"> 350 <fieldset> 351 <legend class="filter-title"><?php _e( 'Order:', 'glotpress' ); ?></legend> 352 <?php 353 echo gp_radio_buttons( 354 'sort[how]', 355 array( 356 'asc' => __( 'Ascending', 'glotpress' ), 357 'desc' => __( 'Descending', 'glotpress' ), 358 ), 359 gp_array_get( $sort, 'how', $default_sort['how'] ) 360 ); 361 ?> 362 </fieldset> 363 </div> 364 365 <?php 366 /** 367 * Fires after the translation set sort options. 368 * 369 * This action is inside a DL element. 370 * 371 * @deprecated 2.1.0 Call gp_translation_set_sort_form instead 372 * @since 1.0.0 373 */ 374 do_action( 'gp_translation_set_filters' ); 375 376 /** 377 * Fires after the translation set sort options. 378 * 379 * This action is inside a DL element. 380 * 381 * @since 2.1.0 382 */ 383 do_action( 'gp_translation_set_sort_form' ); 384 ?> 385 386 <div class="filters-expanded-actions"> 387 <input type="submit" class="button is-primary" value="<?php esc_attr_e( 'Apply Sorting', 'glotpress' ); ?>" name="sorts" /> 388 </div> 389 </div> 390 </form> 391 </div> 392 393 <div class="gp-table-actions top"> 394 <?php 395 if ( $can_approve ) { 396 gp_translations_bulk_actions_toolbar( $bulk_action, $can_write, $translation_set, 'top' ); 397 } 398 399 echo gp_pagination( $page, $per_page, $total_translations_count ); 400 ?> 401 </div> 402 403 <?php $class_rtl = 'rtl' === $locale->text_direction ? ' translation-sets-rtl' : ''; ?> 404 <table id="translations" class="gp-table translations <?php echo esc_attr( $class_rtl ); ?>"> 405 <thead> 406 <tr> 407 <?php 408 if ( $can_approve ) : 409 ?> 410 <th class="gp-column-checkbox checkbox" scope="row"><input type="checkbox" /></th> 411 <?php 412 endif; 413 ?> 414 <th class="gp-column-priority"><?php /* Translators: Priority */ _e( 'Prio', 'glotpress' ); ?></th> 415 <th class="gp-column-original"><?php _e( 'Original string', 'glotpress' ); ?></th> 416 <th class="gp-column-translation"><?php _e( 'Translation', 'glotpress' ); ?></th> 417 <th class="gp-column-actions">—</th> 418 </tr> 419 </thead> 420 <?php 421 foreach ( $translations as $translation ) { 422 if ( ! $translation->translation_set_id ) { 423 $translation->translation_set_id = $translation_set->id; 424 } 425 426 $can_approve_translation = GP::$permission->current_user_can( 'approve', 'translation', $translation->id, array( 'translation' => $translation ) ); 427 gp_tmpl_load( 'translation-row', get_defined_vars() ); 428 } 429 ?> 430 <?php 431 if ( ! $translations ) : 432 ?> 433 <tr><td colspan="<?php echo $can_approve ? 5 : 4; ?>"><?php _e( 'No translations were found!', 'glotpress' ); ?></td></tr> 434 <?php 435 endif; 436 ?> 437 </table> 438 439 <div class="gp-table-actions bottom"> 440 <?php 441 if ( $can_approve ) { 442 gp_translations_bulk_actions_toolbar( $bulk_action, $can_write, $translation_set, 'bottom' ); 443 } 444 ?> 445 <div id="legend"> 446 <div><strong><?php _e( 'Legend:', 'glotpress' ); ?></strong></div> 447 <?php 448 foreach ( GP::$translation->get_static( 'statuses' ) as $legend_status ) : 449 ?> 450 <div class="box status-<?php echo esc_attr( $legend_status ); ?>"></div> 451 <div> 452 <?php 453 switch ( $legend_status ) { 454 case 'current': 455 _e( 'Current', 'glotpress' ); 456 break; 457 case 'waiting': 458 _e( 'Waiting', 'glotpress' ); 459 break; 460 case 'fuzzy': 461 _e( 'Fuzzy', 'glotpress' ); 462 break; 463 case 'old': 464 _e( 'Old', 'glotpress' ); 465 break; 466 case 'rejected': 467 _e( 'Rejected', 'glotpress' ); 468 break; 469 default: 470 echo esc_html( $legend_status ); 471 } 472 ?> 473 </div> 474 <?php 475 endforeach; 476 ?> 477 <div class="box has-warnings"></div> 478 <div><?php _e( 'With warnings', 'glotpress' ); ?></div> 479 </div> 480 <?php echo gp_pagination( $page, $per_page, $total_translations_count ); ?> 481 </div> 482 483 <p class="actionlist"> 484 <?php 485 $footer_links = array(); 486 if ( ( isset( $can_import_current ) && $can_import_current ) || ( isset( $can_import_waiting ) && $can_import_waiting ) ) { 487 $footer_links[] = gp_link_get( gp_url_project( $project, array( $locale->slug, $translation_set->slug, 'import-translations' ) ), __( 'Import Translations', 'glotpress' ) ); 488 } 489 490 /** 491 * The 'default' filter is 'Current/waiting/fuzzy + untranslated (All)', however that is not 492 * the default action when exporting so make sure to set it on the export link if no filter 493 * has been activated by the user. 494 */ 495 if ( ! array_key_exists( 'status', $filters ) ) { 496 $filters['status'] = 'current_or_waiting_or_fuzzy_or_untranslated'; 497 } 498 499 $export_url = gp_url_project( $project, array( $locale->slug, $translation_set->slug, 'export-translations' ) ); 500 $export_link = gp_link_get( 501 $export_url, 502 __( 'Export', 'glotpress' ), 503 array( 504 'id' => 'export', 505 'filters' => add_query_arg( array( 'filters' => $filters ), $export_url ), 506 ) 507 ); 508 $format_options = array(); 509 foreach ( GP::$formats as $slug => $format ) { 510 $format_options[ $slug ] = $format->name; 511 } 512 $what_dropdown = gp_select( 513 'what-to-export', 514 array( 515 'all' => _x( 'all current', 'export choice', 'glotpress' ), 516 'filtered' => _x( 'only matching the filter', 'export choice', 'glotpress' ), 517 ), 518 'all' 519 ); 520 $format_dropdown = gp_select( 'export-format', $format_options, 'po' ); 521 /* translators: 1: export 2: what to export dropdown (all/filtered) 3: export format */ 522 $footer_links[] = sprintf( __( '%1$s %2$s as %3$s', 'glotpress' ), $export_link, $what_dropdown, $format_dropdown ); 523 524 /** 525 * Filter footer links in translations. 526 * 527 * @since 1.0.0 528 * 529 * @param array $footer_links Default links. 530 * @param GP_Project $project The current project. 531 * @param GP_Locale $locale The current locale. 532 * @param GP_Translation_Set $translation_set The current translation set. 533 */ 534 $footer_links = apply_filters( 'gp_translations_footer_links', $footer_links, $project, $locale, $translation_set ); 535 536 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped 537 echo implode( ' • ', $footer_links ); 538 ?> 539 </p> 540 <?php 541 gp_tmpl_footer();
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Nov 21 01:01:07 2024 | Cross-referenced by PHPXref 0.7.1 |