670 lines
37 KiB
TypeScript
670 lines
37 KiB
TypeScript
/* =============================================================================
|
|
* 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: ["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 상세 --- */
|
|
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."],
|
|
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_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 terrain, point cloud, and drawing files.",
|
|
],
|
|
B03_File_Select_Label: ["입력 파일 선택", "Select input files"],
|
|
B03_File_Select_Hint: [
|
|
"LAS/LAZ 1개를 포함해 관련 PRJ, TFW, TIF 또는 도면 파일을 선택하세요.",
|
|
"Select exactly one LAS/LAZ file with related PRJ, TFW, TIF, or drawing files.",
|
|
],
|
|
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_Result_Path: ["저장 경로", "Stored path"],
|
|
|
|
/* --- B04_wf1_Surface 지표면 모델 분석 --- */
|
|
B04_Surface_Title: ["1차 · 지표면 모델 분석", "Step 1 · Surface Analysis"],
|
|
B04_Surface_Field_InputId: ["입력 파일 ID", "Input File ID"],
|
|
B04_Surface_Field_InputId_Placeholder: ["예: 1", "e.g. 1"],
|
|
B04_Surface_Group_Filters: ["지면 필터 선택", "Ground Filters"],
|
|
B04_Surface_Group_Methods: ["지표면 표현 선택", "Surface Methods"],
|
|
B04_Surface_Field_Force: ["기존 결과 무시하고 재계산", "Force recompute"],
|
|
B04_Surface_Btn_Analyze: ["지표면 분석 실행", "Run Surface Analysis"],
|
|
B04_Surface_Btn_Refresh: ["목록 새로고침", "Refresh"],
|
|
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_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_Route_Title: ["2차 · 경로 설계", "Step 2 · Route 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_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."],
|
|
|
|
/* --- B06_wf3_ProfileCross 종·횡단 생성 --- */
|
|
B06_Profile_Title: ["3차 · 종·횡단 생성", "Step 3 · Profile & Cross-section"],
|
|
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 (optional)"],
|
|
B06_Profile_Group_Options: ["측점·횡단 옵션", "Station & Cross Options"],
|
|
B06_Profile_Field_StationInterval: ["측점 간격(m)", "Station interval (m)"],
|
|
B06_Profile_Field_CrossHalfWidth: ["횡단 반폭(m)", "Cross half-width (m)"],
|
|
B06_Profile_Field_CrossSample: ["횡단 샘플 간격(m)", "Cross sample interval (m)"],
|
|
B06_Profile_Field_LongSample: ["종단 샘플 간격(m)", "Long sample interval (m)"],
|
|
B06_Profile_Field_Smooth: ["지표면 스무딩", "Smooth surface"],
|
|
B06_Profile_Btn_Generate: ["종·횡단 생성", "Generate Sections"],
|
|
B06_Profile_Btn_Confirm: ["종·횡단 확정", "Confirm Sections"],
|
|
B06_Profile_Result_Title: ["종·횡단 생성 결과", "Section Result"],
|
|
B06_Profile_Result_Empty: ["아직 생성된 종·횡단이 없습니다.", "No sections generated yet."],
|
|
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_Error_RouteId: ["유효한 경로 ID를 입력하세요.", "Enter a valid route ID."],
|
|
B06_Profile_Error_Filter: ["지면 필터 키를 입력하세요.", "Enter a ground filter key."],
|
|
B06_Profile_Generate_Success: ["종·횡단을 생성했습니다.", "Sections generated."],
|
|
B06_Profile_Generate_Failed: ["종·횡단 생성에 실패했습니다.", "Section generation failed."],
|
|
B06_Profile_Confirm_Success: ["종·횡단을 확정했습니다.", "Sections confirmed."],
|
|
B06_Profile_Confirm_Failed: ["종·횡단 확정에 실패했습니다.", "Section confirm failed."],
|
|
|
|
/* --- B07_wf4_DesignDetail 상세 설계 --- */
|
|
B07_Design_Title: ["4차 · 상세 설계", "Step 4 · Detailed Design"],
|
|
|
|
/* --- B08_wf5_Quantity 수량 산출 --- */
|
|
B08_Quantity_Title: ["5차 · 수량 산출", "Step 5 · Quantity Takeoff"],
|
|
|
|
/* --- B09_wf6_Estimation 견적·문서 --- */
|
|
B09_Estimation_Title: ["6차 · 견적·문서", "Step 6 · Estimation & Documents"],
|
|
|
|
/* --- B10_Payment 결재 --- */
|
|
B10_Payment_Title: ["결재", "Payment"],
|
|
B10_Payment_Subtitle: [
|
|
"산출된 견적을 확인하고 결재를 진행하세요.",
|
|
"Review the estimate and proceed with payment.",
|
|
],
|
|
|
|
/* --- B11_Status 상태 출력 --- */
|
|
B11_Status_Title: ["처리 상태", "Status"],
|
|
B11_Status_Subtitle: [
|
|
"결재·문서 생성 상태를 확인하고 결과물을 내려받으세요.",
|
|
"Check payment and document status, and download results.",
|
|
],
|
|
} as const satisfies Record<string, LocaleEntry>;
|
|
|
|
export type LocaleKey = keyof typeof ui_locales;
|