Repository navigation
译文跟上中文原文 650 条:en/vi 全书对齐,长文补三篇 - #66
Closed
streamentry wants to merge 26 commits into
Closed
streamentry wants to merge 26 commits into
streamentry wants to merge 26 commits into
Conversation
检索页从一份变三份:`/en/`(默认,访问 `/` 就是它)、`/zh/`、`/vi/`。
根目录的 `index.html` 变成跳语言的小页,按浏览器语言去 `/en/` 或 `/vi/`,
关掉 JavaScript 也能自己点。页头有语言切换,换语言时当前的筛选和定位一起带过去。
**中文正文仍在仓库根**:README.md、book/、docs/ 一个文件都没挪。zh 页面读的就是根上
那一份,所以作者改的还是原来那些路径,GitHub 渲染的还是仓库根的 README。
en/ 和 vi/ 各自有 README.md、book/、docs/,是那一种语言的副本。
页面从一份源码生成:`tools/site/page.template.html` 是模板(原 index.html 移过来的),
`tools/site/locales/<code>.json` 是界面文案,`node tools/site/build.mjs` 生成三份页面
加根目录那个跳语言页。生成物入库是为了让 Pages 直接发;改页面改模板和字典。
数字不再写死在页面源码里。模板和三份字典里写 `{{entries}}` 这类占位符,由
`tools/site/build.mjs` 从 `tools/site/stats.json` 填——三种语言共用一份数字,
谁也不会和谁差。`sync-stats.mjs` 写完 stats.json 会跑一次 `build.mjs --check`,
页面没跟着重建就拦提交。
译文这一层不需要作者审。`tools/i18n/check.mjs` 拿中文原文逐条对译文:节数条数、
六个字段的有无与顺序、**成本标签注释逐字照抄**、证据等级、争议与待核实的条数、
收益/成本/来源三栏里的每一个数字、交叉引用的条号节号、来源与备注里的链接数量。
量级词换算(中文「167 万」在英文里只能写成 1,670,000)单独放行,其余数字对不上就是错。
`split.mjs` / `join.mjs` 按节切块、逐块校,和 check 共用同一份判据(structure.mjs)。
要求本身写在 `tools/i18n/BRIEF.md`,人看的版本,提示词直接取它。
CI 加「译文检查」job(译文对齐 + 生成物一致 + 中文文案和模板一致),独立于 build:
译文没对齐不该连累 EPUB、PDF 和离线单文件的发布。
顺带:域名和仓库地址收到 tools/site/site.json 一处(README、检索页、sitemap、
robots 都从它来,改域名只改一处);长文的第四处链接(页头那行)改成从 README
导航表生成,不用手工挂了;离线单文件按语言出(`--locale <code>`);
EPUB/PDF 的 README 解析改成认各语言标题,新增语言不用改脚本。
已翻:英文第 1、2 节和 5 篇长文 + README;越南文第 1 节。剩下的节在
`tools/i18n/split.mjs --all --locale <code>` 的进度里,翻完 CI 会自动带进页面。
CLAUDE.md「翻译一律不合进本仓库」那条改了:译文现在入本仓库,但作者只维护中文,
机器查结构,官方那两种语言不接受外部 PR 改。
Pages 原来配的是 build_type: workflow,但仓库里没有任何 Pages workflow, 所以站点从来没被发布过。改成分支发布(main 根目录),.nojekyll 已在根上, Pages 原样发仓库内容。 域名从 eternity4719.github.io 换成 streamentry.github.io。原先散在 build.mjs、locales.json、page.template.html 和生成物里各抄一遍, 换域名要改十四个地方,漏一处就发出一批指向别处的链接。现在只有 tools/site/site.json 的 site 和 repo 两个值:locales.json 的 canonical 和 repoBlob 由它们推出,build.mjs 每次逐个对一遍,对不上直接抛错; sitemap.xml 和 robots.txt 也由构建生成,不再手工维护(原来的 sitemap 列的是 README.md,两份语言页一个都没有)。 没翻完的语言不生成页面,也不出现在 hreflang、跳语言页和页内语言下拉里, 免得给读者一个点进去是 404 的入口。眼下 vi 只翻了 1/34 节,所以页面上 暂时没有越南语;翻完重跑构建自己回来。README 里跟读者看的链接 (在线页、下载、文件链接)跟着域名走,git clone、署名和 Star History 那三处仍然指向上游 eternity4719——它们说的是这本书的出处。 新增 CI 的「检索页检查」job 跑 tools/site/build.mjs --check,和另外 三个检查一样只查不改、不挡电子书发布。 顺带修一个刚暴露的 bug:renderPage 用 PUBLISHED.includes(L) 判语言, 但别的脚本从 tools/site/locales.mjs 拿的是同一份 JSON 的另一个对象, 离线单文件和 PDF 构建因此拿到 null 直接崩。改成按 code 比。
根目录那个小页原来把三种语言都写死在 hreflang 里,越南文那份还没翻完, 链接指过去就是一个 404——比不列更糟。改成从 PUBLISHED 生成:README 在的 那种才出现在链接和 hreflang 里,翻完重跑 tools/site/build.mjs 自己回来。 跳转表现在只按 accept 排已发布的那几种,命中不了回默认那种,?lang=xx 可以指定。 sitemap.xml 也改成由构建生成(原来手写的,域名单独抄了一份、三种语言页一个都没有), 每条带 xhtml:link 互指:三种语言是同一本书的三种语言,搜索引擎靠这个知道, 不然会把它们当成三本不同的书。
页面左上角的标题(logo)点下去跳到 /en/en/,404。 原因是 tools/site/build.mjs 把模板里的 href="./" 改写成了 L.dir,也就是 「en/」这种相对路径。可这一页自己就装在 /en/ 目录里,浏览器拿 /en/ 当基准 去解析 en/,拼出来就是 /en/en/。zh 那份是同一个毛病,点过去是 /zh/zh/, 只是没人报。 改成 L.canonical(本站这一页的绝对地址)。不用相对路径,因为相对路径只在 「相对谁」不变时才成立,而这里相对谁恰恰会变:en 那份在 /en/、zh 那份在 /zh/。L.contentBase 也不能拿来顶,它是给正文文件用的(en 是 "./"、 zh 是 "../"),拿来做 logo 会让 zh 直接跳出本站。canonical 由 site.json 推出来,和 hreflang、canonical 标签同源,以后改域名会一起跟着走。 离线单文件构建里那行对应的改写跟着去掉:它本来把 L.dir 换成线上地址, 现在 logo 一开始就是绝对地址,不用再换。点 logo 跳线上看更新这个作用不变。 Co-authored-by: j <hong@cloudjetkpi.com>
vi/README.md 之前一直没入库,所以 vi 一直没进 PUBLISHED——构建跳过它, 页面上没有越南语入口(这是有意的:宁可没有,也不要一个点进去是 404 的链接)。 它现在入库了,vi/index.html 也跟着生成。 vi/README.md 的目录列了全部 34 节,正文目前翻到 1 节。构建把目录里列着、 正文还没有的那些节排除在页面之外(这次 66 项),不会 404;英文那边也是 同样处理(2/34 节)。翻完的节会自动进来,重跑 tools/site/build.mjs 即可。 顺带进来的四篇越南文长文(结婚划不划算、遇到陌生人出事该不该停、 做平台要办哪些证、家庭应急装备清单),英文那边有五篇。 生成物跟着变:跳语言页多一个 Tiếng Việt 入口,三种语言都进了 hreflang 和 sitemap.xml,en/zh 两页的头部 hreflang 也各多一条。
* 越南文上线:README、检索页、第 1 节和五篇长文 vi/README.md 翻完,vi/index.html 生成了,跳语言页和 sitemap 的 hreflang 自动带上 vi。越南文第 1 节(38 条)和五篇长文已翻,第 2 节翻到一半。 检查全过:i18n/check.mjs、site/build.mjs --check、extract.mjs --check、 sync-stats.mjs --check、check-refs.mjs --check、check-plain.mjs。 * 重切按条目走,别按行号 splice 块大小参数调小(一条块上限 8 条 / 6000 字符)之后要重切,但 split.mjs 会把 翻好的部分盖掉。加 resplit.mjs:按条号查表整段搬——已翻的搬译文,没翻的搬原文, 两种语言所有节一起排。 两处踩过的坑留在代码注释里: - splitSection 的 blocks[i] 改成「第 i 块包含哪几条」(每条一整段行数组), 原来是拍平的一堆行。重切要按条整段搬,拍平之后只能按行号 splice, 一条的长度和另一条不一样就错位——表现是一节报三十多处「成本标签和原文不一样」, 看着像译文烂了,其实是搬错了条目。 - 已翻的条目要从两处收:.i18n 里的块,和已经合进去的整节(<语言>/book/<节>.md)。 中文改过之后新加的条目译者可能已经翻好合过一次,只看 .i18n 会当成没翻。 join.mjs 跟着用 flat()。join 和 split 共用同一个 splitSection,不会再错开。 现在:英文第 1 到 4 节、越南文第 1 节已翻完并合进 <语言>/book/。 * 去译文节首重复:join.mjs 拼合时识别并去掉块首节首 en 四节与 vi 第一节的正文文件里,节首(回目录链接、节标题、导读)出现了两次:译者把节首也翻进了 part00,join 又在前面拼了一份 src.head。页面上每节渲染两遍。 修在拼合处:只看第一块,按内容逐行比对节首;全部对上才去掉,对不上整块保留,宁可多渲染也不吃译文。已重跑 join 并用 build.mjs 重出 en/index.html;i18n 检查与站点检查通过。 * Astro 校验链修到绿:解析器与原版逐字段一致 - parse.ts 的字段正则照抄原版尾部:默认 (.*)、证据等级只取 [ABC],之前多出 \s* 与后缀导致 166 处差异 - parity.ts 只抠模板里 fieldRe 与 RE_* 声明行,避免把引用 location 的 UI 代码带进来 - site.ts 用 fileURLToPath 处理中文文件名,否则 existsSync 全假导致“目录列了 34 节、正文一份都没有” npm run check:en 4 节 123 条、vi 1 节 38 条、zh 34 节 641 条,19 个字段逐条一致。 * 指路的区间先认再切,区间摊成一个个号 两处同一类毛病: - 英文的 xref.listSep 里含 "to" 和 "-"("items 8 to 11" 得切得开), 但 refsOf 和检索页的 xrefKeys 都是先按分隔符切、再试 rangeRe, "8 to 11" 先被切成 "8" 和 "11",区间再也认不出来。中文的「、」不含「到」, 一直没暴露,英文第 5 节两处、第 6 节一处指路查不出来。改成先认整串区间。 - 区间原来记成 "8-11" 这种形状,和译文的 "8, 9, 10 and 11" 比不上。 原文和译文指的是同一批条目,摊成一个个号(上限 40,和检索页一致)才比得起来。 英文第 5、6、7 节翻完并合入。现在英文 7/34 节、越南文 1/34 节。 * Astro 预渲染跟上 xref 区间新逻辑,加发布 workflow - render.ts 的 xrefKeys 改成和模板一致:先认整串区间再切分。英文 listSep 里含 to 和 -,先切会把 8 to 11 切碎,服务端和浏览器链的不是同一批条目 - web.yml:push 到 main 自动构建发布,PR 只构建不发布;触发路径只收和网站有关的文件,电子书的重型构建不跟着跑 - package.json 的 build 改成显式两步(astro build && copy-assets):环境里 ignore-scripts=true,postbuild 不会跑;静态文件(og.png、ads/、.nojekyll)构建时从仓库根拷进 dist,源头只有一份 --------- Co-authored-by: j <hong@cloudjetkpi.com>
Pages 已经切到 workflow 模式,Astro 构建产物直发,不再经过仓库。 删掉根上的生成物(index.html、en|vi|zh/index.html、sitemap.xml、robots.txt); book.yml 里 site 检查 job 和两处 build.mjs --check 跟着退役——模板和字典的 一致性现在由 Astro 构建本身保证(字典缺键直接抛错),中文文案仍由 extract.mjs --check 守。 sync-stats.mjs 不再调 build.mjs --check:没有入库的页面可过期了。 stats.json 写对就行,网站下次构建自动带上新数字(web.yml 触发路径含正文)。 CLAUDE.md 站点一节重写:workflow 发布、预渲染、两份拷贝的双保险、 indexSsgDom hydration、CI 分工。 Co-authored-by: j <hong@cloudjetkpi.com>
之前按路径触发,改了触发路径之外的文件(比如 skills/、CLAUDE.md), 网站就停在旧版——还得记得手点 workflow_dispatch,等于半自动。 改成 push 到 main 全触发:构建加发布一共一两分钟,内容没变时产物也一样, 多跑一次不亏。PR 保持只构建不发布。 Co-authored-by: j <hong@cloudjetkpi.com>
* 英文第 8 到 13 节翻完并合入 法律(8、9、11)、恋爱结婚(10)、创业(12)、紧急情况(13)六节, 法律引文按规矩留中文原文再给白话,条号节号一律照抄。 英文 13/34 节。剩下的在 .i18n/en/ 的块里,翻完 join 一次带一节进页面。 * 英文第 14 到 23 节翻完;检索页生成物退出仓库 正文(十节):账号与信息安全、租房与买房、慢性病、家里有老人、 养孩子、在职离职和工伤、新生儿、出国旅行、放松、学技能。 生成物那一半是补上一笔旧账:上一条提交(25e9c41)在跑 build.mjs 之后 git add -A,把 Astro 构建已经不再入库的六份页面(/、/en/、/zh/、/vi/、 sitemap.xml、robots.txt)又带回了仓库。3fb31f4 已经把它们退役, CLAUDE.md「目录结构」也写明产物直发 Pages 不入库。这次删掉并写进 .gitignore,留着它们只会变成「改了模板忘了重建」的过时副本。 校验:i18n 检查、extract --check、check-refs --check、check-plain、 sync-stats --check 全过;web/ 的 npm run verify 三段全过 (en 42 节 501 条、zh 34 节 641 条、vi 1 节 38 条,原文每个词都在 HTML 里)。 --------- Co-authored-by: j <hong@cloudjetkpi.com>
* docs: import HowToLiveLonger source snapshot * docs: preserve upstream Unlicense * docs: add HowToLiveLonger attribution notice * docs: credit HowToLiveLonger source material
* 越南文第 2 节(不要慢慢死)翻完并合入
九条慢性病条目:筛查、运动、戒烟酒、饮食、血压血糖、疫苗、牙。
数字照抄,量级词换算(每 10 万人 → trên 100.000 người),
法条引用留中文原文再给白话。校验:合好 1 节,问题 0 处。
越南文 2/34 节。
* 越南文第 4、5 节(不要浪费时间、不要浪费钱)翻完并合入
第 4 节三条讲时间怎么用,第 5 节四十五条讲钱怎么不漏出去:
消费贷、信用卡、订阅、保险、保修、诈骗、比价、二手货。
金额、利率、期限照抄,量级词换算成越南写法。
校验:两节各「合好 1 节,问题 0 处」。越南文 4/34 节。
* 英文第 29 到 31 节翻完并合入
重大打击之后怎么缓过来、上学以后的孩子、十八岁之后有哪几条路。
学费和生活费估算、年龄、学级、课时、各项数字照抄,
大学和专业名保留原形、首次出现给英文对照。
校验:三节各「合好 1 节,问题 0 处」。英文 29/34 节。
* 英文第 32 节、越南文第 14、15、20 节翻完并合入
英文:出国留学(学费、生活费估算、期限、奖学金名照抄)。
越南文:账号与信息安全、租房与买房、刚出生的孩子怎么带。
新生儿那节的体温、剂量、天数、百分比一律照抄,没做换算。
校验:四节各「合好 1 节,问题 0 处」。英文 30/34 节,越南文 7/34 节。
* 越南文第 16 节(得了慢性病之后怎么活)翻完并合入
两条:自己管病、家里人和钱。数值(剂量、复查间隔、比例)照抄没换算。
校验:合好 1 节,问题 0 处。越南文 8/34 节。
* 越南文第 21、22 节(出国旅行与境外安全、怎么放松)翻完并合入
旅行那节把热线和服务号码(12308、12345、12320)原样留着,
证件、机构的原名保留中文加越南语对照。
校验:两节各「合好 1 节,问题 0 处」。越南文 10/34 节。
更正一条数:上一条提交信息里写的「英文 30/34」不对,
en/book 下实际是 27 份,英文 27/34 节(1 到 23 加上 29 到 32)。
* 越南文第 13 节(紧急情况)四十二条翻完并合入
全书最密的一节:心脏骤停、中风、过敏、癫痫、电击、烫伤、中毒、
出血、骨折、中暑、火灾、溺水、蛇咬、地震、狂犬病暴露。
每一处分钟数、秒数、体温、剂量、百分比、年龄区间、号码
(120、110、119、12320)都照抄,没做换算也没改单位;
写成短句祈使句,一个动作一句。
校验:9 块合好,42 条,问题 0 处。越南文 11/34 节。
* i18n: join en section 24 (看病)
* 英文、越南文第 28 节(别为了外形把身体搞坏)翻完并合入;加 join-ready.sh 一键合入已翻好的节
* 英文搬到根 URL:默认语言就在 /,/en/ 留转发页
要求 2 说英文是默认语言、服务在根 URL。以前根上是一块跳语言的小页:开 JS 按
navigator.language 跳走,跳转表里的正则被 JSON.stringify 序列化成了 {}(RegExp
序列化不出自己),一执行就抛 TypeError——根 URL 就停在跳页上,英文默认压根没兑现。
而且就算能跳,读者也被直接送走,页内的语言下拉和锚点都没机会用。
现在:
· / 直接是英文正文页(locales.json 里 en 的 dir 是空串,canonical 指向根)。
· 老链接形式 /?lang=vi 由 chooserJump() 接住:命中就跳,没带就留在原地。
· /en/ 留一块转发页,README 和别处早就散着这个地址。
· 页内语言下拉修好了:选项地址原来写的是 SITE.dir(「这一页在哪」),跟「要去
哪种语言」无关——从 /zh/ 选英文还是落在 /zh/。改成先退回站点根再拼 langDirs[code]。
· sitemap 去重:默认语言住在根上,它的 canonical 就是根 URL,不去重会列两遍。
顺带把「dir 和 contentDir 不是一回事」这件事钉死:dir 是页面上线的目录(英文是
空串),contentDir 是正文在仓库里的目录(英文是 en)。join.mjs 和 check.mjs 原来
拿 L.dir 拼仓库路径,英文搬到根上之后会把译文写进中文原文,已经改走 contentPath()。
verify 加了第三步 lang-switcher-check:把构建产物里那段 buildLangPicker 抠出来,
给它一份假的 location 真跑一遍,逐个落点核对地址、查询串和锚点。抠的是发出去的
那份代码本身,不是照着抄的,抄错了测不出来。
EN 31/34、VI 14/34 节已翻并合入。
* 文档跟上:英文在根 URL 上的那一版,路径怎么拼(dir 和 contentDir),verify 的三步
* 英文、越南文第 09 节(法律红线)等若干节翻完并合入:EN 32/34、VI 15/34
---------
Co-authored-by: j <hong@cloudjetkpi.com>
节的条目一直是逐条校对的,节首那几行(回目录、节标题、导读)却没人管—— join.mjs 拿中文原文那一份无条件拼在第 0 块前面(tools/i18n/join.mjs:92)。 结果:en 34 节里 30 节的标题是翻好的,却被当成「多出来的」删掉,中文那份留着; 剩下的连节名带导读都是中文。vi 更糟,19 节的节首根本没翻。 页面上看得见:英文站每个小节标题是中文的,有几节渲染两遍(中文在前、英文在后), 侧栏目录也是中文节名。 改三处: · join.mjs 拼的时候不再碰译文块的内容。第 0 块自带节首就用它自带的; 真的没有(少数块是这样切的)才补,补的是中文那份并且报出来。 · structure.mjs 加 compareSection:节号、节标题跟原文一字不差就是没翻, 导读里剔掉照抄的法条名书名之后还剩汉字就是整段没翻。 · check.mjs 和 join.mjs 都调它,CI 跑的就是 check.mjs。 顺带把 01-04 的节名对齐 en/README.md 的目录(全站同一个说法), 并把这四节的导读翻好。英文 34/34 节现在节首节身都干净。
两处判据的修法,都在 structure.mjs: · 争议标记那条正则补 trimStart。越南文「- Ghi chú: Tranh cãi.」冒号后有空格, ^Tranh cãi 匹配不上,一条真标了争议的条目被报成「原文标了争议,译文没标」。 · 中文数字法条编号纳入允许名单。「第一千零四十五条」在原文里是汉字,numbersOf 读不出来,越南文按 BRIEF 写成「Điều 1045」就成了「多了原文没有的数字」。 英文因为把编号拼成 one thousand and forty-five 反而躲过去了,纯属侥幸—— 现在两种写法都算原文就有的那个数。并排写法「第一千零五十二、一千零五十三条」 也认,「第」只出现在头一个。 另外把 vi 15、16 两节切块时漏掉的节首补进 part00(含回目录那行),把 18、31 的 导读翻好。
页面的侧栏目录读的是 <语言>/README.md,译本 book/ 里的「# N. 节名」是另一处。 en 有 1 节、vi 有 3 节两处说法不同(en 32 出国留学、vi 16 慢性病、vi 24 看病、 vi 25 人走了以后),读者的两处搜索对不上。 check.mjs 从 README 的目录一节读出节名,compareSection 多带一个 toc 参数, 节标题跟目录不一致就报。对不上是真的会报的(试过把 en 32 的节标题换掉,check 立刻报出来,不是静悄悄地过)。
两件事: 一是节标题只改 book/ 里的不够——join 是从 .i18n 的块 0 重生成的,只改 book/ 的话 下次 join 就被覆盖回去。2026-10-02 改完 en 32、vi 16/24/25,第二天 main 的 CI 就报 「节标题跟目录不一致」,本地当时是绿的(.i18n 已被 gitignore,改的那一份没进库)。 README 目录和 .i18n 块 0 两处都得改,这条记进 tools/i18n/README.md 了。 二是 vi 06 三处:节首导读还是中文;条 12 原文「1 小时后」的数字被写成「một giờ」, 条 15 原文「200 余万元」「10 万元」被写成「2 triệu」「100.000」——量级换算是允许的, 但原文没有量级词时就得照抄那三个数,否则收益栏可核对性断了。
vi 29 三处数字:条 1「每 1394 个」写成了「1.394」(原文没那个千分位,多一个数); 条 2 原文「607 万多人(6,073,240 人)」,量级词在,所以两个数都该在,译文把「607 万」 写成「6.070.000」多出一个数、把括号里那个漏了;条 3「逾 2000 万人」的 20.000.000 是允许的量级换算,没动。 顺带修 vi 03 句子里夹的三个中文碎片(普遍/恰/不大),book/ 和 .i18n 两处都改了。 现在三种语言的页面各是 641 条、34 节,check.mjs 和 render-check 都逐条核过: 收益/成本/来源三栏的数字一个不多一个不少、URL 逐字节相同、成本标签注释照抄、 条目标题没有一个还是中文。
vi 02 第 21、22、23、25 条和 vi 20 第 1 条的标题整条还是中文,正文翻好了。 判据加在 structure.mjs 的 compare() 里:标题跟中文原文一字不差就报, 「」《》()里照抄的法条名书名不算(BRIEF 规则 6 允许)。 试过把改好的标题换回中文,join 立刻报出来,不是静悄悄地过。 另外撤掉一个我自己写的假警报:上一版判据只按长度查「空栏」, 证据等级栏是 A/B/C 一个字母,636 条全被误报——判据太粗,量级词那些不算漏译。 现状:三种语言各 34 节 641 条,六道检查全绿。
翻译任务读的是 BRIEF,不是代码。这轮机器查上了三样(节标题、节导读、条目标题), BRIEF 原来一条都没写,等于让翻的人靠撞。补上之后逐条对了:BRIEF 里写的十项要求, 代码里都有对应的判据,没有「文档写了但代码没查」。 量级换算那条原来只给了正例(167 万 → 1,670,000),没给反例,所以译文里 「10 万元 → 100.000 tệ」这种把数字改掉的做法看起来像合规。补上:原文没有量级词时 那三个数必须原样留着,中文数字法条编号才转成阿拉伯数字。争议标记也说明 越南文冒号后有空格没关系(判据加了 trimStart)。
以前 EDITS 只列了 README.md(中文那一份),en/README.md 和 vi/README.md 里的 首屏条目数和四个徽章停在 635 / 422 / 162 / 1407,真实是 641 / 425 / 165 / 1443。 越翻越旧:每翻完一节真实数字就往前走一点,译文里的数字不动,--check 也照样绿 (它只查自己列的那几处)。 补了六条 EDITS,两种语言各三条。首屏那句的字面每门语言不同(「641 条建议」 「641 pieces of advice」「641 lời khuyên」),所以正则按各自的句子结构写; 徽章是百分号编码的 URL,三份 README 形状一样,共用一条。
长文的来源段不在 check.mjs 的判据里(那只查 book/*.md 的条目),所以没人管。 扫了一遍 en/vi 五篇长文: · 家庭应急装备清单里三个机构名(应急管理部、北京市应急管理局、全国人大常委会) 只写中文,按 BRIEF 规则 6 该「译名(中文)」。en/vi 都改了。 · 作者列表的「等」是中文的「等人」,不是书目内容,en/vi 各五处改 et al. 书目其余部分(文件标题、法条名)照抄不动——规则 6 就是这个意思,读者要能对照原文查。
冲突两处,都按本仓库的多语言结构判:
- tools/site/page.template.html(4 处):上游那份 index.html 还写死在页面里
的域名字符串、条目数和长文清单,本仓库已经改成构建时填的 {{entries}} /
{{repo}} 占位符和 data-i18n-block,四处全取本仓库那份。上游真正的新东西
(scrollbar-gutter 预留滚动条槽位、#xref-pop 提到 z-index:80、长文弹窗里的
「第 X 节第 Y 条」可点、Esc 先关引用浮层)在无冲突区,已自动合入。
- README.md(2 处):徽章取上游的数字(650 条、A 428 · B 171 · C 51、1539 条
链接)配本仓库的域名;「其他语言」那一行保留本仓库的官方 en/vi 写法,并补上
上游新增的 Português(dlgrv 维护)。vi 已上线(acd1999),把「在翻,尚未上线」
改成实际链接。
同步:sync-stats.mjs 跑通(含 og.png 重出)、check-refs 797 处通过、
check-plain 650 条 0 不合格。译文 en/vi 还停在 641 条,另开一个 PR 跟上。
上游 1d42655 合并后中文原文是 650 条,en/vi 停在 641 条。这一个 PR 把两种译文 全部对齐,并把长文那一片的检查补上。 **搬已有的译文(553 条)**:`tools/i18n/rebase.mjs`(新增)。上游删了 9 条、第 2 节 两条并成一条,条号整体顺延,所以不能按条号配——那会把译文挂到隔壁条目上,而且 结构检查不报错(顺延后的号仍在范围内)。这个脚本按条目标题配对,并把译文里的条号 和指路条号一起改成新的。改指路时卡住「这是不是条目引用」:英文的 xref 正则有一条 光秃秃的 `\bitems?\s+(\d+)`,来源栏里「第 59 条」译成 item 59 照样命中,APA 的 item 705 也命中,照单全改就是把法条条款号指到别的条目上去。卡口取旧原文那一条的 指路当白名单。搬不动的(上游删条并条后没跟着改的指路、跨删除点的区间引用、正文真 改了的条目、节标题或导读真改了的节)一节一节点名报出来,不猜。 **重翻 195 条**:新增 18 条、正文真改的 61 条、五节的导读。每条由一个子代理单独 翻,提示词自足、只许改自己那一块的未译条目。CLAUDE.md 的禁令照旧:不许改中文、 不许跑改 git 的命令、不许跑 sync-stats.mjs。 **长文(docs/)三篇新稿**:上游新增了被裁了之后先做什么、孩子出生前后要办的事、 刚确诊慢性病之后,en/docs 和 vi/docs 都没有。三篇全是条目指路,锚点必须取自该语言 book/ 里那条的真实标题(标题是各自分别翻的,和中文锚点常常不是一个说法),115 处 引用逐个查过。en/README.md 和 vi/README.md 各补三处链接(导航行、目录行、结尾 「长文另见」),grep 应为 3,已核对。 **顺带修的两处真错**: - `docs/生物钟和夜班.md` 的「第 2 节第 39 条」在英越两语还写着 item 40。正文这边 rebase 搬了,长文这边没人搬,而 2.40 已经是「买预包装食用油」。已改成 39 和 38。 - `structure.mjs` 的 cnNumbersOf 只认「第+数字+条」这一支,「第十六、十七条」里 的第二个编号读不到,译文按 BRIEF 写成 "Articles 16 and 17" 就被报成「多了原文 没有的数字」。六个条目都栽在这类枚举法条上(第一百七十一、一百七十八、一百七十九 条这种)。改成顿号后继续读。反向验过:原文没有的数字(999)和漏掉的数字照样报 出来,这一层没有被放松。 **新检查 `tools/i18n/check-docs.mjs`,挂进 CI**:check.mjs 只逐条比 book/ 里的条目, 长文一个字都不看,而长文是指路最密的地方。判据取译文引的 (节, 条) 集合跟中文原文 比——不比锚点原文,长文里锚点本来就允许截断(中文自己就在截),逐字比只会报出一堆 假警报;要比的是条号顺延。注入一处错引用验过它会红(2:44),改回来再验它会绿。 **校验**(全绿):join --all en/vi 各 34 节 0 问题;check.mjs 两种语言 0 处; check-docs.mjs 12 篇 236 处引用 0 篇对不上;check-refs 797 处全带锚点;check-plain 650 条 0 不合格;sync-stats --check 通过;web 的四步 verify(解析一致、构建、 语言下拉落点、渲染一致)全过,三种语言各 34 节 650 条。 已知局限,没在这次改:structure.mjs 的 xref 正则不区分法条引用和条目引用,所以 来源栏里的「第 59 条」在译文里是 "item 59"(页面会把它做成一个指向第 7 节第 59 条 的链接,那一条不存在)。main 上原本就是这样,这次没有改动它,也没有变多。
Author
|
Wrong repo — this PR was meant for streamentry/HowToLiveBetter. Closing. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
译文跟上中文原文 650 条:en/vi 全书对齐,长文补三篇
上游 1d42655 合并后中文原文是 650 条,en/vi 停在 641 条。这个 PR 把两种译文全部对齐,并把长文那一片的检查补上。中文原文和站点模板一个字没动。
搬已有的译文:553 条
新增
tools/i18n/rebase.mjs。上游删了 9 条、第 2 节两条并成一条,条号整体顺延,所以不能按条号配——那会把译文挂到隔壁条目上,而且结构检查不报错(顺延后的号仍在范围内)。这个脚本按条目标题配对,并把译文里的条号和指路条号一起改成新的。改指路时卡住「这是不是条目引用」:英文的 xref 正则有一条光秃秃的
\bitems?\s+(\d+),来源栏里「第 59 条」译成 item 59 照样命中,APA 的 item 705 也命中。照单全改就是把法条条款号指到别的条目上去。卡口取旧原文那一条的指路当白名单——拿新原文的号去卡旧号,删条之后两边对不上,译文里的旧号一个都不改,比报错更坏:指路静默指错还不报。搬不动的(上游删条并条后没跟着改的指路、跨删除点的区间引用、正文真改了的条目、节标题或导读真改了的节)一节一节点名报出来,不猜。
重翻 195 条
新增 18 条、正文真改的 61 条、五节的导读。每条由一个子代理单独翻,提示词自足,只许改自己那一块里未译的条目。
长文补三篇
上游新增了被裁了之后先做什么、孩子出生前后要办的事、刚确诊慢性病之后,
en/docs和vi/docs都没有,而它们在中文 README 里各有三处链接。三篇全是条目指路:括号里的锚点必须取自该语言book/里那条的真实标题(标题是各自分别翻的,和中文锚点常常不是一个说法),115 处引用逐个对着book/查过。en/README.md和vi/README.md各补三处链接,grep -c应为 3,已核对。顺带修的两处真错
docs/生物钟和夜班.md指错条目:中文「第 2 节第 39 条」在英越两语还写着 item 40。正文这边 rebase 搬了,长文这边没人搬,而 2.40 已经是「买预包装食用油」。已改成 39 和 38。structure.mjs的 cnNumbersOf 只认「第+数字+条」,「第十六、十七条」里的第二个编号读不到,译文按 BRIEF 写成 "Articles 16 and 17" 就被报成「多了原文没有的数字」——六个条目都栽在这类枚举法条上(第一百七十一、一百七十八、一百七十九条这种)。改成顿号后继续读。这一处请重点看:它改的是校验逻辑本身。反向验过——原文没有的数字(999)和漏掉的数字照样报出来,这一层没有被放松;正例是六个失败全部消失,且每一个都能在中文原文里找到对应的枚举法条列表。新检查:check-docs.mjs(挂进 CI)
check.mjs只逐条比book/里的条目,长文一个字都不看,而长文是指路最密的地方。判据取译文引的 (节, 条) 集合跟中文原文比——不比锚点原文:长文里锚点本来就允许截断(中文原文自己就在截,「药按医嘱吃满」是「药按医嘱吃满,别感觉好了就停」的截断),逐字比只会报出一堆假警报;要比的是条号顺延。注入一处错引用验过它会红(2:44),改回来再验它会绿。校验
join.mjs --all --locale enjoin.mjs --all --locale vicheck.mjscheck-docs.mjscheck-refs.mjs --checkcheck-plain.mjssync-stats.mjs --checkweb的npm run verifyweb的渲染一致那一步查的是构建产物:en / vi / zh 各 34 节 650 条,原文每个词都在 HTML 里。已知局限,没在这次改
structure.mjs的 xref 正则不区分法条引用和条目引用,所以来源栏里的「第 59 条」在译文里是 "item 59",页面会把它做成一个指向第 7 节第 59 条的链接,而那一条不存在。main上原本就是这样,这次没有改动它,也没有变多。要修得改refsOf,那会影响全部译文的指路判定,另开一个 PR。