跳至主要内容

Docusaurus i18n 國際化實戰完整教學:從零到多語言網站

本教學基於 COVIA 知識平台的實際 i18n 實作經驗,從繁體中文網站擴展至支援英文、日文、德文四種語言版本的完整歷程。

前言:為什麼需要 i18n?

當你的網站開始有國際訪客時(COVIA 有 50% 流量來自美國、加拿大、德國),提供多語言版本就變得至關重要。Docusaurus 提供了強大的 i18n 支援,但實作過程中有許多細節需要注意。

一、基礎設定:啟用 i18n

1.1 配置 docusaurus.config.js

docusaurus.config.js 中加入 i18n 設定:

module.exports = {
// ... 其他配置

i18n: {
defaultLocale: 'zh-TW', // 預設語言
locales: ['zh-TW', 'en', 'ja', 'de'], // 支援的語言列表
localeConfigs: {
'zh-TW': {
label: '繁體中文',
direction: 'ltr',
htmlLang: 'zh-TW',
},
en: {
label: 'English',
direction: 'ltr',
htmlLang: 'en-US',
},
ja: {
label: '日本語',
direction: 'ltr',
htmlLang: 'ja',
},
de: {
label: 'Deutsch',
direction: 'ltr',
htmlLang: 'de',
},
},
},

// ... 其他配置
};

1.2 在 Navbar 加入語言切換器

themeConfig: {
navbar: {
items: [
// 語言切換下拉選單
{
type: 'localeDropdown',
position: 'left', // 或 'right'
},
// ... 其他 navbar 項目
],
},
},

二、檔案結構:i18n 資料夾組織

執行以下指令自動產生 i18n 檔案結構:

npm run write-translations

這會產生以下結構:

i18n/
├── en/
│ ├── code.json # React 程式碼中的翻譯
│ ├── docusaurus-theme-classic/
│ │ ├── navbar.json # Navbar 項目翻譯
│ │ └── footer.json # Footer 翻譯
│ ├── docusaurus-plugin-content-docs/
│ │ └── current.json # 文檔側邊欄翻譯
│ └── docusaurus-plugin-content-pages/
│ └── index.js # 首頁翻譯
├── ja/
│ └── ... (同上結構)
└── de/
└── ... (同上結構)

三、內容翻譯:文檔與頁面

3.1 翻譯文檔

  1. 複製文檔結構:將 docs/ 資料夾複製到對應語言資料夾:
# 複製整個 docs 資料夾到英文版
cp -r docs/* i18n/en/docusaurus-plugin-content-docs/current/

# 複製到日文版
cp -r docs/* i18n/ja/docusaurus-plugin-content-docs/current/

# 複製到德文版
cp -r docs/* i18n/de/docusaurus-plugin-content-docs/current/
  1. 翻譯文檔內容:編輯每個語言版本的 .md 檔案,翻譯內容但保持 frontmatter 結構。

3.2 翻譯首頁

  1. 複製首頁檔案
cp src/pages/index.js i18n/en/docusaurus-plugin-content-pages/index.js
cp src/pages/index.js i18n/ja/docusaurus-plugin-content-pages/index.js
cp src/pages/index.js i18n/de/docusaurus-plugin-content-pages/index.js
  1. 翻譯首頁內容:編輯各語言版本的 index.js,翻譯所有文字內容。

3.3 翻譯 UI 元素

編輯各語言的 JSON 檔案:

navbar.json 範例

{
"title": {
"message": "COVIA Knowledge Sharing Platform",
"description": "The title in the navbar"
},
"item.label.知識庫": {
"message": "Knowledge Base",
"description": "Navbar item with label 知識庫"
}
}

footer.json 範例

{
"copyright": {
"message": "Copyright © 2025 COVIA — From Errors to Wisdom.",
"description": "The footer copyright"
}
}

四、常見問題與解決方案

4.1 問題:語言切換器在 docs 頁面失效

症狀

  • 在首頁切換語言正常
  • 在 docs 頁面切換語言導致 404 錯誤
  • 路徑出現 /ja/docs/intro 找不到的情況

原因: 不同語言版本的 intro.md 檔案 slug 設定不一致。

解決方案: 統一所有語言版本的路徑結構,移除不一致的 slug: / 設定:

---
sidebar_position: 1
title: 文檔標題
# slug: / ← 移除這行,讓 Docusaurus 自動處理路徑
---

症狀

Error: Docusaurus found broken links!
Broken link on source page path = /:
-> linking to /docs/intro

解決方案: 更新所有首頁中的連結,確保指向正確的語言版本路徑:

// 原本的連結
href="/docs/"

// 修改為
href={useBaseUrl('/docs/intro')}

// 或針對不同語言版本
href="/en/docs/intro" // 英文版
href="/ja/docs/intro" // 日文版

4.3 問題:HTML 類型的 Navbar 項目無法自動翻譯

症狀: 使用 type: 'html' 的 navbar 項目不會自動切換語言。

解決方案

  1. 考慮改用標準 navbar 項目類型
  2. 或在 HTML 中加入語言判斷邏輯:
{
type: 'html',
value: `<a class="navbar__link" href="/#section" onclick="
const path = window.location.pathname;
const isHomePage = path === '/' || path === '/en/' || path === '/ja/' || path === '/de/';

if (!isHomePage) {
let homeUrl = '/';
if (path.startsWith('/en/')) homeUrl = '/en/';
else if (path.startsWith('/ja/')) homeUrl = '/ja/';
else if (path.startsWith('/de/')) homeUrl = '/de/';

window.location.href = homeUrl + '#section';
} else {
document.querySelector('section.target')?.scrollIntoView({behavior: 'smooth'});
}
">連結文字</a>`,
}

五、建置與部署

5.1 本地測試

# 測試預設語言(繁體中文)
npm run start

# 測試英文版
npm run start -- --locale en

# 測試日文版
npm run start -- --locale ja

# 測試德文版
npm run start -- --locale de

5.2 建置所有語言版本

# 建置所有語言版本
npm run build

# 本地預覽建置結果
npm run serve

5.3 部署到 Cloudflare Pages

Cloudflare Pages 會自動處理多語言路由,只需:

  1. 推送程式碼到 GitHub
  2. Cloudflare Pages 自動建置
  3. 所有語言版本會自動部署到對應路徑

六、最佳實踐建議

6.1 維護一致性

  1. 路徑結構一致:所有語言版本保持相同的檔案結構
  2. Slug 設定一致:避免不同語言版本有不同的 slug 設定
  3. 連結格式一致:統一使用相對路徑或絕對路徑

6.2 翻譯工作流程

  1. 先完成預設語言:確保繁體中文版完整無誤
  2. 批次翻譯:一次翻譯一個完整功能或章節
  3. 定期同步:當預設語言更新時,及時同步其他語言版本

6.3 效能優化

  1. 按需載入:Docusaurus 會自動按語言分割程式碼
  2. CDN 快取:利用 Cloudflare 的全球 CDN 加速不同地區的訪問
  3. 字體優化:針對不同語言使用適合的字體子集

七、進階技巧

7.1 自動化翻譯更新檢查

建立腳本檢查哪些檔案需要更新翻譯:

# 比較不同語言版本的檔案修改時間
find docs -name "*.md" -newer i18n/en/docusaurus-plugin-content-docs/current

7.2 使用翻譯記憶庫

對於大量重複內容,可以:

  1. 建立術語對照表
  2. 使用翻譯工具的記憶功能
  3. 保持專有名詞的一致性

7.3 SEO 優化

為每個語言版本優化 SEO:

// 在各語言的 intro.md 中
---
title: COVIA Knowledge Platform // 各語言的標題
description: From AI to Web Development // 各語言的描述
keywords: [docusaurus, i18n, tutorial] // 各語言的關鍵字
---

八、疑難排解檢查清單

遇到 i18n 問題時,依序檢查:

  • docusaurus.config.js 的 i18n 設定是否正確?
  • 所有語言資料夾結構是否一致?
  • 各語言版本的 slug 設定是否相同?
  • 首頁連結是否指向正確的語言路徑?
  • JSON 翻譯檔案格式是否正確?
  • Build 時是否有 broken links 警告?
  • 語言切換器在所有頁面都能正常運作?

總結

Docusaurus 的 i18n 功能強大且靈活,但需要注意許多細節。透過 COVIA 的實戰經驗,我們學到:

  1. 簡單原則:保持路徑和結構的簡單一致
  2. 漸進實作:先做好單一語言,再逐步擴展
  3. 持續測試:每次修改都要測試所有語言版本
  4. 文檔記錄:記錄所有遇到的問題和解決方案

希望這份基於實戰的教學能幫助你順利建立多語言 Docusaurus 網站!


相關資源