You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							97 lines
						
					
					
						
							2.7 KiB
						
					
					
				
			
		
		
	
	
							97 lines
						
					
					
						
							2.7 KiB
						
					
					
				| <?php | |
| /** | |
|  * @link http://www.yiiframework.com/ | |
|  * @copyright Copyright (c) 2008 Yii Software LLC | |
|  * @license http://www.yiiframework.com/license/ | |
|  */ | |
|  | |
| namespace yii\i18n; | |
|  | |
| use Yii; | |
|  | |
| /** | |
|  * GettextPoFile represents a PO Gettext message file. | |
|  * | |
|  * @author Qiang Xue <qiang.xue@gmail.com> | |
|  * @since 2.0 | |
|  */ | |
| class GettextPoFile extends GettextFile | |
| { | |
| 	/** | |
| 	 * Loads messages from a PO file. | |
| 	 * @param string $filePath file path | |
| 	 * @param string $context message context | |
| 	 * @return array message translations. Array keys are source messages and array values are translated messages: | |
| 	 * source message => translated message. | |
| 	 */ | |
| 	public function load($filePath, $context) | |
| 	{ | |
| 		$pattern = '/(msgctxt\s+"(.*?(?<!\\\\))")?\s+' // context | |
| 			. 'msgid\s+((?:".*(?<!\\\\)"\s*)+)\s+' // message ID, i.e. original string | |
| 			. 'msgstr\s+((?:".*(?<!\\\\)"\s*)+)/'; // translated string | |
| 		$content = file_get_contents($filePath); | |
| 		$matches = array(); | |
| 		$matchCount = preg_match_all($pattern, $content, $matches); | |
|  | |
| 		$messages = array(); | |
| 		for ($i = 0; $i < $matchCount; ++$i) { | |
| 			if ($matches[2][$i] == $context) { | |
| 				$id = $this->decode($matches[3][$i]); | |
| 				$message = $this->decode($matches[4][$i]); | |
| 				$messages[$id] = $message; | |
| 			} | |
| 		} | |
| 		return $messages; | |
| 	} | |
|  | |
| 	/** | |
| 	 * Saves messages to a PO file. | |
| 	 * @param string $filePath file path | |
| 	 * @param array $messages message translations. Array keys are source messages and array values are | |
| 	 * translated messages: source message => translated message. Note if the message has a context, | |
| 	 * the message ID must be prefixed with the context with chr(4) as the separator. | |
| 	 */ | |
| 	public function save($filePath, $messages) | |
| 	{ | |
| 		$content = ''; | |
| 		foreach ($messages as $id => $message) { | |
| 			$separatorPosition = strpos($id, chr(4)); | |
| 			if ($separatorPosition !== false) { | |
| 				$content .= 'msgctxt "' . substr($id, 0, $separatorPosition) . "\"\n"; | |
| 				$id = substr($id, $separatorPosition + 1); | |
| 			} | |
| 			$content .= 'msgid "' . $this->encode($id) . "\"\n"; | |
| 			$content .= 'msgstr "' . $this->encode($message) . "\"\n\n"; | |
| 		} | |
| 		file_put_contents($filePath, $content); | |
| 	} | |
|  | |
| 	/** | |
| 	 * Encodes special characters in a message. | |
| 	 * @param string $string message to be encoded | |
| 	 * @return string the encoded message | |
| 	 */ | |
| 	protected function encode($string) | |
| 	{ | |
| 		return str_replace( | |
| 			array('"', "\n", "\t", "\r"), | |
| 			array('\\"', '\\n', '\\t', '\\r'), | |
| 			$string | |
| 		); | |
| 	} | |
|  | |
| 	/** | |
| 	 * Decodes special characters in a message. | |
| 	 * @param string $string message to be decoded | |
| 	 * @return string the decoded message | |
| 	 */ | |
| 	protected function decode($string) | |
| 	{ | |
| 		$string = preg_replace( | |
| 			array('/"\s+"/', '/\\\\n/', '/\\\\r/', '/\\\\t/', '/\\\\"/'), | |
| 			array('', "\n", "\r", "\t", '"'), | |
| 			$string | |
| 		); | |
| 		return substr(rtrim($string), 1, -1); | |
| 	} | |
| }
 | |
| 
 |