【问题标题】:Saving user preferred language and django-localeurl保存用户首选语言和 django-localeurl
【发布时间】:2011-11-22 16:21:23
【问题描述】:

好的,经过两个小时的尝试,我要问...

我有一个应用程序,它支持多种语言。如果应用程序的默认语言是浏览器语言会很好,但如果用户可以覆盖该语言也很好。

我的意思是,您的浏览器是英文的,但您是德国人,您点击德国国旗来更改网络语言并记住这一点。

我试过django-localeurl

它工作正常,它会显示 url 上的语言,甚至你可以将默认语言设置为浏览器语言。

当我创建一个选择框来更改语言时,问题就出现了,就像 django-locateurl 说的那样。选择有效,但是当我移至另一页时,语言会更改为默认语言。不保存新选择的语言。

我尝试了一些声称可以解决这个问题的叉子,原始叉子的补丁.. 没有。

我读到过将 SessionMiddleware 放在 localeURLMiddleware 之前,...

什么都没有。

那么,有人得到了这个工作,或者为此使用了另一个库吗?

谢谢。

【问题讨论】:

    标签: django internationalization django-localeurl


    【解决方案1】:

    我结束了使用 Django-dev (1.4),它内置了 i18n url,所以不需要 localeurl。

    【讨论】:

      【解决方案2】:

      阅读以下文章。

      http://barseghyanartur.blogspot.nl/2013/09/make-django-localeurl-rembember-your.html

      简而言之,有可能通过对 django-localeurl 主分支的最后一次提交和一些技巧。

      步骤 1. 从源 (bitbucket) 安装 django-localeurl 或从同一位置选择稍后提交。

      $ pip install hg+https://bitbucket.org/carljm/django-localeurl@764caf7a412d77aca8cc929988f333ee808719e6#egg=django-localeurl

      第 2 步。如下更新您的 django settings.py。

      中间件类应如下所示(顺序很重要)。

      注意,django 的SessionMiddleware 排在第一位! LocaleURLMiddleware 应该在 django 的 CommonMiddleware 之前!

      注意,LOCALEURL_USE_SESSION 是新的。

      MIDDLEWARE_CLASSES = (
          'django.contrib.sessions.middleware.SessionMiddleware',
          'localeurl.middleware.LocaleURLMiddleware',
          'django.middleware.common.CommonMiddleware',
          # ... the rest
      )
      
      LOCALEURL_USE_SESSION = True
      

      第 3 步。将您的语言切换器 (POST) 定向到 {% url 'localeurl_change_locale' %} 视图,提供选择为 locale 参数的语言。

      差不多就是这样。有关将其包含在模板中的提示,请参阅文章。

      【讨论】:

      • 这是一个感谢您抽出宝贵时间的投票。 1 年前我离开了 Django:P
      【解决方案3】:

      django-cms 使用中间件做到这一点。如需灵感,请查看此处的 MultilingualURLMiddleware 类:

      https://github.com/divio/django-cms/blob/develop/cms/middleware/multilingual.py

      它执行以下操作:

      1. 查看 URL 的第一部分。如果它与您支持的语言(即 settings.LANGUAGES)匹配,则使用该语言代码调用 translation.activate(language)。
      2. 如果没有,则尝试查看是否设置了 request.session.get("django_language", "")。
      3. 如果没有,则尝试查看是否设置了 request.COOKIES.get("django_language", "")。

      但我实际上建议你开始使用 django-cms ;)

      【讨论】:

      • 谢谢,但 django-cms 并不适用于所有项目。我的应用不适合 cms,它只是一个月经日历。
      • 即使你不使用 django-cms 我仍然可以建议复制他们的中间件并将其修改为独立的。
      【解决方案4】:

      使用注册用户选择的首选语言翻译 Django 应用程序可以使用中间件 django-user-language-middleware 完成。通过查看 user.language 字段中的选定语言,您可以轻松本地化您的 Django 应用程序。

      用法:

      1. 向您的用户模型添加语言字段:

        class User(auth_base.AbstractBaseUser, auth.PermissionsMixin):
            # ...
            language = models.CharField(max_length=10,
                                        choices=settings.LANGUAGES,
                                        default=settings.LANGUAGE_CODE)
        
      2. 从 pip 安装中间件:

        pip install django-user-language-middleware

      3. 将其添加到设置中的中间件类列表以侦听请求:

        MIDDLEWARE = [  # Or MIDDLEWARE_CLASSES on Django < 1.10
            ...
            'user_language_middleware.UserLanguageMiddleware',
            ...
        ]
        

      我希望这可以帮助人们将来解决这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-21
        • 1970-01-01
        • 2022-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多