From 9052386c837d4505ee6a8e985dceb3dd4a5f38ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=98=AD?= <81747598+lan-yonghui@users.noreply.github.com> Date: Wed, 15 Jan 2025 18:26:30 +0800 Subject: [PATCH] feat: Korean language support (#7727) Refs #7363 --- backend/app/dto/auth.go | 2 +- backend/i18n/i18n.go | 1 + backend/i18n/lang/ko.yaml | 286 ++ frontend/src/App.vue | 4 +- frontend/src/lang/index.ts | 2 + frontend/src/lang/modules/en.ts | 4 +- frontend/src/lang/modules/ja.ts | 16 +- frontend/src/lang/modules/ko.ts | 2460 +++++++++++++++++ frontend/src/lang/modules/ms.ts | 16 +- frontend/src/lang/modules/pt-br.ts | 4 +- frontend/src/lang/modules/ru.ts | 12 +- frontend/src/lang/modules/tw.ts | 6 +- frontend/src/lang/modules/zh.ts | 6 +- .../src/views/login/components/login-form.vue | 3 + frontend/src/views/setting/panel/index.vue | 1 + 15 files changed, 2788 insertions(+), 35 deletions(-) create mode 100644 backend/i18n/lang/ko.yaml create mode 100644 frontend/src/lang/modules/ko.ts diff --git a/backend/app/dto/auth.go b/backend/app/dto/auth.go index b39948499..2679193b0 100644 --- a/backend/app/dto/auth.go +++ b/backend/app/dto/auth.go @@ -29,7 +29,7 @@ type Login struct { Captcha string `json:"captcha"` CaptchaID string `json:"captchaID"` AuthMethod string `json:"authMethod" validate:"required,oneof=jwt session"` - Language string `json:"language" validate:"required,oneof=zh en tw ja ru ms 'pt-BR'"` + Language string `json:"language" validate:"required,oneof=zh en tw ja ko ru ms 'pt-BR'"` } type MFALogin struct { diff --git a/backend/i18n/i18n.go b/backend/i18n/i18n.go index 3c93f574a..e683f6d5a 100644 --- a/backend/i18n/i18n.go +++ b/backend/i18n/i18n.go @@ -104,6 +104,7 @@ func Init() { _, _ = bundle.LoadMessageFileFS(fs, "lang/ja.yaml") _, _ = bundle.LoadMessageFileFS(fs, "lang/ru.yaml") _, _ = bundle.LoadMessageFileFS(fs, "lang/ms.yaml") + _, _ = bundle.LoadMessageFileFS(fs, "lang/ko.yaml") } func UseI18nForCmd(lang string) { diff --git a/backend/i18n/lang/ko.yaml b/backend/i18n/lang/ko.yaml new file mode 100644 index 000000000..2f1ecc59e --- /dev/null +++ b/backend/i18n/lang/ko.yaml @@ -0,0 +1,286 @@ +ErrInvalidParams: "요청 매개변수 오류: {{ .detail }}" +ErrTokenParse: "토큰 생성 오류: {{ .detail }}" +ErrInitialPassword: "초기 비밀번호 오류" +ErrInternalServer: "서버 내부 오류: {{ .detail }}" +ErrRecordExist: "기록이 이미 존재합니다" +ErrRecordNotFound: "기록을 찾을 수 없습니다" +ErrStructTransform: "형식 변환 실패: {{ .detail }}" +ErrNotLogin: "사용자가 로그인되지 않았습니다: {{ .detail }}" +ErrPasswordExpired: "현재 비밀번호가 만료되었습니다: {{ .detail }}" +ErrNotSupportType: "시스템에서 현재 유형을 지원하지 않습니다: {{ .detail }}" +ErrApiConfigStatusInvalid: "API 인터페이스 액세스 금지: {{ .detail }}" +ErrApiConfigKeyInvalid: "API 인터페이스 키 오류: {{ .detail }}" +ErrApiConfigIPInvalid: "API 인터페이스 IP가 화이트리스트에 없습니다: {{ .detail }}" +ErrApiConfigDisable: "이 인터페이스는 API 호출을 금지합니다: {{ .detail }}" +ErrApiConfigKeyTimeInvalid: "API 인터페이스 타임스탬프 오류: {{ .detail }}" + +# 공통 +ErrNameIsExist: "이름이 이미 존재합니다" +ErrDemoEnvironment: "데모 서버에서는 이 작업이 금지되어 있습니다!" +ErrCmdTimeout: "명령어 실행 시간이 초과되었습니다!" +ErrCmdIllegal: "명령어에 잘못된 문자가 포함되어 있습니다. 수정 후 다시 시도하세요!" +ErrPortExist: '{{ .port }} 포트가 {{ .type }} [{{ .name }}]에 의해 이미 사용 중입니다' +TYPE_APP: "애플리케이션" +TYPE_RUNTIME: "실행 환경" +TYPE_DOMAIN: "도메인 이름" +ErrTypePort: '포트 {{ .name }} 형식 오류' +ErrTypePortRange: '포트 범위는 1-65535 사이여야 합니다' +Success: "성공" +Failed: "실패" +SystemRestart: "시스템 재시작으로 인해 작업이 중단되었습니다" + +# 애플리케이션 +ErrPortInUsed: "{{ .detail }} 포트가 이미 사용 중입니다" +ErrAppLimit: "앱 설치 제한을 초과했습니다" +ErrAppRequired: "{{ .detail }} 앱이 필요합니다" +ErrNotInstall: "앱이 설치되지 않았습니다" +ErrPortInOtherApp: "{{ .port }} 포트가 {{ .apps }} 앱에 의해 이미 사용 중입니다" +ErrDbUserNotValid: "데이터베이스 사용자 이름과 비밀번호가 일치하지 않습니다!" +ErrDockerComposeNotValid: "docker-compose 파일 형식 오류!" +ErrUpdateBuWebsite: "애플리케이션이 성공적으로 업데이트되었지만, 웹사이트 구성 파일 수정에 실패했습니다. 구성을 확인하세요!" +Err1PanelNetworkFailed: "기본 컨테이너 네트워크 생성 실패! {{ .detail }}" +ErrFileParse: "애플리케이션 docker-compose 파일 분석 실패!" +ErrInstallDirNotFound: "설치 디렉터리가 존재하지 않습니다" +AppStoreIsUpToDate: "최신 상태입니다" +LocalAppVersionNull: "{{.name}} 앱 버전이 동기화되지 않았습니다! 애플리케이션 목록에 추가할 수 없습니다" +LocalAppVersionErr: "{{.name}} 버전 {{.version}} 동기화 실패! {{.err}}" +ErrFileNotFound: "{{.name}} 파일이 존재하지 않습니다" +ErrFileParseApp: "{{.name}} 파일 분석 실패 {{.err}}" +ErrAppDirNull: "버전 폴더가 존재하지 않습니다" +LocalAppErr: "앱 {{.name}} 동기화 실패! {{.err}}" +ErrContainerName: "컨테이너 이름이 이미 존재합니다" +ErrAppSystemRestart: "1Panel 재시작으로 인해 작업이 중단되었습니다" +ErrCreateHttpClient: "HTTP 요청 생성 실패 {{.err}}" +ErrHttpReqTimeOut: "요청 시간이 초과되었습니다 {{.err}}" +ErrHttpReqFailed: "요청 실패 {{.err}}" +ErrHttpReqNotFound: "파일이 존재하지 않습니다" +ErrNoSuchHost: "네트워크 연결 실패" +ErrImagePullTimeOut: "이미지 가져오기 시간 초과" +ErrContainerNotFound: "{{ .name }} 컨테이너가 존재하지 않습니다" +ErrContainerMsg: "{{ .name }} 컨테이너가 비정상적입니다. 자세한 내용은 컨테이너 페이지의 로그를 확인하세요" +ErrAppBackup: "{{ .name }} 애플리케이션 백업 실패 오류 {{.err}}" +ErrImagePull: "{{ .name }} 이미지 가져오기 실패 오류 {{.err}}" +ErrVersionTooLow: "현재 1Panel 버전이 낮아 앱 스토어를 업데이트할 수 없습니다. 버전을 업그레이드하세요" +ErrAppNameExist: "앱 이름이 이미 존재합니다" +AppStoreIsSyncing: "앱 스토어가 동기화 중입니다. 나중에 다시 시도하세요" +ErrGetCompose: "docker-compose.yml 파일 가져오기 실패! {{ .detail }}" +ErrAppWarn: "비정상 상태, 로그를 확인하세요" +ErrAppParamKey: "매개변수 {{ .name }} 필드 예외" +ErrAppUpgrade: "애플리케이션 {{ .name }} 업그레이드 실패 {{ .err }}" +AppRecover: "앱 {{ .name }} 롤백 완료" +PullImageStart: "이미지 {{ .name }} 가져오기 시작" +PullImageSuccess: "이미지 가져오기 성공" +UpgradeAppStart: "애플리케이션 {{ .name }} 업그레이드 시작" +UpgradeAppSuccess: "앱 {{ .name }} 업그레이드 성공" + +# 파일 +ErrFileCanNotRead: "파일을 읽을 수 없습니다" +ErrFileToLarge: "파일이 너무 큽니다" +ErrPathNotFound: "경로를 찾을 수 없습니다" +ErrMovePathFailed: "대상 경로가 원래 경로를 포함할 수 없습니다!" +ErrLinkPathNotFound: "대상 경로가 존재하지 않습니다!" +ErrFileIsExist: "파일 또는 디렉터리가 이미 존재합니다!" +ErrFileUpload: "파일 업로드 실패 {{.name}} {{.detail}}" +ErrFileDownloadDir: "다운로드 폴더는 지원되지 않습니다" +ErrCmdNotFound: "{{ .name }} 명령이 존재하지 않습니다. 호스트에 이 명령을 먼저 설치하세요" +ErrSourcePathNotFound: "소스 디렉터리가 존재하지 않습니다" +ErrFavoriteExist: "이 경로는 이미 즐겨찾기에 추가되었습니다" +ErrInvalidChar: "잘못된 문자는 금지됩니다" +ErrPathNotDelete: "선택한 디렉터리는 삭제할 수 없습니다" + +# 웹사이트 +ErrDomainIsExist: "도메인 이름이 이미 존재합니다" +ErrAliasIsExist: "별칭이 이미 존재합니다" +ErrAppDelete: "다른 웹사이트에서 이 애플리케이션을 사용 중입니다" +ErrGroupIsUsed: "그룹이 사용 중이므로 삭제할 수 없습니다" +ErrBackupMatch: "백업 파일이 현재 웹사이트 데이터와 일치하지 않습니다: {{ .detail }}" +ErrBackupExist: "백업 파일이 원본 데이터의 일부와 일치하지 않습니다: {{ .detail }}" +ErrPHPResource: "로컬 런타임에서 전환을 지원하지 않습니다!" +ErrPathPermission: "인덱스 디렉터리에 1000:1000 권한이 아닌 폴더가 감지되었습니다. 웹사이트 액세스 시 '접근 거부' 오류가 발생할 수 있습니다. 상단의 저장 버튼을 클릭하세요" +ErrDomainIsUsed: "도메인이 웹사이트 {{ .name }}에서 이미 사용 중입니다" +ErrDomainFormat: "{{ .name }} 도메인 형식 오류" +ErrDefaultAlias: "기본은 예약된 코드 이름입니다. 다른 이름을 사용하세요" +ErrImageNotExist: "실행 환경 {{.name}} 이미지가 존재하지 않습니다. 실행 환경을 다시 편집하세요" + +# SSL 관련 +ErrSSLCannotDelete: "인증서 {{ .name }}은(는) 웹사이트에서 사용 중이므로 삭제할 수 없습니다." +ErrAccountCannotDelete: "계정과 연결된 인증서는 삭제할 수 없습니다." +ErrSSLApply: "인증서가 성공적으로 서명되었지만 Openresty 다시 로드에 실패했습니다. 구성을 확인하세요!" +ErrEmailIsExist: "이메일이 이미 존재합니다." +ErrSSLKeyNotFound: "개인 키 파일이 존재하지 않습니다." +ErrSSLCertificateNotFound: "인증서 파일이 존재하지 않습니다." +ErrSSLKeyFormat: "개인 키 파일 검증 오류" +ErrSSLCertificateFormat: "인증서 파일 형식 오류입니다. pem 형식을 사용하세요." +ErrEabKidOrEabHmacKeyCannotBlank: "EabKid 또는 EabHmacKey 는 비워둘 수 없습니다." +ErrOpenrestyNotFound: "HTTP 모드는 먼저 Openresty 를 설치해야 합니다." +ApplySSLStart: "인증서를 신청하기 시작합니다. 도메인 이름 [{{ .domain }}], 신청 방법 [{{ .type }}]" +dnsAccount: "DNS 자동" +dnsManual: "DNS 수동" +http: "HTTP" +ApplySSLFailed: "도메인 [{{ .domain }}] 인증서 신청 실패, {{ .detail }}" +ApplySSLSuccess: "도메인 [{{ .domain }}] 인증서 신청 성공!" +DNSAccountName: "DNS 계정 [{{ .name }}] 제조사 [{{ .type }}]" +PushDirLog: "인증서를 디렉토리 [{{ .path }}]에 푸시했습니다. {{ .status }}" +ErrDeleteCAWithSSL: "현재 조직에 발급된 인증서가 있으므로 삭제할 수 없습니다." +ErrDeleteWithPanelSSL: "패널 SSL 구성이 이 인증서를 사용 중이므로 삭제할 수 없습니다." +ErrDefaultCA: "기본 인증 기관은 삭제할 수 없습니다." +ApplyWebSiteSSLLog: "{{ .name }} 웹사이트 인증서를 업데이트하기 시작합니다." +ErrUpdateWebsiteSSL: "{{ .name }} 웹사이트 인증서 업데이트 실패: {{ .err }}" +ApplyWebSiteSSLSuccess: "웹사이트 인증서 업데이트 성공" +ErrExecShell: "스크립트 실행 실패 {{ .err }}" +ExecShellStart: "스크립트 실행 시작" +ExecShellSuccess: "스크립트 실행 성공" +StartUpdateSystemSSL: "시스템 인증서 업데이트 시작" +UpdateSystemSSLSuccess: "시스템 인증서 업데이트 성공" + +# MySQL +ErrUserIsExist: "현재 사용자가 이미 존재합니다. 새로운 사용자를 입력하세요." +ErrDatabaseIsExist: "현재 데이터베이스가 이미 존재합니다. 새로운 데이터베이스를 입력하세요." +ErrExecTimeOut: "SQL 실행이 시간 초과되었습니다. 데이터베이스를 확인하세요." +ErrRemoteExist: "원격 데이터베이스에 동일한 이름이 이미 존재합니다. 이름을 수정한 후 다시 시도하세요." +ErrLocalExist: "로컬 데이터베이스에 동일한 이름이 이미 존재합니다. 이름을 수정한 후 다시 시도하세요." + +# Redis +ErrTypeOfRedis: "복구 파일 형식이 현재 지속성 모드와 일치하지 않습니다. 파일 형식을 수정한 후 다시 시도하세요." + +# Container +ErrInUsed: "{{ .detail }}이(가) 사용 중이므로 삭제할 수 없습니다." +ErrObjectInUsed: "이 객체는 사용 중이므로 삭제할 수 없습니다." +ErrObjectBeDependent: "이 이미지는 다른 이미지에 의해 의존되고 있어 삭제할 수 없습니다." +ErrPortRules: "포트 수가 일치하지 않습니다. 다시 입력하세요!" +ErrPgImagePull: "이미지 가져오기 시간이 초과되었습니다. 이미지 가속 구성을 설정하거나 postgres:16.0-alpine 이미지를 수동으로 가져온 후 다시 시도하세요." + +# Runtime +ErrDirNotFound: "빌드 폴더가 존재하지 않습니다! 파일의 무결성을 확인하세요!" +ErrFileNotExist: "{{ .detail }} 파일이 존재하지 않습니다! 소스 파일의 무결성을 확인하세요!" +ErrImageBuildErr: "이미지 빌드 실패" +ErrImageExist: "이미지가 이미 존재합니다!" +ErrDelWithWebsite: "운영 환경이 웹사이트와 연결되어 있어 삭제할 수 없습니다." +ErrRuntimeStart: "실행 시작 실패" +ErrPackageJsonNotFound: "package.json 파일이 존재하지 않습니다." +ErrScriptsNotFound: "package.json 에서 스크립트 구성 항목을 찾을 수 없습니다." +ErrContainerNameNotFound: "컨테이너 이름을 가져올 수 없습니다. .env 파일을 확인하세요." +ErrNodeModulesNotFound: "node_modules 폴더가 존재하지 않습니다! 실행 환경을 편집하거나 실행 환경이 성공적으로 시작되기를 기다리세요." + +# Setting +ErrBackupInUsed: "백업 계정이 크론 작업에 사용 중이므로 삭제할 수 없습니다." +ErrBackupCheck: "백업 계정 연결 테스트 실패 {{ .err }}" +ErrOSSConn: "최신 버전을 가져올 수 없습니다. 서버가 외부 네트워크에 연결할 수 있는지 확인하세요." +ErrEntrance: "보안 입구 정보 오류. 확인 후 다시 시도하세요!" + +# Tool +ErrConfigNotFound: "구성 파일이 존재하지 않습니다." +ErrConfigParse: "구성 파일 형식 오류" +ErrConfigIsNull: "구성 파일은 비워둘 수 없습니다." +ErrConfigDirNotFound: "실행 디렉토리가 존재하지 않습니다." +ErrConfigAlreadyExist: "동일한 이름의 구성 파일이 이미 존재합니다." +ErrUserFindErr: "사용자 {{ .name }} 찾기 실패 {{ .err }}" + +# SSH +ErrFirewallNone: "시스템에서 firewalld 또는 ufw 서비스를 감지하지 못했습니다. 확인 후 다시 시도하세요!" +ErrFirewallBoth: "시스템에서 firewalld 와 ufw 서비스가 모두 감지되었습니다. 충돌을 방지하려면 하나를 제거한 후 다시 시도하세요!" + +# Cronjob +ErrBashExecute: "스크립트 실행 오류. 작업 출력 텍스트 영역에서 구체적인 정보를 확인하세요." +ErrCutWebsiteLog: "{{ .name }} 웹사이트 로그 자르기 실패, 오류 {{ .err }}" +CutWebsiteLogSuccess: "{{ .name }} 웹사이트 로그 자르기 성공, 백업 경로 {{ .path }}" + +# Toolbox +ErrNotExistUser: "현재 사용자가 존재하지 않습니다. 수정 후 다시 시도하세요!" +ErrBanAction: "설정 실패, 현재 {{ .name }} 서비스가 사용할 수 없습니다. 확인 후 다시 시도하세요!" +ErrClamdscanNotFound: "clamdscan 명령을 감지하지 못했습니다. 설치 문서를 참조하세요!" + +# WAF +ErrScope: "이 구성의 수정은 지원되지 않습니다." +ErrStateChange: "상태 수정 실패" +ErrRuleExist: "규칙이 이미 존재합니다." +ErrRuleNotExist: "규칙이 존재하지 않습니다." +ErrParseIP: "IP 형식 오류" +ErrDefaultIP: "default 는 예약된 이름입니다. 다른 이름으로 변경하세요." +ErrGroupInUse: "IP 그룹이 블랙/화이트 리스트에서 사용 중이며 삭제할 수 없습니다." +ErrGroupExist: "IP 그룹 이름이 이미 존재합니다." +ErrIPRange: "잘못된 IP 범위" +ErrIPExist: "IP가 이미 존재합니다." + +# License +ErrLicense: "라이선스 형식 오류, 확인 후 다시 시도하세요!" +ErrLicenseCheck: "라이선스 검증 실패, 확인 후 다시 시도하세요!" +ErrXpackVersion: "라이선스 검증 실패, 이 라이선스는 버전 제한이 있어 성공적으로 가져올 수 없습니다. 확인 후 다시 시도하세요!" +ErrLicenseSave: "라이선스 정보 저장 실패, 오류 {{ .err }}. 다시 시도하세요!" +ErrLicenseSync: "라이선스 정보 동기화 실패, 데이터베이스에서 라이선스 정보를 감지하지 못했습니다!" +ErrXpackNotFound: "이 섹션은 전문가 버전 기능입니다. Panel 설정 - 라이선스 인터페이스에서 먼저 라이선스를 가져오세요." +ErrXpackNotActive: "이 섹션은 전문가 버전 기능입니다. Panel 설정 - 라이선스 인터페이스에서 먼저 라이선스 상태를 동기화하세요." +ErrXpackOutOfDate: "현재 라이선스가 만료되었습니다. Panel 설정 - 라이선스 인터페이스에서 라이선스를 다시 가져오세요." +ErrXpackLost: "라이선스가 최대 재시도 횟수에 도달했습니다. [설정] - [라이선스] 페이지로 이동하여 동기화 버튼을 수동으로 클릭해 전문가 버전 기능을 정상적으로 작동시키세요." +ErrXpackTimeout: "요청 시간이 초과되었습니다. 네트워크 연결이 불안정할 수 있으니 나중에 다시 시도하세요!" + +# Alert +ErrAlert: "알림 정보 형식 오류, 확인 후 다시 시도하세요!" +ErrAlertPush: "알림 전송 오류, 확인 후 다시 시도하세요!" +ErrAlertSave: "알림 저장 오류, 확인 후 다시 시도하세요!" +ErrAlertSync: "알림 동기화 오류, 확인 후 다시 시도하세요!" +ErrAlertRemote: "원격 알림 오류, 확인 후 다시 시도하세요!" + +# CMD +AppVersion: "앱 버전" +AppCommands: "앱 관련 명령어" +AppInit: "앱 초기화" +AppKeyVal: "앱 키 (영어만 지원)" +AppCreateFileErr: "파일 {{ .name }} 생성 실패 {{ .err }}" +AppCreateDirErr: "폴더 {{ .name }} 생성 실패 {{ .err }}" +AppMissKey: "앱 키가 없습니다. -k 옵션으로 지정하세요." +AppMissVersion: "앱 버전이 없습니다. -v 옵션으로 지정하세요." +AppVersionExist: "버전이 이미 존재합니다!" +AppCreateSuccessful: "생성 성공!" +AppWriteErr: "파일 {{ .name }} 쓰기 실패 {{ .err }}" +SudoHelper: "{{ .cmd }} 명령을 사용하거나 root 사용자로 전환하세요." +ListenIPCommands: "IP 변경" +ListenIPv4: "IPv4 에서 수신 대기" +ListenIPv6: "IPv6 에서 수신 대기" +ListenChangeSuccessful: "변경 성공! 현재 {{ .value }}에서 수신 대기 중입니다." +ResetCommands: "시스템 정보 초기화" +ResetMFA: "1Panel 이중 인증 취소" +ResetHttps: "1Panel HTTPS 로그인 취소" +ResetEntrance: "1Panel 보안 입구 취소" +ResetIPs: "1Panel 허용 IP 제한 취소" +ResetDomain: "1Panel 도메인 바인딩 취소" +RestoreCommands: "1Panel 서비스 및 데이터 복구" +RestoreNoSuchFile: "복구 가능한 파일이 없습니다." +RestoreStep1: "(1/5) {{ .name }} 디렉토리에서 1Panel 서비스 및 데이터 복구 시작..." +RestoreStep2: "(2/5) 1Panel 바이너리 복구 성공" +RestoreStep3: "(3/5) 1Panel 스크립트 복구 성공" +RestoreStep4: "(4/5) 1Panel 서비스 복구 성공" +RestoreStep5: "(5/5) 1Panel 데이터 복구 성공" +RestoreSuccessful: "복구 성공! 서비스를 다시 시작합니다. 잠시만 기다려주세요..." +UpdateCommands: "패널 정보 업데이트" +UpdateUser: "패널 사용자 업데이트" +UpdatePassword: "패널 비밀번호 업데이트" +UpdatePort: "패널 포트 업데이트" +UpdateUserNull: "오류: 패널 사용자가 비어 있습니다!" +UpdateUserBlank: "오류: 패널 사용자에 공백이 포함되어 있습니다!" +UpdateUserFormat: "오류: 잘못된 패널 사용자 형식! 영어, 중국어, 숫자, _만 지원하며 길이는 3~30자입니다." +UpdateUserErr: "오류: 패널 사용자 업데이트 실패 {{ .err }}" +UpdateSuccessful: "업데이트 성공!" +UpdateUserResult: "패널 사용자: {{ .name }}" +UpdatePasswordRead: "오류: 패널 비밀번호 정보 읽기 실패 {{ .err }}" +UpdatePasswordNull: "오류: 패널 비밀번호가 비어 있습니다!" +UpdateUPasswordBlank: "오류: 패널 비밀번호에 공백이 포함되어 있습니다!" +UpdatePasswordFormat: "오류: 패널 비밀번호는 문자, 숫자, 특수 문자 !@#$%*_,.?만 지원하며 길이는 8~30자입니다!" +UpdatePasswordLen: "오류: 6자 이상의 비밀번호를 입력하세요!" +UpdatePasswordRe: "비밀번호 확인:" +UpdatePasswordErr: "오류: 패널 비밀번호 업데이트 실패 {{ .err }}" +UpdatePasswordSame: "오류: 두 비밀번호가 일치하지 않습니다. 확인 후 다시 시도하세요!" +UpdatePasswordResult: "패널 비밀번호: {{ .name }}" +UpdatePortFormat: "오류: 입력한 포트 번호는 1~65535 사이여야 합니다!" +UpdatePortUsed: "오류: 포트 번호가 이미 사용 중입니다. 확인 후 다시 시도하세요!" +UpdatePortErr: "오류: 패널 포트 업데이트 실패 {{ .err }}" +UpdatePortResult: "패널 포트: {{ .name }}" +UpdatePortFirewallAdd: "방화벽 포트 규칙 추가 실패 {{ .err }}, 방화벽 규칙에 {{ .name }} 포트를 수동으로 추가하세요." +UpdatePortFirewallDel: "오류: 방화벽 포트 삭제 실패 {{ .err }}" +UpdatePortFirewallReload: "방화벽 다시 로드 실패 {{ .err }}, 방화벽을 수동으로 다시 로드하세요." +UserInfo: "패널 정보 가져오기" +UserInfoAddr: "패널 주소: " +UserInfoPassHelp: "팁: 비밀번호를 변경하려면 다음 명령어를 실행할 수 있습니다: " +DBConnErr: "오류: 데이터베이스 연결 초기화 실패 {{ .err }}" +SystemVersion: "버전: " +SystemMode: "모드: " diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 8ff64a107..fdaa9edf2 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -14,6 +14,7 @@ import ja from 'element-plus/es/locale/lang/ja'; import ms from 'element-plus/es/locale/lang/ms'; import ptBR from 'element-plus/es/locale/lang/pt-br'; import ru from 'element-plus/es/locale/lang/ru'; +import ko from 'element-plus/es/locale/lang/ko'; import { useTheme } from '@/hooks/use-theme'; useTheme(); @@ -30,6 +31,7 @@ const i18nLocale = computed(() => { if (globalStore.language === 'ms') return ms; if (globalStore.language === 'ru') return ru; if (globalStore.language === 'pt-br') return ptBR; + if (globalStore.language === 'ko') return ko; return zhCn; }); @@ -43,5 +45,3 @@ const reload = () => { }; provide('reload', reload); - - diff --git a/frontend/src/lang/index.ts b/frontend/src/lang/index.ts index 628130391..a84e26445 100644 --- a/frontend/src/lang/index.ts +++ b/frontend/src/lang/index.ts @@ -6,6 +6,7 @@ import ptBr from './modules/pt-br'; import ja from './modules/ja'; import ru from './modules/ru'; import ms from './modules/ms'; +import ko from './modules/ko'; const i18n = createI18n({ legacy: false, @@ -20,6 +21,7 @@ const i18n = createI18n({ ja, ru, ms, + ko, }, warnHtmlMessage: false, }); diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 5fbde0118..28485d51e 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -60,7 +60,7 @@ const message = { copy: 'Copy', random: 'Random', uninstall: 'Uninstall', - fullscreen: 'Enter fullscreen', + fullscreen: 'Fullscreen', quitFullscreen: 'Exit fullscreen', update: 'Edit', showAll: 'Show All', @@ -1942,7 +1942,7 @@ const message = { app: 'Application', appNew: 'New Application', appInstalled: 'Installed application', - create: 'Create website', + create: 'Create', delete: 'Delete Website', deleteApp: 'Delete Application', deleteBackup: 'Delete Backup', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index 540c29dee..0a2c635d9 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -1,8 +1,8 @@ -import fit2cloudEnLocale from 'fit2cloud-ui-plus/src/locale/lang/ja'; -let xpackJpLocale = {}; +import fit2cloudJaLocale from 'fit2cloud-ui-plus/src/locale/lang/ja'; +let xpackJaLocale = {}; const xpackModules = import.meta.glob('../../xpack/lang/ja.ts', { eager: true }); if (xpackModules['../../xpack/lang/ja.ts']) { - xpackJpLocale = xpackModules['../../xpack/lang/ja.ts']['default'] || {}; + xpackJaLocale = xpackModules['../../xpack/lang/ja.ts']['default'] || {}; } const message = { @@ -59,8 +59,8 @@ const message = { copy: 'コピー', random: 'ランダム', uninstall: 'アンインストール', - fullscreen: 'フルスクリーンを入力します', - quitFullscreen: 'フルスクリーンを終了します', + fullscreen: 'フルスクリーン', + quitFullscreen: 'フルスクリーンを終了', update: '編集', showAll: 'すべてを表示します', hideSome: 'いくつかを隠します', @@ -1915,7 +1915,7 @@ const message = { app: '応用', appNew: '新しいアプリケーション', appInstalled: 'インストールされたアプリケーション', - create: 'Webサイトを作成します', + create: '作成する', delete: 'Webサイトを削除します', deleteApp: 'アプリケーションを削除します', deleteBackup: 'バックアップを削除します', @@ -2490,7 +2490,7 @@ const message = { }, }; export default { - ...fit2cloudEnLocale, + ...fit2cloudJaLocale, ...message, - ...xpackJpLocale, + ...xpackJaLocale, }; diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts new file mode 100644 index 000000000..75aa26ea7 --- /dev/null +++ b/frontend/src/lang/modules/ko.ts @@ -0,0 +1,2460 @@ +import fit2cloudKoLocale from 'fit2cloud-ui-plus/src/locale/lang/en'; + +let xpackKoLocale = {}; +const xpackModules = import.meta.glob('../../xpack/lang/ko.ts', { eager: true }); +if (xpackModules['../../xpack/lang/ko.ts']) { + xpackKoLocale = xpackModules['../../xpack/lang/ko.ts']['default'] || {}; +} + +const message = { + commons: { + true: '참', + false: '거짓', + colon: ': ', + example: '예를 들어, ', + fit2cloud: 'FIT2CLOUD', + lingxia: 'Lingxia', + button: { + create: '생성', + add: '추가', + save: '저장', + set: '설정 수정', + sync: '동기화', + delete: '삭제', + edit: '편집', + enable: '활성화', + disable: '비활성화', + confirm: '확인', + cancel: '취소', + reset: '재설정', + restart: '재시작', + conn: '연결', + disconnect: '연결 해제', + clean: '정리', + login: '로그인', + close: '닫기', + off: '꺼짐', + stop: '중지', + start: '시작', + view: '보기', + watch: '감시', + handle: '트리거', + expand: '확장', + collapse: '축소', + log: '로그', + back: '뒤로', + backup: '백업', + recover: '복구', + retry: '재시도', + upload: '업로드', + download: '다운로드', + init: '초기화', + verify: '검증', + saveAndEnable: '저장 및 활성화', + import: '가져오기', + search: '검색', + refresh: '새로고침', + get: '가져오기', + upgrade: '업그레이드', + ignore: '업그레이드 무시', + copy: '복사', + random: '무작위', + uninstall: '제거', + fullscreen: '전체 화면', + quitFullscreen: '전체 화면 종료', + update: '수정', + showAll: '모두 보기', + hideSome: '일부 숨기기', + agree: '동의', + notAgree: '동의하지 않음', + preview: '미리 보기', + open: '열기', + notSave: '저장하지 않음', + createNewFolder: '새 폴더 생성', + createNewFile: '새 파일 생성', + helpDoc: '도움말 문서', + unbind: '연결 해제', + }, + search: { + timeStart: '시작 시간', + timeEnd: '종료 시간', + timeRange: '부터', + dateStart: '시작 날짜', + dateEnd: '종료 날짜', + }, + table: { + all: '전체', + total: '총 {0}', + name: '이름', + type: '유형', + status: '상태', + statusSuccess: '성공', + statusFailed: '실패', + statusWaiting: '대기 중...', + records: '기록', + group: '그룹', + createdAt: '생성 시간', + publishedAt: '게시 시간', + date: '날짜', + updatedAt: '업데이트 시간', + operate: '작업', + message: '메시지', + description: '설명', + interval: '간격', + user: '소유자', + title: '제목', + port: '포트', + forward: '포워드', + protocol: '프로토콜', + tableSetting: '테이블 설정', + refreshRate: '새로 고침 속도', + refreshRateUnit: '새로 고침 안 함 | {n} 초/회 | {n} 초/회', + selectColumn: '열 선택', + }, + loadingText: { + Upgrading: '시스템 업그레이드 중입니다. 잠시만 기다려 주십시오...', + Restarting: '시스템 재시작 중입니다. 잠시만 기다려 주십시오...', + Recovering: '스냅샷에서 복구 중입니다. 잠시만 기다려 주십시오...', + Rollbacking: '스냅샷에서 롤백 중입니다. 잠시만 기다려 주십시오...', + }, + msg: { + noneData: '데이터가 없습니다', + delete: `이 작업은 되돌릴 수 없습니다. 계속하시겠습니까?`, + clean: `이 작업은 되돌릴 수 없습니다. 계속하시겠습니까?`, + deleteTitle: '삭제', + deleteSuccess: '삭제 완료', + loginSuccess: '로그인 성공', + operationSuccess: '작업 완료', + copySuccess: '복사 완료', + notSupportOperation: `이 작업은 지원되지 않습니다`, + requestTimeout: '요청이 시간 초과되었습니다. 나중에 다시 시도해 주십시오', + infoTitle: '안내', + notRecords: '현재 작업에 대한 실행 기록이 생성되지 않았습니다', + sureLogOut: '로그아웃하시겠습니까?', + createSuccess: '생성 완료', + updateSuccess: '업데이트 완료', + uploadSuccess: '업로드 성공', + operate: '작업', + operateConfirm: '작업을 확인하려면 수동으로 입력하십시오: ', + inputOrSelect: '선택하거나 입력해 주십시오', + copyFailed: '복사 실패', + operatorHelper: `"{0}"에 대해 "{1}" 작업이 수행되며 이 작업은 되돌릴 수 없습니다. 계속하시겠습니까?`, + notFound: '죄송합니다. 요청하신 페이지를 찾을 수 없습니다.', + unSupportType: `현재 파일 형식은 지원되지 않습니다.`, + unSupportSize: '업로드된 파일이 {0}M을 초과했습니다. 확인해 주십시오!', + fileExist: `현재 폴더에 이미 동일한 파일이 존재합니다. 중복 업로드는 지원되지 않습니다.`, + fileNameErr: '파일 이름은 1~256 자 사이의 영어, 중국어, 숫자, 또는 점(.-_)만 포함해야 합니다.', + confirmNoNull: `{0} 값이 비어 있지 않은지 확인하십시오.`, + errPort: '포트 정보가 올바르지 않습니다. 확인해 주십시오!', + remove: '제거', + backupHelper: '현재 작업은 {0}을(를) 백업합니다. 계속하시겠습니까?', + recoverHelper: '{0} 파일에서 복원 중입니다. 이 작업은 되돌릴 수 없습니다. 계속하시겠습니까?', + refreshSuccess: '새로 고침 완료', + rootInfoErr: '이미 루트 디렉토리입니다', + resetSuccess: '초기화 완료', + creatingInfo: '생성 중입니다. 이 작업이 필요하지 않습니다', + }, + login: { + username: '사용자 이름', + password: '비밀번호', + welcome: '다시 오신 것을 환영합니다. 사용자 이름과 비밀번호를 입력하여 로그인하세요!', + errorAuthInfo: '입력한 사용자 이름 또는 비밀번호가 잘못되었습니다. 다시 입력해주세요!', + errorMfaInfo: '인증 정보가 잘못되었습니다. 다시 시도해주세요!', + captchaHelper: '캡챠', + errorCaptcha: '캡챠 코드 오류!', + notSafe: '접근이 거부되었습니다', + safeEntrance1: '현재 환경에서 보안 로그인이 활성화되었습니다', + safeEntrance2: 'SSH 터미널에서 다음 명령어를 입력하여 패널 진입 경로를 확인하세요: 1pctl user-info', + errIP1: '현재 환경에서 승인된 IP 주소 접근이 활성화되었습니다', + errDomain1: '현재 환경에서 도메인 이름 바인딩이 활성화되었습니다', + errHelper: '바인딩 정보를 재설정하려면 SSH 터미널에서 다음 명령어를 실행하세요:', + codeInput: 'MFA 인증기의 6자리 인증 코드를 입력하세요', + mfaTitle: 'MFA 인증', + mfaCode: 'MFA 인증 코드', + title: 'Linux 서버 관리 패널', + licenseHelper: + '« 커뮤니티 라이선스 계약 »에 동의합니다', + errorAgree: '커뮤니티 소프트웨어 라이선스에 동의하려면 클릭하세요', + logout: '로그아웃', + agreeTitle: '동의', + agreeContent: + '귀하의 합법적인 권리와 이익을 보다 잘 보호하기 위해, 다음 « 커뮤니티 라이선스 계약 »을 읽고 동의해주세요.', + }, + rule: { + username: '사용자 이름을 입력하세요', + password: '비밀번호를 입력하세요', + rePassword: '확인 비밀번호가 비밀번호와 일치하지 않습니다.', + requiredInput: '이 필드는 필수 항목입니다.', + requiredSelect: '목록에서 항목을 선택하세요', + illegalInput: '이 필드에는 유효하지 않은 문자가 포함될 수 없습니다.', + commonName: + '이 필드는 특수 문자로 시작할 수 없으며, 영어, 한자, 숫자, ".", "-", "_" 문자로 구성되어야 하며 길이는 1-128자여야 합니다.', + userName: '이 필드는 영어, 한자, 숫자 및 "_" 문자로 구성되어야 하며 길이는 3-30 자여야 합니다.', + simpleName: + '이 필드는 "_"로 시작할 수 없으며, 영어, 숫자 및 "_" 문자로 구성되어야 하며 길이는 3-30 자여야 합니다.', + simplePassword: + '이 필드는 "_"로 시작할 수 없으며, 영어, 숫자 및 "_" 문자로 구성되어야 하며 길이는 1-30 자여야 합니다.', + dbName: '이 필드는 "_"로 시작할 수 없으며, 영어, 숫자 및 "_" 문자로 구성되어야 하며 길이는 1-64 자여야 합니다.', + imageName: + '이 필드는 영어, 숫자, ":", "@", "/", ".", "-", "_" 문자로 구성되어야 하며 길이는 1-256 자여야 합니다.', + composeName: '특수 문자로 시작할 수 없으며, 소문자, 숫자, "-", "_"를 지원하며 길이는 1-256 자여야 합니다.', + volumeName: '이 필드는 영어, 숫자, ".", "-", "_" 문자로 구성되어야 하며 길이는 2-30 자여야 합니다.', + supervisorName: + '이 필드는 특수 문자로 시작할 수 없으며, 영어, 숫자, "-", "_" 문자로 구성되어야 하며 길이는 1-128 자여야 합니다.', + complexityPassword: + '이 필드는 영어와 숫자로 구성되어야 하며 길이는 8-30 자이고 최소 두 개의 특수 문자가 포함되어야 합니다.', + commonPassword: '이 필드 길이는 6 자 이상이어야 합니다.', + linuxName: '이 필드 길이는 1-128 자 사이여야 하며, 다음 특수 문자를 포함할 수 없습니다: "{0}".', + email: '이 필드는 유효한 이메일 주소여야 합니다.', + number: '이 필드는 숫자여야 합니다.', + integer: '이 필드는 양의 정수여야 합니다.', + ip: '이 필드는 유효한 IP 주소여야 합니다.', + host: '이 필드는 유효한 IP 주소 또는 도메인 이름이어야 합니다.', + hostHelper: 'IP 주소 또는 도메인 이름 입력을 지원합니다', + port: '이 필드는 유효한 포트 번호여야 합니다.', + selectHelper: '올바른 {0} 파일을 선택하세요', + domain: '이 필드는 다음 형식이어야 합니다: example.com 또는 example.com:8080.', + databaseName: '이 필드는 영어, 숫자 및 "_" 문자로 구성되어야 하며 길이는 1-30 자여야 합니다.', + ipErr: '이 필드는 유효한 IP 주소여야 합니다.', + numberRange: '이 필드는 {0}에서 {1} 사이의 숫자여야 합니다.', + paramName: '이 필드는 영어, 숫자, ".", "-", "_" 문자로 구성되어야 하며 길이는 2-30 자여야 합니다.', + paramComplexity: + '이 필드는 특수 문자로 시작하거나 끝날 수 없으며, 영어, 숫자, "{0}" 문자로 구성되어야 하며 길이는 6-128 자여야 합니다.', + paramUrlAndPort: '이 필드는 "http(s)://(도메인 이름/IP):(포트)" 형식이어야 합니다.', + nginxDoc: '이 필드는 영어, 숫자 및 "." 문자로 구성되어야 합니다.', + appName: + '소문자, 숫자, "-", "_"를 지원하며 길이는 2-30 자이고, "-" 또는 "_"로 시작하거나 끝날 수 없습니다.', + containerName: + '영어, 숫자, "-", "_", "."를 지원하며, "-", "_", "."로 시작할 수 없고 길이는 2-128 자여야 합니다.', + mirror: '미러 가속 주소는 http(s)://로 시작해야 하며, 대소문자 영어, 숫자, ".", "/", "-"를 지원하고 공백을 포함할 수 없습니다.', + disableFunction: '영어 문자, 밑줄 및 ,만 지원합니다', + leechExts: '영어 문자, 숫자 및 ,만 지원합니다', + paramSimple: '소문자와 숫자를 지원하며 길이는 1-128 자여야 합니다', + filePermission: '파일 권한 오류', + formatErr: '형식 오류입니다. 확인 후 다시 시도하세요', + phpExtension: '소문자 영어와 숫자, "_"만 지원합니다', + paramHttp: 'http:// 또는 https:// 로 시작해야 합니다', + phone: '전화번호 형식이 올바르지 않습니다', + }, + res: { + paramError: '요청이 실패했습니다. 나중에 다시 시도하세요!', + forbidden: '현재 사용자는 권한이 없습니다', + serverError: '서비스 예외', + notFound: '리소스가 존재하지 않습니다', + commonError: '요청이 실패했습니다', + }, + service: { + serviceNotStarted: `{0} 서비스가 시작되지 않았습니다.`, + }, + status: { + running: '실행 중', + done: '완료', + scanFailed: '불완전', + success: '성공', + waiting: '대기 중', + waiting1: '대기 중', + failed: '실패', + stopped: '중지됨', + error: '오류', + created: '생성됨', + restarting: '재시작 중', + uploading: '업로드 중', + unhealthy: '비정상', + removing: '제거 중', + paused: '일시 중지', + exited: '종료됨', + dead: '중단됨', + installing: '설치 중', + enabled: '활성화됨', + disabled: '비활성화됨', + normal: '정상', + building: '빌드 중', + downloaderr: '다운로드 오류', + upgrading: '업그레이드 중', + upgradeerr: '업그레이드 오류', + pullerr: '이미지 가져오기 오류', + rebuilding: '재빌드 중', + deny: '거부됨', + accept: '수락됨', + used: '사용 중', + unUsed: '사용 안 함', + starting: '시작 중', + recreating: '재생성 중', + creating: '생성 중', + systemrestart: '중단됨', + init: '애플리케이션 대기 중', + ready: '정상', + applying: '적용 중', + applyerror: '실패', + syncerr: '오류', + uperr: '오류', + }, + units: { + second: '초 | 초 | 초', + minute: '분 | 분 | 분', + hour: '시간 | 시간 | 시간', + day: '일 | 일 | 일', + week: '주 | 주 | 주', + month: '월 | 월 | 월', + year: '년 | 년 | 년', + time: '시간', + core: '코어 | 코어 | 코어', + millisecond: '밀리초 | 밀리초', + secondUnit: '초', + minuteUnit: '분', + hourUnit: '시간', + dayUnit: '일', + weekUnit: '주', + monthUnit: '월', + yearUnit: '년', + millisecondUnit: 'ms', + }, + operate: { + down: '중지', + up: '시작', + restart: '재시작', + install: '설치', + uninstall: '제거', + update: '업데이트', + }, + }, + menu: { + home: '개요', + apps: '앱 스토어', + website: '웹사이트 | 웹사이트들', + project: '프로젝트 | 프로젝트들', + config: '구성 | 구성들', + ssh: 'SSH 설정', + firewall: '방화벽', + ssl: '인증서 | 인증서들', + database: '데이터베이스 | 데이터베이스들', + container: '컨테이너 | 컨테이너들', + cronjob: '크론 작업 | 크론 작업들', + host: '호스트 | 호스트들', + system: '시스템', + security: '보안', + files: '파일', + monitor: '모니터링', + terminal: '터미널 | 터미널들', + settings: '설정 | 설정들', + toolbox: '툴박스', + logs: '로그 | 로그들', + runtime: '런타임 | 런타임들', + processManage: '프로세스 | 프로세스들', + process: '프로세스 | 프로세스들', + network: '네트워크 | 네트워크들', + supervisor: '슈퍼바이저', + name: '변조 방지', + }, + home: { + restart_1panel: '패널 재시작', + restart_system: '서버 재시작', + operationSuccess: + '작업이 성공적으로 완료되었습니다. 시스템이 재부팅 중입니다. 나중에 브라우저를 수동으로 새로 고침하세요!', + overview: '개요', + entranceHelper: `보안 입구가 활성화되어 있지 않습니다. "설정 -> 보안"에서 활성화하여 시스템 보안을 강화할 수 있습니다.`, + appInstalled: '설치된 애플리케이션', + systemInfo: '시스템 정보', + hostname: '호스트 이름', + platformVersion: '운영 체제', + kernelVersion: '커널', + kernelArch: '아키텍처', + network: '네트워크', + io: '디스크 I/O', + ip: '로컬 IP', + proxy: '시스템 프록시', + baseInfo: '기본 정보', + totalSend: '총 송신', + totalRecv: '총 수신', + rwPerSecond: 'I/O 작업', + ioDelay: 'I/O 지연 시간', + uptime: '작동 시간', + runningTime: '가동 시간', + mem: '시스템', + swapMem: '스왑 파티션', + + runSmoothly: '낮은 부하', + runNormal: '보통 부하', + runSlowly: '높은 부하', + runJam: '심한 부하', + + core: '물리적 코어', + logicCore: '논리 코어', + loadAverage: '지난 1분의 평균 부하 | 지난 {n} 분의 평균 부하', + load: '부하', + mount: '마운트 지점', + fileSystem: '파일 시스템', + total: '총량', + used: '사용 중', + free: '여유', + percent: '사용률', + app: '추천 애플리케이션', + goInstall: 'Go 설치', + + networkCard: '네트워크 카드', + disk: '디스크', + }, + tabs: { + more: '더 보기', + hide: '숨기기', + close: '닫기', + closeLeft: '왼쪽 닫기', + closeRight: '오른쪽 닫기', + closeCurrent: '현재 탭 닫기', + closeOther: '다른 탭 닫기', + closeAll: '모두 닫기', + }, + header: { + logout: '로그아웃', + }, + database: { + all: '모두', + manage: '관리', + database: '데이터베이스', + deleteBackupHelper: '데이터베이스 백업을 동시에 삭제', + delete: '삭제 작업은 되돌릴 수 없습니다. 삭제하려면 "', + deleteHelper: '"를 입력하세요.', + create: '데이터베이스 생성', + noMysql: '데이터베이스 서비스 (MySQL 또는 MariaDB)', + noPostgresql: '데이터베이스 서비스 Postgresql', + goUpgrade: '업그레이드로 이동', + goInstall: '설치로 이동', + source: '소스', + isDelete: '삭제됨', + permission: '권한', + permissionForIP: 'IP', + permissionAll: '모두(%)', + databaseConnInfo: '연결 정보', + rootPassword: '루트 비밀번호', + serviceName: '서비스 이름', + serviceNameHelper: '같은 네트워크 내 컨테이너 간의 접근.', + backupList: '백업', + loadBackup: '불러오기', + remoteAccess: '원격 접근', + remoteHelper: '여러 IP 를 쉼표로 구분하여 입력, 예: 172.16.10.111, 172.16.10.112', + remoteConnHelper: + 'MySQL 의 root 사용자로 원격 접속은 보안 위험을 초래할 수 있습니다. 따라서 이 작업은 신중히 수행해야 합니다.', + changePassword: '비밀번호', + changePasswordHelper: + '데이터베이스가 애플리케이션과 연결되어 있습니다. 비밀번호를 변경하면 애플리케이션의 데이터베이스 비밀번호도 변경됩니다. 변경 사항은 애플리케이션이 재시작된 후에 적용됩니다.', + confChange: '설정', + confNotFound: + '설정 파일을 찾을 수 없습니다. 앱 스토어에서 애플리케이션을 최신 버전으로 업그레이드하고 다시 시도해주세요!', + portHelper: '이 포트는 컨테이너의 노출된 포트입니다. 수정을 별도로 저장하고 컨테이너를 재시작해야 합니다!', + loadFromRemote: '동기화', + userBind: '사용자 바인딩', + pgBindHelper: `이 작업은 새 사용자를 생성하여 대상 데이터베이스에 바인딩하는 데 사용됩니다. 현재 데이터베이스에 이미 존재하는 사용자 선택은 지원되지 않습니다.`, + pgSuperUser: '슈퍼 사용자', + loadFromRemoteHelper: '이 작업은 서버의 데이터베이스 정보를 1Panel로 동기화합니다. 계속 진행하시겠습니까?', + passwordHelper: '불러올 수 없습니다. 수정해주세요.', + local: '로컬', + remote: '원격', + remoteDB: '원격 서버 | 원격 서버들', + manageRemoteDB: '원격 DB 관리', + createRemoteDB: '원격 DB 바인딩', + unBindRemoteDB: '원격 DB 바인딩 해제', + unBindForce: '강제 바인딩 해제', + unBindForceHelper: '바인딩 해제 중 발생하는 모든 오류를 무시하고 최종 작업을 성공적으로 완료합니다.', + unBindRemoteHelper: + '원격 데이터베이스 바인딩 해제는 바인딩 관계만 제거하며, 원격 데이터베이스 자체는 삭제되지 않습니다.', + editRemoteDB: '원격 서버 편집', + localDB: '로컬 데이터베이스', + address: '데이터베이스 주소', + version: '데이터베이스 버전', + userHelper: '루트 사용자 또는 루트 권한을 가진 데이터베이스 사용자가 원격 데이터베이스에 접근할 수 있습니다.', + pgUserHelper: '슈퍼 사용자 권한을 가진 데이터베이스 사용자.', + ssl: 'SSL 사용', + clientKey: '클라이언트 개인 키', + clientCert: '클라이언트 인증서', + caCert: 'CA 인증서', + hasCA: 'CA 인증서 있음', + skipVerify: '인증서 유효성 검사 무시', + + formatHelper: '현재 데이터베이스 문자셋은 {0} 입니다. 문자셋 불일치로 인해 복구에 실패할 수 있습니다.', + selectFile: '파일 선택', + dropHelper: '여기에 업로드한 파일을 드래그 앤 드롭하거나', + clickHelper: '클릭하여 업로드', + supportUpType: 'sql, sql.gz, tar.gz 파일만 지원됩니다.', + zipFormat: 'tar.gz 압축 패키지 구조: test.tar.gz 압축 패키지에는 test.sql이 포함되어야 합니다.', + + currentStatus: '현재 상태', + baseParam: '기본 파라미터', + performanceParam: '성능 파라미터', + runTime: '시작 시간', + connections: '전체 연결', + bytesSent: '전송된 바이트', + bytesReceived: '수신된 바이트', + queryPerSecond: '초당 쿼리', + txPerSecond: '초당 전송', + connInfo: '활성/최대 연결', + connInfoHelper: '값이 너무 크면 "max_connections" 값을 증가시켜야 합니다.', + threadCacheHit: '스레드 캐시 적중', + threadCacheHitHelper: '값이 너무 낮으면 "thread_cache_size" 값을 증가시켜야 합니다.', + indexHit: '인덱스 적중', + indexHitHelper: '값이 너무 낮으면 "key_buffer_size" 값을 증가시켜야 합니다.', + innodbIndexHit: 'Innodb 인덱스 적중률', + innodbIndexHitHelper: '값이 너무 낮으면 "innodb_buffer_pool_size" 값을 증가시켜야 합니다.', + cacheHit: '쿼리 캐시 적중', + cacheHitHelper: '값이 너무 낮으면 "query_cache_size" 값을 증가시켜야 합니다.', + tmpTableToDB: '디스크로 임시 테이블', + tmpTableToDBHelper: '값이 너무 크면 "tmp_table_size" 값을 증가시켜야 합니다.', + openTables: '열린 테이블', + openTablesHelper: '"table_open_cache" 설정 값이 이 값 이상이어야 합니다.', + selectFullJoin: '전체 조인 선택', + selectFullJoinHelper: '값이 0이 아니면 데이터 테이블의 인덱스가 올바른지 확인하십시오.', + selectRangeCheck: '인덱스 없는 조인 수', + selectRangeCheckHelper: '값이 0이 아니면 데이터 테이블의 인덱스가 올바른지 확인하십시오.', + sortMergePasses: '정렬된 병합 횟수', + sortMergePassesHelper: '값이 너무 크면 "sort_buffer_size" 값을 증가시켜야 합니다.', + tableLocksWaited: '테이블 잠금 대기', + tableLocksWaitedHelper: '값이 너무 크면 데이터베이스 성능을 증가시키는 것을 고려해야 합니다.', + + performanceTuning: '성능 튜닝', + optimizationScheme: '최적화 방안', + keyBufferSizeHelper: '인덱스용 버퍼 크기', + queryCacheSizeHelper: '쿼리 캐시. 이 기능이 비활성화된 경우 이 값을 0으로 설정하세요.', + tmpTableSizeHelper: '임시 테이블 캐시 크기', + innodbBufferPoolSizeHelper: 'Innodb 버퍼 크기', + innodbLogBufferSizeHelper: 'Innodb 로그 버퍼 크기', + sortBufferSizeHelper: '* 연결당, 스레드 정렬 버퍼 크기', + readBufferSizeHelper: '* 연결당, 읽기 버퍼 크기', + readRndBufferSizeHelper: '* 연결당, 임의 읽기 버퍼 크기', + joinBufferSizeHelper: '* 연결당, 조인 테이블 캐시 크기', + threadStackelper: '* 연결당, 스레드별 스택 크기', + binlogCacheSizeHelper: '* 연결당, 이진 로그 캐시 크기 (4096의 배수)', + threadCacheSizeHelper: '스레드 풀 크기', + tableOpenCacheHelper: '테이블 캐시', + maxConnectionsHelper: '최대 연결 수', + restart: '재시작', + + log: '로그', + slowLog: '느린 로그', + noData: '아직 느린 로그가 없습니다.', + + isOn: '켜짐', + longQueryTime: '임계값(s)', + thresholdRangeHelper: '올바른 임계값을 입력하십시오 (1 - 600).', + + timeout: '타임아웃', + timeoutHelper: '유휴 연결의 타임아웃 기간. 0은 연결이 지속적으로 유지됨을 의미합니다.', + maxclients: '최대 클라이언트', + requirepassHelper: + '비밀번호가 설정되지 않은 경우 이 필드를 비워 두세요. 변경 사항은 별도로 저장하고 컨테이너를 재시작해야 합니다!', + databases: '데이터베이스 수', + maxmemory: '최대 메모리 사용량', + maxmemoryHelper: '0은 제한이 없음을 의미합니다.', + tcpPort: '현재 수신 포트.', + uptimeInDays: '운영 일수.', + connectedClients: '연결된 클라이언트 수.', + usedMemory: '현재 Redis 의 메모리 사용량.', + usedMemoryRss: '운영 체제에서 요청한 메모리 크기.', + usedMemoryPeak: 'Redis 의 최대 메모리 소비량.', + memFragmentationRatio: '메모리 단편화 비율.', + totalConnectionsReceived: '시작 이후 총 연결된 클라이언트 수.', + totalCommandsProcessed: '실행된 총 명령 수.', + instantaneousOpsPerSec: '초당 서버에서 실행된 명령 수.', + keyspaceHits: '데이터베이스 키가 성공적으로 발견된 횟수.', + keyspaceMisses: '데이터베이스 키를 찾지 못한 횟수.', + hit: '데이터베이스 키 발견 비율.', + latestForkUsec: '마지막 fork() 작업에 소요된 마이크로초 수.', + redisCliHelper: `"redis-cli" 서비스가 감지되지 않았습니다. 서비스를 먼저 활성화하십시오.`, + redisQuickCmd: 'Redis 빠른 명령', + recoverHelper: '이 작업은 데이터를 [{0}]으로 덮어씁니다. 계속하시겠습니까?', + submitIt: '데이터 덮어쓰기', + + baseConf: '기본 설정', + allConf: '모든 설정', + restartNow: '지금 재시작', + restartNowHelper1: + '구성 변경 사항이 적용되려면 시스템을 재시작해야 합니다. 데이터가 지속되어야 하는 경우 먼저 저장 작업을 수행하십시오.', + restartNowHelper: '이 작업은 시스템이 재시작된 후에만 적용됩니다.', + + persistence: '지속성', + rdbHelper1: '초 단위, 삽입', + rdbHelper2: '데이터 항목 수', + rdbHelper3: '조건을 충족하면 RDB 지속성이 트리거됩니다.', + rdbInfo: '규칙 목록의 값이 1에서 100000 사이여야 합니다.', + + containerConn: '컨테이너 연결', + connAddress: '주소', + connPort: '포트', + containerConnHelper: + '이 연결 주소는 웹사이트 런타임(PHP 등) 또는 컨테이너에서 실행 중인 애플리케이션에서 사용할 수 있습니다.', + remoteConn: '외부 연결', + remoteConnHelper2: + '이 연결 주소는 컨테이너 외부 또는 외부 애플리케이션에서 실행 중인 애플리케이션에서 사용할 수 있습니다.', + localIP: '로컬 IP', + }, + container: { + create: '컨테이너 만들기', + edit: '컨테이너 편집', + updateHelper1: '이 컨테이너가 앱 스토어에서 왔음을 감지했습니다. 다음 두 가지 사항을 유의하십시오:', + updateHelper2: '1. 현재 수정 사항은 앱 스토어에 설치된 애플리케이션에 동기화되지 않습니다.', + updateHelper3: '2. 설치된 페이지에서 애플리케이션을 수정하면 현재 편집된 내용이 무효화됩니다.', + updateHelper4: '컨테이너 편집에는 재빌드가 필요하며, 비지속적인 데이터는 손실됩니다. 계속하시겠습니까?', + containerList: '컨테이너 목록', + operatorHelper: '{0} 작업이 다음 컨테이너에서 수행됩니다. 계속하시겠습니까?', + operatorAppHelper: + '"{0}" 작업이 다음 컨테이너에서 수행되며, 실행 중인 서비스에 영향을 미칠 수 있습니다. 계속하시겠습니까?', + start: '시작', + stop: '중지', + restart: '재시작', + kill: '강제 종료', + pause: '일시 정지', + unpause: '재개', + rename: '이름 변경', + remove: '제거', + removeAll: '모두 제거', + containerPrune: '정리', + containerPruneHelper1: '이 작업은 중지된 모든 컨테이너를 삭제합니다.', + containerPruneHelper2: + "앱 스토어에서 가져온 컨테이너는 정리 후 '앱 스토어 -> 설치됨' 페이지로 이동하여 '재빌드' 버튼을 클릭하여 재설치해야 합니다.", + containerPruneHelper3: '이 작업은 취소할 수 없습니다. 계속하시겠습니까?', + imagePrune: '정리', + imagePruneSome: '라벨 없는 이미지 정리', + imagePruneSomeEmpty: "라벨이 'none'인 이미지가 정리되지 않았습니다.", + imagePruneSomeHelper: "컨테이너에서 사용되지 않는 'none' 태그가 붙은 이미지를 정리합니다.", + imagePruneAll: '사용되지 않는 이미지 정리', + imagePruneAllEmpty: '사용되지 않는 이미지가 정리되지 않았습니다.', + imagePruneAllHelper: '사용되지 않는 이미지를 정리합니다.', + networkPrune: '정리', + networkPruneHelper: '사용되지 않는 네트워크를 모두 제거합니다. 계속하시겠습니까?', + volumePrune: '정리', + volumePruneHelper: '사용되지 않는 로컬 볼륨을 모두 제거합니다. 계속하시겠습니까?', + cleanSuccess: '작업이 성공적으로 완료되었습니다. 이번 정리에서 {0}개의 항목이 정리되었습니다!', + cleanSuccessWithSpace: + '작업이 성공적으로 완료되었습니다. 이번 정리에서 {0}개의 디스크가 정리되었으며, 확보된 디스크 공간은 {1}입니다!', + container: '컨테이너 | 컨테이너들', + unExposedPort: '현재 포트 매핑 주소는 127.0.0.1로 외부 액세스를 활성화할 수 없습니다.', + upTime: '업타임', + all: '모두', + fetch: '가져오기', + lines: '라인', + linesHelper: '올바른 로그 수를 입력하세요!', + lastDay: '지난 하루', + last4Hour: '지난 4시간', + lastHour: '지난 1시간', + last10Min: '지난 10분', + cleanLog: '로그 정리', + downLogHelper1: '이 작업은 컨테이너 {0}의 모든 로그를 다운로드합니다. 계속하시겠습니까?', + downLogHelper2: '이 작업은 컨테이너 {0}의 최근 {0}개의 로그를 다운로드합니다. 계속하시겠습니까?', + cleanLogHelper: '이 작업은 컨테이너를 재시작해야 하며 취소할 수 없습니다. 계속하시겠습니까?', + newName: '새 이름', + source: '리소스 사용', + cpuUsage: 'CPU 사용', + cpuTotal: '전체 CPU', + core: '코어', + memUsage: '메모리 사용', + memTotal: '메모리 한도', + memCache: '메모리 캐시', + ip: 'IP 주소', + cpuShare: 'CPU 공유', + cpuShareHelper: + '컨테이너 엔진은 기본값으로 1024를 사용합니다. 이를 늘리면 컨테이너에 더 많은 CPU 시간을 할당할 수 있습니다.', + inputIpv4: '예시: 192.168.1.1', + inputIpv6: '예시: 2001:0db8:85a3:0000:0000:8a2e:0370:7334', + containerFromAppHelper: + '이 컨테이너가 앱 스토어에서 왔음을 감지했습니다. 앱 작업으로 현재 편집이 무효화될 수 있습니다.', + containerFromAppHelper1: + '설치된 애플리케이션 목록에서 [매개변수] 버튼을 클릭하여 편집 페이지로 이동하고 컨테이너 이름을 수정하세요.', + command: '명령어', + console: '컨테이너 상호작용', + tty: '가상 TTY 할당 (-t)', + openStdin: 'STDIN 을 열어둡니다. 연결되지 않더라도 계속 열려있습니다 (-i)', + custom: '사용자 정의', + emptyUser: '비워두면 기본값으로 로그인합니다.', + containerTerminal: '터미널', + privileged: '특권 모드', + privilegedHelper: + '컨테이너가 호스트에서 특정 특권 작업을 수행할 수 있도록 허용합니다. 이는 보안 위험을 초래할 수 있으므로 주의해서 사용하십시오.', + editComposeHelper: + '참고: 설정된 환경 변수는 기본적으로 1panel.env 파일에 작성됩니다. 컨테이너에서 이러한 매개변수를 사용하려면 compose 파일에 env_file 참조를 수동으로 추가해야 합니다.', + upgradeHelper: '레포지토리 이름/이미지 이름: 이미지 버전', + upgradeWarning2: + '업그레이드 작업은 컨테이너를 재빌드해야 하며, 비지속적인 데이터가 손실됩니다. 계속하시겠습니까?', + oldImage: '현재 이미지', + targetImage: '대상 이미지', + imageLoadErr: '컨테이너에 대한 이미지 이름이 감지되지 않았습니다.', + appHelper: '이 컨테이너는 앱 스토어에서 왔으며 업그레이드 시 서비스가 중단될 수 있습니다.', + input: '수동 입력', + forcePull: '이미지 강제 풀', + forcePullHelper: '이 작업은 서버에 있는 기존 이미지를 무시하고 레지스트리에서 최신 이미지를 강제로 가져옵니다.', + server: '호스트', + serverExample: '80, 80-88, ip:80 또는 ip:80-88', + containerExample: '80 또는 80-88', + exposePort: '포트 노출', + exposeAll: '모든 포트 노출', + cmdHelper: '예시: nginx -g "daemon off;"', + entrypointHelper: '예시: docker-entrypoint.sh', + autoRemove: '자동 제거', + cpuQuota: 'CPU 코어 수', + memoryLimit: '메모리', + limitHelper: '0으로 설정하면 제한이 없으며, 최대값은 {0}입니다.', + mount: '마운트', + volumeOption: '볼륨', + hostOption: '호스트', + serverPath: '서버 경로', + containerDir: '컨테이너 경로', + volumeHelper: '저장소 볼륨의 내용이 올바른지 확인하십시오.', + modeRW: '읽기/쓰기', + modeR: '읽기 전용', + mode: '모드', + env: '환경', + restartPolicy: '재시작 정책', + always: '항상', + unlessStopped: '중지되지 않는 한', + onFailure: '실패 시 (기본 5회)', + no: '절대', + monitor: '모니터', + refreshTime: '새로 고침 간격', + cache: '캐시', + image: '이미지 | 이미지들', + imagePull: '풀', + imagePush: '푸시', + imageDelete: '이미지 삭제', + imageDeleteTag: '이미지 태그 삭제', + imageTagDeleteHelper: '이 이미지 ID와 관련된 다른 태그를 제거합니다.', + repoName: '컨테이너 저장소 이름', + imageName: '이미지 이름', + pull: '풀', + path: '경로', + importImage: '가져오기', + build: '빌드', + imageBuild: '이미지 빌드', + pathSelect: '경로', + label: '레이블', + imageTag: '이미지 태그', + push: '푸시', + fileName: '파일 이름', + export: '내보내기', + exportImage: '이미지 내보내기', + version: '버전', + size: '크기', + from: '출처', + tag: '태그', + tagHelper: '한 줄에 하나씩. 예시:\nkey1=value1\nkey2=value2', + imageNameHelper: '이미지 이름과 태그, 예시: nginx:latest', + cleanBuildCache: '빌드 캐시 정리', + delBuildCacheHelper: `이 작업은 빌드 중 생성된 모든 캐시된 아티팩트를 삭제하며 되돌릴 수 없습니다. 계속 하시겠습니까?`, + urlWarning: 'URL 접두어에 http:// 또는 https://를 포함할 필요는 없습니다. 수정해 주세요.', + + network: '네트워크 | 네트워크들', + networkHelper: '이로 인해 일부 애플리케이션과 실행 환경이 제대로 작동하지 않을 수 있습니다. 계속 하시겠습니까?', + createNetwork: '생성', + networkName: '이름', + driver: '드라이버', + option: '옵션', + attachable: '연결 가능', + subnet: '서브넷', + scope: 'IP 범위', + gateway: '게이트웨이', + auxAddress: '제외 IP', + + volume: '볼륨 | 볼륨들', + volumeDir: '볼륨 디렉터리', + nfsEnable: 'NFS 스토리지 사용', + nfsAddress: '주소', + mountpoint: '마운트 지점', + mountpointNFSHelper: '예: /nfs, /nfs-share', + options: '옵션', + createVolume: '생성', + + repo: '레지스트리', + createRepo: '추가', + httpRepo: 'HTTP 프로토콜을 선택하면 Docker 서비스를 재시작하여 불안정한 레지스트리에 추가해야 합니다.', + delInsecure: '신뢰할 수 없는 항목 삭제', + delInsecureHelper: + '이 작업은 Docker 서비스를 재시작하여 불안정한 레지스트리에서 제거합니다. 계속 하시겠습니까?', + downloadUrl: '서버', + imageRepo: '이미지 레포지토리', + repoHelper: '거울 레포지토리/조직/프로젝트가 포함되어 있습니까?', + auth: '인증 필요', + mirrorHelper: + '거울이 여러 개 있을 경우 각 줄에 하나씩 표시해야 합니다. 예시:\nhttp://xxxxxx.m.daocloud.io \nhttps://xxxxxx.mirror.aliyuncs.com', + registrieHelper: + '개인 레지스트리가 여러 개 있을 경우 각 줄에 하나씩 표시해야 합니다. 예시:\n172.16.10.111:8081 \n172.16.10.112:8081', + + compose: '컴포즈 | 컴포즈들', + fromChangeHelper: '소스를 변경하면 현재 편집한 내용이 삭제됩니다. 계속 하시겠습니까?', + composePathHelper: '구성 파일 저장 경로: {0}', + composeHelper: '1Panel 에디터나 템플릿을 통해 생성된 컴포지션은 {0}/docker/compose 디렉토리에 저장됩니다.', + deleteFile: '파일 삭제', + allDelete: '영구 삭제', + deleteComposeHelper: + '이 작업은 컴포즈와 관련된 모든 파일을 삭제합니다. 구성을 포함한 지속적인 파일도 포함됩니다. 신중히 진행해 주세요!', + deleteCompose: '" 이 컴포즈를 삭제하시겠습니까?', + apps: '앱 스토어', + local: '로컬', + createCompose: '생성', + composeDirectory: '디렉토리', + template: '템플릿', + composeTemplate: '컴포즈 템플릿 | 컴포즈 템플릿들', + createComposeTemplate: '생성', + description: '설명', + content: '내용', + contentEmpty: '컴포즈 내용이 비어 있습니다. 입력 후 다시 시도해 주세요!', + containerNumber: '컨테이너 수', + containerStatus: '컨테이너 상태', + exited: '종료됨', + running: '실행 중', + down: '중지됨', + up: '실행됨', + composeDetailHelper: '이 컴포즈는 1Panel 외부에서 생성되었습니다. 시작 및 중지 작업은 지원되지 않습니다.', + composeOperatorHelper: '{1} 작업이 {0}에서 수행됩니다. 계속 하시겠습니까?', + composeDownHelper: + '이 작업은 {0} 컴포즈 아래의 모든 컨테이너와 네트워크를 중지하고 제거합니다. 계속 하시겠습니까?', + + setting: '설정 | 설정들', + operatorStatusHelper: '이 작업은 Docker 서비스를 "{0}" 합니다. 계속 하시겠습니까?', + dockerStatus: 'Docker 서비스', + daemonJsonPathHelper: '구성 경로가 docker.service 에 지정된 경로와 동일한지 확인하십시오.', + mirrors: '레지스트리 미러들', + mirrorsHelper: '', + mirrorsHelper2: '자세한 내용은 공식 문서를 참조하십시오.', + registries: '불안정한 레지스트리들', + ipv6Helper: + 'IPv6를 활성화하려면 IPv6 컨테이너 네트워크를 추가해야 합니다. 구체적인 구성 단계를 공식 문서에서 참조하십시오.', + ipv6CidrHelper: '컨테이너를 위한 IPv6 주소 풀 범위', + ipv6TablesHelper: 'ip6tables 규칙에 대해 Docker IPv6 을 자동 구성합니다.', + experimentalHelper: 'ip6tables 를 활성화하려면 이 구성을 켜야 합니다. 그렇지 않으면 ip6tables가 무시됩니다.', + cutLog: '로그 옵션', + cutLogHelper1: '현재 구성은 새로 생성된 컨테이너에만 영향을 미칩니다.', + cutLogHelper2: '기존 컨테이너는 재생성해야 구성이 적용됩니다.', + cutLogHelper3: + '컨테이너를 재생성하면 데이터 손실이 발생할 수 있습니다. 중요한 데이터가 포함된 컨테이너는 재구성 전 백업을 꼭 해주세요.', + maxSize: '최대 크기', + maxFile: '최대 파일', + liveHelper: + '기본적으로 Docker 데몬이 종료되면 실행 중인 컨테이너도 종료됩니다. 데몬이 비활성화된 상태에서 컨테이너를 계속 실행하려면 데몬을 설정할 수 있습니다. 이 기능은 라이브 복구라고 불리며, 데몬 충돌, 예정된 중단 또는 업그레이드로 인한 컨테이너 다운타임을 줄이는 데 도움을 줍니다.', + liveWithSwarmHelper: 'live-restore 데몬 구성은 스웜 모드와 호환되지 않습니다.', + iptablesDisable: 'iptables 비활성화', + iptablesHelper1: 'Docker 에 대한 iptables 규칙을 자동으로 구성합니다.', + iptablesHelper2: 'iptables 를 비활성화하면 컨테이너가 외부 네트워크와 통신할 수 없습니다.', + daemonJsonPath: '구성 경로', + serviceUnavailable: `현재 Docker 서비스가 시작되지 않았습니다.`, + startIn: '시작하려면', + sockPath: '유닉스 도메인 소켓', + sockPathHelper: 'Docker 데몬과 클라이언트 간의 통신 채널입니다.', + sockPathHelper1: '기본 경로: /var/run/docker-x.sock', + sockPathMsg: '소켓 경로 설정을 저장하면 Docker 서비스가 사용 불가능할 수 있습니다. 계속 하시겠습니까?', + sockPathErr: '올바른 Docker 소켓 파일 경로를 선택하거나 입력해 주세요.', + related: '관련', + includeAppstore: '앱 스토어에서 컨테이너 표시', + + cleanDockerDiskZone: 'Docker 에서 사용하는 디스크 공간 정리', + cleanImagesHelper: '(사용되지 않는 모든 이미지를 정리합니다.)', + cleanContainersHelper: '(정지된 모든 컨테이너를 정리합니다.)', + cleanVolumesHelper: '(사용되지 않는 모든 로컬 볼륨을 정리합니다.)', + + makeImage: '이미지 생성', + newImageName: '새 이미지 이름', + commitMessage: '커밋 메시지', + author: '작성자', + ifPause: '생성 중 컨테이너 일시 정지', + ifMakeImageWithContainer: '이 컨테이너에서 새 이미지를 생성하시겠습니까?', + }, + cronjob: { + create: '크론 작업 생성', + edit: '크론 작업 수정', + cronTask: '크론 작업 | 크론 작업들', + changeStatus: '상태 변경', + disableMsg: '이 작업은 예약된 작업이 자동으로 실행되지 않도록 멈춥니다. 계속하시겠습니까?', + enableMsg: '이 작업은 예약된 작업이 자동으로 실행되도록 허용합니다. 계속하시겠습니까?', + taskType: '작업 유형', + record: '레코드', + viewRecords: '레코드 보기', + shell: '셸', + log: '백업 로그', + logHelper: '시스템 백업 로그', + ogHelper1: '1. 1Panel 시스템 로그', + logHelper2: '2. 서버 SSH 로그인 로그', + logHelper3: '3. 모든 사이트 로그', + containerCheckBox: '컨테이너 내 (컨테이너 명령어 입력 불필요)', + containerName: '컨테이너 이름', + ntp: '시간 동기화', + ntp_helper: 'Toolbox 의 빠른 설정 페이지에서 NTP 서버를 구성할 수 있습니다.', + app: '백업 앱', + website: '백업 웹사이트', + rulesHelper: '여러 개의 압축 제외 규칙이 있을 경우 줄 바꿈으로 표시해야 합니다. 예시:\n*.log \n*.sql', + lastRecordTime: '마지막 실행 시간', + all: '전체', + failedRecord: '실패한 레코드', + successRecord: '성공한 레코드', + database: '백업 데이터베이스', + missBackupAccount: '백업 계정을 찾을 수 없습니다', + syncDate: '동기화 시간', + clean: '캐시 정리', + curl: '접속 URL', + taskName: '작업 이름', + cronSpec: '트리거 주기', + cronSpecHelper: '올바른 실행 주기를 입력해 주세요', + cleanHelper: '이 작업은 모든 작업 실행 레코드, 백업 파일, 로그 파일을 기록합니다. 계속하시겠습니까?', + directory: '백업 디렉토리', + sourceDir: '백업 디렉토리', + snapshot: '시스템 스냅샷', + allOptionHelper: `현재 작업 계획은 모든 [{0}]을 백업하는 것입니다. 현재 직접 다운로드는 지원되지 않습니다. [{0}] 메뉴에서 백업 목록을 확인하실 수 있습니다.`, + exclusionRules: '배제 규칙', + exclusionRulesHelper: '배제 규칙은 이 백업의 모든 압축 작업에 적용됩니다.', + default_download_path: '기본 다운로드 링크', + saveLocal: '로컬 백업 보관 (클라우드 저장소 복사본 수와 동일)', + url: 'URL 주소', + targetHelper: '백업 계정은 패널 설정에서 관리됩니다.', + retainCopies: '기록 보관', + retainCopiesHelper: '실행 기록과 로그에 대해 보관할 복사본 수', + retainCopiesHelper1: '백업 파일에 대해 보관할 복사본 수', + retainCopiesUnit: '개 (보기)', + cronSpecRule: '라인 {0}의 실행 주기 형식이 잘못되었습니다. 확인 후 다시 시도해 주세요!', + perMonthHelper: '매월 {0}일 {1}:{2}에 실행', + perWeekHelper: '매주 {0}일 {1}:{2}에 실행', + perDayHelper: '매일 {0}:{1}에 실행', + perHourHelper: '매시간 {0}분에 실행', + perNDayHelper: '매 {0}일마다 {1}:{2}에 실행', + perNHourHelper: '매 {0}시간마다 {1}에 실행', + perNMinuteHelper: '매 {0}분마다 실행', + perNSecondHelper: '매 {0}초마다 실행', + perMonth: '매월', + perWeek: '매주', + perHour: '매시간', + perNDay: '매 N일', + perDay: '매일', + perNHour: '매 N시간', + perNMinute: '매 N분', + perNSecond: '매 N초', + day: '일', + dayUnit: 'd', + monday: '월요일', + tuesday: '화요일', + wednesday: '수요일', + thursday: '목요일', + friday: '금요일', + saturday: '토요일', + sunday: '일요일', + shellContent: '스크립트', + errRecord: '잘못된 로깅', + errHandle: '크론 작업 실행 실패', + noRecord: '크론 작업을 트리거하고 나면 여기에 레코드가 표시됩니다.', + cleanData: '데이터 정리', + cleanDataHelper: '이 작업에서 생성된 백업 파일을 삭제합니다.', + noLogs: '작업 출력이 아직 없습니다...', + errPath: '백업 경로 [{0}] 오류, 다운로드할 수 없습니다!', + cutWebsiteLog: '웹사이트 로그 회전', + cutWebsiteLogHelper: '회전된 로그 파일은 1Panel 의 백업 디렉토리로 백업됩니다.', + requestExpirationTime: '업로드 요청 만료 시간(시간)', + unitHours: '단위: 시간', + alertTitle: '예정된 작업 - {0} 「{1}」 작업 실패 경고', + }, + monitor: { + monitor: '모니터링', + globalFilter: '전역 필터', + enableMonitor: '활성화', + storeDays: '만료일', + cleanMonitor: '모니터링 기록 정리', + + avgLoad: '평균 부하', + loadDetail: '부하 세부사항', + resourceUsage: '자원 사용률', + networkCard: '네트워크 인터페이스', + read: '읽기', + write: '쓰기', + readWriteCount: 'I/O 작업', + readWriteTime: 'I/O 지연 시간', + today: '오늘', + yesterday: '어제', + lastNDay: '최근 {0}일', + memory: '메모리', + cache: '캐시', + disk: '디스크', + network: '네트워크', + up: '업', + down: '다운', + interval: '간격(분)', + + gpuUtil: 'GPU 사용률', + temperature: '온도', + performanceState: '성능 상태', + powerUsage: '전력 사용량', + memoryUsage: '메모리 사용량', + fanSpeed: '팬 속도', + }, + terminal: { + conn: '연결', + connLocalErr: '자동 인증에 실패했습니다. 로컬 서버 로그인 정보를 입력해주세요.', + testConn: '연결 테스트', + saveAndConn: '저장 후 연결', + connTestOk: '연결 정보가 유효합니다.', + connTestFailed: '연결할 수 없습니다. 연결 정보를 확인해주세요.', + host: '호스트 | 호스트들', + createConn: '새 연결', + group: '그룹', + manageGroup: '그룹 관리', + noHost: '호스트 없음', + groupChange: '그룹 변경', + expand: '모두 확장', + fold: '모두 축소', + batchInput: '배치 처리', + quickCommand: '빠른 명령 | 빠른 명령들', + quickCommandHelper: '"터미널 -> 터미널" 하단에서 빠른 명령을 사용할 수 있습니다.', + groupDeleteHelper: '그룹을 제거하면 해당 그룹의 모든 연결이 기본 그룹으로 이동됩니다. 계속하시겠습니까?', + command: '명령', + quickCmd: '빠른 명령', + addHost: '추가', + localhost: '로컬호스트', + ip: '주소', + authMode: '인증 방식', + passwordMode: '비밀번호', + rememberPassword: '인증 정보 기억하기', + keyMode: '개인 키', + key: '개인 키', + keyPassword: '개인 키 비밀번호', + emptyTerminal: '현재 연결된 터미널이 없습니다.', + }, + toolbox: { + swap: { + swap: '스왑 파티션', + swapHelper1: '스왑 크기는 물리적 메모리의 1~2배로 설정해야 하며, 특정 요구 사항에 따라 조정 가능합니다.', + swapHelper2: + '스왑 파일을 생성하기 전에 시스템 디스크에 충분한 가용 공간이 있는지 확인하세요. 스왑 파일 크기만큼 디스크 공간이 점유됩니다.', + swapHelper3: + '스왑은 메모리 압력을 완화하는 데 도움이 될 수 있지만, 단지 대안일 뿐입니다. 스왑에 과도하게 의존하면 시스템 성능이 저하될 수 있으므로 메모리를 추가하거나 애플리케이션 메모리 사용을 최적화하는 것을 우선적으로 고려해야 합니다.', + swapHelper4: '스왑 사용량을 정기적으로 모니터링하여 시스템이 정상적으로 작동하는지 확인하는 것이 좋습니다.', + swapDeleteHelper: + '이 작업은 스왑 파티션 {0}을 제거합니다. 시스템 보안상의 이유로 해당 파일은 자동으로 삭제되지 않습니다. 삭제가 필요한 경우 수동으로 진행하세요!', + saveHelper: '현재 설정을 먼저 저장해주세요!', + saveSwap: '현재 구성을 저장하면 스왑 파티션 {0}의 크기가 {1}(으)로 조정됩니다. 계속하시겠습니까?', + swapMin: '최소 파티션 크기는 40 KB입니다. 수정 후 다시 시도해주세요!', + swapMax: '파티션 크기의 최대값은 {0}입니다. 수정 후 다시 시도해주세요!', + swapOff: '최소 파티션 크기는 40 KB입니다. 0으로 설정하면 스왑 파티션이 비활성화됩니다.', + }, + device: { + dnsHelper: 'DNS 서버', + dnsAlert: '/etc/resolv.conf 파일의 구성을 수정하면 시스템 재부팅 후 파일이 기본값으로 복원됩니다.', + dnsHelper1: 'DNS 항목이 여러 개인 경우 각 항목을 새 줄에 표시해야 합니다. 예:\n114.114.114.114\n8.8.8.8', + hostsHelper: '호스트 이름 해석', + hosts: '도메인', + hostAlert: '주석 처리된 기록은 숨겨져 있습니다. 모든 구성 버튼을 클릭하여 보거나 설정하세요.', + toolbox: '빠른 설정', + hostname: '호스트 이름', + passwd: '시스템 비밀번호', + passwdHelper: '입력 문자는 $ 및 &를 포함할 수 없습니다.', + timeZone: '시간대', + localTime: '서버 시간', + timeZoneChangeHelper: '시스템 시간대를 변경하려면 서비스를 재시작해야 합니다. 계속하시겠습니까?', + timeZoneHelper: `"timedatectl" 명령이 설치되지 않은 경우 시간대를 변경할 수 없습니다. 시스템은 시간대 변경에 이 명령을 사용합니다.`, + timeZoneCN: '베이징', + timeZoneAM: '로스앤젤레스', + timeZoneNY: '뉴욕', + ntpALi: '알리바바', + ntpGoogle: '구글', + syncSite: 'NTP 서버', + hostnameHelper: `호스트 이름 수정은 "hostnamectl" 명령에 따라 달라집니다. 명령이 설치되지 않은 경우 수정이 실패할 수 있습니다.`, + userHelper: `사용자 이름은 "whoami" 명령을 사용하여 검색됩니다. 명령이 설치되지 않은 경우 검색이 실패할 수 있습니다.`, + passwordHelper: `비밀번호 수정은 "chpasswd" 명령에 따라 달라집니다. 명령이 설치되지 않은 경우 수정이 실패할 수 있습니다.`, + hostHelper: '제공된 내용에 빈 값이 포함되어 있습니다. 확인 후 수정하여 다시 시도해주세요!', + dnsCheck: '가용성 테스트', + dnsOK: 'DNS 구성 정보가 유효합니다!', + dnsTestFailed: 'DNS 구성 정보가 유효하지 않습니다.', + }, + fail2ban: { + sshPort: 'SSH 포트 청취', + sshPortHelper: '현재 Fail2ban 은 호스트의 SSH 연결 포트를 청취합니다.', + noFail2ban: 'Fail2ban 서비스가 감지되지 않았습니다. 공식 문서를 참조하여 설치하세요.', + unActive: '현재 Fail2ban 서비스가 활성화되어 있지 않습니다.', + operation: 'Fail2ban 서비스에서 "{0}" 작업을 수행합니다. 계속하시겠습니까?', + fail2banChange: 'Fail2ban 구성 수정', + ignoreHelper: '허용 목록에 있는 IP는 차단되지 않습니다. 계속하시겠습니까?', + bannedHelper: '차단 목록에 있는 IP는 서버에 의해 차단됩니다. 계속하시겠습니까?', + maxRetry: '최대 재시도 횟수', + banTime: '차단 시간', + banTimeHelper: '기본 차단 시간은 10분이며, -1은 영구 차단을 나타냅니다.', + banTimeRule: '유효한 차단 시간 또는 -1을 입력하세요.', + banAllTime: '영구 차단', + findTime: '탐지 기간', + banAction: '차단 작업', + banActionOption: '{0}을(를) 사용하여 지정된 IP 주소 차단', + allPorts: ' (모든 포트)', + ignoreIP: 'IP 허용 목록', + bannedIP: 'IP 차단 목록', + logPath: '로그 경로', + logPathHelper: '기본값은 /var/log/secure 또는 /var/log/auth.log입니다.', + }, + ftp: { + ftp: 'FTP 계정 | FTP 계정들', + noFtp: `FTP (pure-ftpd) 서비스가 감지되지 않았습니다. 공식 문서를 참조하여 설치하세요.`, + operation: 'FTP 서비스에서 "{0}" 작업을 수행합니다. 계속하시겠습니까?', + noPasswdMsg: '현재 FTP 계정의 비밀번호를 가져올 수 없습니다. 비밀번호를 설정한 후 다시 시도하세요!', + enableHelper: '선택한 FTP 계정을 활성화하면 접근 권한이 복원됩니다. 계속하시겠습니까?', + disableHelper: '선택한 FTP 계정을 비활성화하면 접근 권한이 취소됩니다. 계속하시겠습니까?', + syncHelper: '서버와 데이터베이스 간의 FTP 계정 데이터를 동기화합니다. 계속하시겠습니까?', + }, + clam: { + clam: '바이러스 검사', + cron: '예약 스캔', + cronHelper: '전문 버전에서 예약 스캔 기능을 지원합니다.', + specErr: '실행 일정 형식 오류입니다. 확인 후 다시 시도하세요!', + disableMsg: '예약 실행을 중지하면 이 스캔 작업이 자동으로 실행되지 않습니다. 계속하시겠습니까?', + enableMsg: '예약 실행을 활성화하면 이 스캔 작업이 정기적으로 자동 실행됩니다. 계속하시겠습니까?', + showFresh: '서명 업데이트 서비스 표시', + hideFresh: '서명 업데이트 서비스 숨기기', + clamHelper: + 'ClamAV의 최소 권장 구성은 다음과 같습니다: RAM 3 GiB 이상, 2.0 GHz 이상의 단일 코어 CPU, 최소 5 GiB의 사용 가능한 하드 디스크 공간.', + noClam: 'ClamAV 서비스가 감지되지 않았습니다. 공식 문서를 참조하여 설치하세요!', + notStart: 'ClamAV 서비스가 현재 실행 중이 아닙니다. 먼저 시작하세요!', + removeRecord: '보고서 파일 삭제', + noRecords: '"Trigger" 버튼을 클릭하여 스캔을 시작하면 이곳에서 기록을 확인할 수 있습니다.', + removeResultHelper: '작업 실행 중 생성된 보고서 파일을 삭제하여 저장 공간을 확보합니다.', + removeInfected: '바이러스 파일 삭제', + removeInfectedHelper: '작업 중 감지된 바이러스 파일을 삭제하여 서버 보안 및 정상 작동을 보장합니다.', + clamCreate: '스캔 규칙 생성', + infectedStrategy: '감염 파일 처리 전략', + remove: '삭제', + removeHelper: '바이러스 파일을 삭제합니다. 신중히 선택하세요!', + move: '이동', + moveHelper: '바이러스 파일을 지정된 디렉토리로 이동합니다.', + copy: '복사', + copyHelper: '바이러스 파일을 지정된 디렉토리로 복사합니다.', + none: '조치 안 함', + noneHelper: '바이러스 파일에 대해 아무 조치도 취하지 않습니다.', + scanDir: '스캔 디렉토리', + infectedDir: '감염 파일 디렉토리', + scanDate: '스캔 날짜', + scanResult: '스캔 로그 출력', + tail: '라인', + scanTime: '소요 시간', + infectedFiles: '감염된 파일', + log: '상세 내용', + clamConf: 'Clam AV 데몬', + clamLog: '@:toolbox.clam.clamConf 로그', + freshClam: 'FreshClam', + freshClamLog: '@:toolbox.clam.freshClam 로그', + alertHelper: '전문 버전에서 예약 스캔 및 SMS 알림을 지원합니다.', + alertTitle: '바이러스 스캔 작업 「{0}」에서 감염된 파일을 발견했습니다.', + }, + }, + logs: { + panelLog: '패널 로그', + operation: '작업 로그', + login: '로그인 로그', + loginIP: '로그인 IP', + loginAddress: '로그인 주소', + loginAgent: '로그인 에이전트', + loginStatus: '상태', + system: '시스템 로그', + deleteLogs: '로그 정리', + resource: '자원', + operate: '작업', + detail: { + groups: '그룹', + hosts: '호스트', + apps: '애플리케이션', + websites: '웹사이트', + containers: '컨테이너', + files: '파일 관리', + runtimes: '런타임', + process: '프로세스', + toolbox: '도구상자', + logs: '패널 로그', + settings: '패널 설정', + cronjobs: '크론 작업', + databases: '데이터베이스', + }, + websiteLog: '웹사이트 로그', + runLog: '실행 로그', + errLog: '에러 로그', + }, + file: { + dir: '폴더', + upload: '업로드', + uploadFile: '@:file.upload @.lower:file.file', + uploadDirectory: '@:file.upload @.lower:file.dir', + download: '다운로드', + fileName: '파일 이름', + search: '검색', + mode: '권한', + editPermissions: '@:file.mode', + owner: '소유자', + file: '파일', + remoteFile: '원격에서 다운로드', + share: '공유', + sync: '데이터 동기화', + size: '크기', + updateTime: '수정됨', + open: '열기', + rename: '이름 바꾸기', + role: '권한', + info: '속성', + linkFile: '소프트 링크', + terminal: '터미널', + batchoperation: '일괄 작업', + shareList: '공유 목록', + zip: '압축됨', + group: '그룹', + path: '경로', + public: '기타', + setRole: '권한 설정', + link: '파일 링크', + rRole: '읽기', + wRole: '쓰기', + xRole: '실행 가능', + name: '이름', + compress: '압축', + deCompress: '압축 해제', + compressType: '압축 형식', + compressDst: '압축 경로', + replace: '기존 파일 덮어쓰기', + compressSuccess: '압축 성공', + deCompressSuccess: '압축 해제 성공', + deCompressDst: '압축 해제 경로', + linkType: '링크 유형', + softLink: '소프트 링크', + hardLink: '하드 링크', + linkPath: '링크 경로', + selectFile: '파일 선택', + downloadUrl: '원격 URL', + downloadStart: '다운로드 시작됨', + moveSuccess: '이동 성공', + copySuccess: '복사 성공', + move: '이동', + copy: '복사', + calculate: '계산', + canNotDeCompress: '이 파일은 압축 해제할 수 없습니다', + uploadSuccess: '업로드 성공', + downloadProcess: '다운로드 진행률', + downloading: '다운로드 중...', + infoDetail: '파일 속성', + root: '루트 디렉터리', + list: '파일 목록', + sub: '하위 폴더', + downloadSuccess: '다운로드 성공', + theme: '테마', + language: '언어', + eol: '줄 끝', + copyDir: '복사', + paste: '붙여넣기', + cancel: '취소', + changeOwner: '사용자 및 그룹 수정', + containSub: '권한 변경을 하위 폴더에 적용', + ownerHelper: + 'PHP 운영 환경의 기본 사용자: 사용자 그룹은 1000:1000 입니다. 컨테이너 내부 및 외부에서 표시되는 불일치는 정상입니다.', + searchHelper: '* 등의 와일드카드를 지원합니다', + uploadFailed: '[{0}] 파일 업로드 실패', + fileUploadStart: '[{0}] 업로드 중....', + currentSelect: '현재 선택: ', + unsupportedType: '지원되지 않는 파일 유형', + deleteHelper: '다음 파일을 삭제하시겠습니까? 기본적으로 삭제 후 휴지통으로 이동합니다.', + fileHelper: `참고:\n1. 검색 결과는 정렬할 수 없습니다.\n2. 폴더는 크기로 정렬할 수 없습니다.`, + forceDeleteHelper: '파일을 영구적으로 삭제합니다(휴지통으로 이동하지 않고 바로 삭제).', + recycleBin: '휴지통', + sourcePath: '원래 경로', + deleteTime: '삭제 시간', + confirmReduce: '다음 파일을 복원하시겠습니까?', + reduceSuccess: '복원 성공', + reduce: '복원', + reduceHelper: '원래 경로에 동일한 이름의 파일이나 디렉터리가 있으면 덮어씁니다. 계속하시겠습니까?', + clearRecycleBin: '정리', + clearRecycleBinHelper: '휴지통을 정리하시겠습니까?', + favorite: '즐겨찾기', + removeFavorite: '즐겨찾기에서 제거하시겠습니까?', + addFavorite: '즐겨찾기에 추가', + clearList: '목록 정리', + deleteRecycleHelper: '다음 파일을 영구적으로 삭제하시겠습니까?', + typeErrOrEmpty: '[{0}] 파일 유형이 잘못되었거나 빈 폴더입니다.', + dropHelper: '업로드하려는 파일을 여기에 드래그하세요', + fileRecycleBin: '휴지통 활성화', + fileRecycleBinMsg: '{0} 휴지통', + wordWrap: '자동 줄바꿈', + deleteHelper2: '선택한 파일을 삭제하시겠습니까? 삭제 작업은 되돌릴 수 없습니다.', + ignoreCertificate: '안전하지 않은 서버 연결 허용', + ignoreCertificateHelper: + '안전하지 않은 서버 연결을 허용하면 데이터 유출 또는 변조가 발생할 수 있습니다. 이 옵션은 다운로드 소스를 신뢰할 때만 사용하세요.', + uploadOverLimit: '파일 수가 1000 개를 초과했습니다! 압축하여 업로드하세요.', + clashDitNotSupport: '파일 이름에 .1panel_clash 를 포함할 수 없습니다.', + clashDeleteAlert: `"휴지통" 폴더는 삭제할 수 없습니다.`, + clashOpenAlert: '휴지통 디렉터리를 열려면 "휴지통" 버튼을 클릭하세요.', + right: '앞으로', + back: '뒤로', + top: '처음으로 돌아가기', + refresh: '새로고침', + up: '뒤로가기', + openWithVscode: 'VS Code 로 열기', + vscodeHelper: '로컬에 VS Code 가 설치되어 있고 SSH Remote 플러그인이 구성되어 있는지 확인하세요.', + saveContentAndClose: '파일이 수정되었습니다. 저장 후 닫으시겠습니까?', + saveAndOpenNewFile: '파일이 수정되었습니다. 저장 후 새 파일을 열겠습니까?', + noEdit: '파일이 수정되지 않았습니다. 이 작업은 필요하지 않습니다!', + noNameFolder: '제목 없는 폴더', + noNameFile: '제목 없는 파일', + minimap: '코드 미니맵', + fileCanNotRead: '파일을 읽을 수 없습니다.', + panelInstallDir: `1Panel 설치 디렉터리는 삭제할 수 없습니다.`, + }, + ssh: { + setting: '설정', + autoStart: '자동 시작', + enable: '자동 시작 활성화', + disable: '자동 시작 비활성화', + sshAlert: + '목록 데이터는 로그인 날짜를 기준으로 정렬됩니다. 시간대 변경이나 다른 작업이 수행되면 로그인 로그의 날짜에 차이가 발생할 수 있습니다.', + sshAlert2: + '"Fail2ban"을 "도구 상자"에서 사용하여 무차별 대입 공격을 시도하는 IP 주소를 차단할 수 있으며, 이는 호스트의 보안을 강화하는 데 도움이 됩니다.', + sshOperate: 'SSH 서비스에서 "{0}" 작업을 수행합니다. 계속하시겠습니까?', + sshChange: 'SSH 설정', + sshChangeHelper: '"{0}"을(를) "{1}"로 변경하였습니다. 계속하시겠습니까?', + sshFileChangeHelper: + '구성 파일을 수정하면 서비스 가용성에 영향을 미칠 수 있습니다. 이 작업을 수행할 때는 주의하십시오. 계속하시겠습니까?', + port: '포트', + portHelper: 'SSH 서비스가 수신하는 포트를 지정하십시오.', + listenAddress: '수신 주소', + allV4V6: '0.0.0.0:{0}(IPv4) 및 :::{0}(IPv6)', + listenHelper: 'IPv4와 IPv6 설정을 모두 비워두면 "0.0.0.0:{0}(IPv4)"와 ":::{0}(IPv6)"에서 수신합니다.', + addressHelper: 'SSH 서비스가 수신할 주소를 지정하십시오.', + permitRootLogin: '루트 사용자 로그인 허용', + rootSettingHelper: '루트 사용자의 기본 로그인 방법은 "SSH 로그인 허용"입니다.', + rootHelper1: 'SSH 로그인 허용', + rootHelper2: 'SSH 로그인 비허용', + rootHelper3: '키 로그인만 허용', + rootHelper4: '미리 정의된 명령만 실행할 수 있습니다. 다른 작업은 수행할 수 없습니다.', + passwordAuthentication: '비밀번호 인증', + pwdAuthHelper: '비밀번호 인증을 활성화할지 여부입니다. 기본적으로 이 매개변수는 활성화되어 있습니다.', + pubkeyAuthentication: '키 인증', + key: '키', + password: '비밀번호', + pubkey: '키 정보', + encryptionMode: '암호화 모드', + passwordHelper: '6~10자리 숫자 및 영어 대소문자를 포함할 수 있습니다.', + generate: '키 생성', + reGenerate: '키 재생성', + keyAuthHelper: '키 인증을 활성화할지 여부입니다.', + useDNS: 'useDNS', + dnsHelper: 'SSH 서버에서 DNS 확인 기능을 활성화하여 연결의 신원을 확인할지 여부를 제어합니다.', + analysis: '통계 정보', + denyHelper: + "'거부' 작업을 다음 주소에서 수행합니다. 설정 후 해당 IP는 서버에 접근할 수 없습니다. 계속하시겠습니까?", + acceptHelper: + "'수락' 작업을 다음 주소에서 수행합니다. 설정 후 해당 IP는 정상적으로 접근할 수 있습니다. 계속하시겠습니까?", + noAddrWarning: '현재 [{0}] 주소가 선택되지 않았습니다. 확인 후 다시 시도하십시오!', + successful: '성공', + failed: '실패', + loginLogs: '로그인 로그', + loginMode: '모드', + authenticating: '키', + publickey: '키', + belong: '소속', + local: '로컬', + config: '구성', + session: '세션 | 세션들', + loginTime: '로그인 시간', + loginIP: '로그인 IP', + disconnect: '연결 끊기', + stopSSHWarn: '이 SSH 연결을 끊으시겠습니까?', + }, + setting: { + all: '모두', + panel: '패널', + user: '패널 사용자', + userChange: '패널 사용자 변경', + userChangeHelper: '패널 사용자를 변경하면 로그아웃됩니다. 계속하시겠습니까?', + passwd: '패널 비밀번호', + emailHelper: '비밀번호 복구용', + title: '패널 별칭', + panelPort: '패널 포트', + titleHelper: '영문자, 한자, 숫자, 공백, 일반 특수 문자를 포함하여 3~30자의 길이를 지원합니다.', + portHelper: + '권장 포트 범위는 8888에서 65535 사이입니다. 참고: 서버에 보안 그룹이 있는 경우, 보안 그룹에서 새로운 포트를 사전에 허용해야 합니다.', + portChange: '포트 변경', + portChangeHelper: '서비스 포트를 수정하고 서비스를 다시 시작합니다. 계속하시겠습니까?', + theme: '테마', + menuTabs: '메뉴 탭', + dark: '다크', + darkGold: '다크 골드', + light: '라이트', + auto: '시스템 따라가기', + language: '언어', + languageHelper: '기본적으로 브라우저 언어를 따릅니다. 이 설정은 현재 브라우저에서만 적용됩니다.', + sessionTimeout: '세션 타임아웃', + sessionTimeoutError: '최소 세션 타임아웃은 300초입니다.', + sessionTimeoutHelper: '패널에서 {0}초 이상 조작이 없을 경우 자동으로 로그아웃됩니다.', + systemIP: '시스템 주소', + proxy: '서버 프록시', + proxyHelper: '프록시 서버를 설정한 후 다음 시나리오에서 적용됩니다:', + proxyHelper1: '설치 패키지 다운로드 및 앱 스토어 동기화 (전문 버전에서만 제공)', + proxyHelper2: '시스템 업데이트 및 업데이트 정보 가져오기 (전문 버전에서만 제공)', + proxyHelper4: 'Docker 네트워크가 프록시 서버를 통해 액세스됩니다 (전문 버전에서만 제공)', + proxyHelper3: '시스템 라이선스 인증 및 동기화', + proxyType: '프록시 유형', + proxyUrl: '프록시 주소', + proxyPort: '프록시 포트', + proxyPasswdKeep: '비밀번호 기억', + proxyDocker: 'Docker 프록시', + proxyDockerHelper: + '프록시 서버 구성을 Docker 에 동기화하여 오프라인 서버 이미지 가져오기 등의 작업을 지원합니다.', + apiInterface: 'API 활성화', + apiInterfaceClose: '비활성화하면 API 인터페이스에 접근할 수 없습니다. 계속하시겠습니까?', + apiInterfaceHelper: '서드파티 애플리케이션이 API 에 접근할 수 있도록 허용합니다.', + apiInterfaceAlert1: '운영 환경에서는 활성화하지 마십시오. 서버 보안 위험이 증가할 수 있습니다.', + apiInterfaceAlert2: '잠재적인 보안 위협을 방지하기 위해 서드파티 애플리케이션으로 API를 호출하지 마십시오.', + apiInterfaceAlert3: 'API 문서', + apiInterfaceAlert4: '사용 설명서', + apiKey: 'API 키', + apiKeyHelper: 'API 키는 서드파티 애플리케이션이 API 에 접근하는 데 사용됩니다.', + ipWhiteList: 'IP 허용 목록', + ipWhiteListEgs: '한 줄에 하나씩 입력하십시오. 예:\n172.161.10.111\n172.161.10.0/24', + ipWhiteListHelper: '허용 목록에 있는 IP만 API 에 접근할 수 있습니다.', + apiKeyValidityTime: '인터페이스 키 유효 기간', + apiKeyValidityTimeEgs: '인터페이스 키 유효 기간 (분 단위)', + apiKeyValidityTimeHelper: + '인터페이스 타임스탬프가 현재 타임스탬프와의 차이가 허용 범위 내에 있을 경우 유효합니다. 값이 0이면 검증이 비활성화됩니다.', + apiKeyReset: '인터페이스 키 재설정', + apiKeyResetHelper: '연관된 키 서비스가 무효화됩니다. 서비스에 새 키를 추가하십시오.', + confDockerProxy: 'Docker 프록시 구성', + restartNowHelper: 'Docker 프록시 구성을 위해 Docker 서비스를 재시작해야 합니다.', + restartNow: '즉시 재시작', + systemIPWarning: '서버 주소가 현재 설정되지 않았습니다. 제어 패널에서 먼저 설정하십시오.', + systemIPWarning1: '현재 서버 주소는 {0}으로 설정되어 있어 빠른 리디렉션이 불가능합니다!', + defaultNetwork: '네트워크 카드', + syncTime: '서버 시간', + timeZone: '시간대', + timeZoneChangeHelper: '시간대를 변경하면 서비스를 재시작해야 합니다. 계속하시겠습니까?', + timeZoneHelper: '시간대 변경은 시스템 timedatectl 서비스에 따라 작동하며, 1Panel 서비스 재시작 후 적용됩니다.', + timeZoneCN: '베이징', + timeZoneAM: '로스앤젤레스', + timeZoneNY: '뉴욕', + ntpALi: '알리바바', + ntpGoogle: '구글', + syncSite: 'NTP 서버', + syncSiteHelper: '이 작업은 {0}을(를) 시스템 시간 동기화의 소스로 사용합니다. 계속하시겠습니까?', + changePassword: '비밀번호 변경', + oldPassword: '기존 비밀번호', + newPassword: '새 비밀번호', + retryPassword: '비밀번호 확인', + noSpace: '입력 정보에 공백 문자를 포함할 수 없습니다.', + duplicatePassword: '새 비밀번호는 기존 비밀번호와 동일할 수 없습니다. 다시 입력하십시오!', + diskClean: '캐시 정리', + developerMode: '미리보기 프로그램', + developerModeHelper: '새로운 기능과 수정 사항을 정식 출시 전에 체험하고 초기 피드백을 제공할 수 있습니다.', + thirdParty: '서드파티 계정', + addBackupAccount: '{0} 추가', + noTypeForCreate: '현재 생성된 백업 유형이 없습니다.', + LOCAL: '서버 디스크', + OSS: 'Ali OSS', + S3: 'Amazon S3', + mode: '모드', + MINIO: 'MinIO', + SFTP: 'SFTP', + WebDAV: 'WebDAV', + WebDAVAlist: 'Alist 에 WebDAV 를 연결하는 방법은 공식 문서를 참조하십시오.', + OneDrive: 'Microsoft OneDrive', + isCN: 'Century Internet', + isNotCN: '국제 버전', + client_id: '클라이언트 ID', + client_secret: '클라이언트 시크릿', + redirect_uri: '리디렉션 URL', + onedrive_helper: '사용자 정의 구성은 공식 문서를 참조하십시오.', + refreshTime: '토큰 갱신 시간', + refreshStatus: '토큰 갱신 상태', + backupDir: '백업 디렉터리', + codeWarning: '현재 인증 코드 형식이 올바르지 않습니다. 다시 확인하십시오!', + code: '인증 코드', + codeHelper: + '"획득" 버튼을 클릭한 다음 OneDrive 에 로그인하여 리디렉션된 링크에서 "code" 이후의 내용을 복사하십시오. 이 입력 상자에 붙여넣으십시오. 자세한 지침은 공식 문서를 참조하십시오.', + loadCode: '획득', + COS: 'Tencent COS', + ap_beijing_1: '베이징 지역 1', + ap_beijing: '베이징', + ap_nanjing: '난징', + ap_shanghai: '상하이', + ap_guangzhou: '광저우', + ap_chengdu: '청두', + ap_chongqing: '충칭', + ap_shenzhen_fsi: '선전 금융', + ap_shanghai_fsi: '상하이 금융', + ap_beijing_fsi: '베이징 금융', + ap_hongkong: '홍콩, 중국', + ap_singapore: '싱가포르', + ap_mumbai: '뭄바이', + ap_jakarta: '자카르타', + ap_seoul: '서울', + ap_bangkok: '방콕', + ap_tokyo: '도쿄', + na_siliconvalley: '실리콘밸리 (미국 서부)', + na_ashburn: '애쉬번 (미국 동부)', + na_toronto: '토론토', + sa_saopaulo: '상파울루', + eu_frankfurt: '프랑크푸르트', + KODO: 'Qiniu Kodo', + scType: '스토리지 유형', + typeStandard: '표준', + typeStandard_IA: '저빈도 표준', + typeArchive: '아카이브', + typeDeep_Archive: '심층 아카이브', + scStandard: + '표준 스토리지는 실시간 접근, 빈번한 데이터 상호작용이 필요한 핫 파일이 많은 비즈니스 시나리오에 적합합니다.', + scStandard_IA: + '저빈도 스토리지는 접근 빈도가 비교적 낮고 최소 30일 동안 데이터를 저장하는 비즈니스 시나리오에 적합합니다.', + scArchive: '아카이브 스토리지는 접근 빈도가 극히 낮은 비즈니스 시나리오에 적합합니다.', + scDeep_Archive: '내구성이 뛰어난 콜드 스토리지는 접근 빈도가 극히 낮은 비즈니스 시나리오에 적합합니다.', + archiveHelper: + '아카이브 스토리지 파일은 직접 다운로드할 수 없으며, 해당 클라우드 서비스 제공자의 웹사이트를 통해 복원해야 합니다. 신중히 사용하십시오!', + backupAlert: 'S3 프로토콜을 지원하는 클라우드 공급자는 Amazon S3 를 사용하여 백업할 수 있습니다.', + domain: '가속 도메인', + backupAccount: '백업 계정 | 백업 계정', + loadBucket: '버킷 가져오기', + accountName: '계정 이름', + accountKey: '계정 키', + address: '주소', + path: '경로', + + safe: '보안', + bindInfo: '바인딩 정보', + bindAll: '모두 수신', + bindInfoHelper: '서비스 수신 주소나 프로토콜 변경은 서비스 불가 상태를 초래할 수 있습니다. 계속하시겠습니까?', + ipv6: 'IPv6 수신', + bindAddress: '수신 주소', + entrance: '진입점', + showEntrance: '"개요" 페이지에서 비활성화 경고 표시', + entranceHelper: '보안 진입점을 활성화하면 지정된 보안 진입점을 통해서만 패널에 로그인할 수 있습니다.', + entranceError: '5-116자의 안전한 로그인 진입점을 입력하십시오. 숫자나 문자만 지원됩니다.', + entranceInputHelper: '공백으로 남기면 보안 진입점이 비활성화됩니다.', + randomGenerate: '랜덤', + expirationTime: '만료 날짜', + unSetting: '미설정', + noneSetting: '패널 비밀번호의 만료 시간을 설정합니다. 만료 후 비밀번호를 재설정해야 합니다.', + expirationHelper: '비밀번호 만료 시간이 [0]일인 경우 비밀번호 만료 기능이 비활성화됩니다.', + days: '만료 일수', + expiredHelper: '현재 비밀번호가 만료되었습니다. 비밀번호를 다시 변경하십시오.', + timeoutHelper: '[ {0}일 ] 패널 비밀번호가 곧 만료됩니다. 만료 후 비밀번호를 재설정해야 합니다.', + complexity: '복잡성 검증', + complexityHelper: + '활성화하면 비밀번호 검증 규칙이 8-30 자, 영어, 숫자 및 최소 두 개의 특수 문자 포함으로 설정됩니다.', + bindDomain: '도메인 바인딩', + unBindDomain: '도메인 바인딩 해제', + panelSSL: '패널 SSL', + unBindDomainHelper: '도메인 이름 바인딩 해제 작업은 시스템 보안에 영향을 미칠 수 있습니다. 계속하시겠습니까?', + bindDomainHelper: '도메인을 바인딩한 후에는 해당 도메인을 통해서만 1Panel 서비스에 접근할 수 있습니다.', + bindDomainHelper1: '공백으로 남기면 도메인 이름 바인딩이 비활성화됩니다.', + bindDomainWarning: + '도메인 바인딩 후 로그아웃되며 설정에 지정된 도메인 이름을 통해서만 1Panel 서비스에 접근할 수 있습니다. 계속하시겠습니까?', + allowIPs: '허가된 IP', + unAllowIPs: '허가되지 않은 IP', + unAllowIPsWarning: + '허가되지 않은 빈 IP를 설정하면 모든 IP가 시스템에 접근할 수 있어 시스템 보안에 영향을 미칠 수 있습니다. 계속하시겠습니까?', + allowIPsHelper: '허가된 IP 주소 목록을 설정하면 목록에 있는 IP 주소만 패널 서비스에 접근할 수 있습니다.', + allowIPsWarning: + '허가된 IP 주소 목록을 설정하면 목록에 있는 IP 주소만 패널 서비스에 접근할 수 있습니다. 계속하시겠습니까?', + allowIPsHelper1: '공백으로 남기면 IP 주소 제한이 비활성화됩니다.', + allowIPEgs: '한 줄에 하나씩 입력하십시오. 예:\n172.16.10.111\n172.16.10.0/24', + mfa: '2단계 인증 (2FA)', + mfaClose: 'MFA를 비활성화하면 서비스 보안이 낮아집니다. 계속하시겠습니까?', + secret: '비밀키', + mfaInterval: '갱신 간격(초)', + mfaTitleHelper: + '제목은 다른 1Panel 호스트를 구별하는 데 사용됩니다. 제목을 수정한 후 다시 스캔하거나 비밀키를 수동으로 추가하세요.', + mfaIntervalHelper: '갱신 시간을 수정한 후 다시 스캔하거나 비밀키를 수동으로 추가하세요.', + mfaAlert: + '일회용 토큰은 현재 시간을 기반으로 생성된 동적 6자리 숫자입니다. 서버 시간이 동기화되어 있는지 확인하세요.', + mfaHelper: '활성화 후 일회용 토큰 검증이 필요합니다.', + mfaHelper1: '인증 앱을 다운로드하세요. 예를 들어,', + mfaHelper2: + '다음 QR 코드를 인증 앱으로 스캔하거나 비밀키를 복사하여 인증 앱에 입력하여 일회용 토큰을 획득하세요.', + mfaHelper3: '앱에서 생성된 6자리 숫자를 입력하세요.', + mfaCode: '일회용 토큰', + sslChangeHelper: 'HTTPS 설정을 수정하고 서비스를 재시작합니다. 계속하시겠습니까?', + sslDisable: '비활성화', + sslDisableHelper: 'HTTPS 서비스를 비활성화하면 패널을 재시작해야 적용됩니다. 계속하시겠습니까?', + noAuthSetting: '비인가 설정', + noAuthSettingHelper: + '지정된 보안 진입점을 사용하지 않거나, 지정된 IP 나 도메인에서 패널에 접근하지 않는 경우 이 응답은 패널 특성을 숨길 수 있습니다.', + responseSetting: '응답 설정', + help200: '도움말 페이지', + error400: '잘못된 요청', + error401: '권한 없음', + error403: '접근 금지', + error404: '페이지를 찾을 수 없음', + error408: '요청 시간 초과', + error416: '범위 불만족', + error444: '연결 닫힘', + error500: '서버 오류', + + https: '패널의 HTTPS 프로토콜 접근 설정은 패널 접근 보안을 강화할 수 있습니다.', + certType: '인증서 유형', + selfSigned: '자가 서명', + selfSignedHelper: '자가 서명 인증서는 브라우저에서 신뢰하지 않을 수 있으며 보안 경고가 표시될 수 있습니다.', + select: '선택', + domainOrIP: '도메인 또는 IP:', + timeOut: '시간 초과', + rootCrtDownload: '루트 인증서 다운로드', + primaryKey: '개인 키', + certificate: '인증서', + backupJump: '현재 백업 목록에 없는 파일입니다. 파일 디렉토리에서 다운로드하여 백업에 가져오기를 시도하세요.', + + snapshot: '스냅샷 | 스냅샷들', + deleteHelper: '타사 백업 계정에 포함된 스냅샷 파일을 포함하여 모든 스냅샷 파일이 삭제됩니다. 계속하시겠습니까?', + status: '스냅샷 상태', + ignoreRule: '무시 규칙', + editIgnoreRule: '@:commons.button.edit @.lower:setting.ignoreRule', + ignoreHelper: + '이 규칙은 스냅샷을 생성할 때 1Panel 데이터 디렉토리를 압축하고 백업하는 데 사용됩니다. 기본적으로 소켓 파일은 무시됩니다.', + ignoreHelper1: '한 줄에 하나씩 입력하세요. 예:\n*.log\n/opt/1panel/cache', + panelInfo: '1Panel 기본 정보 쓰기', + panelBin: '1Panel 시스템 파일 백업', + daemonJson: 'Docker 구성 파일 백업', + appData: '1Panel 에서 설치된 앱 백업', + panelData: '1Panel 데이터 디렉토리 백업', + backupData: '1Panel 의 로컬 백업 디렉토리 백업', + compress: '스냅샷 파일 생성', + upload: '스냅샷 파일 업로드', + recoverDetail: '복구 세부정보', + createSnapshot: '스냅샷 생성', + importSnapshot: '스냅샷 동기화', + importHelper: '스냅샷 디렉토리: ', + recover: '복구', + lastRecoverAt: '마지막 복구 시간', + lastRollbackAt: '마지막 롤백 시간', + reDownload: '백업 파일 다시 다운로드', + statusSuccess: '성공', + statusFailed: '실패', + recoverErrArch: '서버 아키텍처가 다른 스냅샷 복구는 지원되지 않습니다!', + recoverErrSize: '디스크 공간이 부족합니다. 확인하거나 정리 후 다시 시도하세요!', + recoverHelper: '스냅샷 {0} 에서 복구를 시작합니다. 계속하기 전에 다음 정보를 확인하세요:', + recoverHelper1: '복구에는 Docker 및 1Panel 서비스를 재시작해야 합니다.', + recoverHelper2: '서버에 충분한 디스크 공간이 있는지 확인하세요. (스냅샷 파일 크기: {0}, 사용 가능한 공간: {1})', + recoverHelper3: + '서버 아키텍처가 스냅샷이 생성된 서버의 아키텍처와 일치하는지 확인하세요. (현재 서버 아키텍처: {0})', + rollback: '롤백', + rollbackHelper: + '이 복구를 롤백하면 해당 복구의 모든 파일이 대체되며 Docker 및 1Panel 서비스를 재시작해야 할 수 있습니다. 계속하시겠습니까?', + + upgradeHelper: '업그레이드에는 1Panel 서비스를 재시작해야 합니다. 계속하시겠습니까?', + noUpgrade: '현재 최신 버전입니다', + upgradeNotes: '릴리스 노트', + upgradeNow: '지금 업그레이드', + source: '다운로드 소스', + + about: '정보', + project: 'GitHub', + issue: '이슈', + doc: '공식 문서', + star: '별', + description: '리눅스 서버 패널', + forum: '토론', + doc2: '문서', + currentVersion: '버전', + + license: '라이선스', + advancedMenuHide: '고급 메뉴 숨기기', + showMainAdvancedMenu: '하나의 메뉴만 유지하면 사이드바에 주 고급 메뉴만 표시됩니다.', + showAll: '모두 표시', + hideALL: '모두 숨기기', + ifShow: '표시 여부', + menu: '메뉴', + confirmMessage: '고급 메뉴 목록을 업데이트하려면 페이지가 새로 고쳐집니다. 계속하시겠습니까?', + compressPassword: '압축 비밀번호', + backupRecoverMessage: '압축 또는 압축 해제 비밀번호를 입력하세요 (설정하지 않으려면 비워 두세요)', + }, + license: { + community: 'OSS', + oss: '오픈 소스 소프트웨어', + pro: 'Pro', + trial: '체험판', + office: '공식', + trialInfo: '버전', + authorizationId: '구독 인증 ID', + authorizedUser: '인증된 사용자', + expiresAt: '만료일', + productName: '제품명', + productStatus: '제품 상태', + Lost: '분실', + Enable: '활성화됨', + Disable: '비활성화됨', + lostHelper: + '라이센스가 최대 재시도 횟수를 초과했습니다. 전문가 버전 기능이 제대로 작동하는지 확인하려면 동기화 버튼을 수동으로 클릭하세요.', + disableHelper: + '라이센스 동기화 검증에 실패했습니다. 전문가 버전 기능이 제대로 작동하는지 확인하려면 동기화 버튼을 수동으로 클릭하세요.', + quickUpdate: '빠른 업데이트', + import: '가져오기', + power: '권한 부여', + unbind: '연결 해제', + unbindHelper: '연결 해제 후 모든 Pro 관련 설정이 초기화됩니다. 계속하시겠습니까?', + importLicense: '라이센스', + importHelper: '라이센스 파일을 여기에 클릭하거나 드래그하세요', + technicalAdvice: '기술 상담', + advice: '상담', + indefinitePeriod: '무제한 기간', + levelUpPro: 'Pro 로 업그레이드', + licenseSync: '라이센스 동기화', + knowMorePro: '더 알아보기', + closeAlert: '현재 페이지는 패널 설정에서 닫을 수 있습니다.', + introduce: '기능 소개', + waf: '전문 버전으로 업그레이드하면 차단 맵, 로그, 차단 기록, 지리적 위치 차단, 사용자 정의 규칙, 사용자 정의 차단 페이지 등의 기능을 제공받을 수 있습니다.', + tamper: '전문 버전으로 업그레이드하면 웹사이트를 무단 수정이나 변조로부터 보호할 수 있습니다.', + gpu: '전문 버전으로 업그레이드하면 GPU 의 작업 부하, 온도, 메모리 사용량 등 중요한 매개변수를 실시간으로 시각적으로 모니터링할 수 있습니다.', + setting: '전문 버전으로 업그레이드하면 패널 로고, 환영 메시지 등 정보를 사용자 정의할 수 있습니다.', + monitor: + '전문 버전으로 업그레이드하면 웹사이트의 실시간 상태, 방문자 트렌드, 방문자 출처, 요청 로그 등 정보를 확인할 수 있습니다.', + alert: '전문 버전으로 업그레이드하면 SMS 를 통해 알림 정보를 받고 알림 로그를 볼 수 있으며, 다양한 주요 이벤트를 완벽하게 제어하여 시스템 운영을 걱정 없이 유지할 수 있습니다.', + }, + clean: { + scan: '스캔 시작', + scanHelper: '1Panel 실행 중에 생성된 불필요한 파일을 쉽게 정리합니다.', + clean: '지금 정리', + reScan: '다시 스캔', + cleanHelper: '선택한 시스템 불필요 파일을 정리합니다. 이 작업은 되돌릴 수 없습니다. 계속 하시겠습니까?', + statusSuggest: '(권장 정리)', + statusClean: '(매우 깨끗함)', + statusEmpty: '매우 깨끗합니다. 정리가 필요하지 않습니다!', + statusWarning: '(주의하여 진행)', + lastCleanTime: '마지막 정리 시간: {0}', + lastCleanHelper: '정리된 파일 및 디렉터리: {0}, 총 정리된 크기: {1}', + cleanSuccessful: '정리 성공', + currentCleanHelper: '이번 세션에서 정리된 파일 및 디렉터리: {0}, 총 정리된 크기: {1}', + suggest: '(권장)', + totalScan: '정리해야 할 총 불필요 파일: ', + selectScan: '선택된 불필요 파일 총합: ', + + system: '시스템 불필요 파일', + systemHelper: '스냅샷, 업그레이드 중에 생성된 임시 파일과 버전 업데이트 중에 불필요해진 파일 내용', + panelOriginal: '시스템 스냅샷 복구 백업 파일', + upgrade: '시스템 업그레이드 백업 파일', + upgradeHelper: '(시스템 롤백을 위해 최신 업그레이드 백업을 유지하는 것이 좋습니다)', + cache: '시스템 캐시 파일', + cacheHelper: '(주의하여 진행, 정리 후 서비스 재시작 필요)', + snapshotTmp: '시스템 스냅샷 업로드 임시 파일', + snapshotLocal: '시스템 스냅샷 생성 임시 파일', + rollback: '복구 전 백업 파일', + unused: '사용되지 않는 시스템 디렉터리', + oldUpgrade: '사용되지 않는 구버전 업그레이드 백업 디렉터리', + oldOriginal: '사용되지 않는 구버전 스냅샷 복구 백업 디렉터리', + oldAppsBak: '사용되지 않는 애플리케이션 백업 디렉터리', + + upload: '임시 업로드 파일', + uploadHelper: '시스템 백업 리스트에서 업로드된 임시 파일', + download: '임시 다운로드 파일', + downloadHelper: '시스템에서 제3자 백업 계정으로 다운로드된 임시 파일', + website: '웹사이트', + app: '애플리케이션', + database: '데이터베이스', + directory: '디렉터리', + + systemLog: '시스템 로그 파일', + systemLogHelper: '시스템 로그 정보, 컨테이너 빌드 또는 이미지 풀 로그 정보, 예약된 작업에서 생성된 로그 파일', + dockerLog: '컨테이너 운영 로그 파일', + taskLog: '예약된 작업 실행 로그 파일', + containerShell: '컨테이너 내 쉘 스크립트 예약 작업', + + containerTrash: '컨테이너 휴지통', + images: '이미지', + containers: '컨테이너', + volumes: '볼륨', + buildCache: '컨테이너 빌드 캐시', + }, + app: { + app: '애플리케이션 | 애플리케이션들', + installName: '이름', + installed: '설치됨', + all: '모두', + version: '버전', + detail: '세부사항', + params: '편집', + install: '설치', + author: '저자', + source: '출처', + sync: '동기화', + appName: '애플리케이션 이름', + status: '상태', + container: '컨테이너', + restart: '재시작', + start: '시작', + stop: '중지', + rebuild: '재빌드', + description: '설명', + deleteWarn: + '삭제 작업은 모든 데이터와 백업을 함께 삭제합니다. 이 작업은 되돌릴 수 없습니다. 계속 하시겠습니까?', + syncSuccess: '동기화 성공', + canUpgrade: '업데이트', + backupName: '파일 이름', + backupPath: '파일 경로', + backupdate: '백업 시간', + update: '업데이트', + versionSelect: '버전을 선택하세요', + operatorHelper: '선택한 애플리케이션에 대해 {0} 작업이 수행됩니다. 계속 하시겠습니까?', + startOperatorHelper: '애플리케이션이 시작됩니다. 계속 하시겠습니까?', + stopOperatorHelper: '애플리케이션이 중지됩니다. 계속 하시겠습니까?', + restartOperatorHelper: '애플리케이션이 재시작됩니다. 계속 하시겠습니까?', + reloadOperatorHelper: '애플리케이션이 다시 로드됩니다. 계속 하시겠습니까?', + checkInstalledWarn: '"{0}"이(가) 감지되지 않았습니다. "앱 스토어"로 가서 설치하세요.', + gotoInstalled: '설치하러 가기', + search: '검색', + limitHelper: '애플리케이션은 이미 설치되었습니다.', + deleteHelper: '"{0}"은(는) 다음 리소스와 연결되어 있습니다. 확인 후 다시 시도하세요!', + checkTitle: '힌트', + website: '웹사이트', + database: '데이터베이스', + defaultConfig: '기본 설정', + defaultConfigHelper: '기본 설정으로 복원되었습니다. 저장 후 적용됩니다.', + forceDelete: '강제 삭제', + forceDeleteHelper: '강제 삭제는 삭제 과정 중 오류를 무시하고 메타데이터를 삭제합니다.', + deleteBackup: '백업 삭제', + deleteBackupHelper: '애플리케이션 백업도 삭제됩니다.', + deleteDB: '데이터베이스 삭제', + deleteDBHelper: '데이터베이스도 삭제됩니다.', + noService: '{0} 없음', + toInstall: '설치하러 가기', + param: '파라미터', + alreadyRun: '나이', + syncAppList: '동기화', + less1Minute: '1분 미만', + appOfficeWebsite: '오피스 웹사이트', + github: 'GitHub', + document: '문서', + updatePrompt: '업데이트가 없습니다.', + installPrompt: '아직 설치된 앱이 없습니다.', + updateHelper: '파라미터를 수정하면 애플리케이션이 시작되지 않을 수 있습니다. 주의하세요.', + updateWarn: '업데이트 파라미터는 애플리케이션을 재빌드해야 합니다. 계속 하시겠습니까?', + busPort: '포트', + syncStart: '동기화 시작! 나중에 앱 스토어를 새로고침 해주세요.', + advanced: '고급 설정', + cpuCore: '코어', + containerName: '컨테이너 이름', + containerNameHelper: '설정되지 않으면 컨테이너 이름이 자동으로 생성됩니다.', + allowPort: '외부 접근 허용', + allowPortHelper: '외부 포트 접근을 허용하면 방화벽 포트가 열립니다.', + appInstallWarn: + '애플리케이션은 기본적으로 외부 접근 포트를 노출하지 않습니다. "고급 설정"을 클릭하여 노출할 수 있습니다.', + upgradeStart: '업그레이드 시작! 나중에 페이지를 새로고침 해주세요.', + toFolder: '설치 디렉터리 열기', + editCompose: 'Compose 파일 편집', + editComposeHelper: 'Compose 파일을 편집하면 소프트웨어 설치가 실패할 수 있습니다.', + composeNullErr: 'Compose는 비어 있을 수 없습니다.', + takeDown: '내리기', + allReadyInstalled: '설치됨', + installHelper: '이미지 풀 문제 시 이미지 가속을 구성하세요.', + upgradeHelper: + '업그레이드 전에 비정상적인 애플리케이션을 정상 상태로 복원하세요. 업그레이드 실패 시 "로그 > 시스템 로그"에서 실패 원인을 확인하세요.', + installWarn: + '외부 접근이 활성화되지 않아 애플리케이션이 외부 네트워크에서 접근할 수 없습니다. 계속 하시겠습니까?', + showIgnore: '무시된 애플리케이션 보기', + cancelIgnore: '무시 취소', + ignoreList: '무시된 애플리케이션', + appHelper: '특수 애플리케이션 설치 지침을 보려면 애플리케이션 상세 페이지로 이동하세요.', + backupApp: '업그레이드 전 애플리케이션 백업', + backupAppHelper: + '업그레이드 실패 시 백업이 자동으로 롤백됩니다. 로그 감사 시스템 로그에서 실패 원인을 확인하세요. 백업은 기본적으로 최신 3개 복사본을 유지합니다.', + delete: '삭제', + openrestyDeleteHelper: 'OpenResty 강제 삭제는 모든 웹사이트를 삭제합니다. 계속 하시겠습니까?', + downloadLogHelper1: '{0} 애플리케이션의 모든 로그가 다운로드됩니다. 계속 하시겠습니까?', + downloadLogHelper2: '{0} 애플리케이션의 최신 {1} 로그가 다운로드됩니다. 계속 하시겠습니까?', + syncAllAppHelper: '모든 애플리케이션이 동기화됩니다. 계속 하시겠습니까?', + hostModeHelper: + '현재 애플리케이션 네트워크 모드는 호스트 모드입니다. 포트를 열어야 할 경우 방화벽 페이지에서 수동으로 열어주세요.', + showLocal: '로컬 애플리케이션 보기', + reload: '새로고침', + upgradeWarn: + '애플리케이션 업그레이드는 docker-compose.yml 파일을 교체합니다. 변경 사항이 있으면 파일 비교를 클릭하여 확인할 수 있습니다.', + newVersion: '새 버전', + oldVersion: '현재 버전', + composeDiff: '파일 비교', + showDiff: '비교 보기', + useNew: '사용자 정의 버전 사용', + useDefault: '기본 버전 사용', + useCustom: '사용자 정의 docker-compose.yml 사용', + useCustomHelper: + '사용자 정의 docker-compose.yml 파일을 사용하면 애플리케이션 업그레이드가 실패할 수 있습니다. 필요하지 않으면 체크하지 마세요.', + diffHelper: '왼쪽은 이전 버전, 오른쪽은 새 버전입니다. 편집 후 사용자 정의 버전을 저장하려면 클릭하세요.', + pullImage: '이미지 풀', + pullImageHelper: '애플리케이션 시작 전에 docker pull 을 실행하여 이미지를 다운로드하세요.', + }, + website: { + website: '웹사이트 | 웹사이트들', + primaryDomain: '기본 도메인', + otherDomains: '기타 도메인', + static: '정적', + deployment: '배포', + supportUpType: '지원되는 파일 형식: .tar.gz', + zipFormat: '.tar.gz 압축 패키지 구조: test.tar.gz 패키지에는 반드시 {0} 파일이 포함되어야 합니다.', + proxy: '리버스 프록시', + alias: '별칭', + enableFtp: 'FTP 활성화', + ftpUser: 'FTP 계정', + ftpPassword: 'FTP 비밀번호', + ftpHelper: '웹사이트를 생성하면 해당 FTP 계정이 생성되고 FTP 디렉터리는 웹사이트 디렉터리와 연결됩니다.', + remark: '비고', + group: '그룹', + manageGroup: '그룹 관리', + groupSetting: '그룹 설정', + createGroup: '그룹 생성', + app: '애플리케이션', + appNew: '새로운 애플리케이션', + appInstalled: '설치된 애플리케이션', + create: '생성', + delete: '웹사이트 삭제', + deleteApp: '애플리케이션 삭제', + deleteBackup: '백업 삭제', + domain: '도메인', + domainHelper: "한 줄에 하나의 도메인.\n와일드카드 '*'와 IP 주소를 지원합니다.\n포트 추가를 지원합니다.", + addDomain: '추가', + domainConfig: '도메인 설정', + defaultDoc: '기본 문서', + perserver: '동시 연결', + perserverHelper: '현재 사이트의 최대 동시 연결 수를 제한합니다.', + perip: '단일 IP', + peripHelper: '단일 IP의 최대 동시 접속 수를 제한합니다.', + rate: '트래픽 제한', + rateHelper: '요청당 트래픽을 제한합니다 (단위: KB)', + limitHelper: '트래픽 제어 활성화', + other: '기타', + currentSSL: '현재 인증서', + dnsAccount: 'DNS 계정', + applySSL: '인증서 신청', + SSLList: '인증서 목록', + createDnsAccount: 'DNS 계정 생성', + aliyun: '알리윤', + volcengine: '볼크엔진', + manual: '수동 설정', + key: '키', + check: '보기', + acmeAccountManage: 'ACME 계정 관리', + email: '이메일', + acmeAccount: 'ACME 계정', + provider: '검증 방법', + dnsManual: '수동 설정', + expireDate: '만료일', + brand: '기관', + deploySSL: '배포', + deploySSLHelper: '인증서를 배포하시겠습니까?', + ssl: '인증서 | 인증서들', + dnsAccountManage: 'DNS 제공자 관리', + renewSSL: '갱신', + renewHelper: '인증서를 갱신하시겠습니까?', + renewSuccess: '인증서 갱신 성공', + config: '편집', + enableHTTPS: 'HTTPS 활성화', + aliasHelper: '별칭은 웹사이트의 디렉터리 이름입니다.', + lastBackupAt: '마지막 백업 시간', + null: '없음', + nginxConfig: 'Nginx 설정', + websiteConfig: '웹사이트 설정', + basic: '기본', + source: '구성', + security: '보안', + log: '로그', + nginxPer: '성능 튜닝', + neverExpire: '만료 없음', + setDefault: '기본값으로 설정', + default: '기본값', + deleteHelper: '관련 애플리케이션 상태가 비정상입니다. 확인해 주세요.', + toApp: '설치된 목록으로 이동', + cycle: '주기', + frequency: '빈도', + ccHelper: '{0}초 내에 동일한 URL을 {1}회 이상 누적 요청하면 CC 방어가 발동되며, 해당 IP가 차단됩니다.', + mustSave: '변경 사항은 저장해야 적용됩니다.', + fileExt: '파일 확장자', + fileExtBlock: '파일 확장자 차단 목록', + value: '값', + enable: '활성화', + proxyAddress: '프록시 주소', + proxyHelper: '예: 127.0.0.1:8080', + forceDelete: '강제 삭제', + forceDeleteHelper: '강제 삭제는 삭제 과정에서 발생하는 오류를 무시하고 최종적으로 메타데이터를 삭제합니다.', + deleteAppHelper: '관련 애플리케이션 및 애플리케이션 백업을 동시에 삭제합니다.', + deleteBackupHelper: '웹사이트 백업도 삭제합니다.', + deleteConfirmHelper: + '삭제 작업은 되돌릴 수 없습니다. 확인하려면 "{0}"을(를) 입력하세요.', + staticPath: '해당 주요 디렉터리는', + limit: '제한', + blog: '포럼/블로그', + imageSite: '이미지 사이트', + downloadSite: '다운로드 사이트', + shopSite: '쇼핑몰', + doorSite: '포털', + qiteSite: '기업', + videoSite: '비디오', + errLog: '오류 로그', + accessLog: '웹사이트 로그', + stopHelper: + '사이트를 중지하면 정상적으로 액세스할 수 없으며, 사용자가 해당 사이트의 중지 페이지를 보게 됩니다. 계속하시겠습니까?', + startHelper: '사이트를 활성화하면 사용자가 정상적으로 사이트 내용을 액세스할 수 있습니다. 계속하시겠습니까?', + sitePath: '디렉터리', + siteAlias: '사이트 별칭', + primaryPath: '루트 디렉터리', + folderTitle: '웹사이트는 다음과 같은 폴더를 포함합니다.', + wafFolder: '방화벽 규칙', + indexFolder: '웹사이트 루트 디렉터리', + logFolder: '웹사이트 로그', + sslFolder: '웹사이트 인증서', + enableOrNot: '활성화 여부', + oldSSL: '기존 인증서', + manualSSL: '인증서 가져오기', + select: '선택', + selectSSL: '인증서 선택', + privateKey: '키(KEY)', + certificate: '인증서(PEM 형식)', + HTTPConfig: 'HTTP 옵션', + HTTPSOnly: 'HTTP 요청 차단', + HTTPToHTTPS: 'HTTPS로 리디렉션', + HTTPAlso: 'HTTP 요청 허용', + sslConfig: 'SSL 옵션', + disableHTTPS: 'HTTPS 비활성화', + disableHTTPSHelper: 'HTTPS 비활성화는 인증서 관련 구성을 삭제합니다. 계속하시겠습니까?', + SSLHelper: + '주의: 불법 웹사이트에는 SSL 인증서를 사용하지 마세요.\nHTTPS 액세스가 안 되는 경우 보안 그룹에서 443 포트를 올바르게 해제했는지 확인하세요.', + SSLConfig: '인증서 설정', + SSLProConfig: '프로토콜 설정', + supportProtocol: '프로토콜 버전', + encryptionAlgorithm: '암호화 알고리즘', + notSecurity: '(안전하지 않음)', + encryptHelper: + "Let's Encrypt 는 인증서 발급에 빈도 제한이 있지만 일반적인 요구 사항을 충족하기에 충분합니다. 너무 자주 작업하면 발급 실패가 발생할 수 있습니다. 자세한 제한 사항은 공식 문서를 참조하세요.", + ipValue: '값', + ext: '파일 확장자', + wafInputHelper: '줄 단위로 데이터 입력, 한 줄에 하나씩', + data: '데이터', + ever: '영구', + nextYear: '1년 후', + noLog: '로그를 찾을 수 없습니다.', + defaultServer: '기본 사이트', + noDefaultServer: '설정되지 않음', + defaultServerHelper: + '기본 사이트를 설정하면 모든 미연결 도메인 이름 및 IP가 기본 사이트로 연결됩니다.\n이를 통해 악의적인 분석을 효과적으로 방지할 수 있습니다.', + restoreHelper: '이 백업을 사용하여 복원하시겠습니까?', + websiteDeploymentHelper: '설치된 애플리케이션을 사용하거나 새 애플리케이션을 생성하여 웹사이트를 만드세요.', + websiteStatictHelper: '호스트에 웹사이트 디렉터리를 생성합니다.', + websiteProxyHelper: + '리버스 프록시를 사용하여 기존 서비스를 프록시합니다. 예를 들어, 포트 8080 에서 실행 중인 서비스를 프록시하려면 프록시 주소는 "http://127.0.0.1:8080"이 됩니다.', + runtimeProxyHelper: '웹사이트 런타임을 사용하여 웹사이트를 만드세요.', + runtime: '런타임', + deleteRuntimeHelper: '런타임 애플리케이션은 웹사이트와 함께 삭제해야 하므로 신중하게 처리하세요.', + proxyType: '네트워크 유형', + unix: '유닉스 네트워크', + tcp: 'TCP/IP 네트워크', + phpFPM: 'FPM 구성', + phpConfig: 'PHP 구성', + updateConfig: '구성 업데이트', + isOn: '켜짐', + isOff: '꺼짐', + rewrite: '의사 정적', + rewriteMode: '방식', + current: '현재', + rewriteHelper: '의사 정적 설정으로 인해 웹사이트에 접근할 수 없게 되면 기본 설정으로 되돌려보세요.', + runDir: '실행 디렉터리', + runUserHelper: + 'PHP 컨테이너 런타임 환경에서 배포된 웹사이트의 경우, 인덱스 및 하위 디렉터리 아래의 모든 파일 및 폴더의 소유자와 사용자 그룹을 1000으로 설정해야 합니다. 로컬 PHP 환경의 경우, 로컬 PHP-FPM 사용자 및 사용자 그룹 설정을 참조하세요.', + userGroup: '사용자/그룹', + uGroup: '그룹', + proxyPath: '프록시 경로', + proxyPass: '대상 URL', + cache: '캐시', + cacheTime: '캐시 지속 시간', + enableCache: '캐시 활성화', + proxyHost: '프록시 호스트', + disabled: '중지됨', + startProxy: '리버스 프록시를 시작합니다. 계속하시겠습니까?', + stopProxy: '리버스 프록시를 중지합니다. 계속하시겠습니까?', + sourceFile: '소스', + proxyHelper1: '이 디렉터리에 접근할 때 대상 URL 의 내용이 반환되고 표시됩니다.', + proxyPassHelper: '대상 URL 은 유효하고 접근 가능해야 합니다.', + proxyHostHelper: '요청 헤더에 있는 도메인 이름을 프록시 서버로 전달합니다.', + replacementHelper: '최대 5개의 교체를 추가할 수 있으며, 교체가 필요하지 않은 경우 비워두세요.', + modifier: '매칭 규칙', + modifierHelper: '예: = 는 정확히 일치, ~ 는 정규식 일치, ^~ 는 경로 시작 부분 일치 등을 나타냅니다.', + replace: '텍스트 교체', + addReplace: '추가', + replaced: '검색 문자열 (비울 수 없음)', + replaceText: '교체할 문자열', + replacedErr: '검색 문자열은 비워둘 수 없습니다', + replacedErr2: '검색 문자열은 중복될 수 없습니다', + basicAuth: '기본 인증', + editBasicAuthHelper: + '비밀번호는 비대칭으로 암호화되어 표시할 수 없습니다. 수정하려면 비밀번호를 재설정해야 합니다.', + antiLeech: '링크 차단', + extends: '확장', + browserCache: '캐시', + leechLog: '링크 차단 로그 기록', + accessDomain: '허용된 도메인', + leechReturn: '응답 리소스', + noneRef: '빈 참조 허용', + disable: '비활성화', + disableLeechHelper: '링크 차단을 비활성화할지 여부', + disableLeech: '링크 차단 비활성화', + ipv6: 'IPv6 수신 대기', + leechReturnError: 'HTTP 상태 코드를 입력하세요', + selectAcme: 'Acme 계정 선택', + imported: '수동으로 생성됨', + importType: '가져오기 유형', + pasteSSL: '코드 붙여넣기', + localSSL: '서버 파일 선택', + privateKeyPath: '개인 키 파일', + certificatePath: '인증서 파일', + ipWhiteListHelper: 'IP 허용 목록의 역할: 모든 규칙이 IP 허용 목록에 대해 무효화됩니다.', + redirect: '리디렉션', + sourceDomain: '소스 도메인', + targetURL: '대상 URL 주소', + keepPath: 'URI 매개변수', + path: '경로', + redirectType: '리디렉션 유형', + redirectWay: '방식', + keep: '유지', + notKeep: '유지하지 않음', + redirectRoot: '홈페이지로 리디렉션', + redirectHelper: '301 영구 리디렉션, 302 임시 리디렉션', + changePHPVersionWarn: + 'PHP 버전을 변경하면 기존 PHP 컨테이너가 삭제됩니다 (마운트된 웹사이트 코드는 손실되지 않습니다). 계속하시겠습니까?', + changeVersion: '버전 전환', + retainConfig: 'php-fpm.conf 및 php.ini 파일을 유지할지 여부', + runDirHelper2: '보조 실행 디렉터리가 인덱스 디렉터리 아래에 있는지 확인하세요.', + openrestyHelper: + 'OpenResty 기본 HTTP 포트: {0}, HTTPS 포트: {1}, 이는 웹사이트 도메인 접속 및 HTTPS 강제 리디렉션에 영향을 미칠 수 있습니다.', + primaryDomainHelper: '예: example.com 또는 example.com:8080', + acmeAccountType: '계정 유형', + keyType: '키 알고리즘', + tencentCloud: '텐센트 클라우드', + containWarn: '도메인 이름에 메인 도메인이 포함되어 있습니다. 다시 입력하세요.', + rewriteHelper2: + '앱 스토어에서 설치된 WordPress 와 같은 응용 프로그램은 일반적으로 사전 설정된 가상 정적 구성이 포함됩니다. 이를 재구성하면 오류가 발생할 수 있습니다.', + websiteBackupWarn: + '로컬 백업 가져오기만 지원합니다. 다른 기기에서 가져온 백업은 복구 실패를 초래할 수 있습니다.', + ipWebsiteWarn: + 'IP를 도메인 이름으로 사용하는 웹사이트는 정상적으로 접속되기 위해 기본 사이트로 설정해야 합니다.', + hstsHelper: 'HSTS 를 활성화하면 웹사이트 보안을 강화할 수 있습니다.', + defaultHtml: '기본 페이지', + website404: '웹사이트 404 오류 페이지', + domain404: '웹사이트 도메인이 존재하지 않습니다.', + indexHtml: '정적 웹사이트 인덱스', + stopHtml: '중지된 웹사이트', + indexPHP: 'PHP 웹사이트 인덱스', + sslExpireDate: '인증서 만료 날짜', + website404Helper: '웹사이트 404 오류 페이지는 PHP 실행 환경 웹사이트 및 정적 웹사이트만 지원합니다.', + sni: '원본 SNI', + sniHelper: + '역방향 프록시 백엔드가 HTTPS 인 경우 원본 SNI 를 설정해야 할 수 있습니다. 자세한 내용은 CDN 서비스 제공자의 문서를 참조하세요.', + huaweicloud: '화웨이 클라우드', + rainyun: '레인윤', + }, + php: { + short_open_tag: '짧은 태그 지원', + max_execution_time: '최대 스크립트 실행 시간', + max_input_time: '최대 입력 시간', + memory_limit: '스크립트 메모리 제한', + post_max_size: 'POST 데이터 최대 크기', + file_uploads: '파일 업로드 허용 여부', + upload_max_filesize: '업로드 가능한 파일의 최대 크기', + max_file_uploads: '한 번에 업로드 가능한 파일의 최대 개수', + default_socket_timeout: '소켓 타임아웃', + error_reporting: '에러 수준', + display_errors: '상세한 에러 정보 출력 여부', + cgi_fix_pathinfo: 'pathinfo 활성화 여부', + date_timezone: '시간대', + disableFunction: '비활성화 함수', + disableFunctionHelper: '비활성화할 함수를 입력하세요. 예: exec, 여러 항목은 쉼표로 구분', + uploadMaxSize: '업로드 제한', + indexHelper: 'PHP 웹사이트의 정상 작동을 위해 코드를 인덱스 디렉터리에 배치하고 이름 변경을 피하세요.', + extensions: '확장 템플릿', + extension: '확장', + extensionHelper: '여러 확장은 쉼표로 구분하여 입력하세요.', + toExtensionsList: '확장 목록 보기', + }, + nginx: { + serverNamesHashBucketSizeHelper: '서버 이름의 해시 테이블 크기', + clientHeaderBufferSizeHelper: '클라이언트가 요청한 헤더 버퍼 크기', + clientMaxBodySizeHelper: '최대 업로드 파일 크기', + keepaliveTimeoutHelper: '연결 시간 초과', + gzipMinLengthHelper: '최소 압축 파일 크기', + gzipCompLevelHelper: '압축률', + gzipHelper: '전송을 위한 압축 활성화', + connections: '활성 연결', + accepts: '수락', + handled: '처리됨', + requests: '요청', + reading: '읽기 중', + writing: '쓰기 중', + waiting: '대기 중', + status: '현재 상태', + nginxConfig: '설정', + configResource: '구성', + saveAndReload: '저장 및 다시 로드', + clearProxyCache: '리버스 프록시 캐시 삭제', + clearProxyCacheWarn: + '캐시가 구성된 모든 웹사이트에 영향을 미치며 OpenResty 가 다시 시작됩니다. 계속하시겠습니까?', + }, + ssl: { + create: '요청', + provider: '유형', + manualCreate: '수동 생성됨', + acmeAccount: 'ACME 계정', + resolveDomain: '도메인 이름 확인', + err: '오류', + value: '레코드 값', + dnsResolveHelper: 'DNS 해석 서비스 제공업체에서 다음 해석 레코드를 추가하세요:', + detail: '세부 정보', + msg: '정보', + ssl: '인증서', + key: '개인 키', + startDate: '유효 시작 시간', + organization: '발급 기관', + renewConfirm: '도메인 이름 {0}에 대해 새 인증서를 갱신합니다. 계속하시겠습니까?', + autoRenew: '자동 갱신', + autoRenewHelper: '만료 30일 전에 자동으로 갱신', + renewSuccess: '갱신 성공', + renewWebsite: '이 인증서는 다음 웹사이트에 연결되었으며, 적용은 이러한 웹사이트에 동시에 적용됩니다.', + createAcme: '계정 생성', + acmeHelper: 'Acme 계정은 무료 인증서를 신청하는 데 사용됩니다.', + upload: '가져오기', + applyType: '유형', + apply: '갱신', + applyStart: '인증서 신청 시작', + getDnsResolve: 'DNS 해석 값을 가져오는 중입니다. 잠시 기다려주세요...', + selfSigned: '자체 서명된 CA', + ca: '인증 기관', + commonName: '공통 이름', + caName: '인증 기관 이름', + company: '기관 이름', + department: '조직 단위 이름', + city: '지역 이름', + province: '주 또는 지방 이름', + country: '국가 이름 (2자리 코드)', + commonNameHelper: '예를 들어, ', + selfSign: '인증서 발급', + days: '유효 기간', + domainHelper: '줄당 하나의 도메인 이름, * 및 IP 주소 지원', + pushDir: '로컬 디렉토리로 인증서 푸시', + dir: '디렉토리', + pushDirHelper: '인증서 파일 "fullchain.pem" 및 키 파일 "privkey.pem"이 이 디렉토리에 생성됩니다.', + organizationDetail: '조직 세부 정보', + fromWebsite: '웹사이트에서 가져오기', + dnsMauanlHelper: '수동 해석 모드에서는 생성 후 신청 버튼을 클릭하여 DNS 해석 값을 얻어야 합니다.', + httpHelper: 'HTTP 모드는 OpenResty 설치가 필요합니다.', + buypassHelper: 'Buypass 는 중국 본토에서 접근할 수 없습니다.', + googleHelper: 'EAB HmacKey 및 EAB kid 를 얻는 방법', + googleCloudHelper: 'Google Cloud API 는 중국 본토 대부분에서 접근할 수 없습니다.', + httpHelper2: 'HTTP 모드에서 일반 도메인 이름 인증서를 신청할 수 없습니다.', + skipDNSCheck: 'DNS 확인 건너뛰기', + skipDNSCheckHelper: '인증 요청 중 타임아웃 문제가 발생할 경우에만 선택하세요.', + cfHelper: 'Global API Key 를 사용하지 마세요.', + deprecated: '더 이상 지원되지 않습니다.', + deprecatedHelper: + '유지 관리가 중단되었으며 향후 버전에서 제외될 수 있습니다. Tencent Cloud 방법을 사용하여 분석하세요.', + disableCNAME: 'CNAME 비활성화', + disableCNAMEHelper: '도메인 이름에 CNAME 레코드가 있고 요청이 실패할 경우 선택하세요.', + nameserver: 'DNS 서버', + nameserverHelper: '사용자 지정 DNS 서버를 사용하여 도메인 이름을 확인합니다.', + edit: '인증서 편집', + execShell: '인증 요청 후 스크립트 실행', + shell: '스크립트 내용', + shellHelper: + '스크립트의 기본 실행 디렉토리는 1Panel 설치 디렉토리입니다. 인증서가 로컬 디렉토리에 푸시되는 경우 실행 디렉토리는 인증서 푸시 디렉토리가 됩니다. 기본 실행 제한 시간은 30분입니다.', + }, + firewall: { + create: '규칙 만들기', + edit: '규칙 수정', + notSupport: '시스템 방화벽이 감지되지 않았습니다 (firewalld 또는 ufw). 설치 방법은 공식 문서를 참조하세요.', + ccDeny: 'CC 보호', + ipWhiteList: 'IP 허용 목록', + ipBlockList: 'IP 차단 목록', + fileExtBlockList: '파일 확장자 차단 목록', + urlWhiteList: 'URL 허용 목록', + urlBlockList: 'URL 차단 목록', + argsCheck: 'GET 파라미터 검사', + postCheck: 'POST 파라미터 검사', + cookieBlockList: '쿠키 차단 목록', + firewall: '방화벽', + dockerHelper: + '리눅스 방화벽 "{0}"은(는) Docker 포트 매핑을 비활성화할 수 없습니다. 애플리케이션은 "앱 스토어 -> 설치됨" 페이지에서 매핑 포트를 해제할 수 있는 파라미터를 수정해야 합니다.', + quickJump: '빠른 접근', + used: '사용됨', + unUsed: '사용 안 함', + firewallHelper: '{0} 시스템 방화벽', + firewallNotStart: '현재 시스템 방화벽이 활성화되지 않았습니다. 먼저 활성화하세요.', + restartFirewallHelper: '이 작업은 현재 방화벽을 재시작합니다. 계속하시겠습니까?', + stopFirewallHelper: '이 작업은 서버 보안을 잃게 만듭니다. 계속하시겠습니까?', + startFirewallHelper: '방화벽이 활성화되면 서버 보안이 강화됩니다. 계속하시겠습니까?', + noPing: 'Ping 비활성화', + noPingTitle: 'Ping 비활성화', + noPingHelper: '이 작업은 Ping 을 비활성화하며 서버는 ICMP 응답을 보내지 않게 됩니다. 계속하시겠습니까?', + onPingHelper: '이 작업은 Ping 을 활성화하여 해커가 서버를 발견할 수 있습니다. 계속하시겠습니까?', + changeStrategy: '{0} 전략 변경', + changeStrategyIPHelper1: + 'IP 주소 전략을 [거부]로 변경합니다. 설정 후 해당 IP 주소는 서버 접근이 차단됩니다. 계속하시겠습니까?', + changeStrategyIPHelper2: + 'IP 주소 전략을 [허용]으로 변경합니다. 설정 후 해당 IP 주소는 정상적으로 접근할 수 있습니다. 계속하시겠습니까?', + changeStrategyPortHelper1: + '포트 정책을 [차단]으로 변경합니다. 설정 후 외부 접근이 차단됩니다. 계속하시겠습니까?', + changeStrategyPortHelper2: + '포트 정책을 [허용]으로 변경합니다. 설정 후 정상적으로 포트 접근이 복원됩니다. 계속하시겠습니까?', + stop: '정지', + portFormatError: '이 필드는 유효한 포트이어야 합니다.', + portHelper1: '여러 포트, 예: 8080, 8081', + portHelper2: '포트 범위, 예: 8080-8089', + changeStrategyHelper: + '[{1}] {0} 전략을 [{2}]로 변경합니다. 설정 후 {0}은(는) {2}로 외부 접근을 허용합니다. 계속하시겠습니까?', + portHelper: '여러 포트를 입력할 수 있습니다. 예: 80, 81 또는 포트 범위, 예: 80-88', + strategy: '전략', + accept: '허용', + drop: '차단', + source: '소스', + anyWhere: '어디든지', + address: '지정된 IP', + addressHelper: 'IP 주소 또는 IP 범위를 지원합니다.', + allow: '허용', + deny: '거부', + addressFormatError: '이 필드는 유효한 IP 주소여야 합니다.', + addressHelper1: "IP 주소 또는 IP 범위가 필요합니다. 예: '172.16.10.11' 또는 '172.16.10.0/24'.", + addressHelper2: "여러 IP 주소는 쉼표로 구분합니다. 예: '172.16.10.11, 172.16.0.0/24'.", + allIP: '모든 IP', + portRule: '규칙 | 규칙들', + createPortRule: '@:commons.button.create @.lower:firewall.portRule', + forwardRule: '포트 전달 규칙 | 포트 전달 규칙들', + createForwardRule: '@:commons.button.create @:firewall.forwardRule', + ipRule: 'IP 규칙 | IP 규칙들', + createIpRule: '@:commons.button.create @:firewall.ipRule', + userAgent: 'User-Agent 필터', + sourcePort: '소스 포트', + targetIP: '대상 IP', + targetPort: '대상 포트', + forwardHelper1: "로컬 포트로 전달하려면, 대상 IP 를 '127.0.0.1'로 설정해야 합니다.", + forwardHelper2: '대상 IP 를 비워두면 로컬 포트로 전달됩니다.', + forwardHelper3: 'IPv4 포트 전달만 지원됩니다.', + }, + runtime: { + runtime: '실행 환경', + image: '이미지', + workDir: '작업 디렉토리', + create: '실행 환경 생성', + resource: '소스', + appstore: '앱 스토어', + local: '로컬', + app: '애플리케이션', + localHelper: '로컬 운영 환경은 직접 설치해야 합니다.', + version: '버전', + versionHelper: 'PHP 버전, 예: v8.0', + buildHelper: + '확장 기능을 많이 선택하면 이미지 생성 과정에서 CPU 사용량이 증가합니다. 모든 확장 기능을 선택하지 않도록 주의하세요.', + openrestyWarn: 'PHP는 OpenResty 버전 1.21.4.1 이상으로 업그레이드해야 사용 가능합니다.', + toupgrade: '업그레이드하기', + edit: '실행 환경 수정', + extendHelper: + '필요한 확장 기능이 목록에 없으면 확장 이름을 수동으로 입력할 수 있습니다. 예: "sockets" 입력 후 첫 번째 항목 선택.', + rebuildHelper: '확장 기능을 수정한 후에는 PHP 애플리케이션을 재빌드해야 적용됩니다.', + rebuild: 'PHP 애플리케이션 재빌드', + source: 'PHP 확장 소스', + ustc: '중국과학기술대학', + netease: '네티이즈', + aliyun: '알리바바 클라우드', + default: '기본', + tsinghua: '칭화대학교', + xtomhk: 'XTOM 미러 사이트 (홍콩)', + xtom: 'XTOM 미러 사이트 (전 세계)', + phpsourceHelper: '네트워크 환경에 맞는 적절한 소스를 선택하세요.', + appPort: '앱 포트', + externalPort: '외부 포트', + packageManager: '패키지 관리자', + codeDir: '코드 디렉터리', + appPortHelper: '애플리케이션이 사용하는 포트.', + externalPortHelper: '외부에 노출된 포트.', + runScript: '실행 스크립트', + runScriptHelper: '시작 명령 목록은 소스 디렉터리의 package.json 파일에서 분석됩니다.', + open: '열기', + close: '닫기', + operatorHelper: '{0} 작업이 선택된 운영 환경에서 수행됩니다. 계속하시겠습니까?', + statusHelper: + '상태 설명: 시작 중 - 컨테이너가 시작되었으나 애플리케이션이 시작 중; 비정상 - 컨테이너가 시작되었으나 애플리케이션 상태가 비정상.', + taobao: '타오바오', + tencent: '텐센트', + imageSource: '이미지 소스', + moduleManager: '모듈 관리', + module: '모듈', + nodeOperatorHelper: + '{0} {1} 모듈인가요? 이 작업은 운영 환경에 비정상을 일으킬 수 있으므로 진행 전에 확인해 주세요.', + customScript: '사용자 정의 시작 명령', + customScriptHelper: '전체 시작 명령을 제공하세요. 예: "npm run start".', + portError: '포트를 중복 사용하지 마세요.', + systemRestartHelper: '상태 설명: 중단 - 시스템 재시작으로 인해 상태 가져오기가 실패했습니다.', + javaScriptHelper: '전체 시작 명령을 제공하세요. 예: "java -jar halo.jar -Xmx1024M -Xms256M".', + javaDirHelper: '디렉터리는 jar 파일을 포함해야 하며, 하위 디렉터리도 허용됩니다.', + goHelper: '전체 시작 명령을 제공하세요. 예: "go run main.go" 또는 "./main".', + goDirHelper: '디렉터리 또는 하위 디렉터리는 Go 또는 바이너리 파일을 포함해야 합니다.', + pythonHelper: + '전체 시작 명령을 제공하세요. 예: "pip install -r requirements.txt && python manage.py runserver 0.0.0.0:5000".', + dotnetHelper: '전체 시작 명령을 제공하세요. 예: "dotnet MyWebApp.dll".', + }, + process: { + pid: '프로세스 ID', + ppid: '부모 PID', + numThreads: '스레드', + memory: '메모리', + diskRead: '디스크 읽기', + diskWrite: '디스크 쓰기', + netSent: '업링크', + netRecv: '다운스트림', + numConnections: '연결', + startTime: '시작 시간', + status: '상태', + state: '상태', + running: '실행 중', + sleep: '대기 중', + stop: '중지', + idle: '유휴', + zombie: '좀비 프로세스', + wait: '대기', + lock: '잠금', + blocked: '차단됨', + cmdLine: '시작 명령', + basic: '기본', + mem: '메모리', + openFiles: '열린 파일', + file: '파일', + env: '환경 변수', + noenv: '없음', + net: '네트워크 연결', + laddr: '출발지 주소/포트', + raddr: '목적지 주소/포트', + stopProcess: '종료', + viewDetails: '세부 사항', + stopProcessWarn: '이 프로세스(PID:{0})를 종료하시겠습니까?', + processName: '프로세스 이름', + }, + tool: { + supervisor: { + loadStatusErr: '프로세스 상태를 가져오지 못했습니다. supervisor 서비스의 상태를 확인하세요.', + notSupport: `Supervisor 가 감지되지 않았습니다. 설치하려면 공식 문서를 참조하세요.`, + list: '데몬 프로세스 | 데몬 프로세스들', + config: 'Supervisor 설정', + primaryConfig: '주 설정 파일 위치', + notSupportCrl: `supervisorctl 이 감지되지 않았습니다. 설치하려면 공식 문서를 참조하세요.`, + user: '사용자', + command: '명령어', + dir: '디렉토리', + numprocs: '프로세스 수', + initWarn: + '이 작업은 주 설정 파일의 "[include]" 섹션에 있는 "files" 값을 수정합니다. 다른 설정 파일의 디렉토리는 "{1Panel 설치 디렉토리}/1panel/tools/supervisord/supervisor.d/"입니다.', + operatorHelper: '{1} 작업을 {0}에서 수행합니다. 계속하시겠습니까?', + uptime: '운영 시간', + notStartWarn: `Supervisor 가 시작되지 않았습니다. 먼저 시작하세요.`, + serviceName: '서비스 이름', + initHelper: `Supervisor 서비스가 초기화되지 않았습니다. "초기화"를 클릭하여 초기화하세요.`, + serviceNameHelper: 'systemctl 로 관리되는 Supervisor 서비스 이름, 보통 supervisor 또는 supervisord입니다.', + restartHelper: + '이 작업은 초기화 후 서비스를 재시작합니다. 이로 인해 기존의 모든 데몬 프로세스가 중지됩니다.', + msg: '메시지', + RUNNING: '실행 중', + STOPPED: '중지됨', + STOPPING: '중지 중', + STARTING: '시작 중', + FATAL: '시작 실패', + BACKOFF: '시작 예외', + ERROR: '오류', + statusCode: '상태 코드', + manage: '관리', + }, + }, + alert: { + isAlert: '알림', + alertCount: '알림 횟수', + clamHelper: '감염된 파일을 스캔할 때 SMS 알림 트리거', + cronJobHelper: '작업 실행 실패 시 SMS 알림 트리거', + licenseHelper: '전문 버전에서는 SMS 알림을 지원합니다.', + alertCountHelper: '최대 일일 알림 빈도', + }, +}; + +export default { + ...fit2cloudKoLocale, + ...message, + ...xpackKoLocale, +}; diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index 249b40f80..1c5dd8a02 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -1,9 +1,9 @@ -import fit2cloudEnLocale from 'fit2cloud-ui-plus/src/locale/lang/ms'; +import fit2cloudMsLocale from 'fit2cloud-ui-plus/src/locale/lang/ms'; -let xpackEnLocale = {}; +let xpackMsLocale = {}; const xpackModules = import.meta.glob('../../xpack/lang/ms.ts', { eager: true }); if (xpackModules['../../xpack/lang/ms.ts']) { - xpackEnLocale = xpackModules['../../xpack/lang/ms.ts']['default'] || {}; + xpackMsLocale = xpackModules['../../xpack/lang/ms.ts']['default'] || {}; } const message = { @@ -60,8 +60,8 @@ const message = { copy: 'Salin', random: 'Rawak', uninstall: 'Nyahpasang', - fullscreen: 'Masuk ke skrin penuh', - quitFullscreen: 'Keluar dari skrin penuh', + fullscreen: 'Skrin Penuh', + quitFullscreen: 'Keluar Skrin Penuh', update: 'Kemas kini', showAll: 'Tunjukkan Semua', hideSome: 'Sembunyikan Sebahagian', @@ -1966,7 +1966,7 @@ const message = { app: 'Aplikasi', appNew: 'Aplikasi Baru', appInstalled: 'Aplikasi yang Dipasang', - create: 'Cipta laman web', + create: 'Cipta', delete: 'Padam Laman Web', deleteApp: 'Padam Aplikasi', deleteBackup: 'Padam Sandaran', @@ -2551,7 +2551,7 @@ const message = { }; export default { - ...fit2cloudEnLocale, + ...fit2cloudMsLocale, ...message, - ...xpackEnLocale, + ...xpackMsLocale, }; diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index 48acbee33..231b3efef 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -60,7 +60,7 @@ const message = { copy: 'Copiar', random: 'Aleatório', uninstall: 'Desinstalar', - fullscreen: 'Entrar em tela cheia', + fullscreen: 'Tela Cheia', quitFullscreen: 'Sair da tela cheia', update: 'Editar', showAll: 'Exibir tudo', @@ -1957,7 +1957,7 @@ const message = { app: 'Aplicativo', appNew: 'Novo Aplicativo', appInstalled: 'Aplicativo instalado', - create: 'Criar site', + create: 'Criar', delete: 'Excluir site', deleteApp: 'Excluir Aplicativo', deleteBackup: 'Excluir Backup', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index 0dd363af7..ed2b7981d 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -1,9 +1,9 @@ -import fit2cloudEnLocale from 'fit2cloud-ui-plus/src/locale/lang/ru'; +import fit2cloudRuLocale from 'fit2cloud-ui-plus/src/locale/lang/ru'; -let xpackEnLocale = {}; +let xpackRuLocale = {}; const xpackModules = import.meta.glob('../../xpack/lang/ru.ts', { eager: true }); if (xpackModules['../../xpack/lang/ru.ts']) { - xpackEnLocale = xpackModules['../../xpack/lang/ru.ts']['default'] || {}; + xpackRuLocale = xpackModules['../../xpack/lang/ru.ts']['default'] || {}; } const message = { @@ -1957,7 +1957,7 @@ const message = { app: 'Приложение', appNew: 'Новое приложение', appInstalled: 'Установленное приложение', - create: 'Создать веб-сайт', + create: 'Создать', delete: 'Удалить веб-сайт', deleteApp: 'Удалить приложение', deleteBackup: 'Удалить резервную копию', @@ -2542,7 +2542,7 @@ const message = { }; export default { - ...fit2cloudEnLocale, + ...fit2cloudRuLocale, ...message, - ...xpackEnLocale, + ...xpackRuLocale, }; diff --git a/frontend/src/lang/modules/tw.ts b/frontend/src/lang/modules/tw.ts index 7bfc6c153..87790eeb5 100644 --- a/frontend/src/lang/modules/tw.ts +++ b/frontend/src/lang/modules/tw.ts @@ -59,8 +59,8 @@ const message = { copy: '複製', random: '隨機密碼', uninstall: '移除', - fullscreen: '網頁全螢幕', - quitFullscreen: '退出網頁全螢幕', + fullscreen: '全螢幕', + quitFullscreen: '退出全螢幕', update: '編輯', showAll: '顯示所有', hideSome: '隱藏部分', @@ -1815,7 +1815,7 @@ const message = { app: '應用', appNew: '新裝應用', appInstalled: '已裝應用', - create: '建立網站', + create: '建立', delete: '刪除網站', deleteApp: '刪除應用', deleteBackup: '刪除備份', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index b2b96da59..165944bce 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -59,8 +59,8 @@ const message = { copy: '复制', random: '随机密码', uninstall: '卸载', - fullscreen: '网页全屏', - quitFullscreen: '退出网页全屏', + fullscreen: '全屏', + quitFullscreen: '退出全屏', update: '编辑', showAll: '显示所有', hideSome: '隐藏部分', @@ -1815,7 +1815,7 @@ const message = { app: '应用', appNew: '新装应用', appInstalled: '已装应用', - create: '创建网站', + create: '创建', delete: '删除网站', deleteApp: '删除应用', deleteBackup: '删除备份', diff --git a/frontend/src/views/login/components/login-form.vue b/frontend/src/views/login/components/login-form.vue index 1b40a6487..e24f4524c 100644 --- a/frontend/src/views/login/components/login-form.vue +++ b/frontend/src/views/login/components/login-form.vue @@ -62,6 +62,7 @@ 日本語 Português (Brasil) + 한국어 Русский Bahasa Melayu @@ -278,6 +279,8 @@ function handleCommand(command: string) { dropdownText.value = 'Português (Brasil)'; } else if (command === 'tw') { dropdownText.value = '中文(繁體)'; + } else if (command === 'ko') { + dropdownText.value = '한국어'; } else if (command === 'ja') { dropdownText.value = '日本語'; } else if (command === 'ru') { diff --git a/frontend/src/views/setting/panel/index.vue b/frontend/src/views/setting/panel/index.vue index 9ee325cd4..b32be6209 100644 --- a/frontend/src/views/setting/panel/index.vue +++ b/frontend/src/views/setting/panel/index.vue @@ -324,6 +324,7 @@ const languageOptions = ref([ ...(!globalStore.isIntl ? [{ value: 'en', label: 'English' }] : []), { value: 'ja', label: '日本語' }, { value: 'pt-BR', label: 'Português (Brasil)' }, + { value: 'ko', label: '한국어' }, { value: 'ru', label: 'Русский' }, { value: 'ms', label: 'Bahasa Melayu' }, ]);