【问题标题】:Django - Store the language of user in databaseDjango - 将用户的语言存储在数据库中
【发布时间】:2019-05-26 11:53:48
【问题描述】:

我可以通过 django 的内置功能更改用户的语言

path('i18n/', include('django.conf.urls.i18n')),

为了给翻译成他的语言的用户发送电子邮件,我想知道用户激活的语言。

如何保存数据库中的语言?

还有其他方法可以了解该语言吗?

这是会议:

from django.utils import translation
request.session[translation.LANGUAGE_SESSION_KEY]

【问题讨论】:

    标签: django internationalization django-i18n


    【解决方案1】:

    在您的User 模型中,您需要添加一个新字段:

        interface_language = models.CharField(max_length=10, blank=True)
    

    那么你需要像这样创建中间件:

    from django.utils import translation
    
    def language_middleware(get_response):
        def middleware(request):
            user = getattr(request, 'user', None)
            if user is not None and user.is_authenticated:
                translation.activate(user.interface_language)
            response = get_response(request)
            translation.deactivate()
            return response
        return middleware
    

    中间件需要在django.contrib.auth.middleware.AuthenticationMiddleware之后添加到你的设置中:

    MIDDLEWARE = [
        # ...
        'django.contrib.auth.middleware.AuthenticaitonMiddleware',
        'language_middleware',
        # ...
    ]
    

    或者,您也可以使用 Pypi 包,例如 django-user-language-middleware

    【讨论】:

    • 不可避免,如果user is None or not user.is_authenticated,你会使用get_language()no?
    【解决方案2】:

    将语言首选项保存到数据库是一种开销,使用 Django 提供的工具可以避免这种开销。

    django.utils.translation.get_language,返回当前线程使用的语言。

    正如 in Django 所记录的,这是一个示例:

    from django.utils import translation
    
    def welcome_translated(language):
        cur_language = translation.get_language()
        try:
            translation.activate(language)
            text = translation.gettext('welcome')
        finally:
            translation.activate(cur_language)
        return text
    

    您还可以使用django.utils.translation.get_language_from_request 来分析请求以找到用户希望系统显示的语言,如this answer 中所述。

    不过,请确保您拥有正确的setup Django

    Marina Mele 写了a tutorial,您可以查看第二个观点。

    【讨论】:

    • 有用的答案。但这里有一些关于我的意思的更多解释:for user in all_users: send_email_to_user(user,his_language_preference).... 你明白吗? language 将以他的语言呈现模板
    • @EuChi 好的,我明白了,您需要在会话结束后发送电子邮件。我认为最好在注册表中询问用户,他首选的交流语言是什么。
    • 我做了,有一个选择下拉菜单,用户可以在其中选择他的语言,使用内置的 django 功能。所以我希望在发送电子邮件时能够在循环中知道如何以特定用户的所选语言呈现模板。
    • @EuChi 你能用用于收集用户信息并将其保存到数据库的代码更新问题吗?
    • 不,我不能,这是我做不到的。我想知道怎么做,当他的语言改变时如何得到它。我以为 Django 有这个信号
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2016-10-17
    • 2015-06-30
    • 1970-01-01
    • 2020-03-06
    • 2011-04-15
    相关资源
    最近更新 更多