floorplan-3d 三语国际化实现:简繁英切换如何不用框架轻量搞定(附 OpenCC 用字表技巧)
floorplan-3d 三语国际化实现简繁英切换如何不用框架轻量搞定附 OpenCC 用字表技巧【免费下载链接】floorplan-3d项目地址: https://gitcode.com/gh_mirrors/fl/floorplan-3dfloorplan-3d 是一个纯前端的户型装修设计工具支持在 2D 平面图上摆家具、拆墙体并一键切换 Three.js 3D 场景。它的顶栏提供「简 / 繁 / EN」三语一键切换且完全不依赖任何国际化框架。本文将拆解这套无框架的三语国际化方案并分享其中用 OpenCC 生成「用字表」实现简繁转换的实用技巧帮助你快速在自己的项目里复刻。1. 项目速览一个 index.html 的装修工具floorplan-3d 的全部代码只有一张 index.html约 2600 行无需构建浏览器打开即用2D 平面布置按 1:60 / 1:100 比例显示户型拖拽 60 余种家具可测量、拆改非承重墙3D 场景鸟瞰 / 第一人称漫游日照滑块、夜景灯光方案统计房间面积、地面材料造价估算、导出 PNG / JSON界面语言切换按钮就藏在顶栏右侧选择会被记住默认简体中文。详见 README.md 的「方案与统计」一节。上面这行不是图片——它指向的正是按钮源码位置。整个仓库没有图片资源本文以源码定位代替截图。2. 无框架三语切换的整体思路 没有 Vue i18n、没有 react-intlfloorplan-3d 只用三个约定就把简 / 繁 / 英三种语言跑通了全部集中在 index.html#L346-L384机制服务对象实现data-en属性静态文案按钮、菜单HTML 上直接标注英文中文取 DOM 原文tr(zh, en)函数动态文案提示语、统计面板三元表达式选中文案s2t()转换 NAMES_EN词典房间名、家具名等专有名词简体逐字转繁体 / 查英文词典语言状态只有一行从localStorage读取键huxing-lang取值限定在[zh, zht, en]之内见 index.html#L347-L349。无效值自动回落到中文——零配置、零依赖、刷新后还记得你选了哪种语言。2.1 静态文案data-en 属性标注法顶栏按钮的写法长这样index.html#L263-L268button classbtn chip on>const tr (zh, en) LANG en ? en : LANG zht ? s2t(zh) : zh;注意这个三参函数其实一鱼三吃英文取en繁体不写第二份文案而是从简体实时转换——这正是省掉一整份繁体翻译文件的关键。2.2 动态文案tr() 双参函数运行时生成的内容如「已标记拆除 880 mm 墙体」这类拼接字符串无法预先写进 HTML就直接在模板里调用tr(中文, 英文)例如 index.html#L1094 的墙体拆除提示。新写一条文案时顺手带上英文风格统一、不需要额外的 JSON 语言包文件。2.3 专有名词NAMES_EN 查表 s2t() 兜底房间名、家具名、地面材料存在户型数据里如「主卧飘窗」「水磨石」。英文界面下查 index.html#L356-L375 的NAMES_EN词典用户自己改过的名称原样显示不强行翻译。繁体界面则统一走s2t()逐字转换连用户自改的名字也不会显示错用字。3. 核心技巧OpenCC 用字表做轻量简繁转换 ✨直接用 OpenCC 的完整转换库会引入几百 KB 的映射数据对一个单文件应用太重。floorplan-3d 的解法是离线用 OpenCC 的 s2tw简→台繁转换只提取本页实际用到的字生成一张「用字表」index.html#L350-L353// 表由 OpenCC s2tw 按本页用到的字生成 const S2T new Map(与與两兩个個为為书書….match(/../gu).map(p [...p]));要点有三按需裁剪全量简繁对照有数千条本页只保留实际出现的几百个字符对字符串内联在 HTML 里几乎不占体积逐字查表s2t()对每个\u3400-\u9fff汉字查Map查不到就原样保留天然安全词级优先像「布置→佈置」「台面→檯面」「复制→複製」这类一字多义、单字转换会翻车的词放在S2T_PHRASES里先整词替换再逐字查表index.html#L351-L353。这就是「OpenCC 用字表」技巧的完整配方把 OpenCC 当离线翻译工具而非运行时依赖既拿到专业级转换质量又只背上几 KB 的表。4. 一键切换setLang() 如何做到全局生效点击顶栏任意语言按钮后index.html#L1495-L1502 的setLang()按固定顺序刷新一切function setLang(l){ LANG l; try { localStorage.setItem(LANG_KEY, l); } catch(e) {} applyStaticLang(); syncFullscreen(); syncModeHint(); syncPaneBtns(); buildLib(); renderOpenings(); renderAll(); $(#tip).textContent TIPS()[viewMode]; window.View3D?.relang(); }思路是「状态变了就重渲染」静态文案回填 → 2D 图层重绘 → 家具库 / 房间列表重建 → 3D 场景通过relang()单独更新。所有文案入口都收敛在tr()/nm()两个函数里切换时不存在遗漏。5. 新手复刻清单4 步在自己的项目里实现三语 定状态一个LANG变量 localStorage持久化语言列表如[zh,zht,en]标静态HTML 元素上写data-en需要的话再加data-en-title处理提示语中文保留在标签内管动态所有运行时文案统一过tr(zh, en)别在模板里散落 if/else转简繁用 OpenCC s2tw 离线导出你项目用到的字做成Map用字表多义词先词级替换再逐字查表。整个方案的代码量不到 60 行且全部集中在 index.html 的多语言区块index.html#L346-L384。小结floorplan-3d 证明了中小规模的前端国际化不一定要引入框架和语言包。data-en 标注 tr() 双参函数 OpenCC 用字表这三件套就能在单文件应用里轻松支撑简体 / 繁體 / English 三语切换选择自动记忆、专有名词不失真、繁体零额外翻译成本。如果你也在维护无构建的轻量项目这套思路值得直接抄作业。【免费下载链接】floorplan-3d项目地址: https://gitcode.com/gh_mirrors/fl/floorplan-3d创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Godot BoneAttachment3D 节点详解:将子节点绑定到骨骼与覆盖骨骼姿态的完整指南

Godot BoneAttachment3D 节点详解:将子节点绑定到骨骼与覆盖骨骼姿态的完整指南

文档教程游戏开发 【免费下载链接】godot-docs Godot Engine official documentation 项目地址: https://gitcode.com/GitHub_Trending/go/godot-docs 点击查看 免费下载 导读 BoneAttachment3D 是 Godot 引擎中连接「骨骼动画世界」与「场景节点世界」的关键节点…

2026/10/4 11:10:44 阅读更多 →
Omega算法:加速度转速度的频域积分标准解

Omega算法:加速度转速度的频域积分标准解

1. 为什么传统数值积分在加速度转速度时总是“抖”得厉害?我第一次在振动台试验数据处理中遇到这个问题,是在给某型工业电机做模态分析的时候。客户提供的加速度传感器原始数据采样率是2048 Hz,看起来很干净——但只要用经典的梯形法&#xf…

2026/10/4 11:10:44 阅读更多 →
GPUStack 缓存服务(Cache Service)管理指南:共享 KV Cache、混合注意力模型与自定义 Provider 配置

GPUStack 缓存服务(Cache Service)管理指南:共享 KV Cache、混合注意力模型与自定义 Provider 配置

后端人工智能模型推理服务集群管理可观测性 【免费下载链接】gpustack A GPU cluster manager for high-performance AI model serving (vLLM, SGLang) and on-demand SSH-accessible GPU instances. 项目地址: https://gitcode.com/gh_mirrors/gp/gpustack 点击查看…

2026/10/4 11:09:44 阅读更多 →

最新新闻

弱网络测试全攻略:从指标拆解到工具选型与用例设计

弱网络测试全攻略:从指标拆解到工具选型与用例设计

两年前我在负责一个工具类App的版本测试,上线第三天陆续收到用户反馈:地铁里打开App,转圈转了快二十秒,最后弹了个"网络错误",再点还是错。开发在自己百兆光纤上怎么都复现不了,后来查日志才发现…

2026/10/4 13:18:45 阅读更多 →
插件机制全解析:从加载失败排查到插件体系设计

插件机制全解析:从加载失败排查到插件体系设计

1. 插件到底在解决什么问题:一个被说到烂却没说透的概念先说个真实经历。我早年间维护一个内部报表系统,业务部门三天两头提需求:这个字段要加一列、那个导出格式要调整、下周要接一个新数据源。每次改完上线,测试、发布、通知用户…

2026/10/4 13:18:45 阅读更多 →
插件系统原理与加载失败排查:从清单到激活的完整指南

插件系统原理与加载失败排查:从清单到激活的完整指南

1. 三个真实场景:插件在什么时候会找上门来1.1 嵌入式开发者的疑惑:IAR plugins 是干什么的先说我在社区里看到的第一个高频问题:“IAR plugins 是干什么的”。问这个问题的多半是用 IAR Embedded Workbench 做嵌入式开发的新手,某…

2026/10/4 13:18:45 阅读更多 →
百度Create大会深度解读:AI Agent与多模态模型如何重塑未来?TaoToken统一Key接入实战

百度Create大会深度解读:AI Agent与多模态模型如何重塑未来?TaoToken统一Key接入实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 13:18:45 阅读更多 →
用OpenClaw打造GitHub PR自动化审查助手:TaoToken统一Key接入AI代码审查流水线

用OpenClaw打造GitHub PR自动化审查助手:TaoToken统一Key接入AI代码审查流水线

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 13:18:45 阅读更多 →
Unsloth 微调 Qwen3 实测:显存减少 70% 的 128K 长上下文配置怎么调

Unsloth 微调 Qwen3 实测:显存减少 70% 的 128K 长上下文配置怎么调

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 13:17:45 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →