[ Index ] |
PHP Cross Reference of GlotPress |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * GlotPress Format Mac OSX / iOS Strings Translate class 4 * 5 * @since 1.0.0 6 * 7 * @package GlotPress 8 */ 9 10 /** 11 * Format class used to support Mac OS X / iOS Translate strings file format. 12 * 13 * @since 1.0.0 14 */ 15 class GP_Format_Strings extends GP_Format { 16 /** 17 * Name of file format, used in file format dropdowns. 18 * 19 * @since 1.0.0 20 * 21 * @var string 22 */ 23 public $name = 'Mac OS X / iOS Strings File (.strings)'; 24 25 /** 26 * File extension of the file format, used to autodetect formats and when creating the output file names. 27 * 28 * @since 1.0.0 29 * 30 * @var string 31 */ 32 public $extension = 'strings'; 33 34 /** 35 * Generates a string the contains the $entries to export in the strings file format. 36 * 37 * @since 1.0.0 38 * 39 * @param GP_Project $project The project the strings are being exported for, not used 40 * in this format but part of the scaffold of the parent object. 41 * @param GP_Locale $locale The locale object the strings are being exported for. not used 42 * in this format but part of the scaffold of the parent object. 43 * @param GP_Translation_Set $translation_set The locale object the strings are being 44 * exported for. not used in this format but part 45 * of the scaffold of the parent object. 46 * @param GP_Translation $entries The entries to export. 47 * @return string The exported strings string. 48 */ 49 public function print_exported_file( $project, $locale, $translation_set, $entries ) { 50 $result = ''; 51 52 $result .= '/* Translation-Revision-Date: ' . GP::$translation->last_modified( $translation_set ) . "+0000 */\n"; 53 $result .= "/* Plural-Forms: nplurals={$locale->nplurals}; plural={$locale->plural_expression}; */\n"; 54 $result .= '/* Generator: GlotPress/' . GP_VERSION . " */\n"; 55 56 $language_code = $this->get_language_code( $locale ); 57 if ( false !== $language_code ) { 58 $result .= '/* Language: ' . $language_code . " */\n"; 59 } 60 61 $result .= "\n"; 62 63 $sorted_entries = $entries; 64 usort( $sorted_entries, array( 'GP_Format_Strings', 'sort_entries' ) ); 65 66 foreach ( $sorted_entries as $entry ) { 67 $translation = $this->escape( empty( $entry->translations ) ? $entry->singular : $entry->translations[0] ); 68 69 $context = str_replace( "\n", "\\n", $this->escape( $entry->context ) ); 70 $translation = str_replace( "\n", "\\n", $translation ); 71 $comment = preg_replace( '/(^\s+)|(\s+$)/us', '', $entry->extracted_comments ); 72 73 if ( '' == $comment ) { 74 $comment = 'No comment provided by engineer.'; 75 } 76 77 $result .= "/* $comment */\n\"$context\" = \"$translation\";\n\n"; 78 } 79 80 return $result; 81 } 82 83 /** 84 * Reads a set of original strings from a strings file. 85 * 86 * @since 1.0.0 87 * 88 * @param string $file_name The name of the uploaded strings file. 89 * @return Translations|bool The extracted originals on success, false on failure. 90 */ 91 public function read_originals_from_file( $file_name ) { 92 $entries = new Translations(); 93 $file = file_get_contents( $file_name ); 94 95 if ( false === $file ) { 96 return false; 97 } 98 99 /** 100 * Check to see if the input file is UTF-16/32 encoded, if so convert it to UTF-8. 101 * 102 * Note, Apple recommends UTF-8 but some of their tools (like genstrings) export 103 * UTF-16LE or UTF-16BE. To remain backwards compatible we support both for importing, 104 * but we only export UTF-8. 105 */ 106 foreach ( 107 array( 108 // See https://www.php.net/manual/en/function.mb-detect-encoding.php#91051. 109 'UTF-8' => chr( 0xEF ) . chr( 0xBB ) . chr( 0xBF ), 110 'UTF-32BE' => chr( 0x00 ) . chr( 0x00 ) . chr( 0xFE ) . chr( 0xFF ), 111 'UTF-32LE' => chr( 0xFF ) . chr( 0xFE ) . chr( 0x00 ) . chr( 0x00 ), 112 'UTF-16LE' => chr( 0xFF ) . chr( 0xFE ), 113 'UTF-16BE' => chr( 0xFE ) . chr( 0xFF ), 114 ) as $encoding => $bom 115 ) { 116 if ( 0 === strpos( $file, $bom ) ) { 117 if ( 'UTF-8' !== $encoding ) { 118 $file = mb_convert_encoding( $file, 'UTF-8', $encoding ); 119 } 120 break; 121 } 122 } 123 124 // Convert multi-line comments into a single line. 125 $file = preg_replace_callback( 126 '/\/\*\s*(.*?)\s*\*\//s', 127 function( $m ) { 128 return str_replace( PHP_EOL, '\n', $m[0] ); 129 }, 130 $file 131 ); 132 133 $context = $comment = null; 134 $lines = explode( "\n", $file ); 135 136 foreach ( $lines as $line ) { 137 if ( is_null( $context ) ) { 138 if ( preg_match( '/^\/\*\s*(.*)\s*\*\/$/', $line, $matches ) ) { 139 $matches[1] = trim( str_replace( '\n', PHP_EOL, $matches[1] ) ); 140 141 if ( 'No comment provided by engineer.' !== $matches[1] ) { 142 $comment = $matches[1]; 143 } else { 144 $comment = null; 145 } 146 } elseif ( preg_match( '/^"(.*)" = "(.*)";$/', $line, $matches ) ) { 147 $entry = new Translation_Entry(); 148 $entry->context = $this->unescape( $matches[1] ); 149 $entry->singular = $this->unescape( $matches[2] ); 150 151 if ( ! is_null( $comment ) ) { 152 $entry->extracted_comments = $comment; 153 $comment = null; 154 } 155 156 $entry->translations = array(); 157 $entries->add_entry( $entry ); 158 } 159 } 160 } 161 162 return $entries; 163 } 164 165 /** 166 * Sorts the translation entries based on the context attribute. 167 * 168 * @since 1.0.0 169 * 170 * @param string $a First string to compare. 171 * @param string $b Second string to compare. 172 * @return int +1 or -1 based on the order to sort. 173 */ 174 private function sort_entries( $a, $b ) { 175 if ( $a->context == $b->context ) { 176 return 0; 177 } 178 179 return ( $a->context > $b->context ) ? +1 : -1; 180 } 181 182 /** 183 * Strips any escaping from a string. 184 * 185 * @since 1.0.0 186 * 187 * @param string $string The string to strip escapes from. 188 * @return string The unescaped string. 189 */ 190 private function unescape( $string ) { 191 return stripcslashes( $string ); 192 } 193 194 /** 195 * Adds escaping to a string. 196 * 197 * @since 1.0.0 198 * 199 * @param string $string The string to add escapes to. 200 * @return string The escaped string. 201 */ 202 private function escape( $string ) { 203 return addcslashes( $string, '"\\/' ); 204 } 205 206 } 207 208 GP::$formats['strings'] = new GP_Format_Strings();
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Oct 4 01:01:08 2024 | Cross-referenced by PHPXref 0.7.1 |