Мультиязычные модели

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Ответить
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Мультиязычные модели

Сообщение samdark »

О красивой работе с мультиязычным содержимым:
http://yiiframework.ru/doc/cookbook/ru/ ... tilanguage
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Мультиязычные модели

Сообщение slavcodev »

Отличный рецепт, а то мне расширение ActiveRecords что в репозитарии на оффсайте страшно не понравилось, а тут все очень просто. 5 балов!
Жду Yii 3!
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: Мультиязычные модели

Сообщение SpiLLeR »

Действительно красивое решение :).
Правда никогда ими не пользовался, привык разносить по разным таблицам языки.
Предупрежден - значит вооружен.
devKP.ru
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Мультиязычные модели

Сообщение slavcodev »

По разным таблицам тогда нужно метод getTable завязывать на язык :( хотя сложнее будет с динамической сменой языка
Жду Yii 3!
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Мультиязычные модели

Сообщение Ekstazi »

у меня немного иначе, но прицип тот же. Еще в придачу в контролере идет(код не рефакторился):

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

    public function resolveViewFile($viewName,$viewPath,$basePath)
    {
        if(empty($viewName))
            return false;

        if(($renderer=Yii::app()->getViewRenderer())!==null)
            $extension=$renderer->fileExtension;
        else
            $extension='.php';
        if($viewName[0]==='/')
            $viewFile=$basePath.$viewName.$extension;
        else if(strpos($viewName,'.'))
            $viewFile=Yii::getPathOfAlias($viewName).$extension;
        else
            $viewFile=$viewPath.DIRECTORY_SEPARATOR.$viewName.$extension;
        //такой папки точно нет
        return Yii::app()->findLocalizedFile($viewFile,'+++');
    }
 
Что делает так чтоб все русские языковые файлы были в подпапке ru, английские в en и тамк далее
Satellite
Сообщения: 5
Зарегистрирован: 2009.10.02, 15:31
Контактная информация:

Re: Мультиязычные модели

Сообщение Satellite »

а вот как такой рецепт http://kosiy.phpnet.us/post/show/id/18.html следует использовать в yii проектах или необходимы какие-либо доработки?
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Мультиязычные модели

Сообщение slavcodev »

В yii-1.1.8.r3324 не работает рецепт. Конечный запрос получается

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

SELECT * FROM `page` `t` WHERE
((`t`.`language`="en") AND (`t`.`language`="ru"))
Жду Yii 3!
Аватара пользователя
Hector
Сообщения: 18
Зарегистрирован: 2011.06.11, 14:11
Контактная информация:

Re: Мультиязычные модели

Сообщение Hector »

Только, могут возникать ошибки, если использовать AR и будт таблицы с одим и тем же полям

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

    // параметры, применяемые по умолчанию
    public function defaultScope() {
        return array(
            'condition' => "lang='".Yii::app()->language."'",
        );
    }
 
лучше заменить на

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

    // параметры, применяемые по умолчанию
    public function defaultScope() {
        return array(
            'condition' => $this->getTableAlias(false, false).".lang='".Yii::app()->language."'",
        );
    }
 
alexbra
Сообщения: 12
Зарегистрирован: 2012.01.30, 18:50

Re: Мультиязычные модели

Сообщение alexbra »

В случае с подписями к фото, лучше наверное использовать таблицу с переводом, например.
Не грузить же фото на каждый язык...
Аватара пользователя
jedi
Сообщения: 82
Зарегистрирован: 2010.12.01, 08:49

Re: Мультиязычные модели

Сообщение jedi »

alexbra писал(а):В случае с подписями к фото, лучше наверное использовать таблицу с переводом, например.
Не грузить же фото на каждый язык...

Кстати интересно подмечано, что скажут уважаемые Гуру?
Мне вот тоже интересно, есть таблица в ней кроме title (char), descripton(char) есть такие поля как file_name, file_path, url, date_update, date_created, id_link2, id_link3, ....,.....,....
получается все данные прийдется дублировать при сохранении? Или же лучше использовать переводы в отдельной таблице? (если они в отдельной таблице, то нам надо будет дергать все поля модели с её переводами)
joomla->drupal->yii
v0lume
Сообщения: 13
Зарегистрирован: 2012.06.04, 14:21

Re: Мультиязычные модели

Сообщение v0lume »

Наверное кто-то уже додумался до такого, но всё же ни где не нашел.

Я думаю понятно, что если копнуть чуть глубже, то встает вопрос насчет дублирования полей, которые не нуждаются в переводе (числа\даты\т.п.).

Хочу поделиться своей мыслёй :idea:



Покажу на примере:

есть таблица articles с полями
id article_id title text date is_published lang

допустим в проекте есть множество языков, но основной - русский

в моделе описываем
public $translatableFields = array('title', 'text');

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

далее
основываясь на $translatableFields с помощью Form Builder генерируем вторую форму. через нее добавляются переводы статьи для любого другого языка. все остальные поля, которые не требуют перевода - не добавляются в бд. дублируется только article_id (article_id = id записи на русском языке)



например мы уже добавили статью на русском языке и её перевод на английский. а что дальше?

если нужно вывести статью на английском языке, делаем поиск как и было указано в рецепте, только для конкретного поста добавим ещё один scope
$post = Post::model()->id(4)->lang('en')->findAll();

в afterFind выбираем вариант на основном языке
$post = Post::model()->id($this->article_id)->findAll();

далее циклом склеиваем поля, которые требуют перевода (если переводимый вариант поля - пустой, то оставляем вариант на исходном языке)

и отдаем экземпляр модели.


Плюсы такого подхода -
если для какого-то поля не добавлен перевод, то выведется вариант на исходном языке
не нужно создавать дополнительные таблицы и модели для них
всегда будут выполняться только два запроса для выборки
нет такого масштабного дублирования данных (дублируется только article_id)

да ещё и можно оформить в behavior и подключать к любой нужной модели.



Чуть позже сделаю отдельный топик и реализацию в коде. Предложения и критика приветствуются. А так я думаю метод вполне удобный.
Аватара пользователя
TBIKC
Сообщения: 133
Зарегистрирован: 2011.07.23, 16:30

Re: Мультиязычные модели

Сообщение TBIKC »

Здравствуйте
Хотелось бы ещё примеров самих структур таблиц (новостей к примеру)
Когда сделаете behavior и отдельный топик ?
основываясь на $translatableFields с помощью Form Builder генерируем вторую форму
- и вот про это поподробнее :)
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Мультиязычные модели

Сообщение ElisDN »

TBIKC писал(а):Хотелось бы ещё примеров самих структур таблиц (новостей к примеру)
Уже есть такой бехавиор. Его я у себя рассмотрел.
Аватара пользователя
desc
Сообщения: 58
Зарегистрирован: 2014.02.27, 18:28

Re: Мультиязычные модели

Сообщение desc »

а как юзать? добавляю в урл /en/
Невозможно обработать запрос "en/backend/category".
будьте склонны к начинающим
догадываюсь что-то надо подшаманить в урлманаджере, но что?
FEO
Сообщения: 7
Зарегистрирован: 2014.06.13, 23:02

Re: Мультиязычные модели

Сообщение FEO »

desc писал(а):а как юзать? добавляю в урл /en/
Невозможно обработать запрос "en/backend/category".
будьте склонны к начинающим
догадываюсь что-то надо подшаманить в урлманаджере, но что?
На хабре говорится об этом
http://habrahabr.ru/post/139689/
И Дмитрий подробно писал об этом
http://www.elisdn.ru/blog/39/yii-based- ... e-and-urls
FEO
Сообщения: 7
Зарегистрирован: 2014.06.13, 23:02

Re: Мультиязычные модели

Сообщение FEO »

У меня мультиязычный только фронтенд.
Как сделать чтобы в бекэенде выводились в гриде все записи на рус и англ
У меня модели общие для фронта и бекенда
Правило отфильтровывае англ язык. По умолчанию в конфиге стоит рус язык

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

public function defaultScope()
    {
        return array(
            'condition' => $this->getTableAlias(false, false).".lang='".Yii::app()->language."'",
        );
    } 
Ответить