공개 (@Tuwasduliebst 제보) 대응. - ckeditor5: 미참조 이미지 정리 엔진 신설 — 참조 판정(hash + 파일명 2토큰, filter_reference_sources 훅으로 확장 콘텐츠 등록) + 정리 커맨드(기본 꺼짐 옵트인, 3중 게이트) + 업로드 관리 화면(권한 분리·참조 배지·개별/선택 삭제) + 기설치본 설정 백필 upgrade step - board: 임시 첨부 GC(상시) + 소프트삭제 첨부 영구 정리(옵트인) + 설정 UI, 저장 payload 누락(F4)·빈 temp 디렉토리 잔존(F5) 수정 - ecommerce: 임시 상품 이미지 GC + 카테고리 삭제 시 이미지 파일 미삭제(S4) 수정 - page: 임시 첨부 GC - 코어: 고아 첨부 정리 커맨드(옵트인, site_logo 보호) + 사이트 로고 교체 시 구 로고 재편입 차단(S6) + DB 백업 미구현 501 정직화(B3) + 플러그인 관리자 메뉴 설치·업데이트 자동 동기화(F1·F7) - 동반: 플러그인 설정 검증 오류 필드명 라벨화(F3), Toggle 노드 type 정정 수평 전개(marketing 1.0.2 bump·gdpr·ecommerce), ja 언어팩 4종, API 문서, hooks.md, 시나리오 매니페스트 8종, Playwright E2E 4종
1323 lines
81 KiB
PHP
1323 lines
81 KiB
PHP
<?php
|
|
|
|
return [
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Laravel 기본 검증 메시지
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Laravel의 기본 검증 규칙에 대한 한국어 메시지입니다.
|
|
|
|
|
*/
|
|
|
|
'accepted' => ':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' => '레이아웃 데이터는 배열이어야 합니다.',
|
|
'dangerous_expression' => '허용되지 않는 표현식이 포함되어 있습니다: :snippet',
|
|
'external_resource_url' => '외부 리소스 URL은 허용되지 않습니다(동일 출처 경로만 허용): :url',
|
|
'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' => [
|
|
'present' => '설정 값 항목(value)이 요청에 포함되어야 합니다.',
|
|
'boolean' => '이 설정은 사용/사용 안 함 값만 저장할 수 있습니다.',
|
|
'integer' => '이 설정은 정수만 저장할 수 있습니다.',
|
|
'numeric' => '이 설정은 숫자만 저장할 수 있습니다.',
|
|
'type' => '저장할 수 없는 형식의 설정 값입니다.',
|
|
'max' => '설정 값은 :max자를 초과할 수 없습니다.',
|
|
'array_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을 초과할 수 없습니다.',
|
|
'orphan_cleanup_enabled_boolean' => '고아 첨부 자동 정리는 사용/사용 안 함 중 하나여야 합니다.',
|
|
'orphan_retention_days_integer' => '고아 첨부 보존기간은 정수여야 합니다.',
|
|
'orphan_retention_days_min' => '고아 첨부 보존기간은 1일 이상이어야 합니다.',
|
|
'orphan_retention_days_max' => '고아 첨부 보존기간은 3650일을 초과할 수 없습니다.',
|
|
|
|
// 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를 초과할 수 없습니다.',
|
|
|
|
// 공개 자산 디스크 설정
|
|
'public_asset_disk_invalid' => '올바른 공개 자산 디스크를 선택해주세요.',
|
|
|
|
// 드라이버 조건부 필수 메시지 (선택 드라이버에 따라 필수)
|
|
'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_ids' => '사용자 ID 목록',
|
|
'user_id' => '사용자 ID',
|
|
'status' => '상태',
|
|
// 일반 설정 필드
|
|
'site_name' => '사이트 이름',
|
|
'site_url' => '사이트 URL',
|
|
'site_description' => '사이트 설명',
|
|
'admin_email' => '관리자 이메일',
|
|
'timezone' => '시간대',
|
|
'language' => '언어',
|
|
'default_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' => '호스트',
|
|
'port' => '포트',
|
|
'username' => '사용자명',
|
|
'password' => '비밀번호',
|
|
'smtp_host' => 'SMTP 호스트',
|
|
'smtp_port' => 'SMTP 포트',
|
|
'smtp_username' => 'SMTP 사용자명',
|
|
'smtp_password' => 'SMTP 비밀번호',
|
|
'encryption' => '암호화',
|
|
'from_address' => '발신자 이메일',
|
|
'from_name' => '발신자 이름',
|
|
// 업로드 설정 필드
|
|
'max_file_size' => '최대 파일 크기',
|
|
'allowed_extensions' => '허용 확장자',
|
|
'image_max_width' => '이미지 최대 너비',
|
|
'image_max_height' => '이미지 최대 높이',
|
|
'image_quality' => '이미지 품질',
|
|
'orphan_cleanup_enabled' => '고아 첨부 자동 정리',
|
|
'orphan_retention_days' => '고아 첨부 보존기간',
|
|
// 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' => '채널',
|
|
'notification_channels' => '알림 채널',
|
|
'currency' => '통화',
|
|
'default_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_page_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' => '로그 보관 일수',
|
|
'public_asset_disk' => '공개 자산 디스크',
|
|
],
|
|
];
|