':attribute 필드를 승인해야 합니다.', 'accepted_if' => ':other이(가) :value일 때 :attribute 필드를 승인해야 합니다.', 'active_url' => ':attribute 필드는 유효한 URL이어야 합니다.', 'after' => ':attribute 필드는 :date 이후 날짜여야 합니다.', 'after_or_equal' => ':attribute 필드는 :date 이후 또는 같은 날짜여야 합니다.', 'alpha' => ':attribute 필드는 문자만 포함해야 합니다.', 'alpha_dash' => ':attribute 필드는 문자, 숫자, 대시, 밑줄만 포함해야 합니다.', 'alpha_num' => ':attribute 필드는 문자와 숫자만 포함해야 합니다.', 'array' => ':attribute 필드는 배열이어야 합니다.', 'ascii' => ':attribute 필드는 싱글바이트 영숫자 문자와 기호만 포함해야 합니다.', 'before' => ':attribute 필드는 :date 이전 날짜여야 합니다.', 'before_or_equal' => ':attribute 필드는 :date 이전 또는 같은 날짜여야 합니다.', 'between' => [ 'array' => ':attribute 필드는 :min ~ :max개의 항목을 포함해야 합니다.', 'file' => ':attribute 필드는 :min ~ :max KB 사이여야 합니다.', 'numeric' => ':attribute 필드는 :min ~ :max 사이여야 합니다.', 'string' => ':attribute 필드는 :min ~ :max자 사이여야 합니다.', ], 'boolean' => ':attribute 필드는 true 또는 false여야 합니다.', 'can' => ':attribute 필드에 허용되지 않은 값이 포함되어 있습니다.', 'confirmed' => ':attribute 필드 확인이 일치하지 않습니다.', 'contains' => ':attribute 필드에 필수 값이 누락되었습니다.', 'current_password' => '비밀번호가 올바르지 않습니다.', 'date' => ':attribute 필드는 유효한 날짜여야 합니다.', 'date_equals' => ':attribute 필드는 :date와 같은 날짜여야 합니다.', 'date_format' => ':attribute 필드는 :format 형식과 일치해야 합니다.', 'decimal' => ':attribute 필드는 :decimal 자릿수의 소수점이어야 합니다.', 'declined' => ':attribute 필드를 거부해야 합니다.', 'declined_if' => ':other이(가) :value일 때 :attribute 필드를 거부해야 합니다.', 'different' => ':attribute 필드와 :other은(는) 달라야 합니다.', 'digits' => ':attribute 필드는 :digits 자릿수여야 합니다.', 'digits_between' => ':attribute 필드는 :min ~ :max 자릿수 사이여야 합니다.', 'dimensions' => ':attribute 필드의 이미지 크기가 올바르지 않습니다.', 'distinct' => ':attribute 필드에 중복된 값이 있습니다.', 'doesnt_end_with' => ':attribute 필드는 다음으로 끝나면 안 됩니다: :values.', 'doesnt_start_with' => ':attribute 필드는 다음으로 시작하면 안 됩니다: :values.', 'email' => ':attribute 필드는 유효한 이메일 주소여야 합니다.', 'ends_with' => ':attribute 필드는 다음 중 하나로 끝나야 합니다: :values.', 'enum' => '선택한 :attribute이(가) 올바르지 않습니다.', 'exists' => '선택한 :attribute이(가) 올바르지 않습니다.', 'extensions' => ':attribute 필드는 다음 확장자 중 하나여야 합니다: :values.', 'file' => ':attribute 필드는 파일이어야 합니다.', 'filled' => ':attribute 필드에 값이 있어야 합니다.', 'gt' => [ 'array' => ':attribute 필드는 :value개보다 많은 항목을 포함해야 합니다.', 'file' => ':attribute 필드는 :value KB보다 커야 합니다.', 'numeric' => ':attribute 필드는 :value보다 커야 합니다.', 'string' => ':attribute 필드는 :value자보다 길어야 합니다.', ], 'gte' => [ 'array' => ':attribute 필드는 :value개 이상의 항목을 포함해야 합니다.', 'file' => ':attribute 필드는 :value KB 이상이어야 합니다.', 'numeric' => ':attribute 필드는 :value 이상이어야 합니다.', 'string' => ':attribute 필드는 :value자 이상이어야 합니다.', ], 'hex_color' => ':attribute 필드는 유효한 16진수 색상이어야 합니다.', 'image' => ':attribute 필드는 이미지여야 합니다.', 'in' => '선택한 :attribute이(가) 올바르지 않습니다.', 'in_array' => ':attribute 필드는 :other에 존재해야 합니다.', 'integer' => ':attribute 필드는 정수여야 합니다.', 'ip' => ':attribute 필드는 유효한 IP 주소여야 합니다.', 'ipv4' => ':attribute 필드는 유효한 IPv4 주소여야 합니다.', 'ipv6' => ':attribute 필드는 유효한 IPv6 주소여야 합니다.', 'json' => ':attribute 필드는 유효한 JSON 문자열이어야 합니다.', 'list' => ':attribute 필드는 목록이어야 합니다.', 'lowercase' => ':attribute 필드는 소문자여야 합니다.', 'lt' => [ 'array' => ':attribute 필드는 :value개보다 적은 항목을 포함해야 합니다.', 'file' => ':attribute 필드는 :value KB보다 작아야 합니다.', 'numeric' => ':attribute 필드는 :value보다 작아야 합니다.', 'string' => ':attribute 필드는 :value자보다 짧아야 합니다.', ], 'lte' => [ 'array' => ':attribute 필드는 :value개를 초과하면 안 됩니다.', 'file' => ':attribute 필드는 :value KB 이하여야 합니다.', 'numeric' => ':attribute 필드는 :value 이하여야 합니다.', 'string' => ':attribute 필드는 :value자 이하여야 합니다.', ], 'mac_address' => ':attribute 필드는 유효한 MAC 주소여야 합니다.', 'max' => [ 'array' => ':attribute 필드는 :max개를 초과하면 안 됩니다.', 'file' => ':attribute 필드는 :max KB를 초과하면 안 됩니다.', 'numeric' => ':attribute 필드는 :max를 초과하면 안 됩니다.', 'string' => ':attribute 필드는 :max자를 초과하면 안 됩니다.', ], 'max_digits' => ':attribute 필드는 :max 자릿수를 초과하면 안 됩니다.', 'mimes' => ':attribute 필드는 다음 유형의 파일이어야 합니다: :values.', 'mimetypes' => ':attribute 필드는 다음 유형의 파일이어야 합니다: :values.', 'min' => [ 'array' => ':attribute 필드는 최소 :min개 이상이어야 합니다.', 'file' => ':attribute 필드는 최소 :min KB 이상이어야 합니다.', 'numeric' => ':attribute 필드는 최소 :min 이상이어야 합니다.', 'string' => ':attribute 필드는 최소 :min자 이상이어야 합니다.', ], 'min_digits' => ':attribute 필드는 최소 :min 자릿수 이상이어야 합니다.', 'missing' => ':attribute 필드가 없어야 합니다.', 'missing_if' => ':other이(가) :value일 때 :attribute 필드가 없어야 합니다.', 'missing_unless' => ':other이(가) :value이(가) 아닌 경우 :attribute 필드가 없어야 합니다.', 'missing_with' => ':values이(가) 있을 때 :attribute 필드가 없어야 합니다.', 'missing_with_all' => ':values이(가) 모두 있을 때 :attribute 필드가 없어야 합니다.', 'multiple_of' => ':attribute 필드는 :value의 배수여야 합니다.', 'not_in' => '선택한 :attribute이(가) 올바르지 않습니다.', 'not_regex' => ':attribute 필드 형식이 올바르지 않습니다.', 'numeric' => ':attribute 필드는 숫자여야 합니다.', 'password' => [ 'letters' => ':attribute 필드는 최소 하나의 문자를 포함해야 합니다.', 'mixed' => ':attribute 필드는 최소 하나의 대문자와 소문자를 포함해야 합니다.', 'numbers' => ':attribute 필드는 최소 하나의 숫자를 포함해야 합니다.', 'symbols' => ':attribute 필드는 최소 하나의 기호를 포함해야 합니다.', 'uncompromised' => '주어진 :attribute이(가) 데이터 유출에 나타났습니다. 다른 :attribute을(를) 선택해 주세요.', ], 'present' => ':attribute 필드가 있어야 합니다.', 'present_if' => ':other이(가) :value일 때 :attribute 필드가 있어야 합니다.', 'present_unless' => ':other이(가) :value이(가) 아닌 경우 :attribute 필드가 있어야 합니다.', 'present_with' => ':values이(가) 있을 때 :attribute 필드가 있어야 합니다.', 'present_with_all' => ':values이(가) 모두 있을 때 :attribute 필드가 있어야 합니다.', 'prohibited' => ':attribute 필드는 금지되어 있습니다.', 'prohibited_if' => ':other이(가) :value일 때 :attribute 필드는 금지되어 있습니다.', 'prohibited_unless' => ':other이(가) :values에 없는 경우 :attribute 필드는 금지되어 있습니다.', 'prohibits' => ':attribute 필드는 :other이(가) 존재하는 것을 금지합니다.', 'regex' => ':attribute 필드 형식이 올바르지 않습니다.', 'required' => ':attribute 필드는 필수입니다.', 'required_array_keys' => ':attribute 필드는 다음 항목을 포함해야 합니다: :values.', 'required_if' => ':other이(가) :value일 때 :attribute 필드는 필수입니다.', 'required_if_accepted' => ':other이(가) 승인되면 :attribute 필드는 필수입니다.', 'required_if_declined' => ':other이(가) 거부되면 :attribute 필드는 필수입니다.', 'required_unless' => ':other이(가) :values에 없는 경우 :attribute 필드는 필수입니다.', 'required_with' => ':values이(가) 있을 때 :attribute 필드는 필수입니다.', 'required_with_all' => ':values이(가) 모두 있을 때 :attribute 필드는 필수입니다.', 'required_without' => ':values이(가) 없을 때 :attribute 필드는 필수입니다.', 'required_without_all' => ':values이(가) 모두 없을 때 :attribute 필드는 필수입니다.', 'same' => ':attribute 필드와 :other이(가) 일치해야 합니다.', 'size' => [ 'array' => ':attribute 필드는 :size개의 항목을 포함해야 합니다.', 'file' => ':attribute 필드는 :size KB여야 합니다.', 'numeric' => ':attribute 필드는 :size여야 합니다.', 'string' => ':attribute 필드는 :size자여야 합니다.', ], 'starts_with' => ':attribute 필드는 다음 중 하나로 시작해야 합니다: :values.', 'string' => ':attribute 필드는 문자열이어야 합니다.', 'timezone' => ':attribute 필드는 유효한 시간대여야 합니다.', 'unique' => ':attribute은(는) 이미 사용 중입니다.', 'uploaded' => ':attribute 업로드에 실패했습니다.', 'uppercase' => ':attribute 필드는 대문자여야 합니다.', 'url' => ':attribute 필드는 유효한 URL이어야 합니다.', 'ulid' => ':attribute 필드는 유효한 ULID여야 합니다.', 'uuid' => ':attribute 필드는 유효한 UUID여야 합니다.', /* |-------------------------------------------------------------------------- | 프로젝트 검증 메시지 |-------------------------------------------------------------------------- */ // 레이아웃 구조 검증 메시지 'custom_translation' => [ 'layout_name' => [ 'required' => '레이아웃 이름은 필수입니다.', 'string' => '레이아웃 이름은 문자열이어야 합니다.', 'max' => '레이아웃 이름은 :max자를 초과할 수 없습니다.', ], 'locale' => [ 'required' => '로케일은 필수입니다.', 'string' => '로케일은 문자열이어야 합니다.', ], 'value' => [ 'required' => '번역 값은 필수입니다.', 'string' => '번역 값은 문자열이어야 합니다.', ], 'values' => [ 'required' => '번역 값은 필수입니다.', 'array' => '번역 값은 로케일별 객체여야 합니다.', ], 'status' => [ 'in' => '상태는 active 또는 orphaned 여야 합니다.', ], 'expected_lock_version' => [ 'required' => '저장 요청에 expected_lock_version 이 누락되었습니다.', 'integer' => 'expected_lock_version 은 정수여야 합니다.', 'min' => 'expected_lock_version 은 0 이상이어야 합니다.', ], 'ids' => [ 'required' => '삭제할 다국어 키를 하나 이상 선택해야 합니다.', 'array' => '삭제 대상은 ID 배열이어야 합니다.', 'min' => '삭제할 다국어 키를 하나 이상 선택해야 합니다.', 'integer' => '다국어 키 ID 는 정수여야 합니다.', 'exists' => '존재하지 않는 다국어 키가 포함되어 있습니다.', ], ], 'layout' => [ // 낙관적 잠금 'expected_lock_version' => [ 'required' => '저장 요청에 expected_lock_version 이 누락되었습니다.', 'integer' => 'expected_lock_version 은 정수여야 합니다.', 'min' => 'expected_lock_version 은 0 이상이어야 합니다.', ], 'invalid_json' => '유효하지 않은 JSON 형식입니다.', 'must_be_array' => '레이아웃 데이터는 배열이어야 합니다.', 'required_field_missing' => "필수 필드 ':field'가 누락되었습니다.", 'version_must_be_string' => 'version 필드는 문자열이어야 합니다.', 'layout_name_must_be_string' => 'layout_name 필드는 문자열이어야 합니다.', 'components_must_be_array' => 'components 필드는 배열이어야 합니다.', 'components_or_slots_required' => '상속 레이아웃은 components 또는 slots 중 하나가 필요합니다.', 'component_must_be_array' => 'components[:index]는 배열이어야 합니다.', 'max_depth_exceeded' => '컴포넌트 중첩 깊이가 최대 허용 깊이(:max)를 초과했습니다.', 'component_required_field_missing' => "components[:index]에 필수 필드 ':field'가 누락되었습니다.", 'component_field_must_be_string' => 'components[:index].component는 문자열이어야 합니다.', 'component_name_must_be_string' => 'components[:index].name은 문자열이어야 합니다.', 'component_type_invalid' => 'components[:index].type은 basic, composite, layout 중 하나여야 합니다.', 'props_must_be_object' => 'components[:index].props는 객체(배열)여야 합니다.', 'children_must_be_array' => 'components[:index].children은 배열이어야 합니다.', 'permissions_must_be_array' => 'components[:index].permissions는 배열이어야 합니다.', 'permissions_must_be_array_or_object' => 'permissions는 배열 또는 구조화 객체(or/and)여야 합니다.', 'permissions_invalid_operator' => 'permissions 구조에서 유효한 연산자는 "or" 또는 "and"만 허용됩니다. 키는 정확히 1개여야 합니다.', 'permissions_operator_must_be_array' => 'permissions의 ":operator" 연산자 값은 배열이어야 합니다.', 'permissions_operator_min_items' => 'permissions의 ":operator" 연산자에는 최소 :min개 항목이 필요합니다.', 'permissions_max_depth_exceeded' => 'permissions 구조의 최대 중첩 깊이(:max)를 초과했습니다.', 'permission_must_be_string' => 'components[:index].permissions[:perm_index]는 문자열이어야 합니다.', 'permission_must_be_string_or_group' => 'permissions의 항목[:index]은 문자열(권한 식별자) 또는 구조화 객체(or/and)여야 합니다.', 'permission_invalid_format' => 'components[:index].permissions의 ":permission"은 올바른 권한 식별자 형식이 아닙니다.', 'actions_must_be_array' => 'components[:index].actions는 배열이어야 합니다.', 'action_must_be_array' => 'components[:index].actions[:actionIndex]는 배열이어야 합니다.', 'action_type_missing' => "components[:index].actions[:actionIndex]에 필수 필드 'type'이 누락되었습니다.", 'action_type_or_event_missing' => "components[:index].actions[:actionIndex]에 'type' 또는 'event' 중 하나가 필요합니다.", 'action_type_must_be_string' => 'components[:index].actions[:actionIndex].type은 문자열이어야 합니다.', 'action_event_must_be_string' => 'components[:index].actions[:actionIndex].event는 문자열이어야 합니다.', // UpdateLayoutRequest 검증 메시지 'content' => [ 'required' => '레이아웃 content가 필요합니다.', 'array' => '레이아웃 content는 배열이어야 합니다.', ], 'version' => [ 'required' => '레이아웃 버전이 필요합니다.', 'string' => '레이아웃 버전은 문자열이어야 합니다.', ], 'layout_name' => [ 'required' => '레이아웃 이름이 필요합니다.', 'string' => '레이아웃 이름은 문자열이어야 합니다.', 'max' => '레이아웃 이름은 :max자를 초과할 수 없습니다.', ], 'endpoint' => [ 'required' => 'API 엔드포인트가 필요합니다.', 'string' => 'API 엔드포인트는 문자열이어야 합니다.', ], 'extends' => [ 'string' => 'extends는 문자열이어야 합니다.', ], 'slots' => [ 'array' => 'slots는 배열이어야 합니다.', ], 'components' => [ 'required' => '컴포넌트 배열이 필요합니다.', 'array' => 'components 필드는 배열이어야 합니다.', ], 'data_sources' => [ 'array' => 'data_sources 필드는 배열이어야 합니다.', ], 'metadata' => [ 'array' => 'metadata 필드는 배열이어야 합니다.', ], 'meta' => [ 'array' => 'meta 필드는 배열이어야 합니다.', 'title' => [ 'string' => 'meta.title은 문자열이어야 합니다.', ], 'description' => [ 'string' => 'meta.description은 문자열이어야 합니다.', ], 'keywords' => [ 'string' => 'meta.keywords는 문자열이어야 합니다.', ], 'auth_required' => [ 'boolean' => 'meta.auth_required는 불린이어야 합니다.', ], 'is_base' => [ 'boolean' => 'meta.is_base는 불린이어야 합니다.', ], 'guest_only' => [ 'boolean' => 'meta.guest_only는 불린이어야 합니다.', ], 'is_error_layout' => [ 'boolean' => 'meta.is_error_layout은 불린이어야 합니다.', ], 'error_code' => [ 'integer' => 'meta.error_code는 정수여야 합니다.', ], 'seo' => [ 'array' => 'meta.seo는 배열이어야 합니다.', 'enabled' => [ 'boolean' => 'meta.seo.enabled는 불린이어야 합니다.', ], 'data_sources' => [ 'array' => 'meta.seo.data_sources는 배열이어야 합니다.', 'string' => 'meta.seo.data_sources의 각 항목은 문자열이어야 합니다.', ], 'priority' => [ 'numeric' => 'meta.seo.priority는 숫자여야 합니다.', 'min' => 'meta.seo.priority는 0 이상이어야 합니다.', 'max' => 'meta.seo.priority는 1 이하여야 합니다.', ], 'changefreq' => [ 'string' => 'meta.seo.changefreq는 문자열이어야 합니다.', 'in' => 'meta.seo.changefreq는 always, hourly, daily, weekly, monthly, yearly, never 중 하나여야 합니다.', ], 'og' => [ 'array' => 'meta.seo.og는 배열이어야 합니다.', ], 'structured_data' => [ 'array' => 'meta.seo.structured_data는 배열이어야 합니다.', ], 'page_type' => [ 'string' => 'meta.seo.page_type은 문자열이어야 합니다.', ], 'toggle_setting' => [ 'string' => 'meta.seo.toggle_setting은 문자열이어야 합니다.', ], 'vars' => [ 'array' => 'meta.seo.vars는 배열이어야 합니다.', ], 'extensions' => [ 'array' => 'meta.seo.extensions는 배열이어야 합니다.', ], ], ], 'modals' => [ 'array' => 'modals 필드는 배열이어야 합니다.', ], 'state' => [ 'array' => 'state 필드는 배열이어야 합니다.', ], 'init_actions' => [ 'array' => 'init_actions 필드는 배열이어야 합니다.', ], 'defines' => [ 'array' => 'defines 필드는 배열이어야 합니다.', ], 'init_state' => [ 'array' => 'init_state 필드는 배열이어야 합니다.', ], 'initLocal' => [ 'array' => 'initLocal 필드는 배열이어야 합니다.', ], 'initGlobal' => [ 'array' => 'initGlobal 필드는 배열이어야 합니다.', ], 'global_state' => [ 'array' => 'global_state 필드는 배열이어야 합니다.', ], 'errorHandling' => [ 'array' => 'errorHandling 필드는 배열이어야 합니다.', ], 'actions' => [ 'array' => 'actions 필드는 배열이어야 합니다.', ], 'pageConfig' => [ 'array' => 'pageConfig 필드는 배열이어야 합니다.', ], 'schema' => [ 'array' => 'schema 필드는 배열이어야 합니다.', ], 'routes' => [ 'array' => 'routes 필드는 배열이어야 합니다.', ], 'computed' => [ 'array' => 'computed 필드는 배열이어야 합니다.', ], 'permissions' => [ 'array' => 'permissions 필드는 배열이어야 합니다.', 'string' => '각 권한 식별자는 문자열이어야 합니다.', 'regex' => '권한 식별자 형식이 올바르지 않습니다. (예: module.entity.action)', ], 'globalHeaders' => [ 'array' => 'globalHeaders 필드는 배열이어야 합니다.', 'pattern' => [ 'required' => '각 globalHeaders 규칙에는 pattern 필드가 필요합니다.', 'string' => 'globalHeaders pattern은 문자열이어야 합니다.', ], 'headers' => [ 'required' => '각 globalHeaders 규칙에는 headers 필드가 필요합니다.', 'array' => 'globalHeaders headers는 배열이어야 합니다.', 'string' => '헤더 값은 문자열이어야 합니다.', ], ], 'transition_overlay' => [ 'enabled' => [ 'boolean' => '전환 오버레이 활성화는 true 또는 false 값이어야 합니다.', ], 'style' => [ 'string' => '전환 오버레이 스타일은 문자열이어야 합니다.', 'in' => '전환 오버레이 스타일은 opaque, blur, fade, skeleton 중 하나여야 합니다.', ], 'target' => [ 'string' => '전환 오버레이 타겟은 문자열이어야 합니다.', 'max' => '전환 오버레이 타겟은 :max자를 초과할 수 없습니다.', ], 'fallback_target' => [ 'string' => '전환 오버레이 대체 타겟은 문자열이어야 합니다.', 'max' => '전환 오버레이 대체 타겟은 :max자를 초과할 수 없습니다.', ], 'skeleton' => [ 'array' => '스켈레톤 설정은 배열이어야 합니다.', 'component' => [ 'string' => '스켈레톤 컴포넌트 이름은 문자열이어야 합니다.', 'max' => '스켈레톤 컴포넌트 이름은 :max자를 초과할 수 없습니다.', ], 'animation' => [ 'string' => '스켈레톤 애니메이션은 문자열이어야 합니다.', 'in' => '스켈레톤 애니메이션은 pulse, wave, none 중 하나여야 합니다.', ], 'iteration_count' => [ 'integer' => '스켈레톤 반복 횟수는 정수여야 합니다.', 'min' => '스켈레톤 반복 횟수는 최소 :min이어야 합니다.', 'max' => '스켈레톤 반복 횟수는 최대 :max를 초과할 수 없습니다.', ], ], 'wait_for' => [ 'background' => 'wait_for 에는 background 데이터소스를 지정할 수 없습니다 (사용자 차단 불가): :id', 'websocket' => 'wait_for 에는 websocket 데이터소스를 지정할 수 없습니다 (fetch 완료 이벤트 없음): :id', ], ], ], // 레이아웃 확장 검증 메시지 'layout_extension' => [ // 낙관적 잠금 'expected_lock_version' => [ 'required' => '저장 요청에 expected_lock_version 이 누락되었습니다.', 'integer' => 'expected_lock_version 은 정수여야 합니다.', 'min' => 'expected_lock_version 은 0 이상이어야 합니다.', ], 'invalid_json' => '유효하지 않은 JSON 형식입니다.', 'must_be_array' => '레이아웃 확장 데이터는 배열이어야 합니다.', 'target_required' => "확장 정의에는 'extension_point' 또는 'target_layout' 중 하나가 필요합니다.", 'target_exclusive' => "'extension_point'와 'target_layout'은 동시에 지정할 수 없습니다.", 'extension_point_invalid' => 'extension_point 필드는 비어있지 않은 문자열이어야 합니다.', 'target_layout_invalid' => 'target_layout 필드는 비어있지 않은 문자열이어야 합니다.', 'components_must_be_array' => 'components 필드는 배열이어야 합니다.', 'injections_required' => 'overlay 확장은 injections 필드가 필요합니다.', 'injections_must_be_array' => 'injections 필드는 배열이어야 합니다.', 'injection_must_be_array' => 'injections[:index]는 배열이어야 합니다.', 'injection_target_id_required' => 'injections[:index]에 target_id 필드가 필요합니다.', 'injection_position_invalid' => 'injections[:index].position 값이 유효하지 않습니다.', 'injection_components_must_be_array' => 'injections[:index].components는 배열이어야 합니다.', 'injection_props_must_be_array' => 'injections[:index].props는 배열이어야 합니다.', 'section_must_be_array' => ':section 필드는 배열이어야 합니다.', 'max_depth_exceeded' => '컴포넌트 중첩 깊이가 최대 허용 깊이(:max)를 초과했습니다.', 'component_must_be_array' => 'components[:index]는 배열이어야 합니다.', 'component_required_field_missing' => "components[:index]에 필수 필드 ':field'가 누락되었습니다.", 'component_name_must_be_string' => 'components[:index].name은 문자열이어야 합니다.', 'component_type_invalid' => 'components[:index].type은 basic, composite, layout 중 하나여야 합니다.', 'props_must_be_object' => 'components[:index].props는 객체(배열)여야 합니다.', 'children_must_be_array' => 'components[:index].children은 배열이어야 합니다.', 'content' => [ 'required' => '확장 콘텐츠는 필수입니다.', 'array' => '확장 콘텐츠는 배열이어야 합니다.', ], 'priority' => [ 'integer' => 'priority는 정수여야 합니다.', 'min' => 'priority는 0 이상이어야 합니다.', 'max' => 'priority는 9999 이하여야 합니다.', ], 'data_sources' => [ 'array' => 'data_sources는 배열이어야 합니다.', ], 'preview_layout' => [ 'string' => '미리보기 레이아웃명은 문자열이어야 합니다.', 'max' => '미리보기 레이아웃명은 255자를 초과할 수 없습니다.', 'required' => '확장점 미리보기에는 대표 레이아웃 선택이 필요합니다.', ], ], // API 엔드포인트 검증 메시지 'endpoint' => [ 'must_be_string' => 'API 엔드포인트는 문자열이어야 합니다.', 'external_url_not_allowed' => '외부 URL은 허용되지 않습니다.', 'not_whitelisted' => '허용되지 않은 API 엔드포인트입니다. 허용된 패턴: :pattern', 'path_traversal_detected' => '경로 트래버설 공격이 감지되었습니다.', ], // 외부 URL 차단 검증 메시지 'external_url' => [ 'detected_in_props' => 'props에서 외부 URL이 감지되었습니다: :url', 'detected_in_actions' => 'actions에서 외부 URL이 감지되었습니다: :url', 'http_not_allowed' => 'HTTP 프로토콜 URL은 허용되지 않습니다.', 'https_not_allowed' => 'HTTPS 프로토콜 URL은 허용되지 않습니다.', 'data_uri_not_allowed' => 'Data URI 스킴은 허용되지 않습니다.', 'javascript_uri_not_allowed' => 'JavaScript URI 스킴은 허용되지 않습니다.', 'dangerous_scheme_detected' => '위험한 URI 스킴이 감지되었습니다: :scheme', ], // 서버가 대신 호출하는 URL(외부 API·스케줄 등) 검증 메시지 'outbound_url' => [ 'invalid' => '올바른 형식의 URL이 아닙니다. http 또는 https 로 시작하는 주소를 입력해 주세요.', 'internal_not_allowed' => '내부 네트워크 주소(사설 IP·localhost 등)는 사용할 수 없습니다. 외부에서 접속 가능한 주소를 입력해 주세요.', ], // 서버에서 실행되는 스케줄 command(쉘·Artisan) 검증 메시지 'schedule_command' => [ 'shell_not_allowed' => '허용되지 않은 쉘 명령입니다. 서버에 등록된 실행 파일만 사용할 수 있으며, 파이프(|)·세미콜론(;) 등 특수문자는 쓸 수 없습니다.', 'artisan_denied' => '이 Artisan 명령은 보안상 스케줄로 실행할 수 없습니다.', 'artisan_not_allowlisted' => '예약 실행이 허용된 Artisan 명령이 아닙니다. 캐시 정리·큐 처리 등 유지보수 명령만 등록할 수 있습니다.', 'artisan_malformed' => 'Artisan 명령 형식이 올바르지 않습니다. 따옴표·역슬래시·단축 옵션(-v)은 쓸 수 없고 "명령명 --옵션[=값]" 형태만 등록할 수 있습니다.', 'artisan_option_denied' => '이 Artisan 명령에 허용되지 않은 옵션이 포함되어 있습니다.', 'artisan_argument_denied' => '이 Artisan 명령에는 추가 인자를 붙일 수 없습니다.', ], // 컴포넌트 존재 여부 검증 메시지 'component' => [ 'template_id_required' => '컴포넌트 검증을 위해서는 template_id가 필요합니다.', 'manifest_not_found' => '템플릿 :templateId의 컴포넌트 매니페스트(components.json)를 찾을 수 없습니다.', 'name_empty' => 'components[:index].component 이름은 비어있을 수 없습니다.', 'not_found' => "컴포넌트 ':component'는 템플릿에 등록되지 않았습니다. (components[:index])", ], // FormRequest 필드 검증 메시지 'request' => [ 'template_id' => [ 'required' => '템플릿 ID는 필수입니다.', 'integer' => '템플릿 ID는 정수여야 합니다.', 'exists' => '존재하지 않는 템플릿입니다.', ], 'layout_name' => [ 'required' => '레이아웃 이름은 필수입니다.', 'string' => '레이아웃 이름은 문자열이어야 합니다.', 'max' => '레이아웃 이름은 :max자를 초과할 수 없습니다.', 'unique' => '이미 존재하는 레이아웃 이름입니다.', ], 'content' => [ 'required' => '레이아웃 내용은 필수입니다.', 'array' => '레이아웃 내용은 배열(객체)이어야 합니다.', ], ], // 레이아웃 상속 검증 메시지 'layout_inheritance' => [ // 부모 레이아웃 검증 'parent_not_found' => '부모 레이아웃 ":parent"를 찾을 수 없습니다.', 'parent_not_in_same_template' => '부모 레이아웃은 같은 템플릿 내에 있어야 합니다.', 'circular_reference' => '레이아웃 순환 참조가 감지되었습니다: :trace', 'max_depth_exceeded' => '레이아웃 상속 깊이가 최대 허용 깊이(:max)를 초과했습니다.', 'extends_must_be_string' => 'extends 필드는 문자열이어야 합니다.', // 슬롯 검증 'slots_must_be_object' => 'slots 필드는 객체여야 합니다.', 'slot_name_must_be_string' => '슬롯 이름은 문자열이어야 합니다.', 'slot_value_must_be_array' => 'slots[:slotName]은 배열이어야 합니다.', 'slot_not_defined_in_parent' => '슬롯 ":slotName"은 부모 레이아웃에 정의되지 않았습니다.', 'parent_has_no_slots' => '부모 레이아웃에는 슬롯이 정의되지 않았습니다.', // 데이터 소스 병합 검증 'data_source_id_duplicate' => 'data_sources에 중복된 ID ":id"가 있습니다.', 'data_sources_must_be_array' => 'data_sources는 배열이어야 합니다.', 'data_source_must_have_id' => 'data_sources[:index]에 필수 필드 "id"가 누락되었습니다.', 'data_source_id_must_be_string' => 'data_sources[:index].id는 문자열이어야 합니다.', ], // 알림 채널 검증 메시지 'notification_channel' => [ 'invalid' => '알림 채널 식별자가 올바르지 않습니다.', 'unavailable' => "사용할 수 없는 알림 채널입니다: ':value'", ], // 다국어 필드 검증 메시지 'translatable' => [ 'must_be_array' => '다국어 필드는 배열이어야 합니다.', 'unsupported_language' => "지원되지 않는 언어 코드입니다: ':lang'", 'must_be_string' => "':lang' 번역은 문자열이어야 합니다.", 'max_length' => "':lang' 번역은 :max자를 초과할 수 없습니다.", 'min_length' => "':lang' 번역은 최소 :min자 이상이어야 합니다.", 'at_least_one_required' => '최소 하나의 언어로 번역이 필요합니다.', 'current_locale_required' => ':locale 언어의 값은 필수입니다.', ], // 템플릿 검증 메시지 // 메뉴 검증 메시지 'menu' => [ 'roles' => [ 'array' => '역할 목록은 배열이어야 합니다.', 'integer' => '역할 ID는 숫자여야 합니다.', 'exists' => '선택한 역할을 찾을 수 없습니다.', ], 'name' => [ 'required' => '메뉴 이름을 입력해주세요.', ], 'slug' => [ 'required' => '슬러그를 입력해주세요.', 'unique' => '이미 사용 중인 슬러그입니다.', 'max' => '슬러그는 :max자를 초과할 수 없습니다.', ], 'url' => [ 'required' => '경로(URL)를 입력해주세요.', 'max' => 'URL은 :max자를 초과할 수 없습니다.', ], 'icon' => [ 'max' => '아이콘은 :max자를 초과할 수 없습니다.', ], 'order' => [ 'integer' => '순서는 정수여야 합니다.', 'min' => '순서는 :min 이상이어야 합니다.', ], 'parent_id' => [ 'exists' => '존재하지 않는 부모 메뉴입니다.', ], 'is_active' => [ 'boolean' => '활성화 상태는 true 또는 false 값이어야 합니다.', ], 'extension_type' => [ 'in' => '확장 타입은 core, module, plugin 중 하나여야 합니다.', ], 'extension_identifier' => [ 'max' => '확장 식별자는 최대 255자까지 입력 가능합니다.', 'must_be_string' => '확장 식별자는 문자열이어야 합니다.', 'min_parts' => '확장 식별자는 vendor-name 형식이어야 합니다 (예: sirsoft-board).', 'empty_part' => '확장 식별자에 빈 부분이 있습니다. 하이픈이 연속되거나 양끝에 올 수 없습니다.', 'invalid_characters' => '확장 식별자는 영문 소문자, 숫자, 언더스코어(_)만 사용할 수 있습니다.', 'empty_word' => '확장 식별자에서 언더스코어가 연속되거나 양끝에 올 수 없습니다.', 'word_starts_with_digit' => '확장 식별자의 각 단어는 숫자로 시작할 수 없습니다.', ], 'parent_menus' => [ 'required' => '부모 메뉴 순서 배열은 필수입니다.', 'array' => '부모 메뉴 순서는 배열이어야 합니다.', 'min' => '최소 1개 이상의 부모 메뉴가 필요합니다.', 'id' => [ 'required' => '각 부모 메뉴 ID는 필수입니다.', 'integer' => '부모 메뉴 ID는 정수여야 합니다.', 'exists' => '존재하지 않는 부모 메뉴 ID가 포함되어 있습니다.', ], 'order' => [ 'required' => '각 부모 메뉴 순서는 필수입니다.', 'integer' => '부모 메뉴 순서는 정수여야 합니다.', 'min' => '메뉴 순서는 1 이상이어야 합니다.', ], ], 'child_menus' => [ 'array' => '자식 메뉴 순서는 배열이어야 합니다.', 'id' => [ 'required' => '각 자식 메뉴 ID는 필수입니다.', 'integer' => '자식 메뉴 ID는 정수여야 합니다.', 'exists' => '존재하지 않는 자식 메뉴 ID가 포함되어 있습니다.', ], 'order' => [ 'required' => '각 자식 메뉴 순서는 필수입니다.', 'integer' => '자식 메뉴 순서는 정수여야 합니다.', 'min' => '메뉴 순서는 1 이상이어야 합니다.', ], ], 'moved_items' => [ 'array' => '이동 항목은 배열이어야 합니다.', 'id' => [ 'required' => '이동할 메뉴 ID는 필수입니다.', 'integer' => '메뉴 ID는 정수여야 합니다.', 'exists' => '존재하지 않는 메뉴 ID가 포함되어 있습니다.', ], 'new_parent_id' => [ 'integer' => '새 부모 메뉴 ID는 정수여야 합니다.', 'exists' => '존재하지 않는 부모 메뉴 ID입니다.', ], ], ], // 권한 검증 메시지 'permission' => [ 'name' => [ 'required' => '권한 이름을 입력해주세요.', ], 'description' => [ 'max' => '권한 설명은 :max자를 초과할 수 없습니다.', ], ], // 역할 검증 메시지 'role' => [ 'name' => [ 'required' => '역할 이름을 입력해주세요.', ], 'description' => [ 'max' => '역할 설명은 :max자를 초과할 수 없습니다.', ], ], // 템플릿 검증 메시지 'template' => [ 'name' => [ 'max' => '템플릿 이름은 :max자를 초과할 수 없습니다.', ], 'description' => [ 'max' => '템플릿 설명은 :max자를 초과할 수 없습니다.', ], 'metadata' => [ 'array' => 'metadata는 배열이어야 합니다.', ], 'status' => [ 'in' => 'status는 active 또는 inactive여야 합니다.', ], ], // 모듈 검증 메시지 'module' => [ 'status' => [ 'in' => 'status는 active, inactive, installed, uninstalled 중 하나여야 합니다.', ], ], // 플러그인 검증 메시지 'plugin' => [ 'status' => [ 'in' => 'status는 active, inactive, installed, uninstalled 중 하나여야 합니다.', ], ], // 템플릿 경로 검증 메시지 'template_path' => [ 'must_be_string' => '템플릿 경로는 문자열이어야 합니다.', 'traversal_detected' => '경로 트래버설 패턴이 감지되었습니다: :pattern', 'absolute_path_not_allowed' => '절대 경로는 허용되지 않습니다.', 'null_byte_detected' => 'NULL 바이트 공격이 감지되었습니다.', 'outside_base_directory' => '기준 디렉토리 외부 경로는 허용되지 않습니다.', 'file_type_not_allowed' => '허용되지 않은 파일 타입입니다. 확장자: :extension (허용: :allowed)', ], // 확장 식별자 검증 메시지 (ValidExtensionIdentifier Rule) 'extension_identifier' => [ 'max' => '확장 식별자는 최대 255자까지 입력 가능합니다.', 'must_be_string' => '확장 식별자는 문자열이어야 합니다.', 'min_parts' => '확장 식별자는 vendor-name 형식이어야 합니다 (예: sirsoft-board).', 'empty_part' => '확장 식별자에 빈 부분이 있습니다. 하이픈이 연속되거나 양끝에 올 수 없습니다.', 'invalid_characters' => '확장 식별자는 영문 소문자, 숫자, 언더스코어(_)만 사용할 수 있습니다.', 'empty_word' => '확장 식별자에서 언더스코어가 연속되거나 양끝에 올 수 없습니다.', 'word_starts_with_digit' => '확장 식별자의 각 단어는 숫자로 시작할 수 없습니다.', ], // 모듈 경로 검증 메시지 'module_path' => [ 'file_type_not_allowed' => '허용되지 않은 파일 타입입니다. 확장자: :extension (허용: :allowed)', 'must_be_string' => '경로는 문자열이어야 합니다.', 'traversal_detected' => '경로 트래버설이 감지되었습니다: :pattern', 'absolute_path_not_allowed' => '절대 경로는 허용되지 않습니다.', 'null_byte_detected' => 'NULL 바이트가 감지되었습니다.', 'outside_base_directory' => '기준 디렉토리 외부 접근은 허용되지 않습니다.', ], // 플러그인 경로 검증 메시지 'plugin_path' => [ 'file_type_not_allowed' => '허용되지 않은 파일 타입입니다. 확장자: :extension (허용: :allowed)', 'must_be_string' => '경로는 문자열이어야 합니다.', 'traversal_detected' => '경로 트래버설이 감지되었습니다: :pattern', 'absolute_path_not_allowed' => '절대 경로는 허용되지 않습니다.', 'null_byte_detected' => 'NULL 바이트가 감지되었습니다.', 'outside_base_directory' => '기준 디렉토리 외부 접근은 허용되지 않습니다.', ], // 인증 관련 검증 메시지 'auth' => [ 'two_factor' => [ 'challenge_required' => '인증 요청 정보가 없습니다. 처음부터 다시 로그인해주세요.', 'challenge_invalid' => '인증 요청 정보가 올바르지 않습니다.', 'code_required' => '인증번호를 입력해주세요.', ], 'email' => [ 'required' => '이메일은 필수입니다.', 'email' => '올바른 이메일 형식이 아닙니다.', 'exists' => '등록되지 않은 이메일입니다.', 'unique' => '이미 사용 중인 이메일입니다.', ], 'password' => [ 'required' => '비밀번호는 필수입니다.', 'min' => '비밀번호는 최소 :min자 이상이어야 합니다.', 'confirmed' => '비밀번호 확인이 일치하지 않습니다.', ], 'name' => [ 'required' => '이름은 필수입니다.', 'min' => '이름은 최소 :min자 이상이어야 합니다.', 'max' => '이름은 :max자를 초과할 수 없습니다.', ], 'nickname' => [ 'max' => '닉네임은 :max자를 초과할 수 없습니다.', ], 'mobile' => [ 'max' => '휴대폰번호는 :max자를 초과할 수 없습니다.', 'regex' => '휴대폰번호는 숫자와 -, +, (), 공백만 입력할 수 있습니다.', ], 'phone' => [ 'max' => '전화번호는 :max자를 초과할 수 없습니다.', 'regex' => '전화번호는 숫자와 -, +, (), 공백만 입력할 수 있습니다.', ], 'agree_terms' => [ 'accepted' => '이용약관에 동의해주세요.', ], 'agree_privacy' => [ 'accepted' => '개인정보처리방침에 동의해주세요.', ], 'token' => [ 'required' => '토큰은 필수입니다.', 'string' => '토큰은 문자열이어야 합니다.', ], ], // 에셋 관련 검증 메시지 'asset' => [ 'identifier' => [ 'required' => '식별자는 필수입니다.', 'string' => '식별자는 문자열이어야 합니다.', ], 'path' => [ 'required' => '경로는 필수입니다.', 'string' => '경로는 문자열이어야 합니다.', ], ], // 설정값 검증 메시지 'setting' => [ 'value' => [ 'required' => '설정 값은 필수입니다.', 'string' => '설정 값은 문자열이어야 합니다.', 'max' => '설정 값은 :max자를 초과할 수 없습니다.', ], ], // 사용자 관련 검증 메시지 'exclude_current_user' => '현재 로그인된 사용자는 일괄 변경 대상에 포함할 수 없습니다.', // 계층 구조 관련 검증 메시지 'not_self_parent' => '자기 자신을 부모로 설정할 수 없습니다.', 'not_circular_parent' => '자기 자신의 하위 메뉴로 이동할 수 없습니다.', // 설정 검증 메시지 'settings' => [ // 일반 설정 - 필수 필드 'site_name_required' => '사이트 이름을 입력해주세요.', 'site_name_max' => '사이트 이름은 100자를 초과할 수 없습니다.', 'site_url_required' => '사이트 URL을 입력해주세요.', 'site_url_invalid' => '올바른 URL 형식이 아닙니다.', 'site_url_max' => '사이트 URL은 255자를 초과할 수 없습니다.', 'site_description_max' => '사이트 설명은 500자를 초과할 수 없습니다.', 'admin_email_required' => '관리자 이메일을 입력해주세요.', 'admin_email_invalid' => '올바른 이메일 형식이 아닙니다.', 'admin_email_max' => '관리자 이메일은 255자를 초과할 수 없습니다.', 'timezone_required' => '시간대를 선택해주세요.', 'timezone_invalid' => '올바른 시간대를 선택해주세요.', 'language_required' => '기본 언어를 선택해주세요.', 'language_invalid' => '올바른 언어를 선택해주세요.', 'currency_max' => '통화 코드는 10자를 초과할 수 없습니다.', 'maintenance_mode_boolean' => '유지보수 모드는 true 또는 false 값이어야 합니다.', // 메일 설정 'mailer_required' => '메일러를 선택해주세요.', 'mailer_invalid' => '올바른 메일러를 선택해주세요.', 'host_required' => 'SMTP 호스트를 입력해주세요.', 'host_max' => 'SMTP 호스트는 255자를 초과할 수 없습니다.', 'port_required' => '포트를 입력해주세요.', 'port_integer' => '포트는 정수여야 합니다.', 'port_min' => '포트는 1 이상이어야 합니다.', 'port_max' => '포트는 65535를 초과할 수 없습니다.', 'username_max' => '사용자명은 255자를 초과할 수 없습니다.', 'password_max' => '비밀번호는 255자를 초과할 수 없습니다.', 'encryption_invalid' => '올바른 암호화 방식을 선택해주세요.', 'from_address_required' => '발신자 이메일을 입력해주세요.', 'from_address_invalid' => '올바른 이메일 형식이 아닙니다.', 'from_address_max' => '발신자 이메일은 255자를 초과할 수 없습니다.', 'from_name_required' => '발신자 이름을 입력해주세요.', 'from_name_max' => '발신자 이름은 255자를 초과할 수 없습니다.', // 업로드 설정 'max_file_size_required' => '최대 파일 크기를 입력해주세요.', 'max_file_size_integer' => '최대 파일 크기는 정수여야 합니다.', 'max_file_size_min' => '최대 파일 크기는 1MB 이상이어야 합니다.', 'max_file_size_max' => '최대 파일 크기는 1024MB를 초과할 수 없습니다.', 'allowed_extensions_required' => '허용 확장자를 입력해주세요.', 'allowed_extensions_max' => '허용 확장자는 500자를 초과할 수 없습니다.', 'allowed_extensions_invalid_type' => '허용 확장자는 문자열 또는 배열이어야 합니다.', 'image_max_width_integer' => '이미지 최대 너비는 정수여야 합니다.', 'image_max_width_min' => '이미지 최대 너비는 100px 이상이어야 합니다.', 'image_max_width_max' => '이미지 최대 너비는 10000px를 초과할 수 없습니다.', 'image_max_height_integer' => '이미지 최대 높이는 정수여야 합니다.', 'image_max_height_min' => '이미지 최대 높이는 100px 이상이어야 합니다.', 'image_max_height_max' => '이미지 최대 높이는 10000px를 초과할 수 없습니다.', 'image_quality_integer' => '이미지 품질은 정수여야 합니다.', 'image_quality_min' => '이미지 품질은 1 이상이어야 합니다.', 'image_quality_max' => '이미지 품질은 100을 초과할 수 없습니다.', // SEO 설정 'meta_title_suffix_max' => '타이틀 접미사는 100자를 초과할 수 없습니다.', 'meta_description_max' => '메타 설명은 160자를 초과할 수 없습니다.', 'meta_keywords_max' => '메타 키워드는 255자를 초과할 수 없습니다.', 'google_analytics_id_max' => 'Google Analytics ID는 50자를 초과할 수 없습니다.', 'google_site_verification_max' => 'Google 사이트 확인 코드는 100자를 초과할 수 없습니다.', 'naver_site_verification_max' => '네이버 사이트 확인 코드는 100자를 초과할 수 없습니다.', 'generator_enabled_boolean' => 'Generator 태그 표시 설정은 true 또는 false 값이어야 합니다.', 'generator_content_string' => 'Generator 내용은 문자열이어야 합니다.', 'generator_content_max' => 'Generator 내용은 200자를 초과할 수 없습니다.', 'bot_user_agents_array' => '봇 User-Agent 목록은 배열이어야 합니다.', 'bot_user_agents_item_string' => '봇 User-Agent 항목은 문자열이어야 합니다.', 'bot_user_agents_item_max' => '봇 User-Agent 항목은 100자를 초과할 수 없습니다.', 'bot_detection_enabled_boolean' => '봇 감지 설정은 true 또는 false 값이어야 합니다.', 'bot_detection_library_enabled_boolean' => '봇 감지 라이브러리 설정은 true 또는 false 값이어야 합니다.', 'og_default_site_name_string' => 'OG 사이트 이름 기본값은 문자열이어야 합니다.', 'og_default_site_name_max' => 'OG 사이트 이름 기본값은 200자를 초과할 수 없습니다.', 'og_image_default_width_integer' => 'OG 이미지 기본 가로 크기는 정수여야 합니다.', 'og_image_default_width_min' => 'OG 이미지 기본 가로 크기는 0 이상이어야 합니다.', 'og_image_default_width_max' => 'OG 이미지 기본 가로 크기는 8000 이하이어야 합니다.', 'og_image_default_height_integer' => 'OG 이미지 기본 세로 크기는 정수여야 합니다.', 'og_image_default_height_min' => 'OG 이미지 기본 세로 크기는 0 이상이어야 합니다.', 'og_image_default_height_max' => 'OG 이미지 기본 세로 크기는 8000 이하이어야 합니다.', 'twitter_default_card_string' => 'Twitter 카드 기본값은 문자열이어야 합니다.', 'twitter_default_card_in' => 'Twitter 카드 기본값은 summary, summary_large_image, app, player 중 하나여야 합니다.', 'twitter_default_site_string' => 'Twitter 사이트 핸들은 문자열이어야 합니다.', 'twitter_default_site_max' => 'Twitter 사이트 핸들은 50자를 초과할 수 없습니다.', 'seo_cache_enabled_boolean' => 'SEO 캐시 설정은 true 또는 false 값이어야 합니다.', 'seo_cache_ttl_integer' => 'SEO 캐시 TTL은 정수여야 합니다.', 'seo_cache_ttl_min' => 'SEO 캐시 TTL은 최소 60초 이상이어야 합니다.', 'seo_cache_ttl_max' => 'SEO 캐시 TTL은 최대 86400초(24시간)를 초과할 수 없습니다.', 'sitemap_enabled_boolean' => 'Sitemap 생성 설정은 true 또는 false 값이어야 합니다.', 'sitemap_cache_ttl_integer' => 'Sitemap 캐시 TTL은 정수여야 합니다.', 'sitemap_cache_ttl_min' => 'Sitemap 캐시 TTL은 최소 3600초(1시간) 이상이어야 합니다.', 'sitemap_cache_ttl_max' => 'Sitemap 캐시 TTL은 최대 604800초(7일)를 초과할 수 없습니다.', 'sitemap_urls_per_file_integer' => 'Sitemap 파일당 URL 수는 정수여야 합니다.', 'sitemap_urls_per_file_min' => 'Sitemap 파일당 URL 수는 최소 1000개 이상이어야 합니다.', 'sitemap_urls_per_file_max' => 'Sitemap 파일당 URL 수는 최대 50000개를 초과할 수 없습니다.', 'sitemap_gzip_boolean' => 'Sitemap 압축 설정은 true 또는 false 값이어야 합니다.', 'sitemap_serve_stale_on_miss_boolean' => '이전 Sitemap 제공 설정은 true 또는 false 값이어야 합니다.', 'sitemap_max_urls_per_contributor_integer' => '수집기당 최대 URL 수는 정수여야 합니다.', 'sitemap_max_urls_per_contributor_min' => '수집기당 최대 URL 수는 0 이상이어야 합니다.', 'sitemap_hreflang_enabled_boolean' => 'Sitemap 다국어 대체 링크(hreflang) 설정은 true 또는 false 값이어야 합니다.', 'sitemap_schedule_invalid' => '유효한 Sitemap 생성 주기를 선택해주세요.', 'sitemap_schedule_time_invalid' => 'Sitemap 생성 시각은 HH:mm 형식이어야 합니다.', // 보안 설정 'force_https_required' => 'HTTPS 강제 적용 설정을 선택해주세요.', 'force_https_boolean' => 'HTTPS 강제 적용은 true 또는 false 값이어야 합니다.', 'allow_internal_outbound_urls_boolean' => '내부 네트워크 주소 호출 허용은 true 또는 false 값이어야 합니다.', 'login_attempt_enabled_required' => '로그인 시도 제한 설정을 선택해주세요.', 'login_attempt_enabled_boolean' => '로그인 시도 제한은 true 또는 false 값이어야 합니다.', 'auth_token_lifetime_integer' => '인증 토큰 유지시간은 정수여야 합니다.', 'auth_token_lifetime_min' => '인증 토큰 유지시간은 0 이상이어야 합니다.', 'auth_token_lifetime_max' => '인증 토큰 유지시간은 최대 3600분(60시간)을 초과할 수 없습니다.', 'auth_token_lifetime_range' => '인증 토큰 유지시간은 0(무한대) 또는 30~3600분 사이여야 합니다.', 'max_login_attempts_integer' => '최대 로그인 시도 횟수는 정수여야 합니다.', 'max_login_attempts_min' => '최대 로그인 시도 횟수는 0 이상이어야 합니다.', 'max_login_attempts_max' => '최대 로그인 시도 횟수는 100회를 초과할 수 없습니다.', 'login_lockout_time_integer' => '차단 시간은 정수여야 합니다.', 'login_lockout_time_min' => '차단 시간은 0 이상이어야 합니다.', 'login_lockout_time_max' => '차단 시간은 최대 1440분(24시간)을 초과할 수 없습니다.', // 캐시 설정 'cache_enabled_required' => '전체 캐시 활성화 설정을 선택해주세요.', 'cache_enabled_boolean' => '캐시 활성화는 true 또는 false 값이어야 합니다.', 'layout_cache_enabled_required' => '레이아웃 캐시 설정을 선택해주세요.', 'layout_cache_enabled_boolean' => '레이아웃 캐시는 true 또는 false 값이어야 합니다.', 'layout_cache_ttl_required' => '레이아웃 캐시 만료 시간을 입력해주세요.', 'layout_cache_ttl_integer' => '레이아웃 캐시 만료 시간은 정수여야 합니다.', 'layout_cache_ttl_min' => '레이아웃 캐시 만료 시간은 최소 0초여야 합니다.', 'layout_cache_ttl_max' => '레이아웃 캐시 만료 시간은 최대 14400초(4시간)를 초과할 수 없습니다.', 'stats_cache_enabled_required' => '통계 캐시 설정을 선택해주세요.', 'stats_cache_enabled_boolean' => '통계 캐시는 true 또는 false 값이어야 합니다.', 'stats_cache_ttl_required' => '통계 캐시 만료 시간을 입력해주세요.', 'stats_cache_ttl_integer' => '통계 캐시 만료 시간은 정수여야 합니다.', 'stats_cache_ttl_min' => '통계 캐시 만료 시간은 최소 0초여야 합니다.', 'stats_cache_ttl_max' => '통계 캐시 만료 시간은 최대 14400초(4시간)를 초과할 수 없습니다.', // 고급 탭 전용 — SEO 탭의 오버라이드 칸(seo_cache_*)과 허용 범위가 다르므로 키를 분리한다. 'advanced_seo_cache_enabled_required' => 'SEO 캐시 설정을 선택해주세요.', 'advanced_seo_cache_enabled_boolean' => 'SEO 캐시는 true 또는 false 값이어야 합니다.', 'advanced_seo_cache_ttl_required' => 'SEO 캐시 만료 시간을 입력해주세요.', 'advanced_seo_cache_ttl_integer' => 'SEO 캐시 만료 시간은 정수여야 합니다.', 'advanced_seo_cache_ttl_min' => 'SEO 캐시 만료 시간은 최소 0초여야 합니다.', 'advanced_seo_cache_ttl_max' => 'SEO 캐시 만료 시간은 최대 14400초(4시간)를 초과할 수 없습니다.', 'seo_sitemap_cache_ttl_integer' => 'Sitemap 캐시 만료 시간은 정수여야 합니다.', 'seo_sitemap_cache_ttl_min' => 'Sitemap 캐시 만료 시간은 최소 3600초(1시간) 이상이어야 합니다.', 'seo_sitemap_cache_ttl_max' => 'Sitemap 캐시 만료 시간은 최대 604800초(7일)를 초과할 수 없습니다.', // 디버그 설정 'debug_mode_required' => '디버그 모드 설정을 선택해주세요.', 'debug_mode_boolean' => '디버그 모드는 true 또는 false 값이어야 합니다.', 'sql_query_log_required' => 'SQL 쿼리 로그 설정을 선택해주세요.', 'sql_query_log_boolean' => 'SQL 쿼리 로그는 true 또는 false 값이어야 합니다.', // 목록 한계값 'pagination_result_cap_integer' => '총 건수 집계 상한은 숫자여야 합니다.', 'pagination_result_cap_min' => '총 건수 집계 상한은 :min 이상이어야 합니다. (0 = 무제한)', 'pagination_result_cap_max' => '총 건수 집계 상한은 :max 를 초과할 수 없습니다.', 'pagination_max_page_integer' => '페이지 번호 상한은 숫자여야 합니다.', 'pagination_max_page_min' => '페이지 번호 상한은 :min 이상이어야 합니다. (0 = 무제한)', 'pagination_max_page_max' => '페이지 번호 상한은 :max 를 초과할 수 없습니다.', // 코어 업데이트 설정 'core_update_github_url_invalid' => 'GitHub 저장소 URL 형식이 올바르지 않습니다.', 'core_update_github_url_max' => 'GitHub 저장소 URL은 500자를 초과할 수 없습니다.', 'core_update_github_token_max' => 'GitHub 액세스 토큰은 500자를 초과할 수 없습니다.', // 드라이버 설정 'storage_driver_required' => '스토리지 드라이버를 선택해주세요.', 'storage_driver_invalid' => '올바른 스토리지 드라이버를 선택해주세요.', 's3_bucket_max' => 'S3 버킷 이름은 255자를 초과할 수 없습니다.', 's3_region_invalid' => 'S3 리전은 소문자 영숫자와 하이픈만 사용할 수 있습니다. (예: ap-northeast-2, Cloudflare R2 는 auto)', 's3_region_max' => 'S3 리전은 64자를 초과할 수 없습니다.', 's3_access_key_max' => 'S3 Access Key는 255자를 초과할 수 없습니다.', 's3_secret_key_max' => 'S3 Secret Key는 255자를 초과할 수 없습니다.', 's3_url_invalid' => '올바른 S3 URL 형식이 아닙니다.', 's3_url_max' => 'S3 URL은 500자를 초과할 수 없습니다.', 's3_endpoint_invalid' => '올바른 S3 엔드포인트 URL 형식이 아닙니다.', 's3_endpoint_max' => 'S3 엔드포인트 URL은 500자를 초과할 수 없습니다.', 's3_use_path_style_boolean' => 'Path-style 주소 사용 설정은 true 또는 false 값이어야 합니다.', 'driver_unusable' => "':driver' 드라이버를 이 서버에서 사용할 수 없습니다. :reason", 'cache_driver_required' => '캐시 드라이버를 선택해주세요.', 'cache_driver_invalid' => '올바른 캐시 드라이버를 선택해주세요.', 'redis_host_max' => 'Redis 호스트는 255자를 초과할 수 없습니다.', 'redis_port_integer' => 'Redis 포트는 정수여야 합니다.', 'redis_port_min' => 'Redis 포트는 1 이상이어야 합니다.', 'redis_port_max' => 'Redis 포트는 65535를 초과할 수 없습니다.', 'redis_password_max' => 'Redis 비밀번호는 255자를 초과할 수 없습니다.', 'redis_database_integer' => 'Redis 데이터베이스는 정수여야 합니다.', 'redis_database_min' => 'Redis 데이터베이스는 0 이상이어야 합니다.', 'redis_database_max' => 'Redis 데이터베이스는 15를 초과할 수 없습니다.', 'memcached_host_max' => 'Memcached 호스트는 255자를 초과할 수 없습니다.', 'memcached_port_integer' => 'Memcached 포트는 정수여야 합니다.', 'memcached_port_min' => 'Memcached 포트는 1 이상이어야 합니다.', 'memcached_port_max' => 'Memcached 포트는 65535를 초과할 수 없습니다.', 'session_driver_required' => '세션 드라이버를 선택해주세요.', 'session_driver_invalid' => '올바른 세션 드라이버를 선택해주세요.', 'session_lifetime_integer' => '세션 유효시간은 정수여야 합니다.', 'session_lifetime_min' => '세션 유효시간은 최소 1분이어야 합니다.', 'session_lifetime_max' => '세션 유효시간은 최대 30일(43200분)을 초과할 수 없습니다.', 'queue_driver_required' => '큐 드라이버를 선택해주세요.', 'queue_driver_invalid' => '올바른 큐 드라이버를 선택해주세요.', 'websocket_enabled_boolean' => '웹소켓 사용 설정은 true 또는 false 값이어야 합니다.', 'websocket_app_id_required' => '웹소켓 사용 시 앱 ID는 필수입니다.', 'websocket_app_id_max' => '웹소켓 앱 ID는 255자를 초과할 수 없습니다.', 'websocket_app_key_required' => '웹소켓 사용 시 앱 키는 필수입니다.', 'websocket_app_key_max' => '웹소켓 앱 키는 255자를 초과할 수 없습니다.', 'websocket_app_secret_required' => '웹소켓 사용 시 앱 시크릿은 필수입니다.', 'websocket_app_secret_max' => '웹소켓 앱 시크릿은 255자를 초과할 수 없습니다.', 'websocket_host_max' => '웹소켓 호스트는 255자를 초과할 수 없습니다.', 'websocket_port_integer' => '웹소켓 포트는 정수여야 합니다.', 'websocket_port_min' => '웹소켓 포트는 1 이상이어야 합니다.', 'websocket_port_max' => '웹소켓 포트는 65535를 초과할 수 없습니다.', 'websocket_scheme_invalid' => '올바른 웹소켓 프로토콜을 선택해주세요.', 'websocket_verify_ssl_boolean' => 'SSL 인증서 검증 설정은 true 또는 false 값이어야 합니다.', 'websocket_server_host_max' => '웹소켓 서버 호스트는 255자를 초과할 수 없습니다.', 'websocket_server_port_integer' => '웹소켓 서버 포트는 정수여야 합니다.', 'websocket_server_port_min' => '웹소켓 서버 포트는 1 이상이어야 합니다.', 'websocket_server_port_max' => '웹소켓 서버 포트는 65535를 초과할 수 없습니다.', 'websocket_server_scheme_invalid' => '올바른 웹소켓 서버 프로토콜을 선택해주세요.', 'search_engine_driver_invalid' => '올바른 검색엔진 드라이버를 선택해주세요.', // 로그 드라이버 설정 'log_driver_required' => '로그 드라이버를 선택해주세요.', 'log_driver_invalid' => '올바른 로그 드라이버를 선택해주세요.', 'log_level_required' => '로그 레벨을 선택해주세요.', 'log_level_invalid' => '올바른 로그 레벨을 선택해주세요.', 'log_days_integer' => '로그 보관 일수는 정수여야 합니다.', 'log_days_min' => '로그 보관 일수는 1 이상이어야 합니다.', 'log_days_max' => '로그 보관 일수는 365를 초과할 수 없습니다.', // 드라이버 조건부 필수 메시지 (선택 드라이버에 따라 필수) 's3_bucket_required' => 'S3 버킷 이름은 필수입니다.', 's3_access_key_required' => 'S3 Access Key는 필수입니다.', 's3_secret_key_required' => 'S3 Secret Key는 필수입니다.', 's3_url_url' => 'S3 URL은 유효한 URL이어야 합니다.', 'redis_host_required' => 'Redis 호스트는 필수입니다.', 'redis_port_required' => 'Redis 포트는 필수입니다.', 'redis_database_required' => 'Redis 데이터베이스 번호는 필수입니다.', 'memcached_host_required' => 'Memcached 호스트는 필수입니다.', 'memcached_port_required' => 'Memcached 포트는 필수입니다.', 'session_lifetime_required' => '세션 유효시간은 필수입니다.', 'websocket_host_required' => '웹소켓 호스트는 필수입니다.', 'websocket_port_required' => '웹소켓 포트는 필수입니다.', 'websocket_scheme_required' => '웹소켓 프로토콜을 선택해주세요.', // 본인인증(IDV) 설정 'identity_default_provider_string' => '기본 프로바이더는 문자열이어야 합니다.', 'identity_default_provider_max' => '기본 프로바이더 식별자는 100자를 초과할 수 없습니다.', 'identity_purpose_providers_array' => '목적별 프로바이더 매핑은 배열이어야 합니다.', 'identity_purpose_provider_string' => '목적별 프로바이더 식별자는 문자열이어야 합니다.', 'identity_purpose_provider_max' => '목적별 프로바이더 식별자는 100자를 초과할 수 없습니다.', 'identity_challenge_ttl_required' => 'Challenge 만료 시간을 입력해주세요.', 'identity_challenge_ttl_integer' => 'Challenge 만료 시간은 정수여야 합니다.', 'identity_challenge_ttl_min' => 'Challenge 만료 시간은 최소 1분 이상이어야 합니다.', 'identity_challenge_ttl_max' => 'Challenge 만료 시간은 최대 1440분(24시간)을 초과할 수 없습니다.', 'identity_max_attempts_required' => '최대 시도 횟수를 입력해주세요.', 'identity_max_attempts_integer' => '최대 시도 횟수는 정수여야 합니다.', 'identity_max_attempts_min' => '최대 시도 횟수는 최소 1회 이상이어야 합니다.', 'identity_max_attempts_max' => '최대 시도 횟수는 최대 20회를 초과할 수 없습니다.', ], // 본인인증 정책 검증 메시지 'identity_policy' => [ 'key_required' => '정책 키를 입력해주세요.', 'key_max' => '정책 키는 120자를 초과할 수 없습니다.', 'key_unique' => '이미 사용 중인 정책 키입니다.', 'scope_required' => 'Scope를 선택해주세요.', 'scope_invalid' => 'Scope는 route, hook, custom 중 하나여야 합니다.', 'target_required' => 'Target(라우트 또는 훅 이름)을 입력해주세요.', 'target_max' => 'Target은 255자를 초과할 수 없습니다.', 'purpose_required' => '인증 목적(Purpose)을 선택해주세요.', 'purpose_max' => '인증 목적은 64자를 초과할 수 없습니다.', 'provider_id_max' => '프로바이더 식별자는 64자를 초과할 수 없습니다.', 'grace_minutes_required' => 'Grace 시간(분)을 입력해주세요.', 'grace_minutes_integer' => 'Grace 시간은 정수여야 합니다.', 'grace_minutes_min' => 'Grace 시간은 0 이상이어야 합니다.', 'grace_minutes_max' => 'Grace 시간은 43200분(30일)을 초과할 수 없습니다.', 'enabled_boolean' => '활성화 값은 true 또는 false여야 합니다.', 'priority_integer' => '우선순위는 정수여야 합니다.', 'priority_min' => '우선순위는 0 이상이어야 합니다.', 'priority_max' => '우선순위는 65535를 초과할 수 없습니다.', 'priority_duplicate' => '같은 적용 위치(:target)에 우선순위 :priority 인 활성 정책이 이미 있습니다. 어느 정책을 먼저 적용할지 정해지지 않으므로, 우선순위를 다르게 지정하거나 기존 정책을 비활성화해주세요.', 'conditions_array' => '조건(conditions)은 배열이어야 합니다.', 'applies_to_required' => '적용 대상을 선택해주세요.', 'applies_to_invalid' => '적용 대상은 self, admin, both 중 하나여야 합니다.', 'fail_mode_required' => '실패 모드를 선택해주세요.', 'fail_mode_invalid' => '실패 모드는 block 또는 log_only여야 합니다.', ], // 본인인증 메시지 정의 검증 메시지 'identity_message' => [ 'provider_not_registered' => '등록되지 않은 IDV 프로바이더입니다.', 'scope_value_not_admin_policy' => '운영자가 추가한 정책(source_type=admin)의 키와 일치해야 합니다.', 'definition_already_exists' => '동일 (provider, scope_type, scope_value) 정의가 이미 존재합니다.', ], // 레이아웃 버전 목록 조회 'layout_version' => [ 'limit' => [ 'integer' => '조회 건수는 숫자여야 합니다.', 'min' => '조회 건수는 1 이상이어야 합니다.', 'max' => '조회 건수는 최대 :max건입니다.', ], ], // 검증 속성명 (validation.attributes) 'attributes' => [ 'ids' => '사용자 ID 목록', 'user_id' => '사용자 ID', 'status' => '상태', // 일반 설정 필드 'site_name' => '사이트 이름', 'site_url' => '사이트 URL', 'site_description' => '사이트 설명', 'admin_email' => '관리자 이메일', 'timezone' => '시간대', 'language' => '기본 언어', // 본인인증(IDV) 필드 'identity_default_provider' => '기본 프로바이더', 'identity_purpose_providers' => '목적별 프로바이더', 'identity_challenge_ttl_minutes' => 'Challenge 만료 시간', 'identity_max_attempts' => '최대 시도 횟수', // 본인인증 정책 필드 'identity_policy_key' => '정책 키', 'identity_policy_scope' => 'Scope', 'identity_policy_target' => 'Target', 'identity_policy_purpose' => '인증 목적', 'identity_policy_provider_id' => '프로바이더', 'identity_policy_grace_minutes' => 'Grace 시간(분)', 'identity_policy_enabled' => '활성화', 'identity_policy_applies_to' => '적용 대상', 'identity_policy_fail_mode' => '실패 모드', // 메일 설정 필드 'mailer' => '메일러', 'host' => 'SMTP 호스트', 'port' => 'SMTP 포트', 'username' => 'SMTP 사용자명', 'password' => 'SMTP 비밀번호', 'encryption' => '암호화', 'from_address' => '발신자 이메일', 'from_name' => '발신자 이름', // 업로드 설정 필드 'max_file_size' => '최대 파일 크기', 'allowed_extensions' => '허용 확장자', 'image_max_width' => '이미지 최대 너비', 'image_max_height' => '이미지 최대 높이', 'image_quality' => '이미지 품질', // SEO 설정 필드 'meta_title_suffix' => '메타 타이틀 접미사', 'meta_description' => '메타 설명', 'meta_keywords' => '메타 키워드', 'google_analytics_id' => 'Google Analytics ID', 'google_site_verification' => 'Google 사이트 확인', 'naver_site_verification' => '네이버 사이트 확인', // Changelog 필드 'from_version' => '시작 버전', 'to_version' => '종료 버전', // 드라이버 설정 필드 'storage_driver' => '스토리지 드라이버', 's3_bucket' => 'S3 버킷', 's3_region' => 'S3 리전', 's3_access_key' => 'S3 Access Key', 's3_secret_key' => 'S3 Secret Key', 's3_url' => 'S3 URL', 's3_endpoint' => 'S3 엔드포인트 URL', 's3_use_path_style' => 'Path-style 주소 사용', 'cache_driver' => '캐시 드라이버', 'redis_host' => 'Redis 호스트', 'redis_port' => 'Redis 포트', 'redis_password' => 'Redis 비밀번호', 'redis_database' => 'Redis 데이터베이스', 'memcached_host' => 'Memcached 호스트', 'memcached_port' => 'Memcached 포트', 'session_driver' => '세션 드라이버', 'session_lifetime' => '세션 유효시간', 'queue_driver' => '큐 드라이버', 'websocket_enabled' => '웹소켓 사용', 'websocket_app_key' => '웹소켓 앱 키', 'websocket_host' => '웹소켓 호스트', 'websocket_port' => '웹소켓 포트', 'websocket_scheme' => '웹소켓 프로토콜', 'layout' => '레이아웃', 'module' => '모듈', 'token' => '토큰', 'mailgun_domain' => 'Mailgun 도메인', 'mailgun_secret' => 'Mailgun 시크릿', 'ses_key' => 'SES 액세스 키', 'ses_secret' => 'SES 시크릿 키', 'ses_region' => 'SES 리전', 'mailgun_endpoint' => 'Mailgun 엔드포인트', // 일반 설정 (추가) 'channels' => '알림 채널', 'currency' => '기본 통화', 'maintenance_mode' => '점검 모드', 'asset_url_mode' => '자산 주소 방식', 'site_logo' => '사이트 로고', // SEO 설정 (추가) 'bot_user_agents' => '봇 User-Agent 목록', 'bot_detection_enabled' => '봇 감지 사용', 'bot_detection_library_enabled' => '봇 감지 라이브러리 사용', 'og_default_site_name' => 'OG 기본 사이트 이름', 'og_image_default_width' => 'OG 이미지 기본 너비', 'og_image_default_height' => 'OG 이미지 기본 높이', 'twitter_default_card' => '트위터 기본 카드 유형', 'twitter_default_site' => '트위터 기본 계정', 'seo_page_cache_enabled' => 'SEO 페이지 캐시 사용', 'cache_ttl' => 'SEO 페이지 캐시 유지시간', 'sitemap_enabled' => '사이트맵 사용', 'sitemap_cache_ttl' => '사이트맵 캐시 유지시간', 'sitemap_urls_per_file' => '사이트맵 파일당 URL 수', 'sitemap_gzip' => '사이트맵 압축', 'sitemap_serve_stale_on_miss' => '사이트맵 미생성 시 이전 파일 제공', 'sitemap_max_urls_per_contributor' => '사이트맵 항목별 최대 URL 수', 'sitemap_hreflang_enabled' => '사이트맵 대체 언어 링크 사용', 'sitemap_schedule' => '사이트맵 자동 생성 주기', 'sitemap_schedule_time' => '사이트맵 자동 생성 시각', 'generator_enabled' => 'SEO 페이지 생성기 사용', 'generator_content' => 'SEO 페이지 생성기 콘텐츠', // 보안 설정 (추가) 'force_https' => 'HTTPS 강제 적용', 'login_attempt_enabled' => '로그인 시도 제한', 'auth_token_lifetime' => '인증 토큰 유지시간', 'max_login_attempts' => '최대 로그인 시도 횟수', 'login_lockout_time' => '로그인 차단 시간', 'password_min_length' => '비밀번호 최소 길이', 'require_password_special_char' => '비밀번호 특수문자 필수', 'two_factor_auth' => '2단계 인증', 'allow_internal_outbound_urls' => '내부 네트워크 주소 호출 허용', // 고급 설정 (추가) 'advanced_cache_enabled' => '캐시 사용', 'layout_cache_enabled' => '레이아웃 캐시 사용', 'layout_cache_ttl' => '레이아웃 캐시 유지시간', 'stats_cache_enabled' => '통계 캐시 사용', 'stats_cache_ttl' => '통계 캐시 유지시간', 'seo_cache_enabled' => 'SEO 캐시 사용', 'seo_cache_ttl' => 'SEO 캐시 유지시간', 'seo_sitemap_cache_ttl' => 'SEO 사이트맵 캐시 유지시간', 'debug_mode' => '디버그 모드', 'sql_query_log' => 'SQL 쿼리 로그', 'core_update_github_url' => '코어 업데이트 GitHub 주소', 'core_update_github_token' => '코어 업데이트 GitHub 토큰', 'geoip_enabled' => 'GeoIP 사용', 'geoip_license_key' => 'GeoIP 라이선스 키', 'geoip_auto_update_enabled' => 'GeoIP 자동 업데이트', 'pagination_result_cap' => '목록 총 건수 상한', 'pagination_max_page' => '목록 최대 페이지 번호', // 드라이버 설정 (추가) 'websocket_app_id' => '웹소켓 앱 ID', 'websocket_app_secret' => '웹소켓 앱 시크릿', 'websocket_verify_ssl' => '웹소켓 SSL 인증서 검증', 'websocket_server_host' => '웹소켓 서버 호스트', 'websocket_server_port' => '웹소켓 서버 포트', 'websocket_server_scheme' => '웹소켓 서버 프로토콜', 'search_engine_driver' => '검색 엔진 드라이버', 'log_driver' => '로그 드라이버', 'log_level' => '로그 레벨', 'log_days' => '로그 보관 일수', ], ];