2010-01-24 9 views
1

Я создал сайт статьи, где статьи опубликованы на нескольких языках. Я использую transmeta (http://code.google.com/p/django-transmeta/) для поддержки нескольких языков в одной модели.Django: django-transmeta - сортировка комментариев

Также я использую общие рамки комментариев, чтобы сделать статьи замечательными. Интересно, что произойдет, если одна и та же статья будет прокомментирована на одном языке, а затем в другом. Похоже, что все комментарии будут отображаться в обоих вариантах ....

Вопрос на самом деле: Есть ли возможность отображения только комментариев, представленных на текущий язык статьи?

ответ

2

Я попробовал подход Transmeta для перевода динамических текстов, и я имел следующий опыт:

  • Вы хотите другой язык, вам нужно изменить модель базы данных, которая обычно нежелательно
  • Вы должны каждый пункт на обоих языках, который не является гибким
  • у вас есть проблемы, связывающие с другими объектами (как вы отмечаете в вашем вопросе)

Если взять т он путь Transmeta вам понадобится два решения:

  • Transmeta решение для перевода пол в модели
  • Для объектов, подключенных к модели с помощью Transmeta вам потребуется дополнительное поле для определения языка, говорят CharField с «en», «de», «ru» и т. д.

Это были основные недостатки, которые заставляли меня переосмыслить подход и переключиться на другое решение: django.contrib.sites. Каждая модель, которая нуждается в интернационализации наследует от SiteModel:

class SiteModel(models.Model): 
    site = models.ForeignKey(Site) 

Каждый объект, который нужно будет Transmeta перевод подключен к сайту. Каждый связанный объект может определять свой язык из атрибута сайта родительского объекта.

Я в основном использовал подход по Википедии и имел объект сайта для каждого языка на субдомене (en., De., Ru.). Для каждого сайта я запустил экземпляр сервера, у которого был пользовательский файл настроек, который бы установил SITE_ID и язык сайта. Я использовал django.contrib.sites.managers.CurrentSiteManager для отображения только элементов на языке текущего сайта. У меня также был менеджер, который бы предоставил вам объекты любого языка. Я построил модель, которая соединяет объекты одной и той же модели с разными языками, обозначая, что они семантически одинаковы (думайте, что язык слева столбца на википедии). Все сайты используют одну и ту же базу данных и используют одну и ту же непереведенную модель User, поэтому пользователи могут переключаться между языками без каких-либо проблем.

Преимущества:

  • Ваша схема базы данных не нужно менять для дополнительных языков
  • Вы гибкие: добавить языки легко, имеют объекты только на одном языке и т.д.
  • Работает с (родовое) внешние ключи, они подключаются к объекту и знают, на каком языке он находится. Вы можете отображать комментарии объекта, и они будут отображаться на одном языке. Это решает вашу проблему.

Недостатки:

  • Это большая сделка по установке: вам нужен экземпляр Джанго сервера для каждого сайта и немного больше клея кода
  • Если вам нужно, например, статью на разных языках, что вам нужно другая модель для их соединения

Возможно, вам не нужна модель сайта django и может реализовать что-то, что делает то же самое без необходимости использования нескольких экземпляров сервера django.

Я не знаю, что вы пытаетесь построить, и то, что я описал, может не соответствовать вашему делу, но он отлично подходит для моего проекта (интернациональная платформа сообщества, построенная на основе pinax: http://www.bpmn-community.org/). Поэтому, если вы еще раз расскажете о своем проекте, я могу посоветовать подход.

Чтобы ответить на ваш вопрос: Нет, общие комментарии не будут работать из коробки с трансметатом. Как вы поняли, вам придется отображать комментарии на обоих языках для статьи, отображаемой на одном языке. Или вам придется взламывать комментарии и менять модель и делать другие грязные вещи (не рекомендуется). Подход, который я описал, работает с комментариями и любым другим подключаемым приложением.


Чтобы ответить на ваши вопросы:

  1. Два экземпляра Django могут совместно использовать одну базу данных, никаких проблем там.
  2. Если вам не нужны два экземпляра Django, но вам нужно будет сделать следующее: промежуточное программное обеспечение проверяет входящий запрос, извлекает желаемый язык из URL (en.example.com или example.com/en/ и т. Д.). .) и сохраняет предпочтение языка в объекте запроса. Представление должно будет взять объект запроса с языком и соответственно позаботиться о фильтрации объектов. Поскольку для языка нет выделенного сервера (например, в подходах к сайтам, где язык хранится в файле settings.py), вы можете получить только язык из запроса, и вам нужно будет передать атрибуты из объекта запроса в Model менеджеров для фильтрации объектов.

Вы могли бы попытаться подделать глобальное состояние языка в приложении Джанго с подходом, как threadlocals middleware, однако я не знаю, если это играет хорошо с Джанго I18N двигателем (который также делает какую-то нить магии).

Если вы хотите стать большим с вашим сайтом на нескольких языках, я рекомендую походить на сайты.

+0

Очень интересная идея, на самом деле я что-то не понимаю: 1) Я мог бы настроить разные поддомены на каждый экземпляр django (в этом случае проблемы будут иметь место, если понадобится, например, для обмена базами данных пользователей) 2) Возможно, есть возможность использовать один экземпляр django для всех доменов, но я не могу себе представить, как его настроить. –

+0

Расширеный текст, чтобы ответить на ваши вопросы. – stefanw

+0

ОП случайно не наградил щедростью, но хочет выразить свое сожаление. Баунти не могут быть награждены ретроактивно, как только они истекут. 2 upvotes (OP + me) для ваших проблем. –

Смежные вопросы