Django切换用户语言时自定义翻译文件不加载问题求助
Django切换用户语言时自定义翻译不加载的问题
当通过URL前缀或调用translation.activate(lang_code)切换用户语言时,仅系统默认文本被翻译,自定义翻译内容无法加载;但直接在settings.py中修改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"), )
Admin代码
from django.contrib import admin from lng.models import Test @admin.register(Test) class TestModelAdmin(admin.ModelAdmin): ...
Settings配置
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', "django.middleware.locale.LocaleMiddleware", # 注意此中间件位置 '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/', ]
Urls配置
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 "متن تستی"
解决步骤
确认LocaleMiddleware顺序
你当前的中间件顺序已正确,但再次确认:SessionMiddleware和CommonMiddleware必须在LocaleMiddleware之前——前者负责存储用户语言偏好,后者处理请求中的语言参数,顺序错误会导致语言切换失效。重新编译翻译文件
手动重新编译po文件为mo文件,确保自定义翻译被正确编译:django-admin makemessages -l fa django-admin compilemessages -l fa执行命令时需在项目根目录下操作,确保
locale/fa/LC_MESSAGES目录下生成最新的django.mo文件。完善语言切换逻辑
如果使用translation.activate(lang_code)切换语言,需同时在会话中保存语言设置,确保后续请求保持语言状态:from django.utils import translation from django.http import HttpResponseRedirect def set_language(request, lang_code): translation.activate(lang_code) request.session[translation.LANGUAGE_SESSION_KEY] = lang_code return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))清除缓存并重启服务
Django可能缓存旧的翻译内容,执行以下命令清除缓存后重启开发服务器:python manage.py clearcache
内容的提问来源于stack exchange,提问作者Nova
相关产品推荐
相关产品推荐

