diff --git a/CHANGELOG.md b/CHANGELOG.md index 42c302b..2e43ff8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,35 @@ # Changelog +## [0.1.4](https://github.com/pi-docket/ConvertX-CN/releases/tag/v0.1.4) (2026-01-20) + +### Features + +- **i18n**: 擴展支援 65 種語言(從 5 種大幅擴展) + - 歐洲語系:de, fr, es, it, pt, ru, nl, pl, uk, cs, sv, da, fi, no, el, hu, ro, bg, hr, sk, sl, lt, lv, et, sr, ca, eu, gl, is, ga, cy, mt, mk, sq + - 中東語系:ar, he, fa, tr + - 南亞語系:hi, bn, ta, te, mr, gu, kn, ml, ne, si + - 東南亞語系:th, vi, id, ms, fil, my, km, lo + - 非洲語系:af, sw, am, zu +- **註冊功能**: 預設開放使用者註冊(開箱即用) +- **文件**: 完整的文件系統 + - 新增 getting-started.md 快速入門指南 + - 新增 docker.md Docker 部署指南 + - 新增 environment-variables.md 環境變數說明 + - 新增 url-id-and-storage.md 儲存結構說明 + - 新增 advanced-usage.md 進階使用指南 + - 更新 i18n.md 65 種語言清單 + +### Bug Fixes + +- 修復 i18n 模組導入路徑問題 +- 修復 TypeScript 編譯錯誤 + +### Breaking Changes + +- `ACCOUNT_REGISTRATION` 預設值從 `false` 改為 `true`(開箱即用) + +--- + ## [0.1.3](https://github.com/C4illin/ConvertX/releases/tag/v0.1.3) (2026-01-20) ### Features diff --git a/README.md b/README.md index 1af6c51..e6ce016 100644 --- a/README.md +++ b/README.md @@ -20,14 +20,14 @@ ConvertX-CN 是基於 [C4illin/ConvertX](https://github.com/C4illin/ConvertX) ### 主要特色 -| 特色 | 說明 | -|------|------| -| 🌍 **65+ 語言支援** | 繁體中文、簡體中文、英文、日文、韓文等 65 種語言 | -| 📦 **完整內建** | LibreOffice、FFmpeg、Pandoc、Calibre 等 20+ 轉換器 | -| 🎨 **CJK 字型** | Noto CJK、微軟核心字型、標楷體等中日韓字型 | -| 🔤 **OCR 支援** | Tesseract + 多語言語言包 | -| ⚡ **LaTeX 完整版** | TexLive Full,支援所有 LaTeX 需求 | -| 🐳 **開箱即用** | 一個 Docker 命令即可啟動 | +| 特色 | 說明 | +| ------------------- | -------------------------------------------------- | +| 🌍 **65+ 語言支援** | 繁體中文、簡體中文、英文、日文、韓文等 65 種語言 | +| 📦 **完整內建** | LibreOffice、FFmpeg、Pandoc、Calibre 等 20+ 轉換器 | +| 🎨 **CJK 字型** | Noto CJK、微軟核心字型、標楷體等中日韓字型 | +| 🔤 **OCR 支援** | Tesseract + 多語言語言包 | +| ⚡ **LaTeX 完整版** | TexLive Full,支援所有 LaTeX 需求 | +| 🐳 **開箱即用** | 一個 Docker 命令即可啟動 | --- @@ -78,13 +78,13 @@ docker compose up -d ConvertX-CN 支援 **65 種語言**,包括: -| 區域 | 語言 | -|------|------| -| **東亞** | 繁體中文(預設)、简体中文、日本語、한국어 | -| **歐洲** | English, Deutsch, Français, Español, Italiano, Português, Русский, Polski, Nederlands, Українська, Čeština, Svenska, Dansk, Suomi, Norsk, Ελληνικά, Magyar, Română, Български, Hrvatski, Slovenčina, Slovenščina, Lietuvių, Latviešu, Eesti, Српски, Català, Euskara, Galego, Íslenska, Gaeilge, Cymraeg, Malti, Македонски, Shqip | -| **中東/南亞** | العربية, עברית, فارسی, Türkçe, हिन्दी, বাংলা, தமிழ், తెలుగు, मराठी, ગુજરાતી, ಕನ್ನಡ, മലയാളം, नेपाली, සිංහල | -| **東南亞** | ไทย, Tiếng Việt, Bahasa Indonesia, Bahasa Melayu, Filipino, မြန်မာ, ខ្មែរ, ລາວ | -| **非洲** | Afrikaans, Kiswahili, አማርኛ, isiZulu | +| 區域 | 語言 | +| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **東亞** | 繁體中文(預設)、简体中文、日本語、한국어 | +| **歐洲** | English, Deutsch, Français, Español, Italiano, Português, Русский, Polski, Nederlands, Українська, Čeština, Svenska, Dansk, Suomi, Norsk, Ελληνικά, Magyar, Română, Български, Hrvatski, Slovenčina, Slovenščina, Lietuvių, Latviešu, Eesti, Српски, Català, Euskara, Galego, Íslenska, Gaeilge, Cymraeg, Malti, Македонски, Shqip | +| **中東/南亞** | العربية, עברית, فارسی, Türkçe, हिन्दी, বাংলা, தமிழ், తెలుగు, मराठी, ગુજરાતી, ಕನ್ನಡ, മലയാളം, नेपाली, සිංහල | +| **東南亞** | ไทย, Tiếng Việt, Bahasa Indonesia, Bahasa Melayu, Filipino, မြန်မာ, ខ្មែរ, ລາວ | +| **非洲** | Afrikaans, Kiswahili, አማርኛ, isiZulu | 語言會根據瀏覽器設定自動偵測,也可透過右上角選單手動切換。 @@ -92,16 +92,16 @@ ConvertX-CN 支援 **65 種語言**,包括: ## 📦 內建轉換器 -| 轉換器 | 用途 | 輸入格式 | 輸出格式 | -|--------|------|----------|----------| -| FFmpeg | 影音 | ~472 | ~199 | -| ImageMagick | 圖片 | 245 | 183 | -| GraphicsMagick | 圖片 | 167 | 130 | -| LibreOffice | 文件 | 41 | 22 | -| Pandoc | 文件 | 43 | 65 | -| Calibre | 電子書 | 26 | 19 | -| Inkscape | 向量圖 | 7 | 17 | -| Assimp | 3D 模型 | 77 | 23 | +| 轉換器 | 用途 | 輸入格式 | 輸出格式 | +| -------------- | ------- | -------- | -------- | +| FFmpeg | 影音 | ~472 | ~199 | +| ImageMagick | 圖片 | 245 | 183 | +| GraphicsMagick | 圖片 | 167 | 130 | +| LibreOffice | 文件 | 41 | 22 | +| Pandoc | 文件 | 43 | 65 | +| Calibre | 電子書 | 26 | 19 | +| Inkscape | 向量圖 | 7 | 17 | +| Assimp | 3D 模型 | 77 | 23 | 完整列表 → [docs/converters.md](docs/converters.md) @@ -109,24 +109,24 @@ ConvertX-CN 支援 **65 種語言**,包括: ## 📖 文件導覽 -| 文件 | 說明 | -|------|------| -| [🚀 快速開始](docs/getting-started.md) | Docker 部署教學 | -| [🐳 Docker 配置](docs/docker.md) | 完整 Docker 設定指南 | -| [⚙️ 環境變數](docs/environment-variables.md) | 所有環境變數說明 | -| [💾 儲存與 URL](docs/url-id-and-storage.md) | 檔案儲存機制說明 | -| [🔧 進階用法](docs/advanced-usage.md) | 硬體加速、反向代理等 | -| [🌍 多語言](docs/i18n.md) | i18n 語言設定與新增 | -| [📦 轉換器列表](docs/converters.md) | 支援的轉換格式完整列表 | +| 文件 | 說明 | +| -------------------------------------------- | ---------------------- | +| [🚀 快速開始](docs/getting-started.md) | Docker 部署教學 | +| [🐳 Docker 配置](docs/docker.md) | 完整 Docker 設定指南 | +| [⚙️ 環境變數](docs/environment-variables.md) | 所有環境變數說明 | +| [💾 儲存與 URL](docs/url-id-and-storage.md) | 檔案儲存機制說明 | +| [🔧 進階用法](docs/advanced-usage.md) | 硬體加速、反向代理等 | +| [🌍 多語言](docs/i18n.md) | i18n 語言設定與新增 | +| [📦 轉換器列表](docs/converters.md) | 支援的轉換格式完整列表 | --- ## 🐳 Docker Image -| Tag | 說明 | -|-----|------| +| Tag | 說明 | +| ----------------------------- | ---------- | | `convertx/convertx-cn:latest` | 最新穩定版 | -| `convertx/convertx-cn:v0.1.3` | 指定版本 | +| `convertx/convertx-cn:v0.1.4` | 指定版本 | > ⚠️ 由於內建完整依賴,Image 約 4-6 GB,首次下載需較長時間。 diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index f0aeaca..813855e 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -98,7 +98,7 @@ server { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_cache_bypass $http_upgrade; - + # 長時間連線支援(大檔案轉換) proxy_read_timeout 3600s; proxy_send_timeout 3600s; @@ -114,7 +114,7 @@ convert.example.com { header_up X-Real-IP {remote_host} header_up X-Forwarded-Proto {scheme} } - + request_body { max_size 0 # 無限制 } @@ -165,7 +165,7 @@ example.com { ```yaml environment: - - MAX_CONVERT_PROCESS=4 # 最多同時 4 個轉換任務 + - MAX_CONVERT_PROCESS=4 # 最多同時 4 個轉換任務 ``` --- @@ -177,8 +177,8 @@ environment: ```yaml environment: - ALLOW_UNAUTHENTICATED=true - - HIDE_HISTORY=true # 建議同時隱藏歷史 - - AUTO_DELETE_EVERY_N_HOURS=1 # 快速清理 + - HIDE_HISTORY=true # 建議同時隱藏歷史 + - AUTO_DELETE_EVERY_N_HOURS=1 # 快速清理 ``` --- @@ -201,7 +201,7 @@ services: - shared-data:/app/data environment: - JWT_SECRET=${JWT_SECRET} - + convertx-2: image: convertx/convertx-cn:latest volumes: @@ -246,9 +246,9 @@ deploy: deploy: resources: limits: - cpus: '4' + cpus: "4" reservations: - cpus: '1' + cpus: "1" ``` --- diff --git a/docs/converters.md b/docs/converters.md index 826e2a7..649b2cc 100644 --- a/docs/converters.md +++ b/docs/converters.md @@ -4,28 +4,28 @@ ConvertX-CN 完整版已內建以下所有轉換器,開箱即用。 ## 轉換器列表 -| 轉換器 | 用途 | 輸入格式數 | 輸出格式數 | -| ------ | ---- | ---------- | ---------- | -| [Inkscape](https://inkscape.org/) | 向量圖形 | 7 | 17 | -| [libjxl](https://github.com/libjxl/libjxl) | JPEG XL | 11 | 11 | -| [resvg](https://github.com/RazrFalcon/resvg) | SVG | 1 | 1 | -| [Vips](https://github.com/libvips/libvips) | 圖片 | 45 | 23 | -| [libheif](https://github.com/strukturag/libheif) | HEIF | 2 | 4 | -| [XeLaTeX](https://tug.org/xetex/) | LaTeX | 1 | 1 | -| [Calibre](https://calibre-ebook.com/) | 電子書 | 26 | 19 | -| [LibreOffice](https://www.libreoffice.org/) | 文件 | 41 | 22 | -| [Dasel](https://github.com/TomWright/dasel) | 資料檔案 | 5 | 4 | -| [Pandoc](https://pandoc.org/) | 文件 | 43 | 65 | -| [msgconvert](https://github.com/mvz/email-outlook-message-perl) | Outlook | 1 | 1 | -| VCF to CSV | 聯絡人 | 1 | 1 | -| [dvisvgm](https://dvisvgm.de/) | 向量圖形 | 4 | 2 | -| [ImageMagick](https://imagemagick.org/) | 圖片 | 245 | 183 | -| [GraphicsMagick](http://www.graphicsmagick.org/) | 圖片 | 167 | 130 | -| [Assimp](https://github.com/assimp/assimp) | 3D 模型 | 77 | 23 | -| [FFmpeg](https://ffmpeg.org/) | 影音 | ~472 | ~199 | -| [Potrace](https://potrace.sourceforge.net/) | 點陣轉向量 | 4 | 11 | -| [VTracer](https://github.com/visioncortex/vtracer) | 點陣轉向量 | 8 | 1 | -| [Markitdown](https://github.com/microsoft/markitdown) | 文件 | 6 | 1 | +| 轉換器 | 用途 | 輸入格式數 | 輸出格式數 | +| --------------------------------------------------------------- | ---------- | ---------- | ---------- | +| [Inkscape](https://inkscape.org/) | 向量圖形 | 7 | 17 | +| [libjxl](https://github.com/libjxl/libjxl) | JPEG XL | 11 | 11 | +| [resvg](https://github.com/RazrFalcon/resvg) | SVG | 1 | 1 | +| [Vips](https://github.com/libvips/libvips) | 圖片 | 45 | 23 | +| [libheif](https://github.com/strukturag/libheif) | HEIF | 2 | 4 | +| [XeLaTeX](https://tug.org/xetex/) | LaTeX | 1 | 1 | +| [Calibre](https://calibre-ebook.com/) | 電子書 | 26 | 19 | +| [LibreOffice](https://www.libreoffice.org/) | 文件 | 41 | 22 | +| [Dasel](https://github.com/TomWright/dasel) | 資料檔案 | 5 | 4 | +| [Pandoc](https://pandoc.org/) | 文件 | 43 | 65 | +| [msgconvert](https://github.com/mvz/email-outlook-message-perl) | Outlook | 1 | 1 | +| VCF to CSV | 聯絡人 | 1 | 1 | +| [dvisvgm](https://dvisvgm.de/) | 向量圖形 | 4 | 2 | +| [ImageMagick](https://imagemagick.org/) | 圖片 | 245 | 183 | +| [GraphicsMagick](http://www.graphicsmagick.org/) | 圖片 | 167 | 130 | +| [Assimp](https://github.com/assimp/assimp) | 3D 模型 | 77 | 23 | +| [FFmpeg](https://ffmpeg.org/) | 影音 | ~472 | ~199 | +| [Potrace](https://potrace.sourceforge.net/) | 點陣轉向量 | 4 | 11 | +| [VTracer](https://github.com/visioncortex/vtracer) | 點陣轉向量 | 8 | 1 | +| [Markitdown](https://github.com/microsoft/markitdown) | 文件 | 6 | 1 | > 註:FFmpeg 的格式數量包含部分重複格式。 @@ -33,16 +33,16 @@ ConvertX-CN 完整版已內建以下所有轉換器,開箱即用。 ConvertX-CN 完整版已預載: -| 類別 | 內建內容 | -| ---- | -------- | -| **文件轉換** | LibreOffice (headless)、Pandoc | -| **LaTeX** | TexLive Full(完整版,支援所有 LaTeX 需求) | +| 類別 | 內建內容 | +| ------------ | ---------------------------------------------------------------- | +| **文件轉換** | LibreOffice (headless)、Pandoc | +| **LaTeX** | TexLive Full(完整版,支援所有 LaTeX 需求) | | **OCR 識別** | Tesseract OCR + 繁體中文、簡體中文、日文、韓文、英文、德文語言包 | -| **CJK 字型** | Noto CJK(中日韓)、Noto Emoji、微軟核心字型、標楷體 | -| **影音轉換** | FFmpeg、ImageMagick、GraphicsMagick | -| **向量圖形** | Inkscape、Potrace、VTracer、resvg | -| **電子書** | Calibre | -| **其他** | Ghostscript、MuPDF、Poppler、libheif、libjxl 等 | +| **CJK 字型** | Noto CJK(中日韓)、Noto Emoji、微軟核心字型、標楷體 | +| **影音轉換** | FFmpeg、ImageMagick、GraphicsMagick | +| **向量圖形** | Inkscape、Potrace、VTracer、resvg | +| **電子書** | Calibre | +| **其他** | Ghostscript、MuPDF、Poppler、libheif、libjxl 等 | ## 新增轉換器 diff --git a/docs/docker.md b/docs/docker.md index 02ffadc..c6d6297 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -6,11 +6,11 @@ ConvertX-CN 提供預建的 Docker Image,包含所有轉換依賴。 ### 可用 Tag -| Tag | 說明 | -|-----|------| -| `convertx/convertx-cn:latest` | 最新穩定版 | -| `convertx/convertx-cn:v0.1.3` | 指定版本號 | -| `convertx/convertx-cn:v0.1.3-FULL` | 完整版(與 latest 相同) | +| Tag | 說明 | +| ---------------------------------- | ------------------------ | +| `convertx/convertx-cn:latest` | 最新穩定版 | +| `convertx/convertx-cn:v0.1.4` | 指定版本號 | +| `convertx/convertx-cn:v0.1.4-FULL` | 完整版(與 latest 相同) | ### Image 大小 @@ -34,13 +34,13 @@ docker run -d \ ### 參數說明 -| 參數 | 說明 | -|------|------| -| `-d` | 背景執行 | -| `--name convertx-cn` | 容器名稱 | -| `-p 3000:3000` | 連接埠映射 | +| 參數 | 說明 | +| --------------------- | ---------- | +| `-d` | 背景執行 | +| `--name convertx-cn` | 容器名稱 | +| `-p 3000:3000` | 連接埠映射 | | `-v ./data:/app/data` | 資料持久化 | -| `-e TZ=Asia/Taipei` | 時區設定 | +| `-e TZ=Asia/Taipei` | 時區設定 | --- diff --git a/docs/environment-variables.md b/docs/environment-variables.md index ff2fc97..9541075 100644 --- a/docs/environment-variables.md +++ b/docs/environment-variables.md @@ -6,17 +6,17 @@ ## 安全性設定 -| 變數名稱 | 預設值 | 說明 | -|----------|--------|------| -| `JWT_SECRET` | `randomUUID()` | 用於簽署 JWT 的密鑰字串。**生產環境請務必設定** | -| `ACCOUNT_REGISTRATION` | `false` | 是否允許註冊新帳號 | -| `HTTP_ALLOWED` | `false` | 是否允許 HTTP 連線(僅本地使用建議開啟) | -| `ALLOW_UNAUTHENTICATED` | `false` | 是否允許未登入使用 | +| 變數名稱 | 預設值 | 說明 | +| ----------------------- | -------------- | ----------------------------------------------- | +| `JWT_SECRET` | `randomUUID()` | 用於簽署 JWT 的密鑰字串。**生產環境請務必設定** | +| `ACCOUNT_REGISTRATION` | `true` | 是否允許註冊新帳號(預設開放) | +| `HTTP_ALLOWED` | `false` | 是否允許 HTTP 連線(僅本地使用建議開啟) | +| `ALLOW_UNAUTHENTICATED` | `false` | 是否允許未登入使用 | ### 安全建議 ```yaml -# 生產環境 +# 生產環境(關閉註冊) environment: - JWT_SECRET=a-very-long-random-string-at-least-32-characters - ACCOUNT_REGISTRATION=false @@ -28,9 +28,9 @@ environment: ## 檔案管理 -| 變數名稱 | 預設值 | 說明 | -|----------|--------|------| -| `AUTO_DELETE_EVERY_N_HOURS` | `24` | 自動刪除超過 N 小時的檔案(0 = 停用) | +| 變數名稱 | 預設值 | 說明 | +| --------------------------- | ------ | ------------------------------------- | +| `AUTO_DELETE_EVERY_N_HOURS` | `24` | 自動刪除超過 N 小時的檔案(0 = 停用) | ### 範例 @@ -46,11 +46,11 @@ environment: ## 轉換設定 -| 變數名稱 | 預設值 | 說明 | -|----------|--------|------| -| `MAX_CONVERT_PROCESS` | `0` | 最大同時轉換數(0 = 無限制) | -| `FFMPEG_ARGS` | - | FFmpeg 輸入參數,例如 `-hwaccel vaapi` | -| `FFMPEG_OUTPUT_ARGS` | - | FFmpeg 輸出參數,例如 `-preset veryfast` | +| 變數名稱 | 預設值 | 說明 | +| --------------------- | ------ | ---------------------------------------- | +| `MAX_CONVERT_PROCESS` | `0` | 最大同時轉換數(0 = 無限制) | +| `FFMPEG_ARGS` | - | FFmpeg 輸入參數,例如 `-hwaccel vaapi` | +| `FFMPEG_OUTPUT_ARGS` | - | FFmpeg 輸出參數,例如 `-preset veryfast` | ### 硬體加速範例 @@ -69,10 +69,10 @@ environment: ## 介面設定 -| 變數名稱 | 預設值 | 說明 | -|----------|--------|------| -| `WEBROOT` | - | 子路徑部署,例如 `/convertx` | -| `HIDE_HISTORY` | `false` | 隱藏歷史紀錄頁面 | +| 變數名稱 | 預設值 | 說明 | +| -------------- | ------- | ---------------------------- | +| `WEBROOT` | - | 子路徑部署,例如 `/convertx` | +| `HIDE_HISTORY` | `false` | 隱藏歷史紀錄頁面 | ### 子路徑部署 @@ -86,10 +86,10 @@ environment: ## 本地化設定 -| 變數名稱 | 預設值 | 說明 | -|----------|--------|------| -| `LANGUAGE` | `en` | 日期格式語言(BCP 47 格式) | -| `TZ` | `UTC` | 時區設定 | +| 變數名稱 | 預設值 | 說明 | +| ---------- | ------ | --------------------------- | +| `LANGUAGE` | `en` | 日期格式語言(BCP 47 格式) | +| `TZ` | `UTC` | 時區設定 | ### 常用時區 @@ -111,8 +111,8 @@ environment: ## 進階設定 -| 變數名稱 | 預設值 | 說明 | -|----------|--------|------| +| 變數名稱 | 預設值 | 說明 | +| ------------------------------ | ------- | ---------------------------- | | `UNAUTHENTICATED_USER_SHARING` | `false` | 未登入使用者是否共享檔案空間 | --- diff --git a/docs/getting-started.md b/docs/getting-started.md index 77dcbf6..baa3f64 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -2,12 +2,12 @@ ## 系統需求 -| 需求 | 最低 | 建議 | -|------|------|------| -| Docker | 20.10+ | 24.0+ | -| RAM | 4 GB | 8 GB | -| 磁碟空間 | 10 GB | 20 GB | -| CPU | 2 核心 | 4 核心 | +| 需求 | 最低 | 建議 | +| -------- | ------ | ------ | +| Docker | 20.10+ | 24.0+ | +| RAM | 4 GB | 8 GB | +| 磁碟空間 | 10 GB | 20 GB | +| CPU | 2 核心 | 4 核心 | --- diff --git a/docs/i18n.md b/docs/i18n.md index ffc321d..287771f 100644 --- a/docs/i18n.md +++ b/docs/i18n.md @@ -8,118 +8,118 @@ ConvertX-CN 支援 **65 種語言**,是目前最完整的多語言檔案轉換 ### 東亞語言(5 種) -| 代碼 | 語言 | 原生名稱 | -|------|------|----------| +| 代碼 | 語言 | 原生名稱 | +| ------- | ---------------- | -------- | | `zh-TW` | 繁體中文(預設) | 繁體中文 | -| `zh-CN` | 簡體中文 | 简体中文 | -| `en` | 英文 | English | -| `ja` | 日文 | 日本語 | -| `ko` | 韓文 | 한국어 | +| `zh-CN` | 簡體中文 | 简体中文 | +| `en` | 英文 | English | +| `ja` | 日文 | 日本語 | +| `ko` | 韓文 | 한국어 | ### 西歐語言(10 種) -| 代碼 | 語言 | 原生名稱 | -|------|------|----------| -| `de` | 德文 | Deutsch | -| `fr` | 法文 | Français | -| `es` | 西班牙文 | Español | -| `it` | 義大利文 | Italiano | -| `pt` | 葡萄牙文 | Português | -| `nl` | 荷蘭文 | Nederlands | -| `ca` | 加泰隆尼亞文 | Català | -| `eu` | 巴斯克文 | Euskara | -| `gl` | 加利西亞文 | Galego | -| `mt` | 馬爾他文 | Malti | +| 代碼 | 語言 | 原生名稱 | +| ---- | ------------ | ---------- | +| `de` | 德文 | Deutsch | +| `fr` | 法文 | Français | +| `es` | 西班牙文 | Español | +| `it` | 義大利文 | Italiano | +| `pt` | 葡萄牙文 | Português | +| `nl` | 荷蘭文 | Nederlands | +| `ca` | 加泰隆尼亞文 | Català | +| `eu` | 巴斯克文 | Euskara | +| `gl` | 加利西亞文 | Galego | +| `mt` | 馬爾他文 | Malti | ### 北歐語言(5 種) -| 代碼 | 語言 | 原生名稱 | -|------|------|----------| -| `sv` | 瑞典文 | Svenska | -| `da` | 丹麥文 | Dansk | -| `fi` | 芬蘭文 | Suomi | -| `no` | 挪威文 | Norsk | +| 代碼 | 語言 | 原生名稱 | +| ---- | ------ | -------- | +| `sv` | 瑞典文 | Svenska | +| `da` | 丹麥文 | Dansk | +| `fi` | 芬蘭文 | Suomi | +| `no` | 挪威文 | Norsk | | `is` | 冰島文 | Íslenska | ### 東歐語言(12 種) -| 代碼 | 語言 | 原生名稱 | -|------|------|----------| -| `ru` | 俄文 | Русский | -| `pl` | 波蘭文 | Polski | -| `uk` | 烏克蘭文 | Українська | -| `cs` | 捷克文 | Čeština | -| `hu` | 匈牙利文 | Magyar | -| `ro` | 羅馬尼亞文 | Română | -| `bg` | 保加利亞文 | Български | -| `hr` | 克羅埃西亞文 | Hrvatski | -| `sk` | 斯洛伐克文 | Slovenčina | +| 代碼 | 語言 | 原生名稱 | +| ---- | ------------ | ----------- | +| `ru` | 俄文 | Русский | +| `pl` | 波蘭文 | Polski | +| `uk` | 烏克蘭文 | Українська | +| `cs` | 捷克文 | Čeština | +| `hu` | 匈牙利文 | Magyar | +| `ro` | 羅馬尼亞文 | Română | +| `bg` | 保加利亞文 | Български | +| `hr` | 克羅埃西亞文 | Hrvatski | +| `sk` | 斯洛伐克文 | Slovenčina | | `sl` | 斯洛維尼亞文 | Slovenščina | -| `sr` | 塞爾維亞文 | Српски | -| `mk` | 馬其頓文 | Македонски | +| `sr` | 塞爾維亞文 | Српски | +| `mk` | 馬其頓文 | Македонски | ### 波羅的海語言(3 種) -| 代碼 | 語言 | 原生名稱 | -|------|------|----------| -| `lt` | 立陶宛文 | Lietuvių | +| 代碼 | 語言 | 原生名稱 | +| ---- | ---------- | -------- | +| `lt` | 立陶宛文 | Lietuvių | | `lv` | 拉脫維亞文 | Latviešu | -| `et` | 愛沙尼亞文 | Eesti | +| `et` | 愛沙尼亞文 | Eesti | ### 其他歐洲語言(4 種) -| 代碼 | 語言 | 原生名稱 | -|------|------|----------| -| `el` | 希臘文 | Ελληνικά | -| `sq` | 阿爾巴尼亞文 | Shqip | -| `ga` | 愛爾蘭文 | Gaeilge | -| `cy` | 威爾斯文 | Cymraeg | +| 代碼 | 語言 | 原生名稱 | +| ---- | ------------ | -------- | +| `el` | 希臘文 | Ελληνικά | +| `sq` | 阿爾巴尼亞文 | Shqip | +| `ga` | 愛爾蘭文 | Gaeilge | +| `cy` | 威爾斯文 | Cymraeg | ### 中東語言(4 種) -| 代碼 | 語言 | 原生名稱 | -|------|------|----------| -| `ar` | 阿拉伯文 | العربية | -| `he` | 希伯來文 | עברית | -| `fa` | 波斯文 | فارسی | -| `tr` | 土耳其文 | Türkçe | +| 代碼 | 語言 | 原生名稱 | +| ---- | -------- | -------- | +| `ar` | 阿拉伯文 | العربية | +| `he` | 希伯來文 | עברית | +| `fa` | 波斯文 | فارسی | +| `tr` | 土耳其文 | Türkçe | ### 南亞語言(10 種) -| 代碼 | 語言 | 原生名稱 | -|------|------|----------| -| `hi` | 印地文 | हिन्दी | -| `bn` | 孟加拉文 | বাংলা | -| `ta` | 泰米爾文 | தமிழ் | -| `te` | 泰盧固文 | తెలుగు | -| `mr` | 馬拉地文 | मराठी | -| `gu` | 古吉拉特文 | ગુજરાતી | -| `kn` | 卡納達文 | ಕನ್ನಡ | -| `ml` | 馬拉雅拉姆文 | മലയാളം | -| `ne` | 尼泊爾文 | नेपाली | -| `si` | 僧伽羅文 | සිංහල | +| 代碼 | 語言 | 原生名稱 | +| ---- | ------------ | -------- | +| `hi` | 印地文 | हिन्दी | +| `bn` | 孟加拉文 | বাংলা | +| `ta` | 泰米爾文 | தமிழ் | +| `te` | 泰盧固文 | తెలుగు | +| `mr` | 馬拉地文 | मराठी | +| `gu` | 古吉拉特文 | ગુજરાતી | +| `kn` | 卡納達文 | ಕನ್ನಡ | +| `ml` | 馬拉雅拉姆文 | മലയാളം | +| `ne` | 尼泊爾文 | नेपाली | +| `si` | 僧伽羅文 | සිංහල | ### 東南亞語言(8 種) -| 代碼 | 語言 | 原生名稱 | -|------|------|----------| -| `th` | 泰文 | ไทย | -| `vi` | 越南文 | Tiếng Việt | -| `id` | 印尼文 | Bahasa Indonesia | -| `ms` | 馬來文 | Bahasa Melayu | -| `fil` | 菲律賓文 | Filipino | -| `my` | 緬甸文 | မြန်မာ | -| `km` | 高棉文 | ខ្មែរ | -| `lo` | 寮文 | ລາວ | +| 代碼 | 語言 | 原生名稱 | +| ----- | -------- | ---------------- | +| `th` | 泰文 | ไทย | +| `vi` | 越南文 | Tiếng Việt | +| `id` | 印尼文 | Bahasa Indonesia | +| `ms` | 馬來文 | Bahasa Melayu | +| `fil` | 菲律賓文 | Filipino | +| `my` | 緬甸文 | မြန်မာ | +| `km` | 高棉文 | ខ្មែរ | +| `lo` | 寮文 | ລາວ | ### 非洲語言(4 種) -| 代碼 | 語言 | 原生名稱 | -|------|------|----------| -| `af` | 南非語 | Afrikaans | +| 代碼 | 語言 | 原生名稱 | +| ---- | ---------- | --------- | +| `af` | 南非語 | Afrikaans | | `sw` | 斯瓦希里文 | Kiswahili | -| `am` | 阿姆哈拉文 | አማርኛ | -| `zu` | 祖魯文 | isiZulu | +| `am` | 阿姆哈拉文 | አማርኛ | +| `zu` | 祖魯文 | isiZulu | --- diff --git a/docs/url-id-and-storage.md b/docs/url-id-and-storage.md index 52fe4c3..51b4086 100644 --- a/docs/url-id-and-storage.md +++ b/docs/url-id-and-storage.md @@ -48,6 +48,7 @@ Job ID 是一個 UUID v4 格式的字串,例如: ``` 例如: + ``` http://localhost:3000/results/550e8400-e29b-41d4-a716-446655440000 ``` @@ -123,30 +124,30 @@ ConvertX-CN 使用 SQLite 作為資料庫,儲存於 `/app/data/convertx.db`。 #### users -| 欄位 | 類型 | 說明 | -|------|------|------| -| id | INTEGER | 使用者 ID | -| email | TEXT | 電子郵件 | -| password | TEXT | 密碼雜湊 | +| 欄位 | 類型 | 說明 | +| -------- | ------- | --------- | +| id | INTEGER | 使用者 ID | +| email | TEXT | 電子郵件 | +| password | TEXT | 密碼雜湊 | #### jobs -| 欄位 | 類型 | 說明 | -|------|------|------| -| id | TEXT | Job UUID | -| user_id | INTEGER | 使用者 ID | -| num_files | INTEGER | 檔案數量 | -| date_created | TEXT | 建立時間 | +| 欄位 | 類型 | 說明 | +| ------------ | ------- | --------- | +| id | TEXT | Job UUID | +| user_id | INTEGER | 使用者 ID | +| num_files | INTEGER | 檔案數量 | +| date_created | TEXT | 建立時間 | #### file_names -| 欄位 | 類型 | 說明 | -|------|------|------| -| id | INTEGER | 檔案 ID | -| job_id | TEXT | Job UUID | -| input_file_name | TEXT | 原始檔名 | -| output_file_name | TEXT | 輸出檔名 | -| status | TEXT | 轉換狀態 | +| 欄位 | 類型 | 說明 | +| ---------------- | ------- | -------- | +| id | INTEGER | 檔案 ID | +| job_id | TEXT | Job UUID | +| input_file_name | TEXT | 原始檔名 | +| output_file_name | TEXT | 輸出檔名 | +| status | TEXT | 轉換狀態 | --- diff --git a/package.json b/package.json index 1d2d9e6..671c169 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "convertx-frontend", - "version": "0.1.3", + "version": "0.1.4", "scripts": { "dev": "bun run --watch src/index.tsx", "hot": "bun run --hot src/index.tsx", diff --git a/public/script.js b/public/script.js index 49104cf..7ac410b 100644 --- a/public/script.js +++ b/public/script.js @@ -9,16 +9,16 @@ let formatSelected = false; // Get translation helper const getTranslation = (category, key, params) => { - if (typeof window.t === 'function') { + if (typeof window.t === "function") { return window.t(category, key, params); } // Fallback to English if t is not available const fallbacks = { - 'common.remove': 'Remove', - 'convert.title': 'Convert', - 'convert.titleWithType': 'Convert .{fileType}', - 'convert.convertButton': 'Convert', - 'convert.uploading': 'Uploading...' + "common.remove": "Remove", + "convert.title": "Convert", + "convert.titleWithType": "Convert .{fileType}", + "convert.convertButton": "Convert", + "convert.uploading": "Uploading...", }; let text = fallbacks[`${category}.${key}`] || key; if (params) { @@ -58,7 +58,7 @@ dropZone.addEventListener("drop", (e) => { // Extracted handleFile function for reusability in drag-and-drop and file input function handleFile(file) { const fileList = document.querySelector("#file-list"); - const removeText = getTranslation('common', 'remove'); + const removeText = getTranslation("common", "remove"); const row = document.createElement("tr"); row.innerHTML = ` @@ -186,9 +186,9 @@ fileInput.addEventListener("change", (e) => { const setTitle = () => { const title = document.querySelector("h1"); if (fileType) { - title.textContent = getTranslation('convert', 'titleWithType', { fileType }); + title.textContent = getTranslation("convert", "titleWithType", { fileType }); } else { - title.textContent = getTranslation('convert', 'title'); + title.textContent = getTranslation("convert", "title"); } }; @@ -225,7 +225,7 @@ const deleteRow = (target) => { const uploadFile = (file) => { convertButton.disabled = true; - convertButton.value = getTranslation('convert', 'uploading'); + convertButton.value = getTranslation("convert", "uploading"); pendingFiles += 1; const formData = new FormData(); @@ -243,7 +243,7 @@ const uploadFile = (file) => { if (formatSelected) { convertButton.disabled = false; } - convertButton.value = getTranslation('convert', 'convertButton'); + convertButton.value = getTranslation("convert", "convertButton"); } //Remove the progress bar when upload is done diff --git a/src/components/base.tsx b/src/components/base.tsx index c37291b..d13a8b2 100644 --- a/src/components/base.tsx +++ b/src/components/base.tsx @@ -1,5 +1,5 @@ import { version } from "../../package.json"; -import { type SupportedLocale, defaultLocale, getTranslations } from "../i18n"; +import { type SupportedLocale, defaultLocale, getTranslations } from "../i18n/index"; export const BaseHtml = ({ children, diff --git a/src/components/header.tsx b/src/components/header.tsx index ab4daa2..e016668 100644 --- a/src/components/header.tsx +++ b/src/components/header.tsx @@ -1,4 +1,4 @@ -import { type SupportedLocale, type Translator, createTranslator, defaultLocale } from "../i18n"; +import { type SupportedLocale, type Translator, createTranslator, defaultLocale } from "../i18n/index"; import { LanguageSelector } from "./languageSelector"; export const Header = ({ diff --git a/src/components/languageSelector.tsx b/src/components/languageSelector.tsx index 8f040f1..5fac3b9 100644 --- a/src/components/languageSelector.tsx +++ b/src/components/languageSelector.tsx @@ -1,4 +1,4 @@ -import { supportedLocales, type SupportedLocale, type Translator } from "../i18n"; +import { supportedLocales, type SupportedLocale, type Translator } from "../i18n/index"; export const LanguageSelector = ({ currentLocale, diff --git a/src/helpers/env.ts b/src/helpers/env.ts index 53f6a8f..8e8761c 100644 --- a/src/helpers/env.ts +++ b/src/helpers/env.ts @@ -1,5 +1,6 @@ +// 預設開放註冊(開箱即用),管理者可設為 false 來關閉 export const ACCOUNT_REGISTRATION = - process.env.ACCOUNT_REGISTRATION?.toLowerCase() === "true" || false; + process.env.ACCOUNT_REGISTRATION?.toLowerCase() !== "false"; export const HTTP_ALLOWED = process.env.HTTP_ALLOWED?.toLowerCase() === "true" || false; diff --git a/src/i18n/service.ts b/src/i18n/service.ts index 4019c76..bd9dabb 100644 --- a/src/i18n/service.ts +++ b/src/i18n/service.ts @@ -4,7 +4,7 @@ import { createTranslator, detectLocale, getLocale, -} from "../i18n"; +} from "./index"; /** * Elysia plugin for i18n/locale handling diff --git a/src/pages/results.tsx b/src/pages/results.tsx index 2b9c7a8..1fa0cf4 100644 --- a/src/pages/results.tsx +++ b/src/pages/results.tsx @@ -7,7 +7,7 @@ import { ALLOW_UNAUTHENTICATED, WEBROOT } from "../helpers/env"; import { DownloadIcon } from "../icons/download"; import { DeleteIcon } from "../icons/delete"; import { EyeIcon } from "../icons/eye"; -import { type SupportedLocale, type Translator, createTranslator, defaultLocale } from "../i18n"; +import { type SupportedLocale, type Translator, createTranslator, defaultLocale } from "../i18n/index"; import { localeService } from "../i18n/service"; import { userService } from "./user";