You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1051 lines
65 KiB

(function () {
"use strict";
const storageKey = "teraclone.language";
const cookieName = "teraclone_language";
const supported = new Set(["ko", "en"]);
const textOriginal = new WeakMap();
const attributeOriginal = new WeakMap();
let currentLanguage = readLanguage();
let observer = null;
const exact = {
"페이지당 표시": "Rows per page",
"다운로드 형식": "Download format",
"최대 다운로드 건수": "Maximum download rows",
"로그 다운로드": "Download logs",
"이전 페이지": "Previous page",
"다음 페이지": "Next page",
"로그 저장 공간 · 보존 설정": "Log storage and retention",
"시스템 보존일": "System retention days",
"감사 보존일": "Audit retention days",
"포트 보존일": "Port retention days",
"용량 경고 (%)": "Storage warning (%)",
"보존 설정 저장": "Save retention settings",
"상태 새로고침": "Refresh status",
"원격 전송할 로그": "Logs to forward",
"전송 상태 새로고침": "Refresh delivery status",
"원격 전송 꺼짐": "Remote forwarding disabled",
"아직 확인된 전송 내역이 없습니다.": "No delivery has been observed yet.",
"사용자·사용자 정의 그룹·세션·로그·인증서·저장된 인증정보와 장비 내 진단 파일을 삭제합니다. 기본 계정 terauser / terauser만 복원됩니다.": "Deletes users, custom groups, sessions, logs, certificates, credentials and device diagnostic files. Only the default account terauser / terauser is restored.",
"초기화가 완료되면 자동 재부팅됩니다. 설치된 펌웨어는 유지됩니다.": "The device reboots automatically after reset. Installed firmware is retained.",
"연결이 끊어집니다. 재부팅 후 기본 접속 주소에서 terauser / terauser로 로그인하세요.": "The connection will close. After reboot, sign in at the default address using terauser / terauser.",
"사용자·설정·로그·세션·인증서 등 저장 데이터를 모두 삭제하고 자동 재부팅하시겠습니까? 기본 계정 terauser / terauser만 복원됩니다. 이 작업은 되돌릴 수 없습니다.": "Erase all stored users, settings, logs, sessions and certificates, then reboot automatically? Only terauser / terauser is restored. This cannot be undone.",
"공장 초기화가 완료되어 재부팅합니다. 재부팅 후 terauser / terauser로 로그인하세요.": "Factory reset completed. Rebooting. Sign in using terauser / terauser after reboot.",
"저장장치 사용량": "Storage Usage",
"저장장치 사용률": "Storage Usage",
"사용 가능 공간": "Available Space",
"RAM 사용률": "RAM Usage",
"RAM 사용 / 전체": "RAM Used / Total",
"남은 RAM": "Available RAM",
"저장공간 측정 경로": "Storage Measurement Path",
"저장공간과 RAM은 별개입니다. 사용 가능 공간은 파일시스템 예약 영역을 제외합니다.": "Storage and RAM are separate. Available space excludes filesystem-reserved blocks.",
"시스템 로그 관리": "System Log Management",
"감사 기록 · 보존": "Audit · Preserved",
"삭제 대상: 일반 시스템 이벤트 · 감사 기록 제외": "Delete target: ordinary system events · excluding audit records",
"일반 시스템 이벤트와 보존 대상 감사 기록을 조회합니다. 클리어는 감사 기록을 삭제하지 않습니다.": "View ordinary system events and protected audit records. Clearing does not delete audit records.",
"기간·검색 조건·표시 개수와 관계없이 일반 시스템 이벤트 전체를 삭제합니다. 감사 로그·포트 로그·포트 상태 이벤트는 보존됩니다.": "Delete all ordinary system events regardless of dates, filters, or row limit. Audit, port, and port state records are preserved.",
"감사 기록은 클리어 후에도 이 화면에 남습니다. 새 시스템 로그는 계속 저장되며, 설정 백업에는 로그 원문이 포함되지 않습니다.": "Audit records remain on this page after clearing. New system events continue to be recorded. Configuration backups do not contain logs.",
"상태 변경 기록만 조회·내보내기합니다.": "View and export state changes only.",
"일반 시스템 이벤트 전체를 삭제합니다.\n기간·검색 조건·표시 개수와 관계없이 삭제되며 복구할 수 없습니다. 감사 로그·포트 로그·포트 상태 이벤트는 보존됩니다.\n감사 기록은 클리어 후에도 화면에 남습니다. 내보내기는 현재 검색 조건과 표시 개수 범위만 포함합니다.\n계속하려면 SYSTEM을 정확히 입력하세요.": "Delete all ordinary system events.\nThis is irreversible and ignores dates, filters, and row limits. Audit, port, and port state records are preserved.\nAudit records remain visible. Exports include only the current filters and row limit.\nType SYSTEM exactly to continue.",
"검색 초기화": "Reset filters",
"포트 로그 관리": "Port log management",
"로그 클리어 (삭제)": "Clear logs (delete)",
"삭제 중...": "Deleting...",
"로그를 삭제하고 있습니다.": "Deleting stored logs.",
"위 검색 조건에서 포트 1개를 선택하세요.": "Select one port in the filters above.",
"기간·검색 조건·표시 개수와 관계없이 선택한 포트의 저장 로그 전체를 삭제합니다. 새 로그 수집은 계속됩니다.": "Delete all stored logs for the selected port, regardless of date, filters, or row limit. New logs will continue to be recorded.",
"다른 포트와 시스템·감사·포트 상태 이벤트는 유지됩니다. 설정 백업에는 로그 원문이 포함되지 않습니다.": "Other ports, system logs, audit logs, and port status events are preserved. Configuration backups do not contain log records.",
"포트별 RX/TX 데이터·명령·접속/종료 기록을 조회합니다. UP/DOWN 변경은 포트 상태 이벤트에서 확인하세요.": "View per-port RX/TX data, commands, and session history. See Port Status Events for UP/DOWN changes.",
"포트별 통신 이력 · 내보내기는 현재 검색 조건과 표시 개수 범위에 적용됩니다.": "Port communication history · Export uses the current filters and row limit.",
"포트의 UP/DOWN 및 제공되는 신호 변경 기록을 조회합니다. RX/TX 데이터·명령·접속 기록은 포트 로그에서 확인하세요.": "View UP/DOWN and available signal changes. See Port Logs for RX/TX data, commands, and sessions.",
"상세 검색 · 기간 / 추가 조건": "Advanced search · dates / more filters",
"기간 입력은 브라우저 시간대 기준입니다.": "Date filters use your browser's time zone.",
"현재 조회 결과 요약": "Current query summary",
"조회 결과": "Results",
"건": "items",
"현재 조회된 로그 기준": "Based on the current query",
"현재 검색 조건에 맞는 최신 로그를 표시합니다.": "Showing the latest logs matching the current filters.",
"마지막 조회": "Last query",
"수신 RX": "Receive RX",
"전송 TX": "Transmit TX",
"시간 미설정": "Clock not set",
"원본 시각": "Original timestamp",
"원격 주소": "Remote address",
"감사 ID": "Audit ID",
"원본 메시지": "Original message",
"마스킹 적용": "Redacted",
"상세": "Details",
"로그를 불러오는 중입니다.": "Loading logs…",
"장비에 저장된 로그를 조회하고 있습니다.": "Reading logs stored on the device.",
"조건에 맞는 로그가 없습니다.": "No logs match these filters.",
"검색 조건을 바꾸거나 초기화를 눌러 다시 조회하세요.": "Change the filters or reset to search again.",
"로그를 조회할 수 없습니다.": "Logs are unavailable.",
"장비 연결 상태를 확인한 후 새로고침을 눌러주세요.": "Check the device connection and refresh.",
"조회에 실패했습니다. 마지막으로 받은 결과를 유지합니다. 새로고침으로 다시 시도하세요.": "Query failed. Keeping the last received results. Refresh to retry.",
"로그를 조회할 수 없습니다. 새로고침으로 다시 시도하세요.": "Logs are unavailable. Refresh to retry.",
"로그를 읽는 동안 자동 갱신을 기다립니다. 상세를 닫고 목록 맨 위로 이동하면 다시 갱신됩니다.": "Auto-refresh is paused while reading. Close details and return to the top to resume.",
"읽는 중 · 갱신 대기": "Reading · refresh paused",
"자동 갱신 중 · 5초": "Auto-refresh · every 5s",
"자동 갱신 꺼짐": "Auto-refresh off",
"로그 응답을 확인할 수 없습니다.": "Invalid log response.",
"언어": "Language",
"언어 선택": "Select Language",
"한국어": "Korean",
"영어": "English",
"로그인": "Sign in",
"로그아웃": "Sign out",
"아이디": "Username",
"비밀번호": "Password",
"장치 관리 화면에 접근하려면 계정으로 로그인하세요.": "Sign in with your account to access device management.",
"백엔드 준비 중...": "Backend is starting...",
"백엔드 서비스를 시작하고 있습니다.": "Starting backend services.",
"백엔드 서비스가 준비되었습니다. 로그인할 수 있습니다.": "Backend services are ready. You can sign in.",
"백엔드에서 로그인 정보를 확인하고 있습니다.": "Verifying credentials with the backend.",
"로그인 확인 중...": "Signing in...",
"자동입력방지 이미지를 불러오는 중입니다.": "Loading the CAPTCHA image.",
"이미지의 숫자 4자리를 입력하세요. 유효 시간은 2분입니다.": "Enter the 4 digits shown in the image. The image is valid for 2 minutes.",
"이미지를 표시하지 못했습니다. 새 이미지를 눌러주세요.": "Unable to display the image. Click New Image.",
"이미지가 만료되었습니다. 새 이미지를 눌러주세요.": "The image has expired. Click New Image.",
"자동입력방지 이미지를 불러오지 못했습니다. 새 이미지를 눌러 다시 시도하세요.": "Unable to load the CAPTCHA image. Click New Image to try again.",
"저장 후 재시작": "Save & Restart",
"대시보드": "Dashboard",
"장치 상태와 연결 현황을 한눈에 확인하세요.": "Device health and connectivity at a glance.",
"핵심 상태": "Key metrics",
"데이터 불러오는 중": "Loading data",
"데이터 확인 불가": "Data unavailable",
"자동 갱신 중 · 시스템 5초": "Auto-refresh · system every 5s",
"갱신 실패 · 마지막 수신값 표시": "Refresh failed · last received values",
"포트 상태 자동 갱신 중": "Port status auto-refreshing",
"포트 상태 갱신 실패": "Port status refresh failed",
"상태 확인 중": "Checking status",
"사용 / 전체": "Used / total",
"현재 접속 중인 포트 세션": "Currently connected port sessions",
"활성 알람 없음": "No active alarms",
"확인이 필요한 알람이 있습니다.": "Active alarms need attention.",
"포트를 선택하면 상세 설정으로 이동합니다.": "Select a port to open its settings.",
"전체 포트 보기": "View all ports",
"포트 상태 필터": "Filter by port status",
"세션 연결": "Session",
"미확인": "Unknown",
"선택한 상태의 포트가 없습니다.": "No ports match this status.",
"미확인은 아직 장비 응답을 확인하지 못한 상태이며, 장애를 의미하지 않습니다.": "Unknown means no device response has been confirmed; it does not indicate a fault.",
"트래픽 상위 포트": "Top ports by traffic",
"누적 수신 + 송신 기준 · 실시간 속도가 아닙니다.": "Cumulative RX + TX · not a live transfer rate.",
"아직 포트 트래픽이 없습니다.": "No port traffic recorded yet.",
"인터페이스 정보가 없습니다.": "No interface information available.",
"연결됨": "Connected",
"CPU 평균 (1 / 5 / 15분)": "CPU load (1 / 5 / 15 min)",
"네트워크 설정": "Network Settings",
"포트 설정": "Port Settings",
"포트 디버그": "Port Debug",
"관리자 운영": "Administration",
"기타 설정": "System Settings",
"진단 도구": "Diagnostics",
"로그": "Logs",
"포트 상태": "Port Status",
"비밀번호 변경": "Change Password",
"포트 재시작": "Restart Ports",
"공장 초기화": "Factory Reset",
"공장 초기화 실행": "Run Factory Reset",
"자동입력방지": "CAPTCHA",
"새 이미지": "New Image",
"이미지의 숫자 4자리를 입력하세요.": "Enter the 4 digits shown in the image.",
"남은 시간": "Time remaining",
"이미지의 숫자 4자리": "4 digits shown in the image",
"사용자 계정": "User Accounts",
"인증 서버": "Authentication Servers",
"주소 필터": "Address Filter",
"SSL 인증서": "SSL Certificates",
"백업/복원": "Backup / Restore",
"펌웨어": "Firmware",
"알림 설정": "Alert Settings",
"시스템 로그": "System Log",
"날짜와 시간": "Date & Time",
"네트워크 테스트": "Network Test",
"포트 별칭": "Port Aliases",
"포트 로그": "Port Log",
"포트 상태 이벤트": "Port State Events",
"인터페이스 1": "Interface 1",
"인터페이스 2": "Interface 2",
"호스트 설정": "Host Settings",
"고급 설정": "Advanced Settings",
"DDNS 설정": "DDNS Settings",
"운영 모드": "Operating Mode",
"고급 네트워크 모드": "Advanced Network Mode",
"본딩 모드": "Bonding Mode",
"링크 감지 시간(ms)": "Link Detection Time (ms)",
"브리지 STP 사용": "Enable Bridge STP",
"OOB 주 인터페이스": "OOB Primary Interface",
"OOB 예비 인터페이스": "OOB Fallback Interface",
"상태 확인 대상": "Health Check Target",
"확인 주기(초)": "Check Interval (sec)",
"전환 실패 횟수": "Failures Before Failover",
"DHCP 사용": "Enable DHCP",
"IPv4 주소": "IPv4 Address",
"서브넷 마스크": "Subnet Mask",
"게이트웨이": "Gateway",
"DNS 서버 1": "DNS Server 1",
"DNS 서버 2": "DNS Server 2",
"IPv6 모드": "IPv6 Mode",
"IPv6 주소": "IPv6 Address",
"IPv6 게이트웨이": "IPv6 Gateway",
"IPv6 DNS 서버 1": "IPv6 DNS Server 1",
"IPv6 DNS 서버 2": "IPv6 DNS Server 2",
"호스트 이름": "Host Name",
"DDNS 사용": "Enable DDNS",
"DNS 공급자": "DNS Provider",
"DDNS IPv4 사용": "Enable DDNS IPv4",
"DDNS IPv6 사용": "Enable DDNS IPv6",
"사용자 이름(ID)": "Username (ID)",
"비밀번호(Token/Secret)": "Password (Token/Secret)",
"IPv4 도메인": "IPv4 Domain",
"IPv6 도메인": "IPv6 Domain",
"적용": "Apply",
"저장": "Save",
"추가": "Add",
"수정": "Edit",
"삭제": "Delete",
"확인": "OK",
"취소": "Cancel",
"닫기": "Close",
"사용": "Enable",
"사용 안 함": "Disable",
"활성": "Enabled",
"비활성": "Disabled",
"상태": "Status",
"이름": "Name",
"설명": "Description",
"채널": "Channel",
"매개변수": "Parameters",
"동작 설정 1": "Operation 1",
"동작 설정 2": "Operation 2",
"데이터 로그": "Data Log",
"시리얼 타입": "Serial Type",
"보레이트": "Baud Rate",
"데이터 비트": "Data Bits",
"정지 비트": "Stop Bits",
"패리티": "Parity",
"흐름 제어": "Flow Control",
"포트 선택": "Select Port",
"사용자 추가": "Add User",
"그룹 추가": "Add Group",
"그룹 관리": "Group Management",
"서버 주소": "Server Address",
"인증 포트": "Authentication Port",
"공유 Secret": "Shared Secret",
"응답 타임아웃(초)": "Response Timeout (sec)",
"외부 사용자 기본 역할": "Default External User Role",
"장애 시 인증": "Fallback Authentication",
"포트 운영자": "Port Operator",
"조회 사용자": "Viewer",
"관리자": "Administrator",
"핑": "Ping",
"트레이서루트": "Traceroute",
"TCP 연결 테스트": "TCP Connection Test",
"대상 주소": "Target Address",
"실행": "Run",
"터미널 화면을 클릭하고 바로 입력하세요. Enter 키로 전송합니다.": "Click the terminal and type. Press Enter to send.",
"고급 기능": "Advanced",
"전송할 값 또는 끝 문자를 선택하세요.": "Enter a value or select a line ending.",
"전송 형식": "Send Format",
"전송 값": "Send Value",
"끝 문자": "Line Ending",
"없음": "None",
"일괄 전송": "Send Batch",
"로그 저장": "Save Log",
"로그 지우기": "Clear Log",
"접속": "Connect",
"연결 종료": "Disconnect",
"화면 지우기": "Clear Screen",
"연결 안 됨": "Disconnected",
"선택한 채널에 연결된 장비의 실제 시리얼 콘솔": "Live serial console for the device connected to the selected channel",
"세션 방식: Direct Mode writer": "Session: Direct Mode writer",
"Ctrl+C: 인터럽트 전송": "Ctrl+C: Send interrupt",
"Enter: CR 전송": "Enter: Send CR"
};
Object.assign(exact, {
"설정 저장": "Save Configuration",
"장치 재시작": "Restart Device",
"포트 링크 상태": "Port Link Status",
"시스템 정보": "System Information",
"모델": "Model",
"빌드번호": "Build Number",
"시리얼번호": "Serial Number",
"펌웨어": "Firmware",
"가동 시간": "Uptime",
"시스템 시간": "System Time",
"CPU 평균": "CPU Load Average",
"네트워크 정보": "Network Information",
"MAC 주소": "MAC Address",
"다운로드 속도": "Download Speed",
"업로드 속도": "Upload Speed",
"리소스 상태": "Resource Status",
"CPU 사용률": "CPU Usage",
"전체 메모리": "Total Memory",
"사용 중 메모리": "Used Memory",
"남은 메모리": "Available Memory",
"메모리 사용률": "Memory Usage",
"온도": "Temperature",
"활성 세션": "Active Sessions",
"활성 알람": "Active Alarms",
"포트 사용 현황": "Port Usage",
"활성 포트": "Active Ports",
"누적 수신": "Total Received",
"누적 송신": "Total Transmitted",
"링크 연결": "Link Up",
"주소 없음": "No Address",
"속도 미확인": "Speed Unknown",
"정상": "Normal",
"경고": "Warning",
"오류": "Error",
"치명적": "Critical",
"대기": "Pending",
"조회 중": "Loading",
"조회 준비": "Ready to Load",
"조회 실패": "Load Failed",
"데이터가 없습니다.": "No data available.",
"정보": "Information",
"안내": "Notice",
"안전 안내": "Safety Notice",
"설정": "Settings",
"전체 설정": "All Settings",
"장비 설정": "Device Settings",
"보안 설정": "Security Settings",
"로그 설정": "Log Settings",
"로그 정책": "Log Policy",
"로그 종류": "Log Type",
"로그 형식": "Log Format",
"로그 이벤트": "Log Events",
"로그 서버": "Log Server",
"로그 서비스": "Log Service",
"로그 저장소": "Log Storage",
"로그 저장 공간 경고": "Log Storage Warning",
"저장 공간 경고": "Storage Warning",
"시스템": "System",
"네트워크": "Network",
"포트": "Port",
"사용자": "User",
"관리": "Manage",
"운영": "Operation",
"조회": "View",
"작업": "Actions",
"유형": "Type",
"등급": "Severity",
"분류": "Category",
"내용": "Content",
"제목": "Subject",
"시간": "Time",
"시간대": "Time Zone",
"시작 시간": "Start Time",
"종료 시간": "End Time",
"방향": "Direction",
"프로토콜": "Protocol",
"키": "Key",
"역할": "Role",
"계정 상태": "Account Status",
"사용 중": "In Use",
"변경": "Change",
"생성": "Create",
"초기화": "Reset",
"복원": "Restore",
"복원 및 적용": "Restore & Apply",
"내보내기": "Export",
"가져오기": "Import",
"새로 만들기": "Create New",
"새로고침": "Refresh",
"중지": "Stop",
"테스트": "Test",
"테스트 전송": "Send Test",
"테스트 발송": "Send Test",
"전체": "All",
"전체 포트": "All Ports",
"표시 개수": "Items Per Page",
"검색 조건": "Search Field",
"검색어": "Search Term",
"소스 또는 메시지": "Source or Message",
"명령, 결과 또는 메시지": "Command, Result, or Message",
"신호 / 검색어": "Signal / Search Term",
"발생 위치": "Source",
"발신자": "Sender",
"수신자": "Recipient",
"참조(CC)": "CC",
"본문": "Message Body",
"이메일": "Email",
"메일": "Email",
"세션": "Session",
"트래픽": "Traffic",
"명령": "Command",
"결과": "Result",
"신호": "Signal",
"바이트 수신": "Bytes Received",
"바이트 전송": "Bytes Transmitted",
"상태 확인": "Check Status",
"상태 변경": "Status Change",
"상태 변화": "Status Change",
"방향 표시": "Show Direction",
"타임스탬프 표시": "Show Timestamp",
"사용자 표시": "Show User",
"IP 주소 표시": "Show IP Address",
"IPv6 설정": "IPv6 Settings",
"IPv6 설정 보기": "Show IPv6 Settings",
"IPv6 설정 숨기기": "Hide IPv6 Settings",
"IPv4 필터": "IPv4 Filter",
"IPv6 필터": "IPv6 Filter",
"MAC 필터": "MAC Filter",
"IPv4 필터 추가": "Add IPv4 Filter",
"IPv6 필터 추가": "Add IPv6 Filter",
"MAC 필터 추가": "Add MAC Filter",
"필터 방식": "Filter Mode",
"허용 목록": "Allow List",
"차단 목록": "Block List",
"주소 필터 사용": "Enable Address Filter",
"관리 접속": "Management Access",
"관리 접속 주소 필터": "Management Access Filter",
"관리 API": "Management API",
"접속 주소로 자동 생성": "Automatically Generated from Access Address",
"주소와 프로토콜로 자동 생성": "Automatically Generated from Address and Protocol",
"파일명으로 자동 생성": "Automatically Generated from File Name",
"독립 인터페이스": "Independent Interface",
"Single 독립 인터페이스": "Single Independent Interface",
"Single 독립 사용 모드": "Single Independent Mode",
"OOB 자동 전환 모드": "OOB Automatic Failover Mode",
"Bonding 통합 인터페이스": "Bonding Aggregate Interface",
"Bridge 통합 인터페이스": "Bridge Aggregate Interface",
"로드 밸런싱": "Load Balancing",
"링크 중복": "Link Redundancy",
"주 회선 · 우선순위 1": "Primary Link · Priority 1",
"예비 회선 · 장애 시 전환": "Backup Link · Failover on Fault",
"bond0 구성 포트": "bond0 Member Port",
"br0 브리지 포트": "br0 Bridge Port",
"네트워크 적용": "Apply Network Settings",
"네트워크 서비스": "Network Service",
"OOB 경로 전환": "OOB Path Failover",
"마지막으로 확인된 연결 상태 유지": "Keep Last Known Link State",
"IP 확인 주소 (Check IP URL)": "Check IP URL",
"IP 주소 / 도메인 이름": "IP Address / Domain Name",
"대상 포트": "Target Port",
"대상 ID": "Target ID",
"목적지 포트": "Destination Port",
"전송 프로토콜": "Transport Protocol",
"자동 갱신 (5초)": "Auto Refresh (5 sec)",
"NTP 사용": "Enable NTP",
"수동 날짜": "Manual Date",
"수동 시간": "Manual Time",
"현재 PC 시간으로 동기화": "Synchronize with Current PC Time",
"업데이트 적용": "Apply Update",
"펌웨어 업그레이드": "Firmware Upgrade",
"서명된 펌웨어 패키지": "Signed Firmware Package",
"백업 다운로드": "Download Backup",
"백업 범위": "Backup Scope",
"백업 파일": "Backup File",
"백업 파일 암호": "Backup Password",
"백업 파일 암호 재입력": "Confirm Backup Password",
"암호화 구성 백업": "Encrypted Configuration Backup",
"암호화 백업 복원": "Restore Encrypted Backup",
"네트워크 설정 포함": "Include Network Settings",
"네트워크 포함 시 현재 웹 연결이 끊길 수 있습니다": "Including network settings may disconnect this web session",
"네트워크를 포함한 영구 설정 전체": "All Persistent Settings Including Network",
"개인 키 파일": "Private Key File",
"개인 키 비밀번호": "Private Key Password",
"암호화된 키인 경우 입력": "Required for an Encrypted Key",
"인증서": "Certificate",
"인증서 목록": "Certificate List",
"인증서 ID": "Certificate ID",
"인증서 파일": "Certificate File",
"활성 인증서": "Active Certificate",
"사용 인증서": "Certificate in Use",
"공통 이름": "Common Name",
"공통 이름(CN)": "Common Name (CN)",
"국가(C)": "Country (C)",
"시/도(ST)": "State / Province (ST)",
"도시(L)": "Locality (L)",
"조직(O)": "Organization (O)",
"부서(OU)": "Organizational Unit (OU)",
"유효 기간": "Validity Period",
"인증서 서명 요청(CSR)": "Certificate Signing Request (CSR)",
"자체 서명 인증서 생성": "Create Self-Signed Certificate",
"SSL 인증서 가져오기": "Import SSL Certificate",
"SSL 인증서 생성": "Create SSL Certificate",
"PEM 인증서 가져오기": "Import PEM Certificate",
"RADIUS 사용": "Enable RADIUS",
"RADIUS 인증": "RADIUS Authentication",
"TACACS+ 사용": "Enable TACACS+",
"TACACS+ 인증": "TACACS+ Authentication",
"외부 인증": "External Authentication",
"사용자 인증": "User Authentication",
"SMTP 인증 사용": "Enable SMTP Authentication",
"SMTP 사용자": "SMTP Username",
"SMTP 비밀번호": "SMTP Password",
"SMTP 포트": "SMTP Port",
"STARTTLS 사용": "Enable STARTTLS",
"메일 알림": "Email Alerts",
"메일 알림 사용": "Enable Email Alerts",
"메일로 전달": "Deliver by Email",
"SNMP 사용": "Enable SNMP",
"SNMP 설정": "SNMP Settings",
"SNMP Trap 대상": "SNMP Trap Targets",
"SNMP Trap으로 전달": "Deliver by SNMP Trap",
"Trap 전송 사용": "Enable Trap Delivery",
"Community / 인증 키": "Community / Authentication Key",
"v3 사용자": "v3 Users",
"v3 사용자 사용": "Enable v3 User",
"v3 인증": "v3 Authentication",
"v3 인증 키": "v3 Authentication Key",
"v3 암호화": "v3 Privacy",
"v3 암호화 키": "v3 Privacy Key",
"v3 접근 권한": "v3 Access",
"Read 기록": "Record Reads",
"Send 기록": "Record Sends",
"원격 로그": "Remote Log",
"원격 로그 전송 사용": "Enable Remote Log Forwarding",
"Syslog로 전달": "Deliver by Syslog",
"시스템 이벤트": "System Events",
"시리얼 이벤트": "Serial Events",
"시스템 이벤트 알림": "System Event Alerts",
"시스템 이벤트 - 로컬 저장": "System Events - Local Storage",
"시스템 이벤트 - 원격 전송": "System Events - Remote Delivery",
"설정 변경 이벤트 - 로컬 저장": "Configuration Changes - Local Storage",
"설정 변경 이벤트 - 원격 전송": "Configuration Changes - Remote Delivery",
"운영 모드 이벤트 - 로컬 저장": "Operation Mode Events - Local Storage",
"운영 모드 이벤트 - 원격 전송": "Operation Mode Events - Remote Delivery",
"규칙 ID": "Rule ID",
"규칙 사용": "Enable Rule",
"규칙 추가": "Add Rule",
"알림 전달": "Alert Delivery",
"감지 키워드": "Detection Keyword",
"수신 키워드 감지": "RX Keyword Detection",
"Alarm 키워드": "Alarm Keyword",
"시리얼 포트": "Serial Port",
"시리얼 포트 CMD 콘솔": "Serial Port CMD Console",
"시리얼 CMD 콘솔": "Serial CMD Console",
"시리얼 데이터": "Serial Data",
"시리얼 서비스": "Serial Service",
"포트 세션 서비스": "Port Session Service",
"상대 장비 데이터 수신": "Receive Data from Remote Device",
"동작 모드": "Operation Mode",
"인증 방식": "Authentication Method",
"줄바꿈": "Newline",
"최대 세션 수": "Maximum Sessions",
"Keep alive(초)": "Keep Alive (sec)",
"접속(유휴) 타임아웃(ms)": "Connection Idle Timeout (ms)",
"제어 단축키": "Control Shortcut",
"전환 단축키": "Switch Shortcut",
"세션 종료 단축키": "Session Close Shortcut",
"Break 단축키(선택)": "Break Shortcut (Optional)",
"인터럽트 단축키(선택)": "Interrupt Shortcut (Optional)",
"포트 권한": "Port Permissions",
"그룹": "Group",
"기본 그룹": "Default Group",
"기존 비밀번호": "Current Password",
"새 비밀번호": "New Password",
"비밀번호 확인": "Confirm Password",
"암호 확인": "Confirm Password",
"비밀번호 재설정": "Reset Password",
"계정 상태": "Account Status",
"관리자 연락처(sysContact)": "Administrator Contact (sysContact)",
"장비 위치(sysLocation)": "Device Location (sysLocation)",
"하드웨어 프로필": "Hardware Profile"
});
Object.assign(exact, {
"전체 쓰기": "Write All",
"전체 읽기": "Read All",
"권한 없음": "No Permissions",
"역할 기본값": "Role Default",
"TERA Serial Console - UP 채널 없음": "TERA Serial Console - No UP Channels",
"포트 상태 확인 실패": "Port Status Check Failed",
"포트 연결 상태를 확인하지 못했습니다.": "Could not check port connectivity.",
"시리얼 서비스 준비 중": "Serial Service Starting",
"시리얼 포트 서비스가 준비될 때까지 접속이 비활성화됩니다.": "Connection is disabled until the serial port service is ready.",
"연결 중": "Connecting",
"연결 오류": "Connection Error",
"연결 끊김": "Connection Lost",
"접속 실패": "Connection Failed",
"스트림 오류": "Stream Error",
"스트림 오류가 발생했습니다.": "A stream error occurred.",
"상태 메시지를 해석하지 못했습니다.": "Could not parse the status message.",
"시리얼 스트림에 연결하지 못했습니다.": "Could not connect to the serial stream.",
"운영자가 연결을 종료했습니다.": "The operator closed the connection.",
"접속에 실패했습니다.": "Connection failed.",
"선택 채널": "Selected Channel",
"규칙을 삭제하시겠습니까?": "Delete this rule?",
"그룹을 수정했습니다.": "Group was updated.",
"그룹을 추가했습니다.": "Group was added.",
"연결이": "Connection",
"인증서를 삭제하시겠습니까?": "Delete this certificate?",
"정보를 찾을 수 없습니다.": "Information was not found.",
"포트 정보를 찾을 수 없습니다.": "Port information was not found.",
"%로 경고 기준": "% of warning threshold",
"개별 보기": "View Details",
"고정값": "Fixed",
"공통 설정": "Common Settings",
"그룹 이름과 권한을 지정해 사용자 계정에 연결할 그룹을 관리합니다.": "Manage groups linked to user accounts by assigning a group name and permissions.",
"기본 숨김 · 현재 모드": "Hidden by Default · Current Mode",
"등록된": "Registered",
"로그 저장 공간 사용률이": "Log Storage Usage",
"영문 소문자, 숫자, 하이픈, 밑줄만 사용할 수 있습니다.": "Lowercase letters, numbers, hyphens, and underscores only.",
"을 다른 인터페이스와 독립적으로 사용합니다.": "Use independently from the other interface.",
"장비 시스템 시간이 설정되지 않았습니다 (": "Device system time is not set (",
"조회 완료 ·": "Loaded ·",
"Admin 설정": "Admin Settings",
"Port {{.Number}} 개별 보기": "View Port {{.Number}}",
"Port {{.Number}} 적용 대상 추가": "Add Port {{.Number}} to Targets",
"TERA Serial Console\n포트 연결 상태를 확인하고 있습니다.": "TERA Serial Console\nChecking port connectivity.",
"UP 채널 확인 중...": "Checking UP Channels...",
"· 상태:": "· Status:",
"· 시간 미설정": "· Time Not Set",
"· 원격:": "· Remote:",
"· Interface 1 링크:": "· Interface 1 Link:",
"규칙이 없습니다.": "No rules configured.",
"확인": "Confirm",
"IPv4 설정": "IPv4 Settings",
"[TERA] 진단 작업을 요청하고 있습니다...": "[TERA] Requesting diagnostics...",
"1초 (고정)": "1 Second (Fixed)",
"8~64자": "8–64 Characters",
"8자 이상 입력": "Enter at Least 8 Characters",
"건": "Items",
"결과:": "Result:",
"관리 접속 보안 설정을 변경했습니다.": "Management access security settings were updated.",
"관리 주소 필터를 변경했습니다.": "Management address filter was updated.",
"구성 내보내기": "Export Configuration",
"구성 복원": "Restore Configuration",
"그룹 이름을 입력하세요.": "Enter a group name.",
"그룹 ID는 영문 소문자, 숫자, 하이픈, 밑줄만 사용할 수 있습니다.": "Group ID may contain lowercase letters, numbers, hyphens, and underscores only.",
"기본": "Default",
"끊어졌습니다.": "Disconnected.",
"날짜와 시간 설정을 변경했습니다.": "Date and time settings were updated.",
"내보낼 때 사용한 암호": "Password Used for Export",
"네트워크 보류 설정은 네트워크 메뉴에서 적용하세요.": "Apply pending network settings from the Network menu.",
"네트워크 설정 변경을 준비했습니다.": "Network configuration changes are staged.",
"네트워크 설정까지 복원하면 현재 웹 연결이 끊길 수 있습니다. 계속하시겠습니까?": "Restoring network settings may disconnect this web session. Continue?",
"네트워크 설정을 실제 장비에 적용하고 영구 저장했습니다.": "Network settings were applied to the device and saved permanently.",
"네트워크 설정을 이전 상태로 복구했습니다.": "Network settings were rolled back.",
"네트워크 설정을 장비에 적용했습니다.": "Network settings were applied to the device.",
"네트워크 설정을 적용하고 있습니다.": "Applying network settings.",
"네트워크 설정을 확인하고 영구 저장했습니다.": "Network settings were confirmed and saved permanently.",
"네트워크 인터페이스가 정상입니다.": "Network interfaces are healthy.",
"네트워크 인터페이스의 연결 상태가 불안정합니다.": "Network interface connectivity is unstable.",
"네트워크 진단 결과": "Network Diagnostic Results",
"네트워크 진단에 실패했습니다.": "Network diagnostics failed.",
"네트워크 진단이 완료되었습니다.": "Network diagnostics completed.",
"대상:": "Target:",
"대상에 연결되지 않았습니다.": "Could not connect to the target.",
"도메인 또는 IP[:포트] 예: 192.168.0.233:514": "Domain or IP[:port], e.g. 192.168.0.233:514",
"로그 내보내기에 실패했습니다.": "Log export failed.",
"로그 및 연결 상태 감시가 정상 동작 중입니다.": "Log and connectivity monitoring is operating normally.",
"로그 서버는 도메인 또는 IP[:포트] 형식으로 입력하세요.": "Enter the log server as a domain or IP[:port].",
"로그 원본 타임스탬프 · 표시 시간대:": "Original Log Timestamp · Display Time Zone:",
"로그 저장 공간 사용량이 경고 기준을 초과했습니다.": "Log storage usage exceeded the warning threshold.",
"로그 저장 공간이 부족합니다.": "Log storage is running low.",
"로그 저장 정책을 변경했습니다.": "Log retention policy was updated.",
"로그인 세션이 종료되었습니다. 다시 로그인하세요.": "Your login session ended. Sign in again.",
"로그인 실패 임계값": "Login Failure Threshold",
"로그인 실패 횟수가 기준을 초과하여 계정이 일시 잠겼습니다.": "The account was temporarily locked after too many failed login attempts.",
"로그인에 실패했습니다.": "Sign-in failed.",
"메일 알림 설정을 변경했습니다.": "Email alert settings were updated.",
"메일 알림 테스트를 전송했습니다.": "Email alert test was sent.",
"명령 실행 완료": "Command Completed",
"명령 실행이 거부되었습니다.": "Command execution was denied.",
"명령:": "Command:",
"명령을 실행하고 있습니다...": "Running command...",
"바이트": "Bytes",
"백업 구성을 장비에 복원하고 영구 저장했습니다.": "The backup configuration was restored and saved permanently.",
"백업 설정을 복원 대상으로 불러왔습니다.": "Backup settings were loaded for restoration.",
"백업 파일 암호는 8~64자로 입력하세요.": "Enter a backup password between 8 and 64 characters.",
"백업 파일 암호와 확인 값이 일치하지 않습니다.": "Backup password and confirmation do not match.",
"백엔드 요청에 실패했습니다.": "Backend request failed.",
"버전": "Version",
"별칭 이름": "Alias",
"보류 중인 설정을 장비 구성 파일에 영구 저장합니다.": "Permanently save pending settings to the device configuration.",
"보류된 설정 변경을 취소했습니다.": "Pending configuration changes were discarded.",
"보류된 설정을 장비에 적용했습니다.": "Pending settings were applied to the device.",
"분": "Minutes",
"비워두면 사용하지 않습니다. 예: ^X": "Leave blank to disable, e.g. ^X",
"비워두면 직접 단축키는 사용하지 않습니다. 예: ^B": "Leave blank to disable the direct shortcut, e.g. ^B",
"사용자 계정 설정을 변경했습니다.": "User account settings were updated.",
"사용자 권한 그룹 설정을 변경했습니다.": "User permission group settings were updated.",
"서명된 펌웨어 패키지를 선택하세요.": "Select a signed firmware package.",
"선택한 백업으로 장비 설정을 복원하시겠습니까?": "Restore device settings from the selected backup?",
"선택한 파일이 허용 크기를 초과했습니다.": "The selected file exceeds the allowed size.",
"선택한 펌웨어를 검증한 뒤 장비에 적용합니다. 장비가 재시작될 수 있습니다. 계속하시겠습니까?": "The selected firmware will be verified and applied. The device may restart. Continue?",
"설정 변경": "Configuration Change",
"설정 변경 이벤트: 사용자가 웹 또는 콘솔에서 장비 설정을 변경한 기록": "Configuration change events: changes made through the web UI or console",
"설정 적용이 완료되었습니다.": "Settings were applied.",
"설정을 장비에 적용하고 영구 저장했습니다.": "Settings were applied to the device and saved permanently.",
"수동 날짜와 시간을 올바르게 입력하세요.": "Enter a valid manual date and time.",
"수신 키워드는 포트 로그의 검색어로 조회할 수 있습니다.": "RX keywords can be searched in the port log.",
"수정할 때 비워두면 기존 비밀번호를 유지합니다.": "Leave blank while editing to keep the current password.",
"시리얼 데이터를 처리했습니다.": "Serial data was processed.",
"시리얼 링크 DOWN": "Serial Link DOWN",
"시리얼 명령 입력": "Serial Command Input",
"시리얼 포트 설정 변경을 준비했습니다.": "Serial port configuration changes are staged.",
"시리얼 포트의 DCD/DSR/CTS 상태 변경을 조회합니다. 수신 키워드 감지는 포트 로그에서 조회합니다.": "View DCD/DSR/CTS changes for serial ports. View RX keyword detections in the port log.",
"시스템 로그 - 로그 서버": "System Log - Log Server",
"시스템 로그 - 로그 이벤트": "System Log - Log Events",
"시스템 시작/재시작/로그인 실패, 설정 변경, 포트 운영 세션 이벤트의 저장 위치를 선택합니다.": "Select where system startup, restart, login failure, configuration change, and port session events are stored.",
"시스템 이벤트: Cold start, Warm start, 로그인 실패": "System events: Cold start, Warm start, and login failure",
"시작 시간은 종료 시간보다 늦을 수 없습니다.": "Start time cannot be later than end time.",
"시작 시간을 확인하세요.": "Check the start time.",
"알림 규칙을 변경했습니다.": "Alert rules were updated.",
"알림 전달 정책을 변경했습니다.": "Alert delivery policy was updated.",
"암호화된 구성 백업을 내려받았습니다.": "Encrypted configuration backup was downloaded.",
"여러 시리얼 포트의 설정 변경을 준비했습니다.": "Configuration changes for multiple serial ports are staged.",
"영문 소문자, 숫자, 점, 하이픈, 밑줄": "Lowercase Letters, Numbers, Dots, Hyphens, and Underscores",
"예: NOC 운영자": "e.g. NOC Operators",
"예: noc_operators": "e.g. noc_operators",
"외부 인증 설정을 변경했습니다.": "External authentication settings were updated.",
"외부 인증을 사용하려면 공유 Secret을 입력하세요.": "Enter a shared secret to enable external authentication.",
"요청 처리 중 오류가 발생했습니다.": "An error occurred while processing the request.",
"운영 모드 이벤트: Reverse SSH/Reverse Telnet 세션 연결 및 해제 기록": "Operation mode events: Reverse SSH/Reverse Telnet session connections and disconnections",
"원격 로그 전송 설정을 변경했습니다.": "Remote log forwarding settings were updated.",
"원격 로그를 사용하려면 로그 서버를 입력하세요.": "Enter a log server to enable remote logging.",
"원격:": "Remote:",
"위": "Rank",
"이 작업은 백엔드 API를 통해 장비 구성에 반영됩니다.": "This action is applied to the device through the backend API.",
"이더넷 링크 DOWN": "Ethernet Link DOWN",
"이벤트 종류": "Event Type",
"이전에 확인된 장비의 통신 응답이 끊어짐": "Communication with a previously responsive device was lost",
"인증서를 불러오는 중": "Loading certificates",
"인증서를 삭제했습니다.": "Certificate was deleted.",
"일": "Days",
"일시 잠긴 계정으로 로그인을 시도했습니다.": "A login was attempted with a temporarily locked account.",
"읽기": "Read",
"읽기/쓰기": "Read / Write",
"입력한 시각으로 장비 시간을 동기화하고 설정을 영구 저장했습니다.": "Device time was synchronized to the entered time and saved permanently.",
"작업 전 현재 구성과 서비스 상태를 확인하세요.": "Check the current configuration and service status before proceeding.",
"작업이 완료되었습니다.": "Operation completed.",
"작업자:": "Actor:",
"장비 로그 시각을 확인하고 있습니다.": "Checking the device log time.",
"장비 설정을 변경했습니다.": "Device settings were updated.",
"장비 시간을 현재 PC 시간으로 맞췄습니다. NTP 설정은 변경하지 않았습니다.": "Device time was synchronized with the current PC time. NTP settings were not changed.",
"장비 시작/종료": "Device Startup / Shutdown",
"장비 재시작이 예약되었습니다.": "Device restart was scheduled.",
"장비 전원이 켜져 새로 시작되었습니다.": "The device powered on and started.",
"장비 하드웨어가 제공하지 않는 DCD/DSR 신호는 기록할 수 없습니다.": "DCD/DSR signals unavailable from the hardware cannot be recorded.",
"장비 화면": "Device Console",
"장비에서 실제 발생한 시리얼 세션, 명령 및 수신/전송 이벤트만 조회합니다.": "Shows only serial sessions, commands, and RX/TX events generated on the device.",
"장비에서 실제 수집되어 tera-logd에 저장된 시스템 이벤트만 조회합니다.": "Shows only system events collected on the device and stored by tera-logd.",
"장비의 Local 인증 저장소에 사용자를 추가합니다.": "Add a user to the device's local authentication store.",
"장치 ID": "Device ID",
"적용할 네트워크 변경사항이 없습니다.": "There are no network changes to apply.",
"전송": "Transmit",
"전송(TX)": "Transmit (TX)",
"전체 메뉴의 변경 내용을 저장한 뒤 재시작하시겠습니까?": "Save changes from all menus and restart?",
"전체 설정 저장 및 재시작을 요청했습니다.": "Save-all and restart was requested.",
"정상화되었습니다.": "Returned to normal.",
"조건에 맞는 시스템 로그가 없습니다.": "No system logs match the filters.",
"조건에 맞는 포트 로그가 없습니다.": "No port logs match the filters.",
"조건에 맞는 포트 상태 이벤트가 없습니다.": "No port status events match the filters.",
"종료 시간을 확인하세요.": "Check the end time.",
"주 네트워크 연결이 불안정하여 예비 경로를 확인하고 있습니다.": "The primary network link is unstable; checking the fallback path.",
"주소 필터 규칙을 삭제했습니다.": "Address filter rule was deleted.",
"주소 필터 규칙을 추가했습니다.": "Address filter rule was added.",
"주소 필터 목록을 초기화할 수 없습니다.": "Could not initialize the address filter list.",
"주소 필터를 장비에 적용했습니다.": "Address filter was applied to the device.",
"진단 결과 대기 시간이 초과되었습니다.": "Timed out waiting for diagnostic results.",
"진단 요청 실패": "Diagnostic Request Failed",
"처음 로그인한 계정은 비밀번호를 먼저 변경해야 합니다.": "First-time users must change their password before continuing.",
"최대 64자이며 생성 후에는 변경할 수 없습니다.": "Maximum 64 characters; cannot be changed after creation.",
"최신 신호 변경이 위에 표시됩니다.": "The latest signal changes appear first.",
"최신 이벤트가 위에 표시됩니다.": "The latest events appear first.",
"출력 결과가 없습니다.": "No output available.",
"키 없음": "No Key",
"테스트를 실행하면 백엔드 진단 작업 결과가 여기에 표시됩니다.": "Run a test to display backend diagnostic results here.",
"파일을 선택하세요.": "Select a file.",
"펌웨어 서명 검증에 실패했습니다.": "Firmware signature verification failed.",
"펌웨어 업데이트를 요청했습니다.": "Firmware update was requested.",
"포트 상태 요약": "Port Status Summary",
"포트 설정 > 고급 설정의 Alarm 키워드 사용": "Use Alarm Keyword under Port Settings > Advanced Settings",
"포트 설정 화면에서 선택한 채널을 백엔드에서 재시작합니다.": "Restart the channels selected on the Port Settings page through the backend.",
"포트 세션 연결 중": "Connecting Port Session",
"포트 접속 세션이 시작되었습니다.": "Port access session started.",
"포트 접속 세션이 종료되었습니다.": "Port access session ended.",
"포트 표시": "Show Port",
"포트를 생략하면 표준 Syslog 포트 514를 사용합니다.": "If omitted, standard Syslog port 514 is used.",
"포트별 시리얼 이벤트": "Serial Events by Port",
"핑 응답 타임아웃": "Ping Reply Timeout",
"핑 테스트": "Ping Test",
"핑 패킷 크기": "Ping Packet Size",
"핑 횟수": "Ping Count",
"허용 목록 적용 전 현재 PC 주소를 반드시 등록하세요": "Register the current PC address before enabling the allow list",
"허용 목록에 현재 관리 PC가 없으면 웹 접속이 즉시 차단될 수 있습니다. 적용하시겠습니까?": "If the current management PC is not on the allow list, web access may be blocked immediately. Apply?",
"허용 목록을 사용하려면 먼저 현재 관리 PC를 허용하는 규칙을 추가하세요.": "Add a rule allowing the current management PC before enabling the allow list.",
"현재 경로:": "Current Path:",
"현재 설정을 영구 저장했습니다.": "Current settings were saved permanently.",
"현재 장비의 시스템 재시작 작업을 요청합니다.": "Request a system restart for the current device.",
"현재 터미널 세션만 종료합니다.": "Close only the current terminal session.",
"Administrators (관리자)": "Administrators",
"ASCII 문자열 입력": "Enter ASCII Text",
"CSR 파일을 생성했습니다.": "CSR file was created.",
"Ctrl+] 후 T/Q/B/I/? 명령을 사용합니다.": "Press Ctrl+] followed by T/Q/B/I/? commands.",
"DCD 상태 변경": "DCD Status Change",
"DCD, DSR, CTS 또는 메시지": "DCD, DSR, CTS, or Message",
"DSR 상태 변경": "DSR Status Change",
"eth0 / 192.168.0.233 / 1000Mbps / 링크 연결": "eth0 / 192.168.0.233 / 1000Mbps / Link Up",
"eth0과 eth1을 bond0로 묶습니다. IP, 게이트웨이, DNS는 Interface 1 설정을 사용합니다.": "Combine eth0 and eth1 into bond0. IP, gateway, and DNS use Interface 1 settings.",
"eth0과 eth1을 br0에 연결합니다. IP, 게이트웨이, DNS는 Interface 1 설정을 사용합니다.": "Attach eth0 and eth1 to br0. IP, gateway, and DNS use Interface 1 settings.",
"Interface 1 (주 회선)": "Interface 1 (Primary Link)",
"Interface 1 장애 시 Interface 2(eth1)로 전환합니다.": "Fail over to Interface 2 (eth1) if Interface 1 fails.",
"Interface 1(eth0)을 우선 사용합니다.": "Prefer Interface 1 (eth0).",
"Interface 1과 Interface 2를 각각 독립된 네트워크 인터페이스로 사용하며 자동 전환하지 않습니다.": "Use Interface 1 and Interface 2 independently without automatic failover.",
"Interface 1을 항상 우선 사용하고 장애 감지 시 Interface 2로 전환합니다. 두 인터페이스는 서로 다른 IPv4 대역과 게이트웨이가 필요합니다.": "Always prefer Interface 1 and fail over to Interface 2 on a detected fault. The interfaces require separate IPv4 subnets and gateways.",
"Interface 2 (예비 회선)": "Interface 2 (Fallback Link)",
"NTP 서버로 장비 시간을 동기화하고 설정을 영구 저장했습니다.": "Device time was synchronized with the NTP server and saved permanently.",
"NTP 서버를 한 개 이상 입력하세요.": "Enter at least one NTP server.",
"Port operators (포트 운영자)": "Port Operators",
"Reverse 모드의 현재 세션과 동시 접속 유지 상태를 확인합니다.": "View current Reverse-mode sessions and concurrent connection state.",
"RX 또는 CR 응답 대기": "Waiting for RX or CR Response",
"SMTP 인증을 사용하려면 비밀번호를 입력하세요.": "Enter a password to enable SMTP authentication.",
"SNMP 설정을 변경했습니다.": "SNMP settings were updated.",
"SNMP Trap 설정을 변경했습니다.": "SNMP Trap settings were updated.",
"SNMP Trap 테스트를 전송했습니다.": "SNMP Trap test was sent.",
"SNMP v2c를 사용하려면 Read Community를 입력하세요.": "Enter a Read Community to enable SNMP v2c.",
"SNMP v3를 사용하려면 활성 v3 사용자를 설정하세요.": "Configure an active v3 user to enable SNMP v3.",
"SNMP를 사용하려면 v1, v2c, v3 중 하나를 선택하세요.": "Select at least one of v1, v2c, or v3 to enable SNMP.",
"SSL 인증서 서명 요청을 만들었습니다.": "SSL certificate signing request was created.",
"SSL 인증서 설정을 변경했습니다.": "SSL certificate settings were updated.",
"SSL 인증서를 가져왔습니다.": "SSL certificate was imported.",
"SSL 인증서를 삭제했습니다.": "SSL certificate was deleted.",
"SSL 인증서를 생성했습니다.": "SSL certificate was created.",
"Syslog 서버를 도메인 또는 IP 주소로 지정합니다. 포트는 주소 뒤에 콜론(:)으로 입력할 수 있습니다.": "Specify the Syslog server by domain or IP address. Append a port using a colon (:).",
"TERA 메일 알림 테스트": "TERA Email Alert Test",
"TERA 장비 알림": "TERA Device Alert",
"TERA SNMP Trap 테스트": "TERA SNMP Trap Test",
"Trap 전송을 사용하려면 Community 또는 인증 키를 입력하세요.": "Enter a Community or authentication key to enable Trap delivery.",
"Viewers (조회 사용자)": "Viewers"
});
function translateExactLabel(label) {
if (Object.prototype.hasOwnProperty.call(exact, label)) { return exact[label]; }
const portSettings = label.match(/^포트 설정 \/ Port (\d+)$/);
if (portSettings) { return "Port Settings / Port " + portSettings[1]; }
const portDebug = label.match(/^포트 디버그 \/ Port (\d+)$/);
if (portDebug) { return "Port Debug / Port " + portDebug[1]; }
return label;
}
const patterns = [
[/^시스템 이벤트 (\d+)건을 삭제했습니다\. 감사 기록은 보존됩니다\.$/, "Deleted $1 system events. Audit records are preserved."],
[/^삭제 대상: (CH\d{2}) · 저장된 통신 로그 전체$/, "Delete target: $1 · All stored communication logs"],
[/^(CH\d{2})의 저장된 포트 로그 전체를 삭제합니다\.[\s\S]+을 정확히 입력하세요\.$/, "Delete all stored port logs for $1.\nThis permanently deletes RX/TX, command, and session records regardless of date, filters, or row limit.\nExport required records first. Exports use the current filters and row limit. Configuration backups do not contain log records.\nOther ports, system logs, audit logs, and port status events are preserved. New logging continues.\nType $1 exactly to continue."],
[/^(CH\d{2}) 포트 로그 (\d+)건을 삭제했습니다\. 이후 발생하는 로그는 계속 저장됩니다\.$/, "Deleted $2 port log records for $1. New logs will continue to be recorded."],
[/^최대 (\d+)건 표시 · 전체 저장 건수가 아닙니다\.$/, "Showing up to $1 items · not the total stored."],
[/^장비 시간대를 확인할 수 없습니다\. 표시 시간대: (.+)$/, "Device time zone unavailable. Display time zone: $1"],
[/^장비 시각 정보를 일부 확인할 수 없습니다\. 표시 시간대: (.+)$/, "Device clock information is incomplete. Display time zone: $1"],
[/^C:\\> (.+)$/, function (_, message) { return "C:\\> " + translateExactLabel(message); }],
[/^(.+) 닫기$/, function (_, label) { return translateExactLabel(label) + " Close"; }],
[/^인터페이스 (\d+) IPv4 설정$/, "Interface $1 IPv4 Settings"],
[/^로그인 - (.+)$/, "Sign in - $1"],
[/^포트 (%d|\d+) 설정$/, "Port $1 Settings"],
[/^포트 설정 \/ Port (%d|\d+)$/, "Port Settings / Port $1"],
[/^포트 디버그 \/ Port (%d|\d+)$/, "Port Debug / Port $1"],
[/^Port (\d+) 개별 보기$/, "View Port $1"],
[/^Port (\d+) 적용 대상 추가$/, "Add Port $1 to Targets"],
[/^(\d+)건$/, "$1 Items"],
[/^(\d+)개$/, "$1"],
[/^(\d+)명$/, "$1 Users"],
[/^(\d+)위$/, "#$1"],
[/^(\d+)일 (\d+)시간 (\d+)분 (\d+)초$/, "$1d $2h $3m $4s"],
[/^(\d+)년 (\d+)월 (\d+)일 .* (오전|오후) (\d+)시 (\d+)분 (\d+)초$/, "$1-$2-$3 $5:$6:$7"],
[/^조회 완료 · (\d+)건$/, "Loaded · $1 Items"],
[/^조회 완료 · (.+)$/, "Loaded · $1"],
[/^(\d+)개 쓰기$/, "$1 Write"],
[/^(\d+)개 읽기$/, "$1 Read"],
[/^등록된 (.+)$/, "Registered $1"],
[/^기본 숨김 · 현재 모드 (.+)$/, "Hidden by Default · Current Mode $1"],
[/^(.+)을 다른 인터페이스와 독립적으로 사용합니다\.$/, "Use $1 independently from the other interface."],
[/^로그 저장 공간 사용률이 (.+)$/, "Log storage usage is $1"],
[/^장비 시스템 시간이 설정되지 않았습니다 \((.+)$/, "Device system time is not set ($1"],
[/^(.+) 규칙을 삭제하시겠습니까\?$/, "Delete rule $1?"],
[/^(.+) 그룹을 삭제하시겠습니까\?$/, "Delete group $1?"],
[/^(.+) 그룹을 삭제했습니다\.$/, "Group $1 was deleted."],
[/^(.+) 그룹을 수정했습니다\.$/, "Group $1 was updated."],
[/^(.+) 그룹을 추가했습니다\.$/, "Group $1 was added."],
[/^(.+) 인증서를 삭제하시겠습니까\?$/, "Delete certificate $1?"],
[/^(.+) 사용자를 삭제하시겠습니까\? 이 사용자의 기존 로그인 세션도 해제됩니다\.$/, "Delete user $1? The user's existing login sessions will also be terminated."],
[/^(.+) 사용자를 삭제했습니다\.$/, "User $1 was deleted."],
[/^(.+) 사용자를 추가했습니다\.$/, "User $1 was added."],
[/^(.+) 사용자 정보를 수정했습니다\.$/, "User $1 was updated."],
[/^(.+) 사용자의 비밀번호를 재설정했습니다\.$/, "Password for user $1 was reset."],
[/^(.+) 연결이 정상화되었습니다\.$/, "$1 connection recovered."],
[/^(.+) 연결이 끊어졌습니다\.$/, "$1 connection was lost."],
[/^(.+) 정보를 찾을 수 없습니다\.$/, "$1 information was not found."],
[/^(.+) 포트 정보를 찾을 수 없습니다\.$/, "Port information for $1 was not found."]
];
const fragments = [
["로그 원본 타임스탬프 · 표시 시간대:", "Original Log Timestamp · Display Time Zone:"],
["). 로그 날짜는 API에 저장된 원본 시각이며 브라우저 현재 날짜로 교체하지 않습니다.", "). Log dates use the original API timestamp and are not replaced with the browser's current date."],
[" 그룹의 역할과 권한을 수정합니다.", " Edit this group's role and permissions."],
[" 사용자의 새 비밀번호를 설정합니다. 저장하면 기존 로그인 세션이 해제됩니다.", " Set a new password for this user. Saving terminates existing login sessions."],
[" 사용자의 비밀번호를 재설정했습니다.", " user's password was reset."],
[" 사용자를 삭제했습니다.", " user was deleted."],
[" 사용자를 추가했습니다.", " user was added."],
[" 사용자 정보를 수정했습니다.", " user information was updated."],
[" 그룹을 삭제했습니다.", " group was deleted."],
[" 그룹을 수정했습니다.", " group was updated."],
[" 그룹을 추가했습니다.", " group was added."],
[" 인증서를 삭제하시겠습니까?", " Delete this certificate?"],
[" 규칙을 삭제하시겠습니까?", " Delete this rule?"],
[" 정보를 찾을 수 없습니다.", " information was not found."],
[" 포트 정보를 찾을 수 없습니다.", " port information was not found."],
[" 닫기", " Close"],
["%로 경고 기준 ", "% of warning threshold "],
["%에 도달했습니다.", "% reached."],
["기존 값을 유지하려면 비워두세요", "Leave blank to keep the current value"],
["Local 인증으로 안전하게 전환", "Safely fall back to local authentication"],
["사용자 이름", "Username"], ["그룹 이름", "Group Name"], ["그룹 ID", "Group ID"],
["기본 역할", "Default Role"], ["권한", "Permissions"], ["연결 상태", "Connection Status"],
["수신", "Receive"], ["송신", "Transmit"], ["연결", "Connection"], ["로그", "Log"],
["시작", "Start"], ["종료", "Stop"], ["새로 고침", "Refresh"],
["내보내기", "Export"], ["가져오기", "Import"], ["다운로드", "Download"],
["주소", "Address"], ["서버", "Server"], ["타임아웃", "Timeout"],
["확인 중", "Checking"], ["준비 중", "Starting"], ["연결됨", "Connected"],
["실패", "Failed"], ["성공", "Succeeded"], ["필수", "Required"]
];
function readLanguage() {
let stored = "";
try { stored = window.localStorage.getItem(storageKey) || ""; } catch (_) {}
if (supported.has(stored)) { return stored; }
const cookie = document.cookie.split(";").map(function (value) { return value.trim(); })
.find(function (value) { return value.startsWith(cookieName + "="); });
const cookieValue = cookie ? decodeURIComponent(cookie.slice(cookieName.length + 1)) : "";
return supported.has(cookieValue) ? cookieValue : "ko";
}
function persistLanguage(language) {
try { window.localStorage.setItem(storageKey, language); } catch (_) {}
document.cookie = cookieName + "=" + encodeURIComponent(language) + "; Path=/; Max-Age=31536000; SameSite=Lax";
}
function translate(value) {
const source = String(value == null ? "" : value);
if (!/[가-힣]/.test(source)) { return source; }
const leading = source.match(/^\s*/)?.[0] || "";
const trailing = source.match(/\s*$/)?.[0] || "";
const body = source.slice(leading.length, source.length - trailing.length);
if (Object.prototype.hasOwnProperty.call(exact, body)) {
return leading + exact[body] + trailing;
}
for (const pattern of patterns) {
if (pattern[0].test(body)) {
return leading + body.replace(pattern[0], pattern[1]) + trailing;
}
}
let result = body;
fragments.forEach(function (entry) { result = result.split(entry[0]).join(entry[1]); });
return leading + result + trailing;
}
function skipped(element) {
if (element && element.closest("[data-i18n-ui]")) { return false; }
return Boolean(element && element.closest("script, style, code, pre, [data-i18n-skip], [data-terminal-output], [data-terminal-input]"));
}
function applyText(node) {
const parent = node.parentElement;
if (!parent || skipped(parent)) { return; }
const existing = textOriginal.get(node);
if (currentLanguage === "ko") {
if (existing !== undefined && node.nodeValue !== existing) { node.nodeValue = existing; }
return;
}
if (existing === undefined || node.nodeValue !== translate(existing)) {
textOriginal.set(node, node.nodeValue);
}
const original = textOriginal.get(node);
const translated = translate(original);
if (node.nodeValue !== translated) { node.nodeValue = translated; }
}
function applyAttributes(element) {
if (skipped(element)) { return; }
const names = ["placeholder", "title", "aria-label"];
if (element.matches?.("input[disabled], input[readonly]")) { names.push("value"); }
let originals = attributeOriginal.get(element);
if (!originals) { originals = {}; attributeOriginal.set(element, originals); }
names.forEach(function (name) {
if (!element.hasAttribute(name)) { return; }
const value = element.getAttribute(name) || "";
if (currentLanguage === "ko") {
if (Object.prototype.hasOwnProperty.call(originals, name) && value !== originals[name]) {
element.setAttribute(name, originals[name]);
}
return;
}
if (!Object.prototype.hasOwnProperty.call(originals, name) || value !== translate(originals[name])) {
originals[name] = value;
}
element.setAttribute(name, translate(originals[name]));
});
}
function applyNode(root) {
if (root.nodeType === Node.TEXT_NODE) {
applyText(root);
return;
}
if (root.nodeType !== Node.ELEMENT_NODE && root.nodeType !== Node.DOCUMENT_NODE) { return; }
if (root.nodeType === Node.ELEMENT_NODE) { applyAttributes(root); }
const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT);
let node = walker.nextNode();
while (node) {
if (node.nodeType === Node.TEXT_NODE) { applyText(node); } else { applyAttributes(node); }
node = walker.nextNode();
}
}
function syncSwitches() {
document.querySelectorAll("[data-language-switch]").forEach(function (select) {
select.value = currentLanguage;
});
}
function setLanguage(language) {
if (!supported.has(language)) { return; }
currentLanguage = language;
persistLanguage(language);
document.documentElement.lang = language;
applyNode(document.body);
applyNode(document.head);
syncSwitches();
window.dispatchEvent(new CustomEvent("teraclone:languagechange", { detail: { language: language } }));
}
function start() {
const nativeAlert = window.alert.bind(window);
const nativeConfirm = window.confirm.bind(window);
window.alert = function (message) {
return nativeAlert(currentLanguage === "en" ? translate(message) : message);
};
window.confirm = function (message) {
return nativeConfirm(currentLanguage === "en" ? translate(message) : message);
};
document.addEventListener("change", function (event) {
const select = event.target.closest?.("[data-language-switch]");
if (select) { setLanguage(select.value); }
});
setLanguage(currentLanguage);
observer = new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
if (mutation.type === "characterData") { applyText(mutation.target); }
mutation.addedNodes.forEach(applyNode);
});
syncSwitches();
});
observer.observe(document.documentElement, { subtree: true, childList: true, characterData: true });
}
window.teraI18n = {
get language() { return currentLanguage; },
setLanguage: setLanguage,
t: function (value) { return currentLanguage === "en" ? translate(value) : String(value); }
};
if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", start, { once: true }); }
else { start(); }
}());