生产环境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
二、修复生产环境语言切换失效
- 检查中间件顺序
确保settings.py中LocaleMiddleware的位置正确,必须放在CommonMiddleware之前,且在SessionMiddleware、AuthenticationMiddleware之后(如果有这些中间件):
MIDDLEWARE = [ # ...其他中间件 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', # ...其他中间件 ]
- 确保语言文件正确编译并部署
- 执行
makemessages生成对应语言的.po文件后,必须运行compilemessages编译成.mo文件,这是Django实际读取的语言文件。 - 在Docker构建阶段添加编译命令,确保镜像包含编译后的文件:
# 在pip install之后添加 RUN django-admin compilemessages
- 添加目标语言的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
- 验证语言切换逻辑
- 前端切换语言时,要确保通过正确的方式传递语言偏好:比如URL参数
?language=ru、设置Cookiedjango_language或者Session中的django_language字段。 - 模板中所有需要翻译的文本必须使用
{% trans %}标签,不能硬编码。
内容的提问来源于stack exchange,提问作者learning dev
相关产品推荐
相关产品推荐

