Repository navigation
중국어(zh)를 네 번째 언어로 추가하고, 한국·일본뿐이던 국가 카테고리에 미국·중국을 넣었다. 14 files changed, +482 −10
관련 PR: #39 (중국어·카테고리) · #40 (릴리즈)
🇨🇳 중국어 추가
이번 언어 추가는 대부분 데이터 작업이었다.
직전 릴리즈에서 "언어는 정확히 둘"이라는 전제를 걷어낸 결과가 여기서 나왔다.
LANGUAGES 배열에 "zh" 한 줄을 넣자, Record<Language, …>로 선언해둔 자리들 — 사전 레지스트리, 국기 이모지, OG 로케일, DeepL 코드 — 이 전부 컴파일 에러로 빠진 곳을 지목했다.
타입이 체크리스트 역할을 했고, 새로 짜야 할 로직은 언어 감지 한 군데뿐이었다.
lib/i18n/zh.ts신규- 국가 매핑: CN · TW · HK · MO · SG →
zh - OG 로케일
zh_CN, 국기 🇨🇳
한자는 누구 것인가
한글은 한국어에만, 가나는 일본어에만 있다. 신호가 깨끗하다.
그런데 한자는 일본어와 중국어가 나눠 쓴다. 한자를 그냥 중국어 점수로 세면, 한자 비중이 높은 일본어 문장이 통째로 중국어로 넘어간다.
2단으로 갈랐다.
1단 — 가나가 있으면 일본어다. 가나는 일본어에만 있으므로, 가나가 하나라도 있으면 그 글의 한자는 일본어 쪽으로 합산한다.
2단 — 가나가 없으면 글만으로는 못 가른다. 이때는 접속 지역을 따른다.
새로 만든 신호는 아니다. detectLanguage의 두 번째 인자가 이미 getCurrentLanguage()(경로 → 쿠키 → x-vercel-ip-country)로 채워져 들어오고 있었고, 질문 작성 시점엔 그 값이 그대로 sourceLanguage로 저장돼 나중 번역에서도 다시 쓰인다. 한자를 어느 쪽에 계산할지만 그 인자로 결정하면 되는 문제였다.
日本語質問 東京都行政手続처럼 가나 없는 한자 문장이 일본에서 올라오면 일본어로, 그 외 지역에서는 중국어로 잡힌다. 한글이 섞인 일본어(韓国語の「눈치」は…), 라틴이 섞인 한국어(서울에서 K-POP 콘서트…) 같은 기존 케이스도 회귀 없이 통과한다. 케이스 13종으로 검증했다.
대가: 일본 지역에서 중국어로 쓰면 일본어로 확신 판정된다. 확신 판정은 DeepL 자동 감지로 교정되는 경로를 타지 않는다(translations.ts는 confident: false일 때만 원문 언어를 DeepL에 맡긴다).
바꾸기 전에는 이 오류가 반대로 나 있었다 — 일본에서 쓴 한자 위주 일본어가 전부 중국어로 잡혔다. 재일 중국어 사용자보다 한자를 많이 쓰는 일본어 사용자가 훨씬 많으므로 지금 방향을 택했다.
🗂 카테고리
국가 카테고리가 한국·일본뿐이라 영어·중국어 사용자가 고를 자리가 없었다.
korea · japan 뒤에 usa(🇺🇸) · china(🇨🇳)를 추가했다.
Categories.tsx와 CategoryPicker.tsx가 CATEGORIES를 순회하므로 필터바와 질문 작성 폼에 자동으로 붙었고, 라벨은 Record<CategoryId, string> 제약이 네 사전 전부에 강제했다. 컴포넌트는 한 줄도 고치지 않았다.
🔤 DeepL
추측하지 않고 실제로 호출해 확인했다.
ZH · ZH-HANS 둘 다 target으로 200을 받고, 중국어 원문은 detected_source_language: "ZH"로 돌아와 기존 재감지 흐름에 그대로 물린다. 간체(ZH-HANS)를 target, ZH를 source로 지정했다.
번체는 지원하지 않는다. TW·HK도 현재는 간체로 표시된다. 필요해지면 zh-Hant를 별도 언어로 추가해야 한다.
🗃 데이터
기존 질문 14건 + 답변 21건에 중국어 번역을 채웠다.
백필 스크립트를 --lang= 인자를 받도록 일반화해 scripts/backfill-language.mjs로 옮기고, 이번에 리포에 포함시켰다 (v1.2.0 노트의 scripts/backfill-en.mjs가 이것이다). 다음 언어를 추가할 때 그대로 재사용한다.
남은 것
- 공지(notices) 문서에
en·zh필드가 없다 — 두 로케일에서 상단 배너가 한국어로 폴백된다. Firestore 데이터 작업 필요 - 언어 전환 UI 없음 — 이제 언어가 넷이라 체감이 커진다.
switcherLegend키는 네 사전에 다 있으나 쓰는 컴포넌트가 없다