【React i18n 實戰 2】透過 react-router-dom 與 i18next 實現 URL 語言同步

更新 發佈閱讀 6 分鐘

在上一篇文章中,我們學會了如何用按鈕手動切換語言。但在實際應用中,為了 SEO 以及方便使用者分享特定語言的頁面,我們通常會希望語言狀態能反映在 URL 上(像是:example.com/zh/home)。

今天這篇文章會記錄我如何結合 react-router-domi18next,讓網址自動與語言同步。

如果你還沒看過第一篇,建議先閱讀! 【React i18n 實戰 1】專案中實現多語系功能

為何網址需要帶語言程式碼?

在網址戴上語言別基本上有兩種好處:

  1. SEO 友善:搜尋引擎可以分別索引不同語言的頁面。
  2. 狀態保留:當使用者重新整理網頁或把連結傳給朋友時,語言設定不會跑掉。

實作步驟

1. 設定路由結構

首先,我們要在路由設定中加入動態參數 :lang ,這個參數用來代表要使用的語言。

// App.jsx
import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom";

function App() {
return (
<BrowserRouter>
<Routes>
{/* 動態捕捉語言參數,如 /en/home 或 /zh/about */}
<Route path="/:lang/*" element={<MainLayout />} />
{/* 如果沒有帶語系,則導向預設語系 */}
<Route path="*" element={<Navigate to="/en" replace />} />
</Routes>
</BrowserRouter>
);
}

2. 同步 URL 與 i18n 狀態

當使用者手動修改網址時(例如把 /en 改成 /zh), i18n 必須立刻切到換對應語言的文字。

我們可以在 layout 組件(如 MainLayout.jsx)中使用 useEffect 來監控:

import { useEffect } from "react";
import { useParams } from "react-router-dom";
import { useTranslation } from "react-i18next";

function MainLayout() {
// 取得動態參數值​
const { lang } = useParams();
const { i18n } = useTranslation();

useEffect(() => {
// 當 URL 的 lang 改變,且不等於目前的語言時,強制切換 i18n 狀態
if (lang && i18n.language !== lang) {
i18n.changeLanguage(lang);
}
}, [lang, i18n]);

return (
<div>
<Header />
{/* 頁面內容 */}
</div>
);
}

3. 語系切換器的調整

現在切換語言不再只是單純的呼叫 changeLanguage,而是連動「跳轉網址」。

程式運作的順序為:

  1. 用 select 切換語言
  2. 將 URL 中的動態參數換成 select 選中的語言
  3. 重新導向到新的網址
import { useNavigate, useLocation } from "react-router-dom";

function LanguageSwitcher() {
const navigate = useNavigate();
//取得當前 URL 狀態
const location = useLocation();
const handleLanguageChange = (newLang) => {
// 取得當前路徑並替換掉語言部分
const pathNodes = location.pathname.split("/");
pathNodes[1] = newLang; // 替換掉 lang 參數位置
navigate(pathNodes.join("/"));
};

return (
<select onChange={(e) => handleLanguageChange(e.target.value)}>
<option value="en">English</option>
<option value="zh">繁體中文</option>
</select>
);
}

總結

透過這幾步,我們成功讓 URL 成為語言狀態的「單一真相來源 」。除了對使用者體驗加分外,也有助於提升網站的 SEO !!

目前為止,基本上已經是一個完整的切換語言功能了,但還有個可以優化的部分,那就是我們的翻譯資源還是手動 import 進來的。當網站功能越來越多、翻譯檔越來越胖,可能會影響網站載入速度,下一篇,我會分享如何使用 i18next-http-backend 實現 「動態載入 (Lazy Loading)」

留言
avatar-img
Elaine 粼粼的林林總總
14會員
40內容數
不定期地分享程式/旅遊/學習/閱讀或各式各樣的文章,如果對我的分享有興趣,歡迎來找我玩~
2026/03/28
本文記錄如何在 React 專案中用 i18next、react-i18next 和 i18next-browser-languagedetector 套件實現網站多語系。涵蓋建立翻譯檔、初始化 i18next ,及在 React 元件中使用 useTranslation 進行內容翻譯與語言切換。
2026/03/28
本文記錄如何在 React 專案中用 i18next、react-i18next 和 i18next-browser-languagedetector 套件實現網站多語系。涵蓋建立翻譯檔、初始化 i18next ,及在 React 元件中使用 useTranslation 進行內容翻譯與語言切換。
2026/03/21
本文分享如何在 React 專案中實作 Dark Mode,利用 CSS Variables 簡化主題切換,並詳述解決 StrictMode 導致的初始化陷阱,採用 useState 的 lazy initialization 確保使用者偏好被正確儲存與讀取,提供一個穩定可靠的深色模式解決方案。
Thumbnail
2026/03/21
本文分享如何在 React 專案中實作 Dark Mode,利用 CSS Variables 簡化主題切換,並詳述解決 StrictMode 導致的初始化陷阱,採用 useState 的 lazy initialization 確保使用者偏好被正確儲存與讀取,提供一個穩定可靠的深色模式解決方案。
Thumbnail
2026/03/14
本篇文章介紹如何在 React 專案中使用 react-markdown 套件,將 Markdown 檔案輕鬆轉換為網頁內容。文章涵蓋了安裝套件、基本渲染以及進階的 fetch 預防解析失敗的技巧。
Thumbnail
2026/03/14
本篇文章介紹如何在 React 專案中使用 react-markdown 套件,將 Markdown 檔案輕鬆轉換為網頁內容。文章涵蓋了安裝套件、基本渲染以及進階的 fetch 預防解析失敗的技巧。
Thumbnail
看更多
你可能也想看
Thumbnail
最近工作上可能要用 React + Tailwind 了,剛好正巧遇到 React 19 和 Tailwind 4.0 剛推出,尤其是 Tailwind 做了大改版,對我這樣剛好是這兩項技術的新手小白來說,還沒有更多文章可以參考,光是安裝也是摸索了一陣子。以下以 Vite 6 + React 18.
Thumbnail
最近工作上可能要用 React + Tailwind 了,剛好正巧遇到 React 19 和 Tailwind 4.0 剛推出,尤其是 Tailwind 做了大改版,對我這樣剛好是這兩項技術的新手小白來說,還沒有更多文章可以參考,光是安裝也是摸索了一陣子。以下以 Vite 6 + React 18.
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
這篇文章深入淺出地解釋 JavaScript 中表達式 (expression) 與陳述式 (statement) 的差異,並以 React 中 JSX 的應用為例,說明為何大括號 {} 內只能放入表達式。文章以類比人類語言的句子結構來幫助理解,並提供相關參考資料連結。
Thumbnail
這篇文章深入淺出地解釋 JavaScript 中表達式 (expression) 與陳述式 (statement) 的差異,並以 React 中 JSX 的應用為例,說明為何大括號 {} 內只能放入表達式。文章以類比人類語言的句子結構來幫助理解,並提供相關參考資料連結。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
這一集用最新的Vite工具去創建初始檔案。Vite用於創建和構建Web應用程序,具有快速的啟動時間、即時熱更新、小型體積、支持多種框架和可擴展性等優點。
Thumbnail
這一集用最新的Vite工具去創建初始檔案。Vite用於創建和構建Web應用程序,具有快速的啟動時間、即時熱更新、小型體積、支持多種框架和可擴展性等優點。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
使用React.js實作CAPTCHA元件的步驟和技巧
Thumbnail
使用React.js實作CAPTCHA元件的步驟和技巧
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News