locale-i18n
本文回答:vjcad 内置 i18n,支持
zh-CN/en-US;可通过MainView({ locale })强制(唯一可靠的强制方式;initLocale提前调用只经 localStorage 间接生效,会被 URL?lang=覆盖)、URL?lang=、localStoragevjcad-locale、navigator.language自动检测。运行时切换用setLocale(),自定义文案用registerMessages()+t()。
一、自动检测优先级
不设置 locale 时按以下顺序自动选语言:
MainView构造参数locale(最高优先级)- URL 参数
?lang=(支持模糊匹配en/en-US/EN都解析为'en-US') - localStorage 中的
vjcad-locale navigator.language- 默认
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每次都把结果写入 localStoragevjcad-locale,后续未指定时沿用。
参考(官方文档 MCP)
- 文档:
vjcad/doc/guide/quick-start.md - 示例:
vjcad/example/basic/06locale.js