diff --git a/ui_template/ui_template_locale.ts b/ui_template/ui_template_locale.ts index 4d5b48f6..0dcfca77 100644 --- a/ui_template/ui_template_locale.ts +++ b/ui_template/ui_template_locale.ts @@ -1,14 +1,27 @@ /* ============================================================================= * ui_template_locale.ts - * 다국어 텍스트 배열 방식 관리 파일 (i18n) + * 다국어 텍스트 배열 방식 관리 파일 (i18n) — 사전 합성 및 조회 헬퍼 * * 규칙 (frontend.md §3): - * - 모든 UI 문자열은 여기에 [한국어, 영어] 배열로 선(先) 등록. + * - 모든 UI 문자열은 사전 파일에 [한국어, 영어] 배열로 선(先) 등록. * - 컴포넌트에서는 ui_locales.키값[currentLanguageIndex] 형태로만 참조. * - 텍스트 하드코딩 절대 금지. - * - 신규 문구는 해당 섹션 최하단에 추가. + * - 신규 문구는 해당 사전 파일의 해당 섹션 최하단에 추가. + * + * 사전 파일 분할 (700줄 제약): + * - ui_template_locale_common.ts : 공통 (액션/상태/폼/네비게이션/워크플로우/앱 셸) + * - ui_template_locale_a.ts : A 그룹 (로그인 전 A01~A09) + * - ui_template_locale_b1.ts : B 그룹 전반부 (B01~B04) + * - ui_template_locale_b2.ts : B 그룹 후반부 (B05~B11) + * + * 이 파일의 export 시그니처는 분할 이전과 동일하므로 소비처 import 수정은 불필요하다. * ========================================================================== */ +import { ui_locales_common } from "./ui_template_locale_common"; +import { ui_locales_a } from "./ui_template_locale_a"; +import { ui_locales_b1 } from "./ui_template_locale_b1"; +import { ui_locales_b2 } from "./ui_template_locale_b2"; + /** 지원 언어 인덱스: 0 = 한국어, 1 = 영어 */ export const LANGUAGES = ["ko", "en"] as const; export type LanguageCode = (typeof LANGUAGES)[number]; @@ -34,1203 +47,12 @@ export function t(key: keyof typeof ui_locales): string { return entry[currentLanguageIndex] ?? entry[0]; } -/** [한국어, 영어] 배열 타입 */ -type LocaleEntry = readonly [ko: string, en: string]; - +/** 분할된 사전 4종을 합성한 단일 사전. 키는 파일 간 중복되지 않는다. */ export const ui_locales = { - /* --------------------------------------------------------------------------- - * 공통 — 액션 / 버튼 - * ------------------------------------------------------------------------ */ - Common_Btn_Confirm: ["확인", "Confirm"], - Common_Btn_Cancel: ["취소", "Cancel"], - Common_Btn_Save: ["저장", "Save"], - Common_Btn_Delete: ["삭제", "Delete"], - Common_Btn_Edit: ["수정", "Edit"], - Common_Btn_Add: ["추가", "Add"], - Common_Btn_Close: ["닫기", "Close"], - Common_Btn_Next: ["다음", "Next"], - Common_Btn_Prev: ["이전", "Previous"], - Common_Btn_Submit: ["제출", "Submit"], - Common_Btn_Reset: ["초기화", "Reset"], - Common_Btn_Download: ["다운로드", "Download"], - Common_Btn_Upload: ["업로드", "Upload"], - Common_Btn_Search: ["검색", "Search"], - Common_Btn_Apply: ["적용", "Apply"], - Common_Btn_Retry: ["다시 시도", "Retry"], - - /* --------------------------------------------------------------------------- - * 공통 — 상태 / 메시지 - * ------------------------------------------------------------------------ */ - Common_Status_Loading: ["불러오는 중...", "Loading..."], - Common_Status_Saving: ["저장 중...", "Saving..."], - Common_Status_Processing: ["처리 중...", "Processing..."], - Common_Status_Success: ["완료되었습니다", "Completed"], - Common_Status_Error: ["오류가 발생했습니다", "An error occurred"], - Common_Status_Empty: ["데이터가 없습니다", "No data available"], - Common_Msg_ConfirmDelete: ["정말 삭제하시겠습니까?", "Are you sure you want to delete?"], - Common_Msg_UnsavedChanges: ["저장되지 않은 변경사항이 있습니다", "You have unsaved changes"], - Common_Msg_RequiredField: ["필수 입력 항목입니다", "This field is required"], - Common_Msg_InvalidValue: ["올바르지 않은 값입니다", "Invalid value"], - Workflow_Progress_Title: ["진행단계", "Progress"], - Workflow_Overlay_Collapse: ["패널 접기", "Collapse panel"], - Workflow_Overlay_Expand: ["패널 펼치기", "Expand panel"], - - /* --------------------------------------------------------------------------- - * 공통 — 폼 / 검증 - * ------------------------------------------------------------------------ */ - Common_Form_Placeholder_Search: ["검색어를 입력하세요", "Enter search term"], - Common_Form_Placeholder_Select: ["선택하세요", "Select"], - Common_Validation_NumberRange: ["숫자 범위를 벗어났습니다", "Value out of range"], - Common_Validation_EmailFormat: ["이메일 형식이 올바르지 않습니다", "Invalid email format"], - - /* --------------------------------------------------------------------------- - * 글로벌 네비게이션 / 언어 - * ------------------------------------------------------------------------ */ - Nav_Home: ["홈", "Home"], - Nav_Login: ["로그인", "Login"], - Nav_Logout: ["로그아웃", "Logout"], - Nav_Register: ["회원가입", "Sign up"], - Nav_MyAccount: ["내 계정", "My Account"], - Lang_Korean: ["한국어", "Korean"], - Lang_English: ["영어", "English"], - Theme_Light: ["라이트 모드", "Light mode"], - Theme_Dark: ["다크 모드", "Dark mode"], - - /* --------------------------------------------------------------------------- - * 워크플로우 공통 (B04~B09 상단 진행 단계 라벨) - * ------------------------------------------------------------------------ */ - WF_Step_Surface: ["전처리", "Preprocess"], - WF_Step_Route: ["종단설계", "Profile Design"], - WF_Step_ProfileCross: ["횡단설계", "Cross Design"], - WF_Step_DesignDetail: ["상세설계", "Detail Design"], - WF_Step_Quantity: ["수량산출", "Quantity"], - WF_Step_Estimation: ["설계도서", "Design Docs"], - WF_State_Stale: ["무효화됨 (하위 단계 변경)", "Stale (invalidated by downstream changes)"], - WF_State_Failed: ["실패", "Failed"], - WF_State_Complete: ["완료", "Complete"], - WF_State_InProgress: ["진행 중", "In Progress"], - WF_State_NotStarted: ["미실행", "Not Started"], - - /* --------------------------------------------------------------------------- - * 앱 셸 — 헤더 / 푸터 (공통 네비게이션) - * ------------------------------------------------------------------------ */ - App_BrandName: ["AISLO", "AISLO"], - App_Nav_Program: ["프로그램", "Program"], - App_Nav_Company: ["회사소개", "Company"], - App_Nav_News: ["소식", "News"], - App_Nav_Education: ["교육", "Education"], - App_Nav_Support: ["기술지원", "Support"], - App_Footer_Copyright: [ - "© 2026 임도설계 및 견적 자동화. All rights reserved.", - "© 2026 Forest Road Design & Estimation. All rights reserved.", - ], - - /* --------------------------------------------------------------------------- - * 페이지 타이틀 (신규 문구는 아래에 계속 추가) - * ------------------------------------------------------------------------ */ - A01_Home_Title: ["임도 설계 및 견적 자동화", "Forest Road Design & Estimation"], - A06_Login_Title: ["로그인", "Login"], - A07_Register_Title: ["회원가입", "Sign up"], - - /* --- A01_Home 상세 --- */ - /* 단계를 늘어놓는 문구는 진행단계 이름(WF_Step_*)과 같은 말을 쓴다(2026-08-01 사용자 지시). */ - A01_Home_Hero_Subtitle: [ - "LAS 지형 데이터부터 종단설계·횡단설계, 수량산출, 설계도서까지 한 번에.", - "From LAS terrain data to profile and cross design, quantities, and design documents — all in one.", - ], - A01_Home_Hero_CtaPrimary: ["지금 시작하기", "Get Started"], - A01_Home_Hero_CtaSecondary: ["프로그램 살펴보기", "Explore Features"], - A01_Home_News_SectionTitle: ["최신 소식", "Latest News"], - A01_Home_News_Tag: ["공지", "Notice"], - A01_Home_Features_SectionTitle: ["주요 기능", "Key Features"], - A01_Home_Feature1_Title: ["3D 지형 분석", "3D Terrain Analysis"], - A01_Home_Feature1_Desc: [ - "LAS 포인트클라우드를 브라우저에서 3D 메쉬로 시각화합니다.", - "Visualize LAS point clouds as 3D meshes in the browser.", - ], - A01_Home_Feature2_Title: ["최적 경로 설계", "Optimal Route Design"], - A01_Home_Feature2_Desc: [ - "경사도와 제약조건을 반영한 최적 임도 경로를 계산합니다.", - "Compute optimal forest road routes with slope and constraints.", - ], - A01_Home_Feature3_Title: ["견적 자동화", "Automated Estimation"], - A01_Home_Feature3_Desc: [ - "수량 산출과 견적서를 Excel / PDF로 자동 생성합니다.", - "Auto-generate quantity takeoffs and estimates as Excel / PDF.", - ], - - /* --- A02_ProgDetail 프로그램 상세 --- */ - A02_ProgDetail_Title: ["프로그램 상세 안내", "Program Overview"], - A02_ProgDetail_Hero_Subtitle: [ - "LAS 스캔 데이터 한 벌로 임도 설계 전 과정을 자동화하는 6단계 워크플로우.", - "A 6-stage workflow that automates the entire forest road design process from a single LAS scan.", - ], - A02_ProgDetail_Hero_Cta: ["무료로 시작하기", "Start for Free"], - - A02_ProgDetail_Workflow_SectionTitle: ["6단계 설계 워크플로우", "6-Stage Design Workflow"], - /* 단계 이름은 진행단계 오버레이(WF_Step_*)와 같은 말을 쓴다 — 소개 페이지와 실제 화면의 - 단계 이름이 다르면 사용자가 같은 단계인지 알 수 없다(2026-08-01 사용자 지시). */ - A02_ProgDetail_Step1_Title: ["1. 전처리", "1. Preprocess"], - A02_ProgDetail_Step1_Desc: [ - "LAS 포인트클라우드에서 지면점을 필터링하고 15종 지표면 모델을 생성합니다.", - "Filter ground points from the LAS point cloud and generate 15 surface models.", - ], - A02_ProgDetail_Step2_Title: ["2. 종단설계", "2. Profile Design"], - A02_ProgDetail_Step2_Desc: [ - "경사·곡선반경·회피구역을 반영해 최적 임도 노선을 자동 탐색합니다.", - "Auto-search optimal routes reflecting grade, curve radius, and avoidance zones.", - ], - A02_ProgDetail_Step3_Title: ["3. 횡단설계", "3. Cross Design"], - A02_ProgDetail_Step3_Desc: [ - "확정 노선을 따라 종단면과 횡단면을 자동 추출합니다.", - "Automatically extract longitudinal and cross sections along the confirmed route.", - ], - A02_ProgDetail_Step4_Title: ["4. 상세설계", "4. Detail Design"], - A02_ProgDetail_Step4_Desc: [ - "구조물, 배수, 절·성토 등 세부 설계 요소를 편집합니다.", - "Edit detailed design elements such as structures, drainage, and cut/fill.", - ], - A02_ProgDetail_Step5_Title: ["5. 수량산출", "5. Quantity"], - A02_ProgDetail_Step5_Desc: [ - "토공량과 구조물 수량을 자동 계산합니다.", - "Automatically calculate earthwork volumes and structure quantities.", - ], - A02_ProgDetail_Step6_Title: ["6. 설계도서", "6. Design Docs"], - A02_ProgDetail_Step6_Desc: [ - "견적서와 설계도서를 Excel / DWG / PDF로 출력합니다.", - "Export estimates and design documents as Excel / DWG / PDF.", - ], - - A02_ProgDetail_Tech_SectionTitle: ["핵심 기술", "Core Technology"], - A02_ProgDetail_Tech1_Title: ["브라우저 3D 엔진", "Browser 3D Engine"], - A02_ProgDetail_Tech1_Desc: [ - "설치 없이 웹 브라우저에서 대용량 지형을 실시간 렌더링합니다.", - "Render large terrains in real time in the browser with no installation.", - ], - A02_ProgDetail_Tech2_Title: ["공간 분석 엔진", "Spatial Analysis Engine"], - A02_ProgDetail_Tech2_Desc: [ - "PostGIS 기반 공간 연산으로 정밀한 지형·경로 분석을 수행합니다.", - "Perform precise terrain and route analysis with PostGIS spatial operations.", - ], - A02_ProgDetail_Tech3_Title: ["단계별 결과 저장", "Stage-based Persistence"], - A02_ProgDetail_Tech3_Desc: [ - "각 단계 계산 결과를 영구 저장해 언제든 이어서 작업할 수 있습니다.", - "Persist each stage's results so you can resume work anytime.", - ], - - /* --- A03_CompDetail 회사 상세 --- */ - A03_CompDetail_Title: ["회사 소개", "About Us"], - A03_CompDetail_Hero_Subtitle: [ - "임업 엔지니어링과 공간정보 기술로 산림 인프라의 미래를 설계합니다.", - "Designing the future of forest infrastructure with forestry engineering and geospatial technology.", - ], - A03_CompDetail_Mission_SectionTitle: ["미션", "Our Mission"], - A03_CompDetail_Mission_Body: [ - "복잡하고 반복적인 임도 설계 과정을 자동화하여, 설계자가 판단과 창의에 집중할 수 있도록 돕습니다.", - "We automate the complex, repetitive forest road design process so engineers can focus on judgment and creativity.", - ], - A03_CompDetail_Value_SectionTitle: ["핵심 가치", "Core Values"], - A03_CompDetail_Value1_Title: ["정밀함", "Precision"], - A03_CompDetail_Value1_Desc: [ - "실측 데이터에 기반한 신뢰할 수 있는 설계 결과를 추구합니다.", - "We pursue reliable design results grounded in measured data.", - ], - A03_CompDetail_Value2_Title: ["효율", "Efficiency"], - A03_CompDetail_Value2_Desc: [ - "수작업 시간을 획기적으로 줄여 설계 생산성을 높입니다.", - "We dramatically cut manual work to boost design productivity.", - ], - A03_CompDetail_Value3_Title: ["지속가능성", "Sustainability"], - A03_CompDetail_Value3_Desc: [ - "환경 영향을 최소화하는 친환경 노선 설계를 지향합니다.", - "We aim for eco-friendly route designs that minimize environmental impact.", - ], - A03_CompDetail_Contact_SectionTitle: ["연락처", "Contact"], - A03_CompDetail_Contact_Email: ["이메일: contact@forestroad.kr", "Email: contact@forestroad.kr"], - - /* --- A04_NewsHistory 최신소식 및 개선 이력 --- */ - A04_NewsHistory_Title: ["최신 소식 & 개선 이력", "News & Changelog"], - A04_NewsHistory_Hero_Subtitle: [ - "제품 업데이트와 개선 사항을 시간순으로 확인하세요.", - "Track product updates and improvements in chronological order.", - ], - A04_NewsHistory_Tag_Feature: ["기능", "Feature"], - A04_NewsHistory_Tag_Fix: ["개선", "Fix"], - A04_NewsHistory_Tag_Notice: ["공지", "Notice"], - A04_NewsHistory_Empty: ["등록된 소식이 없습니다.", "No news available."], - - /* --- A05_EduDetail 교육 상세 --- */ - A05_EduDetail_Title: ["교육 안내", "Training & Education"], - A05_EduDetail_Hero_Subtitle: [ - "프로그램을 처음 접하는 분도 빠르게 익힐 수 있는 단계별 교육 과정.", - "Step-by-step courses that help newcomers get up to speed quickly.", - ], - A05_EduDetail_Course_SectionTitle: ["교육 과정", "Courses"], - A05_EduDetail_Course1_Title: ["기초 과정", "Beginner Course"], - A05_EduDetail_Course1_Desc: [ - "데이터 업로드부터 첫 지표면 분석까지 기본 흐름을 익힙니다.", - "Learn the basic flow from data upload to your first surface analysis.", - ], - A05_EduDetail_Course2_Title: ["실무 과정", "Practical Course"], - A05_EduDetail_Course2_Desc: [ - "실제 프로젝트로 경로 설계와 종횡단 생성을 실습합니다.", - "Practice route design and cross-section generation with real projects.", - ], - A05_EduDetail_Course3_Title: ["심화 과정", "Advanced Course"], - A05_EduDetail_Course3_Desc: [ - "수량 산출과 견적 자동화, 문서 출력까지 완성합니다.", - "Master quantity takeoff, estimation automation, and document export.", - ], - A05_EduDetail_Cta: ["교육 문의하기", "Request Training"], - - /* --- A06_Login 로그인 --- */ - A06_Login_Subtitle: ["계정에 로그인하세요.", "Sign in to your account."], - A06_Login_Field_Email: ["이메일", "Email"], - A06_Login_Field_Email_Placeholder: ["이메일을 입력하세요", "Enter your email"], - A06_Login_Field_Password: ["비밀번호", "Password"], - A06_Login_Field_Password_Placeholder: ["비밀번호를 입력하세요", "Enter your password"], - A06_Login_Submit: ["로그인", "Sign in"], - A06_Login_ToRegister: ["계정이 없으신가요? 회원가입", "No account? Sign up"], - A06_Login_Error_Required: [ - "이메일과 비밀번호를 모두 입력하세요.", - "Please enter both email and password.", - ], - A06_Login_Error_Email: ["이메일 형식이 올바르지 않습니다.", "Invalid email format."], - A06_Login_Field_Otp: ["이메일 인증 코드", "Email verification code"], - A06_Login_Field_Otp_Placeholder: ["6자리 코드를 입력하세요", "Enter the 6-digit code"], - A06_Login_Verify: ["인증하고 로그인", "Verify and sign in"], - A06_Login_OtpSent: ["인증 코드를 이메일로 발송했습니다.", "A verification code was emailed."], - A06_Login_OtpResend: ["인증 코드 재발송", "Resend verification code"], - A06_Login_OtpResendCountdown: ["{seconds}초 후 재발송", "Resend in {seconds}s"], - A06_Login_OtpBack: ["이메일/비밀번호 다시 입력", "Re-enter email/password"], - A06_Login_Success: ["로그인되었습니다.", "Signed in."], - A06_Login_Error_Request: ["로그인 요청에 실패했습니다.", "Sign-in request failed."], - - /* --- A07_Register 회원가입 --- */ - A07_Register_Subtitle: ["새 계정을 만드세요.", "Create a new account."], - A07_Register_Field_Company: ["회사명", "Company"], - A07_Register_Field_Company_Placeholder: ["회사명을 입력하세요", "Enter your company"], - A07_Register_Field_Name: ["이름", "Name"], - A07_Register_Field_Name_Placeholder: ["이름을 입력하세요", "Enter your name"], - A07_Register_Field_Email: ["이메일", "Email"], - A07_Register_Field_Email_Placeholder: ["이메일을 입력하세요", "Enter your email"], - A07_Register_Field_Password: ["비밀번호", "Password"], - A07_Register_Field_Password_Placeholder: ["8자 이상 입력하세요", "At least 8 characters"], - A07_Register_Field_PasswordConfirm: ["비밀번호 확인", "Confirm password"], - A07_Register_Field_PasswordConfirm_Placeholder: [ - "비밀번호를 다시 입력하세요", - "Re-enter password", - ], - A07_Register_Field_Position: ["직급", "Position"], - A07_Register_Field_Position_Placeholder: ["예) 과장, 대리, 사원", "e.g., Manager, Deputy, Staff"], - A07_Register_Field_Phone: ["전화번호", "Phone number"], - A07_Register_Field_Phone_Placeholder: ["010-1234-5678", "010-1234-5678"], - A07_Register_Submit: ["회원가입", "Sign up"], - A07_Register_ToLogin: ["이미 계정이 있으신가요? 로그인", "Already have an account? Sign in"], - A07_Register_Error_Required: [ - "모든 필수 항목을 입력하세요.", - "Please fill in all required fields.", - ], - A07_Register_Error_Email: ["이메일 형식이 올바르지 않습니다.", "Invalid email format."], - A07_Register_Error_Password: [ - "비밀번호는 8자 이상이어야 합니다.", - "Password must be at least 8 characters.", - ], - A07_Register_Error_PasswordMismatch: [ - "비밀번호와 확인 비밀번호가 일치하지 않습니다.", - "Passwords do not match.", - ], - A07_Register_Field_AccountType: ["가입 유형", "Account type"], - A07_Register_Type_Master: ["새 회사 등록", "Register a new company"], - A07_Register_Type_Member: ["기존 회사 참여", "Join an existing company"], - A07_Register_Field_CompanyId: ["회사 번호", "Company ID"], - A07_Register_Field_CompanyId_Placeholder: ["검색 결과의 회사 번호", "Company ID from search"], - A07_Register_Terms: ["이용약관에 동의합니다.", "I agree to the Terms of Service."], - A07_Register_Privacy: ["개인정보 처리방침에 동의합니다.", "I agree to the Privacy Policy."], - A07_Register_Marketing: [ - "마케팅 정보 수신에 동의합니다. (선택)", - "I agree to marketing messages (optional).", - ], - A07_Register_Field_Otp: ["이메일 인증 코드", "Email verification code"], - A07_Register_Verify: ["이메일 인증 완료", "Complete email verification"], - A07_Register_OtpSent: ["가입 인증 코드를 발송했습니다.", "Registration code sent."], - A07_Register_Success: ["가입 절차가 완료되었습니다.", "Registration completed."], - A07_Register_Error_Terms: ["필수 약관에 동의하세요.", "Agree to the required terms."], - A07_Register_Error_Request: ["회원가입 요청에 실패했습니다.", "Registration request failed."], - - /* --- A08_Support 기술지원 요청 --- */ - A08_Support_Title: ["기술지원 요청", "Technical Support"], - A08_Support_Subtitle: [ - "문제나 문의사항을 남겨 주시면 신속히 답변드리겠습니다.", - "Leave your issue or inquiry and we'll respond promptly.", - ], - A08_Support_Field_Name: ["이름", "Name"], - A08_Support_Field_Name_Placeholder: ["이름을 입력하세요", "Enter your name"], - A08_Support_Field_Email: ["이메일", "Email"], - A08_Support_Field_Email_Placeholder: ["회신 받을 이메일", "Email for reply"], - A08_Support_Field_Phone: ["연락처", "Phone"], - A08_Support_Field_Phone_Placeholder: ["연락 가능한 전화번호 (선택)", "Contact number (optional)"], - A08_Support_Field_Subject: ["제목", "Subject"], - A08_Support_Field_Subject_Placeholder: ["문의 제목", "Inquiry subject"], - A08_Support_Field_Message: ["문의 내용", "Message"], - A08_Support_Field_Message_Placeholder: [ - "문의 내용을 자세히 적어주세요", - "Describe your inquiry in detail", - ], - A08_Support_Submit: ["문의 보내기", "Send Inquiry"], - A08_Support_Success: [ - "문의가 접수되었습니다. 곧 연락드리겠습니다.", - "Your inquiry has been received. We'll be in touch soon.", - ], - A08_Support_Error_Required: ["모든 항목을 입력하세요.", "Please fill in all fields."], - A08_Support_Error_Email: ["이메일 형식이 올바르지 않습니다.", "Invalid email format."], - - /* --- A09_Security 보안 및 약관 --- */ - A09_Security_Title: ["보안 및 약관", "Security and Terms"], - A09_Security_Version: ["약관 버전", "Terms version"], - A09_Security_Terms: ["서비스 이용약관", "Terms of Service"], - A09_Security_Privacy: ["개인정보 처리방침", "Privacy Policy"], - A09_Security_Policy: ["세션 보안정책", "Session Security Policy"], - - /* =========================================================================== - * 로그인 후 (B 그룹) - * ======================================================================== */ - - /* 워크플로우 진행 단계 라벨은 상단 WF_Step_* 키를 재사용 (중복 등록 방지). */ - - /* --- 공통: 콘텐츠 미구현 안내 (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_Dashboard_Profile: ["기본정보", "Profile"], - B01_Dashboard_SaveProfile: ["기본정보 저장", "Save profile"], - B01_Dashboard_Table_Project: ["프로젝트명", "Project"], - B01_Dashboard_Table_Region: ["지역", "Region"], - B01_Dashboard_Table_Progress: ["진행도", "Progress"], - 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_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_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."], - - /* --- 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"], - B02_Proj_RoadType_Main: ["간선임도", "Main road"], - B02_Proj_RoadType_Branch: ["지선임도", "Branch road"], - B02_Proj_RoadType_Fire: ["산불진화임도", "Fire-suppression road"], - B02_Proj_RoadType_Stream: ["계류보전", "Stream conservation"], - 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"], - B03_File_Select_Hint: [ - "계획노선 CSV, LAS/LAZ 1개, PRJ, TFW를 선택하세요. TIF는 선택 사항입니다.", - "Select a planned-route CSV, one LAS/LAZ, PRJ, and TFW. TIF is optional.", - ], - B03_File_Selected_Title: ["선택한 파일", "Selected files"], - B03_File_Selected_Empty: ["선택한 파일이 없습니다.", "No files selected."], - B03_File_Upload_Button: ["파일 업로드", "Upload files"], - 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_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"], - B03_File_Group_Route: ["원청 계획노선 (필수)", "Client Planned Route (Required)"], - B03_File_Group_Terrain: ["지형 분석자료", "Terrain Analysis Files"], - B03_File_Slot_PlannedRoute: ["계획노선 좌표", "Planned Route Coordinates"], - B03_File_Slot_PointCloud: ["포인트클라우드", "Point Cloud"], - B03_File_Slot_Projection: ["좌표계 정의", "Projection"], - B03_File_Slot_RasterCoord: ["래스터 좌표", "Raster Coord 1"], - B03_File_Slot_TerrainDem: ["지형 래스터", "Terrain DEM"], - B03_File_Slot_CadDrawing: ["CAD 도면", "CAD Drawing"], - B03_File_Card_Select: ["파일 선택", "Select file"], - B03_File_Card_Remove: ["파일 제거", "Remove file"], - B03_File_Error_DuplicateSlot: [ - "같은 유형의 파일이 이미 선택되어 있습니다.", - "A file for this slot is already selected.", - ], - B03_File_Error_RequiredSlots: [ - "필수 파일(계획노선 CSV, LAS/LAZ, PRJ, TFW)을 모두 선택하세요.", - "Select all required files: planned-route CSV, LAS/LAZ, 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_ServiceWorker_Ready: [ - "백그라운드 업로드 준비가 완료되었습니다.", - "Background upload is ready.", - ], - B03_File_ServiceWorker_Unavailable: [ - "현재 브라우저에서는 백그라운드 업로드를 사용할 수 없습니다.", - "Background upload is unavailable in this browser.", - ], - - /* --- B04_wf1_Surface 지표면 모델 분석 --- */ - 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_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_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."], - - /* --- B05_wf2_Route 배수유역도 패널 (하단 패널 안쪽 우측) --- */ - B05_Drainage_Title: ["배수유역도", "Drainage Basins"], - B05_Drainage_Layer_Satellite: ["위성사진", "Satellite"], - B05_Drainage_Layer_Satellite_Tip: [ - "배경 위성사진을 보이거나 숨깁니다.", - "Show or hide the satellite basemap.", - ], - B05_Drainage_Layer_Contour: ["등고선", "Contours"], - B05_Drainage_Layer_Stream: ["세류", "Streams"], - B05_Drainage_Layer_Arrows: ["흐름 화살표", "Flow arrows"], - B05_Drainage_Layer_Arrows_Tip: [ - "B04에서 산출한 평균 흐름 방향을 보이거나 숨깁니다.", - "Show or hide the mean flow direction computed in B04.", - ], - B05_Drainage_Layer_Upstream: ["상류 세류", "Upstream streams"], - B05_Drainage_Layer_Upstream_Tip: [ - "유역 안쪽 상류 세류망을 굵게 강조합니다.", - "Emphasize the upstream stream network inside the basin.", - ], - B05_Drainage_Btn_Analyze: ["세부유역 산정", "Compute sub-basins"], - B05_Drainage_Btn_Analyze_Tip: [ - "B04에서 분석해 둔 배수유역을 불러와 관을 보충하고 세부유역을 나눕니다. 분석 결과가 없으면 B04에서 먼저 실행해야 합니다.", - "Loads the drainage analysis from B04, fills in culverts, and splits sub-basins. Run the analysis in B04 first if none exists.", - ], - B05_Drainage_Btn_DeleteSelected: ["선택 삭제", "Delete selected"], - B05_Drainage_Btn_Auto: ["초기화", "Reset"], - B05_Drainage_Btn_Auto_Tip: [ - "손으로 넣거나 옮긴 배관을 버리고 기본 관 + 자동 보충 배치로 되돌립니다.", - "Discards manual culvert edits and restores the automatic placement.", - ], - B05_Drainage_Menu_Add: ["배관 추가", "Add culvert"], - B05_Drainage_Menu_Delete: ["배관 삭제", "Remove culvert"], - B05_Drainage_Layer_Hotspots: ["집중유역", "Inflow hotspots"], - B05_Drainage_Layer_Hotspots_Tip: [ - "노선 위에서 물이 특히 많이 모이는 자리를 마커로 표시합니다. 관을 어디에 둘지 판단하는 근거입니다.", - "Marks the spots along the route that collect the most water — the basis for placing culverts.", - ], - /* {pipes}=관 개수, {basins}=세부유역 수, {source}=종단 Z 출처 */ - B05_Drainage_Summary: [ - "관 {pipes}개 · 세부유역 {basins}개 · 종단 Z {source}", - "{pipes} culverts · {basins} sub-basins · profile Z {source}", - ], - B05_Drainage_Layer_Strength: ["흐름 강도", "Flow strength"], - B05_Drainage_Layer_Strength_Tip: [ - "노선 1m 구간마다 그 자리로 모이는 상류 면적을 색으로 칠합니다(B04 지도와 같은 색띠).", - "Colors each 1m stretch of the route by the upstream area draining into it (same ramp as the B04 map).", - ], - B05_Drainage_ImageAlt: ["배경 위성지도", "Satellite basemap"], - B05_Drainage_Status_NeedRoute: [ - "노선을 확정하면 배수유역도가 표시됩니다.", - "The drainage map appears once the route is confirmed.", - ], - B05_Drainage_Status_Analyzing: ["세부유역을 산정하는 중…", "Computing sub-basins…"], - B05_Drainage_Status_NoBasin: ["산정된 배수유역이 없습니다.", "No drainage basin was computed."], - B05_Drainage_Status_AnalyzeFailed: [ - "세부유역 산정에 실패했습니다.", - "Failed to compute sub-basins.", - ], - B05_Drainage_Status_LoadingBase: ["배경도를 불러오는 중…", "Loading the basemap…"], - B05_Drainage_Status_LoadingSheets: ["도엽 레이어를 불러오는 중…", "Loading map sheet layers…"], - B05_Drainage_Status_NoSheets: [ - "도엽 레이어가 없습니다. B04에서 임포트하세요.", - "No map sheet layer found. Import them in B04.", - ], - B05_Drainage_Status_LoadFailed: ["배경도를 불러오지 못했습니다.", "Failed to load the basemap."], - B05_Drainage_Basin_Undecided: ["미정", "TBD"], - /* {area}=면적, {relief}=표고차, {flow}=유하장, {pipe}=관경 */ - B05_Drainage_Basin_Metrics: [ - "면적 {area} · 표고 {relief}m · 유하 {flow}m · 관경 {pipe}", - "Area {area} · Relief {relief}m · Flow {flow}m · Pipe {pipe}", - ], - /* {chainage}=측점 누가거리(m) */ - B05_Drainage_Basin_Chainage: ["측점 누가거리 {chainage}m", "Station chainage {chainage}m"], - - /* --- B05_wf2_Route 경로 설계 --- */ - B05_Route_Title: ["종단설계", "Profile Design"], - B05_Route_Group_Points: ["경로 제어점", "Route Control Points"], - B05_Route_Point_BP: ["시점 (BP)", "Begin (BP)"], - B05_Route_Point_EP: ["종점 (EP)", "End (EP)"], - B05_Route_Point_CP: ["경유점 (CP)", "Control Points (CP)"], - B05_Route_Field_X: ["X 좌표", "X"], - B05_Route_Field_Y: ["Y 좌표", "Y"], - B05_Route_Btn_AddCp: ["경유점 추가", "Add control point"], - B05_Route_Btn_RemoveCp: ["삭제", "Remove"], - B05_Route_Group_Surface: ["기반 지표면", "Base Surface"], - B05_Route_Field_Filter: ["지면 필터", "Ground filter"], - B05_Route_Field_Method: ["지표면 표현", "Surface method"], - B05_Route_Field_SurfaceId: ["지표면 모델 ID", "Surface model ID"], - B05_Route_Surface_Confirmed: ["확정 모델 #{id} · {method}", "Confirmed model #{id} · {method}"], - B05_Route_Surface_NotConfirmed: [ - "WF1에서 지표면 모델을 확정하세요.", - "Confirm a surface model in WF1.", - ], - B05_Route_Surface_LoadFailed: [ - "확정 지표면 모델을 불러오지 못했습니다.", - "Failed to load the confirmed surface model.", - ], - B05_Route_Group_Constraints: ["설계 제약", "Design Constraints"], - B05_Route_Field_GradeClass: ["임도 등급", "Road grade class"], - B05_Route_Field_Algorithm: ["경로 알고리즘", "Route algorithm"], - B05_Route_Field_MaxUphill: ["최대 상향 경사(%)", "Max uphill grade (%)"], - B05_Route_Field_MaxDownhill: ["최대 하향 경사(%)", "Max downhill grade (%)"], - B05_Route_Field_MinRadius: ["최소 곡선반경(m)", "Min curve radius (m)"], - B05_Route_Field_Smooth: ["경로 스무딩", "Smooth route"], - B05_Route_Btn_Solve: ["경로 탐색 실행", "Solve Route"], - B05_Route_Btn_Confirm: ["경로 확정", "Confirm Route"], - B05_Route_Result_Title: ["경로 탐색 결과", "Route Result"], - B05_Route_Result_Empty: ["아직 계산된 경로가 없습니다.", "No route computed yet."], - B05_Route_Result_Length: ["총 연장(m)", "Total length (m)"], - B05_Route_Result_MinSlope: ["최소 경사", "Min slope"], - B05_Route_Result_MaxSlope: ["최대 경사", "Max slope"], - B05_Route_Result_MeanSlope: ["평균 경사", "Mean slope"], - B05_Route_Result_Cost: ["비용 점수", "Cost score"], - B05_Route_Result_Path: ["경로 파일", "Route file"], - B05_Route_Error_Project: ["먼저 프로젝트를 선택하세요.", "Select a project first."], - B05_Route_Error_Points: [ - "시점과 종점 좌표를 모두 입력하세요.", - "Enter both begin and end coordinates.", - ], - B05_Route_Error_Filter: ["지면 필터 키를 입력하세요.", "Enter a ground filter key."], - B05_Route_Solve_Success: ["경로 탐색을 완료했습니다.", "Route solved."], - B05_Route_Solve_Failed: ["경로 탐색에 실패했습니다.", "Route solve failed."], - B05_Route_Confirm_Success: ["경로를 확정했습니다.", "Route confirmed."], - B05_Route_Confirm_Failed: ["경로 확정에 실패했습니다.", "Route confirm failed."], - B05_Route_Group_SectionOptions: ["측점 및 샘플링 설정", "Station & Sampling Settings"], - B05_Route_Field_StationInterval: ["측점 간격(m)", "Station interval (m)"], - B05_Route_Field_CrossHalfWidth: ["횡단 반폭(m)", "Cross half-width (m)"], - B05_Route_Field_CrossSample: ["횡단 샘플 간격(m)", "Cross sample interval (m)"], - B05_Route_Field_LongSample: ["종단 샘플 간격(m)", "Long sample interval (m)"], - B05_Route_Field_StationLines: ["측점 가로선", "Station cross lines"], - - /* --- B06_wf3_ProfileCross 종·횡단 생성 --- */ - B06_Profile_Title: ["횡단설계", "Cross Design"], - B06_Profile_Group_Route: ["대상 경로", "Target Route"], - B06_Profile_Field_RouteId: ["경로 ID (routes.id)", "Route ID"], - B06_Profile_Field_Filter: ["지면 필터", "Ground filter"], - B06_Profile_Field_Method: ["지표면 표현", "Surface method"], - B06_Profile_Field_Crs: ["좌표계", "CRS"], - B06_Profile_Group_Display: ["표시 옵션", "Display Options"], - B06_Profile_Field_VerticalExaggeration: ["높이 배율", "Vertical exaggeration"], - B06_Profile_Field_Smooth: ["지표면 스무딩", "Smooth surface"], - B06_Profile_Smooth_On: ["사용", "On"], - B06_Profile_Smooth_Off: ["미사용", "Off"], - B06_Profile_Btn_Confirm: ["종·횡단 확정", "Confirm Sections"], - B06_Profile_Result_Title: ["종·횡단 생성 결과", "Section Result"], - B06_Profile_Context_Failed: [ - "경로 정보를 불러오지 못했습니다. 서버 상태를 확인하세요.", - "Failed to load route context. Check the server status.", - ], - B06_Profile_Calculate_In_B05: [ - "저장된 종·횡단이 없습니다. B05에서 경로를 계산하세요.", - "No saved sections. Calculate the route in B05.", - ], - B06_Profile_Result_Length: ["종단 연장(m)", "Longitudinal length (m)"], - B06_Profile_Result_CrossCount: ["횡단 개수", "Cross-section count"], - B06_Profile_Result_Path: ["종단 파일", "Longitudinal file"], - B06_Profile_Error_Project: ["먼저 프로젝트를 선택하세요.", "Select a project first."], - B06_Profile_Confirm_Success: ["종·횡단을 확정했습니다.", "Sections confirmed."], - B06_Profile_Confirm_Failed: ["종·횡단 확정에 실패했습니다.", "Section confirm failed."], - B06_Profile_Detail_Failed: [ - "종·횡단 도면 데이터를 불러오지 못했습니다.", - "Failed to load section drawing data.", - ], - B06_Profile_Regenerate_Failed: [ - "횡단 반폭 재생성에 실패했습니다.", - "Failed to regenerate sections with the new half-width.", - ], - B06_Profile_Regenerate_Success: [ - "횡단 반폭을 반영해 종·횡단을 재생성했습니다.", - "Sections regenerated with the new half-width.", - ], - B06_Profile_Btn_Recalc: ["재계산", "Recalculate"], - B06_Profile_View_Longitudinal: ["종단면도", "Longitudinal profile"], - B06_Profile_View_Cross: ["횡단면도", "Cross sections"], - B06_Profile_View_StationCount: ["횡단 측점", "Cross stations"], - B06_Profile_View_CrossCountSuffix: ["개 도면", " drawings"], - B06_Profile_View_LongitudinalXAxis: [ - "BP 기준 누적거리 (횡단 측점)", - "Chainage from BP (cross stations)", - ], - B06_Profile_View_CrossXAxis: ["중심선 기준 편거리 (m)", "Offset from centerline (m)"], - B06_Profile_View_ElevationAxis: ["지반고 (m)", "Elevation (m)"], - B06_Profile_View_CenterElevation: ["중심고", "Center elevation"], - B06_Profile_View_Azimuth: ["방위각", "Azimuth"], - B06_Profile_Zoom_In: ["확대", "Zoom in"], - B06_Profile_Zoom_Out: ["축소", "Zoom out"], - B06_Profile_Zoom_Reset: ["원래 크기", "Reset zoom"], - B06_Profile_View_Kind_BP: ["BP", "BP"], - B06_Profile_View_Kind_EP: ["EP", "EP"], - B06_Profile_View_Kind_Station: ["일반 측점", "Station"], - B06_Profile_View_NoLongitudinal: [ - "표시할 종단면 데이터가 없습니다.", - "No longitudinal profile data to display.", - ], - B06_Profile_View_NoCross: [ - "표시할 횡단면 데이터가 없습니다.", - "No cross-section data to display.", - ], - - /* --- B06 측점 표준횡단 설계 지정 --- */ - B06_Design_Ground_Legend: ["지반유형", "Ground type"], - B06_Design_Ground_Soil: ["토사", "Soil"], - B06_Design_Ground_Ripping: ["리핑암", "Ripping rock"], - B06_Design_Ground_Blasting: ["발파암", "Blasting rock"], - B06_Design_Mode_Legend: ["단면유형", "Section type"], - B06_Design_Mode_LeftCut: ["편측 성토", "One-side fill"], - B06_Design_Mode_RightCut: ["편측 성토", "One-side fill"], - B06_Design_Mode_BothCut: ["양측 절토", "Both cut"], - B06_Design_Mode_BothFill: ["양측 성토", "Both fill"], - B06_Design_Ditch_Legend: ["측구위치", "Ditch side"], - B06_Design_Ditch_Left: ["좌", "Left"], - B06_Design_Ditch_Right: ["우", "Right"], - B06_Design_Cut_Area: ["절토", "Cut"], - B06_Design_Fill_Area: ["성토", "Fill"], - B06_Design_Unset: ["미지정", "Not set"], - B06_Design_DitchType_Legend: ["측구형식", "Ditch type"], - B06_Design_DitchType_Standard: ["일반", "Standard"], - B06_Design_DitchType_LType: ["L형", "L-type"], - B06_Design_Paved_Legend: ["포장", "Pavement"], - B06_Design_Paved_On: ["포장", "Paved"], - B06_Design_Paved_Off: ["비포장", "Unpaved"], - B06_Design_TwoStage_Legend: ["2단계 경사", "Two-stage slope"], - B06_Design_TwoStage_On: ["복합경사", "Compound slope"], - B06_Design_TwoStage_Off: ["단경사", "Single slope"], - B06_Design_Ditch_Legend2: ["측구", "Ditch"], - B06_Design_Ditch_On: ["측구", "Ditch"], - B06_Design_Ditch_Off: ["측구", "Ditch"], - B06_Design_Disabled_BothCutOnly: [ - "양측 절토·양측 성토 단면에서만 경사 방향을 바꿀 수 있습니다.", - "Slope direction is adjustable only for both-cut and both-fill sections.", - ], - B06_Design_More: ["더보기", "More"], - B06_Design_SlopeDir_Left: ["좌", "Left"], - B06_Design_SlopeDir_Right: ["우", "Right"], - B06_Design_Disabled_RockCut: [ - "암(리핑/발파) 지반의 절토 단면에서만 사용할 수 있습니다.", - "Available only for rock ground with a cut section.", - ], - B06_Design_Disabled_NoDitch: [ - "측구가 있는 단면(양성 제외)에서만 사용할 수 있습니다.", - "Available only for sections with a ditch (not both-fill).", - ], - B06_Design_Disabled_NoDitchType: [ - "측구를 생성한 경우에만 형식을 선택할 수 있습니다.", - "Available only when a ditch is created.", - ], - B06_Design_Paved_Suggested: [ - "종단경사 법정 상한 초과 — 포장 권장 (임도설치 및 관리 등에 관한 규정 별표 1-2)", - "Grade exceeds legal limit — pavement recommended (Forest Road Regulation, Annex 1-2)", - ], - B06_Design_RockBoundary_Legend: ["암 경계", "Rock boundary"], - B06_Design_RockBoundary_Up: ["암 경계선 올림", "Raise rock boundary"], - B06_Design_RockBoundary_Down: ["암 경계선 내림", "Lower rock boundary"], - B06_Design_RockBoundary_Reset: ["암 경계선 기본값 복원", "Reset rock boundary"], - B06_Design_Failed: ["횡단 설계 계산에 실패했습니다.", "Failed to compute cross-section design."], - B06_Profile_Confirm_NeedDesign: [ - "지반유형이 지정되지 않은 측점이 있습니다.", - "Some stations have no ground type assigned.", - ], - - /* --- B06 표준 횡단면 설정 패널 --- */ - B06_Std_Title: ["표준 횡단면 설정", "Standard cross-section"], - B06_Std_Group_Soil: ["토사 구간", "Soil section"], - B06_Std_Group_Rock: ["암 구간 (리핑/발파)", "Rock section (ripping/blasting)"], - B06_Std_Group_Paved: ["포장 구간", "Paved section"], - B06_Std_Field_RoadWidth: ["노폭(m)", "Road width (m)"], - B06_Std_Field_ShoulderLeft: ["노견 좌(m)", "Shoulder L (m)"], - B06_Std_Field_ShoulderRight: ["노견 우(m)", "Shoulder R (m)"], - B06_Std_Field_DitchTop: ["측구 상단폭(m)", "Ditch top (m)"], - B06_Std_Field_DitchBottom: ["측구 저폭(m)", "Ditch bottom (m)"], - B06_Std_Field_DitchDepth: ["측구 깊이(m)", "Ditch depth (m)"], - B06_Std_Field_LDitchWidth: ["L형 측구 폭(m)", "L-ditch width (m)"], - B06_Std_Field_LDitchDepth: ["L형 측구 깊이(m)", "L-ditch depth (m)"], - B06_Std_Field_CrossSlopeMin: ["횡단경사 최소(%)", "Cross slope min (%)"], - B06_Std_Field_CrossSlopeMax: ["횡단경사 최대(%)", "Cross slope max (%)"], - B06_Std_Field_CutSlope: ["절토경사(1:n)", "Cut slope (1:n)"], - B06_Std_Field_FillSlope: ["성토경사(1:n)", "Fill slope (1:n)"], - B06_Std_LType_Note: [ - "L형 측구는 각 횡단면도에서 선택합니다.", - "L-type ditch is chosen per cross-section drawing.", - ], - B06_Std_Reset: ["기본값 복원", "Restore defaults"], - B06_Std_ApplyAll: ["전체 측점 반영", "Apply to all stations"], - B06_Std_ApplyAll_Success: [ - "패널 설정을 전체 측점에 반영했습니다.", - "Applied panel settings to all stations.", - ], - B06_Std_Load_Title: ["다른 프로젝트에서 불러오기", "Load from another project"], - B06_Std_Load_Select: ["프로젝트 선택", "Select project"], - B06_Std_Load_Placeholder: ["— 프로젝트 선택 —", "— Select a project —"], - B06_Std_Load_Empty: [ - "같은 회사에 불러올 설계값이 없습니다.", - "No saved designs in your company.", - ], - B06_Std_Load_Loading: ["불러오는 중…", "Loading…"], - B06_Std_Load_Apply: ["현재 설정에 적용", "Apply to current settings"], - B06_Std_Load_Applied: ["적용되었습니다.", "Applied."], - B06_Std_Load_Failed: ["설계값을 불러오지 못했습니다.", "Failed to load design values."], - B06_Std_Load_None: [ - "선택한 프로젝트에 저장된 설계값이 없습니다.", - "The selected project has no saved design values.", - ], - B06_Std_Diagram_Title: ["변수 위치 안내", "Variable position guide"], - B06_Std_Diagram_Toggle: ["단면 그림 보기/숨기기", "Show/hide section guide"], - B06_Std_Diagram_Road: ["노폭", "Road"], - B06_Std_Diagram_ShoulderL: ["노견 좌", "Shoulder L"], - B06_Std_Diagram_ShoulderR: ["노견 우", "Shoulder R"], - B06_Std_Diagram_Ditch: ["측구", "Ditch"], - B06_Std_Diagram_Cut: ["절토경사", "Cut slope"], - B06_Std_Diagram_Fill: ["성토경사", "Fill slope"], - B06_Std_Diagram_CrossSlope: ["횡단경사", "Cross slope"], - B06_Std_Diagram_Center: ["중심선(계획고)", "Centerline (design elev.)"], - B06_Std_Diagram_Caption: [ - "표준 편절편성 단면 모식도 — 각 설정값의 위치를 나타냅니다(실제 비율 아님).", - "Standard cut-fill section schematic — shows where each value applies (not to scale).", - ], - - /* --- B07_wf4_DesignDetail 상세 설계 --- */ - B07_Design_Title: ["상세설계", "Detail Design"], - B07_Cad_Side_Pending: [ - "사이드 패널은 전달 데이터 확정 후 구성됩니다.", - "Side panel will be configured after the upstream data spec is finalized.", - ], - B07_Cad_Loading: ["도면을 불러오는 중...", "Loading drawing..."], - B07_Cad_Load_Failed: ["도면을 불러오지 못했습니다.", "Failed to load drawing."], - B07_Info_Ground_Title: ["지반정보", "Ground info"], - B07_Info_Plan_Title: ["계획정보", "Plan info"], - B07_Info_GroundType: ["지반유형", "Ground type"], - B07_Info_CutSide: ["절토측", "Cut side"], - B07_Info_DitchSide: ["측구위치", "Ditch side"], - B07_Info_DesignElevation: ["계획고", "Design elevation"], - B07_Info_CutSlope: ["절토경사", "Cut slope"], - B07_Info_FillSlope: ["성토경사", "Fill slope"], - B07_Info_RoadWidth: ["노면폭", "Road width"], - B07_Info_Ditch: ["측구규격", "Ditch spec"], - B07_Info_CutArea: ["절토 단면적", "Cut area"], - B07_Info_FillArea: ["성토 단면적", "Fill area"], - B07_Info_Provisional: ["잠정", "Provisional"], - B07_Info_Confirmed: ["확정", "Confirmed"], - B07_Info_NoDesign: ["지반·계획 지정 데이터가 없습니다.", "No ground/plan designation data."], - B07_Info_Station: ["측점", "Station"], - - /* --- B08_wf5_Quantity 수량 산출 --- */ - B08_Quantity_Title: ["수량산출", "Quantity"], - - /* --- B09_wf6_Estimation 견적·문서 --- */ - B09_Estimation_Title: ["설계도서", "Design Docs"], - - /* --- B10_Payment 결재 --- */ - B10_Payment_Title: ["결재", "Payment"], - B10_Payment_Subtitle: [ - "세금계산서 발행과 계좌 입금 절차를 확인하세요.", - "Review the tax invoice and bank transfer process.", - ], - B10_Payment_Invoice_Title: ["세금계산서 발행 요청", "Tax Invoice Request"], - B10_Payment_Invoice_Description: [ - "사업자 정보와 발행 금액은 견적 확정 후 연결됩니다.", - "Business details and the invoice amount will be linked after the estimate is finalized.", - ], - B10_Payment_Invoice_Request: ["발행 요청", "Request Invoice"], - B10_Payment_Invoice_Status: ["요청 전", "Not Requested"], - B10_Payment_Deposit_Title: ["계좌 입금 안내", "Bank Transfer Guide"], - B10_Payment_Deposit_Account: ["입금 계좌", "Deposit Account"], - B10_Payment_Deposit_Amount: ["입금 금액", "Deposit Amount"], - B10_Payment_Deposit_Pending: ["견적 확정 후 표시", "Shown after estimate confirmation"], - B10_Payment_Deposit_Note: [ - "입금 확인 후 설계문서와 DWG 다운로드가 허용됩니다.", - "Design documents and DWG downloads are enabled after the deposit is confirmed.", - ], - - /* --- B11_Status 상태 출력 --- */ - B11_Status_Title: ["처리 상태", "Status"], - B11_Status_Subtitle: [ - "결재·문서 생성 상태를 확인하고 결과물을 내려받으세요.", - "Check payment and document status, and download results.", - ], - // 자료 준비 화면 (대시보드 → 작업 화면 진입 시 3D·등고선 선적재) - B11_Loading_Title: ["자료 준비 중", "Preparing data"], - B11_Loading_Subtitle: ["잠시만 기다려 주세요.", "This will take a moment."], - B11_Loading_Message: [ - "작업 화면에서 바로 쓸 수 있도록 3D 지표면과 등고선을 준비합니다.", - "Loading the 3D surface and contours so the workspace opens instantly.", - ], - B11_Loading_Start: ["자료를 준비하는 중…", "Preparing data…"], - B11_Loading_NoProject: [ - "프로젝트가 선택되지 않았습니다. 대시보드에서 프로젝트를 먼저 고르세요.", - "No project selected. Choose a project on the dashboard first.", - ], - B11_Loading_Failed: [ - "자료를 준비하지 못했습니다. 분석 결과나 저장 경로에 문제가 있을 수 있습니다. 담당자에게 연락해 주세요.", - "Could not prepare the data. The analysis result or storage path may be broken. Please contact support.", - ], - B11_Loading_Btn_Continue: ["그래도 화면으로 이동", "Continue anyway"], - B11_Loading_Btn_Dashboard: ["대시보드로", "Back to dashboard"], - B11_Status_Flow_Title: ["결재 진행 상태", "Payment Progress"], - B11_Status_Step_Request: ["발행 요청", "Invoice Requested"], - B11_Status_Step_Issue: ["세금계산서 발행", "Invoice Issued"], - B11_Status_Step_Deposit: ["입금 확인", "Deposit Confirmed"], - B11_Status_Step_Complete: ["완료", "Complete"], - B11_Status_NotStarted: ["시작 전", "Not Started"], - B11_Status_Download_Title: ["결과물 다운로드", "Result Downloads"], - B11_Status_Download_Description: [ - "입금 확인이 완료되면 설계문서와 DWG 다운로드가 활성화됩니다.", - "Design document and DWG downloads are enabled after deposit confirmation.", - ], - - // 프로젝트 관리 - 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.", - ], - 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.", - ], -} as const satisfies Record; + ...ui_locales_common, + ...ui_locales_a, + ...ui_locales_b1, + ...ui_locales_b2, +} as const; export type LocaleKey = keyof typeof ui_locales; diff --git a/ui_template/ui_template_locale_a.ts b/ui_template/ui_template_locale_a.ts new file mode 100644 index 00000000..f1452096 --- /dev/null +++ b/ui_template/ui_template_locale_a.ts @@ -0,0 +1,277 @@ +/* ============================================================================= + * ui_template_locale_a.ts + * 다국어 사전 — A 그룹 (로그인 전 페이지 A01~A09) + * + * 이 파일은 사전 데이터만 담는다. 합성·언어 전환·t() 헬퍼는 ui_template_locale.ts 참조. + * ========================================================================== */ + +import type { LocaleEntry } from "./ui_template_locale_common"; + +export const ui_locales_a = { + /* --------------------------------------------------------------------------- + * 페이지 타이틀 (신규 문구는 아래에 계속 추가) + * ------------------------------------------------------------------------ */ + A01_Home_Title: ["임도 설계 및 견적 자동화", "Forest Road Design & Estimation"], + A06_Login_Title: ["로그인", "Login"], + A07_Register_Title: ["회원가입", "Sign up"], + + /* --- A01_Home 상세 --- */ + /* 단계를 늘어놓는 문구는 진행단계 이름(WF_Step_*)과 같은 말을 쓴다(2026-08-01 사용자 지시). */ + A01_Home_Hero_Subtitle: [ + "LAS 지형 데이터부터 종단설계·횡단설계, 수량산출, 설계도서까지 한 번에.", + "From LAS terrain data to profile and cross design, quantities, and design documents — all in one.", + ], + A01_Home_Hero_CtaPrimary: ["지금 시작하기", "Get Started"], + A01_Home_Hero_CtaSecondary: ["프로그램 살펴보기", "Explore Features"], + A01_Home_News_SectionTitle: ["최신 소식", "Latest News"], + A01_Home_News_Tag: ["공지", "Notice"], + A01_Home_Features_SectionTitle: ["주요 기능", "Key Features"], + A01_Home_Feature1_Title: ["3D 지형 분석", "3D Terrain Analysis"], + A01_Home_Feature1_Desc: [ + "LAS 포인트클라우드를 브라우저에서 3D 메쉬로 시각화합니다.", + "Visualize LAS point clouds as 3D meshes in the browser.", + ], + A01_Home_Feature2_Title: ["최적 경로 설계", "Optimal Route Design"], + A01_Home_Feature2_Desc: [ + "경사도와 제약조건을 반영한 최적 임도 경로를 계산합니다.", + "Compute optimal forest road routes with slope and constraints.", + ], + A01_Home_Feature3_Title: ["견적 자동화", "Automated Estimation"], + A01_Home_Feature3_Desc: [ + "수량 산출과 견적서를 Excel / PDF로 자동 생성합니다.", + "Auto-generate quantity takeoffs and estimates as Excel / PDF.", + ], + + /* --- A02_ProgDetail 프로그램 상세 --- */ + A02_ProgDetail_Title: ["프로그램 상세 안내", "Program Overview"], + A02_ProgDetail_Hero_Subtitle: [ + "LAS 스캔 데이터 한 벌로 임도 설계 전 과정을 자동화하는 6단계 워크플로우.", + "A 6-stage workflow that automates the entire forest road design process from a single LAS scan.", + ], + A02_ProgDetail_Hero_Cta: ["무료로 시작하기", "Start for Free"], + + A02_ProgDetail_Workflow_SectionTitle: ["6단계 설계 워크플로우", "6-Stage Design Workflow"], + /* 단계 이름은 진행단계 오버레이(WF_Step_*)와 같은 말을 쓴다 — 소개 페이지와 실제 화면의 + 단계 이름이 다르면 사용자가 같은 단계인지 알 수 없다(2026-08-01 사용자 지시). */ + A02_ProgDetail_Step1_Title: ["1. 전처리", "1. Preprocess"], + A02_ProgDetail_Step1_Desc: [ + "LAS 포인트클라우드에서 지면점을 필터링하고 15종 지표면 모델을 생성합니다.", + "Filter ground points from the LAS point cloud and generate 15 surface models.", + ], + A02_ProgDetail_Step2_Title: ["2. 종단설계", "2. Profile Design"], + A02_ProgDetail_Step2_Desc: [ + "경사·곡선반경·회피구역을 반영해 최적 임도 노선을 자동 탐색합니다.", + "Auto-search optimal routes reflecting grade, curve radius, and avoidance zones.", + ], + A02_ProgDetail_Step3_Title: ["3. 횡단설계", "3. Cross Design"], + A02_ProgDetail_Step3_Desc: [ + "확정 노선을 따라 종단면과 횡단면을 자동 추출합니다.", + "Automatically extract longitudinal and cross sections along the confirmed route.", + ], + A02_ProgDetail_Step4_Title: ["4. 상세설계", "4. Detail Design"], + A02_ProgDetail_Step4_Desc: [ + "구조물, 배수, 절·성토 등 세부 설계 요소를 편집합니다.", + "Edit detailed design elements such as structures, drainage, and cut/fill.", + ], + A02_ProgDetail_Step5_Title: ["5. 수량산출", "5. Quantity"], + A02_ProgDetail_Step5_Desc: [ + "토공량과 구조물 수량을 자동 계산합니다.", + "Automatically calculate earthwork volumes and structure quantities.", + ], + A02_ProgDetail_Step6_Title: ["6. 설계도서", "6. Design Docs"], + A02_ProgDetail_Step6_Desc: [ + "견적서와 설계도서를 Excel / DWG / PDF로 출력합니다.", + "Export estimates and design documents as Excel / DWG / PDF.", + ], + + A02_ProgDetail_Tech_SectionTitle: ["핵심 기술", "Core Technology"], + A02_ProgDetail_Tech1_Title: ["브라우저 3D 엔진", "Browser 3D Engine"], + A02_ProgDetail_Tech1_Desc: [ + "설치 없이 웹 브라우저에서 대용량 지형을 실시간 렌더링합니다.", + "Render large terrains in real time in the browser with no installation.", + ], + A02_ProgDetail_Tech2_Title: ["공간 분석 엔진", "Spatial Analysis Engine"], + A02_ProgDetail_Tech2_Desc: [ + "PostGIS 기반 공간 연산으로 정밀한 지형·경로 분석을 수행합니다.", + "Perform precise terrain and route analysis with PostGIS spatial operations.", + ], + A02_ProgDetail_Tech3_Title: ["단계별 결과 저장", "Stage-based Persistence"], + A02_ProgDetail_Tech3_Desc: [ + "각 단계 계산 결과를 영구 저장해 언제든 이어서 작업할 수 있습니다.", + "Persist each stage's results so you can resume work anytime.", + ], + + /* --- A03_CompDetail 회사 상세 --- */ + A03_CompDetail_Title: ["회사 소개", "About Us"], + A03_CompDetail_Hero_Subtitle: [ + "임업 엔지니어링과 공간정보 기술로 산림 인프라의 미래를 설계합니다.", + "Designing the future of forest infrastructure with forestry engineering and geospatial technology.", + ], + A03_CompDetail_Mission_SectionTitle: ["미션", "Our Mission"], + A03_CompDetail_Mission_Body: [ + "복잡하고 반복적인 임도 설계 과정을 자동화하여, 설계자가 판단과 창의에 집중할 수 있도록 돕습니다.", + "We automate the complex, repetitive forest road design process so engineers can focus on judgment and creativity.", + ], + A03_CompDetail_Value_SectionTitle: ["핵심 가치", "Core Values"], + A03_CompDetail_Value1_Title: ["정밀함", "Precision"], + A03_CompDetail_Value1_Desc: [ + "실측 데이터에 기반한 신뢰할 수 있는 설계 결과를 추구합니다.", + "We pursue reliable design results grounded in measured data.", + ], + A03_CompDetail_Value2_Title: ["효율", "Efficiency"], + A03_CompDetail_Value2_Desc: [ + "수작업 시간을 획기적으로 줄여 설계 생산성을 높입니다.", + "We dramatically cut manual work to boost design productivity.", + ], + A03_CompDetail_Value3_Title: ["지속가능성", "Sustainability"], + A03_CompDetail_Value3_Desc: [ + "환경 영향을 최소화하는 친환경 노선 설계를 지향합니다.", + "We aim for eco-friendly route designs that minimize environmental impact.", + ], + A03_CompDetail_Contact_SectionTitle: ["연락처", "Contact"], + A03_CompDetail_Contact_Email: ["이메일: contact@forestroad.kr", "Email: contact@forestroad.kr"], + + /* --- A04_NewsHistory 최신소식 및 개선 이력 --- */ + A04_NewsHistory_Title: ["최신 소식 & 개선 이력", "News & Changelog"], + A04_NewsHistory_Hero_Subtitle: [ + "제품 업데이트와 개선 사항을 시간순으로 확인하세요.", + "Track product updates and improvements in chronological order.", + ], + A04_NewsHistory_Tag_Feature: ["기능", "Feature"], + A04_NewsHistory_Tag_Fix: ["개선", "Fix"], + A04_NewsHistory_Tag_Notice: ["공지", "Notice"], + A04_NewsHistory_Empty: ["등록된 소식이 없습니다.", "No news available."], + + /* --- A05_EduDetail 교육 상세 --- */ + A05_EduDetail_Title: ["교육 안내", "Training & Education"], + A05_EduDetail_Hero_Subtitle: [ + "프로그램을 처음 접하는 분도 빠르게 익힐 수 있는 단계별 교육 과정.", + "Step-by-step courses that help newcomers get up to speed quickly.", + ], + A05_EduDetail_Course_SectionTitle: ["교육 과정", "Courses"], + A05_EduDetail_Course1_Title: ["기초 과정", "Beginner Course"], + A05_EduDetail_Course1_Desc: [ + "데이터 업로드부터 첫 지표면 분석까지 기본 흐름을 익힙니다.", + "Learn the basic flow from data upload to your first surface analysis.", + ], + A05_EduDetail_Course2_Title: ["실무 과정", "Practical Course"], + A05_EduDetail_Course2_Desc: [ + "실제 프로젝트로 경로 설계와 종횡단 생성을 실습합니다.", + "Practice route design and cross-section generation with real projects.", + ], + A05_EduDetail_Course3_Title: ["심화 과정", "Advanced Course"], + A05_EduDetail_Course3_Desc: [ + "수량 산출과 견적 자동화, 문서 출력까지 완성합니다.", + "Master quantity takeoff, estimation automation, and document export.", + ], + A05_EduDetail_Cta: ["교육 문의하기", "Request Training"], + + /* --- A06_Login 로그인 --- */ + A06_Login_Subtitle: ["계정에 로그인하세요.", "Sign in to your account."], + A06_Login_Field_Email: ["이메일", "Email"], + A06_Login_Field_Email_Placeholder: ["이메일을 입력하세요", "Enter your email"], + A06_Login_Field_Password: ["비밀번호", "Password"], + A06_Login_Field_Password_Placeholder: ["비밀번호를 입력하세요", "Enter your password"], + A06_Login_Submit: ["로그인", "Sign in"], + A06_Login_ToRegister: ["계정이 없으신가요? 회원가입", "No account? Sign up"], + A06_Login_Error_Required: [ + "이메일과 비밀번호를 모두 입력하세요.", + "Please enter both email and password.", + ], + A06_Login_Error_Email: ["이메일 형식이 올바르지 않습니다.", "Invalid email format."], + A06_Login_Field_Otp: ["이메일 인증 코드", "Email verification code"], + A06_Login_Field_Otp_Placeholder: ["6자리 코드를 입력하세요", "Enter the 6-digit code"], + A06_Login_Verify: ["인증하고 로그인", "Verify and sign in"], + A06_Login_OtpSent: ["인증 코드를 이메일로 발송했습니다.", "A verification code was emailed."], + A06_Login_OtpResend: ["인증 코드 재발송", "Resend verification code"], + A06_Login_OtpResendCountdown: ["{seconds}초 후 재발송", "Resend in {seconds}s"], + A06_Login_OtpBack: ["이메일/비밀번호 다시 입력", "Re-enter email/password"], + A06_Login_Success: ["로그인되었습니다.", "Signed in."], + A06_Login_Error_Request: ["로그인 요청에 실패했습니다.", "Sign-in request failed."], + + /* --- A07_Register 회원가입 --- */ + A07_Register_Subtitle: ["새 계정을 만드세요.", "Create a new account."], + A07_Register_Field_Company: ["회사명", "Company"], + A07_Register_Field_Company_Placeholder: ["회사명을 입력하세요", "Enter your company"], + A07_Register_Field_Name: ["이름", "Name"], + A07_Register_Field_Name_Placeholder: ["이름을 입력하세요", "Enter your name"], + A07_Register_Field_Email: ["이메일", "Email"], + A07_Register_Field_Email_Placeholder: ["이메일을 입력하세요", "Enter your email"], + A07_Register_Field_Password: ["비밀번호", "Password"], + A07_Register_Field_Password_Placeholder: ["8자 이상 입력하세요", "At least 8 characters"], + A07_Register_Field_PasswordConfirm: ["비밀번호 확인", "Confirm password"], + A07_Register_Field_PasswordConfirm_Placeholder: [ + "비밀번호를 다시 입력하세요", + "Re-enter password", + ], + A07_Register_Field_Position: ["직급", "Position"], + A07_Register_Field_Position_Placeholder: ["예) 과장, 대리, 사원", "e.g., Manager, Deputy, Staff"], + A07_Register_Field_Phone: ["전화번호", "Phone number"], + A07_Register_Field_Phone_Placeholder: ["010-1234-5678", "010-1234-5678"], + A07_Register_Submit: ["회원가입", "Sign up"], + A07_Register_ToLogin: ["이미 계정이 있으신가요? 로그인", "Already have an account? Sign in"], + A07_Register_Error_Required: [ + "모든 필수 항목을 입력하세요.", + "Please fill in all required fields.", + ], + A07_Register_Error_Email: ["이메일 형식이 올바르지 않습니다.", "Invalid email format."], + A07_Register_Error_Password: [ + "비밀번호는 8자 이상이어야 합니다.", + "Password must be at least 8 characters.", + ], + A07_Register_Error_PasswordMismatch: [ + "비밀번호와 확인 비밀번호가 일치하지 않습니다.", + "Passwords do not match.", + ], + A07_Register_Field_AccountType: ["가입 유형", "Account type"], + A07_Register_Type_Master: ["새 회사 등록", "Register a new company"], + A07_Register_Type_Member: ["기존 회사 참여", "Join an existing company"], + A07_Register_Field_CompanyId: ["회사 번호", "Company ID"], + A07_Register_Field_CompanyId_Placeholder: ["검색 결과의 회사 번호", "Company ID from search"], + A07_Register_Terms: ["이용약관에 동의합니다.", "I agree to the Terms of Service."], + A07_Register_Privacy: ["개인정보 처리방침에 동의합니다.", "I agree to the Privacy Policy."], + A07_Register_Marketing: [ + "마케팅 정보 수신에 동의합니다. (선택)", + "I agree to marketing messages (optional).", + ], + A07_Register_Field_Otp: ["이메일 인증 코드", "Email verification code"], + A07_Register_Verify: ["이메일 인증 완료", "Complete email verification"], + A07_Register_OtpSent: ["가입 인증 코드를 발송했습니다.", "Registration code sent."], + A07_Register_Success: ["가입 절차가 완료되었습니다.", "Registration completed."], + A07_Register_Error_Terms: ["필수 약관에 동의하세요.", "Agree to the required terms."], + A07_Register_Error_Request: ["회원가입 요청에 실패했습니다.", "Registration request failed."], + + /* --- A08_Support 기술지원 요청 --- */ + A08_Support_Title: ["기술지원 요청", "Technical Support"], + A08_Support_Subtitle: [ + "문제나 문의사항을 남겨 주시면 신속히 답변드리겠습니다.", + "Leave your issue or inquiry and we'll respond promptly.", + ], + A08_Support_Field_Name: ["이름", "Name"], + A08_Support_Field_Name_Placeholder: ["이름을 입력하세요", "Enter your name"], + A08_Support_Field_Email: ["이메일", "Email"], + A08_Support_Field_Email_Placeholder: ["회신 받을 이메일", "Email for reply"], + A08_Support_Field_Phone: ["연락처", "Phone"], + A08_Support_Field_Phone_Placeholder: ["연락 가능한 전화번호 (선택)", "Contact number (optional)"], + A08_Support_Field_Subject: ["제목", "Subject"], + A08_Support_Field_Subject_Placeholder: ["문의 제목", "Inquiry subject"], + A08_Support_Field_Message: ["문의 내용", "Message"], + A08_Support_Field_Message_Placeholder: [ + "문의 내용을 자세히 적어주세요", + "Describe your inquiry in detail", + ], + A08_Support_Submit: ["문의 보내기", "Send Inquiry"], + A08_Support_Success: [ + "문의가 접수되었습니다. 곧 연락드리겠습니다.", + "Your inquiry has been received. We'll be in touch soon.", + ], + A08_Support_Error_Required: ["모든 항목을 입력하세요.", "Please fill in all fields."], + A08_Support_Error_Email: ["이메일 형식이 올바르지 않습니다.", "Invalid email format."], + + /* --- A09_Security 보안 및 약관 --- */ + A09_Security_Title: ["보안 및 약관", "Security and Terms"], + A09_Security_Version: ["약관 버전", "Terms version"], + A09_Security_Terms: ["서비스 이용약관", "Terms of Service"], + A09_Security_Privacy: ["개인정보 처리방침", "Privacy Policy"], + A09_Security_Policy: ["세션 보안정책", "Session Security Policy"], +} as const satisfies Record; diff --git a/ui_template/ui_template_locale_b1.ts b/ui_template/ui_template_locale_b1.ts new file mode 100644 index 00000000..8c42a924 --- /dev/null +++ b/ui_template/ui_template_locale_b1.ts @@ -0,0 +1,441 @@ +/* ============================================================================= + * ui_template_locale_b1.ts + * 다국어 사전 — B 그룹 전반부 (B01_Dashboard ~ B04_wf1_Surface) + * + * 워크플로우 진행 단계 라벨은 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_Dashboard_Profile: ["기본정보", "Profile"], + B01_Dashboard_SaveProfile: ["기본정보 저장", "Save profile"], + B01_Dashboard_Table_Project: ["프로젝트명", "Project"], + B01_Dashboard_Table_Region: ["지역", "Region"], + B01_Dashboard_Table_Progress: ["진행도", "Progress"], + 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_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_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.", + ], + 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"], + B02_Proj_RoadType_Main: ["간선임도", "Main road"], + B02_Proj_RoadType_Branch: ["지선임도", "Branch road"], + B02_Proj_RoadType_Fire: ["산불진화임도", "Fire-suppression road"], + B02_Proj_RoadType_Stream: ["계류보전", "Stream conservation"], + 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"], + B03_File_Select_Hint: [ + "계획노선 CSV, LAS/LAZ 1개, PRJ, TFW를 선택하세요. TIF는 선택 사항입니다.", + "Select a planned-route CSV, one LAS/LAZ, PRJ, and TFW. TIF is optional.", + ], + B03_File_Selected_Title: ["선택한 파일", "Selected files"], + B03_File_Selected_Empty: ["선택한 파일이 없습니다.", "No files selected."], + B03_File_Upload_Button: ["파일 업로드", "Upload files"], + 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_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"], + B03_File_Group_Route: ["원청 계획노선 (필수)", "Client Planned Route (Required)"], + B03_File_Group_Terrain: ["지형 분석자료", "Terrain Analysis Files"], + B03_File_Slot_PlannedRoute: ["계획노선 좌표", "Planned Route Coordinates"], + B03_File_Slot_PointCloud: ["포인트클라우드", "Point Cloud"], + B03_File_Slot_Projection: ["좌표계 정의", "Projection"], + B03_File_Slot_RasterCoord: ["래스터 좌표", "Raster Coord 1"], + B03_File_Slot_TerrainDem: ["지형 래스터", "Terrain DEM"], + B03_File_Slot_CadDrawing: ["CAD 도면", "CAD Drawing"], + B03_File_Card_Select: ["파일 선택", "Select file"], + B03_File_Card_Remove: ["파일 제거", "Remove file"], + B03_File_Error_DuplicateSlot: [ + "같은 유형의 파일이 이미 선택되어 있습니다.", + "A file for this slot is already selected.", + ], + B03_File_Error_RequiredSlots: [ + "필수 파일(계획노선 CSV, LAS/LAZ, PRJ, TFW)을 모두 선택하세요.", + "Select all required files: planned-route CSV, LAS/LAZ, 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_ServiceWorker_Ready: [ + "백그라운드 업로드 준비가 완료되었습니다.", + "Background upload is ready.", + ], + B03_File_ServiceWorker_Unavailable: [ + "현재 브라우저에서는 백그라운드 업로드를 사용할 수 없습니다.", + "Background upload is unavailable in this browser.", + ], + + /* --- B04_wf1_Surface 지표면 모델 분석 --- */ + 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_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_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; diff --git a/ui_template/ui_template_locale_b2.ts b/ui_template/ui_template_locale_b2.ts new file mode 100644 index 00000000..d629646d --- /dev/null +++ b/ui_template/ui_template_locale_b2.ts @@ -0,0 +1,419 @@ +/* ============================================================================= + * ui_template_locale_b2.ts + * 다국어 사전 — B 그룹 후반부 (B05_wf2_Route ~ B11_Status) + * + * 워크플로우 진행 단계 라벨은 ui_template_locale_common.ts 의 WF_Step_* 키를 + * 재사용한다 (중복 등록 방지). + * + * 이 파일은 사전 데이터만 담는다. 합성·언어 전환·t() 헬퍼는 ui_template_locale.ts 참조. + * ========================================================================== */ + +import type { LocaleEntry } from "./ui_template_locale_common"; + +export const ui_locales_b2 = { + /* --- B05_wf2_Route 배수유역도 패널 (하단 패널 안쪽 우측) --- */ + B05_Drainage_Title: ["배수유역도", "Drainage Basins"], + B05_Drainage_Layer_Satellite: ["위성사진", "Satellite"], + B05_Drainage_Layer_Satellite_Tip: [ + "배경 위성사진을 보이거나 숨깁니다.", + "Show or hide the satellite basemap.", + ], + B05_Drainage_Layer_Contour: ["등고선", "Contours"], + B05_Drainage_Layer_Stream: ["세류", "Streams"], + B05_Drainage_Layer_Arrows: ["흐름 화살표", "Flow arrows"], + B05_Drainage_Layer_Arrows_Tip: [ + "B04에서 산출한 평균 흐름 방향을 보이거나 숨깁니다.", + "Show or hide the mean flow direction computed in B04.", + ], + B05_Drainage_Layer_Upstream: ["상류 세류", "Upstream streams"], + B05_Drainage_Layer_Upstream_Tip: [ + "유역 안쪽 상류 세류망을 굵게 강조합니다.", + "Emphasize the upstream stream network inside the basin.", + ], + B05_Drainage_Btn_Analyze: ["세부유역 산정", "Compute sub-basins"], + B05_Drainage_Btn_Analyze_Tip: [ + "B04에서 분석해 둔 배수유역을 불러와 관을 보충하고 세부유역을 나눕니다. 분석 결과가 없으면 B04에서 먼저 실행해야 합니다.", + "Loads the drainage analysis from B04, fills in culverts, and splits sub-basins. Run the analysis in B04 first if none exists.", + ], + B05_Drainage_Btn_DeleteSelected: ["선택 삭제", "Delete selected"], + B05_Drainage_Btn_Auto: ["초기화", "Reset"], + B05_Drainage_Btn_Auto_Tip: [ + "손으로 넣거나 옮긴 배관을 버리고 기본 관 + 자동 보충 배치로 되돌립니다.", + "Discards manual culvert edits and restores the automatic placement.", + ], + B05_Drainage_Menu_Add: ["배관 추가", "Add culvert"], + B05_Drainage_Menu_Delete: ["배관 삭제", "Remove culvert"], + B05_Drainage_Layer_Hotspots: ["집중유역", "Inflow hotspots"], + B05_Drainage_Layer_Hotspots_Tip: [ + "노선 위에서 물이 특히 많이 모이는 자리를 마커로 표시합니다. 관을 어디에 둘지 판단하는 근거입니다.", + "Marks the spots along the route that collect the most water — the basis for placing culverts.", + ], + /* {pipes}=관 개수, {basins}=세부유역 수, {source}=종단 Z 출처 */ + B05_Drainage_Summary: [ + "관 {pipes}개 · 세부유역 {basins}개 · 종단 Z {source}", + "{pipes} culverts · {basins} sub-basins · profile Z {source}", + ], + B05_Drainage_Layer_Strength: ["흐름 강도", "Flow strength"], + B05_Drainage_Layer_Strength_Tip: [ + "노선 1m 구간마다 그 자리로 모이는 상류 면적을 색으로 칠합니다(B04 지도와 같은 색띠).", + "Colors each 1m stretch of the route by the upstream area draining into it (same ramp as the B04 map).", + ], + B05_Drainage_ImageAlt: ["배경 위성지도", "Satellite basemap"], + B05_Drainage_Status_NeedRoute: [ + "노선을 확정하면 배수유역도가 표시됩니다.", + "The drainage map appears once the route is confirmed.", + ], + B05_Drainage_Status_Analyzing: ["세부유역을 산정하는 중…", "Computing sub-basins…"], + B05_Drainage_Status_NoBasin: ["산정된 배수유역이 없습니다.", "No drainage basin was computed."], + B05_Drainage_Status_AnalyzeFailed: [ + "세부유역 산정에 실패했습니다.", + "Failed to compute sub-basins.", + ], + B05_Drainage_Status_LoadingBase: ["배경도를 불러오는 중…", "Loading the basemap…"], + B05_Drainage_Status_LoadingSheets: ["도엽 레이어를 불러오는 중…", "Loading map sheet layers…"], + B05_Drainage_Status_NoSheets: [ + "도엽 레이어가 없습니다. B04에서 임포트하세요.", + "No map sheet layer found. Import them in B04.", + ], + B05_Drainage_Status_LoadFailed: ["배경도를 불러오지 못했습니다.", "Failed to load the basemap."], + B05_Drainage_Basin_Undecided: ["미정", "TBD"], + /* {area}=면적, {relief}=표고차, {flow}=유하장, {pipe}=관경 */ + B05_Drainage_Basin_Metrics: [ + "면적 {area} · 표고 {relief}m · 유하 {flow}m · 관경 {pipe}", + "Area {area} · Relief {relief}m · Flow {flow}m · Pipe {pipe}", + ], + /* {chainage}=측점 누가거리(m) */ + B05_Drainage_Basin_Chainage: ["측점 누가거리 {chainage}m", "Station chainage {chainage}m"], + + /* --- B05_wf2_Route 경로 설계 --- */ + B05_Route_Title: ["종단설계", "Profile Design"], + B05_Route_Group_Points: ["경로 제어점", "Route Control Points"], + B05_Route_Point_BP: ["시점 (BP)", "Begin (BP)"], + B05_Route_Point_EP: ["종점 (EP)", "End (EP)"], + B05_Route_Point_CP: ["경유점 (CP)", "Control Points (CP)"], + B05_Route_Field_X: ["X 좌표", "X"], + B05_Route_Field_Y: ["Y 좌표", "Y"], + B05_Route_Btn_AddCp: ["경유점 추가", "Add control point"], + B05_Route_Btn_RemoveCp: ["삭제", "Remove"], + B05_Route_Group_Surface: ["기반 지표면", "Base Surface"], + B05_Route_Field_Filter: ["지면 필터", "Ground filter"], + B05_Route_Field_Method: ["지표면 표현", "Surface method"], + B05_Route_Field_SurfaceId: ["지표면 모델 ID", "Surface model ID"], + B05_Route_Surface_Confirmed: ["확정 모델 #{id} · {method}", "Confirmed model #{id} · {method}"], + B05_Route_Surface_NotConfirmed: [ + "WF1에서 지표면 모델을 확정하세요.", + "Confirm a surface model in WF1.", + ], + B05_Route_Surface_LoadFailed: [ + "확정 지표면 모델을 불러오지 못했습니다.", + "Failed to load the confirmed surface model.", + ], + B05_Route_Group_Constraints: ["설계 제약", "Design Constraints"], + B05_Route_Field_GradeClass: ["임도 등급", "Road grade class"], + B05_Route_Field_Algorithm: ["경로 알고리즘", "Route algorithm"], + B05_Route_Field_MaxUphill: ["최대 상향 경사(%)", "Max uphill grade (%)"], + B05_Route_Field_MaxDownhill: ["최대 하향 경사(%)", "Max downhill grade (%)"], + B05_Route_Field_MinRadius: ["최소 곡선반경(m)", "Min curve radius (m)"], + B05_Route_Field_Smooth: ["경로 스무딩", "Smooth route"], + B05_Route_Btn_Solve: ["경로 탐색 실행", "Solve Route"], + B05_Route_Btn_Confirm: ["경로 확정", "Confirm Route"], + B05_Route_Result_Title: ["경로 탐색 결과", "Route Result"], + B05_Route_Result_Empty: ["아직 계산된 경로가 없습니다.", "No route computed yet."], + B05_Route_Result_Length: ["총 연장(m)", "Total length (m)"], + B05_Route_Result_MinSlope: ["최소 경사", "Min slope"], + B05_Route_Result_MaxSlope: ["최대 경사", "Max slope"], + B05_Route_Result_MeanSlope: ["평균 경사", "Mean slope"], + B05_Route_Result_Cost: ["비용 점수", "Cost score"], + B05_Route_Result_Path: ["경로 파일", "Route file"], + B05_Route_Error_Project: ["먼저 프로젝트를 선택하세요.", "Select a project first."], + B05_Route_Error_Points: [ + "시점과 종점 좌표를 모두 입력하세요.", + "Enter both begin and end coordinates.", + ], + B05_Route_Error_Filter: ["지면 필터 키를 입력하세요.", "Enter a ground filter key."], + B05_Route_Solve_Success: ["경로 탐색을 완료했습니다.", "Route solved."], + B05_Route_Solve_Failed: ["경로 탐색에 실패했습니다.", "Route solve failed."], + B05_Route_Confirm_Success: ["경로를 확정했습니다.", "Route confirmed."], + B05_Route_Confirm_Failed: ["경로 확정에 실패했습니다.", "Route confirm failed."], + B05_Route_Group_SectionOptions: ["측점 및 샘플링 설정", "Station & Sampling Settings"], + B05_Route_Field_StationInterval: ["측점 간격(m)", "Station interval (m)"], + B05_Route_Field_CrossHalfWidth: ["횡단 반폭(m)", "Cross half-width (m)"], + B05_Route_Field_CrossSample: ["횡단 샘플 간격(m)", "Cross sample interval (m)"], + B05_Route_Field_LongSample: ["종단 샘플 간격(m)", "Long sample interval (m)"], + B05_Route_Field_StationLines: ["측점 가로선", "Station cross lines"], + + /* --- B06_wf3_ProfileCross 종·횡단 생성 --- */ + B06_Profile_Title: ["횡단설계", "Cross Design"], + B06_Profile_Group_Route: ["대상 경로", "Target Route"], + B06_Profile_Field_RouteId: ["경로 ID (routes.id)", "Route ID"], + B06_Profile_Field_Filter: ["지면 필터", "Ground filter"], + B06_Profile_Field_Method: ["지표면 표현", "Surface method"], + B06_Profile_Field_Crs: ["좌표계", "CRS"], + B06_Profile_Group_Display: ["표시 옵션", "Display Options"], + B06_Profile_Field_VerticalExaggeration: ["높이 배율", "Vertical exaggeration"], + B06_Profile_Field_Smooth: ["지표면 스무딩", "Smooth surface"], + B06_Profile_Smooth_On: ["사용", "On"], + B06_Profile_Smooth_Off: ["미사용", "Off"], + B06_Profile_Btn_Confirm: ["종·횡단 확정", "Confirm Sections"], + B06_Profile_Result_Title: ["종·횡단 생성 결과", "Section Result"], + B06_Profile_Context_Failed: [ + "경로 정보를 불러오지 못했습니다. 서버 상태를 확인하세요.", + "Failed to load route context. Check the server status.", + ], + B06_Profile_Calculate_In_B05: [ + "저장된 종·횡단이 없습니다. B05에서 경로를 계산하세요.", + "No saved sections. Calculate the route in B05.", + ], + B06_Profile_Result_Length: ["종단 연장(m)", "Longitudinal length (m)"], + B06_Profile_Result_CrossCount: ["횡단 개수", "Cross-section count"], + B06_Profile_Result_Path: ["종단 파일", "Longitudinal file"], + B06_Profile_Error_Project: ["먼저 프로젝트를 선택하세요.", "Select a project first."], + B06_Profile_Confirm_Success: ["종·횡단을 확정했습니다.", "Sections confirmed."], + B06_Profile_Confirm_Failed: ["종·횡단 확정에 실패했습니다.", "Section confirm failed."], + B06_Profile_Detail_Failed: [ + "종·횡단 도면 데이터를 불러오지 못했습니다.", + "Failed to load section drawing data.", + ], + B06_Profile_Regenerate_Failed: [ + "횡단 반폭 재생성에 실패했습니다.", + "Failed to regenerate sections with the new half-width.", + ], + B06_Profile_Regenerate_Success: [ + "횡단 반폭을 반영해 종·횡단을 재생성했습니다.", + "Sections regenerated with the new half-width.", + ], + B06_Profile_Btn_Recalc: ["재계산", "Recalculate"], + B06_Profile_View_Longitudinal: ["종단면도", "Longitudinal profile"], + B06_Profile_View_Cross: ["횡단면도", "Cross sections"], + B06_Profile_View_StationCount: ["횡단 측점", "Cross stations"], + B06_Profile_View_CrossCountSuffix: ["개 도면", " drawings"], + B06_Profile_View_LongitudinalXAxis: [ + "BP 기준 누적거리 (횡단 측점)", + "Chainage from BP (cross stations)", + ], + B06_Profile_View_CrossXAxis: ["중심선 기준 편거리 (m)", "Offset from centerline (m)"], + B06_Profile_View_ElevationAxis: ["지반고 (m)", "Elevation (m)"], + B06_Profile_View_CenterElevation: ["중심고", "Center elevation"], + B06_Profile_View_Azimuth: ["방위각", "Azimuth"], + B06_Profile_Zoom_In: ["확대", "Zoom in"], + B06_Profile_Zoom_Out: ["축소", "Zoom out"], + B06_Profile_Zoom_Reset: ["원래 크기", "Reset zoom"], + B06_Profile_View_Kind_BP: ["BP", "BP"], + B06_Profile_View_Kind_EP: ["EP", "EP"], + B06_Profile_View_Kind_Station: ["일반 측점", "Station"], + B06_Profile_View_NoLongitudinal: [ + "표시할 종단면 데이터가 없습니다.", + "No longitudinal profile data to display.", + ], + B06_Profile_View_NoCross: [ + "표시할 횡단면 데이터가 없습니다.", + "No cross-section data to display.", + ], + + /* --- B06 측점 표준횡단 설계 지정 --- */ + B06_Design_Ground_Legend: ["지반유형", "Ground type"], + B06_Design_Ground_Soil: ["토사", "Soil"], + B06_Design_Ground_Ripping: ["리핑암", "Ripping rock"], + B06_Design_Ground_Blasting: ["발파암", "Blasting rock"], + B06_Design_Mode_Legend: ["단면유형", "Section type"], + B06_Design_Mode_LeftCut: ["편측 성토", "One-side fill"], + B06_Design_Mode_RightCut: ["편측 성토", "One-side fill"], + B06_Design_Mode_BothCut: ["양측 절토", "Both cut"], + B06_Design_Mode_BothFill: ["양측 성토", "Both fill"], + B06_Design_Ditch_Legend: ["측구위치", "Ditch side"], + B06_Design_Ditch_Left: ["좌", "Left"], + B06_Design_Ditch_Right: ["우", "Right"], + B06_Design_Cut_Area: ["절토", "Cut"], + B06_Design_Fill_Area: ["성토", "Fill"], + B06_Design_Unset: ["미지정", "Not set"], + B06_Design_DitchType_Legend: ["측구형식", "Ditch type"], + B06_Design_DitchType_Standard: ["일반", "Standard"], + B06_Design_DitchType_LType: ["L형", "L-type"], + B06_Design_Paved_Legend: ["포장", "Pavement"], + B06_Design_Paved_On: ["포장", "Paved"], + B06_Design_Paved_Off: ["비포장", "Unpaved"], + B06_Design_TwoStage_Legend: ["2단계 경사", "Two-stage slope"], + B06_Design_TwoStage_On: ["복합경사", "Compound slope"], + B06_Design_TwoStage_Off: ["단경사", "Single slope"], + B06_Design_Ditch_Legend2: ["측구", "Ditch"], + B06_Design_Ditch_On: ["측구", "Ditch"], + B06_Design_Ditch_Off: ["측구", "Ditch"], + B06_Design_Disabled_BothCutOnly: [ + "양측 절토·양측 성토 단면에서만 경사 방향을 바꿀 수 있습니다.", + "Slope direction is adjustable only for both-cut and both-fill sections.", + ], + B06_Design_More: ["더보기", "More"], + B06_Design_SlopeDir_Left: ["좌", "Left"], + B06_Design_SlopeDir_Right: ["우", "Right"], + B06_Design_Disabled_RockCut: [ + "암(리핑/발파) 지반의 절토 단면에서만 사용할 수 있습니다.", + "Available only for rock ground with a cut section.", + ], + B06_Design_Disabled_NoDitch: [ + "측구가 있는 단면(양성 제외)에서만 사용할 수 있습니다.", + "Available only for sections with a ditch (not both-fill).", + ], + B06_Design_Disabled_NoDitchType: [ + "측구를 생성한 경우에만 형식을 선택할 수 있습니다.", + "Available only when a ditch is created.", + ], + B06_Design_Paved_Suggested: [ + "종단경사 법정 상한 초과 — 포장 권장 (임도설치 및 관리 등에 관한 규정 별표 1-2)", + "Grade exceeds legal limit — pavement recommended (Forest Road Regulation, Annex 1-2)", + ], + B06_Design_RockBoundary_Legend: ["암 경계", "Rock boundary"], + B06_Design_RockBoundary_Up: ["암 경계선 올림", "Raise rock boundary"], + B06_Design_RockBoundary_Down: ["암 경계선 내림", "Lower rock boundary"], + B06_Design_RockBoundary_Reset: ["암 경계선 기본값 복원", "Reset rock boundary"], + B06_Design_Failed: ["횡단 설계 계산에 실패했습니다.", "Failed to compute cross-section design."], + B06_Profile_Confirm_NeedDesign: [ + "지반유형이 지정되지 않은 측점이 있습니다.", + "Some stations have no ground type assigned.", + ], + + /* --- B06 표준 횡단면 설정 패널 --- */ + B06_Std_Title: ["표준 횡단면 설정", "Standard cross-section"], + B06_Std_Group_Soil: ["토사 구간", "Soil section"], + B06_Std_Group_Rock: ["암 구간 (리핑/발파)", "Rock section (ripping/blasting)"], + B06_Std_Group_Paved: ["포장 구간", "Paved section"], + B06_Std_Field_RoadWidth: ["노폭(m)", "Road width (m)"], + B06_Std_Field_ShoulderLeft: ["노견 좌(m)", "Shoulder L (m)"], + B06_Std_Field_ShoulderRight: ["노견 우(m)", "Shoulder R (m)"], + B06_Std_Field_DitchTop: ["측구 상단폭(m)", "Ditch top (m)"], + B06_Std_Field_DitchBottom: ["측구 저폭(m)", "Ditch bottom (m)"], + B06_Std_Field_DitchDepth: ["측구 깊이(m)", "Ditch depth (m)"], + B06_Std_Field_LDitchWidth: ["L형 측구 폭(m)", "L-ditch width (m)"], + B06_Std_Field_LDitchDepth: ["L형 측구 깊이(m)", "L-ditch depth (m)"], + B06_Std_Field_CrossSlopeMin: ["횡단경사 최소(%)", "Cross slope min (%)"], + B06_Std_Field_CrossSlopeMax: ["횡단경사 최대(%)", "Cross slope max (%)"], + B06_Std_Field_CutSlope: ["절토경사(1:n)", "Cut slope (1:n)"], + B06_Std_Field_FillSlope: ["성토경사(1:n)", "Fill slope (1:n)"], + B06_Std_LType_Note: [ + "L형 측구는 각 횡단면도에서 선택합니다.", + "L-type ditch is chosen per cross-section drawing.", + ], + B06_Std_Reset: ["기본값 복원", "Restore defaults"], + B06_Std_ApplyAll: ["전체 측점 반영", "Apply to all stations"], + B06_Std_ApplyAll_Success: [ + "패널 설정을 전체 측점에 반영했습니다.", + "Applied panel settings to all stations.", + ], + B06_Std_Load_Title: ["다른 프로젝트에서 불러오기", "Load from another project"], + B06_Std_Load_Select: ["프로젝트 선택", "Select project"], + B06_Std_Load_Placeholder: ["— 프로젝트 선택 —", "— Select a project —"], + B06_Std_Load_Empty: [ + "같은 회사에 불러올 설계값이 없습니다.", + "No saved designs in your company.", + ], + B06_Std_Load_Loading: ["불러오는 중…", "Loading…"], + B06_Std_Load_Apply: ["현재 설정에 적용", "Apply to current settings"], + B06_Std_Load_Applied: ["적용되었습니다.", "Applied."], + B06_Std_Load_Failed: ["설계값을 불러오지 못했습니다.", "Failed to load design values."], + B06_Std_Load_None: [ + "선택한 프로젝트에 저장된 설계값이 없습니다.", + "The selected project has no saved design values.", + ], + B06_Std_Diagram_Title: ["변수 위치 안내", "Variable position guide"], + B06_Std_Diagram_Toggle: ["단면 그림 보기/숨기기", "Show/hide section guide"], + B06_Std_Diagram_Road: ["노폭", "Road"], + B06_Std_Diagram_ShoulderL: ["노견 좌", "Shoulder L"], + B06_Std_Diagram_ShoulderR: ["노견 우", "Shoulder R"], + B06_Std_Diagram_Ditch: ["측구", "Ditch"], + B06_Std_Diagram_Cut: ["절토경사", "Cut slope"], + B06_Std_Diagram_Fill: ["성토경사", "Fill slope"], + B06_Std_Diagram_CrossSlope: ["횡단경사", "Cross slope"], + B06_Std_Diagram_Center: ["중심선(계획고)", "Centerline (design elev.)"], + B06_Std_Diagram_Caption: [ + "표준 편절편성 단면 모식도 — 각 설정값의 위치를 나타냅니다(실제 비율 아님).", + "Standard cut-fill section schematic — shows where each value applies (not to scale).", + ], + + /* --- B07_wf4_DesignDetail 상세 설계 --- */ + B07_Design_Title: ["상세설계", "Detail Design"], + B07_Cad_Side_Pending: [ + "사이드 패널은 전달 데이터 확정 후 구성됩니다.", + "Side panel will be configured after the upstream data spec is finalized.", + ], + B07_Cad_Loading: ["도면을 불러오는 중...", "Loading drawing..."], + B07_Cad_Load_Failed: ["도면을 불러오지 못했습니다.", "Failed to load drawing."], + B07_Info_Ground_Title: ["지반정보", "Ground info"], + B07_Info_Plan_Title: ["계획정보", "Plan info"], + B07_Info_GroundType: ["지반유형", "Ground type"], + B07_Info_CutSide: ["절토측", "Cut side"], + B07_Info_DitchSide: ["측구위치", "Ditch side"], + B07_Info_DesignElevation: ["계획고", "Design elevation"], + B07_Info_CutSlope: ["절토경사", "Cut slope"], + B07_Info_FillSlope: ["성토경사", "Fill slope"], + B07_Info_RoadWidth: ["노면폭", "Road width"], + B07_Info_Ditch: ["측구규격", "Ditch spec"], + B07_Info_CutArea: ["절토 단면적", "Cut area"], + B07_Info_FillArea: ["성토 단면적", "Fill area"], + B07_Info_Provisional: ["잠정", "Provisional"], + B07_Info_Confirmed: ["확정", "Confirmed"], + B07_Info_NoDesign: ["지반·계획 지정 데이터가 없습니다.", "No ground/plan designation data."], + B07_Info_Station: ["측점", "Station"], + + /* --- B08_wf5_Quantity 수량 산출 --- */ + B08_Quantity_Title: ["수량산출", "Quantity"], + + /* --- B09_wf6_Estimation 견적·문서 --- */ + B09_Estimation_Title: ["설계도서", "Design Docs"], + + /* --- B10_Payment 결재 --- */ + B10_Payment_Title: ["결재", "Payment"], + B10_Payment_Subtitle: [ + "세금계산서 발행과 계좌 입금 절차를 확인하세요.", + "Review the tax invoice and bank transfer process.", + ], + B10_Payment_Invoice_Title: ["세금계산서 발행 요청", "Tax Invoice Request"], + B10_Payment_Invoice_Description: [ + "사업자 정보와 발행 금액은 견적 확정 후 연결됩니다.", + "Business details and the invoice amount will be linked after the estimate is finalized.", + ], + B10_Payment_Invoice_Request: ["발행 요청", "Request Invoice"], + B10_Payment_Invoice_Status: ["요청 전", "Not Requested"], + B10_Payment_Deposit_Title: ["계좌 입금 안내", "Bank Transfer Guide"], + B10_Payment_Deposit_Account: ["입금 계좌", "Deposit Account"], + B10_Payment_Deposit_Amount: ["입금 금액", "Deposit Amount"], + B10_Payment_Deposit_Pending: ["견적 확정 후 표시", "Shown after estimate confirmation"], + B10_Payment_Deposit_Note: [ + "입금 확인 후 설계문서와 DWG 다운로드가 허용됩니다.", + "Design documents and DWG downloads are enabled after the deposit is confirmed.", + ], + + /* --- B11_Status 상태 출력 --- */ + B11_Status_Title: ["처리 상태", "Status"], + B11_Status_Subtitle: [ + "결재·문서 생성 상태를 확인하고 결과물을 내려받으세요.", + "Check payment and document status, and download results.", + ], + // 자료 준비 화면 (대시보드 → 작업 화면 진입 시 3D·등고선 선적재) + B11_Loading_Title: ["자료 준비 중", "Preparing data"], + B11_Loading_Subtitle: ["잠시만 기다려 주세요.", "This will take a moment."], + B11_Loading_Message: [ + "작업 화면에서 바로 쓸 수 있도록 3D 지표면과 등고선을 준비합니다.", + "Loading the 3D surface and contours so the workspace opens instantly.", + ], + B11_Loading_Start: ["자료를 준비하는 중…", "Preparing data…"], + B11_Loading_NoProject: [ + "프로젝트가 선택되지 않았습니다. 대시보드에서 프로젝트를 먼저 고르세요.", + "No project selected. Choose a project on the dashboard first.", + ], + B11_Loading_Failed: [ + "자료를 준비하지 못했습니다. 분석 결과나 저장 경로에 문제가 있을 수 있습니다. 담당자에게 연락해 주세요.", + "Could not prepare the data. The analysis result or storage path may be broken. Please contact support.", + ], + B11_Loading_Btn_Continue: ["그래도 화면으로 이동", "Continue anyway"], + B11_Loading_Btn_Dashboard: ["대시보드로", "Back to dashboard"], + B11_Status_Flow_Title: ["결재 진행 상태", "Payment Progress"], + B11_Status_Step_Request: ["발행 요청", "Invoice Requested"], + B11_Status_Step_Issue: ["세금계산서 발행", "Invoice Issued"], + B11_Status_Step_Deposit: ["입금 확인", "Deposit Confirmed"], + B11_Status_Step_Complete: ["완료", "Complete"], + B11_Status_NotStarted: ["시작 전", "Not Started"], + B11_Status_Download_Title: ["결과물 다운로드", "Result Downloads"], + B11_Status_Download_Description: [ + "입금 확인이 완료되면 설계문서와 DWG 다운로드가 활성화됩니다.", + "Design document and DWG downloads are enabled after deposit confirmation.", + ], +} as const satisfies Record; diff --git a/ui_template/ui_template_locale_common.ts b/ui_template/ui_template_locale_common.ts new file mode 100644 index 00000000..09bcccc5 --- /dev/null +++ b/ui_template/ui_template_locale_common.ts @@ -0,0 +1,104 @@ +/* ============================================================================= + * ui_template_locale_common.ts + * 다국어 사전 — 공통 문구 (액션/상태/폼/네비게이션/워크플로우 라벨/앱 셸) + * + * 규칙 (frontend.md §3): + * - 모든 UI 문자열은 여기에 [한국어, 영어] 배열로 선(先) 등록. + * - 컴포넌트에서는 ui_locales.키값[currentLanguageIndex] 형태로만 참조. + * - 텍스트 하드코딩 절대 금지. + * - 신규 문구는 해당 섹션 최하단에 추가. + * + * 이 파일은 사전 데이터만 담는다. 합성·언어 전환·t() 헬퍼는 ui_template_locale.ts 참조. + * ========================================================================== */ + +/** [한국어, 영어] 배열 타입 */ +export type LocaleEntry = readonly [ko: string, en: string]; + +export const ui_locales_common = { + /* --------------------------------------------------------------------------- + * 공통 — 액션 / 버튼 + * ------------------------------------------------------------------------ */ + Common_Btn_Confirm: ["확인", "Confirm"], + Common_Btn_Cancel: ["취소", "Cancel"], + Common_Btn_Save: ["저장", "Save"], + Common_Btn_Delete: ["삭제", "Delete"], + Common_Btn_Edit: ["수정", "Edit"], + Common_Btn_Add: ["추가", "Add"], + Common_Btn_Close: ["닫기", "Close"], + Common_Btn_Next: ["다음", "Next"], + Common_Btn_Prev: ["이전", "Previous"], + Common_Btn_Submit: ["제출", "Submit"], + Common_Btn_Reset: ["초기화", "Reset"], + Common_Btn_Download: ["다운로드", "Download"], + Common_Btn_Upload: ["업로드", "Upload"], + Common_Btn_Search: ["검색", "Search"], + Common_Btn_Apply: ["적용", "Apply"], + Common_Btn_Retry: ["다시 시도", "Retry"], + + /* --------------------------------------------------------------------------- + * 공통 — 상태 / 메시지 + * ------------------------------------------------------------------------ */ + Common_Status_Loading: ["불러오는 중...", "Loading..."], + Common_Status_Saving: ["저장 중...", "Saving..."], + Common_Status_Processing: ["처리 중...", "Processing..."], + Common_Status_Success: ["완료되었습니다", "Completed"], + Common_Status_Error: ["오류가 발생했습니다", "An error occurred"], + Common_Status_Empty: ["데이터가 없습니다", "No data available"], + Common_Msg_ConfirmDelete: ["정말 삭제하시겠습니까?", "Are you sure you want to delete?"], + Common_Msg_UnsavedChanges: ["저장되지 않은 변경사항이 있습니다", "You have unsaved changes"], + Common_Msg_RequiredField: ["필수 입력 항목입니다", "This field is required"], + Common_Msg_InvalidValue: ["올바르지 않은 값입니다", "Invalid value"], + Workflow_Progress_Title: ["진행단계", "Progress"], + Workflow_Overlay_Collapse: ["패널 접기", "Collapse panel"], + Workflow_Overlay_Expand: ["패널 펼치기", "Expand panel"], + + /* --------------------------------------------------------------------------- + * 공통 — 폼 / 검증 + * ------------------------------------------------------------------------ */ + Common_Form_Placeholder_Search: ["검색어를 입력하세요", "Enter search term"], + Common_Form_Placeholder_Select: ["선택하세요", "Select"], + Common_Validation_NumberRange: ["숫자 범위를 벗어났습니다", "Value out of range"], + Common_Validation_EmailFormat: ["이메일 형식이 올바르지 않습니다", "Invalid email format"], + + /* --------------------------------------------------------------------------- + * 글로벌 네비게이션 / 언어 + * ------------------------------------------------------------------------ */ + Nav_Home: ["홈", "Home"], + Nav_Login: ["로그인", "Login"], + Nav_Logout: ["로그아웃", "Logout"], + Nav_Register: ["회원가입", "Sign up"], + Nav_MyAccount: ["내 계정", "My Account"], + Lang_Korean: ["한국어", "Korean"], + Lang_English: ["영어", "English"], + Theme_Light: ["라이트 모드", "Light mode"], + Theme_Dark: ["다크 모드", "Dark mode"], + + /* --------------------------------------------------------------------------- + * 워크플로우 공통 (B04~B09 상단 진행 단계 라벨) + * ------------------------------------------------------------------------ */ + WF_Step_Surface: ["전처리", "Preprocess"], + WF_Step_Route: ["종단설계", "Profile Design"], + WF_Step_ProfileCross: ["횡단설계", "Cross Design"], + WF_Step_DesignDetail: ["상세설계", "Detail Design"], + WF_Step_Quantity: ["수량산출", "Quantity"], + WF_Step_Estimation: ["설계도서", "Design Docs"], + WF_State_Stale: ["무효화됨 (하위 단계 변경)", "Stale (invalidated by downstream changes)"], + WF_State_Failed: ["실패", "Failed"], + WF_State_Complete: ["완료", "Complete"], + WF_State_InProgress: ["진행 중", "In Progress"], + WF_State_NotStarted: ["미실행", "Not Started"], + + /* --------------------------------------------------------------------------- + * 앱 셸 — 헤더 / 푸터 (공통 네비게이션) + * ------------------------------------------------------------------------ */ + App_BrandName: ["AISLO", "AISLO"], + App_Nav_Program: ["프로그램", "Program"], + App_Nav_Company: ["회사소개", "Company"], + App_Nav_News: ["소식", "News"], + App_Nav_Education: ["교육", "Education"], + App_Nav_Support: ["기술지원", "Support"], + App_Footer_Copyright: [ + "© 2026 임도설계 및 견적 자동화. All rights reserved.", + "© 2026 Forest Road Design & Estimation. All rights reserved.", + ], +} as const satisfies Record;