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

Django 3.2 i18n多语言URL模式翻译及语言切换异常问题求助

Django多语言切换URL未翻译问题解决方案

问题根因

  1. 路由配置重复冲突:主URL文件已经通过i18n_patterns定义了带翻译的路由规则,同时Home应用的urls.py中硬编码了土耳其语路径,导致带翻译的i18n路由未生效
  2. 语言切换逻辑错误:手动拼接语言前缀+截取原路径的方案,无法自动将原语言的翻译URL转换为目标语言的对应URL
  3. i18n配置错误:prefix_default_language=False会导致默认语言的URL不会添加前缀,不符合两种语言都需要前缀的需求
  4. 大概率存在中间件配置顺序错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:15:03