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 # 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) ## [0.1.3](https://github.com/C4illin/ConvertX/releases/tag/v0.1.3) (2026-01-20)
### Features ### Features

View file

@ -21,7 +21,7 @@ ConvertX-CN 是基於 [C4illin/ConvertX](https://github.com/C4illin/ConvertX)
### 主要特色 ### 主要特色
| 特色 | 說明 | | 特色 | 說明 |
|------|------| | ------------------- | -------------------------------------------------- |
| 🌍 **65+ 語言支援** | 繁體中文、簡體中文、英文、日文、韓文等 65 種語言 | | 🌍 **65+ 語言支援** | 繁體中文、簡體中文、英文、日文、韓文等 65 種語言 |
| 📦 **完整內建** | LibreOffice、FFmpeg、Pandoc、Calibre 等 20+ 轉換器 | | 📦 **完整內建** | LibreOffice、FFmpeg、Pandoc、Calibre 等 20+ 轉換器 |
| 🎨 **CJK 字型** | Noto CJK、微軟核心字型、標楷體等中日韓字型 | | 🎨 **CJK 字型** | Noto CJK、微軟核心字型、標楷體等中日韓字型 |
@ -79,7 +79,7 @@ docker compose up -d
ConvertX-CN 支援 **65 種語言**,包括: 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 | | **歐洲** | 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, हिन्दी, বাংলা, தமிழ், తెలుగు, मराठी, ગુજરાતી, ಕನ್ನಡ, മലയാളം, नेपाली, සිංහල | | **中東/南亞** | العربية, עברית, فارسی, Türkçe, हिन्दी, বাংলা, தமிழ், తెలుగు, मराठी, ગુજરાતી, ಕನ್ನಡ, മലയാളം, नेपाली, සිංහල |
@ -93,7 +93,7 @@ ConvertX-CN 支援 **65 種語言**,包括:
## 📦 內建轉換器 ## 📦 內建轉換器
| 轉換器 | 用途 | 輸入格式 | 輸出格式 | | 轉換器 | 用途 | 輸入格式 | 輸出格式 |
|--------|------|----------|----------| | -------------- | ------- | -------- | -------- |
| FFmpeg | 影音 | ~472 | ~199 | | FFmpeg | 影音 | ~472 | ~199 |
| ImageMagick | 圖片 | 245 | 183 | | ImageMagick | 圖片 | 245 | 183 |
| GraphicsMagick | 圖片 | 167 | 130 | | GraphicsMagick | 圖片 | 167 | 130 |
@ -110,7 +110,7 @@ ConvertX-CN 支援 **65 種語言**,包括:
## 📖 文件導覽 ## 📖 文件導覽
| 文件 | 說明 | | 文件 | 說明 |
|------|------| | -------------------------------------------- | ---------------------- |
| [🚀 快速開始](docs/getting-started.md) | Docker 部署教學 | | [🚀 快速開始](docs/getting-started.md) | Docker 部署教學 |
| [🐳 Docker 配置](docs/docker.md) | 完整 Docker 設定指南 | | [🐳 Docker 配置](docs/docker.md) | 完整 Docker 設定指南 |
| [⚙️ 環境變數](docs/environment-variables.md) | 所有環境變數說明 | | [⚙️ 環境變數](docs/environment-variables.md) | 所有環境變數說明 |
@ -124,9 +124,9 @@ ConvertX-CN 支援 **65 種語言**,包括:
## 🐳 Docker Image ## 🐳 Docker Image
| Tag | 說明 | | Tag | 說明 |
|-----|------| | ----------------------------- | ---------- |
| `convertx/convertx-cn:latest` | 最新穩定版 | | `convertx/convertx-cn:latest` | 最新穩定版 |
| `convertx/convertx-cn:v0.1.3` | 指定版本 | | `convertx/convertx-cn:v0.1.4` | 指定版本 |
> ⚠️ 由於內建完整依賴Image 約 4-6 GB首次下載需較長時間。 > ⚠️ 由於內建完整依賴Image 約 4-6 GB首次下載需較長時間。

View file

@ -246,9 +246,9 @@ deploy:
deploy: deploy:
resources: resources:
limits: limits:
cpus: '4' cpus: "4"
reservations: reservations:
cpus: '1' cpus: "1"
``` ```
--- ---

View file

@ -5,7 +5,7 @@ ConvertX-CN 完整版已內建以下所有轉換器,開箱即用。
## 轉換器列表 ## 轉換器列表
| 轉換器 | 用途 | 輸入格式數 | 輸出格式數 | | 轉換器 | 用途 | 輸入格式數 | 輸出格式數 |
| ------ | ---- | ---------- | ---------- | | --------------------------------------------------------------- | ---------- | ---------- | ---------- |
| [Inkscape](https://inkscape.org/) | 向量圖形 | 7 | 17 | | [Inkscape](https://inkscape.org/) | 向量圖形 | 7 | 17 |
| [libjxl](https://github.com/libjxl/libjxl) | JPEG XL | 11 | 11 | | [libjxl](https://github.com/libjxl/libjxl) | JPEG XL | 11 | 11 |
| [resvg](https://github.com/RazrFalcon/resvg) | SVG | 1 | 1 | | [resvg](https://github.com/RazrFalcon/resvg) | SVG | 1 | 1 |
@ -34,7 +34,7 @@ ConvertX-CN 完整版已內建以下所有轉換器,開箱即用。
ConvertX-CN 完整版已預載: ConvertX-CN 完整版已預載:
| 類別 | 內建內容 | | 類別 | 內建內容 |
| ---- | -------- | | ------------ | ---------------------------------------------------------------- |
| **文件轉換** | LibreOffice (headless)、Pandoc | | **文件轉換** | LibreOffice (headless)、Pandoc |
| **LaTeX** | TexLive Full完整版支援所有 LaTeX 需求) | | **LaTeX** | TexLive Full完整版支援所有 LaTeX 需求) |
| **OCR 識別** | Tesseract OCR + 繁體中文、簡體中文、日文、韓文、英文、德文語言包 | | **OCR 識別** | Tesseract OCR + 繁體中文、簡體中文、日文、韓文、英文、德文語言包 |

View file

@ -7,10 +7,10 @@ ConvertX-CN 提供預建的 Docker Image包含所有轉換依賴。
### 可用 Tag ### 可用 Tag
| Tag | 說明 | | Tag | 說明 |
|-----|------| | ---------------------------------- | ------------------------ |
| `convertx/convertx-cn:latest` | 最新穩定版 | | `convertx/convertx-cn:latest` | 最新穩定版 |
| `convertx/convertx-cn:v0.1.3` | 指定版本號 | | `convertx/convertx-cn:v0.1.4` | 指定版本號 |
| `convertx/convertx-cn:v0.1.3-FULL` | 完整版(與 latest 相同) | | `convertx/convertx-cn:v0.1.4-FULL` | 完整版(與 latest 相同) |
### Image 大小 ### Image 大小
@ -35,7 +35,7 @@ docker run -d \
### 參數說明 ### 參數說明
| 參數 | 說明 | | 參數 | 說明 |
|------|------| | --------------------- | ---------- |
| `-d` | 背景執行 | | `-d` | 背景執行 |
| `--name convertx-cn` | 容器名稱 | | `--name convertx-cn` | 容器名稱 |
| `-p 3000:3000` | 連接埠映射 | | `-p 3000:3000` | 連接埠映射 |

View file

@ -7,16 +7,16 @@
## 安全性設定 ## 安全性設定
| 變數名稱 | 預設值 | 說明 | | 變數名稱 | 預設值 | 說明 |
|----------|--------|------| | ----------------------- | -------------- | ----------------------------------------------- |
| `JWT_SECRET` | `randomUUID()` | 用於簽署 JWT 的密鑰字串。**生產環境請務必設定** | | `JWT_SECRET` | `randomUUID()` | 用於簽署 JWT 的密鑰字串。**生產環境請務必設定** |
| `ACCOUNT_REGISTRATION` | `false` | 是否允許註冊新帳號 | | `ACCOUNT_REGISTRATION` | `true` | 是否允許註冊新帳號(預設開放) |
| `HTTP_ALLOWED` | `false` | 是否允許 HTTP 連線(僅本地使用建議開啟) | | `HTTP_ALLOWED` | `false` | 是否允許 HTTP 連線(僅本地使用建議開啟) |
| `ALLOW_UNAUTHENTICATED` | `false` | 是否允許未登入使用 | | `ALLOW_UNAUTHENTICATED` | `false` | 是否允許未登入使用 |
### 安全建議 ### 安全建議
```yaml ```yaml
# 生產環境 # 生產環境(關閉註冊)
environment: environment:
- JWT_SECRET=a-very-long-random-string-at-least-32-characters - JWT_SECRET=a-very-long-random-string-at-least-32-characters
- ACCOUNT_REGISTRATION=false - ACCOUNT_REGISTRATION=false
@ -29,7 +29,7 @@ environment:
## 檔案管理 ## 檔案管理
| 變數名稱 | 預設值 | 說明 | | 變數名稱 | 預設值 | 說明 |
|----------|--------|------| | --------------------------- | ------ | ------------------------------------- |
| `AUTO_DELETE_EVERY_N_HOURS` | `24` | 自動刪除超過 N 小時的檔案0 = 停用) | | `AUTO_DELETE_EVERY_N_HOURS` | `24` | 自動刪除超過 N 小時的檔案0 = 停用) |
### 範例 ### 範例
@ -47,7 +47,7 @@ environment:
## 轉換設定 ## 轉換設定
| 變數名稱 | 預設值 | 說明 | | 變數名稱 | 預設值 | 說明 |
|----------|--------|------| | --------------------- | ------ | ---------------------------------------- |
| `MAX_CONVERT_PROCESS` | `0` | 最大同時轉換數0 = 無限制) | | `MAX_CONVERT_PROCESS` | `0` | 最大同時轉換數0 = 無限制) |
| `FFMPEG_ARGS` | - | FFmpeg 輸入參數,例如 `-hwaccel vaapi` | | `FFMPEG_ARGS` | - | FFmpeg 輸入參數,例如 `-hwaccel vaapi` |
| `FFMPEG_OUTPUT_ARGS` | - | FFmpeg 輸出參數,例如 `-preset veryfast` | | `FFMPEG_OUTPUT_ARGS` | - | FFmpeg 輸出參數,例如 `-preset veryfast` |
@ -70,7 +70,7 @@ environment:
## 介面設定 ## 介面設定
| 變數名稱 | 預設值 | 說明 | | 變數名稱 | 預設值 | 說明 |
|----------|--------|------| | -------------- | ------- | ---------------------------- |
| `WEBROOT` | - | 子路徑部署,例如 `/convertx` | | `WEBROOT` | - | 子路徑部署,例如 `/convertx` |
| `HIDE_HISTORY` | `false` | 隱藏歷史紀錄頁面 | | `HIDE_HISTORY` | `false` | 隱藏歷史紀錄頁面 |
@ -87,7 +87,7 @@ environment:
## 本地化設定 ## 本地化設定
| 變數名稱 | 預設值 | 說明 | | 變數名稱 | 預設值 | 說明 |
|----------|--------|------| | ---------- | ------ | --------------------------- |
| `LANGUAGE` | `en` | 日期格式語言BCP 47 格式) | | `LANGUAGE` | `en` | 日期格式語言BCP 47 格式) |
| `TZ` | `UTC` | 時區設定 | | `TZ` | `UTC` | 時區設定 |
@ -112,7 +112,7 @@ environment:
## 進階設定 ## 進階設定
| 變數名稱 | 預設值 | 說明 | | 變數名稱 | 預設值 | 說明 |
|----------|--------|------| | ------------------------------ | ------- | ---------------------------- |
| `UNAUTHENTICATED_USER_SHARING` | `false` | 未登入使用者是否共享檔案空間 | | `UNAUTHENTICATED_USER_SHARING` | `false` | 未登入使用者是否共享檔案空間 |
--- ---

View file

@ -3,7 +3,7 @@
## 系統需求 ## 系統需求
| 需求 | 最低 | 建議 | | 需求 | 最低 | 建議 |
|------|------|------| | -------- | ------ | ------ |
| Docker | 20.10+ | 24.0+ | | Docker | 20.10+ | 24.0+ |
| RAM | 4 GB | 8 GB | | RAM | 4 GB | 8 GB |
| 磁碟空間 | 10 GB | 20 GB | | 磁碟空間 | 10 GB | 20 GB |

View file

@ -9,7 +9,7 @@ ConvertX-CN 支援 **65 種語言**,是目前最完整的多語言檔案轉換
### 東亞語言5 種) ### 東亞語言5 種)
| 代碼 | 語言 | 原生名稱 | | 代碼 | 語言 | 原生名稱 |
|------|------|----------| | ------- | ---------------- | -------- |
| `zh-TW` | 繁體中文(預設) | 繁體中文 | | `zh-TW` | 繁體中文(預設) | 繁體中文 |
| `zh-CN` | 簡體中文 | 简体中文 | | `zh-CN` | 簡體中文 | 简体中文 |
| `en` | 英文 | English | | `en` | 英文 | English |
@ -19,7 +19,7 @@ ConvertX-CN 支援 **65 種語言**,是目前最完整的多語言檔案轉換
### 西歐語言10 種) ### 西歐語言10 種)
| 代碼 | 語言 | 原生名稱 | | 代碼 | 語言 | 原生名稱 |
|------|------|----------| | ---- | ------------ | ---------- |
| `de` | 德文 | Deutsch | | `de` | 德文 | Deutsch |
| `fr` | 法文 | Français | | `fr` | 法文 | Français |
| `es` | 西班牙文 | Español | | `es` | 西班牙文 | Español |
@ -34,7 +34,7 @@ ConvertX-CN 支援 **65 種語言**,是目前最完整的多語言檔案轉換
### 北歐語言5 種) ### 北歐語言5 種)
| 代碼 | 語言 | 原生名稱 | | 代碼 | 語言 | 原生名稱 |
|------|------|----------| | ---- | ------ | -------- |
| `sv` | 瑞典文 | Svenska | | `sv` | 瑞典文 | Svenska |
| `da` | 丹麥文 | Dansk | | `da` | 丹麥文 | Dansk |
| `fi` | 芬蘭文 | Suomi | | `fi` | 芬蘭文 | Suomi |
@ -44,7 +44,7 @@ ConvertX-CN 支援 **65 種語言**,是目前最完整的多語言檔案轉換
### 東歐語言12 種) ### 東歐語言12 種)
| 代碼 | 語言 | 原生名稱 | | 代碼 | 語言 | 原生名稱 |
|------|------|----------| | ---- | ------------ | ----------- |
| `ru` | 俄文 | Русский | | `ru` | 俄文 | Русский |
| `pl` | 波蘭文 | Polski | | `pl` | 波蘭文 | Polski |
| `uk` | 烏克蘭文 | Українська | | `uk` | 烏克蘭文 | Українська |
@ -61,7 +61,7 @@ ConvertX-CN 支援 **65 種語言**,是目前最完整的多語言檔案轉換
### 波羅的海語言3 種) ### 波羅的海語言3 種)
| 代碼 | 語言 | 原生名稱 | | 代碼 | 語言 | 原生名稱 |
|------|------|----------| | ---- | ---------- | -------- |
| `lt` | 立陶宛文 | Lietuvių | | `lt` | 立陶宛文 | Lietuvių |
| `lv` | 拉脫維亞文 | Latviešu | | `lv` | 拉脫維亞文 | Latviešu |
| `et` | 愛沙尼亞文 | Eesti | | `et` | 愛沙尼亞文 | Eesti |
@ -69,7 +69,7 @@ ConvertX-CN 支援 **65 種語言**,是目前最完整的多語言檔案轉換
### 其他歐洲語言4 種) ### 其他歐洲語言4 種)
| 代碼 | 語言 | 原生名稱 | | 代碼 | 語言 | 原生名稱 |
|------|------|----------| | ---- | ------------ | -------- |
| `el` | 希臘文 | Ελληνικά | | `el` | 希臘文 | Ελληνικά |
| `sq` | 阿爾巴尼亞文 | Shqip | | `sq` | 阿爾巴尼亞文 | Shqip |
| `ga` | 愛爾蘭文 | Gaeilge | | `ga` | 愛爾蘭文 | Gaeilge |
@ -78,7 +78,7 @@ ConvertX-CN 支援 **65 種語言**,是目前最完整的多語言檔案轉換
### 中東語言4 種) ### 中東語言4 種)
| 代碼 | 語言 | 原生名稱 | | 代碼 | 語言 | 原生名稱 |
|------|------|----------| | ---- | -------- | -------- |
| `ar` | 阿拉伯文 | العربية | | `ar` | 阿拉伯文 | العربية |
| `he` | 希伯來文 | עברית | | `he` | 希伯來文 | עברית |
| `fa` | 波斯文 | فارسی | | `fa` | 波斯文 | فارسی |
@ -87,7 +87,7 @@ ConvertX-CN 支援 **65 種語言**,是目前最完整的多語言檔案轉換
### 南亞語言10 種) ### 南亞語言10 種)
| 代碼 | 語言 | 原生名稱 | | 代碼 | 語言 | 原生名稱 |
|------|------|----------| | ---- | ------------ | -------- |
| `hi` | 印地文 | हिन्दी | | `hi` | 印地文 | हिन्दी |
| `bn` | 孟加拉文 | বাংলা | | `bn` | 孟加拉文 | বাংলা |
| `ta` | 泰米爾文 | தமிழ் | | `ta` | 泰米爾文 | தமிழ் |
@ -102,7 +102,7 @@ ConvertX-CN 支援 **65 種語言**,是目前最完整的多語言檔案轉換
### 東南亞語言8 種) ### 東南亞語言8 種)
| 代碼 | 語言 | 原生名稱 | | 代碼 | 語言 | 原生名稱 |
|------|------|----------| | ----- | -------- | ---------------- |
| `th` | 泰文 | ไทย | | `th` | 泰文 | ไทย |
| `vi` | 越南文 | Tiếng Việt | | `vi` | 越南文 | Tiếng Việt |
| `id` | 印尼文 | Bahasa Indonesia | | `id` | 印尼文 | Bahasa Indonesia |
@ -115,7 +115,7 @@ ConvertX-CN 支援 **65 種語言**,是目前最完整的多語言檔案轉換
### 非洲語言4 種) ### 非洲語言4 種)
| 代碼 | 語言 | 原生名稱 | | 代碼 | 語言 | 原生名稱 |
|------|------|----------| | ---- | ---------- | --------- |
| `af` | 南非語 | Afrikaans | | `af` | 南非語 | Afrikaans |
| `sw` | 斯瓦希里文 | Kiswahili | | `sw` | 斯瓦希里文 | Kiswahili |
| `am` | 阿姆哈拉文 | አማርኛ | | `am` | 阿姆哈拉文 | አማርኛ |

View file

@ -48,6 +48,7 @@ Job ID 是一個 UUID v4 格式的字串,例如:
``` ```
例如: 例如:
``` ```
http://localhost:3000/results/550e8400-e29b-41d4-a716-446655440000 http://localhost:3000/results/550e8400-e29b-41d4-a716-446655440000
``` ```
@ -124,7 +125,7 @@ ConvertX-CN 使用 SQLite 作為資料庫,儲存於 `/app/data/convertx.db`。
#### users #### users
| 欄位 | 類型 | 說明 | | 欄位 | 類型 | 說明 |
|------|------|------| | -------- | ------- | --------- |
| id | INTEGER | 使用者 ID | | id | INTEGER | 使用者 ID |
| email | TEXT | 電子郵件 | | email | TEXT | 電子郵件 |
| password | TEXT | 密碼雜湊 | | password | TEXT | 密碼雜湊 |
@ -132,7 +133,7 @@ ConvertX-CN 使用 SQLite 作為資料庫,儲存於 `/app/data/convertx.db`。
#### jobs #### jobs
| 欄位 | 類型 | 說明 | | 欄位 | 類型 | 說明 |
|------|------|------| | ------------ | ------- | --------- |
| id | TEXT | Job UUID | | id | TEXT | Job UUID |
| user_id | INTEGER | 使用者 ID | | user_id | INTEGER | 使用者 ID |
| num_files | INTEGER | 檔案數量 | | num_files | INTEGER | 檔案數量 |
@ -141,7 +142,7 @@ ConvertX-CN 使用 SQLite 作為資料庫,儲存於 `/app/data/convertx.db`。
#### file_names #### file_names
| 欄位 | 類型 | 說明 | | 欄位 | 類型 | 說明 |
|------|------|------| | ---------------- | ------- | -------- |
| id | INTEGER | 檔案 ID | | id | INTEGER | 檔案 ID |
| job_id | TEXT | Job UUID | | job_id | TEXT | Job UUID |
| input_file_name | TEXT | 原始檔名 | | input_file_name | TEXT | 原始檔名 |

View file

@ -1,6 +1,6 @@
{ {
"name": "convertx-frontend", "name": "convertx-frontend",
"version": "0.1.3", "version": "0.1.4",
"scripts": { "scripts": {
"dev": "bun run --watch src/index.tsx", "dev": "bun run --watch src/index.tsx",
"hot": "bun run --hot src/index.tsx", "hot": "bun run --hot src/index.tsx",

View file

@ -9,16 +9,16 @@ let formatSelected = false;
// Get translation helper // Get translation helper
const getTranslation = (category, key, params) => { const getTranslation = (category, key, params) => {
if (typeof window.t === 'function') { if (typeof window.t === "function") {
return window.t(category, key, params); return window.t(category, key, params);
} }
// Fallback to English if t is not available // Fallback to English if t is not available
const fallbacks = { const fallbacks = {
'common.remove': 'Remove', "common.remove": "Remove",
'convert.title': 'Convert', "convert.title": "Convert",
'convert.titleWithType': 'Convert .{fileType}', "convert.titleWithType": "Convert .{fileType}",
'convert.convertButton': 'Convert', "convert.convertButton": "Convert",
'convert.uploading': 'Uploading...' "convert.uploading": "Uploading...",
}; };
let text = fallbacks[`${category}.${key}`] || key; let text = fallbacks[`${category}.${key}`] || key;
if (params) { if (params) {
@ -58,7 +58,7 @@ dropZone.addEventListener("drop", (e) => {
// Extracted handleFile function for reusability in drag-and-drop and file input // Extracted handleFile function for reusability in drag-and-drop and file input
function handleFile(file) { function handleFile(file) {
const fileList = document.querySelector("#file-list"); const fileList = document.querySelector("#file-list");
const removeText = getTranslation('common', 'remove'); const removeText = getTranslation("common", "remove");
const row = document.createElement("tr"); const row = document.createElement("tr");
row.innerHTML = ` row.innerHTML = `
@ -186,9 +186,9 @@ fileInput.addEventListener("change", (e) => {
const setTitle = () => { const setTitle = () => {
const title = document.querySelector("h1"); const title = document.querySelector("h1");
if (fileType) { if (fileType) {
title.textContent = getTranslation('convert', 'titleWithType', { fileType }); title.textContent = getTranslation("convert", "titleWithType", { fileType });
} else { } else {
title.textContent = getTranslation('convert', 'title'); title.textContent = getTranslation("convert", "title");
} }
}; };
@ -225,7 +225,7 @@ const deleteRow = (target) => {
const uploadFile = (file) => { const uploadFile = (file) => {
convertButton.disabled = true; convertButton.disabled = true;
convertButton.value = getTranslation('convert', 'uploading'); convertButton.value = getTranslation("convert", "uploading");
pendingFiles += 1; pendingFiles += 1;
const formData = new FormData(); const formData = new FormData();
@ -243,7 +243,7 @@ const uploadFile = (file) => {
if (formatSelected) { if (formatSelected) {
convertButton.disabled = false; convertButton.disabled = false;
} }
convertButton.value = getTranslation('convert', 'convertButton'); convertButton.value = getTranslation("convert", "convertButton");
} }
//Remove the progress bar when upload is done //Remove the progress bar when upload is done

View file

@ -1,5 +1,5 @@
import { version } from "../../package.json"; import { version } from "../../package.json";
import { type SupportedLocale, defaultLocale, getTranslations } from "../i18n"; import { type SupportedLocale, defaultLocale, getTranslations } from "../i18n/index";
export const BaseHtml = ({ export const BaseHtml = ({
children, 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"; import { LanguageSelector } from "./languageSelector";
export const Header = ({ 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 = ({ export const LanguageSelector = ({
currentLocale, currentLocale,

View file

@ -1,5 +1,6 @@
// 預設開放註冊(開箱即用),管理者可設為 false 來關閉
export const ACCOUNT_REGISTRATION = 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; export const HTTP_ALLOWED = process.env.HTTP_ALLOWED?.toLowerCase() === "true" || false;

View file

@ -4,7 +4,7 @@ import {
createTranslator, createTranslator,
detectLocale, detectLocale,
getLocale, getLocale,
} from "../i18n"; } from "./index";
/** /**
* Elysia plugin for i18n/locale handling * 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 { DownloadIcon } from "../icons/download";
import { DeleteIcon } from "../icons/delete"; import { DeleteIcon } from "../icons/delete";
import { EyeIcon } from "../icons/eye"; 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 { localeService } from "../i18n/service";
import { userService } from "./user"; import { userService } from "./user";