--- jd-id: "01.06" name: "src-locales" desc: "vue-i18n message bundles. Two locales (`en`, `zh-CN`) mirrored as parallel trees; English is the source. Locale resolves from `localStorage('preferred-locale')` → browser language → `en`." author: "Clark Lin" updateTime: "2026-07-06" status: active type: "A-高层系统" tags: - 前端 - i18n - vue-i18n --- ## Layout ``` src/locales/ ├── index.js # vue-i18n setup (legacy: false), locale resolution, message merge ├── en/ │ ├── index.js # Aggregates en/* into a single message object │ ├── common/ │ │ ├── buttons.js │ │ ├── messages.js │ │ ├── status.js │ │ ├── table.js │ │ └── validation.js │ ├── components/ │ │ └── app-header.js │ └── modules/ │ ├── auth.js │ ├── navigation.js │ ├── settings.js │ ├── story.js │ ├── student.js │ ├── subject.js │ ├── task.js │ └── term.js └── zh-CN/ ├── index.js ├── common/... ├── components/app-header.js └── modules/... ``` --- ## Conventions - **English is the source locale.** Mirror every new key into `zh-CN` in the same shape. - Use `$t(...)` in templates and `const { t } = useI18n()` inside `