【React i18n 實戰 3】使用 Dynamic Loading 讓 i18n 翻譯檔隨用隨傳

更新 發佈閱讀 6 分鐘

在前兩篇文章中,我們已經學會了 i18next 基礎設定與 URL 同步。但你有沒有想過,如果你的網站支援 10 國語言,每個語言有 5 個 Namespace(如:navbar, footer, home, product, admin...),使用者進入首頁時,真的需要一次下載完所有國家的翻譯嗎?

答案是不需要的!!

今天這篇文章要分享如何透過 Dynamic Loading,讓翻譯檔變成「非同步載入」,有效縮減 JS 打包體積、加快網頁載入速度!

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

為何需要動態載入?

當我們的網站規模增加,翻譯檔的數量也會越來越大,但並非所有內容都需要立刻載入拿出來用,一次載入其實並非好事,動態載入的優點大概可以分為以下三個:

  1. 減少 Bundle Size:避免把所有 JSON 內容都打包進 main.js
  2. 按需讀取:使用者選中文,瀏覽器就只抓中文包;進入首頁,就只抓首頁需要的文字。
  3. 維護方便:新增語言時,只需在資料夾丟入新 JSON,不必改動 i18n.jsimport 程式碼。

實作步驟

1. 安裝套件

我們需要一個能處理 HTTP 請求的插件:

npm install i18next-http-backend

2. 移動翻譯檔案位置(重要!)

原本我們的 JSON 放在 src/locales,但因為現在要讓瀏覽器透過 URL 去抓檔案,必須把翻譯檔移到 public 資料夾下:

(因為 vite 會把 src/ 下的檔案打包進 JS bundle,原本在 src/locales 下的內容是抓不到的)

public/
└── locales/
├── en/
│ ├── translation.json
│ └── navbar.json
└── zh/
├── translation.json
└── navbar.json

3. 重新設定 i18n.js

現在我們不需要手動 import 任何 JSON 了,改由 Backend 來處理:

import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import Backend from "i18next-http-backend"; // 引入 Backend
import LanguageDetector from "i18next-browser-languagedetector";

i18n
.use(Backend) // 使用插件
.use(LanguageDetector)
.use(initReactI18next)
.init({
// 設定翻譯檔的抓取路徑
backend: {
loadPath: "/locales/{{lng}}/{{ns}}.json",
},
fallbackLng: "en",
// 定義有用到的 Namespace
ns: ["translation", "navbar"],
defaultNS: "translation",

interpolation: {
escapeValue: false,
},
});

export default i18n;

4. 使用 React Suspense 處理載入狀態

由於翻譯檔現在是透過網路「非同步」載入,當 React 渲染元件但翻譯還沒被抓到時,程式會暫停渲染,必須用 Suspense 來包住應用程式,否則會報錯。

// main.jsx 或 App.jsx
import React, { Suspense } from "react";
import "./i18n";

function App() {
return (
// 當語言包還在下載時,顯示 fallback 的內容
<Suspense fallback={<div>Loading Translations...</div>}>
<Header />
<Home />
</Suspense>
);
}

指定 Namespace 載入

在元件中,可以指定只載入當前元件需要的翻譯,可以更進一步優化效能:

// 只會觸發 navbar.json 的載入
const { t } = useTranslation(["navbar"]);

return <nav>{t("nav_title")}</nav>;

總結

這三篇文章我們從最基礎的 i18next 設定,到 URL 路由同步,最後完成了 動態載入優化

實作完動態載入後,打開瀏覽器的 DevTools 的 Network ,在切換語言時可以發現瀏覽器發送了新的 XHR 請求去抓取 .json 檔。這代表網站已經具備了「按需讀取」的專業規格~

希望這系列的文章能幫你在面試或實際開發中更加從從容容游刃有餘。如果你有任何關於多語系實作的坑,或是更讚的方法,也歡迎留言討論~

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