我想对不同支持的语言使用相同的视图。 例如,我有默认语言和英语。
在我的主要网址中:
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'))
有没有办法为两个不同的网址使用相同的视图。或者,我如何处理多语言网站?我们是否必须复制所有受支持语言的所有应用程序?
答案 0 :(得分:1)
这是一个很长的主题,并不容易涵盖所有内容,但我会尽力覆盖:
1 - 使用django国际化和本地化:
Django具有多语言网站的内置功能:
Internationalization and localization
2 - 使用具有不同GET请求的单个网址:
您可以在网址中添加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
,posts_fr
等需要不同的名称,以便您可以重定向到正确的网址网址。request.path.split('/')
。这种处理多种语言的方式可能存在很多问题,所以我认为你不应该选择其中两种语言。