chore: 规范标点
This commit is contained in:
1 parent
15e79887fa
commit
3dd2231c70
81 files changed
+1751
-1751
No files matched your search
+13
-13
@@ -1,8 +1,8 @@
|
||||
/* test_i18n.c - 界面文案表
|
||||
*
|
||||
* 这张表是"每种语言一条". 它最容易出的错不是逻辑, 而是漏:加了键忘了翻,
|
||||
* 这张表是"每种语言一条". 它最容易出的错不是逻辑, 而是漏: 加了键忘了翻,
|
||||
* 或者译文里少了个占位符 ({path} 写成 {paths})—— 用户看到的就是一句缺字的话.
|
||||
* 所以这里的检查全部是机械的:遍历表, 逐条比对.
|
||||
* 所以这里的检查全部是机械的: 遍历表, 逐条比对.
|
||||
*
|
||||
* 文案本身好不好不在这里管; "英文界面是不是每句都有着落"才是.
|
||||
*/
|
||||
@@ -71,7 +71,7 @@ static int printf_specs(const char *s, char (*out)[16], int max)
|
||||
return n;
|
||||
}
|
||||
|
||||
/* 有没有中日韩字符 (含全角标点:〔〕 ()). 英文那一列里出现它, 基本就是
|
||||
/* 有没有中日韩字符 (含全角标点: 〔〕 ()). 英文那一列里出现它, 基本就是
|
||||
* "照抄了中文"或者"美化用的框线忘了换" —— 用户看到的是英文句子中间卡着一对
|
||||
* 中文括号. 顺带把"英文栏里混进日文假名"这种复制粘贴也一并挡住. */
|
||||
static int has_cjk(const char *s)
|
||||
@@ -106,12 +106,12 @@ int main(void)
|
||||
CHECK(!has_cjk(m->en ? m->en : ""), "%s 的英文里混进了中日韩字符",
|
||||
m->key);
|
||||
|
||||
/* key 唯一性:比较是 O(n²), 但每个 key 只记一条检查 —— 写成循环里
|
||||
/* key 唯一性: 比较是 O(n²), 但每个 key 只记一条检查 —— 写成循环里
|
||||
* CHECK 的话, check-docs 数出来的"单元项数"就没意义了. */
|
||||
int dup = 0;
|
||||
for (size_t j = i + 1; j < n; j++)
|
||||
if (strcmp(tab[j].key, m->key) == 0) dup = 1;
|
||||
CHECK(!dup, "key 重复:%s", m->key);
|
||||
CHECK(!dup, "key 重复: %s", m->key);
|
||||
|
||||
char pe[16][32], pz[16][32];
|
||||
int ne = placeholders(m->en ? m->en : "", pe, 16);
|
||||
@@ -122,32 +122,32 @@ int main(void)
|
||||
int found = 0;
|
||||
for (int b = 0; b < nz; b++)
|
||||
if (strcmp(pe[a], pz[b]) == 0) found = 1;
|
||||
CHECK(found, "%s:英文的 {%s} 在中文里没有对应", m->key, pe[a]);
|
||||
CHECK(found, "%s: 英文的 {%s} 在中文里没有对应", m->key, pe[a]);
|
||||
}
|
||||
/* 译文里多出一个原文没有的占位符, 同样会在运行时漏字 */
|
||||
for (int a = 0; a < nz && a < ne; a++) {
|
||||
int found = 0;
|
||||
for (int b = 0; b < ne; b++)
|
||||
if (strcmp(pz[a], pe[b]) == 0) found = 1;
|
||||
CHECK(found, "%s:中文的 {%s} 在英文里没有对应", m->key, pz[a]);
|
||||
CHECK(found, "%s: 中文的 {%s} 在英文里没有对应", m->key, pz[a]);
|
||||
}
|
||||
}
|
||||
|
||||
/* 表里有一部分键是**当 printf 模板用的** (repl.usage.*、repl.model.row、
|
||||
* json.* …):调用方直接把 t(key) 交给 printf/snprintf. 这些条目的
|
||||
* json.* …): 调用方直接把 t(key) 交给 printf/snprintf. 这些条目的
|
||||
* {name} 检查管不到, 得单独比转换符 —— 少一个 %s 会读到别的参数,
|
||||
* 类型写错 (%d 对 %zu)更是直接踩内存. */
|
||||
puts("printf 模板:两种语言的转换符必须一模一样");
|
||||
puts("printf 模板: 两种语言的转换符必须一模一样");
|
||||
for (size_t i = 0; i < n; i++) {
|
||||
const LigentMsg *m = &tab[i];
|
||||
char se[16][16], sz[16][16];
|
||||
int ce = printf_specs(m->en ? m->en : "", se, 16);
|
||||
int cz = printf_specs(m->zh ? m->zh : "", sz, 16);
|
||||
if (ce == 0 && cz == 0) continue; /* 不是模板, 跳过 */
|
||||
CHECK(ce == cz, "%s:转换符个数不同 (en %d / zh %d)", m->key, ce, cz);
|
||||
CHECK(ce == cz, "%s: 转换符个数不同 (en %d / zh %d)", m->key, ce, cz);
|
||||
for (int a = 0; a < ce && a < cz; a++)
|
||||
CHECK(strcmp(se[a], sz[a]) == 0,
|
||||
"%s:第 %d 个转换符不同 (en %s / zh %s)",
|
||||
"%s: 第 %d 个转换符不同 (en %s / zh %s)",
|
||||
m->key, a + 1, se[a], sz[a]);
|
||||
}
|
||||
|
||||
@@ -179,7 +179,7 @@ int main(void)
|
||||
const char *two = tf("doctor.val.match_bad", "guess", "OpenAI",
|
||||
"owner", "DeepSeek", NULL);
|
||||
CHECK(strstr(two, "DeepSeek") && strstr(two, "OpenAI"), "两个值都要在");
|
||||
CHECK(strstr(two, "{") == NULL, "不该有没填上的占位符:%s", two);
|
||||
CHECK(strstr(two, "{") == NULL, "不该有没填上的占位符: %s", two);
|
||||
|
||||
puts("语言名解析");
|
||||
CHECK(i18n_parse_lang("zh") == LIGENT_LANG_ZH, "zh");
|
||||
@@ -192,7 +192,7 @@ int main(void)
|
||||
CHECK(i18n_parse_lang("") < 0, "空串返回 -1");
|
||||
CHECK(i18n_parse_lang(NULL) < 0, "NULL 返回 -1");
|
||||
|
||||
puts("环境探测:LIGENT_LANG > LC_ALL > LC_MESSAGES > LANG, 认不出/没设 -> 英文");
|
||||
puts("环境探测: LIGENT_LANG > LC_ALL > LC_MESSAGES > LANG, 认不出/没设 -> 英文");
|
||||
unsetenv("LIGENT_LANG");
|
||||
unsetenv("LC_ALL");
|
||||
unsetenv("LC_MESSAGES");
|
||||
|
||||
Reference in new issue
Block a user