3x-ui/frontend/src
MHSanaei 35efeb983e
feat(frontend): Phase 7 — vue-i18n wired up + login page translated
Sets up vue-i18n on top of the panel's existing TOML translation
files. The Go side stays the source of truth — translators continue
to edit web/translation/*.toml; a sync script snapshots those files
into per-locale JSON the Vue bundle imports. The login page is
translated end-to-end as a worked example; remaining pages can be
converted incrementally without infrastructure churn.

What's in the box:
- scripts/sync-locales.mjs: small TOML→JSON converter that walks
  web/translation/*.toml and writes frontend/src/locales/<code>.json.
  Handles the narrow subset of TOML the panel uses (flat key/value
  pairs + dotted [section.subsection] heads). Wired as a `prebuild`
  + `predev` script so production builds always include the latest
  strings without a manual step.
- src/i18n/index.js: createI18n() in composition mode with all 13
  locales emitted as their own Vite chunks. The active locale (read
  from the same `lang` cookie LanguageManager has always managed)
  plus the en-US fallback are eagerly loaded; the rest are
  dynamically importable via a loadLocale(code) helper. This keeps
  the per-page bundle the user actually downloads small — only ~30
  KB of strings end up in the initial payload, vs ~220 KB if all
  13 were eager.
- All five page entries (index/login/settings/inbounds/xray) wire
  the i18n plugin into createApp via .use(i18n).
- LoginPage.vue: t(...) replaces hardcoded English on the username
  / password / 2FA placeholders, the submit button label, and the
  Settings popover title. The Hello/Welcome headline cycle stays
  hardcoded — those are stylistic, not labels.

The 'Hello'/'Welcome' cycle stays in English deliberately; the rest
of the migration's components still ship hardcoded English and will
be converted page by page in follow-up commits.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 14:54:07 +02:00
..
api fix(csrf): expose token endpoint for SPA pages and fetch it from axios 2026-05-08 13:20:26 +02:00
components feat(frontend): Phase 5f-vii — shared text/prompt modals + remaining export/import wiring 2026-05-08 14:09:19 +02:00
composables feat(frontend): Phase 5c-ii — live status cards on the dashboard 2026-05-08 12:31:55 +02:00
i18n feat(frontend): Phase 7 — vue-i18n wired up + login page translated 2026-05-08 14:54:07 +02:00
locales feat(frontend): Phase 7 — vue-i18n wired up + login page translated 2026-05-08 14:54:07 +02:00
models feat(frontend): Phase 5f-i — inbounds page shell + list fetch 2026-05-08 13:28:15 +02:00
pages feat(frontend): Phase 7 — vue-i18n wired up + login page translated 2026-05-08 14:54:07 +02:00
utils refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules 2026-05-08 10:47:15 +02:00
inbounds.js feat(frontend): Phase 7 — vue-i18n wired up + login page translated 2026-05-08 14:54:07 +02:00
index.js feat(frontend): Phase 7 — vue-i18n wired up + login page translated 2026-05-08 14:54:07 +02:00
login.js feat(frontend): Phase 7 — vue-i18n wired up + login page translated 2026-05-08 14:54:07 +02:00
settings.js feat(frontend): Phase 7 — vue-i18n wired up + login page translated 2026-05-08 14:54:07 +02:00
xray.js feat(frontend): Phase 7 — vue-i18n wired up + login page translated 2026-05-08 14:54:07 +02:00