feat(v0.1.4): Fix i18n imports + Default open registration

## Changes

### i18n Module Fixes
- Fix import paths in service.ts, languageSelector.tsx, header.tsx, base.tsx, results.tsx
- Change from '../i18n' to '../i18n/index' or './index' for proper module resolution

### Registration (Breaking Change)
- Change ACCOUNT_REGISTRATION default from false to true (out-of-box ready)
- Login and Register pages now both visible by default

### Version Bump
- Update package.json to v0.1.4
- Update CHANGELOG.md with v0.1.4 release notes
- Update README.md and docs with new version numbers

### Build Verification
- bun run build: PASSED
- Docker build: PASSED
- TypeScript compilation: PASSED (no errors)
This commit is contained in:
Your Name 2026-01-20 11:41:43 +08:00
parent 5c68308c36
commit 558d638df8
17 changed files with 266 additions and 234 deletions

View file

@ -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

View file

@ -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首次下載需較長時間。

View file

@ -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"
```
---

View file

@ -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 等 |
## 新增轉換器

View file

@ -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` | 時區設定 |
---

View file

@ -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` | 未登入使用者是否共享檔案空間 |
---

View file

@ -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 核心 |
---

View file

@ -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 |
---

View file

@ -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 | 轉換狀態 |
---

View file

@ -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",

View file

@ -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

View file

@ -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,

View file

@ -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 = ({

View file

@ -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,

View file

@ -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;

View file

@ -4,7 +4,7 @@ import {
createTranslator,
detectLocale,
getLocale,
} from "../i18n";
} from "./index";
/**
* Elysia plugin for i18n/locale handling

View file

@ -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";