【问题标题】:Set or change the default language dynamically according to the user - Django根据用户动态设置或更改默认语言 - Django
【发布时间】:2017-03-22 13:47:28
【问题描述】:

有没有办法在点击按钮(发送请求)时动态更改 settings.py 中LANGUAGE_CODE 变量的值?

我希望用户为他们的帐户设置自己的“默认语言”。

现在用户可以使用下拉列表选择他们喜欢的语言,网站被完美翻译,并且由于 Django 选择浏览器的语言,用户在重新打开网站后不需要重新选择他们的语言从同一个浏览器。

但是当他们从不同的浏览器打开网站时,默认语言还是“英语”,因为在 settings.py 中将LANGUAGE_CODE 变量设置为en-us

所以我想做的是让每个用户都可以选择他们想要的语言作为他们的默认语言。我想通过制作另一个(类似的)下拉菜单并要求用户选择他们想要的语言作为“默认”并点击save 按钮,然后在保存时,我想更改LANGUAGE_CODE 的值到用户选择的那个(即动态更改它)。但是我不知道如何动态改变LANGUAGE_CODE的值。

此外,这种方法还有一个问题。假设即使我能够动态更改此 LANGUAGE_CODE 变量,它也会使网站将所选语言作为 ALL THE USERS 的默认语言,而不仅仅是针对更改它的那个特定用户,根据到 Django 的文档:

LANGUAGE_CODE:

  • 如果未使用区域设置中间件,它会决定向所有用户提供哪种翻译。

我研究了很多,但找不到适合我的解决方案。我对国际化很陌生。请帮忙。

【问题讨论】:

    标签: django internationalization


    【解决方案1】:

    当然有,这就是翻译的重点。您对“默认”语言的想法感到困惑;根据定义,他们选择的东西不是默认的。

    Django 文档解释了如何为用户明确地set the active language。您可以完全按照您的描述将其设置为保存。

    您可能还想在登录时重新设置此值,再次传递用户配置文件中的值。

    【讨论】:

    • 非常感谢您的回答。这正是我想要的:D
    【解决方案2】:

    参考问题中所述:

    我希望用户为其设置自己的“默认语言” 帐户。

    使用注册用户选择的首选语言翻译 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',
          ...
      ]
      

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

    【讨论】:

    • 这仅在您从头开始创建新项目或应用程序时才有效。因为 AbstractBaseUser 模型需要在第一次迁移之前定义。例如,如果您无法重置迁移和数据库,则必须覆盖中间件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多