Интернационализация модулей Yii - PullRequest
2 голосов
/ 04 октября 2010

Yii Doc:
Модули могут быть вложены в неограниченные уровни.То есть модуль может содержать другой модуль, который может содержать еще один модуль.Мы вызываем первый родительский модуль, а второй - дочерний.Дочерние модули должны быть объявлены в свойстве modules их родительского модуля, как мы объявляем модули в конфигурации приложения, показанной выше.

Я пытаюсь создать myltilingual приложение, используя Yii :: t () function:

Yii Doc:
И при использовании Yii :: t () для перевода сообщения расширения следует использовать следующий формат, вместо: Yii::t('Xyz.categoryName', 'message to be translated')

Я перевожу сообщения модулей с Yii::t('MyModule.source', 'Test');, это работает для модулей.
Но не работает для подмодулей Yii::t('MyModule.SubModule.source', 'Test');
Вопрос:
Как определить исходный путь для SubModule в модуле, когда сообщения хранятся в:
/protected/modules/MyModule/modules/SubModule/messages/

Ответы [ 2 ]

3 голосов
/ 18 марта 2011

Вы пытаетесь использовать Yii::t неправильно.

Путь для CPhpMessageSource (первый параметр Yii::t) должен быть модулем , в котором появляется вызов Yii::t . Не имеет значения, агрегирован ли этот модуль внутри другого модуля.

Так что в вашем примере вы должны использовать

Yii::t('SubModule.source', 'Test');

и поместите сообщения в /protected/modules/SubModule/messages/.

Если вам нужно изменить сообщение в зависимости от того, выполняется ли перевод изнутри подмодуля, добавьте в сообщение параметры.

1 голос
/ 10 сентября 2012

Похоже, что это невозможно сделать с CPhpMessageSource, вы должны расширить и создать свой собственный класс сообщений.

Вам необходимо изменить файл конфигурации, т.е. config / main.php .

'components'=>array(
    ...........
    'messages' => array(
        'class' => 'MyPhpMessageSource',
    ),
    .............

и вот пример MyPhpMessageSource.php, который работает для ваших нужд.

class MyPhpMessageSource extends CPhpMessageSource {

private $_files=array();

protected function getMessageFile($category,$language)
{
    if(!isset($this->_files[$category][$language]))
    {
        $parts = explode('.', $category);
        $count = count($parts);

        if( $count > 1 ) {
            $filePath = '';
            $moduleClass=$parts[$count-2];

            $class=new ReflectionClass($moduleClass);
            $filePath .= dirname($class->getFileName()).DIRECTORY_SEPARATOR;

            /*
            for($i=0; $i<$count-1; $i++) {
                $moduleClass=$parts[$i];

                if($i == 0) {
                    $class=new ReflectionClass($moduleClass);
                    $filePath .= dirname($class->getFileName()).DIRECTORY_SEPARATOR;
                } else
                    $filePath .= $moduleClass.DIRECTORY_SEPARATOR;
            }
            */

            $filePath .= 'messages' . DIRECTORY_SEPARATOR . $language . DIRECTORY_SEPARATOR . $parts[$count-1] . '.php';

            echo "$filePath<br/>";
            $this->_files[$category][$language] = $filePath;
        }
        else
            $this->_files[$category][$language]=$this->basePath.DIRECTORY_SEPARATOR.$language.DIRECTORY_SEPARATOR.$category.'.php';
    }
    return $this->_files[$category][$language];
}
}
...