如何使用i18n切换器将`LANGUAGE_CODE`保存到数据库中,以便在Django中的不同浏览器中不会更改语言?

sxpgvts3  于 2023-08-08  发布在  Go
关注(0)|答案(3)|浏览(165)

有没有办法在点击一个按钮(发送一个请求)时动态地改变settings.py中LANGUAGE_CODE变量的值?
我希望用户有自己的“默认语言”设置为他们的帐户
现在,用户可以使用下拉列表选择他们喜欢的语言,网站得到完美的翻译,因为Django选择浏览器的语言,用户在从同一个浏览器重新打开网站后不需要重新选择他们的语言。
但是当他们从不同的浏览器打开网站**时,默认语言又是“英语”,因为settings.py中的LANGUAGE_CODE变量设置为en-us
所以我想做的是让每个用户都有一个选项来选择他们想要的语言作为默认语言。我想通过另一个(类似的)下拉菜单来做到这一点,并要求用户选择一种语言,他们希望作为“默认”,并击中save按钮,并在保存,我想改变LANGUAGE_CODE的值为用户选择的一个(即动态改变它)。但是我不知道如何动态地改变LANGUAGE_CODE的值。
此外,这种方法还有一个问题。假设即使我能够动态地更改这个LANGUAGE_CODE变量,它也会使网站将所选语言作为 ALL THE USERS 的默认值,而不仅仅是针对更改它的某个特定用户,根据Django的文档:
语言代码:

  • 如果没有使用语言环境中间件,它将决定向所有用户提供哪种翻译。

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

zysjyyx4

zysjyyx41#

当然有,这就是翻译的全部意义。你已经被“默认”语言的想法弄糊涂了;他们选择的东西并不是默认的。
Django文档解释了如何显式地为用户设置活动语言。您可以完全按照您描述的方式在保存时设置此选项。
您可能还希望在登录时重新设置此值,同样是通过从用户的配置文件传递值。

ukqbszuj

ukqbszuj2#

提述问题所述:
我希望用户有自己的“默认语言”为他们的帐户设置。
使用注册用户选择的首选语言翻译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)

字符串
1.从pip安装中间件:
pip install django-user-language-middleware
1.将其添加到设置中的中间件类列表中以侦听请求:

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


我希望这可以帮助人们在未来的这个问题上着陆。

gev0vcfq

gev0vcfq3#

您可以使用i18 n切换器settings.py中更改并保存LANGUAGE_CODE,这样即使使用不同的浏览器也不会更改语言。
首先,你需要做以下三个步骤:
1.按照以下两种方法之一(我的答案)将lang字段添加到User模型中,以创建自定义User模型。* 我推荐更多可定制的方式(我的答案)比更少可定制的方式(我的答案)

lang = models.CharField(max_length=20, blank=True)

字符串
1.设置翻译(英语法语)在我的回答。
1.分别在我的答案和我的答案之后为Django和/或 Django Admin创建i18 n切换器*。
接下来,创建包含__init__.py(空文件)的special/middleware/special/views/special/conf/urls/文件夹,并将locale.pyi18n.pyi18n.py分别从您的虚拟环境中的django/middleware/locale.pydjango/views/i18n.pydjango/conf/urls/i18n.py复制到special/middleware/special/views/special/conf/urls/文件夹,如下所示:

django-project
 |-core
 |  |-settings.py
 |  |-urls.py
 |  └-special
 |     |-middleware
 |     |  |-__init__.py
 |     |  └-locale.py # Here
 |     |-views
 |     |  |-__init__.py
 |     |  └-i18n.py # Here
 |     └-conf
 |        |-__init__.py
 |        └-urls
 |           |-__init__.py
 |           └-i18n.py # Here
 |-my_app1
 |  |-views.py
 |  |-urls.py
 |  |-models.py
 |  |_admin.py
 |  └-apps.py
 |-my_app2
 |-templates
 |  └-index.html  
 └-locale
    └-fr
       └-LC_MESSAGES
          └-django.po


然后,将'django...LocaleMiddleware',替换为'core...LocaleMiddleware',中的'django...LocaleMiddleware',,如下所示:

# "core/settings.py"

MIDDLEWARE = [
    ...
    "django.contrib.sessions.middleware.SessionMiddleware",
    # 'django.middleware.locale.LocaleMiddleware',
    'core.special.middleware.locale.LocaleMiddleware',
    "django.middleware.common.CommonMiddleware",
]


然后,将core/urls.py中的path(... include("django..."))替换为path(... include("core...")),如下所示:

# "core/urls.py"

urlpatterns += [
    # path("i18n/", include("django.conf.urls.i18n"))
    path("i18n/", include("core.special.conf.urls.i18n"))
]


然后,将下面的代码添加到core/special/middleware/locale.py中,如下所示:

# "core/special/middleware/locale.py"

...
from django.contrib import auth # Add
...
class LocaleMiddleware(MiddlewareMixin):
    ...
    def process_request(self, request): 
        ...
        if (
            not language_from_path
            and i18n_patterns_used
            and not prefixed_default_language
        ):
            language = settings.LANGUAGE_CODE

        # ↓ For more customizable `User` model ↓
        user = auth.get_user(request)
        if user.is_authenticated and user.lang:
            language = user.lang
        # ↑ For more customizable `User` model ↑

        # ↓ For less customizable `User` model ↓
        user = auth.get_user(request)          
        if user.is_authenticated and user.userprofile.lang:
            language = user.userprofile.lang
        # ↑ For less customizable `User` model ↑
 
        translation.activate(language)
        request.LANGUAGE_CODE = translation.get_language()


然后,将下面的代码添加到core/special/views/i18n.py中,如下所示:

# "core/special/views/i18n.py"

...

def set_language(request):
    ...
            response.set_cookie(
                settings.LANGUAGE_COOKIE_NAME,
                lang_code,
                max_age=settings.LANGUAGE_COOKIE_AGE,
                path=settings.LANGUAGE_COOKIE_PATH,
                domain=settings.LANGUAGE_COOKIE_DOMAIN,
                secure=settings.LANGUAGE_COOKIE_SECURE,
                httponly=settings.LANGUAGE_COOKIE_HTTPONLY,
                samesite=settings.LANGUAGE_COOKIE_SAMESITE,
            )

            # ↓ For more customizable `User` model ↓
            user = request.user
            if user.is_authenticated:
                user.lang = lang_code
                user.save()
            # ↑ For more customizable `User` model ↑

            # ↓ For less customizable `User` model ↓
            user = request.user
            if user.is_authenticated:
                user.userprofile.lang = lang_code
                user.userprofile.save()
            # ↑ For less customizable `User` model ↑

    return response


最后,将core/special/conf/urls/i18n.py中的from django... import set_language替换为from core... import set_language,如下所示:

# "core/special/conf/urls/i18n.py"

...
# from django.views.i18n import set_language
from core.special.views.i18n import set_language

相关问题