WordPress.org

Make WordPress Core

Ticket #18200: lp.6.diff

File lp.6.diff, 14.2 KB (added by dimadin, 5 years ago)
  • wp-admin/includes/class-wp-upgrader.php

     
    10831083
    10841084}
    10851085
     1086add_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20, 3 );
     1087class Language_Pack_Upgrader extends WP_Upgrader {
     1088
     1089        var $result;
     1090        var $bulk = true;
     1091
     1092        static function async_upgrade( $upgrader, $context, $package ) {
     1093                // Don't do Language updates on language updates on language updates..
     1094                if ( $upgrader instanceof Language_Pack_Upgrader )
     1095                        return;
     1096
     1097                echo '<!-- start languages --><div style="padding-left: 3em; border-left: 5px solid grey">';
     1098
     1099                $lp_upgrader = new Language_Pack_Upgrader( new Headerless_Skin() );
     1100
     1101                $lp_upgrader->upgrade();
     1102
     1103                echo '</div><!-- end of languages -->';
     1104        }
     1105
     1106        function upgrade_strings() {
     1107                $this->strings['starting_upgrade'] = __( 'Some of your language files need updating, Sit tight for a few more seconds while we update them as well.' );
     1108                $this->strings['up_to_date'] = __('The language is up to date.'); // We need to silently skip this case
     1109                $this->strings['no_package'] = __('Update package not available.');
     1110                $this->strings['downloading_package'] = __('Downloading language update from <span class="code">%s</span>&#8230;');
     1111                $this->strings['unpack_package'] = __('Unpacking the update&#8230;');
     1112                $this->strings['remove_old'] = __('Removing the old version of the language&#8230;');
     1113                $this->strings['remove_old_failed'] = __('Could not remove the old language.');
     1114                $this->strings['process_failed'] = __('Language update failed.');
     1115                $this->strings['process_success'] = __('Language updated successfully.');
     1116        }
     1117
     1118        function upgrade() {
     1119                return $this->bulk_upgrade();
     1120        }
     1121
     1122        function bulk_upgrade() {
     1123
     1124                $this->init();
     1125                $this->upgrade_strings();
     1126
     1127                $language_updates = get_language_updates();
     1128
     1129                if ( empty( $language_updates ) )
     1130                        return true;
     1131
     1132                $this->skin->feedback( 'starting_upgrade' );
     1133
     1134                add_filter( 'upgrader_source_selection', array( &$this, 'check_package' ), 10, 3 );
     1135
     1136                $this->skin->header();
     1137
     1138                // Connect to the Filesystem first.
     1139                $res = $this->fs_connect( array( WP_CONTENT_DIR, WP_LANG_DIR ) );
     1140                if ( ! $res ) {
     1141                        $this->skin->footer();
     1142                        return false;
     1143                }
     1144
     1145                $results = array();
     1146
     1147                $this->update_count = count( $language_updates );
     1148                $this->update_current = 0;
     1149                foreach ( $language_updates as $language_update ) {
     1150
     1151                        $destination = WP_LANG_DIR;
     1152                        if ( 'plugin' == $language_update->type ) {
     1153                                $destination .= '/plugins';
     1154                        } elseif ( 'theme' == $language_update->type ) {
     1155                                $destination .= '/themes';
     1156                        }
     1157
     1158                        $this->update_current++;
     1159
     1160                        $options = array(
     1161                                'package' => $language_update->package,
     1162                                'destination' => $destination,
     1163                                'clear_destination' => false,
     1164                                'abort_if_destination_exists' => false, // We expect the destination to exist.
     1165                                'clear_working' => true,
     1166                                'is_multi' => true,
     1167                                'hook_extra' => array(
     1168                                        'language_update_type' => $language_update->type,
     1169                                        'language_update' => $language_update,
     1170                                )
     1171                        );
     1172
     1173                        $result = $this->run( $options );
     1174
     1175                        $results[] = $this->result;
     1176
     1177                        // Prevent credentials auth screen from displaying multiple times
     1178                        if ( false === $result )
     1179                                break;
     1180                } //end foreach $language_updates
     1181
     1182                // Cleanup our hooks, in case something else does a upgrade on this connection.
     1183                remove_filter( 'upgrader_source_selection', array( &$this, 'check_package' ), 10, 2 );
     1184
     1185                return $results;
     1186        }
     1187
     1188        function check_package( $source, $remote_source ) {
     1189                global $wp_filesystem;
     1190
     1191                if ( is_wp_error( $source ) )
     1192                        return $source;
     1193
     1194                // Check the folder contains a valid language
     1195                $files = $wp_filesystem->dirlist( $remote_source );
     1196
     1197                // Check to see if a .po and .mo exist in the folder..
     1198                $po = $mo = false;
     1199                foreach ( (array)$files as $file => $filedata ) {
     1200                        if ( '.po' == substr( $file, -3 ) )
     1201                                $po = true;
     1202                        elseif ( '.mo' == substr( $file, -3 ) )
     1203                                $mo = true;
     1204                }
     1205
     1206                if ( ! $mo || ! $po )
     1207                        return new WP_Error( 'incompatible_archive', $this->strings['incompatible_archive'], __( 'The language pack is missing either the <code>.po</code> or <code>.mo</code> files.' ) );
     1208
     1209                return $source;
     1210        }
     1211
     1212}
     1213
    10861214/**
    10871215 * Generic Skin for the WordPress Upgrader classes. This skin is designed to be extended for specific purposes.
    10881216 *
     
    11741302}
    11751303
    11761304/**
     1305 * A basic Upgrader skin which doesn't have any Header/Footers
     1306 *
     1307 * @package WordPress
     1308 * @subpackage Upgrader
     1309 * @since 3.7.0
     1310 */
     1311class Headerless_Skin extends WP_Upgrader_Skin {
     1312        function before() {}
     1313        function after() {}
     1314        function header() {}
     1315        function footer() {}
     1316}
     1317
     1318/**
    11771319 * Plugin Upgrader Skin for WordPress Plugin Upgrades.
    11781320 *
    11791321 * @TODO More Detailed docs, for methods as well.
  • wp-admin/includes/update.php

     
    308308        echo "<div class='update-nag'>$msg</div>";
    309309}
    310310add_action( 'admin_notices', 'maintenance_nag' );
     311
     312// Retrieves a list of all language updates available.
     313function get_language_updates() {
     314
     315        $updates = array();
     316        foreach ( array( 'update_core' => 'core', 'update_plugins' => 'plugin', 'update_themes' => 'theme' ) as $transient => $type ) {
     317
     318                $transient = get_site_transient( $transient );
     319                if ( empty( $transient->language_updates ) )
     320                        continue;
     321
     322                foreach ( (array)$transient->language_updates as $update ) {
     323                        if ( empty( $update->type ) )
     324                                $update->type = $type;
     325
     326                        $updates[] = $update;
     327                }
     328        }
     329
     330        return $updates;
     331
     332/*      // Expected content:
     333        return array(
     334                        (object)array(
     335                                                'type' => 'core',
     336                                                'lang' => 'de_DE', // The language it is.. This isn't currently used anywhere
     337                                                'version' => '2012-02-18 08:48:04', // New Version - Nothing looks at this either.
     338                                                'package' => 'http://core-downloads/core-de_DE.zip'
     339                                                ),
     340                        (object)array(
     341                                                'type' => 'plugin', // The type of the upgrade, 'plugin' or 'theme' will throw files into that folder, any other name (ie. 'core') is thrown into WP_LANG_DIR..
     342                                                'slug' => 'akismet', // not used.
     343                                                'for' => 'akismet/akismet.php', // again, not used yet.
     344                                                'lang' => 'de_DE',
     345                                                'version' => '2012-02-18 08:48:04',
     346                                                'package' => 'http://core-downloads/akismet-de_DE.zip'
     347                                                ),
     348                        (object)array(
     349                                                'type' => 'theme',
     350                                                'slug' => 'twentytwelve',
     351                                                'lang' => 'de_DE',
     352                                                'version' => '2012-02-18 08:48:04',
     353                                                'package' => 'http://core-downloads/twentytwelve-de_DE.zip' // And no, this isn't a translation of 2012, I believe it's a out of date Core set.
     354                                                ),
     355                );
     356Zip file expected format:
     357./akismet-de_DE.mo
     358./akismet-de_DE.po
     359(ie. Language files bundled together in root, other files such as .php and .css would be kept with it)
     360*/
     361}
     362 No newline at end of file
  • wp-includes/l10n.php

     
    572572        }
    573573
    574574        return $languages;
    575 }
    576  No newline at end of file
     575}
     576
     577// Returns a list of translation files and their details.
     578function get_installed_language_files( $type = false ) {
     579        $language_files = array();
     580
     581        if ( ! is_dir( WP_LANG_DIR ) )
     582                return $language_files;
     583
     584        $dirs_to_check = array( WP_LANG_DIR );
     585        foreach ( (array)glob( WP_LANG_DIR . '/*', GLOB_ONLYDIR) as $dir )
     586                $dirs_to_check[] = $dir;
     587
     588        foreach ( $dirs_to_check as $dir ) {
     589                foreach ( (array)glob( $dir . '/*.po') as $lang_file ) {
     590                        $lang_file = str_replace( trailingslashit( WP_LANG_DIR ), '', $lang_file );
     591
     592                        $file_data = get_translation_file_data( $lang_file );
     593                        $file_data['file'] = basename( $lang_file );
     594                        $file_data['type'] = dirname( $lang_file );
     595                        if ( '.' == $file_data['type'] )
     596                                $file_data['type'] = 'core';                           
     597
     598                        if ( $type && $type != $file_data['type'] )
     599                                continue;
     600
     601                        if ( preg_match( '!(.*?)-?([a-z]{2}_[a-z]{2})?\.po!i', $file_data['file'], $lang_match ) ) {
     602                                $file_data['slug'] = $lang_match[1];
     603                                if ( isset( $lang_match[2] ) )
     604                                        $file_data['language'] = $lang_match[2];
     605                        }
     606
     607                        $language_files[] = $file_data;
     608                }
     609        }
     610
     611        return $language_files;
     612}
     613
     614// retrieves the date/generator/project-id headers from a po file relative to WP_LANG_DIR
     615function get_translation_file_data( $file ) {
     616        // Just incase someone calls with the machine file instead of the textual version
     617        $file = preg_replace( '!\.mo$!i', '.po', $file );
     618
     619        // Lets just assume that it's within the WP_LANG_DIR for now
     620        // if we keep track of the loaded text domains later, we can probably include a lookup for the location of the files instead.
     621        $data = get_file_data(  WP_LANG_DIR . '/' . $file, array(
     622                        'date' => '"PO-Revision-Date',
     623                        'generator' => '"X-Generator',
     624                        'project-id' => '"Project-Id-Version'
     625        ) );
     626
     627        // Strip the .po field endings off the values, which may, or may not, include a textual \n
     628        foreach ( (array)$data as $key => $value )
     629                $data[ $key ] = preg_replace( '!(\\\n)?"$!', '', $value );
     630
     631        return $data;
     632 }
     633 No newline at end of file
  • wp-includes/update.php

     
    6464                $wp_install = home_url( '/' );
    6565        }
    6666
     67        $installed_languages = get_installed_language_files( 'core' );
     68
    6769        $query = array(
    6870                'version'           => $wp_version,
    6971                'php'               => $php_version,
     
    8082        $options = array(
    8183                'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3 ),
    8284                'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ),
     85                'body' => array( 'installed_languages' => serialize( $installed_languages ) ),
    8386                'headers' => array(
    8487                        'wp_install' => $wp_install,
    8588                        'wp_blog' => home_url( '/' )
    8689                )
    8790        );
    8891
    89         $response = wp_remote_get($url, $options);
     92        $response = wp_remote_post( $url, $options );
    9093
    9194        if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) )
    9295                return false;
     
    117120        $updates->updates = $offers;
    118121        $updates->last_checked = time();
    119122        $updates->version_checked = $wp_version;
     123        if ( isset( $body['language_updates'] ) )
     124                $updates->language_updates = $body['language_updates'];
    120125        set_site_transient( 'update_core',  $updates);
    121126}
    122127
     
    154159
    155160        // Check for update on a different schedule, depending on the page.
    156161        switch ( current_filter() ) {
     162                case 'upgrader_process_complete':
     163                        $timeout = 0;
     164                        break;
    157165                case 'load-update-core.php' :
    158166                        $timeout = MINUTE_IN_SECONDS;
    159167                        break;
     
    194202        $current->last_checked = time();
    195203        set_site_transient( 'update_plugins', $current );
    196204
     205        $installed_languages = get_installed_language_files( 'plugins' );
     206
    197207        $to_send = (object) compact('plugins', 'active');
    198208
    199209        $options = array(
    200210                'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3),
    201                 'body' => array( 'plugins' => serialize( $to_send ) ),
     211                'body' => array( 'plugins' => serialize( $to_send ), 'installed_languages' => serialize( $installed_languages ) ),
    202212                'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' )
    203213        );
    204214
    205         $raw_response = wp_remote_post('http://api.wordpress.org/plugins/update-check/1.0/', $options);
     215        $raw_response = wp_remote_post( 'http://api.wordpress.org/plugins/update-check/1.0/', $options );
    206216
    207217        if ( is_wp_error( $raw_response ) || 200 != wp_remote_retrieve_response_code( $raw_response ) )
    208218                return false;
    209219
    210220        $response = maybe_unserialize( wp_remote_retrieve_body( $raw_response ) );
    211221
    212         if ( is_array( $response ) )
     222        if ( is_array( $response ) ) {
     223                if ( isset( $response['language_updates'] ) ) {
     224                        $new_option->language_updates = $response['language_updates'];
     225                        unset( $response['language_updates'] );
     226                }
    213227                $new_option->response = $response;
    214         else
     228        } else {
    215229                $new_option->response = array();
     230        }
    216231
    217232        set_site_transient( 'update_plugins', $new_option );
    218233}
     
    263278
    264279        // Check for update on a different schedule, depending on the page.
    265280        switch ( current_filter() ) {
     281                case 'upgrader_process_complete':
     282                        $timeout = 0;
     283                        break;
    266284                case 'load-update-core.php' :
    267285                        $timeout = MINUTE_IN_SECONDS;
    268286                        break;
     
    301319        $last_update->last_checked = time();
    302320        set_site_transient( 'update_themes', $last_update );
    303321
     322        $installed_languages = get_installed_language_files( 'themes' );
     323
    304324        $options = array(
    305325                'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3),
    306                 'body'                  => array( 'themes' => serialize( $themes ) ),
     326                'body'                  => array( 'themes' => serialize( $themes ), 'installed_languages' => serialize( $installed_languages ) ),
    307327                'user-agent'    => 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' )
    308328        );
    309329
     
    317337        $new_update->checked = $checked;
    318338
    319339        $response = maybe_unserialize( wp_remote_retrieve_body( $raw_response ) );
    320         if ( is_array( $response ) )
     340
     341        if ( is_array( $response ) ) {
     342                if ( isset( $response['language_updates'] ) ) {
     343                        $new_update->language_updates = $response['language_updates'];
     344                        unset( $response['language_updates'] );
     345                }
    321346                $new_update->response = $response;
     347        }
    322348
    323349        set_site_transient( 'update_themes', $new_update );
    324350}
     
    433459
    434460add_action( 'admin_init', '_maybe_update_core' );
    435461add_action( 'wp_version_check', 'wp_version_check' );
     462add_action( 'upgrader_process_complete', 'wp_version_check' );
    436463
    437464add_action( 'load-plugins.php', 'wp_update_plugins' );
    438465add_action( 'load-update.php', 'wp_update_plugins' );
    439466add_action( 'load-update-core.php', 'wp_update_plugins' );
    440467add_action( 'admin_init', '_maybe_update_plugins' );
    441468add_action( 'wp_update_plugins', 'wp_update_plugins' );
     469add_action( 'upgrader_process_complete', 'wp_update_plugins' );
    442470
    443471add_action( 'load-themes.php', 'wp_update_themes' );
    444472add_action( 'load-update.php', 'wp_update_themes' );
    445473add_action( 'load-update-core.php', 'wp_update_themes' );
    446474add_action( 'admin_init', '_maybe_update_themes' );
    447475add_action( 'wp_update_themes', 'wp_update_themes' );
     476add_action( 'upgrader_process_complete', 'wp_update_themes' );
    448477
    449478add_action('init', 'wp_schedule_update_checks');