Skip to content

Commit 17ee5d4

Browse files
KEN0421claude
andcommitted
feat: zh-CN 100% + activate locale, +2 tools (62 tools, 209 pages)
- 18 zh-CN translations: aspect-ratio, bmr, char-freq, credit-card, cron, date-calc, dice, email-val, hash, leap-year, paint, pomodoro, regex, salary, savings, text-replace, timezone, unit-price - zh-CN locale activated (active: true) — Chinese SEO market live - 2 new tools: ovulation-calculator (health), retirement-calculator (finance) - 209 static pages (137 → 209): 62 tools × 3 active locales + statics Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent fa0327b commit 17ee5d4

30 files changed

Lines changed: 1717 additions & 1 deletion

File tree

‎site/src/lib/i18n/locales.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export type Locale = (typeof LOCALES)[number];
77
export const LOCALE_DEFS = [
88
{ code: "en", name: "English", native: "English", dir: "ltr", active: true },
99
{ code: "ja", name: "Japanese", native: "日本語", dir: "ltr", active: true },
10-
{ code: "zh-CN", name: "Chinese (Simplified)", native: "简体中文", dir: "ltr", active: false },
10+
{ code: "zh-CN", name: "Chinese (Simplified)", native: "简体中文", dir: "ltr", active: true },
1111
{ code: "zh-TW", name: "Chinese (Traditional)", native: "繁體中文", dir: "ltr", active: false },
1212
{ code: "ko", name: "Korean", native: "한국어", dir: "ltr", active: false },
1313
{ code: "es", name: "Spanish", native: "Español", dir: "ltr", active: false },

‎site/src/lib/tools/registry.ts‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ import pomodoro from "@/tools/pomodoro-timer";
6060
import dice from "@/tools/dice-roller";
6161
import leapYear from "@/tools/leap-year-checker";
6262
import bmr from "@/tools/bmr-calculator";
63+
import ovulation from "@/tools/ovulation-calculator";
64+
import retirement from "@/tools/retirement-calculator";
6365

6466
/**
6567
* 全ツールの中央レジストリ。新規ツール追加時はここに登録するだけで
@@ -126,6 +128,8 @@ export const TOOLS: ToolDefinition[] = [
126128
dice,
127129
leapYear,
128130
bmr,
131+
ovulation,
132+
retirement,
129133
];
130134

131135
const SLUG_INDEX = new Map(TOOLS.map((t) => [t.meta.slug, t]));
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
{
2+
"title": "宽高比计算器(缩放时保持比例)",
3+
"shortDescription": "计算保持目标宽高比所需的宽或高。常用比例 (16:9、9:16、1:1、4:3、21:9) 一键预设。",
4+
"description": "设定目标比例和一个尺寸, 另一个自动计算。反向同样可用。视频、图片裁剪、响应式 web 布局都适用。",
5+
"metaDescription": "免费宽高比计算器。缩放图片或视频时保持 16:9、9:16、1:1、4:3 等比例, 即时计算缺失的宽或高, 含常用预设。",
6+
"keywords": ["宽高比 计算器", "比例 缩放", "16:9 计算器", "图片 宽高比", "视频 宽高比"],
7+
"input": {
8+
"ratioW": "比例 W",
9+
"ratioH": "比例 H",
10+
"width": "宽",
11+
"height": "高"
12+
},
13+
"result": {
14+
"ratio": "宽高比",
15+
"decimal": "小数",
16+
"dimensions": "尺寸",
17+
"simplified": "化简"
18+
},
19+
"article": {
20+
"sections": [
21+
{
22+
"heading": "宽高比是什么",
23+
"paragraphs": [
24+
"宽高比描述宽相对高: 16:9 表示每 9 单位高对应 16 单位宽。同一比例任何尺寸适用 — 1920×1080 与 800×450 都是 16:9。缩放时保持宽高比可避免拉伸或挤压, 也是响应式设计的基础。",
25+
"比例可输入整数 (16:9) 或小数 (1.78:1), 宽高任意尺寸。编辑任一字段, 其他自动更新以维持比例。小数比 (宽/高) 用于 CSS calc() 或视频编辑工具。"
26+
]
27+
},
28+
{
29+
"heading": "常见比例与用途",
30+
"paragraphs": [
31+
"16:9 — 现代 HDTV、电脑显示器、YouTube、2009 年后大多数电影。今天几乎所有场合的默认。",
32+
"9:16 — Instagram Stories、TikTok、YouTube Shorts 的竖屏视频。手机优先内容的 16:9 翻转。",
33+
"1:1 — 正方形。Instagram 信息流 2021 年前默认。专辑封面、头像。",
34+
"4:3 — HD 之前的旧 TV 与显示器。仍用于一些经典风格内容。",
35+
"3:2 — 单反相机默认。35mm 胶片。大尺寸打印。",
36+
"21:9 — 超宽影院。变形宽银幕电影。部分 PC 显示器与 LG TV。"
37+
]
38+
},
39+
{
40+
"heading": "为什么 CSS aspect-ratio 重要",
41+
"paragraphs": [
42+
"现代 CSS 有 aspect-ratio: 16/9; — 设比例让浏览器从宽计算高 (反之亦然)。避免旧的 padding-bottom 黑魔法, 是响应式嵌入与图片占位避免布局抖动 (CLS) 的关键。",
43+
"Cumulative Layout Shift (CLS) 是 Core Web Vitals 之一。嵌入视频、未指定尺寸的图片、广告都可能导致 CLS — 设置明确 width/height (浏览器据此算宽高比) 或用 CSS aspect-ratio 修复。"
44+
]
45+
}
46+
],
47+
"howTo": [
48+
{ "name": "选比例", "text": "点预设或输入自定义 W:H。" },
49+
{ "name": "输入已知尺寸", "text": "宽或高任一, 另一个自动计算。" },
50+
{ "name": "编辑任一字段", "text": "更新同步以维持比例。" }
51+
]
52+
},
53+
"faq": [
54+
{ "q": "16:9 与 1.78:1 区别?", "a": "比例相同, 写法不同。16/9 = 1.778。冒号形式在电视/web 通用; 小数形式在电影通用。" },
55+
{ "q": "CSS 里如何保持宽高比?", "a": "用 aspect-ratio 属性: img { aspect-ratio: 16/9; width: 100%; height: auto; }。图片填充容器宽, 高自动维持比例。" },
56+
{ "q": "为什么我的视频在 4:3 电视上看起来不对?", "a": "现代视频大多 16:9。在 4:3 显示上要么加黑边、加上下黑条、要么拉伸。电视设置控制使用哪种。" },
57+
{ "q": "可以用非整数比例?", "a": "可以 — 输入 1.5 或 2.39。计算器视为小数; 化简后的比例输出仅在整数比例时显示。" },
58+
{ "q": "「像素宽高比」是什么?", "a": "另一概念: 单个像素的形状。现代显示用方形像素 (1:1)。一些旧 SD 视频格式用非方形像素 (NTSC 宽屏 1.0667 等)。本工具处理显示宽高比, 不是像素宽高比。" },
59+
{ "q": "「电影感」是什么?", "a": "21:9 (更准确 2.39:1 或 2.40:1) — 比 HDTV 更宽。常见于现代大片。流媒体常以此比例呈现电影。" },
60+
{ "q": "为什么 Instagram Reel/TikTok 用 9:16?", "a": "因为手机通常竖握。9:16 用内容填满整个手机屏幕; 16:9 在竖手机上会留上下空白。" },
61+
{ "q": "数据会上传吗?", "a": "不会。计算在本地。" }
62+
]
63+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
{
2+
"title": "BMR 基础代谢率计算器 (三种公式对比)",
3+
"shortDescription": "用三种公式计算基础代谢率: Mifflin-St Jeor (默认)、Harris-Benedict (经典)、Katch-McArdle (用瘦体重)。",
4+
"description": "输入年龄、性别、身高、体重, 可选体脂率, 用三种临床公式计算 BMR。饮食规划与代谢基线追踪适用。",
5+
"metaDescription": "免费 BMR 基础代谢率计算器。Mifflin-St Jeor、Harris-Benedict、Katch-McArdle 三式对比。带体脂率输入, Katch-McArdle 对运动员更准。",
6+
"keywords": ["BMR 计算器", "基础 代谢率", "Mifflin St Jeor", "Harris Benedict", "Katch McArdle"],
7+
"empty": "输入年龄、身高、体重以计算 BMR。",
8+
"unit": { "metric": "公制", "imperial": "英制" },
9+
"sex": { "male": "男", "female": "女" },
10+
"input": {
11+
"age": "年龄",
12+
"height": "身高",
13+
"weight": "体重",
14+
"bodyFat": "体脂率 % (可选)",
15+
"bodyFatOptional": "如 18, 用于 Katch-McArdle"
16+
},
17+
"formula": {
18+
"mifflin": "Mifflin-St Jeor",
19+
"harris": "Harris-Benedict",
20+
"katch": "Katch-McArdle",
21+
"katchNoBf": "(需体脂率)"
22+
},
23+
"article": {
24+
"sections": [
25+
{
26+
"heading": "BMR 是什么",
27+
"paragraphs": [
28+
"基础代谢率 (BMR) 是身体在完全静止时消耗的卡路里 — 维持心跳、呼吸、大脑思考、肾过滤等基本功能所需能量。这是不损害基本机能时不能再降低的卡路里底线。",
29+
"BMR 约占总每日能量消耗 (TDEE) 的 60-75%。加上活动、消化 (食物热效应)、运动得到 TDEE — 维持体重实际所需。"
30+
]
31+
},
32+
{
33+
"heading": "为什么有三种公式",
34+
"paragraphs": [
35+
"Mifflin-St Jeor (1990) 是现代默认。多项验证研究表明它在简单 BMR 公式中最准 — 多数健康成人误差 10% 以内。无特殊原因都用此。",
36+
"Harris-Benedict (1919, 1984 修订) 是较早、知名的公式。在现代人群中倾向高估 BMR 5-10%, 因为原始样本不反映今天的体成分。与历史文献对照时有用。",
37+
"Katch-McArdle 用瘦体重而非总体重。如有体脂率测量 (DEXA、BodPod、或一台像样的体成分秤), 对肌肉发达者最准 — Mifflin 和 Harris-Benedict 高估了脂肪量对 BMR 的贡献。"
38+
]
39+
},
40+
{
41+
"heading": "如何使用结果",
42+
"paragraphs": [
43+
"纯 BMR 不是目标 — 你要 TDEE。把 BMR 乘活动系数: 1.2 (久坐)、1.375 (轻度)、1.55 (中度)、1.725 (高度)、1.9 (极高)。BMR 1500 kcal 中度活动, TDEE 约 2325 kcal。",
44+
"减重: 每天比 TDEE 少 250-500 kcal (每周减 0.25-0.5 kg)。增重: 多 250-500。不要长期低于 BMR — 会丢瘦体重, 代谢向下适应。",
45+
"每减 4-6 kg 重新计算 BMR。轻的身体静息所需更少; 这是减肥进展中停滞的原因。"
46+
]
47+
}
48+
],
49+
"howTo": [
50+
{ "name": "选单位与性别", "text": "公制或英制; 男或女。" },
51+
{ "name": "输入年龄、身高、体重", "text": "三种公式都需要。" },
52+
{ "name": "可选: 体脂率", "text": "有测量时解锁 Katch-McArdle。" },
53+
{ "name": "对比三个结果", "text": "Mifflin 是安全默认; Katch-McArdle 在你肌肉发达时更准。" }
54+
]
55+
},
56+
"faq": [
57+
{ "q": "应该用哪个公式?", "a": "通用就 Mifflin-St Jeor。有体脂率测量且瘦体成分重要 (运动员、健美) 用 Katch-McArdle。" },
58+
{ "q": "为什么 Harris-Benedict 给的数不一样?", "a": "1919 年开发, 样本不反映现代体成分。多数综述发现它在今天人群中高估 BMR 5-10%。除非参考文献指定用 Harris-Benedict, 都用 Mifflin。" },
59+
{ "q": "我的体脂率测量可信吗?", "a": "DEXA 与水下称重是金标准。BodPod 和受过训练的皮褶卡尺测量较好。家用秤的生物电阻抗较粗 — 准确度随补水状态日间波动。用你能接触到的最准方法。" },
60+
{ "q": "BMR 和 RMR (静息代谢率) 一样吗?", "a": "非常接近, 略有不同。BMR 在严格空腹、清醒静息条件下测。RMR 较宽松 — 通常醒后即可, 不需空腹。RMR 一般高 5-10%。这些公式特指 BMR。" },
61+
{ "q": "如何算 TDEE?", "a": "BMR 乘活动系数: 1.2 (无运动) 到 1.9 (运动员)。多数办公人员 1.4-1.55。也可用我们的卡路里计算器, 直接算 BMR + 活动得 TDEE。" },
62+
{ "q": "吃低于 BMR 会减重吗?", "a": "会减重, 但也会随时间丢瘦体重和代谢率。更好: 比 TDEE 低 250-500 (不是 BMR)。可持续减脂用 TDEE 赤字, 不是 BMR 底线。" },
63+
{ "q": "为什么 BMR 随年龄下降?", "a": "瘦体重随年龄下降 (30 岁后每十年约 3-5%, 除非主动用力量训练维持)。Mifflin 的年龄系数 (-5/年) 近似这一点。" },
64+
{ "q": "数据会上传吗?", "a": "不会。计算在本地。" }
65+
]
66+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
{
2+
"title": "字符频率分析器 (字母、所有字符、词)",
3+
"shortDescription": "统计文本中每个字符或词出现的次数。可排序、含百分比、可选区分大小写。",
4+
"description": "粘贴任意文本得到排序的频率表。三种模式: 全字符、仅字母/数字、整词。密码分析、写作分析、数据集清理适用。",
5+
"metaDescription": "免费字符频率分析器。统计字母、所有字符或词。可排序表格带百分比, UTF-8 友好含 CJK 与表情符号。",
6+
"keywords": ["字符 频率", "字母 频率", "词 频率", "频率 分析", "文本 统计"],
7+
"input": { "text": "文本" },
8+
"mode": { "all": "所有字符", "letters": "字母与数字", "words": "词" },
9+
"caseSensitive": "区分大小写",
10+
"stats": {
11+
"unique": "{n} 唯一",
12+
"total": "总 {n}",
13+
"showingTop": "显示前 {n}",
14+
"remainingCount": "+{n} 在尾部未显示"
15+
},
16+
"col": { "item": "项", "count": "次数" },
17+
"article": {
18+
"sections": [
19+
{
20+
"heading": "用途",
21+
"paragraphs": [
22+
"密码分析: 古典密码 (凯撒、替换) 保留字母频率。英文文本中 E 最常见, 其次 T、A、O、I、N。如果在密文中看到大致相同的分布, 那就是替换密码。CJK 语言分布很不同但仍可识别。",
23+
"写作分析: 找过度使用的词是改稿最快方法之一。如果 'just' 或 'really' 在 1000 词文章中出现 50 次, 你找到了要修的口头禅。",
24+
"数据集清理: 用本工具扫 CSV 列可发现散乱字符、编码错误、意外大小写。在导入到更严格系统前有用。"
25+
]
26+
},
27+
{
28+
"heading": "三种模式",
29+
"paragraphs": [
30+
"所有字符: 含空格、标点、换行、表情。原始文本分析最佳。怀疑隐藏字符 (零宽空格、BOM) 破坏文件时有用。",
31+
"字母与数字: 仅过滤 Unicode 字母和数字。传统字母频率分析 (密码分析、语言识别) 最佳。",
32+
"词: 按空白分割, 数整词。写作分析与文体检查最佳。"
33+
]
34+
},
35+
{
36+
"heading": "「区分大小写」做什么",
37+
"paragraphs": [
38+
"关 (默认): 'A' 与 'a' 一起数。自然文本字母频率分析最佳, 大小写无关时。",
39+
"开: 'A' 与 'a' 分开数。大小写有意义时有用 — 编程标识符、品牌词、分析大写模式。注: 大小写折叠用语言环境的小写规则; 多数语言这是惯例 Unicode 折叠。"
40+
]
41+
}
42+
],
43+
"howTo": [
44+
{ "name": "粘贴文本", "text": "从一句到几兆字节文件都行。" },
45+
{ "name": "选模式", "text": "所有字符、字母/数字、或词。" },
46+
{ "name": "切换大小写敏感", "text": "自然文本关; 大小写有意义时开。" },
47+
{ "name": "读表格", "text": "按频率排序。前 50 显示; 余下尾部数量在下方汇总。" }
48+
]
49+
},
50+
"faq": [
51+
{ "q": "对中文、日文、韩文有效?", "a": "有效。字母模式把每个汉字/谚文当一个「字母」, 所以得到字符频率。词模式按空白分割, 没空格的 CJK 文本会显示为一个巨长词 — 那种情况用字母模式。" },
52+
{ "q": "英文最常见字母?", "a": "'E' (约 12.7%), 然后 T (9.1%)、A (8.2%)、O (7.5%)、I (7.0%)、N (6.7%)。这是破解简单替换密码的基础。" },
53+
{ "q": "表情符号会被统计?", "a": "在「所有字符」模式会。字母模式过滤掉 (按 Unicode 分类不是字母)。" },
54+
{ "q": "为什么表情有时被分成多个字符?", "a": "一些表情是多个 Unicode 码点 (旗帜 = 两个区域指示字母)。计数器遵循 JavaScript 字符串迭代, 尊重码点但不是所有字形簇。多数分析够用。" },
55+
{ "q": "可以导出表格?", "a": "暂时不能 — 复制粘贴渲染表格。CSV 导出在路线图。" },
56+
{ "q": "显示多少条?", "a": "表格中前 50 条。尾部数量在底部汇总。" },
57+
{ "q": "为什么希腊/土耳其语不区分大小写结果不符合预期?", "a": "一些语言有特殊大小写规则 (土耳其语带点/不带点 I; 德语 ß ↔ SS)。我们用 JavaScript 的 toLowerCase() 遵循默认 Unicode 折叠 — 通常够用但边角情况会让人意外。" },
58+
{ "q": "数据会上传吗?", "a": "不会。所有计数在本地。" }
59+
]
60+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
{
2+
"title": "信用卡校验器 (Luhn 算法 + 品牌识别)",
3+
"shortDescription": "校验信用卡号校验位 (Luhn 算法) 并识别发卡品牌。完全本地 — 卡号绝不离开你的设备。",
4+
"description": "输入卡号验证 Luhn 校验是否通过, 并按 IIN/BIN 范围识别品牌 (Visa、Mastercard、Amex、Discover、JCB、Diners、UnionPay)。",
5+
"metaDescription": "免费信用卡校验器。Luhn 算法校验 + 品牌识别 (Visa、Mastercard、Amex 等)。所有处理在浏览器, 卡号绝不上传。",
6+
"keywords": ["信用卡 校验器", "Luhn 算法", "卡号 校验", "BIN 查询", "卡 品牌 识别"],
7+
"warning": "⚠ 切勿在不信任的网站输入真实卡号。本工具完全在浏览器运行 — 但任何陌生网站都难以同样验证。",
8+
"input": { "cardNumber": "卡号" },
9+
"status": { "valid": "格式有效", "invalid": "无效" },
10+
"empty": "输入卡号以校验。",
11+
"breakdown": {
12+
"brand": "品牌",
13+
"length": "长度",
14+
"luhn": "Luhn 校验",
15+
"formatted": "格式化",
16+
"unknown": "未知"
17+
},
18+
"article": {
19+
"sections": [
20+
{
21+
"heading": "本校验器检查什么 (与不检查什么)",
22+
"paragraphs": [
23+
"三项检查: (1) 前缀匹配已知发卡机构的 IIN/BIN 范围, (2) 长度是该品牌有效长度之一, (3) Luhn 校验通过。三项都通过, 卡号在格式上有效。",
24+
"本工具不检查: 卡是否真实存在、是否有余额、持卡人是否授权使用。这需要通过真实支付处理商在合规授权下进行。本工具便宜地捕捉拼写错误 — 如复制时 1234 误打成 1243 — 但无法验证卡号是否对应真实账户。"
25+
]
26+
},
27+
{
28+
"heading": "Luhn 算法如何工作",
29+
"paragraphs": [
30+
"Luhn (1954, IBM 科学家 Hans Peter Luhn) 是简单校验和: 从最右数字起, 每隔一位加倍。加倍后超 9 的数字, 把两位数字相加 (等价于减 9)。把所有结果数字求和。总和必须是 10 的倍数。",
31+
"Luhn 捕捉单数字错误和大多数相邻交换错误 — 人复制长数字时最常见的两种。它不是密码学的; 不能用于检测恶意篡改。真实支付处理商把 Luhn 当后续昂贵后台检查前的第一道过滤。"
32+
]
33+
},
34+
{
35+
"heading": "按 IIN/BIN 识别品牌",
36+
"paragraphs": [
37+
"卡号前 6-8 位识别发卡机构 (Issuer Identification Number / Bank Identification Number)。主要品牌有公认前缀范围: Visa 以 4 开头、Mastercard 51-55 或 2221-2720、Amex 34 或 37 等。我们通过匹配这些范围识别品牌。",
38+
"通常可由 IIN 推断品牌与国家。完整 IIN 数据库查询给出国家、银行、卡类型 (借记/信用)、和卡计划 — 商家用于风险评分。我们不含完整 IIN 数据库; 仅最常见品牌模式。"
39+
]
40+
}
41+
],
42+
"howTo": [
43+
{ "name": "输入卡号", "text": "空格和短横线自动忽略。" },
44+
{ "name": "读结果", "text": "绿勾 = 格式有效 (Luhn 通过 + 长度匹配品牌)。" },
45+
{ "name": "查看明细", "text": "品牌、长度、Luhn 校验、与正确格式化的卡号。" }
46+
]
47+
},
48+
"faq": [
49+
{ "q": "可以用本工具校验真实卡号吗?", "a": "尽管我们只在浏览器运行, 你也不应把真实卡号粘贴到不深度信任的工具。语法检查请用标准测试卡号 (如 4111 1111 1111 1111)。" },
50+
{ "q": "为什么看起来正确的号码显示「无效」?", "a": "最常见 Luhn 校验失败 — 多半是拼写错误。再核对一遍数字。" },
51+
{ "q": "Luhn 校验证明卡存在吗?", "a": "不能。Luhn 只捕捉抄写错误。许多从未发行的号码也通过 Luhn; 许多真实卡若拼错也不通过。" },
52+
{ "q": "「BIN」是什么?", "a": "Bank Identification Number — 前 6-8 位标识发卡机构。与 IIN (Issuer Identification Number) 同义; 两术语可互换。" },
53+
{ "q": "可以用来生成测试卡号吗?", "a": "不直接, 但 Stripe/Visa/Mastercard 标准测试号码有完整文档 (如 4242 4242 4242 4242)。它们通过 Luhn 但绝不扣费。" },
54+
{ "q": "为什么没识别 [某品牌]?", "a": "我们支持主要品牌。地区或联名卡可能不匹配。请查发卡机构的 IIN 范围文档。" },
55+
{ "q": "数据会上传吗?", "a": "不会。校验完全在浏览器, 无网络调用。" },
56+
{ "q": "Luhn 用于信用卡之外的东西?", "a": "用。IMEI、加拿大 SIN、ISIN、NPI、和许多其他 ID 系统用 Luhn。算法相同; 仅前缀映射不同。" }
57+
]
58+
}

0 commit comments

Comments
 (0)