| name | comp-names-zh |
| description | Use when regenerating `stats/comp_names_zh.json`, debugging Chinese comp names, or rendering a competition name anywhere in the UI (must go through `lib/comp-localize.ts`, never raw `c.name`; the year in the name must not duplicate a date shown next to it). Triggers: "中国比赛中文", "localizeCompName", "comp_names_zh", "fetch_comp_names_zh", "比赛名本地化", "stripWcaPrefix", "CompCell", "比赛名年份", "比赛名重复年份", "stripCompYear", "localizeCity", "CITY_ZH". |
中国比赛名中文化
前端显示规则全在 core/packages/client/lib/comp-localize.ts 的 JSDoc(localizeCompName / stripWcaPrefix)。新代码渲染比赛名一律走它,禁止裸 c.name。compNameZh() 命中前先 await loadFlagData()。
年份不重复(全站规则,issue #65)
比赛年份已经显示在页面上(同行日期列 / 卡片日期 / 年份分组标题)时,比赛名里就不再出现年号:夹江公开赛2026 + 2026-07-25 → 显示 夹江公开赛。
- 表格 / 列表用
<CompCell … date={comp.start_date} />;date 必填(string | null),逼你表态。
- 其它渲染点
localizeCompName(id, name, isZh, { date })。
- 页面上没写年份的地方(搜索下拉、无日期列的榜单、比赛详情页 H1 与复制名)传
null / 不传 —— 那里年号是唯一的区分信息。
- 唯一实现是
stripCompYear,禁在调用点手写 /\s*20\d\d\s*$/ 之类正则。守卫:写入即拦 .claude/hooks/block-comp-name-year-regex.ps1 + CI tests/comp-year-single-source.test.ts。
数据:stats/comp_names_zh.json
由 core/packages/stats-build/src/bin/fetch_comp_names_zh.ts 生成(在 core/packages/stats-build 下跑)。
npx tsx src/bin/fetch_comp_names_zh.ts
npx tsx src/bin/fetch_comp_names_zh.ts --refresh
- 键同时存 WCA
name 和 short_name,值是 cubing.com 中文名。
- 匹配:
_alias_to_wca_id_candidates(原始 / 去 "Open" / 去 "Cubing" 前缀)→ 失败回退 start_date + country=CN;强差异老比赛靠 ALIAS_TO_WCA_ID_OVERRIDE 硬编码。
- 缓存目录
.comp_names_zh_cache/(.gitignore)。
爬虫已知坑
- cubing.com 临近开赛会把 URL 从
/competition/ 切到 /live/,scraper 正则两种都要收。
- 日期格式有三种:
~DD(同月)/ ~MM-DD(同年跨月)/ ~YYYY-MM-DD(跨年,如 2025-12-31~2026-01-01)—— 正则三种都要兼容。
- WCA API
name(全名)vs short_name(短名)必须都作 key,否则 all_past_comps.json(用 name)查不到。
- 页面没更新?看
Deploy Core 是否失败、dist/_assets/*.js 是否含新代码。
城市名(兄弟模块)
lib/city-localize.ts::localizeCity(city, isZh),新增城市直接往 CITY_ZH 加键。