✨ feat(sync): multi-language sync wizard, backend locale support, and conflict modal UX improvements
Frontend (web)
- ModelsActions.jsx
- Replace “Sync Official” with “Sync” and open a new two-step SyncWizard.
- Pass selected locale through to preview, sync, and overwrite flows.
- Keep conflict resolution flow; inject locale into overwrite submission.
- New: models/modals/SyncWizardModal.jsx
- Two-step wizard: (1) method selection (config-sync disabled for now), (2) language selection (en/zh/ja).
- Horizontal, centered Radio cards; returns { option, locale } via onConfirm.
- UpstreamConflictModal.jsx
- Add search input (model fuzzy search) and native pagination.
- Column header checkbox now only applies to rows in the current filtered result.
- Fix “Cannot access ‘filteredDataSource’ before initialization”.
- Refactor with useMemo/useCallback; extract helpers to remove duplicated logic:
- getPresentRowsForField, getHeaderState, applyHeaderChange
- Minor code cleanups and stability improvements.
- i18n (en.json)
- Add strings for the sync wizard and related actions (Sync, Sync Wizard, Select method/source/language, etc.).
- Adjust minor translations.
Hooks
- useModelsData.jsx
- Extend previewUpstreamDiff, syncUpstream, applyUpstreamOverwrite to accept options with locale.
- Send locale via query/body accordingly.
Backend (Go)
- controller/model_sync.go
- Accept locale from query/body and resolve i18n upstream URLs.
- Add SYNC_UPSTREAM_BASE for upstream base override (default: https://basellm.github.io/llm-metadata).
- Make HTTP timeouts/retries/limits configurable:
- SYNC_HTTP_TIMEOUT_SECONDS, SYNC_HTTP_RETRY, SYNC_HTTP_MAX_MB
- Add ETag-based caching and support both envelope and pure array JSON formats.
- Concurrently fetch vendors and models; improve error responses with locale and source URLs.
- Include source meta (locale, models_url, vendors_url) in success payloads.
Notes
- No breaking changes expected.
- Lint passes for touched files.
This commit is contained in:
@@ -1801,7 +1801,7 @@
|
||||
"已绑定渠道": "Bound channels",
|
||||
"更新时间": "Update time",
|
||||
"未配置模型": "No model configured",
|
||||
"预填组管理": "Pre-filled group management",
|
||||
"预填组管理": "Pre-filled group",
|
||||
"搜索供应商": "Search vendor",
|
||||
"新增供应商": "Add vendor",
|
||||
"创建新的模型": "Create new model",
|
||||
@@ -2057,9 +2057,20 @@
|
||||
"侧边栏设置保存成功": "Sidebar settings saved successfully",
|
||||
"需要登录访问": "Require Login",
|
||||
"开启后未登录用户无法访问模型广场": "When enabled, unauthenticated users cannot access the model marketplace",
|
||||
"同步官方": "Sync official",
|
||||
"参与官方同步": "Participate in official sync",
|
||||
"关闭后,此模型将不会被“同步官方”自动覆盖或创建": "When turned off, this model will be skipped by Sync official (no auto create/overwrite)",
|
||||
"同步": "Sync",
|
||||
"同步向导": "Sync Wizard",
|
||||
"选择方式": "Select method",
|
||||
"选择同步来源": "Select sync source",
|
||||
"选择语言": "Select language",
|
||||
"选择同步语言": "Select sync language",
|
||||
"请选择同步语言": "Please select sync language",
|
||||
"从官方模型库同步": "Sync from official model library",
|
||||
"官方模型同步": "Official models sync",
|
||||
"从配置文件同步": "Sync from config file",
|
||||
"配置文件同步": "Config file sync",
|
||||
"开始同步": "Start sync",
|
||||
"选择要覆盖的冲突项": "Select conflict items to overwrite",
|
||||
"点击查看差异": "Click to view differences",
|
||||
"无冲突项": "No conflict items",
|
||||
|
||||
Reference in New Issue
Block a user