|
|
|
<?php
|
|
|
|
|
|
|
|
namespace yii\i18n;
|
|
|
|
|
|
|
|
use Yii;
|
|
|
|
use yii\base\Component;
|
|
|
|
|
|
|
|
class I18N extends Component
|
|
|
|
{
|
|
|
|
public function translate($message, $params = array(), $language = null)
|
|
|
|
{
|
|
|
|
if ($language === null) {
|
|
|
|
$language = Yii::$app->language;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (strpos($message, '|') !== false && preg_match('/^([\w\-\.]+)\|(.*)/', $message, $matches)) {
|
|
|
|
$category = $matches[1];
|
|
|
|
$message = $matches[2];
|
|
|
|
} else {
|
|
|
|
$category = 'app';
|
|
|
|
}
|
|
|
|
|
|
|
|
$message = $this->getMessageSource($category)->translate($category, $message, $language);
|
|
|
|
|
|
|
|
if (!is_array($params)) {
|
|
|
|
$params = array($params);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isset($params[0])) {
|
|
|
|
$message = $this->getPluralFormat($message, $params[0], $language);
|
|
|
|
if (!isset($params['{n}'])) {
|
|
|
|
$params['{n}'] = $params[0];
|
|
|
|
}
|
|
|
|
unset($params[0]);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $params === array() ? $message : strtr($message, $params);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getLocale($language)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getMessageSource($category)
|
|
|
|
{
|
|
|
|
return $category === 'yii' ? $this->getMessages() : $this->getCoreMessages();
|
|
|
|
}
|
|
|
|
|
|
|
|
private $_coreMessages;
|
|
|
|
private $_messages;
|
|
|
|
|
|
|
|
public function getCoreMessages()
|
|
|
|
{
|
|
|
|
if (is_object($this->_coreMessages)) {
|
|
|
|
return $this->_coreMessages;
|
|
|
|
} elseif ($this->_coreMessages === null) {
|
|
|
|
return $this->_coreMessages = new PhpMessageSource(array(
|
|
|
|
'sourceLanguage' => 'en_US',
|
|
|
|
'basePath' => '@yii/messages',
|
|
|
|
));
|
|
|
|
} else {
|
|
|
|
return $this->_coreMessages = Yii::createObject($this->_coreMessages);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setCoreMessages($config)
|
|
|
|
{
|
|
|
|
$this->_coreMessages = $config;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getMessages()
|
|
|
|
{
|
|
|
|
if (is_object($this->_messages)) {
|
|
|
|
return $this->_messages;
|
|
|
|
} elseif ($this->_messages === null) {
|
|
|
|
return $this->_messages = new PhpMessageSource(array(
|
|
|
|
'sourceLanguage' => 'en_US',
|
|
|
|
'basePath' => '@app/messages',
|
|
|
|
));
|
|
|
|
} else {
|
|
|
|
return $this->_messages = Yii::createObject($this->_messages);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setMessages($config)
|
|
|
|
{
|
|
|
|
$this->_messages = $config;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function getPluralFormat($message, $number, $language)
|
|
|
|
{
|
|
|
|
if (strpos($message, '|') === false) {
|
|
|
|
return $message;
|
|
|
|
}
|
|
|
|
$chunks = explode('|', $message);
|
|
|
|
$rules = $this->getLocale($language)->getPluralRules();
|
|
|
|
foreach ($rules as $i => $rule) {
|
|
|
|
if (isset($chunks[$i]) && self::evaluate($rule, $number)) {
|
|
|
|
return $chunks[$i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$n = count($rules);
|
|
|
|
return isset($chunks[$n]) ? $chunks[$n] : $chunks[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Evaluates a PHP expression with the given number value.
|
|
|
|
* @param string $expression the PHP expression
|
|
|
|
* @param mixed $n the number value
|
|
|
|
* @return boolean the expression result
|
|
|
|
*/
|
|
|
|
protected static function evaluate($expression, $n)
|
|
|
|
{
|
|
|
|
return @eval("return $expression;");
|
|
|
|
}
|
|
|
|
}
|