cleanyourtv-app
Clean Your TV를 위한 커뮤니티 제작 모바일 앱
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗让中文用户用起 NovelAI 更顺手
在提示词框里打中文就能联想英文标签,英文标签附上中文释义,界面和教程也能切换成中文。
功能 · 安装 · 使用 · 参与标签翻译 · 已知限制 · 开发 · 数据来源与许可
非官方项目,与 NovelAI 及其开发商 Anlatan 无关。
同一份代码支持 Chrome、Edge 和 Firefox 扩展「NovelAI中文化助手」,以及用户脚本「NovelAI 中文标签联想」(Tampermonkey / Violentmonkey)。标签词典和界面译文都打包在里面,联想和翻译在浏览器里完成,不收集个人信息(见隐私政策)。
, ,否则「长发,猫耳」会被当成一个标签。权重写法 1.2::标签:: 里的「:」也会转成 :。| 方式 | 从哪里装 | 要求 |
|---|---|---|
| Chrome 扩展 | Chrome 应用商店 | Chrome 111 或更新 |
| Edge 扩展 | Edge 加载项商店 | Edge 111 或更新 |
| Firefox 附加组件 | Firefox 附加组件站 | Firefox 140 或更新(安卓版 142) |
| 用户脚本 | novelai-zh-tags.user.js | Tampermonkey 或 Violentmonkey |
[!NOTE] 几种方式选一种,不要同时启用。应用商店里的 Chrome 扩展和从 Releases 手动加载的扩展 ID 不同,是两个扩展,换装时先移除原来那个。
需要 Chrome 111 或更新的版本。
从 Chrome 应用商店 安装,装好后刷新 NovelAI 页面。之后扩展会随应用商店自动更新。
novelai-zh-tags-版本-chrome.zip(Edge 用 -edge.zip,内容相同)并解压。chrome://extensions(Edge 是 edge://extensions),打开「开发者模式」,点「加载已解压的扩展程序」,选解压出来的文件夹。这样装的扩展不会自动更新。出新版时,下载新的 zip 覆盖到同一个文件夹,再在扩展页点刷新按钮。
Releases 里的 -chrome.crx、-edge.crx 是自签名的安装包:Windows 和 macOS 上的 Chrome 只接受应用商店签名的 .crx,拖进去会报 CRX_REQUIRED_PROOF_MISSING,它只适合通过企业策略部署,或在允许这类安装包的浏览器里使用。
需要 Edge 111 或更新的版本。
从 Edge 加载项商店 安装,装好后刷新 NovelAI 页面。之后扩展会随应用商店自动更新。
需要 Firefox 140 或更新的版本(安卓版 142)。
从 Firefox 附加组件站 安装,桌面版和安卓版都可以,装好后刷新 NovelAI 页面。之后附加组件会自动更新。
在 Releases 下载 novelai-zh-tags-版本-firefox.zip(-firefox.xpi 是同一个包,没经 Mozilla 签名,正式版 Firefox 装不上),打开 about:debugging#/runtime/this-firefox,点「临时载入附加组件」,选这个 zip。临时载入的附加组件在关闭 Firefox 后会被移除;正式版 Firefox 只能长期安装经过 Mozilla 签名的附加组件。
chrome://extensions 打开开发者模式),否则脚本不会运行。脚本管理器会定期检查 main 分支上的新版本并自动更新,也可以手动「检查更新」。1.3.0 及更早的版本没有更新地址,要手动升级一次:用新文件内容替换原脚本。
在提示词框里输入两个字以上的中文就会出现联想(NovelAI 只在片段长度为 2–20 个字符时请求联想,单字不会触发)。联想面板、点选和键盘操作都是 NovelAI 自己的,插入的是英文标签。含假名的日文输入原样交给 NovelAI 处理。
点提示词框标题栏右侧的「中」按钮,框下面会列出提示词里的每个标签和它的中文,再点一次关掉。基础提示词、负面提示词和角色提示词的框上都有这个按钮,开关对所有框生效,刷新后保持。扩展面板设置里的「中文对照」是同一个开关,在那里改也当场生效。
1.2::标签:: 和 {}、[] 会去掉,source#hug 这类动作标签按 # 后面的部分查,重复的标签只列一次。(标签:1.2)、((标签)),中文输入法打出的全角括号和逗号,粘在第一个负面标签前的 Negative prompt:,Danbooru 网页侧栏复制的 ? blue eyes 1.3m,标注工具带置信度的 long hair 0.845,用句号隔开的 vibrant. happy.,名和姓写反的角色名,「角色 from 作品」。artist:xxx 显示「画师」,year 2025 显示「2025年画风」,采样器、种子等参数显示「生成参数(不是标签)」。没有通用中文名的标签(3d、Love Live!)直接显示原名。worth quality、absurdes)用黄色显示正确写法的中文,鼠标停留时看正确写法,方便发现写错了。panda plushie 显示「熊猫·毛绒动物玩具」,flowers in vase 显示「花瓶里的花朵」。只用通用标签和常用词拼,人物、作品名不拼;拼出来的译名颜色稍淡,鼠标停留时有提示,仅供参考。artist: 的画师名、自然语言长句、冷门标签)暗着显示,可以到编辑器里补上译名。在左侧菜单最下方的语言选单里选 ZH,或在「用户设置 → 界面 → 界面语言」里选「中文」,切回 EN、JP 也在同一处。
data/ui-zh.json(见「更新界面译文」)。点工具栏上的扩展图标打开面板。面板大小固定,首页和设置之间切换时一个缩小淡出、一个放大淡入;提示消息出现在底栏,不会把面板撑高。
在 NovelAI 标签页上改设置,页面会自动刷新(中文对照不用刷新,当场生效)。没打开 NovelAI 时也能改,改动先存在扩展里,刷新或打开 NovelAI 页面时生效。
用户脚本没有面板,可以在 NovelAI 页面的控制台里改设置,刷新后生效(removeItem 恢复默认):
localStorage.setItem('nzh-tags', 'off') // 关掉中文标签
localStorage.setItem('nzh-community-auto', 'off') // 关掉社区译名的自动更新
localStorage.setItem('nzh-community-hours', '6') // 检查间隔改成 6 小时,可选 1、6、12、24、168
觉得某个标签的译名不准,或者用某个说法搜不到想要的标签,可以在 NovelAI Tag Editor 修改。它仿照 EhTagTranslation 的 EhTag Editor:
/正则/ 搜索。「显示」里的「未翻译」是还没有中文的标签,「社区修订」是改过的标签。/ 分隔),右边实时预览,「编辑日志」里是这个标签已生效的修改记录。只能改标签的译名和检索词,界面文案随版本发布。data/zh-community.tsv,扩展几小时内用上;没通过会写明原因。自己的修改审核到哪一步,在编辑器右上角菜单的「我的提交」里看;所有待审核的修改公开列在 审核页。location → 场景)也能显示中文和参与中文联想,不要求图片数。拉来的内容同样检查:必须含汉字、长度有限,不能有 < > 和网址;新标签名不能含逗号、|、大括号、方括号、#、:: 这类会影响提示词的字符。编辑器的代码和部署方法见 worker/。
.image-prompt-suggestions 面板结构,以及提示词框(data-prompt-input)和它上方标题栏的位置;界面汉化依赖 Turbopack 的模块注册方式和 languageNames、Localization、Session 这些导出名。NovelAI 改版后可能需要更新:界面汉化失效时语言选单里不再有中文、界面回到英文,标签联想不受影响。需要 Node.js 18 或更高版本;编辑器(worker/)的测试需要 Node.js 22.13 或更高版本。
npm run build # 生成 dist/ 下的脚本、更新用的 .meta.js、词典和繁简对照
npm test # 检索质量回归测试,用例在 scripts/search-cases.tsv
npm run test:popup # 扩展面板和设置同步的测试
npm run test:worker # 编辑器的测试
npm run crx # 打包 Chrome 扩展到 build/
node scripts/test.mjs 黑丝 刘海 # 查看某些词的联想结果
npm run build -- --refresh # 重新下载上游词典
npm run crx 输出:
build/extension/:解压的扩展,manifest 带公钥,「加载已解压的扩展程序」时扩展 ID 固定。build/novelai-zh-tags-版本-chrome.zip:上架 Chrome 应用商店用的压缩包(不含公钥)。-edge.zip 内容相同,上架 Edge 加载项商店。build/novelai-zh-tags-版本-chrome.crx、-edge.crx:用私钥签名的安装包。build/firefox/ 和 build/novelai-zh-tags-版本-firefox.zip(.xpi 同内容):Firefox 版,内容和 Chrome 版相同,manifest 里多了附加组件 ID(novelai-zh-tags@azusamoe)、最低版本和「不收集数据」的声明。签名私钥第一次打包时生成在 .keys/novelai-zh-tags.pem(已在 .gitignore 里),也可以用环境变量 CRX_KEY 指定。扩展 ID 由私钥决定,换了私钥就成了另一个扩展,请备份好。
上架用的介绍文字、截图、宣传图和隐私权一栏的填法在 store/,隐私政策见 PRIVACY.md。面板的首页与设置分层参考了 EhSyringe。
data/zh-override.csv:标签,译名,替换某个标签的显示译名(修正错误翻译),优先级最高。data/zh-curated.csv:标签,译名,补充检索词,审定结果。译名留空表示只补检索词;检索词用 / 分隔,前面加 - 表示删掉一个错误的检索词(如 fear_kubrick,,-害怕侧目)。data/zh-extra.csv:标签,词1/词2,追加检索词(俗称、简称),不改变显示内容。词表里没有的标签也会收录,比如 NovelAI 的质量词 masterpiece。data/zh-words.csv:英文,译名/检索词,提示词里常写、但不是 Danbooru 标签的描述词(dramatic、cinematic lighting),让中文对照也能显示中文,检索时排在标签后面。已经是标签或 Danbooru 别名的词构建时会提示删掉;译名完全相同的写法只在检索里出一条。译名写成 =标签 表示是已有标签的另一种写法(1 girl,=1girl)。写成 ?标签 表示常见的拼写错误(worth quality,?worst quality),对照里用黄色显示正确写法的中文(鼠标停留时看正确写法),不当成别名。data/novelai-rename.csv:Danbooru新名,NovelAI用的名字,NovelAI 不认识新名字时输出旧名字。data/zh-new.csv:tag,category,aliases,zh,count,列与来源数据相同,收录 Danbooru 上有、来源数据里没有的标签(检索词用 | 分隔)。来源数据以后有了同一个标签时以来源数据为准。标签用 Danbooru 写法,空格或下划线都可以,别名会自动归并到正式标签。改完后运行 npm run build 和 npm test。
data/ui-zh.json 每行一条 "路径": ["英文", "中文"],路径对应 NovelAI 文案对象的键(如 image.undesiredContent)。中文留空表示还没翻译,和英文相同表示有意保留英文,这两种都按英文显示。[0]、[1] 是 NovelAI 填入数值的占位符,译文里要原样保留,npm test 会检查。
data/ui-zh-hard.json 是写死在页面代码里的文字,每行一条 [[原文片段...], [译文片段...]]。片段是一个元素里按顺序排列的全部文本节点,译文片段个数必须和原文相同,加粗、链接落在对应位置的片段上,不需要的片段写空字符串。名字、数字这类动态内容在原文和译文的同一位置写 null,显示时保持原样。
NovelAI 更新后文案会增减,用下面的命令对照线上版本:
node scripts/ui-strings.mjs # 列出新增(+)、删除(-)、英文改动(~)的条目,以及代码里找不到的写死文字(?)
node scripts/ui-strings.mjs --write # 同步到 data/ui-zh.json:新增条目中文留空,英文改动的保留旧译文,需要复核
node scripts/ui-strings.mjs --untranslated # 列出中文还空着的条目
main 分支就是用户脚本自动更新的来源:脚本或词典有改动时,要先把 package.json 的 version 调高再构建,否则脚本管理器不会推送更新。CI(.github/workflows/ci.yml)在每次推送和 PR 时构建、跑测试,并检查 dist/ 是否已重新构建、版本号是否已调高(本地可以运行 node scripts/check-version.mjs origin/main)。
把调高了版本的提交合并到 main 后,推送同名标签(如 git tag 1.7.1 && git push origin 1.7.1):.github/workflows/release.yml 会构建、跑测试,发布 GitHub Release,附上用户脚本,以及 Chrome、Edge 的 -chrome.crx/.zip、-edge.crx/.zip 和 Firefox 的 -firefox.zip/.xpi。
gh secret set CRX_PRIVATE_KEY < .keys/novelai-zh-tags.pem。package.json 里的 nzh.extensionId,对不上就失败,不会悄悄换掉扩展 ID。中文联想:NovelAI 对含汉字或假名的输入片段会以 lang=jp 请求 image.novelai.net/ai/generate-image/suggest-tags,返回 [{jp_tag, en_tag, power}],面板显示「英文标签 + 本地语副标题」,点选后插入英文标签。脚本拦截 fetch:只含汉字、不含假名的请求改由内置中文词典应答,并把中文放在 jp_tag 里,所以显示、点选和键盘操作都走 NovelAI 自己的逻辑。本地词典查不到时回退到 NovelAI 自带的日文匹配,能翻译的副标题也换成中文。英文输入的联想通过 MutationObserver 在每一项下补一行中文。
输入法:NovelAI 拼查询串时用的是「光标前的旧文本 + 新输入」。微软拼音这类会把拼音写进编辑器的输入法,上屏时查询会变成 luo'li萝莉。所以脚本不用请求里的 prompt 参数,而是读取光标前的实际文本作为片段。组字过程中触发的联想先挂起,上屏后再按实际文本回答,选字时停顿不会冒出拼音的乱联想。
中文对照:每个提示词框是带 data-prompt-input 的元素,里面是 ProseMirror 编辑器。脚本在框上方的标题栏里加按钮、在框后面加对照面板,把编辑器每段的文字按逗号、|、顿号和 :: 切开后查词典。不往编辑器里插任何元素,ProseMirror 不受影响;点对照项时设置页面的选区,ProseMirror 会同步成自己的选区。
检索:按「精确 > 前缀 > 包含 > 宽松(字间最多隔 3 个字)」匹配,再结合 Danbooru 使用次数综合排序。繁体字按 OpenCC 的对照表逐字转成简体后再检索。词典约 7.8 万条,在生图页空闲时解析,从其他页面切过来时在提示词框获得焦点时解析。Node 下实测解析约 0.25 秒,单次检索约 4 ms。
界面汉化:NovelAI 的界面文字都来自一个英文文案对象,日文是在它上面合并一份日文覆盖,再由 Localization atom 按账号设置的 uiLanguage 算出当前文案。NovelAI 用 Turbopack 打包,脚本在页面脚本加载前接管 globalThis.TURBOPACK,在模块注册导出时给语言表 languageNames / languageIcons 加上中文,并让 Localization atom 在 uiLanguage 为 zh 时把中文合并到算好的文案上,没翻译的条目保持英文。保存设置(PUT /user/clientsettings)时把 zh 换成 en、在 localStorage 记下选的是中文,读取账号数据(GET /user/data)时再换回 zh。没登录时 NovelAI 不走这两个接口,设置直接存在 localStorage 的 noAccountSettings 里,扩展面板开关中文界面时直接改其中的 uiLanguage。
写死的文字:教程等写在组件里的文字不经过文案对象,界面为中文时直接在页面上替换:一个元素里按顺序排列的全部文本节点(加粗、链接把一段话切开的地方)和原文完全一致时,换成同样个数的中文片段。只改文本节点的内容,不动元素结构,React 照常更新;编辑器和输入框里的文字不处理,切回其他语言时还原。
data/zh-curated.csv:在此基础上的审定结果,涉及 8,341 个标签(通用 5,407、角色 2,447、作品 469、元标签 18)。
data/zh-override.csv。data/zh-new.csv:2026 年 10 月 Danbooru 上图片数 50 以上、来源数据里却没有的标签,共 2,687 个(通用 882、角色 1,506、作品 288、元标签 11),多是 2025 年以后新出现的,或是 Danbooru 改了名的(如 cum pool → cum puddle、tokyo (city) → tokyo),也有来源数据漏掉的老标签(如 prepuce)。
data/zh-ehtag.csv:EhTagTranslation 的人工译名,对齐到 Danbooru 标签后作为补充检索词,共 2,032 条,如 dark skin「黑皮」、school swimsuit「死库水」。qipao 已在 data/novelai-rename.csv 里换回 china_dress。data/zh-words.csv:不是 Danbooru 标签、但提示词里常写的约 3,800 个英文词和短语(氛围、画风、光影、构图、负面提示词、身体和服装描写等,含成人向内容),另有约 120 个常见拼写错误,从 和 提示词语料的高频词里挑选,由 Claude 翻译,没有经过人工校对。NovelAI 语料里查不到中文的高频短语都过了一遍:画师名、夹着句号或权重数字的残片不收,把未成年人和性内容放在一起的也不收。| 用途 | 来源 | 许可 |
|---|---|---|
| 译名、别名、使用次数 | ame-la/danbooru-tags-data-zh(GitHub) | MIT |
| 补充检索词 | EhTagTranslation/Database | CC BY-NC-SA 3.0 |
| 补充检索词和旧标签译名 | byzod/a1111-sd-webui-tagcomplete-CN | MIT |
| 旧标签名(用于识别改名) | DominikDoom/a1111-sd-webui-tagcomplete | MIT |
| 英文别名(提示词里写 peace sign、sparkles 也能查到中文) | Danbooru 现行的标签别名表 | — |
| 繁简对照 | BYVoid/OpenCC 的 TSCharacters.txt | Apache-2.0 |
审定时参考了标签超市(AGPL-3.0),但没有把它的数据并入词典。
[!IMPORTANT]
data/zh-ehtag.csv和data/zh-curated.csv含 EhTagTranslation 的派生内容,内嵌这些数据的dist/novelai-zh-tags.user.js、Chrome 扩展和 Firefox 附加组件也一样,因此按 CC BY-NC-SA 3.0 提供:转发需署名,不得商用,修改后须以相同许可发布。自己使用不受影响。
(tag:1.2)、((tag)))、中文输入法的全角括号逗号、零宽空格、粘在第一个负面标签前的 Negative prompt:、Danbooru 网页侧栏的 ? blue eyes 1.3m、标注工具的 long hair 0.845、用句号或括号连写的几个标签、名和姓写反的角色名、「角色 from 作品」。artist:xxx 显示「画师」,year 2025 显示「2025年画风」,采样器、种子等显示「生成参数(不是标签)」,BREAK 显示「分段(SD 语法)」。没有通用中文名的标签(3d、Love Live!)也算认得出来,不再暗着显示。artist: 的画师名、拼写错误、长句和少数人反复用的句子。