2012-04-23 67 views
17

我想開發一種網站,使用2種語言,默認語言,我的母語和可選的英語。我打算讓我的域名如下:Django網站有兩種語言

www.mydomain.com/tr/ 
www.mydomain.com/en/ 

默認情況下,一旦用戶輸入mydomain.com。他們將被重定向到/tr/版本,並選擇通過頂層菜單轉到/ en /。這是我的問題。

什麼是最好的Django維護兩種語言的方式,請注意,我不希望自動翻譯,但我想自己維護兩種語言的文本。

謝謝

回答

24

當我看到它,你這裏有兩個主要選項:

(1)你可以保持網站的兩個單獨的副本不同的Django的應用程序,只是有你urlconf點到這些應用 - 因此url(r'^/en/', include(myproject.en))將在您的urlconf中指向您的英文應用程序,另一個用於其他語言。這將涉及爲這兩個應用程序維護不同的urlconf集合和不同的html模板等,如果您有興趣讓URL本身也反映不同的語言(例如,西班牙語「/ pagina/uno」vs英語「 /頁/一「)。 (2)您使用Django sessions在Cookie中記錄語言首選項(您應該真的應該這樣做),然後讓該模板從該Cookie中提供適當的文本版本,然而您喜歡。該代碼,這可能是:

# views.py 

# default to your native language 
request.session['lang'] = 'tr' 

# someone clicks the link to change to English 
def switch_to_English_link(request): 
    request.session['lang'] = 'en' 

然後在模板,來收集這些信息,你會使用:

<!-- my_django_template.html --> 
<div> 
    <span> 
    {% if request.session.lang == "en" %} 
     This is my text in English! 
    {% else %} 
     Şimdi benim sitede Türk var! 
    {% endif %} 
    </span> 
</div> 
+2

謝謝!還有,「Şimdibenim sitedeTürkvar!」使我的一天:) – Hellnar 2012-04-23 21:20:41

+1

其實,更好地閱讀radtek的答案,這解釋了在Django中這樣做的正確方法。這可能看起來很長,但實際上從長遠來看要好得多,因爲例如添加了語言,使用rosetta等等。 – 2015-05-30 10:44:35

+0

這是正確的。我的答案是黑客攻擊,不適用於計劃進行大量翻譯的網站,無論是跨越多個頁面還是跨越多個國家等。 – jdotjdot 2015-05-31 21:29:54

2

你應該去爲django-localeurl應用程序,如果你需要到在URL中指定頁面的語言。即特別是你在你的例子中做了什麼。 default Django translation machinery只是您的網址的前綴,在您的SEO策略中可能無效。 django-localeurl只是修復了URL處理部分,與默認的Django翻譯機器的其他部分相得益彰。

45

所以這裏是你的問題的長版本。測試Django 1.4到1.7.1:

在設置中。PY ...

添加到MIDDLEWEAR_CLASSES,語言環境,它能夠根據要求語言選擇:

'django.middleware.locale.LocaleMiddleware', 

添加LOCALE_PATHS,這是你的翻譯文件將被存儲:

LOCALE_PATHS = (
    os.path.join(PROJECT_PATH, 'locale/'), 
) 

啓用國際化

USE_I18N = True 

設置LANGUAGES你會被該網站翻譯成:

ugettext = lambda s: s 
LANGUAGES = (
    ('en', ugettext('English')), 
    ('pl', ugettext('Polish')), 
) 

添加國際化模板,背景處理器,請求將現在包括LANGUAGESLANGUAGE_CODE

Django的< 1.8把它放在這裏:

TEMPLATE_CONTEXT_PROCESSORS = (
    .... 
    'django.core.context_processors.i18n', # this one 
) 

Django的> = 1.8放在這裏:

TEMPLATES = [ 
    { 
     'OPTIONS': { 'context_processors': [ 
     'django.template.context_processors.i18n', # this one 
    ]} 
] 

巢,在urls.py:

在url_patterns,添加以下時,將啓用一套語言重定向視圖:

url(r'^i18n/', include('django.conf.urls.i18n')), 

見雜項在Translations更多關於這一點。

添加以下導入,並封裝要與i18n_patterns一起轉換的URL。這裏是我的樣子:

from django.conf.urls.i18n import i18n_patterns 
from django.utils.translation import ugettext_lazy as _ 

urlpatterns = patterns('', 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^i18n/', include('django.conf.urls.i18n')), 
) 

urlpatterns += i18n_patterns('', 
    (_(r'^dual-lang/'), include('duallang.urls')), 
    (r'^', include('home.urls')), 
) 

注意:您也可以將您的管理網址放入i18n_patterns。

用lazytext包裝您的文本!進口lazytext(如上),敷每串用它像這樣_(「文本」),你甚至可以去到其他urls.py文件和做像這樣的網址翻譯:

url(_(r'^dual_language/$'), landing, name='duallang_landing'), 

你可以用文本你想翻譯的其他文件,如models.py,views.py等。下面是翻譯標籤和help_text一個例子示範田:

name = models.CharField(_('name'), max_length=255, unique=True, help_text=_("Name of the FAQ Topic")) 

Django的翻譯文檔是爲這個偉大的!

在你的HTML模板...

現在你可以進入你的模板和加載國際化templatetag和你要翻譯的靜態的東西使用反式transblock。這裏有一個例子:

{% load i18n %} 

{% trans "This is a translation" %}<br><br> 
{% blocktrans with book_t='book title'|title author_t='an author'|title %} 
This is {{ book_t }} by {{ author_t }}. Block trans is powerful! 
{% endblocktrans %} 

現在運行的每個區域設置的makemessages:

./manage.py makemessages -l pl 

現在所有剩下的工作就是進入你的/區域設置文件夾,並編輯每個的.po的文件。填寫每個msgstr的數據。這裏是一個這樣的例子:

msgid "English" 
msgstr "Angielski" 

最後編譯消息:

./manage.py compilemessages 

有很多更要學會與翻譯和internationalization是密切相關的這個話題,所以檢查出文檔也是如此。我還建議查看一些Django可用的國際化軟件包,如django-rosettadjango-linguo。他們幫助翻譯模型內容,django-rosetta不會在數據庫中爲此創建新條目,而Django-linguo則可以。

我還爲那些有興趣查看完整工作解決方案的人創建了django translation demo

如果你遵循這一點,你應該開始一個好的開始。我相信這是使您的網站以多種語言運行的最標準化的方式。乾杯!

+0

很好的答案!我只是有一個簡單的問題:爲什麼定義ugettext,如果它只是返回字符串本身?爲什麼不只是做('en','english')? – dietbacon 2015-08-31 20:30:25

+0

所以它被拿起來作爲你可以翻譯的東西。 – radtek 2015-09-01 18:33:32

+0

很好的答案,謝謝! – 2016-08-03 14:59:14