
Joplin v1.4 拼写检查器功能全解从启用、语言切换到源码级实现原理【免费下载链接】joplinJoplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS.项目地址: https://gitcode.com/GitHub_Trending/jo/joplinJoplin 是一款以隐私为核心的跨平台笔记应用支持 Windows、macOS、Linux、Android 与 iOS。本篇文章围绕 readme/news/20201126-114649.md 所记录的 v1.4 拼写检查器Spell Checker发布内容展开系统讲解该功能的启用方式、两种编辑器富文本编辑器 TinyMCE 与 Markdown 编辑器 CodeMirror下的使用差异、语言管理与右键菜单的实战操作并结合仓库中的SpellCheckerService、原生驱动与设置定义等源码剖析其底层实现原理。读完本文你将能熟练配置 Joplin 的拼写检查并理解启用开关—语言选择—编辑器联动整条调用链是如何工作的。一、背景为什么拼写检查器是最受期待的功能拼写检查器是 Joplin 社区投票需求GitHub issue #275中获得 340 票的最高呼声功能于 v1.4 正式落地。根据原公告这项功能长期难以实现主要原因是 Joplin 使用了自研的富文本编辑器Rich Text与 Markdown 编辑器两套自定义编辑器而拼写检查必须与编辑器底层输入模型深度耦合直到 Electron 框架在相关能力上取得进展加上 Caleb John 对 Markdown 编辑器的改进才使该功能成为可能。从源码看这一框架依赖体现在两个层面底层拼写引擎由 Electron 提供桌面端通过packages/app-desktop/services/spellChecker/SpellCheckerServiceDriverNative.ts中的SpellCheckerServiceDriverNative直接调用 Electron session 的内建拼写检查 APIsetSpellCheckerLanguages、getSpellCheckerLanguages、addWordToSpellCheckerDictionary等并不自带词典数据。通用逻辑与编辑器解耦packages/lib/services/spellChecker/SpellCheckerService.ts中的SpellCheckerService定义了语言状态管理、历史记录、右键菜单等通用逻辑通过抽象驱动基类packages/lib/services/spellChecker/SpellCheckerServiceDriverBase.ts屏蔽平台差异。也就是说Joplin 将拼写检查策略与具体实现驱动分层SpellCheckerServiceDriverBase声明了availableLanguages、setLanguages、language、addWordToSpellCheckerDictionary等接口而桌面端驱动是 Electron 原生实现若未来有其他平台如移动端接入只需提供新的驱动即可。二、启用拼写检查器地球图标与 Tools 菜单在 v1.4 中启用或禁用拼写检查非常简单点击 Joplin 主窗口右上角的地球图标globe icon或者通过Tools工具菜单 → Spell Checker拼写检查器打开同一菜单在弹出的菜单中勾选Use spell checker复选框即可开启。菜单底部是Change language更改语言子菜单其中列出了操作系统 / Electron 提供的全部可用语言。由于某些操作系统上的语言列表可能非常庞大Joplin 会把最近选过的语言直接置顶展示在 Use spell checker 复选框下方方便快速切换回常用语言。从源码可以印证菜单的结构与交互命令声明位于 showSpellCheckerMenu.ts命令名为showSpellCheckerMenu图标为fas fa-globe——这正是地球图标的来源。菜单项由SpellCheckerService.spellCheckerConfigMenuItems()见 SpellCheckerService.ts构建其结构依次为Use spell checker复选框调用toggleEnabled()切换spellChecker.enabled设置→ 最近选择语言列表前面带分隔线→ 分隔线 →Change language子菜单每个语言一个复选框项点击调用setLanguage()。值得一提的是当拼写检查开启且已选择语言时工具菜单中的该项标题会动态显示当前语言例如 en, fr该逻辑由showSpellCheckerMenu的mapStateToTitle实现——它会读取spellChecker.languages设置去重语言代码前缀后用逗号拼接。三、语言选择机制与最近使用语言历史语言是拼写检查的核心配置。Joplin 的语言管理有几个关键行为默认语言为en-US若用户从未设置过语言spellChecker.languages为空数组SpellCheckerService.setupDefaultLanguage()会优先尝试使用驱动当前生效的语言若该语言不在可用列表内则回退到en-US。多语言可同时启用setLanguage()采用切换语义——若某语言已在启用列表中则移除否则追加多个语言可以同时勾选。最近选择历史每次选择语言都会写入 KvStore 的spellCheckerService.latestSelectedLanguages键历史上限为 5 条且已启用enabled的语言始终保留在历史中超过上限时才淘汰已禁用的语言见 SpellCheckerService.ts 中的addLatestSelectedLanguage与languagesHistorySizeMax 5。这些行为对应的持久化设置定义在 builtInMetadata.ts设置键类型默认值说明spellChecker.enabledBooltrue拼写检查总开关spellChecker.languageString旧版单语言设置已废弃spellChecker.languagesArray[]当前启用的语言代码列表如[en-US,fr]其中spellChecker.language已在 Setting.ts 中标记为被spellChecker.languages取代oldName→newName迁移映射。spellChecker.enabled的默认值为true但由于 Markdown 编辑器存在独立的 Beta 开关见下文新用户在 Markdown 编辑器中仍默认不会触发拼写检查。四、Markdown 编辑器 Beta 拼写检查的独立开关原公告特别强调即使勾选了 Use spell checkerMarkdown 编辑器中默认也不会进行拼写检查因为该编辑器下的功能处于 Beta 状态。原因在于为了让拼写检查生效Markdown 编辑器需要使用一种特殊模式contenteditable而该模式在过去曾引发过各种问题如光标位置不稳定、编辑内容偶发不保存或未反映到预览等。v1.4 中该模式已表现稳定但官方仍将其标记为 Beta。启用步骤打开General常规设置展开Show Advanced Settings显示高级设置勾选Enable spell checking in Markdown editor选项。对应源码中的设置定义为 builtInMetadata.ts 中的editor.spellcheckBeta设置键类型默认值适用范围说明editor.spellcheckBetaBoolfalse仅桌面端AppType.Desktop是否在 Markdown 编辑器中启用拼写检查Beta五、源码级原理解析拼写检查在两种编辑器中如何落地5.1 原生驱动Electron Session 层桌面端的全部拼写能力最终都落在 SpellCheckerServiceDriverNative.ts 上availableLanguages直接返回session().availableSpellCheckerLanguages由 Electron/系统提供语言列表setLanguages()会逐一校验语言先尝试原语言代码再尝试只保留语言部分languageCodeOnly若仍失败则尝试同语言的其他 locale 变体localesFromLanguageCode直到找到一个可被setSpellCheckerLanguages接受的值全部失败则跳过该语言传入空数组即可禁用拼写检查setSpellCheckerEnabled(effectiveLanguages.length 0)这是复用 Electron 官方行为见代码注释引用的 electron issue #25228该驱动还在initialize()中处理了一个 Electron 42 on Linux 的兼容性问题先以空语言集合初始化一次否则默认语言会被忽略。5.2 通用服务状态同步与右键菜单SpellCheckerService负责把设置状态同步给驱动applyStateToDriver()会在启用状态或语言列表变化时调用driver.setLanguages(...)——启用时传入语言列表禁用时传入空数组从而让 Electron 层开/关拼写检查。当用户右键点击拼写错误的单词时contextMenuItems()SpellCheckerService.ts会构建以下菜单项分词建议列表每个建议点击后通过replaceMisspelling命令替换单词若无建议则显示灰色不可用的(No suggestions)Add to dictionary加入词典调用driver.addWordToSpellCheckerDictionary()在 Electron 驱动中所有语言共享同一个词典。5.3 富文本编辑器TinyMCE默认即生效富文本编辑器默认开启浏览器拼写检查在 TinyMCE.tsx 中设置了browser_spellcheck: true。同时为了不干扰代码片段编辑器会对行内代码inline code显式禁用拼写检查——将spellcheck属性设为false见 TinyMCE.tsx 与 TinyMCE.tsx避免代码被误报为拼写错误。5.4 Markdown 编辑器CodeMirror依赖 Beta 开关Markdown 编辑器使用 CodeMirror 实现。拼写检查是否生效取决于editor.spellcheckBetaCodeMirror 5 版本中v5/Editor.tsx当editor.spellcheckBeta为真时编辑器采用contenteditable输入模式这是触发浏览器拼写检查的必要条件并显式设置spellcheck: true否则使用textarea模式浏览器拼写检查不生效。这正是原公告所说的必须启用特殊模式。CodeMirror 6 版本中v6/utils/useEditorSettings.tsspellcheckEnabled同样直接映射到editor.spellcheckBeta设置并作为EditorSettings传入编辑器。可以推断当前仓库中的 Markdown 编辑器始终保留默认关闭、需手动开启 Beta的设计这是为了避免contenteditable模式可能带来的编辑稳定性问题影响大多数用户。六、常见问题与使用建议勾选了 Use spell checker 但 Markdown 编辑器中仍无红色波浪线这是预期行为。请前往 General → Advanced Settings勾选 Enable spell checking in Markdown editor 后再试。语言列表太长、找不到想要的方言使用 Change language 子菜单搜索或直接在最近使用列表中选取——系统会记住你最近选择的语言最多 5 个。不想让代码块被检查富文本编辑器中 Joplin 已自动对行内代码关闭拼写检查Markdown 编辑器下建议对代码片段使用代码块语法以减少误报。关于 Beta 稳定性原公告提示Markdown 编辑器下的拼写检查依赖contenteditable特殊模式虽然当时未发现明显缺陷但若遇到光标错位、编辑未保存或预览不同步等问题可在论坛反馈Help → Joplin Forum。七、总结Joplin v1.4 的拼写检查器是一个典型的框架能力 应用层策略组合Electron 原生拼写检查提供了词典与语言数据SpellCheckerService负责语言状态、历史记录与菜单生成两套编辑器则各自通过设置项决定是否启用浏览器拼写检查。理解这条调用链后你不仅能在界面中熟练配置也能在排查拼写检查不生效问题时快速定位是开关未开、语言未选还是 Markdown 编辑器的 Beta 选项未启用。【免费下载链接】joplinJoplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS.项目地址: https://gitcode.com/GitHub_Trending/jo/joplin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考