已设置django_language cookie,但Django翻译功能仍失效
Django国际化翻译失效问题排查与解决
问题概述
配置Django国际化后,浏览器django_language cookie已设置为fa,但模板中{% trans "Hello" %}仍显示英文,无法翻译为波斯语"سلام"。
修复步骤
1. 修正Settings.py中的拼写错误
settings.py存在两处拼写错误,直接导致翻译配置不生效:
LAGUAGES→LANGUAGESLOCALE_PTHS→LOCALE_PATHS
修改后的代码片段:
# Internationalization LANGUAGE_CODE = "en" TIME_ZONE = "UTC" USE_I18N = True USE_TZ = True LANGUAGES = ( ('en', _('English')), ('fa', _('Persian')), ) LOCALE_PATHS = [ BASE_DIR / 'locale', ]
2. 调整LocaleMiddleware的中间件顺序
Django要求LocaleMiddleware必须放在SessionMiddleware之后、CommonMiddleware之前,否则无法正确读取会话中的语言设置。修改MIDDLEWARE列表:
MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", 'django.middleware.locale.LocaleMiddleware', # 移至此处 "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", ]
3. 修正Locale目录结构拼写错误
将locale/en/LC_MASSAGES/重命名为locale/en/LC_MESSAGES/(注意是MESSAGES而非MASSAGES)
4. 移除django.po中的fuzzy标记
#, fuzzy标记会让Django忽略对应翻译条目,打开fa/LC_MESSAGES/django.po删除该行,并明确设置语言代码:
msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-12-07 00:03+0330\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
5. 重新编译翻译文件
执行以下命令更新并编译翻译:
python manage.py makemessages --all python manage.py compilemessages
验证方法
- 重启Django开发服务器
- 点击页面"change"按钮切换语言,确认
django_languagecookie值为fa - 刷新页面,检查"Hello"是否已显示为波斯语"سلام"
内容的提问来源于stack exchange,提问作者Soroush
相关产品推荐
相关产品推荐

