Modern PHP User Group 2026-09 정기모임 설치 리뷰에서 접수된 제보 2건. 설치 완료·실패·중단·필수파일 안내는 페이지 최상단에 뜨는데, 진행 로그를 보느라 화면이 아래에 머물러 있으면 안내가 눈에 들어오지 않았다. 네 경로 모두 DOM 변경이 끝난 뒤 결과 섹션으로 부드럽게 이동시킨다(모션 최소화 설정 시 즉시 이동). 미인증 3화면의 테마 버튼은 setTheme 을 params.theme 으로 불렀는데 핸들러는 action.target 만 읽는다. 엔진에 상호 폴백이 없어 클릭이 콘솔 경고 한 줄만 남기고 아무 일도 하지 않았다. 로그인 이후 화면은 핸들러를 거치지 않는 ThemeToggle 을 쓰기 때문에 정상이었고, 그래서 이 세 화면에서만 나타났다. 같은 계약 불일치가 편집기 액션 레시피(admin 9·basic 3)와 두 템플릿 문서에도 있어 함께 고쳤다. 편집기로 만든 액션은 생성 즉시 no-op 이 되는데 오류가 남지 않는다. 정적 검사 레지스트리가 오히려 틀린 계약(params.theme 필수)을 강제하고 있어 올바른 형태를 막고 있었으므로 두 미러를 함께 정정했다. 테마를 고치는 과정에서 별개 결함이 드러났다. GDPR 스토리지 인터셉터가 기능 쿠키 미동의 상태에서 필수 목록 밖 저장을 부팅마다 파기하는데, 화면 테마가 그 목록에서 빠져 있었다. 저장소의 setItem 호출을 기계 도출해 대조한 결과 같은 이유로 사라지던 항목이 13건 더 있었다 — 비회원 주문 조회, 결제창 복귀 기록, 본인인증 복귀 기록, 관리자 화면 상태, 자산 주소 형식 캐시. 전량 필수로 분류하고, 동의 안내 문구가 "다크모드는 기능 쿠키" 라고 말하던 부분을 사실에 맞게 정정했다(기설치본의 저장된 문구는 업그레이드 스텝이 정정하며, 운영자가 고친 문구는 건드리지 않는다). 재발 방지는 허용목록을 직접 import 하고 모집단을 디렉토리 순회로 도출하는 커버리지 테스트가 맡는다 — 손으로 열거하지 않으므로 새 저장 키가 등재를 빠뜨리면 붉어진다.
329 lines
20 KiB
JSON
329 lines
20 KiB
JSON
{
|
|
"editor": {
|
|
"data_source": {
|
|
"gdprConsentLog": "동의 로그",
|
|
"gdprMeConsents": "내 동의 내역",
|
|
"gdprMyConsent": "내 동의",
|
|
"gdprMyConsents": "내 동의 내역",
|
|
"gdprPolicyVersionCurrent": "현재 정책 버전",
|
|
"gdprPolicyVersionHistory": "정책 버전 이력",
|
|
"gdprPolicyVersionSnapshot": "정책 버전 스냅샷",
|
|
"gdprPublicSettings": "GDPR 공개 설정",
|
|
"gdprSettings": "GDPR 설정"
|
|
}
|
|
},
|
|
"consent": {
|
|
"granted": "동의가 저장되었습니다.",
|
|
"granted_again": "동의가 갱신되었습니다.",
|
|
"rejected_saved": "동의하지 않고 계속합니다. 선택 항목은 사용되지 않습니다.",
|
|
"revoked": "동의가 철회되었습니다.",
|
|
"renew_all_success": "활성 항목 {renewed} 개를 새 정책 버전으로 갱신했습니다.",
|
|
"granting": "동의 중...",
|
|
"revoking": "철회 중...",
|
|
"renewing": "갱신 중...",
|
|
"already_same_state": "이미 동일한 상태입니다.",
|
|
"required_cannot_revoke": "필수 항목은 철회할 수 없습니다.",
|
|
"invalid_key": "유효하지 않은 동의 항목입니다.",
|
|
"category_cookie_necessary": "필수 쿠키",
|
|
"category_cookie_functional": "기능 쿠키",
|
|
"category_cookie_analytics": "분석 쿠키",
|
|
"category_cookie_marketing": "마케팅 쿠키"
|
|
},
|
|
"blocked_domains": {
|
|
"invalid_format": "올바른 도메인 형식이 아닙니다. (FQDN 만 지원, *.example.com 와일드카드 가능)",
|
|
"invalid_format_functional": "기능 카테고리 — 올바른 도메인 형식이 아닙니다. (FQDN 만 지원, *.example.com 와일드카드 가능)",
|
|
"invalid_format_analytics": "분석 카테고리 — 올바른 도메인 형식이 아닙니다. (FQDN 만 지원, *.example.com 와일드카드 가능)",
|
|
"invalid_format_marketing": "마케팅 카테고리 — 올바른 도메인 형식이 아닙니다. (FQDN 만 지원, *.example.com 와일드카드 가능)",
|
|
"too_long": "도메인은 253자를 초과할 수 없습니다.",
|
|
"too_long_functional": "기능 카테고리 — 도메인은 253자를 초과할 수 없습니다.",
|
|
"too_long_analytics": "분석 카테고리 — 도메인은 253자를 초과할 수 없습니다.",
|
|
"too_long_marketing": "마케팅 카테고리 — 도메인은 253자를 초과할 수 없습니다.",
|
|
"must_be_array": "카테고리별 도메인 목록은 배열이어야 합니다."
|
|
},
|
|
"settings": {
|
|
"saved": "설정이 저장되었습니다.",
|
|
"title": "GDPR 설정",
|
|
"description": "쿠키 동의 배너와 마이페이지 동의 관리 카드의 동작을 운영자가 제어합니다.",
|
|
"section": {
|
|
"operator": "운영 주체 / 개인정보처리방침",
|
|
"operator_desc": "쿠키 배너·정책 페이지에 표시될 운영 주체, 데이터 저장 위치, 정책 페이지 슬러그를 등록합니다.",
|
|
"cookie_banner": "쿠키 동의 배너",
|
|
"cookie_banner_desc": "방문자에게 표시되는 쿠키 동의 배너의 노출/위치/카테고리/정책 버전을 한 곳에서 설정합니다.",
|
|
"cookie_banner_settings": "배너 표시 설정",
|
|
"cookie_categories": "쿠키 카테고리",
|
|
"cookie_policy_version": "쿠키 정책 버전",
|
|
"auto_blocking": "자동 차단 정책",
|
|
"auto_blocking_desc": "쿠키 배너가 노출되면 카테고리별 도메인 목록의 외부 추적 리소스가 사용자 동의 전까지 자동 차단됩니다."
|
|
},
|
|
"nav": {
|
|
"operator": "운영 정보",
|
|
"cookie_banner": "쿠키 배너",
|
|
"auto_blocking_policy": "자동 차단 정책"
|
|
},
|
|
"status": {
|
|
"enabled": "활성",
|
|
"disabled": "비활성",
|
|
"visible": "노출",
|
|
"hidden": "숨김"
|
|
},
|
|
"fields": {
|
|
"cookie_policy_version": {
|
|
"label": "정책 버전",
|
|
"hint": "정책 본문, 카테고리 의미, 위탁자·데이터 보관 정보가 바뀌면 「+ 새 버전 발행」을 누르세요. 발행 즉시 모든 회원이 다음 방문 시 재동의를 진행합니다."
|
|
},
|
|
"privacy_policy_slug": {
|
|
"label": "개인정보처리방침 페이지 슬러그",
|
|
"hint": "페이지 플러그인에 등록된 처리방침 페이지의 슬러그. 비어 있으면 쿠키 배너의 정책 링크가 표시되지 않습니다.",
|
|
"placeholder": "예: privacy-policy"
|
|
},
|
|
"legal_entity_name": {
|
|
"label": "법인명 / 운영 주체",
|
|
"hint": "쿠키 배너와 마이페이지에 표시되는 사이트 운영 주체 이름입니다.",
|
|
"placeholder": "예: (주)회사명"
|
|
},
|
|
"data_storage_location": {
|
|
"label": "데이터 저장 위치",
|
|
"hint": "사용자에게 안내할 데이터 저장 국가를 입력하세요. 예: \"대한민국\", \"미국 (AWS)\". IP 주소, 클라우드 리전 코드(예: ap-northeast-2), 데이터센터 주소는 보안상 입력하지 마세요.",
|
|
"placeholder": "예: 대한민국 (자체 데이터센터) / 미국 (AWS)"
|
|
},
|
|
"banner_enabled": {
|
|
"label": "쿠키 배너 노출",
|
|
"hint": "활성 시 쿠키 배너 노출과 동의 전 외부 추적 자동 차단이 함께 시작됩니다. 마이페이지 동의 관리 카드는 이 토글과 무관하게 동의/철회 이력이 있는 회원에게 항상 노출됩니다."
|
|
},
|
|
"banner_position": {
|
|
"label": "배너 위치",
|
|
"hint": "쿠키 배너가 화면에 표시되는 위치를 선택합니다.",
|
|
"option_bottom_bar": "하단 (전체 폭)",
|
|
"option_bottom_left_popup": "좌하단 팝업",
|
|
"option_bottom_right_popup": "우하단 팝업",
|
|
"option_centered_modal": "중앙 모달"
|
|
},
|
|
"blocked_domains": {
|
|
"warnings_title": "안내",
|
|
"auto_blocking_off_hint": "자동 차단은 쿠키 배너 노출이 ON 일 때만 작동합니다. 「쿠키 배너」 카드에서 쿠키 배너 노출 토글을 먼저 켜세요.",
|
|
"warning_visual_break": "외부 폰트·스타일시트는 분류에 주의하세요. 잘못 차단하면 페이지가 조용히 깨질 수 있습니다.",
|
|
"warning_policy_bump": "차단 도메인을 변경한 후 쿠키 정책 버전을 올리세요. 기존 동의자가 새 도메인에도 동의한 것으로 처리되는 문제를 막습니다.",
|
|
"warning_domain_format": "도메인 형식: example.com, *.example.com (와일드카드) 가능. localhost 처럼 점이 없는 이름이나 한글 도메인은 지원하지 않습니다.",
|
|
"warning_scope_limit": "이 자동 차단은 플러그인·모듈이 등록하는 스크립트만 대상입니다. 「템플릿 외부 스크립트」 등 운영자가 직접 head 영역에 삽입한 외부 스크립트는 이 자동 차단의 보호 범위 밖이므로, 별도로 로드 조건을 확인하세요.",
|
|
"tag_input_placeholder": "도메인 입력 후 Enter (예: google-analytics.com, *.hotjar.com)",
|
|
"tag_no_options": "추천 도메인이 없습니다. 직접 입력하세요.",
|
|
"category": {
|
|
"functional": "기능 카테고리 차단 도메인",
|
|
"analytics": "분석 카테고리 차단 도메인",
|
|
"marketing": "마케팅 카테고리 차단 도메인"
|
|
}
|
|
},
|
|
"cookie_categories": {
|
|
"description": "쿠키 카테고리 4종의 용도와 차단 도구 예시는 각 카드의 [정보 펼치기] 에서 확인할 수 있습니다.",
|
|
"category_required_badge": "필수",
|
|
"category_optional_badge": "선택",
|
|
"info": {
|
|
"expand": "정보 펼치기",
|
|
"collapse": "정보 접기",
|
|
"description_label": "사용자 안내 문구",
|
|
"scope_label": "자동 차단 대상",
|
|
"tools_label": "대표 도구 예시",
|
|
"necessary": {
|
|
"scope": "자동 차단하지 않습니다. 세션·로그인 토큰, 장바구니 식별자, 사용자가 직접 고른 언어 설정과 화면 테마, 쿠키 동의 기록 등 사이트 동작에 꼭 필요한 항목은 항상 허용됩니다.",
|
|
"tools": "세션 ID, 인증 토큰, CSRF 토큰, 장바구니 식별자, 다국어 설정, 화면 테마 등 (별도 설정 불필요)"
|
|
},
|
|
"functional": {
|
|
"scope": "「자동 차단 정책」 탭의 기능 카테고리 도메인 목록에 등록된 외부 리소스가 동의 전까지 자동 차단됩니다. 또한 통화 선호 같은 사용자 편의 저장도 동의 후에만 보관됩니다.",
|
|
"tools": "고객지원 챗봇 (Crisp, Intercom, Tawk.to), 다국어 자동 번역 위젯, 사용자 설정 동기화 서비스 등"
|
|
},
|
|
"analytics": {
|
|
"scope": "「자동 차단 정책」 탭의 분석 카테고리 도메인 목록에 등록된 외부 분석 스크립트·임베드·트래킹 픽셀이 동의 전까지 자동 차단됩니다. 동의하면 즉시 복원되어 작동합니다.",
|
|
"tools": "Google Analytics 4 (GA4), Hotjar, Microsoft Clarity, Mixpanel, Matomo, 네이버 프리미엄 로그분석 등"
|
|
},
|
|
"marketing": {
|
|
"scope": "「자동 차단 정책」 탭의 마케팅 카테고리 도메인 목록에 등록된 외부 광고·임베드·트래킹 픽셀이 동의 전까지 자동 차단됩니다. 동의하면 즉시 복원되어 작동합니다.",
|
|
"tools": "Meta Pixel (Facebook), Google Ads 리마케팅, 카카오 픽셀, YouTube 영상 임베드 등"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"save_success": "설정이 저장되었습니다.",
|
|
"save_error": "설정 저장 중 오류가 발생했습니다.",
|
|
"validation_error": "입력 값을 확인해주세요.",
|
|
"unsaved_changes": "저장되지 않은 변경사항이 있습니다.",
|
|
"policy_version": {
|
|
"current_label": "현재 버전",
|
|
"published_at_label": "발행 일시",
|
|
"publisher_label": "발행자",
|
|
"publisher_system": "시스템",
|
|
"memo_label": "변경 사유",
|
|
"publish_button": "새 버전 발행",
|
|
"history_toggle_show": "이력 보기",
|
|
"history_toggle_hide": "이력 닫기",
|
|
"history_empty": "발행된 정책 버전이 없습니다.",
|
|
"publish_success": "새 정책 버전이 발행되었습니다. 모든 회원이 다음 방문 시 재동의를 진행합니다.",
|
|
"publishing": "발행 중...",
|
|
"guide_title": "언제 새 버전을 발행하나요?",
|
|
"guide_body": "차단 도메인 변경, UI 문구 수정 같은 운영상 변경은 새 버전 발행이 필요하지 않습니다.",
|
|
"change_type": {
|
|
"material": "재동의 트리거",
|
|
"non_material": "단순 변경",
|
|
"initial": "초기 발행"
|
|
},
|
|
"history": {
|
|
"col": {
|
|
"version": "버전",
|
|
"created_at": "발행 일시",
|
|
"publisher": "발행자",
|
|
"change_type": "종류",
|
|
"memo": "사유",
|
|
"snapshot_action": "본문"
|
|
}
|
|
},
|
|
"snapshot_view_short": "보기",
|
|
"material_modal": {
|
|
"title": "새 정책 버전 발행 + 재동의 트리거",
|
|
"body": "「새 버전 발행」 을 누르면 즉시 발행되며, 모든 사용자가 다음 방문 시 재동의해야 합니다.",
|
|
"effect_bump": "정책 버전 단조 증가 (예: v2 → v3)",
|
|
"effect_reconsent": "모든 회원이 다음 방문 시 재동의 화면을 보게 됩니다",
|
|
"effect_history": "이력 표에 새 버전 row 가 추가됩니다",
|
|
"memo_label": "변경 사유 (필수)",
|
|
"memo_placeholder": "예: 약관 페이지 본문 수정 / 위탁 운영자 변경",
|
|
"confirm": "새 버전 발행"
|
|
},
|
|
"snapshot_modal": {
|
|
"editor_label": "정책 버전 본문 보기",
|
|
"title": "정책 버전 v{version} 본문",
|
|
"description": "발행 시점 settings 의 카테고리 목록·정책 본문 슬러그·차단 도메인 등 전체 본문입니다. DPO 가 동의 분쟁 시 입증 자료로 활용합니다.",
|
|
"section_categories": "쿠키 카테고리",
|
|
"section_privacy_policy": "정책 본문 슬러그",
|
|
"section_blocked_domains": "차단 도메인 카탈로그",
|
|
"category_required_badge": "필수",
|
|
"no_categories": "등록된 카테고리가 없습니다.",
|
|
"no_blocked_domains": "등록된 차단 도메인이 없습니다.",
|
|
"view_button": "v{version} 본문 보기",
|
|
"close": "닫기",
|
|
"open_policy_page": "본문 페이지 열기",
|
|
"no_policy_slug": "등록된 정책 본문 페이지가 없습니다."
|
|
},
|
|
"not_found": "해당 정책 버전을 찾을 수 없습니다.",
|
|
"history_page_summary": "총 {total}건 · {current} / {last} 페이지",
|
|
"history_prev": "이전",
|
|
"history_next": "다음"
|
|
}
|
|
},
|
|
"admin": {
|
|
"consent_log": {
|
|
"title": "GDPR 동의 이력",
|
|
"description": "회원·게스트의 동의/철회 변경 이력을 조회합니다. IP·User-Agent 등 감사 정보가 함께 노출됩니다.",
|
|
"refresh": "새로고침",
|
|
"empty": "조회된 동의 이력이 없습니다.",
|
|
"clear_filters": "필터 초기화",
|
|
"guest_label": "게스트",
|
|
"view_member_tooltip": "회원 상세 페이지로 이동",
|
|
"search_placeholder": "이메일 또는 세션 ID 로 검색",
|
|
"search_button": "검색",
|
|
"search_type": {
|
|
"email": "이메일",
|
|
"session_id": "세션 ID"
|
|
},
|
|
"filter": {
|
|
"consent_key_label": "동의 항목",
|
|
"action_label": "액션",
|
|
"source_label": "출처",
|
|
"option_all": "전체"
|
|
},
|
|
"action": {
|
|
"granted": "동의",
|
|
"revoked": "철회",
|
|
"rejected": "거부"
|
|
},
|
|
"source": {
|
|
"banner": "배너",
|
|
"preference_center": "환경설정",
|
|
"mypage": "마이페이지",
|
|
"register": "회원가입",
|
|
"mypage_renew_all": "마이페이지 일괄 재동의",
|
|
"withdraw": "회원탈퇴"
|
|
},
|
|
"col": {
|
|
"created_at": "시점",
|
|
"subject": "주체",
|
|
"consent_key": "동의 항목",
|
|
"action": "액션",
|
|
"source": "출처",
|
|
"policy_version": "정책 버전",
|
|
"ip": "IP"
|
|
},
|
|
"detail": {
|
|
"session_id_label": "세션 ID",
|
|
"user_agent_label": "User-Agent",
|
|
"categories_label": "카테고리 스냅샷",
|
|
"categories_hint": "동의 시점에 회원이 카테고리별로 표시한 의사입니다. 정책 본문이 갱신되어도 이 기록은 불변으로 보존됩니다.",
|
|
"snapshot_granted": "동의",
|
|
"snapshot_revoked": "미동의"
|
|
}
|
|
}
|
|
},
|
|
"mypage": {
|
|
"privacy": {
|
|
"title": "쿠키 동의 관리",
|
|
"description": "사이트가 사용 중인 쿠키 항목에 대한 동의를 변경하거나 철회할 수 있습니다.",
|
|
"section_consents": "내 동의 현황",
|
|
"section_consents_hint": "동의/철회 시점에 따라 즉시 반영됩니다. 필수 항목은 철회할 수 없습니다.",
|
|
"col_consent_key": "동의 항목",
|
|
"col_consented": "상태",
|
|
"col_consented_at": "동의일",
|
|
"col_revoked_at": "철회일",
|
|
"col_policy_version": "정책 버전",
|
|
"col_action": "작업",
|
|
"consented": "동의",
|
|
"revoked": "철회",
|
|
"rejected_label": "거부",
|
|
"revoke": "철회",
|
|
"grant": "동의",
|
|
"grant_again": "다시 동의",
|
|
"label_suffix": "{label} 쿠키",
|
|
"locked_label": "필수",
|
|
"enable_all": "모두 동의",
|
|
"enable_all_hint": "동의하지 않은 선택 항목이 있습니다. 한 번에 모두 동의할 수 있습니다.",
|
|
"enable_all_success": "선택 항목에 모두 동의했습니다.",
|
|
"required_label": "필수",
|
|
"required_hint": "서비스 제공에 필수적이라 철회할 수 없습니다.",
|
|
"grant_confirm_title": "쿠키 동의 확인",
|
|
"grant_confirm_message": "이 쿠키에 동의하시겠습니까? 동의하면 해당 카테고리의 쿠키가 사용되며, 언제든 다시 철회할 수 있습니다.",
|
|
"revoke_confirm_title": "동의 철회 확인",
|
|
"revoke_confirm_message": "이 항목을 철회하시겠습니까? 동의를 철회하면 해당 카테고리 관련 기능이 제한될 수 있습니다.",
|
|
"revoke_target_consented_at": "동의 · {date}",
|
|
"no_consents": "활성 동의 항목이 없습니다.",
|
|
"needs_renewal": "쿠키 정책이 변경되었습니다. 동의를 갱신해주세요.",
|
|
"needs_renewal_with_version": "쿠키 정책이 버전 {version} 으로 변경되었습니다. 선택 항목의 동의를 다시 확인해주세요.",
|
|
"needs_renewal_hint": "필수 쿠키는 사이트 운영에 꼭 필요한 항목이므로 정책 변경과 무관하게 항상 적용됩니다.",
|
|
"btn_renew_all": "현재 동의 갱신",
|
|
"btn_renew_this_item": "정책 갱신",
|
|
"renew_all_success": "활성 항목 {renewed} 개를 새 정책 버전으로 갱신했습니다.",
|
|
"operator_and_storage_meta": "본 사이트는 {entity}이(가) 운영하며, 데이터는 {location}에 저장됩니다",
|
|
"operator_only_meta": "본 사이트는 {entity}이(가) 운영합니다",
|
|
"storage_only_meta": "사용자 데이터는 {location}에 저장됩니다"
|
|
}
|
|
},
|
|
"common": {
|
|
"loading": "불러오는 중...",
|
|
"refresh": "새로고침"
|
|
},
|
|
"banner": {
|
|
"re_appear_reason": "쿠키 정책이 버전 {version} 로 변경되어 동의를 다시 확인합니다.",
|
|
"consent_required_hint": "거부한 항목과 관련된 기능이 제한될 수 있습니다.",
|
|
"btn_renew_consent": "현재 동의 갱신",
|
|
"title": "쿠키 사용 안내",
|
|
"description": "본 사이트는 사용자 경험 개선과 분석을 위해 쿠키를 사용합니다. 항목별로 동의 여부를 선택할 수 있습니다.",
|
|
"accept_all": "모두 동의",
|
|
"reject_continue": "동의하지 않고 계속하기",
|
|
"preferences": "선택 동의",
|
|
"save": "선택 저장",
|
|
"policy_link": "개인정보처리방침",
|
|
"preferences_title": "쿠키 환경설정",
|
|
"preferences_description": "카테고리별 쿠키 사용을 개별 동의/철회할 수 있습니다. 필수 카테고리는 끌 수 없습니다.",
|
|
"category_required_badge": "필수",
|
|
"view_policy_label": "변경된 정책 본문 보기",
|
|
"operator_and_storage_line": "본 사이트는 {entity}이(가) 운영하며, 데이터는 {location}에 저장됩니다",
|
|
"operator_only_line": "본 사이트는 {entity}이(가) 운영합니다",
|
|
"storage_only_line": "사용자 데이터는 {location}에 저장됩니다"
|
|
}
|
|
}
|