WordPress.org

Make WordPress Core

Ticket #45468: 45468.diff

File 45468.diff, 4.0 KB (added by ocean90, 3 months ago)
  • src/wp-admin/includes/class-language-pack-upgrader.php

     
    118118                $this->strings['unpack_package']      = __( 'Unpacking the update…' );
    119119                $this->strings['process_failed']      = __( 'Translation update failed.' );
    120120                $this->strings['process_success']     = __( 'Translation updated successfully.' );
     121                $this->strings['remove_old']          = __( 'Removing the old version of the translation…' );
     122                $this->strings['remove_old_failed']   = __( 'Could not remove the old translation.' );
    121123        }
    122124
    123125        /**
     
    241243                        $options = array(
    242244                                'package'                     => $language_update->package,
    243245                                'destination'                 => $destination,
    244                                 'clear_destination'           => false,
     246                                'clear_destination'           => true,
    245247                                'abort_if_destination_exists' => false, // We expect the destination to exist.
    246248                                'clear_working'               => true,
    247249                                'is_multi'                    => true,
     
    385387                return '';
    386388        }
    387389
     390        /**
     391         * Clears existing translations where this item is going to be installed into.
     392         *
     393         * @since 5.1.0
     394         *
     395         * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
     396         *
     397         * @param string $remote_destination The location on the remote filesystem to be cleared.
     398         * @return bool|WP_Error True upon success, WP_Error on failure.
     399         */
     400        public function clear_destination( $remote_destination ) {
     401                global $wp_filesystem;
     402
     403                $language_update = $this->skin->language_update;
     404
     405                if ( 'core' === $language_update->type ) {
     406                        $files = array(
     407                                $remote_destination . $language_update->language . '.po',
     408                                $remote_destination . $language_update->language . '.mo',
     409                                $remote_destination . 'admin-' . $language_update->language . '.po',
     410                                $remote_destination . 'admin-' . $language_update->language . '.mo',
     411                                $remote_destination . 'admin-network-' . $language_update->language . '.po',
     412                                $remote_destination . 'admin-network-' . $language_update->language . '.mo',
     413                                $remote_destination . 'continents-cities-' . $language_update->language . '.po',
     414                                $remote_destination . 'continents-cities-' . $language_update->language . '.mo',
     415                        );
     416
     417                        $json_translation_files = glob( $remote_destination . $language_update->language . '-*.json' );
     418                        if ( $json_translation_files ) {
     419                                $files = array_merge( $files, $json_translation_files );
     420                        }
     421                } else {
     422                        $files = array(
     423                                $remote_destination . $language_update->slug . '-' . $language_update->language . '.po',
     424                                $remote_destination . $language_update->slug . '-' . $language_update->language . '.mo',
     425                        );
     426
     427                        $json_translation_files = glob( $remote_destination . $language_update->slug . '-' . $language_update->language . '-*.json' );
     428                        if ( $json_translation_files ) {
     429                                $files = array_merge( $files, $json_translation_files );
     430                        }
     431                }
     432
     433                $files = array_filter( $files, array( $wp_filesystem, 'exists' ) );
     434
     435                // No files to delete.
     436                if ( ! $files ) {
     437                        return true;
     438                }
     439
     440                // Check all files are writable before attempting to clear the destination.
     441                $unwritable_files = array();
     442
     443                // Check writability.
     444                foreach ( $files as $file ) {
     445                        if ( ! $wp_filesystem->is_writable( $file ) ) {
     446                                // Attempt to alter permissions to allow writes and try again.
     447                                $wp_filesystem->chmod( $file, FS_CHMOD_FILE );
     448                                if ( ! $wp_filesystem->is_writable( $file ) ) {
     449                                        $unwritable_files[] = $file;
     450                                }
     451                        }
     452                }
     453
     454                if ( ! empty( $unwritable_files ) ) {
     455                        return new WP_Error( 'files_not_writable', $this->strings['files_not_writable'], implode( ', ', $unwritable_files ) );
     456                }
     457
     458                foreach ( $files as $file ) {
     459                        if ( ! $wp_filesystem->delete( $file ) ) {
     460                                return new WP_Error( 'remove_old_failed', $this->strings['remove_old_failed'] );
     461                        }
     462                }
     463
     464                return true;
     465        }
    388466}