我想開發一種網站,使用2種語言,默認語言,我的母語和可選的英語。我打算讓我的域名如下:Django網站有兩種語言
www.mydomain.com/tr/
www.mydomain.com/en/
默認情況下,一旦用戶輸入mydomain.com。他們將被重定向到/tr/
版本,並選擇通過頂層菜單轉到/ en /。這是我的問題。
什麼是最好的Django維護兩種語言的方式,請注意,我不希望自動翻譯,但我想自己維護兩種語言的文本。
謝謝
我想開發一種網站,使用2種語言,默認語言,我的母語和可選的英語。我打算讓我的域名如下:Django網站有兩種語言
www.mydomain.com/tr/
www.mydomain.com/en/
默認情況下,一旦用戶輸入mydomain.com。他們將被重定向到/tr/
版本,並選擇通過頂層菜單轉到/ en /。這是我的問題。
什麼是最好的Django維護兩種語言的方式,請注意,我不希望自動翻譯,但我想自己維護兩種語言的文本。
謝謝
當我看到它,你這裏有兩個主要選項:
(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>
您可以使用可翻譯的URL模式,這些模式可用於1.4版本。
https://docs.djangoproject.com/en/dev/topics/i18n/translation/#url-internationalization
你應該去爲django-localeurl應用程序,如果你需要到在URL中指定頁面的語言。即特別是你在你的例子中做了什麼。 default Django translation machinery只是您的網址的前綴,在您的SEO策略中可能無效。 django-localeurl
只是修復了URL處理部分,與默認的Django翻譯機器的其他部分相得益彰。
所以這裏是你的問題的長版本。測試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')),
)
添加國際化模板,背景處理器,請求將現在包括LANGUAGES
和LANGUAGE_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-rosetta和django-linguo。他們幫助翻譯模型內容,django-rosetta不會在數據庫中爲此創建新條目,而Django-linguo則可以。
我還爲那些有興趣查看完整工作解決方案的人創建了django translation demo。
如果你遵循這一點,你應該開始一個好的開始。我相信這是使您的網站以多種語言運行的最標準化的方式。乾杯!
謝謝!還有,「Şimdibenim sitedeTürkvar!」使我的一天:) – Hellnar 2012-04-23 21:20:41
其實,更好地閱讀radtek的答案,這解釋了在Django中這樣做的正確方法。這可能看起來很長,但實際上從長遠來看要好得多,因爲例如添加了語言,使用rosetta等等。 – 2015-05-30 10:44:35
這是正確的。我的答案是黑客攻擊,不適用於計劃進行大量翻譯的網站,無論是跨越多個頁面還是跨越多個國家等。 – jdotjdot 2015-05-31 21:29:54