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

React i18next在Django构建部署后无法加载translation.json文件

问题根因

这是Django生产环境静态路由匹配优先级错误导致的:/locales/路径下的JSON翻译文件没有被静态资源规则匹配到,所有未命中后端接口、静态资源规则的请求都被兜底转发到了React入口index.html,才会出现200状态码但返回HTML内容、Content-Type为text/html的现象。
开发环境下React由自带的dev server启动,dev server默认会正确映射public目录下的locales资源路径,所以开发阶段多语言功能完全正常;build后将产物交由Django托管时,路由规则没有覆盖locales目录的资源响应逻辑,就会触发这个问题。

修复方案

按以下步骤逐一调整即可:

  • 确认静态资源存放位置
    将React项目public目录下的整个locales文件夹,完整拷贝到Django托管的前端build产物根目录,或者拷贝到Django配置的STATIC_ROOT目录下,保证文件权限和同目录下的js、css等静态资源一致。
  • 调整Django路由匹配优先级
    路由规则必须按「后端接口 > 静态资源匹配 > 前端兜底路由」的顺序配置,不能让/locales/开头的请求落到前端index.html兜底规则上。
    如果是用Django自带的serve方法托管静态资源,可参考如下urls.py配置:
    from django.urls import re_path
    from django.views.static import serve
    from django.conf import settings
    import os
    
    FRONTEND_BUILD_DIR = os.path.join(settings.BASE_DIR, 'build')
    
    urlpatterns = [
        # 原有后端业务接口路由放在最前
        
        # 单独匹配locales翻译文件请求,优先级高于前端兜底
        re_path(
            r'^locales/(?P<path>.*)$',
            serve,
            {'document_root': os.path.join(FRONTEND_BUILD_DIR, 'locales')}
        ),
        # 匹配其他静态资源(js、css、图片等)
        re_path(
            r'^static/(?P<path>.*)$',
            serve,
            {'document_root': settings.STATIC_ROOT}
        ),
        # 最后配置前端路由兜底,所有未匹配的路径返回index.html
        re_path(
            r'^.*$',
            serve,
            {'document_root': FRONTEND_BUILD_DIR, 'path': 'index.html'}
        )
    ]
    
  • 按需调整i18n加载路径
    如果选择把locales文件夹放到STATIC目录下统一托管,需要同步修改i18n.js里的http-backend配置,把loadPath改成静态资源对应路径:
    import i18n from 'i18next';
    import Backend from 'i18next-http-backend';
    import LanguageDetector from 'i18next-browser-languagedetector';
    import { initReactI18next } from 'react-i18next';
    
    i18n
      .use(Backend)
      .use(LanguageDetector)
      .use(initReactI18next)
      .init({
        fallbackLng: 'en',
        supportedLngs: ['en', 'fr', 'ar'],
        debug: process.env.NODE_ENV === 'development',
        interpolation: {
          escapeValue: false,
        },
        backend: {
          loadPath: '/static/locales/{{lng}}/{{ns}}.json',
        }
      });
    
    export default i18n;
    
  • 生产环境用Nginx托管的额外说明
    如果生产环境是Nginx负责静态资源响应、Django只处理接口请求,不需要修改Django路由,直接在Nginx配置中新增locales路径的匹配规则即可,同样要保证这条规则的优先级高于前端兜底路由:
    location /locales/ {
      alias /path/to/your/frontend/build/locales/;
      expires 7d;
    }
    
    # 原有静态资源规则
    location /static/ {
      alias /path/to/your/static/root/;
    }
    
    # 前端兜底路由放在最后
    location / {
      try_files $uri $uri/ /index.html;
    }
    
  • 验证修复
    重启对应服务(Django/Nginx),清空浏览器缓存后直接访问翻译文件地址,确认响应头Content-Type为application/json、响应内容为正确的翻译JSON对象,再测试语言切换功能即可恢复正常。

内容的提问来源于stack exchange,提问作者Moammer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:06:06