我开始使用 Django 1.4 中的新 i18n_patterns。基本上,我希望在所有模板标题上都有我支持的每种语言的语言链接。我已将标头实现为包含在其他模板中的单独模板。
有没有办法让我的标头保持通用并解决此问题,而无需在模板上下文中传递当前视图名称或当前 url?我想这涉及到一个问题:如何以通用方式从模板内部检索当前视图或 url。
顺便说一句,我发现我之前使用 set_lang 视图使用引用者更改活动语言的方法将被 url_patterns 破坏,因为在更改语言后,当重定向到引用视图时,它会将其更改回来。
任何帮助弄清楚在模板中设置语言链接以通用方式与 url_patterns 一起使用的通用方法将不胜感激!
基本上,有两种不同的方法来设置语言。您可以使用i18n_patterns
自动神奇地为您的网址添加语言代码前缀,或者您可以使用django.views.i18n.set_language
view 来更改用户会话中语言代码的值(或者 cookie,如果您的项目没有会话支持)。
值得注意的是算法LocaleMiddleware
用于确定语言:
首先,它在请求的 URL 中查找语言前缀。仅当您在根 URLconf 中使用 i18n_patterns 函数时才会执行此操作。有关语言前缀以及如何国际化 URL 模式的更多信息,请参阅 URL 模式中的国际化。
如果失败,它会在当前用户会话中查找 django_language 键。
如果失败,它会查找 cookie。所使用的 cookie 的名称由 LANGUAGE_COOKIE_NAME 设置设置。 (默认名称是 django_language。)
如果失败,它会查看 Accept-Language HTTP 标头。该标头由您的浏览器发送,并按优先级顺序告诉服务器您喜欢哪种语言。 Django 会尝试标头中的每种语言,直到找到具有可用翻译的语言。
如果失败,它将使用全局 LANGUAGE_CODE 设置。
您可能遇到的问题是您无法使用set_language
从已经使用语言前缀提供服务的 url 进行重定向,除非您专门传递next
POST 数据中的参数。这是因为set_language
将默认重定向到引用者,其中将包含先前的语言前缀,其中LocaleMiddleware
然后会看到并以旧语言提供内容(因为它会在检查 URL 之前查找语言前缀)django_language
会话变量)。
为了清楚起见,举一个例子:
您的用户位于 /en/news/article/1000,并单击将发布“language=es”的链接到set_language
.
set_language
看到 'language=es',检查 'es' 是否可用,然后将 'django_language' 会话变量(或 cookie)设置为 'es'
由于您尚未设置 'next',因此它会重定向到 request.META['HTTP_REFERER'] 的值,即 /a/news/article/1000
LocaleMiddleware
(source https://github.com/django/django/blob/master/django/middleware/locale.py#L11) 在 url 中看到“en”前缀,并激活“en”语言并设置request.LANGUAGE_CODE
to 'en'
我看到两种可能的解决方案:
写你自己的set_language
查看(查看原始来源here https://github.com/django/django/blob/master/django/views/i18n.py),它将检查引荐来源网址中的语言前缀(使用django.utils.translation.get_language_from_path
),并将其更改为新选择的语言的前缀,然后再重定向回该语言。
使用javascript在客户端进行相同的操作,并设置next
POST 参数。确实,这有点愚蠢;使用 javascript 动态地在所有 url 前面加上用户的首选语言代码可能会更简单,并且忘记set_language
共。
看来这个新set_language
view 可能应该是 Django 的默认行为。有人提出了罚单 https://code.djangoproject.com/ticket/17569,其中包括建议的实现,但没有真正描述问题,随后被关闭。我建议开一张新票,更好地描述您的用例、现有问题引起的问题set_language
实施以及您提出的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)