Files
minecraft_launcher/src/installer-rp/preload.ts
claude-bot 6cd402121b i18n: 리소스팩 설치기 UI 문구를 locales/installer-rp/ko-kr.json 으로 분리
- main/preload/ytdlp/ffmpeg/music/images/pack/renderer 전반에서 로그·에러·진행
  메시지 문자열을 locales/installer-rp/ko-kr.json 사전 키로 교체
- preload 에 loadLocale 추가, main 에 rp:i18n:dict IPC 핸들러 추가
- 패키징된 .exe 에서도 한국어 사전이 적용되도록 electron-builder.yml 의
  extraResources 에 locales/ 폴더 추가

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-13 04:00:31 +09:00

50 lines
1.9 KiB
TypeScript

import { contextBridge, ipcRenderer } from 'electron'
import type { RpFetchedPack } from './types.js'
const api = {
/** i18n 사전을 렌더러에 전달. */
loadLocale: (): Promise<Record<string, unknown>> => ipcRenderer.invoke('rp:i18n:dict'),
/** manifest 와 각 음악퀴즈의 file/list/<key>.json 까지 한 번에 로드. */
loadPacks: (manifestUrl?: string): Promise<RpFetchedPack[]> =>
ipcRenderer.invoke('rp:packs:load', manifestUrl),
/** 음악퀴즈 키를 선택. */
selectPack: (packKey: string): Promise<void> =>
ipcRenderer.invoke('rp:packs:select', packKey),
/** 리소스팩 빌드/설치 시작. 완료 또는 취소될 때까지 resolve 되지 않을 수 있음. */
startInstall: (): Promise<{ resourcepackPath: string }> =>
ipcRenderer.invoke('rp:install:start'),
/** 진행 중인 설치 취소. 임시 파일 정리 후 종료. */
cancelInstall: (): Promise<void> =>
ipcRenderer.invoke('rp:install:cancel'),
/** %appdata%/.mc_custom/resourcepacks/ 폴더를 OS 파일 탐색기로 연다. */
openResourcepackFolder: (): Promise<void> =>
ipcRenderer.invoke('rp:finish:openFolder'),
/** 프로그램 종료. */
quit: (): Promise<void> => ipcRenderer.invoke('rp:quit'),
/** 로그 스트림 구독. */
onLog: (handler: (line: string) => void): (() => void) => {
const listener = (_event: unknown, line: string) => handler(line)
ipcRenderer.on('log', listener)
return () => ipcRenderer.removeListener('log', listener)
},
/** 설치 진행 이벤트 구독. payload 구조는 renderer 가 알아서 분기. */
onProgress: (handler: (payload: unknown) => void): (() => void) => {
const listener = (_event: unknown, payload: unknown) => handler(payload)
ipcRenderer.on('progress', listener)
return () => ipcRenderer.removeListener('progress', listener)
}
}
contextBridge.exposeInMainWorld('rpInstaller', api)
declare global {
interface Window {
rpInstaller: typeof api
}
}