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>
This commit is contained in:
2026-05-13 04:00:31 +09:00
parent 135bc98840
commit 6cd402121b
10 changed files with 314 additions and 101 deletions

View File

@@ -4,6 +4,9 @@ import path from 'node:path'
import https from 'node:https'
import http from 'node:http'
import { getMcCustomDir } from '../shared/paths.js'
import { loadComponentI18n } from '../shared/i18n.js'
const { t } = loadComponentI18n('installer-rp')
/**
* 리소스팩 간편설치기는 Windows .exe 로 배포되므로 yt-dlp.exe 한 종류만 사용.
@@ -27,7 +30,7 @@ export async function ensureYtDlpExe(
): Promise<string> {
const target = getYtDlpExePath()
if (await canExecute(target)) {
log?.(`yt-dlp.exe 이미 있음: ${target}`)
log?.(t('log.ytdlpExists', { path: target }))
return target
}
if (installPromise) return installPromise
@@ -35,20 +38,21 @@ export async function ensureYtDlpExe(
installPromise = (async () => {
try {
await fs.mkdir(path.dirname(target), { recursive: true })
log?.(`yt-dlp.exe 다운로드 중: ${YT_DLP_DOWNLOAD_URL}`)
log?.(t('log.ytdlpDownloading', { url: YT_DLP_DOWNLOAD_URL }))
await downloadToFile(YT_DLP_DOWNLOAD_URL, target)
const okVersion = await probeVersion(target)
if (!okVersion) {
throw new Error('yt-dlp.exe 다운로드는 됐지만 실행 검증에 실패했습니다.')
throw new Error(t('errors.ytdlpVerifyFailed'))
}
log?.(`yt-dlp.exe 준비 완료: ${target}`)
log?.(t('log.ytdlpReady', { path: target }))
return target
} catch (err) {
// 부분 다운로드 흔적 정리
try { await fs.unlink(target) } catch { /* noop */ }
throw new Error(
'yt-dlp.exe 자동 설치 실패: ' +
(err instanceof Error ? err.message : String(err))
t('errors.ytdlpInstallFailed', {
message: err instanceof Error ? err.message : String(err)
})
)
} finally {
installPromise = null
@@ -80,7 +84,7 @@ function probeVersion(bin: string): Promise<boolean> {
function downloadToFile(url: string, dest: string, redirects = 0): Promise<void> {
return new Promise((resolve, reject) => {
if (redirects > 8) {
reject(new Error('redirect 가 너무 많습니다.'))
reject(new Error(t('common.tooManyRedirects')))
return
}
const lib = url.startsWith('https://') ? https : http