Мультиязычные модели
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Мультиязычные модели
О красивой работе с мультиязычным содержимым:
http://yiiframework.ru/doc/cookbook/ru/ ... tilanguage
http://yiiframework.ru/doc/cookbook/ru/ ... tilanguage
Нравится Yii? Давайте сделаем его лучше!.
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Мультиязычные модели
Отличный рецепт, а то мне расширение ActiveRecords что в репозитарии на оффсайте страшно не понравилось, а тут все очень просто. 5 балов!
Жду Yii 3!
-
- Сообщения: 350
- Зарегистрирован: 2009.09.17, 16:47
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Мультиязычные модели
Действительно красивое решение .
Правда никогда ими не пользовался, привык разносить по разным таблицам языки.
Правда никогда ими не пользовался, привык разносить по разным таблицам языки.
Предупрежден - значит вооружен.
devKP.ru
devKP.ru
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Мультиязычные модели
По разным таблицам тогда нужно метод getTable завязывать на язык хотя сложнее будет с динамической сменой языка
Жду Yii 3!
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: Мультиязычные модели
у меня немного иначе, но прицип тот же. Еще в придачу в контролере идет(код не рефакторился):
Что делает так чтоб все русские языковые файлы были в подпапке ru, английские в en и тамк далее
Код: Выделить всё
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,'+++');
}
Re: Мультиязычные модели
а вот как такой рецепт http://kosiy.phpnet.us/post/show/id/18.html следует использовать в yii проектах или необходимы какие-либо доработки?
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Мультиязычные модели
В yii-1.1.8.r3324 не работает рецепт. Конечный запрос получается
Код: Выделить всё
SELECT * FROM `page` `t` WHERE
((`t`.`language`="en") AND (`t`.`language`="ru"))
Жду Yii 3!
Re: Мультиязычные модели
Только, могут возникать ошибки, если использовать 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."'",
);
}
Re: Мультиязычные модели
В случае с подписями к фото, лучше наверное использовать таблицу с переводом, например.
Не грузить же фото на каждый язык...
Не грузить же фото на каждый язык...
Re: Мультиязычные модели
alexbra писал(а):В случае с подписями к фото, лучше наверное использовать таблицу с переводом, например.
Не грузить же фото на каждый язык...
Кстати интересно подмечано, что скажут уважаемые Гуру?
Мне вот тоже интересно, есть таблица в ней кроме title (char), descripton(char) есть такие поля как file_name, file_path, url, date_update, date_created, id_link2, id_link3, ....,.....,....
получается все данные прийдется дублировать при сохранении? Или же лучше использовать переводы в отдельной таблице? (если они в отдельной таблице, то нам надо будет дергать все поля модели с её переводами)
joomla->drupal->yii
Re: Мультиязычные модели
Наверное кто-то уже додумался до такого, но всё же ни где не нашел.
Я думаю понятно, что если копнуть чуть глубже, то встает вопрос насчет дублирования полей, которые не нуждаются в переводе (числа\даты\т.п.).
Хочу поделиться своей мыслёй
Покажу на примере:
есть таблица 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 и подключать к любой нужной модели.
Чуть позже сделаю отдельный топик и реализацию в коде. Предложения и критика приветствуются. А так я думаю метод вполне удобный.
Я думаю понятно, что если копнуть чуть глубже, то встает вопрос насчет дублирования полей, которые не нуждаются в переводе (числа\даты\т.п.).
Хочу поделиться своей мыслёй
Покажу на примере:
есть таблица 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 и подключать к любой нужной модели.
Чуть позже сделаю отдельный топик и реализацию в коде. Предложения и критика приветствуются. А так я думаю метод вполне удобный.
Re: Мультиязычные модели
Здравствуйте
Хотелось бы ещё примеров самих структур таблиц (новостей к примеру)
Когда сделаете behavior и отдельный топик ?
Хотелось бы ещё примеров самих структур таблиц (новостей к примеру)
Когда сделаете behavior и отдельный топик ?
- и вот про это поподробнееосновываясь на $translatableFields с помощью Form Builder генерируем вторую форму
Re: Мультиязычные модели
Уже есть такой бехавиор. Его я у себя рассмотрел.TBIKC писал(а):Хотелось бы ещё примеров самих структур таблиц (новостей к примеру)
Re: Мультиязычные модели
а как юзать? добавляю в урл /en/
Невозможно обработать запрос "en/backend/category".
будьте склонны к начинающим
догадываюсь что-то надо подшаманить в урлманаджере, но что?
Невозможно обработать запрос "en/backend/category".
будьте склонны к начинающим
догадываюсь что-то надо подшаманить в урлманаджере, но что?
Re: Мультиязычные модели
На хабре говорится об этомdesc писал(а):а как юзать? добавляю в урл /en/
Невозможно обработать запрос "en/backend/category".
будьте склонны к начинающим
догадываюсь что-то надо подшаманить в урлманаджере, но что?
http://habrahabr.ru/post/139689/
И Дмитрий подробно писал об этом
http://www.elisdn.ru/blog/39/yii-based- ... e-and-urls
Re: Мультиязычные модели
У меня мультиязычный только фронтенд.
Как сделать чтобы в бекэенде выводились в гриде все записи на рус и англ
У меня модели общие для фронта и бекенда
Правило отфильтровывае англ язык. По умолчанию в конфиге стоит рус язык
Как сделать чтобы в бекэенде выводились в гриде все записи на рус и англ
У меня модели общие для фронта и бекенда
Правило отфильтровывае англ язык. По умолчанию в конфиге стоит рус язык
Код: Выделить всё
public function defaultScope()
{
return array(
'condition' => $this->getTableAlias(false, false).".lang='".Yii::app()->language."'",
);
}