如何在Django 1.6中构建多语言网站

时间:2013-11-20 12:58:04

标签: python django

我正在Django写一个简单的多语言网站,我在切换语言方面有点挣扎。我认为为每种语言设置不同的网址会很好(例如/ en / contact /用于英文网站,/ de / kontakt /用于德语网站)。也许这不仅看起来更好,而且在SEO背景下也有意义。

所以我在urls.py:

urlpatterns = pattern(‘’,
    url(r’^de/kontakt/$’, mysite.views.DeKontaktView, name=‘kontakt’,),
    url(r’^en/contact/$’, mysite.views.EnContactView, name=‘contact’,),
)

现在我希望在每个页面(在基本模板中)都有链接来切换德语和英语之间的语言。在Django文档中,我找到了'set_language重定向视图'(https://docs.djangoproject.com/en/1.6/topics/i18n/translation/#the-set-language-redirect-view)。

我的问题是在切换语言时,在哪里以及如何告诉视图应该重定向的位置。我并不总是希望重定向到我网站的首页,而是重定向到另一种语言的相应页面 - 它有一个完全不同的网址 - 不仅是网址中的不同语言前缀。

由于'set_language重定向视图'似乎使用引荐来源,除非帖子数据中有下一个参数,我的第一个想法是这样的:

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”的用户直接访问我们的德语网址,例如通过谷歌。由于会话中既没有cookie'en'也没有语言选择,访问者将被重定向到英文网址 - 这不是意图。

那么这些情况的最佳做法是什么?总结一下:我的语言网址完全不同 - 不仅仅是网址中的不同语言前缀。对于每种语言,我都有一个模板(目录模板/ en /和templates / de /)。

  • 如何在不同语言的相应页面之间切换?
  • 顺便说一下:是否可以不使用表单作为语言切换器,而是简单的链接'de'和'en'?

如果有人可以帮助我,那就太好了。对于django noob而言,“语言事物”非常混乱。

3 个答案:

答案 0 :(得分:1)

https://docs.djangoproject.com/en/1.6/topics/i18n/translation/#translating-url-patterns

#setting.py
gettext = lambda s: s

LANGUAGES = (
    ('en', gettext('English')),
    ('de', gettext('De')),

)

#url
from django.http import Http404
from django.conf.urls.i18n import i18n_patterns

urlpatterns += i18n_patterns('',
    url(r'^contact/$', mysite.views.ContactView, name='contact'),
)

#view
def ContactView(request)
    if request.LANGUAGE_CODE == 'de':
        return render_to_response('de/kontakt.html')
    if request.LANGUAGE_CODE == 'en':
        return render_to_response('en/contact.html')
    raise Http404

答案 1 :(得分:0)

django.conf.urls.i18n.i18n_patterns会处理语言切换部分(大部分)的语言前缀部分django.views.i18n.set_language,您可以使用django.utils.translation.ugettext_lazy翻译您的网址模式可翻译的“静态”文本。你仍然需要以这样或那样的方式处理内容的翻译(有很多或多或少的可插拔应用程序为Django模型解决这个问题),但这部分真的取决于你的应用程序的域和逻辑。

答案 2 :(得分:0)

对于那些在翻译方面遇到问题或正在创建多语言网站的人来说,这是一个更全面的解决方案。

在settings.py ...

添加到MIDDLEWEAR_CLASSES,locale,它可根据请求选择语言:

'django.middleware.locale.LocaleMiddleware',

添加LOCALE_PATHS,这是您的翻译文件的存储位置,同时启用i18N:     USE_I18N =真     LOCALE_PATHS =(         os.path.join(PROJECT_PATH,' locale /'),     )

将您要翻译网站的语言设置为:

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

添加i18n模板上下文处理器,请求现在将包含LANGUAGES和LANGUAGE_CODE:

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',  
)

Nest,在urls.py中:

在url_patterns中,添加以下内容,它将启用设置语言重定向视图:

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

有关详情,请参阅Translations中的杂项。

添加以下导入,并使用i18n_patterns封装要翻译的网址。这就是我的样子:

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并用它包装每个字符串_(' text'),你甚至可以转到你的其他urls.py文件并做网址像这样翻译:

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

您可以将要翻译的文本包装在其他文件中,例如models.py,views.py等。这是一个示例模型字段,其中包含label和help_text的翻译:

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

在你的html模板中......

现在,您可以进入模板并加载i18n模板标签,并对要翻译的静态内容使用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 %}

现在为每个区域设置运行makemessages:

./manage.py makemessages -l pl

现在剩下的就是进入你的/ locales文件夹,并编辑每个.po文件。填写每个msgstr的数据。这是一个这样的例子:

msgid "English"
msgstr "Angielski"

将那些有意义的内容留空以获取默认语言。

最后编译消息:

./manage.py compilemessages

翻译需要学习更多内容,internationalization与此主题密切相关,因此请查看相关文档。我还建议查看一些可用于Django的国际化软件包,例如django-rosettadjango-linguo。它们有助于翻译模型内容,django-rosetta不会在数据库中为此创建新条目,而django-linguo会这样做。

如果你遵循这个,你应该有一个良好的开端。我相信这是让您的网站以多种语言运行的最标准化方式。干杯!