Django 用户登录时应用的Useprofile.Language字段中存储的语言

Django 用户登录时应用的Useprofile.Language字段中存储的语言,django,session,internationalization,authentication,Django,Session,Internationalization,Authentication,我需要在两种情况下为用户设置语言: 用户登录(django检查其UserProfile字段的语言字段值,并设置正确的语言) 用户可在“用户首选项”页面中选择 我试过使用“用户登录”信号接收器 from django.utils import translation from django.dispatch import receiver from django.contrib.auth.signals import user_logged_in @receiver(user_logged_in

我需要在两种情况下为用户设置语言:

  • 用户登录(django检查其UserProfile字段的语言字段值,并设置正确的语言)
  • 用户可在“用户首选项”页面中选择
  • 我试过使用“用户登录”信号接收器

    from django.utils import translation
    from django.dispatch import receiver
    from django.contrib.auth.signals import user_logged_in
    
    @receiver(user_logged_in)
    def setlang(sender, **kwargs):
        translation.activate(kwargs['user'].get_profile().language)
        kwargs['request'].session['django_language'] = translation.get_language()
    
    在我重新启动django实例之前,这一切都很正常。虽然会话处于活动状态(无需再次登录),但网站仍以settings.language中指定的语言显示

    我认为同样的情况也适用于第2种情况(在用户首选项表单save()上)

    我认为最好是这样。Django提供了一种在整个请求的不同位置添加钩子的方法,以便您可以添加自定义代码

    在您的情况下:检查每个请求会话中是否有语言变量,如果没有,则从数据库中获取用户语言首选项并将其保存到会话变量。在保存信号上检查用户是否更改了他们的偏好;如果是这样,请更新会话变量(从模型级别访问请求时可能会遇到问题,因此最好在视图中执行此操作)

    我认为最好是。Django提供了一种在整个请求的不同位置添加钩子的方法,以便您可以添加自定义代码


    在您的情况下:检查每个请求会话中是否有语言变量,如果没有,则从数据库中获取用户语言首选项并将其保存到会话变量。在保存信号上检查用户是否更改了他们的偏好;如果是这样,请更新会话变量(从模型级别访问请求时可能会遇到问题,因此最好在视图中执行此操作)

    我使用过这个片段,但它与常规的LocalEmidware冲突,因此我无法添加多语言内容场。

    我使用过这个片段,但它与常规的LocaleMidware冲突,因此我无法添加多语言内容场。

    根据Timmy的回答,您可以找到一个已经发布的中间件,它可以为您完成这项工作

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

    用法:

  • 将语言字段添加到用户模型:

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

    pip安装django用户语言中间件

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

    MIDDLEWARE = [  # Or MIDDLEWARE_CLASSES on Django < 1.10
        ...
        'user_language_middleware.UserLanguageMiddleware',
        ...
    ]
    
    MIDDLEWARE=[#或Django<1.10上的MIDDLEWARE_类
    ...
    “用户语言中间件.用户语言中间件”,
    ...
    ]
    

  • 我希望这可能有助于人们在将来解决这个问题。

    继Timmy的答案之后,您可以找到一个已经发布的中间件来为您完成这项工作

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

    用法:

  • 将语言字段添加到用户模型:

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

    pip安装django用户语言中间件

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

    MIDDLEWARE = [  # Or MIDDLEWARE_CLASSES on Django < 1.10
        ...
        'user_language_middleware.UserLanguageMiddleware',
        ...
    ]
    
    MIDDLEWARE=[#或Django<1.10上的MIDDLEWARE_类
    ...
    “用户语言中间件.用户语言中间件”,
    ...
    ]
    

  • 我希望这可能有助于人们今后在这个问题上取得进展。

    是的。。。看来中间件是唯一的出路。。但为什么不从会话中读取语言?settings.LANGUAGE是django“搜索语言”优先级列表中的最后一个。感谢修复:“django.middleware.locale.localemidleware”已禁用。。。现在它不用翻译就可以工作了激活()是的。。。看来中间件是唯一的出路。。但为什么不从会话中读取语言?settings.LANGUAGE是django“搜索语言”优先级列表中的最后一个。感谢修复:“django.middleware.locale.localemidleware”已禁用。。。现在它可以在没有翻译的情况下工作