> **本文回答**：vjcad 内置 i18n，支持 `zh-CN` / `en-US`；可通过 `MainView({ locale })` 强制（唯一可靠的强制方式；`initLocale` 提前调用只经 localStorage 间接生效，会被 URL `?lang=` 覆盖）、URL `?lang=`、localStorage `vjcad-locale`、`navigator.language` 自动检测。运行时切换用 `setLocale()`，自定义文案用 `registerMessages()` + `t()`。

## 一、自动检测优先级

不设置 `locale` 时按以下顺序自动选语言：

1. `MainView` 构造参数 `locale`（最高优先级）
2. URL 参数 `?lang=`（支持模糊匹配 `en/en-US/EN` 都解析为 `'en-US'`）
3. localStorage 中的 `vjcad-locale`
4. `navigator.language`
5. 默认 `zh-CN`

MCP 参考：`vjcad/doc/guide/quick-start.md`。

## 二、强制指定语言

```js
// 方式一：MainView 构造参数（推荐）
const cadView = new MainView({
  appname: 'WebCAD',
  locale: 'en-US'      // 改成 'zh-CN' 强制中文
});

// 方式二（不可靠）：提前 initLocale——MainView 构造时会再执行 initLocale(config.locale)，
// 未传 locale 时重新检测（URL ?lang= > localStorage > navigator.language），
// 这里只是借 initLocale 写入的 localStorage 生效，URL 带 ?lang= 时即被覆盖
const { initLocale } = vjcad;
initLocale('en-US');
const cadView = new MainView({ appname: 'WebCAD' });
```

MCP 参考：`vjcad/doc/guide/quick-start.md`、`vjcad/example/basic/06locale.js`。

## 三、运行时 API

```js
import { setLocale, getLocale, registerMessages, t } from 'vjcad';

// 当前语言
console.log(getLocale());     // 'zh-CN' 或 'en-US'

// 切换语言（会保存到 localStorage、改写 URL ?lang= 并自动刷新页面）
// 注意：若 MainView 传了 locale，刷新后仍被构造参数强制——需要运行时切换就不要写死 locale
setLocale('en-US');

// 注册应用/插件级翻译
registerMessages({
  'zh-CN': { 'app.title': '我的 CAD 应用', 'app.ready': '引擎初始化完成' },
  'en-US': { 'app.title': 'My CAD App',     'app.ready': 'Engine initialized'  },
});

// 取值
console.log(t('app.title'));
console.log(t('app.ready'));
```

MCP 参考：`vjcad/doc/guide/quick-start.md`、`vjcad/example/basic/06locale.js`。

## 四、Playground 完整片段

```js
const { MainView, initCadContainer, getLocale, registerMessages, t, message } = vjcad;

registerMessages({
  'zh-CN': { 'demo.currentLang': '当前语言' },
  'en-US': { 'demo.currentLang': 'Current language' }
});

const cadView = new MainView({
  appname: 'WebCAD',
  serviceUrl: env.serviceUrl,
  accessToken: env.accessToken,
  locale: 'en-US'
});
initCadContainer('map', cadView);
await cadView.onLoad();

message.info(`${t('demo.currentLang')}: ${getLocale()}`);
```

MCP 参考：`vjcad/example/basic/06locale.js`。

## 反例

- `setLocale` 之后没刷新页面就期待 UI 立即更新：`setLocale` 会自动 reload——实现就是 `window.location.href = url?lang=xx` 整页导航（先写 localStorage 再赋值 href）。**自动化测试/脚本流程里绝不能调它**，一调当前页面上下文即销毁。
- 以为 `initLocale` 提前调用就能强制语言：`MainView` 构造时总会再执行 `initLocale(config.locale)`，未传 `locale` 时按 URL `?lang=` > localStorage > `navigator.language` 重新检测；提前 `initLocale` 只是借它写入的 localStorage 生效，URL 带 `?lang=` 即被覆盖。强制请用 `MainView({ locale })`。`initLocale` / `MainView` 每次都把结果写入 localStorage `vjcad-locale`，后续未指定时沿用。

## 参考（官方文档 MCP）

- 文档：`vjcad/doc/guide/quick-start.md`
- 示例：`vjcad/example/basic/06locale.js`
