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

如何在React中自动为路由添加语言前缀

实现路由始终携带语言标识并自动重定向

1. 修正路由配置的错误

React Router v6 中Routes组件不存在baseName属性,需将basename配置在BrowserRouter组件上(一般在项目入口文件main.jsx中):

// main.jsx
import React from 'react'
import ReactDOM from 'react-dom/client'
import { BrowserRouter } from 'react-router-dom'
import { AppProvider } from './context/AppContext'
import App from './App'

ReactDOM.createRoot(document.getElementById('root')).render(
  <React.StrictMode>
    <AppProvider>
      <BrowserRouter basename="/"> {/* basename 默认值为"/",可省略 */}
        <App />
      </BrowserRouter>
    </AppProvider>
  </React.StrictMode>,
)

2. 更新路由组件,添加根路径重定向

修改AppRoutes.jsx,添加根路径自动重定向逻辑,确保所有业务路由嵌套在:lang参数路由下:

import { Routes, Route, Navigate, useContext } from "react-router-dom";
import Auth from "../pages/Auth.jsx";
import { AppContext } from "../context/AppContext.jsx";

const AppRoutes = () => {
  const { lang } = useContext(AppContext);

  return (
    <Routes>
      {/* 访问根路径时,自动重定向到当前语言对应的路由 */}
      <Route path="/" element={<Navigate to={`/${lang}/`} replace />} />
      {/* 带语言标识的父路由 */}
      <Route path=":lang">
        {/* 语言根路径默认跳转到认证页,可根据需求修改为首页 */}
        <Route index element={<Navigate to="authentification" replace />} />
        {/* 业务路由 */}
        <Route path="authentification" element={<Auth />} />
        {/* 其他业务路由均添加在此父路由下 */}
      </Route>
      {/* 处理不存在的路由,重定向到当前语言的默认页面 */}
      <Route path="*" element={<Navigate to={`/${lang}/authentification`} replace />} />
    </Routes>
  );
};

export default AppRoutes;

3. 确保语言上下文有有效初始值

在AppContext.jsx中设置语言初始值,优先从本地存储读取,保证重定向路径有效:

import { createContext, useState } from "react";

export const AppContext = createContext();

export const AppProvider = ({ children }) => {
  // 初始语言优先取本地存储,默认用英文
  const [lang, setLang] = useState(localStorage.getItem("lang") || "en");

  // 切换语言时同步保存到本地存储
  const changeLang = (newLang) => {
    setLang(newLang);
    localStorage.setItem("lang", newLang);
  };

  return (
    <AppContext.Provider value={{ lang, setLang: changeLang }}>
      {children}
    </AppContext.Provider>
  );
};

4. 优化语言切换后的路由跳转

修改Footer.jsx,切换语言时自动跳转到对应语言的当前页面,避免停留在旧语言路径:

import { useContext, useLocation } from "react";
import { AppContext } from "../../context/AppContext";
import { useNavigate } from "react-router-dom";

const Footer = () => {
  const { lang, setLang } = useContext(AppContext);
  const navigate = useNavigate();
  const location = useLocation();

  const handleLangChange = (newLang) => {
    setLang(newLang);
    // 提取当前路径中除语言标识外的部分
    const pathWithoutLang = location.pathname.replace(/^\/[a-z]{2}/, "");
    // 跳转到新语言的对应路径
    navigate(`/${newLang}${pathWithoutLang}`);
  };

  return (
    <footer>
      <button onClick={() => handleLangChange("en")} disabled={lang === "en"}>
        英文
      </button>
      <button onClick={() => handleLangChange("fr")} disabled={lang === "fr"}>
        法语
      </button>
    </footer>
  );
};

export default Footer;

内容的提问来源于stack exchange,提问作者ANASS OULED BEN TAHAR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:01:04