공공데이터 번역 cache와 원문 보존
공공데이터 원문을 보존하면서 검수 번역과 생성 번역 cache를 순서대로 적용한 구조
한강자리는 고정 UI 문구와 수집할 때마다 달라지는 공공데이터 텍스트를 분리해 번역한다. 버튼과 탭 이름은 앱 릴리스에 포함하지만 행사명, 시설명, 공지와 혼잡 메시지는 한국어 원문을 저장한 뒤 표시 언어를 고른다.
화면은 공식·검수 번역, 기계 번역 캐시, 한국어 원문 순으로 표시값을 찾는다. 한국어 원문은 번역 누락이나 오류를 확인하고 다시 번역할 때 사용한다.
두 종류의 번역
| 영역 | 원본 | 바뀌는 때 | 저장 위치 |
|---|---|---|---|
| 앱 UI 문구 | String Catalog | 앱 릴리스 | iOS 리소스 |
| 공공데이터 텍스트 | 한국어 원문 | 원천 수집 때 | Postgres |
| 검수/공식 번역 | 사람이 확인한 파일 | 검수 때 | JSON 파일 |
| 기계 번역 | 한국어 원문 hash | 수집 뒤 번역 작업 | 번역 캐시 |
UI 코드에는 문자열 key를 사용하고 실제 문구는 String Catalog에 둔다.
공공데이터의 한국어 원문은 번역과 별도로 보존한다. 원문은 출처 확인과 대체 표시에 사용하며 특정 언어의 번역이 비거나 잘못됐을 때 재번역과 검수의 기준이 된다.
검수된 번역을 먼저 찾는 순서
공공데이터 번역은 언어별 우선순위에 따라 표시값을 고른다.
flowchart TD
Request["표시할 한국어 원문과 언어"] --> Official{"공식 번역 있음?"}
Official -->|예| UseOfficial["공식 번역 표시"]
Official -->|아니오| Curated{"검수/수정 번역 있음?"}
Curated -->|예| UseCurated["검수 번역 표시"]
Curated -->|아니오| Machine{"캐시에<br/>해당 언어 있음?"}
Machine -->|예| UseMachine["캐시 번역 표시"]
Machine -->|아니오| Korean["한국어 원문 표시"]
공식 또는 검수된 번역은 기계 번역보다 먼저 선택한다. 사용할 번역이 없으면 한국어 원문을 표시한다.
빈 문자열과 key는 표시값에서 제외하고 사용할 번역이 없으면 한국어 원문을 반환한다.
빠진 언어만 채우는 번역 캐시
기계 번역 캐시는 한국어 원문 hash를 key로 한다. 같은 문자열이 행사, 시설, 주차장, 공원에서 반복되면 한 번만 번역하면 된다.
캐시 한 줄에는 원문, 언어별 번역값, 번역 엔진, 성공 여부, 만든 시각과 수정 시각이 들어간다. 번역 작업은 행 전체의 완료 여부 대신 언어별 누락을 확인한다.
어떤 문자열이 영어와 일본어만 채워지고 중국어 번체가 비어 있다면, 다음 번역 작업에서 빠진 언어만 다시 번역해야 한다.
sequenceDiagram autonumber participant Collector as 빠진 번역 수집기 participant Store as 번역 캐시 participant Provider as 번역 제공자 Collector->>Store: 빠진 언어가 있는 한국어 원문 찾기 Store-->>Collector: 번역할 원문 Collector->>Provider: 빠진 언어만 번역 Provider-->>Collector: 언어별 번역값 Collector->>Store: 기존 언어를 지우지 않고 저장
번역 작업은 이미 저장한 다른 언어 값을 유지하고 누락된 언어만 채운다.
기계 번역 검증 기준
기계 번역은 다음 조건을 통과한 값만 저장한다.
- 원문 언어가 그대로 남아 있으면 저장하지 않는다.
- 너무 긴 원문은 번역 할당량을 쓰지 않고 원문으로 둔다.
- 언어별로 없는 값은 기존 값을 지우지 않는다.
- 검수/공식 파일에 있는 고유명사는 기계 번역보다 우선한다.
검증 조건을 통과하지 못한 기계 번역은 저장하지 않는다. 운영자는 장소명, 시설명과 행사명 같은 고유명사를 검수 파일로 덮어쓸 수 있다.
표시 텍스트를 고르는 API
클라이언트는 번역 DB를 직접 읽지 않는다. 백엔드가 언어 힌트를 받아 LocalizedText 형태로 화면에 쓸 표시 텍스트를 내려준다.
flowchart TB KRText["한국어 원문"] --> Resolver["번역 고르기"] Assets["공식/검수 번역 파일"] --> Resolver Cache["기계 번역 캐시"] --> Resolver Resolver --> DTO["API 표시 필드"] DTO --> Client["iOS 앱과 위젯"]
iOS는 번역 저장소 대신 백엔드가 고른 표시값과 원문 대체 여부만 읽는다.
끝까지 남기는 한국어 원문
원문은 번역이 없을 때 표시할 문구이며 출처를 다시 확인할 근거다.
공공데이터는 한국어 원문과 출처 정보를 보존하고 번역은 화면에 보여주는 값으로 둔다. 번역 실패는 수집 결과에 영향을 주지 않는다.
번역이 이상하면 번역 캐시와 검수 파일을 확인한다. 원천 문장 자체가 달라졌다면 수집·정규화 기록을 확인한다.
API 표시값 선택 순서
백엔드는 공식·검수 번역, 기계 번역 캐시와 한국어 원문 순으로 표시값을 고른다. 언어별 누락은 다음 번역 작업에서 채우며 클라이언트에는 선택한 문구와 원문 대체 여부를 내려준다.
Comments
아직 댓글이 없습니다. 첫 댓글을 남겨주세요.
검토 대기 중