공개 제보 — 파일 스토리지에서 S3 를 선택해 저장해도 실제 파일 저장이 동작하지 않던 결함의 전면 수정. - S3 어댑터(league/flysystem-aws-s3-v3)·predis 를 코어 기본 의존성으로 포함 — 어댑터 부재 즉사, phpredis 확장 없는 서버의 redis 선택 전면 다운 차단 (부트 시 확장 부재 감지 → predis 자동 폴백) - storage_driver=s3 저장 시 코어 첨부 업로드 디스크를 s3 로 전환 (ATTACHMENT_DISK env 명시가 항상 우선, 기존 행은 저장 당시 disk 로 서빙) - 첨부·템플릿 레이아웃 첨부 서빙을 행 disk 를 따르는 스토리지 스트림으로 교체 — 로컬 절대 경로 전제 fileResponse 는 S3 행에서 filemtime stat 500 (streamedFileResponse: 행 메타 기반 ETag/304/Cache-Control) - S3 호환 스토리지(R2/MinIO/NCP) 연결 지원: 엔드포인트 URL·path-style 설정 신설, 리전 목록 선택 → 자유 입력 전환, 연결 테스트를 실제 저장 경로와 동일 설정(endpoint/path-style)으로 정렬 - 사용 불능 드라이버(어댑터·PHP 확장 부재)의 저장/테스트 요청을 사유와 함께 422 로 차단하는 서버 게이트 신설 (DriverRegistryService 능력 판정) - 웹소켓 연결 테스트에 서버(백엔드 발송용) endpoint 검사 추가 — 클라이언트만 검사해 테스트 성공 + 실제 발송 실패가 가능하던 비대칭 해소 - env 빈 값(`KEY=`) 함정 정규화: AWS_URL/AWS_ENDPOINT/ATTACHMENT_DISK 빈 문자열을 미설정으로 취급 (config 정규화 + 예시 파일 주석 처리) - 플러그인 드라이버 폴백의 log 카테고리 죽은 키(logging.default) 정정 및 websocket 유령 설정 키 제거 - 실 AWS S3 종단 검증 완료 (설정 저장 → 업로드 S3 실저장 → 서빙 200/304)
1298 lines
79 KiB
PHP
1298 lines
79 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' => '레이아웃 데이터는 배열이어야 합니다.',
|
|
'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' => '로그 보관 일수',
|
|
],
|
|
];
|