Skip to content

✨ GM_info 新增 userLanguage,暴露脚本猫当前界面语言 - #1799

Open
CodFrm wants to merge 1 commit into
mainfrom
feat/1018-gm-info-user-language
Open

CodFrm wants to merge 1 commit into
mainfrom
feat/1018-gm-info-user-language

Conversation

@CodFrm

@CodFrm CodFrm commented Oct 20, 2026

Copy link
Copy Markdown
Member

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

背景

#1018 希望脚本能直接拿到用户在脚本猫里设置的界面语言,按它决定脚本自身的显示语言,而不必每个脚本各自做一个语言选项。

本次改动

GM_info 新增 userLanguage: string,值为脚本猫当前界面语言(SystemConfig.getLanguage() 的解析结果,如 "zh-CN"、"en-US"、"ja-JP";设置为「自动」时即自动匹配出的语言)。三条执行路径都覆盖:

  • 页面脚本:SW 在 getScriptsForTab 组装 envInfo 时带上语言,随 pageLoad 下发。
  • 早期脚本(@early-start):与 isIncognito 相同的模式——同步执行时页面环境尚未到达,值为 "";updateEarlyScriptGMInfo 收到 envInfo 后补上真实值(CAT_scriptLoaded() 之后可读到)。
  • 后台/定时脚本与 skill 脚本:沙盒 Runtime 记录 setSandboxLanguage 收到的语言,构造 BgExecScriptWarp 时传入。

类型声明 scriptcat.d.ts / scriptcat.zh-CN.d.ts / 编辑器用 scriptcat.d.tpl 同步新增字段。

实现考虑

  • 字段命名:issue 提议 user_lang,这里采用 userLanguage,与 GM_info 现有字段(isIncognito、userAgentData、scriptHandler)的 camelCase 风格一致。若维护者倾向 issue 原名,改名只涉及类型声明与 gm_info.ts 一处取值。
  • 取值时机:GM_info 是脚本启动时的快照。切换语言后,页面脚本在下次加载页面时生效,后台/定时脚本在下次执行时生效(每次执行都会新建 BgExecScriptWarp),已在运行的实例不会被改写。
  • 启动顺序:handlePreparationOffscreen 改为先发布 setSandboxLanguage 再发布 enableScripts。原顺序下语言之所以能先到沙盒,只是因为 offscreen 处理 enableScripts 时先 await 了一次 SW 往返;现在由发布顺序直接保证,浏览器启动即运行的后台脚本也能读到语言。

已知限制

  • 值只会是脚本猫支持的界面语言之一。浏览器语言是脚本猫未翻译的语言时,这里返回的是脚本猫实际回退到的语言;需要浏览器原始语言的脚本仍应读 navigator.language。
  • 早期脚本同步读取时为 ""(见上)。
  • 文档站(scriptcat.org)的 GM_info 说明不在本仓库,未同步更新。

验证

均在 4dc6613a(基于 main 58309d5e)上执行:

  • 新增 7 个用例(SW envInfo 带语言、GM_info.userLanguage 取值、早期脚本更新、BgExecScriptWarp 取值、沙盒传参 ×2、语言先于 enableScripts 发布),实现前全部失败、实现后通过。
  • pnpm exec vitest run --no-coverage 受影响的 7 个文件(SW/沙盒 runtime、exec_script、exec_warp、gm_api、offscreen base、script_executor):165/165 通过。
  • pnpm run lint:通过(prettier、tsc、check:i18n、check:issue-templates、eslint)。
  • CI=true pnpm run test:ci 全量:5001/5003 通过,失败 2 个是 src/pages/ 下与本改动无关的 UI 用例 850ms 超时(SettingsPane.test.tsx、NetworkRules/index.test.tsx),单独重跑 55/55 通过。本机当时负载很高(load avg 25~50),三次全量跑每次超时的 UI 文件都不同,未改动的 main 在同样条件下也有不同的 UI 文件超时。不带 CI=true 时,fast 项目单 worker 共享 VM 会出现大量与顺序相关的失败,main 上同样存在,不作为本 PR 的证据。
  • 构建版扩展(pnpm run build)+ 一次性 Playwright 脚本(未入库),Chromium:
    • 页面脚本:默认 zh-CN;在设置页切到日本語后刷新 → ja-JP
    • 早期脚本:同步读取 "",CAT_scriptLoaded() 后为 zh-CN,切换后为 ja-JP
    • 后台脚本:设置为 Deutsch 后启用 → GM_setValue 写入 de-DE
  • 未在 Firefox 上运行。

关联

Close #1018

@cyfung1031

Copy link
Copy Markdown
Collaborator

竟然有這個了!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] GM_info 增加 user_lang option

2 participants