一个视图,用于在django中处理多种语言的多个URL

问题描述 投票:0回答:1

我想对不同支持的语言使用相同的视图。例如,我有默认语言和英语。

在我的主要网址中:

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'))

有没有办法为两个不同的网址使用相同的视图。或者,我如何处理多语言网站?我们是否必须复制所有受支持语言的所有应用程序?

django django-views
1个回答
1
投票

这是一个很长的主题,并不容易涵盖所有内容,但我会尝试尽可能多地覆盖:

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 - 不同的网址(你的方式):

我真的不喜欢这种处理多语言网站的方式,但如果你真的需要这样做,那么你去吧:

  • 您需要为您的网址设置不同的名称,例如qazxsw poi,qazxsw poi等,以便您可以重定向到正确的页面网址。
  • 您应该在视图中获取页面URL并检查您使用的语言。你可以这样做:posts_en
  • 然后你应该检查语言并决定呈现哪个模板就像选项#2一样

这种处理多种语言的方式可能存在很多问题,所以我认为你不应该选择其他两种选择。

© www.soinside.com 2019 - 2024. All rights reserved.