diff --git a/.eslintrc.cjs b/.eslintrc.cjs index e23081dc..6ec93984 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -19,5 +19,11 @@ module.exports = { }, ], "@typescript-eslint/no-explicit-any": "warn", + "prettier/prettier": [ + "error", + { + endOfLine: "auto", + }, + ], }, }; diff --git a/.husky/commit-msg b/.husky/commit-msg deleted file mode 100644 index 0a4b97de..00000000 --- a/.husky/commit-msg +++ /dev/null @@ -1 +0,0 @@ -npx --no -- commitlint --edit $1 diff --git a/src/locales/index.ts b/src/locales/index.ts index ff2f9935..867e61d1 100644 --- a/src/locales/index.ts +++ b/src/locales/index.ts @@ -11,5 +11,6 @@ export { default as tr } from "./tr/translation.json"; export { default as be } from "./be/translation.json"; export { default as uk } from "./uk/translation.json"; export { default as id } from "./id/translation.json"; +export { default as ko } from "./ko/translation.json"; export { default as da } from "./da/translation.json"; export { default as fa } from "./fa/translation.json"; diff --git a/src/locales/ko/translation.json b/src/locales/ko/translation.json new file mode 100644 index 00000000..bdf3b7e8 --- /dev/null +++ b/src/locales/ko/translation.json @@ -0,0 +1,174 @@ +{ + "home": { + "featured": "추천", + "recently_added": "최근 추가됨", + "trending": "인기", + "surprise_me": "무작위 추천", + "no_results": "결과 없음" + }, + "sidebar": { + "catalogue": "카탈로그", + "downloads": "다운로드", + "settings": "설정", + "my_library": "내 라이브러리", + "downloading_metadata": "{{title}} (메타데이터 다운로드 중…)", + "checking_files": "{{title}} ({{percentage}} - 파일 검사 중…)", + "paused": "{{title}} (일시 정지됨)", + "downloading": "{{title}} ({{percentage}} - 다운로드 중…)", + "filter": "필터 라이브러리", + "follow_us": "공식 SNS", + "home": "홈", + "discord": "공식 디스코드", + "telegram": "공식 텔레그램", + "x": "공식 X (구 트위터)", + "github": "GitHub에서 기여하기" + }, + "header": { + "search": "게임 검색하기", + "home": "홈", + "catalogue": "카탈로그", + "downloads": "다운로드", + "search_results": "검색 결과", + "settings": "설정" + }, + "bottom_panel": { + "no_downloads_in_progress": "진행중인 다운로드 없음", + "downloading_metadata": "{{title}}의 메타데이터를 다운로드 중…", + "checking_files": "{{title}}의 파일들을 검사 중… ({{percentage}} 완료)", + "downloading": "{{title}}의 파일들을 다운로드 중… ({{percentage}} 완료) - 완료까지 {{eta}} - {{speed}}" + }, + "catalogue": { + "next_page": "다음 페이지", + "previous_page": "이전 페이지" + }, + "game_details": { + "open_download_options": "다운로드 선택지 열기", + "download_options_zero": "다운로드 선택지 없음", + "download_options_one": "{{count}}개의 다운로드 선택지가 존재함", + "download_options_other": "{{count}}개의 다운로드 선택지들이 존재함", + "updated_at": "{{updated_at}}에 업데이트 됨", + "install": "설치", + "resume": "재개", + "pause": "일시 정지", + "cancel": "취소", + "remove": "제거", + "remove_from_list": "목록에서 제거", + "space_left_on_disk": "여유 저장 용량 {{space}} 남음", + "eta": "왼료까지 {{eta}}", + "downloading_metadata": "메타데이터 다운로드 중…", + "checking_files": "파일 검사 중…", + "filter": "리팩들을 다음과 같이 걸러내기", + "requirements": "시스템 사양", + "minimum": "최저 사양", + "recommended": "권장 사양", + "no_minimum_requirements": "{{title}}의 최저 사양을 제공받지 못 함", + "no_recommended_requirements": "{{title}}의 권장 사양을 제공받지 못 함", + "paused_progress": "{{progress}} (일시 정지)", + "release_date": "{{date}}에 발매됨", + "publisher": "{{publisher}} 배급", + "copy_link_to_clipboard": "링크 복사하기", + "copied_link_to_clipboard": "링크 복사됨", + "hours": "시", + "minutes": "분", + "amount_hours": "{{amount}} 시간", + "amount_minutes": "{{amount}} 분", + "accuracy": "정확도 {{accuracy}}%", + "add_to_library": "라이브러리에 추가", + "remove_from_library": "라이브러리에서 제거", + "no_downloads": "가능한 다운로드 없음", + "play_time": "{{amount}}동안 플레이 함", + "last_time_played": "마지막 플레이 날짜 {{period}}", + "not_played_yet": "{{title}}의 플레이 기록 아직 없음", + "next_suggestion": "다음 추천", + "play": "실행", + "deleting": "인스톨러 삭제 중…", + "close": "닫기", + "playing_now": "현재 플레이 중", + "change": "바꾸기", + "repacks_modal_description": "다운로드 할 리팩을 선택해 주세요", + "downloads_path": "다운로드 경로", + "select_folder_hint": "기본 폴더를 바꾸려면 <0>설정으로 가세요", + "download_now": "지금 다운로드", + "installation_instructions": "설치 방법", + "installation_instructions_description": "이 게임을 설치하기 위해서는 추가적인 단계가 필요합니다", + "online_fix_instruction": "OnlineFix 게임들은 추출 시 암호가 필요합니다. 비밀번호를 물을 때 다음을 암호로 사용하기:", + "dodi_installation_instruction": "DODI 인스톨러를 열었다면 키보드의 위 방향키를 눌러 설치를 시작하세요:", + "dont_show_it_again": "다시 보지 않기", + "copy_to_clipboard": "복사하기", + "copied_to_clipboard": "복사됨", + "got_it": "알았습니다" + }, + "activation": { + "title": "Hydra 실행", + "installation_id": "설치 ID:", + "enter_activation_code": "활성 코드를 입력하세요", + "message": "이것을 어디에서 구해야 할 지 모르겠다면 애초에 갖고 있으면 안 됩니다.", + "activate": "활성화", + "loading": "불러오는중..." + }, + "downloads": { + "resume": "재개", + "pause": "일시 정지", + "eta": "완료까지 {{eta}}", + "paused": "일시 정지됨", + "verifying": "검증중…", + "completed_at": "{{date}}에 완료됨", + "completed": "완료됨", + "cancelled": "취소됨", + "download_again": "다시 다운로드 하기", + "cancel": "취소", + "filter": "다운로드 된 게임들을 정렬하기", + "remove": "제거하기", + "downloading_metadata": "메타데이터 다운로드 중…", + "checking_files": "파일 검사 중…", + "starting_download": "다운로드 개시 중…", + "deleting": "인스톨러 삭제 중…", + "delete": "인스톨러 삭제하기", + "remove_from_list": "제거하기", + "delete_modal_title": "정말로 하시겠습니까?", + "delete_modal_description": "이 기기의 모든 설치 파일들이 제거될 것입니다", + "install": "설치", + "real_debrid": "Real Debrid", + "torrent": "Torrent" + }, + "settings": { + "downloads_path": "다운로드 경로", + "change": "업데이트", + "notifications": "알림", + "enable_download_notifications": "다운로드가 완료되었을 때", + "enable_repack_list_notifications": "새 리팩이 추가되었을 때", + "telemetry": "자동 데이터 수집", + "telemetry_description": "익명 사용 통계를 활성화", + "real_debrid_api_token_description": "Real Debrid API 토큰", + "quit_app_instead_hiding": "작업 표시줄 트레이로 최소화하는 대신 Hydra를 종료", + "launch_with_system": "컴퓨터가 시작되었을 때 Hydra 실행", + "general": "일반", + "behavior": "행동", + "enable_real_debrid": "Real Debrid 활성화", + "real_debrid": "Real Debrid", + "real_debrid_api_token_hint": "API 키를 <0>이곳에서 얻으세요.", + "save_changes": "변경 사항 저장" + }, + "notifications": { + "download_complete": "다운로드 완료", + "game_ready_to_install": "이제 {{title}} 설치할 수 있습니다", + "repack_list_updated": "리팩 목록 갱신됨", + "repack_count_one": "{{count}}개의 리팩이 추가됨", + "repack_count_other": "{{count}}개의 리팩들이 추가됨" + }, + "system_tray": { + "open": "Hydra 열기", + "quit": "닫기" + }, + "game_card": { + "no_downloads": "가능한 다운로드 없음" + }, + "binary_not_found_modal": { + "title": "프로그램이 설치되지 않음", + "description": "Wine 또는 Lutris 실행 파일이 시스템에서 발견되지 않았습니다", + "instructions": "게임이 정상적으로 실행될 수 있게 당신의 리눅스 배포판에 Wine 또는 Lutris를 올바르게 설치해 주세요" + }, + "modal": { + "close": "닫기 버튼" + } +} diff --git a/src/main/services/downloaders/torrent.downloader.ts b/src/main/services/downloaders/torrent.downloader.ts index 0590f6bf..9476711b 100644 --- a/src/main/services/downloaders/torrent.downloader.ts +++ b/src/main/services/downloaders/torrent.downloader.ts @@ -124,21 +124,20 @@ export class TorrentDownloader extends Downloader { stdio: "inherit", windowsHide: true, }); - return; + } else { + const scriptPath = path.join( + __dirname, + "..", + "..", + "torrent-client", + "main.py" + ); + + cp.spawn("python3", [scriptPath, ...commonArgs], { + stdio: "inherit", + }); } - const scriptPath = path.join( - __dirname, - "..", - "..", - "torrent-client", - "main.py" - ); - - cp.spawn("python3", [scriptPath, ...commonArgs], { - stdio: "inherit", - }); - Promise.all([writePipe.createPipe(), readPipe.createPipe()]).then( async () => { this.attachListener(); diff --git a/src/main/services/steam-grid.ts b/src/main/services/steam-grid.ts index 9cb51d73..d5519342 100644 --- a/src/main/services/steam-grid.ts +++ b/src/main/services/steam-grid.ts @@ -29,7 +29,7 @@ export const getSteamGridData = async ( const searchParams = new URLSearchParams(params); if (!import.meta.env.MAIN_VITE_STEAMGRIDDB_API_KEY) { - throw new Error("STEAMGRIDDB_API_KEY is not set"); + throw new Error("MAIN_VITE_STEAMGRIDDB_API_KEY is not set"); } const response = await axios.get( diff --git a/src/renderer/src/pages/settings/settings-general.tsx b/src/renderer/src/pages/settings/settings-general.tsx index e9b680c8..434093d3 100644 --- a/src/renderer/src/pages/settings/settings-general.tsx +++ b/src/renderer/src/pages/settings/settings-general.tsx @@ -45,6 +45,11 @@ export function SettingsGeneral({ const { t } = useTranslation("settings"); + const handleChange = (values: Partial) => { + setForm((prev) => ({ ...prev, ...values })); + updateUserPreferences(values); + }; + const handleChooseDownloadsPath = async () => { const { filePaths } = await window.electron.showOpenDialog({ defaultPath: form.downloadsPath, @@ -53,15 +58,11 @@ export function SettingsGeneral({ if (filePaths && filePaths.length > 0) { const path = filePaths[0]; + handleChange({ downloadsPath: path }); updateUserPreferences({ downloadsPath: path }); } }; - const handleChange = (values: Partial) => { - setForm((prev) => ({ ...prev, ...values })); - updateUserPreferences(values); - }; - return ( <>