/* ============================================================================= * ui_template_locale.ts * 다국어 텍스트 배열 방식 관리 파일 (i18n) * * 규칙 (frontend.md §3): * - 모든 UI 문자열은 여기에 [한국어, 영어] 배열로 선(先) 등록. * - 컴포넌트에서는 ui_locales.키값[currentLanguageIndex] 형태로만 참조. * - 텍스트 하드코딩 절대 금지. * - 신규 문구는 해당 섹션 최하단에 추가. * ========================================================================== */ /** 지원 언어 인덱스: 0 = 한국어, 1 = 영어 */ export const LANGUAGES = ["ko", "en"] as const; export type LanguageCode = (typeof LANGUAGES)[number]; /** 현재 언어 인덱스 (기본: 한국어). 언어 전환 시 이 값을 갱신. */ export let currentLanguageIndex = 0; /** 언어 전환 헬퍼. code가 유효하면 인덱스 갱신 후 반환. */ export function setLanguage(code: LanguageCode): number { const idx = LANGUAGES.indexOf(code); if (idx >= 0) { currentLanguageIndex = idx; } return currentLanguageIndex; } /** 현재 언어에 맞는 문자열 반환. 키 누락 시 키 자체를 반환(개발 중 탐지용). */ export function t(key: keyof typeof ui_locales): string { const entry = ui_locales[key]; if (!entry) { return String(key); } return entry[currentLanguageIndex] ?? entry[0]; } /** [한국어, 영어] 배열 타입 */ type LocaleEntry = readonly [ko: string, en: string]; 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"], /* --------------------------------------------------------------------------- * 공통 — 폼 / 검증 * ------------------------------------------------------------------------ */ 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: ["지표면 분석", "Surface Analysis"], WF_Step_Route: ["경로 설계", "Route Design"], WF_Step_ProfileCross: ["종횡단 생성", "Profile & Cross-section"], WF_Step_DesignDetail: ["상세 설계", "Detailed Design"], WF_Step_Quantity: ["수량 산출", "Quantity Takeoff"], WF_Step_Estimation: ["견적 / 문서", "Estimation / Docs"], /* --------------------------------------------------------------------------- * 앱 셸 — 헤더 / 푸터 (공통 네비게이션) * ------------------------------------------------------------------------ */ App_BrandName: ["임도설계", "ForestRoad"], 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 상세 --- */ A01_Home_Hero_Subtitle: [ "LAS 지형 데이터부터 최적 경로, 종횡단, 견적까지 한 번에.", "From LAS terrain data to optimal routes, cross-sections, and estimates — 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"], A02_ProgDetail_Step1_Title: ["1. 지표면 분석", "1. Surface Analysis"], 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. Route Design"], A02_ProgDetail_Step2_Desc: [ "경사·곡선반경·회피구역을 반영해 최적 임도 노선을 자동 탐색합니다.", "Auto-search optimal routes reflecting grade, curve radius, and avoidance zones.", ], A02_ProgDetail_Step3_Title: ["3. 종·횡단 생성", "3. Profile & Cross-section"], A02_ProgDetail_Step3_Desc: [ "확정 노선을 따라 종단면과 횡단면을 자동 추출합니다.", "Automatically extract longitudinal and cross sections along the confirmed route.", ], A02_ProgDetail_Step4_Title: ["4. 상세 설계", "4. Detailed Design"], A02_ProgDetail_Step4_Desc: [ "구조물, 배수, 절·성토 등 세부 설계 요소를 편집합니다.", "Edit detailed design elements such as structures, drainage, and cut/fill.", ], A02_ProgDetail_Step5_Title: ["5. 수량 산출", "5. Quantity Takeoff"], A02_ProgDetail_Step5_Desc: [ "토공량과 구조물 수량을 자동 계산합니다.", "Automatically calculate earthwork volumes and structure quantities.", ], A02_ProgDetail_Step6_Title: ["6. 견적 / 문서", "6. Estimation / 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."], /* --- 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_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.", ], /* --- 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_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."], } as const satisfies Record; export type LocaleKey = keyof typeof ui_locales;