2012-10-25 39 views
1

我正在部署一個Django項目來管理某種事件。有兩個部署單個數據庫,這些站點位於斯洛伐克。他們是爲「AkadémiaTrojstenu」和「Klub Trojstenu」事件。簡單的部分是我可以使用sites框架,相應地爲每個站點設置顯示名稱,並在我需要引用事件名稱的模板中使用它。多站點Django部署中的語法案例

在您意識到斯洛伐克語使用語法情況之前,這看起來一切正常。這意味着,在某些地方,我需要編寫「ProgramAkadémieTrojstenu」/「Program Klubu Trojstenu」或「StaréAkadémie」/「StaréKluby」等。

例如,請考慮下面這段模板代碼:

<link rel="alternate" type="application/atom+xml" title="Novinky pre {{ site.name }}" href="{% url "news_feed" %}" /> 

site.name包含「AkadémiaTrojstenu」,但在這種情況下,我需要它輸出「Novinky預AkadémiuTrojstenu」,即在內容在第四個語法情況下變量。

我現在看到的唯一方法是在模板中特殊情況下查看當前網站的域並輸出名稱的正確語法情況。這個解決方案顯然是嚴重的反DRY,可怕,會吃小孩。

有沒有人有更好的建議?有沒有某種標準的解決方案?我想象有很多使用語法的語言,而且肯定有人在我面前遇到過這個問題。

回答

1

正如@jpic所說,你可以用上下文標記來做到這一點。在模板中嵌入網站名稱實際上會更簡單,因爲它會被django的makemessages收錄。

<link rel="alternate" type="application/atom+xml" 
     title="Novinky pre {% trans 'Akadémia Trojstenu' context '4th' %}" 
     href="{% url "news_feed" %}" /> 

因爲這可能是與多個站點並不簡單,你可以做,而不是額外的.po文件,並手動輸入所有的站點名稱和他們的翻譯和上下文名稱。

這是一種容易出錯的方式,因爲您手動同步翻譯文件和某些數據庫值,但至少它全部位於模板外部。

msgctxt "1st" 
msgid "Akadémia Trojstenu" 
msgstr "Akadémia Trojstenu" 

msgctxt "2nd" 
msgid "Akadémia Trojstenu" 
msgstr "????? Trojstenu" 

msgctxt "3rd" 
msgid "Akadémia Trojstenu" 
msgstr "Akadémie Trojstenu" 

msgctxt "4th" 
msgid "Akadémia Trojstenu" 
msgstr "Akadémiu Trojstenu" 

... 

msgctxt "3rd" 
msgid "Klub Trojstenu" 
msgstr "Klubu Trojstenu" 

... 

將額外的.po放在另一個目錄中,並在LOCALE_PATHS設置中註冊該目錄。記住你做過這件事,所以當有人添加新網站或更改其名稱並開始想知道爲什麼翻譯被打破時,你知道該去哪裏看。

有了這個做,你應該能夠使用的網站名稱是這樣的:

<link rel="alternate" type="application/atom+xml" 
     title="Novinky pre {% trans site.name context '4th' %}" 
     href="{% url "news_feed" %}" /> 

當然,如果問題僅限於只是網站的名稱,你可能反而在堅持幾個領域您的Site模型來保存其他案例(子類)。由於網站對象從未真正改變,我不認爲這種反規範化會導致任何麻煩。

1

只需使用variables in your translation strings

output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d} 

這也適用於templates

{% blocktrans with site.name as site_name %}Novinky pre {{ site_name }}.{% endblocktrans %} 

Finnaly,你可能會發現有用使用translation contexts

在那裏你不必「吃小孩」(除非你真的很餓)。

+0

也許我太慢了,但我沒有看到如何在翻譯字符串中使用佔位符(反正不存在)可以幫助我在包含在我的模板中的變量中創建特定的字符串grammatical case-aware ... – koniiiik

+0

粘貼正在打擾您的示例代碼。 – jpic

+0

添加了一個示例。 – koniiiik