我想对不同支持的语言使用相同的视图。例如,我有默认语言和英语。
在我的主要网址中:
url(r'^posts/', include('posts.urls')), #for default language
url(r'^en/posts/', include('posts.urls')), #for english
我的帖子应用的网址文件是这样的:
url(r'^newpost/$', views.PostFormView.as_view(), name='add'),
url(r'^favorite/$', views.favorite, name='favorite'),
所以,例如,www.mysite.com/posts/add和www.mysite.com/en/posts/add发送到相同的视图PostFormView并根据url如果它包含“/ en /”或不发送用正确的语言写的内容。
但是,问题在于重定向或反向始终发送到默认语言。例如'posts:add'总是发送到“www.mysite.com/posts/add”因为我在url(r'^posts/', include('posts.urls'))
之前有url(r'^en/posts/', include('posts.urls'))
有没有办法为两个不同的网址使用相同的视图。或者,我如何处理多语言网站?我们是否必须复制所有受支持语言的所有应用程序?
这是一个很长的主题,并不容易涵盖所有内容,但我会尝试尽可能多地覆盖:
1 - 使用django国际化和本地化:
Django具有多语言网站的内置功能:
Internationalization and localization
2 - 使用具有不同GET请求的单个URL:
您可以在网址中添加GET请求,例如:site.com/posts?lang=en
。并在您的观点中尝试这个:
language = request.GET.get('lang')
然后传递这种语言的正确模板。
例:
LANG_LIST = ['en', 'fa', 'fr']
if language.lower() in LANG_LIST:
template = '{}/posts/post.html'.format(language.lower())
else:
template = 'en/posts/post.html'
或者您可以使用具有不同语言文本的单个模板,并将语言传递给模板并在那里决定。
注意:您应该将用户语言添加到其会话中,以便即使没有GET请求也可以检索语言。
以下是会话的文档:
How to use sessions | Django documentation | Django
您还可以为用户配置文件添加语言并从中检索语言。我建议同时使用配置文件语言和用户会话。
3 - 不同的网址(你的方式):
我真的不喜欢这种处理多语言网站的方式,但如果你真的需要这样做,那么你去吧:
posts_en
。这种处理多种语言的方式可能存在很多问题,所以我认为你不应该选择其他两种选择。