Files
Gnuboard7/plugins/_bundled/sirsoft-gdpr/resources/lang/en.json
T
HeuJung 1124fad027 feat(gdpr): 필수 저장 항목 허용목록을 운영자 설정으로 이관
허용목록이 플러그인 코드 상수라, 새 확장이 저장 키를 도입할 때마다 이 플러그인을
고쳐야 했다. 고치지 않으면 그 키는 방문마다 파기되는데 예외도 로그도 남지 않아
운영자에게는 "설정이 저장되지 않는다" 는 증상만 보인다.

허용목록을 운영자 설정(necessary_storage_allowlist)으로 옮기고, 관리자 환경설정에
브라우저 저장소·세션 저장소·쿠키 세 카드를 두어 직접 편집하게 했다. 확장은 GDPR 을
알 필요가 없고 GDPR 도 확장을 알 필요가 없다 — 연결은 운영자가 화면에서 한다.
저장 키를 플러그인이 관측·수집하지 않는 것도 같은 이유다: 관측 자체가 추적이다.

판정은 서버(미들웨어)와 클라이언트 셋(인터셉터 둘 + 정리기)이 같은 설정을 같은 매칭
규칙으로 읽는다. 잠금 항목(로그인 토큰·CSRF·세션 쿠키·동의 기록)만 설정 밖에 두고
판정 시점에 합집합으로 얹는다 — 설정에 담기면 저장 요청 한 번으로 지워져 잠금이
아니게 된다. 기설치본은 업그레이드 스텝이 현재 카탈로그를 설정 파일에 못박되,
운영자가 이미 편집했으면 그대로 둔다.

함께 고친 선재 결함 셋:
- 차단 도메인 추천 목록이 응답에 실리지 않아 자동완성이 동작하지 않던 문제
- 세션 쿠키 이름을 기본값에서 바꾼 사이트에서 브라우저 측 목록의 그 항목이 죽던 문제
- 쿠키 목록에만 앞부분 매칭(`이름_*`)이 적용되지 않던 문제
2026-09-03 22:18:18 +09:00

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}."
}
}