Django 3.2 i18n多语言URL模式翻译及语言切换异常问题求助
Django多语言切换URL未翻译问题解决方案
问题根因
- 路由配置重复冲突:主URL文件已经通过
i18n_patterns定义了带翻译的路由规则,同时Home应用的urls.py中硬编码了土耳其语路径,导致带翻译的i18n路由未生效 - 语言切换逻辑错误:手动拼接语言前缀+截取原路径的方案,无法自动将原语言的翻译URL转换为目标语言的对应URL
- i18n配置错误:
prefix_default_language=False会导致默认语言的URL不会添加前缀,不符合两种语言都需要前缀的需求 - 大概率存在中间件配置顺序错误:LocaleMiddleware位置不对会导致翻译失效
解决步骤
1. 修正settings.py配置
确认以下配置存在且顺序正确:
# 基础配置 USE_I18N = True LANGUAGES = [ ('tr', 'Turkish'), ('en', 'English'), ] LOCALE_PATHS = [os.path.join(BASE_DIR, 'locale')] # 中间件顺序必须符合要求 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # LocaleMiddleware必须放在SessionMiddleware之后,CommonMiddleware之前 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', # 其余中间件保持原有顺序 ]
2. 清理重复路由配置
- 直接删除Home应用urls.py中的所有路由,你主URL中已经定义了带翻译的
home_patterns,不需要重复配置 - 修正主urls.py的
i18n_patterns配置,将prefix_default_language改为True,删除根路由中重复的change_language、i18n路由:
# 根路由只保留不需要多语言的路径 urlpatterns = [ path('admin/', admin.site.urls), ] # 原有home_patterns、news_patterns保持不变 urlpatterns += i18n_patterns( path('', include(home_patterns),name="Home"), path(_('haberler/'), include(news_patterns), name="New"), path('change_language/', change_language, name='change_language'), path('i18n/', include('django.conf.urls.i18n')), # 修改为True保证两种语言都有前缀 prefix_default_language=True, )
3. 替换错误的语言切换逻辑
删除原有手动拼接路径的a标签切换方案,改用Django内置的set_language视图实现自动跳转,会自动处理URL翻译:
<div class="header__lang-wrapper"> <div class="header__current-lang"> {% get_current_language as LANGUAGE_CODE %} {{LANGUAGE_CODE}} </div> <div class="header__language-switcher-list"> <form action="{% url 'set_language' %}" method="post"> {% csrf_token %} <input name="next" type="hidden" value="{{ request.path }}"> <ul class="language-switcher language-switcher--white"> {% get_available_languages as LANGUAGES %} {% get_language_info_list for LANGUAGES as languages %} {% for language in languages %} <li> <button type="submit" name="language" value="{{ language.code }}" {% if language.code == LANGUAGE_CODE %} class="selected" {% endif %} style="border:none;background:none;cursor:pointer;"> {{ language.code }} </button> </li> {% endfor %} </ul> </form> </div> </div>
4. 生成并补全翻译文件
执行命令生成翻译模板,补全po文件中所有URL路径的翻译后,编译生效:
# 生成翻译文件 python manage.py makemessages -l tr -l en # 手动编辑locale目录下对应的po文件,补全所有_()包裹的URL翻译 # 编译翻译文件 python manage.py compilemessages
内容的提问来源于stack exchange,提问作者Utku Mutlu
相关产品推荐
相关产品推荐

