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

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

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

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

305 lines
17 KiB
PHP

<?php
return [
'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 displayed in the cookie banner and policy page. (GDPR Art.13 transparency obligation)',
'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',
'necessary_storage' => 'Strictly Necessary Storage',
'auto_blocking_desc' => 'When the Cookie Banner is ON, external tracking resources matching the blocked-domain lists below are auto-blocked until the user consents. (No separate toggle — runs automatically with the banner.)',
],
'nav' => [
'operator' => 'Operator',
'cookie_banner' => 'Cookie Banner',
'auto_blocking_policy' => 'Auto-blocking Policy',
],
'status' => [
'enabled' => 'Enabled',
'disabled' => 'Disabled',
'visible' => 'Visible',
'hidden' => 'Hidden',
],
'fields' => [
'cookie_policy_version' => [
'label' => 'Policy Version',
'hint' => "Managed automatically by the system — operators do not enter values directly.\n• Adding/removing categories, category semantic changes, privacy policy page changes → new version auto-published + all members re-consent\n• Domain add/remove, label changes, etc. → no publication",
],
'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)',
'sensitive_format' => 'Data Storage Location cannot contain IP addresses, CIDR, or cloud region codes (e.g., ap-northeast-2). Use country names (e.g., Korea, United States) instead.',
],
'banner_enabled' => [
'label' => 'Show Cookie Banner',
'hint' => 'When enabled, the cookie consent banner and pre-consent auto-blocking are activated together. (Auto-blocking is the enforcement mechanism for GDPR Art.6 "no processing before consent" and is unified into a single toggle to prevent operators from disabling it independently.) 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: at least one dot. Wildcard *.example.com supported. Single-label (localhost) and IDN domains (convert to xn-- first) are not supported.',
'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' => [
'label' => 'Strictly Necessary Storage Allowlist',
],
'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',
],
],
'save_success' => 'Settings have been saved.',
'save_error' => 'An error occurred while saving settings.',
'validation_error' => 'Please check your inputs.',
'policy_version' => [
'current_label' => 'Current version',
'published_at_label' => 'Published at',
'publisher_label' => 'Publisher',
'publisher_system' => 'System',
'memo_label' => 'Change reason',
'publish_success' => 'A new policy version has been published. All members will be prompted to re-consent on their next visit.',
'publishing' => 'Publishing...',
'change_type' => [
'material' => 'Triggers re-consent',
'non_material' => 'Minor change',
'initial' => 'Initial publication',
],
'history_modal' => [
'title' => 'Policy version history',
'empty' => 'No policy versions have been published yet.',
],
'history' => [
'col' => [
'version' => 'Version',
'created_at' => 'Published at',
'publisher' => 'Publisher',
'change_type' => 'Type',
'memo' => 'Reason',
'snapshot_action' => 'Snapshot',
],
],
'history_page_summary' => ':total total · page :current / :last',
'history_prev' => 'Previous',
'history_next' => 'Next',
'snapshot_view_short' => 'View',
'material_modal' => [
'title' => 'Publish new policy version + trigger re-consent',
'body' => 'The following change will trigger an automatic policy version publication and require all members to re-consent.',
'effect_bump' => 'Automatic policy version publication (monotonic increment)',
'effect_reconsent' => 'All members will see the consent banner again on their next visit',
'effect_history' => 'A new version row will be added to the history modal',
'memo_label' => 'Change reason (required)',
'memo_placeholder' => 'e.g., Added analytics category (Hotjar integration)',
'confirm' => 'Publish new version and save',
],
'snapshot_modal' => [
'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.',
],
],
'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',
'register' => 'Sign-up',
'mypage' => 'MyPage',
'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',
// Issue #430 — per-item status verb chosen by the Resource (status_label) from status.
'status' => [
'granted' => 'Consented',
'consented' => 'Consented',
'revoked' => 'Revoked',
'rejected' => 'Rejected',
],
// Issue #430 (button redesign) — status badge text. Resource(status_badge_label).
'badge' => [
'required' => 'Always on',
'consented' => 'Consented',
'rejected' => 'Declined',
'unset' => 'Not set',
],
'revoke' => 'Revoke',
'grant' => 'Consent',
'grant_again' => 'Consent Again',
'required_label' => 'Required',
'required_hint' => 'This item is required for service operation and cannot be revoked.',
'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.',
'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.',
],
],
'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',
],
];