From 2f1afbcf7912ee749ba406c26b9c7df5947015c6 Mon Sep 17 00:00:00 2001 From: Dominik Schilling Date: Sat, 27 Jul 2019 13:09:16 +0000 Subject: [PATCH] Tools: Remove internationalization tools (also known as `makepot.php`). It has been a great pleasure to work with `makepot.php` over the past [https://i18n.trac.wordpress.org/changeset/4169/ 11 years] but now it's time to say goodbye. The tools have been integrated into WP-CLI as [https://developer.wordpress.org/cli/commands/i18n/make-pot/ wp i18n make-pot] and [https://developer.wordpress.org/cli/commands/i18n/make-json/ wp i18n make-json]. The new commands were optimized to support current PHP versions and are more flexible and reliable when extracting strings for PHP, and JavaScript. Access to the old tools continue to exist in previous branches or at https://i18n.svn.wordpress.org/tools/. Fixes #45287. git-svn-id: https://develop.svn.wordpress.org/trunk@45686 602fd350-edb4-49c9-b593-d223f7449a82 --- tools/i18n/add-textdomain.php | 160 ----- tools/i18n/extract.php | 222 ------ tools/i18n/makepot.php | 639 ------------------ tools/i18n/not-gettexted.php | 234 ------- tools/i18n/pot-ext-meta.php | 78 --- tools/i18n/t/AddTextdomainTest.php | 46 -- tools/i18n/t/ExtractTest.php | 227 ------- tools/i18n/t/NotGettextedTest.php | 46 -- tools/i18n/t/data/add-textdomain-0-result.php | 18 - tools/i18n/t/data/add-textdomain-0.php | 18 - tools/i18n/t/data/not-gettexted-0-result.php | 24 - tools/i18n/t/data/not-gettexted-0.mo | Bin 1227 -> 0 bytes tools/i18n/t/data/not-gettexted-0.php | 24 - tools/i18n/t/data/not-gettexted-0.po | 21 - 14 files changed, 1757 deletions(-) delete mode 100644 tools/i18n/add-textdomain.php delete mode 100644 tools/i18n/extract.php delete mode 100644 tools/i18n/makepot.php delete mode 100644 tools/i18n/not-gettexted.php delete mode 100644 tools/i18n/pot-ext-meta.php delete mode 100644 tools/i18n/t/AddTextdomainTest.php delete mode 100644 tools/i18n/t/ExtractTest.php delete mode 100644 tools/i18n/t/NotGettextedTest.php delete mode 100644 tools/i18n/t/data/add-textdomain-0-result.php delete mode 100644 tools/i18n/t/data/add-textdomain-0.php delete mode 100644 tools/i18n/t/data/not-gettexted-0-result.php delete mode 100644 tools/i18n/t/data/not-gettexted-0.mo delete mode 100644 tools/i18n/t/data/not-gettexted-0.php delete mode 100644 tools/i18n/t/data/not-gettexted-0.po diff --git a/tools/i18n/add-textdomain.php b/tools/i18n/add-textdomain.php deleted file mode 100644 index a4b1dd4a2f..0000000000 --- a/tools/i18n/add-textdomain.php +++ /dev/null @@ -1,160 +0,0 @@ -funcs = array_keys( $makepot->rules ); - $this->funcs[] = 'translate_nooped_plural'; - } - - /** - * Prints CLI usage. - */ - public function usage() { - $usage = "Usage: php add-textdomain.php [-i] \n\nAdds the string as a last argument to all i18n function calls in \nand prints the modified php file on standard output.\n\nOptions:\n -i Modifies the PHP file in place, instead of printing it to standard output.\n"; - fwrite(STDERR, $usage); - exit(1); - } - - /** - * Adds textdomain to a single file. - * - * @see AddTextdomain::process_string() - * - * @param string $domain Text domain. - * @param string $source_filename Filename with optional path. - * @param bool $inplace True to modifies the PHP file in place. False to print to standard output. - */ - public function process_file( $domain, $source_filename, $inplace ) { - $new_source = $this->process_string( $domain, file_get_contents( $source_filename ) ); - - if ( $inplace ) { - $f = fopen( $source_filename, 'w' ); - fwrite( $f, $new_source ); - fclose( $f ); - } else { - echo $new_source; - } - } - - /** - * Adds textdomain to a string of PHP. - * - * Functions calls should be wrapped in opening and closing PHP delimiters as usual. - * - * @see AddTextdomain::process_tokens() - * - * @param string $domain Text domain. - * @param string $string PHP code to parse. - * @return string Modified source. - */ - public function process_string( $domain, $string ) { - $tokens = token_get_all( $string ); - return $this->process_tokens( $domain, $tokens ); - } - - /** - * Adds textdomain to a set of PHP tokens. - * - * @param string $domain Text domain. - * @param array $tokens PHP tokens. An array of token identifiers. Each individual token identifier is either a - * single character (i.e.: ;, ., >, !, etc.), or a three element array containing the token - * index in element 0, the string content of the original token in element 1 and the line - * number in element 2. - * @return string Modified source. - */ - public function process_tokens( $domain, $tokens ) { - $this->modified_contents = ''; - $domain = addslashes( $domain ); - - $in_func = false; - $args_started = false; - $parens_balance = 0; - $found_domain = false; - - foreach($tokens as $index => $token) { - $string_success = false; - if (is_array($token)) { - list($id, $text) = $token; - if (T_STRING == $id && in_array($text, $this->funcs)) { - $in_func = true; - $parens_balance = 0; - $args_started = false; - $found_domain = false; - } elseif (T_CONSTANT_ENCAPSED_STRING == $id && ("'$domain'" == $text || "\"$domain\"" == $text)) { - if ($in_func && $args_started) { - $found_domain = true; - } - } - $token = $text; - } elseif ('(' == $token){ - $args_started = true; - ++$parens_balance; - } elseif (')' == $token) { - --$parens_balance; - if ($in_func && 0 == $parens_balance) { - if ( ! $found_domain ) { - $token = ", '$domain'"; - if ( T_WHITESPACE == $tokens[ $index - 1 ][0] ) { - $token .= ' '; // Maintain code standards if previously present - // Remove previous whitespace token to account for it. - $this->modified_contents = trim( $this->modified_contents ); - } - $token .= ')'; - } - $in_func = false; - $args_started = false; - $found_domain = false; - } - } - $this->modified_contents .= $token; - } - - return $this->modified_contents; - } -} - -// Run the CLI only if the file wasn't included. -$included_files = get_included_files(); -if ($included_files[0] == __FILE__) { - $adddomain = new AddTextdomain(); - - if (!isset($argv[1]) || !isset($argv[2])) { - $adddomain->usage(); - } - - $inplace = false; - if ('-i' == $argv[1]) { - $inplace = true; - if (!isset($argv[3])) $adddomain->usage(); - array_shift($argv); - } - - if ( is_dir( $argv[2] ) ) { - $directory = new RecursiveDirectoryIterator( $argv[2], RecursiveDirectoryIterator::SKIP_DOTS ); - $files = new RecursiveIteratorIterator( $directory ); - foreach ( $files as $file ) { - if ( 'php' === $file->getExtension() ) { - $adddomain->process_file( $argv[1], $file->getPathname(), $inplace ); - } - } - } else { - $adddomain->process_file( $argv[1], $argv[2], $inplace ); - } -} diff --git a/tools/i18n/extract.php b/tools/i18n/extract.php deleted file mode 100644 index 023b28bc69..0000000000 --- a/tools/i18n/extract.php +++ /dev/null @@ -1,222 +0,0 @@ - array( 'string' ), - '_e' => array( 'string' ), - '_n' => array( 'singular', 'plural' ), - ); - var $comment_prefix = 'translators:'; - - function __construct( $rules = array() ) { - $this->rules = $rules; - } - - function extract_from_directory( $dir, $excludes = array(), $includes = array(), $prefix = '' ) { - $old_cwd = getcwd(); - chdir( $dir ); - $translations = new Translations; - $file_names = (array) scandir( '.' ); - foreach ( $file_names as $file_name ) { - if ( '.' == $file_name || '..' == $file_name ) continue; - if ( preg_match( '/\.php$/', $file_name ) && $this->does_file_name_match( $prefix . $file_name, $excludes, $includes ) ) { - $extracted = $this->extract_from_file( $file_name, $prefix ); - $translations->merge_originals_with( $extracted ); - } - if ( is_dir( $file_name ) ) { - $extracted = $this->extract_from_directory( $file_name, $excludes, $includes, $prefix . $file_name . '/' ); - $translations->merge_originals_with( $extracted ); - } - } - chdir( $old_cwd ); - return $translations; - } - - function extract_from_file( $file_name, $prefix ) { - $code = file_get_contents( $file_name ); - return $this->extract_from_code( $code, $prefix . $file_name ); - } - - function does_file_name_match( $path, $excludes, $includes ) { - if ( $includes ) { - $matched_any_include = false; - foreach( $includes as $include ) { - if ( preg_match( '|^'.$include.'$|', $path ) ) { - $matched_any_include = true; - break; - } - } - if ( !$matched_any_include ) return false; - } - if ( $excludes ) { - foreach( $excludes as $exclude ) { - if ( preg_match( '|^'.$exclude.'$|', $path ) ) { - return false; - } - } - } - return true; - } - - function entry_from_call( $call, $file_name ) { - $rule = isset( $this->rules[$call['name']] )? $this->rules[$call['name']] : null; - if ( !$rule ) return null; - $entry = new Translation_Entry; - $multiple = array(); - $complete = false; - for( $i = 0; $i < count( $rule ); ++$i ) { - if ( $rule[$i] && ( !isset( $call['args'][$i] ) || !is_string( $call['args'][$i] ) || '' == $call['args'][$i] ) ) return false; - switch( $rule[$i] ) { - case 'string': - if ( $complete ) { - $multiple[] = $entry; - $entry = new Translation_Entry; - $complete = false; - } - $entry->singular = $call['args'][$i]; - $complete = true; - break; - case 'singular': - if ( $complete ) { - $multiple[] = $entry; - $entry = new Translation_Entry; - $complete = false; - } - $entry->singular = $call['args'][$i]; - $entry->is_plural = true; - break; - case 'plural': - $entry->plural = $call['args'][$i]; - $entry->is_plural = true; - $complete = true; - break; - case 'context': - $entry->context = $call['args'][$i]; - foreach( $multiple as &$single_entry ) { - $single_entry->context = $entry->context; - } - break; - } - } - if ( isset( $call['line'] ) && $call['line'] ) { - $references = array( $file_name . ':' . $call['line'] ); - $entry->references = $references; - foreach( $multiple as &$single_entry ) { - $single_entry->references = $references; - } - } - if ( isset( $call['comment'] ) && $call['comment'] ) { - $comments = rtrim( $call['comment'] ) . "\n"; - $entry->extracted_comments = $comments; - foreach( $multiple as &$single_entry ) { - $single_entry->extracted_comments = $comments; - } - } - if ( $multiple && $entry ) { - $multiple[] = $entry; - return $multiple; - } - - return $entry; - } - - function extract_from_code( $code, $file_name ) { - $translations = new Translations; - $function_calls = $this->find_function_calls( array_keys( $this->rules ), $code ); - foreach( $function_calls as $call ) { - $entry = $this->entry_from_call( $call, $file_name ); - if ( is_array( $entry ) ) - foreach( $entry as $single_entry ) - $translations->add_entry_or_merge( $single_entry ); - elseif ( $entry) - $translations->add_entry_or_merge( $entry ); - } - return $translations; - } - - /** - * Finds all function calls in $code and returns an array with an associative array for each function: - * - name - name of the function - * - args - array for the function arguments. Each string literal is represented by itself, other arguments are represented by null. - * - line - line number - */ - function find_function_calls( $function_names, $code ) { - $tokens = token_get_all( $code ); - $function_calls = array(); - $latest_comment = false; - $in_func = false; - foreach( $tokens as $token ) { - $id = $text = null; - if ( is_array( $token ) ) list( $id, $text, $line ) = $token; - if ( T_WHITESPACE == $id ) continue; - if ( T_STRING == $id && in_array( $text, $function_names ) && !$in_func ) { - $in_func = true; - $paren_level = -1; - $args = array(); - $func_name = $text; - $func_line = $line; - $func_comment = $latest_comment? $latest_comment : ''; - - $just_got_into_func = true; - $latest_comment = false; - continue; - } - if ( T_COMMENT == $id ) { - $text = preg_replace( '%^\s+\*\s%m', '', $text ); - $text = str_replace( array( "\r\n", "\n" ), ' ', $text );; - $text = trim( preg_replace( '%^(/\*|//)%', '', preg_replace( '%\*/$%', '', $text ) ) ); - if ( 0 === stripos( $text, $this->comment_prefix ) ) { - $latest_comment = $text; - } - } - if ( !$in_func ) continue; - if ( '(' == $token ) { - $paren_level++; - if ( 0 == $paren_level ) { // start of first argument - $just_got_into_func = false; - $current_argument = null; - $current_argument_is_just_literal = true; - } - continue; - } - if ( $just_got_into_func ) { - // there wasn't a opening paren just after the function name -- this means it is not a function - $in_func = false; - $just_got_into_func = false; - } - if ( ')' == $token ) { - if ( 0 == $paren_level ) { - $in_func = false; - $args[] = $current_argument; - $call = array( 'name' => $func_name, 'args' => $args, 'line' => $func_line ); - if ( $func_comment ) $call['comment'] = $func_comment; - $function_calls[] = $call; - } - $paren_level--; - continue; - } - if ( ',' == $token && 0 == $paren_level ) { - $args[] = $current_argument; - $current_argument = null; - $current_argument_is_just_literal = true; - continue; - } - if ( T_CONSTANT_ENCAPSED_STRING == $id && $current_argument_is_just_literal ) { - // we can use eval safely, because we are sure $text is just a string literal - eval('$current_argument = '.$text.';' ); - continue; - } - $current_argument_is_just_literal = false; - $current_argument = null; - } - return $function_calls; - } -} diff --git a/tools/i18n/makepot.php b/tools/i18n/makepot.php deleted file mode 100644 index 75b95e1bd2..0000000000 --- a/tools/i18n/makepot.php +++ /dev/null @@ -1,639 +0,0 @@ - array('string'), - '__' => array('string'), - '_e' => array('string'), - '_c' => array('string'), - '_n' => array('singular', 'plural'), - '_n_noop' => array('singular', 'plural'), - '_nc' => array('singular', 'plural'), - '__ngettext' => array('singular', 'plural'), - '__ngettext_noop' => array('singular', 'plural'), - '_x' => array('string', 'context'), - '_ex' => array('string', 'context'), - '_nx' => array('singular', 'plural', null, 'context'), - '_nx_noop' => array('singular', 'plural', 'context'), - '_n_js' => array('singular', 'plural'), - '_nx_js' => array('singular', 'plural', 'context'), - 'esc_attr__' => array('string'), - 'esc_html__' => array('string'), - 'esc_attr_e' => array('string'), - 'esc_html_e' => array('string'), - 'esc_attr_x' => array('string', 'context'), - 'esc_html_x' => array('string', 'context'), - 'comments_number_link' => array('string', 'singular', 'plural'), - ); - - private $ms_files = array( - 'ms-.*', '.*/ms-.*', '.*/my-.*', 'wp-activate\.php', 'wp-signup\.php', - 'wp-admin/network\.php', 'wp-admin/network/.*\.php', 'wp-admin/includes/ms\.php', - 'wp-admin/includes/class-wp-ms.*', 'wp-admin/includes/network\.php', - ); - - private $temp_files = array(); - - public $meta = array( - 'default' => array( - 'from-code' => 'utf-8', - 'msgid-bugs-address' => 'https://make.wordpress.org/polyglots/', - 'language' => 'php', - 'add-comments' => 'translators', - 'comments' => "Copyright (C) {year} {package-name}\nThis file is distributed under the same license as the {package-name} package.", - ), - 'generic' => array(), - 'wp-frontend' => array( - 'description' => 'Translation of frontend strings in WordPress {version}', - 'copyright-holder' => 'WordPress', - 'package-name' => 'WordPress', - 'package-version' => '{version}', - ), - 'wp-admin' => array( - 'description' => 'Translation of site admin strings in WordPress {version}', - 'copyright-holder' => 'WordPress', - 'package-name' => 'WordPress', - 'package-version' => '{version}', - ), - 'wp-network-admin' => array( - 'description' => 'Translation of network admin strings in WordPress {version}', - 'copyright-holder' => 'WordPress', - 'package-name' => 'WordPress', - 'package-version' => '{version}', - ), - 'wp-tz' => array( - 'description' => 'Translation of timezone strings in WordPress {version}', - 'copyright-holder' => 'WordPress', - 'package-name' => 'WordPress', - 'package-version' => '{version}', - ), - 'wp-plugin' => array( - 'description' => 'Translation of the WordPress plugin {name} {version} by {author}', - 'msgid-bugs-address' => 'https://wordpress.org/support/plugin/{slug}', - 'copyright-holder' => '{author}', - 'package-name' => '{name}', - 'package-version' => '{version}', - ), - 'wp-theme' => array( - 'description' => 'Translation of the WordPress theme {name} {version} by {author}', - 'msgid-bugs-address' => 'https://wordpress.org/support/theme/{slug}', - 'copyright-holder' => '{author}', - 'package-name' => '{name}', - 'package-version' => '{version}', - 'comments' => 'Copyright (C) {year} {author}\nThis file is distributed under the same license as the {package-name} package.', - ), - 'glotpress' => array( - 'description' => 'Translation of GlotPress', - 'copyright-holder' => 'GlotPress', - 'package-name' => 'GlotPress', - ), - 'wporg-bb-forums' => array( - 'description' => 'WordPress.org International Forums', - 'copyright-holder' => 'WordPress', - 'package-name' => 'WordPress.org International Forums', - ), - 'wporg' => array( - 'description' => 'WordPress.org', - 'copyright-holder' => 'WordPress', - 'package-name' => 'WordPress.org', - ), - 'wordcamporg' => array( - 'description' => 'WordCamp.org', - 'copyright-holder' => 'WordPress', - 'package-name' => 'WordCamp.org', - ), - 'rosetta' => array( - 'description' => 'Rosetta (.wordpress.org locale sites)', - 'copyright-holder' => 'WordPress', - 'package-name' => 'Rosetta', - ), - ); - - public function __construct($deprecated = true) { - $this->extractor = new StringExtractor( $this->rules ); - } - - public function __destruct() { - foreach ( $this->temp_files as $temp_file ) - unlink( $temp_file ); - } - - private function tempnam( $file ) { - $tempnam = tempnam( sys_get_temp_dir(), $file ); - $this->temp_files[] = $tempnam; - return $tempnam; - } - - private function realpath_missing($path) { - return realpath(dirname($path)).DIRECTORY_SEPARATOR.basename($path); - } - - private function xgettext($project, $dir, $output_file, $placeholders = array(), $excludes = array(), $includes = array()) { - $meta = array_merge( $this->meta['default'], $this->meta[$project] ); - $placeholders = array_merge( $meta, $placeholders ); - $meta['output'] = $this->realpath_missing( $output_file ); - $placeholders['year'] = date( 'Y' ); - $placeholder_keys = array_map( create_function( '$x', 'return "{".$x."}";' ), array_keys( $placeholders ) ); - $placeholder_values = array_values( $placeholders ); - foreach($meta as $key => $value) { - $meta[$key] = str_replace($placeholder_keys, $placeholder_values, $value); - } - - $originals = $this->extractor->extract_from_directory( $dir, $excludes, $includes ); - $pot = new PO; - $pot->entries = $originals->entries; - - $pot->set_header( 'Project-Id-Version', $meta['package-name'].' '.$meta['package-version'] ); - $pot->set_header( 'Report-Msgid-Bugs-To', $meta['msgid-bugs-address'] ); - $pot->set_header( 'POT-Creation-Date', gmdate( 'Y-m-d H:i:s+00:00' ) ); - $pot->set_header( 'MIME-Version', '1.0' ); - $pot->set_header( 'Content-Type', 'text/plain; charset=UTF-8' ); - $pot->set_header( 'Content-Transfer-Encoding', '8bit' ); - $pot->set_header( 'PO-Revision-Date', date( 'Y') . '-MO-DA HO:MI+ZONE' ); - $pot->set_header( 'Last-Translator', 'FULL NAME ' ); - $pot->set_header( 'Language-Team', 'LANGUAGE ' ); - $pot->set_comment_before_headers( $meta['comments'] ); - $pot->export_to_file( $output_file ); - return true; - } - - public function wp_generic($dir, $args) { - $defaults = array( - 'project' => 'wp-core', - 'output' => null, - 'default_output' => 'wordpress.pot', - 'includes' => array(), - 'excludes' => array_merge( - array( 'wp-admin/includes/continents-cities\.php', 'wp-content/themes/twenty.*', ), - $this->ms_files - ), - 'extract_not_gettexted' => false, - 'not_gettexted_files_filter' => false, - ); - $args = array_merge( $defaults, $args ); - extract( $args ); - $placeholders = array(); - if ( $wp_version = $this->wp_version( $dir ) ) - $placeholders['version'] = $wp_version; - else - return false; - $output = is_null( $output )? $default_output : $output; - $res = $this->xgettext( $project, $dir, $output, $placeholders, $excludes, $includes ); - if ( !$res ) return false; - - if ( $extract_not_gettexted ) { - $old_dir = getcwd(); - $output = realpath( $output ); - chdir( $dir ); - $php_files = NotGettexted::list_php_files('.'); - $php_files = array_filter( $php_files, $not_gettexted_files_filter ); - $not_gettexted = new NotGettexted; - $res = $not_gettexted->command_extract( $output, $php_files ); - chdir( $old_dir ); - /* Adding non-gettexted strings can repeat some phrases */ - $output_shell = escapeshellarg( $output ); - system( "msguniq --use-first $output_shell -o $output_shell" ); - } - return $res; - } - - public function wp_frontend( $dir, $output ) { - if ( ! file_exists( "$dir/wp-admin/user/about.php" ) ) { - return false; - } - - $excludes = array( 'wp-admin/.*', 'wp-content/themes/.*', 'wp-includes/class-pop3\.php' ); - - // Exclude Akismet all together for 3.9+. - if ( file_exists( "$dir/wp-admin/css/about.css" ) ) { - $excludes[] = 'wp-content/plugins/akismet/.*'; - } - - return $this->wp_generic( $dir, array( - 'project' => 'wp-frontend', 'output' => $output, - 'includes' => array(), - 'excludes' => $excludes, - 'default_output' => 'wordpress.pot', - ) ); - } - - public function wp_admin($dir, $output) { - $frontend_pot = $this->tempnam( 'frontend.pot' ); - if ( false === $frontend_pot ) { - return false; - } - - $frontend_result = $this->wp_frontend( $dir, $frontend_pot ); - if ( ! $frontend_result ) { - return false; - } - - $network_admin_files = $this->get_wp_network_admin_files( $dir ); - - $result = $this->wp_generic( $dir, array( - 'project' => 'wp-admin', 'output' => $output, - 'includes' => array( 'wp-admin/.*' ), - 'excludes' => array_merge( array( 'wp-admin/includes/continents-cities\.php' ), $network_admin_files ), - 'default_output' => 'wordpress-admin.pot', - ) ); - if ( ! $result ) { - return false; - } - - $potextmeta = new PotExtMeta; - - if ( ! file_exists( "$dir/wp-admin/css/about.css" ) ) { // < 3.9 - $result = $potextmeta->append( "$dir/wp-content/plugins/akismet/akismet.php", $output ); - if ( ! $result ) { - return false; - } - } - - $result = $potextmeta->append( "$dir/wp-content/plugins/hello.php", $output ); - if ( ! $result ) { - return false; - } - - /* Adding non-gettexted strings can repeat some phrases */ - $output_shell = escapeshellarg( $output ); - system( "msguniq $output_shell -o $output_shell" ); - - $common_pot = $this->tempnam( 'common.pot' ); - if ( ! $common_pot ) { - return false; - } - $admin_pot = realpath( is_null( $output ) ? 'wordpress-admin.pot' : $output ); - system( "msgcat --more-than=1 --use-first $frontend_pot $admin_pot > $common_pot" ); - system( "msgcat -u --use-first $admin_pot $common_pot -o $admin_pot" ); - return true; - } - - public function wp_network_admin($dir, $output) { - if ( ! file_exists( "$dir/wp-admin/user/about.php" ) ) return false; - - $frontend_pot = $this->tempnam( 'frontend.pot' ); - if ( false === $frontend_pot ) return false; - - $frontend_result = $this->wp_frontend( $dir, $frontend_pot ); - if ( ! $frontend_result ) - return false; - - $admin_pot = $this->tempnam( 'admin.pot' ); - if ( false === $admin_pot ) return false; - - $admin_result = $this->wp_admin( $dir, $admin_pot ); - if ( ! $admin_result ) - return false; - - $result = $this->wp_generic( $dir, array( - 'project' => 'wp-network-admin', 'output' => $output, - 'includes' => $this->get_wp_network_admin_files( $dir ), - 'excludes' => array(), - 'default_output' => 'wordpress-admin-network.pot', - ) ); - - if ( ! $result ) { - return false; - } - - $common_pot = $this->tempnam( 'common.pot' ); - if ( ! $common_pot ) - return false; - - $net_admin_pot = realpath( is_null( $output ) ? 'wordpress-network-admin.pot' : $output ); - system( "msgcat --more-than=1 --use-first $frontend_pot $admin_pot $net_admin_pot > $common_pot" ); - system( "msgcat -u --use-first $net_admin_pot $common_pot -o $net_admin_pot" ); - return true; - } - - private function get_wp_network_admin_files( $dir ) { - $wp_version = $this->wp_version( $dir ); - - // https://core.trac.wordpress.org/ticket/19852 - $files = array( 'wp-admin/network/.*', 'wp-admin/network.php' ); - - // https://core.trac.wordpress.org/ticket/34910 - if ( version_compare( $wp_version, '4.5-beta', '>=' ) ) { - $files = array_merge( $files, array( - 'wp-admin/includes/class-wp-ms.*', - 'wp-admin/includes/network.php', - ) ); - } - - return $files; - } - - public function wp_tz( $dir, $output ) { - return $this->wp_generic( $dir, array( - 'project' => 'wp-tz', 'output' => $output, - 'includes' => array( 'wp-admin/includes/continents-cities\.php' ), - 'excludes' => array(), - 'default_output' => 'wordpress-continents-cities.pot', - ) ); - } - - private function wp_version( $dir ) { - $version_php = $dir.'/wp-includes/version.php'; - if ( !is_readable( $version_php ) ) return false; - return preg_match( '/\$wp_version\s*=\s*\'(.*?)\';/', file_get_contents( $version_php ), $matches )? $matches[1] : false; - } - - public function get_first_lines($filename, $lines = 30) { - $extf = fopen($filename, 'r'); - if (!$extf) return false; - $first_lines = ''; - foreach(range(1, $lines) as $x) { - $line = fgets($extf); - if (feof($extf)) break; - if (false === $line) { - return false; - } - $first_lines .= $line; - } - - // PHP will close file handle, but we are good citizens. - fclose( $extf ); - - // Make sure we catch CR-only line endings. - $first_lines = str_replace( "\r", "\n", $first_lines ); - - return $first_lines; - } - - public function get_addon_header($header, &$source) { - /* - * A few things this needs to handle: - * - 'Header: Value\n' - * - '// Header: Value' - * - '/* Header: Value * /' - * - '' - * - '' - */ - if ( preg_match( '/^(?:[ \t]*<\?php)?[ \t\/*#@]*' . preg_quote( $header, '/' ) . ':(.*)$/mi', $source, $matches ) ) { - return $this->_cleanup_header_comment( $matches[1] ); - } else { - return false; - } - } - - /** - * Removes any trailing closing comment / PHP tags from the header value - */ - private function _cleanup_header_comment( $str ) { - return trim( preg_replace( '/\s*(?:\*\/|\?>).*/', '', $str ) ); - } - - public function generic($dir, $output) { - $output = is_null($output)? "generic.pot" : $output; - return $this->xgettext('generic', $dir, $output, array()); - } - - private function guess_plugin_slug($dir) { - if ('trunk' == basename($dir)) { - $slug = basename(dirname($dir)); - } elseif (in_array(basename(dirname($dir)), array('branches', 'tags'))) { - $slug = basename(dirname(dirname($dir))); - } else { - $slug = basename($dir); - } - return $slug; - } - - public function wp_plugin( $dir, $output, $slug = null, $args = array() ) { - $defaults = array( - 'excludes' => array(), - 'includes' => array(), - ); - $args = array_merge( $defaults, $args ); - $placeholders = array(); - // guess plugin slug - if (is_null($slug)) { - $slug = $this->guess_plugin_slug($dir); - } - - $plugins_dir = @opendir( $dir ); - $plugin_files = array(); - if ( $plugins_dir ) { - while ( ( $file = readdir( $plugins_dir ) ) !== false ) { - if ( '.' === substr( $file, 0, 1 ) ) { - continue; - } - - if ( '.php' === substr( $file, -4 ) ) { - $plugin_files[] = $file; - } - } - closedir( $plugins_dir ); - } - - if ( empty( $plugin_files ) ) { - return false; - } - - $main_file = ''; - foreach ( $plugin_files as $plugin_file ) { - if ( ! is_readable( "$dir/$plugin_file" ) ) { - continue; - } - - $source = $this->get_first_lines( "$dir/$plugin_file", $this->max_header_lines ); - - // Stop when we find a file with a plugin name header in it. - if ( $this->get_addon_header( 'Plugin Name', $source ) != false ) { - $main_file = "$dir/$plugin_file"; - break; - } - } - - if ( empty( $main_file ) ) { - return false; - } - - $placeholders['version'] = $this->get_addon_header('Version', $source); - $placeholders['author'] = $this->get_addon_header('Author', $source); - $placeholders['name'] = $this->get_addon_header('Plugin Name', $source); - $placeholders['slug'] = $slug; - - $output = is_null($output)? "$slug.pot" : $output; - $res = $this->xgettext( 'wp-plugin', $dir, $output, $placeholders, $args['excludes'], $args['includes'] ); - if (!$res) return false; - $potextmeta = new PotExtMeta; - $res = $potextmeta->append($main_file, $output); - /* Adding non-gettexted strings can repeat some phrases */ - $output_shell = escapeshellarg($output); - system("msguniq $output_shell -o $output_shell"); - return $res; - } - - public function wp_theme($dir, $output, $slug = null) { - $placeholders = array(); - // guess plugin slug - if (is_null($slug)) { - $slug = $this->guess_plugin_slug($dir); - } - $main_file = $dir.'/style.css'; - $source = $this->get_first_lines($main_file, $this->max_header_lines); - - $placeholders['version'] = $this->get_addon_header('Version', $source); - $placeholders['author'] = $this->get_addon_header('Author', $source); - $placeholders['name'] = $this->get_addon_header('Theme Name', $source); - $placeholders['slug'] = $slug; - - $license = $this->get_addon_header( 'License', $source ); - if ( $license ) - $this->meta['wp-theme']['comments'] = "Copyright (C) {year} {author}\nThis file is distributed under the {$license}."; - else - $this->meta['wp-theme']['comments'] = "Copyright (C) {year} {author}\nThis file is distributed under the same license as the {package-name} package."; - - $output = is_null($output)? "$slug.pot" : $output; - $res = $this->xgettext('wp-theme', $dir, $output, $placeholders); - if (! $res ) - return false; - $potextmeta = new PotExtMeta; - $res = $potextmeta->append( $main_file, $output, array( 'Theme Name', 'Theme URI', 'Description', 'Author', 'Author URI' ) ); - if ( ! $res ) - return false; - // If we're dealing with a pre-3.4 default theme, don't extract page templates before 3.4. - $extract_templates = ! in_array( $slug, array( 'twentyten', 'twentyeleven', 'default', 'classic' ) ); - if ( ! $extract_templates ) { - $wp_dir = dirname( dirname( dirname( $dir ) ) ); - $extract_templates = file_exists( "$wp_dir/wp-admin/user/about.php" ) || ! file_exists( "$wp_dir/wp-load.php" ); - } - if ( $extract_templates ) { - $res = $potextmeta->append( $dir, $output, array( 'Template Name' ) ); - if ( ! $res ) - return false; - $files = scandir( $dir ); - foreach ( $files as $file ) { - if ( '.' == $file[0] || 'CVS' == $file ) - continue; - if ( is_dir( $dir . '/' . $file ) ) { - $res = $potextmeta->append( $dir . '/' . $file, $output, array( 'Template Name' ) ); - if ( ! $res ) - return false; - } - } - } - /* Adding non-gettexted strings can repeat some phrases */ - $output_shell = escapeshellarg($output); - system("msguniq $output_shell -o $output_shell"); - return $res; - } - - public function glotpress( $dir, $output ) { - $output = is_null( $output ) ? "glotpress.pot" : $output; - return $this->xgettext( 'glotpress', $dir, $output ); - } - - public function wporg_bb_forums( $dir, $output ) { - $output = is_null( $output ) ? 'wporg.pot' : $output; - return $this->xgettext( 'wporg-bb-forums', $dir, $output, array(), array( - 'bb-plugins/elfakismet/.*', - 'bb-plugins/support-forum/.*', - 'themes/.*', - ) ); - } - - public function wporg_themes( $dir, $output ) { - $output = is_null( $output ) ? 'wporg-themes.pot' : $output; - return $this->xgettext( 'wporg', $dir, $output, array(), array(), array( - 'plugins/theme-directory/.*', - 'themes/pub/wporg-themes/.*' - ) ); - } - - public function wporg_plugins( $dir, $output ) { - $output = is_null( $output ) ? 'wporg-plugins.pot' : $output; - return $this->xgettext( 'wporg', $dir, $output, array(), array( - 'plugins/svn-track/i18n-tools/.*' - ), array( - '.*\.php', - ) ); - } - - public function wporg_forums( $dir, $output ) { - $output = is_null( $output ) ? 'wporg-forums.pot' : $output; - return $this->xgettext( 'wporg', $dir, $output, array(), array(), array( - '.*\.php', - ) ); - } - - public function wordcamporg( $dir, $output ) { - $output = is_null( $output ) ? 'wordcamporg.pot' : $output; - return $this->xgettext( 'wordcamporg', $dir, $output, array(), array(), array( - '.*\.php', - ) ); - } - - public function rosetta( $dir, $output ) { - $output = is_null( $output )? 'rosetta.pot' : $output; - return $this->xgettext( 'rosetta', $dir, $output, array(), array( - 'mu-plugins/rosetta/i18n-tools/.*', - 'mu-plugins/rosetta/locales/.*', - ), array( - 'mu-plugins/(roles|showcase|downloads)/.*\.php', - 'mu-plugins/jetpack-settings.php', - 'mu-plugins/rosetta.*\.php', - 'mu-plugins/rosetta/[^/]+\.php', - 'mu-plugins/rosetta/tmpl/.*\.php', - 'themes/rosetta/.*\.php', - ) ); - } -} - -// run the CLI only if the file -// wasn't included -$included_files = get_included_files(); -if ($included_files[0] == __FILE__) { - $makepot = new MakePOT; - if ((3 == count($argv) || 4 == count($argv)) && in_array($method = str_replace('-', '_', $argv[1]), get_class_methods($makepot))) { - $res = call_user_func(array($makepot, $method), realpath($argv[2]), isset($argv[3])? $argv[3] : null); - if (false === $res) { - fwrite(STDERR, "Couldn't generate POT file!\n"); - } - } else { - $usage = "Usage: php makepot.php PROJECT DIRECTORY [OUTPUT]\n\n"; - $usage .= "Generate POT file from the files in DIRECTORY [OUTPUT]\n"; - $usage .= "Available projects: ".implode(', ', $makepot->projects)."\n"; - fwrite(STDERR, $usage); - exit(1); - } -} diff --git a/tools/i18n/not-gettexted.php b/tools/i18n/not-gettexted.php deleted file mode 100644 index e8ae2c3143..0000000000 --- a/tools/i18n/not-gettexted.php +++ /dev/null @@ -1,234 +0,0 @@ - 'command_extract', 'replace' => 'command_replace' ); - - - function logmsg() { - $args = func_get_args(); - if ($this->enable_logging) error_log(implode(' ', $args)); - } - - function stderr($msg, $nl=true) { - fwrite(STDERR, $msg.($nl? "\n" : "")); - } - - function cli_die($msg) { - $this->stderr($msg); - exit(1); - } - - function unchanged_token($token, $s='') { - return is_array($token)? $token[1] : $token; - } - - function ignore_token($token, $s='') { - return ''; - } - - function list_php_files($dir) { - $files = array(); - $items = scandir( $dir ); - foreach ( (array) $items as $item ) { - $full_item = $dir . '/' . $item; - if ('.' == $item || '..' == $item) - continue; - if ('.php' == substr($item, -4)) - $files[] = $full_item; - if (is_dir($full_item)) - $files += array_merge($files, NotGettexted::list_php_files($full_item, $files)); - } - return $files; - } - - - function make_string_aggregator($global_array_name, $filename) { - $a = $global_array_name; - return create_function('$string, $comment_id, $line_number', 'global $'.$a.'; $'.$a.'[] = array($string, $comment_id, '.var_export($filename, true).', $line_number);'); - } - - function make_mo_replacer($global_mo_name) { - $m = $global_mo_name; - return create_function('$token, $string', 'global $'.$m.'; return var_export($'.$m.'->translate($string), true);'); - } - - function walk_tokens(&$tokens, $string_action, $other_action, $register_action=null) { - - $current_comment_id = ''; - $current_string = ''; - $current_string_line = 0; - - $result = ''; - $line = 1; - - foreach($tokens as $token) { - if (is_array($token)) { - list($id, $text) = $token; - $line += substr_count($text, "\n"); - if ((T_ML_COMMENT == $id || T_COMMENT == $id) && preg_match('|/\*\s*(/?WP_I18N_[a-z_]+)\s*\*/|i', $text, $matches)) { - if ($this->STAGE_OUTSIDE == $stage) { - $stage = $this->STAGE_START_COMMENT; - $current_comment_id = $matches[1]; - $this->logmsg('start comment', $current_comment_id); - $result .= call_user_func($other_action, $token); - continue; - } - if ($this->STAGE_START_COMMENT <= $stage && $stage <= $this->STAGE_WHITESPACE_AFTER && '/'.$current_comment_id == $matches[1]) { - $stage = $this->STAGE_END_COMMENT; - $this->logmsg('end comment', $current_comment_id); - $result .= call_user_func($other_action, $token); - if (!is_null($register_action)) call_user_func($register_action, $current_string, $current_comment_id, $current_string_line); - continue; - } - } else if (T_CONSTANT_ENCAPSED_STRING == $id) { - if ($this->STAGE_START_COMMENT <= $stage && $stage < $this->STAGE_WHITESPACE_AFTER) { - eval('$current_string='.$text.';'); - $this->logmsg('string', $current_string); - $current_string_line = $line; - $result .= call_user_func($string_action, $token, $current_string); - continue; - } - } else if (T_WHITESPACE == $id) { - if ($this->STAGE_START_COMMENT <= $stage && $stage < $this->STAGE_STRING) { - $stage = $this->STAGE_WHITESPACE_BEFORE; - $this->logmsg('whitespace before'); - $result .= call_user_func($other_action, $token); - continue; - } - if ($this->STAGE_STRING < $stage && $stage < $this->STAGE_END_COMMENT) { - $stage = $this->STAGE_WHITESPACE_AFTER; - $this->logmsg('whitespace after'); - $result .= call_user_func($other_action, $token); - continue; - } - } - } - $result .= call_user_func($other_action, $token); - $stage = $this->STAGE_OUTSIDE; - $current_comment_id = ''; - $current_string = ''; - $current_string_line = 0; - } - return $result; - } - - - function command_extract() { - $args = func_get_args(); - $pot_filename = $args[0]; - if (isset($args[1]) && is_array($args[1])) - $filenames = $args[1]; - else - $filenames = array_slice($args, 1); - - $global_name = '__entries_'.mt_rand(1, 1000); - $GLOBALS[$global_name] = array(); - - foreach($filenames as $filename) { - $tokens = token_get_all(file_get_contents($filename)); - $aggregator = $this->make_string_aggregator($global_name, $filename); - $this->walk_tokens($tokens, array($this, 'ignore_token'), array($this, 'ignore_token'), $aggregator); - } - - $potf = '-' == $pot_filename? STDOUT : @fopen($pot_filename, 'a'); - if (false === $potf) { - $this->cli_die("Couldn't open pot file: $pot_filename"); - } - - foreach($GLOBALS[$global_name] as $item) { - @list($string, $comment_id, $filename, $line_number) = $item; - $filename = isset($filename)? preg_replace('|^\./|', '', $filename) : ''; - $ref_line_number = isset($line_number)? ":$line_number" : ''; - $args = array( - 'singular' => $string, - 'extracted_comments' => "Not gettexted string $comment_id", - 'references' => array("$filename$ref_line_number"), - ); - $entry = new Translation_Entry($args); - fwrite($potf, "\n".PO::export_entry($entry)."\n"); - } - if ('-' != $pot_filename) fclose($potf); - return true; - } - - function command_replace() { - $args = func_get_args(); - $mo_filename = $args[0]; - if (isset($args[1]) && is_array($args[1])) - $filenames = $args[1]; - else - $filenames = array_slice($args, 1); - - $global_name = '__mo_'.mt_rand(1, 1000); - $GLOBALS[$global_name] = new MO(); - $replacer = $this->make_mo_replacer($global_name); - - $res = $GLOBALS[$global_name]->import_from_file($mo_filename); - if (false === $res) { - $this->cli_die("Couldn't read MO file '$mo_filename'!"); - } - foreach($filenames as $filename) { - $source = file_get_contents($filename); - if ( strlen($source) > 150000 ) continue; - $tokens = token_get_all($source); - $new_file = $this->walk_tokens($tokens, $replacer, array($this, 'unchanged_token')); - $f = fopen($filename, 'w'); - fwrite($f, $new_file); - fclose($f); - } - return true; - } - - function usage() { - $this->stderr('php i18n-comments.php COMMAND OUTPUTFILE INPUTFILES'); - $this->stderr('Extracts and replaces strings, which cannot be gettexted'); - $this->stderr('Commands:'); - $this->stderr(' extract POTFILE PHPFILES appends the strings to POTFILE'); - $this->stderr(' replace MOFILE PHPFILES replaces strings in PHPFILES with translations from MOFILE'); - } - - function cli() { - global $argv, $commands; - if (count($argv) < 4 || !in_array($argv[1], array_keys($this->commands))) { - $this->usage(); - exit(1); - } - call_user_func_array(array($this, $this->commands[$argv[1]]), array_slice($argv, 2)); - } -} - -// run the CLI only if the file -// wasn't included -$included_files = get_included_files(); -if ($included_files[0] == __FILE__) { - error_reporting(E_ALL); - $not_gettexted = new NotGettexted; - $not_gettexted->cli(); -} - -?> diff --git a/tools/i18n/pot-ext-meta.php b/tools/i18n/pot-ext-meta.php deleted file mode 100644 index d90e2def6e..0000000000 --- a/tools/i18n/pot-ext-meta.php +++ /dev/null @@ -1,78 +0,0 @@ -get_first_lines($ext_filename); - $pot = ''; - $po = new PO; - foreach($this->headers as $header) { - $string = $makepot->get_addon_header($header, $source); - if (!$string) continue; - $args = array( - 'singular' => $string, - 'extracted_comments' => $header.' of the plugin/theme', - ); - $entry = new Translation_Entry($args); - $pot .= "\n".$po->export_entry($entry)."\n"; - } - return $pot; - } - - function append( $ext_filename, $pot_filename, $headers = null ) { - if ( $headers ) - $this->headers = (array) $headers; - if ( is_dir( $ext_filename ) ) { - $pot = implode('', array_map(array($this, 'load_from_file'), glob("$ext_filename/*.php"))); - } else { - $pot = $this->load_from_file($ext_filename); - } - $potf = '-' == $pot_filename? STDOUT : fopen($pot_filename, 'a'); - if (!$potf) return false; - fwrite($potf, $pot); - if ('-' != $pot_filename) fclose($potf); - return true; - } -} - -$included_files = get_included_files(); -if ($included_files[0] == __FILE__) { - ini_set('display_errors', 1); - $potextmeta = new PotExtMeta; - if (!isset($argv[1])) { - $potextmeta->usage(); - } - $potextmeta->append( $argv[1], isset( $argv[2] ) ? $argv[2] : '-', isset( $argv[3] ) ? $argv[3] : null ); -} - -?> diff --git a/tools/i18n/t/AddTextdomainTest.php b/tools/i18n/t/AddTextdomainTest.php deleted file mode 100644 index 22fb1dece7..0000000000 --- a/tools/i18n/t/AddTextdomainTest.php +++ /dev/null @@ -1,46 +0,0 @@ -atd = new AddTextdomain(); - } - - function test_add() { - // Copy to a new file, so that we don't corrupt the old one. - copy( 'data/add-textdomain-0.php', 'data/add-textdomain-0-work.php' ); - $this->atd->process_file( 'test-domain', 'data/add-textdomain-0-work.php', true ); - $this->assertEquals( file_get_contents( 'data/add-textdomain-0-result.php' ), file_get_contents( 'data/add-textdomain-0-work.php' ) ); - unlink( 'data/add-textdomain-0-work.php' ); - } - - /** - * @dataProvider data_textdomain_sources - */ - function test_basic_add_textdomain( $source, $expected ) { - $tokens = token_get_all( $source ); - $result = $this->atd->process_tokens( 'foo', $tokens ); - $this->assertEquals( $expected, $result ); - } - - function data_textdomain_sources() { - return array( - array( "", "" ), // Simple single quotes - array( '', "" ), // Simple double quotes - array( "", "" ), // Simple single quotes CS - array( '', "" ), // Simple double quotes CS - array( "", "" ), // Multiple string args - array( '', '' ), // Multiple string / var args - array( "", "" ), // Existing textdomain - ); - } -} diff --git a/tools/i18n/t/ExtractTest.php b/tools/i18n/t/ExtractTest.php deleted file mode 100644 index 09634d2117..0000000000 --- a/tools/i18n/t/ExtractTest.php +++ /dev/null @@ -1,227 +0,0 @@ -extractor = new StringExtractor; - $this->extractor->rules = array( - '__' => array('string'), - ); - } - - function test_with_just_a_string() { - $expected = new Translation_Entry( array( 'singular' => 'baba', 'references' => array('baba.php:1') ) ); - $result = $this->extractor->extract_from_code('', 'baba.php' ); - $this->assertEquals( $expected, $result->entries['baba'] ); - } - - function test_entry_from_call_simple() { - $entry = $this->extractor->entry_from_call( array( 'name' => '__', 'args' => array('baba') ), 'baba.php' ); - $this->assertEquals( $entry, new Translation_Entry( array( 'singular' => 'baba' ) ) ); - } - - function test_entry_from_call_nonexisting_function() { - $entry = $this->extractor->entry_from_call( array( 'name' => 'f', 'args' => array('baba') ), 'baba.php' ); - $this->assertEquals( $entry, null ); - } - - function test_entry_from_call_too_few_args() { - $entry = $this->extractor->entry_from_call( array( 'name' => '__', 'args' => array() ), 'baba.php' ); - $this->assertEquals( $entry, null ); - } - - function test_entry_from_call_non_expected_null_arg() { - $this->extractor->rules = array( '_nx' => array( 'singular', 'plural', 'context' ) ); - $entry = $this->extractor->entry_from_call( array( 'name' => '_nx', 'args' => array('%s baba', null, 'noun') ), 'baba.php' ); - $this->assertEquals( $entry, null ); - } - - function test_entry_from_call_more_args_should_be_ok() { - $this->extractor->rules = array( '__' => array('string') ); - $entry = $this->extractor->entry_from_call( array( 'name' => '__', 'args' => array('baba', 5, 'pijo', null) ), 'baba.php' ); - $this->assertEquals( $entry, new Translation_Entry( array( 'singular' => 'baba' ) ) ); - } - - - function test_entry_from_call_context() { - $this->extractor->rules = array( '_x' => array( 'string', 'context' ) ); - $entry = $this->extractor->entry_from_call( array( 'name' => '_x', 'args' => array('baba', 'noun') ), 'baba.php' ); - $this->assertEquals( $entry, new Translation_Entry( array( 'singular' => 'baba', 'context' => 'noun' ) ) ); - } - - function test_entry_from_call_plural() { - $this->extractor->rules = array( '_n' => array( 'singular', 'plural' ) ); - $entry = $this->extractor->entry_from_call( array( 'name' => '_n', 'args' => array('%s baba', '%s babas') ), 'baba.php' ); - $this->assertEquals( $entry, new Translation_Entry( array( 'singular' => '%s baba', 'plural' => '%s babas' ) ) ); - } - - function test_entry_from_call_plural_and_context() { - $this->extractor->rules = array( '_nx' => array( 'singular', 'plural', 'context' ) ); - $entry = $this->extractor->entry_from_call( array( 'name' => '_nx', 'args' => array('%s baba', '%s babas', 'noun') ), 'baba.php' ); - $this->assertEquals( $entry, new Translation_Entry( array( 'singular' => '%s baba', 'plural' => '%s babas', 'context' => 'noun' ) ) ); - } - - function test_entry_from_call_extracted_comment() { - $entry = $this->extractor->entry_from_call( array( 'name' => '__', 'args' => array('baba'), 'comment' => 'translators: give me back my pants!' ), 'baba.php' ); - $this->assertEquals( $entry, new Translation_Entry( array( 'singular' => 'baba', 'extracted_comments' => "translators: give me back my pants!\n" ) ) ); - } - - function test_entry_from_call_line_number() { - $entry = $this->extractor->entry_from_call( array( 'name' => '__', 'args' => array('baba'), 'line' => 10 ), 'baba.php' ); - $this->assertEquals( $entry, new Translation_Entry( array( 'singular' => 'baba', 'references' => array('baba.php:10') ) ) ); - } - - function test_entry_from_call_zero() { - $entry = $this->extractor->entry_from_call( array( 'name' => '__', 'args' => array('0') ), 'baba.php' ); - $this->assertEquals( $entry, new Translation_Entry( array( 'singular' => '0' ) ) ); - } - - function test_entry_from_call_multiple() { - $this->extractor->rules = array( 'c' => array( 'string', 'singular', 'plural' ) ); - $entries = $this->extractor->entry_from_call( array( 'name' => 'c', 'args' => array('baba', 'dyado', 'dyados') ), 'baba.php' ); - $this->assertEquals( array( - new Translation_Entry( array( 'singular' => 'baba' ) ), new Translation_Entry( array( 'singular' => 'dyado', 'plural' => 'dyados' ) ) ), $entries ); - } - - function test_entry_from_call_multiple_first_plural_then_two_strings() { - $this->extractor->rules = array( 'c' => array( 'singular', 'plural', null, 'string', 'string' ) ); - $entries = $this->extractor->entry_from_call( array( 'name' => 'c', 'args' => array('dyado', 'dyados', 'baba', 'foo', 'bar') ), 'baba.php' ); - $this->assertEquals( array( - new Translation_Entry( array( 'singular' => 'dyado', 'plural' => 'dyados' ) ), - new Translation_Entry( array( 'singular' => 'foo' ) ), - new Translation_Entry( array( 'singular' => 'bar' ) ) ), $entries ); - } - - function test_find_function_calls_one_arg_literal() { - $this->assertEquals( array( array( 'name' => '__', 'args' => array( 'baba' ), 'line' => 1 ) ), $this->extractor->find_function_calls( array('__'), '' ) ); - } - - function test_find_function_calls_one_arg_zero() { - $this->assertEquals( array( array( 'name' => '__', 'args' => array( '0' ), 'line' => 1 ) ), $this->extractor->find_function_calls( array('__'), '' ) ); - } - - function test_find_function_calls_one_arg_non_literal() { - $this->assertEquals( array( array( 'name' => '__', 'args' => array( null ), 'line' => 1 ) ), $this->extractor->find_function_calls( array('__'), '' ) ); - } - - function test_find_function_calls_shouldnt_be_mistaken_by_a_class() { - $this->assertEquals( array(), $this->extractor->find_function_calls( array('__'), 'assertEquals( array( array( 'name' => 'f', 'args' => array( null, "baba" ), 'line' => 1 ) ), $this->extractor->find_function_calls( array('f'), 'assertEquals( array( array( 'name' => 'f', 'args' => array( null, "baba", null ), 'line' => 1 ) ), $this->extractor->find_function_calls( array('f'), 'assertEquals( array( array( 'name' => 'f', 'args' => array( null ), 'line' => 1 ) ), $this->extractor->find_function_calls( array('f'), 'assertEquals( array( array( 'name' => 'f', 'args' => array( null ), 'line' => 1 ) ), $this->extractor->find_function_calls( array('f'), 'assertEquals( array( array( 'name' => 'f', 'args' => array( "baba", null ), 'line' => 1 ) ), $this->extractor->find_function_calls( array('f'), 'assertEquals( array( array( 'name' => 'f', 'args' => array( null, "baba" ), 'line' => 1 ) ), $this->extractor->find_function_calls( array('f'), 'assertEquals( - array( array( 'name' => 'f', 'args' => array( 'baba' ), 'line' => 1, 'comment' => 'translators: let your ears fly!' ) ), - $this->extractor->find_function_calls( array('f'), 'assertEquals( - array( array( 'name' => 'f', 'args' => array( 'baba' ), 'line' => 1, 'comment' => 'translators: let your ears fly!' ) ), - $this->extractor->find_function_calls( array('f'), 'assertEquals( - array( array( 'name' => 'f', 'args' => array( 'baba' ), 'line' => 1, 'comment' => 'translators: let your ears fly!' ) ), - $this->extractor->find_function_calls( array('f'), 'assertEquals( array( array( - 'name' => '__', 'args' => array( 'on' ), 'line' => 6, - 'comment' => "Translators: If there are characters in your language that are not supported by Lato, translate this to 'off'. Do not translate into your own language." - ) ), - $this->extractor->find_function_calls( array( '__' ), - "assertEquals( array( array( - 'name' => '__', 'args' => array( 'on' ), 'line' => 3, - 'comment' => 'translators: let your ears fly!' - ) ), - $this->extractor->find_function_calls( array( '__' ), - "assertEquals( array( array( - 'name' => '__', 'args' => array( 'F j, Y g:i a' ), 'line' => 3, - 'comment' => 'translators: localized date and time format, see https://secure.php.net/date' - ) ), - $this->extractor->find_function_calls( array( '__' ), - "assertEquals( - array( array( 'name' => 'f', 'args' => array( 'baba' ), 'line' => 1, 'comment' => 'Translators: let your ears fly!' ) ), - $this->extractor->find_function_calls( array('f'), 'ng = new NotGettexted; - } - - function test_make_string_aggregator() { - global $baba; - $f = $this->ng->make_string_aggregator( 'baba', 'baba.php' ); - call_user_func( $f, 'x', 'y', 'z' ); - call_user_func( $f, 'a', 'b', 'c' ); - $this->assertEquals( array( array( 'x', 'y', 'baba.php', 'z'), array( 'a', 'b', 'baba.php', 'c' ) ), $baba ); - } - - function test_walk() { - $code = ' -'; - $tokens = token_get_all($code); - $this->assertEquals( '', $this->ng->walk_tokens( $tokens, array($this->ng, 'ignore_token'), array($this->ng, 'ignore_token') ) ); - $this->assertEquals( '"yes"\'We died %d times!\'', $this->ng->walk_tokens( $tokens, array($this->ng, 'unchanged_token'), array($this->ng, 'ignore_token') ) ); - $this->assertEquals( $code, $this->ng->walk_tokens( $tokens, array($this->ng, 'unchanged_token'), array($this->ng, 'unchanged_token') ) ); - $this->assertEquals( $code, $this->ng->walk_tokens( $tokens, array($this->ng, 'unchanged_token'), array($this->ng, 'unchanged_token') ) ); - } - - function test_replace() { - # copy to a new file, so that we don't corrupt the old one - copy( 'data/not-gettexted-0.php', 'data/not-gettexted-0-work.php' ); - $this->ng->command_replace( 'data/not-gettexted-0.mo', 'data/not-gettexted-0-work.php' ); - $this->assertEquals( file_get_contents( 'data/not-gettexted-0-result.php' ), file_get_contents( 'data/not-gettexted-0-work.php' ) ); - unlink( 'data/not-gettexted-0-work.php' ); - } -} diff --git a/tools/i18n/t/data/add-textdomain-0-result.php b/tools/i18n/t/data/add-textdomain-0-result.php deleted file mode 100644 index d518a9de17..0000000000 --- a/tools/i18n/t/data/add-textdomain-0-result.php +++ /dev/null @@ -1,18 +0,0 @@ -wp-config.php file. I need this before we can get started. Need more help? We got it. You can create a wp-config.php file through a web interface, but this doesn\'t work for all server setups. The safest way is to manually create the file.

Create a Configuration File' /*/WP_I18N_CONFIG*/, $path.'setup-config.php'), /*WP_I18N_ERROR*/ 'Translation: WordPress › Error' /*/WP_I18N_ERROR*/); -} - -$wp_did_header = true; - -require_once( dirname(__FILE__) . '/wp-config.php'); - -wp(); - -require_once(ABSPATH . WPINC . '/template-loader.php'); - -endif; - -?> diff --git a/tools/i18n/t/data/not-gettexted-0.mo b/tools/i18n/t/data/not-gettexted-0.mo deleted file mode 100644 index 4042fb05bbb68d220eb508a4d3801196d2069191..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1227 zcmeHF&2G~`5H?VRlp`k&9OhDdC~GI7NNMVXLkUu(6e1K+ae|3GwildTvpa6u2jLNT z0A7U$;3aqg#%`mk2PCdYj6536c>ca`=jX${uYt%t(Z`~PqW47?qOE)s{dOk^Q0ybo z2X}+uhgcB%UE;sQ?zcI6K_G4?Z7&I539L$T1eqmoLIzK?0k*IvKuA)X(R5p@)S6ru zQC-$a+{GZ*6-6)yLzDrR+Dk=lrO}okMFRy%FGk0dMew>!+O&U5s_GYzAe4^sNmw%1 zi5pAu@YDeBj))nzA)2vPL;nwtUdPY!K2F*!~(+J+%rW=6mUDvbF|Z3Ck_e;7qt#w%ouI=kZHp zk74GVb-~ivPn5EnXX+g}FGXYME#ItE*HK*cQi$nd>Mfn?Hsd-p?Dt2if2f8-7#xj< z&kp($=`GN+S~)bnLbgsS7ifwG3sNh>jrgbY)7j0iLDcWb(o9CmE^8UZbir|5p*F{m ymgt1EiS|~FM$eDb;3m19k&{z1BPS(KJ%-U*b1&Ep@38#8&VS%KZ@t(bPxUv6af?X+ diff --git a/tools/i18n/t/data/not-gettexted-0.php b/tools/i18n/t/data/not-gettexted-0.php deleted file mode 100644 index dbef5c0814..0000000000 --- a/tools/i18n/t/data/not-gettexted-0.php +++ /dev/null @@ -1,24 +0,0 @@ -wp-config.php file. I need this before we can get started. Need more help? We got it. You can create a wp-config.php file through a web interface, but this doesn't work for all server setups. The safest way is to manually create the file.

Create a Configuration File" /*/WP_I18N_CONFIG*/, $path.'setup-config.php'), /*WP_I18N_ERROR*/ "WordPress › Error" /*/WP_I18N_ERROR*/); -} - -$wp_did_header = true; - -require_once( dirname(__FILE__) . '/wp-config.php'); - -wp(); - -require_once(ABSPATH . WPINC . '/template-loader.php'); - -endif; - -?> diff --git a/tools/i18n/t/data/not-gettexted-0.po b/tools/i18n/t/data/not-gettexted-0.po deleted file mode 100644 index 606ac7e5c3..0000000000 --- a/tools/i18n/t/data/not-gettexted-0.po +++ /dev/null @@ -1,21 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: \n" -"PO-Revision-Date: 2008-04-22 19:23+0200\n" -"Last-Translator: \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=iso-8859-1\n" -"Content-Transfer-Encoding: 8bit\n" - -#. Not gettexted string WP_I18N_CONFIG -#: not-gettext-0.php:11 -msgid " There doesn't seem to be a wp-config.php file. I need this before we can get started. Need more help? We got it. You can create a wp-config.php file through a web interface, but this doesn't work for all server setups. The safest way is to manually create the file.

Create a Configuration File" -msgstr "Translation: There doesn't seem to be a wp-config.php file. I need this before we can get started. Need more help? We got it. You can create a wp-config.php file through a web interface, but this doesn't work for all server setups. The safest way is to manually create the file.

Create a Configuration File" - -#. Not gettexted string WP_I18N_ERROR -#: not-gettext-0.php:11 -msgid "WordPress › Error" -msgstr "Translation: WordPress › Error" -