唯杰地图 logo唯杰地图
VJMAP
EN

locale-i18n

vjcad/references/setup/locale-i18n.md 3.7 KB92 行
原文

本文回答: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。

二、强制指定语言

// 方式一: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

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 完整片段

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