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

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

我正在用Django编写一个简单的多语言网站,我在切换语言方面有点困难。我认为每种语言都有不同的URL会很好(例如英语站点为/en/contact/,德语站点为/de/kontakt/)。也许这不仅看起来更好,而且在SEO环境中也有意义

因此,我在url.py中:

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