This repository was archived by the owner on Sep 24, 2026. It is now read-only.
[공통] /public/guides 가 언어를 따른다 — 응급대처법 4개 언어 - #97
Merged
Merged
Conversation
⚠️ 이 기능의 핵심은 번역을 **보여주는** 것이 아니라 틀릴 수 있는 번역을 **안 보여주는** 것이다. seed.ts 는 FIRST_AID(응급대처법)를 재시드마다 **강제로 덮어쓴다.** 국립수산과학원이 지침을 바꿨는데 옛 문구가 남아 있으면 사람이 다치기 때문이다 — 옛 지침은 식초·알코올을 권했는데 지금은 그게 자포 발사를 촉진한다고 본다. 번역을 붙이면 그 위험이 그대로 옮겨온다. 한국어만 갱신되고 영어가 옛 지침으로 남으면 **외국인 방문객은 현행과 반대되는 응급처치를 안내받는다.** 읽을 수 있다는 점이 오히려 피해를 키운다. 그래서 번역 행에 **번역 시점의 원문 해시**를 함께 저장하고, 읽을 때 원문과 어긋나면 그 번역을 쓰지 않고 한국어로 떨어뜨린다. 읽을 수 있지만 틀릴 수 있는 글보다, 기계번역으로라도 스스로 돌려 읽을 수 있는 현행 원문이 낫다. 컬럼(title_en/body_en/…)이 아니라 테이블로 둔 이유 — 언어를 추가할 때마다 DDL 이 필요하고, 빈 칸과 "번역 없음" 이 구분되지 않는다. 행이면 없는 언어는 그냥 행이 없다. 해시에 제목과 본문 사이 구분자를 넣는다. 없으면 ("AB","C") 와 ("A","BC") 가 같은 해시가 되어 경계만 바뀐 개정을 "안 바뀐 것" 으로 본다.⚠️ 이 장치는 번역이 낡았다고 **알려주지 않는다.** 조용히 한국어로 떨어질 뿐이다. 원문을 고친 사람이 번역도 고쳐야 한다는 것은 여전히 운영 규칙이다.
⚠️ **응급대처법은 안전 문서다.** 의역하지 않고 원문의 절차·금지사항을 그대로 옮겼다. 특히 "수돗물로 씻지 마세요" 와 "온찜질 45℃" 는 잘못 옮기면 피해가 커지는 항목이라 표현보다 정확성을 택했다.⚠️ **원어민·의료 검토 전 초안이다.** 배포 전 검토가 필요하다. 그래도 넣은 이유는 검토를 기다리는 동안 외국인 방문객에게 한국어만 나가는 것보다 낫다고 봤기 때문이고, 원문이 바뀌면 자동으로 한국어로 떨어지는 안전장치가 있기 때문이다. 출처 표기(국립수산과학원)도 각 언어에 그대로 싣는다 — 응급처치 안내에서 출처는 장식이 아니라 독자가 신뢰 여부를 판단하는 근거다. ko 문안은 여기 두지 않는다. 원문은 static_guides 에 있고, 여기 또 두면 둘이 갈라진다.
같은 요청에서 riskLevelLabel·guideText·factors 는 번역되는데 **guides 만 한국어로** 나가고 있었다. 그 엔드포인트가 싣고 있던 것이 응급대처법과 면책 문구다. 필터의 locale 을 **선택이 아니라 필수**로 뒀다. 기본값을 주면 새로 부르는 쪽이 언어를 잊어도 조용히 한국어가 나가는데, 이 엔드포인트가 빠져 있던 원인이 정확히 그런 종류다. 응답에 locale 을 넣는다 — **실제로 내보낸 언어**이고 요청 언어와 다를 수 있다. 화면이 "원문(한국어)" 임을 표시할 수 있어야 하고, 무엇보다 조용히 떨어진 것을 나중에 추적할 수 있어야 한다. 한국어 요청이면 번역 테이블을 아예 읽지 않는다. 원문이 곧 답이다.
단위 9건 + 실 DB 스모크 4건. 스모크가 필요한 이유 — 이 기능의 핵심은 **번역을 버리는 조건**이고, 그 판단은 DB 에 저장된 해시와 현재 원문을 맞춰 보는 것이다. 단위 테스트는 해시 비교만 볼 뿐, **시드가 해시를 제대로 심었는지**는 확인하지 못한다. 스모크에서 지침 개정을 흉내 내 원문을 바꾸고, 영어 요청이 ko 로 떨어지면서 **갱신된** 원문을 주는지까지 본다. 옛 한국어로 떨어지면 그것도 낡은 안내다. 해시 검사를 지우면 단위 2건 + 스모크 1건이 깨지는 것을 확인했다. "빈 값을 내보내지 않는다" 를 네 언어 모두에서 본다 — 화면에서 안내가 통째로 사라지면 번역이 없는 것보다 나쁘다(이슈에 적힌 요구사항이다). README 에 "다국어" 절을 넣고, 미해결 목록의 **"다국어 DB 콘텐츠"** 를 "일부만 됨" 으로 고쳤다. 남은 것은 해변 이름·해파리 종 정보·알림 문구이고, 종 정보는 오역이 안전에 직결되므로 번역 컬럼보다 **검수 주체**가 먼저 정해져야 한다. 백테스트 표본 수(136주)도 최신값(156단위)으로 고쳤다 — 그 숫자로 "해역별 파라미터를 아직 못 한다" 를 설명하고 있어서, 틀린 채로 두면 근거가 약해 보인다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #94
문제
같은 요청에서
riskLevelLabel·guideText·factors[].name은 번역되는데/public/guides만 한국어로 나갔다. 그 엔드포인트가 싣고 있던 것이 응급대처법과 면책 문구다 — 쏘인 직후에 읽는 글과, 책임 범위를 밝히는 문장이다.seed.ts는FIRST_AID를 재시드마다 강제로 덮어쓴다. 국립수산과학원이 지침을 바꿨는데 옛 문구가 남아 있으면 사람이 다치기 때문이다 — 옛 지침은 식초·알코올을 권했는데, 지금은 그게 자포(독침) 발사를 촉진한다고 본다.번역을 붙이면 그 위험이 그대로 옮겨온다. 한국어만 갱신되고 영어가 옛 지침으로 남으면 외국인 방문객은 현행과 반대되는 응급처치를 안내받는다. 읽을 수 있다는 점이 오히려 피해를 키운다.
그래서 번역 행에 번역 시점의 원문 해시를 저장하고, 읽을 때 어긋나면 그 번역을 버린다:
실제로 확인했다 — 원문을 고치자 영어 요청이
ko로 떨어지면서 갱신된 한국어를 내보낸다.읽을 수 있지만 틀릴 수 있는 글보다, 기계번역으로라도 돌려 읽을 수 있는 현행 원문이 낫다고 봤다.
설계 결정
title_en/body_en/… 로 늘리면 언어 추가마다 DDL 이 필요하고, 빈 칸과 "번역 없음" 이 구분되지 않는다.locale을 필터의 필수 인자로 — 기본값을 주면 새로 부르는 쪽이 잊어도 조용히 한국어가 나간다. 이 엔드포인트가 빠져 있던 원인이 정확히 그런 종류다.locale노출 — 실제로 내보낸 언어. 조용히 떨어진 것을 추적할 수 있어야 한다.("AB","C")와("A","BC")가 같은 해시가 된다.en/zh/ja 는 원어민·의료 검토를 받지 않았다. 의역하지 않고 절차·금지사항을 그대로 옮겼고, 특히 "수돗물로 씻지 마세요"·"온찜질 45℃" 는 표현보다 정확성을 택했다. 출처 표기(국립수산과학원)도 각 언어에 실었다.
검토를 기다리는 동안 한국어만 나가는 것보다 낫다고 판단했다. 배포 전 검토를 권한다.
검증
해시 검사를 지우면 단위 2건 + 스모크 1건이 깨지는 것을 확인했다.
HTTP 로 ko/en/zh/ja 네 언어 모두 확인했다.
prisma/sql/009-static-guide-translations.sql(dev·test 에는 적용 완료)README
"다국어" 절을 추가하고, 미해결 목록의 "다국어 DB 콘텐츠" 를 "일부만 됨" 으로 고쳤다. 남은 것은 해변 이름·해파리 종 정보·알림 문구이고, 종 정보는 오역이 안전에 직결되므로 번역 컬럼보다 검수 주체가 먼저 정해져야 한다.
백테스트 표본 수도
136주→156단위로 고쳤다 — 그 숫자로 "해역별 파라미터를 아직 못 한다" 를 설명하고 있어서 틀린 채로 두면 근거가 약해 보인다.