mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-01-18 15:59:16 +08:00
parent
7bc45f2d77
commit
9052386c83
@ -29,7 +29,7 @@ type Login struct {
|
|||||||
Captcha string `json:"captcha"`
|
Captcha string `json:"captcha"`
|
||||||
CaptchaID string `json:"captchaID"`
|
CaptchaID string `json:"captchaID"`
|
||||||
AuthMethod string `json:"authMethod" validate:"required,oneof=jwt session"`
|
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 {
|
type MFALogin struct {
|
||||||
|
@ -104,6 +104,7 @@ func Init() {
|
|||||||
_, _ = bundle.LoadMessageFileFS(fs, "lang/ja.yaml")
|
_, _ = bundle.LoadMessageFileFS(fs, "lang/ja.yaml")
|
||||||
_, _ = bundle.LoadMessageFileFS(fs, "lang/ru.yaml")
|
_, _ = bundle.LoadMessageFileFS(fs, "lang/ru.yaml")
|
||||||
_, _ = bundle.LoadMessageFileFS(fs, "lang/ms.yaml")
|
_, _ = bundle.LoadMessageFileFS(fs, "lang/ms.yaml")
|
||||||
|
_, _ = bundle.LoadMessageFileFS(fs, "lang/ko.yaml")
|
||||||
}
|
}
|
||||||
|
|
||||||
func UseI18nForCmd(lang string) {
|
func UseI18nForCmd(lang string) {
|
||||||
|
286
backend/i18n/lang/ko.yaml
Normal file
286
backend/i18n/lang/ko.yaml
Normal file
@ -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: "모드: "
|
@ -14,6 +14,7 @@ import ja from 'element-plus/es/locale/lang/ja';
|
|||||||
import ms from 'element-plus/es/locale/lang/ms';
|
import ms from 'element-plus/es/locale/lang/ms';
|
||||||
import ptBR from 'element-plus/es/locale/lang/pt-br';
|
import ptBR from 'element-plus/es/locale/lang/pt-br';
|
||||||
import ru from 'element-plus/es/locale/lang/ru';
|
import ru from 'element-plus/es/locale/lang/ru';
|
||||||
|
import ko from 'element-plus/es/locale/lang/ko';
|
||||||
import { useTheme } from '@/hooks/use-theme';
|
import { useTheme } from '@/hooks/use-theme';
|
||||||
useTheme();
|
useTheme();
|
||||||
|
|
||||||
@ -30,6 +31,7 @@ const i18nLocale = computed(() => {
|
|||||||
if (globalStore.language === 'ms') return ms;
|
if (globalStore.language === 'ms') return ms;
|
||||||
if (globalStore.language === 'ru') return ru;
|
if (globalStore.language === 'ru') return ru;
|
||||||
if (globalStore.language === 'pt-br') return ptBR;
|
if (globalStore.language === 'pt-br') return ptBR;
|
||||||
|
if (globalStore.language === 'ko') return ko;
|
||||||
return zhCn;
|
return zhCn;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -43,5 +45,3 @@ const reload = () => {
|
|||||||
};
|
};
|
||||||
provide('reload', reload);
|
provide('reload', reload);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss"></style>
|
|
||||||
|
@ -6,6 +6,7 @@ import ptBr from './modules/pt-br';
|
|||||||
import ja from './modules/ja';
|
import ja from './modules/ja';
|
||||||
import ru from './modules/ru';
|
import ru from './modules/ru';
|
||||||
import ms from './modules/ms';
|
import ms from './modules/ms';
|
||||||
|
import ko from './modules/ko';
|
||||||
|
|
||||||
const i18n = createI18n({
|
const i18n = createI18n({
|
||||||
legacy: false,
|
legacy: false,
|
||||||
@ -20,6 +21,7 @@ const i18n = createI18n({
|
|||||||
ja,
|
ja,
|
||||||
ru,
|
ru,
|
||||||
ms,
|
ms,
|
||||||
|
ko,
|
||||||
},
|
},
|
||||||
warnHtmlMessage: false,
|
warnHtmlMessage: false,
|
||||||
});
|
});
|
||||||
|
@ -60,7 +60,7 @@ const message = {
|
|||||||
copy: 'Copy',
|
copy: 'Copy',
|
||||||
random: 'Random',
|
random: 'Random',
|
||||||
uninstall: 'Uninstall',
|
uninstall: 'Uninstall',
|
||||||
fullscreen: 'Enter fullscreen',
|
fullscreen: 'Fullscreen',
|
||||||
quitFullscreen: 'Exit fullscreen',
|
quitFullscreen: 'Exit fullscreen',
|
||||||
update: 'Edit',
|
update: 'Edit',
|
||||||
showAll: 'Show All',
|
showAll: 'Show All',
|
||||||
@ -1942,7 +1942,7 @@ const message = {
|
|||||||
app: 'Application',
|
app: 'Application',
|
||||||
appNew: 'New Application',
|
appNew: 'New Application',
|
||||||
appInstalled: 'Installed application',
|
appInstalled: 'Installed application',
|
||||||
create: 'Create website',
|
create: 'Create',
|
||||||
delete: 'Delete Website',
|
delete: 'Delete Website',
|
||||||
deleteApp: 'Delete Application',
|
deleteApp: 'Delete Application',
|
||||||
deleteBackup: 'Delete Backup',
|
deleteBackup: 'Delete Backup',
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import fit2cloudEnLocale from 'fit2cloud-ui-plus/src/locale/lang/ja';
|
import fit2cloudJaLocale from 'fit2cloud-ui-plus/src/locale/lang/ja';
|
||||||
let xpackJpLocale = {};
|
let xpackJaLocale = {};
|
||||||
const xpackModules = import.meta.glob('../../xpack/lang/ja.ts', { eager: true });
|
const xpackModules = import.meta.glob('../../xpack/lang/ja.ts', { eager: true });
|
||||||
if (xpackModules['../../xpack/lang/ja.ts']) {
|
if (xpackModules['../../xpack/lang/ja.ts']) {
|
||||||
xpackJpLocale = xpackModules['../../xpack/lang/ja.ts']['default'] || {};
|
xpackJaLocale = xpackModules['../../xpack/lang/ja.ts']['default'] || {};
|
||||||
}
|
}
|
||||||
|
|
||||||
const message = {
|
const message = {
|
||||||
@ -59,8 +59,8 @@ const message = {
|
|||||||
copy: 'コピー',
|
copy: 'コピー',
|
||||||
random: 'ランダム',
|
random: 'ランダム',
|
||||||
uninstall: 'アンインストール',
|
uninstall: 'アンインストール',
|
||||||
fullscreen: 'フルスクリーンを入力します',
|
fullscreen: 'フルスクリーン',
|
||||||
quitFullscreen: 'フルスクリーンを終了します',
|
quitFullscreen: 'フルスクリーンを終了',
|
||||||
update: '編集',
|
update: '編集',
|
||||||
showAll: 'すべてを表示します',
|
showAll: 'すべてを表示します',
|
||||||
hideSome: 'いくつかを隠します',
|
hideSome: 'いくつかを隠します',
|
||||||
@ -1915,7 +1915,7 @@ const message = {
|
|||||||
app: '応用',
|
app: '応用',
|
||||||
appNew: '新しいアプリケーション',
|
appNew: '新しいアプリケーション',
|
||||||
appInstalled: 'インストールされたアプリケーション',
|
appInstalled: 'インストールされたアプリケーション',
|
||||||
create: 'Webサイトを作成します',
|
create: '作成する',
|
||||||
delete: 'Webサイトを削除します',
|
delete: 'Webサイトを削除します',
|
||||||
deleteApp: 'アプリケーションを削除します',
|
deleteApp: 'アプリケーションを削除します',
|
||||||
deleteBackup: 'バックアップを削除します',
|
deleteBackup: 'バックアップを削除します',
|
||||||
@ -2490,7 +2490,7 @@ const message = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
export default {
|
export default {
|
||||||
...fit2cloudEnLocale,
|
...fit2cloudJaLocale,
|
||||||
...message,
|
...message,
|
||||||
...xpackJpLocale,
|
...xpackJaLocale,
|
||||||
};
|
};
|
||||||
|
2460
frontend/src/lang/modules/ko.ts
Normal file
2460
frontend/src/lang/modules/ko.ts
Normal file
File diff suppressed because it is too large
Load Diff
@ -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 });
|
const xpackModules = import.meta.glob('../../xpack/lang/ms.ts', { eager: true });
|
||||||
if (xpackModules['../../xpack/lang/ms.ts']) {
|
if (xpackModules['../../xpack/lang/ms.ts']) {
|
||||||
xpackEnLocale = xpackModules['../../xpack/lang/ms.ts']['default'] || {};
|
xpackMsLocale = xpackModules['../../xpack/lang/ms.ts']['default'] || {};
|
||||||
}
|
}
|
||||||
|
|
||||||
const message = {
|
const message = {
|
||||||
@ -60,8 +60,8 @@ const message = {
|
|||||||
copy: 'Salin',
|
copy: 'Salin',
|
||||||
random: 'Rawak',
|
random: 'Rawak',
|
||||||
uninstall: 'Nyahpasang',
|
uninstall: 'Nyahpasang',
|
||||||
fullscreen: 'Masuk ke skrin penuh',
|
fullscreen: 'Skrin Penuh',
|
||||||
quitFullscreen: 'Keluar dari skrin penuh',
|
quitFullscreen: 'Keluar Skrin Penuh',
|
||||||
update: 'Kemas kini',
|
update: 'Kemas kini',
|
||||||
showAll: 'Tunjukkan Semua',
|
showAll: 'Tunjukkan Semua',
|
||||||
hideSome: 'Sembunyikan Sebahagian',
|
hideSome: 'Sembunyikan Sebahagian',
|
||||||
@ -1966,7 +1966,7 @@ const message = {
|
|||||||
app: 'Aplikasi',
|
app: 'Aplikasi',
|
||||||
appNew: 'Aplikasi Baru',
|
appNew: 'Aplikasi Baru',
|
||||||
appInstalled: 'Aplikasi yang Dipasang',
|
appInstalled: 'Aplikasi yang Dipasang',
|
||||||
create: 'Cipta laman web',
|
create: 'Cipta',
|
||||||
delete: 'Padam Laman Web',
|
delete: 'Padam Laman Web',
|
||||||
deleteApp: 'Padam Aplikasi',
|
deleteApp: 'Padam Aplikasi',
|
||||||
deleteBackup: 'Padam Sandaran',
|
deleteBackup: 'Padam Sandaran',
|
||||||
@ -2551,7 +2551,7 @@ const message = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
...fit2cloudEnLocale,
|
...fit2cloudMsLocale,
|
||||||
...message,
|
...message,
|
||||||
...xpackEnLocale,
|
...xpackMsLocale,
|
||||||
};
|
};
|
||||||
|
@ -60,7 +60,7 @@ const message = {
|
|||||||
copy: 'Copiar',
|
copy: 'Copiar',
|
||||||
random: 'Aleatório',
|
random: 'Aleatório',
|
||||||
uninstall: 'Desinstalar',
|
uninstall: 'Desinstalar',
|
||||||
fullscreen: 'Entrar em tela cheia',
|
fullscreen: 'Tela Cheia',
|
||||||
quitFullscreen: 'Sair da tela cheia',
|
quitFullscreen: 'Sair da tela cheia',
|
||||||
update: 'Editar',
|
update: 'Editar',
|
||||||
showAll: 'Exibir tudo',
|
showAll: 'Exibir tudo',
|
||||||
@ -1957,7 +1957,7 @@ const message = {
|
|||||||
app: 'Aplicativo',
|
app: 'Aplicativo',
|
||||||
appNew: 'Novo Aplicativo',
|
appNew: 'Novo Aplicativo',
|
||||||
appInstalled: 'Aplicativo instalado',
|
appInstalled: 'Aplicativo instalado',
|
||||||
create: 'Criar site',
|
create: 'Criar',
|
||||||
delete: 'Excluir site',
|
delete: 'Excluir site',
|
||||||
deleteApp: 'Excluir Aplicativo',
|
deleteApp: 'Excluir Aplicativo',
|
||||||
deleteBackup: 'Excluir Backup',
|
deleteBackup: 'Excluir Backup',
|
||||||
|
@ -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 });
|
const xpackModules = import.meta.glob('../../xpack/lang/ru.ts', { eager: true });
|
||||||
if (xpackModules['../../xpack/lang/ru.ts']) {
|
if (xpackModules['../../xpack/lang/ru.ts']) {
|
||||||
xpackEnLocale = xpackModules['../../xpack/lang/ru.ts']['default'] || {};
|
xpackRuLocale = xpackModules['../../xpack/lang/ru.ts']['default'] || {};
|
||||||
}
|
}
|
||||||
|
|
||||||
const message = {
|
const message = {
|
||||||
@ -1957,7 +1957,7 @@ const message = {
|
|||||||
app: 'Приложение',
|
app: 'Приложение',
|
||||||
appNew: 'Новое приложение',
|
appNew: 'Новое приложение',
|
||||||
appInstalled: 'Установленное приложение',
|
appInstalled: 'Установленное приложение',
|
||||||
create: 'Создать веб-сайт',
|
create: 'Создать',
|
||||||
delete: 'Удалить веб-сайт',
|
delete: 'Удалить веб-сайт',
|
||||||
deleteApp: 'Удалить приложение',
|
deleteApp: 'Удалить приложение',
|
||||||
deleteBackup: 'Удалить резервную копию',
|
deleteBackup: 'Удалить резервную копию',
|
||||||
@ -2542,7 +2542,7 @@ const message = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
...fit2cloudEnLocale,
|
...fit2cloudRuLocale,
|
||||||
...message,
|
...message,
|
||||||
...xpackEnLocale,
|
...xpackRuLocale,
|
||||||
};
|
};
|
||||||
|
@ -59,8 +59,8 @@ const message = {
|
|||||||
copy: '複製',
|
copy: '複製',
|
||||||
random: '隨機密碼',
|
random: '隨機密碼',
|
||||||
uninstall: '移除',
|
uninstall: '移除',
|
||||||
fullscreen: '網頁全螢幕',
|
fullscreen: '全螢幕',
|
||||||
quitFullscreen: '退出網頁全螢幕',
|
quitFullscreen: '退出全螢幕',
|
||||||
update: '編輯',
|
update: '編輯',
|
||||||
showAll: '顯示所有',
|
showAll: '顯示所有',
|
||||||
hideSome: '隱藏部分',
|
hideSome: '隱藏部分',
|
||||||
@ -1815,7 +1815,7 @@ const message = {
|
|||||||
app: '應用',
|
app: '應用',
|
||||||
appNew: '新裝應用',
|
appNew: '新裝應用',
|
||||||
appInstalled: '已裝應用',
|
appInstalled: '已裝應用',
|
||||||
create: '建立網站',
|
create: '建立',
|
||||||
delete: '刪除網站',
|
delete: '刪除網站',
|
||||||
deleteApp: '刪除應用',
|
deleteApp: '刪除應用',
|
||||||
deleteBackup: '刪除備份',
|
deleteBackup: '刪除備份',
|
||||||
|
@ -59,8 +59,8 @@ const message = {
|
|||||||
copy: '复制',
|
copy: '复制',
|
||||||
random: '随机密码',
|
random: '随机密码',
|
||||||
uninstall: '卸载',
|
uninstall: '卸载',
|
||||||
fullscreen: '网页全屏',
|
fullscreen: '全屏',
|
||||||
quitFullscreen: '退出网页全屏',
|
quitFullscreen: '退出全屏',
|
||||||
update: '编辑',
|
update: '编辑',
|
||||||
showAll: '显示所有',
|
showAll: '显示所有',
|
||||||
hideSome: '隐藏部分',
|
hideSome: '隐藏部分',
|
||||||
@ -1815,7 +1815,7 @@ const message = {
|
|||||||
app: '应用',
|
app: '应用',
|
||||||
appNew: '新装应用',
|
appNew: '新装应用',
|
||||||
appInstalled: '已装应用',
|
appInstalled: '已装应用',
|
||||||
create: '创建网站',
|
create: '创建',
|
||||||
delete: '删除网站',
|
delete: '删除网站',
|
||||||
deleteApp: '删除应用',
|
deleteApp: '删除应用',
|
||||||
deleteBackup: '删除备份',
|
deleteBackup: '删除备份',
|
||||||
|
@ -62,6 +62,7 @@
|
|||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item command="ja">日本語</el-dropdown-item>
|
<el-dropdown-item command="ja">日本語</el-dropdown-item>
|
||||||
<el-dropdown-item command="pt-BR">Português (Brasil)</el-dropdown-item>
|
<el-dropdown-item command="pt-BR">Português (Brasil)</el-dropdown-item>
|
||||||
|
<el-dropdown-item command="ko">한국어</el-dropdown-item>
|
||||||
<el-dropdown-item command="ru">Русский</el-dropdown-item>
|
<el-dropdown-item command="ru">Русский</el-dropdown-item>
|
||||||
<el-dropdown-item command="ms">Bahasa Melayu</el-dropdown-item>
|
<el-dropdown-item command="ms">Bahasa Melayu</el-dropdown-item>
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
@ -278,6 +279,8 @@ function handleCommand(command: string) {
|
|||||||
dropdownText.value = 'Português (Brasil)';
|
dropdownText.value = 'Português (Brasil)';
|
||||||
} else if (command === 'tw') {
|
} else if (command === 'tw') {
|
||||||
dropdownText.value = '中文(繁體)';
|
dropdownText.value = '中文(繁體)';
|
||||||
|
} else if (command === 'ko') {
|
||||||
|
dropdownText.value = '한국어';
|
||||||
} else if (command === 'ja') {
|
} else if (command === 'ja') {
|
||||||
dropdownText.value = '日本語';
|
dropdownText.value = '日本語';
|
||||||
} else if (command === 'ru') {
|
} else if (command === 'ru') {
|
||||||
|
@ -324,6 +324,7 @@ const languageOptions = ref([
|
|||||||
...(!globalStore.isIntl ? [{ value: 'en', label: 'English' }] : []),
|
...(!globalStore.isIntl ? [{ value: 'en', label: 'English' }] : []),
|
||||||
{ value: 'ja', label: '日本語' },
|
{ value: 'ja', label: '日本語' },
|
||||||
{ value: 'pt-BR', label: 'Português (Brasil)' },
|
{ value: 'pt-BR', label: 'Português (Brasil)' },
|
||||||
|
{ value: 'ko', label: '한국어' },
|
||||||
{ value: 'ru', label: 'Русский' },
|
{ value: 'ru', label: 'Русский' },
|
||||||
{ value: 'ms', label: 'Bahasa Melayu' },
|
{ value: 'ms', label: 'Bahasa Melayu' },
|
||||||
]);
|
]);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user