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

如何让带/不带语言前缀的URL在Django i18n中均可正常访问?

Django 4.2.1 多语言路由配置方案

问题场景

项目结构如下:

django-project
 |-core
 |  |-settings.py
 |  └-urls.py
 |-app1
 |  |-models.py
 |  |-admin.py
 |  └-urls.py
 |-app2
 └-locale
    └-en
       └-LC_MESSAGES
          |-django.mo
          └-django.po

core/settings.py已配置默认语言为fr,多语言相关设置如下:

# core/settings.py
MIDDLEWARE = [
    # ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    # ...
]

# ...

LANGUAGE_CODE = 'fr'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True

from django.utils.translation import gettext_lazy as _

LANGUAGES = (
    ('fr', _('Français')),
    ('en', _('Anglais')),
)

LOCALE_PATHS = [
   BASE_DIR / 'locale',
]

当前遇到的问题:

  • 使用i18n_patterns时,http://localhost:8000/fr/app1/显示Bonjour,http://localhost:8000/en/app1/显示Hello,但http://localhost:8000/app1/会重定向到en路径显示Hello。
  • 设置prefix_default_language=False后,不带前缀的http://localhost:8000/app1/显示Bonjour,但带fr前缀的http://localhost:8000/fr/app1/无法访问。

需要实现:http://localhost:8000/fr/app1/和http://localhost:8000/app1/均显示Bonjour,同时http://localhost:8000/en/app1/正常显示Hello。

解决方案

1. 修改settings.py配置

添加prefix_default_language=False,确保默认语言的不带前缀URL可访问:

# core/settings.py
prefix_default_language = False

2. 调整根urls.py路由配置

在根urls.py中,同时添加默认语言的带前缀路由和多语言路由集合,确保两种路径都能匹配:

# core/urls.py
from django.conf.urls.i18n import i18n_patterns
from django.urls import path, include

# 手动添加默认语言fr的带前缀路由
urlpatterns = [
    path('fr/', include('app1.urls')),
    # 可添加其他非多语言路由,如admin等
    # path('admin/', admin.site.urls),
]

# 为其他语言(如en)添加带前缀的路由,同时支持默认语言的不带前缀访问
urlpatterns += i18n_patterns(
    path('', include('app1.urls')),
    # 其他多语言路由...
)

3. 生成并完善法语翻译文件

当前locale目录仅存在en的翻译文件,需要生成fr的翻译文件并添加对应翻译:

  1. 在项目根目录执行命令生成法语翻译模板:
django-admin makemessages -l fr
  1. 打开locale/fr/LC_MESSAGES/django.po,添加对应翻译内容,例如:
msgid "Hello"
msgstr "Bonjour"
  1. 编译翻译文件:
django-admin compilemessages

验证效果

完成配置后:

  • http://localhost:8000/app1/:使用默认语言fr,显示Bonjour
  • http://localhost:8000/fr/app1/:匹配手动添加的fr前缀路由,显示Bonjour
  • http://localhost:8000/en/app1/:匹配i18n_patterns中的en前缀路由,显示Hello

内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:57:33