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 "متن تستی"
Я представляю, что вы добавили новый перевод в ваше 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"),
)