Make WordPress Core

Ticket #45103: 45103.9.diff

File 45103.9.diff, 17.1 KB (added by herregroen, 7 years ago)
  • src/wp-includes/class-wp-dependency.php

     
    6868        public $extra = array();
    6969
    7070        /**
     71         * Translation textdomain set for this dependency.
     72         *
     73         * @since 5.0.0
     74         * @var string
     75         */
     76        public $textdomain;
     77
     78        /**
     79         * Translation path set for this dependency.
     80         *
     81         * @since 5.0.0
     82         * @var string
     83         */
     84        public $translations_path;
     85
     86        /**
    7187         * Setup dependencies.
    7288         *
    7389         * @since 2.6.0
     
    94110                return true;
    95111        }
    96112
     113        public function set_translations( $domain, $path = null ) {
     114                if ( !is_string($domain) )
     115                        return false;
     116                $this->textdomain        = $domain;
     117                $this->translations_path = $path;
     118                return true;
     119        }
    97120}
  • src/wp-includes/class.wp-scripts.php

     
    325325                        return true;
    326326                }
    327327
     328                $translations = $this->print_translations( $handle, false );
     329                if ( $translations ) {
     330                        $translations = sprintf( "<script type='text/javascript'>\n%s\n</script>\n", $translations );
     331                }
     332
    328333                if ( ! preg_match( '|^(https?:)?//|', $src ) && ! ( $this->content_url && 0 === strpos( $src, $this->content_url ) ) ) {
    329334                        $src = $this->base_url . $src;
    330335                }
     
    338343                if ( ! $src )
    339344                        return true;
    340345
    341                 $tag = "{$cond_before}{$before_handle}<script type='text/javascript' src='$src'></script>\n{$after_handle}{$cond_after}";
     346                $tag = "{$translations}{$cond_before}{$before_handle}<script type='text/javascript' src='$src'></script>\n{$after_handle}{$cond_after}";
    342347
    343348                /**
    344349                 * Filters the HTML script tag of an enqueued script.
     
    478483        }
    479484
    480485        /**
    481          * Register a translation textdomain.
     486         * Sets a translation textdomain.
    482487         *
    483488         * @since 5.0.0
    484489         *
     
    493498                        return false;
    494499                }
    495500
     501                /** @var \_WP_Dependency $obj */
     502                $obj = $this->registered[ $handle ];
     503
     504                if ( ! in_array( 'wp-i18n', $obj->deps, true ) ) {
     505                        $obj->deps[] = 'wp-i18n';
     506                }
     507                return $obj->set_translations( $domain, $path );
     508        }
     509
     510        /**
     511         * Prints translations set for a specific handle.
     512         *
     513         * @since 5.0.0
     514         *
     515         * @param string $handle Name of the script to add the inline script to. Must be lowercase.
     516         * @param bool   $echo   Optional. Whether to echo the script instead of just returning it.
     517         *                       Default true.
     518         * @return string|false Script on success, false otherwise.
     519         */
     520        public function print_translations( $handle, $echo = true ) {
     521                if ( ! isset( $this->registered[ $handle ] ) || empty( $this->registered[ $handle ]->textdomain ) ) {
     522                        return false;
     523                }
     524
     525                $domain = $this->registered[ $handle ]->textdomain;
     526                $path   = $this->registered[ $handle ]->translations_path;
     527
    496528                $json_translations = load_script_textdomain( $handle, $domain, $path );
    497529
    498530                if ( ! $json_translations ) {
     
    499531                        return false;
    500532                }
    501533
    502                 /** @var \_WP_Dependency $obj */
    503                 $obj = $this->registered[ $handle ];
    504                 $obj->deps[] = 'wp-i18n';
     534                $output = '(function( translations ){' .
     535                              'wp.i18n.setLocaleData( translations.locale_data, "' . $domain . '" );' .
     536                          '})(' . $json_translations . ');';
    505537
    506                 return $this->add_inline_script(
    507                         $handle,
    508                         '(function( translations ){' .
    509                             'wp.i18n.setLocaleData( translations.locale_data, "' . $domain . '" );' .
    510                         '})(' . $json_translations . ');',
    511                         'before'
    512                 );
     538                if ( $echo ) {
     539                        printf( "<script type='text/javascript'>\n%s\n</script>\n", $output );
     540                }
     541
     542                return $output;
    513543        }
    514544
    515545        /**
  • src/wp-includes/functions.wp-scripts.php

     
    193193}
    194194
    195195/**
    196  * Register translated strings for a script.
     196 * Sets translated strings for a script.
    197197 *
    198198 * Works only if the script has already been added.
    199199 *
    200200 * @see WP_Scripts::set_translations()
    201  * @link https://core.trac.wordpress.org/ticket/45103
    202201 * @global WP_Scripts $wp_scripts The WP_Scripts object for printing scripts.
    203202 *
    204203 * @since 5.0.0
     
    216215                return false;
    217216        }
    218217
    219         if ( ! wp_script_is( $handle, 'enqueued' ) ) {
    220                 _doing_it_wrong( __FUNCTION__, __( 'Script translations may only be set if the script is enqueued.' ), '5.0.0' );
    221         }
    222 
    223218        return $wp_scripts->set_translations( $handle, $domain, $path );
    224219}
    225220
  • src/wp-includes/l10n.php

     
    876876 * @link https://core.trac.wordpress.org/ticket/45103
    877877 * @global WP_Scripts $wp_scripts The WP_Scripts object for printing scripts.
    878878 *
     879 * @since 5.0.0
     880 *
    879881 * @param string $handle Name of the script to register a translation domain to.
    880882 * @param string $domain The textdomain.
    881883 * @param string $path   Optional. The full file path to the directory containing translation files.
     
    886888function load_script_textdomain( $handle, $domain, $path = null ) {
    887889        global $wp_scripts;
    888890
     891        $path   = untrailingslashit( $path );
    889892        $locale = is_admin() ? get_locale() : get_user_locale();
    890893
    891894        // If a path was given and the handle file exists simply return it.
    892         $handle_filename = $domain . '-' . $locale . '-' . $handle . '.json';
     895        $file_base       = $domain === 'default' ? $locale : $domain . '-' . $locale;
     896        $handle_filename = $file_base . '-' . $handle . '.json';
    893897        if ( $path && file_exists( $path . '/' . $handle_filename ) ) {
    894898                return file_get_contents( $path . '/' . $handle_filename );
    895899        }
     
    908912
    909913        // If the host is the same or it's a relative URL.
    910914        if (
    911                 strpos( $content_url['path'], $src_url['path'] ) === 0 &&
     915                strpos( $src_url['path'], $content_url['path'] ) === 0 &&
    912916                ( ! isset( $src_url['host'] ) || $src_url['host'] !== $content_url['host'] )
    913917        ) {
    914918                // Make the src relative the specific plugin or theme.
     
    925929        ) {
    926930                $relative = trim( $src_url['path'], '/' );
    927931        } else if (
    928                 ( strpos( $site_url['path'], $src_url['path'] ) === 0 ) &&
     932                ( strpos( $src_url['path'], $site_url['path'] ) === 0 ) &&
    929933                ( ! isset( $src_url['host'] ) || $src_url['host'] !== $site_url['host'] )
    930934        ) {
    931935                // Make the src relative to the WP root.
     
    943947                $relative = substr( $relative, 0, -7 ) . '.js';
    944948        }
    945949
    946         $md5_filename = $domain . '-' . $locale . '-' . md5( $relative ) . '.json';
     950        $md5_filename = $file_base . '-' . md5( $relative ) . '.json';
    947951        if ( $path && file_exists( $path . '/' . $md5_filename ) ) {
    948952                return file_get_contents( $path . '/' . $md5_filename );
    949953        }
  • tests/phpunit/data/languages/default-en_US-813e104eb47e13dd4cc5af844c618754.json

     
    1 {
    2   "translation-revision-data": "+0000",
    3   "generator":                 "GlotPress/2.3.0-alpha",
    4   "domain":                    "messages",
    5   "locale_data":               {
    6     "messages": {
    7       "":                                                             {
    8         "domain":       "messages",
    9         "plural-forms": "n != 1",
    10         "lang":         "en-gb"
    11       },
    12       "This file is too big. Files must be less than %d KB in size.": [
    13         "This file is too big. Files must be less than %d KB in size."
    14       ],
    15       "%d Theme Update":                                              [
    16         "%d Theme Update",
    17         "%d Theme Updates"
    18       ],
    19       "password strength\u0004Medium":                                [
    20         "Medium"
    21       ],
    22       "taxonomy singular name\u0004Category":                         [
    23         "Category"
    24       ],
    25       "post type general name\u0004Pages":                            [
    26         "Pages"
    27       ]
    28     }
    29   }
    30 }
  • tests/phpunit/data/languages/en_US-813e104eb47e13dd4cc5af844c618754.json

     
     1{
     2  "translation-revision-data": "+0000",
     3  "generator":                 "GlotPress/2.3.0-alpha",
     4  "domain":                    "messages",
     5  "locale_data":               {
     6    "messages": {
     7      "":                                                             {
     8        "domain":       "messages",
     9        "plural-forms": "n != 1",
     10        "lang":         "en-gb"
     11      },
     12      "This file is too big. Files must be less than %d KB in size.": [
     13        "This file is too big. Files must be less than %d KB in size."
     14      ],
     15      "%d Theme Update":                                              [
     16        "%d Theme Update",
     17        "%d Theme Updates"
     18      ],
     19      "password strength\u0004Medium":                                [
     20        "Medium"
     21      ],
     22      "taxonomy singular name\u0004Category":                         [
     23        "Category"
     24      ],
     25      "post type general name\u0004Pages":                            [
     26        "Pages"
     27      ]
     28    }
     29  }
     30}
  • tests/phpunit/tests/dependencies/scripts.php

     
    770770        /**
    771771         * @ticket 45103
    772772         */
    773         public function test_wp_set_script_translation() {
     773        public function test_wp_set_script_translations() {
    774774                wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
    775775                wp_enqueue_script( 'test-example', '/wp-includes/js/script.js', array(), null );
    776                 wp_set_script_translations( 'test-example', 'default',  DIR_TESTDATA . '/languages/' );
     776                wp_set_script_translations( 'test-example', 'default',  DIR_TESTDATA . '/languages' );
    777777
    778778                $expected  = "<script type='text/javascript' src='/wp-includes/js/dist/wp-i18n.js'></script>";
    779779                $expected .= "\n<script type='text/javascript'>\n(function( translations ){" .
    780780                            "wp.i18n.setLocaleData( translations.locale_data, \"default\" );" .
    781                         "})(" . file_get_contents( DIR_TESTDATA . '/languages/default-en_US-813e104eb47e13dd4cc5af844c618754.json') . ");\n</script>\n";
     781                        "})(" . file_get_contents( DIR_TESTDATA . '/languages/en_US-813e104eb47e13dd4cc5af844c618754.json' ) . ");\n</script>\n";
    782782                $expected .= "<script type='text/javascript' src='/wp-includes/js/script.js'></script>\n";
    783783
    784784                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     
    785785        }
    786786
    787787        /**
     788         * @ticket 45103
     789         */
     790        public function test_wp_set_script_translations_for_plugin() {
     791                wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
     792                wp_enqueue_script( 'plugin-example', '/wp-content/plugins/my-plugin/js/script.js', array(), null );
     793                wp_set_script_translations( 'plugin-example', 'internationalized-plugin',  DIR_TESTDATA . '/languages/plugins' );
     794
     795                $expected  = "<script type='text/javascript' src='/wp-includes/js/dist/wp-i18n.js'></script>";
     796                $expected .= "\n<script type='text/javascript'>\n(function( translations ){" .
     797                             "wp.i18n.setLocaleData( translations.locale_data, \"internationalized-plugin\" );" .
     798                             "})(" . file_get_contents( DIR_TESTDATA . '/languages/plugins/internationalized-plugin-en_US-2f86cb96a0233e7cb3b6f03ad573be0b.json' ) . ");\n</script>\n";
     799                $expected .= "<script type='text/javascript' src='/wp-content/plugins/my-plugin/js/script.js'></script>\n";
     800
     801                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     802        }
     803
     804        /**
     805         * @ticket 45103
     806         */
     807        public function test_wp_set_script_translations_for_theme() {
     808                wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
     809                wp_enqueue_script( 'theme-example', '/wp-content/themes/my-theme/js/script.js', array(), null );
     810                wp_set_script_translations( 'theme-example', 'internationalized-theme',  DIR_TESTDATA . '/languages/themes' );
     811
     812                $expected  = "<script type='text/javascript' src='/wp-includes/js/dist/wp-i18n.js'></script>";
     813                $expected .= "\n<script type='text/javascript'>\n(function( translations ){" .
     814                             "wp.i18n.setLocaleData( translations.locale_data, \"internationalized-theme\" );" .
     815                             "})(" . file_get_contents( DIR_TESTDATA . '/languages/themes/internationalized-theme-en_US-2f86cb96a0233e7cb3b6f03ad573be0b.json' ) . ");\n</script>\n";
     816                $expected .= "<script type='text/javascript' src='/wp-content/themes/my-theme/js/script.js'></script>\n";
     817
     818                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     819        }
     820
     821        /**
     822         * @ticket 45103
     823         */
     824        public function test_wp_set_script_translations_with_handle_file() {
     825                wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
     826                wp_enqueue_script( 'script-handle', '/wp-admin/js/script.js', array(), null );
     827                wp_set_script_translations( 'script-handle', 'admin',  DIR_TESTDATA . '/languages/' );
     828
     829                $expected  = "<script type='text/javascript' src='/wp-includes/js/dist/wp-i18n.js'></script>";
     830                $expected .= "\n<script type='text/javascript'>\n(function( translations ){" .
     831                             "wp.i18n.setLocaleData( translations.locale_data, \"admin\" );" .
     832                             "})(" . file_get_contents( DIR_TESTDATA . '/languages/admin-en_US-script-handle.json' ) . ");\n</script>\n";
     833                $expected .= "<script type='text/javascript' src='/wp-admin/js/script.js'></script>\n";
     834
     835                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     836        }
     837
     838        /**
     839         * @ticket 45103
     840         */
     841        public function test_wp_set_script_translations_i18n_dependency() {
     842                global $wp_scripts;
     843
     844                wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
     845                wp_enqueue_script( 'test-example', '/wp-includes/js/script.js', array(), null );
     846                wp_set_script_translations( 'test-example', 'default',  DIR_TESTDATA . '/languages/' );
     847
     848                $script = $wp_scripts->registered[ 'test-example' ];
     849
     850                $this->assertContains( 'wp-i18n', $script->deps );
     851        }
     852
     853        /**
     854         * @ticket 45103
     855         */
     856        public function test_wp_set_script_translations_when_translation_file_does_not_exist() {
     857                wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
     858                wp_enqueue_script( 'test-example', '/wp-admin/js/script.js', array(), null );
     859                wp_set_script_translations( 'test-example', 'admin',  DIR_TESTDATA . '/languages/' );
     860
     861                $expected  = "<script type='text/javascript' src='/wp-includes/js/dist/wp-i18n.js'></script>";
     862                $expected .= "\n<script type='text/javascript' src='/wp-admin/js/script.js'></script>\n";
     863
     864                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     865        }
     866
     867        /**
     868         * @ticket 45103
     869         */
     870        public function test_wp_set_script_translations_after_register() {
     871                wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
     872                wp_register_script( 'test-example', '/wp-includes/js/script.js', array(), null );
     873                wp_set_script_translations( 'test-example', 'default',  DIR_TESTDATA . '/languages' );
     874
     875                wp_enqueue_script( 'test-example' );
     876
     877                $expected  = "<script type='text/javascript' src='/wp-includes/js/dist/wp-i18n.js'></script>";
     878                $expected .= "\n<script type='text/javascript'>\n(function( translations ){" .
     879                             "wp.i18n.setLocaleData( translations.locale_data, \"default\" );" .
     880                             "})(" . file_get_contents( DIR_TESTDATA . '/languages/en_US-813e104eb47e13dd4cc5af844c618754.json' ) . ");\n</script>\n";
     881                $expected .= "<script type='text/javascript' src='/wp-includes/js/script.js'></script>\n";
     882
     883                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     884        }
     885
     886        /**
     887         * @ticket 45103
     888         */
     889        public function test_wp_set_script_translations_dependency() {
     890                wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
     891                wp_register_script( 'test-dependency', '/wp-includes/js/script.js', array(), null );
     892                wp_set_script_translations( 'test-dependency', 'default',  DIR_TESTDATA . '/languages' );
     893
     894                wp_enqueue_script( 'test-example', '/wp-includes/js/script2.js', array( 'test-dependency' ), null );
     895
     896                $expected  = "<script type='text/javascript' src='/wp-includes/js/dist/wp-i18n.js'></script>";
     897                $expected .= "\n<script type='text/javascript'>\n(function( translations ){" .
     898                             "wp.i18n.setLocaleData( translations.locale_data, \"default\" );" .
     899                             "})(" . file_get_contents( DIR_TESTDATA . '/languages/en_US-813e104eb47e13dd4cc5af844c618754.json' ) . ");\n</script>\n";
     900                $expected .= "<script type='text/javascript' src='/wp-includes/js/script.js'></script>\n";
     901                $expected .= "<script type='text/javascript' src='/wp-includes/js/script2.js'></script>\n";
     902
     903                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     904        }
     905
     906        /**
    788907         * Testing `wp_enqueue_code_editor` with file path.
    789908         *
    790909         * @ticket 41871