Python 如何在Django 1.6中构建多语言网站
我正在用Django编写一个简单的多语言网站,我在切换语言方面有点困难。我认为每种语言都有不同的URL会很好(例如英语站点为/en/contact/,德语站点为/de/kontakt/)。也许这不仅看起来更好,而且在SEO环境中也有意义 因此,我在url.py中:Python 如何在Django 1.6中构建多语言网站,python,django,Python,Django,我正在用Django编写一个简单的多语言网站,我在切换语言方面有点困难。我认为每种语言都有不同的URL会很好(例如英语站点为/en/contact/,德语站点为/de/kontakt/)。也许这不仅看起来更好,而且在SEO环境中也有意义 因此,我在url.py中: urlpatterns = pattern(‘’, url(r’^de/kontakt/$’, mysite.views.DeKontaktView, name=‘kontakt’,), url(r’^en/conta
urlpatterns = pattern(‘’,
url(r’^de/kontakt/$’, mysite.views.DeKontaktView, name=‘kontakt’,),
url(r’^en/contact/$’, mysite.views.EnContactView, name=‘contact’,),
)
现在,我希望在每个页面(在基本模板中)上都有链接,以便在德语和英语之间切换语言。在Django文档中,我找到了“set_语言重定向视图”()
我的问题是,在切换语言时,在哪里以及如何告诉视图应该重定向到哪里。我并不总是想重定向到我网站的frontpage,而是要重定向到另一种语言的相应页面——它有一个完全不同的url——而不仅仅是url中的不同语言前缀
由于“set_language redirect view”似乎使用referer,除非post数据中有下一个参数,因此我的第一个想法是这样的:
views.py:
def EnContactView(request):
…
if request.LANGUAGE_CODE == ‘en’:
return render_to_response(‘en/contact.html’), context)
else:
return redirect(‘/de/kontakt/‘)
def DeKontaktView(request):
…
if request.LANGUAGE_CODE == ‘de’:
return render_to_response(‘de/kontakt.html’), context)
else:
return redirect(‘/en/contact/‘)
但我认为这可能不是一个好的解决方案,因为这也会根据浏览器语言重定向。例如:如果浏览器语言为“en”的人直接访问我们的一个德语URL,例如通过谷歌。由于会话中既没有cookie“en”,也没有语言选择,因此访问者将被重定向到英文url,这是不需要的
那么,针对这些情况的最佳做法是什么?总而言之:我有完全不同的语言url——不仅仅是url中的不同语言前缀。对于每种语言,我都有一个模板(目录templates/en/和templates/de/)
- 如何在不同语言的相应页面之间切换
- 顺便问一下:是否可以不使用表单作为语言转换程序,而是使用简单的“de”和“en”链接
如果有人能帮我,那就太好了。对于django noob来说,“语言的东西”是相当令人困惑的。
django.conf.url.i18n.i18n_模式将负责(大部分)语言切换部分的语言前缀部分,django.views.i18n.set_language
,您可以使用django.utils.translation.ugettext\u lazy
来翻译url模式,就像其他可翻译的“静态”文本一样。您仍然需要以这种或那种方式处理内容的翻译(对于Django模型,有很多或多或少的可插拔应用程序可以解决这一问题),但这部分实际上取决于应用程序的域和逻辑。Django.conf.url.i18n.i18n\u模式将处理语言前缀部分,django.views.i18n.set_language
(大部分)语言切换部分,您可以使用django.utils.translation.ugettext_lazy
像任何其他可翻译的“静态”文本一样翻译url模式。您仍然需要以这种或那种方式处理内容的翻译(对于Django机型,有很多或多或少的可插拔应用程序可以解决这一问题),但这一部分实际上取决于您的应用程序的域和逻辑。
对于那些在翻译方面有问题或正在创建多语言网站的人,这里有一个更全面的解决方案
在settings.py中
添加到MIDDLEWEAR_类、语言环境中,可根据请求选择语言:
'django.middleware.locale.LocaleMiddleware',
添加区域设置路径,这是存储翻译文件的地方,还可以启用i18N:
使用_I18N=True
区域设置\u路径=(
join(项目路径,'locale/'),
)
设置将网站翻译为的语言:
ugettext = lambda s: s
LANGUAGES = (
('en', ugettext('English')),
('fr', ugettext('French')),
('pl', ugettext('Polish')),
)
添加i18n模板上下文处理器,请求现在将包括语言和语言代码:
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n', # this one
'django.core.context_processors.request',
'django.core.context_processors.static',
'django.contrib.messages.context_processors.messages',
)
嵌套,在url.py中:
在url_模式中,添加以下内容,它将启用设置语言重定向视图:
url(r'^i18n/', include('django.conf.urls.i18n')),
有关这方面的详细信息,请参见中的Miscellaneous
添加以下导入,并用i18n_模式封装要转换的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')),
)
注意:您还可以将管理员URL放入i18n_模式
现在,无论您在何处使用文本并希望对其进行转换,导入lazytext并像这样包装每个字符串(“文本”),您甚至可以转到其他url.py文件并像这样进行url转换:
url(_(r'^dual_language/$'), landing, name='duallang_landing'),
您可以将需要在其他文件(如models.py、views.py等)中翻译的文本换行。。下面是一个示例模型字段,其中包含标签和帮助文本的翻译:
name = models.CharField(_('name'), max_length=255, unique=True, help_text=_("Name of the FAQ Topic"))
在html模板中
现在,您可以进入模板并加载i18n templatetag,并对要翻译的静态内容使用trans和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 %}
现在剩下的就是进入/locales文件夹,编辑每个.po文件。填写每个msgstr的数据。这里有一个这样的例子:
msgid "English"
msgstr "Angielski"
将有意义的保留为空以选择默认语言
并最终编译消息:
./manage.py compilemessages
翻译还有很多东西需要学习,而且与本主题密切相关,因此也可以查看文档。我还建议查看Django-like和提供的一些国际化包。它们帮助翻译模型内容,django rosetta不会在数据库中为此创建新条目,而django linguo会
如果你遵循这一点,你应该有一个良好的开端。我相信这是让你的网站以多种语言运行的最标准化的方法。干杯 对于那些翻译有问题或正在创建多语言网站的人,这里有一个更全面的解决方案
在settings.py中
添加到MIDDLEWEAR_类、语言环境中,可根据请求选择语言:
'django.middleware.locale.LocaleMiddleware',
添加区域设置路径,这是存储翻译文件的地方,还可以启用i18N:
使用_I18N=True
区域设置\u路径=(
join(项目路径,'locale/'),
)
设置您需要的语言
./manage.py compilemessages