Django 5带参数路由翻译异常问题求助
解决Django 5带参数路由翻译异常的问题
问题核心在于翻译时机错误:普通的_()函数会在urls.py加载时立即执行翻译,此时Django还未处理请求的语言环境,只能使用默认语言的翻译结果,导致带参数的路由被固定为默认语言的字符串(比如英文的'category')。
解决步骤:
改用延迟翻译函数
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>", ...) )确认国际化配置正确
确保settings.py中已开启国际化并配置支持的语言:USE_I18N = True LOCALE_PATHS = [ BASE_DIR / 'locale', # 翻译文件存放目录 ] LANGUAGES = [ ('en', 'English'), ('fr', 'French'), ]更新翻译文件
重新生成并编译翻译文件,确保CATEGORY的法语翻译categorie已正确收录:python manage.py makemessages -l fr python manage.py compilemessages
关键原理
gettext_lazy返回的是惰性对象,不会在模块加载时立即计算翻译值,而是在Django处理请求、解析URL路径时,根据当前请求的语言环境动态生成对应的翻译字符串,这样带参数的路由就能正确匹配不同语言的前缀(如/fr/categorie/xxx)。
内容的提问来源于stack exchange,提问作者Sacha Rk.
相关产品推荐
相关产品推荐

