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

生产环境Docker部署Django多语言切换失效及makemessages报错问题

Django Docker部署后无法切换语言(仅语言标识和管理面板正常)

开发环境运行正常,但Docker部署的生产环境中,Django无法切换语言,仅语言标识和管理面板语言可切换。同时执行makemessages命令时出现编码错误。

Dockerfile内容

FROM python:3.11.4
ENV PYTHONUNBUFFERED 1
ENV DJANGO_SETTINGS_MODULE=mysite.settings
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
RUN apt-get update && \
    apt-get install -y gettext 
RUN apt-get install -y locales locales-all
ENV LC_ALL en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US.UTF-8
RUN sed -i 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/g' /etc/locale.gen
RUN locale-gen
RUN LANG=en_US.UTF-8 python manage.py collectstatic --noinput
EXPOSE 8080
CMD ["gunicorn", "--config", "gunicorn_config.py", "mysite.wsgi:application"]

settings.py相关配置

LANGUAGES = [
    ('az', gettext_noop('Azerbaijani')),
    ('en', gettext_noop('English')),
    ('ru', gettext_noop('Russian')),
]


LANGUAGE_CODE = 'az'

TIME_ZONE = 'Asia/Baku'

USE_I18N = True

makemessages命令错误信息

UnicodeDecodeError: skipped file requirements.txt in . (reason: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte)
processing locale en_US.UTF-8
processing locale en

问题解决步骤

一、修复makemessages编码错误

  • requirements.txt是UTF-16带BOM格式,gettext无法识别。把文件转成UTF-8无BOM格式即可。
  • 临时方案:执行makemessages时排除该文件:django-admin makemessages --exclude=requirements.txt

二、修复生产环境语言切换失效

  1. 检查中间件顺序
    确保settings.py中LocaleMiddleware的位置正确,必须放在CommonMiddleware之前,且在SessionMiddleware、AuthenticationMiddleware之后(如果有这些中间件):
MIDDLEWARE = [
    # ...其他中间件
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    # ...其他中间件
]
  1. 确保语言文件正确编译并部署
  • 执行makemessages生成对应语言的.po文件后,必须运行compilemessages编译成.mo文件,这是Django实际读取的语言文件。
  • 在Docker构建阶段添加编译命令,确保镜像包含编译后的文件:
# 在pip install之后添加
RUN django-admin compilemessages
  1. 添加目标语言的Locale支持
    当前Dockerfile只配置了en_US.UTF-8,需要添加项目用到的阿塞拜疆语、俄语Locale:
RUN sed -i 's/# az_AZ.UTF-8 UTF-8/az_AZ.UTF-8 UTF-8/g' /etc/locale.gen
RUN sed -i 's/# ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/g' /etc/locale.gen
RUN locale-gen az_AZ.UTF-8 ru_RU.UTF-8
  1. 验证语言切换逻辑
  • 前端切换语言时,要确保通过正确的方式传递语言偏好:比如URL参数?language=ru、设置Cookiedjango_language或者Session中的django_language字段。
  • 模板中所有需要翻译的文本必须使用{% trans %}标签,不能硬编码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 14:22:12