Making WordPress.org


Ignore:
Timestamp:
05/03/2019 07:03:20 AM (5 years ago)
Author:
dd32
Message:

Plugin Directory: Introduce localised screenshots, allowing plugins to have translated screenshots on the website and within the wp-admin plugin installer.

This works by allowing screenshots located in the /assets/ folder to define the locale of the image, eg. screenshot-1-de_DE.png or screenshot-1-ary.png.

Props ck3lee, dd32.
See #3935.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/class-template.php

    r8546 r8729  
    365365            'developers',
    366366        );
    367         if ( ! get_post_meta( $plugin->ID, 'screenshots', true ) && ! get_post_meta( $plugin->ID, 'assets_screenshots', true ) ) {
     367        if ( ! get_post_meta( $plugin->ID, 'assets_screenshots', true ) ) {
    368368            unset( $default_sections[ array_search( 'screenshots', $default_sections ) ] );
    369369        }
     
    980980        return $link;
    981981    }
     982
     983    /**
     984     * Fetch plugin Screenshots, accounting for localised screenshots.
     985     *
     986     * @static
     987     *
     988     * @param object|int $plugin The plugin to fetch screenshots for. Optional.
     989     * @param string     $locale The locale requested. Optional.
     990     * @return array Screenshots for the plugin, localised if possible.
     991     */
     992    public static function get_screenshots( $plugin = null, $locale = null ) {
     993        $plugin = get_post( $plugin );
     994
     995        if ( ! $locale ) {
     996            $locale = get_locale();
     997        }
     998
     999        // All indexed from 1. The Image 'number' is stored in the 'resolution' key
     1000        $screen_shots = get_post_meta( $plugin->ID, 'assets_screenshots', true ) ?: array();
     1001        $descriptions = get_post_meta( $plugin->ID, 'screenshots', true ) ?: array();
     1002
     1003        if ( empty( $screen_shots ) ) {
     1004            return array();
     1005        }
     1006
     1007        $sorted = array();
     1008        foreach ( $screen_shots as $image ) {
     1009            if ( ! isset( $sorted[ $image['resolution'] ] ) ) {
     1010                $sorted[ $image['resolution'] ] = array();
     1011            }
     1012
     1013            if ( empty( $image['locale'] ) ) {
     1014                // if the image has no locale, always insert to the last element (lowerst priority).
     1015                $sorted[ $image['resolution'] ][] = $image;
     1016            } elseif ( $locale === $image['locale'] ) {
     1017                // if the locale is a full match, always insert to the first element (highest priority).
     1018                array_unshift( $sorted[ $image['resolution'] ], $image );
     1019            } else {
     1020                // TODO: de_DE_informal should probably fall back to de_DE before de_CH. Maybe this can wait until Core properly supports locale hierarchy.
     1021
     1022                $image_locale_parts = explode( '_', $image['locale'] );
     1023                $locale_parts       = explode( '_', $locale );
     1024                // if only the language matches.
     1025                if ( $image_locale_parts[0] === $locale_parts[0] ) {
     1026                    // image with locale has a higher priority than image without locale.
     1027                    $last_image = end( $sorted[ $image['resolution'] ] );
     1028                    if ( empty( $last_image['locale'] ) ) {
     1029                        array_splice( $sorted[ $image['resolution'] ], count( $sorted[ $image['resolution'] ] ), 0, array( $image ) );
     1030                    } else {
     1031                        $sorted[ $image['resolution'] ][] = $image;
     1032                    }
     1033                }
     1034            }
     1035        }
     1036
     1037        // Sort
     1038        ksort( $sorted, SORT_NATURAL );
     1039
     1040        // Reduce images to singulars and attach metadata
     1041        foreach ( $sorted as $index => $items ) {
     1042            // The highest priority image is the first.
     1043            $image = $items[0];
     1044
     1045            // Attach caption data
     1046            $image['caption'] = false;
     1047            if ( isset( $descriptions[ (int) $index ] ) ) {
     1048                $image['caption'] = $descriptions[ (int) $index ];
     1049                $image['caption'] = Plugin_I18n::instance()->translate(
     1050                    'screenshot-' . $image['resolution'],
     1051                    $image['caption'],
     1052                    [ 'post_id' => $plugin->ID ]
     1053                );
     1054            }
     1055
     1056            // Attach URL information for the asset
     1057            $image['src'] = Template::get_asset_url( $plugin, $image );
     1058
     1059            $sorted[ $index ] = $image;
     1060        }
     1061
     1062        return $sorted;
     1063    }
    9821064}
Note: See TracChangeset for help on using the changeset viewer.