GettextMessageSource.php 2.35 KB
Newer Older
resurtm committed
1 2 3 4 5 6 7 8 9 10 11
<?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

namespace yii\i18n;

use Yii;

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/**
 * GettextMessageSource represents a message source that is based on GNU Gettext.
 *
 * Each GettextMessageSource instance represents the message tranlations
 * for a single domain. And each message category represents a message context
 * in Gettext. Translated messages are stored as either a MO or PO file,
 * depending on the [[useMoFile]] property value.
 *
 * All translations are saved under the [[basePath]] directory.
 *
 * Translations in one language are kept as MO or PO files under an individual
 * subdirectory whose name is the language ID. The file name is specified via
 * [[catalog]] property, which defaults to 'messages'.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @since 2.0
 */
resurtm committed
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
class GettextMessageSource extends MessageSource
{
	const MO_FILE_EXT = '.mo';
	const PO_FILE_EXT = '.po';

	/**
	 * @var string
	 */
	public $basePath = '@app/messages';
	/**
	 * @var string
	 */
	public $catalog = 'messages';
	/**
	 * @var boolean
	 */
	public $useMoFile = true;
	/**
	 * @var boolean
	 */
	public $useBigEndian = false;

Alexander Makarov committed
51 52 53 54 55 56 57 58 59
	/**
	 * Loads the message translation for the specified language and category.
	 * Child classes should override this method to return the message translations of
	 * the specified language and category.
	 * @param string $category the message category
	 * @param string $language the target language
	 * @return array the loaded messages. The keys are original messages, and the values
	 * are translated messages.
	 */
resurtm committed
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
	protected function loadMessages($category, $language)
	{
		$messageFile = Yii::getAlias($this->basePath) . '/' . $language . '/' . $this->catalog;
		if ($this->useMoFile) {
			$messageFile .= static::MO_FILE_EXT;
		} else {
			$messageFile .= static::PO_FILE_EXT;
		}

		if (is_file($messageFile)) {
			if ($this->useMoFile) {
				$gettextFile = new GettextMoFile(array('useBigEndian' => $this->useBigEndian));
			} else {
				$gettextFile = new GettextPoFile();
			}
			$messages = $gettextFile->load($messageFile, $category);
			if (!is_array($messages)) {
				$messages = array();
			}
			return $messages;
		} else {
			Yii::error("The message file for category '$category' does not exist: $messageFile", __METHOD__);
			return array();
		}
	}
}