Files
Aislo/ui_template/ui_template_locale.ts
eomsangdonandClaude Opus 5 9ff360164c refactor(ui): ui_template_locale.ts 700줄 제약 해결 — 배럴 + 사전 4분할
1,230줄이던 ui_template_locale.ts를 얇은 배럴(51줄)로 축소하고,
ui_locales 사전 데이터를 4개 파일로 분리했다.

- ui_template_locale_common.ts (96줄, 60키) — 공통 액션/상태/폼/네비/워크플로우/앱 셸, LocaleEntry 타입 정의
- ui_template_locale_a.ts      (263줄, 141키) — A01~A09 로그인 전 페이지
- ui_template_locale_b1.ts     (430줄, 260키) — B01~B04
- ui_template_locale_b2.ts     (408줄, 253키) — B05~B11

배럴이 4종 사전을 스프레드로 합성하고 LANGUAGES / LanguageCode /
currentLanguageIndex / setLanguage / t / ui_locales / LocaleKey export
시그니처를 그대로 유지하므로, 소비처 13개 이상 파일의 import 수정은 없다.

검증: 분할 전후 714개 키가 값 문자열까지 완전 일치, 파일 간 중복 키 0건,
tsc --noEmit 오류 0건, prettier 5개 파일 모두 unchanged.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 07:34:21 +09:00

59 lines
2.4 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~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];
/** 현재 언어 인덱스 (기본: 한국어). 언어 전환 시 이 값을 갱신. */
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_common,
...ui_locales_a,
...ui_locales_b1,
...ui_locales_b2,
} as const;
export type LocaleKey = keyof typeof ui_locales;