Django:django-transmeta - 排序评论

时间:2010-01-24 06:16:18

标签: django django-models

我创建了一个文章网站,其中文章以多种语言发布。我使用transmeta(http://code.google.com/p/django-transmeta/)在一个模型中支持多种语言。

此外,我使用通用评论框架,使文章可评论。我想知道如果同一篇文章用一种语言然后用另一种语言评论会发生什么。看起来所有评论都会显示在两个变种上....

问题实际上是: 是否有可能只显示使用当前语言提交的评论?

1 个答案:

答案 0 :(得分:2)

我尝试了transmeta的方法来翻译动态文本,我有以下经验:

  • 您需要另一种语言,您需要更改通常不受欢迎的数据库模型
  • 您需要两种语言中的每个项目,这都不灵活
  • 您在链接其他对象时遇到问题(正如您在问题中指出的那样)

如果你采取transmeta的方式,你将需要两个解决方案:

  • 用于翻译模型中字段的transmeta解决方案
  • 对于使用transmeta连接到模型的对象,您需要一个额外的字段来确定语言,例如CharField带有“en”,“de”,“ru”等。

这些主要缺点使我重新考虑这种方法并切换到另一种解决方案:django.contrib.sites。每个需要国际化的模型都继承自SiteModel:

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

每个需要transmeta翻译的对象都连接到一个站点。每个连接的对象都可以从父对象的站点属性确定其语言。

我基本上运行了wikipedia方法,并为子域(en。,de。,ru。)上的每种语言都有一个Site对象。对于每个站点,我启动了一个服务器实例,该实例具有自定义设置文件,该文件将设置SITE_ID和站点的语言。我使用django.contrib.sites.managers.CurrentSiteManager仅显示当前网站语言中的项目。我还有一位经理可以为您提供各种语言的对象。我构建了一个模型,连接来自不同语言的同一模型的对象,表示它们在语义上是相同的(想想维基百科上的语言左栏)。这些网站都使用相同的数据库并共享相同的未翻译用户模型,因此用户可以毫无问题地在语言之间切换。

优点:

  • 您的数据库架构无需更改其他语言
  • 您很灵活:轻松添加语言,只使用一种语言的对象等。
  • 使用(通用)外键,它们连接到一个对象并知道它是什么语言。您可以显示对象的注释,它们将使用一种语言。这解决了您的问题。

缺点:

  • 设置更多:您需要为每个站点提供django服务器实例以及更多粘合代码
  • 如果你需要一个不同语言的文章,你需要另一个模型来连接它们

您可能不需要django Site模型,并且可以在不需要多个django服务器实例的情况下实现相同的功能。

我不知道你想要构建什么,我所描述的可能不适合你的情况,但它完全适用于我的项目(基于pinax建立的国际化社区平台:http://www.bpmn-community.org/)。因此,如果您透露更多关于您的项目的信息,我可能会建议一种方法。

最后回答你的问题:不,通用评论不会与transmeta开箱即用。如您所知,您必须以两种语言显示以一种语言显示的文章的注释。或者你将不得不入侵评论并更改模型并做其他脏东西(不推荐)。我描述的方法适用于评论和任何其他可插拔应用程序。


回答你的问题:

  1. 两个Django实例可以共享一个数据库,没问题。
  2. 如果您不想要两个Django实例,只需要一个,则必须执行以下操作:中间件检查传入的请求,从URL中提取所需的语言(en.example.com或example.com/en/ etc. 。)并将语言首选项保存在请求对象中。视图必须使用该语言获取请求对象,并相应地处理对象的过滤。由于该语言没有专用服务器(例如在settings.py文件中存储语言的站点方法),您只能从请求中获取语言,并且必须将请求对象中的属性传递给模型经理过滤对象。
  3. 您可以尝试使用类似threadlocals middleware的方法伪造django应用程序中的全局语言状态,但是我不知道这是否与django I18N引擎很好地配合(这也是一些线程魔法)

    如果您希望使用多种语言扩展您的网站,我建议您选择网站方式。