2008-12-14 65 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 %} 

希望此解決方案能夠幫助某人