2008-12-14 67 views
9

嘿,我目前正在为我的学习开发一个django应用程序,并且到了l18n的地步。本地化网站本身非常简单,但现在我必须允许用户翻译应用程序的动态内容。 用户可以将“产品”保存在数据库中,并为其提供名称和说明,但由于整个网站都应该进行本地化,因此我必须提供将这些名称和说明翻译成用户的方式。如何本地化一个Django应用程序的内容

django有没有一种自然的方式来做到这一点?或者我要实现它作为应用程序的一部分(由代表在数据模型中译本)

感谢,贾尼奥斯奇

回答

10

我建议检出django-multilingual。这是第三方应用程序,可让您在模型上定义翻译字段。

当然,您仍然需要键入实际的翻译,但它们会透明地存储在数据库中(而不是静态PO文件中),这是我相信您所问的。

0

这取决于谁将会提供翻译。如果你想为翻译提供一个网页界面,那么你需要自己开发,并且也代表数据库中的翻译。

如果翻译该网站的同一翻译人员也会翻译这些数据,则可以为他们提供他们用于该网站的相同模型(可能为gettext),然后您也可以使用gettext来获取此内容。

1

“我必须提供将这些名称和描述转换为用户的方法。”

“django有没有这样做的自然方法?”

您是否问Django是否可以从语言翻译成语言?你在问关于http://translate.google.com/的事吗?

我不认为Django可以将用户输入翻译成另一种语言。

如果您要为您的用户进行翻译,那么这必须是您的数据模型的一部分。

Django的i18n过滤器允许你有一个翻译字符串表。 documentation这样说。

  1. 将翻译字符串嵌入到您的Python代码和模板中。
  2. 获取这些字符串的翻译,无论您想支持哪种语言。 这是您通过聘请翻译人员或自己了解许多语言来手动完成的工作。
  3. 在您的Django设置中激活语言环境中间件。
0

我想你应该分两个步骤进行操作:

  1. 翻译单词
  2. 显示翻译的字符串

对于第一步,你应该告诉Django是用户插入的字符串将被翻译。我认为没有原生的方式来这样做。也许你可以从你的数据库中提取字符串,将它们放在特定于语言环境的文件中,在它们上运行“makemessages”,获取django.po文件并进行翻译。

其次,使用ugettext在Web应用程序上显示这些字符串。

希望这可以帮助那些与你同样的问题。

0

或者试试这个:

http://packages.python.org/django-easymode/i18n/index.html

它保持非常接近,你会怎么做,通常一个Django模型,你只需要添加你的模型上面1层的装饰。它具有对翻译字段的管理支持,包括内联和通用内联。几乎所有可以用常规模型和管理员课程所做的任何事情都可以用国际化版本来完成。

+0

您是否在生产环境中测试解决方案,以及它与django-multilingual-ng相比如何?我选择了一种新的方法来本地化数据库字段,因为Django 1.2+和django-multilingual-ng看起来完全无法使用django-multilingual。 – stricjux 2011-02-21 14:46:49

1

我在我的网站上有2种语言:英语和阿拉伯语 用户可以在点击标志的语言之间切换。 在模型中我使用代理模式:

class Product(models.Model): 
    name=models.CharField(max_length=100) 
    name_ar=models.CharField(max_length=100, default='') 

    def __unicode__(self): 
     return self.name 

class Product_ar(Product): 
    def __unicode__(self): 
     return self.name_ar 
    class Meta: 
     proxy=True 

在形式我用2种形式,而不是一个:

class CollectionEditForm_en(forms.Form): 
    name = forms.CharField(label=_('Name'), max_length=100, widget=forms.TextInput(attrs={'size':'50'})) 
    product = forms.ModelChoiceField(label=_('product'), queryset=Product.objects.filter(enabled=True), empty_label=None) 

class CollectionEditForm_ar(forms.Form): 
    name = forms.CharField(label=_('Name'), max_length=100, widget=forms.TextInput(attrs={'size':'50'})) 
    product = forms.ModelChoiceField(label=_('product'), queryset=Product_ar.objects.filter(enabled=True), empty_label=None) 

检查代码的语言是这样的:

if request.LANGUAGE_CODE=='ar': 
    CollectionEditForm=CollectionEditForm_ar 
else: 
    CollectionEditForm=CollectionEditForm_en 

所以模板我检查:

{% if LANGUAGE_CODE == "ar" %} 
    <a href="/product/{{product.alias}}/">{{product.name_ar}}</a> 
{% else %} 
    <a href="/product/{{product.alias}}/">{{product.name}}</a> 
{% endif %} 

希望此解决方案能够帮助某人