Django multi-language не загружает файлы с пользовательскими переводами при смене языка пользователя, но работает только при явном задании LANGUAGE_CODE

когда я меняю язык пользователя по URL или вызывая translation.activate(lang_code) только тексты по умолчанию переведены и пользовательский перевод, который я создал не загружается, но если я изменю LANGUAGE_CODE на целевой язык в файле настроек, перевод отображается без проблем. Но я хочу, чтобы при изменении языка пользователя отображались пользовательские переводы, которые я создал

это моя модель:

from django.db import models
from django.utils.translation import gettext as _

class Test(models.Model):
    test = models.CharField(
        max_length=100,
        verbose_name=_("test text"),
        )

мой администратор:

from django.contrib import admin
from lng.models import Test

@admin.register(Test)
class TestModelAdmin(admin.ModelAdmin):
    ...

мои настройки:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    "django.middleware.locale.LocaleMiddleware", # Here !
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
LANGUAGE_CODE = 'en'

TIME_ZONE = 'UTC'

USE_I18N = True
USE_L10N = True

USE_TZ = True

LOCALE_PATHS = [
    BASE_DIR / 'locale/',
]   

мои урлы :

from django.urls import path ,include
from django.conf.urls.i18n import i18n_patterns
urlpatterns = [
    path('i18n/', include('django.conf.urls.i18n')),
]

translatable_urls = [
    path('admin/', admin.site.urls),
]
urlpatterns += i18n_patterns(*translatable_urls)

структура моего проекта:

.
├── db.sqlite3
├── lng
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── locale
│   ├── en
│   │   └── LC_MESSAGES
│   │       ├── django.mo
│   │       └── django.po
│   └── fa
│       └── LC_MESSAGES
│           ├── django.mo
│           └── django.po
├── manage.py
└── Test
    ├── asgi.py
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

8 directories, 19 files

мой файл fa po:

#: lng/models.py:6
msgid "test text"
msgstr "متن تستی"

enter image description here enter image description here

Я представляю, что вы добавили новый перевод в ваше django приложение и выполнили команду django admin на определенном языке локали в вашем случае farsi с:

./manage.py makemessages -l fa

После того, как вы добавили свой перевод, вы должны скомпилировать новые переводы, выполнив
./manage.py compilemessages

Когда вы добавляете новые переводы, не забывайте компилировать их. Подробнее об этом можно прочитать в документации Django здесь https://docs.djangoproject.com/en/4.1/topics/i18n/translation/#compiling-message-files

основная проблема в том, что я использовал gettext, который только один раз загружает перевод, когда вы используете его в полях модели или формах, и в это время Django запускается и используется код языка по умолчанию. и даже если вы измените его, gettext не обновляется, а gettext_lazy каждый раз проверяет и загружает переводы на основе текущих данных

поэтому я изменил свою модель на :

from django.db import models
from django.utils.translation import gettext_lazy as _

class Test(models.Model):
    test = models.CharField(
        max_length=100,
        verbose_name=_("test text"),
        )
Вернуться на верх