Skip to content

Repository files navigation

萌典 — 離線版 App

moedict-app萌典的原生離線版本,以 Capacitor 將同一套 React 前端打包為 Android、iOS 與 macOS 應用程式。所有辭典資料、筆順動畫與全文檢索索引皆隨 App 一起安裝,不需網路即可使用。

與 moedict.tw 的關係

本專案不包含任何 React 原始碼。src/ 是一個 symlink,指向 moedict.tw 的 git submodule:

moedict-app/
  src -> moedict.tw/src     ← symlink,零重複
  moedict.tw/               ← git submodule(淺層 clone)
  capacitor.config.ts       ← 原生 App 設定
  scripts/prepare-data.sh   ← 從 submodule 複製辭典資料至 public/
  android/ ios/             ← Capacitor 原生專案
  macos/                    ← Swift WebView 殼(見 scripts/build-macos.sh,非 npx cap sync)

兩個專案共用完全相同src/。離線行為由 src/offline-api.ts 以執行環境或 App 建置旗標自動切換:

// offline-api.ts — 在 Capacitor 或 moedict-app build 中攔截 fetch;一般網頁版完全不執行
if (typeof window !== 'undefined' &&
    (import.meta.env.VITE_MOEDICT_OFFLINE_APP === '1' || (window as any).Capacitor)) {
  // monkey-patch fetch → 從本地檔案服務辭典資料
}
moedict.tw moedict-app
部署方式 Cloudflare Workers + R2 Capacitor 原生 App
資料來源 R2 bucket(即時) 本地檔案(打包時固定)
API 處理 Worker fetch handler offline-api.ts fetch 攔截
原始碼 此處為 canonical source symlink → submodule

收錄內容

語言 來源 條目數 URL 前綴
臺灣華語 教育部《重編國語辭典修訂本》 160,000+ /
臺灣台語 教育部《臺灣台語常用詞辭典》 20,000+ /'
臺灣客語 教育部《臺灣客語辭典》 14,000+ /:
兩岸詞典 中華文化總會 /~

另含英/法/德文對照(CC-CEDict、CFDict、HanDeDict)及 6,063 字的筆順動畫資料。

開發

首次設定

git clone --recurse-submodules https://github.com/g0v/moedict-app.git
cd moedict-app
npm install          # 也會自動 init submodule
npm run prepare-data # 從 submodule 複製辭典資料至 public/
npm run dev

同步上游更新

當 moedict.tw 有新功能或修正時:

cd moedict.tw && git pull origin main && cd ..
git add moedict.tw
git commit -m "Update moedict.tw submodule"

建置 Android APK

Capacitor 7 的 Android 層編譯需要 Java 21(JDK 17 會在編譯時報 invalid source release: 21 錯誤)。android/gradlew 與相關建置腳本會自動透過 scripts/env.sh 載入 JDK 21 與專案本機 Android SDK / Gradle 設定:

# 本機專案環境設定 (scripts/env.sh 自動載入)
JAVA_HOME=/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home
ANDROID_HOME=/Users/au/w/moedict-app/.android-sdk
GRADLE_USER_HOME=/Users/au/w/moedict-app/.gradle-user-home
ANDROID_USER_HOME=/Users/au/w/moedict-app/.android-home

筆順動畫 JSON(public/stroke-json/,6,063 字)已提交進 repo。預設建置不會自動下載;只有在本機數量與上游 STROKE_CORPUS_EXPECTED_COUNT 不一致、且明確設定 ALLOW_NETWORK=1 時才會同步:

ALLOW_NETWORK=1 sh scripts/download-strokes.sh
# 或:
ALLOW_NETWORK=1 bun run prepare-data
npm run build:android  # prepare-data → tsc → vite build → cap sync
cd android && ./gradlew assembleDebug

發佈版本可以 Android Studio 開啟 android/ 進行簽章與發佈。

建置 iOS

npm run build
npx cap sync ios

然後用 Xcode 開啟 ios/(請用 ios/App/App.xcworkspace,不要開 App.xcodeproj)。

建置 macOS

本專案沒有安裝 @capacitor/macos,因此 npx cap sync macos 會出現 Platform macos not found。macOS 版是以 macos/main.swift 與腳本直接組出 .app,請改用:

npm run build:macos    # prepare-data → build → arm64 + Intel
# 或只建單一架構:
npm run build:macos:arm64
npm run build:macos:intel

scripts/build-macos.sh 會自動建立 build/ 並把 Swift module cache 放在專案內,避免因使用者目錄權限造成編譯失敗。預設產物為 build/萌典.app/(arm64);Intel 版可用 sh scripts/build-macos.sh --intel 產生到 build_intel/萌典.app/。簽章與 MAS 流程見腳本檔頭註解。

建置完成後可直接用 Finder / open 啟動成品:

open build/萌典.app
open build_intel/萌典.app

若要用 Xcode 編輯或除錯 macOS 原生殼,請開啟專案:

open macos/Moedict.xcodeproj

注意:Xcode 專案對應的是 macos/main.swift 這個原生殼;build/萌典.app 仍是由 scripts/build-macos.sh 直接組裝出的成品,而不是由 Xcode 自動同步產生。

技術架構

moedict.tw/src/(React 19 + TypeScript + Vite 7)
         ↓ symlink
    moedict-app 的 Vite build
         ↓
    Capacitor 7 sync
    ┌────┼────┐
 Android  iOS  macOS
  • React 19 + React Router 7 — UI 與路由
  • Vite 7 — 開發與打包
  • Capacitor 7 — 原生 App 容器
  • Fuse.js — 全文模糊搜尋(Web Worker 背景執行)
  • 環境偵測 — 原生 WebView 以 window.Capacitor、App 的 Vite dev/build 以 VITE_MOEDICT_OFFLINE_APP=1 啟用同一套離線 API 攔截

資料來源與授權

辭典本文著作權為教育部所有,採用 CC BY-ND 3.0 臺灣 授權。

兩岸詞典由中華文化總會提供,採用 CC BY-NC-ND 3.0 臺灣 授權。

英/法/德文對照表採用 CC BY-SA 4.0 授權。

筆劃資料來源為教育部「國字標準字體筆順學習網」。

程式碼由唐鳳以 CC0 1.0 公眾領域貢獻宣告 釋出。

相關專案


g0v 零時政府社群專案

About

Stand-alone MoeDict app snapshot

Resources

Stars

38 stars

Watchers

133 watching

Forks

Releases

Packages

Used by

Contributors

Languages