i18n: организация перевода динамических свойств объектов

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Johnatan
Сообщения: 167
Зарегистрирован: 2010.10.27, 13:06
Откуда: Reino de España

i18n: организация перевода динамических свойств объектов

Сообщение Johnatan »

Приветствую,

Есть таблица продукта Items с соответствующей моделью. Есть таблица свойств Materials с соответствующей моделью. Модели связаны между собой через MANY_MANY с таблицей Items_Materials.
У модели Materials есть свойство name, что является названием материала. Это свойство выдаётся через метод $material->getMaterial(). Данные названия нужно перевести на другие языки, соответственно в методе getMaterial() возврат свойства выглядит так:

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

return Yii::t('Items.Materials', $this->name); 
После окончания создания проекта и при сборе всех исходных текстов через yiic messages эта строчка пропускается мимо (так как в паттерне поиска messages стоят кавычки, а тут у второго аргумента кавычек нет). Материалы не попадают в оригинальные сообщения, а значит не доходят до переводчиков. Таких динамических текстовых свойств у объекта Items около двадцати. Сейчас я их собираю вручную, чтобы включить в файлы с сообщениями на перевод.

Кто-нибудь сталкивался с этим и какой наиболее оптимальный способ решить это? Писать своё расширение для консоли yiic, чтобы искать по таблицам в БД? Как отмечать какие таблицы нужно переводить, а какие нет? Вопрос именно в автоматизации и оптимизации процесса, так как сейчас он сам по себе несложен, но съедает довольно много времени.
Конференция: yii@conference.jabber.ru
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: i18n: организация перевода динамических свойств объектов

Сообщение rak »

и что парсить каждый раз как добавится новая запись в бд? для перевода контента из бд стандартные средства yii не подойдут
Johnatan
Сообщения: 167
Зарегистрирован: 2010.10.27, 13:06
Откуда: Reino de España

Re: i18n: организация перевода динамических свойств объектов

Сообщение Johnatan »

Не, ну для новых данных там всё продумано. В админке добавляется сразу и в таблицу SourceMessages и в таблицу самого поля. Также в админке есть возможность добавлять/изменять переводы. То есть проблема именно в обработке после завершения проекта.
Конференция: yii@conference.jabber.ru
taral14
Сообщения: 236
Зарегистрирован: 2011.02.26, 23:48

Re: i18n: организация перевода динамических свойств объектов

Сообщение taral14 »

А можно посмотреть как вы реализовали свою многоязычность? Просто необычно решение очень. Хочется посмотреть его поближе.
Когда я писал на Kohana многоязычность реализовывал так (для Yii можно сделать идентично). Добавлял в модель protected свойство $_languages = array('name', 'name2', 'name3',...) Где name name2 name3 поля которые имеют несколько вариантов переводов. Переопределял метод __get($col) в котором если запрашивалось свойство из массива $_languages возвращал в зависимости от языка name_ru name_en и т.д. Для Yii это все можно оформить вообще как behavior. Тогда ничего не нужно будет переопределять. Преимущество что в представлении можно использовать $article->title и не задумываться про языки. Недостатки тоже есть. И они весьма существенны. Что бы добавить новый язык нужно: добавить новое поле в базу данных для каждого многоязычного поля. Изменить представление добавления, редактирования этой модели (добавить новое поле на новую версию языка). Видел еще такой вариант http://www.yiiframework.ru/doc/cookbook ... tilanguage Но он совершенно не подходил для мои целей. Дублировать запись ради перевода одного поля не гуд. Но зато он подключается очень просто и требует минимум изменений.
Johnatan
Сообщения: 167
Зарегистрирован: 2010.10.27, 13:06
Откуда: Reino de España

Re: i18n: организация перевода динамических свойств объектов

Сообщение Johnatan »

У меня в представлении вместо $article->title; просто используется $article->gettitle();, что в общем-то равнозначно использованию $article->title, так как в методе __get компонентов есть строчки

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

$getter='get'.$name;
if(method_exists($this,$getter))
     return $this->$getter();
 
Только я могу ещё настроить отображение каждого свойства по-отдельности. Я считаю это более предпочтительным. Все переводы хранятся в специально предусмотренной для этого таблице Translations, которая является рабочей таблицей переводов компонента CDbMessageSource
Всё остальное аналогично тому что написано здесь: http://www.yiiframework.ru/doc/guide/ru/topics.i18n
Конференция: yii@conference.jabber.ru
taral14
Сообщения: 236
Зарегистрирован: 2011.02.26, 23:48

Re: i18n: организация перевода динамических свойств объектов

Сообщение taral14 »

Конечно так более гибко. Но если у нас большое количество колонок писать на все аналоги через get тоже не выход. Тем более что можно на те где нужно дополнительно отформатировать дописать такой метод. Меня больше интересует как у Вас происходит взаимодействие с таблицей Translations. Какие в ней есть поля, как вы получаете перевод соответствующего поля, как вы обновляете в ней записи. К примеру я нахожусь в редактировании Materials. Как мне добавить перевод на соответствующее поле. И каким образом я могу добавить новый язык. Это можно сделать в админке или только через редактирование скрипта.
alisherdavronov
Сообщения: 21
Зарегистрирован: 2011.09.21, 15:34

Re: i18n: организация перевода динамических свойств объектов

Сообщение alisherdavronov »

и я бы хотел об этом узнать
Johnatan
Сообщения: 167
Зарегистрирован: 2010.10.27, 13:06
Откуда: Reino de España

Re: i18n: организация перевода динамических свойств объектов

Сообщение Johnatan »

Сейчас я немного изменил подход к организации многоязычности в моделях. Теперь я использую модифицированное расширение MultilingualActiveRecord
Отличие от оригинала в том, что текст на оригинальном языке хранится в таблице SourceTexts (стандартная таблица CDbMessageSource), а переводы хранятся в Translations (также стандартная таблица того же класса).
В таблицах моделей хранятся id записей из SourceTexts. Точно так же создаются динамические связи для моделей. В случае с localized(), если перевод отсутствует, то подставляется текст из оригинала.
Конференция: yii@conference.jabber.ru
Ответить