@@ =xU=xU =xUP.V筋hR@i9&Z«x+@@=xU8֠x nMT:YTd+Na#/)­:MA=xU[^k0=xU=xU =xU@@7xU=xU=xU=xU>xU P=xU=xU!`=xUP=xU`@ =xU Academic and Research Institutions CAM@p>xU!Pv4xUP=xU@@=xUeWãtW=j[`4K=VY q=xU;xU@Q >xU=xU p]?xUGnUgl&N+zeiicc;&P.yH¾0G{I<|F,1bȉ vC.S| P@#>xUxU=xU>xU[^k!=xU[^k@ =xU` =xU0=xU @=xU!=xU=xU 0=xU TLS RSA4096 Root G5=xUQ=xU>xU !=xU=xUp>xUzI:;(rmeG&kKl ^U044XWS0٩tQXI1̘N`urO%*x-AXrA=xUP]?xU-7McP7xU=xU@xUp>xU2k0=xU=xU=xUu?xU?xU`=xU=xU=xU=xUp=xU=xU`=xU@p=xU=xU =xUg?xUxUȹ> *.0 *H=0N1 0 UUS10U DigiCert, Inc.1&0$UDigiCert TLS ECC P384 Root G50 210115000000Z 460114235959Z0N1 0 UUS10U DigiCert, Inc.1&0$UDigiCert TLS ECC P384 Root G50v0*H=+"bDP#5w5O;ݔrR;{kX 왮hu N f0LG ,Z "|j0U0U0г9xU`9xU9xU=xUkx8=xUk|=xUk=xU=xU=xUk =xU=xU=xUP=xUk@hh9xU=xU8=xU9xU=xUkp=xUk =xU=xUk9xU=xUk=xUk=xU$k=xU=xU =xU:k =xU=xU=xUP=xUDk =xU =xU=xU=xUQk@h9xUP=xU=xU =xU=xUUk=xU_k =xU=xUik9xU=xUmk=xUqk!@=xUk=xU=xUp=xUk =xU@=xU0=xU=xUk@g9xUp=xU=xUp=xU=xUkO=xUk =xU0=xUk9xU=xUkg=xUkk`=xUkh=xU0=xU=xUk h=xU`=xUP=xU=xUk h=xU=xU=xU=xUk@0g9xU=xU=xU=xUP=xUk0=xUk P=xU=xUk9xUh=xUk>xUk=xU$k>xU=xU=xU3k >xU=xU=xU0>xU@k@f9xUl; } if ( $entry->context ) { $exported = $entry->context . "\4" . $exported; } return $exported; } /** * @param Translation_Entry $entry * @return string */ public function export_translations( $entry ) { // TODO: Warnings for control characters. return $entry->is_plural ? implode( "\0", $entry->translations ) : $entry->translations[0]; } /** * @return string */ public function export_headers() { $exported = ''; foreach ( $this->headers as $header => $value ) { $exported .= "$header: $value\n"; } return $exported; } /** * @param int $magic * @return string|false */ public function get_byteorder( $magic ) { // The magic is 0x950412de. // bug in PHP 5.0.2, see https://savannah.nongnu.org/bugs/?func=detailitem&item_id=10565 $magic_little = (int) - 1794895138; $magic_little_64 = (int) 2500072158; // 0xde120495 $magic_big = ( (int) - 569244523 ) & 0xFFFFFFFF; if ( $magic_little == $magic || $magic_little_64 == $magic ) { return 'little'; } elseif ( $magic_big == $magic ) { return 'big'; } else { return false; } } /** * @param POMO_FileReader $reader * @return bool True if the import was successful, otherwise false. */ public function import_from_reader( $reader ) { $endian_string = MO::get_byteorder( $reader->readint32() ); if ( false === $endian_string ) { return false; } $reader->setEndian( $endian_string ); $endian = ( 'big' === $endian_string ) ? 'N' : 'V'; $header = $reader->read( 24 ); if ( $reader->strlen( $header ) != 24 ) { return false; } // Parse header. $header = unpack( "{$endian}revision/{$endian}total/{$endian}originals_lengths_addr/{$endian}translations_lengths_addr/{$endian}hash_length/{$endian}hash_addr", $header ); if ( ! is_array( $header ) ) { return false; } // Support revision 0 of MO format specs, only. if ( 0 != $header['revision'] ) { return false; } // Seek to data blocks. $reader->seekto( $header['originals_lengths_addr'] ); // Read originals' indices. $originals_lengths_length = $header['translations_lengths_addr'] - $header['originals_lengths_addr']; if ( $originals_lengths_length != $header['total'] * 8 ) { return false; } $originals = $reader->read( $originals_lengths_length ); if ( $reader->strlen( $originals ) != $originals_lengths_length ) { return false; } // Read translations' indices. $translations_lengths_length = $header['hash_addr'] - $header['translations_lengths_addr']; if ( $translations_lengths_length != $header['total'] * 8 ) { return false; } $translations = $reader->read( $translations_lengths_length ); if ( $reader->strlen( $translations ) != $translations_lengths_length ) { return false; } // Transform raw data into set of indices. $originals = $reader->str_split( $originals, 8 ); $translations = $reader->str_split( $translations, 8 ); // Skip hash table. $strings_addr = $header['hash_addr'] + $header['hash_length'] * 4; $reader->seekto( $strings_addr ); $strings = $reader->read_all(); $reader->close(); for ( $i = 0; $i < $header['total']; $i++ ) { $o = unpack( "{$endian}length/{$endian}pos", $originals[ $i ] ); $t = unpack( "{$endian}length/{$endian}pos", $translations[ $i ] ); if ( ! $o || ! $t ) { return false; } // Adjust offset due to reading strings to separate space before. $o['pos'] -= $strings_addr; $t['pos'] -= $strings_addr; $original = $reader->substr( $strings, $o['pos'], $o['length'] ); $translation = $reader->substr( $strings, $t['pos'], $t['length'] ); if ( '' === $original ) { $this->set_headers( $this->make_headers( $translation ) ); } else { $entry = &$this->make_entry( $original, $translation ); $this->entries[ $entry->key() ] = &$entry; } } return true; } /** * Build a Translation_Entry from original string and translation strings, * found in a MO file * * @static * @param string $original original string to translate from MO file. Might contain * 0x04 as context separator or 0x00 as singular/plural separator * @param string $translation translation string from MO file. Might contain * 0x00 as a plural translations separator * @return Translation_Entry Entry instance. */ public function &make_entry( $original, $translation ) { $entry = new Translation_Entry(); // Look for context, separated by \4. $parts = explode( "\4", $original ); if ( isset( $parts[1] ) ) { $original = $parts[1]; $entry->context = $parts[0]; } // Look for plural original. $parts = explode( "\0", $original ); $entry->singular = $parts[0]; if ( isset( $parts[1] ) ) { $entry->is_plural = true; $entry->plural = $parts[1]; } // Plural translations are also separated by \0. $entry->translations = explode( "\0", $translation ); return $entry; } /** * @param int $count * @return string */ public function select_plural_form( $count ) { return $this->gettext_select_plural_form( $count ); } /** * @return int */ public function get_plural_forms_count() { return $this->_nplurals; } } endif;