Repository navigation
v1.2.0 — 다국어 확장과 영어 지원
한일(ko/ja) 전용이던 서비스를 다국어 구조로 바꾸고 영어(en)를 추가했다. 21 files changed, +412 −85
관련 PR: #35 (크롤러 메타데이터) · #37 (다국어 확장) · #38 (릴리즈)
🌏 다국어 확장
언어를 2개로 전제한 코드가 흩어져 있었다. LANGUAGES 배열에 "en"만 추가하면 될 것처럼 보였지만, 실제로는 언어가 정확히 둘일 때만 성립하는 로직이 네 군데 박혀 있었다.
otherLanguage() — "그 반대 언어"라는 개념 자체
otherLanguage(language) => language === "ko" ? "ja" : "ko"
원문이 한국어면 일본어, 아니면 한국어. 언어가 셋이 되는 순간 "반대"가 정의되지 않는다.
translationTargets()로 교체해 LANGUAGES에서 원문 언어만 빼도록 바꿨다. 이제 언어를 몇 개 추가하든 번역 대상이 자동으로 따라온다.
영어 질문이 번역을 통째로 건너뛰고 있었다
hasTranslatableText()가 한글·가나·한자만 "번역할 내용"으로 인정했다.
2개 언어 시절엔 맞는 가정이었다 — CJK 문자가 하나도 없으면 숫자나 이모지뿐이라 번역할 게 없었으니까.
그런데 영어가 들어오면 순수 영어로 쓴 질문이 전부 이 조건에 걸려 번역 없이 저장되고, 한국어·일본어 사용자에게 영어 원문 그대로 노출됐을 상황이었다. 라틴 문자를 번역 대상에 포함시키고, 언어 감지도 3종 스크립트 비교로 일반화했다.
미국에서 접속해도 /ko로 갔을 자리
COUNTRY_TO_LANGUAGE가 lib/locale.ts와 middleware.ts 두 곳에 복제돼 있었다.
실제 리다이렉트를 결정하는 건 미들웨어 쪽인데, 국가 매핑을 추가할 때 눈에 띄는 건 locale.ts 쪽이다. 한 파일만 고치고 넘어갔으면 미국 방문자는 계속 한국어 페이지를 봤다. lib/country-language.ts로 합쳤다.
DeepL은 영어 코드를 방향에 따라 다르게 받는다
target_lang은 EN-US처럼 지역 변형이 필수고, source_lang은 변형을 거부하고 EN만 받는다.
기존 코드는 하나의 맵을 양쪽에 재사용하고 있어서, 영어로 쓴 글을 번역하는 순간 API가 에러를 뱉었을 것이다. 소스용 코드를 분리했다.
그 외
lib/i18n/en.ts신규 —ko.ts가 정의하는Dictionary타입을 그대로 만족시키므로, 키가 빠지면 컴파일이 깨진다- 랜딩·메타 문구를 "한국과 일본" → "다국어 소통"으로 (ko/ja 양쪽,
manifest.ts,llms.txt, OG 이미지 태그라인) - OG 로케일 하드코딩 삼항 3곳 제거 — 영어 페이지가
ja_JP로 표기되던 자리 toLanguage()가"ja"가 아니면 전부 ko로 뭉개던 것을 타입 가드로 교체
캐싱은 건드리지 않았다. unstable_cache가 캐싱하는 대상은 모든 언어를 한 문서에 담은 Firestore 원본이고, 언어 선택은 캐시 이후 readLocalizedText에서 일어난다. 페이지 HTML은 [lang] 세그먼트 덕에 URL별로 이미 분리된다. sitemap.ts · robots.ts · generateStaticParams도 처음부터 LANGUAGES를 순회하고 있어 무수정으로 통과했다.
🔎 크롤러
htmlLimitedBots에 Googlebot을 포함한 검색·SNS 크롤러 목록을 지정했다.
스트리밍 렌더에서는 메타데이터가 늦게 도착해 크롤러가 빈 메타를 읽을 수 있다. 이 봇들에게는 메타데이터를 블로킹으로 제공한다.
🗃 데이터
기존 문서는 translationStatus: "done"이라 번역 파이프라인이 다시 돌지 않는다.
scripts/backfill-en.mjs로 질문 14건 + 답변 21건에 영어 번역을 채웠다.
남은 것
- 공지(notices) 문서에
en필드가 없다 — 영어 페이지 상단 배너가 한국어로 폴백된다. Firestore 데이터 추가 필요 - 언어 전환 UI 없음 —
switcherLegend키는 세 사전에 다 있으나 쓰는 컴포넌트가 없다. 기존부터 있던 공백