gpt4 book ai didi

Django1.4 : Generic way to set language links in template to work with i18n_patterns?

转载 作者:行者123 更新时间:2023-12-02 02:18:34 25 4
gpt4 key购买 nike

我开始使用 Django 1.4 中的新 i18n_patterns。基本上,我希望在所有模板标题上都有我支持的每种语言的语言链接。我已将 header 实现为包含在其他模板中的单独模板。

有没有办法让我的 header 保持通用并解决这个问题,而无需在模板上下文中传递当前 View 名称或当前 url?我想这涉及到一个问题:如何以通用方式从模板内部检索当前 View 或 url。

顺便说一句,我发现我之前使用 set_lang View 使用引用者更改事件语言的方法将被 url_patterns 破坏,因为在更改语言后,当重定向到引用的 View 时,它会将其更改回来。

任何帮助弄清楚在模板中设置语言链接以通用方式与 url_patterns 一起使用的通用方法将不胜感激!

最佳答案

基本上,有两种不同的方法来设置语言。您可以使用i18n_patterns自动神奇地为您的网址添加语言代码前缀,或者您可以使用 django.views.i18n.set_language View 来更改用户 session 中语言代码的值(或者 cookie,如果您的项目没有 session 支持)。

值得注意的是算法LocaleMiddleware用于确定语言:

  • 首先,它在请求的 URL 中查找语言前缀。仅当您在根 URLconf 中使用 i18n_patterns 函数时才会执行此操作。有关语言前缀以及如何国际化 URL 模式的详细信息,请参阅 URL 模式中的国际化。

  • 如果失败,它会在当前用户的 session 中查找 django_language 键。

  • 如果失败,它将查找 cookie。所使用的 cookie 的名称由 LANGUAGE_COOKIE_NAME 设置设置。 (默认名称为 django_language。)

  • 如果失败,它会查看 Accept-Language HTTP header 。该 header 由您的浏览器发送,并按优先级顺序告诉服务器您喜欢哪种语言。 Django 会尝试 header 中的每种语言,直到找到具有可用翻译的语言。

  • 如果失败,它将使用全局 LANGUAGE_CODE 设置。

您可能遇到的问题是您无法使用 set_language从已经使用语言前缀提供服务的 URL 进行重定向,除非您专门传递 next POST 数据中的参数。这是因为set_language将默认重定向到引用者,其中将包含先前的语言前缀,即 LocaleMiddleware然后会看到并以旧语言提供内容(因为它在检查 django_language session 变量之前会在 url 中查找语言前缀)。

为了清楚起见,举一个例子:

  1. 您的用户位于/en/news/article/1000,并点击了将“language=es”发布到 set_language 的链接。 .

  2. set_language看到 'language=es',检查 'es' 是否可用,然后将 'django_language' session 变量(或 cookie)设置为 'es'

  3. 由于您尚未设置“next”,因此它会重定向到 reqeuest.META['HTTP_REFERRER'] 的值,即/en/news/article/1000

  4. LocaleMiddleware ( source ) 在 url 中看到“en”前缀,并激活“en”语言并设置 request.LANGUAGE_CODE到“en”

我看到两种可能的解决方案:

  1. 编写您自己的 set_language View (参见原始来源 here ),它将检查引用者中的语言前缀(使用 django.utils.translation.get_language_from_path ),并将其更改为新选择的语言的前缀,然后再重定向回它。

  2. 使用javascript在客户端进行相同的操作,并设置next POST 参数。确实,这有点愚蠢;使用 javascript 动态地在所有 url 前面加上用户首选的语言代码可能会更简单,而忘记 set_language总共。

看来这个新的set_language view 可能应该是 Django 的默认行为。 There was a ticket raised ,其中包括建议的实现,但没有真正描述问题,随后被关闭。我建议开一张新票,更好地描述您的用例,即现有 set_language 引起的问题。实现以及您提出的解决方案。

关于Django1.4 : Generic way to set language links in template to work with i18n_patterns?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10224357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com