2010-11-05 76 views
0

在開發用於多種語言的應用程序時,我發現使用本地化嘗試構建特定於應用程序的特定本地化庫會帶來真正的好處。我正在開發一個有16種語言的網站,每種語言在各個地方都會有不同的圖像,並且每個網頁內容都有全文翻譯,每種語言都位於不同的網址(www.example.com/en /等)。 Django的國際化框架似乎非常神奇而且很棘手。我的想法是做一些基本的東西,如:關於Django國際化框架的問題

class Language(models.Model): 
    name = models.CharField(max_length=50) 
    code = models.CharField(max_length=2) # (e.g. "FR") 


class ContentSection(models.Model): 
    page = models.ForeignKey('mysite.Page') 
    name = models.CharField(max_length=50) # (e.g. ("main body text") 
    content = models.TextField(max_length=5000) 

    class Meta: 
     unique_together = (('name', 'page'),) 


class ContentTranslation(models.Model): 
    content_section = models.ForeignKey(ContentSection) 
    language = models.ForeignKey(Language) 
    content = models.TextField(max_length=5000) 

    class Meta: 
     unique_together = (('content_section', 'language'),) 

我會用中間件來設置基於第一URL段目前的語言,在我的意見我會拉一個給定頁面中的內容與觀點是這樣的:

# In views.view_page 
left_content = ContentSection.objects.filter(page=current_page, name='left column text') 
if not request.language.code == 'EN': 
    left_content = ContentTranslation.objects.get(content_section=left_content, language=request.language) 

當然,在生產中我可能會創建一個模板標記,可以通過名字內容(用正確的語言),而不是在視圖中明確拉動每個內容區域。

這樣做看起來很荒謬,而不是使用i18n嗎?我是否因國際化而錯失了更大的局面?

(記住:該網站將在其他語言的用戶進行瀏覽,但所有管理的東西,包括插入翻譯,將在美國完成)

回答

2

這是一個完善的方法,如果你需要的是能夠讓您的用戶以所有不同的語言更改內容。你也可以創建一個很好的界面。

但是,您沒有使用Django i18n框架。那麼你的問題是什麼? :)

我已經嘗試使用i18n框架的內容和使用你的方法。在po文件中存儲翻譯對於「系統」文本非常有用,因爲您可以使用所有工具,如版本控制,錯誤跟蹤等。但是,如果您的用戶實際上想要更改內容所有的時間,我認爲幾乎所有的網站都是這種情況。

作爲一個側面說明,在URL中包括語言可以更容易地緩存每個人都應該使用的前端清漆代理的頁面,所以對於該決定+1。

+0

我的問題是真的,爲什麼我應該使用i18n而不是使用這種方法? – orokusaki 2010-11-05 18:34:34

+0

你不應該。 i18n框架用於屬於系統的文本,而不是內容本身。例如錯誤消息,部分頁眉,頁腳,系統消息給用戶等。您還可以使用它來格式化日期,日期時間,數字,貨幣等。 – knutin 2010-11-05 18:39:30

+0

好的,我從我對文檔的簡短閱讀中猜到,我認爲l10n是爲了這個,但我想l10n更多的是界面語言功能,比如模型字段,表單等等。我有一些閱讀要做。 – orokusaki 2010-11-05 18:44:26