banner_enabled(쿠키 배너 노출) 토글 안내가 "마이페이지 동의 관리 카드"까지 함께 켜지고 꺼지는 것처럼 서술되어 있었으나, 실제로는 카드가 이 토글과 무관하게 동의/철회 이력이 있는 회원에게 항상 노출된다(GDPR Art.7(3) 철회 대칭성 보장, mypage_privacy_tab.json 회귀 가드로 이미 고정된 설계). 문구만 실제 동작과 어긋나 있어 ko/en 양쪽 hint 및 관련 코드 주석을 바로잡았다. 문구 확인 과정에서 field_legal_entity_name / field_data_storage_location / field_banner_enabled / field_banner_position 4개 필드가 텍스트 스타일 전용 클래스(section-heading-md, grid 미정의)를 컨테이너로 잘못 사용해 안내 문구가 길어지면 입력/토글 컨트롤이 아래 줄로 밀려나던 기존 UI 결함도 함께 발견해 수정했다. 같은 파일의 field_privacy_policy_slug가 이미 쓰던 올바른 grid-3col-responsive 패턴으로 통일.
285 lines
16 KiB
PHP
285 lines
16 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.',
|
|
],
|
|
'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',
|
|
'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',
|
|
],
|
|
],
|
|
'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',
|
|
],
|
|
],
|
|
'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',
|
|
'mypage' => 'MyPage',
|
|
],
|
|
'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',
|
|
],
|
|
];
|