Making WordPress.org

Ticket #3929: 3929.diff

File 3929.diff, 4.2 KB (added by dd32, 6 years ago)
  • class-plugin-i18n.php

    class Plugin_I18n { 
    368368                $post->stable_tag = get_post_meta( $post->ID, 'stable_tag', true ) ?: 'trunk';
    369369
    370370                if ( empty( $slug ) ) {
    371371                        return $content;
    372372                }
    373373
    374374                $branch = ( empty( $post->stable_tag ) || 'trunk' === $post->stable_tag ) ? 'dev' : 'stable';
    375375
    376376                if ( empty( $args['code_i18n'] ) || true !== $args['code_i18n'] ) {
    377377                        $branch .= '-readme';
    378378                }
    379379
    380380                $cache_suffix = "{$locale}:{$key}";
    381381
    382382                // Try the cache.
    383                 if ( false !== ( $cache = $this->cache_get( $slug, $branch, $cache_suffix ) ) ) {
     383                // TODO reenable
     384                /* if ( false !== ( $cache = $this->cache_get( $slug, $branch, $cache_suffix ) ) ) {
    384385                        // DEBUG
    385                         // var_dump( array( $slug, $branch, $cache_suffix, $cache ) );
     386                        var_dump( array( $slug, $branch, $cache_suffix, $cache ) );
    386387                        return $cache;
    387                 }
     388                }*/
    388389
    389390                $originals = $this->get_gp_originals( $slug, $branch, $key, $content );
    390391
    391392                if ( empty( $originals ) ) {
    392393                        return $content;
    393394                }
    394395
    395396                $translation_set_id = $this->get_gp_translation_set_id( $slug, $branch, $locale );
    396397
    397398                if ( empty( $translation_set_id ) ) {
    398399                        return $content;
    399400                }
    400401
    401402                $translations = $this->get_gp_translations( $slug, $branch, $originals, $translation_set_id );
    402403
     404                // Sort the originals so that we match the longer originals first.
     405                uasort( $originals, function( $a, $b ) {
     406                        $a_len = strlen( $a->singular );
     407                        $b_len = strlen( $b->singular );
     408
     409                        return $a_len == $b_len ? 0 : ($a_len > $b_len ? -1 : 1);
     410                } );
     411
     412                // Mark each original for translation
    403413                foreach ( $originals as $original ) {
    404                         if ( ! empty( $original->id ) && array_key_exists( $original->id, $translations ) ) {
    405                                 $content = $this->translate_gp_original( $original->singular, $translations[ $original->id ], $content );
     414                        if ( ! empty( $original->id ) ) {
     415                                $content = $this->mark_gp_original( $original, $content );
    406416                        }
    407417                }
    408418
    409                 $this->cache_set( $slug, $branch, $content, $cache_suffix );
     419                // Translate each original marked
     420                $content = preg_replace_callback( '!___TRANSLATION_(\d+)___!', function( $m ) use( $originals, $translations ) {
     421                        return $translations[ $m[1] ] ?? $originals[ $m[1] ];
     422                }, $content );
     423
     424                return $content;
     425                // TODO reenable
     426                //$this->cache_set( $slug, $branch, $content, $cache_suffix );
    410427
    411428                return $content;
    412429        }
    413430
    414431        /**
    415432         * Takes content, searches for $original, and replaces it by $translation.
    416433         *
    417434         * @param string $original    English string.
    418435         * @param string $translation Translation.
    419436         * @param string $content     Content to be searched.
    420437         * @return mixed
    421438         */
    422         public function translate_gp_original( $original, $translation, $content ) {
     439        public function mark_gp_original( $original_obj, $content ) {
     440                $marker = "___TRANSLATION_{$original_obj->id}___";
     441                $original = $original_obj->singular;
     442
    423443                if ( $original === $content ) {
    424                         $content = $translation;
     444                        $content = $marker;
    425445                } else {
    426446                        $original = preg_quote( $original, '/' );
    427447
    428448                        if ( false === strpos( $content, '<' ) ) {
    429449                                // Don't use $translation, it may contain backreference-like characters.
    430                                 $content = preg_replace( "/\b{$original}\b/", '___TRANSLATION___', $content );
     450                                $content = preg_replace( "/\b{$original}\b/", $marker, $content );
    431451                        } else {
    432452                                // Don't use $translation, it may contain backreference-like characters.
    433                                 $content = preg_replace( "/(<([a-z0-9]*)\b[^>]*>){$original}(<\/\\2>)/m", '${1}___TRANSLATION___${3}', $content );
     453                                $content = preg_replace( "/(<([a-z0-9]*)\b[^>]*>){$original}(<\/\\2>)/m", "\${1}{$marker}\${3}", $content );
    434454                        }
    435 
    436                         $content = str_replace( '___TRANSLATION___', $translation, $content );
    437455                }
    438456
    439457                return $content;
    440458        }
    441459
    442460        /**
    443461         * Returns a list of translation locales for a given plugin slug and branch.
    444462         *
    445463         * @param string $slug        Plugin slug.
    446464         * @param string $branch      Branch - 'stable-readme' for example.
    447465         * @param int    $min_percent Optional. Only return locales where percent_translated is >= this value.
    448466         * @return array
    449467         */
    450468        public function find_all_translations_for_plugin( $slug, $branch, $min_percent = 0 ) {
    451469                $post = Plugin_Directory::get_plugin_post( $slug );