Localize user-facing UI, agent output, and backend messages to Simplified Chinese
ci / go (push) Waiting to run
ci / go-db (agent) (push) Waiting to run
ci / go-db (config) (push) Waiting to run
ci / go-db (db) (push) Waiting to run
ci / go-db (evidence) (push) Waiting to run
ci / go-db (llmrec) (push) Waiting to run
ci / go-db (server) (push) Waiting to run
detections / detections (push) Waiting to run
docs / links (push) Waiting to run
web / web (push) Waiting to run
ci / go (push) Waiting to run
ci / go-db (agent) (push) Waiting to run
ci / go-db (config) (push) Waiting to run
ci / go-db (db) (push) Waiting to run
ci / go-db (evidence) (push) Waiting to run
ci / go-db (llmrec) (push) Waiting to run
ci / go-db (server) (push) Waiting to run
detections / detections (push) Waiting to run
docs / links (push) Waiting to run
web / web (push) Waiting to run
This commit is contained in:
@@ -40,12 +40,12 @@ func mustJSON(t *testing.T, v any) string {
|
||||
// 별개로 이 핀이 있어야 飞书 본문만 중국어로 되돌아가는 회귀를 잡는다.
|
||||
func TestFeishuItemLinesLocalized(t *testing.T) {
|
||||
got := feishuItemLines(asciiStatusChangeItem())
|
||||
assertKorean(t, "feishuItemLines", got)
|
||||
assertChinese(t, "feishuItemLines", got)
|
||||
for _, want := range []string{
|
||||
"**상태 변경**: 처리 대기 → 수정됨",
|
||||
"**유형**: SQLi",
|
||||
"**자산**: a.example.com",
|
||||
"**개요**: SQL injection via q param",
|
||||
"**状态变更**:待处理 → 已修复",
|
||||
"**类型**:SQLi",
|
||||
"**资产**:a.example.com",
|
||||
"**概要**:SQL injection via q param",
|
||||
} {
|
||||
if !strings.Contains(got, want) {
|
||||
t.Errorf("飞书 단건 본문에 %q 가 있어야 합니다:\n%s", want, got)
|
||||
@@ -59,21 +59,21 @@ func TestFeishuCardButtonsLocalized(t *testing.T) {
|
||||
// 단건: "상세 보기" 버튼(DetailURL 있을 때)
|
||||
single, _ := feishuCard(Message{Items: []Item{asciiStatusChangeItem()}})
|
||||
singleJSON := mustJSON(t, single)
|
||||
if hasHan(singleJSON) {
|
||||
t.Errorf("단건 飞书 카드에 중국어 한자가 남았습니다:\n%s", singleJSON)
|
||||
if hasHangul(singleJSON) {
|
||||
t.Errorf("단건 飞书 카드에 한글이 남았습니다:\n%s", singleJSON)
|
||||
}
|
||||
if !strings.Contains(singleJSON, "상세 보기") {
|
||||
t.Errorf("단건 飞书 카드에 '상세 보기' 버튼이 있어야 합니다:\n%s", singleJSON)
|
||||
if !strings.Contains(singleJSON, "查看详情") {
|
||||
t.Errorf("단건 飞书 카드에 '查看详情' 버튼이 있어야 합니다:\n%s", singleJSON)
|
||||
}
|
||||
|
||||
// 다건: "플랫폼에서 전체 보기" 버튼(HomeURL 있을 때)
|
||||
batch, _ := feishuCard(Message{Batch: true, HomeURL: "https://platform.example", Items: hanFreeItems(2)})
|
||||
batchJSON := mustJSON(t, batch)
|
||||
if hasHan(batchJSON) {
|
||||
t.Errorf("다건 飞书 카드에 중국어 한자가 남았습니다:\n%s", batchJSON)
|
||||
if hasHangul(batchJSON) {
|
||||
t.Errorf("다건 飞书 카드에 한글이 남았습니다:\n%s", batchJSON)
|
||||
}
|
||||
if !strings.Contains(batchJSON, "플랫폼에서 전체 보기") {
|
||||
t.Errorf("다건 飞书 카드에 '플랫폼에서 전체 보기' 버튼이 있어야 합니다:\n%s", batchJSON)
|
||||
if !strings.Contains(batchJSON, "在平台查看全部") {
|
||||
t.Errorf("다건 飞书 카드에 '在平台查看全部' 버튼이 있어야 합니다:\n%s", batchJSON)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,8 +89,8 @@ func TestDingTalkActionCardButtonLocalized(t *testing.T) {
|
||||
if _, err := (dingTalkChannel{}).Send(context.Background(), map[string]any{"webhook": srv.URL}, m); err != nil {
|
||||
t.Fatalf("투递 실패: %v", err)
|
||||
}
|
||||
if singleTitle != "상세 보기" {
|
||||
t.Errorf("钉钉 ActionCard singleTitle 은 '상세 보기' 여야 합니다, 받은 값 %q", singleTitle)
|
||||
if singleTitle != "查看详情" {
|
||||
t.Errorf("钉钉 ActionCard singleTitle 은 '查看详情' 여야 합니다, 받은 값 %q", singleTitle)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,21 +108,21 @@ func TestChinaPlatformValidateLocalized(t *testing.T) {
|
||||
if missing == nil {
|
||||
t.Fatalf("%s: 빈 설정은 검증에 실패해야 합니다", kind)
|
||||
}
|
||||
assertKorean(t, kind+" missing", missing.Error())
|
||||
if !strings.Contains(missing.Error(), "Webhook") || !strings.Contains(missing.Error(), "없습니다") {
|
||||
t.Errorf("%s: 누락 오류는 'Webhook 주소가 없습니다' 여야 합니다, 받은 값 %q", kind, missing)
|
||||
assertChinese(t, kind+" missing", missing.Error())
|
||||
if !strings.Contains(missing.Error(), "Webhook") || !strings.Contains(missing.Error(), "缺少") {
|
||||
t.Errorf("%s: 누락 오류는 '缺少 Webhook 地址' 여야 합니다, 받은 값 %q", kind, missing)
|
||||
}
|
||||
|
||||
// 잘못된 주소(ftp): "Webhook 주소가 올바르지 않습니다: …"
|
||||
// 잘못된 주소(ftp): "Webhook 地址无效: …"
|
||||
bad := ch.Validate(map[string]any{"webhook": "ftp://x"})
|
||||
if bad == nil {
|
||||
t.Fatalf("%s: ftp 주소는 검증에 실패해야 합니다", kind)
|
||||
}
|
||||
if hasHan(bad.Error()) {
|
||||
t.Errorf("%s: 잘못된 주소 오류에 중국어 한자가 남았습니다: %q", kind, bad)
|
||||
if hasHangul(bad.Error()) {
|
||||
t.Errorf("%s: 잘못된 주소 오류에 한글이 남았습니다: %q", kind, bad)
|
||||
}
|
||||
if !strings.Contains(bad.Error(), "Webhook 주소가 올바르지 않습니다") {
|
||||
t.Errorf("%s: 잘못된 주소 오류는 'Webhook 주소가 올바르지 않습니다' 로 시작해야 합니다, 받은 값 %q", kind, bad)
|
||||
if !strings.Contains(bad.Error(), "Webhook 地址无效") {
|
||||
t.Errorf("%s: 잘못된 주소 오류는 'Webhook 地址无效' 로 시작해야 합니다, 받은 값 %q", kind, bad)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -138,10 +138,10 @@ func TestChinaPlatformSendErrorsLocalized(t *testing.T) {
|
||||
resp string
|
||||
wantSubs []string
|
||||
}{
|
||||
{KindDingTalk, `{"errcode":310000,"errmsg":"keyword not matched"}`, []string{"DingTalk에서 오류가 발생했습니다", "310000"}},
|
||||
{KindFeishu, `{"code":19021,"msg":"sign error"}`, []string{"Feishu에서 오류가 발생했습니다", "19021"}},
|
||||
{KindWeCom, `{"errcode":45009,"errmsg":"freq out of limit"}`, []string{"WeCom 요청이 제한되었습니다", "45009"}},
|
||||
{KindWeCom, `{"errcode":93000,"errmsg":"invalid webhook"}`, []string{"WeCom에서 오류가 발생했습니다", "93000"}},
|
||||
{KindDingTalk, `{"errcode":310000,"errmsg":"keyword not matched"}`, []string{"DingTalk 发生错误", "310000"}},
|
||||
{KindFeishu, `{"code":19021,"msg":"sign error"}`, []string{"Feishu 发生错误", "19021"}},
|
||||
{KindWeCom, `{"errcode":45009,"errmsg":"freq out of limit"}`, []string{"WeCom 请求受限", "45009"}},
|
||||
{KindWeCom, `{"errcode":93000,"errmsg":"invalid webhook"}`, []string{"WeCom 发生错误", "93000"}},
|
||||
}
|
||||
for _, tc := range bizCases {
|
||||
srv := capturePost(t, tc.resp, nil)
|
||||
@@ -153,8 +153,8 @@ func TestChinaPlatformSendErrorsLocalized(t *testing.T) {
|
||||
if err == nil {
|
||||
t.Fatalf("%s: %s 응답은 오류여야 합니다", tc.kind, tc.resp)
|
||||
}
|
||||
if hasHan(err.Error()) {
|
||||
t.Errorf("%s: 발송 오류에 중국어 한자가 남았습니다: %q", tc.kind, err)
|
||||
if hasHangul(err.Error()) {
|
||||
t.Errorf("%s: 발송 오류에 한글이 남았습니다: %q", tc.kind, err)
|
||||
}
|
||||
for _, sub := range tc.wantSubs {
|
||||
if !strings.Contains(err.Error(), sub) {
|
||||
@@ -182,7 +182,7 @@ func TestChinaPlatformSendErrorsLocalized(t *testing.T) {
|
||||
if err == nil {
|
||||
t.Fatalf("%s: JSON 이 아닌 응답은 오류여야 합니다", pc.kind)
|
||||
}
|
||||
want := pc.platform + " 응답을 해석하지 못했습니다"
|
||||
want := "无法解析 " + pc.platform + " 响应"
|
||||
if !strings.Contains(err.Error(), want) {
|
||||
t.Errorf("%s: 파싱 실패 오류에 %q 가 있어야 합니다, 받은 값 %q", pc.kind, want, err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user