Django 网站多语言

Django Website multi-language

这显然已经是一个高度讨论的话题,但我正在努力寻找在 Google 和 Whosebug 上找到的答案。

我已经实现了支持多种语言的模型,效果非常好。我的问题是允许网站上的用户为自己永久更改语言。

我在顶部菜单栏中有一个语言标志,用户可以单击它来更改语言。然后它打开 /setlanguage/de,而 de 是语言。 en 表示英语等

def setlanguage(request, lang):
    defaultLanguage = 'en'
    try:
        if 'language' in request.session:
            pass
    except KeyError:
        request.session['language'] = defaultLanguage

    if defaultLanguage == lang:
        return redirect("/")

    if lang not in list(Language.objects.all().values_list('code').distinct()):
        request.session['language'] = defaultLanguage
    else:
        request.session['language'] = lang

    return redirect('/')

这不起作用的原因是重定向,我无法根据请求设置任何变量。

然而,无论如何我真的只有一个页面,所以我只需要将用户重定向到“/”。 我的翻译还支持 URL 中的不同 slug。

url(r'^show/(?P<slug>[-\w]+)', views.show, name='show'),

这样我就可以向“/page/easy-to-use”或“/page/einfach-zu-bedinen”发出 ajax 请求以获得相同的页面。

我真的不想在用户的计算机上设置 cookie。我来自 PHP 背景,我假设会话处理在 Django 中的工作方式略有不同,因为我希望它在全球范围内可用,而不是基于每个请求?

是否可以解决不使用会话而仅使用所选语言重新加载页面而不聚集源代码的问题?

为什么不使用 django 内置的 set_language 视图?

https://docs.djangoproject.com/en/1.7/topics/i18n/translation/#set-language-redirect-view

另外:

有什么意义
try:
    if 'language' in request.session:
        pass

这实际上什么也没做。

检查 lang 是否可用:

    if lang not in list(Language.objects.all().values_list('code').distinct()):

不好,因为你每次都从数据库中获取所有语言。更好的场景是:

    if Language.objects.filter(code=lang):

考虑将可用语言放入 settings.py 文件而不是数据库。如果你真的想将它存储在数据库中,请以某种方式将它与 settings.LANGUAGES 同步,这样所有内置的 django 和第三方模块都可以利用它。