Сам обычно решаю эту проблему очень просто: для всех полей, которые нужно переводить, создаются поля с префиксом языка (пример: title, en_tilte, de_title). Ну и в модели, что-то типа такого
class Article
{
/** some code */
public function __get($var)
{
$lField = $this->getLocale() . '_' . $var);
if (isset($this->_row->__isset($lField)) {
return $this->_row->__get($lField);
}
return $this->_row->__get($var);
}
/** some code */
}
/* использование */
$article = new Article($articleId);
echo $article->title; //значение на текущем языке
echo $article->setLocale('en')->title; //на en
Очевидно, что такой подход имеет определенные недостатки.
Есть еще вариант завести отдельную таблицу, в которой хранить переводы: