Почему Include инклудит, но переменные не получаем

Задумал я сделать подключение языкового файла в зависимости от языка в attributeLabels()

и написал так в модели:

public function attributeLabels()


{


	


	include("eng.inc");


	


}

a файл "eng.inc" такой:

//////////////ENGLISH/////////////////////

return array(


		'id' => 'Id',


		'created' => 'created',


		'modified' => 'modified',


		'login' => 'Login',


		'password' => 'Password',


		'email' => 'Email',


		'address' => 'Address',


		'postcode' => 'Postcode',


	);

Так вот интересно как получается, почему то если просто массив так написать то лейблы меняются на русские/английские. А почему то когда с инклудом ничего, хотя файл инклудится без ошибок.

Не подскажите в чем дело?

Следует писать:




return include("eng.inc");



Огромное спасибо, так все заработало.

Вообще-то еще лучше пользоваться стандартной возможностью перевода строк:




   public function attributeLabels()

    {

        return array(

            'id' => Yii::t('myapp', 'ID'),

            'username' => Yii::t('myapp', 'USER_NAME'),

            'email' => Yii::t('myapp', 'EMAIL'),

            'password' => Yii::t('myapp', 'PASSWORD'),

            'photo' => Yii::t('myapp', 'LOGO'),

        );

    }



Поддерживаю seb

Почитал про эту функцию не не понял для чего она нужна…

у меня идея не новая, хранить файлы языка отдельно чтобы просто если надо скопировать новый файл в нужный фолдер и все.

чем отличается запись:

‘password’ => Yii::t(‘myapp’, ‘PASSWORD’),

от

‘password’ => ‘Пароль’,

?

Функция t() как раз это и делает - при вызове она проверяет, есть ли переданная строка в файле перевода и если есть, то возвращает переведенную строку, если нет - то исходную.

В данном случае, если в настройках приложения указан язык ru, то перевод будет браться из файла protected\messages\ru\myapp.php, в котором будет написано:




return array(

    'PASSWORD' => 'Пароль',

);



Даже если приложение использует только один язык, то использование функции перевода дает возможность легко менять отображаемые тексты, например, в файле protected\messages\en\myapp.php (для английского языка) можно написать




return array(

    'PASSWORD' => 'Your password',

);



Сама настройка языка приложения может быть произведена статически в конфиге (protected\config\main.php) добавлением строки ‘language’=>‘ru’ или динамической установкой Yii::app()->language = ‘ru’.

Подход перевода с использованием функции t() гораздо легче применять на уровне всего приложения, так как в вашем случае получаться отдельные файлы со строками для attributeLabels() каждой модели, отдельные файлы для других случаев, когда нужен перевод.

Кроме того, функция t() позволяет создавать сообщения с дополнительными параметрами, например вы можете использовать это в виде (view) для вывода приглашения пользователю:




<?php echo Yii::t('myapp', 'Hello {username}!', array('{username}=>$user->name); ?>



В файле перевода эта строка может выглядеть так:




return array(

    'Hello {username}!' => 'Добро пожаловать на наш сайт, {username}.',

);



Ух ты!.. реально крутая штука!, спасибо за понятный ответ, Вам бы документацию писать, я бы тогда не задавал таких вопросов.

Огромное всем спасибо за помошь.:)

Странно…

Сделал все как написано тут выше:

  1. создал 2 файла русский, английский положил туда куда надо.

во вью вызываю так:


<?php if (isset($_GET['lang']) && $_GET['lang'] == 'rus') Yii::app()->language = 'ru'; echo Yii::t('yoursites', 'portfolio'); ?>

все работает… круто!

в языковых файлах что-то типа:


'title' => 'Bla-bla0bla',

Но мне надо перевести "Title" тег, а он у меня в лейауте естественно, вот в лейауте такой фокус:


<?php if (isset($_GET['lang']) && $_GET['lang'] == 'rus') Yii::app()->language = 'ru'; echo Yii::t('yoursites', 'title'); ?>

почему то не прокатывает уже. тупо выводит "Title" и все,

Почему?

Простите лоха педального, все работает, вопрос снимается проблемы была в том что в языуковом файле по ошибке было записано 2 раза


'title' => 'Bla-bla0bla',

..................

..................

'title' => 'Title',

вот он Title и выводил. :)

А кто-то пользовался CDBMessage?

Как в эти таблицы заносить перевод? Вручную? или …

Не пользовался пока, но в скором времени собираюсь освоить.

Думаю, тут два варианта: либо вручную, либо создать Active Record класс, вьюхи, контроллер и появится возможность редактировать таблицу переводов где-нибудь в админке.

Что AR, что вручную - разницы нет. Теоретически должен быть какой-то метод типа setDictionaryWord или еще что-то…

Похоже, только теоретически: http://www.yiiframework.com/forum/index.php?/topic/395-localizationtranslation-from-database/page__p__1914__hl__CDbMessageSource__fromsearch__1&#entry1914

Печально, однако =/

печально…

Будем расширять класс.

Примерно так:




class DbMessageSource extends CDbMessageSource

{

    private $_db;


    public function init()

    {

        parent::init();

        if(($this->_db=Yii::app()->getComponent($this->connectionID)) instanceof CDbConnection)

            $this->_db->setActive(true);

        else

            throw new CException(Yii::t('yii','CDbMessageSource.connectionID is invalid. Please make sure "{id}" refers to a valid database application component.',

                array('{id}'=>$this->connectionID)));

    }




    public function setNewTranslation($category,$message,$translation,$language=null){


        if($language===null)$language=Yii::app()->language;


        $sql=<<<EOD

SELECT t1.id AS id

FROM {$this->sourceMessageTable} t1, {$this->translatedMessageTable} t2

WHERE t1.id=t2.id AND t1.category=:category AND t2.language=:language AND t1.message=:message AND t2.translation=:translation

EOD;


        $command=$this->_db->createCommand($sql);

        $command->bindValue(':category',$category);

        $command->bindValue(':language',$language);

        $command->bindValue(':message',$message);

        $command->bindValue(':translation',$translation);

        $rows=$command->queryAll();


        if(empty($rows)){


            $sql=<<<EOD

SELECT t1.id AS id

FROM {$this->sourceMessageTable} t1

WHERE t1.category=:category AND t1.message=:message

EOD;


            $command=$this->_db->createCommand($sql);

            $command->bindValue(':category',$category);

            $command->bindValue(':message',$message);

            $sId=$command->queryScalar();


            if(empty($sId)){

                $sql=<<<EOD

INSERT INTO {$this->sourceMessageTable} (category,message) VALUES (:category,:message)

EOD;


                $command=$this->_db->createCommand($sql);

                $command->bindValue(':category',$category);

                $command->bindValue(':message',$message);

                $command->execute();


                $sId=$this->_db->lastInsertID;

            }




            $sql=<<<EOD

SELECT t1.id AS id

FROM {$this->translatedMessageTable} t1

WHERE t1.id=:id AND t1.language=:language

EOD;


            $command=$this->_db->createCommand($sql);

            $command->bindValue(':id',$sId);

            $command->bindValue(':language',$language);

            $tId=$command->queryScalar();


            if(empty($tId)){

                $sql=<<<EOD

INSERT INTO {$this->translatedMessageTable} (id,language,translation) VALUES (:id,:language,:translation)

EOD;


                $command=$this->_db->createCommand($sql);

                $command->bindValue(':id',$sId);

                $command->bindValue(':language',$language);

                $command->bindValue(':translation',$translation);

                $command->execute();

            }else{

$sql=<<<EOD

UPDATE {$this->translatedMessageTable} SET translation=:translation

WHERE id=:id AND language=:language

EOD;


                $command=$this->_db->createCommand($sql);

                $command->bindValue(':id',$sId);

                $command->bindValue(':language',$language);

                $command->bindValue(':translation',$translation);

                $command->execute();

            }


        }


        return true;

    }

}