diff --git a/frontend/src/App.vue b/frontend/src/App.vue index a874323..6e1aa81 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -51,6 +51,8 @@ const languageFlag = computed(() => { pt: "pt", uk: "ua", zh: "cn", + ko: "kr", + }; return "fi-" + (langMap[lang] || lang); }) @@ -122,11 +124,13 @@ const currentYear = ref(new Date().getFullYear()) Deutsch English Français - Português + 한국어 + Português Русский Українська Tiếng Việt 中文 + diff --git a/frontend/src/lang/index.js b/frontend/src/lang/index.js index f95d54f..ba3922e 100644 --- a/frontend/src/lang/index.js +++ b/frontend/src/lang/index.js @@ -2,11 +2,13 @@ import de from './translations/de.json'; import en from './translations/en.json'; import fr from './translations/fr.json'; +import ko from './translations/ko.json'; import pt from './translations/pt.json'; import ru from './translations/ru.json'; import uk from './translations/uk.json'; import vi from './translations/vi.json'; import zh from './translations/zh.json'; + import {createI18n} from "vue-i18n"; // Create i18n instance with options @@ -24,6 +26,7 @@ const i18n = createI18n({ "de": de, "en": en, "fr": fr, + "ko": ko, "pt": pt, "ru": ru, "uk": uk, diff --git a/frontend/src/lang/translations/ko.json b/frontend/src/lang/translations/ko.json new file mode 100644 index 0000000..8b87d1b --- /dev/null +++ b/frontend/src/lang/translations/ko.json @@ -0,0 +1,532 @@ +{ + "languages": { + "ko": "한국어" + }, + "general": { + "pagination": { + "size": "항목 수", + "all": "전체 (느림)" + }, + "search": { + "placeholder": "검색...", + "button": "검색" + }, + "select-all": "모두 선택", + "yes": "예", + "no": "아니오", + "cancel": "취소", + "close": "닫기", + "save": "저장", + "delete": "삭제" + }, + "login": { + "headline": "로그인하세요", + "username": { + "label": "사용자 이름", + "placeholder": "사용자 이름을 입력하세요" + }, + "password": { + "label": "비밀번호", + "placeholder": "비밀번호를 입력하세요" + }, + "button": "로그인" + }, + "menu": { + "home": "홈", + "interfaces": "인터페이스", + "users": "사용자", + "lang": "언어 변경", + "profile": "내 프로필", + "settings": "설정", + "audit": "감사 로그", + "login": "로그인", + "logout": "로그아웃" + }, + "home": { + "headline": "WireGuard® VPN 포털", + "info-headline": "추가 정보", + "abstract": "WireGuard®는 암호화 기술을 활용하는 매우 간단하면서도 빠르고 현대적인 VPN입니다. IPsec보다 빠르고, 간단하며, 가볍고, 더 유용하면서도 엄청난 골칫거리를 피하는 것을 목표로 합니다. OpenVPN보다 훨씬 더 성능이 뛰어날 것으로 예상됩니다.", + "installation": { + "box-header": "WireGuard 설치", + "headline": "설치", + "content": "클라이언트 소프트웨어 설치 지침은 공식 WireGuard 웹사이트에서 찾을 수 있습니다.", + "button": "지침 열기" + }, + "about-wg": { + "box-header": "WireGuard 정보", + "headline": "정보", + "content": "WireGuard®는 암호화 기술을 활용하는 매우 간단하면서도 빠르고 현대적인 VPN입니다.", + "button": "더 보기" + }, + "about-portal": { + "box-header": "WireGuard 포털 정보", + "headline": "WireGuard 포털", + "content": "WireGuard 포털은 WireGuard를 위한 간단한 웹 기반 구성 포털입니다.", + "button": "더 보기" + }, + "profiles": { + "headline": "VPN 프로필", + "abstract": "사용자 프로필을 통해 개인 VPN 구성에 액세스하고 다운로드할 수 있습니다.", + "content": "구성된 모든 프로필을 찾으려면 아래 버튼을 클릭하세요.", + "button": "내 프로필 열기" + }, + "admin": { + "headline": "관리 영역", + "abstract": "관리 영역에서는 WireGuard 피어 및 서버 인터페이스뿐만 아니라 WireGuard 포털에 로그인할 수 있는 사용자도 관리할 수 있습니다.", + "content": "", + "button-admin": "서버 관리 열기", + "button-user": "사용자 관리 열기" + } + }, + "interfaces": { + "headline": "인터페이스 관리", + "headline-peers": "현재 VPN 피어", + "headline-endpoints": "현재 엔드포인트", + "no-interface": { + "default-selection": "사용 가능한 인터페이스 없음", + "headline": "인터페이스를 찾을 수 없습니다...", + "abstract": "새 WireGuard 인터페이스를 만들려면 위의 플러스 버튼을 클릭하세요." + }, + "no-peer": { + "headline": "사용 가능한 피어 없음", + "abstract": "현재 선택한 WireGuard 인터페이스에 사용 가능한 피어가 없습니다." + }, + "table-heading": { + "name": "이름", + "user": "사용자", + "ip": "IP 주소", + "endpoint": "엔드포인트", + "status": "상태" + }, + "interface": { + "headline": "인터페이스 상태:", + "mode": "모드", + "key": "공개 키", + "endpoint": "공개 엔드포인트", + "port": "수신 포트", + "peers": "활성화된 피어", + "total-peers": "총 피어 수", + "endpoints": "활성화된 엔드포인트", + "total-endpoints": "총 엔드포인트 수", + "ip": "IP 주소", + "default-allowed-ip": "기본 허용 IP", + "dns": "DNS 서버", + "mtu": "MTU", + "default-keep-alive": "기본 Keepalive 간격", + "button-show-config": "구성 보기", + "button-download-config": "구성 다운로드", + "button-store-config": "wg-quick용 구성 저장", + "button-edit": "인터페이스 편집" + }, + "button-add-interface": "인터페이스 추가", + "button-add-peer": "피어 추가", + "button-add-peers": "여러 피어 추가", + "button-show-peer": "피어 보기", + "button-edit-peer": "피어 편집", + "peer-disabled": "피어가 비활성화됨, 이유:", + "peer-expiring": "피어 만료 예정:", + "peer-connected": "연결됨", + "peer-not-connected": "연결되지 않음", + "peer-handshake": "마지막 핸드셰이크:" + }, + "users": { + "headline": "사용자 관리", + "table-heading": { + "id": "ID", + "email": "이메일", + "firstname": "이름", + "lastname": "성", + "source": "소스", + "peers": "피어", + "admin": "관리자" + }, + "no-user": { + "headline": "사용 가능한 사용자 없음", + "abstract": "현재 WireGuard 포털에 등록된 사용자가 없습니다." + }, + "button-add-user": "사용자 추가", + "button-show-user": "사용자 보기", + "button-edit-user": "사용자 편집", + "user-disabled": "사용자가 비활성화됨, 이유:", + "user-locked": "계정이 잠김, 이유:", + "admin": "사용자에게 관리자 권한이 있습니다", + "no-admin": "사용자에게 관리자 권한이 없습니다" + }, + "profile": { + "headline": "내 VPN 피어", + "table-heading": { + "name": "이름", + "ip": "IP 주소", + "stats": "상태", + "interface": "서버 인터페이스" + }, + "no-peer": { + "headline": "사용 가능한 피어 없음", + "abstract": "현재 사용자 프로필과 연결된 피어가 없습니다." + }, + "peer-connected": "연결됨", + "button-add-peer": "피어 추가", + "button-show-peer": "피어 보기", + "button-edit-peer": "피어 편집" + }, + "settings": { + "headline": "설정", + "abstract": "여기에서 개인 설정을 변경할 수 있습니다.", + "api": { + "headline": "API 설정", + "abstract": "여기에서 RESTful API 설정을 구성할 수 있습니다.", + "active-description": "현재 사용자 계정에 대해 API가 활성화되어 있습니다. 모든 API 요청은 기본 인증(Basic Auth)으로 인증됩니다. 인증에 다음 자격 증명을 사용하세요.", + "inactive-description": "현재 API가 비활성화되어 있습니다. 활성화하려면 아래 버튼을 누르세요.", + "user-label": "API 사용자 이름:", + "user-placeholder": "API 사용자", + "token-label": "API 비밀번호:", + "token-placeholder": "API 토큰", + "token-created-label": "API 액세스 권한 부여 시각: ", + "button-disable-title": "API를 비활성화합니다. 현재 토큰이 무효화됩니다.", + "button-disable-text": "API 비활성화", + "button-enable-title": "API를 활성화합니다. 새 토큰이 생성됩니다.", + "button-enable-text": "API 활성화", + "api-link": "API 문서" + } + }, + "audit": { + "headline": "감사 로그", + "abstract": "여기에서 WireGuard 포털에서 수행된 모든 작업의 감사 로그를 찾을 수 있습니다.", + "no-entries": { + "headline": "로그 항목 없음", + "abstract": "현재 기록된 감사 로그가 없습니다." + }, + "entries-headline": "로그 항목", + "table-heading": { + "id": "#", + "time": "시간", + "user": "사용자", + "severity": "심각도", + "origin": "출처", + "message": "메시지" + } + }, + "modals": { + "user-view": { + "headline": "사용자 계정:", + "tab-user": "정보", + "tab-peers": "피어", + "headline-info": "사용자 정보:", + "headline-notes": "메모:", + "email": "이메일", + "firstname": "이름", + "lastname": "성", + "phone": "전화번호", + "department": "부서", + "api-enabled": "API 액세스", + "disabled": "계정 비활성화됨", + "locked": "계정 잠김", + "no-peers": "사용자에게 연결된 피어가 없습니다.", + "peers": { + "name": "이름", + "interface": "인터페이스", + "ip": "IP 주소" + } + }, + "user-edit": { + "headline-edit": "사용자 편집:", + "headline-new": "새 사용자", + "header-general": "일반", + "header-personal": "사용자 정보", + "header-notes": "메모", + "header-state": "상태", + "identifier": { + "label": "식별자", + "placeholder": "고유한 사용자 식별자" + }, + "source": { + "label": "소스", + "placeholder": "사용자 소스" + }, + "password": { + "label": "비밀번호", + "placeholder": "매우 비밀스러운 비밀번호", + "description": "현재 비밀번호를 유지하려면 이 필드를 비워 두세요." + }, + "email": { + "label": "이메일", + "placeholder": "이메일 주소" + }, + "phone": { + "label": "전화번호", + "placeholder": "전화번호" + }, + "department": { + "label": "부서", + "placeholder": "부서" + }, + "firstname": { + "label": "이름", + "placeholder": "이름" + }, + "lastname": { + "label": "성", + "placeholder": "성" + }, + "notes": { + "label": "메모", + "placeholder": "" + }, + "disabled": { + "label": "비활성화됨 (WireGuard 연결 및 로그인 불가)" + }, + "locked": { + "label": "잠김 (로그인 불가, WireGuard 연결은 계속 작동)" + }, + "admin": { + "label": "관리자 여부" + } + }, + "interface-view": { + "headline": "인터페이스 구성:" + }, + "interface-edit": { + "headline-edit": "인터페이스 편집:", + "headline-new": "새 인터페이스", + "tab-interface": "인터페이스", + "tab-peerdef": "피어 기본값", + "header-general": "일반", + "header-network": "네트워크", + "header-crypto": "암호화", + "header-hooks": "인터페이스 후크", + "header-peer-hooks": "후크", + "header-state": "상태", + "identifier": { + "label": "식별자", + "placeholder": "고유한 인터페이스 식별자" + }, + "mode": { + "label": "인터페이스 모드", + "server": "서버 모드", + "client": "클라이언트 모드", + "any": "알 수 없는 모드" + }, + "display-name": { + "label": "표시 이름", + "placeholder": "인터페이스에 대한 설명적인 이름" + }, + "private-key": { + "label": "개인 키", + "placeholder": "개인 키" + }, + "public-key": { + "label": "공개 키", + "placeholder": "공개 키" + }, + "ip": { + "label": "IP 주소", + "placeholder": "IP 주소 (CIDR 형식)" + }, + "listen-port": { + "label": "수신 포트", + "placeholder": "수신 포트" + }, + "dns": { + "label": "DNS 서버", + "placeholder": "사용해야 하는 DNS 서버" + }, + "dns-search": { + "label": "DNS 검색 도메인", + "placeholder": "DNS 검색 접두사" + }, + "mtu": { + "label": "MTU", + "placeholder": "인터페이스 MTU (0 = 기본값 유지)" + }, + "firewall-mark": { + "label": "방화벽 표시", + "placeholder": "나가는 트래픽에 적용되는 방화벽 표시. (0 = 자동)" + }, + "routing-table": { + "label": "라우팅 테이블", + "placeholder": "라우팅 테이블 ID", + "description": "특수 사례: off = 경로 관리 안 함, 0 = 자동" + }, + "pre-up": { + "label": "Pre-Up", + "placeholder": "하나 이상의 bash 명령 (;으로 구분)" + }, + "post-up": { + "label": "Post-Up", + "placeholder": "하나 이상의 bash 명령 (;으로 구분)" + }, + "pre-down": { + "label": "Pre-Down", + "placeholder": "하나 이상의 bash 명령 (;으로 구분)" + }, + "post-down": { + "label": "Post-Down", + "placeholder": "하나 이상의 bash 명령 (;으로 구분)" + }, + "disabled": { + "label": "인터페이스 비활성화됨" + }, + "save-config": { + "label": "wg-quick 구성 자동 저장" + }, + "defaults": { + "endpoint": { + "label": "엔드포인트 주소", + "placeholder": "엔드포인트 주소", + "description": "피어가 연결할 엔드포인트 주소. (예: wg.example.com 또는 wg.example.com:51820)" + }, + "networks": { + "label": "IP 네트워크", + "placeholder": "네트워크 주소", + "description": "피어는 해당 서브넷에서 IP 주소를 받습니다." + }, + "allowed-ip": { + "label": "허용된 IP 주소", + "placeholder": "기본 허용 IP 주소" + }, + "mtu": { + "label": "MTU", + "placeholder": "클라이언트 MTU (0 = 기본값 유지)" + }, + "keep-alive": { + "label": "Keep Alive 간격", + "placeholder": "영구 Keepalive (0 = 기본값)" + } + }, + "button-apply-defaults": "피어 기본값 적용" + }, + "peer-view": { + "headline-peer": "피어:", + "headline-endpoint": "엔드포인트:", + "section-info": "피어 정보", + "section-status": "현재 상태", + "section-config": "구성", + "identifier": "식별자", + "ip": "IP 주소", + "user": "연결된 사용자", + "notes": "메모", + "expiry-status": "만료 시각", + "disabled-status": "비활성화 시각", + "traffic": "트래픽", + "connection-status": "연결 통계", + "upload": "업로드된 바이트 (서버에서 피어로)", + "download": "다운로드된 바이트 (피어에서 서버로)", + "pingable": "핑 가능 여부", + "handshake": "마지막 핸드셰이크", + "connected-since": "연결 시작 시각", + "endpoint": "엔드포인트", + "button-download": "구성 다운로드", + "button-email": "이메일로 구성 보내기" + }, + "peer-edit": { + "headline-edit-peer": "피어 편집:", + "headline-edit-endpoint": "엔드포인트 편집:", + "headline-new-peer": "피어 생성", + "headline-new-endpoint": "엔드포인트 생성", + "header-general": "일반", + "header-network": "네트워크", + "header-crypto": "암호화", + "header-hooks": "후크 (피어에서 실행됨)", + "header-state": "상태", + "display-name": { + "label": "표시 이름", + "placeholder": "피어에 대한 설명적인 이름" + }, + "linked-user": { + "label": "연결된 사용자", + "placeholder": "이 피어를 소유한 사용자 계정" + }, + "private-key": { + "label": "개인 키", + "placeholder": "개인 키" + }, + "public-key": { + "label": "공개 키", + "placeholder": "공개 키" + }, + "preshared-key": { + "label": "사전 공유 키", + "placeholder": "선택적 사전 공유 키" + }, + "endpoint-public-key": { + "label": "엔드포인트 공개 키", + "placeholder": "원격 엔드포인트의 공개 키" + }, + "endpoint": { + "label": "엔드포인트 주소", + "placeholder": "원격 엔드포인트의 주소" + }, + "ip": { + "label": "IP 주소", + "placeholder": "IP 주소 (CIDR 형식)" + }, + "allowed-ip": { + "label": "허용된 IP 주소", + "placeholder": "허용된 IP 주소 (CIDR 형식)" + }, + "extra-allowed-ip": { + "label": "추가 허용 IP 주소", + "placeholder": "추가 허용 IP (서버 측)", + "description": "이 IP 주소는 원격 WireGuard 인터페이스에 허용된 IP로 추가됩니다." + }, + "dns": { + "label": "DNS 서버", + "placeholder": "사용해야 하는 DNS 서버" + }, + "dns-search": { + "label": "DNS 검색 도메인", + "placeholder": "DNS 검색 접두사" + }, + "keep-alive": { + "label": "Keep Alive 간격", + "placeholder": "영구 Keepalive (0 = 기본값)" + }, + "mtu": { + "label": "MTU", + "placeholder": "클라이언트 MTU (0 = 기본값 유지)" + }, + "pre-up": { + "label": "Pre-Up", + "placeholder": "하나 이상의 bash 명령 (;으로 구분)" + }, + "post-up": { + "label": "Post-Up", + "placeholder": "하나 이상의 bash 명령 (;으로 구분)" + }, + "pre-down": { + "label": "Pre-Down", + "placeholder": "하나 이상의 bash 명령 (;으로 구분)" + }, + "post-down": { + "label": "Post-Down", + "placeholder": "하나 이상의 bash 명령 (;으로 구분)" + }, + "disabled": { + "label": "피어 비활성화됨" + }, + "ignore-global": { + "label": "전역 설정 무시" + }, + "expires-at": { + "label": "만료 날짜" + } + }, + "peer-multi-create": { + "headline-peer": "여러 피어 생성", + "headline-endpoint": "여러 엔드포인트 생성", + "identifiers": { + "label": "사용자 식별자", + "placeholder": "사용자 식별자", + "description": "피어를 생성할 사용자 식별자 (사용자 이름)." + }, + "prefix": { + "headline-peer": "피어:", + "headline-endpoint": "엔드포인트:", + "label": "표시 이름 접두사", + "placeholder": "접두사", + "description": "피어 표시 이름에 추가되는 접두사." + } + } + } + } + \ No newline at end of file