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

Django 5带参数路由翻译异常问题求助

解决Django 5带参数路由翻译异常的问题

问题核心在于翻译时机错误:普通的_()函数会在urls.py加载时立即执行翻译,此时Django还未处理请求的语言环境,只能使用默认语言的翻译结果,导致带参数的路由被固定为默认语言的字符串(比如英文的'category')。

解决步骤:

  1. 改用延迟翻译函数gettext_lazy
    导入gettext_lazy替代普通的_(),它会延迟到实际处理请求时,再根据当前语言环境生成翻译结果:

    from django.utils.translation import gettext_lazy as _
    from django.conf.urls.i18n import i18n_patterns
    from . import views
    
    urlpatterns = i18n_patterns(
        # 无参数路由
        path(_('CATEGORY'), views.category, name='app-category'),
        # 带参数路由(两种拼接方式均支持)
        path(f"{_('CATEGORY')}/<slug:uuid>", views.category_detail, name='app-category-detail'),
        # 或用字符串拼接:path(_('CATEGORY') + "/<slug:uuid>", ...)
    )
    
  2. 确认国际化配置正确
    确保settings.py中已开启国际化并配置支持的语言:

    USE_I18N = True
    
    LOCALE_PATHS = [
        BASE_DIR / 'locale',  # 翻译文件存放目录
    ]
    
    LANGUAGES = [
        ('en', 'English'),
        ('fr', 'French'),
    ]
    
  3. 更新翻译文件
    重新生成并编译翻译文件,确保CATEGORY的法语翻译categorie已正确收录:

    python manage.py makemessages -l fr
    python manage.py compilemessages
    

关键原理

gettext_lazy返回的是惰性对象,不会在模块加载时立即计算翻译值,而是在Django处理请求、解析URL路径时,根据当前请求的语言环境动态生成对应的翻译字符串,这样带参数的路由就能正确匹配不同语言的前缀(如/fr/categorie/xxx)。

内容的提问来源于stack exchange,提问作者Sacha Rk.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:28:11