Ticket #1365: 1365.diff
File 1365.diff, 9.8 KB (added by , 9 years ago) |
---|
-
translate/gp-plugins/wporg-projects-wp-plugins-overview.php
1 <?php 2 3 class GP_WPorg_Route_WP_Plugins extends GP_Route { 4 5 public function get_plugin_projects( $project_slug ) { 6 global $gpdb; 7 8 $project_path = 'wp-plugins/' . $project_slug; 9 $project = GP::$project->by_path( $project_path ); 10 if ( ! $project ) { 11 return $this->die_with_404(); 12 } 13 14 $rows = $gpdb->get_results( " 15 SELECT 16 path, locale, locale_slug, 17 (100 * stats.current/stats.all) as percent_complete, 18 stats.waiting+stats.fuzzy as waiting_strings 19 FROM {$gpdb->prefix}project_translation_status stats 20 LEFT JOIN {$gpdb->prefix}projects p ON stats.project_id = p.id 21 WHERE 22 p.path = '$project_path' 23 " ); 24 25 // Split out into $[Locale][Project] = % 26 $translation_locale_statuses = array(); 27 foreach ( $rows as $set ) { 28 29 // Find unique locale key. 30 $locale_key = $set->locale; 31 if ( 'default' != $set->locale_slug ) { 32 $locale_key = $set->locale . '/' . $set->locale_slug; 33 } 34 35 foreach ( $this->get_active_sub_projects( $project ) as $sub_project_id => $sub_project ) { 36 $translation_set = GP::$translation_set->by_project_id_slug_and_locale( 37 $sub_project_id, 38 $set->locale_slug, 39 $locale_key 40 ); 41 42 if ( $translation_set ) { 43 /* 44 * > 50% round down, so that a project with all strings except 1 translated shows 99%, instead of 100%. 45 * < 50% round up, so that a project with just a few strings shows 1%, instead of 0%. 46 */ 47 $percent_complete = (int) $translation_set->current_count() / (int) $translation_set->all_count() * 100; 48 $translation_locale_statuses[ $locale_key ][ $sub_project->slug ] = ( $percent_complete > 50 ) ? floor( $percent_complete ) : ceil( $percent_complete ); 49 50 // Increment the amount of waiting strings. 51 if ( ! isset( $translation_locale_statuses[ $locale_key ]['waiting'] ) ) { 52 $translation_locale_statuses[ $locale_key ]['waiting'] = 0; 53 } 54 $translation_locale_statuses[ $locale_key ]['waiting'] += (int) $translation_set->all_count() - (int) $translation_set->current_count(); 55 } 56 } 57 ksort( $translation_locale_statuses[ $locale_key ], SORT_NATURAL ); 58 } 59 unset( $project_path, $locale_key, $set, $sub_project_id, $sub_project, $translation_set ); 60 61 // Calculate a list of [Locale] = % subtotals 62 $translation_locale_complete = array(); 63 foreach ( $rows as $set ) { 64 $translation_locale_complete[ $set->locale ] = (float) $set->percent_complete; 65 } 66 unset( $rows, $set ); 67 68 // Sort by Percent Complete, secondly by Slug 69 uksort( $translation_locale_complete, function ( $a, $b ) use ( $translation_locale_complete ) { 70 if ( $translation_locale_complete[ $a ] < $translation_locale_complete[ $b ] ) { 71 return 1; 72 } elseif ( $translation_locale_complete[ $a ] == $translation_locale_complete[ $b ] ) { 73 return strnatcmp( $a, $b ); 74 } else { 75 return -1; 76 } 77 } ); 78 79 $project->icon = wporg_get_plugin_icon( $project->slug, 64 ); 80 81 $this->tmpl( 'project-wp-plugin', get_defined_vars() ); 82 } 83 84 /** 85 * Retrieves active sub projects. 86 * 87 * @param GP_Project $project The parent project 88 * @param bool $with_sub_projects Whether sub projects should be fetched too. 89 * Default false. 90 * @return array List of sub projects. 91 */ 92 private function get_active_sub_projects( $project, $with_sub_projects = false ) { 93 global $gpdb; 94 95 $_projects = $project->many( " 96 SELECT * 97 FROM {$gpdb->projects} 98 WHERE 99 parent_project_id = %d AND 100 active = 1 101 ORDER BY id ASC 102 ", $project->id ); 103 104 $projects = array(); 105 foreach ( $_projects as $project ) { 106 $projects[ $project->id ] = $project; 107 108 if ( $with_sub_projects ) { 109 // e.g. wp/dev/admin/network 110 $sub_projects = $project->many( " 111 SELECT * 112 FROM {$gpdb->projects} 113 WHERE 114 parent_project_id = %d AND 115 active = 1 116 ORDER BY id ASC 117 ", $project->id ); 118 119 foreach ( $sub_projects as $sub_project ) { 120 $projects[ $sub_project->id ] = $sub_project; 121 } 122 unset( $sub_projects); 123 } 124 } 125 unset( $_projects ); 126 127 return $projects; 128 } 129 } -
translate/gp-plugins/wporg-routes/wporg-routes.php
Property changes on: translate/gp-plugins/wporg-projects-wp-plugins-overview.php ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property
41 41 GP::$router->prepend( "/locale/$locale/$path", array( 'GP_WPorg_Route_Locale', 'get_locale_projects' ) ); 42 42 GP::$router->prepend( "/locale/$locale/$path/$path", array( 'GP_WPorg_Route_Locale', 'get_locale_projects' ) ); 43 43 GP::$router->prepend( "/locale/$locale/$path/$path/$path", array( 'GP_WPorg_Route_Locale', 'get_locale_project' ) ); 44 45 $project = '(.+?)'; 46 GP::$router->prepend( "/projects/wp-plugins/$project", array( 'GP_WPorg_Route_WP_Plugins', 'get_plugin_projects' ) ); 44 47 } 45 48 } 46 49 -
translate/gp-templates/projects-wp-plugins.php
1 <?php 2 3 $edit_link = gp_link_project_edit_get( $project, __('(edit)') ); 4 5 gp_title( sprintf( __( '%s < GlotPress' ), esc_html( $project->name ) ) ); 6 gp_breadcrumb_project( $project ); 7 8 wp_enqueue_script( 'common' ); 9 wp_enqueue_script( 'tablesorter' ); 10 11 gp_tmpl_header(); 12 ?> 13 14 <div class="project-header"> 15 <p class="project-description"><?php echo apply_filters( 'project_description', $project->description, $project ); ?></p> 16 17 <div class="project-box"> 18 <div class="project-box-header"> 19 <div class="project-icon"> 20 <?php echo $project->icon; ?> 21 </div> 22 23 <ul class="project-meta"> 24 <li class="project-name"><?php echo $project->name; ?> <?php echo $edit_link; ?></li> 25 </ul> 26 </div> 27 </div> 28 </div> 29 30 <div class="stats-table"> 31 <table id="stats-table" class="table"> 32 <thead> 33 <tr> 34 <th class="title"><?php _e( 'Locale' ); ?></th> 35 <th class="title"><?php _e( 'Development' ); ?></th> 36 <th class="title"><?php _e( 'Development Readme' ); ?></th> 37 <th class="title"><?php _e( 'Stable' ); ?></th> 38 <th class="title"><?php _e( 'Stable Readme' ); ?></th> 39 <th class="title"><?php _e( 'Waiting' ); ?></th> 40 </tr> 41 </thead> 42 <tbody> 43 <?php 44 foreach ( $translation_locale_complete as $locale_slug => $completeness ) : 45 $gp_locale = GP_Locales::by_slug( $locale_slug ); 46 $set_slug = 'default'; 47 // Variants (de/formal for example) don't have GP_Locales in this context 48 if ( ! $gp_locale && ( list( $base_locale_slug, $set_slug ) = explode( '/', $locale_slug ) ) ) { 49 $gp_locale = clone GP_Locales::by_slug( $base_locale_slug ); 50 // Just append it for now.. 51 $gp_locale->wp_locale .= '/' . $set_slug; 52 } 53 if ( ! $gp_locale || ! $gp_locale->wp_locale ) { 54 continue; 55 } 56 ?> 57 <tr> 58 <th title="<?php echo esc_attr( $gp_locale->english_name ); ?>"> 59 <a href="<?php echo gp_url_join( 'locale', $gp_locale->slug, $set_slug ); ?>"> 60 <?php echo esc_html( $gp_locale->english_name ); ?> 61 </a> 62 </th> 63 <?php 64 65 if ( $translation_locale_statuses[ $locale_slug ] ) { 66 foreach ( $translation_locale_statuses[ $locale_slug ] as $slug => $percent ) { 67 $projecturl = gp_url_join( 'locale', $gp_locale->slug, $set_slug, $project->path ); 68 69 if ( 'waiting' === $slug ) { 70 // Color code it on -0~500 waiting strings 71 $percent_class = 100-min( (int) ( $percent / 50 ) * 10, 100 ); 72 // It's only 100 if it has 0 strings. 73 if ( 100 == $percent_class && $percent ) { 74 $percent_class = 90; 75 } 76 $percent_class = 'percent' . $percent_class; 77 echo '<td data-sort-value="'. esc_attr( $percent ) . '" class="' . $percent_class .'"><a href="' . $projecturl . '">' . number_format( $percent ) . '</a></td>'; 78 } else { 79 $percent_class = 'percent' . (int) ( $percent / 10 ) * 10; 80 echo '<td data-sort-value="' . esc_attr( $percent ) . '" class="' . $percent_class .'">'; 81 gp_link( gp_url_project( $project->path, gp_url_join( $locale_slug, $set_slug ), array( 'filters[translated]' => 'yes', 'filters[status]' => 'current') ), "$percent%" ); 82 echo '</td>'; 83 } 84 } 85 } else { 86 echo '<td class="none" data-sort-value="-1">—</td>'; 87 echo '<td class="none" data-sort-value="-1">—</td>'; 88 echo '<td class="none" data-sort-value="-1">—</td>'; 89 echo '<td class="none" data-sort-value="-1">—</td>'; 90 echo '<td class="none" data-sort-value="-1">—</td>'; 91 } 92 ?> 93 </tr> 94 <?php endforeach; ?> 95 </tbody> 96 </table> 97 </div> 98 99 <script type="text/javascript"> 100 jQuery( function( $ ) { 101 $( '#stats-table' ).tablesorter( { 102 textExtraction: function( node ) { 103 var cellValue = $( node ).text(), 104 sortValue = $( node ).data( 'sortValue' ); 105 106 return ( undefined !== sortValue ) ? sortValue : cellValue; 107 } 108 }); 109 }); 110 </script> 111 112 <?php gp_tmpl_footer();