- 기록을 `common_util_audit.record_audit()` 한 곳으로 모음 — 여섯 자리에 흩어져 있던 raw INSERT 제거 - 대상 식별자 칸 신설(`017_audit_log_detail.sql`, 적용 완료) — 기존 `resource_id` 는 INT 라 프로젝트 UUID 를 못 담아 늘 NULL 이었음. 프로젝트 생성·수정·삭제·회사 생성이 대상을 남김 - 접속 주소·브라우저 기록 — 라우터가 요청을 넘겨 주고, 프록시 뒤에서는 X-Forwarded-For 우선 - 보관 기간 `AUDIT_LOG_RETENTION_DAYS` 기본 365일, 임시 보관함 정리 루프에 얹어 함께 정리 - 화면: 시스템 로그 표에 대상·접속 주소 열 추가(대상은 UUID 앞 8자만) 자체검증 — 프로젝트 생성·하드삭제를 실화면에서 돌려 두 줄 모두 `프로젝트 e1040640… · 127.0.0.1 · 2026-09-06 09:54/09:55` 로 남는 것 확인. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
626 lines
36 KiB
TypeScript
626 lines
36 KiB
TypeScript
/* =============================================================================
|
|
* ui_template_locale_b1.ts
|
|
* 다국어 사전 — B 그룹 전반부 (B01_Dashboard ~ B04_PreProcess)
|
|
*
|
|
* 워크플로우 진행 단계 라벨은 ui_template_locale_common.ts 의 WF_Step_* 키를
|
|
* 재사용한다 (중복 등록 방지).
|
|
*
|
|
* 이 파일은 사전 데이터만 담는다. 합성·언어 전환·t() 헬퍼는 ui_template_locale.ts 참조.
|
|
* ========================================================================== */
|
|
|
|
import type { LocaleEntry } from "./ui_template_locale_common";
|
|
|
|
export const ui_locales_b1 = {
|
|
/* --- 공통: 콘텐츠 미구현 안내 (B03~B06 본문 자리표시) --- */
|
|
B_Content_Pending: [
|
|
"이 영역의 상세 기능은 준비 중입니다.",
|
|
"The detailed features for this area are in preparation.",
|
|
],
|
|
|
|
/* --- B01_Dashboard 계정 관리 공통 문구 --- */
|
|
B01_Account_Title: ["내 계정", "My Account"],
|
|
B01_Account_Subtitle: [
|
|
"계정 정보와 소속 회사를 확인하고 수정할 수 있습니다.",
|
|
"View and edit your account information and company.",
|
|
],
|
|
B01_Account_Section_Profile: ["기본 정보", "Profile"],
|
|
B01_Account_Section_Security: ["보안", "Security"],
|
|
B01_Account_Field_Company: ["회사명", "Company"],
|
|
B01_Account_Field_Name: ["이름", "Name"],
|
|
B01_Account_Field_Email: ["이메일", "Email"],
|
|
B01_Account_Field_Phone: ["연락처", "Phone"],
|
|
B01_Account_Field_Phone_Placeholder: ["연락처를 입력하세요", "Enter phone number"],
|
|
B01_Account_Field_CurrentPw: ["현재 비밀번호", "Current password"],
|
|
B01_Account_Field_NewPw: ["새 비밀번호", "New password"],
|
|
B01_Account_Field_ConfirmPw: ["새 비밀번호 확인", "Confirm new password"],
|
|
B01_Account_Save_Profile: ["기본 정보 저장", "Save profile"],
|
|
B01_Account_Save_Password: ["비밀번호 변경", "Change password"],
|
|
B01_Account_Success_Profile: ["기본 정보가 저장되었습니다.", "Profile has been saved."],
|
|
B01_Account_Success_Password: ["비밀번호가 변경되었습니다.", "Password has been changed."],
|
|
B01_Account_Error_Required: ["필수 항목을 입력하세요.", "Please fill in required fields."],
|
|
B01_Account_Error_PwMismatch: ["새 비밀번호가 일치하지 않습니다.", "New passwords do not match."],
|
|
B01_Account_Error_PwLength: [
|
|
"비밀번호는 8자 이상이어야 합니다.",
|
|
"Password must be at least 8 characters.",
|
|
],
|
|
B01_Dashboard_Title: ["AISLO 대시보드", "AISLO Dashboard"],
|
|
B01_Dashboard_Subtitle: [
|
|
"역할과 회사 상태에 맞춰 프로젝트, 조직, 보안 정보를 관리합니다.",
|
|
"Manage projects, organization, and security by role and company status.",
|
|
],
|
|
B01_Dashboard_Role_User: ["일반 사용자", "User"],
|
|
B01_Dashboard_Role_Admin: ["회사 관리자", "Company Admin"],
|
|
B01_Dashboard_Role_SystemAdmin: ["시스템 관리자", "System Admin"],
|
|
B01_Dashboard_Projects: ["프로젝트", "Projects"],
|
|
B01_Dashboard_NewProject: ["신규 프로젝트", "New project"],
|
|
B01_Dashboard_Company: ["회사 정보", "Company"],
|
|
B01_Dashboard_NoCompany: ["회사 미연결", "No company linked"],
|
|
B01_Dashboard_CreateCompany: ["회사 생성", "Create company"],
|
|
B01_Dashboard_FindCompany: ["회사 찾기", "Find company"],
|
|
B01_Dashboard_JoinCompany: ["가입 신청", "Request to join"],
|
|
B01_Dashboard_Members: ["팀원 관리", "Team members"],
|
|
B01_Dashboard_AddMember: ["팀원 추가", "Add member"],
|
|
B01_Dashboard_RemoveMember: ["제거", "Remove"],
|
|
B01_Dashboard_JoinRequests: ["가입 요청", "Join requests"],
|
|
B01_Dashboard_Approve: ["승인", "Approve"],
|
|
B01_Dashboard_Reject: ["거절", "Reject"],
|
|
B01_Dashboard_Resources: ["리소스 현황", "Resources"],
|
|
B01_Dashboard_Resources_ChartCaption: [
|
|
"최근 7일 리소스 사용률 (2분 간격)",
|
|
"Resource usage over the last 7 days (2-min interval)",
|
|
],
|
|
B01_Dashboard_Resources_ChartAria: [
|
|
"CPU, 메모리, 디스크 사용률 시계열 그래프",
|
|
"Time-series chart of CPU, memory, and disk usage",
|
|
],
|
|
B01_Dashboard_Companies: ["회사 관리", "Companies"],
|
|
B01_Dashboard_Users: ["사용자 관리", "Users"],
|
|
B01_Dashboard_AuditLogs: ["시스템 로그", "Audit logs"],
|
|
/* --- B01 임시 보관함 (프로젝트 생성 전 업로드, 2026-08-08) --- */
|
|
B01_Temp_Section: ["임시 보관함", "Temporary storage"],
|
|
B01_Temp_Field_Name: ["보관 이름", "Storage name"],
|
|
B01_Temp_Field_Name_Placeholder: ["예: 2026년 3공구 측량자료", "e.g. 2026 Section 3 survey"],
|
|
B01_Temp_Field_Files: ["파일 선택 (계획노선·라이다·좌표계·래스터)", "Select files"],
|
|
B01_Temp_Btn_Pick: ["파일 선택", "Choose files"],
|
|
B01_Temp_Btn_Add: ["파일 추가", "Add files"],
|
|
B01_Temp_Modal_Create: ["임시 자료 등록", "New stored set"],
|
|
B01_Temp_Modal_Add: ["파일 추가", "Add files"],
|
|
B01_Temp_Table_Type: ["종류", "Type"],
|
|
B01_Temp_Table_Name: ["파일명", "File"],
|
|
B01_Temp_Table_Size: ["크기", "Size"],
|
|
B01_Temp_Table_Status: ["상태", "Status"],
|
|
B01_Temp_Table_Action: ["작업", "Action"],
|
|
B01_Temp_File_Status_Stored: ["저장 완료", "Stored"],
|
|
B01_Temp_File_Status_Waiting: ["대기", "Waiting"],
|
|
B01_Temp_File_Status_Uploading: ["업로드 중", "Uploading"],
|
|
B01_Temp_File_Status_Paused: ["이어올리기 대기", "Resume pending"],
|
|
B01_Temp_File_Status_Failed: ["실패", "Failed"],
|
|
B01_Temp_File_Delete_Confirm: [
|
|
"이 파일을 보관함에서 삭제할까요?",
|
|
"Delete this file from temporary storage?",
|
|
],
|
|
B01_Temp_File_Delete_Success: ["파일을 삭제했습니다.", "File deleted."],
|
|
B01_Temp_File_Delete_Failed: ["파일 삭제에 실패했습니다.", "Failed to delete the file."],
|
|
/* 보관 기간은 섹션 제목 옆 태그로만 알린다(안내 문단 폐기, 2026-08-08). */
|
|
B01_Temp_Hint_Days: ["일 보관", " days retained"],
|
|
B01_Temp_Status_Uploading: ["업로드 중", "Uploading"],
|
|
B01_Temp_Status_Ready: ["사용 가능", "Ready"],
|
|
B01_Temp_Status_Linked: ["프로젝트 연결됨", "Linked"],
|
|
B01_Temp_Meta_FileCount: ["개 파일", " files"],
|
|
B01_Temp_Meta_Expires: ["보관 만료", "Expires"],
|
|
B01_Temp_Meta_Linked: ["프로젝트로 이동 완료", "Moved to project"],
|
|
B01_Temp_Error_Name: ["보관 이름을 입력하세요.", "Enter a storage name."],
|
|
B01_Temp_Error_Files: ["올릴 파일을 선택하세요.", "Select files to upload."],
|
|
B01_Temp_Upload_Success: ["보관함에 저장했습니다.", "Saved to temporary storage."],
|
|
B01_Temp_Upload_Failed: ["보관함 업로드에 실패했습니다.", "Failed to upload."],
|
|
B01_Temp_Load_Failed: ["보관함을 불러오지 못했습니다.", "Failed to load storage."],
|
|
B01_Temp_Delete_Confirm: [
|
|
"이 보관 자료를 삭제할까요? 되돌릴 수 없습니다.",
|
|
"Delete this stored set? This cannot be undone.",
|
|
],
|
|
B01_Temp_Delete_Success: ["보관 자료를 삭제했습니다.", "Stored set deleted."],
|
|
B01_Temp_Delete_Failed: ["삭제에 실패했습니다.", "Failed to delete."],
|
|
|
|
B01_Dashboard_Profile: ["기본정보", "Profile"],
|
|
B01_Dashboard_SaveProfile: ["기본정보 저장", "Save profile"],
|
|
B01_Dashboard_Table_Project: ["프로젝트명", "Project"],
|
|
B01_Dashboard_Table_Region: ["지역", "Region"],
|
|
B01_Dashboard_Table_Workflow: ["워크플로우", "Workflow"],
|
|
B01_Dashboard_Table_Updated: ["수정일", "Updated"],
|
|
B01_Dashboard_Table_Email: ["이메일", "Email"],
|
|
B01_Dashboard_Table_Name: ["이름", "Name"],
|
|
B01_Dashboard_Table_Position: ["직급", "Position"],
|
|
B01_Dashboard_Table_Department: ["부서", "Department"],
|
|
B01_Dashboard_Table_Role: ["역할", "Role"],
|
|
B01_Dashboard_Table_Status: ["상태", "Status"],
|
|
B01_Dashboard_Table_Company: ["회사명", "Company"],
|
|
B01_Dashboard_Table_Requested: ["신청일", "Requested"],
|
|
B01_Dashboard_Table_Action: ["관리", "Action"],
|
|
B01_Dashboard_Table_Event: ["동작", "Event"],
|
|
B01_Dashboard_Table_Target: ["대상", "Target"],
|
|
B01_Dashboard_Table_Origin: ["접속 주소", "From"],
|
|
B01_Dashboard_Table_When: ["일시", "When"],
|
|
B01_Dashboard_Table_Owner: ["소유자", "Owner"],
|
|
B01_Dashboard_Field_BusinessNumber: ["사업자등록번호", "Business number"],
|
|
B01_Dashboard_Field_Address: ["주소", "Address"],
|
|
B01_Dashboard_Field_Owner: ["대표자명", "Owner"],
|
|
B01_Dashboard_Field_Search: ["검색어", "Search"],
|
|
B01_Dashboard_Field_MemberEmail: ["팀원 이메일", "Member email"],
|
|
B01_Dashboard_Field_Email: ["이메일", "Email"],
|
|
B01_Dashboard_Metric_Cpu: ["CPU", "CPU"],
|
|
B01_Dashboard_Metric_Memory: ["메모리", "Memory"],
|
|
B01_Dashboard_Metric_Disk: ["디스크", "Disk"],
|
|
B01_Dashboard_Metric_ActiveUsers: ["활성 사용자", "Active users"],
|
|
B01_Dashboard_Metric_ActiveProjects: ["활성 프로젝트", "Active projects"],
|
|
B01_Dashboard_Modal_CreateCompany: ["회사 생성", "Create company"],
|
|
B01_Dashboard_Modal_FindCompany: ["회사 검색", "Find company"],
|
|
B01_Dashboard_Modal_AddMember: ["팀원 추가", "Add member"],
|
|
B01_Dashboard_Saved: ["저장되었습니다.", "Saved."],
|
|
B01_Dashboard_LoadFailed: ["대시보드를 불러오지 못했습니다.", "Failed to load dashboard."],
|
|
B01_Dashboard_RequestFailed: ["요청 처리에 실패했습니다.", "Request failed."],
|
|
|
|
// 프로젝트 관리
|
|
B01_Dashboard_EditProject: ["프로젝트 수정", "Edit Project"],
|
|
B01_Dashboard_DeleteProject: ["프로젝트 삭제", "Delete Project"],
|
|
|
|
// 사용자 관리
|
|
B01_Dashboard_AddUser: ["사용자 추가", "Add User"],
|
|
B01_Dashboard_EditUser: ["사용자 수정", "Edit User"],
|
|
B01_Dashboard_DeleteUser: ["사용자 삭제", "Delete User"],
|
|
B01_Dashboard_ChangeRole: ["역할 변경", "Change Role"],
|
|
B01_Dashboard_SelectAvailableUsers: ["사용 가능한 사용자 선택", "Select Available Users"],
|
|
|
|
// 확인 메시지
|
|
B01_Dashboard_Confirm_DeleteProject: [
|
|
"프로젝트를 삭제하시겠습니까? 되돌릴 수 없습니다.",
|
|
"Delete this project? This cannot be undone.",
|
|
],
|
|
// 하드 삭제 모드(PROJECT_DELETE_HARD_ENABLED=True) 전용 경고
|
|
B01_Dashboard_Confirm_DeleteProject_Hard: [
|
|
"[하드 삭제 모드] 업로드한 라이다 원본과 모든 계산 결과가 서버에서 영구 삭제됩니다. 복구할 수 없습니다. 삭제하시겠습니까?",
|
|
"[Hard delete mode] The uploaded LiDAR source and every computed result will be permanently erased from the server. This cannot be recovered. Delete anyway?",
|
|
],
|
|
B01_Dashboard_Confirm_DeleteUser: ["사용자를 삭제하시겠습니까?", "Delete this user?"],
|
|
B01_Dashboard_Confirm_LastAdmin: [
|
|
"회사의 유일한 관리자는 삭제할 수 없습니다.",
|
|
"Cannot delete the last admin of the company.",
|
|
],
|
|
B01_Dashboard_CannotChangeToSystemAdmin: [
|
|
"시스템 관리자로 변경할 수 없습니다.",
|
|
"Cannot change role to System Admin.",
|
|
],
|
|
|
|
/* --- B02_ProjRegister 프로젝트 등록 --- */
|
|
B02_Proj_Title: ["프로젝트 등록", "Register Project"],
|
|
B02_Proj_Subtitle: [
|
|
"새 임도 설계 프로젝트의 기본 정보를 입력하세요.",
|
|
"Enter the basic information for a new forest road project.",
|
|
],
|
|
B02_Proj_Field_Name: ["프로젝트명", "Project name"],
|
|
B02_Proj_Field_Name_Placeholder: [
|
|
"예: 2025년 산불진화임도(기번8)",
|
|
"e.g. 2025 Fire-suppression Road (No.8)",
|
|
],
|
|
B02_Proj_Field_Region: ["사업 지역", "Region"],
|
|
B02_Proj_Field_Region_Placeholder: ["예: 울진군 금강송면", "e.g. Uljin-gun"],
|
|
B02_Proj_Field_RoadType: ["임도 종류", "Road type"],
|
|
// 현행 「임도설치 및 관리 등에 관한 규정」의 3종 — 지선임도는 폐지(작업임도로
|
|
// 간주), 계류보전은 임도 종류가 아니라 사방사업 구분이라 뺐다(2026-08-19 확정).
|
|
B02_Proj_RoadType_Main: ["간선임도", "Main forest road"],
|
|
B02_Proj_RoadType_Fire: ["산불진화임도", "Fire-suppression forest road"],
|
|
B02_Proj_RoadType_Work: ["작업임도", "Work forest road"],
|
|
B02_Proj_Field_Year: ["사업 연도", "Project year"],
|
|
B02_Proj_Field_Length: ["예상 연장 (m)", "Estimated length (m)"],
|
|
B02_Proj_Field_Length_Placeholder: ["예상 노선 길이", "Estimated route length"],
|
|
B02_Proj_Field_Memo: ["비고", "Notes"],
|
|
B02_Proj_Field_Memo_Placeholder: ["추가 메모 (선택)", "Additional notes (optional)"],
|
|
B02_Proj_Submit: ["프로젝트 생성", "Create project"],
|
|
B02_Proj_Success: [
|
|
"프로젝트가 생성되었습니다. 파일 입력 단계로 이동합니다.",
|
|
"Project created. Moving to the file input step.",
|
|
],
|
|
B02_Proj_Error_Required: ["필수 항목을 입력하세요.", "Please fill in required fields."],
|
|
|
|
/* --- B03_FileInput 파일 입력 --- */
|
|
B03_File_Title: ["파일입력", "File Input"],
|
|
B03_File_Subtitle: [
|
|
"필수 계획노선과 지형·포인트클라우드 파일을 업로드하세요.",
|
|
"Upload the required planned route, terrain, and point cloud files.",
|
|
],
|
|
B03_File_Select_Label: ["입력 파일 선택", "Select input files"],
|
|
/* --- 좌측 안내 패널 (2026-09-03) --- */
|
|
B03_Guide_Files_Title: ["필요한 파일", "Files you need"],
|
|
B03_Guide_Files_Route: [
|
|
"계획노선 — shapefile 한 벌(.shp·.shx·.dbf·.cpg·.prj) 5개.",
|
|
"Planned route — the five shapefile parts (.shp, .shx, .dbf, .cpg, .prj).",
|
|
],
|
|
B03_Guide_Files_Terrain: [
|
|
"지형 — 포인트클라우드 LAS/LAZ 1개와 좌표계 PRJ, 래스터 기준 TFW.",
|
|
"Terrain — one LAS/LAZ point cloud plus the PRJ projection and TFW world file.",
|
|
],
|
|
B03_Guide_Files_Optional: [
|
|
"지형 TIF(DEM)는 선택 사항 — 없어도 지표면 분석이 진행됩니다.",
|
|
"The terrain TIF (DEM) is optional — surface analysis runs without it.",
|
|
],
|
|
B03_Guide_How_Title: ["고르는 방법", "How to pick"],
|
|
B03_Guide_How_Drop: [
|
|
"여러 개를 한 번에 끌어 놓으면 확장자로 카드에 자동 배정됩니다.",
|
|
"Drop several files at once — each is assigned to a card by its extension.",
|
|
],
|
|
B03_Guide_How_Card: [
|
|
"카드의 [선택]으로 한 칸씩 지정하거나 ✕로 되돌릴 수 있습니다.",
|
|
"Use a card's [Select] to set one slot, or ✕ to clear it.",
|
|
],
|
|
B03_Guide_How_Temp: [
|
|
"[임시 보관함]은 대시보드에 미리 올려 둔 자료를 가져옵니다.",
|
|
"[Temporary storage] pulls files you staged on the dashboard.",
|
|
],
|
|
B03_Guide_Notes_Title: ["알아 둘 것", "Before you upload"],
|
|
B03_Guide_Notes_Replace: [
|
|
"이미 완료된 프로젝트에 다시 올리면 기존 분석 결과가 교체됩니다.",
|
|
"Uploading again to a finished project replaces the existing analysis.",
|
|
],
|
|
B03_Guide_Notes_Crs: [
|
|
"작업 좌표계는 라이다 PRJ가 기준 — 노선 좌표계와 다르면 업로드가 막힙니다.",
|
|
"The LiDAR PRJ sets the working CRS — a mismatched route CRS blocks the upload.",
|
|
],
|
|
B03_Guide_Notes_LasFree: [
|
|
"라이다가 없으면 [LAS 없는 설계]를 켜고 도엽 등고선으로 진행합니다.",
|
|
"With no LiDAR, turn on [Design without LAS] and work from sheet contours.",
|
|
],
|
|
B03_File_Selected_Title: ["선택한 파일", "Selected files"],
|
|
B03_File_Selected_Empty: ["선택한 파일이 없습니다.", "No files selected."],
|
|
B03_File_Upload_Button: ["파일 업로드", "Upload files"],
|
|
B03_File_Upload_Busy: ["업로드 중…", "Uploading…"],
|
|
B03_File_Error_Project: [
|
|
"현재 프로젝트가 선택되지 않았습니다. 프로젝트를 먼저 생성하거나 선택하세요.",
|
|
"No current project is selected. Create or select a project first.",
|
|
],
|
|
B03_File_Error_Required: ["업로드할 파일을 선택하세요.", "Select files to upload."],
|
|
B03_File_Error_Count: [
|
|
"한 번에 업로드할 수 있는 파일 수를 초과했습니다.",
|
|
"Too many files were selected for one upload.",
|
|
],
|
|
B03_File_Error_Las: [
|
|
"LAS 또는 LAZ 파일을 정확히 1개 선택하세요.",
|
|
"Select exactly one LAS or LAZ file.",
|
|
],
|
|
B03_File_Error_LasFreeBlocked: [
|
|
"LAS 없이 설계를 켠 상태에서는 LAS/LAZ 파일을 넣을 수 없습니다.",
|
|
"LAS/LAZ files cannot be added while designing without LAS.",
|
|
],
|
|
B03_File_Error_Extension: ["허용되지 않은 파일 형식입니다.", "Unsupported file type."],
|
|
B03_File_Error_Size: ["파일 크기 제한을 초과했습니다.", "File size limit exceeded."],
|
|
B03_File_Upload_Success: ["입력 파일 업로드를 완료했습니다.", "Input files uploaded."],
|
|
B03_File_Upload_Failed: ["파일 업로드에 실패했습니다.", "File upload failed."],
|
|
B03_File_Analysis_InProgress: [
|
|
"WF1 분석이 백그라운드에서 진행 중입니다. 완료되면 자동으로 이동합니다.",
|
|
"WF1 analysis is running in the background. You will move automatically when it completes.",
|
|
],
|
|
B03_File_Analysis_StillRunning: [
|
|
"분석이 계속 진행 중입니다. 잠시 후 다시 확인하세요.",
|
|
"Analysis is still running. Check again shortly.",
|
|
],
|
|
B03_File_Result_Path: ["저장 경로", "Stored path"],
|
|
B03_File_Group_Required: ["필수 파일", "Required files"],
|
|
B03_File_Group_Optional: ["선택 파일", "Optional files"],
|
|
/* 자료 출처가 갈려 컨테이너를 둘로 나눈다 — 계획노선 / 지형(LAS)(2026-08-31). */
|
|
B03_File_Group_Inputs: ["입력 자료", "Input files"],
|
|
B03_File_Group_Route: ["계획노선 자료", "Planned route files"],
|
|
B03_File_Group_Terrain: ["지형 자료 (LAS)", "Terrain files (LAS)"],
|
|
B03_File_Group_Terrain_Hint: [
|
|
"여기의 PRJ·TFW는 지형 자료의 좌표계입니다 — 노선 PRJ와 별개입니다.",
|
|
"The PRJ and TFW here describe the terrain data, separate from the route PRJ.",
|
|
],
|
|
B03_File_Slot_PlannedRoute: ["계획노선 도형", "Planned Route Geometry"],
|
|
B03_File_Slot_RouteIndex: ["노선 도형 색인", "Route Shape Index"],
|
|
B03_File_Slot_RouteAttribute: ["노선 속성", "Route Attributes"],
|
|
B03_File_Slot_RouteEncoding: ["노선 속성 인코딩", "Route Attribute Encoding"],
|
|
B03_File_Slot_RouteProjection: ["노선 좌표계", "Route Projection"],
|
|
B03_File_Slot_PointCloud: ["포인트클라우드", "Point Cloud"],
|
|
B03_File_LasFree_Toggle: [
|
|
"LAS 없이 설계 (도엽등고선 기반)",
|
|
"Design without LAS (map sheet contours)",
|
|
],
|
|
B03_File_LasFree_Hint: [
|
|
"포인트클라우드 없이 1:5,000 수치지형도 등고선으로 지형을 만듭니다.",
|
|
"Terrain is built from 1:5,000 map sheet contours without a point cloud.",
|
|
],
|
|
B03_File_Slot_Projection: ["지형 좌표계", "Terrain Projection"],
|
|
B03_File_Slot_RasterCoord: ["래스터 좌표", "Raster Coord 1"],
|
|
B03_File_Slot_TerrainDem: ["지형 래스터", "Terrain DEM"],
|
|
B03_File_Slot_CadDrawing: ["CAD 도면", "CAD Drawing"],
|
|
/* --- B03 임시 보관함 불러오기 (2026-08-08) --- */
|
|
B03_Temp_Btn_Open: ["임시 보관함", "Temporary storage"],
|
|
B03_Temp_FileCount: ["개 파일", " files"],
|
|
B03_Temp_Modal_Title: ["보관 자료 선택", "Select stored files"],
|
|
B03_Temp_Modal_Empty: [
|
|
"사용할 수 있는 보관 자료가 없습니다. 대시보드 임시 보관함에서 필수 파일을 모두 올려 주세요.",
|
|
"No usable stored set. Upload all required files in the dashboard temporary storage first.",
|
|
],
|
|
B03_Temp_Select_Required: ["보관 자료를 선택하세요.", "Select a stored set."],
|
|
B03_Temp_Load_Failed: ["보관 자료를 불러오지 못했습니다.", "Failed to load stored sets."],
|
|
B03_Temp_Attach_Success: [
|
|
"보관 자료를 프로젝트로 옮겼습니다. 분석을 시작합니다.",
|
|
"Stored files moved to the project. Analysis started.",
|
|
],
|
|
B03_Temp_Attach_Failed: ["보관 자료 연결에 실패했습니다.", "Failed to attach stored files."],
|
|
B03_Temp_Attach_NoAnalysis: [
|
|
"파일은 옮겼지만 라이다 파일이 없어 분석을 시작하지 못했습니다.",
|
|
"Files moved, but analysis did not start (no point cloud file).",
|
|
],
|
|
|
|
B03_File_Preview_Extent: ["자료 범위", "Data extent"],
|
|
B03_File_Preview_Route: ["계획노선 형상", "Planned route shape"],
|
|
B03_File_Preview_Outside: [
|
|
"계획노선이 지형 자료 범위를 벗어납니다.",
|
|
"The planned route falls outside the terrain data extent.",
|
|
],
|
|
B03_File_Preview_Inside: [
|
|
"계획노선이 지형 자료 범위 안에 있습니다.",
|
|
"The planned route is inside the terrain data extent.",
|
|
],
|
|
B03_File_Card_Select: ["파일 선택", "Select file"],
|
|
B03_File_Card_Remove: ["파일 제거", "Remove file"],
|
|
B03_File_Card_Optional: ["선택", "Optional"],
|
|
B03_File_Error_DuplicateSlot: [
|
|
"같은 유형의 파일이 이미 선택되어 있습니다.",
|
|
"A file for this slot is already selected.",
|
|
],
|
|
B03_File_Error_RequiredSlots: [
|
|
"필수 카드를 모두 채우세요 — 계획노선(shapefile 한 벌 또는 CSV), LAS/LAZ, 지형 PRJ·TFW.",
|
|
"Fill every required card: the planned route (a full shapefile set or a CSV), " +
|
|
"LAS/LAZ, and the terrain PRJ and TFW.",
|
|
],
|
|
B03_File_Error_SlotType: [
|
|
"선택한 파일 유형이 이 카드와 맞지 않습니다.",
|
|
"The selected file type does not match this card.",
|
|
],
|
|
B03_File_Progress_Bytes: ["진행", "Progress"],
|
|
B03_File_Progress_Speed: ["속도", "Speed"],
|
|
B03_File_Progress_Eta: ["예상 완료", "ETA"],
|
|
B03_File_Status_Pending: ["대기", "Pending"],
|
|
B03_File_Status_Uploading: ["업로드 중", "Uploading"],
|
|
B03_File_Status_Completed: ["완료", "Completed"],
|
|
B03_File_Status_Failed: ["실패", "Failed"],
|
|
B03_File_Status_Detected: ["중단된 업로드 감지", "Paused upload detected"],
|
|
B03_File_Restore_State: ["저장된 업로드/분석 상태 복구", "Restored upload/analysis state"],
|
|
B03_File_Resume_Button: ["업로드 재개", "Resume upload"],
|
|
B03_File_New_Button: ["새 파일로 시작", "Start new file"],
|
|
B03_File_Overview_Complete: [
|
|
"필수 파일 업로드와 지표면 분석이 모두 완료된 프로젝트입니다. 파일을 다시 올리면 기존 결과가 교체됩니다.",
|
|
"All required files are uploaded and surface analysis is complete. Re-uploading replaces existing results.",
|
|
],
|
|
B03_File_Overview_Pending: [
|
|
"지점에서 중단된 업로드가 있습니다 — 같은 파일을 다시 선택하면 이어서 올립니다.",
|
|
"upload was interrupted — reselect the same file to resume.",
|
|
],
|
|
B03_File_Replace_Title: ["기존 파일 교체 확인", "Confirm file replacement"],
|
|
B03_File_Replace_Message: [
|
|
"이 슬롯에는 이미 업로드된 파일이 있습니다. 새 파일을 올리면 기존 파일과 그에 따른 분석 결과(지표면 모델 등)가 교체됩니다. 계속하시겠습니까?",
|
|
"This slot already has an uploaded file. Uploading a new one replaces the existing file and derived analysis results (surface model, etc.). Continue?",
|
|
],
|
|
B03_File_Replace_Confirm: ["교체하고 계속", "Replace and continue"],
|
|
B03_File_Replace_Cancel: ["취소", "Cancel"],
|
|
B03_File_ServiceWorker_Ready: [
|
|
"백그라운드 업로드 준비가 완료되었습니다.",
|
|
"Background upload is ready.",
|
|
],
|
|
B03_File_ServiceWorker_Unavailable: [
|
|
"현재 브라우저에서는 백그라운드 업로드를 사용할 수 없습니다.",
|
|
"Background upload is unavailable in this browser.",
|
|
],
|
|
|
|
/* --- B04_PreProcess 지표면 모델 분석 --- */
|
|
B04_Surface_Title: ["전처리", "Preprocess"],
|
|
B04_Surface_Field_InputId: ["입력 파일 ID", "Input File ID"],
|
|
B04_Surface_Field_InputId_Placeholder: ["예: 1", "e.g. 1"],
|
|
/* 지면 필터·서피스·스무딩은 함께 모델 하나를 결정하는 값이라 한 컨테이너에 둔다
|
|
(2026-08-01 사용자 지시). 그래서 예전 그룹 제목 대신 항목 라벨로 쓴다. */
|
|
B04_Surface_Group_Analysis: ["지표면 분석", "Surface Analysis"],
|
|
B04_Surface_Group_Filters: ["지면 필터", "Ground filter"],
|
|
B04_Surface_Group_Methods: ["서피스", "Surface"],
|
|
B04_Surface_Group_Display: ["모델 표시 옵션", "Model display options"],
|
|
B04_Surface_SheetSurface: ["도엽등고 3D 서피스", "Map-sheet contour 3D surface"],
|
|
B04_Surface_SheetLidar: ["라이다 겹쳐 보기", "Overlay LiDAR"],
|
|
B04_Surface_SheetLidar_Missing: [
|
|
"겹쳐 볼 라이다 지표면 모델이 없습니다.",
|
|
"No LiDAR surface model available to overlay.",
|
|
],
|
|
B04_Surface_Group_ViewControls: ["뷰어 시점 제어", "Viewer camera"],
|
|
B04_Surface_Field_Smoothing: ["스무딩", "Smoothing"],
|
|
B04_Surface_Smoothing_On: ["적용", "On"],
|
|
B04_Surface_Smoothing_Off: ["미적용", "Off"],
|
|
B04_Surface_Smoothing_Unsupported: [
|
|
"이 지표면 표현은 스무딩을 지원하지 않습니다.",
|
|
"This surface method does not support smoothing.",
|
|
],
|
|
B04_Surface_Opt_PointSize: ["점 크기", "Point size"],
|
|
B04_Surface_Opt_Density: ["밀도", "Density"],
|
|
B04_Surface_Field_Force: ["기존 결과 무시하고 재계산", "Force recompute"],
|
|
B04_Surface_Btn_Analyze: ["지표면 분석 실행", "Run Surface Analysis"],
|
|
B04_Surface_Btn_Refresh: ["목록 새로고침", "Refresh"],
|
|
B04_Surface_InputFiles: ["입력 포인트클라우드", "Input point cloud"],
|
|
B04_Surface_InputFiles_Empty: [
|
|
"분석 가능한 LAS/LAZ 파일이 없습니다.",
|
|
"No LAS/LAZ file is available.",
|
|
],
|
|
B04_Surface_Input_FileName: ["파일명", "File name"],
|
|
B04_Surface_Input_Crs: ["좌표계", "CRS"],
|
|
B04_Surface_Input_Size: ["크기(MB)", "Size (MB)"],
|
|
B04_Surface_PointCloud_Title: ["포인트클라우드 미리보기", "Point cloud preview"],
|
|
B04_Surface_Status_Unknown: ["상태 미확인", "Unknown"],
|
|
B04_Surface_GroundStats_Title: ["지면 필터 통계", "Ground filter stats"],
|
|
B04_Surface_GroundStats_Empty: ["표시할 지면 통계가 없습니다.", "No ground stats to display."],
|
|
B04_Surface_GroundStats_Filter: ["필터", "Filter"],
|
|
B04_Surface_GroundStats_SourcePoints: ["지면 포인트", "Ground points"],
|
|
B04_Surface_Result_Title: ["생성된 지표면 모델", "Generated Surface Models"],
|
|
B04_Surface_Result_Empty: [
|
|
"아직 생성된 지표면 모델이 없습니다.",
|
|
"No surface models generated yet.",
|
|
],
|
|
B04_Surface_Model_Resolution: ["해상도(m)", "Resolution (m)"],
|
|
B04_Surface_Model_Path: ["파일 경로", "File path"],
|
|
B04_Surface_Model_Filter: ["지면 필터", "Ground filter"],
|
|
B04_Surface_Model_Representation: ["표현 방식", "Representation"],
|
|
B04_Surface_Model_Confirmed: ["확정됨", "Confirmed"],
|
|
B04_Surface_Btn_Confirm: ["이 모델 확정", "Confirm this model"],
|
|
B04_Surface_Confirm_Success: [
|
|
"모델을 확정했습니다. 필터: {filter}, 기법: {method}, 스무딩/표현: {smoothing}",
|
|
"Model confirmed. Filter: {filter}, method: {method}, smoothing/representation: {smoothing}",
|
|
],
|
|
B04_Surface_Confirm_Failed: ["모델 확정에 실패했습니다.", "Failed to confirm model."],
|
|
B04_Surface_Build_Confirm: [
|
|
"이 조합({filter} · {method})은 아직 만들어지지 않았습니다.\n지금 계산해 영구 저장할까요? 자료량에 따라 수 분이 걸립니다.",
|
|
"This combination ({filter} · {method}) has not been built yet.\nBuild and store it now? This can take several minutes depending on data size.",
|
|
],
|
|
B04_Surface_Build_Action: ["계산하기", "Build"],
|
|
B04_Surface_Build_Running: [
|
|
"지표면 모델 계산 중… 창을 닫지 마세요.",
|
|
"Building surface model… keep this window open.",
|
|
],
|
|
B04_Surface_Build_Done: [
|
|
"계산 완료 — {filter} · {method} 모델을 저장했습니다.",
|
|
"Build complete — stored the {filter} · {method} model.",
|
|
],
|
|
B04_Surface_Build_Failed: [
|
|
"지표면 모델 계산에 실패했습니다.",
|
|
"Failed to build the surface model.",
|
|
],
|
|
B04_Surface_Map_Title: ["2D 배경 지도 및 GIS 레이어", "2D Basemap and GIS Layers"],
|
|
B04_Surface_Map_Background: ["배경 지도", "Basemap"],
|
|
B04_Surface_Map_GisLayer: ["국가 GIS 레이어", "National GIS Layer"],
|
|
B04_Surface_Map_None: ["없음", "None"],
|
|
B04_Surface_Map_PlannedRoute: ["계획선", "Planned route"],
|
|
/* 배수유역 분석 오버레이(관리자 확인용) — 조작 문구만 다국어로 둔다.
|
|
결과 상세 판독문(regionSummary)은 진단용 원문이라 그대로 둔다. */
|
|
B04_Surface_Watershed_Btn: ["유역 분석", "Basin analysis"],
|
|
B04_Surface_Watershed_Btn_Tip: [
|
|
"계획 노선(B03 업로드)과 도엽 등고선·세류선으로 배수유역을 처음부터 다시 분석합니다. 30초 안팎이 걸리며 결과는 영구저장소에 남습니다. 저장된 결과는 지도를 열 때 자동으로 표시되므로, 조건을 바꿨을 때만 누르면 됩니다.",
|
|
"Re-runs the drainage analysis from scratch using the planned route (uploaded in B03) and the sheet contours and streams. It takes about 30 seconds and the result is stored permanently. A stored result is shown automatically when the map opens, so press this only after changing the inputs.",
|
|
],
|
|
B04_Surface_Watershed_Btn_Analyzing: ["분석 중…", "Analyzing…"],
|
|
B04_Surface_Watershed_Btn_Loading: ["불러오는 중…", "Loading…"],
|
|
B04_Surface_Watershed_Part_Primary: ["1차 유역", "Primary region"],
|
|
B04_Surface_Watershed_Part_Basin: ["2차 유역", "Full basin"],
|
|
B04_Surface_Watershed_Part_Flow: ["유역 방향", "Flow cells"],
|
|
B04_Surface_Watershed_Part_Arrows: ["평균 흐름", "Mean flow"],
|
|
B04_Surface_Watershed_Status_Analyzing: [
|
|
"배수유역을 처음부터 다시 분석하는 중입니다. 30초 안팎 걸립니다…",
|
|
"Re-running the drainage analysis from scratch. This takes about 30 seconds…",
|
|
],
|
|
B04_Surface_Watershed_Status_Loading: [
|
|
"저장된 배수유역 분석을 불러오는 중…",
|
|
"Loading the stored drainage analysis…",
|
|
],
|
|
B04_Surface_Watershed_LoadFailed: [
|
|
"배수유역을 불러오지 못했습니다.",
|
|
"Failed to load the drainage analysis.",
|
|
],
|
|
/* {message}=원인 */
|
|
B04_Surface_Watershed_Failed: ["유역 분석 실패: {message}", "Basin analysis failed: {message}"],
|
|
B04_Surface_Watershed_NoSaved: [
|
|
"저장된 배수유역 분석이 없습니다. [유역 분석]을 누르세요.",
|
|
"No stored drainage analysis. Press [Basin analysis].",
|
|
],
|
|
B04_Surface_Watershed_Origin_Cached: ["저장분", "Cached"],
|
|
/* {seconds}=재산정에 걸린 시간(초) */
|
|
B04_Surface_Watershed_Origin_Recomputed: ["재산정 {seconds}초", "Recomputed in {seconds}s"],
|
|
/* 도로 유입 흐름 강도 */
|
|
B04_Surface_Flow_Strength: ["흐름 강도", "Flow strength"],
|
|
B04_Surface_Flow_Strength_Tip: [
|
|
"도로 1m 구간마다 그 자리로 모이는 상류 면적을 색으로 칠하고, 물이 특히 많이 모이는 자리를 마커로 찍습니다. 마커를 누르면 그 지점으로 들어오는 셀들의 외곽선을 보여 줍니다.",
|
|
"Colors each 1m stretch of road by the upstream area draining into it, and marks the spots that collect the most. Click a marker to outline the cells that drain into it.",
|
|
],
|
|
B04_Surface_Flow_Legend_Title: ["흐름강도", "Flow strength"],
|
|
B04_Surface_Flow_Hotspots: ["집중유역", "Inflow hotspots"],
|
|
B04_Surface_Flow_Hotspots_Tip: [
|
|
"노선 위에서 물이 특히 많이 모이는 자리(유입 집중점)를 마커로 표시합니다. 마커를 누르면 그 지점으로 들어오는 셀들의 외곽선을 보여 줍니다.",
|
|
"Marks the spots along the route that collect the most water. Click a marker to outline the cells draining into it.",
|
|
],
|
|
B04_Surface_Flow_Inflow_Loading: ["유입 셀을 불러오는 중…", "Loading the contributing cells…"],
|
|
/* {index}=마커 번호, {chainage}=누가거리, {area}=유입면적, {cells}=셀 수, {path}=최장 유하장 */
|
|
B04_Surface_Flow_Inflow_Summary: [
|
|
"유입 집중점 {index} · 측점 {chainage}m — 유입면적 {area} · 셀 {cells}개 · 최장 유하장 {path}m",
|
|
"Hotspot {index} · Station {chainage}m — Area {area} · {cells} cells · Longest path {path}m",
|
|
],
|
|
B04_Surface_Flow_Inflow_Failed: [
|
|
"유입 셀을 불러오지 못했습니다.",
|
|
"Failed to load the contributing cells.",
|
|
],
|
|
/* 상세 배수유역 (관 매설 지점 편집 + 세부유역 분할) */
|
|
B04_Surface_Basin_Btn: ["상세유역 분석", "Detail basins"],
|
|
B04_Surface_Basin_Btn_Busy: ["분석 중…", "Analyzing…"],
|
|
B04_Surface_Basin_Btn_Tip: [
|
|
"관 매설 지점을 기준으로 세부 배수유역을 나눕니다. 계획선 위에서 우클릭하면 관을 추가하고, 마커 위에서 우클릭하면 삭제합니다. 마커를 끌면 계획선을 따라 옮겨집니다.",
|
|
"Splits the basin per culvert. Right-click the route to add a culvert, right-click a marker to remove it, and drag a marker to slide it along the route.",
|
|
],
|
|
B04_Surface_Basin_Part_Basins: ["세부유역", "Sub-basins"],
|
|
B04_Surface_Basin_Menu_Add: ["관 매설 추가", "Add culvert"],
|
|
B04_Surface_Basin_Menu_Delete: ["관 매설 삭제", "Remove culvert"],
|
|
/* {pipes}=관 개수, {stream}=기본, {spacing}=자동 보충, {user}=수동, {basins}=세부유역 수, {source}=종단 Z 출처 */
|
|
B04_Surface_Basin_Summary: [
|
|
"관 {pipes}개(기본 {stream} / 자동 {spacing} / 수동 {user}) · 세부유역 {basins}개 · 종단 Z {source}",
|
|
"{pipes} culverts ({stream} stream / {spacing} auto / {user} manual) · {basins} sub-basins · profile Z {source}",
|
|
],
|
|
B04_Surface_Basin_Edited: [
|
|
"편집 중 — [상세유역 분석]을 눌러 다시 나눕니다.",
|
|
"Edited — press [Detail basins] to re-split.",
|
|
],
|
|
B04_Surface_Basin_TooClose: [
|
|
"관끼리 최소 간격 {min}m 안에는 넣을 수 없습니다.",
|
|
"Culverts cannot be closer than {min}m.",
|
|
],
|
|
/* {index}=유역 번호, {chainage}=관 측점, {area}=유역면적, {relief}=표고차, {flow}=유하장 */
|
|
B04_Surface_Basin_Selected: [
|
|
"선택 유역 {index} · 측점 {chainage}m — 면적 {area} · 표고차 {relief}m · 유하장 {flow}m",
|
|
"Basin {index} · Station {chainage}m — Area {area} · Relief {relief}m · Path {flow}m",
|
|
],
|
|
B04_Surface_Basin_Failed: [
|
|
"상세유역을 계산하지 못했습니다.",
|
|
"Failed to compute the sub-basins.",
|
|
],
|
|
B04_Surface_Basin_Saved: [
|
|
"관 매설 지점 {count}개를 저장했습니다.",
|
|
"Saved {count} culvert points.",
|
|
],
|
|
B04_Surface_Map_PlannedRouteEmpty: [
|
|
"B03에서 계획노선 파일을 올리면 표시됩니다.",
|
|
"Shown after the planned route file is uploaded in B03.",
|
|
],
|
|
B04_Surface_Map_Satellite: ["위성", "Satellite"],
|
|
B04_Surface_Map_Hybrid: ["하이브리드", "Hybrid"],
|
|
B04_Surface_Map_White: ["백지도", "White map"],
|
|
B04_Surface_Map_Cadastral: ["연속지적도", "Cadastral map"],
|
|
B04_Surface_Map_Water: ["수계망", "Water network"],
|
|
B04_Surface_Map_Landslide: ["산사태위험등급", "Landslide risk"],
|
|
B04_Surface_Map_Sigungu: ["시군구", "District boundary"],
|
|
B04_Surface_Map_Eupmyeondong: ["읍면동", "Town boundary"],
|
|
B04_Surface_Map_Contour: ["등고선", "Contour lines"],
|
|
B04_Surface_Map_SheetContour: ["도엽 등고선", "Sheet contours"],
|
|
B04_Surface_Map_ContourLabel: ["등고 라벨", "Contour labels"],
|
|
B04_Surface_Map_SheetStream: ["세류(전체)", "Streams (all)"],
|
|
B04_Surface_Map_SheetElevPoint: ["표고점", "Spot elevation"],
|
|
B04_Surface_Map_SheetCutFill: ["성절토", "Cut/fill slope"],
|
|
B04_Surface_Map_SheetWall: ["옹벽석축", "Retaining wall"],
|
|
B04_Surface_Map_SheetFlowDir: ["유수방향", "Flow direction"],
|
|
B04_Surface_Map_Reset: ["보기 초기화", "Reset view"],
|
|
B04_Surface_Map_ImageAlt: ["VWorld 배경 지도", "VWorld basemap"],
|
|
B04_Surface_Map_Empty: [
|
|
"배경 지도 또는 GIS 레이어를 선택하세요.",
|
|
"Select a basemap or GIS layer.",
|
|
],
|
|
B04_Surface_Map_Loading: ["지도 레이어를 불러오는 중입니다.", "Loading map layers."],
|
|
B04_Surface_Map_Features: ["{count}개 객체 표시", "Showing {count} features"],
|
|
B04_Surface_Map_LoadFailed: ["지도 레이어를 불러오지 못했습니다.", "Failed to load map."],
|
|
B04_Surface_Error_Project: ["먼저 프로젝트를 선택하세요.", "Select a project first."],
|
|
B04_Surface_Error_InputId: ["유효한 입력 파일 ID를 입력하세요.", "Enter a valid input file ID."],
|
|
B04_Surface_Error_Selection: [
|
|
"지면 필터와 지표면 표현을 각각 1개 이상 선택하세요.",
|
|
"Select at least one filter and one method.",
|
|
],
|
|
B04_Surface_Analyze_Success: ["지표면 분석을 완료했습니다.", "Surface analysis complete."],
|
|
B04_Surface_Analyze_Failed: ["지표면 분석에 실패했습니다.", "Surface analysis failed."],
|
|
B04_Surface_Load_Failed: ["모델 목록을 불러오지 못했습니다.", "Failed to load models."],
|
|
} as const satisfies Record<string, LocaleEntry>;
|