Мультиязычность на сайте!!!

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Ответить
mitnik
Сообщения: 6
Зарегистрирован: 2015.03.16, 12:30

Мультиязычность на сайте!!!

Сообщение mitnik »

Здравствуйте, форумчане! Помогите пожалуйста справиться с задачей а то я уже весь гугл обласил=) ну нечего так и не получилось найти, я сам с Yii работаю совсем не давно и очень уж не хочется делать какие нибудь топорные вещи на старте. Так что помогите кто чем сможет. Задача: нужно сделать многоязычный сайт с неограниченным количеством языков.
Url типа:
http://site.ru/ru/page
http://site.ru/en/page
Сделал все работает норм! Ну вот сейчас начал делать админу и встал вопрос как добавить материалы с разными языками в базу. Варианты с добавлением новых столбцов в таблицах типа text_ru, text_en и т.д. точно не подходит. Вариант который описан в документации с хранением переводов в отдельной таблицы тоже не нравится. Самый подходящий это хранить все в одной таблицы с использованием составного первичного ключа. То есть будут поля:
id - int auto_increment
language - char
title - varchar
alias - varchar
text - text
primary key ('id','language')

В админки должна быть форма разделенная табами в первом поля формы для Русского языка во втором для Английского также должно быть поле с общими настройками где в данном примере указывается alias. Но я не знаю как можно перехватить данные из формы отсортировать как нужно и записать все поля в базу. В результате отправки формы должно записаться в базу столько полей сколько у нас языков к примеру.
id language title alias text
1 ru Страница 1 stranica_1 текст страницы 1
1 en Page 1 stranica_1 text page 1
2 ru Страница 2 stranica_2 текст страницы 2
2 en Page 2 stranica_2 text page 2
Аватара пользователя
zabachok
Сообщения: 522
Зарегистрирован: 2013.12.16, 14:38

Re: Мультиязычность на сайте!!!

Сообщение zabachok »

Задайте в каждом табе названия формам в соответствии с языком: title[ru], title[en], text[ru], text[en], etc. Или ru[text], ru[title]... На сервере получите красивый массив, по ним и сохраняйте.
2b||!2b Just read the instructions
mitnik
Сообщения: 6
Зарегистрирован: 2015.03.16, 12:30

Re: Мультиязычность на сайте!!!

Сообщение mitnik »

zabachok писал(а):Задайте в каждом табе названия формам в соответствии с языком: title[ru], title[en], text[ru], text[en], etc. Или ru[text], ru[title]... На сервере получите красивый массив, по ним и сохраняйте.
Да я так и сделал ну вот что дальше делать не знаю.
Сгенерировал форму таким образом
<?php foreach(Yii::app()->params['translatedLanguages'] as $key => $item):?>
<div <?php if($key == Yii::app()->params['defaultLanguage']):?>class="active"<?php endif;?> id="tab_<?=$key?>">
<div class="row">
<?php echo $form->labelEx($model,'['.$key.']language'); ?>
<?php echo $form->textField($model,'['.$key.']language',array('size'=>2,'maxlength'=>2)); ?>
<?php echo $form->error($model,'['.$key.']language'); ?>
</div>

<div class="row">
<?php echo $form->labelEx($model,'['.$key.']description'); ?>
<?php echo $form->textField($model,'['.$key.']description',array('size'=>60,'maxlength'=>250)); ?>
<?php echo $form->error($model,'['.$key.']description'); ?>
</div>

<div class="row">
<?php echo $form->labelEx($model,'['.$key.']keywords'); ?>
<?php echo $form->textField($model,'['.$key.']keywords',array('size'=>60,'maxlength'=>250)); ?>
<?php echo $form->error($model,'['.$key.']keywords'); ?>
</div>

<div class="row">
<?php echo $form->labelEx($model,'['.$key.']title'); ?>
<?php echo $form->textField($model,'['.$key.']title',array('size'=>60,'maxlength'=>250)); ?>
<?php echo $form->error($model,'['.$key.']title'); ?>
</div>


<div class="row">
<?php echo $form->labelEx($model,'['.$key.']text'); ?>
<?php echo $form->textArea($model,'['.$key.']text',array('rows'=>6, 'cols'=>50)); ?>
<?php echo $form->error($model,'['.$key.']text'); ?>
</div>

</div>
<?php endforeach;?>
Массив приходит красивый но вот только как его обработать теперь?
Аватара пользователя
zabachok
Сообщения: 522
Зарегистрирован: 2013.12.16, 14:38

Re: Мультиязычность на сайте!!!

Сообщение zabachok »

Оборачивайте код в соответствующий тег, а то нечитабельно.

Как то так.

Код: Выделить всё

foreach(Yii::app()->params['translatedLanguages'] as $key => $item)
{
   $model = new Mymodel();
   $model->attributes = $_POST[$item];
   $model->save();
} 
2b||!2b Just read the instructions
Аватара пользователя
zabachok
Сообщения: 522
Зарегистрирован: 2013.12.16, 14:38

Re: Мультиязычность на сайте!!!

Сообщение zabachok »

2b||!2b Just read the instructions
mitnik
Сообщения: 6
Зарегистрирован: 2015.03.16, 12:30

Re: Мультиязычность на сайте!!!

Сообщение mitnik »

zabachok писал(а):Оборачивайте код в соответствующий тег, а то нечитабельно.

Как то так.

Код: Выделить всё

foreach(Yii::app()->params['translatedLanguages'] as $key => $item)
{
   $model = new Mymodel();
   $model->attributes = $_POST[$item];
   $model->save();
}
Вы мне очень помогли Спасибо!!!. Все гораздо Проше чем я предполагал. Только вот маленькая неувязочка при присваивание массива $_POST['Pages'] свойству атрибутс в модели, данные из формы остаются только для языка который присваивался в последней итерации цикла.
Если вам не сложно подскажите что не так?
Вот экшн который все это дело обрабатывает.

Код: Выделить всё

    public function actionCreate()
    {
        $model=new Pages;

        if(isset($_POST['Pages']))
        {
          $model = new Pages();
            foreach(Yii::app()->params['translatedLanguages'] as $key => $item)
            {
               $_POST['Pages'][$key]['language'] = $key;
               if(!empty($model->id)){
                    $_POST['Pages'][$key]['id'] = $model->id;
               }
               $model->attributes = $_POST['Pages'][$key];
               $model->save();
            } 
        }

        $this->render('create',array(
            'model'=>$model,
        ));
    }
 
mitnik
Сообщения: 6
Зарегистрирован: 2015.03.16, 12:30

Re: Мультиязычность на сайте!!!

Сообщение mitnik »

Вы где нибудь работаете? Есть свободное время?
Аватара пользователя
zabachok
Сообщения: 522
Зарегистрирован: 2013.12.16, 14:38

Re: Мультиязычность на сайте!!!

Сообщение zabachok »

Строка

Код: Выделить всё

$model = new Pages(); 
Должна быть внутри цыкла
2b||!2b Just read the instructions
mitnik
Сообщения: 6
Зарегистрирован: 2015.03.16, 12:30

Re: Мультиязычность на сайте!!!

Сообщение mitnik »

Я и так и так пробовал результат идентичен!
mitnik
Сообщения: 6
Зарегистрирован: 2015.03.16, 12:30

Re: Мультиязычность на сайте!!!

Сообщение mitnik »

zabachok писал(а):Строка

Код: Выделить всё

$model = new Pages(); 
Должна быть внутри цыкла
при отправки формы массив уходит такого вида

Код: Выделить всё

array(
    'ru' => array(
            'title' => 'title_ru',
            'text' => 'text_ru',
            ....
            ),
    'en' => array(
            'title' => 'title_en',
            'text' => 'text_en',
            ....
            ),
    )
Но после обработки модель возвращает массив

Код: Выделить всё

array(
    'title' => 'title_en',
    'text' => 'text_en',
    ....
    )
И эти данные которые возвращает модель дублируются по всем полям то есть title на английском вставляется и в русское поле и в английское и тоже самое с остальными полями
Ответить