This is an automated email from the ASF dual-hosted git repository.

wu-sheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-horizon-ui.git


The following commit(s) were added to refs/heads/main by this push:
     new 05d948d  fix(i18n): improve Korean locale wording (#26)
05d948d is described below

commit 05d948da7ed3188407f785815a9c63b844454399
Author: Daniel Jeong <[email protected]>
AuthorDate: Thu May 28 21:12:40 2026 +0900

    fix(i18n): improve Korean locale wording (#26)
---
 apps/ui/src/i18n/locales/ko.json | 154 +++++++++++++++++++--------------------
 1 file changed, 77 insertions(+), 77 deletions(-)

diff --git a/apps/ui/src/i18n/locales/ko.json b/apps/ui/src/i18n/locales/ko.json
index 6b077ed..baa30dd 100644
--- a/apps/ui/src/i18n/locales/ko.json
+++ b/apps/ui/src/i18n/locales/ko.json
@@ -20,7 +20,7 @@
   "for backend selection, user / role schema, and an LDAP example.": "에서 백엔드 
선택, 사용자/역할 스키마, LDAP 예제를 확인하세요.",
   "All Rights Reserved.": "All Rights Reserved.",
   "Invalid username or password.": "사용자 이름 또는 비밀번호가 올바르지 않습니다.",
-  "login failed": "로그인에 실패했습니다",
+  "login failed": "로그인하지 못했습니다",
   "© {from} – {to} The Apache Software Foundation.": "© {from} – {to} The 
Apache Software Foundation.",
   "Apache SkyWalking, SkyWalking, Apache, the Apache feather logo, and the 
Apache SkyWalking project logo are either registered trademarks or trademarks 
of the Apache Software Foundation.": "Apache SkyWalking, SkyWalking, Apache, 
Apache 깃털 로고 및 Apache SkyWalking 프로젝트 로고는 Apache Software Foundation의 등록 상표 또는 
상표입니다.",
   "Collapse menu": "메뉴 접기",
@@ -36,7 +36,7 @@
   "Admin": "관리",
   "Cluster status": "클러스터 상태",
   "Data retention": "데이터 보존",
-  "OAP configuration": "OAP 구성",
+  "OAP configuration": "OAP 설정",
   "Alerting rules": "알림 규칙",
   "DSL management": "DSL 관리",
   "OAL · read-only": "OAL · 읽기 전용",
@@ -131,8 +131,8 @@
   "Published {locale} translations — now live for everyone.": "{locale} 번역이 
게시되었습니다 — 모든 사용자에게 표시됩니다.",
   "Timeout waiting for OAP propagation. Refetching…": "OAP 전파 대기 시간이 초과되었습니다. 
다시 가져오는 중…",
   "Refetched after timeout — verify on OAP.": "시간 초과 후 다시 가져왔습니다 — OAP에서 
확인하세요.",
-  "Push failed: {error}": "게시 실패: {error}",
-  "Push failed": "게시 실패",
+  "Push failed: {error}": "게시하지 못했습니다: {error}",
+  "Push failed": "게시하지 못했습니다",
   "Discarded {locale} local draft.": "{locale} 로컬 초안을 취소했습니다.",
   "Auto-refresh paused while a custom time range is selected": "사용자 지정 시간 범위가 
선택된 동안 자동 새로 고침이 일시 중지됨",
   "Auto-refresh off · click to refresh now": "자동 새로 고침 꺼짐 · 지금 새로 고치려면 클릭",
@@ -393,7 +393,7 @@
   "To": "종료",
   "Results": "결과",
   "{n} traces": "{n}개 트레이스",
-  "Zipkin query failed.": "Zipkin 쿼리에 실패했습니다.",
+  "Zipkin query failed.": "Zipkin 쿼리를 실행하지 못했습니다.",
   "Click Run query to fetch Zipkin traces for this service.": "이 서비스의 Zipkin 
트레이스를 가져오려면 쿼리 실행을 클릭하세요.",
   "No Zipkin traces in the selected window. Widen the time range or relax 
conditions.": "선택한 구간에 Zipkin 트레이스가 없습니다. 시간 범위를 넓히거나 조건을 완화하세요.",
   "ERR": "ERR",
@@ -522,11 +522,11 @@
   "degraded (score {n})": "성능 저하(점수 {n})",
   "all selectors on": "모든 셀렉터 활성",
   "{n} selectors off": "{n}개 셀렉터 비활성",
-  "reachable": "도달 가능",
-  "Zipkin endpoint unreachable": "Zipkin 엔드포인트에 도달할 수 없음",
-  "Tried {url}. Confirm the OAP admin-server module is on 
(SW_ADMIN_SERVER=default) and the port is exposed on the network / k8s Service 
/ ingress.": "{url} 을(를) 시도했습니다. OAP의 admin-server 모듈이 켜져 
있는지(SW_ADMIN_SERVER=default), 포트가 네트워크 / k8s Service / ingress 를 통해 노출되어 있는지 
확인하세요.",
-  "OAP's Zipkin v2 endpoint, source for the OpenTelemetry & Zipkin trace menu 
(shown when a layer's trace source is zipkin or both). This is the only page 
affected — if it's unreachable, native traces and every other observability 
page keep working.": "OAP의 Zipkin v2 엔드포인트로, OpenTelemetry 및 Zipkin 트레이스 메뉴의 
데이터 소스입니다(레이어의 trace 소스가 zipkin 또는 both 일 때 표시). 영향을 받는 페이지는 이 페이지뿐이며, 도달 불가 
상태여도 네이티브 트레이스와 다른 모든 가관측 페이지는 정상 동작합니다.",
-  "Tried {url}. Confirm OAP's Zipkin receiver / query is enabled and the 
oap.zipkinUrl in horizon's config points at the right host:port (shared GraphQL 
port → <queryUrl>/zipkin; standalone → :9412/zipkin). Only the Zipkin trace 
menu is affected.": "{url} 을(를) 시도했습니다. OAP의 Zipkin receiver / query 가 활성화되어 
있고, horizon 설정의 oap.zipkinUrl 이 올바른 host:port를 가리키는지 확인하세요(공유 GraphQL 포트 → 
<queryUrl>/zipkin, 독립 → :9412/zipkin). 영향을 받는 것은 Zipkin 트레이스 메뉴뿐입니다.",
+  "reachable": "연결 가능",
+  "Zipkin endpoint unreachable": "Zipkin 엔드포인트에 연결할 수 없음",
+  "Tried {url}. Confirm the OAP admin-server module is on 
(SW_ADMIN_SERVER=default) and the port is exposed on the network / k8s Service 
/ ingress.": "{url}을(를) 시도했습니다. OAP의 admin-server 모듈이 켜져 
있는지(SW_ADMIN_SERVER=default), 포트가 네트워크 / k8s Service / ingress 를 통해 노출되어 있는지 
확인하세요.",
+  "OAP's Zipkin v2 endpoint, source for the OpenTelemetry & Zipkin trace menu 
(shown when a layer's trace source is zipkin or both). This is the only page 
affected — if it's unreachable, native traces and every other observability 
page keep working.": "OAP의 Zipkin v2 엔드포인트로, OpenTelemetry 및 Zipkin 트레이스 메뉴의 
데이터 소스입니다(레이어의 trace 소스가 zipkin 또는 both일 때 표시). 영향을 받는 페이지는 이 페이지뿐이며, 연결 불가 
상태여도 네이티브 트레이스와 다른 모든 옵저버빌리티 페이지는 정상 동작합니다.",
+  "Tried {url}. Confirm OAP's Zipkin receiver / query is enabled and the 
oap.zipkinUrl in horizon's config points at the right host:port (shared GraphQL 
port → <queryUrl>/zipkin; standalone → :9412/zipkin). Only the Zipkin trace 
menu is affected.": "{url}을(를) 시도했습니다. OAP의 Zipkin receiver / query가 활성화되어 있고, 
horizon 설정의 oap.zipkinUrl 이 올바른 host:port를 가리키는지 확인하세요(공유 GraphQL 포트 → 
<queryUrl>/zipkin, 독립 → :9412/zipkin). 영향을 받는 것은 Zipkin 트레이스 메뉴뿐입니다.",
   "Everything Studio does against the admin port. Without admin-server, the 
other three modules fail at boot with ModuleNotFoundException.": "Studio가 관리 
포트에서 수행하는 모든 작업입니다. admin-server가 없으면 나머지 세 모듈은 ModuleNotFoundException으로 부팅에 
실패합니다.",
   "DSL Management (Catalog, OAL catalog), Editor save/load, Cluster status 
rule matrix, Live debugger rule picker, and the Inspect drawer's source 
attribution.": "DSL 관리(Catalog, OAL catalog), 에디터 저장/불러오기, Cluster Status 규칙 
매트릭스, Live Debugger 규칙 선택기, Inspect 드로어의 소스 출처.",
   "Live debugger across MAL / LAL / OAL (start / poll / stop) and the 
DSL-debugging health pane on Cluster status.": "MAL / LAL / OAL 전반의 Live 
Debugger(시작 / 폴링 / 중지)와 Cluster Status의 DSL-debugging 상태 패널.",
@@ -538,11 +538,11 @@
   "+ all": "+ 전체",
   "+ {n} more rows": "+ {n}개 행 더 보기",
   "+ {n} null fields hidden": "+ null 필드 {n}개 숨김",
-  "/inspect/entities returned no rows in the selected range": 
"/inspect/entities 가 선택한 범위에서 행을 반환하지 않았습니다",
+  "/inspect/entities returned no rows in the selected range": 
"/inspect/entities가 선택한 범위에서 행을 반환하지 않았습니다",
   "2 hours": "2시간",
   "20 minutes": "20분",
   "4 hours": "4시간",
-  "5 per row · per-widget entity defaults to top-1 from /inspect/entities": "한 
행에 5개 · 위젯별 엔터티는 /inspect/entities 의 top-1 을 기본값으로 사용",
+  "5 per row · per-widget entity defaults to top-1 from /inspect/entities": "한 
행에 5개 · 위젯별 엔터티는 /inspect/entities의 top-1을 기본값으로 사용",
   "6 hours … 14 days": "6시간 … 14일",
   "; finished sessions auto-save here.": "; 완료된 세션은 여기에 자동 저장됩니다.",
   "A sentinel granted only to the administrator role. Implies every other 
permission.": "관리자 역할에만 부여되는 보호 권한입니다. 다른 모든 권한을 포함합니다.",
@@ -554,7 +554,7 @@
   "Add layer": "레이어 추가",
   "Add metrics to the board": "보드에 메트릭 추가",
   "Add {n} to board": "보드에 {n}개 추가",
-  "Admin server unreachable — {err}. Check the {sel} selector and the BFF's 
{url}.": "Admin 서버에 도달할 수 없습니다 — {err}. {sel} 선택기와 BFF의 {url} 을 확인하세요.",
+  "Admin server unreachable — {err}. Check the {sel} selector and the BFF's 
{url}.": "Admin 서버에 연결할 수 없습니다 — {err}. {sel} 선택기와 BFF의 {url}을 확인하세요.",
   "Alarm page setup": "경보 페이지 설정",
   "Alarm rules": "경보 규칙",
   "Alert page setup": "알림 페이지 설정",
@@ -569,11 +569,11 @@
   "Break-glass": "Break-glass",
   "CONFIGURED": "CONFIGURED",
   "Capabilities that have not been described yet.": "아직 설명되지 않은 기능입니다.",
-  "Catalog load failed:": "카탈로그 로드 실패:",
+  "Catalog load failed:": "카탈로그를 불러오지 못했습니다:",
   "Change role grants": "역할 권한 부여 변경",
   "Change rule schema (OAL files)": "규칙 스키마 변경 (OAL 파일)",
-  "Config file": "구성 파일",
-  "Configures alerts, dashboards, rules, and runs diagnostics.": "알림, 대시보드, 
규칙을 구성하고 진단을 수행합니다.",
+  "Config file": "설정 파일",
+  "Configures alerts, dashboards, rules, and runs diagnostics.": "알림, 대시보드, 
규칙을 설정하고 진단을 수행합니다.",
   "Currently watching ({n})": "현재 감시 중 ({n})",
   "DISABLED": "DISABLED",
   "DN:": "DN:",
@@ -581,7 +581,7 @@
   "Dashboard setup · Global defaults": "대시보드 설정 · 전역 기본값",
   "Data catalog": "데이터 카탈로그",
   "Default time window": "기본 시간 범위",
-  "Default window for the topbar time picker, which feeds {scope}. The OAP 
{step} precision is derived from the window — you don't pick it separately:": 
"상단 시간 선택기의 기본 범위로, {scope} 에 적용됩니다. OAP {step} 정밀도는 범위에서 자동으로 결정되며 별도로 선택하지 
않습니다:",
+  "Default window for the topbar time picker, which feeds {scope}. The OAP 
{step} precision is derived from the window — you don't pick it separately:": 
"상단 시간 선택기의 기본 범위로, {scope}에 적용됩니다. OAP {step} 정밀도는 범위에서 자동으로 결정되며 별도로 선택하지 
않습니다:",
   "Defaults are": "기본값은",
   "Delete rules": "규칙 삭제",
   "Diagnostics & debug": "진단 및 디버그",
@@ -598,11 +598,11 @@
   "Exclude entities": "엔터티 제외",
   "Expression": "표현식",
   "FAIL": "FAIL",
-  "Failed to load:": "로드 실패:",
-  "Failed to load: {err}": "로드 실패: {err}",
-  "Failed to load: {msg}": "로드 실패: {msg}",
+  "Failed to load:": "불러오지 못했습니다:",
+  "Failed to load: {err}": "불러오지 못했습니다: {err}",
+  "Failed to load: {msg}": "불러오지 못했습니다: {msg}",
   "Fetch cap": "조회 상한",
-  "Five bundled themes ship with Horizon. The org default is the starting 
theme every user sees on first visit. Each user can override locally via the 
topbar theme chip (stored in {key}).": "Horizon에는 5개의 번들 테마가 포함되어 있습니다. 조직 기본값은 
모든 사용자가 처음 방문할 때 보게 되는 시작 테마입니다. 각 사용자는 상단 테마 칩을 통해 로컬에서 재정의할 수 있습니다({key} 에 
저장).",
+  "Five bundled themes ship with Horizon. The org default is the starting 
theme every user sees on first visit. Each user can override locally via the 
topbar theme chip (stored in {key}).": "Horizon에는 5개의 번들 테마가 포함되어 있습니다. 조직 기본값은 
모든 사용자가 처음 방문할 때 보게 되는 시작 테마입니다. 각 사용자는 상단 테마 칩을 통해 로컬에서 재정의할 수 있습니다({key}에 
저장).",
   "From LDAP": "LDAP에서",
   "Full access including user & access management.": "사용자 및 접근 관리를 포함한 전체 접근 
권한.",
   "Glance": "한눈에 보기",
@@ -656,7 +656,7 @@
   "OAP cluster status": "OAP 클러스터 상태",
   "OAP reset to bundled · reload to see header changes": "OAP를 번들 버전으로 재설정 · 
헤더 변경을 보려면 다시 로드하세요",
   "OAP reset to bundled — reload to pick up the change": "OAP를 번들 버전으로 재설정 — 
변경을 반영하려면 다시 로드하세요",
-  "OAP unreachable — page is read-only": "OAP에 도달할 수 없습니다 — 페이지가 읽기 전용입니다",
+  "OAP unreachable — page is read-only": "OAP에 연결할 수 없습니다 — 페이지가 읽기 전용입니다",
   "Operate · Alerting": "운영 · 알림",
   "Org-wide defaults for the UI theme and the topbar's default time window. 
Both can be overridden per-user in the browser (theme chip in the topbar, 
\"Save as my default\" in the time picker). Edits here write to OAP; bundled 
JSON is the seed + read-only fallback.": "UI 테마와 상단의 기본 시간 범위에 대한 조직 전체 기본값입니다. 
두 값 모두 브라우저에서 사용자별로 재정의할 수 있습니다(상단의 테마 칩, 시간 선택기의 \"내 기본값으로 저장\"). 여기서의 편집은 
OAP에 기록되며, 번들 JSON은 초기값과 읽기 전용 폴백 역할을 합니다.",
   "Other": "기타",
@@ -675,11 +675,11 @@
   "Profiling": "프로파일링",
   "Profiling results": "프로파일링 결과",
   "Provider": "공급자",
-  "Reachable": "도달 가능",
+  "Reachable": "연결 가능",
   "Read the audit log": "감사 로그 읽기",
   "Read verb": "읽기 권한",
-  "Read-only catalog of every alarm rule loaded by OAP, with its body and 
per-node load state. Rules edit through OAP's {file} + watcher reload — there's 
no mutation surface here by design.": "OAP가 로드한 모든 경보 규칙의 읽기 전용 카탈로그로, 규칙 본문과 
노드별 로드 상태를 포함합니다. 규칙은 OAP의 {file} 과 watcher 리로드로 편집되며 — 의도적으로 여기에 변경 수단을 두지 
않았습니다.",
-  "Read-only data screens. Everyone signed in sees these by default — they are 
the core observability surface.": "읽기 전용 데이터 화면입니다. 로그인한 모든 사용자가 기본적으로 볼 수 있으며 
— 핵심 가관측성 화면입니다.",
+  "Read-only catalog of every alarm rule loaded by OAP, with its body and 
per-node load state. Rules edit through OAP's {file} + watcher reload — there's 
no mutation surface here by design.": "OAP가 로드한 모든 경보 규칙의 읽기 전용 카탈로그로, 규칙 본문과 
노드별 로드 상태를 포함합니다. 규칙은 OAP의 {file}과 watcher 리로드로 편집되며 — 의도적으로 여기에 변경 수단을 두지 
않았습니다.",
+  "Read-only data screens. Everyone signed in sees these by default — they are 
the core observability surface.": "읽기 전용 데이터 화면입니다. 로그인한 모든 사용자가 기본적으로 볼 수 있으며 
— 핵심 옵저버빌리티 화면입니다.",
   "Reads dashboards, traces, logs, and alarms.": "대시보드, 트레이스, 로그, 경보를 읽습니다.",
   "Remove {n} widget from the board and clear the saved layout?": "보드에서 위젯 
{n}개를 제거하고 저장된 레이아웃을 비우시겠습니까?",
   "Remove {n} widgets from the board and clear the saved layout?": "보드에서 위젯 
{n}개를 제거하고 저장된 레이아웃을 비우시겠습니까?",
@@ -715,7 +715,7 @@
   "Service bind DN": "서비스 바인드 DN",
   "Service dashboards": "서비스 대시보드",
   "Sessions": "세션",
-  "Set {flag} on the admin-server, then click refresh.": "admin-server 에서 
{flag} 을(를) 설정한 다음 새로 고침을 클릭하세요.",
+  "Set {flag} on the admin-server, then click refresh.": "admin-server에서 
{flag}을(를) 설정한 다음 새로 고침을 클릭하세요.",
   "Show side-by-side diff vs OAP, and reset OAP back to bundled (with 
confirmation).": "OAP와의 나란히 비교 diff를 표시하고, OAP를 번들 버전으로 재설정합니다(확인 필요).",
   "Source": "소스",
   "Source: All": "소스: 전체",
@@ -729,7 +729,7 @@
   "Test queries in the MQE sandbox": "MQE 샌드박스에서 쿼리 테스트",
   "The MQE, OAL and runtime-rule editing surface. Schema-breaking edits and 
deletes are split out so a junior operator can author rules without being able 
to break things irreversibly.": "MQE, OAL 및 런타임 규칙 편집 영역입니다. 스키마를 깨뜨리는 편집과 삭제는 
분리되어 있어, 주니어 운영자가 되돌릴 수 없는 손상을 일으키지 않고도 규칙을 작성할 수 있습니다.",
   "The administrator surface: who can sign in, what role they have, and the 
live status of the auth backend.": "관리자 화면: 누가 로그인할 수 있는지, 어떤 역할을 가지는지, 인증 백엔드의 
실시간 상태.",
-  "The auditable record of every sign-in, rule change, and configuration edit. 
Written to a file the operator can ship to an SIEM; no in-app viewer yet.": "모든 
로그인, 규칙 변경, 구성 편집에 대한 감사 가능한 기록입니다. 운영자가 SIEM 으로 전송할 수 있는 파일에 기록되며, 아직 앱 내 뷰어는 
없습니다.",
+  "The auditable record of every sign-in, rule change, and configuration edit. 
Written to a file the operator can ship to an SIEM; no in-app viewer yet.": "모든 
로그인, 규칙 변경, 설정 편집에 대한 감사 가능한 기록입니다. 운영자가 SIEM으로 전송할 수 있는 파일에 기록되며, 아직 앱 내 뷰어는 
없습니다.",
   "The dashboards and per-layer setup (slot labels, available features, term 
aliases) operators tune for their org.": "운영자가 조직에 맞게 조정하는 대시보드와 레이어별 설정(슬롯 라벨, 
사용 가능한 기능, 용어 별칭).",
   "The firing rules behind the Alarms screen plus the alarm-page setup (which 
layers contribute to the alarm overview).": "경보 화면 뒤의 발생 규칙과 경보 페이지 설정(어떤 레이어가 
경보 개요에 기여하는지).",
   "The per-layer landing pages users see when they pick a layer in the 
sidebar.": "사용자가 사이드바에서 레이어를 선택할 때 보게 되는 레이어별 랜딩 페이지.",
@@ -772,8 +772,8 @@
   "break-glass": "break-glass",
   "break-glass fallback": "break-glass 폴백",
   "break-glass · file fallback": "break-glass · 파일 폴백",
-  "browser TZ (server unreachable)": "브라우저 TZ (서버 도달 불가)",
-  "cannot save — OAP is unreachable, page is read-only": "저장할 수 없음 — OAP에 도달할 
수 없습니다, 페이지가 읽기 전용입니다",
+  "browser TZ (server unreachable)": "브라우저 TZ (서버 연결 불가)",
+  "cannot save — OAP is unreachable, page is read-only": "저장할 수 없음 — OAP에 연결할 
수 없습니다, 페이지가 읽기 전용입니다",
   "cap {n}": "상한 {n}",
   "capture history": "캡처 기록",
   "catalog · /inspect/metrics": "카탈로그 · /inspect/metrics",
@@ -786,7 +786,7 @@
   "collect": "수집",
   "compact": "압축",
   "completed": "완료됨",
-  "configured (disarmed)": "구성됨 (비활성)",
+  "configured (disarmed)": "설정됨 (비활성)",
   "copy": "복사",
   "copy mqeEntity JSON": "mqeEntity JSON 복사",
   "custom (min)": "사용자 지정 (분)",
@@ -809,14 +809,14 @@
   "filter": "필터",
   "filter username…": "사용자 이름 필터…",
   "first match wins · \"*\" matches every authenticated user": "처음 일치 적용 · 
\"*\" 는 인증된 모든 사용자와 일치",
-  "fixed by /inspect/metrics for {metric}": "{metric} 에 대해 /inspect/metrics 로 
고정됨",
+  "fixed by /inspect/metrics for {metric}": "{metric}에 대해 /inspect/metrics로 
고정됨",
   "for every step.": "모든 단계에 대해.",
   "for password hashes.": "비밀번호 해시용.",
   "function": "함수",
   "hidden": "숨김",
   "in horizon.yaml to arm": "활성화하려면 horizon.yaml 에서",
   "in horizon.yaml. Edits to the file are picked up on hot-reload. Add users 
via the YAML +": "horizon.yaml. 파일 편집은 핫 리로드로 반영됩니다. YAML +",
-  "in horizon.yaml. To add or remove a user, change their group in the 
directory — they'll appear here on next login. Local accounts shown below are 
break-glass only and ignored while LDAP is reachable.": "horizon.yaml. 사용자를 
추가하거나 제거하려면 디렉터리에서 해당 그룹을 변경하세요 — 다음 로그인 시 여기에 표시됩니다. 아래의 로컬 계정은 break-glass 용도 
전용이며 LDAP에 도달 가능한 동안에는 무시됩니다.",
+  "in horizon.yaml. To add or remove a user, change their group in the 
directory — they'll appear here on next login. Local accounts shown below are 
break-glass only and ignored while LDAP is reachable.": "horizon.yaml. 사용자를 
추가하거나 제거하려면 디렉터리에서 해당 그룹을 변경하세요 — 다음 로그인 시 여기에 표시됩니다. 아래의 로컬 계정은 break-glass 용도 
전용이며 LDAP에 연결 가능한 동안에는 무시됩니다.",
   "inputs are browser-local · sent to OAP in": "입력은 브라우저 로컬 시간 · OAP로 전송 시 
단위:",
   "inspector top-n": "인스펙터 top-n",
   "install": "설치",
@@ -837,7 +837,7 @@
   "mtime": "mtime",
   "multi · edit": "다중 · 편집",
   "must be an integer": "정수여야 합니다",
-  "must be between {min} and {max}": "{min} 과 {max} 사이여야 합니다",
+  "must be between {min} and {max}": "{min}과 {max} 사이여야 합니다",
   "name": "이름",
   "never": "안 함",
   "never signed in": "로그인한 적 없음",
@@ -846,9 +846,9 @@
   "no body returned": "본문이 반환되지 않음",
   "no captures match this filter.": "이 필터와 일치하는 캡처가 없습니다.",
   "no entity": "엔터티 없음",
-  "no entity for {metric} in this range": "이 범위에서 {metric} 에 대한 엔터티 없음",
+  "no entity for {metric} in this range": "이 범위에서 {metric}에 대한 엔터티 없음",
   "no metric matches the current filters": "현재 필터와 일치하는 메트릭이 없습니다",
-  "no metrics on the board — use {action} to open the catalog drawer.": "보드에 
메트릭이 없습니다 — {action} 으로 카탈로그 드로어를 여세요.",
+  "no metrics on the board — use {action} to open the catalog drawer.": "보드에 
메트릭이 없습니다 — {action}으로 카탈로그 드로어를 여세요.",
   "no metricsRules found in file": "파일에서 metricsRules 를 찾을 수 없습니다",
   "no node accepted": "수락한 노드 없음",
   "no peers reported": "보고된 피어 없음",
@@ -861,7 +861,7 @@
   "none": "없음",
   "normal": "보통",
   "not": "not",
-  "not MQE-queryable · /inspect/entities accepts REGULAR_VALUE + 
LABELED_VALUE": "MQE 쿼리 불가 · /inspect/entities 는 REGULAR_VALUE + LABELED_VALUE 
만 허용",
+  "not MQE-queryable · /inspect/entities accepts REGULAR_VALUE + 
LABELED_VALUE": "MQE 쿼리 불가 · /inspect/entities는 REGULAR_VALUE + LABELED_VALUE 만 
허용",
   "not allowed": "허용되지 않음",
   "note": "참고",
   "now": "지금",
@@ -891,14 +891,14 @@
   "replaced {n} prior sessions": "이전 세션 {n}개를 대체했습니다",
   "replaced {n} prior sessions: {ids}": "이전 세션 {n}개를 대체했습니다: {ids}",
   "reset": "재설정",
-  "resolved · {n} from /inspect/entities": "해석됨 · /inspect/entities 에서 {n}개",
+  "resolved · {n} from /inspect/entities": "해석됨 · /inspect/entities에서 {n}개",
   "resolves group memberships without authenticating": "인증 없이 그룹 멤버십을 해석합니다",
   "resolving entities…": "엔터티 해석 중…",
   "resolving server TZ…": "서버 TZ 해석 중…",
   "resolving…": "해석 중…",
   "resume →": "재개 →",
-  "save failed": "저장 실패",
-  "save failed: {msg}": "저장 실패: {msg}",
+  "save failed": "저장하지 못했습니다",
+  "save failed: {msg}": "저장하지 못했습니다: {msg}",
   "save to OAP": "OAP에 저장",
   "saved": "저장됨",
   "saved to OAP": "OAP에 저장됨",
@@ -913,7 +913,7 @@
   "select all {n}": "{n}개 모두 선택",
   "select all {n} metrics in this file": "이 파일의 모든 메트릭 {n}개 선택",
   "server TZ ({tz})": "서버 TZ ({tz})",
-  "session live on every reachable OAP": "도달 가능한 모든 OAP에서 세션이 라이브 상태입니다",
+  "session live on every reachable OAP": "연결 가능한 모든 OAP에서 세션이 라이브 상태입니다",
   "session {id}": "세션 {id}",
   "show all": "모두 표시",
   "show diff & reset": "diff 표시 및 재설정",
@@ -928,14 +928,14 @@
   "try a wider range or a coarser step (current: {step})": "더 넓은 범위 또는 거친 단계를 
시도하세요 (현재: {step})",
   "unresolved": "해석되지 않음",
   "unsaved changes": "저장되지 않은 변경 사항",
-  "use for entities /inspect/entities did not surface.": "/inspect/entities 가 
노출하지 않은 엔터티에 사용합니다.",
+  "use for entities /inspect/entities did not surface.": "/inspect/entities가 
노출하지 않은 엔터티에 사용합니다.",
   "username": "사용자 이름",
   "value": "값",
   "visible": "표시됨",
-  "where execExpression fires · resolved via /debugging/config/dump on the 
admin server": "execExpression 이 발화하는 위치 · admin 서버의 /debugging/config/dump 를 
통해 해석",
+  "where execExpression fires · resolved via /debugging/config/dump on the 
admin server": "execExpression 이 발화하는 위치 · admin 서버의 /debugging/config/dump를 통해 
해석",
   "which sidebar items each role sees · gated by the read verb in the last 
column (UI hides; the BFF enforces the same server-side)": "각 역할이 보는 사이드바 항목 · 
마지막 열의 읽기 권한으로 제어됨(UI에서 숨김 처리, BFF가 서버 측에서 동일하게 강제 적용)",
   "with": "with",
-  "{field} is required for scope {scope}": "{field} 은(는) 범위 {scope} 에 필수입니다",
+  "{field} is required for scope {scope}": "{field}은(는) 범위 {scope}에 필수입니다",
   "{minutes} → {precision} step, {buckets} per query.": "{minutes} → 
{precision} 단계, 쿼리당 {buckets}.",
   "{n} / {cap} widgets": "위젯 {n} / {cap}",
   "{n} bucket": "버킷 {n}개",
@@ -956,8 +956,8 @@
   "{n} user(s) defined": "사용자 {n}명 정의됨",
   "{n}m": "{n}분",
   "{n}m window": "{n}분 범위",
-  "{shown} shown of {total} total · {ldap} from LDAP, {local} local · 
refreshed {when}": "전체 {total}개 중 {shown}개 표시 · LDAP {ldap}개, 로컬 {local}개 · 
{when} 에 새로 고침",
-  "{triage} (alarms / traces / logs / live-debugger) own their own time range 
and always query at {sec} precision — they are {not} affected by this 
setting.": "{triage} (경보 / 트레이스 / 로그 / 라이브 디버거)는 자체 시간 범위를 가지며 항상 {sec} 정밀도로 
쿼리합니다 — 이 설정의 영향을 받지 {not} 않습니다.",
+  "{shown} shown of {total} total · {ldap} from LDAP, {local} local · 
refreshed {when}": "전체 {total}개 중 {shown}개 표시 · LDAP {ldap}개, 로컬 {local}개 · 
{when}에 새로 고침",
+  "{triage} (alarms / traces / logs / live-debugger) own their own time range 
and always query at {sec} precision — they are {not} affected by this 
setting.": "{triage} (경보 / 트레이스 / 로그 / 라이브 디버거)는 자체 시간 범위를 가지며 항상 {sec} 정밀도로 
쿼리합니다 — 이 설정의 {not} 영향을 받습니다.",
   "· narrow:": "· 좁히기:",
   "· over OAP cap ({cap})": "· OAP 상한 초과 ({cap})",
   "→ destination": "→ 대상",
@@ -976,7 +976,7 @@
   "Could not load": "로드할 수 없음",
   "Could not load OAL files.": "OAL 파일을 로드할 수 없습니다.",
   "Could not load: {err}": "로드할 수 없음: {err}",
-  "Couldn't reach the OAP query port. Confirm the OAP host is up and the 
configured query URL still resolves from this Horizon server.": "OAP 쿼리 포트에 도달할 
수 없습니다. OAP 호스트가 작동 중이고 구성된 쿼리 URL이 이 Horizon 서버에서 여전히 해석되는지 확인하세요.",
+  "Couldn't reach the OAP query port. Confirm the OAP host is up and the 
configured query URL still resolves from this Horizon server.": "OAP 쿼리 포트에 연결할 
수 없습니다. OAP 호스트가 작동 중이고 설정된 쿼리 URL이 이 Horizon 서버에서 여전히 해석되는지 확인하세요.",
   "Data lifecycle": "데이터 라이프사이클",
   "Day metric": "Day 메트릭",
   "Filter keys or values…": "키 또는 값 필터…",
@@ -984,7 +984,7 @@
   "Hot + Warm {hot} days": "Hot + Warm {hot}일",
   "Hot + Warm {hot} days, Cold {cold} days": "Hot + Warm {hot}일, Cold {cold}일",
   "Hour metric": "Hour 메트릭",
-  "How long the connected OAP keeps each class of data, in whole days. 
Backend: {pill}. BanyanDB ages data through configurable lifecycle stages — 
{hot}, optionally {warm}, optionally {cold}.": "연결된 OAP가 각 데이터 클래스를 며칠 단위로 
보관하는지를 나타냅니다. 백엔드: {pill}. BanyanDB는 구성 가능한 라이프사이클 단계를 거쳐 데이터를 노화시킵니다 — {hot}, 
선택적으로 {warm}, 선택적으로 {cold}.",
+  "How long the connected OAP keeps each class of data, in whole days. 
Backend: {pill}. BanyanDB ages data through configurable lifecycle stages — 
{hot}, optionally {warm}, optionally {cold}.": "연결된 OAP가 각 데이터 클래스를 며칠 단위로 
보관하는지를 나타냅니다. 백엔드: {pill}. BanyanDB는 설정 가능한 라이프사이클 단계를 거쳐 데이터를 단계별로 보관/이관합니다 — 
{hot}, 선택적으로 {warm}, 선택적으로 {cold}.",
   "How long the connected OAP keeps each class of data, in whole days. 
Backend: {pill}. This backend reports a single flat retention per category — no 
hot / warm / cold stages (those are BanyanDB-specific). Read-only; change 
retention on the OAP side.": "연결된 OAP가 각 데이터 클래스를 며칠 단위로 보관하는지를 나타냅니다. 백엔드: 
{pill}. 이 백엔드는 카테고리당 단일 보존 기간만 보고합니다 — hot / warm / cold 단계 없음(해당 단계는 BanyanDB 
전용). 읽기 전용이며, 보존 기간은 OAP 측에서 변경하세요.",
   "Live debug {catalog} · {name}": "라이브 디버그 {catalog} · {name}",
   "Live debug {name}": "라이브 디버그 {name}",
@@ -997,7 +997,7 @@
   "No rules match the current filter.": "현재 필터와 일치하는 규칙이 없습니다.",
   "Normal": "보통",
   "OAL hot-update is upstream-deferred. Each": "OAL 핫 업데이트는 업스트림에서 보류 중입니다. 각",
-  "OAP doesn't expose a restore endpoint yet. Operators recover from a dump by 
looping {endpoint} over each YAML file in the archive. A restore upload 
affordance will land here when the upstream API ships — see Studio's 
deferred-features memory.": "OAP는 아직 복원 엔드포인트를 제공하지 않습니다. 운영자는 아카이브의 각 YAML 파일에 
대해 {endpoint} 를 반복 호출하여 덤프에서 복구합니다. 복원 업로드 기능은 업스트림 API 출시 시 여기에 추가됩니다 — 
Studio의 deferred-features 메모를 참조하세요.",
+  "OAP doesn't expose a restore endpoint yet. Operators recover from a dump by 
looping {endpoint} over each YAML file in the archive. A restore upload 
affordance will land here when the upstream API ships — see Studio's 
deferred-features memory.": "OAP는 아직 복원 엔드포인트를 제공하지 않습니다. 운영자는 아카이브의 각 YAML 파일에 
대해 {endpoint}를 반복 호출하여 덤프에서 복구합니다. 복원 업로드 기능은 업스트림 API 출시 시 여기에 추가됩니다 — Studio의 
deferred-features 메모를 참조하세요.",
   "OAP drops the existing measure’s data on BanyanDB and orphans rows on JDBC 
/ Elasticsearch.": "OAP는 BanyanDB에서 기존 measure의 데이터를 삭제하고, JDBC / Elasticsearch 
에서는 행을 고아 상태로 만듭니다.",
   "OAP runs the standard apply pipeline against the bundled YAML — this is a 
schema change.": "OAP는 번들 YAML에 대해 표준 apply 파이프라인을 실행합니다 — 이는 스키마 변경입니다.",
   "Observability Analysis Language": "Observability Analysis Language",
@@ -1007,22 +1007,22 @@
   "Push one with": "다음으로 푸시:",
   "Records": "레코드",
   "Retention": "보존",
-  "Returns 400 no_bundled_twin if the rule has no bundled version on disk.": 
"규칙에 디스크상의 번들 버전이 없으면 400 no_bundled_twin 을 반환합니다.",
+  "Returns 400 no_bundled_twin if the rule has no bundled version on disk.": 
"규칙에 디스크상의 번들 버전이 없으면 400 no_bundled_twin을 반환합니다.",
   "Revert to bundled": "번들 버전으로 되돌리기",
-  "Runtime config": "런타임 구성",
+  "Runtime config": "런타임 설정",
   "Runtime-only metrics that the bundled rule does not define will be dropped 
from BanyanDB.": "번들 규칙이 정의하지 않은 런타임 전용 메트릭은 BanyanDB에서 제거됩니다.",
   "Storage change required": "스토리지 변경 필요",
-  "Stream a {tar} snapshot of the runtime-rule rows currently in OAP. ACTIVE 
rows go under {active}, INACTIVE under {inactive}, and a top-level {manifest} 
records sha256 + status + updateTime per row.": "현재 OAP의 런타임 규칙 행을 {tar} 스냅샷으로 
스트리밍합니다. ACTIVE 행은 {active} 아래, INACTIVE 는 {inactive} 아래에 들어가며, 최상위 {manifest} 
가 행마다 sha256 + status + updateTime 을 기록합니다.",
-  "The connected OAP's resolved configuration, read from the admin port's 
{endpoint} and grouped by module. Secret values (passwords, tokens, access 
keys) are masked to {mask} by OAP itself. Read-only — change config on the OAP 
side and restart.": "연결된 OAP의 확정된 구성으로, admin 포트의 {endpoint} 에서 읽어 모듈별로 그룹화됩니다. 
비밀 값(비밀번호, 토큰, 액세스 키)은 OAP 자체에서 {mask} 로 마스킹됩니다. 읽기 전용이며 — 구성을 변경하려면 OAP 측에서 
수정한 후 재시작하세요.",
-  "The topbar {coldPill} pill swaps the read from {hotWarm} to {cold} — 
{note}, so only enable it when the time range you're looking at is older than 
the hot+warm boundary.": "상단의 {coldPill} 칩은 읽기 대상을 {hotWarm} 에서 {cold} 로 전환합니다 
— {note}. 따라서 보고 있는 시간 범위가 hot+warm 경계보다 오래된 경우에만 활성화하세요.",
+  "Stream a {tar} snapshot of the runtime-rule rows currently in OAP. ACTIVE 
rows go under {active}, INACTIVE under {inactive}, and a top-level {manifest} 
records sha256 + status + updateTime per row.": "현재 OAP의 런타임 규칙 행을 {tar} 스냅샷으로 
스트리밍합니다. ACTIVE 행은 {active} 아래, INACTIVE는 {inactive} 아래에 들어가며, 최상위 {manifest}가 
행마다 sha256 + status + updateTime 을 기록합니다.",
+  "The connected OAP's resolved configuration, read from the admin port's 
{endpoint} and grouped by module. Secret values (passwords, tokens, access 
keys) are masked to {mask} by OAP itself. Read-only — change config on the OAP 
side and restart.": "연결된 OAP의 확정된 구성으로, admin 포트의 {endpoint}에서 읽어 모듈별로 그룹화됩니다. 
비밀 값(비밀번호, 토큰, 액세스 키)은 OAP 자체에서 {mask}로 마스킹됩니다. 읽기 전용이며 — 설정을 변경하려면 OAP 측에서 수정한 
후 재시작하세요.",
+  "The topbar {coldPill} pill swaps the read from {hotWarm} to {cold} — 
{note}, so only enable it when the time range you're looking at is older than 
the hot+warm boundary.": "상단의 {coldPill} 칩은 읽기 대상을 {hotWarm}에서 {cold}로 전환합니다 — 
{note}. 따라서 보고 있는 시간 범위가 hot+warm 경계보다 오래된 경우에만 활성화하세요.",
   "This deployment has no cold lifecycle stage configured — only the hot + 
warm window is queryable.": "이 배포에는 cold 라이프사이클 단계가 구성되어 있지 않습니다 — hot + warm 
범위만 쿼리할 수 있습니다.",
   "This edit moves the metric’s storage identity (scope, downsampling, or 
single↔labeled↔histogram).": "이 편집은 메트릭의 스토리지 정체성(scope, 다운샘플링, 
single↔labeled↔histogram)을 변경합니다.",
   "Time To Live": "Time To Live",
-  "Tried {url}. Confirm the OAP {module} module is on ({env}) and the port is 
exposed.": "{url} 을(를) 시도했습니다. OAP의 {module} 모듈이 켜져 있고({env}) 포트가 노출되어 있는지 
확인하세요.",
-  "Type {ruleName} to confirm:": "확인하려면 {ruleName} 을(를) 입력하세요:",
+  "Tried {url}. Confirm the OAP {module} module is on ({env}) and the port is 
exposed.": "{url}을(를) 시도했습니다. OAP의 {module} 모듈이 켜져 있고({env}) 포트가 노출되어 있는지 
확인하세요.",
+  "Type {ruleName} to confirm:": "확인하려면 {ruleName}을(를) 입력하세요:",
   "Unknown catalog": "알 수 없는 카탈로그",
   "Unknown catalog. Pick one from the left nav.": "알 수 없는 카탈로그입니다. 왼쪽 내비게이션에서 
하나를 선택하세요.",
-  "You are about to {intent} {ruleName}.": "{ruleName} 을(를) {intent} 하려고 합니다.",
+  "You are about to {intent} {ruleName}.": "{ruleName}을(를) {intent} 하려고 합니다.",
   "Zipkin / OTLP traces": "Zipkin / OTLP 트레이스",
   "advanced": "고급",
   "and the metrics derived from them. Browse the loaded files below; install a 
live debug session from": "그리고 그로부터 파생된 메트릭을 정의합니다. 아래에서 로드된 파일을 탐색하고, 다음에서 라이브 
디버그 세션을 설치하세요:",
@@ -1091,41 +1091,41 @@
   "{n} d total": "총 {n}일",
   "{n} lines": "{n}줄",
   "← catalog": "← 카탈로그",
-  "ⓘ OAP's TTL response collapses {hot} + {warm} into one combined value per 
class — the bar shows the queryable (hot + warm) window, not the per-stage 
breakdown. BanyanDB migrates between stages in {segments}, so a record near a 
boundary may briefly exist in both stages during the migration window. Property 
data is omitted (forever-retained, no TTL reported).": "ⓘ OAP의 TTL 응답은 클래스당 
{hot} + {warm} 을 하나의 결합 값으로 합쳐 반환합니다 — 막대는 쿼리 가능한 (hot + warm) 범위를 표시하며, 단계별 
분해는 표시하지 않습니다. BanyanDB는 {seg [...]
+  "ⓘ OAP's TTL response collapses {hot} + {warm} into one combined value per 
class — the bar shows the queryable (hot + warm) window, not the per-stage 
breakdown. BanyanDB migrates between stages in {segments}, so a record near a 
boundary may briefly exist in both stages during the migration window. Property 
data is omitted (forever-retained, no TTL reported).": "ⓘ OAP의 TTL 응답은 클래스당 
{hot} + {warm}을 하나의 결합 값으로 합쳐 반환합니다 — 막대는 쿼리 가능한 (hot + warm) 범위를 표시하며, 단계별 분해는 
표시하지 않습니다. BanyanDB는 {segm [...]
   "ⓘ Property data is omitted (forever-retained, no TTL reported).": "ⓘ 
Property 데이터는 생략됩니다(영구 보존, TTL 미보고).",
   "Dashboard setup · Overviews": "대시보드 설정 · 개요",
   "Each layer ships with a JSON template (alias, components, metric columns, 
widgets). Pick a layer on the left, switch scopes (service / instance / 
endpoint / trace / profiling), edit widgets in place. Edits write to OAP via 
the UI-template REST surface — bundled JSON is the seed + read-only fallback.": 
"각 레이어에는 JSON 템플릿(alias, components, metric columns, widgets)이 포함되어 있습니다. 왼쪽에서 
레이어를 선택하고 스코프(service / instance / endpoint / trace / profiling)를 전환하며 위젯을 그 
자리에서 편집할 수 있습니다. 편집 내용은 UI-tem [...]
-  "Per-widget editor for the overview dashboards. Each widget kind shows only 
the fields it consumes — e.g. {kpi} exposes its KPI row list with number / 
progress-bar style; {alarms} exposes the row limit. Type and widget set are 
code-shape decisions and stay frozen; edits write to OAP via the UI-template 
REST surface (bundled JSON is the seed + read-only fallback).": "개요 대시보드용 위젯별 
편집기입니다. 각 위젯 유형은 사용하는 필드만 표시합니다 — 예: {kpi} 는 number / progress-bar 스타일과 함께 KPI 
행 목록을 노출하고, {alarms} 는 행 제한을  [...]
-  "Pick a LAL rule and hit start. Each captured log becomes one column in the 
matrix; rows walk the per-record blocks {chain} (statement granularity splits 
{fn} per DSL line). Click any cell to open the source pane with that record's 
captured DSL and the matching fragment highlighted.": "LAL 규칙을 선택하고 시작을 누르세요. 
캡처된 각 로그는 매트릭스의 한 열이 되며, 행은 레코드별 블록 {chain} 을 따라 진행됩니다(구문 단위는 DSL 줄당 {fn} 으로 
분할됨). 셀을 클릭하면 해당 레코드의 캡처된 DSL과 일치 부분이 강조된 소스 패널이 열립니다.",
-  "No records match {query} ({n} captured total)": "{query} 와 일치하는 레코드 없음 (총 
{n}개 캡처됨)",
-  "Viewing saved capture from {time} · {catalog} · {name} · {rule}": "{time} 에 
저장된 캡처 보기 · {catalog} · {name} · {rule}",
-  "Pick a rule and hit start. Each captured execution renders as a record 
card; rows inside walk the chain {chain} with {before} / {exp} / {after} for 
every step. Click a row to inspect its captured DSL on the source pane (toggle 
“show source” in the capture header).": "규칙을 선택하고 시작을 누르세요. 캡처된 각 실행은 레코드 카드로 
렌더링되며, 내부 행은 체인 {chain} 을 따라 진행되고 모든 단계마다 {before} / {exp} / {after} 가 표시됩니다. 
행을 클릭하면 소스 패널에서 캡처된 DSL을 검사할 수 있습니다(캡처 헤더에서 “show source” 토글).",
-  "OAP has {count} OAL source classes registered across {files} .oal files. 
Browse them in {link} — every {syntax} line has a green ▶ that deep-links here 
with the picker pre-filled.": "OAP에는 {files}개의 .oal 파일에 걸쳐 {count}개의 OAL source 
클래스가 등록되어 있습니다. {link} 에서 탐색할 수 있으며 — 모든 {syntax} 줄에는 녹색 ▶가 있어 선택기가 미리 채워진 채로 
이곳으로 딥링크됩니다.",
-  "No saved captures yet — run a session in the {link}; finished sessions 
auto-save here.": "아직 저장된 캡처가 없습니다 — {link} 에서 세션을 실행하세요; 완료된 세션은 여기에 자동 
저장됩니다.",
+  "Per-widget editor for the overview dashboards. Each widget kind shows only 
the fields it consumes — e.g. {kpi} exposes its KPI row list with number / 
progress-bar style; {alarms} exposes the row limit. Type and widget set are 
code-shape decisions and stay frozen; edits write to OAP via the UI-template 
REST surface (bundled JSON is the seed + read-only fallback).": "개요 대시보드용 위젯별 
편집기입니다. 각 위젯 유형은 사용하는 필드만 표시합니다 — 예: {kpi}는 number / progress-bar 스타일과 함께 KPI 행 
목록을 노출하고, {alarms}는 행 제한을 노출 [...]
+  "Pick a LAL rule and hit start. Each captured log becomes one column in the 
matrix; rows walk the per-record blocks {chain} (statement granularity splits 
{fn} per DSL line). Click any cell to open the source pane with that record's 
captured DSL and the matching fragment highlighted.": "LAL 규칙을 선택하고 시작을 누르세요. 
캡처된 각 로그는 매트릭스의 한 열이 되며, 행은 레코드별 블록 {chain}을 따라 진행됩니다(구문 단위는 DSL 줄당 {fn}으로 
분할됨). 셀을 클릭하면 해당 레코드의 캡처된 DSL과 일치 부분이 강조된 소스 패널이 열립니다.",
+  "No records match {query} ({n} captured total)": "{query}와 일치하는 레코드 없음 (총 
{n}개 캡처됨)",
+  "Viewing saved capture from {time} · {catalog} · {name} · {rule}": "{time}에 
저장된 캡처 보기 · {catalog} · {name} · {rule}",
+  "Pick a rule and hit start. Each captured execution renders as a record 
card; rows inside walk the chain {chain} with {before} / {exp} / {after} for 
every step. Click a row to inspect its captured DSL on the source pane (toggle 
“show source” in the capture header).": "규칙을 선택하고 시작을 누르세요. 캡처된 각 실행은 레코드 카드로 
렌더링되며, 내부 행은 체인 {chain}을 따라 진행되고 모든 단계마다 {before} / {exp} / {after}가 표시됩니다. 행을 
클릭하면 소스 패널에서 캡처된 DSL을 검사할 수 있습니다(캡처 헤더에서 “show source” 토글).",
+  "OAP has {count} OAL source classes registered across {files} .oal files. 
Browse them in {link} — every {syntax} line has a green ▶ that deep-links here 
with the picker pre-filled.": "OAP에는 {files}개의 .oal 파일에 걸쳐 {count}개의 OAL source 
클래스가 등록되어 있습니다. {link}에서 탐색할 수 있으며 — 모든 {syntax} 줄에는 녹색 ▶가 있어 선택기가 미리 채워진 채로 
이곳으로 딥링크됩니다.",
+  "No saved captures yet — run a session in the {link}; finished sessions 
auto-save here.": "아직 저장된 캡처가 없습니다 — {link}에서 세션을 실행하세요; 완료된 세션은 여기에 자동 저장됩니다.",
   "Your sidebar adapts to your role: anything you can't use is simply not 
shown. The sections below group SkyWalking's capabilities by feature area. For 
each area you'll see {menuScope} (which sidebar entries fall in the area) and 
{actions} (the concrete things you can do, marked per role). Multiple roles add 
up — a user holding more than one role gets every permission any of their roles 
grant.": "사이드바는 역할에 맞춰 자동으로 조정됩니다: 사용할 수 없는 항목은 표시되지 않습니다. 아래 섹션은 SkyWalking의 
기능을 영역별로 분류합니다. 각 영역에서는 [...]
-  "This list is read-only. Roles are resolved from LDAP group membership via 
{groupMappings} in horizon.yaml. To add or remove a user, change their group in 
the directory — they'll appear here on next login. Local accounts shown below 
are break-glass only and ignored while LDAP is reachable.": "이 목록은 읽기 전용입니다. 
역할은 horizon.yaml 의 {groupMappings} 를 통해 LDAP 그룹 멤버십에서 해석됩니다. 사용자를 추가하거나 제거하려면 
디렉터리에서 해당 그룹을 변경하세요 — 다음 로그인 시 여기에 표시됩니다. 아래의 로컬 계정은 break-glass 용도 전용이며 LDAP에 
도달 가능한 동안에는 무시됩니다.",
-  "This list mirrors {localUsers} in horizon.yaml. Edits to the file are 
picked up on hot-reload. Add users via the YAML + {hashCli} for password 
hashes.": "이 목록은 horizon.yaml 의 {localUsers} 를 미러링합니다. 파일 편집은 핫 리로드로 반영됩니다. 
비밀번호 해시는 YAML + {hashCli} 를 통해 사용자를 추가하세요.",
+  "This list is read-only. Roles are resolved from LDAP group membership via 
{groupMappings} in horizon.yaml. To add or remove a user, change their group in 
the directory — they'll appear here on next login. Local accounts shown below 
are break-glass only and ignored while LDAP is reachable.": "이 목록은 읽기 전용입니다. 
역할은 horizon.yaml 의 {groupMappings}를 통해 LDAP 그룹 멤버십에서 해석됩니다. 사용자를 추가하거나 제거하려면 
디렉터리에서 해당 그룹을 변경하세요 — 다음 로그인 시 여기에 표시됩니다. 아래의 로컬 계정은 break-glass 용도 전용이며 LDAP에 
연결 가능한 동안에는 무시됩니다.",
+  "This list mirrors {localUsers} in horizon.yaml. Edits to the file are 
picked up on hot-reload. Add users via the YAML + {hashCli} for password 
hashes.": "이 목록은 horizon.yaml 의 {localUsers}를 미러링합니다. 파일 편집은 핫 리로드로 반영됩니다. 비밀번호 
해시는 YAML + {hashCli}를 통해 사용자를 추가하세요.",
   "Last-seen & Active (24h) are tracked per BFF node (in-memory, not 
cluster-shared) — served by {node}. In a multi-replica deploy these reflect 
this node only.": "마지막 접속 및 활성(24시간)은 BFF 노드별로 추적됩니다(메모리 기반, 클러스터 간 공유 안 됨) — 
제공 노드: {node}. 다중 복제본 배포 환경에서는 이 값이 현재 노드에만 해당됩니다.",
   "See what each role can do → {link}": "각 역할이 할 수 있는 작업 보기 → {link}",
-  "{title} {localUsers} is populated but the active backend is LDAP — local 
users are ignored except as a break-glass source.": "{title} {localUsers} 이(가) 
채워져 있지만 활성 백엔드는 LDAP입니다 — 로컬 사용자는 break-glass 소스 외에는 무시됩니다.",
+  "{title} {localUsers} is populated but the active backend is LDAP — local 
users are ignored except as a break-glass source.": "{title} {localUsers}이(가) 
채워져 있지만 활성 백엔드는 LDAP입니다 — 로컬 사용자는 break-glass 소스 외에는 무시됩니다.",
   "username {name}": "사용자 이름 {name}",
-  "add {key} in horizon.yaml to arm": "활성화하려면 horizon.yaml 에 {key} 를 추가하세요",
+  "add {key} in horizon.yaml to arm": "활성화하려면 horizon.yaml 에 {key}를 추가하세요",
   "section {key}": "섹션 {key}",
-  "No user entry found for {username}": "{username} 에 대한 사용자 항목을 찾을 수 없습니다",
+  "No user entry found for {username}": "{username}에 대한 사용자 항목을 찾을 수 없습니다",
   "{range} → {step} step (one bucket per minute)": "{range} → {step} 단계 (분당 버킷 
1개)",
   "{range} → {step} step (one bucket per hour)": "{range} → {step} 단계 (시간당 버킷 
1개)",
   "{range} → {step} step (one bucket per day)": "{range} → {step} 단계 (일당 버킷 
1개)",
-  "Push one with {endpoint} or its {cli} equivalent.": "{endpoint} 또는 그 {cli} 
와 동일한 명령으로 푸시하세요.",
-  "Could not load {catalog}.": "{catalog} 을(를) 로드할 수 없습니다.",
-  "OAL hot-update is upstream-deferred. Each {ext} file defines source classes 
(the input row the analyzer emits, e.g. {source}) and the metrics derived from 
them. Browse the loaded files below; install a live debug session from 
{liveDebugger} to see runtime metric capture.": "OAL 핫 업데이트는 업스트림에서 보류 중입니다. 각 
{ext} 파일은 source 클래스(분석기가 방출하는 입력 행, 예: {source})와 그로부터 파생된 메트릭을 정의합니다. 아래에서 
로드된 파일을 탐색하고, 런타임 메트릭 캡처를 보려면 {liveDebugger} 에서 라이브 디버그 세션을 설치하세요.",
+  "Push one with {endpoint} or its {cli} equivalent.": "{endpoint} 또는 그 {cli}와 
동일한 명령으로 푸시하세요.",
+  "Could not load {catalog}.": "{catalog}을(를) 로드할 수 없습니다.",
+  "OAL hot-update is upstream-deferred. Each {ext} file defines source classes 
(the input row the analyzer emits, e.g. {source}) and the metrics derived from 
them. Browse the loaded files below; install a live debug session from 
{liveDebugger} to see runtime metric capture.": "OAL 핫 업데이트는 업스트림에서 보류 중입니다. 각 
{ext} 파일은 source 클래스(분석기가 방출하는 입력 행, 예: {source})와 그로부터 파생된 메트릭을 정의합니다. 아래에서 
로드된 파일을 탐색하고, 런타임 메트릭 캡처를 보려면 {liveDebugger}에서 라이브 디버그 세션을 설치하세요.",
   "no {ext} files loaded": "{ext} 파일이 로드되지 않음",
   "Runtime-rule dump": "런타임 규칙 덤프",
   "DSL Editor": "DSL 에디터",
-  "Catalog load failed: {err}": "카탈로그 로드 실패: {err}",
-  "inputs are browser-local · sent to OAP in {tz}": "입력은 브라우저 로컬 시간 · {tz} 로 
OAP에 전송됨",
+  "Catalog load failed: {err}": "카탈로그를 불러오지 못했습니다: {err}",
+  "inputs are browser-local · sent to OAP in {tz}": "입력은 브라우저 로컬 시간 · {tz}로 
OAP에 전송됨",
   "Active": "활성",
   "Active alarms": "활성 경보",
-  "{window}. Pinned layers come from {setupLink}. Click a layer chip to narrow 
the list; click a flag on the timeline to inspect one alarm; brush a region to 
slice the list to that window.": "{window}. 고정된 레이어는 {setupLink} 에서 가져옵니다. 레이어 
칩을 클릭하면 목록이 좁혀지고, 타임라인의 깃발을 클릭하면 하나의 경보를 검사할 수 있으며, 영역을 브러시하면 목록이 해당 범위로 잘립니다.",
+  "{window}. Pinned layers come from {setupLink}. Click a layer chip to narrow 
the list; click a flag on the timeline to inspect one alarm; brush a region to 
slice the list to that window.": "{window}. 고정된 레이어는 {setupLink}에서 가져옵니다. 레이어 
칩을 클릭하면 목록이 좁혀지고, 타임라인의 깃발을 클릭하면 하나의 경보를 검사할 수 있으며, 영역을 드래그하면 목록이 해당 범위로 잘립니다.",
   "custom": "사용자 지정",
   "End": "종료",
   "max {h}h": "최대 {h}시간",
@@ -1157,7 +1157,7 @@
   "Window exceeds {h}h cap": "범위가 {h}시간 상한을 초과합니다",
   "last {window}": "최근 {window}",
   "Metrics Analysis Language - …": "Metrics Analysis Language - …",
-  "Operate · OAP configuration": "운영 · OAP 구성",
+  "Operate · OAP configuration": "운영 · OAP 설정",
   "from {source}": "{source}에서",
   "local": "로컬",
   "Local": "로컬",
@@ -1188,7 +1188,7 @@
   "No data is flowing yet": "아직 데이터가 들어오지 않았습니다",
   "OAP hasn't received any service data. The relevant overview will appear 
here automatically as soon as data starts arriving.": "OAP가 아직 어떤 서비스 데이터도 수신하지 
않았습니다. 데이터가 도착하는 즉시 관련 개요가 여기에 자동으로 표시됩니다.",
   "Ask your operations team to verify that the agents or receivers for your 
services are configured and pointing at this OAP.": "운영 팀에 서비스의 agent 또는 
receiver가 구성되어 있고 이 OAP를 가리키는지 확인하도록 요청하세요.",
-  "No dashboard configured yet": "아직 대시보드가 구성되지 않았습니다",
+  "No dashboard configured yet": "아직 설정된 대시보드가 없습니다",
   "{n} layer reporting services but no overview dashboard is set up.": "{n}개 
레이어가 서비스를 보고하고 있지만 개요 대시보드가 설정되어 있지 않습니다.",
   "Ask your operations team to set up a dashboard for you.": "운영 팀에 대시보드를 설정해 
달라고 요청하세요.",
   "Routing…": "라우팅 중…",

Reply via email to