Переопределением CMessageSource::loadMessages можно сделать всё что угодно.
Например в одном проекте не использовались категории, но в зависимости от текущего параметра в Request надо было по-разному переводить одни и те же слова (в рамках одного и того же языка) (вроде как у Вас похожая проблема). Так вот там был примерно такой код:
<?php
class MessageSource extends CMessageSource
{
protected function loadMessages($category, $language)
{
$config = require(Yii::getPathOfAlias('application.messages') . '/' . $language . '/default.php');
$childConfig = Yii::getPathOfAlias('application.messages') . '/' . $language . '/children/' . Yii::app()->request->getChildrenTranslateId() . '.php';
if (file_exists($childConfig)) {
$vocab = require($childConfig);
if (is_array($vocab)) {
$config = array_merge($config, $vocab);
}
}
return $config;
}
}
Таким образом порядок перевода в функции t был такой - сначала ищем в дочернем словеаре, если нет там - ищем в дефолтном для языка.
Если нужно использовать категории - можно соответствующим образом изменить метод loadMessages.
Основная идея этого метода в любом случае будет в том, что array_merge перезаписывает значения, если ключи одинаковые. Таким образом можно сделать как бы наследование файлов с сообщениями.