- Hopyo_JudgeApi.ts: 785-5 길 다섯 타입 · 부름(hopyo-judge 목록 · 호표 · 블록 · check · move) - logic/Hopyo_Picks.ts: 고름 캐시 꼴 · 제안 = 미리 체크 · 호표 제안 모두 확인 = 다 풀린 제안만 · 입력 필요 남은 줄 막음 · 옮기기 몸 = 확인한 것만 - Hopyo_Rows.ts: 시트 아래 줄 판 — 1차 판정 칩 · 갈래 · 후보 복수 고름 · 수량 · 단위 환산 칸 · 엑셀 행 뛰기 · [확인] · [옮기기] - Hopyo_Block.ts: 블록 판 — 절마다 기초 후보 · 맡은 절 · 입력값 칸(출처 꼬리표 · 입력 필요 · 엇갈림 · 기본) · 줄 대조 · 블록 판정 · 금액 참고 · [검산] - 사전 ui_template_locale_m2_judge.ts · 자리 CSS Hopyo_Judge.css - 시험 test_642_6_screen.py + helper_642_6_picks.cjs(북부청 예시 1 · 2 · 3 실제 풀이로) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
90 lines
3.8 KiB
TypeScript
90 lines
3.8 KiB
TypeScript
/* =============================================================================
|
|
* ui_template_locale.ts
|
|
* 다국어 텍스트 배열 방식 관리 파일 (i18n) — 사전 합성 및 조회 헬퍼
|
|
*
|
|
* 규칙 (frontend.md §3):
|
|
* - 모든 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~B07)
|
|
* - ui_template_locale_b5.ts : B 그룹 끝 (B08~B11)
|
|
* - ui_template_locale_de.ts : D 예정노선 · E 안정성평가 · 대시보드 [+] 고르기
|
|
* - ui_template_locale_e04.ts : E04 안정성평가 3D 해석
|
|
* - ui_template_locale_e07.ts : E07 안정성평가 광역 위험 지도
|
|
*
|
|
* 이 파일의 export 시그니처는 분할 이전과 동일하므로 소비처 import 수정은 불필요하다.
|
|
* ========================================================================== */
|
|
|
|
// b4 = B09 원가계산서·제비율(랩탑 메인 벌). 다른 벌과 줄이 겹치지 않게 맨 앞에 둠.
|
|
import { ui_locales_b4 } from "./ui_template_locale_b4";
|
|
import { ui_locales_common } from "./ui_template_locale_common";
|
|
import { ui_locales_a } from "./ui_template_locale_a";
|
|
import { ui_locales_e03 } from "./ui_template_locale_e03";
|
|
import { ui_locales_b1 } from "./ui_template_locale_b1";
|
|
import { ui_locales_b2 } from "./ui_template_locale_b2";
|
|
import { ui_locales_b3 } from "./ui_template_locale_b3";
|
|
import { ui_locales_e04 } from "./ui_template_locale_e04";
|
|
import { ui_locales_b5 } from "./ui_template_locale_b5";
|
|
import { ui_locales_m1 } from "./ui_template_locale_m1";
|
|
import { ui_locales_m2 } from "./ui_template_locale_m2";
|
|
import { ui_locales_m2_judge } from "./ui_template_locale_m2_judge";
|
|
import { ui_locales_de } from "./ui_template_locale_de";
|
|
import { ui_locales_e } from "./ui_template_locale_e";
|
|
import { ui_locales_e05 } from "./ui_template_locale_e05";
|
|
import { ui_locales_e06 } from "./ui_template_locale_e06";
|
|
import { ui_locales_e07 } from "./ui_template_locale_e07";
|
|
|
|
/** 지원 언어 인덱스: 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];
|
|
}
|
|
|
|
/** 분할된 사전 4종을 합성한 단일 사전. 키는 파일 간 중복되지 않는다. */
|
|
export const ui_locales = {
|
|
...ui_locales_b4,
|
|
...ui_locales_common,
|
|
...ui_locales_a,
|
|
...ui_locales_e03,
|
|
...ui_locales_b1,
|
|
...ui_locales_b2,
|
|
...ui_locales_b3,
|
|
...ui_locales_e04,
|
|
...ui_locales_b5,
|
|
...ui_locales_m1,
|
|
...ui_locales_m2,
|
|
...ui_locales_m2_judge,
|
|
...ui_locales_de,
|
|
...ui_locales_e,
|
|
...ui_locales_e05,
|
|
...ui_locales_e06,
|
|
...ui_locales_e07,
|
|
} as const;
|
|
|
|
export type LocaleKey = keyof typeof ui_locales;
|