허용목록이 플러그인 코드 상수라, 새 확장이 저장 키를 도입할 때마다 이 플러그인을 고쳐야 했다. 고치지 않으면 그 키는 방문마다 파기되는데 예외도 로그도 남지 않아 운영자에게는 "설정이 저장되지 않는다" 는 증상만 보인다. 허용목록을 운영자 설정(necessary_storage_allowlist)으로 옮기고, 관리자 환경설정에 브라우저 저장소·세션 저장소·쿠키 세 카드를 두어 직접 편집하게 했다. 확장은 GDPR 을 알 필요가 없고 GDPR 도 확장을 알 필요가 없다 — 연결은 운영자가 화면에서 한다. 저장 키를 플러그인이 관측·수집하지 않는 것도 같은 이유다: 관측 자체가 추적이다. 판정은 서버(미들웨어)와 클라이언트 셋(인터셉터 둘 + 정리기)이 같은 설정을 같은 매칭 규칙으로 읽는다. 잠금 항목(로그인 토큰·CSRF·세션 쿠키·동의 기록)만 설정 밖에 두고 판정 시점에 합집합으로 얹는다 — 설정에 담기면 저장 요청 한 번으로 지워져 잠금이 아니게 된다. 기설치본은 업그레이드 스텝이 현재 카탈로그를 설정 파일에 못박되, 운영자가 이미 편집했으면 그대로 둔다. 함께 고친 선재 결함 셋: - 차단 도메인 추천 목록이 응답에 실리지 않아 자동완성이 동작하지 않던 문제 - 세션 쿠키 이름을 기본값에서 바꾼 사이트에서 브라우저 측 목록의 그 항목이 죽던 문제 - 쿠키 목록에만 앞부분 매칭(`이름_*`)이 적용되지 않던 문제
363 lines
22 KiB
JSON
363 lines
22 KiB
JSON
{
|
|
"editor": {
|
|
"data_source": {
|
|
"gdprConsentLog": "Consent Log",
|
|
"gdprMeConsents": "My Consents",
|
|
"gdprMyConsent": "My Consent",
|
|
"gdprMyConsents": "My Consents",
|
|
"gdprPolicyVersionCurrent": "Current Policy Version",
|
|
"gdprPolicyVersionHistory": "Policy Version History",
|
|
"gdprPolicyVersionSnapshot": "Policy Version Snapshot",
|
|
"gdprPublicSettings": "GDPR Public Settings",
|
|
"gdprSettings": "GDPR Settings"
|
|
}
|
|
},
|
|
"consent": {
|
|
"granted": "Consent has been saved.",
|
|
"granted_again": "Consent has been renewed.",
|
|
"rejected_saved": "Continuing without consent. Optional items will not be used.",
|
|
"revoked": "Consent has been revoked.",
|
|
"renew_all_success": "{renewed} active consent item(s) renewed to the new policy version.",
|
|
"granting": "Granting...",
|
|
"revoking": "Revoking...",
|
|
"renewing": "Renewing...",
|
|
"already_same_state": "Already in the same state.",
|
|
"required_cannot_revoke": "Required consent cannot be revoked.",
|
|
"invalid_key": "Invalid consent key.",
|
|
"category_cookie_necessary": "Strictly Necessary",
|
|
"category_cookie_functional": "Functional",
|
|
"category_cookie_analytics": "Analytics",
|
|
"category_cookie_marketing": "Marketing"
|
|
},
|
|
"blocked_domains": {
|
|
"invalid_format": "Invalid domain format. (FQDN only; *.example.com wildcard supported)",
|
|
"invalid_format_functional": "Functional — Invalid domain format. (FQDN only; *.example.com wildcard supported)",
|
|
"invalid_format_analytics": "Analytics — Invalid domain format. (FQDN only; *.example.com wildcard supported)",
|
|
"invalid_format_marketing": "Marketing — Invalid domain format. (FQDN only; *.example.com wildcard supported)",
|
|
"too_long": "Domain cannot exceed 253 characters.",
|
|
"too_long_functional": "Functional — Domain cannot exceed 253 characters.",
|
|
"too_long_analytics": "Analytics — Domain cannot exceed 253 characters.",
|
|
"too_long_marketing": "Marketing — Domain cannot exceed 253 characters.",
|
|
"must_be_array": "Each category must be an array of domain strings."
|
|
},
|
|
"necessary_storage_allowlist": {
|
|
"invalid_format_local_storage": "Local storage — invalid item format. (Letters, digits and _ . : @ + - ; a single trailing * is allowed)",
|
|
"invalid_format_session_storage": "Session storage — invalid item format. (Letters, digits and _ . : @ + - ; a single trailing * is allowed)",
|
|
"invalid_format_cookie": "Cookie — invalid item format. (Letters, digits and _ . : @ + - ; a single trailing * is allowed)",
|
|
"too_long_local_storage": "Local storage — item cannot exceed 128 characters.",
|
|
"too_long_session_storage": "Session storage — item cannot exceed 128 characters.",
|
|
"too_long_cookie": "Cookie — item cannot exceed 128 characters.",
|
|
"must_be_array": "Each storage scope must be an array of item names.",
|
|
"invalid_scope": "Unknown storage scope: :scope (only local storage, session storage and cookies are allowed)"
|
|
},
|
|
"settings": {
|
|
"saved": "Settings have been saved.",
|
|
"title": "GDPR Settings",
|
|
"description": "Operators control the cookie consent banner and the MyPage privacy card.",
|
|
"section": {
|
|
"operator": "Operator / Privacy Policy",
|
|
"operator_desc": "Register the operator name, data storage location, and privacy policy page slug shown in the cookie banner and policy page.",
|
|
"cookie_banner": "Cookie Consent Banner",
|
|
"cookie_banner_desc": "Configure visibility, position, categories, and policy version of the cookie consent banner — all in one place.",
|
|
"cookie_banner_settings": "Banner Display Settings",
|
|
"cookie_categories": "Cookie Categories",
|
|
"cookie_policy_version": "Cookie Policy Version",
|
|
"auto_blocking": "Auto-blocking Policy",
|
|
"auto_blocking_desc": "When the cookie banner is shown, external tracking resources matching the blocked-domain lists below are auto-blocked until the user consents.",
|
|
"necessary_storage": "Strictly Necessary Storage",
|
|
"necessary_storage_desc": "Manage the items allowed to persist for visitors who have not consented to functional cookies. Anything not listed is cleared on every visit."
|
|
},
|
|
"nav": {
|
|
"operator": "Operator",
|
|
"cookie_banner": "Cookie Banner",
|
|
"auto_blocking_policy": "Auto-blocking Policy",
|
|
"necessary_storage": "Necessary Storage"
|
|
},
|
|
"status": {
|
|
"enabled": "Enabled",
|
|
"disabled": "Disabled",
|
|
"visible": "Visible",
|
|
"hidden": "Hidden"
|
|
},
|
|
"fields": {
|
|
"cookie_policy_version": {
|
|
"label": "Policy Version",
|
|
"hint": "When the policy body, category semantics, or operator/retention information changes, click \"+ Publish new version\". On publish, all members will re-consent on their next visit."
|
|
},
|
|
"privacy_policy_slug": {
|
|
"label": "Privacy Policy Page Slug",
|
|
"hint": "Slug of the privacy policy page registered in the Page plugin. If empty, the policy link in the cookie banner is hidden.",
|
|
"placeholder": "e.g., privacy-policy"
|
|
},
|
|
"legal_entity_name": {
|
|
"label": "Legal Entity / Operator Name",
|
|
"hint": "The operator name shown in the cookie banner and MyPage.",
|
|
"placeholder": "e.g., Acme Corp."
|
|
},
|
|
"data_storage_location": {
|
|
"label": "Data Storage Location",
|
|
"hint": "Country where user data is stored, shown to users. e.g., \"United States (AWS)\", \"Germany\". Do not enter IP addresses, cloud region codes (e.g., ap-northeast-2), or datacenter addresses — these are security-sensitive.",
|
|
"placeholder": "e.g., Korea (self-hosted IDC) / United States (AWS)"
|
|
},
|
|
"banner_enabled": {
|
|
"label": "Show Cookie Banner",
|
|
"hint": "When enabled, the cookie banner and pre-consent auto-blocking are activated together. The MyPage consent management card is independent of this toggle and always shows for members with consent/withdrawal history."
|
|
},
|
|
"banner_position": {
|
|
"label": "Banner Position",
|
|
"hint": "Choose where the cookie banner appears on screen.",
|
|
"option_bottom_bar": "Bottom bar (full width)",
|
|
"option_bottom_left_popup": "Bottom-left popup",
|
|
"option_bottom_right_popup": "Bottom-right popup",
|
|
"option_centered_modal": "Centered modal"
|
|
},
|
|
"blocked_domains": {
|
|
"warnings_title": "Notes",
|
|
"auto_blocking_off_hint": "Auto-blocking is only active when the Cookie Banner is ON. Enable Show Cookie Banner in the Cookie Banner card first.",
|
|
"warning_visual_break": "Be careful when classifying external font/stylesheet domains. Misclassification can break the page silently.",
|
|
"warning_policy_bump": "Bump the cookie policy version after changing the blocked domain list. This prevents existing consenters from being implicitly enrolled into newly added trackers.",
|
|
"warning_domain_format": "Domain format: example.com, *.example.com (wildcard) are supported. Names without dots (like localhost) and non-ASCII domains are not supported.",
|
|
"warning_scope_limit": "Auto-blocking only covers scripts registered by plugins/modules. External scripts inserted directly into the head area by admins (e.g. via Template External Scripts) are outside this protection — verify their load conditions separately.",
|
|
"tag_input_placeholder": "Type a domain and press Enter (e.g., google-analytics.com, *.hotjar.com)",
|
|
"tag_no_options": "No suggestions. Type to add.",
|
|
"category": {
|
|
"functional": "Functional — Blocked Domains",
|
|
"analytics": "Analytics — Blocked Domains",
|
|
"marketing": "Marketing — Blocked Domains"
|
|
}
|
|
},
|
|
"necessary_storage_allowlist": {
|
|
"warnings_title": "Notes",
|
|
"warning_purpose": "Only the items listed here survive without functional consent. Anything else is cleared on every visit, with no error or warning — it surfaces only as a setting that will not save.",
|
|
"warning_wildcard": "A trailing * matches every name with that prefix. For example g7_filters_* covers g7_filters_orders_1. The * is only allowed at the end.",
|
|
"warning_discovery": "The item names a newly installed extension writes are listed in that extension documentation, or visible in browser devtools (Application → Storage).",
|
|
"warning_necessary_only": "List only what the site genuinely needs to work. Adding tracking or analytics items defeats the pre-consent blocking principle.",
|
|
"locked_label": "Locked items (cannot be removed)",
|
|
"locked_hint": "The site cannot operate without these. They cannot be removed from the list.",
|
|
"tag_input_placeholder": "Type an item name and press Enter (e.g., g7_locale, myplugin_*)",
|
|
"tag_no_options": "No suggestions. Type to add.",
|
|
"scope": {
|
|
"local_storage": "Local storage (localStorage)",
|
|
"session_storage": "Session storage (sessionStorage)",
|
|
"cookie": "Cookies"
|
|
},
|
|
"scope_desc": {
|
|
"local_storage": "Persists after the browser is closed. User choices such as language and theme, and admin display preferences, live here.",
|
|
"session_storage": "Cleared when the tab closes. Used to restore the original screen when returning from a payment or identity verification window.",
|
|
"cookie": "Values the browser sends back to the server. Both server-set and client-written cookies are judged by this list."
|
|
}
|
|
},
|
|
"cookie_categories": {
|
|
"description": "Open each card's [Show details] to see the purpose of the four cookie categories and the blocked-tool examples.",
|
|
"category_required_badge": "Required",
|
|
"category_optional_badge": "Optional",
|
|
"info": {
|
|
"expand": "Show details",
|
|
"collapse": "Hide details",
|
|
"description_label": "User-facing description",
|
|
"scope_label": "Auto-blocking scope",
|
|
"tools_label": "Common tools",
|
|
"necessary": {
|
|
"scope": "Not auto-blocked. Session/auth tokens, shopping basket identifier, user-selected language preference and display theme, and cookie consent records are essential to site operation and always allowed.",
|
|
"tools": "Session IDs, authentication tokens, CSRF tokens, shopping basket identifier, language preference, display theme, etc. (no configuration required)"
|
|
},
|
|
"functional": {
|
|
"scope": "External resources matching the functional blocked-domain list (in the Auto-blocking Policy tab) are auto-blocked until the user consents. User preferences such as currency selection are also persisted only after consent.",
|
|
"tools": "Customer support chatbots (Crisp, Intercom, Tawk.to), translation widgets, user-preference synchronization services, etc."
|
|
},
|
|
"analytics": {
|
|
"scope": "External analytics scripts, embeds, and tracking pixels matching the analytics blocked-domain list (in the Auto-blocking Policy tab) are auto-blocked until the user consents. Resources are restored immediately on consent.",
|
|
"tools": "Google Analytics 4 (GA4), Hotjar, Microsoft Clarity, Mixpanel, Matomo, Naver Premium Log Analysis, etc."
|
|
},
|
|
"marketing": {
|
|
"scope": "External advertising, embeds, and tracking pixels matching the marketing blocked-domain list (in the Auto-blocking Policy tab) are auto-blocked until the user consents. Resources are restored immediately on consent.",
|
|
"tools": "Meta Pixel (Facebook), Google Ads remarketing, Kakao Pixel, YouTube video embeds, etc."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"save_success": "Settings have been saved.",
|
|
"save_error": "An error occurred while saving settings.",
|
|
"validation_error": "Please check your inputs.",
|
|
"unsaved_changes": "You have unsaved changes.",
|
|
"policy_version": {
|
|
"current_label": "Current version",
|
|
"published_at_label": "Published at",
|
|
"publisher_label": "Publisher",
|
|
"publisher_system": "System",
|
|
"memo_label": "Change reason",
|
|
"publish_button": "Publish new version",
|
|
"history_toggle_show": "View history",
|
|
"history_toggle_hide": "Hide history",
|
|
"history_empty": "No policy versions have been published yet.",
|
|
"publish_success": "A new policy version has been published. All members will be prompted to re-consent on their next visit.",
|
|
"publishing": "Publishing...",
|
|
"guide_title": "When to publish a new version",
|
|
"guide_body": "Routine operational changes such as editing blocked domains or tweaking UI labels do not require publishing a new version.",
|
|
"change_type": {
|
|
"material": "Triggers re-consent",
|
|
"non_material": "Minor change",
|
|
"initial": "Initial publication"
|
|
},
|
|
"history": {
|
|
"col": {
|
|
"version": "Version",
|
|
"created_at": "Published at",
|
|
"publisher": "Publisher",
|
|
"change_type": "Type",
|
|
"memo": "Reason",
|
|
"snapshot_action": "Snapshot"
|
|
}
|
|
},
|
|
"snapshot_view_short": "View",
|
|
"material_modal": {
|
|
"title": "Publish new policy version + trigger re-consent",
|
|
"body": "Clicking \"Publish new version\" publishes immediately, and all users must re-consent on their next visit.",
|
|
"effect_bump": "Policy version monotonic increment (e.g., v2 → v3)",
|
|
"effect_reconsent": "All members will see the consent screen on their next visit",
|
|
"effect_history": "A new version row will be added to the history table",
|
|
"memo_label": "Change reason (required)",
|
|
"memo_placeholder": "e.g., Privacy policy body update / Operator change",
|
|
"confirm": "Publish new version"
|
|
},
|
|
"snapshot_modal": {
|
|
"editor_label": "View policy version snapshot",
|
|
"title": "Policy version v{version} snapshot",
|
|
"description": "Full snapshot of settings at publication time — categories, privacy policy slug, blocked domains. Used by DPO as evidence in consent disputes.",
|
|
"section_categories": "Cookie categories",
|
|
"section_privacy_policy": "Privacy policy slug",
|
|
"section_blocked_domains": "Blocked domain catalog",
|
|
"category_required_badge": "Required",
|
|
"no_categories": "No categories registered.",
|
|
"no_blocked_domains": "No blocked domains registered.",
|
|
"view_button": "View v{version} snapshot",
|
|
"close": "Close",
|
|
"open_policy_page": "Open policy page",
|
|
"no_policy_slug": "No privacy policy page registered."
|
|
},
|
|
"not_found": "Policy version not found.",
|
|
"history_page_summary": "{total} total · page {current} / {last}",
|
|
"history_prev": "Previous",
|
|
"history_next": "Next"
|
|
}
|
|
},
|
|
"admin": {
|
|
"consent_log": {
|
|
"title": "GDPR Consent Log",
|
|
"description": "Audit consent and revocation history of members and guests. IP and User-Agent are included.",
|
|
"refresh": "Refresh",
|
|
"empty": "No consent log entries found.",
|
|
"clear_filters": "Clear filters",
|
|
"guest_label": "Guest",
|
|
"view_member_tooltip": "Open member detail page",
|
|
"search_placeholder": "Search by Email or Session ID",
|
|
"search_button": "Search",
|
|
"search_type": {
|
|
"email": "Email",
|
|
"session_id": "Session ID"
|
|
},
|
|
"filter": {
|
|
"consent_key_label": "Consent Key",
|
|
"action_label": "Action",
|
|
"source_label": "Source",
|
|
"option_all": "All"
|
|
},
|
|
"action": {
|
|
"granted": "Granted",
|
|
"revoked": "Revoked",
|
|
"rejected": "Rejected"
|
|
},
|
|
"source": {
|
|
"banner": "Banner",
|
|
"preference_center": "Preferences",
|
|
"mypage": "MyPage",
|
|
"register": "Sign-up",
|
|
"mypage_renew_all": "MyPage bulk re-consent",
|
|
"withdraw": "Account withdrawal"
|
|
},
|
|
"col": {
|
|
"created_at": "Time",
|
|
"subject": "Subject",
|
|
"consent_key": "Consent Key",
|
|
"action": "Action",
|
|
"source": "Source",
|
|
"policy_version": "Policy Version",
|
|
"ip": "IP"
|
|
},
|
|
"detail": {
|
|
"session_id_label": "Session ID",
|
|
"user_agent_label": "User-Agent",
|
|
"categories_label": "Categories Snapshot",
|
|
"categories_hint": "The member's category-by-category choices at the time of consent. This record stays immutable even after the policy is updated.",
|
|
"snapshot_granted": "Granted",
|
|
"snapshot_revoked": "Not Consented"
|
|
}
|
|
}
|
|
},
|
|
"mypage": {
|
|
"privacy": {
|
|
"title": "Cookie Consent",
|
|
"description": "Change or revoke your consent for the cookies this site uses.",
|
|
"section_consents": "My Consents",
|
|
"section_consents_hint": "Changes apply immediately. Required items cannot be revoked.",
|
|
"col_consent_key": "Consent",
|
|
"col_consented": "Status",
|
|
"col_consented_at": "Consented At",
|
|
"col_revoked_at": "Revoked At",
|
|
"col_policy_version": "Policy Version",
|
|
"col_action": "Action",
|
|
"consented": "Consented",
|
|
"revoked": "Revoked",
|
|
"rejected_label": "Rejected",
|
|
"revoke": "Revoke",
|
|
"grant": "Consent",
|
|
"grant_again": "Consent Again",
|
|
"label_suffix": "{label} cookies",
|
|
"locked_label": "Required",
|
|
"enable_all": "Consent to all",
|
|
"enable_all_hint": "You have optional items you haven't consented to. Consent to them all at once.",
|
|
"enable_all_success": "You have consented to all optional items.",
|
|
"required_label": "Required",
|
|
"required_hint": "This item is required for service operation and cannot be revoked.",
|
|
"grant_confirm_title": "Confirm Cookie Consent",
|
|
"grant_confirm_message": "Do you want to consent to this cookie? Once consented, this category's cookies will be used, and you can revoke it anytime.",
|
|
"revoke_confirm_title": "Revoke Consent",
|
|
"revoke_confirm_message": "Are you sure you want to revoke this consent? Revoking consent may limit features related to that category.",
|
|
"revoke_target_consented_at": "Consented · {date}",
|
|
"no_consents": "No active consent items.",
|
|
"needs_renewal": "The cookie policy has been updated. Please renew your consent.",
|
|
"needs_renewal_with_version": "The cookie policy has been updated to version {version}. Please review the optional consent items.",
|
|
"needs_renewal_hint": "Strictly necessary cookies are essential for site operation and remain unchanged regardless of policy updates.",
|
|
"btn_renew_all": "Renew Current Consent",
|
|
"btn_renew_this_item": "Renew Policy",
|
|
"renew_all_success": "Renewed {renewed} active item(s) to the new policy version.",
|
|
"operator_and_storage_meta": "This site is operated by {entity}, and data is stored in {location}.",
|
|
"operator_only_meta": "This site is operated by {entity}.",
|
|
"storage_only_meta": "User data is stored in {location}."
|
|
}
|
|
},
|
|
"common": {
|
|
"loading": "Loading...",
|
|
"refresh": "Refresh"
|
|
},
|
|
"banner": {
|
|
"re_appear_reason": "The cookie policy has been updated to version {version}. Please review your consent.",
|
|
"consent_required_hint": "Features related to declined categories may be limited.",
|
|
"btn_renew_consent": "Renew Current Consent",
|
|
"title": "Cookie Notice",
|
|
"description": "This site uses cookies to improve user experience and for analytics. You can choose which cookies to allow.",
|
|
"accept_all": "Accept All",
|
|
"reject_continue": "Continue without consent",
|
|
"preferences": "Select Consent",
|
|
"save": "Save Selection",
|
|
"policy_link": "Privacy Policy",
|
|
"preferences_title": "Cookie Preferences",
|
|
"preferences_description": "You can grant or revoke each category individually. Required categories cannot be turned off.",
|
|
"category_required_badge": "Required",
|
|
"view_policy_label": "View updated policy",
|
|
"operator_and_storage_line": "This site is operated by {entity}, and data is stored in {location}.",
|
|
"operator_only_line": "This site is operated by {entity}.",
|
|
"storage_only_line": "User data is stored in {location}."
|
|
}
|
|
}
|