group->getMangler()->mangle( $messages ); return [ 'AUTHORS' => $authors, 'MESSAGES' => $messages ]; } /** * @param MessageCollection $collection * @return string */ public function writeReal( MessageCollection $collection ) { $header = $this->header( $collection->code, $collection->getAuthors() ); $mangler = $this->group->getMangler(); /** * Get and write messages. */ $body = ''; /** * @var TMessage $message */ foreach ( $collection as $message ) { if ( strlen( $message->translation() ) === 0 ) { continue; } $key = $mangler->unmangle( $message->key() ); $key = $this->transformKey( self::escapeJsString( $key ) ); $translation = self::escapeJsString( $message->translation() ); $body .= "\t{$key}: \"{$translation}\",\n"; } if ( strlen( $body ) === 0 ) { return false; } /** * Strip last comma, re-add trailing newlines. */ $body = substr( $body, 0, -2 ); $body .= "\n"; return $header . $body . $this->footer(); } /** * @param string[] $authors * @return string */ protected function authorsList( array $authors ) { if ( $authors === [] ) { return ''; } $authorsList = ''; foreach ( $authors as $author ) { $authorsList .= " * - $author\n"; } // Remove trailing newline, and return. return substr( " * Translators:\n$authorsList", 0, -1 ); } // See ECMA 262 section 7.8.4 for string literal format private static $pairs = [ "\\" => "\\\\", "\"" => "\\\"", "'" => "\\'", "\n" => "\\n", "\r" => "\\r", // To avoid closing the element or CDATA section. '<' => "\\x3c", '>' => "\\x3e", // To avoid any complaints about bad entity refs. '&' => "\\x26", /* * Work around https://bugzilla.mozilla.org/show_bug.cgi?id=274152 * Encode certain Unicode formatting chars so affected * versions of Gecko do not misinterpret our strings; * this is a common problem with Farsi text. */ "\xe2\x80\x8c" => "\\u200c", // ZERO WIDTH NON-JOINER "\xe2\x80\x8d" => "\\u200d", // ZERO WIDTH JOINER ]; /** * @param string $string * @return string */ protected static function escapeJsString( $string ) { return strtr( $string, self::$pairs ); } /** * @param string $string * @return string */ protected static function unescapeJsString( $string ) { return strtr( $string, array_flip( self::$pairs ) ); } } /** * File format support for Shapado, which uses JavaScript based format. * @ingroup FFS */ class ShapadoJsFFS extends JavaScriptFFS { /** * @param string $key * * @return string */ protected function transformKey( $key ) { return $key; } /** * @param string $code * @param string[] $authors * @return string */ protected function header( $code, array $authors ) { global $wgSitename; $name = TranslateUtils::getLanguageName( $code ); $native = TranslateUtils::getLanguageName( $code, $code ); $authorsList = $this->authorsList( $authors ); /** @cond doxygen_bug */ return <<