[ Index ] |
|
Code source de PRADO 3.0.6 |
1 <?php 2 3 /** 4 * MessageFormat class file. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the BSD License. 8 * 9 * Copyright(c) 2004 by Qiang Xue. All rights reserved. 10 * 11 * To contact the author write to {@link mailto:qiang.xue@gmail.com Qiang Xue} 12 * The latest version of PRADO can be obtained from: 13 * {@link http://prado.sourceforge.net/} 14 * 15 * @author Wei Zhuo <weizhuo[at]gmail[dot]com> 16 * @version $Revision: 1.5 $ $Date: 2005/08/27 03:21:12 $ 17 * @package System.I18N.core 18 */ 19 20 /** 21 * Get the MessageSource classes. 22 */ 23 require_once(dirname(__FILE__).'/MessageSource.php'); 24 25 /** 26 * Get the encoding utilities 27 */ 28 require_once(dirname(__FILE__).'/util.php'); 29 30 /** 31 * MessageFormat class. 32 * 33 * Format a message, that is, for a particular message find the 34 * translated message. The following is an example using 35 * a SQLite database to store the translation message. 36 * Create a new message format instance and echo "Hello" 37 * in simplified Chinese. This assumes that the world "Hello" 38 * is translated in the database. 39 * 40 * <code> 41 * $source = MessageSource::factory('SQLite', 'sqlite://messages.db'); 42 * $source->setCulture('zh_CN'); 43 * $source->setCache(new MessageCache('./tmp')); 44 * 45 * $formatter = new MessageFormat($source); 46 * 47 * echo $formatter->format('Hello'); 48 * </code> 49 * 50 * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com> 51 * @version v1.0, last update on Fri Dec 24 20:46:16 EST 2004 52 * @package System.I18N.core 53 */ 54 class MessageFormat 55 { 56 /** 57 * The message source. 58 * @var MessageSource 59 */ 60 protected $source; 61 62 /** 63 * A list of loaded message catalogues. 64 * @var array 65 */ 66 protected $catagloues = array(); 67 68 /** 69 * The translation messages. 70 * @var array 71 */ 72 protected $messages = array(); 73 74 /** 75 * A list of untranslated messages. 76 * @var array 77 */ 78 protected $untranslated = array(); 79 80 /** 81 * The prefix and suffix to append to untranslated messages. 82 * @var array 83 */ 84 protected $postscript = array('',''); 85 86 /** 87 * Set the default catalogue. 88 * @var string 89 */ 90 public $Catalogue; 91 92 /** 93 * Output encoding charset 94 * @var string 95 */ 96 protected $charset = 'UTF-8'; 97 98 /** 99 * Constructor. 100 * Create a new instance of MessageFormat using the messages 101 * from the supplied message source. 102 * @param MessageSource the source of translation messages. 103 * @param string charset for the message output. 104 */ 105 function __construct(IMessageSource $source, $charset='UTF-8') 106 { 107 $this->source = $source; 108 $this->setCharset($charset); 109 } 110 111 /** 112 * Sets the charset for message output. 113 * @param string charset, default is UTF-8 114 */ 115 public function setCharset($charset) 116 { 117 $this->charset = $charset; 118 } 119 120 /** 121 * Gets the charset for message output. Default is UTF-8. 122 * @return string charset, default UTF-8 123 */ 124 public function getCharset() 125 { 126 return $this->charset; 127 } 128 129 /** 130 * Load the message from a particular catalogue. A listed 131 * loaded catalogues is kept to prevent reload of the same 132 * catalogue. The load catalogue messages are stored 133 * in the $this->message array. 134 * @param string message catalogue to load. 135 */ 136 protected function loadCatalogue($catalogue) 137 { 138 if(in_array($catalogue,$this->catagloues)) 139 return; 140 141 if($this->source->load($catalogue)) 142 { 143 $this->messages[$catalogue] = $this->source->read(); 144 $this->catagloues[] = $catalogue; 145 } 146 } 147 148 /** 149 * Format the string. That is, for a particular string find 150 * the corresponding translation. Variable subsitution is performed 151 * for the $args parameter. A different catalogue can be specified 152 * using the $catalogue parameter. 153 * The output charset is determined by $this->getCharset(); 154 * @param string the string to translate. 155 * @param array a list of string to substitute. 156 * @param string get the translation from a particular message 157 * @param string charset, the input AND output charset 158 * catalogue. 159 * @return string translated string. 160 */ 161 public function format($string,$args=array(), $catalogue=null, $charset=null) 162 { 163 if(empty($charset)) $charset = $this->getCharset(); 164 165 //force args as UTF-8 166 foreach($args as $k => $v) 167 $args[$k] = I18N_toUTF8($v, $charset); 168 $s = $this->formatString(I18N_toUTF8($string, $charset),$args,$catalogue); 169 return I18N_toEncoding($s, $charset); 170 } 171 172 /** 173 * Do string translation. 174 * @param string the string to translate. 175 * @param array a list of string to substitute. 176 * @param string get the translation from a particular message 177 * catalogue. 178 * @return string translated string. 179 */ 180 protected function formatString($string, $args=array(), $catalogue=null) 181 { 182 if(empty($catalogue)) 183 { 184 if(empty($this->Catalogue)) 185 $catalogue = 'messages'; 186 else 187 $catalogue = $this->Catalogue; 188 } 189 190 $this->loadCatalogue($catalogue); 191 192 if(empty($args)) 193 $args = array(); 194 195 foreach($this->messages[$catalogue] as $variant) 196 { 197 // foreach of the translation units 198 foreach($variant as $source => $result) 199 { 200 // we found it, so return the target translation 201 if($source == $string) 202 { 203 //check if it contains only strings. 204 if(is_string($result)) 205 $target = $result; 206 else 207 { 208 $target = $result[0]; 209 } 210 //found, but untranslated 211 if(empty($target)) 212 { 213 return $this->postscript[0]. 214 strtr($string, $args). 215 $this->postscript[1]; 216 } 217 else 218 return strtr($target, $args); 219 } 220 } 221 } 222 223 // well we did not find the translation string. 224 $this->source->append($string); 225 226 return $this->postscript[0]. 227 strtr($string, $args). 228 $this->postscript[1]; 229 } 230 231 /** 232 * Get the message source. 233 * @return MessageSource 234 */ 235 function getSource() 236 { 237 return $this->source; 238 } 239 240 /** 241 * Set the prefix and suffix to append to untranslated messages. 242 * e.g. $postscript=array('[T]','[/T]'); will output 243 * "[T]Hello[/T]" if the translation for "Hello" can not be determined. 244 * @param array first element is the prefix, second element the suffix. 245 */ 246 function setUntranslatedPS($postscript) 247 { 248 if(is_array($postscript) && count($postscript)>=2) 249 { 250 $this->postscript[0] = $postscript[0]; 251 $this->postscript[1] = $postscript[1]; 252 } 253 } 254 } 255 256 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sun Feb 25 21:07:04 2007 | par Balluche grâce à PHPXref 0.7 |