허용목록이 플러그인 코드 상수라, 새 확장이 저장 키를 도입할 때마다 이 플러그인을 고쳐야 했다. 고치지 않으면 그 키는 방문마다 파기되는데 예외도 로그도 남지 않아 운영자에게는 "설정이 저장되지 않는다" 는 증상만 보인다. 허용목록을 운영자 설정(necessary_storage_allowlist)으로 옮기고, 관리자 환경설정에 브라우저 저장소·세션 저장소·쿠키 세 카드를 두어 직접 편집하게 했다. 확장은 GDPR 을 알 필요가 없고 GDPR 도 확장을 알 필요가 없다 — 연결은 운영자가 화면에서 한다. 저장 키를 플러그인이 관측·수집하지 않는 것도 같은 이유다: 관측 자체가 추적이다. 판정은 서버(미들웨어)와 클라이언트 셋(인터셉터 둘 + 정리기)이 같은 설정을 같은 매칭 규칙으로 읽는다. 잠금 항목(로그인 토큰·CSRF·세션 쿠키·동의 기록)만 설정 밖에 두고 판정 시점에 합집합으로 얹는다 — 설정에 담기면 저장 요청 한 번으로 지워져 잠금이 아니게 된다. 기설치본은 업그레이드 스텝이 현재 카탈로그를 설정 파일에 못박되, 운영자가 이미 편집했으면 그대로 둔다. 함께 고친 선재 결함 셋: - 차단 도메인 추천 목록이 응답에 실리지 않아 자동완성이 동작하지 않던 문제 - 세션 쿠키 이름을 기본값에서 바꾼 사이트에서 브라우저 측 목록의 그 항목이 죽던 문제 - 쿠키 목록에만 앞부분 매칭(`이름_*`)이 적용되지 않던 문제
305 lines
19 KiB
PHP
305 lines
19 KiB
PHP
<?php
|
|
|
|
return [
|
|
'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' => '카테고리별 도메인 목록은 배열이어야 합니다.',
|
|
],
|
|
'necessary_storage_allowlist' => [
|
|
'invalid_format_local_storage' => '브라우저 저장소 — 항목 형식이 올바르지 않습니다. (영문·숫자와 _ . : @ + - 사용, 끝에 * 하나만 가능)',
|
|
'invalid_format_session_storage' => '세션 저장소 — 항목 형식이 올바르지 않습니다. (영문·숫자와 _ . : @ + - 사용, 끝에 * 하나만 가능)',
|
|
'invalid_format_cookie' => '쿠키 — 항목 형식이 올바르지 않습니다. (영문·숫자와 _ . : @ + - 사용, 끝에 * 하나만 가능)',
|
|
'too_long_local_storage' => '브라우저 저장소 — 항목은 128자를 초과할 수 없습니다.',
|
|
'too_long_session_storage' => '세션 저장소 — 항목은 128자를 초과할 수 없습니다.',
|
|
'too_long_cookie' => '쿠키 — 항목은 128자를 초과할 수 없습니다.',
|
|
'must_be_array' => '저장소별 항목 목록은 배열이어야 합니다.',
|
|
'invalid_scope' => '알 수 없는 저장소 구분입니다: :scope (브라우저 저장소·세션 저장소·쿠키만 사용할 수 있습니다)',
|
|
],
|
|
'settings' => [
|
|
'saved' => '설정이 저장되었습니다.',
|
|
'title' => 'GDPR 설정',
|
|
'description' => '쿠키 동의 배너와 마이페이지 동의 관리 카드의 동작을 운영자가 제어합니다.',
|
|
'section' => [
|
|
'operator' => '운영 주체 / 개인정보처리방침',
|
|
'operator_desc' => '쿠키 배너·정책 페이지에 표시될 운영 주체, 데이터 저장 위치, 정책 페이지 슬러그를 등록합니다. (GDPR Art.13 투명성 의무)',
|
|
'cookie_banner' => '쿠키 동의 배너',
|
|
'cookie_banner_desc' => '방문자에게 표시되는 쿠키 동의 배너의 노출/위치/카테고리/정책 버전을 한 곳에서 설정합니다.',
|
|
'cookie_banner_settings' => '배너 표시 설정',
|
|
'cookie_categories' => '쿠키 카테고리',
|
|
'cookie_policy_version' => '쿠키 정책 버전',
|
|
'auto_blocking' => '자동 차단 정책',
|
|
'necessary_storage' => '필수 저장 항목',
|
|
'auto_blocking_desc' => '쿠키 배너 노출이 ON 일 때 아래 카테고리별 차단 도메인 목록의 외부 추적 리소스가 사용자 동의 전까지 자동 차단됩니다. (별도 토글 없음 — 배너 노출과 함께 자동 작동)',
|
|
],
|
|
'nav' => [
|
|
'operator' => '운영 정보',
|
|
'cookie_banner' => '쿠키 배너',
|
|
'auto_blocking_policy' => '자동 차단 정책',
|
|
],
|
|
'status' => [
|
|
'enabled' => '활성',
|
|
'disabled' => '비활성',
|
|
'visible' => '노출',
|
|
'hidden' => '숨김',
|
|
],
|
|
'fields' => [
|
|
'cookie_policy_version' => [
|
|
'label' => '정책 버전',
|
|
'hint' => "운영자가 직접 입력하지 않고 시스템이 자동 관리합니다.\n• 카테고리 추가/삭제, 카테고리 의미 변경, 정책 페이지 변경 → 새 버전 자동 발행 + 모든 회원 재동의\n• 도메인 추가/삭제, 라벨 변경 등 단순 변경 → 발행 없음",
|
|
],
|
|
'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)',
|
|
'sensitive_format' => '데이터 저장 위치에 IP 주소, CIDR, 클라우드 리전 코드(예: ap-northeast-2) 는 입력할 수 없습니다. 국가명(예: 대한민국, 미국) 으로 표기하세요.',
|
|
],
|
|
'banner_enabled' => [
|
|
'label' => '쿠키 배너 노출',
|
|
'hint' => '활성 시 쿠키 동의 배너 노출 + 동의 전 외부 추적 자동 차단이 함께 시작됩니다. (GDPR Art.6 "동의 전 처리 금지" 의 강제 메커니즘인 차단을 분리 토글로 끄지 못하도록 단일 토글로 통합) 마이페이지 동의 관리 카드는 이 토글과 무관하게 동의/철회 이력이 있는 회원에게 항상 노출됩니다.',
|
|
],
|
|
'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' => '도메인 형식: 점이 1개 이상 포함된 도메인. 와일드카드 *.example.com 가능. 단일 라벨(localhost) 및 한글 도메인(xn-- 변환) 미지원.',
|
|
'tag_input_placeholder' => '도메인 입력 후 Enter (예: google-analytics.com, *.hotjar.com)',
|
|
'tag_no_options' => '추천 도메인이 없습니다. 직접 입력하세요.',
|
|
'category' => [
|
|
'functional' => '기능 카테고리 차단 도메인',
|
|
'analytics' => '분석 카테고리 차단 도메인',
|
|
'marketing' => '마케팅 카테고리 차단 도메인',
|
|
],
|
|
],
|
|
'necessary_storage_allowlist' => [
|
|
'label' => '필수 저장 항목 허용목록',
|
|
],
|
|
'cookie_categories' => [
|
|
'description' => '쿠키 카테고리 4종의 용도와 차단 도구 예시는 각 카드의 [정보 펼치기] 에서 확인할 수 있습니다.',
|
|
'category_required_badge' => '필수',
|
|
'category_optional_badge' => '선택',
|
|
],
|
|
],
|
|
'save_success' => '설정이 저장되었습니다.',
|
|
'save_error' => '설정 저장 중 오류가 발생했습니다.',
|
|
'validation_error' => '입력 값을 확인해주세요.',
|
|
'policy_version' => [
|
|
'current_label' => '현재 버전',
|
|
'published_at_label' => '발행 일시',
|
|
'publisher_label' => '발행자',
|
|
'publisher_system' => '시스템',
|
|
'memo_label' => '변경 사유',
|
|
'publish_success' => '새 정책 버전이 발행되었습니다. 모든 회원이 다음 방문 시 재동의를 진행합니다.',
|
|
'publishing' => '발행 중...',
|
|
'change_type' => [
|
|
'material' => '재동의 트리거',
|
|
'non_material' => '단순 변경',
|
|
'initial' => '초기 발행',
|
|
],
|
|
'history_modal' => [
|
|
'title' => '정책 버전 발행 이력',
|
|
'empty' => '발행된 정책 버전이 없습니다.',
|
|
],
|
|
'history' => [
|
|
'col' => [
|
|
'version' => '버전',
|
|
'created_at' => '발행 일시',
|
|
'publisher' => '발행자',
|
|
'change_type' => '종류',
|
|
'memo' => '사유',
|
|
'snapshot_action' => '본문',
|
|
],
|
|
],
|
|
'history_page_summary' => '총 :total건 · :current / :last 페이지',
|
|
'history_prev' => '이전',
|
|
'history_next' => '다음',
|
|
'snapshot_view_short' => '보기',
|
|
'material_modal' => [
|
|
'title' => '정책 버전 발행 + 재동의 트리거',
|
|
'body' => '다음 변경은 정책 버전 자동 발행과 모든 회원의 재동의 트리거를 발생시킵니다.',
|
|
'effect_bump' => '정책 버전 자동 발행 (단조 증가)',
|
|
'effect_reconsent' => '모든 회원의 다음 방문 시 재동의 화면 노출',
|
|
'effect_history' => '이력 모달에 새 버전 row 추가',
|
|
'memo_label' => '변경 사유 (필수)',
|
|
'memo_placeholder' => '예: 분석 카테고리 신설 (Hotjar 도입)',
|
|
'confirm' => '새 버전 발행 후 저장',
|
|
],
|
|
'snapshot_modal' => [
|
|
'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' => '해당 정책 버전을 찾을 수 없습니다.',
|
|
],
|
|
],
|
|
'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' => '환경설정',
|
|
'register' => '회원가입',
|
|
'mypage' => '마이페이지',
|
|
'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' => '거부',
|
|
// 이슈 #430 — 각 동의 항목 상태별 표시 동사. Resource(status_label)가 status 로 골라 내려준다.
|
|
'status' => [
|
|
'granted' => '동의',
|
|
'consented' => '동의',
|
|
'revoked' => '철회',
|
|
'rejected' => '거부',
|
|
],
|
|
// 이슈 #430 (버튼 재설계) — 상태 배지 문구. Resource(status_badge_label).
|
|
'badge' => [
|
|
'required' => '항상 적용',
|
|
'consented' => '동의함',
|
|
'rejected' => '거부함',
|
|
'unset' => '미설정',
|
|
],
|
|
'revoke' => '철회',
|
|
'grant' => '동의',
|
|
'grant_again' => '다시 동의',
|
|
'required_label' => '필수',
|
|
'required_hint' => '서비스 제공에 필수적이라 철회할 수 없습니다.',
|
|
'revoke_confirm_title' => '동의 철회 확인',
|
|
'revoke_confirm_message' => '이 항목을 철회하시겠습니까? 동의를 철회하면 해당 카테고리 관련 기능이 제한될 수 있습니다.',
|
|
'no_consents' => '활성 동의 항목이 없습니다.',
|
|
'needs_renewal' => '쿠키 정책이 변경되었습니다. 동의를 갱신해주세요.',
|
|
'needs_renewal_with_version' => '쿠키 정책이 버전 {version} 으로 변경되었습니다. 선택 항목의 동의를 다시 확인해주세요.',
|
|
'needs_renewal_hint' => '필수 쿠키는 사이트 운영에 꼭 필요한 항목이므로 정책 변경과 무관하게 항상 적용됩니다.',
|
|
'btn_renew_all' => '현재 동의 갱신',
|
|
'btn_renew_this_item' => '정책 갱신',
|
|
'renew_all_success' => '활성 항목 {renewed} 개를 새 정책 버전으로 갱신했습니다.',
|
|
],
|
|
],
|
|
'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' => '변경된 정책 본문 보기',
|
|
],
|
|
];
|