Files
Gnuboard7/lang/ko/language_packs.php
T
HeuJung 03cbb99196 fix(extension): 확장 수명주기 캐시 무효화 순서 회귀 및 실패 사유 전달
route:cache 는 새 앱을 부팅해 라우트를 수집하고, 그 부팅의 확장 라우트 프로바이더는
DB 가 아니라 캐시된 활성 확장 목록을 읽는다. 그래서 rebuild 가
invalidate*StatusCache 보다 앞서면 방금 바뀐 상태가 빠진 채 라우트가 박제되고,
라우트 캐시에는 스캔 폴백이 없어 오류도 로그도 없이 404 가 된다. 무효화를 굽기 직전이
아니라 DB 상태 쓰기 직후로 올려, 같은 목록을 읽는 훅 매핑 캐시까지 함께 바로잡았다.
update 경로는 Updating 전이 직후에 비우면 그 창의 오토로드 갱신이 확장을 비활성으로
판정하므로, 상태 복원 직후에 비운 뒤 훅 캐시를 다시 굽는다.

플러그인 라우트 프로바이더에는 활성 게이트가 없어 비활성 플러그인의 API 가 계속
응답했다. 화면·메뉴만 사라지고 기능은 살아 있는 상태였다. 모듈과 같은 기준을 적용했다.

실패 사유가 하위 계층에서 버려져 관리자 화면에 :error 자리표시자가 그대로 노출되던
문제도 고쳤다. 반환 경로를 깨지 않도록 배열 키 reason 과 뒤에 붙인 선택적 out
파라미터로 사유를 실어 올리고, 확장이 수명주기 훅에서 사유를 남길 수 있는 통로를
추가했다. 설치 경로의 광역 RuntimeException catch 는 도메인 예외로 좁혀 원본 키와
파라미터를 응답에 싣는다 — 상태코드 422 는 유지해 사용자 계약을 함께 바꾸지 않는다.
언어팩 화면은 프로덕션에서 예외 원문을 싣지 않는 것이 확정된 계약이므로, 자리를
일반 문구로 채우는 대신 치환 자리 자체를 제거했다. 원문은 종전대로 errors 통로를
거쳐 디버그 모드에서 도달한다.
2026-08-21 17:09:30 +09:00

68 lines
5.5 KiB
PHP

<?php
return [
'fetch_success' => '언어팩 목록을 조회했습니다.',
'fetch_failed' => '언어팩 목록을 불러오지 못했습니다.',
'not_found' => '언어팩을 찾을 수 없습니다.',
'install_success' => '언어팩을 설치했습니다.',
'install_failed' => '언어팩 설치에 실패했습니다.',
'activate_success' => '언어팩을 활성화했습니다.',
'activate_failed' => '언어팩 활성화에 실패했습니다.',
'deactivate_success' => '언어팩을 비활성화했습니다.',
'deactivate_failed' => '언어팩 비활성화에 실패했습니다.',
'uninstall_success' => '언어팩을 제거했습니다.',
'uninstall_failed' => '언어팩 제거에 실패했습니다.',
'manifest_invalid' => 'language-pack.json 검증에 실패했습니다.',
'check_updates_success' => '업데이트 확인을 완료했습니다.',
'check_updates_failed' => '업데이트 확인에 실패했습니다.',
'update_success' => '언어팩을 업데이트했습니다.',
'update_failed' => '언어팩 업데이트에 실패했습니다.',
'refresh_cache_success' => '언어팩 캐시를 갱신했습니다.',
'refresh_cache_failed' => '언어팩 캐시 갱신에 실패했습니다.',
'preview_success' => 'manifest 미리보기를 완료했습니다.',
'preview_failed' => 'manifest 미리보기에 실패했습니다.',
'errors' => [
'manifest_not_found' => 'ZIP 안에서 language-pack.json 파일을 찾을 수 없습니다.',
'manifest_invalid_json' => 'language-pack.json 의 JSON 형식이 올바르지 않습니다.',
'php_outside_backend' => 'PHP 파일은 backend/{언어코드}/{그룹}.php 위치에만 둘 수 있습니다 (:file).',
'php_file_not_literal_array' => 'PHP 파일에는 번역 배열만 담을 수 있습니다. :file 파일 :line 번째 줄에 배열이 아닌 코드가 있습니다.',
'unsupported_file_type' => '언어팩에 넣을 수 없는 파일 형식입니다 (:file — :extension). json, php, md 파일만 포함할 수 있습니다.',
'symlink_not_allowed' => '언어팩에는 심볼릭 링크를 포함할 수 없습니다 (:file).',
'auto_activate_requires_manage' => '설치 후 바로 켜기는 언어팩 관리 권한이 필요합니다. 이 항목을 빼면 설치는 그대로 진행됩니다.',
'core_locale_missing' => '코어 언어팩(:locale)이 먼저 활성화되어야 합니다.',
'target_not_installed' => '대상 :scope (:target)이 설치되어 있지 않습니다.',
'target_inactive' => '대상 :scope (:target)이 비활성 상태입니다. 먼저 활성화해야 합니다.',
'target_version_too_old' => '대상 :scope (:target) 버전이 요구 조건(:constraint)을 충족하지 않습니다.',
'downgrade_blocked' => '다운그레이드가 차단되었습니다 (:from → :to).',
'protected_pack' => '보호된 언어팩은 비활성화/제거할 수 없습니다.',
'download_failed' => 'URL(:url) 에서 언어팩을 다운로드하지 못했습니다: :error',
'download_url_not_public' => '내부 네트워크 주소(사설 IP·localhost 등)에서는 언어팩을 내려받을 수 없습니다. 외부에서 접속 가능한 https 주소를 사용해주세요.',
'checksum_mismatch' => '체크섬이 일치하지 않습니다.',
'update_no_source' => '업데이트 소스 정보가 없습니다 (GitHub 소스 언어팩만 업데이트 가능).',
'update_already_latest' => '이미 최신 버전입니다.',
'preview_invalid_manifest' => 'manifest 파일이 유효하지 않아 미리보기에 실패했습니다.',
'operation_in_progress' => '언어팩(:identifier) 에서 다른 작업이 진행 중입니다. 완료 후 다시 시도해주세요.',
'bundled_not_found' => '번들 디렉토리(lang-packs/_bundled/:identifier) 가 존재하지 않습니다.',
'slot_conflict' => '같은 슬롯에 이미 활성 언어팩(:current)이 있습니다. (:target)으로 교체하려면 확인이 필요합니다.',
'directory_not_writable' => '언어팩 설치 디렉토리(:path) 에 쓰기 권한이 없습니다. 웹 서버 사용자(예: www-data) 에게 쓰기 권한을 부여하세요. (예: sudo chgrp www-data :path && sudo chmod g+w :path)',
'identifier_not_found' => '언어팩을 찾을 수 없습니다 (:identifier).',
'unsupported_source' => '지원하지 않는 소스 (:source) — bundled, github, url 중 하나를 사용하세요.',
],
'validation' => [
'file_required' => '언어팩 ZIP 파일을 업로드하세요.',
'file_invalid' => '업로드된 파일이 유효하지 않습니다.',
'file_too_large' => '파일 크기는 10MB 를 초과할 수 없습니다.',
'file_not_zip' => 'ZIP 형식의 파일만 업로드할 수 있습니다.',
'github_url_required' => 'GitHub URL 을 입력하세요.',
'github_url_invalid' => '올바른 URL 을 입력하세요.',
'github_url_format' => 'GitHub 저장소 URL 형식이어야 합니다 (예: https://github.com/owner/repo).',
'url_required' => '다운로드 URL 을 입력하세요.',
'url_invalid' => '올바른 URL 을 입력하세요.',
'checksum_invalid' => 'SHA-256 체크섬은 64자 16진수여야 합니다.',
'identifier_required' => '언어팩 식별자를 입력하세요.',
'identifier_invalid' => '식별자는 영문/숫자/점/언더스코어/하이픈만 허용됩니다.',
],
];