diff --git a/framework/yii/console/controllers/MessageController.php b/framework/yii/console/controllers/MessageController.php index 21071bc..ff2de2b 100644 --- a/framework/yii/console/controllers/MessageController.php +++ b/framework/yii/console/controllers/MessageController.php @@ -55,7 +55,8 @@ class MessageController extends Controller * directory 'sourcePath/a/b'. * - translator: the name of the function for translating messages. * Defaults to 'Yii::t'. This is used as a mark to find messages to be - * translated. + * translated. Accepts both string for single function name or array for + * multiple function names. * - overwrite: if message file must be overwritten with the merged messages. * - removeOld: if message no longer needs translation it will be removed, * instead of being enclosed between a pair of '@@' marks. @@ -133,18 +134,23 @@ class MessageController extends Controller { echo "Extracting messages from $fileName...\n"; $subject = file_get_contents($fileName); - $n = preg_match_all( - '/\b' . $translator . '\s*\(\s*(\'.*?(?<!\\\\)\'|".*?(?<!\\\\)")\s*,\s*(\'.*?(?<!\\\\)\'|".*?(?<!\\\\)")\s*[,\)]/s', - $subject, $matches, PREG_SET_ORDER); $messages = array(); - for ($i = 0; $i < $n; ++$i) { - if (($pos = strpos($matches[$i][1], '.')) !== false) { - $category=substr($matches[$i][1], $pos + 1, -1); - } else { - $category=substr($matches[$i][1], 1, -1); + if (!is_array($translator)) { + $translator = array($translator); + } + foreach ($translator as $currentTranslator) { + $n = preg_match_all( + '/\b' . $currentTranslator . '\s*\(\s*(\'.*?(?<!\\\\)\'|".*?(?<!\\\\)")\s*,\s*(\'.*?(?<!\\\\)\'|".*?(?<!\\\\)")\s*[,\)]/s', + $subject, $matches, PREG_SET_ORDER); + for ($i = 0; $i < $n; ++$i) { + if (($pos = strpos($matches[$i][1], '.')) !== false) { + $category = substr($matches[$i][1], $pos + 1, -1); + } else { + $category = substr($matches[$i][1], 1, -1); + } + $message = $matches[$i][2]; + $messages[$category][] = eval("return $message;"); // use eval to eliminate quote escape } - $message = $matches[$i][2]; - $messages[$category][] = eval("return $message;"); // use eval to eliminate quote escape } return $messages; } @@ -172,7 +178,7 @@ class MessageController extends Controller $merged = array(); $untranslated = array(); foreach ($messages as $message) { - if (!empty($translated[$message])) { + if (array_key_exists($message, $translated) && strlen($translated[$message]) > 0) { $merged[$message] = $translated[$message]; } else { $untranslated[] = $message; diff --git a/tests/unit/framework/console/controllers/MessageControllerTest.php b/tests/unit/framework/console/controllers/MessageControllerTest.php index 9b639d7..a4b45d4 100644 --- a/tests/unit/framework/console/controllers/MessageControllerTest.php +++ b/tests/unit/framework/console/controllers/MessageControllerTest.php @@ -17,6 +17,9 @@ class MessageControllerTest extends TestCase { $this->sourcePath = Yii::getAlias('@yiiunit/runtime/test_source'); $this->createDir($this->sourcePath); + if (!file_exists($this->sourcePath)) { + $this->markTestIncomplete('Unit tests runtime directory should have writable permissions!'); + } $this->messagePath = Yii::getAlias('@yiiunit/runtime/test_messages'); $this->createDir($this->messagePath); $this->configFileName = Yii::getAlias('@yiiunit/runtime') . DIRECTORY_SEPARATOR . 'message_controller_test_config.php'; @@ -81,8 +84,9 @@ class MessageControllerTest extends TestCase protected function createMessageController() { $module = $this->getMock('yii\\base\\Module', array('fake'), array('console')); - $command = new MessageController('message', $module); - return $command; + $messageController = new MessageController('message', $module); + $messageController->interactive = false; + return $messageController; } /** @@ -91,7 +95,7 @@ class MessageControllerTest extends TestCase * @param array $args action arguments. * @return string command output. */ - protected function runMessageControllerAction($actionId, array $args=array()) + protected function runMessageControllerAction($actionId, array $args = array()) { $controller = $this->createMessageController(); ob_start(); @@ -166,13 +170,11 @@ class MessageControllerTest extends TestCase public function testCreateTranslation() { - $this->markTestIncomplete('MessageController is incomplete'); - $language = 'en'; $category = 'test_category'; $message = 'test message'; - $sourceFileContent = "Yii::t('{$category}','{$message}')"; + $sourceFileContent = "Yii::t('{$category}', '{$message}')"; $this->createSourceFile($sourceFileContent); $this->composeConfigFile(array(