4.4 KiB
사용자 화면의 언어
hop.의 사용자 화면은 한국어(ko), 일본어(ja), 영어(en)를 지원합니다. 관리자 페이지의 본문·관리 기록·날짜 표시는 한국어를 유지합니다.
처음 접속할 때
- 같은 브라우저에 저장된 직접 선택 언어가 있으면 가장 먼저 적용합니다.
- 저장된 선택이 없고 기존 신뢰 프록시 설정으로 국가를 확인할 수 있으면 대한민국은 한국어, 일본은 일본어, 그 외 국가는 영어로 표시합니다.
- 국가를 확인할 수 없으면 브라우저의 지원 언어 목록을 참고하고, 지원 언어가 없으면 영어를 사용합니다.
새 위치 권한 요청, GPS 조회, 외부 IP 조회 서비스나 GeoIP DB를 추가하지 않습니다. 기존 CLIENT_IP_SOURCE=cloudflare와 TRUSTED_PROXY_CIDRS로 확인한 국가만 사용합니다. 직접 보낸 위조 국가 헤더는 기본 언어 판별에 쓰지 않습니다. IP 기반 국가가 실제 거주지와 같다는 보장은 없으므로 항상 직접 변경할 수 있습니다.
상단 언어 선택창에서 한국어 / 日本語 / English를 선택합니다. 선택은 localStorage의 hop-language에 저장하며, 같은 브라우저의 다른 탭과도 동기화합니다. 로그인 계정의 공통 설정이 아니므로 브라우저마다 다른 언어를 쓸 수 있습니다. 사이트 데이터를 지우면 저장된 선택도 지워집니다. 저장소를 쓸 수 없어도 현재 페이지에서 선택한 언어는 적용됩니다.
국가 응답을 기다리는 중 직접 선택한 언어도 우선합니다. 언어 전환은 앱을 다시 시작하거나 기기·세션·계정을 초기화하지 않습니다. 작성 중인 내용과 선택한 파일·전송 상태는 유지합니다.
번역 범위
기기 목록·연결 공간·파일/클립보드 전송·수락/거절·텍스트 복사·로그인/가입/비밀번호 변경·계정 보관함·알림·설치 안내를 번역합니다. 날짜는 사용자 화면의 언어와 브라우저 시간대에 맞춰 표시하고, 관리자 날짜는 기존 한국 시간 표시를 유지합니다. 사용자가 요청한 인증·비밀번호 재설정 메일은 요청 시 선택한 언어로 발송합니다. 링크·인증 토큰·메일 발송/요청 제한은 그대로입니다.
파일명·기기 이름·계정 표시 이름·메모·URL·전송 원문은 번역하지 않습니다. 사용자 메시지나 HTML을 번역 키로 실행하지 않고 Vue의 일반 텍스트 출력으로 표시합니다. 시스템 문구의 값은 한 번만 치환하므로 원문에 {p0} 같은 문자열이 있어도 재해석하지 않습니다.
공통 문구는 packages/shared/src/messages.js, 순수 언어 선택/치환 로직은 packages/shared/src/localization.js, 브라우저의 선택·날짜 처리는 apps/web/src/i18n.js에서 관리합니다. 한국어 원문을 번역 키로 사용하며 새 사용자 문구를 추가하면 영어·일본어와 변수 자리도 함께 추가합니다. 관리자 전용 문구는 이 카탈로그로 옮길 필요가 없습니다. API는 선택한 Accept-Language에 맞춰 최상위 시스템 message만 번역하며 자료 본문이나 API 코드·상태는 변경하지 않습니다. 기존 언어 헤더가 없는 클라이언트의 API 메시지는 한국어를 유지합니다.
설치 manifest는 언어별 이름/설명을 사용하고 오프라인 안내도 저장된 언어 또는 브라우저 언어로 표시합니다. 개인정보·파일·API 응답을 오프라인 캐시에 넣지 않습니다. OS 자체 클립보드 확인이나 브라우저 권한 창의 언어는 해당 OS/브라우저 설정을 따릅니다.
배포와 확인
DB 변경·자료 초기화·새 환경변수·Compose 변경이 없습니다. 같은 운영 Compose로 적용합니다.
git pull --ff-only origin main
sudo docker compose -f docker-compose.yaml up -d --build
npm test는 언어 우선순위·신뢰 헤더·번역 누락/변수·선택 언어의 오류와 인증 메일을 검증합니다. npm run test:e2e:languages는 세 언어의 기본값, 수동 선택/재접속/다른 탭 동기화, 영어 가입·인증, 영어→일본어 실제 전송, 원문/파일 보존, 보관함·날짜·오류·관리자 한국어·모바일·오프라인 안내를 확인합니다. 실제 메일 검증은 격리 발송 대역을 사용하며 Resend 운영 메일은 발송하지 않습니다.