Django网站多语言

时间:2015-02-01 19:58:28

标签: django session translation multilingual

这显然是一个备受争议的话题,但我正在努力解决我在Google和StackOverflow上找到的答案。

我已经实现了支持多种语言的模型,完美无缺。我的问题是允许网站上的用户永久更改语言。

我在顶部菜单栏中有一个语言标记,用户可以单击该标记来更改语言。然后打开/ 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中的不同slugs。

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

这样我就可以对&#34; / page / easy-to-use&#34;进行ajax请求。或&#34; / page / einfach-zu-bedinen&#34;获得相同的页面。

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

是否有解决方法不使用会话,而只是使用所选语言重新加载页面而不会聚集源代码?

1 个答案:

答案 0 :(得分:0)

为什么不使用内置的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和第三方模块都可以利用它。