
[domain]

[domain.affiliation]
affiliate = "가족사 임직원"
general = "일반 사용자"

[domain.company]
baron = "바론"
halla = "한라"
hanmac = "한맥"
jangheon = "장헌"
ptc = "PTC"
saman = "삼안"

[domain.tenant_type]
company = "COMPANY (일반 기업)"
company_group = "COMPANY_GROUP (그룹사/지주사)"
organization = "ORGANIZATION (정규 조직)"
personal = "PERSONAL (개인 워크스페이스)"
user_group = "USER_GROUP (내부 부서/팀)"

[err]

[err.common]
unknown = "알 수 없는 오류가 발생했습니다."

[err.backend]
authorization_pending = "인증 승인이 아직 완료되지 않았습니다."
bad_request = "요청 값을 확인해 주세요."
conflict = "요청이 현재 상태와 충돌합니다."
expired_token = "토큰이 만료되었습니다."
forbidden = "요청이 허용되지 않습니다."
internal_error = "요청 처리 중 내부 오류가 발생했습니다."
invalid_code = "인증 코드가 올바르지 않습니다."
invalid_or_expired_code = "인증 코드가 유효하지 않거나 만료되었습니다."
invalid_session = "세션이 유효하지 않습니다."
invalid_session_reference = "세션 참조 정보가 유효하지 않습니다."
not_found = "요청한 인증 흐름을 찾을 수 없습니다."
not_supported = "지원하지 않는 로그인 방식입니다."
password_or_email_mismatch = "이메일 혹은 비밀번호가 일치하지 않습니다."
rate_limited = "요청이 너무 많습니다. 잠시 후 다시 시도해 주세요."
service_unavailable = "인증 서비스를 현재 사용할 수 없습니다."
slow_down = "요청 간격이 너무 빠릅니다. 잠시 후 다시 시도해 주세요."

[err.userfront]

[err.userfront.auth_proxy]
consent_accept = "동의 처리에 실패했습니다."
consent_fetch = "동의 정보를 가져오지 못했습니다."
consent_reject = "동의 거부에 실패했습니다."
linked_app_revoke = "연동 해지에 실패했습니다."
login_failed = "로그인에 실패했습니다."
oidc_accept = "OIDC 로그인 승인에 실패했습니다."
password_reset_complete = "비밀번호 재설정에 실패했습니다."
password_reset_init = "비밀번호 재설정을 시작하지 못했습니다."

[err.userfront.profile]
load_failed = "프로필을 불러오지 못했습니다: {{error}}"
password_change_failed = "비밀번호 변경에 실패했습니다: {{error}}"
send_code_failed = "인증번호 전송 실패: {{error}}"
update_failed = "프로필 업데이트에 실패했습니다: {{error}}"
verify_code_failed = "인증 실패: {{error}}"

[err.userfront.session]
missing = "활성 세션이 없습니다."

[msg]

[msg.admin]
idp_env_prod = "IDP env: prod"
logout_confirm = "로그아웃 하시겠습니까?"
scope_admin = "Scoped to /admin"
session_ttl = "Session TTL: 15m admin"
tenant_headers = "Tenant-aware headers"

[msg.admin.common]
forbidden = "이 작업을 수행할 권한이 없습니다."

[msg.admin.api_keys]

[msg.admin.api_keys.create]
error = "API 키 생성에 실패했습니다."
name_required = "이름은 필수입니다."
scope_required = "최소 하나 이상의 권한을 선택해야 합니다."
scopes_count = "총 {{count}}개의 권한이 할당됩니다."
scopes_hint = "생성 즉시 활성화되어 사용 가능합니다."
subtitle = "내부 시스템 연동을 위한 보안 인증 키를 구성합니다."

[msg.admin.api_keys.create.success]
copy_hint = "복사 버튼을 눌러 안전한 곳(비밀번호 관리자 등)에 저장하세요."
notice = "아래의 비밀번호(Secret)는 보안을 위해 "
notice_emphasis = "지금 한 번만"
notice_suffix = "표시됩니다."

[msg.admin.api_keys.list]
delete_confirm = "API 키 \"{{name}}\"를 삭제할까요?"
empty = "등록된 API 키가 없습니다."
fetch_error = "API 키 목록 조회에 실패했습니다."
subtitle = "서버 간 통신(Machine-to-Machine)을 위한 API 키를 발급하고 관리합니다."

[msg.admin.api_keys.list.registry]
count = "총 {{count}}개 API 키"

[msg.admin.audit]
empty = "아직 수집된 감사 로그가 없습니다."
end = "End of audit feed"
load_error = "Error loading logs: {{error}}"
loading = "Loading audit logs..."
subtitle = "관리자 계정의 작업 이력을 조회하고 상태를 확인합니다."

[msg.admin.audit.filters]
empty = "필터 없음"

[msg.admin.audit.registry]
count = "로드된 로그 {{count}}건"
description = "최근 감사 로그를 검색 조건에 맞춰 필터링하고, 작업 이력을 빠르게 확인합니다."

[msg.admin.groups]

[msg.admin.groups.create]
description = "부서나 팀과 같은 새로운 조직 단위를 추가합니다."
title = "새 조직 단위 생성"

[msg.admin.groups.list]
create_error = "생성 실패"
create_success = "조직 단위가 생성되었습니다."
delete_confirm = "정말로 삭제하시겠습니까?"
delete_error = "삭제 실패"
delete_success = "조직 단위가 삭제되었습니다."
empty = "테넌트에 등록된 조직 단위가 없습니다."
import_error = "가져오기 실패"
import_success = "조직도가 임포트되었습니다."
loading = "로딩 중..."
subtitle = "이 테넌트에 정의된 사용자 그룹 목록입니다."

[msg.admin.groups.members]
add_success = "구성원이 추가되었습니다."
count = "{{count}} 명"
empty = "멤버가 없습니다."
remove_confirm = "제거하시겠습니까?"
remove_success = "구성원이 제외되었습니다."
title = "[{{name}}] 멤버 관리"

[msg.admin.integrity.forbidden]
description = "이 화면은 super_admin 권한으로만 접근할 수 있습니다."

[msg.admin.integrity.orphan_login_ids]
delete_confirm = "선택한 {{count}}개의 유령 로그인 ID를 삭제하시겠습니까?"
delete_success = "{{count}}개의 유령 로그인 ID를 삭제했습니다."
description = "삭제되었거나 존재하지 않는 사용자/테넌트를 참조하는 로그인 ID를 확인한 뒤 선택 삭제합니다."
empty = "삭제할 유령 로그인 ID가 없습니다."
load_error = "유령 로그인 ID 대상을 불러오지 못했습니다."

[msg.admin.integrity.read_model]
description = "Ory SoT를 덮어쓰지 않고 backend DB read model의 이상 징후만 확인합니다."

[msg.admin.integrity.recheck]
error = "검사에 실패했습니다."
running = "정합성 검사를 실행 중입니다."
success = "검사가 완료되었습니다."

[msg.admin.integrity.report]
load_error = "정합성 리포트를 불러오지 못했습니다."

[msg.admin.integrity.check.duplicate_tenant_slugs]
description = "삭제되지 않은 tenant의 LOWER(TRIM(slug)) 기준 중복을 검사합니다."

[msg.admin.integrity.check.orphan_tenant_parents]
description = "tenants.parent_id가 존재하지 않거나 soft-deleted tenant를 참조하는지 검사합니다."

[msg.admin.integrity.check.orphan_user_login_id_tenants]
description = "user_login_ids.tenant_id가 존재하지 않거나 soft-deleted tenant를 참조하는지 검사합니다."

[msg.admin.integrity.check.orphan_user_login_id_users]
description = "user_login_ids.user_id가 존재하지 않거나 soft-deleted user를 참조하는지 검사합니다."

[msg.admin.integrity.check.orphan_user_tenant_memberships]
description = "users.tenant_id가 존재하지 않거나 soft-deleted tenant를 참조하는지 검사합니다."

[msg.admin.integrity]
subtitle = "정합성 상태를 확인하고 데이터 모델 전반의 검증 결과를 살펴봅니다."

[msg.admin.ory_ssot]
flush_confirm = "Redis identity cache 키만 비우시겠습니까?"
flush_error = "Redis identity cache flush에 실패했습니다."
flush_success = "Redis identity cache key {{count}}개를 비웠습니다."
load_error = "Ory SSOT 시스템 상태를 불러오지 못했습니다."
subtitle = "Kratos 원장과 Redis identity cache 상태를 분리해서 확인합니다."

[msg.admin.ory_ssot.forbidden]
description = "이 화면은 super_admin 권한으로만 접근할 수 있습니다."

[msg.admin.groups.prompt]
user_id = "추가할 사용자의 UUID를 입력하세요:"

[msg.admin.groups.roles]
assign_success = "역할이 할당되었습니다."
description = "이 조직의 구성원들이 대상 테넌트에서 상속받을 역할을 선택하세요."
empty = "할당된 역할이 없습니다."
remove_confirm = "역할을 회수하시겠습니까?"
remove_success = "역할이 회수되었습니다."

[msg.admin.header]
subtitle = "Tenant isolation & least privilege by default"

[msg.admin.notice]
idp_policy = "IDP 관리 키는 서버 내부 래핑 API로만 사용하며, 감사·레이트리밋을 기본 적용합니다."
scope = "관리 기능은 /admin 네임스페이스에서만 노출합니다."

[msg.admin.org]
hover_member_info = "마우스를 올리면 상세 정보를 확인할 수 있습니다."
import_description = "CSV 또는 XLSX 파일을 업로드하여 조직 테넌트와 사용자를 함께 생성/업데이트하고 멤버십을 매핑합니다. (필수 컬럼: 이메일, 이름)"
import_error = "조직도 임포트 중 오류가 발생했습니다."
import_success = "조직도가 성공적으로 임포트되었습니다."

[msg.admin.overview]
description = "모든 테넌트 공통 지표와 정책 상태를 한 곳에서 확인합니다."
idp_primary = "IDP: Ory primary"

[msg.admin.overview.playbook]
description = "운영 정책, 레이트리밋, 감사 로그의 기본 룰을 요약합니다."
idp_body = "모든 IDP 호출은 backend를 통해서만 수행하며, Hydra/Kratos admin 포트는 외부에 노출하지 않습니다."
idp_title = "Backend-only IDP access"
tenant_body = "Tenant 헤더와 감사 로그 규칙을 기본 적용하며, 향후 Keto 정책으로 확장 예정입니다."
tenant_title = "Tenant isolation"

[msg.admin.overview.quick_links]
description = "주요 운영 화면으로 바로 이동합니다."

[msg.admin.overview.summary]
audit_events_24h = "최근 24시간 감사 로그"
oidc_clients = "등록된 OIDC 클라이언트"
policy_gate = "정책 가이트 상태"
total_tenants = "전체 테넌트 수"

[msg.admin.tenants]
approve_confirm = "이 테넌트를 승인하시겠습니까?"
approve_success = "테넌트가 승인되었습니다."
delete_bulk_confirm = "선택한 {{count}}개 테넌트를 삭제할까요?"
delete_confirm = "테넌트 \"{{name}}\"를 삭제할까요?"
delete_success = "테넌트가 삭제되었습니다."
empty = "아직 등록된 테넌트가 없습니다."
fetch_error = "테넌트 목록 조회에 실패했습니다."
import_empty = "가져올 테넌트 행이 없습니다."
import_error = "테넌트 가져오기에 실패했습니다."
import_result = "생성 {{created}}, 갱신 {{updated}}, 실패 {{failed}}"
missing_id = "테넌트 ID가 없습니다."
not_found = "테넌트를 찾을 수 없습니다."
remove_sub_confirm = "테넌트 \"{{name}}\"을(를) 하위 조직에서 제외할까요?"
subtitle = "현재 등록된 테넌트를 확인하고 상태를 관리합니다."

[msg.admin.tenants.import_preview]
description = "tenant_id가 없는 행은 기존 테넌트 후보와 비교한 뒤 신규 생성 또는 기존 테넌트 갱신으로 처리합니다."

[msg.admin.tenants.parent]
local_picker_description = "테넌트 목록에서 상위 테넌트로 사용할 항목을 선택합니다."
local_picker_empty = "선택할 수 있는 테넌트가 없습니다."
picker_description = "org-chart에서 테넌트를 선택하면 상위 테넌트에 반영됩니다."

[msg.admin.tenants.admins]
add_success = "관리자가 추가되었습니다."
empty = "등록된 관리자가 없습니다."
remove_confirm = "관리자를 삭제하시겠습니까?"
remove_success = "권한이 회수되었습니다."
subtitle = "이 테넌트의 자원을 관리할 수 있는 사용자 목록입니다."

[msg.admin.tenants.owners]
add_success = "소유자가 추가되었습니다."
empty = "등록된 소유자가 없습니다."
remove_confirm = "소유자를 삭제하시겠습니까?"
remove_success = "소유자 권한이 회수되었습니다."
subtitle = "이 테넌트의 최상위 권한을 가진 소유자(조직장) 목록입니다."

[msg.admin.tenants.create]
pick_parent_first = "상위 테넌트를 먼저 선택하세요."
subtitle = "글로벌 운영 기준의 신규 테넌트를 등록합니다."

[msg.admin.tenants.create.form]
domains_help = "이 도메인을 가진 이메일로 가입한 사용자는 자동으로 이 테넌트에 배정됩니다."

[msg.admin.tenants.create.memo]
body = "생성 직후에는 기본 활성 상태로 부여되며, 필요 시 상태를 수정하세요."
subtitle = "Tenant 권한 정책은 추후 Keto 연계로 확장 예정입니다."

[msg.admin.tenants.create.profile]
subtitle = "필수 정보만 입력해도 생성 가능합니다. Slug는 없으면 자동 생성됩니다."

[msg.admin.tenants.members]
desc = "조직에 소속된 사용자 목록을 확인합니다."
empty = "소속된 사용자가 없습니다."
limit_notice = "하위 조직이 많아 상위 10개 조직의 멤버만 표시됩니다."

[msg.admin.tenants.registry]
count = "총 {{count}}개의 테넌트가 등록되어 있습니다."

[msg.admin.tenants.schema]
empty = "등록된 커스텀 필드가 없습니다. 필드 추가를 눌러 시작하세요."
missing_id = "테넌트 ID가 없습니다."
subtitle = "이 테넌트의 사용자에게 적용할 커스텀 속성을 정의합니다."
update_error = "스키마 업데이트에 실패했습니다."
update_success = "스키마가 성공적으로 업데이트되었습니다."

[msg.admin.tenants.sub]
empty = "하위 테넌트가 없습니다."
subtitle = "현재 테넌트 하위에 생성된 조직입니다."

[msg.admin.users]
export_error = "사용자 내보내기에 실패했습니다."
status_error = "사용자 상태 변경에 실패했습니다."

[msg.admin.users.bulk]
delete_confirm = "선택한 {{count}}명의 사용자를 정말로 삭제하시겠습니까?"
delete_success = "{{count}}명의 사용자가 삭제되었습니다."
description = "CSV 파일을 통해 사용자를 일괄 등록하거나 관리합니다."
move_description = "선택한 사용자를 다른 테넌트로 일괄 이동합니다."
move_error = "사용자 이동 중 오류가 발생했습니다."
move_success = "{{count}}명의 사용자가 성공적으로 이동되었습니다."
parsed_count = "{{count}}행의 데이터가 파싱되었습니다."
update_success = "사용자 정보가 일괄 업데이트되었습니다."

[msg.admin.users.create]
appointment_required = "한맥 가족 구성원은 소속 테넌트를 하나 이상 선택해 주세요."
error = "사용자 생성에 실패했습니다."
external_tenant_required = "외부 사용자는 대표소속을 선택해 주세요."
password_required = "비밀번호를 입력하거나 자동 생성을 사용해 주세요."
personal_tenant_failed = "Personal 테넌트를 준비하지 못했습니다."
success = "사용자가 성공적으로 생성되었습니다."
tenant_resolve_failed = "선택한 테넌트 정보를 불러오지 못했습니다."

[msg.admin.users.create.account]
subtitle = "새로운 사용자를 시스템에 등록합니다."

[msg.admin.users.create.form]
email_required = "이메일은 필수입니다."
field_invalid = "{{label}} 형식이 올바르지 않습니다."
field_required = "{{label}}은(는) 필수입니다."
name_required = "이름은 필수입니다."
password_auto_help = "비워두면 시스템이 초기 비밀번호를 자동 생성합니다."
password_manual_help = "초기 비밀번호를 직접 설정합니다."
picker_description = "org-chart에서 테넌트를 선택하면 사용자 소속에 반영됩니다."
role_help = "시스템 접근 권한을 결정합니다."

[msg.admin.users.create.password_generated]
default = "초기 비밀번호가 생성되었습니다."
with_email = "{{email}} 계정의 초기 비밀번호입니다."

[msg.admin.users.detail]
edit_subtitle = "{{email}} 계정의 정보를 수정합니다."
not_found = "사용자를 찾을 수 없습니다."
update_error = "사용자 수정에 실패했습니다."
update_success = "사용자 정보가 수정되었습니다."
self_delete_blocked = "본인 계정은 삭제할 수 없습니다."

[msg.admin.users.detail.custom_claims]
description = "전역으로 정의된 custom claim의 이 사용자 값을 관리합니다. Claim 정의 추가와 타입 변경은 전역 설정 화면에서만 가능합니다."
empty = "전역으로 정의된 custom claim이 없습니다."

[msg.admin.users.detail.form]
field_required = "필수입니다."
invalid_format = "형식이 올바르지 않습니다."
name_required = "이름은 필수입니다."

[msg.admin.users.detail.security]
password_hint = "비밀번호를 변경하려면 입력하세요. 비워두면 현재 비밀번호가 유지됩니다."
password_generated_help = "보안 기준에 맞는 임시 비밀번호를 자동 생성해 즉시 적용합니다."
password_manual_help = "최소 {{count}}자 이상의 비밀번호를 직접 입력해 적용합니다."
password_manual_min_length = "비밀번호는 최소 {{count}}자 이상이어야 합니다."
password_manual_required = "비밀번호를 입력해 주세요."
reset_password_help = "사용자의 비밀번호를 강제로 재설정하고 자동 생성하거나 직접 입력한 비밀번호를 적용합니다."
self_password_reset_blocked = "본인 계정의 비밀번호는 사용자 포털(UserFront) 설정에서 변경해 주세요."

[msg.admin.users.list]
delete_confirm = "사용자 \"{{name}}\"을(를) 정말 삭제하시겠습니까?"
empty = "검색 결과가 없습니다."
fetch_error = "사용자 목록 조회에 실패했습니다."
subtitle = "시스템 사용자를 조회하고 관리합니다. (Local DB)"

[msg.admin.users.list.columns]
description = "테이블에 표시할 컬럼을 선택합니다."
no_custom = "이 테넌트에 정의된 커스텀 필드가 없습니다."

[msg.admin.users.list.registry]
count = "총 {{count}}명의 사용자가 등록되어 있습니다."

[msg.dev]
logout_confirm = "로그아웃 하시겠습니까?"

[msg.dev.audit]
empty = "조회된 감사 로그가 없습니다."
forbidden = "감사 로그를 조회할 권한이 없습니다. 관리자에게 권한을 요청해주세요."
load_error = "감사 로그 조회 실패: {{error}}"
loaded_count = "로드된 로그 {{count}}건"
loading = "감사 로그를 불러오는 중..."
subtitle = "현재 테넌트/앱 범위의 DevFront 작업 이력을 조회합니다."

[msg.dev.clients]
deleted = "앱이 삭제되었습니다."
delete_confirm = "정말로 이 앱을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다."
delete_error = "삭제 실패: {{error}}"
load_error = "Error loading clients: {{error}}"
loading = "Loading apps..."
showing = "Showing {{shown}} of {{total}} apps"

[msg.dev.clients.consents]
empty = "No consents found."
load_error = "Error loading consents: {{error}}"
loading = "Loading consents..."
revoke_confirm = "정말로 이 사용자의 권한을 철회하시겠습니까? 철회 시 사용자는 다음 접속 시 다시 동의해야 합니다."
showing = "Showing {{from}} to {{to}} of {{total}} users"
subtitle = "OIDC Relying Party 사용자 권한을 검토·관리합니다."

[msg.dev.clients.details]
copy_client_id = "Client ID가 복사되었습니다."
copy_client_secret = "Client Secret이 복사되었습니다."
copy_endpoint = "{{label}}가 복사되었습니다."
load_error = "Error loading client: {{error}}"
loading = "Loading client..."
missing_id = "Client ID가 필요합니다."
redirect_saved = "Redirect URIs가 저장되었습니다."
rotate_confirm = "경고: Client Secret을 재발급하면 기존 시크릿은 즉시 무효화됩니다.\n연동된 애플리케이션이 중단될 수 있습니다. 계속하시겠습니까?"
rotate_error = "재발급 실패: {{error}}"
save_error = "저장 실패: {{error}}"
secret_rotated = "Client Secret이 재발급되었습니다."
secret_unavailable = "SECRET_NOT_AVAILABLE"
subtitle = "OIDC 자격 증명과 엔드포인트를 관리합니다."

[msg.dev.clients.details.redirect]
description = "인증 성공 후 사용자를 리다이렉트할 허용된 URL 목록입니다. 콤마(,)로 구분하여 여러 개 입력할 수 있습니다."

[msg.dev.clients.details.security]
footer = "비밀키 재발행 작업에는 관리자 세션 TTL 확인과 레이트리밋, 알림 연동을 권장합니다."
note = "엔드포인트는 읽기 전용으로 유지하고, 비밀키 재발행/복사는 감사 로그와 연계하세요."

[msg.dev.clients.general]
load_error = "Error loading client: {{error}}"
loading = "Loading client..."
save_error = "저장 실패: {{error}}"
saved = "설정이 저장되었습니다."
status_changed = "상태가 {{status}}로 변경되었습니다."

[msg.dev.clients.federation]
add_subtitle = "외부 OIDC 제공자를 연결합니다."
empty = "등록된 IdP 설정이 없습니다."
subtitle = "이 애플리케이션의 외부 IdP 설정을 관리합니다."

[msg.dev.clients.general.identity]
logo_help = "인증 화면에 표시될 PNG/SVG URL입니다."
subtitle = "앱 이름과 설명, 로고를 설정합니다."

[msg.dev.clients.general.redirect]
help = "인증 후 리다이렉트될 URI를 입력하세요. 생성 후 연동 설정 탭에서 수정 가능합니다."

[msg.dev.clients.general.scopes]
empty = "등록된 스코프가 없습니다."
subtitle = "이 앱이 요청할 수 있는 권한 범위를 정의합니다."

[msg.dev.clients.general.security]
pkce_help = "PKCE 앱 (SPA/모바일): 브라우저나 앱처럼 비밀키를 보관하기 어려운 경우 사용하며, PKCE가 강제됩니다."
private_help = "Server side App (서버 사이드 앱): Node.js, Java 등 비밀키를 안전하게 보관 가능한 경우 사용합니다."
subtitle = "앱 유형을 선택하세요. 보안 수준에 따라 인증 방식이 달라집니다."

[msg.dev.clients.help]
docs_body = "Includes PKCE, client_secret_basic, redirect URI validation tips."
subtitle = "Developer guides for Confidential/Public clients, redirect URIs, and auth methods."

[msg.dev.clients.registry]
description = "OIDC 앱, 인증 방식, 리다이렉트 URI, 비밀키 재발행을 감사 로그와 함께 관리합니다."

[msg.dev.clients.scopes]
email = "이메일 주소 접근"
openid = "OIDC 인증 필수 스코프"
profile = "기본 프로필 정보 접근"

[msg.dev.dashboard]

[msg.dev.dashboard.hero]
body = "Hydra Admin API와 동기화된 RP 목록, 상태 토글, Consent 회수까지 devfront에서 처리하도록 준비합니다."
title_emphasis = " 하나의 화면"
title_prefix = "RP 등록 현황과 Consent 상태를"
title_suffix = "에서 관리합니다."

[msg.dev.dashboard.notice]
consent_audit = "Consent 회수는 감사 로그와 연계"
dev_scope = "RP 정책은 dev scope에서만 적용"
hydra_health = "Hydra Admin 상태 체크 준비"

[msg.dev.sidebar]
notice = "개발자 전용 콘솔입니다."
notice_detail = "연동 앱 등록 및 관리를 수행할 수 있습니다."

[msg.info]
saved_success = "저장이 완료되었습니다."

[msg.userfront]
greeting = "안녕하세요, {{name}}님"

[msg.userfront.audit]
date = "접속일자: {{value}}"
device = "접속환경: {{value}}"
end = "더 이상 항목이 없습니다."
ip = "접속 IP: {{value}}"
load_more_error = "더 불러오지 못했습니다."
result = "인증결과: {{value}}"
session_id = "Session ID: {{value}}"
status = "현황: (준비중)"

[msg.userfront.dashboard]
approved_device = "승인 기기: {{device}}"
approved_ip = "승인 IP: {{ip}}"
audit_empty = "최근 접속 이력이 없습니다."
audit_load_error = "접속이력을 불러오지 못했습니다."
auth_method = "인증수단: {{method}}"
client_id = "Client ID: {{id}}"
client_id_missing = "Client ID 없음"
current_status = "현재 상태: {{status}}"
last_auth = "최근 인증: {{value}}"
link_missing = "이동할 페이지 주소(Client URI)가 설정되지 않았습니다."
link_open_error = "해당 링크를 열 수 없습니다."
render_error = "대시보드 렌더링 오류: {{error}}"
session_id_copied = "세션 ID가 복사되었습니다."

[msg.userfront.dashboard.activities]
empty = "연동된 앱이 없습니다."
empty_detail = "앱을 연동하면 최근 활동과 상태가 표시됩니다."
error = "연동 정보를 불러오지 못했습니다."

[msg.userfront.dashboard.approved_session]
copy_click = "{{label}}: {{id}}\n클릭하면 복사됩니다."
copy_tap = "{{label}}: {{id}}\n탭하면 복사됩니다."
none = "{{label}} 없음"

[msg.userfront.dashboard.revoke]
confirm = "{{app}} 앱과의 연동을 해지하시겠습니까?\n해지하면 다음 로그인 시 다시 동의가 필요합니다."
error = "해지 실패: {{error}}"
success = "{{app}} 연동이 해지되었습니다."

[msg.userfront.dashboard.scopes]
empty = "요청된 권한이 없습니다."

[msg.userfront.dashboard.timeline]
load_error = "접속이력을 불러오지 못했습니다."

[msg.userfront.error]
detail_contact = "관리자에게 문의해 주세요."
detail_generic = "오류가 발생했습니다."
detail_request = "요청을 처리하는 중 문제가 발생했습니다."
id = "오류 ID: {{id}}"
title = "인증 과정에서 오류가 발생했습니다"
title_generic = "오류가 발생했습니다"
title_with_code = "오류: {{code}}"
type = "오류 종류: {{type}}"

[msg.userfront.error.whitelist]
"$normalizedCode" = "{{error}}"
bad_request = "입력값을 확인해 주세요."
invalid_session = "세션이 만료되었습니다. 다시 로그인해 주세요."
not_found = "요청한 페이지를 찾을 수 없습니다."
password_or_email_mismatch = "이메일 혹은 비밀번호가 일치하지 않습니다."
rate_limited = "요청이 많습니다. 잠시 후 다시 시도해 주세요."
recovery_expired = "재설정 링크가 만료되었습니다. 다시 요청해 주세요."
recovery_invalid = "재설정 링크가 유효하지 않습니다."
settings_disabled = "현재 계정 설정 화면은 준비 중입니다."
verification_required = "추가 인증이 필요합니다. 안내에 따라 진행해 주세요."

[msg.userfront.error.ory]
"$normalizedCode" = "{{error}}"
access_denied = "사용자가 동의를 거부했습니다."
consent_required = "앱 접근 동의가 필요합니다."
interaction_required = "추가 상호작용이 필요합니다. 다시 시도해 주세요."
invalid_client = "클라이언트 인증 정보가 유효하지 않습니다."
invalid_grant = "인증 요청이 만료되었거나 유효하지 않습니다."
invalid_request = "잘못된 요청입니다."
invalid_scope = "요청한 권한 범위가 유효하지 않습니다."
login_required = "로그인이 필요합니다."
request_forbidden = "요청이 거부되었습니다."
server_error = "인증 서버 오류가 발생했습니다."
temporarily_unavailable = "인증 서버를 일시적으로 사용할 수 없습니다."
unauthorized_client = "해당 클라이언트는 이 요청을 수행할 수 없습니다."
unsupported_response_type = "지원하지 않는 응답 타입입니다."

[msg.userfront.forgot]
description = "계정과 연결된 이메일 주소 또는 휴대폰 번호를 입력하시면, 비밀번호를 재설정할 수 있는 링크를 보내드립니다."
dry_send = "drySend 모드: 실제 이메일/SMS는 발송되지 않습니다."
error = "전송에 실패했습니다: {{error}}"
input_required = "이메일 또는 휴대폰 번호를 입력해주세요."
sent = "비밀번호 재설정 링크가 전송되었습니다. 이메일 또는 SMS를 확인해주세요."

[msg.userfront.login]
cookie_check_failed = "로그인 확인 실패: {{error}}"
dry_send = "drySend 모드: 실제 이메일/SMS는 발송되지 않습니다."
link_failed = "오류: {{error}}"
link_send_failed = "전송 실패: {{error}}"
link_sent_email = "입력하신 이메일로 로그인 링크를 보냈습니다."
link_sent_phone = "입력하신 번호로 로그인 링크를 보냈습니다."
link_timeout = "시간이 경과되었습니다."
no_account = "계정이 없으신가요?"
oidc_failed = "OIDC 로그인 처리에 실패했습니다. 다시 시도해 주세요."
qr_expired = "시간이 경과되었습니다."
qr_init_failed = "QR 초기화에 실패했습니다: {{error}}"
qr_login_required = "로그인 한 상태여야 QR 스캔으로 로그인 할 수 있습니다"
token_missing = "로그인 토큰을 확인할 수 없습니다."
verification_failed = "승인 처리에 실패했습니다: {{error}}"

[msg.userfront.login.link]
helper = "입력하신 정보로 로그인 링크를 전송합니다."
missing_login_id = "이메일 또는 휴대폰 번호를 입력해 주세요."
missing_phone = "휴대폰 번호를 입력해 주세요."
resend_wait = "재발송은 {{time}} 후 가능합니다."
short_code_help = "링크로 받은 값의 뒤 문자 2개와 숫자 6자리를 입력하셔도 로그인 할 수 있습니다."

[msg.userfront.login.password]
failed = "로그인 실패: {{error}}"
missing_credentials = "이메일(또는 전화번호)와 비밀번호를 모두 입력해주세요."

[msg.userfront.login.qr]
load_failed = "QR 코드를 불러오지 못했습니다."
scan_hint = "모바일 앱으로 스캔하세요"

[msg.userfront.login.short_code]
invalid = "문자 2개와 숫자 6자리를 입력해 주세요."

[msg.userfront.login.unregistered]
body = "가입되지 않은 정보입니다.\n회원가입 후 이용해 주세요."

[msg.userfront.login.verification]
approved = "승인되었습니다. 로그인은 요청하신 창에서 완료됩니다."
approved_local = "승인 되었습니다. 이 기기는 로그인되어 있는 상태입니다. 원격 창도 로그인이 될 예정입니다"
success = "로그인 승인에 성공했습니다."

[msg.userfront.login_success]
subtitle = "성공적으로 로그인되었습니다."

[msg.userfront.profile]
department_missing = "소속 정보 없음"
department_required = "소속을 입력해주세요."
email_missing = "이메일 없음"
greeting = "안녕하세요, {{name}}님"
load_failed = "정보를 불러올 수 없습니다."
name_missing = "이름 없음"
name_required = "이름을 입력해주세요."
phone_required = "휴대폰 번호를 입력해주세요."
phone_verify_required = "휴대폰 번호 인증이 필요합니다."
update_failed = "수정 실패: {{error}}"
update_success = "정보가 수정되었습니다."

[msg.userfront.profile.password]
change_failed = "비밀번호 변경 실패: {{error}}"
changed = "비밀번호가 변경되었습니다."
current_required = "현재 비밀번호를 입력해 주세요."
mismatch = "새 비밀번호가 일치하지 않습니다."
new_required = "새 비밀번호를 입력해 주세요."
subtitle = "현재 비밀번호 확인 후 새 비밀번호로 변경합니다."

[msg.userfront.profile.phone]
code_sent = "인증번호가 전송되었습니다."
send_failed = "전송 실패: {{error}}"
verified = "인증되었습니다."
verify_failed = "인증 실패: {{error}}"
verify_notice = "휴대폰 번호를 변경하려면 SMS 인증이 필요합니다."

[msg.userfront.profile.section]
basic = "계정 기본 정보를 관리합니다."
organization = "소속 및 구분 정보입니다."
security = "비밀번호를 안전하게 관리합니다."

[msg.userfront.qr]
camera_error = "카메라 오류: {{error}}"
permission_error = "카메라 권한 요청에 실패했습니다. 브라우저/OS 설정을 확인해주세요."
permission_required = "카메라 권한이 필요합니다."

[msg.userfront.reset]
invalid_body = "비밀번호 재설정 링크가 만료되었거나 잘못되었습니다. 다시 시도해주세요."
invalid_link = "유효하지 않은 재설정 링크입니다. (loginId/token 누락)"
invalid_title = "유효하지 않은 링크입니다."
policy_loading = "비밀번호 정책을 불러오는 중입니다..."
success = "비밀번호가 성공적으로 변경되었습니다. 다시 로그인해주세요."

[msg.userfront.reset.error]
empty_password = "비밀번호를 입력해주세요."
generic = "비밀번호 변경에 실패했습니다: {{error}}"
lowercase = "최소 1개 이상의 소문자를 포함해야 합니다."
min_length = "비밀번호는 최소 {{count}}자 이상이어야 합니다."
min_types = "비밀번호는 영문 대/소문자/숫자/특수문자 중 {{count}}가지 이상 포함해야 합니다."
mismatch = "비밀번호가 일치하지 않습니다."
number = "최소 1개 이상의 숫자를 포함해야 합니다."
symbol = "최소 1개 이상의 특수문자를 포함해야 합니다."
uppercase = "최소 1개 이상의 대문자를 포함해야 합니다."

[msg.userfront.reset.policy]
lowercase = "소문자 1개 이상"
min_length = "최소 {{count}}자 이상"
min_types = "영문 대/소문자/숫자/특수문자 중 {{count}}가지 이상"
number = "숫자 1개 이상"
symbol = "특수문자 1개 이상"
uppercase = "대문자 1개 이상"

[msg.userfront.sections]
apps_subtitle = "현재 연결된 앱과 최근 인증 상태입니다."
audit_subtitle = "Baron 로그인 기준의 최근 접근 기록입니다."

[msg.userfront.settings]
disabled = "현재 계정 설정 화면은 준비 중입니다."

[msg.userfront.signup]
failed = "가입 실패: {{error}}"
privacy_full = "개인정보 수집 및 이용 동의 전문..."
tos_full = "서비스 이용약관 전문..."

[msg.userfront.signup.agreement]
title = "서비스 이용을 위해\n약관에 동의해주세요"

[msg.userfront.signup.auth]
affiliate_notice = "가족사 회원의 경우 반드시 회사 공식 이메일을 입력해주세요."
title = "본인 확인을 위해\n인증을 진행해주세요"

[msg.userfront.signup.email]
code_mismatch = "인증코드가 일치하지 않습니다."
duplicate = "이미 가입된 이메일입니다."
invalid = "유효한 이메일 형식이 아닙니다."
send_failed = "발송 실패: {{error}}"
verified = "✅ 이메일 인증 완료"
verify_failed = "인증 실패: {{error}}"

[msg.userfront.signup.password]
length_required = "비밀번호는 최소 12자 이상이어야 합니다."
lowercase_required = "소문자가 최소 1개 이상 포함되어야 합니다."
mismatch = "비밀번호가 일치하지 않습니다."
number_required = "숫자가 최소 1개 이상 포함되어야 합니다."
symbol_required = "특수문자가 최소 1개 이상 포함되어야 합니다."
title = "마지막으로\n비밀번호를 설정해주세요"
uppercase_required = "대문자가 최소 1개 이상 포함되어야 합니다."

[msg.userfront.signup.password.rule]
lowercase = "소문자"
min_length = "{{count}}자 이상"
min_types = "문자 유형 {{count}}가지 이상"
number = "숫자"
symbol = "특수문자"
uppercase = "대문자"

[msg.userfront.signup.phone]
code_mismatch = "인증코드가 일치하지 않습니다."
send_failed = "발송 실패: {{error}}"
verified = "✅ 휴대폰 인증 완료"
verify_failed = "인증 실패: {{error}}"

[msg.userfront.signup.policy]
loading = "비밀번호 정책을 불러오는 중입니다..."
lowercase = "소문자"
min_length = "최소 {{count}}자 이상"
min_types = "영문 대/소문자/숫자/특수문자 중 {{count}}가지 이상"
number = "숫자"
summary = "보안 정책: {{rules}}"
symbol = "특수문자"
uppercase = "대문자"

[msg.userfront.signup.profile]
affiliate_hint = "가족사 이메일 사용 시 자동으로 선택됩니다."
title = "회원님의\n소속 정보를 알려주세요"

[msg.userfront.signup.success]
body = "성공적으로 가입되었습니다."
title = "회원가입 완료"

[ui]

[ui.admin]
brand = "Baron 로그인"
title = "Admin Control"

[ui.admin.api_keys]

[ui.admin.api_keys.create]
name_label = "서비스 또는 목적 식별 이름"
name_placeholder = "예: Jenkins-CI, Grafana-Dashboard"
section_name = "키 이름 지정"
section_scopes = "권한 범위(Scopes) 선택"
submit = "API 키 발급하기"
title = "새 API 키 생성"

[ui.admin.api_keys.create.success]
copy_secret = "보안 시크릿 복사"
go_list = "저장했습니다. 목록으로 이동"
title = "API 키 생성 완료"

[ui.admin.api_keys.list]
add = "API 키 생성"
title = "API 키 관리 (M2M)"

[ui.admin.api_keys.list.breadcrumb]
list = "List"
section = "API Keys"

[ui.admin.api_keys.list.registry]
title = "API 키 레지스트리"

[ui.admin.api_keys.list.table]
actions = "ACTIONS"
client_id = "CLIENT ID"
last_used = "LAST USED"
name = "NAME"
scopes = "SCOPES"

[ui.admin.audit]
export_csv = "Export CSV"
load_more = "Load more"
target = "Target · {{target}}"
title = "감사 로그"

[ui.admin.audit.breadcrumb]
logs = "Logs"
section = "Audit"

[ui.admin.audit.copy]
actor_id = "Copy actor id"
request_id = "Copy request id"
target = "Copy target"

[ui.admin.audit.details]
actor = "Actor"
actor_id = "Actor ID · {{value}}"
after = "After · {{value}}"
before = "Before · {{value}}"
device = "Device · {{value}}"
error = "Error · {{value}}"
event_id = "Event ID · {{value}}"
ip = "IP · {{value}}"
latency = "Latency · {{value}}"
request = "Request"
request_id = "Request ID · {{value}}"
result = "Result"
tenant = "Tenant · {{value}}"

[ui.admin.audit.filters]
placeholder = "필터 추가 (예: status:failure)"
remove = "{{filter}} 필터 제거"

[ui.admin.audit.registry]
title = "Audit registry"

[ui.admin.audit.table]
action_target = "Action / Target"
actor = "ACTOR (ID)"
path = "PATH"
request = "REQUEST"
status = "STATUS"
time = "TIME"

[ui.admin.groups]
import_csv = "CSV 임포트"

[ui.admin.groups.create]
description = "부서나 팀과 같은 새로운 조직 단위를 추가합니다."
title = "새 그룹 생성"

[ui.admin.groups.detail]
breadcrumb_org = "조직 관리 목록으로 돌아가기"
breadcrumb_tenant = "테넌트 상세"
breadcrumb_unit = "조직 단위"
members_subtitle = "이 조직에 소속된 사용자를 관리합니다."
members_title = "구성원 관리"
permissions_subtitle = "이 조직이 다른 테넌트에 가지는 역할을 정의합니다."
permissions_title = "권한 관리"

[ui.admin.groups.form]
desc_label = "설명"
desc_placeholder = "그룹 용도 설명"
name_label = "그룹 이름"
name_placeholder = "예: 개발팀, 인사팀"
parent_label = "상위 조직"
submit = "생성하기"
unit_level_label = "조직 레벨"
unit_level_placeholder = "예: 본부, 팀"

[ui.admin.groups.list]
title = "User Groups"

[ui.admin.groups.members]

[ui.admin.groups.members.table]
email = "이메일"
name = "이름"
remove = "제거"

[ui.admin.groups.table]
actions = "ACTIONS"
members = "MEMBERS"
name = "NAME"

[ui.admin.header]
plane = "ADMIN PLANE"
subtitle = "Manage your organization"

[ui.admin.integrity]
kicker = "시스템"
loading = "불러오는 중"
title = "데이터 정합성 검증"
fetch_error = "정합성 최종 검증 결과를 불러오지 못했습니다."
tab_ory_ssot = "Ory SSOT 시스템"

[ui.admin.integrity.forbidden]
title = "접근 권한이 없습니다"

[ui.admin.integrity.orphan_login_ids]
delete = "선택 삭제"
title = "유령 로그인 ID 정리"

[ui.admin.integrity.read_model]
title = "읽기 모델 정합성"

[ui.admin.integrity.reason]
deleted_tenant = "삭제된 테넌트"
deleted_user = "삭제된 사용자"
missing_tenant = "테넌트 없음"
missing_user = "사용자 없음"

[ui.admin.integrity.recheck]
run = "다시 검사"
running = "검사 중"

[ui.admin.integrity.status]
fail = "실패"
pass = "정상"
warning = "주의"

[ui.admin.integrity.summary]
checked_at = "검사 시각"
failures = "실패 건수"
failures_text = "실패 {{count}}건"
passed = "정상"
title = "정합성 최종 검증"
total_checks = "검사 항목"

[ui.admin.integrity.table]
field = "필드"
login_id = "로그인 ID"
reason = "사유"
select = "선택"
select_item = "{{loginId}} 선택"
tenant = "테넌트"
user = "사용자"

[ui.admin.integrity.section]
tenant_integrity = "테넌트 정합성"
user_integrity = "사용자 정합성"

[msg.admin.integrity.section.tenant_integrity]
description = "테넌트 slug 중복과 부모 관계 이상을 확인합니다."

[msg.admin.integrity.section.user_integrity]
description = "사용자와 로그인 ID 참조의 고아 레코드를 확인합니다."

[ui.admin.integrity.check.duplicate_tenant_slugs]
title = "중복 테넌트 slug"

[ui.admin.integrity.check.orphan_tenant_parents]
title = "고아 테넌트 부모"

[ui.admin.integrity.check.orphan_user_login_id_tenants]
title = "고아 로그인 ID 테넌트"

[ui.admin.integrity.check.orphan_user_login_id_users]
title = "고아 로그인 ID 사용자"

[ui.admin.integrity.check.orphan_user_tenant_memberships]
title = "고아 사용자 테넌트 소속"

[ui.admin.nav]
org_chart = "조직도"
api_keys = "API 키"
audit_logs = "감사 로그"
auth_guard = "인증 가드"
data_integrity = "데이터 정합성"
logout = "로그아웃"
overview = "개요"
relying_parties = "애플리케이션(RP)"
tenant_dashboard = "테넌트 대시보드"
user_groups = "유저 그룹"
tenants = "테넌트"
ory_ssot = "Ory SSOT 시스템"
users = "사용자"

[ui.admin.ory_ssot]
loading = "불러오는 중"
title = "Ory SSOT 시스템"

[ui.admin.ory_ssot.actions]
flush_identity_cache = "Redis cache flush"

[ui.admin.ory_ssot.cache_card]
description = "Kratos identity 목록 및 조회 작업을 위한 Redis mirror/cache 상태입니다."
title = "Redis identity cache"

[ui.admin.ory_ssot.forbidden]
title = "접근 권한이 없습니다"

[ui.admin.ory_ssot.projection_card]
description = "관리자 검색과 통계에서 사용하는 PostgreSQL read model 상태입니다."
title = "Backend 사용자 read model"

[ui.admin.ory_ssot.status]
failed = "실패"
not_ready = "준비되지 않음"
ready = "준비됨"

[ui.admin.ory_ssot.summary]
cache_keys = "Cache keys"
last_refreshed = "마지막 refresh"
last_synced = "마지막 read-model refresh"
local_users = "Local users"
observed_identities = "관측 identity"
status = "상태"
updated_at = "상태 갱신"

[ui.admin.auth_guard]
subtitle = "관리자 권한과 ReBAC 관계를 실제 정책 엔진 기준으로 확인합니다."
title = "인증 가드"

[ui.admin.auth_guard.checker]
check = "권한 확인 실행"
checking = "검증 중..."
denied = "접근 거부"
denied_description = "해당 사용자는 요청한 리소스에 대해 권한이 없습니다."
description = "특정 주체(Subject)가 특정 리소스(Object)에 대해 권한이 있는지 Ory Keto를 통해 실시간으로 확인합니다."
object_id = "대상 ID"
object_id_placeholder = "Tenant UUID 등"
allowed = "접근 허용"
allowed_description = "해당 사용자는 요청한 리소스에 대해 권한이 있습니다. (상속 포함)"
namespace = "네임스페이스"
relation = "관계"
relation_placeholder = "view, manage, admins..."
subject = "주체 (User:ID)"
subject_placeholder = "User:uuid 또는 Namespace:ID#Relation"
title = "ReBAC 권한 검증 도구"

[ui.admin.auth_guard.checker.namespace]
label = "네임스페이스"
relying_party = "애플리케이션(RP)"
system = "시스템"
tenant = "테넌트"
tenant_group = "테넌트 그룹"

[ui.admin.org]
download_template = "템플릿 다운로드"
import_btn = "조직/사용자 통합 임포트"
import_title = "조직/사용자 통합 일괄 등록"
start_import = "임포트 시작"

[ui.admin.overview]
kicker = "Global Overview"

[ui.admin.overview.chart]
description = "전체 또는 선택한 회사 기준으로 그래프를 확인합니다."
title = "회사별 앱별 로그인 요청 현황"

[ui.admin.overview.playbook]
title = "Admin playbook"

[ui.admin.overview.quick_links]
add_tenant = "테넌트 추가"
api_key_management = "API 키 관리"
user_management = "사용자 관리"
title = "빠른 이동"
view_audit_logs = "감사 로그 보기"

[ui.admin.overview.summary]
audit_events_24h = "24시간 이벤트"
oidc_clients = "OIDC 클라이언트"
policy_gate = "정책 게이트"
total_tenants = "전체 테넌트 수"
total_users = "전체 사용자 수"

[ui.admin.profile]
manageable_tenants = "관리 가능한 테넌트"

[ui.admin.role]
rp_admin = "서비스 관리자 (RP Admin)"
super_admin = "시스템 관리자 (Super Admin)"
tenant_admin = "테넌트 관리자 (Tenant Admin)"
tenant_member = "일반 사용자 (Tenant Member)"
user = "일반 사용자 (Tenant Member)"

[ui.admin.tenants]
add = "테넌트 추가"
csv_template = "템플릿"
data_mgmt = "데이터 관리"
delete_selected = "선택 삭제"
export_with_ids = "UUID 포함"
export_without_ids = "UUID 제외 내보내기"
import = "가져오기"
title = "테넌트 목록"
view_org_chart = "전체 조직도 보기"

[ui.admin.tenants.domain_conflict]
description = ""
title = "도메인 충돌"

[ui.admin.tenants.import_preview]
candidates = "후보"
confirm = "가져오기 실행"
create_new_reset = "신규 생성 (ID/slug 재설정)"
csv_parents = "CSV 상위 테넌트"
external_id = "외부 ID"
match = "매칭"
no_candidates = "후보 없음"
parent = "상위"
parent_companies = "상위 회사"
parent_company_groups = "상위 그룹사"
parent_organizations = "상위 조직"
parent_unresolved = "부모 확인 필요"
slug_exists = "slug 충돌"
title = "CSV 가져오기 확인"

[ui.admin.tenants.admins]
add_button = "관리자 추가"
already_admin = "이미 관리자"
dialog_description = "이름 또는 이메일로 사용자를 검색하세요."
dialog_no_results = "검색 결과가 없습니다."
dialog_search_hint = "검색어를 입력해 주세요."
dialog_search_placeholder = "사용자 검색 (최소 2자)..."
dialog_title = "새 관리자 추가"
remove_title = "관리자 권한 회수"
table_actions = "액션"
table_email = "이메일"
table_name = "이름"
title = "테넌트 관리자"

[ui.admin.tenants.owners]
add_button = "소유자 추가"
already_owner = "이미 소유자"
dialog_description = "이름 또는 이메일로 사용자를 검색하세요."
dialog_title = "새 소유자 추가"
remove_title = "소유자 권한 회수"
table_actions = "액션"
table_email = "이메일"
table_name = "이름"
title = "테넌트 소유자"

[ui.admin.tenants.breadcrumb]
list = "List"
section = "Tenants"

[ui.admin.tenants.create]
title = "테넌트 추가"

[ui.admin.tenants.create.breadcrumb]
action = "Create"
section = "Tenants"

[ui.admin.tenants.create.form]
description = "설명"
domains_label = "Allowed Domains (Comma separated)"
domains_placeholder = "example.com, example.kr"
name = "테넌트 이름"
parent = "상위 테넌트"
pick_hanmac_parent = "한맥가족에서 선택"
pick_other_parent = "다른 테넌트 선택"
root_tenant = "최상위 테넌트로 생성"
slug = "Slug"
slug_placeholder = "tenant-slug"
status = "상태"
type = "유형"

[ui.admin.tenants.create.parent_context]
general = "일반 하위 테넌트"
hanmac = "한맥가족 하위 테넌트"
pick_required = "상위 테넌트 선택 필요"
root = "최상위 테넌트"

[ui.admin.tenants.create.memo]
title = "정책 메모"

[ui.admin.tenants.create.profile]
title = "Tenant Profile"

[ui.admin.tenants.detail]
breadcrumb_list = "테넌트 목록"
header_subtitle = "테넌트 정보를 수정하거나 연동 설정을 관리합니다."
loading = "불러오는 중..."
tab_federation = "외부 연동"
tab_organization = "조직 관리"
tab_permissions = "권한"
tab_profile = "프로필"
tab_schema = "사용자 스키마"
title = "상세"

[ui.admin.tenants.list]
search_placeholder = "테넌트 이름 또는 슬러그 검색..."
select_placeholder = "테넌트를 선택하세요"

[ui.admin.tenants.members]
descendants = "하위 조직 멤버"
direct = "소속 멤버"

[msg.admin.apikeys.registry]
count = "총 {{count}}개의 활성 키가 등록되어 있습니다."

[msg.admin.org]
import_partial_success = "일부 조직 정보를 가져왔습니다."

[msg.admin.tenants]
delete_bulk_confirm = "선택한 {{count}}개 테넌트를 삭제할까요?"

[msg.admin.users]
self_delete_blocked = "자신의 계정은 삭제할 수 없습니다."

[ui.admin.apikeys.registry]
title = "API 키 레지스트리"

[ui.admin.tenants.members]
delete_selected = "선택 삭제"
view_org_chart = "전체 조직도 보기"
direct_label = "직속"
list_title = "구성원 관리"
title = "테넌트 구성원 ({{count}})"
total = "전체"
total_label = "전체"

[ui.admin.tenants.members.table]
email = "EMAIL"
name = "NAME"
role = "ROLE"
status = "STATUS"

[ui.admin.tenants.profile]
allowed_domains = "허용된 도메인 (콤마로 구분)"
allowed_domains_help = "이 도메인을 가진 이메일로 가입한 사용자는 자동으로 이 테넌트에 배정됩니다."
approve_button = "테넌트 승인"
description = "설명"
name = "테넌트 이름"
org_unit_type = "조직 세부타입"
slug = "슬러그 (Slug)"
status = "상태"
subtitle = "슬러그 및 상태 변경은 즉시 적용됩니다."
title = "테넌트 프로필"
type = "테넌트 유형"
visibility = "공개 범위"

[ui.admin.tenants.parent]
local_search_placeholder = "테넌트 이름 또는 슬러그 검색"
pick_tenant = "테넌트 선택"

[ui.admin.tenants.registry]
title = "테넌트 레지스트리"

[ui.admin.tenants.schema]
add_field = "필드 추가"
save = "스키마 저장"
title = "User Schema Extension"

[ui.admin.tenants.schema.field]
admin_only = "관리자 전용"
indexed = "조회 인덱스"
key = "Field Key (ID)"
key_placeholder = "e.g. employee_id"
label = "표시 레이블"
label_placeholder = "예: 사번"
required = "필수 여부"
type = "타입"
type_boolean = "Boolean"
type_date = "Date"
type_number = "Number"
type_text = "Text"
validation_placeholder = "정규표현식 (선택 사항)"

[ui.admin.tenants.sub]
add = "하위 테넌트 추가"
add_dialog_desc = "하위 테넌트로 추가할 테넌트를 선택하세요."
add_dialog_title = "하위 테넌트 추가"
add_existing = "기존 테넌트 추가"
manage = "관리"
no_candidates = "추가 가능한 테넌트가 없습니다."
search_placeholder = "검색..."
title = "하위 테넌트 ({{count}})"
tree_search_placeholder = "트리에서 검색..."

[ui.admin.tenants.sub.table]
action = "ACTION"
name = "NAME"
slug = "SLUG"
status = "STATUS"

[ui.admin.tenants.view]
list = "평면 목록"
table = "평면"
tree = "트리"

[ui.admin.tenants.scope]
active = "{{name}} 하위"
pick = "상위 범위 선택"

[ui.admin.tenants.table]
actions = "ACTIONS"
id = "ID"
members_count = "{{count}}명"
members = "멤버수"
members_recursive = "하위 포함"
name = "이름"
slug = "슬러그"
status = "상태"
type = "유형"
updated = "수정일"

[ui.admin.users]
csv_template = "템플릿 다운로드"

[ui.admin.users.bulk]
create_missing_tenant = "신규 생성"
do_move = "이동 실행"
download_template = "템플릿 받기"
move_group = "테넌트 일괄 이동"
move_title = "사용자 일괄 이동"
no_department = "부서 없음"
select_group = "대상 테넌트 선택"
selected_count = "{{count}}명 선택됨"
start_upload = "업로드 시작"
tenant_resolution = "테넌트 매핑"
title = "일괄 작업"

[ui.admin.users.create]
back = "목록으로 돌아가기"
go_list = "목록으로 이동"
submit = "사용자 생성"
title = "사용자 추가"

[ui.admin.users.create.account]
title = "계정 정보"

[ui.admin.users.create.breadcrumb]
new = "New"
section = "Users"

[ui.admin.users.create.custom_fields]
title = "테넌트 확장 정보 (Custom Fields)"

[ui.admin.users.create.form]
auto_password = "자동 생성"
department = "부서"
department_placeholder = "개발팀"
email = "이메일"
email_placeholder = "user@example.com"
job_title = "직무"
job_title_placeholder = "프론트엔드 개발"
grade = "직급"
grade_placeholder = "수석/책임/선임"
name = "이름"
name_placeholder = "홍길동"
password = "비밀번호"
password_placeholder = "********"
phone = "전화번호"
phone_placeholder = "010-1234-5678"
position = "직책"
position_placeholder = "팀장/센터장"
role = "역할"
tenant = "테넌트"
tenant_global = "시스템 전역"

[ui.admin.users.create.password_generated]
title = "초기 비밀번호 생성 완료"

[ui.admin.users.detail]
back = "목록으로 돌아가기"
edit_title = "정보 수정"
title = "사용자 상세"

[ui.admin.users.detail.breadcrumb]
section = "Users"

[ui.admin.users.detail.custom_fields]
multi_title = "테넌트별 프로필 관리"

[ui.admin.users.detail.custom_claims]
save = "사용자 Claim 값 저장"
title = "사용자별 Custom Claim 값"

[ui.admin.users.detail.form]
department = "부서"
department_placeholder = "개발팀"
grade = "직급"
grade_placeholder = "수석/책임/선임"
name = "이름"
name_placeholder = "홍길동"
phone = "전화번호"
phone_placeholder = "010-1234-5678"
role = "역할"
status = "상태"
tenant = "대표 소속 테넌트"
tenant_global = "시스템 전역"
position = "직책"
position_placeholder = "팀장/센터장"

[ui.admin.users.detail.security]
password = "비밀번호 변경"
password_placeholder = "변경할 경우에만 입력"
title = "보안 설정"

[ui.admin.users.detail]
manual_password = "새 비밀번호"
manual_password_placeholder = "새 비밀번호를 입력하세요"
password_mode_generated = "자동 생성"
password_mode_manual = "수동 입력"
password_result_title = "Reset Password"
reset_password = "초기화 및 설정"
reset_password_apply = "비밀번호 적용"
toggle_password_visibility = "비밀번호 표시 전환"

[ui.admin.users.detail.tenants_section]
additional = "추가 소속/관리 테넌트"
primary = "대표 소속 테넌트"
title = "소속 및 조직 정보"

[ui.admin.users.global_custom_claims]
manage_definitions = "전역 정의 관리"

[ui.admin.users.list]
add = "사용자 추가"
add_to_tenant = "테넌트에 추가"
bulk_import = "일괄 임포트"
change_status = "{{name}} 상태 변경"
empty = "검색 결과가 없습니다."
fetch_error = "사용자 목록 조회에 실패했습니다."
search_label = "사용자 검색"
search_placeholder = "이름 또는 이메일 검색"
subtitle = "시스템 사용자를 조회하고 관리합니다."
toggle_status = "{{name}} 활성 상태"
title = "사용자 관리"

[msg.admin.users]
add_tenant_confirm = "'{{name}}'님을 '{{tenant}}' 테넌트에 추가하시겠습니까?"
add_tenant_error = "테넌트 추가 중 오류가 발생했습니다."
add_tenant_success = "해당 테넌트에 추가되었습니다."
export_error = "사용자 내보내기에 실패했습니다."
status_error = "사용자 상태 변경에 실패했습니다."
self_delete_blocked = "본인 계정은 삭제할 수 없습니다."

[ui.admin.tenants.members]
add_existing = "기존 멤버 배정"
create_new = "신규 멤버 생성"
remove = "조직에서 제외"
title = "테넌트 멤버 ({{count}})"
view_profile = "상세 정보"

[ui.admin.tenants.members.table]
actions = "ACTIONS"
email = "EMAIL"
name = "NAME"
role = "ROLE"
status = "STATUS"

[msg.admin.tenants.members]
empty = "소속된 사용자가 없습니다."
remove_confirm = "'{{name}}'님을 이 조직에서 제외하시겠습니까?"
remove_error = "조직에서 제외하는 중 오류가 발생했습니다."
remove_success = "조직에서 제외되었습니다."

[ui.admin.tenants.list]
search_label = "테넌트 검색"
search_placeholder = "이름 또는 슬러그, ID 검색"
title = "테넌트 목록"

[ui.admin.users.list.breadcrumb]
list = "List"
section = "Users"

[ui.admin.users.list.columns]
title = "컬럼 설정"

[ui.admin.users.list.filter]
tenant = "테넌트 필터"

[ui.admin.users.list.registry]
count = "총 {{count}}명의 사용자가 등록되어 있습니다."
title = "사용자 레지스트리"

[ui.admin.users.list.table]
actions = "액션"
created = "등록일"
email = "이메일"
id = "ID"
name = "이름"
phone = "전화번호"
role = "역할"
status = "상태"
tenant_dept = "테넌트 / 부서"

[ui.admin.users]
data_mgmt = "데이터 관리"

[ui.admin.users.table]
email = "이메일"
name = "이름"
role = "역할"


[ui.common.role]
admin = "Admin"
rp_admin = "RP Admin"
super_admin = "Super Admin"
tenant_admin = "Tenant Admin"
tenant_member = "Tenant Member"
user = "User"

[ui.common.status]
active = "활성"
archived = "보관됨"
baron_guest = "Baron 게스트"
blocked = "차단됨"
extended_leave = "장기휴직"
failure = "실패"
inactive = "비활성"
leave_of_absence = "휴직"
ok = "정상"
pending = "준비 중"
preboarding = "입사대기"
status = "상태"
success = "성공"
suspended = "정지"
temporary_leave = "단기휴무"

[test]
key = "테스트"

[non.existent]
key = "존재하지 않는 키"

[ui.dev]
brand = "Baron 로그인"
console_title = "Developer Console"
env_badge = "Env: dev"
scope_badge = "Scoped to /dev"

[ui.dev.nav]
clients = "연동 앱"
logout = "로그아웃"

[ui.dev.audit]
load_more = "더 보기"
title = "감사 로그"

[ui.dev.audit.registry]
title = "Audit registry"

[ui.dev.audit.filter]
action = "액션으로 필터 (예: ROTATE_SECRET)"
client_id = "Client ID로 필터"
status_all = "모든 상태"

[ui.dev.audit.table]
action = "액션"
actor = "수행자"
status = "상태"
target = "대상"
time = "시간"

[ui.dev.profile]
menu_aria = "계정 메뉴 열기"
menu_title = "계정"
unknown_email = "unknown@example.com"
unknown_name = "Unknown User"

[ui.shell.profile]
menu_aria = "계정 메뉴 열기"
menu_title = "계정"
unknown_email = "unknown@example.com"
unknown_name = "Unknown User"

[ui.shell.nav]
logout = "Logout"
profile = "내 정보"

[ui.shell.sidebar]
collapse = "사이드바 접기"
expand = "사이드바 펼치기"

[ui.shell.role]
rp_admin = "서비스 관리자 (RP Admin)"
super_admin = "시스템 관리자 (Super Admin)"
tenant_admin = "테넌트 관리자 (Tenant Admin)"
user = "일반 사용자 (Tenant Member)"

[ui.dev.clients]
new = "연동 앱 추가"
search_placeholder = "연동 앱 이름/ID로 검색..."
tenant_scoped = "Tenant-scoped"
untitled = "Untitled"

[ui.dev.clients.badge]
admin_session = "관리자 세션"
tenant_selected = "테넌트: 선택됨"

[ui.dev.clients.filter]
status_all = "모든 상태"
type_all = "모든 유형"
type_label = "유형:"

[ui.dev.clients.consents]
export_csv = "Export CSV"
revoke = "Revoke"
revoked_at = "철회일: "
scope_label = "권한:"
search_placeholder = "사용자 ID, 이름, 이메일로 검색"
status_label = "Status:"
status_revoked = "Revoked"
subject = "Subject"
title = "User Consent Grants"

[ui.dev.clients.consents.breadcrumb]
clients = "Clients"
current = "User Consent Grants"
home = "Home"

[ui.dev.clients.consents.filters]
advanced = "Advanced Filters"

[ui.dev.clients.consents.stats]
active_grants = "Active Grants"
avg_scopes = "Avg. Scopes per User"
total_scopes = "Total Scopes Issued"

[ui.dev.clients.consents.table]
action = "Action"
first_granted = "First Granted"
last_auth = "Last Authenticated"
scopes = "Granted Scopes"
status = "Status"
tenant = "Tenant"
user = "User"

[ui.dev.clients.details]

[ui.dev.clients.details.credentials]
client_id = "Client ID"
client_secret = "Client Secret"
title = "앱 자격 증명"

[ui.dev.clients.details.endpoints]
read_only = "읽기 전용"
title = "OIDC 엔드포인트"

[ui.dev.clients.details.redirect]
callback_label = "인증 콜백 URL"
label = "Redirect URIs"
placeholder = "https://your-app.com/callback, http://localhost:3000/auth/callback"
save = "Redirect URIs 저장"
title = "리디렉션 URI 설정"

[ui.dev.clients.details.secret]
hide = "비밀키 숨기기"
rotate = "비밀키 재발급 (Rotate)"
show = "비밀키 보기"

[ui.dev.clients.details.security]
title = "보안 메모"

[ui.dev.clients.details.tab]
connection = "연동 설정"
consents = "동의 및 사용자"
settings = "설정"

[ui.dev.clients.general]
create = "앱 생성"
display_new = "연동 앱 추가"
title_create = "연동 앱 생성"
title_edit = "연동 앱 설정"

[ui.dev.clients.federation]
title = "Identity Federation"
add_title = "Add Identity Provider"
add_btn = "Add Provider"

[ui.dev.clients.general.identity]
description = "Description"
description_placeholder = "앱에 대한 간단한 설명을 입력하세요."
logo = "App Logo URL"
logo_placeholder = "https://example.com/logo.png"
logo_preview = "Logo Preview"
name = "앱 이름"
name_placeholder = "My Awesome Application"
title = "Application Identity"

[ui.dev.clients.general.redirect]
label = "Redirect URIs"
placeholder = "https://app.example.com/callback, http://localhost:3000/auth/callback (콤마로 구분)"

[ui.dev.clients.general.scopes]
add = "Scope 추가"
description_placeholder = "권한에 대한 설명"
name_placeholder = "e.g. profile"
title = "Scopes"

[ui.dev.clients.general.scopes.table]
description = "Description"
mandatory = "Mandatory"
name = "Scope Name"
delete = "Delete"

[ui.dev.clients.general.security]
private = "Server side App"
pkce = "PKCE"
title = "보안 설정"

[ui.dev.clients.help]
docs_body = "Includes PKCE, client_secret_basic, redirect URI validation tips."
docs_title = "Docs & Examples"
subtitle = "Developer guides for Confidential/Public clients, redirect URIs, and auth methods."
title = "Need help with OIDC configuration?"
view_guides = "View guides"

[ui.dev.clients.list]
title = "연동 앱 목록"

[ui.dev.clients.owner]
avatar_alt = "ops user"
email = "admin@brsw.kr"
name = "AI Admin Bot"
role = "Role: Tenant Admin"
scope = "Scope: TENANT-12"
subtitle = "Tenant admin on-call"
title = "Owner"

[ui.dev.clients.registry]
description = "OIDC 앱, 인증 방식, 리다이렉트 URI, 비밀키 재발행을 감사 로그와 함께 관리합니다."
subtitle = "연동 앱"
title = "RP registry"

[ui.dev.clients.scopes]
email = "이메일 주소 접근"
openid = "OIDC 인증 필수 스코프"
profile = "기본 프로필 정보 접근"

[ui.dev.clients.table]
actions = "액션"
application = "애플리케이션"
client_id = "Client ID"
created_at = "생성일"
status = "상태"
type = "유형"

[ui.dev.clients.type]
private = "Server side App"
pkce = "PKCE"

[ui.dev.dashboard]
ready_badge = "devfront ready"

[ui.dev.dashboard.badge]
consent_guard = "Consent guard ready"
policy_toggle = "Policy toggle enabled"
rp_synced = "RP registry synced"

[ui.dev.dashboard.next]
subtitle = "Ship the RP controls"
title = "Next actions"

[ui.dev.dashboard.ops]
subtitle = "현재 관측"
title = "Ops board"

[ui.dev.dashboard.ops.card]
consent_revoked = "Consent 회수 건수"
hydra_status = "Hydra 상태"
rp_requests = "RP 요청 추이"

[ui.dev.dashboard.ops.tag]
consent = "Consent grants"
rp_status = "RP status"

[ui.dev.dashboard.stack]
notes = "Setup notes"
subtitle = "Devfront baseline"
title = "Stack readiness"

[ui.dev.header]
plane = "Dev Plane"
subtitle = "Manage your applications"

[ui.dev.session]
auto_extend = "세션 만료 관리"
active = "세션 활성"
disabled = "세션 만료 비활성화"
unknown = "알 수 없음"
expired = "세션 만료"
expiring = "만료 임박: {{minutes}}분 {{seconds}}초 남음"
remaining = "만료 예정: {{minutes}}분 {{seconds}}초 남음"

[ui.shell.session]
auto_extend = "세션 만료 관리"
active = "세션 활성"
disabled = "세션 만료 비활성화"
unknown = "알 수 없음"
expired = "세션 만료"
expiring = "만료 임박: {{minutes}}분 {{seconds}}초 남음"
remaining = "만료 예정: {{minutes}}분 {{seconds}}초 남음"

[ui.userfront]
app_title = "Baron SW 포탈"

[ui.userfront.app_label]
admin_console = "Admin Console"
baron = "Baron 로그인"
dev_console = "Dev Console"

[ui.userfront.audit]

[ui.userfront.audit.table]
app = "애플리케이션"
auth_method = "인증수단"
date = "접속일자"
device = "접속환경"
ip = "IP"
pending = "(준비중)"
result = "인증결과"
session_id = "Session ID"
status = "현황"

[ui.userfront.auth_method]
ory = "Ory 세션"
session = "세션"

[ui.userfront.dashboard]
last_auth_label = "최근 인증"
status_history = "상태 이력"

[ui.userfront.dashboard.activity]
linked = "연동됨"

[ui.userfront.dashboard.approved_session]
default = "승인한 세션 ID"
userfront = "승인한 Userfront 세션 ID"

[ui.userfront.dashboard.revoke]
confirm_button = "해지하기"
title = "연동 해지"

[ui.userfront.dashboard.scopes]
title = "권한 (Scopes)"

[ui.userfront.dashboard.status]
revoked = "해지됨"

[ui.userfront.device]
android = "Mobile(Android)"
ios = "Mobile(iOS)"
linux = "Desktop(Linux)"
macos = "Desktop(macOS)"
windows = "Desktop(Windows)"

[ui.userfront.error]
go_home = "홈으로 이동"
go_login = "로그인으로 이동"

[ui.userfront.forgot]
heading = "비밀번호를 잊으셨나요?"
input_label = "이메일 또는 휴대폰 번호"
submit = "재설정 링크 전송"
title = "비밀번호 재설정"

[ui.userfront.login]
forgot_password = "비밀번호를 잊으셨나요?"
signup = "회원가입"

[ui.userfront.login.action]
submit = "로그인"

[ui.userfront.login.field]
login_id = "이메일 또는 휴대폰 번호"
password = "비밀번호"

[ui.userfront.login.link]
code_only = "코드만 받기({{time}})"
resend_with_time = "재발송 ({{time}})"
send = "로그인 링크 전송"

[ui.userfront.login.qr]
expired = "QR 코드 만료됨"
refresh = "QR 코드 새로고침"
remaining = "남은 시간: {{time}}"

[ui.userfront.login.short_code]
digits = "숫자 6자리"
expire_time = "유효시간 {{time}}"
prefix = "영문 2자리"
submit = "코드로 로그인"

[ui.userfront.login.tabs]
link = "로그인 링크"
password = "비밀번호"
qr = "QR 코드"

[ui.userfront.login.unregistered]
action = "회원가입 하기"
title = "미등록 회원"

[ui.userfront.login.verification]
action_label = "확인"
page_title = "로그인 승인"
title = "승인 완료"

[ui.userfront.login_success]
later = "나중에 하기 (대시보드로 이동)"
qr = "QR 인증 (카메라 켜기)"
title = "로그인 완료"

[ui.userfront.nav]
dashboard = "대시보드"
logout = "로그아웃"
profile = "내 정보"
qr_scan = "QR 스캔"

[ui.userfront.profile]
department_empty = "소속 정보 없음"
manage = "프로필 관리"
user_fallback = "User"

[ui.userfront.profile.field]
affiliation = "구분"
company_code = "회사코드"
department = "소속"
email = "이메일"
name = "이름"
tenant = "소속 테넌트"

[ui.userfront.profile.password]
change = "비밀번호 변경"
confirm = "새 비밀번호 확인"
current = "현재 비밀번호"
forgot = "비밀번호를 잊으셨나요?"
new = "새 비밀번호"
title = "비밀번호 변경"

[ui.userfront.profile.phone]
code_hint = "인증번호 6자리"
request_code = "인증요청"
title = "전화번호"

[ui.userfront.profile.section]
basic = "기본 정보"
organization = "조직 정보"
security = "보안"

[ui.userfront.qr]
rescan = "다시 스캔"
result_success = "승인 완료"
title = "Scan QR Code"

[ui.userfront.reset]
confirm_password = "새 비밀번호 확인"
new_password = "새 비밀번호"
submit = "비밀번호 변경"
subtitle = "새로운 비밀번호 설정"
title = "새 비밀번호 설정"

[ui.userfront.sections]
apps = "나의 App 현황"
audit = "접속이력"

[ui.userfront.session]
active = "세션 활성"
unknown = "알 수 없음"

[ui.userfront.signup]
complete = "가입 완료"
next_step = "다음 단계"
title = "회원가입"

[ui.userfront.signup.agreement]
all = "모두 동의합니다"
privacy_title = "개인정보 수집 및 이용 동의 (필수)"
tos_title = "바론 소프트웨어 이용약관 (필수)"

[ui.userfront.signup.auth]
code_label = "인증코드 6자리"
request_code = "인증요청"

[ui.userfront.signup.auth.email]
label = "이메일 주소"
title = "이메일 인증"

[ui.userfront.signup.password]
confirm_label = "비밀번호 확인"
label = "비밀번호"

[ui.userfront.signup.phone]
label = "휴대폰 번호 (-없이)"
title = "휴대폰 인증"

[ui.userfront.signup.profile]
affiliation_type = "소속 유형"
company = "가족사 선택"
department = "부서명"
department_optional = "소속 정보 (선택)"
name = "이름"

[ui.userfront.signup.steps]
agreement = "약관동의"
password = "비밀번호"
profile = "정보입력"
verify = "본인인증"

[ui.userfront.signup.success]
action = "로그인하기"
