这显然是一个备受争议的话题,但我正在努力解决我在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中的会话处理工作略有不同,因为我希望它可以全局使用而不是基于每个请求吗?
是否有解决方法不使用会话,而只是使用所选语言重新加载页面而不会聚集源代码?
答案 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和第三方模块都可以利用它。