You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 "متن تستی"

解决步骤

  1. 确认LocaleMiddleware顺序
    你当前的中间件顺序已正确,但再次确认:SessionMiddleware和CommonMiddleware必须在LocaleMiddleware之前——前者负责存储用户语言偏好,后者处理请求中的语言参数,顺序错误会导致语言切换失效。

  2. 重新编译翻译文件
    手动重新编译po文件为mo文件,确保自定义翻译被正确编译:

    django-admin makemessages -l fa
    django-admin compilemessages -l fa
    

    执行命令时需在项目根目录下操作,确保locale/fa/LC_MESSAGES目录下生成最新的django.mo文件。

  3. 完善语言切换逻辑
    如果使用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', '/'))
    
  4. 清除缓存并重启服务
    Django可能缓存旧的翻译内容,执行以下命令清除缓存后重启开发服务器:

    python manage.py clearcache
    

内容的提问来源于stack exchange,提问作者Nova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:55:31