Compare commits

...

457 Commits

Author SHA1 Message Date
Chubby Granny Chaser
ff91284a91 chore: fix version
Some checks are pending
Release / build (ubuntu-latest) (push) Waiting to run
Release / build (windows-latest) (push) Waiting to run
2024-09-15 03:46:38 +01:00
Chubby Granny Chaser
b4f99418e9 chore: changing auth url 2024-09-15 03:39:13 +01:00
Zamitto
3d132de860 Merge pull request #950 from hydralauncher/feature/profile-redesign
Feature/profile redesign
2024-09-14 17:57:41 -03:00
Zamitto
8af91c1375 fix: adjust string 2024-09-14 17:56:07 -03:00
Zamitto
449ca2adc3 fix: text wrap game running 2024-09-14 17:47:42 -03:00
Chubby Granny Chaser
1ef7e58bb5 fix: adding translations for spanish 2024-09-14 21:41:52 +01:00
Chubby Granny Chaser
5757ec8b40 Merge branch 'feature/profile-redesign' of github.com:hydralauncher/hydra into feature/profile-redesign 2024-09-14 21:41:00 +01:00
Chubby Granny Chaser
aa8b685108 fix: adding translations for spanish 2024-09-14 21:40:34 +01:00
Zamitto
09b0bfe832 Merge pull request #954 from Lianela/main
typing and error added - es translation
2024-09-14 17:05:13 -03:00
Zamitto
d92a9ab410 Merge pull request #960 from hydralauncher/feat/message-warning-hydra-close
feat: message warning hydra closing while downloading
2024-09-14 17:01:01 -03:00
Chubby Granny Chaser
5432ef311a Merge branch 'feature/profile-redesign' of github.com:hydralauncher/hydra into feature/profile-redesign 2024-09-14 21:00:02 +01:00
Chubby Granny Chaser
9621702e19 feat: adding user report 2024-09-14 20:58:12 +01:00
Zamitto
19cb7c0627 feat: comment HLTB 2024-09-14 16:57:39 -03:00
Chubby Granny Chaser
91cfb42ff5 feat: adding user report 2024-09-14 20:56:32 +01:00
Chubby Granny Chaser
06d5ed4491 feat: adding user report 2024-09-14 20:56:20 +01:00
Chubby Granny Chaser
8799378bf2 feat: adding user report 2024-09-14 20:55:00 +01:00
Zamitto
b0876b93ed feat: message warning hydra close 2024-09-14 16:51:09 -03:00
Zamitto
f2211ec6ce Merge pull request #959 from hydralauncher/feat/executable-and-play-button
feat: executable and play button
2024-09-14 15:42:04 -03:00
Zamitto
e3fa401667 feat: show download button if game has no executable selected 2024-09-14 15:32:27 -03:00
Zamitto
939133fcc3 feat: block executable 1:N game 2024-09-14 15:29:52 -03:00
Chubby Granny Chaser
fcc24d6b94 fix: best grid constraint 2024-09-14 18:16:07 +01:00
Chubby Granny Chaser
00528b6ca1 Merge branch 'feature/profile-redesign' of github.com:hydralauncher/hydra into feature/profile-redesign 2024-09-14 18:11:52 +01:00
Chubby Granny Chaser
806b086c7f feat: fixing download error for gofile 2024-09-14 18:11:23 +01:00
Chubby Granny Chaser
268ac3d5a4 feat: fixing download error for gofile 2024-09-14 18:10:38 +01:00
Chubby Granny Chaser
b122489b34 feat: fixing download error for gofile 2024-09-14 18:10:02 +01:00
Zamitto
8037101a2b Merge pull request #958 from hydralauncher/fix/ensure-i18n-matches-language-in-db
fix: ensure renderer i18n matches db language
2024-09-14 13:58:59 -03:00
Zamitto
15e86338d9 feat: add game logo back again 2024-09-14 13:21:32 -03:00
Zamitto
92e43b90a2 feat: add game logo back again 2024-09-14 13:16:31 -03:00
Zamitto
378ad74b43 fix: ensure renderer i18n matches db language 2024-09-14 12:32:04 -03:00
Chubby Granny Chaser
702b141f7b Merge branch 'feature/profile-redesign' of github.com:hydralauncher/hydra into feature/profile-redesign 2024-09-14 02:34:33 +01:00
Zamitto
dbb7cac308 Merge pull request #956 from hydralauncher/fix/language
fix: languages
2024-09-13 22:34:14 -03:00
Chubby Granny Chaser
14b204b1c3 Merge branch 'feature/profile-redesign' of github.com:hydralauncher/hydra into feature/profile-redesign 2024-09-14 02:33:40 +01:00
Zamitto
88a94bbb82 fix: languages 2024-09-13 22:32:51 -03:00
Chubby Granny Chaser
d15ca88714 fix: using local state for game running 2024-09-14 02:27:58 +01:00
Zamitto
f21c6848c6 Merge pull request #955 from hydralauncher/feat/accumulate-ticks-when-update-playtime-fails
feat: accumulate ticks when update playtime fails
2024-09-13 22:15:55 -03:00
Zamitto
608a53e8df feat: accumulate ticks when request to update playtime fails 2024-09-13 21:02:59 -03:00
Zamitto
f439b6809c feat: add needsAuth: false to /games/download 2024-09-13 20:30:54 -03:00
Chubby Granny Chaser
7846ecbd4f Merge pull request #953 from hydralauncher/fix/add-language-migration
feat: add language migration
2024-09-14 00:19:38 +01:00
Chubby Granny Chaser
6368bd66d3 feat: adding image processing 2024-09-14 00:10:12 +01:00
Chubby Granny Chaser
6e543fecb4 feat: adding image processing 2024-09-14 00:09:34 +01:00
Lianela
3d5b41821c typing and error added 2024-09-13 17:00:24 -06:00
Chubby Granny Chaser
2b2b5afd79 feat: moving visibility update to settings 2024-09-13 23:56:27 +01:00
Zamitto
2ea6285744 feat: add language migration 2024-09-13 19:45:37 -03:00
Zamitto
863a3b7d1f Merge pull request #952 from hydralauncher/feat/process-profile-image
Some checks are pending
Release / build (ubuntu-latest) (push) Waiting to run
Release / build (windows-latest) (push) Waiting to run
feat: process profile image
2024-09-13 17:32:35 -03:00
Zamitto
a03ac26b80 feat: add error toast 2024-09-13 17:30:18 -03:00
Zamitto
e8515e1990 feat: process profile image 2024-09-13 17:25:33 -03:00
Zamitto
797a09f583 feat: process profile image 2024-09-13 17:18:03 -03:00
Zamitto
a295003ad4 Merge pull request #951 from hydralauncher/fix/knex-not-creating-database-directory
Some checks are pending
Release / build (ubuntu-latest) (push) Waiting to run
Release / build (windows-latest) (push) Waiting to run
fix: ensure database directory exists before running knex
2024-09-13 11:43:40 -03:00
Zamitto
123812ad81 fix: ensure database directory exists before running knex 2024-09-13 10:52:48 -03:00
Chubby Granny Chaser
383578bca2 chore: sync with main 2024-09-13 01:04:38 +01:00
Chubby Granny Chaser
02ca506079 Merge pull request #949 from hydralauncher/feat/get-trending-games-from-api
Some checks are pending
Release / build (ubuntu-latest) (push) Waiting to run
Release / build (windows-latest) (push) Waiting to run
feat: get trending games from api
2024-09-13 01:02:17 +01:00
Chubby Granny Chaser
d9a7672113 feat: profile redesign 2024-09-13 01:02:01 +01:00
Zamitto
b0bc754ffc feat: catch error 2024-09-12 20:56:10 -03:00
Zamitto
813a46bf3e feat: refactor 2024-09-12 20:52:54 -03:00
Zamitto
3199e56661 feat: get trending games from api 2024-09-12 20:50:40 -03:00
Chubby Granny Chaser
8f0003298f Merge branch 'main' of github.com:hydralauncher/hydra 2024-09-13 00:04:07 +01:00
Chubby Granny Chaser
2304e19558 feat: returning with edit profile modal 2024-09-13 00:03:58 +01:00
Zamitto
87cacdf16c Merge pull request #948 from hydralauncher/feat/search-games-from-api
feat: search games from api
2024-09-12 19:57:53 -03:00
Zamitto
ad3c2df024 feat: refactor 2024-09-12 19:42:44 -03:00
Zamitto
b0164b6948 feat: simplify conditional 2024-09-12 13:15:24 -03:00
Zamitto
0fce444df8 feat: abort controller and i18n 2024-09-12 13:12:42 -03:00
Zamitto
5c363810c8 feat: search updates 2024-09-12 12:43:55 -03:00
Zamitto
b8c8e534b4 feat: refactor 2024-09-12 11:35:14 -03:00
Zamitto
2e82c29f4c feat: searching from api 2024-09-12 11:12:52 -03:00
Zamitto
262e95e4db Merge pull request #939 from GearCzech/main
Some checks are pending
Release / build (ubuntu-latest) (push) Waiting to run
Release / build (windows-latest) (push) Waiting to run
Czech translation
2024-09-12 01:19:39 -03:00
Chubby Granny Chaser
ada7b452a0 feat: initial profile refactor 2024-09-12 00:53:16 +01:00
Gear
4da116150f little polishing changes 2024-09-10 23:05:15 +02:00
Gear
d2c7780b13 translation fix 2024-09-10 16:49:34 +02:00
Gear
43ca4764bb fixed prettier error 2024-09-10 16:03:57 +02:00
Gear
53e5124521 Added czech readme 2024-09-10 15:56:11 +02:00
Gear
83cba67c24 added empty space 2024-09-10 11:15:44 +02:00
Gear
ba3001bc88 Added czech translation to index.ts 2024-09-10 11:09:29 +02:00
Gear
6caa9825bd Czech translation
Adds czech translation
2024-09-10 10:48:08 +02:00
Zamitto
59fd5f0347 Merge pull request #929 from thaleseuflauzino/main
Some checks failed
Release / build (ubuntu-latest) (push) Has been cancelled
Release / build (windows-latest) (push) Has been cancelled
Add italian README and patterns of README translations (and solve #471)
2024-09-10 00:12:16 -03:00
Thales Euflauzino
69c39fe6c4 fix: spaces after "[" 2024-09-09 20:57:44 -03:00
Thales Euflauzino
46ee202b7c fix: spaces after "[" 2024-09-09 20:57:21 -03:00
Thales Euflauzino
57a43c6358 fix: spaces after "[" 2024-09-09 20:57:01 -03:00
Thales Euflauzino
c311cc3fb6 fix: spaces after "[" 2024-09-09 20:56:12 -03:00
Thales Euflauzino
f6f304ef6f fix: spaces after "[" 2024-09-09 20:55:48 -03:00
Thales Euflauzino
ffdbf755f9 fix: spaces after "[" 2024-09-09 20:55:22 -03:00
Thales Euflauzino
ae9111975b fix: spaces after "[" 2024-09-09 20:54:00 -03:00
Thales Euflauzino
692e38cd7e fix: spaces after "[" 2024-09-09 20:53:16 -03:00
Thales Euflauzino
5733f8ae6b Merge branch 'main' into main 2024-09-09 20:44:55 -03:00
Thales Euflauzino
4dd80bfc6b 📚 docs: update readme's 2024-09-09 20:40:16 -03:00
Zamitto
68051c76af Merge pull request #936 from Squomsh/german-translations
Some checks are pending
Release / build (ubuntu-latest) (push) Waiting to run
Release / build (windows-latest) (push) Waiting to run
feat: Locale - Add German translations
2024-09-09 20:03:06 -03:00
Squomsh (Squomsh (Squomsh))
0a3921bacf Merge branch 'hydralauncher:main' into german-translations 2024-09-09 19:43:27 +00:00
Squomsh
7e848a1869 feat: added German localisation
added translation entry src/locales/index.ts; added translation src/locales/de/translation.json
2024-09-09 21:39:28 +02:00
Squomsh
5b7c9bf9c1 feat: added links to German README 2024-09-09 18:03:33 +02:00
Squomsh
cc7738cf1b feat: translation - added German README 2024-09-09 18:02:08 +02:00
Zamitto
276a6d5c65 Merge branch 'main' into main 2024-09-09 12:51:47 -03:00
Zamitto
5b7bdbf4e7 Merge pull request #932 from Lianela/main
undo friendship string added
2024-09-09 12:48:09 -03:00
Lianela
1aa741f661 fixed mistake 2024-09-08 20:47:55 -06:00
Lianela
b87f1c1248 fixed mistake 2024-09-08 20:47:02 -06:00
Lianela
5e5585e7eb Merge branch 'hydralauncher:main' into main 2024-09-08 20:44:53 -06:00
Zamitto
07913713fc Merge pull request #823 from damnkrat/main
Support building for arch based distributions
2024-09-08 22:32:39 -03:00
Zamitto
1b9f763012 Merge branch 'main' into main 2024-09-08 22:22:39 -03:00
Zamitto
ebb17ea829 Merge pull request #930 from hydralauncher/feat/refactor-languages
feat: refactor languages
2024-09-08 22:21:01 -03:00
Lianela
987cd2bf99 undo friendship string added 2024-09-07 00:32:12 -06:00
Zamitto
dc4aa0f608 feat: remove dev db 2024-09-05 21:06:49 -03:00
Zamitto
40f4bbc124 feat: refactor languages 2024-09-04 23:43:52 -03:00
Thales Euflauzino
5c5c9faf00 📚 docs: add patterns of translations 2024-09-04 17:16:17 -03:00
Thales Euflauzino
a05cd87542 📚 docs: add patterns of translations 2024-09-04 17:16:11 -03:00
Thales Euflauzino
6e60ab3c90 📚 docs: add patterns of translations 2024-09-04 17:16:04 -03:00
Thales Euflauzino
0617dfbb62 📚 docs: add patterns of translations 2024-09-04 17:15:56 -03:00
Thales Euflauzino
26f1839752 📚 docs: add patterns of translations 2024-09-04 17:15:44 -03:00
Thales Euflauzino
0abdeca93a 📚 docs: add patterns of translations 2024-09-04 17:15:38 -03:00
Thales Euflauzino
8c874fc5a1 📚 docs: add patterns of translations 2024-09-04 17:15:31 -03:00
Thales Euflauzino
da0894e2b8 📚 docs: add patterns of translations 2024-09-04 17:15:23 -03:00
Thales Euflauzino
8f9eec124d 📚 docs: add text of italian readme 2024-09-04 17:12:58 -03:00
Thales Euflauzino
44dab630f1 📚 docs: create italian README 2024-09-04 17:08:46 -03:00
Zamitto
02907d84e1 Merge pull request #918 from thaleseuflauzino/main
Adding translation for Portuguese-Portugal and Portuguese-Brazil
2024-09-04 16:59:54 -03:00
Zamitto
6464cea576 Delete src/locales/br/translation.json 2024-09-04 16:40:31 -03:00
Thales Euflauzino
74d3aa10cb Merge branch 'main' of https://github.com/hydralauncher/hydra 2024-09-02 13:27:08 -03:00
Zamitto
6273ca1376 Merge pull request #920 from thaleseuflauzino/patch-4
docs: Create SECURITY.md
2024-09-02 13:22:46 -03:00
Zamitto
453378020b Merge branch 'main' into patch-4 2024-09-02 13:11:38 -03:00
Zamitto
ff43f827b9 Merge pull request #903 from hydralauncher/feat/remove-synchronize-typeorm
feat: use knex migrations
2024-09-02 13:09:38 -03:00
Zamitto
6b3d3c8f5b Merge branch 'main' into feat/remove-synchronize-typeorm 2024-09-02 12:58:08 -03:00
Zamitto
2dcfccedce Merge pull request #917 from hydralauncher/feat/add-undo-friendship-confirm-modal
feat: add undo friendship confirm modal and fixes text overflows
2024-09-02 12:57:49 -03:00
Zamitto
88737cf80d feat: refactor knex promises 2024-09-02 12:54:55 -03:00
Zamitto
158b878883 feat: catch hltb error 2024-08-31 14:31:18 -03:00
Zamitto
567d9f540d feat: refactor 2024-08-30 14:13:10 -03:00
Zamitto
7659c9094b Merge branch 'main' into feat/add-undo-friendship-confirm-modal 2024-08-30 10:15:31 -03:00
Zamitto
d4d94dfc4c feat: use function expression for component 2024-08-30 10:13:18 -03:00
Zamitto
40d2b36a20 feat: remove unnecessary react fragment 2024-08-30 10:06:10 -03:00
Thales Euflauzino
70f120a62c delete: removing unused translation json 2024-08-28 04:42:10 -03:00
Thales Euflauzino
f4cf33d369 feat: add a new library in setting general 2024-08-27 14:41:24 -03:00
Thales Euflauzino
15c21164e4 chore: updating translation location 2024-08-27 14:40:16 -03:00
Thales Euflauzino
dab12cb316 feat: add a new library for support differents type of "PT" translation 2024-08-27 14:40:01 -03:00
Thales Euflauzino
d2d00516a8 chore: updating translation location 2024-08-27 14:38:07 -03:00
Thales Euflauzino
f2c4598351 chore: update suggestion translation
Co-authored-by: Agnaldo Junior <agnaldo.junior01@gmail.com>
2024-08-27 14:34:31 -03:00
Thales Euflauzino
9e6484ad11 chore: update suggestion translation
Co-authored-by: Agnaldo Junior <agnaldo.junior01@gmail.com>
2024-08-27 14:34:27 -03:00
Thales Euflauzino
629f204714 chore: update suggestion translation
Co-authored-by: Agnaldo Junior <agnaldo.junior01@gmail.com>
2024-08-27 14:34:21 -03:00
Thales Euflauzino
7c08668a03 chore: update suggestion translation
Co-authored-by: Agnaldo Junior <agnaldo.junior01@gmail.com>
2024-08-27 14:34:14 -03:00
Thales Euflauzino
563e56e54d chore: update suggestion translation
Co-authored-by: Agnaldo Junior <agnaldo.junior01@gmail.com>
2024-08-27 14:34:04 -03:00
Thales Euflauzino
e4917c1a07 docs: Create SECURITY.md 2024-08-27 03:01:10 -03:00
Thales Euflauzino
a809c84151 fix: run prettier 2024-08-27 02:58:00 -03:00
Thales Euflauzino
f4e4f7a61c fix: error in index.ts, was ptbr 2024-08-27 02:45:38 -03:00
Thales Euflauzino
5b493d8050 fix: change name "ptbr" to "br" for prettier 2024-08-27 02:43:12 -03:00
Thales Euflauzino
e6f296aba3 fix: gap between lines and missing "," 2024-08-27 02:36:27 -03:00
Thales Euflauzino
0b54a33084 chore: Update index.ts 2024-08-27 02:31:39 -03:00
Thales Euflauzino
75bc386048 feat: add pt(portugal) translate 2024-08-27 02:29:51 -03:00
Thales Euflauzino
7867b7c838 chore: add ptbr translate 2024-08-27 02:00:15 -03:00
Thales Euflauzino
84c6951d30 chore: rename pt to ptbr to add portugal language to hydra 2024-08-27 01:59:41 -03:00
Zamitto
89399a6da4 feat: write migrations 2024-08-26 16:36:01 -03:00
Zamitto
cc10186ec3 feat: add trycatch for handleDeepLinkPath 2024-08-26 15:24:32 -03:00
Zamitto
c553697df9 Update bug_report.yml 2024-08-26 15:16:48 -03:00
Zamitto
0bedb7c9b7 fix: header overflow text 2024-08-26 14:14:51 -03:00
Zamitto
3293320926 fix: sidebar profile layout 2024-08-26 13:21:21 -03:00
Zamitto
9e02504e14 fix: profile display name 2024-08-26 12:45:52 -03:00
Zamitto
fb60c91c83 feat: add undo friendship confirm modal 2024-08-26 12:23:32 -03:00
Zamitto
a608e11be2 Merge pull request #915 from Lianela/main
removed strings / added new translations (es)
2024-08-25 23:01:59 -03:00
Zamitto
c0babcfdca Merge branch 'main' into main 2024-08-25 20:42:22 -03:00
Zamitto
31adb77d9e Merge pull request #907 from xxDRV/patch-12
Updated RU to fit new features
2024-08-25 20:38:28 -03:00
Zamitto
c6e313f5ad Merge branch 'main' into main 2024-08-25 20:37:49 -03:00
Lianela
f9979a38da removed strings / added new translations (es) 2024-08-25 16:58:48 -06:00
Zamitto
5fcca9888d Revert "feat: write migrations"
This reverts commit 81aa25fa52.
2024-08-23 00:07:50 -03:00
Zamitto
81aa25fa52 feat: write migrations 2024-08-22 23:56:46 -03:00
Antecess
1542b346af Updated RU to fit new features 2024-08-23 01:22:28 +05:00
Zamitto
52069f7036 feat: set typeorm synchrozine to false 2024-08-20 21:27:34 -03:00
Zamitto
cc9d254a32 Merge pull request #902 from hydralauncher/feat/show-current-game-user-profile
feat: show current game user profile
2024-08-19 21:44:08 -03:00
Zamitto
54516c1a5a Merge branch 'main' into feat/show-current-game-user-profile 2024-08-19 21:36:15 -03:00
Zamitto
c72fa08d40 feat: undo api logs comment 2024-08-19 21:36:07 -03:00
Zamitto
7e7c4dae1d Merge pull request #837 from hydralauncher/feat/logs-python-process-errors
feat: logs python process
2024-08-19 21:35:14 -03:00
Zamitto
24689cad5a Merge branch 'main' into feat/logs-python-process-errors 2024-08-19 21:24:38 -03:00
Chubby Granny Chaser
aaf20b2aac Merge pull request #901 from hydralauncher/fix/http-downloads-duplicate
feat: reducing http downloads duplicate
2024-08-20 01:22:47 +01:00
Zamitto
ac6ff04e69 chore: lint warnings 2024-08-19 21:04:51 -03:00
Zamitto
bab041b5f7 feat: call update game endpoint on process watcher at each 120 ticks 2024-08-19 20:53:34 -03:00
Zamitto
856a4c706a feat: remove unused vars from ci 2024-08-19 20:30:51 -03:00
Zamitto
629b005ea4 feat: show current game on other users profile 2024-08-19 20:02:13 -03:00
Zamitto
bde396c7db feat: update endpoints 2024-08-19 19:55:40 -03:00
Zamitto
5369274c6e feat: remove synchronize true from typeorm 2024-08-19 12:42:50 -03:00
Zamitto
5101684154 feat: add property 2024-08-19 12:32:06 -03:00
Chubby Granny Chaser
c1bd1d30d7 feat: adding support to qiwi 2024-08-18 16:21:05 +01:00
Chubby Granny Chaser
6c24a523b7 feat: adding support to qiwi 2024-08-18 16:19:06 +01:00
Chubby Granny Chaser
76d3fead66 fix: adding default to uris 2024-08-18 03:38:12 +01:00
Chubby Granny Chaser
73a12488cd fix: adding default to uris 2024-08-18 03:06:35 +01:00
Chubby Granny Chaser
c76ef630e1 fix: removing menu 2024-08-18 02:45:05 +01:00
Chubby Granny Chaser
7a9247278d fix: removing menu 2024-08-18 02:31:20 +01:00
Chubby Granny Chaser
42ea35441c fix: showing multiple download options 2024-08-18 01:39:50 +01:00
Chubby Granny Chaser
c218070463 Merge branch 'fix/http-downloads-duplicate' of github.com:hydralauncher/hydra into fix/http-downloads-duplicate 2024-08-17 21:54:19 +01:00
Chubby Granny Chaser
dd7229dc59 feat: reducing http downloads duplicate 2024-08-17 21:51:03 +01:00
Chubby Granny Chaser
f7027f4319 Merge branch 'main' into fix/http-downloads-duplicate 2024-08-17 21:46:05 +01:00
Chubby Granny Chaser
bbe68a0aff feat: reducing http downloads duplicate 2024-08-17 21:43:56 +01:00
Chubby Granny Chaser
3a3b7b908c Merge pull request #887 from hydralauncher/hyd-332-friendsblocks-list-pagination-and-set-privacy-settings
set profile visibility and list blocked users
2024-08-17 05:12:06 +01:00
Zamitto
3febe9b418 feat: adjust edit profile modal 2024-08-16 16:18:45 -03:00
Zamitto
e31655a96e feat: infinite scroll block list 2024-08-16 15:56:03 -03:00
Zamitto
515a08a3a6 feat: infinite scroll friend list 2024-08-16 15:43:29 -03:00
Zamitto
b1e263814c feat: i18n toast friend code copied 2024-08-16 13:28:20 -03:00
Zamitto
f3276dd8fe feat: add texts for no invites, no friends and no blocks 2024-08-16 13:23:38 -03:00
Zamitto
d809317d62 Merge branch 'main' into hyd-332-friendsblocks-list-pagination-and-set-privacy-settings 2024-08-16 12:16:29 -03:00
Zamitto
5cb57bd5b3 feat: show friend code 2024-08-16 12:16:22 -03:00
Zamitto
b4c260233f chore: lint 2024-08-15 18:52:52 -03:00
Zamitto
d098887c51 Merge pull request #894 from Lianela/main
Update ES translation.json
2024-08-15 18:28:52 -03:00
Zamitto
baf4eafa68 Merge branch 'main' into main 2024-08-15 17:31:51 -03:00
Zamitto
a99058805b Merge branch 'main' into hyd-332-friendsblocks-list-pagination-and-set-privacy-settings
# Conflicts:
#	src/renderer/src/pages/user/user-content.tsx
2024-08-15 17:28:48 -03:00
Zamitto
80123d67e1 feat: adjust ui 2024-08-15 17:27:17 -03:00
Chubby Granny Chaser
c549d53492 Merge pull request #807 from hydralauncher/feature/adding-generic-http-downloads
feat: adding generic http downloads
2024-08-15 20:53:36 +01:00
Chubby Granny Chaser
68b361e605 feat: fixing real debrid download 2024-08-15 20:46:21 +01:00
Zamitto
fbe3c1973a feat: list blocked users 2024-08-14 19:46:01 -03:00
Zamitto
7e6b9ca825 feat: conditional to show user content section based on visibility 2024-08-14 19:13:44 -03:00
Zamitto
fffea84ef7 Merge branch 'main' into feature/adding-generic-http-downloads 2024-08-14 11:58:30 -03:00
Lianela
51e86819c1 Update ES translation.json 2024-08-11 15:29:05 -06:00
Zamitto
6806787ca0 feat: set profile visibility 2024-08-06 23:18:27 -03:00
Zamitto
1dcf746fa4 Merge branch 'main' into feat/logs-python-process-errors 2024-08-06 11:22:47 -03:00
Zamitto
42a78802a6 Merge pull request #885 from BayuWilanda4L/fix/videos-wont-load
fix: video won't load due to Content Security Policy restrictions
2024-08-06 09:42:01 -03:00
Bayu Wilanda
e44c15e9e1 fix: video won't load due to Content Security Policy restrictions 2024-08-06 11:11:05 +07:00
Zamitto
4a149aa62d feat: remove aria2 (again) 2024-08-05 20:47:37 -03:00
Zamitto
f3f78248ef fix: start another download after finishing one 2024-08-05 19:49:10 -03:00
Zamitto
4b7a0ff402 feat: setting folder name 2024-08-05 19:48:43 -03:00
Zamitto
4d60317475 fix: passing complete download path to setSavePath 2024-08-05 19:39:55 -03:00
Zamitto
19b1d29713 fix: reset downloadingGame and torrentId on cancelDownload 2024-08-05 19:15:46 -03:00
Zamitto
fab248de99 fix: duplicate download with real debrid 2024-08-05 18:55:35 -03:00
Zamitto
e1ef8a9193 feat: pass headers correctly to downloadURL 2024-08-05 15:21:05 -03:00
Zamitto
070340b34f Merge branch 'main' into feature/adding-generic-http-downloads 2024-08-05 11:35:31 -03:00
Zamitto
55635878a5 Merge pull request #875 from BayuWilanda4L/feature/translation-update
feat: improve Indonesian translations for better readability and naturalness
2024-08-05 11:20:04 -03:00
Zamitto
e851600814 Format id/translation.json 2024-08-05 11:07:44 -03:00
Zamitto
c1454bfbe9 Merge branch 'main' into feature/translation-update 2024-08-05 11:05:03 -03:00
Zamitto
f75378a271 Merge pull request #861 from aniol/patch-2
Update Catalan translation.json
2024-08-05 11:04:42 -03:00
Zamitto
77280788a7 Format ca/translation.json 2024-08-05 10:44:55 -03:00
Zamitto
49ed55abfc Merge branch 'main' into patch-2 2024-08-05 10:42:18 -03:00
Zamitto
78dfda0c93 Merge pull request #855 from hydralauncher/hyd-271-rework-the-profile-page-to-allow-other-users-to-see-your
feat: friends part 2
2024-08-05 10:41:41 -03:00
Chubby Granny Chaser
a6d291a741 Merge branch 'main' into hyd-271-rework-the-profile-page-to-allow-other-users-to-see-your 2024-08-05 13:39:36 +01:00
Bayu Wilanda
ba8201daba feat: improve Indonesian translations for better readability and naturalness 2024-08-03 09:50:22 +07:00
Zamitto
ae45547c17 Merge pull request #863 from Lianela/main
Friend strings translated (ES)
2024-08-02 22:44:46 -03:00
Zamitto
d9c140b2ab feat: implement undo friendship on friendlist modal 2024-07-30 16:42:48 -03:00
Zamitto
f631cd3013 feat: make getUserFriends throws exception 2024-07-30 15:55:51 -03:00
Zamitto
4dcd97bce8 feat: update return types 2024-07-30 15:15:50 -03:00
Zamitto
c38422f635 feat: add generic to HydraApi calls 2024-07-30 15:15:34 -03:00
Zamitto
d60242a62c feat: code review 2024-07-29 20:11:20 -03:00
Aniol
b188e93343 Update Catalan translation.json
Update Catalan translation.json.
2024-07-27 13:05:15 +02:00
Zamitto
c0198b49ef Merge branch 'main' into feature/adding-generic-http-downloads 2024-07-26 13:38:48 -03:00
Zamitto
10d7e0e8aa Merge branch 'main' into hyd-271-rework-the-profile-page-to-allow-other-users-to-see-your 2024-07-26 11:35:45 -03:00
Zamitto
15269f3908 feat: show confirm modal for block action 2024-07-26 11:30:01 -03:00
Zamitto
00c46bc981 feat: implement undo friendship 2024-07-25 23:03:11 -03:00
Zamitto
edf920fed3 feat: block and unblock events 2024-07-25 20:08:53 -03:00
Zamitto
304aa011ad feat: action buttons on user profile page 2024-07-25 19:27:03 -03:00
Zamitto
102299e42f feat: remove tab title 2024-07-25 19:12:34 -03:00
Zamitto
94bd691209 fet: show only received friends request on sidebar icon 2024-07-25 19:12:14 -03:00
Zamitto
abdc9f6e98 feat: show friends component 2024-07-23 21:24:27 -03:00
Zamitto
a196b91cb9 feat: pass userId to modal 2024-07-23 20:31:50 -03:00
Zamitto
010f07373d feat: add getUserFriends event 2024-07-23 18:37:19 -03:00
Zamitto
380143c780 feat: correctly get own friends 2024-07-23 15:30:04 -03:00
damnkrat
4d001cca36 Merge branch 'main' into main 2024-07-23 21:07:00 +03:00
Lianela
11c29355e3 Friend strings translated (ES) 2024-07-22 19:38:34 -06:00
Zamitto
e642bf71b1 feat: rename functions 2024-07-21 20:49:54 -03:00
Zamitto
6b8f2e6978 feat: add friends button on user profile 2024-07-21 20:07:15 -03:00
Zamitto
27610aa8cf fix: edit profile modal avatar 2024-07-21 17:00:36 -03:00
Zamitto
91862cd2fe Update README.md 2024-07-21 16:45:44 -03:00
Zamitto
d350aa950d feat: get friends event 2024-07-21 16:35:02 -03:00
Zamitto
909e288bec feat: background on profile page for other users profile 2024-07-21 15:45:31 -03:00
Zamitto
6c5d3793ae Merge pull request #838 from Ezequiel9898/patch-2
Update translation.json
2024-07-21 15:42:56 -03:00
Zamitto
43c5fdbab9 Merge branch 'main' into patch-2 2024-07-21 15:37:02 -03:00
Zamitto
3952f106fc Merge pull request #814 from hydralauncher/hyd-270-create-a-section-under-library-games-in-profile-page-for
feat: add friends
2024-07-20 19:11:39 -03:00
Zamitto
8a1931f75c feat: use new electron version to get download speed 2024-07-20 16:52:27 -03:00
Ezequiel Neri Ferreira
2e386528a4 update 2024-07-18 00:27:10 -03:00
Ezequiel Neri Ferreira
b6727be3cf update 2024-07-18 00:01:31 -03:00
Ezequiel Neri Ferreira
05f9703c25 Update translation.json 2024-07-17 23:06:29 -03:00
Zamitto
3d8c63bc40 feat: truncate game title on tray 2024-07-17 21:21:19 -03:00
Zamitto
8c0c3e617b feat: add logs for python process 2024-07-17 21:05:06 -03:00
Zamitto
929be48495 feat: remove nullables 2024-07-17 19:03:46 -03:00
Zamitto
8c67dda84e feat: refactor 2024-07-17 19:03:46 -03:00
Zamitto
6d277cd1d8 feat: adjust ui 2024-07-17 19:03:45 -03:00
Zamitto
d4902a5ab1 feat: use empty list 2024-07-17 19:03:45 -03:00
Zamitto
004ccd0db5 feat: add comment 2024-07-17 19:03:45 -03:00
Zamitto
e55dc20c7d feat: open modal in correct tab 2024-07-17 19:03:45 -03:00
Zamitto
7f3d7a56c3 feat: create tabs on user friend modal 2024-07-17 19:03:45 -03:00
Zamitto
d0406282ce feat: organize code 2024-07-17 19:03:44 -03:00
Zamitto
c6e99f8599 feat: update i18n and texts 2024-07-17 19:03:44 -03:00
Zamitto
5aec973882 feat: show friend request modal when click on sidebar 2024-07-17 19:03:44 -03:00
Zamitto
49fd34c3c0 feat: moving friends request button to sidebar 2024-07-17 19:03:44 -03:00
Zamitto
198a283752 feat: add logs 2024-07-17 19:03:43 -03:00
Zamitto
46b12f2bc2 simplify code 2024-07-17 19:03:43 -03:00
Zamitto
cb93fbcb72 feat: add buttons gap 2024-07-17 19:03:43 -03:00
Zamitto
22b66149b3 fix: buttons on friend request item 2024-07-17 19:03:43 -03:00
Zamitto
6f70b529a2 feat: refactor hydra api 2024-07-17 19:03:43 -03:00
Zamitto
a81b016500 feat: sending friend request 2024-07-17 19:03:42 -03:00
Zamitto
ef0699dbea feat: refactor friends requests 2024-07-17 19:03:42 -03:00
Zamitto
b3f87d5662 feat: get friends requests from api 2024-07-17 19:03:42 -03:00
Zamitto
6ff48605da feat: show friends from response 2024-07-17 19:03:42 -03:00
Zamitto
0f0a1e98a3 feat: ui adjustments 2024-07-17 19:03:41 -03:00
Zamitto
007da03837 feat: finish ui for modal showing pending requests 2024-07-17 19:03:41 -03:00
Zamitto
6cc8e8f5fe feat: pending requests on modal 2024-07-17 19:03:41 -03:00
Zamitto
6ccbff0160 feat: creating friends section 2024-07-17 19:03:41 -03:00
Zamitto
202f5b60de Merge pull request #800 from Ezequiel9898/patch-1
Update portuguese translation
2024-07-17 18:52:56 -03:00
Zamitto
b9558907ec Merge pull request #806 from Lianela/main
Improvements in ES translation
2024-07-17 18:50:01 -03:00
Lianela
8a01352eab updated es-translation.json
Reverted changes on accuracy
2024-07-17 12:56:24 -06:00
damnkrat
35879c7afe Merge branch 'main' into main 2024-07-16 16:38:37 +03:00
dannkunt
1366ca0087 Also build arch at release 2024-07-16 16:38:06 +03:00
Zamitto
e008478e53 Merge branch 'main' into main 2024-07-15 22:46:58 -03:00
Zamitto
6a195eb566 Merge pull request #832 from xxDRV/patch-11
Updated RU to fit new features
2024-07-15 22:44:57 -03:00
Zamitto
781e0f4102 feat: update headers 2024-07-15 22:29:34 -03:00
Zamitto
b5b7fe31ae use webContents.downloadURL to download http 2024-07-15 17:55:50 -03:00
Antecess
e2b089e0f8 Updated RU to fit new features 2024-07-15 13:47:09 +05:00
dannkunt
b5af73cec4 Do not install bsdtar on windows 2024-07-14 14:11:35 +03:00
dannkunt
d8e4eef107 Fix build workflows 2024-07-14 04:03:35 +03:00
damnkrat
2d09ea18a7 Support building for arch linux 2024-07-12 23:09:55 +03:00
Chubby Granny Chaser
6c6fff71fe feat: adding generic http downloads 2024-07-09 19:24:02 +01:00
Lianela
a9b92f3fc1 accuracy fixed 2024-07-09 10:35:19 -06:00
Ezequiel Neri Ferreira
6822ed8447 Update translation.json 2024-07-07 23:42:12 -03:00
Lianela
5683a0ba49 variation of one line
changed in a different variation a translation
2024-07-06 16:53:02 -06:00
Lianela
18488490c1 fixed some strings
changed some words and translations to a new one making some things easier to understand
2024-07-06 16:44:36 -06:00
Lianela
2ee3fdc223 updated es-translation.json
added new string
fixed one string
2024-07-05 12:40:16 -06:00
Chubby Granny Chaser
6fce60f9f7 ci: increasing version 2024-07-05 17:10:04 +01:00
Chubby Granny Chaser
c8aa9fd681 Merge branch 'main' of github.com:hydralauncher/hydra 2024-07-05 17:09:43 +01:00
Chubby Granny Chaser
0f12dfae88 ci: increasing version 2024-07-05 17:08:27 +01:00
Zamitto
be48306ca2 Merge pull request #768 from hydralauncher/hyd-229-improve-visibility-of-update-message
feat: add color to update icon and notify when update is ready to install
2024-07-05 12:45:53 -03:00
Zamitto
ab81e21341 feat: update font size 2024-07-05 12:38:53 -03:00
Zamitto
b7f94102da feat: add version string to notification 2024-07-05 12:30:34 -03:00
Zamitto
9e7b27afe6 feat: undo change 2024-07-05 12:22:13 -03:00
Zamitto
c24523e8e6 feat: update i18n 2024-07-05 12:18:37 -03:00
Zamitto
b58330ed35 feat: undo change 2024-07-05 12:13:47 -03:00
Zamitto
dde40f39e9 Merge branch 'main' into hyd-229-improve-visibility-of-update-message 2024-07-05 12:10:30 -03:00
Zamitto
d2b3017de9 feat: show notification only when update is ready to install 2024-07-05 12:10:19 -03:00
Chubby Granny Chaser
64f4dad7cc Merge pull request #783 from hydralauncher/fix/replacing-underscore-with-whitespace
feat: replacing underscore with whitespace
2024-07-05 16:04:49 +01:00
Chubby Granny Chaser
154d211b21 Merge branch 'main' into fix/replacing-underscore-with-whitespace 2024-07-05 15:54:42 +01:00
Chubby Granny Chaser
7905ef6c10 feat: replacing underscore with whitespace 2024-07-05 15:53:32 +01:00
Zamitto
b09f2c055f feat: creating notification for update available 2024-07-04 20:00:20 -03:00
Chubby Granny Chaser
2c5b3b4ffa Merge pull request #778 from hydralauncher/feature/adding-directors-cut-filter
Feature/adding directors cut filter
2024-07-04 23:41:07 +01:00
Chubby Granny Chaser
fdefc0c165 feat: adding directors cut filter 2024-07-04 23:14:09 +01:00
Chubby Granny Chaser
47ca2535e3 feat: adding directors cut filter 2024-07-04 23:12:20 +01:00
Chubby Granny Chaser
f706836a43 feat: adding directors cut filter 2024-07-04 23:11:21 +01:00
Chubby Granny Chaser
d8158bb80e Merge branch 'main' of github.com:hydralauncher/hydra into fix/adding-sorting-to-repacks-modal 2024-07-04 18:36:15 +01:00
Chubby Granny Chaser
4e422bdf91 feat: migrating download source validation to worker thread 2024-07-04 18:35:47 +01:00
Zamitto
4be3db8007 feat: add error logs 2024-07-03 18:03:11 -03:00
Zamitto
29b64237ed feat: remove old vbs file 2024-07-03 17:57:03 -03:00
Zamitto
d481164bf3 feat: add color to update icon and notify 2024-07-03 17:44:04 -03:00
Zamitto
138f33e0c3 Merge pull request #752 from hydralauncher/hyd-228-investigate-why-users-are-being-logged-out-when-updating
feat: prevent api calls when user is not logged in or auth is not loaded yet
2024-07-03 17:05:23 -03:00
Chubby Granny Chaser
be3c78f584 Merge branch 'main' into hyd-228-investigate-why-users-are-being-logged-out-when-updating 2024-07-03 20:52:44 +01:00
Chubby Granny Chaser
be1d9825d3 Merge pull request #755 from hydralauncher/feature/aria2-for-http-downloads
Feature/aria2 for http downloads
2024-07-03 20:52:34 +01:00
Zamitto
981116f221 Merge branch 'main' into hyd-228-investigate-why-users-are-being-logged-out-when-updating
# Conflicts:
#	src/main/events/user-preferences/auto-launch.ts
2024-07-03 16:32:25 -03:00
Chubby Granny Chaser
26aad178ee Merge branch 'main' into feature/aria2-for-http-downloads 2024-07-03 20:30:52 +01:00
Zamitto
56c8349899 Merge pull request #767 from hydralauncher/hyd-226-investigate-if-its-possible-to-use-psutil-to-list-processes
remove UAC; replace ps-list with psutil
2024-07-03 16:30:01 -03:00
Chubby Granny Chaser
0b2c407770 Merge branch 'main' into feature/aria2-for-http-downloads 2024-07-03 20:26:28 +01:00
Zamitto
d2e3d48ef8 Merge branch 'main' into hyd-226-investigate-if-its-possible-to-use-psutil-to-list-processes 2024-07-03 16:20:55 -03:00
Zamitto
153291f89f feat: apply suggestions 2024-07-03 16:10:23 -03:00
Zamitto
ae3daa4c79 fix: remove symbols from name before creating game shortcut 2024-07-03 15:52:25 -03:00
Zamitto
1397e3932d feat: remove pslist and use sudo-prompt to close game if needed 2024-07-03 15:31:56 -03:00
Zamitto
0f5db4f34e feat: crete kill-torrent 2024-07-03 12:06:26 -03:00
Zamitto
75c8f69e81 feat: get process list from rpc 2024-07-03 11:25:32 -03:00
Zamitto
aa253466a3 feat: refactor 2024-07-02 23:31:07 -03:00
Zamitto
b8bd786c45 feat: refactor 2024-07-02 15:42:23 -03:00
Zamitto
c9c585f820 Merge branch 'main' into hyd-228-investigate-why-users-are-being-logged-out-when-updating 2024-07-02 14:56:21 -03:00
Zamitto
9e11d6c098 feat: refactor hydra api 2024-07-02 14:56:01 -03:00
Zamitto
2f83c2c9da Merge pull request #739 from hydralauncher/fix/not-updating-i18n-in-main-process
fix: update i18n in updateUserPreferences and in hydra startup
2024-07-02 14:55:46 -03:00
Chubby Granny Chaser
dc94a886e6 fix: sorting repacks modal 2024-07-02 17:34:46 +01:00
Chubby Granny Chaser
7deabc4889 Merge branch 'main' into feature/aria2-for-http-downloads 2024-07-02 17:25:38 +01:00
Zamitto
e57200d024 Merge branch 'main' into fix/not-updating-i18n-in-main-process 2024-07-02 13:18:00 -03:00
Chubby Granny Chaser
7a13739d49 Merge pull request #747 from Carvalho286/main
Update translation.json
2024-07-02 17:16:51 +01:00
Chubby Granny Chaser
f8cbbc64f0 Merge branch 'feature/aria2-for-http-downloads' of github.com:hydralauncher/hydra into feature/aria2-for-http-downloads 2024-07-02 17:10:31 +01:00
Chubby Granny Chaser
9096eb5e0e fix: removing aria2 source folder 2024-07-02 17:10:04 +01:00
Chubby Granny Chaser
eebb5fec61 fix: removing aria2 source folder 2024-07-02 17:07:47 +01:00
Chubby Granny Chaser
88cfd0d095 Merge branch 'main' into feature/aria2-for-http-downloads 2024-07-02 17:06:58 +01:00
Chubby Granny Chaser
a43768ce67 feat: supporting queue using aria2 2024-07-02 17:06:30 +01:00
Chubby Granny Chaser
16a8c28935 feat: disabling bittorrent on aria2 2024-07-02 15:50:17 +01:00
Chubby Granny Chaser
1cc5a5b209 fix: adding real debrid real time tracking 2024-07-02 15:38:36 +01:00
Chubby Granny Chaser
a39082d326 feat: using aria2 for http downloads 2024-07-02 15:33:26 +01:00
Zamitto
0c1a75eedd poc: psutil for process watcher 2024-07-01 20:23:39 -03:00
Zamitto
dd23358a95 feat: prevent api calls when user is not logged in 2024-07-01 15:48:52 -03:00
Zamitto
8f00254dc2 Merge branch 'main' into fix/not-updating-i18n-in-main-process 2024-07-01 11:25:51 -03:00
Miguel Carvalho
449b34d3dd Update translation.json 2024-06-30 21:26:31 +01:00
Zamitto
9870213fff Merge pull request #732 from Lianela/main
Spanish translation little updates
2024-06-29 15:37:12 -03:00
Zamitto
de237b7c39 Merge branch 'main' into main 2024-06-29 14:47:18 -03:00
Zamitto
8a5d4e38b6 fix: update i18n in updateUserPreferences and in hydra startup 2024-06-29 14:34:30 -03:00
Zamitto
77152a32ab Merge pull request #736 from zxcsixx/patch-1
Update RU translation.json
2024-06-29 13:24:31 -03:00
Roman
c57c8dc477 Update RU translation.json
Fixed some mistakes
2024-06-29 17:39:05 +03:00
Lianela
455d80da3e Changed some strings
To make more friendly or better to understand some things, I change a few words
2024-06-29 01:10:56 -06:00
Lianela
d61c535c6f Fixed little typo
Nothing interesting, just a fix...
2024-06-29 01:03:00 -06:00
Lianela
23308a7780 added translation for file verification message 2024-06-29 01:01:29 -06:00
Chubby Granny Chaser
05ec01178b Merge pull request #722 from hydralauncher/rc/2.0.2
Rc/2.0.2
2024-06-28 22:15:40 +01:00
Chubby Granny Chaser
84e279cc14 Merge branch 'main' into rc/2.0.2 2024-06-28 22:08:25 +01:00
Chubby Granny Chaser
8eca067aed ci: fix sentry variable 2024-06-28 22:01:42 +01:00
Chubby Granny Chaser
05e4934f9f ci: fix sentry variable 2024-06-28 21:47:27 +01:00
Chubby Granny Chaser
ec0439e41b ci: fix sentry variable 2024-06-28 21:25:03 +01:00
Chubby Granny Chaser
b61fd1e61a Merge pull request #720 from hydralauncher/ci/sentry
ci: adding sentry
2024-06-28 20:55:42 +01:00
Zamitto
6d4f47df38 Merge pull request #566 from Panetina/romanian
Translated to romanian
2024-06-28 16:52:15 -03:00
Zamitto
0eaf629d37 Merge pull request #671 from CMAULTOP/main
Fix ru language
2024-06-28 16:50:45 -03:00
Zamitto
c12f16f59e Merge pull request #718 from hydralauncher/feat/better-api-logs-and-handle-401
feat: better api logs and handle 401
2024-06-28 16:42:42 -03:00
Chubby Granny Chaser
ac27438a35 ci: adding sentry 2024-06-28 20:27:22 +01:00
Zamitto
d3787b4525 feat: remove unused strings 2024-06-28 15:46:22 -03:00
Zamitto
ec8a0f75ac Merge branch 'main' into romanian 2024-06-28 15:42:50 -03:00
Zamitto
7e85ac5b43 feat: rename vbs file 2024-06-28 15:35:12 -03:00
Zamitto
a4644e7501 Update translation.json 2024-06-28 15:20:38 -03:00
Zamitto
ed978af3ae feat: disable old windows auto launch 2024-06-28 13:16:33 -03:00
Zamitto
4bd2174bf3 feat: handling 401 status code 2024-06-28 12:24:12 -03:00
Zamitto
c27182c618 feat: navigate back if request fails for get user 2024-06-28 12:23:46 -03:00
Zamitto
1ceabb00be feat: better logs on api error 2024-06-28 11:29:23 -03:00
Chubby Granny Chaser
2a44313d84 Merge pull request #706 from hydralauncher/feature/libtorrent-reloaded-remake-remaster
Feature/libtorrent reloaded remake remaster
2024-06-28 15:21:45 +01:00
Zamitto
e0dca85825 Merge pull request #709 from hydralauncher/hyd-192-select-lnk-as-parse-target-executable
feat: make it possible to select shortcuts (.lnk) on game executable
2024-06-28 11:16:47 -03:00
Zamitto
ec8ccf7728 Merge pull request #710 from hydralauncher/fix/window-auto-launch-on-startup
fix: windows auto launch on startup
2024-06-28 11:16:32 -03:00
Zamitto
e88088cca4 feat: add new line and rename script file to hydralauncher 2024-06-28 09:55:17 -03:00
Chubby Granny Chaser
75b69f38fc chore: removing extra line on main.py 2024-06-28 13:43:57 +01:00
Chubby Granny Chaser
50a1ba1dea feat: adding file verification message 2024-06-28 13:40:59 +01:00
Chubby Granny Chaser
2229151795 feat: splitting downloader.py 2024-06-28 12:20:09 +01:00
Chubby Granny Chaser
041fce027e feat: splitting downloader.py 2024-06-28 12:08:33 +01:00
Chubby Granny Chaser
1d5004ecb4 Merge branch 'main' into main 2024-06-28 12:04:39 +01:00
Chubby Granny Chaser
363bcf16a4 feat: adding authorization to rpc 2024-06-28 12:03:01 +01:00
Zamitto
b1532a52c8 feat: add script to resources 2024-06-27 19:40:53 -03:00
Zamitto
a3f7d3c59e fix: send signout event when auth token is empty 2024-06-27 19:05:08 -03:00
Zamitto
f1fecb684b feat: dont show auto launch on portable version 2024-06-27 19:00:12 -03:00
Zamitto
9c99e56b70 fix: add script to auto launch hydra on startup 2024-06-27 18:50:18 -03:00
Zamitto
7be626b3dd feat: make it possible to select shortcuts (.lnk) 2024-06-27 18:10:02 -03:00
Chubby Granny Chaser
96e96cd8aa feat: adding real debrid downloads 2024-06-27 22:05:50 +01:00
Chubby Granny Chaser
13644c60e8 feat: adding real debrid downloads 2024-06-27 21:52:04 +01:00
Chubby Granny Chaser
a1e41ea464 feat: adding file verification message 2024-06-27 19:59:33 +01:00
Chubby Granny Chaser
41dc504660 feat: adding initial torrent as arg command 2024-06-27 19:26:04 +01:00
Chubby Granny Chaser
a0cc15b5d8 feat: increasing healthcheck duration 2024-06-27 18:52:53 +01:00
Chubby Granny Chaser
7cd121cb80 feat: adding healthcheck 2024-06-27 18:46:59 +01:00
Chubby Granny Chaser
ccaea88a88 Merge branch 'feature/libtorrent-reloaded-remake-remaster' of github.com:hydralauncher/hydra into feature/libtorrent-reloaded-remake-remaster 2024-06-27 18:12:10 +01:00
Chubby Granny Chaser
d90888c7ba Merge branch 'main' into feature/libtorrent-reloaded-remake-remaster 2024-06-27 18:11:31 +01:00
Chubby Granny Chaser
9f9ea6ee88 fix: removing python tick 2024-06-27 18:10:30 +01:00
Chubby Granny Chaser
c26315219e fix: keeping last status available on rpc 2024-06-27 17:38:20 +01:00
Chubby Granny Chaser
c1c06c2d20 Merge branch 'feature/libtorrent-reloaded-remake-remaster' of github.com:hydralauncher/hydra into feature/libtorrent-reloaded-remake-remaster 2024-06-27 17:19:54 +01:00
Chubby Granny Chaser
328b7cb137 feat: using rpc to communicate 2024-06-27 17:18:48 +01:00
Zamitto
82f72071f9 Merge pull request #707 from hydralauncher/i18n/kazach-translation
feat: add Kazakh translation
2024-06-27 12:25:32 -03:00
Zamitto
d9ed2403ed feat: add kazach translation 2024-06-27 11:30:23 -03:00
Chubby Granny Chaser
d447942f84 Merge branch 'main' into feature/libtorrent-reloaded-remake-remaster 2024-06-27 15:23:48 +01:00
Chubby Granny Chaser
05cfdefc84 fix: fixing postinstall script 2024-06-27 15:21:16 +01:00
Zamitto
e4020d5b6a Merge pull request #605 from Ecron/lang-ca
Added Catalan translation.
2024-06-27 11:13:03 -03:00
Zamitto
1a047547fc feat: remove outdated strings 2024-06-27 11:02:29 -03:00
Chubby Granny Chaser
47ab35421c feat: adding libtorrent again 2024-06-27 14:57:25 +01:00
Chubby Granny Chaser
e08aa9c299 feat: adding libtorrent again 2024-06-27 14:56:57 +01:00
Chubby Granny Chaser
e44049ff63 feat: adding libtorrent again 2024-06-27 14:55:50 +01:00
Zamitto
7aa02f9d64 Merge branch 'main' into lang-ca 2024-06-27 10:55:02 -03:00
Zamitto
3fe6ab469b Fix some comma problems 2024-06-27 10:54:44 -03:00
Chubby Granny Chaser
ccd1d18981 feat: adding libtorrent again 2024-06-27 14:54:02 +01:00
Chubby Granny Chaser
906e801036 feat: adding libtorrent again 2024-06-27 14:52:53 +01:00
Chubby Granny Chaser
63c13e17cb feat: adding libtorrent again 2024-06-27 14:51:13 +01:00
Ecron
c1297530f6 Update translation.json
Added 2 new strings under header section.
2024-06-27 15:42:22 +02:00
Ecron
ac10e755b8 Update src/locales/ca/translation.json
Removed the splash section.
2024-06-27 15:41:10 +02:00
Ecron
1f17dda2f8 Update src/locales/ca/translation.json
Removed social networks.
2024-06-27 15:38:33 +02:00
Zamitto
94284a427f Merge pull request #677 from hydralauncher/fix/captcha-not-showing-on-linux
fix: set nodeIntegrationInSubFrames true on auth window
2024-06-25 10:04:10 -03:00
Павел
7fe8a6425b Update translation.json 2024-06-25 09:28:52 +03:00
Zamitto
2e1eb9e9b7 fix: set nodeIntegrationInSubFrames true on auth window 2024-06-24 23:36:55 -03:00
Zamitto
fe33045b9e Merge pull request #676 from hydralauncher/zamitto/hyd-22-define-the-cloudfront-url-on-the-csp
feat: add cloud front url to CSP
2024-06-24 21:16:57 -03:00
Zamitto
2020663ee5 feat: use wildcard on cloudfront url 2024-06-24 21:09:03 -03:00
Zamitto
2b51b82d03 feat: add cloud front to CSP 2024-06-24 21:02:13 -03:00
Павел
13b691aaad Update translation.json 2024-06-24 20:29:19 +03:00
Павел
e10f9f829c Update translation.json 2024-06-24 20:24:00 +03:00
Павел
936881e570 Update translation.json 2024-06-24 20:18:18 +03:00
Павел
0c826cb6f7 Update translation.json 2024-06-24 20:16:32 +03:00
Zamitto
2a27c37a25 Merge pull request #649 from 01M/patch-1
Update translation.json
2024-06-23 21:40:31 -03:00
Zamitto
3fd9776987 Merge branch 'main' into patch-1 2024-06-23 12:58:54 -03:00
Zamitto
e93b0a786e Merge pull request #638 from Lianela/main
Updated Spanish translation
2024-06-23 12:01:50 -03:00
01M
7a6d8ece63 Merge branch 'main' into patch-1 2024-06-23 17:55:20 +03:00
Zamitto
51c56f7536 Merge branch 'main' into main 2024-06-23 11:51:18 -03:00
Zamitto
87f5e7eb26 Merge pull request #642 from expload233/main
Update Chinese Translation for new version
2024-06-23 11:50:46 -03:00
01M
2a3fda90b3 Update translation.json
Fixed translation
2024-06-23 17:25:54 +03:00
expload
9d11cac680 add new translate text 2024-06-23 06:42:35 +00:00
expload
42209b51a6 Update Chinese translation text for new version 2024-06-23 06:41:11 +00:00
Lianela
170826ad5d Merge branch 'main' into main 2024-06-22 16:18:01 -06:00
Lianela
37eddbaeeb Updated Spanish translation
- Added and fixed some strings
- Fixed some typo errors
- Translated missing strings

(Had some troubles so I wasn't able to translated before)
2024-06-22 16:04:50 -06:00
Ecron
4744d1ed52 Update index.ts expoting Catalan language file 2024-06-20 17:09:36 +02:00
Ecron
3b40413257 Added Catalan translation.
Added Catalan translation.
2024-06-18 16:46:13 +02:00
Zamitto
42eff5e906 Merge branch 'main' into romanian 2024-06-12 13:35:41 -03:00
Zamitto
d29f266ca1 Merge branch 'main' into romanian 2024-06-10 13:04:01 -03:00
Panetina
42864a4bea Merge branch 'main' into romanian 2024-06-05 12:03:48 +03:00
Panetina
d70b46d475 Translated to romanian
Translated everything to romanian.
Discord: panyel if there are any issues
2024-06-04 15:20:52 +03:00
244 changed files with 11949 additions and 3992 deletions

View File

@@ -1,3 +1,4 @@
MAIN_VITE_STEAMGRIDDB_API_KEY=YOUR_API_KEY
MAIN_VITE_API_URL=API_URL
MAIN_VITE_SENTRY_DSN=YOUR_SENTRY_DSN
SENTRY_AUTH_TOKEN=

View File

@@ -2,3 +2,4 @@ node_modules
dist
out
.gitignore
migration.stub

View File

@@ -27,7 +27,7 @@ body:
label: Expected behavior
description: A clear and concise description of what you expected to happen.
validations:
required: true
required: false
- type: textarea
id: screenshots
attributes:
@@ -56,3 +56,12 @@ body:
description: Please provide any additional information and context about your problem.
validations:
required: false
- type: checkboxes
id: terms
attributes:
label: Before opening this Issue
options:
- label: I have searched the issues of this repository and believe that this is not a duplicate.
required: true
- label: I am aware that Hydra team does not offer any support or help regarding the downloaded games.
required: true

View File

@@ -22,22 +22,36 @@ jobs:
- name: Install dependencies
run: yarn
- name: Install Python
uses: actions/setup-python@v5
with:
python-version: 3.9
- name: Install dependencies
run: pip install -r requirements.txt
- name: Build with cx_Freeze
run: python torrent-client/setup.py build
- name: Build Linux
if: matrix.os == 'ubuntu-latest'
run: yarn build:linux
run: |
sudo apt-get update
sudo apt-get install -y libarchive-tools
yarn build:linux
env:
MAIN_VITE_ONLINEFIX_USERNAME: ${{ secrets.ONLINEFIX_USERNAME }}
MAIN_VITE_ONLINEFIX_PASSWORD: ${{ secrets.ONLINEFIX_PASSWORD }}
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build Windows
if: matrix.os == 'windows-latest'
run: yarn build:win
env:
MAIN_VITE_ONLINEFIX_USERNAME: ${{ secrets.ONLINEFIX_USERNAME }}
MAIN_VITE_ONLINEFIX_PASSWORD: ${{ secrets.ONLINEFIX_PASSWORD }}
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create artifact
@@ -54,3 +68,4 @@ jobs:
dist/*.tar.gz
dist/*.yml
dist/*.blockmap
dist/*.pacman

View File

@@ -1,6 +1,6 @@
name: Lint
on: [pull_request, push]
on: pull_request
jobs:
lint:

View File

@@ -24,22 +24,36 @@ jobs:
- name: Install dependencies
run: yarn
- name: Install Python
uses: actions/setup-python@v5
with:
python-version: 3.9
- name: Install dependencies
run: pip install -r requirements.txt
- name: Build with cx_Freeze
run: python torrent-client/setup.py build
- name: Build Linux
if: matrix.os == 'ubuntu-latest'
run: yarn build:linux
run: |
sudo apt-get update
sudo apt-get install -y libarchive-tools
yarn build:linux
env:
MAIN_VITE_ONLINEFIX_USERNAME: ${{ secrets.ONLINEFIX_USERNAME }}
MAIN_VITE_ONLINEFIX_PASSWORD: ${{ secrets.ONLINEFIX_PASSWORD }}
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build Windows
if: matrix.os == 'windows-latest'
run: yarn build:win
env:
MAIN_VITE_ONLINEFIX_USERNAME: ${{ secrets.ONLINEFIX_USERNAME }}
MAIN_VITE_ONLINEFIX_PASSWORD: ${{ secrets.ONLINEFIX_PASSWORD }}
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Release
@@ -57,5 +71,6 @@ jobs:
dist/*.tar.gz
dist/*.yml
dist/*.blockmap
dist/*.pacman
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

3
.gitignore vendored
View File

@@ -1,6 +1,6 @@
.vscode
node_modules
aria2/
hydra-download-manager/
fastlist.exe
__pycache__
dist
@@ -9,3 +9,4 @@ out
*.log*
.env
.vite
sentry.properties

View File

@@ -5,7 +5,7 @@
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<h1 align="center">Hydra Launcher</h1>
<p align="center">
<strong>Hydra - гэта гульнявы лаўнчар з уласным убудаваным кліентам BitTorrent і самастойным scraper`ам для рэпакаў.</strong>
</p>
@@ -20,6 +20,9 @@
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![es](https://img.shields.io/badge/lang-es-red)](README.es.md)
[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md)
[![de](https://img.shields.io/badge/lang-de-black)](README.de.md)
[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md)
[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md)
![Hydra Catalogue](./docs/screenshot.png)
@@ -27,11 +30,12 @@
## Змест
- [Змест](#змест)
- [Апісанне](#апісанне)
- [Асаблівасці](#асаблівасці)
- [Усталёўка](#усталёўка)
- [Уклад](#contributing)
- [Далучайцеся да нашага Telegram](#join-our-telegram)
- [Уклад](#-уклад)
- [Далучайцеся да нашага Telegram](#-далучайцеся-да-нашага-telegram)
- [Форк і кланаванне рэпазітара](#форк-і-кланаванне-рэпазітара)
- [Спосабы ўнесці свой уклад](#спосабы-ўнесці-свой-уклад)
- [Структура праекту](#структура-праекту)
@@ -47,6 +51,7 @@
- [Зборка кліента BitTorrent](#зборка-кліента-bittorrent)
- [Зборка прыкладання Electron](#зборка-прыкладання-electron)
- [Удзельнікі](#удзельнікі)
- [Ліцэнзія](#ліцэнзія)
## Апісанне

185
README.cs.md Normal file
View File

@@ -0,0 +1,185 @@
<br>
<div align="center">
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<h1 align="center">Hydra Launcher</h1>
<p align="center">
<strong>Hydra je herní launcher s vlastním vestavěným Bittorrent klientem.</strong>
</p>
[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions)
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![es](https://img.shields.io/badge/lang-es-red)](README.es.md)
[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md)
[![de](https://img.shields.io/badge/lang-de-black)](README.de.md)
[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md)
[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md)
![Hydra Katalog](./docs/screenshot.png)
</div>
## Seznam obsahu
- [Seznam obsahu](#seznam-obsahu)
- [O projektu](#o-projektu)
- [Funkce](#funkce)
- [Instalace](#instalace)
- [Přispívání](#přispívání)
- [Připoj se na náš telegram](#připoj-se-na-náš-telegram)
- [Vytvořte fork a naklonujte svůj repozitář](#vytvořte-fork-a-naklonujte-svůj-repozitář)
- [Způsoby jak můžete přispět](#způsoby-jak-můžete-přispět)
- [Struktura projektu](#struktura-projektu)
- [Sestavení ze zdroje](#sestavení-ze-zdroje)
- [Instalace Node.js](#instalace-nodejs)
- [Instalace Yarn](#instalace-yarn)
- [Instalace Požadavků pro Node.js](#instalace-požadavků-pro-nodejs)
- [Instalace Pythonu 3.9](#instalace-pythonu-39)
- [Instalace Požadavků pro Python](#instalace-požadavků-pro-python)
- [Proměnné prostředí](#proměnné-prostředí)
- [Spuštění](#spuštění)
- [Sestavení](#sestavení)
- [Sestavení bittorrent klientu](#sestavení-bittorrent-klientu)
- [Sestavení electron aplikace](#sestavení-electron-aplikace)
- [Přispěvatelé](#přispěvatelé)
- [Licence](#licence)
## O projektu
**Hydra** je **Herní Launcher** s jeho vlastním vestavěným **BitTorrent Klientem**.
<br>
Launcher je napsán v TypeScriptu (Electron) a Pythonu, který má na starosti torrentovací systém za pomocí knihovny libtorrent.
## Funkce
- Vlastní vestavěný BitTorrent klient
- How Long To Beat (HLTB) integrace na stránce hry
- Vlastní místa pro uložení hry
- Windows a Linux podpora
- Časté aktualizace
- A další ...
## Instalace
Následuj kroky:
1. Stáhni nejnovější verzi Hydry ze stránky [Vydání](https://github.com/hydralauncher/hydra/releases/latest).
- Stáhni .exe, pokud chceš instalovat Hydru na Windows.
- Stáhni .deb nebo .rpm nebo .zip, pokud chceš instalovat Hydru na Linux. (záleží na tvé Linux distribuci)
2. Spusť stažený instalační soubor.
3. Užívej Hydru!
## <a name="contributing"> Přispívání
### <a name="join-our-telegram"></a> Připoj se na náš telegram
Vedeme diskuzi v našem [Telegramovém](https://t.me/hydralauncher) kanálu.
### Vytvořte fork a naklonujte svůj repozitář
1. Vytvoř fork repozitáře [(klikni sem pro vytvoření forku)](https://github.com/hydralauncher/hydra/fork)
2. Naklonuj kód forku `git clone https://github.com/tvoje_jméno/hydra`
3. Vytvoř nové odvětví (branch)
4. Odešli svoje změny
5. Odešli nový Pull Request
### Způsoby jak můžete přispět
- Překládání: Chceme, aby Hydra byla co nejvíce dostupná. Můžete přispět novým jazykem, nebo úpravou současného!
- Kód: Hydra je postavena na Typescriptu, Electronu a trochou Pythonu. Pokud chceš přispět, připoj se na náš [Telegram](https://t.me/hydralauncher)!
### Struktura projektu
- torrent-client: Používáme libtorrent, Pythonovou knihovnu, pro správu torrent stahování
- src/renderer: uživatelské rozhraní aplikace (UI)
- src/main: celá logika projektu
## Sestavení ze zdroje
### Instalace Node.js
Ujistěte se, že máte Node.js nainstalován na svém zařízení. Pokud ne, stáhněte ho, a nainstalujte z [nodejs.org](https://nodejs.org/).
### Instalace Yarn
Yarn je balíčkový správce pro Node.js. Pokud ještě nemáte yarn, můžete ho stáhnout za pomoci pokynů na [yarnpkg.com](https://classic.yarnpkg.com/lang/en/docs/install/).
### Instalace Požadavků pro Node.js
Jděte do složky projektu, otevřte v ní konzole a nainstalujte požadavky pro Node pomocí Yarn:
```bash
cd hydra
yarn
```
### Instalace Pythonu 3.9
Ujistěte se, že máte Python 3.9 nainstalován na svém zařízení. Můžete ho stáhnout z [python.org](https://www.python.org/downloads/release/python-3913/).
### Instalace Požadavků pro Python
Nainstalujte požadavky pro Python za pomoci pip:
```bash
pip install -r requirements.txt
```
## Proměnné prostředí
Budete potřebovat SteamGridDB API klíč, abyste mohli načítat ikony u her.
Jakmile ho máte, můžete zkopírovat, nebo přejmenovat `.env.example` soubor na `.env` a dát ho do `STEAMGRIDDB_API_KEY`.
## Spuštění
Jakmile máte vše nastaveno, můžete spustit jak Electron proces tak bittorrent client:
```bash
yarn dev
```
## Sestavení
### Sestavení bittorrent klientu
Sestavit bittorrent klient můžete pomocí:
```bash
python torrent-client/setup.py build
```
### Sestavení electron aplikace
Sestavit Electron aplikaci můžete pomocí následujících kroků:
Na Windows:
```bash
yarn build:win
```
Na Linux:
```bash
yarn build:linux
```
## Přispěvatelé
<a href="https://github.com/hydralauncher/hydra/graphs/contributors">
<img src="https://contrib.rocks/image?repo=hydralauncher/hydra" />
</a>
## Licence
Hydra je licencována pod [MIT Licencí](LICENSE).

183
README.de.md Normal file
View File

@@ -0,0 +1,183 @@
<br>
<div align="center">
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<h1 align="center">Hydra Launcher</h1>
<p align="center">
<strong>Hydra ist ein Launcher für Spiele mit einem eigenen eingebetteten BitTorrent-Client.</strong>
</p>
[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions)
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![pl](https://img.shields.io/badge/lang-pl-white)](README.pl.md)
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
[![es](https://img.shields.io/badge/lang-es-red)](README.es.md)
[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md)
[![de](https://img.shields.io/badge/lang-de-black)](README.de.md)
[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md)
![Hydra Katalog](./docs/screenshot.png)
</div>
## Inhaltsverzeichnis
- [Über Hydra](#über-hydra)
- [Eigenschaften](#eigenschaften)
- [Installation](#installation)
- [Mitwirken](#mitwirken)
- [Tritt uns auf Telegram bei](#tritt-uns-auf-telegram-bei)
- [Forke und klone dein Repo](#forke-und-klone-dein-repo)
- [Wie du mitwirken kannst](#wie-du-mitwirken-kannst)
- [Projektstruktur](#projektstruktur)
- [Den Quellcode kompilieren](#den-quellcode-kompilieren)
- [Installiere Node.js](#installiere-nodejs)
- [Installiere Yarn](#installiere-yarn)
- [Installiere Node-Abhängigkeiten](#installiere-node-abhängigkeiten)
- [Installiere Python 3.9](#installiere-python-39)
- [Installiere Python-Abhängigkeiten](#installiere-python-abhängigkeiten)
- [Umgebungsvariablen](#umgebungsvariablen)
- [Ausführung](#ausführung)
- [Kompilation](#kompilation)
- [Kompiliere den BitTorrent-Client](#kompiliere-den-bittorrent-client)
- [Kompiliere die Electron-Applikation](#kompiliere-die-electron-applikation)
- [Mitwirkende](#mitwirkende)
## Über Hydra
**Hydra** ist ein **Launcher für Spiele** mit einem eigenen eingebetteten **BitTorrent-Client**.
<br>
Der Launcher ist in TypeScript (Electron) und Python, womit das Torrentingsystem durch Einsatz von libtorrent geregelt ist, geschrieben.
## Eigenschaften
- Eigener eingebetteter BitTorrent-Client
- How Long to Beat (HLTB) Integration auf der Spielseite
- Anpassbarkeit des Downloadverzeichnisses
- Unterstützung von Windows und Linux
- Regelmäßig aktualisiert
- Und mehr ...
## Installation
Die folgenden Schritte beschreiben den Installationsprozess:
1. Lade die neueste Version von Hydra von der [Releases](https://github.com/hydralauncher/hydra/releases/latest) Seite herunter.
- Für die Installation von Hydra auf Windows, wähle die .exe Datei.
- Für die Installation von Hydra auf Linux, wähle die .deb, .rpm oder .zip Datei. (Abhängig von deiner Linux-Distribution)
2. Führe die heruntergeladene Datei aus.
3. Genieße Hydra!
## Mitwirken
### Tritt uns auf Telegram bei
Wir konzentrieren unsere Diskussionen in unserem [Telegram](https://t.me/hydralauncher) Kanal.
### Forke und klone dein Repo
1. Forke das Repo [(Klicke hier, um direkt zu forken)](https://github.com/hydralauncher/hydra/fork)
2. Klone deinen geforketen Code `git clone https://github.com/dein_nutzername/hydra`
3. Erstelle einen neuen Branch
4. Pushe deine Commits
5. Stelle eine neue Pull-Anfrage
### Wie du mitwirken kannst
- Übersetzung: Wir wollen Hydra so vielen Menschen wie möglich zugänglich machen. Gerne kannst du uns helfen neue Sprachen zu übersetzen oder für Hydra bereits verfügbare Sprachen zu aktualisieren und verbessern.
- Code: Hydra ist mit TypeScript, Electron und etwas Python gebaut. Wenn du mitwirken möchtest, tritt unserem [Telegram](https://t.me/hydralauncher) bei!
### Projektstruktur
- torrent-client: Wir verwenden die Python-Bibliothek libtorrent zur Verwaltung von Torrent-Downloads.
- src/renderer: die UI der Applikation.
- src/main: sämtliche Logik liegt hier.
## Den Quellcode kompilieren
### Installiere Node.js
Stelle sicher, dass du Node.js auf deinem System installiert hast. Falls nicht, installiere es von [nodejs.org](https://nodejs.org/).
### Installiere Yarn
Yarn ist ein Packetmanager für Node.js. Sollte er dir fehlen, installiere ihn mithilfe der Anleitung auf [yarnpkg.com](https://classic.yarnpkg.com/lang/en/docs/install/).
### Installiere Node-Abhängigkeiten
Navigiere zum Projektverzeichnis und installiere die Node-Abhängigkeiten mit Yarn:
```bash
cd hydra
yarn
```
### Installiere Python 3.9
Stelle sicher, dass du Python 3.9 auf deinem System installiert hast. Ansonsten kannst du es von [python.org](https://www.python.org/downloads/release/python-3913/) herunterladen und installieren.
### Installiere Python-Abhängigkeiten
Installiere die benötigten Python-Abhängigkeiten mit pip:
```bash
pip install -r requirements.txt
```
## Umgebungsvariablen
Du wirst einen SteamGridDB API Schlüssel benötigen, um die Spielicons bei Installation abzurufen.
Sobald du einen hast, kannst du die .env.example Datei zu .env kopieren oder umbenennen und den Schlüssel bei STEAMGRIDDB_API_KEY einfügen.
## Ausführung
Sobald du alles eingerichtet hast, kannst du den folgenden Befehl nutzen, um sowohl den Electron-Prozess als auch den BitTorrent-Client zu starten:
```bash
yarn dev
```
## Kompilation
### Kompiliere den BitTorrent-Client
Kompiliere den BitTorrent-Client mit folgendem Befehl:
```bash
python torrent-client/setup.py build
```
### Kompiliere die Electron-Applikation
Kompiliere die Electron-Applikation mit folgendem Befehl:
Auf Windows:
```bash
yarn build:win
```
Auf Linux:
```bash
yarn build:linux
```
## Mitwirkende
<a href="https://github.com/hydralauncher/hydra/graphs/contributors">
<img src="https://contrib.rocks/image?repo=hydralauncher/hydra" />
</a>
## Lizenz
Hydra ist unter der [MIT Lizenz](LICENSE) lizensiert.

View File

@@ -5,7 +5,7 @@
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<h1 align="center">Hydra Launcher</h1>
<p align="center">
<strong>Hydra es un launcher de juegos con su propio cliente de bittorrent y gestor propio de repacks.</strong>
</p>
@@ -13,13 +13,16 @@
[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions)
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![pl](https://img.shields.io/badge/lang-pl-white)](README.pl.md)
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![es](https://img.shields.io/badge/lang-es-red)](README.es.md)
[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md)
[![de](https://img.shields.io/badge/lang-de-black)](README.de.md)
[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md)
[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md)
![Hydra Catalogue](./docs/screenshot.png)
@@ -27,11 +30,12 @@
## Tabla de Contenidos
- [Tabla de Contenidos](#tabla-de-contenidos)
- [Acerca de](#acerca-de)
- [Características](#caracteristicas)
- [Instalación](#Instalacion)
- [Contribuir](#contribuir)
- [Únete a nuestro Telegram](#unete-a-nuestro-telegram)
- [Caracteristicas](#caracteristicas)
- [Instalacion](#instalacion)
- [Contribuir](#-contribuir)
- [Unete a nuestro Telegram](#-unete-a-nuestro-telegram)
- [Haz un fork y clona tu repositorio](#haz-un-fork-y-clona-tu-repositorio)
- [Maneras en las que puedes contribuir](#maneras-en-las-que-puedes-contribuir)
- [Estructura del proyecto](#estructura-del-proyecto)
@@ -40,13 +44,14 @@
- [Instalar Yarn](#instalar-yarn)
- [Instalar Dependencias de Node](#instalar-dependencias-de-node)
- [Instalar Python 3.9](#instalar-python-39)
- [Instalar Dependencias de Python](#Instalar-dependencias-de-python)
- [Instalar Dependencias de Python](#instalar-dependencias-de-python)
- [Variables del Entorno](#variables-del-entorno)
- [Ejecución](#ejecucion)
- [Compilación](#compilacion)
- [Ejecucion](#ejecucion)
- [Compilacion](#compilacion)
- [Compilar el cliente de bittorrent](#compilar-el-cliente-de-bittorrent)
- [Compilar la aplicación Electron](#compilar-la-aplicacion-electron)
- [Compilar la aplicacion Electron](#compilar-la-aplicacion-electron)
- [Colaboradores](#colaboradores)
- [Licencia](#licencia)
## Acerca de
@@ -83,7 +88,7 @@ Puedes unirte a nuestra conversación y discusiones en nuestro canal de [Telegra
### Haz un fork y clona tu repositorio
1. Rea;iza un fork del repositorio [(Haz click acá para hacer un fork ahora)](https://github.com/hydralauncher/hydra/fork)
1. Realiza un fork del repositorio [(Haz click acá para hacer un fork ahora)](https://github.com/hydralauncher/hydra/fork)
2. Clona el código forkeado `git clone https://github.com/tu_nombredeusuario/hydra`
3. Crea una nueva rama
4. Sube tus commits

View File

@@ -5,7 +5,7 @@
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<h1 align="center">Hydra Launcher</h1>
<p align="center">
<strong>Hydra est un lanceur de jeux avec son propre client bittorrent intégré et un scraper de repack auto-géré.</strong>
</p>
@@ -13,13 +13,16 @@
[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions)
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![pl](https://img.shields.io/badge/lang-pl-white)](README.pl.md)
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![es](https://img.shields.io/badge/lang-es-red)](README.es.md)
[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md)
[![de](https://img.shields.io/badge/lang-de-black)](README.de.md)
[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md)
[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md)
![Catalogue Hydra](./docs/screenshot.png)
@@ -27,6 +30,7 @@
## Table des Matières
- [Table des Matières](#table-des-matières)
- [À propos](#à-propos)
- [Fonctionnalités](#fonctionnalités)
- [Installation](#installation)
@@ -47,6 +51,7 @@
- [Compiler le client bittorrent](#compiler-le-client-bittorrent)
- [Compiler l'application Electron](#compiler-lapplication-electron)
- [Contributeurs](#contributeurs)
- [License](#license)
## À propos

188
README.it.md Normal file
View File

@@ -0,0 +1,188 @@
<br>
<div align="center">
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<h1 align="center">Hydra Launcher</h1>
<p align="center">
<strong>Hydra è un game launcher con il proprio client bittorrent e autogestore di repacks.</strong>
</p>
[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions)
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![es](https://img.shields.io/badge/lang-es-red)](README.es.md)
[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md)
[![de](https://img.shields.io/badge/lang-de-black)](README.de.md)
[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md)
[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md)
![Hydra Catalogue](./docs/screenshot.png)
</div>
## Table of Contents
- [Table of Contents](#table-of-contents)
- [A proposito](#a-proposito)
- [Caratteristiche](#caratteristiche)
- [Installazione](#installazione)
- [Contribuire](#-contribuire)
- [Unisciti su Telegram](#-unisciti-su-telegram)
- [Forka e Clona la repository](#forka-e-clona-la-repository)
- [Modi in cui contribuire](#modi-in-cui-contribuire)
- [Struttura del Progetto](#struttura-del-progetto)
- [Compilazione](#compilazione)
- [Installa Node.js](#installa-nodejs)
- [Installa Yarn](#installa-yarn)
- [Installa le dipendenze Node](#installa-le-dipendenze-node)
- [Installa Python 3.9](#installa-python-39)
- [Installa le Dipendenze Python](#installa-le-dipendenze-python)
- [Variabili d'ambiente](#variabili-dambiente)
- [Esecuzione](#esecuzione)
- [Compilazione](#compilazione-1)
- [Compila il bittorrent](#compila-il-bittorrent)
- [Compila l'applicazione Electron](#compila-lapplicazione-electron)
- [Collaboratori](#collaboratori)
- [Licenza](#licenza)
## A proposito
**Hydra** è un **Game Launcher** con il proprio **Client BitTorrent** e **autogestore di repack**.
<br>
Il launcher è scritto in TypeScript (Electron) and Python, che gestisce il sistema di torrenting appoggiandosi a libtorrent.
## Caratteristiche
- Motore di ricerca automatizzato sulle fonti di repack dal [Megathread]("https://www.reddit.com/r/Piracy/wiki/megathread/")
- Client Bittorrent integrato
- Integrazione How Long To Beat (HLTB) nella pagina del gioco
- Percorso del download Personalizzato
- Notifiche di aggiornamenti sulla list dei repacks
- Supporto Windows e Linux
- Costantemente Aggiornato
- E molto altro ...
## Installazione
Segui i seguenti passi:
1. Scarica l'ultima versione di Hydra dalla pagina [Releases](https://github.com/hydralauncher/hydra/releases/latest).
- Scarica solo il file .exe per installare Hydra su Windows.
- Scarica il file .deb o .rpm o .zip per Linux. (Dipende dalla tua distro Linux)
2. Esegui il file scaricato.
3. Goditi Hydra!
## <a name="contribuire"> Contribuire
### <a name="unisciti-su-telegram"></a> Unisciti su Telegram
Puoi unirti alle nostre conversazioni sul canale [Telegram](https://t.me/hydralauncher).
### Forka e Clona la repository
1. Forka la repository [(clicca qui per forkare)](https://github.com/hydralauncher/hydra/fork)
2. Clona il tuo codice forkato `git clone https://github.com/your_username/hydra`
3. Crea un nuovo branch
4. Aggiungi le modifiche (push)
5. Invia la richiesta di pull
### Modi in cui contribuire
- Traduzione: Vogliamo rendere Hydra disponibile a più persone possibile. Sentiti libero di tradurre in altre lingue o aggiornare e migliorare quelle già disponibili su Hydra.
- Programmazione: Hydra è programmato in TypeScript, Electron e un po' di Python. Se intendi contribuire unisciti al nostro [Telegram](https://t.me/hydralauncher)!
### Struttura del Progetto
- client-torrent: Usiamo libtorrent, una libreria Python, per gestire i download dei torrent
- src/renderer: l'UI dell'applicazione
- src/main: tutta la logica qui.
## Compilazione
### Installa Node.js
Assicurati di avere Node.js installato sulla tua macchina. Scaricalo e installalo da [nodejs.org](https://nodejs.org/).
### Installa Yarn
Yarn è un gestore di pacchetti per Node.js. Se non hai ancora installato Yarn segui le istruzioni su [yarnpkg.com](https://classic.yarnpkg.com/lang/en/docs/install/).
### Installa le dipendenze Node
Naviga alla cartella del progetto e installa le dipendenze Node con Yarn:
```bash
cd hydra
yarn
```
### Installa Python 3.9
Assicurati di avere Python 3.9 installato. Puoi scaricarlo da [python.org](https://www.python.org/downloads/release/python-3913/).
### Installa le Dipendenze Python
Installa le dipendenze con pip:
```bash
pip install -r requirements.txt
```
## Variabili d'ambiente
Avrai bisogno di una chiave API SteamGridDB per poter caricare le icone di gioco.
Se intendi avere onlinefix come repacker dovrai aggiungere le tue credenziali al file .env
Una volta ottenuta, puoi copiare e rinominare il file `.env.example` a `.env` e metterlo in `STEAMGRIDDB_API_KEY`, `ONLINEFIX_USERNAME`, `ONLINEFIX_PASSWORD`.
## Esecuzione
Una volta impostato tutto, puoi eseguire il seguente comando per avviare il processo Electron e il client bittorrent:
```bash
yarn dev
```
## Compilazione
### Compila il bittorrent
Usa il comando:
```bash
python torrent-client/setup.py build
```
### Compila l'applicazione Electron
Usa il comando:
Per Windows:
```bash
yarn build:win
```
Per Linux:
```bash
yarn build:linux
```
## Collaboratori
<a href="https://github.com/hydralauncher/hydra/graphs/contributors">
<img src="https://contrib.rocks/image?repo=hydralauncher/hydra" />
</a>
## Licenza
Hydra è concesso in licenza secondo la [MIT License](LICENSE).

View File

@@ -5,21 +5,24 @@
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<h1 align="center">Hydra Launcher</h1>
<p align="center">
<strong>Hydra is a game launcher with its own embedded bittorrent client and a self-managed repack scraper.</strong>
<strong>Hydra is a game launcher with its own embedded bittorrent client.</strong>
</p>
[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions)
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![pl](https://img.shields.io/badge/lang-pl-white)](README.pl.md)
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![es](https://img.shields.io/badge/lang-es-red)](README.es.md)
[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md)
[![de](https://img.shields.io/badge/lang-de-black)](README.de.md)
[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md)
[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md)
![Hydra Catalogue](./docs/screenshot.png)
@@ -27,11 +30,12 @@
## Table of Contents
- [Table of Contents](#table-of-contents)
- [About](#about)
- [Features](#features)
- [Installation](#installation)
- [Contributing](#contributing)
- [Join our Telegram](#join-our-telegram)
- [Contributing](#-contributing)
- [Join our Telegram](#-join-our-telegram)
- [Fork and clone your repository](#fork-and-clone-your-repository)
- [Ways you can contribute](#ways-you-can-contribute)
- [Project Structure](#project-structure)
@@ -47,20 +51,19 @@
- [Build the bittorrent client](#build-the-bittorrent-client)
- [Build the Electron application](#build-the-electron-application)
- [Contributors](#contributors)
- [License](#license)
## About
**Hydra** is a **Game Launcher** with its own embedded **BitTorrent Client** and a **self-managed repack scraper**.
**Hydra** is a **Game Launcher** with its own embedded **BitTorrent Client**.
<br>
The launcher is written in TypeScript (Electron) and Python, which handles the torrenting system by using libtorrent.
## Features
- Self-Managed repack scraper among all the most reliable websites on the [Megathread]("https://www.reddit.com/r/Piracy/wiki/megathread/")
- Own embedded bittorrent client
- How Long To Beat (HLTB) integration on game page
- Downloads path customization
- Repack list update notifications
- Windows and Linux support
- Constantly updated
- And more ...
@@ -134,9 +137,8 @@ pip install -r requirements.txt
## Environment variables
You'll need an SteamGridDB API Key in order to fetch the game icons on installation.
If you want to have onlinefix as a repacker you'll need to add your credentials to the .env
Once you have it, you can copy or rename the `.env.example` file to `.env` and put it on`STEAMGRIDDB_API_KEY`, `ONLINEFIX_USERNAME`, `ONLINEFIX_PASSWORD`.
Once you have it, you can copy or rename the `.env.example` file to `.env` and put it on`STEAMGRIDDB_API_KEY`.
## Running

View File

@@ -5,7 +5,7 @@
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<h1 align="center">Hydra Launcher</h1>
<p align="center">
<strong>Hydra - to program uruchamiający gry z własnym wbudowanym klientem bittorrent i samodzielnie zarządzanym repackagerem..</strong>
</p>
@@ -13,13 +13,16 @@
[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions)
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![es](https://img.shields.io/badge/lang-es-red)](README.es.md)
[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md)
[![de](https://img.shields.io/badge/lang-de-black)](README.de.md)
[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md)
[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md)
![Hydra Catalogue](./docs/screenshot.png)
@@ -27,26 +30,28 @@
## Zawartość.
- [Zawartość.](#zawartość)
- [O nas](#o-nas)
- [Cechy.](#cechy)
- [Cechy](#cechy)
- [Instalacja](#instalacja)
- [Dokonaj wpłaty](#dokonaj-wpłaty)
- [Dołącz do naszego kanału Telegram](#dołącz-do-naszego-kanału-telegram)
- [Dokonaj wpłaty](#-dokonaj-wpłaty)
- [Dołącz do naszego kanału Telegram](#-dołącz-do-naszego-kanału-telegram)
- [Rozwidlenie i sklonowanie repozytorium](#rozwidlenie-i-sklonowanie-repozytorium)
- [Jak możesz wnieść swój wkład](#jak-możesz-pomóc)
- [Jak możesz pomóc](#jak-możesz-pomóc)
- [Struktura projektu](#struktura-projektu)
- [Utwórz kompilację z kodu źródłowego](#utwórz-kompilację-z-kodu-źródłowego)
- [Instalacja Node.js](#zainstaluj-nodejs)
- [Instalacja Yarn](#zainstaluj-yarn)
- [Instalacja Node zależności](#zainstaluj-zależności-node)
- [Instalacja Python 3.9](#zainstaluj-python-39)
- [Instalacja Python zależności](#zainstaluj-zależności-pythona)
- [Zainstaluj Node.js](#zainstaluj-nodejs)
- [Zainstaluj Yarn](#zainstaluj-yarn)
- [Zainstaluj zależności Node](#zainstaluj-zależności-node)
- [Zainstaluj Python 3.9](#zainstaluj-python-39)
- [Zainstaluj zależności Pythona](#zainstaluj-zależności-pythona)
- [Zmienne środowiskowe](#zmienne-środowiskowe)
- [Uruchomienie](#utwórz-kompilację-z-kodu-źródłowego)
- [Run](#run)
- [Tworzenie kompilacji](#tworzenie-kompilacji)
- [Tworzenie klienta bittorrent](#zbuduj-klienta-bittorrent)
- [Tworzenie kompilacji aplikacji Electron](#tworzenie-aplikacji-electron)
- [Zbuduj klienta bittorrent](#zbuduj-klienta-bittorrent)
- [Tworzenie aplikacji Electron](#tworzenie-aplikacji-electron)
- [Współtwórcy](#współtwórcy)
- [License](#license)
## O nas

View File

@@ -5,7 +5,7 @@
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<h1 align="center">Hydra Launcher</h1>
<p align="center">
<strong>Hydra é um Launcher de Jogos com seu próprio cliente de bittorrent integrado e um wrapper autogerenciado para busca de repacks.</strong>
</p>
@@ -13,13 +13,16 @@
[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions)
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
[![pl](https://img.shields.io/badge/lang-pl-white)](README.pl.md)
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![es](https://img.shields.io/badge/lang-es-red)](README.es.md)
[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md)
[![de](https://img.shields.io/badge/lang-de-black)](README.de.md)
[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md)
[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md)
![Hydra Catalogue](./docs/screenshot.png)
@@ -27,26 +30,28 @@
## Índice
- [Sobre](#about)
- [Recursos](#features)
- [Instalação](#installation)
- [Contribuindo](#contributing)
- [Junte-se ao nosso Telegram](#join-our-telegram)
- [Fork e clone seu repositorio](#fork-and-clone-your-repository)
- [Como contribuir](#ways-you-can-contribute)
- [Estrutura do projeto](#project-structure)
- [Compile a partir do código-fonte](#build-from-source)
- [Instale Node.js](#install-nodejs)
- [Instale Yarn](#install-yarn)
- [Instale Node Dependencies](#install-node-dependencies)
- [Instale Python 3.9](#install-python-39)
- [Instale Python Dependencies](#install-python-dependencies)
- [variaveis de ambiente](#environment-variables)
- [Rodando o programa](#running)
- [Compilando](#build)
- [Compile o client bittorrent](#build-the-bittorrent-client)
- [Compile a aplicação Electron](#build-the-electron-application)
- [Contribuidores](#contributors)
- [Índice](#índice)
- [Sobre](#-sobre)
- [Recursos](#-recursos)
- [Instalação](#-instalação)
- [Contribuindo](#-contribuindo)
- [Junte-se ao nosso Telegram](#-junte-se-ao-nosso-telegram)
- [Fork e clone o seu repositório](#-fork-e-clone-o-seu-repositório)
- [Formas de contribuir](#-formas-de-contribuir)
- [Estrutura do Projeto](#-estrutura-do-projeto)
- [Compile a partir do código-fonte](#-compile-a-partir-do-código-fonte)
- [Instale Node.js](#-instale-nodejs)
- [Instale Yarn](#-instale-yarn)
- [Instale Dependencias do Node](#-instale-dependencias-do-node)
- [Instale Python 3.9](#-instale-python-39)
- [Instale Python Dependencies](#-instale-python-dependencies)
- [Environment variables](#-environment-variables)
- [Running](#-running)
- [Build](#-build)
- [Build the bittorrent client](#-build-the-bittorrent-client)
- [Build the Electron application](#-build-the-electron-application)
- [Contributors](#-contributors)
- [Licença](#-licença)
## <a name="about"> Sobre

View File

@@ -5,7 +5,7 @@
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<h1 align="center">Hydra Launcher</h1>
<p align="center">
<strong>Hydra - это игровой лаунчер с собственным встроенным клиентом BitTorrent и самостоятельным scraper`ом для репаков.</strong>
</p>
@@ -13,13 +13,16 @@
[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions)
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
[![pl](https://img.shields.io/badge/lang-pl-white)](README.pl.md)
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![es](https://img.shields.io/badge/lang-es-red)](README.es.md)
[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md)
[![de](https://img.shields.io/badge/lang-de-black)](README.de.md)
[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md)
[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md)
![Hydra Catalogue](./docs/screenshot.png)
@@ -27,11 +30,12 @@
## Содержание
- [Содержание](#содержание)
- [Описание](#описание)
- [Особенности](#особенности)
- [Установка](#установка)
- [Вклад](#contributing)
- [Присоединяйтесь к нашему Telegram](#join-our-telegram)
- [Вклад](#-вклад)
- [Присоединяйтесь к нашему Telegram](#-присоединяйтесь-к-нашему-telegram)
- [Форк и клонирование репозитория](#форк-и-клонирование-репозитория)
- [Способы внести свой вклад](#способы-внести-свой-вклад)
- [Структура проекта](#структура-проекта)
@@ -47,6 +51,7 @@
- [Сборка клиента BitTorrent](#сборка-клиента-bittorrent)
- [Сборка приложения Electron](#сборка-приложения-electron)
- [Участники](#участники)
- [License](#license)
## Описание

View File

@@ -5,7 +5,7 @@
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<h1 align="center">Hydra Launcher</h1>
<p align="center">
<strong>Hydra - це ігровий лаунчер з власним вбудованим bittorrent-клієнтом і самокерованим збирачем репаків.</strong>
</p>
@@ -13,13 +13,16 @@
[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions)
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
[![pl](https://img.shields.io/badge/lang-pl-white)](README.pl.md)
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![es](https://img.shields.io/badge/lang-es-red)](README.es.md)
[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md)
[![de](https://img.shields.io/badge/lang-de-black)](README.de.md)
[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md)
[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md)
![Hydra Catalogue](./docs/screenshot.png)
@@ -27,11 +30,12 @@
## Зміст
- [Зміст](#зміст)
- [Про нас](#про-нас)
- [Функції](#функції)
- [Встановлення](#встановлення)
- [Зробити свій внесок](#contributing)
- [Приєднуйтесь до нашого Telegram](#join-our-telegram)
- [Зробити свій внесок](#-зробити-свій-внесок)
- [Приєднуйтесь до нашого Telegram](#-приєднуйтесь-до-нашого-telegram)
- [Форк і клонування вашого репозиторію](#форк-і-клонування-вашого-репозиторію)
- [Як ви можете зробити свій внесок](#як-ви-можете-зробити-свій-внесок)
- [Структура проекту](#структура-проекту)
@@ -47,6 +51,7 @@
- [Зробіть білд bittorrent client](#зробіть-білд-bittorrent-client)
- [Зробіть білд Electron застосунку](#зробіть-білд-electron-застосунку)
- [Контриб'ютори](#контрибютори)
- [License](#license)
## Про нас

68
SECURITY.md Normal file
View File

@@ -0,0 +1,68 @@
# Security Policy
## Purpose of the Policy
The purpose of this Security Policy is to ensure the security of our project and maintain the trust of the community.
## Who is Affected by the Policy
This policy applies to all members of our project community, including developers, testers, repository administrators, and users.
## Supported Versions
Use this section to tell people about which versions of your project are
currently being supported with security updates.
| Version | Supported |
| ------- | ------------------ |
| 2.0.x | :white_check_mark: |
| < 1.2.0 | :x: |
## Development Recommendations
### Best Practices
- Follow secure coding principles.
- Use well-established libraries and frameworks.
- Regularly update dependencies.
- Conduct thorough testing, including security-related tests.
### Unrecommended Practices
- Do not use known vulnerabilities that have not been patched.
- Do not publish sensitive information such as API keys or passwords.
- Do not vote for changes that degrade the security of the project.
### User-Generated Content
- Ensure that user-generated content does not contain hidden threats.
- Be cautious when handling user data.
### Community Interaction
- Treat each other with respect and politeness.
- Do not spread spam or spam bots.
- Follow community guidelines.
### Vulnerability Discovery and Reporting
- If you discover a vulnerability, report it as an issue on GitHub.
- Your report should contain detailed information about the vulnerability, including steps to resolve it.
### Reporting Method
To report a vulnerability, create a new issue on GitHub and use branch isolation to provide details about the vulnerability.
### Details to Provide
Please provide the following information about the vulnerability:
- Description of the vulnerability
- Steps to resolve the vulnerability
- Versions on which the vulnerability was found
- Code examples illustrating the vulnerability (if it is safe to do so)
### Expected Behavior
- If we accept the reported vulnerability, we will release a patch and update the security information on GitHub.
- If we reject the reported vulnerability, we will provide an explanation.

View File

@@ -3,10 +3,8 @@ productName: Hydra
directories:
buildResources: build
extraResources:
- aria2
- hydra-download-manager
- seeds
- from: node_modules/ps-list/vendor/fastlist-0.3.0-x64.exe
to: fastlist.exe
- from: node_modules/create-desktop-shortcuts/src/windows.vbs
files:
- "!**/.vscode/*"
@@ -19,7 +17,6 @@ asarUnpack:
- resources/**
win:
executableName: Hydra
requestedExecutionLevel: requireAdministrator
target:
- nsis
- portable
@@ -32,7 +29,6 @@ nsis:
allowToChangeInstallationDirectory: true
portable:
artifactName: ${name}-${version}-portable.${ext}
requestExecutionLevel: admin
mac:
entitlementsInherit: build/entitlements.mac.plist
extendInfo:
@@ -48,6 +44,7 @@ linux:
- AppImage
- snap
- deb
- pacman
- rpm
maintainer: electronjs.org
category: Game

View File

@@ -6,9 +6,16 @@ import {
externalizeDepsPlugin,
} from "electron-vite";
import react from "@vitejs/plugin-react";
import { sentryVitePlugin } from "@sentry/vite-plugin";
import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin";
import svgr from "vite-plugin-svgr";
const sentryPlugin = sentryVitePlugin({
authToken: process.env.SENTRY_AUTH_TOKEN,
org: "hydra-launcher",
project: "hydra-launcher",
});
export default defineConfig(({ mode }) => {
loadEnv(mode);
@@ -28,7 +35,7 @@ export default defineConfig(({ mode }) => {
"@shared": resolve("src/shared"),
},
},
plugins: [externalizeDepsPlugin(), swcPlugin()],
plugins: [externalizeDepsPlugin(), swcPlugin(), sentryPlugin],
},
preload: {
plugins: [externalizeDepsPlugin()],
@@ -44,7 +51,7 @@ export default defineConfig(({ mode }) => {
"@shared": resolve("src/shared"),
},
},
plugins: [svgr(), react(), vanillaExtractPlugin()],
plugins: [svgr(), react(), vanillaExtractPlugin(), sentryPlugin],
},
};
});

View File

@@ -1,6 +1,6 @@
{
"name": "hydralauncher",
"version": "2.0.1",
"version": "2.1.1",
"description": "Hydra",
"main": "./out/main/index.js",
"author": "Los Broxas",
@@ -23,27 +23,28 @@
"start": "electron-vite preview",
"dev": "electron-vite dev",
"build": "npm run typecheck && electron-vite build",
"postinstall": "electron-builder install-app-deps && node ./postinstall.cjs",
"postinstall": "electron-builder install-app-deps",
"build:unpack": "npm run build && electron-builder --dir",
"build:win": "electron-vite build && electron-builder --win",
"build:mac": "electron-vite build && electron-builder --mac",
"build:linux": "electron-vite build && electron-builder --linux",
"prepare": "husky",
"typeorm:migration-create": "yarn typeorm migration:create"
"knex:migrate:make": "knex --knexfile src/main/knexfile.ts migrate:make --esm"
},
"dependencies": {
"@electron-toolkit/preload": "^3.0.0",
"@electron-toolkit/utils": "^3.0.0",
"@fontsource/fira-mono": "^5.0.13",
"@fontsource/fira-sans": "^5.0.20",
"@fontsource/noto-sans": "^5.0.22",
"@hookform/resolvers": "^3.9.0",
"@primer/octicons-react": "^19.9.0",
"@reduxjs/toolkit": "^2.2.3",
"@sentry/electron": "^5.1.0",
"@vanilla-extract/css": "^1.14.2",
"@vanilla-extract/dynamic": "^2.1.1",
"@vanilla-extract/recipes": "^0.5.2",
"aria2": "^4.1.2",
"auto-launch": "^5.0.6",
"axios": "^1.6.8",
"better-sqlite3": "^9.5.0",
"axios": "^1.7.7",
"better-sqlite3": "^11.2.1",
"check-disk-space": "^3.4.0",
"classnames": "^2.5.1",
"color": "^4.2.3",
@@ -53,26 +54,27 @@
"electron-log": "^5.1.4",
"electron-updater": "^6.1.8",
"fetch-cookie": "^3.0.1",
"file-type": "^19.0.0",
"flexsearch": "^0.7.43",
"i18next": "^23.11.2",
"i18next-browser-languagedetector": "^7.2.1",
"icojs": "^0.19.3",
"iso-639-1": "3.1.2",
"jsdom": "^24.0.0",
"jsonwebtoken": "^9.0.2",
"knex": "^3.1.0",
"lodash-es": "^4.17.21",
"lottie-react": "^2.4.0",
"parse-torrent": "^11.0.16",
"piscina": "^4.5.1",
"ps-list": "^8.1.1",
"react-hook-form": "^7.53.0",
"react-i18next": "^14.1.0",
"react-loading-skeleton": "^3.4.0",
"react-redux": "^9.1.1",
"react-router-dom": "^6.22.3",
"sudo-prompt": "^9.2.1",
"typeorm": "^0.3.20",
"user-agents": "^1.1.193",
"yaml": "^2.4.1",
"yup": "^1.4.0",
"zod": "^3.23.8"
},
"devDependencies": {
@@ -81,6 +83,7 @@
"@electron-toolkit/eslint-config-prettier": "^2.0.0",
"@electron-toolkit/eslint-config-ts": "^1.0.1",
"@electron-toolkit/tsconfig": "^1.0.1",
"@sentry/vite-plugin": "^2.20.1",
"@swc/core": "^1.4.16",
"@types/auto-launch": "^5.0.5",
"@types/color": "^3.0.6",
@@ -94,7 +97,7 @@
"@types/user-agents": "^1.0.4",
"@vanilla-extract/vite-plugin": "^4.0.7",
"@vitejs/plugin-react": "^4.2.1",
"electron": "^30.0.9",
"electron": "^30.3.0",
"electron-builder": "^24.9.1",
"electron-vite": "^2.0.0",
"eslint": "^8.56.0",
@@ -105,6 +108,7 @@
"prettier": "^3.2.4",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"ts-node": "^10.9.2",
"typescript": "^5.3.3",
"vite": "^5.0.12",
"vite-plugin-svgr": "^4.2.0"

View File

@@ -1,50 +0,0 @@
const { default: axios } = require("axios");
const util = require("node:util");
const fs = require("node:fs");
const exec = util.promisify(require("node:child_process").exec);
const downloadAria2 = async () => {
if (fs.existsSync("aria2")) {
console.log("Aria2 already exists, skipping download...");
return;
}
const file =
process.platform === "win32"
? "aria2-1.37.0-win-64bit-build1.zip"
: "aria2-1.37.0-1-x86_64.pkg.tar.zst";
const downloadUrl =
process.platform === "win32"
? `https://github.com/aria2/aria2/releases/download/release-1.37.0/${file}`
: "https://archlinux.org/packages/extra/x86_64/aria2/download/";
console.log(`Downloading ${file}...`);
const response = await axios.get(downloadUrl, { responseType: "stream" });
const stream = response.data.pipe(fs.createWriteStream(file));
stream.on("finish", async () => {
console.log(`Downloaded ${file}, extracting...`);
if (process.platform === "win32") {
await exec(`npx extract-zip ${file}`);
console.log("Extracted. Renaming folder...");
fs.renameSync(file.replace(".zip", ""), "aria2");
} else {
await exec(`tar --zstd -xvf ${file} usr/bin/aria2c`);
console.log("Extracted. Copying binary file...");
fs.mkdirSync("aria2");
fs.copyFileSync("usr/bin/aria2c", "aria2/aria2c");
fs.rmSync("usr", { recursive: true });
}
console.log(`Extracted ${file}, removing compressed downloaded file...`);
fs.rmSync(file);
});
};
downloadAria2();

7
requirements.txt Normal file
View File

@@ -0,0 +1,7 @@
libtorrent
cx_Freeze
cx_Logging; sys_platform == 'win32'
lief; sys_platform == 'win32'
pywin32; sys_platform == 'win32'
psutil
Pillow

View File

@@ -1,4 +1,5 @@
{
"language_name": "اَلْعَرَبِيَّةُ",
"home": {
"featured": "مميّز",
"trending": "شائع",

View File

@@ -1,4 +1,5 @@
{
"language_name": "беларуская мова",
"home": {
"featured": "Рэкамэндаванае",
"trending": "Актуальнае",

View File

@@ -0,0 +1,256 @@
{
"language_name": "Català",
"app": {
"successfully_signed_in": "Has entrat correctament"
},
"home": {
"featured": "Destacats",
"trending": "Populars",
"surprise_me": "Sorprèn-me",
"no_results": "No s'ha trobat res"
},
"sidebar": {
"catalogue": "Catàleg",
"downloads": "Baixades",
"settings": "Configuració",
"my_library": "Biblioteca",
"downloading_metadata": "{{title}} (S'estan baixant les metadades…)",
"paused": "{{title}} (Pausat)",
"downloading": "{{title}} ({{percentage}} - S'està baixant…)",
"filter": "Filtra la biblioteca",
"home": "Inici",
"queued": "{{title}} (En espera)",
"game_has_no_executable": "El joc encara no té un executable seleccionat",
"sign_in": "Entra"
},
"header": {
"search": "Cerca jocs",
"home": "Inici",
"catalogue": "Catàleg",
"downloads": "Baixades",
"search_results": "Resultats de la cerca",
"settings": "Configuració",
"version_available_install": "Hi ha disponible la versió {{version}}. Feu clic aquí per a reiniciar i instal·lar-la.",
"version_available_download": "Hi ha disponible la versió {{version}}. Feu clic aquí per a baixar-la."
},
"bottom_panel": {
"no_downloads_in_progress": "Cap baixada en curs",
"downloading_metadata": "S'estan baixant les metadades de: {{title}}…",
"downloading": "S'està baixant: {{title}}… ({{percentage}} complet) - Finalització: {{eta}} - {{speed}}",
"calculating_eta": "Descarregant {{title}}… ({{percentage}} completat) - Calculant el temps restant…",
"checking_files": "Comprovant els fitxers de {{title}}… ({{percentage}} completat)"
},
"catalogue": {
"next_page": "Pàgina següent",
"previous_page": "Pàgina anterior"
},
"game_details": {
"open_download_options": "Obre les opcions de baixada",
"download_options_zero": "No hi ha opcions de baixada",
"download_options_one": "{{count}} opció de baixada",
"download_options_other": "{{count}} opcions de baixada",
"updated_at": "Actualitzat: {{updated_at}}",
"install": "Instal·la",
"resume": "Reprèn",
"pause": "Pausa",
"cancel": "Cancel·la",
"remove": "Elimina",
"space_left_on_disk": "{{space}} lliures al disc",
"eta": "Finalitza en: {{eta}}",
"calculating_eta": "Calculant temps estimat…",
"downloading_metadata": "S'estan baixant les metadades…",
"filter": "Filtra els reempaquetats",
"requirements": "Requisits del sistema",
"minimum": "Mínims",
"recommended": "Recomanats",
"paused": "Paused",
"release_date": "Publicat el {{date}}",
"publisher": "Publicat per {{publisher}}",
"hours": "hores",
"minutes": "minuts",
"amount_hours": "{{amount}} hores",
"amount_minutes": "{{amount}} minuts",
"accuracy": "{{accuracy}}% de precisió",
"add_to_library": "Afegeix a la biblioteca",
"remove_from_library": "Elimina de la biblioteca",
"no_downloads": "No hi ha baixades disponibles",
"play_time": "Jugat durant {{amount}}",
"last_time_played": "Última partida: {{period}}",
"not_played_yet": "Encara no has jugat al {{title}}",
"next_suggestion": "Suggeriment següent",
"play": "Inicia",
"deleting": "S'està eliminant l'instal·lador…",
"close": "Tanca",
"playing_now": "S'està jugant",
"change": "Canvia",
"repacks_modal_description": "Tria quin reempaquetat vols baixar",
"select_folder_hint": "Per a canviar la carpeta predefinida, vés a la <0>Configuració</0>",
"download_now": "Baixa ara",
"no_shop_details": "No s'han pogut recuperar els detalls de la tenda.",
"download_options": "Opcions de baixada",
"download_path": "Ruta de baixada",
"previous_screenshot": "Captura anterior",
"next_screenshot": "Captura següent",
"screenshot": "Captura {{number}}",
"open_screenshot": "Obre la captura {{number}}",
"download_settings": "Configuració de descàrrega",
"downloader": "Descarregador",
"select_executable": "Selecciona",
"no_executable_selected": "No hi ha executable selccionat",
"open_folder": "Obre carpeta",
"open_download_location": "Visualitzar fitxers descarregats",
"create_shortcut": "Crear accés directe a l'escriptori",
"remove_files": "Elimina fitxers",
"remove_from_library_title": "Segur?",
"remove_from_library_description": "Això eliminarà el videojoc {{game}} del teu catàleg",
"options": "Opcions",
"executable_section_title": "Executable",
"executable_section_description": "Directori del fitxer des d'on s'executarà quan es cliqui a \"Executar\"",
"downloads_secion_title": "Descàrregues",
"downloads_section_description": "Comprova actualitzacions o altres versions del videojoc",
"danger_zone_section_title": "Zona de perill",
"danger_zone_section_description": "Elimina aquest videojoc del teu catàleg o els fitxers descarregats per Hydra",
"download_in_progress": "Descàrrega en progrés",
"download_paused": "Descàrrega en pausa",
"last_downloaded_option": "Opció de l'última descàrrega",
"create_shortcut_success": "Accés directe creat satisfactòriament",
"create_shortcut_error": "Error al crear l'accés directe"
},
"activation": {
"title": "Activa l'Hydra",
"installation_id": "ID d'instal·lació:",
"enter_activation_code": "Introdueix el codi d'activació",
"message": "Si no saps on demanar-ho, no ho hauries de tenir.",
"activate": "Activa",
"loading": "S'està carregant…"
},
"downloads": {
"resume": "Reprèn",
"pause": "Pausa",
"eta": "Finalització {{eta}}",
"paused": "Pausada",
"verifying": "S'està verificant…",
"completed": "Completada",
"removed": "No descarregat",
"cancel": "Cancel·la",
"filter": "Filtra els jocs baixats",
"remove": "Elimina",
"downloading_metadata": "S'estan baixant les metadades…",
"deleting": "S'està eliminant l'instal·lador…",
"delete": "Elimina l'instal·lador",
"delete_modal_title": "N'estàs segur?",
"delete_modal_description": "S'eliminaran de l'ordinador tots els fitxers d'instal·lació",
"install": "Instal·la",
"download_in_progress": "En progrés",
"queued_downloads": "Descàrregues en espera",
"downloads_completed": "Completat",
"queued": "En espera",
"no_downloads_title": "Buit",
"no_downloads_description": "No has descarregat res amb Hydra encara, però mai és tard per començar a fer-ho.",
"checking_files": "Comprovant fitxers…"
},
"settings": {
"downloads_path": "Ruta de baixades",
"change": "Actualitza",
"notifications": "Notificacions",
"enable_download_notifications": "Quan finalitzi una baixada",
"enable_repack_list_notifications": "Quan s'afegeixi un nou reempaquetat",
"real_debrid_api_token_label": "Testimoni de l'API de Real Debrid",
"quit_app_instead_hiding": "Tanca l'Hydra en compte de minimitzar-la a la safata",
"launch_with_system": "Inicia l'Hydra quan s'iniciï el sistema",
"general": "General",
"behavior": "Comportament",
"download_sources": "Fonts de descàrrega",
"language": "Idioma",
"real_debrid_api_token": "Testimoni API",
"enable_real_debrid": "Activa el Real Debrid",
"real_debrid_description": "Real-Debrid és un programa de descàrrega sense restriccions que us permet descarregar fitxers a l'instant i al màxim de la vostra velocitat d'Internet.",
"real_debrid_invalid_token": "Invalida el testimoni de l'API",
"real_debrid_api_token_hint": "Pots obtenir la teva clau de l'API <0>aquí</0>.",
"real_debrid_free_account_error": "L'usuari \"{{username}}\" és un compte gratuït. Si us plau subscriu-te a Real-Debrid",
"real_debrid_linked_message": "Compte \"{{username}}\" vinculat",
"save_changes": "Desa els canvis",
"changes_saved": "Els canvis s'han desat correctament",
"download_sources_description": "Hydra buscarà els enllaços de descàrrega d'aquestes fonts. L'URL d'origen ha de ser un enllaç directe a un fitxer .json que contingui els enllaços de descàrrega.",
"validate_download_source": "Valida",
"remove_download_source": "Elimina",
"add_download_source": "Afegeix font",
"download_count_zero": "No hi ha baixades a la llista",
"download_count_one": "{{countFormatted}} a la llista de baixades",
"download_count_other": "{{countFormatted}} baixades a la llista",
"download_options_zero": "No hi ha cap descàrrega disponible",
"download_options_one": "{{countFormatted}} descàrrega disponible",
"download_options_other": "{{countFormatted}} baixades disponibles",
"download_source_url": "Descarrega l'URL de la font",
"add_download_source_description": "Inseriu la URL que conté el fitxer .json",
"download_source_up_to_date": "Actualitzat",
"download_source_errored": "S'ha produït un error",
"sync_download_sources": "Sincronitza fonts",
"removed_download_source": "S'ha eliminat la font de descàrrega",
"added_download_source": "Added download source",
"download_sources_synced": "Totes les fonts de descàrrega estan sincronitzades",
"insert_valid_json_url": "Insereix una URL JSON vàlida",
"found_download_option_zero": "No s'ha trobat cap opció de descàrrega",
"found_download_option_one": "S'ha trobat l'opció de baixada de {{countFormatted}}",
"found_download_option_other": "S'han trobat {{countFormatted}} opcions de baixada",
"import": "Import"
},
"notifications": {
"download_complete": "La baixada ha finalitzat",
"game_ready_to_install": "{{title}} ja es pot instal·lar",
"repack_list_updated": "S'ha actualitzat la llista de reempaquetats",
"repack_count_one": "S'ha afegit {{count}} reempaquetat",
"repack_count_other": "S'han afegit {{count}} reempaquetats",
"new_update_available": "Versió {{version}} disponible",
"restart_to_install_update": "Reinicieu Hydra per instal·lar l'actualització"
},
"system_tray": {
"open": "Obre l'Hydra",
"quit": "Tanca"
},
"game_card": {
"no_downloads": "No hi ha baixades disponibles"
},
"binary_not_found_modal": {
"title": "Programes no instal·lats",
"description": "No s'ha trobat els executables del Wine o el Lutris al sistema.",
"instructions": "Comprova quina és la manera correcta d'instal·lar qualsevol d'ells en la teva distribució de Linux perquè el joc pugui executar-se amb normalitat."
},
"modal": {
"close": "Botó de tancar"
},
"forms": {
"toggle_password_visibility": "Commuta la visibilitat de la contrasenya"
},
"user_profile": {
"amount_hours": "{{amount}} hores",
"amount_minutes": "{{amount}} minuts",
"last_time_played": "Última partida {{period}}",
"activity": "Activitat recent",
"library": "Biblioteca",
"total_play_time": "Temps total de joc:{{amount}}",
"no_recent_activity_title": "Hmmm… encara no res",
"no_recent_activity_description": "No has jugat a cap joc recentment. És el moment de canviar-ho!",
"display_name": "Nom de visualització",
"saving": "Desant",
"save": "Desa",
"edit_profile": "Edita el Perfil",
"saved_successfully": "S'ha desat correctament",
"try_again": "Siusplau torna-ho a provar",
"sign_out_modal_title": "Segur?",
"cancel": "Cancel·la",
"successfully_signed_out": "S'ha tancat la sessió correctament",
"sign_out": "Tanca sessió",
"playing_for": "Jugant per {{amount}}",
"sign_out_modal_text": "La vostra biblioteca està enllaçada amb el vostre compte actual. Quan tanqueu la sessió, la vostra biblioteca ja no serà visible i cap progrés no es desarà. Voleu continuar amb tancar la sessió?",
"add_friends": "Afegeix amics",
"add": "Afegeix",
"friend_code": "Codi de l'amic",
"see_profile": "Veure Perfil",
"sending": "Enviant",
"friend_request_sent": "Sol·licitud d'amistat enviada",
"friends": "Amistats",
"friends_list": "Llista d'amistats",
"user_not_found": "Usuari no trobat"
}
}

View File

@@ -0,0 +1,272 @@
{
"language_name": "Čeština",
"app": {
"successfully_signed_in": "Úspěšně přihlášen"
},
"home": {
"featured": "Doporučené",
"trending": "Trendy",
"surprise_me": "Překvap mě",
"no_results": "Výsledek nenalezen"
},
"sidebar": {
"catalogue": "Katalog",
"downloads": "Stažené",
"settings": "Nastavení",
"my_library": "Moje knihovna",
"downloading_metadata": "{{title}} (Stahuji metadata…)",
"paused": "{{title}} (Pozastaveno)",
"downloading": "{{title}} ({{percentage}} - Stahuji…)",
"filter": "Filtrovat knihovnu",
"home": "Domov",
"queued": "{{title}} (V řadě)",
"game_has_no_executable": "Hra nemá zvolen žádný spustitelný soubor",
"sign_in": "Přihlásit se"
},
"header": {
"search": "Vyhledat hry",
"home": "Domov",
"catalogue": "Katalog",
"downloads": "Stažené",
"search_results": "Výsledky vyhledávání",
"settings": "Nastavení",
"version_available_install": "Je dostupná nová verze: {{version}}. Klikni sem pro restart a instalaci.",
"version_available_download": "Je dostupná nová verze: {{version}}. Klikni sem pro stažení."
},
"bottom_panel": {
"no_downloads_in_progress": "Neprobíhá žádné stahování",
"downloading_metadata": "Stahuji metadata: {{title}}…",
"downloading": "Stahuji {{title}}… ({{percentage}} staženo) - Odhadovaný čas {{eta}} - {{speed}}",
"calculating_eta": "Stahuji {{title}}… ({{percentage}} staženo) - Počítám zbývající čas…",
"checking_files": "Kontroluji soubory: {{title}}… ({{percentage}} ověřeno)"
},
"catalogue": {
"next_page": "Další strana",
"previous_page": "Předchozí strana"
},
"game_details": {
"open_download_options": "Otevřít možnosti stahování",
"download_options_zero": "Žádné možnosti stahování",
"download_options_one": "{{count}} možnost stažení",
"download_options_other": "{{count}} možnosti stažení",
"updated_at": "Aktualizováno {{updated_at}}",
"install": "Instalovat",
"resume": "Obnovit",
"pause": "Pozastavit",
"cancel": "Zrušit",
"remove": "Odebrat",
"space_left_on_disk": "{{space}} zbývá na disku",
"eta": "Odhadovaný čas: {{eta}}",
"calculating_eta": "Počítám zbývající čas…",
"downloading_metadata": "Stahuji metadata…",
"filter": "Filtrovat repacky",
"requirements": "Systémové požadavky",
"minimum": "Minimální",
"recommended": "Doporučené",
"paused": "Pozastaveno",
"release_date": "Datum vydání: {{date}}",
"publisher": "Publikováno: {{publisher}}",
"hours": "hodiny",
"minutes": "minuty",
"amount_hours": "{{amount}} hodin",
"amount_minutes": "{{amount}} minut",
"accuracy": "Přesnost {{accuracy}}%",
"add_to_library": "Přidat do knihovny",
"remove_from_library": "Odebrat z knihovny",
"no_downloads": "Žádné možnosti stahování nejsou dostupné",
"play_time": "Odehraný čas: {{amount}}",
"last_time_played": "Naposledy hráno {{period}}",
"not_played_yet": "Ješte jste nehráli {{title}}",
"next_suggestion": "Další doporučení",
"play": "Hrát",
"deleting": "Odstraňuji instalační program…",
"close": "Zavřít",
"playing_now": "Právě hraje",
"change": "Změnit",
"repacks_modal_description": "Vyber repack který chceš stáhnout",
"select_folder_hint": "Pro změnu základní složky, jdi do <0>Nastavení</0>",
"download_now": "Stáhnout",
"no_shop_details": "Nepodařilo se mi načíst informace o obchodu.",
"download_options": "Možnosti stahování",
"download_path": "Umístění stahování",
"previous_screenshot": "Předchozí snímek obrazovky",
"next_screenshot": "Následující snímek obrazovky",
"screenshot": "Snímek obrazovky {{number}}",
"open_screenshot": "Otevřít snímek obrazovky {{number}}",
"download_settings": "Nastavení stahování",
"downloader": "Správce stahování",
"select_executable": "Vybrat",
"no_executable_selected": "Nebyl vybrán spustitelný soubor",
"open_folder": "Otevřít složku",
"open_download_location": "Zobrazit stažené soubory",
"create_shortcut": "Vytvořit zástupce na ploše",
"remove_files": "Odebrat soubory",
"remove_from_library_title": "Jste si jisti?",
"remove_from_library_description": "Tohle odstraní {{game}} z vaší knihovny",
"options": "Možnosti",
"executable_section_title": "Spustitelné",
"executable_section_description": "Umístění souboru který bude spuštěn při kliknutí na \"Hrát\"",
"downloads_secion_title": "Stažené soubory",
"downloads_section_description": "Zkontrolovat jestli není nová / odlišná verze hry",
"danger_zone_section_title": "Nebezpečná zóna",
"danger_zone_section_description": "Odebrat hru z knihovny / soubory stažené Hydrou",
"download_in_progress": "Probíhá stahování",
"download_paused": "Stahování pozastaveno",
"last_downloaded_option": "Poslední stažená možnost",
"create_shortcut_success": "Zástupce vytvořen úspěšně",
"create_shortcut_error": "Chyba při pokusu vytvořit zástupce"
},
"activation": {
"title": "Aktivovat hydru",
"installation_id": "ID instalace:",
"enter_activation_code": "Zadej svůj aktivační kód",
"message": "Pokud nevíš, kde ten kód sehnat, tak by jsi k tomuhle neměl mít přístup.",
"activate": "Aktivovat",
"loading": "Načítání…"
},
"downloads": {
"resume": "Pokračovat",
"pause": "Pozastavit",
"eta": "Odhadovaný čas: {{eta}}",
"paused": "Pozastaveno",
"verifying": "Ověřuji…",
"completed": "Hotovo",
"removed": "Není staženo",
"cancel": "Zrušit",
"filter": "Filtrovat stažené hry",
"remove": "Odebrat",
"downloading_metadata": "Stahuji metadata…",
"deleting": "Odstraňuji instalační program…",
"delete": "Odebrat instalační program",
"delete_modal_title": "Jste si jisti?",
"delete_modal_description": "Tohle odstraní všechny instalační soubory",
"install": "Instalovat",
"download_in_progress": "Probíhá stahování",
"queued_downloads": "Stahování v řadě",
"downloads_completed": "Dokončeno",
"queued": "V řadě",
"no_downloads_title": "Prázdno..",
"no_downloads_description": "Ještě jsi zatím nic nestáhl přes Hydru, ale furt není pozdě začít.",
"checking_files": "Kontroluji soubory…"
},
"settings": {
"downloads_path": "Umístění stahování",
"change": "Aktualizovat",
"notifications": "Upozornění",
"enable_download_notifications": "Až bude stahování dokončeno",
"enable_repack_list_notifications": "Když bude přidán nový repack",
"real_debrid_api_token_label": "Real-Debrid API token",
"quit_app_instead_hiding": "Nezavírat Hydru při zavření okna",
"launch_with_system": "Spustit Hydru při startu systému",
"general": "Hlavní",
"behavior": "Chování",
"download_sources": "Zdroje stahování",
"language": "Jazyk",
"real_debrid_api_token": "API Token",
"enable_real_debrid": "Povolit Real-Debrid",
"real_debrid_description": "Real-Debrid je neomezený správce stahování, který umožňuje stahovat soubory v nejvyšší rychlosti vašeho internetu.",
"real_debrid_invalid_token": "Neplatný API token",
"real_debrid_api_token_hint": "API token můžeš sehnat <0>zde</0>",
"real_debrid_free_account_error": "Účet \"{{username}}\" má základní úroveň. Prosím předplaťte si Real-Debrid",
"real_debrid_linked_message": "Účet \"{{username}}\" je propojen",
"save_changes": "Uložit změny",
"changes_saved": "Změny úspěšně uloženy",
"download_sources_description": "Hydra bude odsud sbírat soubory. Zdrojový odkaz musí být .json soubor obsahující odkazy na soubory.",
"validate_download_source": "Ověřit",
"remove_download_source": "Odebrat",
"add_download_source": "Přidat zdroj",
"download_count_zero": "Žádná možnost stažení",
"download_count_one": "{{countFormatted}} možnost stažení",
"download_count_other": "{{countFormatted}} možnosti stažení",
"download_source_url": "Stáhnout zdrojový odkaz",
"add_download_source_description": "Zadej odkaz odkazující na .json soubor",
"download_source_up_to_date": "Aktuální",
"download_source_errored": "Chyba",
"sync_download_sources": "Synchronizovat zdroje",
"removed_download_source": "Zdroj odebrán",
"added_download_source": "Zdroj přidán",
"download_sources_synced": "Všechny zdroje jsou synchronizovány",
"insert_valid_json_url": "Zadej platnou JSON adresu",
"found_download_option_zero": "Nenalezena žádná možnost stahování",
"found_download_option_one": "Nalezena {{countFormatted}} možnost stahování",
"found_download_option_other": "Nalezeny {{countFormatted}} možnosti stahování",
"import": "Importovat"
},
"notifications": {
"download_complete": "Stahování dokončeno",
"game_ready_to_install": "{{title}} je připraveno k instalaci",
"repack_list_updated": "Seznam repacků byl aktualizován",
"repack_count_one": "{{count}} repack přidán",
"repack_count_other": "{{count}} repacky přidány",
"new_update_available": "Version {{version}} je dostupná",
"restart_to_install_update": "Restartuj Hydru pro aktualizaci"
},
"system_tray": {
"open": "Otevřít Hydru",
"quit": "Odejít"
},
"game_card": {
"no_downloads": "Žádné možnosti stahování nenalezeny"
},
"binary_not_found_modal": {
"title": "Programy nenainstalovány",
"description": "Spustitelné soubory Wine nebo Lutris nebyly nalezeny ve vašem systému",
"instructions": "Zkonstroluj oficiální cestu jak je nainstalovat na tvoji Linux Distribuci, aby hry mohly běžet normálně"
},
"modal": {
"close": "Tlačítko zavřít"
},
"forms": {
"toggle_password_visibility": "Přepnout viditelnost hesla"
},
"user_profile": {
"amount_hours": "{{amount}} hodin",
"amount_minutes": "{{amount}} minut",
"last_time_played": "Naposledy hráno {{period}}",
"activity": "Nedávná aktivita",
"library": "Knihovna",
"total_play_time": "Celkový odehraný čas: {{amount}}",
"no_recent_activity_title": "Hmmm… nic tu není",
"no_recent_activity_description": "V poslední době si nehrál žádnout hru, můžeš to ale napravit!",
"display_name": "Zobrazované jméno",
"saving": "Ukládání",
"save": "Uložit",
"edit_profile": "Upravit profil",
"saved_successfully": "Úspěšně uloženo",
"try_again": "Prosím, zkuste to znovu",
"sign_out_modal_title": "Jste si jisti?",
"cancel": "Zrušit",
"successfully_signed_out": "Úspěšně odhlášeno",
"sign_out": "Odhlásit se",
"playing_for": "Hraje po: {{amount}}",
"sign_out_modal_text": "Vaše knihovna je propojena s vaším současným účtem. Po odhlášení vaše knihovna již nebude vidět, a postup nebude uložen. Pokračovat?",
"add_friends": "Přidat přátele",
"add": "Přidat",
"friend_code": "Kód přítele",
"see_profile": "Zobrazit profil",
"sending": "Odesílání",
"friend_request_sent": "Žádost odeslána",
"friends": "Přátelé",
"friends_list": "Seznam přátel",
"user_not_found": "Uživatel nenalezen",
"block_user": "Zablokovat uživatele",
"add_friend": "Přidat přítele",
"request_sent": "Žádost odeslána",
"request_received": "Žádost obdržena",
"accept_request": "Přijmout žádost",
"ignore_request": "Ignorovat žádost",
"cancel_request": "Zrušit žádost",
"undo_friendship": "Odvolat přátelství",
"request_accepted": "Žádost přijata",
"user_blocked_successfully": "Uživatel úspěšně zablokován",
"user_block_modal_text": "Tohle zablokuje {{displayName}}",
"blocked_users": "Zablokovaní uživatelé",
"unblock": "Odblokovat",
"no_friends_added": "Nemáš přidané žádné přátele",
"pending": "Odchozí",
"no_pending_invites": "Nemáte žádné příchozí žádosti",
"no_blocked_users": "Nemáte nikoho zablokovaného",
"friend_code_copied": "Kód přítele zkopírován",
"undo_friendship_modal_text": "Tímto zrušíte své přátelství s {{displayName}}"
}
}

View File

@@ -1,4 +1,5 @@
{
"language_name": "Dansk",
"home": {
"featured": "Anbefalet",
"trending": "Trender",

View File

@@ -0,0 +1,272 @@
{
"language_name": "Deutsch",
"app": {
"successfully_signed_in": "Erfolgreich angemeldet"
},
"home": {
"featured": "Empfohlen",
"trending": "Beliebt",
"surprise_me": "Überrasche mich",
"no_results": "Keine Ergebnisse gefunden"
},
"sidebar": {
"catalogue": "Katalog",
"downloads": "Downloads",
"settings": "Einstellungen",
"my_library": "Meine Bibliothek",
"downloading_metadata": "{{title}} (Metadaten werden heruntergeladen…)",
"paused": "{{title}} (Pausiert)",
"downloading": "{{title}} ({{percentage}} - Wird heruntergeladen…)",
"filter": "Bibliothek filtern",
"home": "Home",
"queued": "{{title}} (In Warteschlange)",
"game_has_no_executable": "Spiel hat keine ausführbare Datei gewählt",
"sign_in": "Anmelden"
},
"header": {
"search": "Spiele suchen",
"home": "Home",
"catalogue": "Katalog",
"downloads": "Downloads",
"search_results": "Suchergebnisse",
"settings": "Einstellungen",
"version_available_install": "Version {{version}} verfügbar. Klicke hier, um neuzustarten und sie zu installieren.",
"version_available_download": "Version {{version}} verfügbar. Klicke hier, um sie herunterzuladen."
},
"bottom_panel": {
"no_downloads_in_progress": "Keine aktive Downloads",
"downloading_metadata": "Metadaten von {{title}} werden heruntergeladen…",
"downloading": "{{title}} wird heruntergeladen… ({{percentage}} abgeschlossen) - Abschluss {{eta}} - {{speed}}",
"calculating_eta": "{{title}} wird heruntergeladen… ({{percentage}} abgeschlossen) - Verbleibende Zeit wird berechnet…",
"checking_files": "Prüfe Dateien von {{title}}… ({{percentage}} abgeschlossen)"
},
"catalogue": {
"next_page": "Nächste Seite",
"previous_page": "Vorherige Seite"
},
"game_details": {
"open_download_options": "Download-Optionen öffnen",
"download_options_zero": "Keine Download-Optionen",
"download_options_one": "{{count}} Download-Option",
"download_options_other": "{{count}} Download-Optionen",
"updated_at": "Aktualisiert {{updated_at}}",
"install": "Installieren",
"resume": "Fortfahren",
"pause": "Pausieren",
"cancel": "Abbrechen",
"remove": "Entfernen",
"space_left_on_disk": "{{space}} auf Festplatte verfügbar",
"eta": "Abschluss {{eta}}",
"calculating_eta": "Verbleibende Zeit wird berechnet…",
"downloading_metadata": "Metadaten werden heruntergeladen…",
"filter": "Repacks filtern",
"requirements": "Systemanforderungen",
"minimum": "Minimum",
"recommended": "Empfohlen",
"paused": "Pausiert",
"release_date": "Veröffentlicht am {{date}}",
"publisher": "Veröffentlicht von {{publisher}}",
"hours": "Stunden",
"minutes": "Minuten",
"amount_hours": "{{amount}} Stunden",
"amount_minutes": "{{amount}} Minuten",
"accuracy": "{{accuracy}}% Genauigkeit",
"add_to_library": "Zu Bibliothek hinzufügen",
"remove_from_library": "Von Bibliothek entfernen",
"no_downloads": "Keine Downloads verfügbar",
"play_time": "{{amount}} lang gespielt",
"last_time_played": "Zuletzt gespielt {{period}}",
"not_played_yet": "{{title}} wurde noch nicht gespielt",
"next_suggestion": "Nächste Empfehlung",
"play": "Spielen",
"deleting": "Installer wird gelöscht…",
"close": "Schließen",
"playing_now": "Spielt jetzt",
"change": "Ändern",
"repacks_modal_description": "Wähle das Repack, das du herunterladen möchtest",
"select_folder_hint": "Um das Standardverzeichnis zu ändern, gehe zu den <0>Einstellungen</0>",
"download_now": "Jetzt herunterladen",
"no_shop_details": "Shop-Details konnten nicht abgerufen werden.",
"download_options": "Download-Optionen",
"download_path": "Download-Verzeichnis",
"previous_screenshot": "Vorheriger Screenshot",
"next_screenshot": "Nächster Screenshot",
"screenshot": "Screenshot {{number}}",
"open_screenshot": "Screenshot {{number}} öffnen",
"download_settings": "Download-Einstellungen",
"downloader": "Downloader",
"select_executable": "Auswählen",
"no_executable_selected": "Keine ausführbare Datei gewählt",
"open_folder": "Verzeichnis öffnen",
"open_download_location": "Heruntergeladene Dateien anzeigen",
"create_shortcut": "Desktop-Verknüpfung erstellen",
"remove_files": "Dateien entfernen",
"remove_from_library_title": "Bist du dir sicher?",
"remove_from_library_description": "Dies wird {{game}} aus deiner Bibliothek entfernen",
"options": "Optionen",
"executable_section_title": "Ausführbare Datei",
"executable_section_description": "Pfad der Datei, die bei Klick auf \"Play\" ausgeführt wird",
"downloads_secion_title": "Downloads",
"downloads_section_description": "Sieh dir Updates oder andere Versionen dieses Spiels an",
"danger_zone_section_title": "Gefahrenzone",
"danger_zone_section_description": "Entferne dieses Spiel aus deiner Bibliothek oder die von Hydra heruntergeladenen Dateien",
"download_in_progress": "Download erfolgt",
"download_paused": "Download ist pausiert",
"last_downloaded_option": "Letzte Download-Option",
"create_shortcut_success": "Verknüpfung erfolgreich erstellt",
"create_shortcut_error": "Fehler bei Erstellung von Verknüpfung"
},
"activation": {
"title": "Hydra aktivieren",
"installation_id": "Installations ID:",
"enter_activation_code": "Aktivierungscode eingeben",
"message": "Wenn du nicht weißt wo du fragen musst, solltest du dies nicht haben.",
"activate": "Aktivieren",
"loading": "Lädt…"
},
"downloads": {
"resume": "Fortfahren",
"pause": "Pause",
"eta": "Abschluss {{eta}}",
"paused": "Pausiert",
"verifying": "Verifiziere…",
"completed": "Abgeschlossen",
"removed": "Nicht heruntergeladen",
"cancel": "Abbrechen",
"filter": "Heruntergeladene Spiele filtern",
"remove": "Entfernen",
"downloading_metadata": "Metadaten werden heruntergeladen…",
"deleting": "Installer wird entfernt…",
"delete": "Installer entfernen",
"delete_modal_title": "Bist du dir sicher?",
"delete_modal_description": "Dies wird alle Installationsdateien von deinem Computer entfernen",
"install": "Installieren",
"download_in_progress": "Läuft",
"queued_downloads": "Downloads in Warteschlange",
"downloads_completed": "Abgeschlossen",
"queued": "In Warteschlange",
"no_downloads_title": "Welch Leere",
"no_downloads_description": "Du hast mit Hydra noch nichts heruntergeladen, aber es ist nie zu spät anzufangen.",
"checking_files": "Dateien werden überprüft…"
},
"settings": {
"downloads_path": "Download-Pfad",
"change": "Aktualisieren",
"notifications": "Benachrichtigungen",
"enable_download_notifications": "Wenn ein Download abgeschlossen wird",
"enable_repack_list_notifications": "Wenn ein neues Repack hinzugefügt wird",
"real_debrid_api_token_label": "Real-Debrid API Token",
"quit_app_instead_hiding": "Hydra verlassen statt minimieren beim Schließen",
"launch_with_system": "Hydra bei Systemstart starten",
"general": "Allgemein",
"behavior": "Verhalten",
"download_sources": "Download-Quellen",
"language": "Sprache",
"real_debrid_api_token": "API Token",
"enable_real_debrid": "Real-Debrid aktivieren",
"real_debrid_description": "Real-Debrid ist ein unrestriktiver Downloader, der es dir ermöglicht Dateien sofort und mit deiner maximalen Internetgeschwindigkeit herunterzuladen.",
"real_debrid_invalid_token": "API token nicht gültig",
"real_debrid_api_token_hint": "<0>Hier</0> kannst du dir deinen API Token holen",
"real_debrid_free_account_error": "Das Konto \"{{username}}\" ist ein gratis account. Bitte abonniere Real-Debrid",
"real_debrid_linked_message": "Konto \"{{username}}\" verknüpft",
"save_changes": "Änderungen speichern",
"changes_saved": "Änderungen erfolgreich gespeichert",
"download_sources_description": "Hydra wird die Download-Links von diesen Quellen abrufen. Die Quell-URL muss ein direkter Link zu einer .json Datei, welche die Download-Links enthält, sein.",
"validate_download_source": "Validieren",
"remove_download_source": "Entfernen",
"add_download_source": "Quelle hinzufügen",
"download_count_zero": "Keine Download-Option",
"download_count_one": "{{countFormatted}} Download-Option",
"download_count_other": "{{countFormatted}} Download-Optionen",
"download_source_url": "Download Quell-URL",
"add_download_source_description": "Füge die URL, welche die .json Datei enthält, ein",
"download_source_up_to_date": "Auf aktuellem Stand",
"download_source_errored": "Fehlgeschlagen",
"sync_download_sources": "Quellen synchronisieren",
"removed_download_source": "Download-Quelle entfernt",
"added_download_source": "Download-Quelle hinzugefügt",
"download_sources_synced": "Alle Download-Quellen sind synchronisiert",
"insert_valid_json_url": "Füge eine gültige JSON URL ein",
"found_download_option_zero": "Keine Download-Option gefunden",
"found_download_option_one": "{{countFormatted}} Download-Option gefunden",
"found_download_option_other": "{{countFormatted}} Download-Optionen gefunden",
"import": "Importieren"
},
"notifications": {
"download_complete": "Download abgeschlossen",
"game_ready_to_install": "{{title}} ist bereit zur Installation",
"repack_list_updated": "Repack-Liste aktualisiert",
"repack_count_one": "{{count}} Repack hinzugefügt",
"repack_count_other": "{{count}} Repacks hinzugefügt",
"new_update_available": "Version {{version}} verfügbar",
"restart_to_install_update": "Um das Update zu installieren, starte Hydra neu"
},
"system_tray": {
"open": "Hydra öffnen",
"quit": "Schließen"
},
"game_card": {
"no_downloads": "Keine Downloads verfügbar"
},
"binary_not_found_modal": {
"title": "Programme nicht installiert",
"description": "Ausführbare Dateien für Wine oder Lutris wurden auf deinem System nicht gefunden",
"instructions": "Überprüfe die korrekte Installation dieser für deine Linux-Distro, damit das Spiel normal laufen kann"
},
"modal": {
"close": "Knopf schließen"
},
"forms": {
"toggle_password_visibility": "Sichtbarkeit des Passworts umschalten"
},
"user_profile": {
"amount_hours": "{{amount}} Stunden",
"amount_minutes": "{{amount}} Minuten",
"last_time_played": "Zuletzt gespielt {{period}}",
"activity": "Letzte Aktivität",
"library": "Bibliothek",
"total_play_time": "Gesamtspielzeit: {{amount}}",
"no_recent_activity_title": "Hmmm… hier ist nichts",
"no_recent_activity_description": "Du hast in letzter Zeit keine Spiele gespielt. Es wird Zeit das zu ändern!",
"display_name": "Anzeigename",
"saving": "Speichert",
"save": "Speichern",
"edit_profile": "Profil Bearbeiten",
"saved_successfully": "Erfolgreich gespeichert",
"try_again": "Bitte versuche es erneut",
"sign_out_modal_title": "Bist du dir sicher?",
"cancel": "Abbrechen",
"successfully_signed_out": "Erfolgreich abgemeldet",
"sign_out": "Abmelden",
"playing_for": "Spielt {{amount}} lang",
"sign_out_modal_text": "Deine Bibliothek ist mit deinem aktuellen Konto verknüpft. Wenn du dich abmeldest, wird deine Bibliothek nicht mehr sichtbar sein und jeglicher Fortschritt wird nicht gespeichert. Abmelden fortführen?",
"add_friends": "Freunde hinzufügen",
"add": "Hinzufügen",
"friend_code": "Freundescode",
"see_profile": "Profil anzeigen",
"sending": "Sendet",
"friend_request_sent": "Freundschaftsanfrage versendet",
"friends": "Freunde",
"friends_list": "Freundesliste",
"user_not_found": "Nutzer nicht gefunden",
"block_user": "Nutzer blockieren",
"add_friend": "Freund hinzufügen",
"request_sent": "Anfrage versendet",
"request_received": "Anfrage erhalten",
"accept_request": "Anfrage annehmen",
"ignore_request": "Anfrage ignorieren",
"cancel_request": "Anfrage zurückziehen",
"undo_friendship": "Freundschaft kündigen",
"request_accepted": "Anfrage akzeptiert",
"user_blocked_successfully": "Nutzer erfolgreich blockiert",
"user_block_modal_text": "{{displayName}} wird dadurch blockiert",
"blocked_users": "Blockierte Nutzer",
"unblock": "Freigeben",
"no_friends_added": "Du hast noch keine Freunde hinzugefügt",
"pending": "Ausstehend",
"no_pending_invites": "Du hast keine ausstehenden Einladungen",
"no_blocked_users": "Du hast keine blockierten Nutzer",
"friend_code_copied": "Freundescode kopiert",
"undo_friendship_modal_text": "Freundschaft mit {{displayName}} wird dadurch gekündigt"
}
}

View File

@@ -1,4 +1,5 @@
{
"language_name": "English",
"app": {
"successfully_signed_in": "Successfully signed in"
},
@@ -6,7 +7,10 @@
"featured": "Featured",
"trending": "Trending",
"surprise_me": "Surprise me",
"no_results": "No results found"
"no_results": "No results found",
"start_typing": "Starting typing to search...",
"hot": "🔥 Hot now",
"weekly": "📅 Top games of the week"
},
"sidebar": {
"catalogue": "Catalogue",
@@ -20,7 +24,8 @@
"home": "Home",
"queued": "{{title}} (Queued)",
"game_has_no_executable": "Game has no executable selected",
"sign_in": "Sign in"
"sign_in": "Sign in",
"friends": "Friends"
},
"header": {
"search": "Search games",
@@ -36,7 +41,8 @@
"no_downloads_in_progress": "No downloads in progress",
"downloading_metadata": "Downloading {{title}} metadata…",
"downloading": "Downloading {{title}}… ({{percentage}} complete) - Conclusion {{eta}} - {{speed}}",
"calculating_eta": "Downloading {{title}}… ({{percentage}} complete) - Calculating remaining time…"
"calculating_eta": "Downloading {{title}}… ({{percentage}} complete) - Calculating remaining time…",
"checking_files": "Checking {{title}} files… ({{percentage}} complete)"
},
"catalogue": {
"next_page": "Next page",
@@ -112,7 +118,19 @@
"download_paused": "Download paused",
"last_downloaded_option": "Last downloaded option",
"create_shortcut_success": "Shortcut created successfully",
"create_shortcut_error": "Error creating shortcut"
"create_shortcut_error": "Error creating shortcut",
"nsfw_content_title": "This game contains innapropriate content",
"nsfw_content_description": "{{title}} contains content that may not be suitable for all ages. Are you sure you want to continue?",
"allow_nsfw_content": "Continue",
"refuse_nsfw_content": "Go back",
"stats": "Stats",
"download_count": "Downloads",
"player_count": "Active players",
"download_error": "This download option is not available",
"download": "Download",
"executable_path_in_use": "Executable already in use by \"{{game}}\"",
"warning": "Warning:",
"hydra_needs_to_remain_open": "for this download, Hydra needs to remain open util its conclusion. In case Hydra closes before the conclusion, you will lose your progress."
},
"activation": {
"title": "Activate Hydra",
@@ -144,7 +162,8 @@
"downloads_completed": "Completed",
"queued": "Queued",
"no_downloads_title": "Such empty",
"no_downloads_description": "You haven't downloaded anything with Hydra yet, but it's never too late to start."
"no_downloads_description": "You haven't downloaded anything with Hydra yet, but it's never too late to start.",
"checking_files": "Checking files…"
},
"settings": {
"downloads_path": "Downloads path",
@@ -172,12 +191,9 @@
"validate_download_source": "Validate",
"remove_download_source": "Remove",
"add_download_source": "Add source",
"download_count_zero": "No downloads in list",
"download_count_one": "{{countFormatted}} download in list",
"download_count_other": "{{countFormatted}} downloads in list",
"download_options_zero": "No download available",
"download_options_one": "{{countFormatted}} download available",
"download_options_other": "{{countFormatted}} downloads available",
"download_count_zero": "No download options",
"download_count_one": "{{countFormatted}} download option",
"download_count_other": "{{countFormatted}} download options",
"download_source_url": "Download source URL",
"add_download_source_description": "Insert the URL containing the .json file",
"download_source_up_to_date": "Up-to-date",
@@ -190,14 +206,27 @@
"found_download_option_zero": "No download option found",
"found_download_option_one": "Found {{countFormatted}} download option",
"found_download_option_other": "Found {{countFormatted}} download options",
"import": "Import"
"import": "Import",
"public": "Public",
"private": "Private",
"friends_only": "Friends only",
"privacy": "Privacy",
"profile_visibility": "Profile visibility",
"profile_visibility_description": "Choose who can see your profile and library",
"required_field": "This field is required",
"source_already_exists": "This source has been already added",
"must_be_valid_url": "The source must be a valid URL",
"blocked_users": "Blocked users",
"user_unblocked": "User has been unblocked"
},
"notifications": {
"download_complete": "Download complete",
"game_ready_to_install": "{{title}} is ready to install",
"repack_list_updated": "Repack list updated",
"repack_count_one": "{{count}} repack added",
"repack_count_other": "{{count}} repacks added"
"repack_count_other": "{{count}} repacks added",
"new_update_available": "Version {{version}} available",
"restart_to_install_update": "Restart Hydra to install the update"
},
"system_tray": {
"open": "Open Hydra",
@@ -237,6 +266,51 @@
"successfully_signed_out": "Successfully signed out",
"sign_out": "Sign out",
"playing_for": "Playing for {{amount}}",
"sign_out_modal_text": "Your library is linked with your current account. When signing out, your library will not be visible anymore, and any progress will not be saved. Continue with sign out?"
"sign_out_modal_text": "Your library is linked with your current account. When signing out, your library will not be visible anymore, and any progress will not be saved. Continue with sign out?",
"add_friends": "Add Friends",
"add": "Add",
"friend_code": "Friend code",
"see_profile": "See profile",
"sending": "Sending",
"friend_request_sent": "Friend request sent",
"friends": "Friends",
"friends_list": "Friends list",
"user_not_found": "User not found",
"block_user": "Block user",
"add_friend": "Add friend",
"request_sent": "Request sent",
"request_received": "Request received",
"accept_request": "Accept request",
"ignore_request": "Ignore request",
"cancel_request": "Cancel request",
"undo_friendship": "Undo friendship",
"request_accepted": "Request accepted",
"user_blocked_successfully": "User blocked successfully",
"user_block_modal_text": "This will block {{displayName}}",
"blocked_users": "Blocked users",
"unblock": "Unblock",
"no_friends_added": "You still don't have added friends",
"pending": "Pending",
"no_pending_invites": "You have no pending invites",
"no_blocked_users": "You have no blocked users",
"friend_code_copied": "Friend code copied",
"undo_friendship_modal_text": "This will undo your friendship with {{displayName}}",
"privacy_hint": "To adjust who can see this, go to the <0>Settings</0>",
"locked_profile": "This profile is private",
"image_process_failure": "Failure while processing the image",
"required_field": "This field is required",
"displayname_min_length": "Display name must be at least 3 characters long",
"displayname_max_length": "Display name must be at most 50 characters long",
"report_profile": "Report this profile",
"report_reason": "Why are you reporting this profile?",
"report_description": "Additional information",
"report_description_placeholder": "Additional information",
"report": "Report",
"report_reason_hate": "Hate speech",
"report_reason_sexual_content": "Sexual content",
"report_reason_violence": "Violence",
"report_reason_spam": "Spam",
"report_reason_other": "Other",
"profile_reported": "Profile reported"
}
}

View File

@@ -1,12 +1,16 @@
{
"language_name": "Español",
"app": {
"successfully_signed_in": "Successfully signed in (TRANSLATE ME)"
"successfully_signed_in": "Sesión iniciada correctamente"
},
"home": {
"featured": "Destacado",
"trending": "Tendencias",
"surprise_me": "¡Sorpréndeme!",
"no_results": "No se encontraron resultados"
"no_results": "No se encontraron resultados",
"hot": "🔥 Caliente ahora",
"weekly": "📅 Los mejores juegos de la semana",
"start_typing": "Empieza a escribir para buscar..."
},
"sidebar": {
"catalogue": "Catálogo",
@@ -20,7 +24,8 @@
"home": "Inicio",
"queued": "{{title}} (En Cola)",
"game_has_no_executable": "El juego no tiene un ejecutable",
"sign_in": "Sign in (TRANSLATE ME)"
"sign_in": "Iniciar sesión",
"friends": "Amigos"
},
"header": {
"search": "Buscar juegos",
@@ -36,7 +41,8 @@
"no_downloads_in_progress": "Sin descargas en progreso",
"downloading_metadata": "Descargando metadatos de {{title}}…",
"downloading": "Descargando {{title}}… ({{percentage}} completado) - Finalizando {{eta}} - {{speed}}",
"calculating_eta": "Descargando {{title}}… ({{percentage}} completado) - Calculando tiempo restante…"
"calculating_eta": "Descargando {{title}}… ({{percentage}} completado) - Calculando tiempo restante…",
"checking_files": "Verificando archivos de {{title}}… ({{percentage}} completado)"
},
"catalogue": {
"next_page": "Siguiente página",
@@ -47,7 +53,7 @@
"download_options_zero": "No hay opciones de descargas disponibles",
"download_options_one": "{{count}} opción de descarga",
"download_options_other": "{{count}} opciones de descargas",
"updated_at": "Actualizado el {{updated_at}}",
"updated_at": "Actualizado el: {{updated_at}}",
"install": "Instalar",
"resume": "Continuar",
"pause": "Pausa",
@@ -73,7 +79,7 @@
"remove_from_library": "Eliminar de la biblioteca",
"no_downloads": "No hay descargas disponibles",
"play_time": "Jugado por {{amount}}",
"last_time_played": "Jugado por última vez {{period}}",
"last_time_played": "Jugado por última vez: {{period}}",
"not_played_yet": "Aún no has jugado a {{title}}",
"next_suggestion": "Siguiente sugerencia",
"play": "Jugar",
@@ -92,7 +98,7 @@
"screenshot": "Captura {{number}}",
"open_screenshot": "Abrir captura {{number}}",
"download_settings": "Ajustes de descarga",
"downloader": "Descargador",
"downloader": "Método de descarga",
"select_executable": "Seleccionar",
"no_executable_selected": "No se seleccionó un ejecutable",
"open_folder": "Abrir carpeta",
@@ -106,11 +112,23 @@
"executable_section_description": "Ruta del archivo que se ejecutará cuando se presione \"Jugar\"",
"downloads_secion_title": "Descargas",
"downloads_section_description": "Buscar actualizaciones u otras versiones de este juego",
"danger_zone_section_title": "Zona de Peligro",
"danger_zone_section_description": "Eliminar este juego de tu librería o los archivos descargados por Hydra",
"danger_zone_section_title": "Opciones Avanzadas",
"danger_zone_section_description": "Eliminar este juego de tu librería o los archivos descargados por Hydra (Esto solo eliminará los archivos de instalación y no el juego instalado)",
"download_in_progress": "Descarga en progreso",
"download_paused": "Descarga pausada",
"last_downloaded_option": "Última opción descargada"
"last_downloaded_option": "Última opción descargada",
"create_shortcut_success": "Atajo creado con éxito",
"create_shortcut_error": "Error al crear un atajo",
"allow_nsfw_content": "Continuar",
"download": "Descargar",
"download_count": "Descargas",
"download_error": "Esta opción de descarga no está disponible.",
"executable_path_in_use": "Ejecutable ya en uso por \"{{game}}\"",
"nsfw_content_description": "{{title}} incluye contenido que puede no ser adecuado para todas las edades. \n¿Estás seguro de que quieres continuar?",
"nsfw_content_title": "Este juego contiene contenido inapropiado.",
"player_count": "Jugadores activos",
"refuse_nsfw_content": "Volver",
"stats": "Estadísticas"
},
"activation": {
"title": "Activar Hydra",
@@ -135,14 +153,15 @@
"deleting": "Eliminando instalador…",
"delete": "Eliminar instalador",
"delete_modal_title": "¿Estás seguro?",
"delete_modal_description": "Esto eliminará todos los archivos de instalación de tu computadora.",
"delete_modal_description": "Esto eliminará todos los archivos de la instalación del repack del juego de tu computadora. (Si ya instalaste el juego, puedes eliminar esto, no afectará al juego)",
"install": "Instalar",
"download_in_progress": "En progreso",
"queued_downloads": "Descargas en cola",
"downloads_completed": "Completado",
"queued": "En cola",
"no_downloads_title": "Esto está tan... vacío",
"no_downloads_description": "No has descargado nada con Hydra... aún, ¡pero nunca es tarde para comenzar!."
"no_downloads_description": "No has descargado nada con Hydra... aún, ¡pero nunca es tarde para comenzar!.",
"checking_files": "Verificando archivos…"
},
"settings": {
"downloads_path": "Ruta de descarga",
@@ -159,7 +178,7 @@
"language": "Idioma",
"real_debrid_api_token": "Token API",
"enable_real_debrid": "Activar Real-Debrid",
"real_debrid_description": "Real-Debrid es un descargador sin restricciones que te permite descargar archivos instantáneamente con la máxima velocidad de tu internet.",
"real_debrid_description": "Real-Debrid es una forma de descargar sin restricciones archivos instantáneamente con la máxima velocidad de tu internet.",
"real_debrid_invalid_token": "Token de API inválido",
"real_debrid_api_token_hint": "Puedes obtener tu clave de API <0>aquí</0>",
"real_debrid_free_account_error": "La cuenta \"{{username}}\" es una cuenta gratuita. Por favor, suscríbete a Real-Debrid",
@@ -173,9 +192,6 @@
"download_count_zero": "No hay descargas en la lista",
"download_count_one": "{{countFormatted}} descarga en la lista",
"download_count_other": "{{countFormatted}} descargas en la lista",
"download_options_zero": "No hay descargas disponibles",
"download_options_one": "{{countFormatted}} descarga disponible",
"download_options_other": "{{countFormatted}} descargas disponibles",
"download_source_url": "Descargar URL de origen",
"add_download_source_description": "Introduce la URL con el archivo .json",
"download_source_up_to_date": "Al día",
@@ -183,19 +199,35 @@
"sync_download_sources": "Sincronizar fuentes",
"removed_download_source": "Fuente de descarga eliminada",
"added_download_source": "Fuente de descarga añadida",
"download_sources_synced": "Todas las fuentes de descarga estánn actualizadas (TRANSLATE ME)",
"insert_valid_json_url": "Insert a valid JSON url (TRANSLATE ME)",
"found_download_option_zero": "No download option found (TRANSLATE ME)",
"found_download_option_one": "Found {{countFormatted}} download option (TRANSLATE ME)",
"found_download_option_other": "Found {{countFormatted}} download options (TRANSLATE ME)",
"import": "Import (TRANSLATE ME)"
"download_sources_synced": "Todas las fuentes de descargas están actualizadas.",
"insert_valid_json_url": "Introduce una URL JSON válida",
"found_download_option_zero": "No se encontró una opción de descarga",
"found_download_option_one": "Se encontró {{countFormatted}} opción de descarga",
"found_download_option_other": "Se encontraron {{countFormatted}} opciones de descarga",
"import": "Importar",
"blocked_users": "Usuarios bloqueados",
"download_options_one": "",
"download_options_other": "",
"download_options_zero": "",
"friends_only": "solo amigos",
"must_be_valid_url": "La fuente debe ser una URL válida.",
"privacy": "Privacidad",
"private": "Privado",
"profile_visibility": "Visibilidad del perfil",
"profile_visibility_description": "Elige quién puede ver tu perfil y biblioteca",
"public": "Público",
"required_field": "Este campo es obligatorio",
"source_already_exists": "Esta fuente ya ha sido agregada.",
"user_unblocked": "El usuario ha sido desbloqueado"
},
"notifications": {
"download_complete": "Descarga completada",
"game_ready_to_install": "{{title}} está listo para instalarse",
"repack_list_updated": "Lista de repacks actualizadas",
"repack_count_one": "{{count}} repack ha sido añadido",
"repack_count_other": "{{count}} repacks añadidos"
"repack_count_other": "{{count}} repacks añadidos",
"new_update_available": "Version {{version}} disponible",
"restart_to_install_update": "Reinicia Hydra para instalar la actualización"
},
"system_tray": {
"open": "Abrir Hydra",
@@ -216,25 +248,71 @@
"toggle_password_visibility": "Cambiar visibilidad de contraseña"
},
"user_profile": {
"amount_hours": "{{amount}} hours (TRANSLATE ME)",
"amount_minutes": "{{amount}} minutes (TRANSLATE ME)",
"last_time_played": "Last played {{period}} (TRANSLATE ME)",
"activity": "Recent activity (TRANSLATE ME)",
"library": "Library (TRANSLATE ME)",
"total_play_time": "Total playtime: {{amount}} (TRANSLATE ME)",
"no_recent_activity_title": "Hmmm… nothing here (TRANSLATE ME)",
"no_recent_activity_description": "You haven't played any games recently. It's time to change that! (TRANSLATE ME)",
"display_name": "Display name (TRANSLATE ME)",
"saving": "Saving (TRANSLATE ME)",
"save": "Save (TRANSLATE ME)",
"edit_profile": "Edit Profile (TRANSLATE ME)",
"saved_successfully": "Saved successfully (TRANSLATE ME)",
"try_again": "Please, try again (TRANSLATE ME)",
"sign_out_modal_title": "Are you sure? (TRANSLATE ME)",
"cancel": "Cancel (TRANSLATE ME)",
"successfully_signed_out": "Successfully signed out (TRANSLATE ME)",
"sign_out": "Sign out (TRANSLATE ME)",
"playing_for": "Playing for {{amount}} (TRANSLATE ME)",
"sign_out_modal_text": "Your library is linked with your current account. When signing out, your library will not be visible anymore, and any progress will not be saved. Continue with sign out? (TRANSLATE ME)"
"amount_hours": "{{amount}} horas",
"amount_minutes": "{{amount}} minutos",
"last_time_played": "Última vez jugado: {{period}}",
"activity": "Actividad reciente",
"library": "Biblioteca",
"total_play_time": "Total de tiempo jugado: {{amount}}",
"no_recent_activity_title": "Que raro, no hay nada por acá...",
"no_recent_activity_description": "No has jugado ningún juego recientemente, ¡vamos a cambiar eso ahora!",
"display_name": "Nombre en pantalla",
"saving": "Guardando",
"save": "Guardar",
"edit_profile": "Editar perfil",
"saved_successfully": "Guardado exitosamente",
"try_again": "Por favor, intenta de nuevo",
"sign_out_modal_title": "¿Estás seguro?",
"cancel": "Cancelar",
"successfully_signed_out": "Sesión cerrada exitosamente",
"sign_out": "Cerrar sesión",
"playing_for": "Jugando por {{amount}}",
"sign_out_modal_text": "Tu biblioteca se ha vinculado con tu cuenta. Cuando cierres sesión, tú biblioteca ya no será visible y cualquier progreso no se guardará. ¿Continuar con el cierre de sesión?",
"add_friends": "Añadir amigos",
"add": "Añadir",
"friend_code": "Código de amigo",
"see_profile": "Ver perfil",
"sending": "Enviando",
"friend_request_sent": "Solicitud de amistad enviada",
"friends": "Amigos",
"friends_list": "Lista de amigos",
"user_not_found": "Usuario no encontrado",
"block_user": "Bloquear usuario",
"add_friend": "Añadir amigo",
"request_sent": "Solicitud enviada",
"request_received": "Solicitud recibida",
"accept_request": "Aceptar solicitud",
"ignore_request": "Ignorar solicitud",
"cancel_request": "Cancelar solicitud",
"undo_friendship": "Eliminar amistad",
"request_accepted": "Solicitud aceptada",
"user_blocked_successfully": "Usuario bloqueado exitosamente",
"user_block_modal_text": "Esto va a bloquear a {{displayName}}",
"blocked_users": "Usuarios bloqueados",
"unblock": "Desbloquear",
"no_friends_added": "Todavía no tienes amigos añadidos",
"pending": "Pendiente",
"no_pending_invites": "No tienes invitaciones pendientes",
"no_blocked_users": "No has bloqueado a ningún usuario",
"friend_code_copied": "Código de amigo copiado",
"undo_friendship_modal_text": "Esto deshará tu amistad con {{displayName}}",
"displayname_max_length": "El nombre para mostrar debe tener como máximo 50 caracteres",
"displayname_min_length": "El nombre para mostrar debe tener al menos 3 caracteres",
"locked_profile": "Este perfil es privado.",
"privacy_hint": "Para ajustar quién puede ver esto, ve a <0>Configuración</0>.",
"profile_locked": "",
"profile_reported": "Perfil reportado",
"report": "Informe",
"report_description": "Información adicional",
"report_description_placeholder": "Información adicional",
"report_profile": "Reportar este perfil",
"report_reason": "¿Por qué estás denunciando este perfil?",
"report_reason_hate": "Discurso de odio",
"report_reason_other": "Otro",
"report_reason_sexual_content": "Contenido sexual",
"report_reason_spam": "Correo basura",
"report_reason_violence": "Violencia",
"required_field": "Este campo es obligatorio",
"image_process_failure": "Error al procesar la imagen"
}
}

View File

@@ -1,4 +1,5 @@
{
"language_name": "فارسی",
"home": {
"featured": "پیشنهادی",
"trending": "پرطرفدار",

View File

@@ -1,4 +1,5 @@
{
"language_name": "Français",
"home": {
"featured": "En vedette",
"trending": "Tendance",

View File

@@ -1,4 +1,5 @@
{
"language_name": "Magyar",
"home": {
"featured": "Featured",
"trending": "Népszerű",

View File

@@ -1,134 +1,256 @@
{
"language_name": "Bahasa Indonesia",
"app": {
"successfully_signed_in": "Berhasil masuk"
},
"home": {
"featured": "Unggulan",
"trending": "Trending",
"surprise_me": "Kejutkan Saya",
"no_results": "Tidak ada hasil"
"trending": "Sedang Tren",
"surprise_me": "Kejutkan saya",
"no_results": "Tidak ada hasil ditemukan"
},
"sidebar": {
"catalogue": "Katalog",
"downloads": "Unduhan",
"settings": "Pengaturan",
"my_library": "Koleksi saya",
"my_library": "Perpustakaan saya",
"downloading_metadata": "{{title}} (Mengunduh metadata…)",
"paused": "{{title}} (Terhenti)",
"paused": "{{title}} (Dijeda)",
"downloading": "{{title}} ({{percentage}} - Mengunduh…)",
"filter": "Filter koleksi",
"home": "Beranda"
"filter": "Filter perpustakaan",
"home": "Beranda",
"queued": "{{title}} (Antrian)",
"game_has_no_executable": "Game tidak punya file eksekusi yang dipilih",
"sign_in": "Masuk"
},
"header": {
"search": "Pencarian",
"search": "Cari game",
"home": "Beranda",
"catalogue": "Katalog",
"downloads": "Unduhan",
"search_results": "Hasil pencarian",
"settings": "Pengaturan"
"settings": "Pengaturan",
"version_available_install": "Versi {{version}} tersedia. Klik di sini untuk restart dan instal.",
"version_available_download": "Versi {{version}} tersedia. Klik di sini untuk unduh."
},
"bottom_panel": {
"no_downloads_in_progress": "Tidak ada unduhan berjalan",
"downloading_metadata": "Mengunduh metadata {{title}}...",
"downloading": "Mengunduh {{title}}… ({{percentage}} selesai) - Perkiraan {{eta}} - {{speed}}"
"no_downloads_in_progress": "Tidak ada unduhan yang sedang berjalan",
"downloading_metadata": "Mengunduh metadata {{title}}",
"downloading": "Mengunduh {{title}}… ({{percentage}} selesai) - Estimasi selesai {{eta}} - {{speed}}",
"calculating_eta": "Mengunduh {{title}}… ({{percentage}} selesai) - Menghitung waktu yang tersisa…",
"checking_files": "Memeriksa file {{title}}… ({{percentage}} selesai)"
},
"catalogue": {
"next_page": "Halaman berikutnya",
"previous_page": "Halaman sebelumnya"
"next_page": "Halaman Berikutnya",
"previous_page": "Halaman Sebelumnya"
},
"game_details": {
"open_download_options": "Buka opsi unduhan",
"download_options_zero": "Tidak ada opsi unduhan",
"download_options_one": "{{count}} opsi unduhan",
"download_options_other": "{{count}} opsi unduhan",
"updated_at": "Diperbarui {{updated_at}}",
"install": "Install",
"updated_at": "Diperbarui pada {{updated_at}}",
"install": "Instal",
"resume": "Lanjutkan",
"pause": "Hentikan sementara",
"cancel": "Batalkan",
"pause": "Jeda",
"cancel": "Batal",
"remove": "Hapus",
"space_left_on_disk": "{{space}} tersisa pada disk",
"eta": "Perkiraan {{eta}}",
"space_left_on_disk": "{{space}} tersisa di disk",
"eta": "Estimasi {{eta}}",
"calculating_eta": "Menghitung waktu yang tersisa…",
"downloading_metadata": "Mengunduh metadata…",
"filter": "Saring repacks",
"requirements": "Keperluan sistem",
"filter": "Filter repack",
"requirements": "Persyaratan sistem",
"minimum": "Minimum",
"recommended": "Rekomendasi",
"recommended": "Dianjurkan",
"paused": "Dijeda",
"release_date": "Dirilis pada {{date}}",
"publisher": "Dipublikasikan oleh {{publisher}}",
"publisher": "Diterbitkan oleh {{publisher}}",
"hours": "jam",
"minutes": "menit",
"amount_hours": "{{amount}} jam",
"amount_minutes": "{{amount}} menit",
"accuracy": "{{accuracy}}% akurasi",
"add_to_library": "Tambahkan ke koleksi",
"remove_from_library": "Hapus dari koleksi",
"no_downloads": "Tidak ada unduhan tersedia",
"add_to_library": "Tambah ke perpustakaan",
"remove_from_library": "Hapus dari perpustakaan",
"no_downloads": "Tidak ada yang bisa diunduh",
"play_time": "Dimainkan selama {{amount}}",
"last_time_played": "Terakhir dimainkan {{period}}",
"not_played_yet": "Kamu belum memainkan {{title}}",
"next_suggestion": "Rekomendasi berikutnya",
"play": "Mainkan",
"next_suggestion": "Saran berikutnya",
"play": "Main",
"deleting": "Menghapus installer…",
"close": "Tutup",
"playing_now": "Memainkan sekarang",
"playing_now": "Sedang dimainkan",
"change": "Ubah",
"repacks_modal_description": "Pilih repack yang kamu ingin unduh",
"select_folder_hint": "Untuk merubah folder bawaan, akses melalui",
"download_now": "Unduh sekarang"
"repacks_modal_description": "Pilih repack yang ingin kamu unduh",
"select_folder_hint": "Untuk ganti folder default, buka <0>Pengaturan</0>",
"download_now": "Unduh sekarang",
"no_shop_details": "Gagal mendapatkan detail toko.",
"download_options": "Opsi unduhan",
"download_path": "Path unduhan",
"previous_screenshot": "Screenshot sebelumnya",
"next_screenshot": "Screenshot berikutnya",
"screenshot": "Screenshot {{number}}",
"open_screenshot": "Buka screenshot {{number}}",
"download_settings": "Pengaturan unduhan",
"downloader": "Pengunduh",
"select_executable": "Pilih",
"no_executable_selected": "Tidak ada file eksekusi yang dipilih",
"open_folder": "Buka folder",
"open_download_location": "Lihat file yang diunduh",
"create_shortcut": "Buat pintasan desktop",
"remove_files": "Hapus file",
"remove_from_library_title": "Apa kamu yakin?",
"remove_from_library_description": "Ini akan menghapus {{game}} dari perpustakaan kamu",
"options": "Opsi",
"executable_section_title": "Eksekusi",
"executable_section_description": "Path file eksekusi saat \"Main\" diklik",
"downloads_secion_title": "Unduhan",
"downloads_section_description": "Cek update atau versi lain dari game ini",
"danger_zone_section_title": "Zona Berbahaya",
"danger_zone_section_description": "Hapus game ini dari perpustakaan kamu atau file yang diunduh oleh Hydra",
"download_in_progress": "Sedang mengunduh",
"download_paused": "Unduhan dijeda",
"last_downloaded_option": "Opsi terakhir diunduh",
"create_shortcut_success": "Pintasan berhasil dibuat",
"create_shortcut_error": "Gagal membuat pintasan"
},
"activation": {
"title": "Aktivasi Hydra",
"installation_id": "ID instalasi:",
"enter_activation_code": "Masukkan kode aktivasi",
"message": "Jika kamu tidak tau dimana bertanya untuk ini, maka kamu tidak seharusnya memiliki ini.",
"title": "Aktifkan Hydra",
"installation_id": "ID Instalasi:",
"enter_activation_code": "Masukkan kode aktivasi kamu",
"message": "Kalau tidak tahu harus tanya ke siapa, berarti kamu tidak perlu ini.",
"activate": "Aktifkan",
"loading": "Memuat…"
},
"downloads": {
"resume": "Lanjutkan",
"pause": "Hentikan sementara",
"eta": "Perkiraan {{eta}}",
"paused": "Terhenti sementara",
"verifying": "Memeriksa…",
"pause": "Jeda",
"eta": "Estimasi {{eta}}",
"paused": "Dijeda",
"verifying": "Verifikasi…",
"completed": "Selesai",
"cancel": "Batalkan",
"filter": "Saring game yang diunduh",
"removed": "Tidak diunduh",
"cancel": "Batal",
"filter": "Filter game yang diunduh",
"remove": "Hapus",
"downloading_metadata": "Mengunduh metadata…",
"deleting": "Menghapus file instalasi…",
"delete": "Hapus file instalasi",
"delete_modal_title": "Kamu yakin?",
"delete_modal_description": "Proses ini akan menghapus semua file instalasi dari komputer kamu",
"install": "Install"
"deleting": "Menghapus installer…",
"delete": "Hapus installer",
"delete_modal_title": "Apa kamu yakin?",
"delete_modal_description": "Ini akan menghapus semua file instalasi dari komputer kamu",
"install": "Instal",
"download_in_progress": "Sedang berlangsung",
"queued_downloads": "Unduhan dalam antrian",
"downloads_completed": "Selesai",
"queued": "Dalam antrian",
"no_downloads_title": "Kosong",
"no_downloads_description": "Kamu belum mengunduh apa pun dengan Hydra, tapi belum terlambat untuk mulai.",
"checking_files": "Memeriksa file…"
},
"settings": {
"downloads_path": "Lokasi unduhan",
"change": "Perbarui",
"notifications": "Pengingat",
"downloads_path": "Path unduhan",
"change": "Ganti",
"notifications": "Notifikasi",
"enable_download_notifications": "Saat unduhan selesai",
"enable_repack_list_notifications": "Saat repack terbaru ditambahkan",
"enable_repack_list_notifications": "Saat ada repack baru",
"real_debrid_api_token_label": "Token API Real-Debrid",
"quit_app_instead_hiding": "Jangan sembunyikan Hydra saat ditutup",
"launch_with_system": "Jalankan Hydra saat sistem dinyalakan",
"general": "Umum",
"behavior": "Perilaku",
"quit_app_instead_hiding": "Tutup aplikasi alih-alih menyembunyikan aplikasi",
"launch_with_system": "Jalankan saat memulai sistem"
"download_sources": "Sumber unduhan",
"language": "Bahasa",
"real_debrid_api_token": "Token API",
"enable_real_debrid": "Aktifkan Real-Debrid",
"real_debrid_description": "Real-Debrid adalah downloader tanpa batas yang memungkinkan kamu untuk mengunduh file dengan cepat dan pada kecepatan terbaik dari Internet kamu.",
"real_debrid_invalid_token": "Token API tidak valid",
"real_debrid_api_token_hint": "Kamu bisa dapatkan token API di <0>sini</0>",
"real_debrid_free_account_error": "Akun \"{{username}}\" adalah akun gratis. Silakan berlangganan Real-Debrid",
"real_debrid_linked_message": "Akun \"{{username}}\" terhubung",
"save_changes": "Simpan perubahan",
"changes_saved": "Perubahan disimpan berhasil",
"download_sources_description": "Hydra akan mencari link unduhan dari sini. URL harus menuju file .json dengan link unduhan.",
"validate_download_source": "Validasi",
"remove_download_source": "Hapus",
"add_download_source": "Tambahkan sumber",
"download_count_zero": "Tidak ada unduhan dalam daftar",
"download_count_one": "{{countFormatted}} unduhan dalam daftar",
"download_count_other": "{{countFormatted}} unduhan dalam daftar",
"download_options_zero": "Tidak ada unduhan tersedia",
"download_options_one": "{{countFormatted}} unduhan tersedia",
"download_options_other": "{{countFormatted}} unduhan tersedia",
"download_source_url": "URL sumber unduhan",
"add_download_source_description": "Masukkan URL yang berisi file .json",
"download_source_up_to_date": "Terkini",
"download_source_errored": "Terjadi kesalahan",
"sync_download_sources": "Sinkronkan sumber",
"removed_download_source": "Sumber unduhan dihapus",
"added_download_source": "Sumber unduhan ditambahkan",
"download_sources_synced": "Semua sumber unduhan disinkronkan",
"insert_valid_json_url": "Masukkan URL JSON yang valid",
"found_download_option_zero": "Tidak ada opsi unduhan ditemukan",
"found_download_option_one": "Ditemukan {{countFormatted}} opsi unduhan",
"found_download_option_other": "Ditemukan {{countFormatted}} opsi unduhan",
"import": "Impor"
},
"notifications": {
"download_complete": "Unduhan selesai",
"game_ready_to_install": "{{title}} sudah siap untuk instalasi",
"game_ready_to_install": "{{title}} siap untuk diinstal",
"repack_list_updated": "Daftar repack diperbarui",
"repack_count_one": "{{count}} repack ditambahkan",
"repack_count_other": "{{count}} repack ditambahkan"
"repack_count_other": "{{count}} repack ditambahkan",
"new_update_available": "Versi {{version}} tersedia",
"restart_to_install_update": "Restart Hydra untuk instal pembaruan"
},
"system_tray": {
"open": "Buka Hydra",
"quit": "Tutup"
"quit": "Keluar"
},
"game_card": {
"no_downloads": "Tidak ada unduhan tersedia"
"no_downloads": "Tidak ada unduhan yang tersedia"
},
"binary_not_found_modal": {
"title": "Program tidak terinstal",
"description": "Wine atau Lutris exe tidak ditemukan pada sistem kamu",
"instructions": "Periksa cara instalasi yang benar pada Linux distro-mu agar game dapat dimainkan dengan benar"
"title": "Program tidak terpasang",
"description": "Executable Wine atau Lutris tidak ditemukan di sistem kamu",
"instructions": "Cek cara instalasi yang benar di distro Linux kamu agar game bisa jalan normal"
},
"modal": {
"close": "Tombol tutup"
"close": "Tutup"
},
"forms": {
"toggle_password_visibility": "Tampilkan/Sembunyikan kata sandi"
},
"user_profile": {
"amount_hours": "{{amount}} jam",
"amount_minutes": "{{amount}} menit",
"last_time_played": "Terakhir dimainkan {{period}}",
"activity": "Aktivitas terbaru",
"library": "Perpustakaan",
"total_play_time": "Total waktu bermain: {{amount}}",
"no_recent_activity_title": "Hmm… kosong di sini",
"no_recent_activity_description": "Kamu belum main game baru-baru ini. Yuk, mulai main!",
"display_name": "Nama tampilan",
"saving": "Menyimpan",
"save": "Simpan",
"edit_profile": "Edit Profil",
"saved_successfully": "Berhasil disimpan",
"try_again": "Coba lagi yuk",
"sign_out_modal_title": "Apa kamu yakin?",
"cancel": "Batal",
"successfully_signed_out": "Berhasil keluar",
"sign_out": "Keluar",
"playing_for": "Bermain selama {{amount}}",
"sign_out_modal_text": "Perpustakaan kamu terhubung dengan akun saat ini. Saat keluar, perpustakaan kamu tidak akan terlihat lagi, dan progres tidak akan disimpan. Lanjutkan keluar?",
"add_friends": "Tambah Teman",
"add": "Tambah",
"friend_code": "Kode teman",
"see_profile": "Lihat profil",
"sending": "Mengirim",
"friend_request_sent": "Permintaan teman terkirim",
"friends": "Teman",
"friends_list": "Daftar teman",
"user_not_found": "Pengguna tidak ditemukan"
}
}

View File

@@ -1,18 +1,51 @@
export { default as en } from "./en/translation.json";
export { default as pt } from "./pt/translation.json";
export { default as es } from "./es/translation.json";
export { default as nl } from "./nl/translation.json";
export { default as fr } from "./fr/translation.json";
export { default as hu } from "./hu/translation.json";
export { default as it } from "./it/translation.json";
export { default as pl } from "./pl/translation.json";
export { default as ru } from "./ru/translation.json";
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 zh } from "./zh/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 ar } from "./ar/translation.json";
export { default as fa } from "./fa/translation.json";
import en from "./en/translation.json";
import ptPT from "./pt-PT/translation.json";
import ptBR from "./pt-BR/translation.json";
import es from "./es/translation.json";
import nl from "./nl/translation.json";
import fr from "./fr/translation.json";
import hu from "./hu/translation.json";
import it from "./it/translation.json";
import de from "./de/translation.json";
import pl from "./pl/translation.json";
import ru from "./ru/translation.json";
import tr from "./tr/translation.json";
import be from "./be/translation.json";
import uk from "./uk/translation.json";
import zh from "./zh/translation.json";
import id from "./id/translation.json";
import ko from "./ko/translation.json";
import da from "./da/translation.json";
import ar from "./ar/translation.json";
import fa from "./fa/translation.json";
import ro from "./ro/translation.json";
import ca from "./ca/translation.json";
import kk from "./kk/translation.json";
import cs from "./cs/translation.json";
export default {
"pt-BR": ptBR,
"pt-PT": ptPT,
en,
de,
es,
nl,
fr,
hu,
it,
pl,
ru,
tr,
be,
uk,
zh,
id,
ko,
da,
ar,
fa,
ro,
ca,
kk,
cs,
};

View File

@@ -1,4 +1,5 @@
{
"language_name": "Italiano",
"home": {
"featured": "In primo piano",
"trending": "Di tendenza",

View File

@@ -0,0 +1,243 @@
{
"language_name": "қазақ тілі",
"app": {
"successfully_signed_in": "Сәтті кіру"
},
"home": {
"featured": "Ұсынылған",
"trending": "Трендте",
"surprise_me": "Таңқалдыр",
"no_results": "Ештеңе табылмады"
},
"sidebar": {
"catalogue": "Каталог",
"downloads": "Жүктеулер",
"settings": "Параметрлер",
"my_library": "Кітапхана",
"downloading_metadata": "{{title}} (Метадеректерді жүктеу…)",
"paused": "{{title}} (Тоқтатылды)",
"downloading": "{{title}} ({{percentage}} - Жүктеу…)",
"filter": "Кітапхана фильтрі",
"home": "Басты бет",
"queued": "{{title}} (Кезекте)",
"game_has_no_executable": "Ойынды іске қосу файлы таңдалмаған",
"sign_in": "Кіру"
},
"header": {
"search": "Іздеу",
"home": "Басты бет",
"catalogue": "Каталог",
"downloads": "Жүктеулер",
"search_results": "Іздеу нәтижелері",
"settings": "Параметрлер",
"version_available_install": "Қол жетімді нұсқа {{version}}. Қайта іске қосу және орнату үшін мұнда басыңыз.",
"version_available_download": "Қол жетімді нұсқа {{version}}. Жүктеу үшін мұнда басыңыз."
},
"bottom_panel": {
"no_downloads_in_progress": "Белсенді жүктеулер жоқ",
"downloading_metadata": "Метадеректерді жүктеу {{title}}…",
"downloading": "Жүктеу {{title}}… ({{percentage}} аяқталды) - Аяқтау {{eta}} - {{speed}}",
"calculating_eta": "Жүктеу {{title}}… ({{percentage}} аяқталды) - Қалған уақытты есептеу…"
},
"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": "Жою",
"space_left_on_disk": "{{space}} бос орын",
"eta": "Аяқтау {{eta}}",
"calculating_eta": "Қалған уақытты есептеу…",
"downloading_metadata": "Метадеректерді жүктеу…",
"filter": "Репактар фильтрі",
"requirements": "Жүйелік талаптар",
"minimum": "Минималды",
"recommended": "Ұсынылған",
"paused": "Тоқтатылды",
"release_date": "Шыққан күні {{date}}",
"publisher": "Баспагер {{publisher}}",
"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": "Жүктеу үшін репакты таңдаңыз",
"select_folder_hint": "Әдепкі жүктеу қалтасын өзгерту үшін <0>Параметрлер</0> ашыңыз",
"download_now": "Қазір жүктеу",
"no_shop_details": "Сипаттаманы алу мүмкін болмады",
"download_options": "Жүктеу нұсқалары",
"download_path": "Жүктеу жолы",
"previous_screenshot": "Алдыңғы скриншот",
"next_screenshot": "Келесі скриншот",
"screenshot": "Скриншот {{number}}",
"open_screenshot": "Скриншотты ашу {{number}}",
"download_settings": "Жүктеу параметрлері",
"downloader": "Жүктегіш",
"select_executable": "Таңдау",
"no_executable_selected": "Файл таңдалмаған",
"open_folder": "Қалтаны ашу",
"open_download_location": "Жүктеу қалтасын қарау",
"create_shortcut": "Жұмыс үстелінде жарлық жасау",
"remove_files": "Файлдарды жою",
"remove_from_library_title": "Сіз сенімдісіз бе?",
"remove_from_library_description": "{{game}} сіздің кітапханаңыздан жойылады.",
"options": "Параметрлер",
"executable_section_title": "Файл",
"executable_section_description": "\"Ойнау\" батырмасын басқанда іске қосылатын файл жолы",
"downloads_secion_title": "Жүктеулер",
"downloads_section_description": "Ойынның жаңартулары немесе басқа нұсқалары бар-жоғын тексеру",
"danger_zone_section_title": "Қауіпті аймақ",
"danger_zone_section_description": "Осы ойынды кітапханаңыздан жою немесе Hydra жүктеген файлдарды жою",
"download_in_progress": "Жүктеу жүріп жатыр",
"download_paused": "Жүктеу тоқтатылды",
"last_downloaded_option": "Соңғы жүктеу нұсқасы",
"create_shortcut_success": "Жарлық жасалды",
"create_shortcut_error": "Жарлық жасау мүмкін болмады"
},
"activation": {
"title": "Hydra-ны белсендіру",
"installation_id": "Орнату ID:",
"enter_activation_code": "Активтендіру кодын енгізіңіз",
"message": "Егер оның қайдан алуға болатынын білмесеңіз, сізде оның болмауы керек.",
"activate": "Белсендіру",
"loading": "Жүктеу…"
},
"downloads": {
"resume": "Жандандыру",
"pause": "Тоқтату",
"eta": "Аяқтау {{eta}}",
"paused": "Тоқтатылды",
"verifying": "Тексеру…",
"completed": "Аяқталды",
"removed": "Жүктелмеген",
"cancel": "Болдырмау",
"filter": "Жүктелген ойындар фильтрі",
"remove": "Жою",
"downloading_metadata": "Метадеректерді жүктеу…",
"deleting": "Орнатушыны жою…",
"delete": "Орнатушыны жою",
"delete_modal_title": "Сіз сенімдісіз бе?",
"delete_modal_description": "Бұл барлық орнатушыларды компьютеріңізден жояды",
"install": "Орнату",
"download_in_progress": "Жүктеу жүріп жатыр",
"queued_downloads": "Кезектегі жүктеулер",
"downloads_completed": "Аяқталды",
"queued": "Кезекте",
"no_downloads_title": "Мұнда бос...",
"no_downloads_description": "Сіз Hydra арқылы әлі ештеңе жүктемегенсіз, бірақ бастау ешқашан кеш емес."
},
"settings": {
"downloads_path": "Жүктеу жолы",
"change": "Өзгерту",
"notifications": "Хабарламалар",
"enable_download_notifications": "Жүктеу аяқталғанда",
"enable_repack_list_notifications": "Жаңа репак қосылғанда",
"real_debrid_api_token_label": "Real-Debrid API-токен",
"quit_app_instead_hiding": "Hydra-ны трейге жасырудың орнына жабу",
"launch_with_system": "Жүйемен бірге Hydra-ны іске қосу",
"general": "Жалпы",
"behavior": "Мінез-құлық",
"download_sources": "Жүктеу көздері",
"language": "Тіл",
"real_debrid_api_token": "API Кілті",
"enable_real_debrid": "Real-Debrid-ті қосу",
"real_debrid_description": "Real-Debrid - бұл шектеусіз жүктеуші, ол интернетте орналастырылған файлдарды тез жүктеуге немесе жеке желі арқылы кез келген блоктарды айналып өтіп, оларды бірден плеерге беруге мүмкіндік береді.",
"real_debrid_invalid_token": "Қате API кілті",
"real_debrid_api_token_hint": "API кілтін <0>осы жерден</0> алуға болады",
"real_debrid_free_account_error": "\"{{username}}\" аккаунты жазылымға ие емес. Real-Debrid жазылымын алыңыз",
"real_debrid_linked_message": "\"{{username}}\" аккаунты байланған",
"save_changes": "Өзгерістерді сақтау",
"changes_saved": "Өзгерістер сәтті сақталды",
"download_sources_description": "Hydra осы көздерден жүктеу сілтемелерін алады. URL-да жүктеу сілтемелері бар .json файлына тікелей сілтеме болуы керек.",
"validate_download_source": "Тексеру",
"remove_download_source": "Жою",
"add_download_source": "Жүктеу көзін қосу",
"download_count_zero": "Жүктеулер тізімінде жоқ",
"download_count_one": "{{countFormatted}} жүктеу тізімде",
"download_count_other": "{{countFormatted}} жүктеу тізімде",
"download_options_zero": "Қолжетімді жүктеулер жоқ",
"download_options_one": "{{countFormatted}} жүктеу нұсқасы қол жетімді",
"download_options_other": "{{countFormatted}} жүктеу нұсқалары қол жетімді",
"download_source_url": "Көздің сілтемесі",
"add_download_source_description": ".json файлға сілтемені қойыңыз",
"download_source_up_to_date": "Жаңартылған",
"download_source_errored": "Қате",
"sync_download_sources": "Көздерді синхрондау",
"removed_download_source": "Жүктеу көзі жойылды",
"added_download_source": "Жүктеу көзі қосылды",
"download_sources_synced": "Барлық жүктеу көздері синхрондалды",
"insert_valid_json_url": "Жарамды JSON URL енгізіңіз",
"found_download_option_zero": "Жүктеу нұсқалары табылмады",
"found_download_option_one": "{{countFormatted}} жүктеу нұсқасы табылды",
"found_download_option_other": "{{countFormatted}} жүктеу нұсқалары табылды",
"import": "Импорттау"
},
"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": "Linux дистрибутивіңізге олардың кез келгенін дұрыс орнатудың жолын біліңіз осылайша ойын дұрыс жұмыс істей алады"
},
"modal": {
"close": "Жабу"
},
"forms": {
"toggle_password_visibility": "Құпиясөзді көрсету"
},
"user_profile": {
"amount_hours": "{{amount}} сағат",
"amount_minutes": "{{amount}} минут",
"last_time_played": "Соңғы ойын {{period}}",
"activity": "Соңғы әрекет",
"library": "Кітапхана",
"total_play_time": "Барлығы ойнаған: {{amount}}",
"no_recent_activity_title": "Хммм... Мұнда ештеңе жоқ",
"no_recent_activity_description": "Сіз ұзақ уақыт бойы ештеңе ойнаған жоқсыз. Мұны өзгерту керек!",
"display_name": "Көрсету аты",
"saving": "Сақтау",
"save": "Сақталды",
"edit_profile": "Профильді өзгерту",
"saved_successfully": "Сәтті сақталды",
"try_again": "Қайта көріңіз",
"sign_out_modal_title": "Сіз сенімдісіз бе?",
"cancel": "Болдырмау",
"successfully_signed_out": "Аккаунттан сәтті шығу",
"sign_out": "Шығу",
"playing_for": "Ойнаған {{amount}}",
"sign_out_modal_text": "Сіздің кітапханаңыз ағымдағы аккаунтпен байланысты. Жүйеден шыққанда сіздің кітапханаңыз қол жетімсіз болады және прогресс сақталмайды. Шығу?"
}
}

View File

@@ -1,4 +1,5 @@
{
"language_name": "한국어",
"home": {
"featured": "추천",
"trending": "인기",

View File

@@ -1,4 +1,5 @@
{
"language_name": "Nederlands",
"home": {
"featured": "Uitgelicht",
"trending": "Trending",

View File

@@ -1,4 +1,5 @@
{
"language_name": "Polski",
"home": {
"featured": "Wyróżnione",
"trending": "Trendujące",

View File

@@ -1,26 +1,31 @@
{
"language_name": "Português (Brasil)",
"app": {
"successfully_signed_in": "Logado com sucesso"
"successfully_signed_in": "Autenticado com sucesso"
},
"home": {
"featured": "Destaque",
"featured": "Destaques",
"trending": "Populares",
"hot": "🔥 Populares agora",
"weekly": "📅 Mais baixados da semana",
"surprise_me": "Surpreenda-me",
"no_results": "Nenhum resultado encontrado"
"no_results": "Nenhum resultado encontrado",
"start_typing": "Comece a digitar para pesquisar…"
},
"sidebar": {
"catalogue": "Catálogo",
"downloads": "Downloads",
"settings": "Ajustes",
"my_library": "Minha biblioteca",
"my_library": "Biblioteca",
"downloading_metadata": "{{title}} (Baixando metadados…)",
"paused": "{{title}} (Pausado)",
"downloading": "{{title}} ({{percentage}} - Baixando…)",
"filter": "Filtrar biblioteca",
"filter": "Buscar",
"home": "Início",
"queued": "{{title}} (Na fila)",
"game_has_no_executable": "Jogo não possui executável selecionado",
"sign_in": "Login"
"sign_in": "Login",
"friends": "Amigos"
},
"header": {
"search": "Buscar jogos",
@@ -36,7 +41,8 @@
"no_downloads_in_progress": "Sem downloads em andamento",
"downloading_metadata": "Baixando metadados de {{title}}…",
"downloading": "Baixando {{title}}… ({{percentage}} concluído) - Conclusão {{eta}} - {{speed}}",
"calculating_eta": "Baixando {{title}}… ({{percentage}} concluído) - Calculando tempo restante…"
"calculating_eta": "Baixando {{title}}… ({{percentage}} concluído) - Calculando tempo restante…",
"checking_files": "Verificando arquivos de {{title}}…"
},
"game_details": {
"open_download_options": "Ver opções de download",
@@ -44,7 +50,7 @@
"download_options_one": "{{count}} opção de download",
"download_options_other": "{{count}} opções de download",
"updated_at": "Atualizado {{updated_at}}",
"resume": "Resumir",
"resume": "Retomar",
"pause": "Pausar",
"cancel": "Cancelar",
"remove": "Remover",
@@ -53,7 +59,7 @@
"calculating_eta": "Calculando tempo restante…",
"downloading_metadata": "Baixando metadados…",
"filter": "Filtrar repacks",
"requirements": "Requisitos do sistema",
"requirements": "Requisitos de sistema",
"minimum": "Mínimos",
"recommended": "Recomendados",
"paused": "Pausado",
@@ -67,16 +73,16 @@
"add_to_library": "Adicionar à biblioteca",
"remove_from_library": "Remover da biblioteca",
"no_downloads": "Nenhum download disponível",
"play_time": "Jogado por {{amount}}",
"play_time": "Jogou por {{amount}}",
"next_suggestion": "Próxima sugestão",
"install": "Instalar",
"last_time_played": "Jogou por último {{period}}",
"last_time_played": "Última sessão {{period}}",
"play": "Jogar",
"not_played_yet": "Você ainda não jogou {{title}}",
"close": "Fechar",
"deleting": "Excluindo instalador…",
"playing_now": "Jogando agora",
"change": "Mudar",
"change": "Explorar",
"repacks_modal_description": "Escolha o repack do jogo que deseja baixar",
"select_folder_hint": "Para trocar o diretório padrão, acesse a <0>Tela de Ajustes</0>",
"download_now": "Iniciar download",
@@ -89,13 +95,13 @@
"open_screenshot": "Ver captura de tela {{number}}",
"download_settings": "Ajustes do download",
"downloader": "Downloader",
"select_executable": "Selecionar",
"select_executable": "Explorar",
"no_executable_selected": "Nenhum executável selecionado",
"open_folder": "Abrir pasta",
"open_download_location": "Ver arquivos baixados",
"create_shortcut": "Criar atalho na área de trabalho",
"remove_files": "Remover arquivos",
"options": "Opções",
"options": "Gerenciar",
"remove_from_library_description": "Isso irá remover {{game}} da sua biblioteca",
"remove_from_library_title": "Tem certeza?",
"executable_section_title": "Executável",
@@ -108,7 +114,19 @@
"download_paused": "Download pausado",
"last_downloaded_option": "Última opção baixada",
"create_shortcut_success": "Atalho criado com sucesso",
"create_shortcut_error": "Erro ao criar atalho"
"create_shortcut_error": "Erro ao criar atalho",
"nsfw_content_title": "Este jogo contém conteúdo inapropriado",
"nsfw_content_description": "{{title}} contém conteúdo que pode não ser apropriado para todas as idades. Você deseja continuar?",
"allow_nsfw_content": "Continuar",
"refuse_nsfw_content": "Voltar",
"stats": "Estatísticas",
"download_count": "Downloads",
"player_count": "Jogadores ativos",
"download_error": "Essa opção de download falhou",
"download": "Baixar",
"executable_path_in_use": "Executável em uso por \"{{game}}\"",
"warning": "Aviso:",
"hydra_needs_to_remain_open": "para este download, o Hydra precisa ficar aberto até a conclusão. Caso o Hydra encerre antes da conclusão, perderá seu progresso."
},
"activation": {
"title": "Ativação",
@@ -119,7 +137,7 @@
"loading": "Carregando…"
},
"downloads": {
"resume": "Resumir",
"resume": "Retomar",
"pause": "Pausar",
"eta": "Conclusão {{eta}}",
"paused": "Pausado",
@@ -140,16 +158,17 @@
"downloads_completed": "Completo",
"queued": "Na fila",
"no_downloads_title": "Nada por aqui…",
"no_downloads_description": "Você ainda não baixou nada pelo Hydra, mas nunca é tarde para começar."
"no_downloads_description": "Você ainda não baixou nada pelo Hydra, mas nunca é tarde para começar.",
"checking_files": "Verificando arquivos…"
},
"settings": {
"downloads_path": "Diretório dos downloads",
"change": "Mudar",
"change": "Explorar...",
"notifications": "Notificações",
"enable_download_notifications": "Quando um download for concluído",
"enable_repack_list_notifications": "Quando a lista de repacks for atualizada",
"real_debrid_api_token_label": "Token de API do Real-Debrid",
"quit_app_instead_hiding": "Encerrar o Hydra ao invés de minimizá-lo ao fechar",
"quit_app_instead_hiding": "Encerrar o Hydra em vez de apenas minimizá-lo ao fechar.",
"launch_with_system": "Iniciar o Hydra junto com o sistema",
"general": "Geral",
"behavior": "Comportamento",
@@ -164,7 +183,7 @@
"real_debrid_linked_message": "Conta \"{{username}}\" vinculada",
"save_changes": "Salvar mudanças",
"changes_saved": "Ajustes salvos com sucesso",
"download_sources_description": "Hydra vai buscar links de download em todas as fonte habilitadas. A URL da fonte deve ser um link direto para um arquivo .json contendo uma lista de links.",
"download_sources_description": "Hydra vai buscar links de download em todas as fontes habilitadas. A URL da fonte deve ser um link direto para um arquivo .json contendo uma lista de links.",
"validate_download_source": "Validar",
"remove_download_source": "Remover",
"add_download_source": "Adicionar fonte",
@@ -186,14 +205,27 @@
"found_download_option_zero": "Nenhuma opção de download encontrada",
"found_download_option_one": "{{countFormatted}} opção de download encontrada",
"found_download_option_other": "{{countFormatted}} opções de download encontradas",
"import": "Importar"
"import": "Importar",
"privacy": "Privacidade",
"private": "Privado",
"friends_only": "Apenas amigos",
"public": "Público",
"profile_visibility": "Visibilidade do perfil",
"profile_visibility_description": "Escolha quem pode ver seu perfil e biblioteca",
"required_field": "Este campo é obrigatório",
"source_already_exists": "Essa fonte já foi adicionada",
"must_be_valid_url": "A fonte deve ser uma URL válida",
"blocked_users": "Usuários bloqueados",
"user_unblocked": "Usuário desbloqueado"
},
"notifications": {
"download_complete": "Download concluído",
"game_ready_to_install": "{{title}} está pronto para ser instalado",
"repack_list_updated": "Lista de repacks atualizada",
"repack_count_one": "{{count}} novo repack",
"repack_count_other": "{{count}} novos repacks"
"repack_count_other": "{{count}} novos repacks",
"new_update_available": "Versão {{version}} disponível",
"restart_to_install_update": "Reinicie o Hydra para instalar a nova versão"
},
"system_tray": {
"open": "Abrir Hydra",
@@ -204,7 +236,7 @@
},
"binary_not_found_modal": {
"title": "Programas não instalados",
"description": "Não foram encontrados no seu sistema os executáveis do Wine ou Lutris",
"description": "Os executáveis do Wine ou Lutris não foram encontrados em seu sistema.",
"instructions": "Verifique a forma correta de instalar algum deles no seu distro Linux, garantindo assim a execução normal do jogo"
},
"catalogue": {
@@ -220,8 +252,8 @@
"user_profile": {
"amount_hours": "{{amount}} horas",
"amount_minutes": "{{amount}} minutos",
"last_time_played": "Jogou {{period}}",
"activity": "Atividade recente",
"last_time_played": "Última sessão {{period}}",
"activity": "Atividades recentes",
"library": "Biblioteca",
"total_play_time": "Tempo total de jogo: {{amount}}",
"no_recent_activity_title": "Hmmm… nada por aqui",
@@ -229,14 +261,60 @@
"display_name": "Nome de exibição",
"saving": "Salvando…",
"save": "Salvar",
"edit_profile": "Editar Perfil",
"edit_profile": "Editar perfil",
"saved_successfully": "Salvo com sucesso",
"try_again": "Por favor, tente novamente",
"cancel": "Cancelar",
"successfully_signed_out": "Deslogado com sucesso",
"sign_out": "Sair da conta",
"sign_out_modal_title": "Tem certeza?",
"sign_out_modal_title": "Deseja mesmo sair?",
"playing_for": "Jogando por {{amount}}",
"sign_out_modal_text": "Sua biblioteca de jogos está associada com a sua conta atual. Ao sair, sua biblioteca não aparecerá mais no Hydra e qualquer progresso não será salvo. Deseja continuar?"
"sign_out_modal_text": "Sua biblioteca de jogos está associada com a sua conta atual. Ao sair, sua biblioteca não aparecerá mais no Hydra e qualquer progresso não será salvo. Deseja continuar?",
"add_friends": "Adicionar Amigos",
"friend_code": "Código de amigo",
"see_profile": "Ver perfil",
"friend_request_sent": "Pedido de amizade enviado",
"friends": "Amigos",
"add": "Adicionar",
"sending": "Enviando",
"friends_list": "Lista de amigos",
"user_not_found": "Usuário não encontrado",
"block_user": "Bloquear",
"add_friend": "Adicionar amigo",
"request_sent": "Pedido enviado",
"request_received": "Pedido recebido",
"accept_request": "Aceitar pedido",
"ignore_request": "Ignorar pedido",
"cancel_request": "Cancelar pedido",
"undo_friendship": "Desfazer amizade",
"request_accepted": "Pedido de amizade aceito",
"user_blocked_successfully": "Usuário bloqueado com sucesso",
"user_block_modal_text": "Bloquear {{displayName}}",
"blocked_users": "Usuários bloqueados",
"unblock": "Desbloquear",
"no_friends_added": "Você ainda não possui amigos adicionados",
"pending": "Pendentes",
"no_pending_invites": "Você não possui convites de amizade pendentes",
"no_blocked_users": "Você não tem nenhum usuário bloqueado",
"friend_code_copied": "Código de amigo copiado",
"undo_friendship_modal_text": "Isso irá remover sua amizade com {{displayName}}",
"privacy_hint": "Pra controlar quem pode ver seu perfil, acesse a <0>Tela de Configurações</0>",
"profile_locked": "Este perfil é privado",
"image_process_failure": "Falha ao processar a imagem",
"required_field": "Este campo é obrigatório",
"displayname_min_length": "Nome de exibição deve ter pelo menos 3 caracteres",
"displayname_max_length": "Nome de exibição deve ter no máximo 50 caracteres",
"locked_profile": "Este perfil é privado",
"report_profile": "Reportar este perfil",
"report_reason": "Por que você deseja reportar este perfil?",
"report_description": "Informações adicionais",
"report_description_placeholder": "Insira aqui",
"report": "Reportar",
"report_reason_hate": "Discurso de ódio",
"report_reason_sexual_content": "Conteúdo sexual",
"report_reason_violence": "Violência",
"report_reason_spam": "Spam",
"report_reason_other": "Outro",
"profile_reported": "Perfil reportado"
}
}

View File

@@ -0,0 +1,280 @@
{
"language_name": "Português (Portugal)",
"app": {
"successfully_signed_in": "Sessão iniciada com sucesso"
},
"home": {
"featured": "Destaques",
"trending": "Populares",
"surprise_me": "Surpreende-me",
"no_results": "Nenhum resultado encontrado",
"start_typing": "Comece a digitar para pesquisar…"
},
"sidebar": {
"catalogue": "Catálogo",
"downloads": "Transferências",
"settings": "Definições",
"my_library": "Biblioteca",
"downloading_metadata": "{{title}} (A transferir metadados…)",
"paused": "{{title}} (Pausado)",
"downloading": "{{title}} ({{percentage}} - A transferir…)",
"filter": "Procurar",
"home": "Início",
"queued": "{{title}} (Na fila)",
"game_has_no_executable": "Jogo não tem executável selecionado",
"sign_in": "Iniciar sessão"
},
"header": {
"search": "Procurar jogos",
"catalogue": "Catálogo",
"downloads": "Transferências",
"search_results": "Resultados da pesquisa",
"settings": "Definições",
"home": "Início",
"version_available_install": "Versão {{version}} disponível. Clique aqui para reiniciar e instalar.",
"version_available_download": "Versão {{version}} disponível. Clique aqui para fazer o download."
},
"bottom_panel": {
"no_downloads_in_progress": "Sem transferências em andamento",
"downloading_metadata": "A transferir metadados de {{title}}…",
"downloading": "A transferir {{title}}… ({{percentage}} concluído) - Conclusão {{eta}} - {{speed}}",
"calculating_eta": "A transferir {{title}}… ({{percentage}} concluído) - A calcular tempo restante…",
"checking_files": "A verificar ficheiros de {{title}}…"
},
"game_details": {
"open_download_options": "Ver opções de transferência",
"download_options_zero": "Sem opções de transferência",
"download_options_one": "{{count}} opção de transferência",
"download_options_other": "{{count}} opções de transferência",
"updated_at": "Atualizado a {{updated_at}}",
"resume": "Retomar",
"pause": "Pausar",
"cancel": "Cancelar",
"remove": "Remover",
"space_left_on_disk": "{{space}} livres no disco",
"eta": "Conclusão {{eta}}",
"calculating_eta": "A calcular tempo restante…",
"downloading_metadata": "A transferir metadados…",
"filter": "Filtrar repacks",
"requirements": "Requisitos do sistema",
"minimum": "Mínimos",
"recommended": "Recomendados",
"paused": "Pausado",
"release_date": "Lançado em {{date}}",
"publisher": "Publicado por {{publisher}}",
"hours": "horas",
"minutes": "minutos",
"amount_hours": "{{amount}} horas",
"amount_minutes": "{{amount}} minutos",
"accuracy": "{{accuracy}}% de precisão",
"add_to_library": "Adicionar à biblioteca",
"remove_from_library": "Remover da biblioteca",
"no_downloads": "Nenhuma transferência disponível",
"play_time": "Jogou por {{amount}}",
"next_suggestion": "Próxima sugestão",
"install": "Instalar",
"last_time_played": "Última sessão {{period}}",
"play": "Jogar",
"not_played_yet": "Ainda não jogou {{title}}",
"close": "Fechar",
"deleting": "A eliminar instalador…",
"playing_now": "A jogar agora",
"change": "Explorar",
"repacks_modal_description": "Escolha o repack do jogo que deseja transferir",
"select_folder_hint": "Para trocar o diretório padrão, aceda à <0>Tela de Definições</0>",
"download_now": "Iniciar transferência",
"no_shop_details": "Não foi possível obter os detalhes da loja.",
"download_options": "Opções de transferência",
"download_path": "Diretório de transferência",
"previous_screenshot": "Captura de ecrã anterior",
"next_screenshot": "Próxima captura de ecrã",
"screenshot": "Captura de ecrã {{number}}",
"open_screenshot": "Ver captura de ecrã {{number}}",
"download_settings": "Definições de transferência",
"downloader": "Downloader",
"select_executable": "Explorar",
"no_executable_selected": "Nenhum executável selecionado",
"open_folder": "Abrir pasta",
"open_download_location": "Ver ficheiros transferidos",
"create_shortcut": "Criar atalho no ambiente de trabalho",
"remove_files": "Remover ficheiros",
"options": "Gerir",
"remove_from_library_description": "Isto irá remover {{game}} da sua biblioteca",
"remove_from_library_title": "Tem a certeza?",
"executable_section_title": "Executável",
"executable_section_description": "O caminho do ficheiro que será executado ao clicar em \"Jogar\"",
"downloads_secion_title": "Transferências",
"downloads_section_description": "Confira atualizações ou versões diferentes para este mesmo título",
"danger_zone_section_title": "Zona de perigo",
"danger_zone_section_description": "Remova o jogo da sua biblioteca ou os ficheiros que foram transferidos pelo Hydra",
"download_in_progress": "Transferência em andamento",
"download_paused": "Transferência pausada",
"last_downloaded_option": "Última opção transferida",
"create_shortcut_success": "Atalho criado com sucesso",
"create_shortcut_error": "Erro ao criar atalho",
"download": "Transferir",
"executable_path_in_use": "Executável em uso por \"{{game}}\"",
"warning": "Aviso:",
"hydra_needs_to_remain_open": "para este download, o Hydra precisa ficar aberto até a conclusão. Caso o Hydra encerre antes da conclusão, perderá seu progresso."
},
"activation": {
"title": "Ativação",
"installation_id": "ID da instalação:",
"enter_activation_code": "Insira o seu código de ativação",
"message": "Se não sabe onde conseguir o código, talvez não devesse estar aqui.",
"activate": "Ativar",
"loading": "A carregar…"
},
"downloads": {
"resume": "Retomar",
"pause": "Pausar",
"eta": "Conclusão {{eta}}",
"paused": "Pausado",
"verifying": "A verificar…",
"completed": "Concluído",
"removed": "Cancelado",
"cancel": "Cancelar",
"filter": "Filtrar jogos transferidos",
"remove": "Remover",
"downloading_metadata": "A transferir metadados…",
"delete": "Remover instalador",
"delete_modal_description": "Isto removerá todos os ficheiros de instalação do seu computador",
"delete_modal_title": "Tem a certeza?",
"deleting": "A eliminar instalador…",
"install": "Instalar",
"download_in_progress": "A transferir agora",
"queued_downloads": "Na fila",
"downloads_completed": "Concluído",
"queued": "Na fila",
"no_downloads_title": "Nada por aqui…",
"no_downloads_description": "Ainda não transferiu nada pelo Hydra, mas nunca é tarde para começar.",
"checking_files": "A verificar ficheiros…"
},
"settings": {
"downloads_path": "Diretório das transferências",
"change": "Explorar...",
"notifications": "Notificações",
"enable_download_notifications": "Quando uma transferência for concluída",
"enable_repack_list_notifications": "Quando a lista de repacks for atualizada",
"real_debrid_api_token_label": "Token de API do Real-Debrid",
"quit_app_instead_hiding": "Encerrar o Hydra em vez de apenas minimizá-lo ao fechar.",
"launch_with_system": "Iniciar o Hydra com o sistema",
"general": "Geral",
"behavior": "Comportamento",
"download_sources": "Fontes de transferência",
"language": "Idioma",
"real_debrid_api_token": "Token de API",
"enable_real_debrid": "Ativar Real-Debrid",
"real_debrid_api_token_hint": "Pode obter o seu token de API <0>aqui</0>",
"real_debrid_description": "O Real-Debrid é um downloader sem restrições que permite transferir ficheiros instantaneamente e com a melhor velocidade da sua Internet.",
"real_debrid_invalid_token": "Token de API inválido",
"real_debrid_free_account_error": "A conta \"{{username}}\" é uma conta gratuita. Por favor, subscreva o Real-Debrid",
"real_debrid_linked_message": "Conta \"{{username}}\" vinculada",
"save_changes": "Guardar alterações",
"changes_saved": "Definições guardadas com sucesso",
"download_sources_description": "O Hydra vai procurar links de transferência em todas as fontes ativadas. A URL da página de detalhes da loja não é guardada no seu dispositivo. Utilizamos um sistema de metadados criado pela comunidade para fornecer suporte a mais fontes de transferência de jogos.",
"validate_download_source": "Validar",
"remove_download_source": "Remover",
"add_download_source": "Adicionar fonte",
"download_count_zero": "Sem transferências na lista",
"download_count_one": "{{countFormatted}} transferência na lista",
"download_count_other": "{{countFormatted}} transferências na lista",
"download_options_zero": "Sem transferências disponíveis",
"download_options_one": "{{countFormatted}} transferência disponível",
"download_options_other": "{{countFormatted}} transferências disponíveis",
"download_source_url": "URL da fonte",
"add_download_source_description": "Insira o URL contendo o arquivo .json",
"download_source_up_to_date": "Sincronizada",
"download_source_errored": "Falhou",
"sync_download_sources": "Sincronizar",
"removed_download_source": "Fonte removida",
"added_download_source": "Fonte adicionada",
"download_sources_synced": "As fontes foram sincronizadas",
"insert_valid_json_url": "Insira o URL de um JSON válido",
"found_download_option_zero": "Nenhuma opção de transferência encontrada",
"found_download_option_one": "{{countFormatted}} opção de transferência encontrada",
"found_download_option_other": "{{countFormatted}} opções de transferências encontradas",
"import": "Importar"
},
"notifications": {
"download_complete": "Transferência concluída",
"game_ready_to_install": "{{title}} está pronto para ser descarregado",
"repack_list_updated": "Lista de repacks atualizada",
"repack_count_one": "{{count}} novo repack",
"repack_count_other": "{{count}} novos repacks",
"new_update_available": "Versão {{version}} disponível",
"restart_to_install_update": "Reinicie o Hydra para instalar a nova versão"
},
"system_tray": {
"open": "Abrir Hydra",
"quit": "Fechar"
},
"game_card": {
"no_downloads": "Sem transferências disponíveis"
},
"binary_not_found_modal": {
"title": "Programas não instalados",
"description": "Os executáveis do Wine ou Lutris não foram encontrados em seu sistema.",
"instructions": "Verifique a forma correta de instalar algum deles na sua distro Linux, garantindo assim a execução normal do jogo."
},
"catalogue": {
"next_page": "Próxima página",
"previous_page": "Página anterior"
},
"modal": {
"close": "Botão de fechar"
},
"forms": {
"toggle_password_visibility": "Alternar visibilidade da palavra-passe"
},
"user_profile": {
"amount_hours": "{{amount}} horas",
"amount_minutes": "{{amount}} minutos",
"last_time_played": "Última sessão {{period}}",
"activity": "Atividades recentes",
"library": "Biblioteca",
"total_play_time": "Tempo total de jogo: {{amount}}",
"no_recent_activity_title": "Hmmm… nada por aqui",
"no_recent_activity_description": "Parece que não jogaste nada recentemente. Que tal começar agora?",
"display_name": "Nome de exibição",
"saving": "a guardar…",
"save": "Guardar",
"edit_profile": "Editar perfil",
"saved_successfully": "Guardado com sucesso",
"try_again": "Por favor, tenta novamente",
"cancel": "Cancelar",
"successfully_signed_out": "Terminado com sucesso",
"sign_out": "Terminar sessão",
"sign_out_modal_title": "Tens a certeza?",
"playing_for": "A jogar há {{amount}}",
"sign_out_modal_text": "A tua biblioteca de jogos está associada com a tua conta atual. Ao sair, a tua biblioteca não aparecerá mais no Hydra e qualquer progresso não será guardado. Desejas continuar?",
"add_friends": "Adicionar Amigos",
"friend_code": "Código de amigo",
"see_profile": "Ver perfil",
"friend_request_sent": "Pedido de amizade enviado",
"friends": "Amigos",
"add": "Adicionar",
"sending": "A enviar",
"friends_list": "Lista de amigos",
"user_not_found": "Utilizador não encontrado",
"block_user": "Bloquear",
"add_friend": "Adicionar amigo",
"request_sent": "Pedido enviado",
"request_received": "Pedido recebido",
"accept_request": "Aceitar pedido",
"ignore_request": "Ignorar pedido",
"cancel_request": "Cancelar pedido",
"undo_friendship": "Desfazer amizade",
"request_accepted": "Pedido de amizade aceito",
"user_blocked_successfully": "Utilizador bloqueado com sucesso",
"user_block_modal_text": "Bloquear {{displayName}}",
"blocked_users": "Utilizadores bloqueados",
"unblock": "Desbloquear",
"no_friends_added": "Ainda não adicionaste amigos",
"pending": "Pendentes",
"no_pending_invites": "Não tens convites de amizade pendentes",
"no_blocked_users": "Não tens nenhum utilizador bloqueado",
"friend_code_copied": "Código de amigo copiado",
"image_process_failure": "Falha ao processar a imagem"
}
}

View File

@@ -0,0 +1,160 @@
{
"language_name": "Română",
"home": {
"featured": "Recomandate",
"trending": "Populare",
"surprise_me": "Surprinde-mă",
"no_results": "Niciun rezultat găsit"
},
"sidebar": {
"catalogue": "Catalog",
"downloads": "Descărcări",
"settings": "Setări",
"my_library": "Biblioteca mea",
"downloading_metadata": "{{title}} (Se descarcă metadata...)",
"paused": "{{title}} (Pauzat)",
"downloading": "{{title}} ({{percentage}} - Se descarcă...)",
"filter": "Filtrează biblioteca",
"home": "Acasă"
},
"header": {
"search": "Caută jocuri",
"home": "Acasă",
"catalogue": "Catalog",
"downloads": "Descărcări",
"search_results": "Rezultatele căutării",
"settings": "Setări"
},
"bottom_panel": {
"no_downloads_in_progress": "Nicio descărcare în curs",
"downloading_metadata": "Se descarcă metadata pentru {{title}}...",
"downloading": "Se descarcă {{title}}... ({{percentage}} complet) - Concluzie {{eta}} - {{speed}}",
"calculating_eta": "Se descarcă {{title}}... ({{percentage}} complet) - Calculare timp rămas..."
},
"catalogue": {
"next_page": "Pagina următoare",
"previous_page": "Pagina anterioară"
},
"game_details": {
"open_download_options": "Deschide opțiunile de descărcare",
"download_options_zero": "Nicio opțiune de descărcare",
"download_options_one": "{{count}} opțiune de descărcare",
"download_options_other": "{{count}} opțiuni de descărcare",
"updated_at": "Actualizat la {{updated_at}}",
"install": "Instalează",
"resume": "Reia",
"pause": "Pauză",
"cancel": "Anulează",
"remove": "Elimină",
"space_left_on_disk": "{{space}} liber pe disc",
"eta": "Concluzie {{eta}}",
"calculating_eta": "Calculare timp rămas...",
"downloading_metadata": "Se descarcă metadata...",
"filter": "Filtrează repack-urile",
"requirements": "Cerințe de sistem",
"minimum": "Minim",
"recommended": "Recomandat",
"paused": "Pauzat",
"release_date": "Lansat pe {{date}}",
"publisher": "Publicat de {{publisher}}",
"hours": "ore",
"minutes": "minute",
"amount_hours": "{{amount}} ore",
"amount_minutes": "{{amount}} minute",
"accuracy": "{{accuracy}}% acuratețe",
"add_to_library": "Adaugă în bibliotecă",
"remove_from_library": "Elimină din bibliotecă",
"no_downloads": "Nicio descărcare disponibilă",
"play_time": "Jucat timp de {{amount}}",
"last_time_played": "Ultima dată jucat {{period}}",
"not_played_yet": "Nu ai jucat încă {{title}}",
"next_suggestion": "Sugestia următoare",
"play": "Joacă",
"deleting": "Se șterge programul de instalare...",
"close": "Închide",
"playing_now": "Se joacă acum",
"change": "Schimbă",
"repacks_modal_description": "Alege repack-ul pe care vrei să-l descarci",
"select_folder_hint": "Pentru a schimba folderul predefinit, mergi la <0>Setări</0>",
"download_now": "Descarcă acum",
"no_shop_details": "Nu s-au putut obține detalii din magazin.",
"download_options": "Opțiuni de descărcare",
"download_path": "Locația de descărcare",
"previous_screenshot": "Captura de ecran anterioară",
"next_screenshot": "Captura de ecran următoare",
"screenshot": "Captură de ecran {{number}}",
"open_screenshot": "Deschide captura de ecran {{number}}",
"download_settings": "Setări de descărcare",
"downloader": "Program de descărcare"
},
"activation": {
"title": "Activează Hydra",
"installation_id": "ID-ul de instalare:",
"enter_activation_code": "Introdu codul de activare",
"message": "Dacă nu știi de unde să ceri acest lucru, atunci nu ar trebui să-l ai.",
"activate": "Activează",
"loading": "Se încarcă..."
},
"downloads": {
"resume": "Reia",
"pause": "Pauză",
"eta": "Concluzie {{eta}}",
"paused": "Pauzat",
"verifying": "Se verifică...",
"completed": "Completat",
"removed": "Nu este descărcat",
"cancel": "Anulează",
"filter": "Filtrează jocurile descărcate",
"remove": "Elimină",
"downloading_metadata": "Se descarcă metadata...",
"deleting": "Se șterge programul de instalare...",
"delete": "Elimină programul de instalare",
"delete_modal_title": "Ești sigur?",
"delete_modal_description": "Aceasta va elimina toate fișierele de instalare de pe computer",
"install": "Instalează"
},
"settings": {
"downloads_path": "Locația de descărcare",
"change": "Actualizează",
"notifications": "Notificări",
"enable_download_notifications": "Când o descărcare este completă",
"enable_repack_list_notifications": "Când un nou repack este adăugat",
"real_debrid_api_token_label": "Token API Real-Debrid",
"quit_app_instead_hiding": "Nu ascunde Hydra la închidere",
"launch_with_system": "Lansează Hydra la pornirea sistemului",
"general": "General",
"behavior": "Comportament",
"language": "Limbă",
"real_debrid_api_token": "Token API",
"enable_real_debrid": "Activează Real-Debrid",
"real_debrid_description": "Real-Debrid este un descărcător fără restricții care îți permite să descarci fișiere instantaneu și la cea mai bună viteză a internetului tău.",
"real_debrid_invalid_token": "Token API invalid",
"real_debrid_api_token_hint": "Poți obține token-ul tău API <0>aici</0>",
"real_debrid_free_account_error": "Contul \"{{username}}\" este un cont gratuit. Te rugăm să te abonezi la Real-Debrid",
"real_debrid_linked_message": "Contul \"{{username}}\" a fost legat",
"save_changes": "Salvează modificările",
"changes_saved": "Modificările au fost salvate cu succes"
},
"notifications": {
"download_complete": "Descărcare completă",
"game_ready_to_install": "{{title}} este gata de instalare",
"repack_list_updated": "Lista de repack-uri a fost actualizată",
"repack_count_one": "{{count}} repack adăugat",
"repack_count_other": "{{count}} repack-uri adăugate"
},
"system_tray": {
"open": "Deschide Hydra",
"quit": "Ieși"
},
"game_card": {
"no_downloads": "Nicio descărcare disponibilă"
},
"binary_not_found_modal": {
"title": "Programele nu sunt instalate",
"description": "Fișierele executabile Wine sau Lutris nu au fost găsite pe sistemul tău",
"instructions": "Verifică modul corect de instalare a oricăruia dintre acestea pe distribuția ta Linux pentru ca jocul să ruleze normal"
},
"modal": {
"close": "Buton de închidere"
}
}

View File

@@ -1,4 +1,5 @@
{
"language_name": "Русский",
"app": {
"successfully_signed_in": "Успешный вход"
},
@@ -6,7 +7,10 @@
"featured": "Рекомендованное",
"trending": "В тренде",
"surprise_me": "Удиви меня",
"no_results": "Ничего не найдено"
"no_results": "Ничего не найдено",
"hot": "🔥 Сейчас жарко",
"start_typing": "Начинаю вводить текст для поиска...",
"weekly": "📅 Лучшие игры недели"
},
"sidebar": {
"catalogue": "Каталог",
@@ -20,7 +24,8 @@
"home": "Главная",
"queued": "{{title}} (В очереди)",
"game_has_no_executable": "Файл запуска игры не выбран",
"sign_in": "Войти"
"sign_in": "Войти",
"friends": "Друзья"
},
"header": {
"search": "Поиск",
@@ -36,7 +41,8 @@
"no_downloads_in_progress": "Нет активных загрузок",
"downloading_metadata": "Загрузка метаданных {{title}}…",
"downloading": "Загрузка {{title}}… ({{percentage}} завершено) - Окончание {{eta}} - {{speed}}",
"calculating_eta": "Загрузка {{title}}… ({{percentage}} завершено) - Подсчёт оставшегося времени…"
"calculating_eta": "Загрузка {{title}}… ({{percentage}} завершено) - Подсчёт оставшегося времени…",
"checking_files": "Проверка файлов {{title}}… ({{percentage}} завершено)"
},
"catalogue": {
"next_page": "Следующая страница",
@@ -112,7 +118,17 @@
"download_paused": "Загрузка приостановлена",
"last_downloaded_option": "Последний вариант загрузки",
"create_shortcut_success": "Ярлык создан",
"create_shortcut_error": "Не удалось создать ярлык"
"create_shortcut_error": "Не удалось создать ярлык",
"allow_nsfw_content": "Продолжать",
"download": "Скачать",
"download_count": "Загрузки",
"download_error": "Этот вариант загрузки недоступен",
"executable_path_in_use": "Исполняемый файл уже используется \"{{game}}\"",
"nsfw_content_description": "{{title}} содержит контент, который может не подходить для всех возрастов. \nВы уверены, что хотите продолжить?",
"nsfw_content_title": "Эта игра содержит неприемлемый контент",
"player_count": "Активные игроки",
"refuse_nsfw_content": "Возвращаться",
"stats": "Статистика"
},
"activation": {
"title": "Активировать Hydra",
@@ -144,7 +160,8 @@
"downloads_completed": "Завершено",
"queued": "В очереди",
"no_downloads_title": "Здесь так пусто...",
"no_downloads_description": "Вы ещё ничего не скачали через Hydra, но никогда не поздно начать."
"no_downloads_description": "Вы ещё ничего не скачали через Hydra, но никогда не поздно начать.",
"checking_files": "Проверка файлов…"
},
"settings": {
"downloads_path": "Путь загрузок",
@@ -153,11 +170,11 @@
"enable_download_notifications": "По завершении загрузки",
"enable_repack_list_notifications": "При добавлении нового репака",
"real_debrid_api_token_label": "Real-Debrid API-токен",
"quit_app_instead_hiding": "Закрывать Hydra вместо того, чтобы сворачивать его в трей",
"launch_with_system": "Запуск Hydra вместе с системой",
"quit_app_instead_hiding": "Закрывать приложение вместо сворачивания в трей",
"launch_with_system": "Запускать Hydra вместе с системой",
"general": "Основные",
"behavior": "Поведение",
"download_sources": "Скачать исходный код",
"download_sources": "Источники загрузки",
"language": "Язык",
"real_debrid_api_token": "API Ключ",
"enable_real_debrid": "Включить Real-Debrid",
@@ -175,9 +192,6 @@
"download_count_zero": "В списке нет загрузок",
"download_count_one": "{{countFormatted}} загрузка в списке",
"download_count_other": "{{countFormatted}} загрузок в списке",
"download_options_zero": "Нет доступных загрузок",
"download_options_one": "{{countFormatted}} вариант загрузки доступен",
"download_options_other": "{{countFormatted}} вариантов загрузки доступно",
"download_source_url": "Ссылка на источник",
"add_download_source_description": "Вставьте ссылку на .json-файл",
"download_source_up_to_date": "Обновлён",
@@ -190,14 +204,30 @@
"found_download_option_zero": "Не найдено вариантов загрузки",
"found_download_option_one": "Найден {{countFormatted}} вариант загрузки",
"found_download_option_other": "Найдено {{countFormatted}} вариантов загрузки",
"import": "Импортировать"
"import": "Импортировать",
"blocked_users": "Заблокированные пользователи",
"download_options_one": "",
"download_options_other": "",
"download_options_zero": "",
"friends_only": "Только друзья",
"must_be_valid_url": "Источник должен быть действительным URL-адресом.",
"privacy": "Конфиденциальность",
"private": "Частный",
"profile_visibility": "Видимость профиля",
"profile_visibility_description": "Выберите, кто может видеть ваш профиль и библиотеку",
"public": "Общественный",
"required_field": "Это поле обязательно к заполнению",
"source_already_exists": "Этот источник уже добавлен",
"user_unblocked": "Пользователь разблокирован"
},
"notifications": {
"download_complete": "Загрузка завершена",
"game_ready_to_install": "{{title}} готова к установке",
"repack_list_updated": "Список репаков обновлен",
"repack_count_one": "{{count}} репак добавлен",
"repack_count_other": "{{count}} репаков добавлено"
"repack_count_other": "{{count}} репаков добавлено",
"new_update_available": "Доступна версия {{version}}",
"restart_to_install_update": "Перезапустите Hydra для установки обновления"
},
"system_tray": {
"open": "Открыть Hydra",
@@ -228,7 +258,7 @@
"no_recent_activity_description": "Вы давно ни во что не играли. Пора это изменить!",
"display_name": "Отображаемое имя",
"saving": "Сохранение",
"save": "Сохранено",
"save": "Сохранить",
"edit_profile": "Редактировать Профиль",
"saved_successfully": "Успешно сохранено",
"try_again": "Пожалуйста, попробуйте ещё раз",
@@ -237,6 +267,52 @@
"successfully_signed_out": "Успешный выход из аккаунта",
"sign_out": "Выйти",
"playing_for": "Сыграно {{amount}}",
"sign_out_modal_text": "Ваша библиотека связана с текущей учетной записью. При выходе из системы ваша библиотека станет недоступна, и прогресс не будет сохранен. Выйти?"
"sign_out_modal_text": "Ваша библиотека связана с текущей учетной записью. При выходе из системы ваша библиотека станет недоступна, и прогресс не будет сохранен. Выйти?",
"add_friends": "Добавить друзей",
"add": "Добавить",
"friend_code": "Код друга",
"see_profile": "Просмотреть профиль",
"sending": "Отправка",
"friend_request_sent": "Запрос в друзья отправлен",
"friends": "Друзья",
"friends_list": "Список друзей",
"user_not_found": "Пользователь не найден",
"block_user": "Заблокировать пользователя",
"add_friend": "Добавить друга",
"request_sent": "Запрос отправлен",
"request_received": "Запрос получен",
"accept_request": "Принять запрос",
"ignore_request": "Игнорировать запрос",
"cancel_request": "Отменить запрос",
"undo_friendship": "Удалить друга",
"request_accepted": "Запрос принят",
"user_blocked_successfully": "Пользователь успешно заблокирован",
"user_block_modal_text": "{{displayName}} будет заблокирован",
"blocked_users": "Заблокированные пользователи",
"unblock": "Разблокировать",
"no_friends_added": "Вы ещё не добавили ни одного друга",
"pending": "Ожидание",
"no_pending_invites": "У вас нет запросов ожидающих ответа",
"no_blocked_users": "Вы не заблокировали ни одного пользователя",
"friend_code_copied": "Код друга скопирован",
"displayname_max_length": "Отображаемое имя должно содержать не более 50 символов.",
"displayname_min_length": "Отображаемое имя должно содержать не менее 3 символов.",
"image_process_failure": "Сбой при обработке изображения",
"locked_profile": "Этот профиль является частным",
"privacy_hint": "Чтобы указать, кто может это видеть, перейдите в <0>Настройки</0>.",
"profile_locked": "",
"profile_reported": "Профиль сообщил",
"report": "Отчет",
"report_description": "Дополнительная информация",
"report_description_placeholder": "Дополнительная информация",
"report_profile": "Пожаловаться на этот профиль",
"report_reason": "Почему вы жалуетесь на этот профиль?",
"report_reason_hate": "Разжигание ненависти",
"report_reason_other": "Другой",
"report_reason_sexual_content": "Сексуальный контент",
"report_reason_spam": "Спам",
"report_reason_violence": "Насилие",
"required_field": "Это поле обязательно к заполнению",
"undo_friendship_modal_text": "Это отменит вашу дружбу с {{displayName}}."
}
}

View File

@@ -1,4 +1,5 @@
{
"language_name": "Türkçe",
"home": {
"featured": "Öne çıkan",
"trending": "Popüler",

View File

@@ -1,4 +1,5 @@
{
"language_name": "Українська",
"app": {
"successfully_signed_in": "Успішний вхід в систему"
},

View File

@@ -1,4 +1,8 @@
{
"language_name": "中文",
"app": {
"successfully_signed_in": "已成功登录"
},
"home": {
"featured": "特色推荐",
"trending": "最近热门",
@@ -14,20 +18,26 @@
"paused": "{{title}} (已暂停)",
"downloading": "{{title}} ({{percentage}} - 正在下载…)",
"filter": "筛选游戏库",
"home": "主页"
"home": "主页",
"queued": "{{title}} (已加入下载队列)",
"game_has_no_executable": "未选择游戏的可执行文件",
"sign_in": "登入"
},
"header": {
"search": "搜索",
"search": "搜索游戏",
"home": "主页",
"catalogue": "游戏目录",
"downloads": "下载中心",
"search_results": "搜索结果",
"settings": "设置"
"settings": "设置",
"version_available_install": "版本 {{version}} 已可用. 点击此处重新启动并安装.",
"version_available_download": "版本 {{version}} 可用. 点击此处下载."
},
"bottom_panel": {
"no_downloads_in_progress": "没有正在进行的下载",
"downloading_metadata": "正在下载{{title}}的元数据…",
"downloading": "正在下载{{title}}… ({{percentage}}完成) - 剩余时间{{eta}} - 速度{{speed}}"
"downloading": "正在下载{{title}}… ({{percentage}}完成) - 剩余时间{{eta}} - 速度{{speed}}",
"calculating_eta": "正在下载 {{title}}… (已完成{{percentage}}.) - 正在计算剩余时间..."
},
"catalogue": {
"next_page": "下一页",
@@ -76,7 +86,29 @@
"previous_screenshot": "上一张截图",
"next_screenshot": "下一张截图",
"screenshot": "截图 {{number}}",
"open_screenshot": "打开截图 {{number}}"
"open_screenshot": "打开截图 {{number}}",
"download_settings": "下载设置",
"downloader": "下载器",
"select_executable": "选择",
"no_executable_selected": "没有可执行文件被指定",
"open_folder": "打开目录",
"open_download_location": "查看已下载的文件",
"create_shortcut": "创建桌面快捷方式",
"remove_files": "删除文件",
"remove_from_library_title": "你确定吗?",
"remove_from_library_description": "这将会把 {{game}} 从你的库中移除",
"options": "选项",
"executable_section_title": "可执行文件",
"executable_section_description": "点击 \"Play\" 时将执行的文件的路径",
"downloads_secion_title": "下载",
"downloads_section_description": "查看此游戏的更新或其他版本",
"danger_zone_section_title": "危险操作",
"danger_zone_section_description": "从您的库或Hydra下载的文件中删除此游戏",
"download_in_progress": "下载进行中",
"download_paused": "下载暂停",
"last_downloaded_option": "上次下载的选项",
"create_shortcut_success": "成功创建快捷方式",
"create_shortcut_error": "创建快捷方式出错"
},
"activation": {
"title": "激活 Hydra",
@@ -101,7 +133,13 @@
"delete": "移除安装程序",
"delete_modal_title": "您确定吗?",
"delete_modal_description": "这将从您的电脑上移除所有的安装文件",
"install": "安装"
"install": "安装",
"download_in_progress": "进行中",
"queued_downloads": "在队列中的下载",
"downloads_completed": "已完成",
"queued": "下载列表",
"no_downloads_title": "空空如也",
"no_downloads_description": "你还未使用Hydra下载任何游戏,但什么时候开始,都为时不晚。"
},
"settings": {
"downloads_path": "下载路径",
@@ -109,34 +147,72 @@
"notifications": "通知",
"enable_download_notifications": "下载完成时",
"enable_repack_list_notifications": "添加新重打包时",
"real_debrid_api_token_label": "Real-Debrid API 令牌",
"quit_app_instead_hiding": "关闭Hydra而不是最小化到托盘",
"launch_with_system": "系统启动时运行 Hydra",
"general": "通用",
"behavior": "行为",
"general": "常规",
"quit_app_instead_hiding": "关闭应用程序而不是最小化到托盘",
"launch_with_system": "随系统启动时运行应用程序",
"download_sources": "下载源",
"language": "语言",
"real_debrid_api_token": "API 令牌",
"enable_real_debrid": "启用 Real-Debrid",
"real_debrid_description": "Real-Debrid 是一个无限制的下载器,允许您以最快的互联网速度即时下载文件。",
"real_debrid_invalid_token": "无效的 API 令牌",
"real_debrid_api_token_hint": "您可以从<0>这里</0>获取API密钥.",
"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": "检查在您的Linux发行版上正确安装它们的方法,以便游戏可以正常运行"
"real_debrid_free_account_error": "账户 \"{{username}}\" 是免费账户。请订阅 Real-Debrid",
"real_debrid_linked_message": "账户 \"{{username}}\" 已链接",
"save_changes": "保存更改",
"changes_saved": "更改已成功保存",
"download_sources_description": "Hydra 将从这些源获取下载链接。源 URL 必须是直接链接到包含下载链接的 .json 文件。",
"validate_download_source": "验证",
"remove_download_source": "移除",
"add_download_source": "添加源",
"download_count_zero": "列表中无下载",
"download_count_one": "列表中有 {{countFormatted}} 个下载",
"download_count_other": "列表中有 {{countFormatted}} 个下载",
"download_options_zero": "无可用下载",
"download_options_one": "有 {{countFormatted}} 个下载可用",
"download_options_other": "有 {{countFormatted}} 个下载可用",
"download_source_url": "下载源 URL",
"add_download_source_description": "插入包含 .json 文件的 URL",
"download_source_up_to_date": "已更新",
"download_source_errored": "出错",
"sync_download_sources": "同步源",
"removed_download_source": "已移除下载源",
"added_download_source": "已添加下载源",
"download_sources_synced": "所有下载源已同步",
"insert_valid_json_url": "插入有效的 JSON 网址",
"found_download_option_zero": "未找到下载选项",
"found_download_option_one": "找到 {{countFormatted}} 个下载选项",
"found_download_option_other": "找到 {{countFormatted}} 个下载选项",
"import": "导入"
},
"modal": {
"close": "关闭按钮"
},
"forms": {
"toggle_password_visibility": "切换密码可见性"
},
"user_profile": {
"amount_hours": "{{amount}} 小时",
"amount_minutes": "{{amount}} 分钟",
"last_time_played": "上次游玩时间 {{period}}",
"activity": "近期活动",
"library": "库",
"total_play_time": "总游戏时长: {{amount}}",
"no_recent_activity_title": "Emmm… 这里暂时啥都没有",
"no_recent_activity_description": "你最近没玩过任何游戏。是时候做出改变了!",
"display_name": "昵称",
"saving": "保存中",
"save": "保存",
"edit_profile": "编辑资料",
"saved_successfully": "成功保存",
"try_again": "请重试",
"sign_out_modal_title": "你确定吗?",
"cancel": "取消",
"successfully_signed_out": "登出成功",
"sign_out": "登出",
"playing_for": "Playing for {{amount}}",
"sign_out_modal_text": "您的资料库与您当前的账户相关联。注销后,您的资料库将不再可见,任何进度也不会保存。继续退出吗?"
}
}

View File

@@ -3,11 +3,8 @@ import path from "node:path";
export const defaultDownloadsPath = app.getPath("downloads");
export const databasePath = path.join(
app.getPath("appData"),
"hydra",
"hydra.db"
);
export const databaseDirectory = path.join(app.getPath("appData"), "hydra");
export const databasePath = path.join(databaseDirectory, "hydra.db");
export const logsPath = path.join(app.getPath("appData"), "hydra", "logs");

View File

@@ -6,32 +6,22 @@ import {
GameShopCache,
Repack,
UserPreferences,
UserAuth,
} from "@main/entity";
import type { BetterSqlite3ConnectionOptions } from "typeorm/driver/better-sqlite3/BetterSqlite3ConnectionOptions";
import { databasePath } from "./constants";
import migrations from "./migrations";
import { UserAuth } from "./entity/user-auth";
export const createDataSource = (
options: Partial<BetterSqlite3ConnectionOptions>
) =>
new DataSource({
type: "better-sqlite3",
entities: [
Game,
Repack,
UserPreferences,
GameShopCache,
DownloadSource,
DownloadQueue,
UserAuth,
],
synchronize: true,
database: databasePath,
...options,
});
export const dataSource = createDataSource({
migrations,
export const dataSource = new DataSource({
type: "better-sqlite3",
entities: [
Game,
Repack,
UserPreferences,
GameShopCache,
DownloadSource,
DownloadQueue,
UserAuth,
],
synchronize: false,
database: databasePath,
});

View File

@@ -1,80 +0,0 @@
declare module "aria2" {
export type Aria2Status =
| "active"
| "waiting"
| "paused"
| "error"
| "complete"
| "removed";
export interface StatusResponse {
gid: string;
status: Aria2Status;
totalLength: string;
completedLength: string;
uploadLength: string;
bitfield: string;
downloadSpeed: string;
uploadSpeed: string;
infoHash?: string;
numSeeders?: string;
seeder?: boolean;
pieceLength: string;
numPieces: string;
connections: string;
errorCode?: string;
errorMessage?: string;
followedBy?: string[];
following: string;
belongsTo: string;
dir: string;
files: {
path: string;
length: string;
completedLength: string;
selected: string;
}[];
bittorrent?: {
announceList: string[][];
comment: string;
creationDate: string;
mode: "single" | "multi";
info: {
name: string;
verifiedLength: string;
verifyIntegrityPending: string;
};
};
}
export default class Aria2 {
constructor(options: any);
open: () => Promise<void>;
call(
method: "addUri",
uris: string[],
options: { dir: string }
): Promise<string>;
call(
method: "tellStatus",
gid: string,
keys?: string[]
): Promise<StatusResponse>;
call(method: "pause", gid: string): Promise<string>;
call(method: "forcePause", gid: string): Promise<string>;
call(method: "unpause", gid: string): Promise<string>;
call(method: "remove", gid: string): Promise<string>;
call(method: "forceRemove", gid: string): Promise<string>;
call(method: "pauseAll"): Promise<string>;
call(method: "forcePauseAll"): Promise<string>;
listNotifications: () => [
"onDownloadStart",
"onDownloadPause",
"onDownloadStop",
"onDownloadComplete",
"onDownloadError",
"onBtDownloadComplete",
];
on: (event: string, callback: (params: any) => void) => void;
}
}

View File

@@ -9,9 +9,8 @@ import {
} from "typeorm";
import { Repack } from "./repack.entity";
import type { GameShop } from "@types";
import type { GameShop, GameStatus } from "@types";
import { Downloader } from "@shared";
import type { Aria2Status } from "aria2";
import type { DownloadQueue } from "./download-queue.entity";
@Entity("game")
@@ -47,7 +46,7 @@ export class Game {
shop: GameShop;
@Column("text", { nullable: true })
status: Aria2Status | null;
status: GameStatus | null;
@Column("int", { default: Downloader.Torrent })
downloader: Downloader;

View File

@@ -16,15 +16,12 @@ export class Repack {
@Column("text", { unique: true })
title: string;
/**
* @deprecated Use uris instead
*/
@Column("text", { unique: true })
magnet: string;
/**
* @deprecated
*/
@Column("int", { nullable: true })
page: number;
@Column("text")
repacker: string;
@@ -37,6 +34,9 @@ export class Repack {
@ManyToOne(() => DownloadSource, { nullable: true, onDelete: "CASCADE" })
downloadSource: DownloadSource;
@Column("text", { default: "[]" })
uris: string;
@CreateDateColumn()
createdAt: Date;

View File

@@ -1,4 +1,5 @@
import jwt from "jsonwebtoken";
import * as Sentry from "@sentry/electron/main";
import { userAuthRepository } from "@main/repository";
import { registerEvent } from "../register-event";
@@ -8,6 +9,9 @@ const getSessionHash = async (_event: Electron.IpcMainInvokeEvent) => {
if (!auth) return null;
const payload = jwt.decode(auth.accessToken) as jwt.JwtPayload;
Sentry.setContext("sessionId", payload.sessionId);
return payload.sessionId;
};

View File

@@ -1,5 +1,11 @@
import { registerEvent } from "../register-event";
import { DownloadManager, HydraApi, gamesPlaytime } from "@main/services";
import * as Sentry from "@sentry/electron/main";
import {
DownloadManager,
HydraApi,
PythonInstance,
gamesPlaytime,
} from "@main/services";
import { dataSource } from "@main/data-source";
import { DownloadQueue, Game, UserAuth } from "@main/entity";
@@ -19,12 +25,20 @@ const signOut = async (_event: Electron.IpcMainInvokeEvent) => {
gamesPlaytime.clear();
});
/* Disconnects aria2 */
DownloadManager.disconnect();
/* Removes user from Sentry */
Sentry.setUser(null);
/* Cancels any ongoing downloads */
DownloadManager.cancelDownload();
/* Disconnects libtorrent */
PythonInstance.killTorrent();
HydraApi.handleSignOut();
await Promise.all([
databaseOperations,
HydraApi.post("/auth/logout").catch(),
HydraApi.post("/auth/logout").catch(() => {}),
]);
};

View File

@@ -3,6 +3,7 @@ import { registerEvent } from "../register-event";
import updater, { UpdateInfo } from "electron-updater";
import { WindowManager } from "@main/services";
import { app } from "electron";
import { publishNotificationUpdateReadyToInstall } from "@main/services/notifications";
const { autoUpdater } = updater;
@@ -20,13 +21,17 @@ const mockValuesForDebug = () => {
sendEvent({ type: "update-downloaded" });
};
const newVersionInfo = { version: "" };
const checkForUpdates = async (_event: Electron.IpcMainInvokeEvent) => {
autoUpdater
.once("update-available", (info: UpdateInfo) => {
sendEvent({ type: "update-available", info });
newVersionInfo.version = info.version;
})
.once("update-downloaded", () => {
sendEvent({ type: "update-downloaded" });
publishNotificationUpdateReadyToInstall(newVersionInfo.version);
});
if (app.isPackaged) {

View File

@@ -1,36 +1,44 @@
import { getSteamAppAsset } from "@main/helpers";
import type { CatalogueEntry, GameShop } from "@types";
import type { GameShop } from "@types";
import { registerEvent } from "../register-event";
import { RepacksManager, requestSteam250 } from "@main/services";
import { formatName } from "@shared";
import { HydraApi, RepacksManager } from "@main/services";
import { CatalogueCategory, formatName, steamUrlBuilder } from "@shared";
import { steamGamesWorker } from "@main/workers";
const resultSize = 12;
const getCatalogue = async (
_event: Electron.IpcMainInvokeEvent,
category: CatalogueCategory
) => {
const params = new URLSearchParams({
take: "12",
skip: "0",
});
const getCatalogue = async (_event: Electron.IpcMainInvokeEvent) => {
const trendingGames = await requestSteam250("/90day");
const results: CatalogueEntry[] = [];
const response = await HydraApi.get<{ objectId: string; shop: GameShop }[]>(
`/games/${category}?${params.toString()}`,
{},
{ needsAuth: false }
);
for (let i = 0; i < resultSize; i++) {
if (!trendingGames[i]) {
i++;
continue;
}
return Promise.all(
response.map(async (game) => {
const steamGame = await steamGamesWorker.run(Number(game.objectId), {
name: "getById",
});
const { title, objectID } = trendingGames[i]!;
const repacks = RepacksManager.search({ query: formatName(title) });
const repacks = RepacksManager.search({
query: formatName(steamGame.name),
});
const catalogueEntry = {
objectID,
title,
shop: "steam" as GameShop,
cover: getSteamAppAsset("library", objectID),
};
results.push({ ...catalogueEntry, repacks });
}
return results;
return {
title: steamGame.name,
shop: game.shop,
repacks,
cover: steamUrlBuilder.library(game.objectId),
objectID: game.objectId,
};
})
);
};
registerEvent("getCatalogue", getCatalogue);

View File

@@ -0,0 +1,23 @@
import type { GameShop } from "@types";
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
import type { GameStats } from "@types";
const getGameStats = async (
_event: Electron.IpcMainInvokeEvent,
objectId: string,
shop: GameShop
) => {
const params = new URLSearchParams({
objectId,
shop,
});
const response = await HydraApi.get<GameStats>(
`/games/stats?${params.toString()}`
);
return response;
};
registerEvent("getGameStats", getGameStats);

View File

@@ -3,7 +3,7 @@ import { shuffle } from "lodash-es";
import { getSteam250List } from "@main/services";
import { registerEvent } from "../register-event";
import { searchSteamGames } from "../helpers/search-games";
import { getSteamGameById } from "../helpers/search-games";
import type { Steam250Game } from "@types";
const state = { games: Array<Steam250Game>(), index: 0 };
@@ -12,14 +12,10 @@ const filterGames = async (games: Steam250Game[]) => {
const results: Steam250Game[] = [];
for (const game of games) {
const catalogue = await searchSteamGames({ query: game.title });
const steamGame = await getSteamGameById(game.objectID);
if (catalogue.length) {
const [steamGame] = catalogue;
if (steamGame.repacks.length) {
results.push(game);
}
if (steamGame?.repacks.length) {
results.push(game);
}
}

View File

@@ -0,0 +1,22 @@
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
import { userPreferencesRepository } from "@main/repository";
import { TrendingGame } from "@types";
const getTrendingGames = async (_event: Electron.IpcMainInvokeEvent) => {
const userPreferences = await userPreferencesRepository.findOne({
where: { id: 1 },
});
const language = userPreferences?.language || "en";
const trendingGames = await HydraApi.get<TrendingGame[]>(
"/games/trending",
{ language },
{ needsAuth: false }
).catch(() => []);
return trendingGames;
};
registerEvent("getTrendingGames", getTrendingGames);

View File

@@ -1,10 +1,25 @@
import { registerEvent } from "../register-event";
import { searchSteamGames } from "../helpers/search-games";
import { convertSteamGameToCatalogueEntry } from "../helpers/search-games";
import { CatalogueEntry } from "@types";
import { HydraApi, RepacksManager } from "@main/services";
const searchGamesEvent = async (
_event: Electron.IpcMainInvokeEvent,
query: string
): Promise<CatalogueEntry[]> => searchSteamGames({ query, limit: 12 });
): Promise<CatalogueEntry[]> => {
const games = await HydraApi.get<
{ objectId: string; title: string; shop: string }[]
>("/games/search", { title: query, take: 12, skip: 0 }, { needsAuth: false });
const steamGames = games.map((game) => {
return convertSteamGameToCatalogueEntry({
id: Number(game.objectId),
name: game.title,
clientIcon: null,
});
});
return RepacksManager.findRepacksForCatalogueEntries(steamGames);
};
registerEvent("searchGames", searchGamesEvent);

View File

@@ -1,16 +1,11 @@
import { downloadSourceRepository } from "@main/repository";
import { registerEvent } from "../register-event";
const getDownloadSources = async (_event: Electron.IpcMainInvokeEvent) => {
return downloadSourceRepository
.createQueryBuilder("downloadSource")
.leftJoin("downloadSource.repacks", "repacks")
.orderBy("downloadSource.createdAt", "DESC")
.loadRelationCountAndMap(
"downloadSource.repackCount",
"downloadSource.repacks"
)
.getMany();
};
const getDownloadSources = async (_event: Electron.IpcMainInvokeEvent) =>
downloadSourceRepository.find({
order: {
createdAt: "DESC",
},
});
registerEvent("getDownloadSources", getDownloadSources);

View File

@@ -1,17 +1,12 @@
import { registerEvent } from "../register-event";
import axios from "axios";
import { downloadSourceRepository } from "@main/repository";
import { downloadSourceSchema } from "../helpers/validators";
import { RepacksManager } from "@main/services";
import { downloadSourceWorker } from "@main/workers";
const validateDownloadSource = async (
_event: Electron.IpcMainInvokeEvent,
url: string
) => {
const response = await axios.get(url);
const source = downloadSourceSchema.parse(response.data);
const existingSource = await downloadSourceRepository.findOne({
where: { url },
});
@@ -21,14 +16,12 @@ const validateDownloadSource = async (
const repacks = RepacksManager.repacks;
const existingUris = source.downloads
.flatMap((download) => download.uris)
.filter((uri) => repacks.some((repack) => repack.magnet === uri));
return {
name: source.name,
downloadCount: source.downloads.length - existingUris.length,
};
return downloadSourceWorker.run(
{ url, repacks },
{
name: "validateDownloadSource",
}
);
};
registerEvent("validateDownloadSource", validateDownloadSource);

View File

@@ -0,0 +1,10 @@
import { shell } from "electron";
export const parseExecutablePath = (path: string) => {
if (process.platform === "win32" && path.endsWith(".lnk")) {
const { target } = shell.readShortcutLink(path);
return target;
}
return path;
};

View File

@@ -1,11 +1,8 @@
import { orderBy } from "lodash-es";
import flexSearch from "flexsearch";
import type { GameShop, CatalogueEntry, SteamGame } from "@types";
import { getSteamAppAsset } from "@main/helpers";
import { steamGamesWorker } from "@main/workers";
import { RepacksManager } from "@main/services";
import { steamUrlBuilder } from "@shared";
export interface SearchGamesArgs {
query?: string;
@@ -19,24 +16,22 @@ export const convertSteamGameToCatalogueEntry = (
objectID: String(game.id),
title: game.name,
shop: "steam" as GameShop,
cover: getSteamAppAsset("library", String(game.id)),
cover: steamUrlBuilder.library(String(game.id)),
repacks: [],
});
export const searchSteamGames = async (
options: flexSearch.SearchOptions
): Promise<CatalogueEntry[]> => {
const steamGames = (await steamGamesWorker.run(options, {
name: "search",
})) as SteamGame[];
export const getSteamGameById = async (
objectId: string
): Promise<CatalogueEntry | null> => {
const steamGame = await steamGamesWorker.run(Number(objectId), {
name: "getById",
});
const result = RepacksManager.findRepacksForCatalogueEntries(
steamGames.map((game) => convertSteamGameToCatalogueEntry(game))
);
if (!steamGame) return null;
return orderBy(
result,
[({ repacks }) => repacks.length, "repacks"],
["desc"]
);
const catalogueEntry = convertSteamGameToCatalogueEntry(steamGame);
const result = RepacksManager.findRepacksForCatalogueEntry(catalogueEntry);
return result;
};

View File

@@ -8,6 +8,8 @@ import "./catalogue/get-how-long-to-beat";
import "./catalogue/get-random-game";
import "./catalogue/search-games";
import "./catalogue/search-game-repacks";
import "./catalogue/get-game-stats";
import "./catalogue/get-trending-games";
import "./hardware/get-disk-free-space";
import "./library/add-game-to-library";
import "./library/create-game-shortcut";
@@ -20,9 +22,9 @@ import "./library/open-game-executable-path";
import "./library/open-game-installer";
import "./library/open-game-installer-path";
import "./library/update-executable-path";
import "./library/verify-executable-path";
import "./library/remove-game";
import "./library/remove-game-from-library";
import "./misc/is-user-logged-in";
import "./misc/open-external";
import "./misc/show-open-dialog";
import "./torrenting/cancel-game-download";
@@ -44,9 +46,22 @@ import "./auth/sign-out";
import "./auth/open-auth-window";
import "./auth/get-session-hash";
import "./user/get-user";
import "./user/get-blocked-users";
import "./user/block-user";
import "./user/unblock-user";
import "./user/get-user-friends";
import "./user/get-user-stats";
import "./user/report-user";
import "./profile/get-friend-requests";
import "./profile/get-me";
import "./profile/undo-friendship";
import "./profile/update-friend-request";
import "./profile/update-profile";
import "./profile/process-profile-image";
import "./profile/send-friend-request";
import { isPortableVersion } from "@main/helpers";
ipcMain.handle("ping", () => "pong");
ipcMain.handle("getVersion", () => app.getVersion());
ipcMain.handle("isPortableVersion", () => isPortableVersion());
ipcMain.handle("getDefaultDownloadsPath", () => defaultDownloadsPath);

View File

@@ -3,10 +3,11 @@ import { gameRepository } from "@main/repository";
import { registerEvent } from "../register-event";
import type { GameShop } from "@types";
import { getFileBase64, getSteamAppAsset } from "@main/helpers";
import { getFileBase64 } from "@main/helpers";
import { steamGamesWorker } from "@main/workers";
import { createGame } from "@main/services/library-sync";
import { steamUrlBuilder } from "@shared";
const addGameToLibrary = async (
_event: Electron.IpcMainInvokeEvent,
@@ -32,7 +33,7 @@ const addGameToLibrary = async (
});
const iconUrl = steamGame?.clientIcon
? getSteamAppAsset("icon", objectID, steamGame.clientIcon)
? steamUrlBuilder.icon(objectID, steamGame.clientIcon)
: null;
await gameRepository
@@ -53,18 +54,7 @@ const addGameToLibrary = async (
const game = await gameRepository.findOne({ where: { objectID } });
createGame(game!).then((response) => {
const {
id: remoteId,
playTimeInMilliseconds,
lastTimePlayed,
} = response.data;
gameRepository.update(
{ objectID },
{ remoteId, playTimeInMilliseconds, lastTimePlayed }
);
});
createGame(game!).catch(() => {});
});
};

View File

@@ -1,39 +1,45 @@
import path from "node:path";
import { gameRepository } from "@main/repository";
import { getProcesses } from "@main/helpers";
import { registerEvent } from "../register-event";
import { PythonInstance, logger } from "@main/services";
import sudo from "sudo-prompt";
import { app } from "electron";
const getKillCommand = (pid: number) => {
if (process.platform == "win32") {
return `taskkill /PID ${pid}`;
}
return `kill -9 ${pid}`;
};
const closeGame = async (
_event: Electron.IpcMainInvokeEvent,
gameId: number
) => {
const processes = await getProcesses();
const processes = await PythonInstance.getProcessList();
const game = await gameRepository.findOne({
where: { id: gameId, isDeleted: false },
});
if (!game) return false;
const executablePath = game.executablePath!;
const basename = path.win32.basename(executablePath);
const basenameWithoutExtension = path.win32.basename(
executablePath,
path.extname(executablePath)
);
if (!game) return;
const gameProcess = processes.find((runningProcess) => {
if (process.platform === "win32") {
return runningProcess.name === basename;
}
return [basename, basenameWithoutExtension].includes(runningProcess.name);
return runningProcess.exe === game.executablePath;
});
if (gameProcess) return process.kill(gameProcess.pid);
return false;
if (gameProcess) {
try {
process.kill(gameProcess.pid);
} catch (err) {
sudo.exec(
getKillCommand(gameProcess.pid),
{ name: app.getName() },
(error, _stdout, _stderr) => {
logger.error(error);
}
);
}
}
};
registerEvent("closeGame", closeGame);

View File

@@ -4,6 +4,7 @@ import { IsNull, Not } from "typeorm";
import createDesktopShortcut from "create-desktop-shortcuts";
import path from "node:path";
import { app } from "electron";
import { removeSymbolsFromName } from "@shared";
const createGameShortcut = async (
_event: Electron.IpcMainInvokeEvent,
@@ -22,7 +23,7 @@ const createGameShortcut = async (
const options = {
filePath,
name: game.title,
name: removeSymbolsFromName(game.title),
};
return createDesktopShortcut({

View File

@@ -45,10 +45,6 @@ const deleteGameFolder = async (
reject();
}
const aria2ControlFilePath = `${folderPath}.aria2`;
if (fs.existsSync(aria2ControlFilePath))
fs.rmSync(aria2ControlFilePath);
resolve();
}
);

View File

@@ -2,15 +2,18 @@ import { gameRepository } from "@main/repository";
import { registerEvent } from "../register-event";
import { shell } from "electron";
import { parseExecutablePath } from "../helpers/parse-executable-path";
const openGame = async (
_event: Electron.IpcMainInvokeEvent,
gameId: number,
executablePath: string
) => {
await gameRepository.update({ id: gameId }, { executablePath });
const parsedPath = parseExecutablePath(executablePath);
shell.openPath(executablePath);
await gameRepository.update({ id: gameId }, { executablePath: parsedPath });
shell.openPath(parsedPath);
};
registerEvent("openGame", openGame);

View File

@@ -20,7 +20,7 @@ const removeRemoveGameFromLibrary = async (gameId: number) => {
const game = await gameRepository.findOne({ where: { id: gameId } });
if (game?.remoteId) {
HydraApi.delete(`/games/${game.remoteId}`);
HydraApi.delete(`/profile/games/${game.remoteId}`).catch(() => {});
}
};

View File

@@ -1,6 +1,7 @@
import { gameRepository } from "@main/repository";
import { registerEvent } from "../register-event";
import { parseExecutablePath } from "../helpers/parse-executable-path";
const updateExecutablePath = async (
_event: Electron.IpcMainInvokeEvent,
@@ -12,7 +13,7 @@ const updateExecutablePath = async (
id,
},
{
executablePath,
executablePath: parseExecutablePath(executablePath),
}
);
};

View File

@@ -0,0 +1,13 @@
import { gameRepository } from "@main/repository";
import { registerEvent } from "../register-event";
const verifyExecutablePathInUse = async (
_event: Electron.IpcMainInvokeEvent,
executablePath: string
) => {
return gameRepository.findOne({
where: { executablePath },
});
};
registerEvent("verifyExecutablePathInUse", verifyExecutablePathInUse);

View File

@@ -1,8 +0,0 @@
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
const isUserLoggedIn = async (_event: Electron.IpcMainInvokeEvent) => {
return HydraApi.isLoggedIn();
};
registerEvent("isUserLoggedIn", isUserLoggedIn);

View File

@@ -0,0 +1,11 @@
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
import { FriendRequest } from "@types";
const getFriendRequests = async (
_event: Electron.IpcMainInvokeEvent
): Promise<FriendRequest[]> => {
return HydraApi.get(`/profile/friend-requests`).catch(() => []);
};
registerEvent("getFriendRequests", getFriendRequests);

View File

@@ -1,16 +1,33 @@
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
import * as Sentry from "@sentry/electron/main";
import { HydraApi, logger } from "@main/services";
import { UserProfile } from "@types";
import { userAuthRepository } from "@main/repository";
import { logger } from "@main/services";
import { steamUrlBuilder, UserNotLoggedInError } from "@shared";
import { steamGamesWorker } from "@main/workers";
const getSteamGame = async (objectId: string) => {
try {
const steamGame = await steamGamesWorker.run(Number(objectId), {
name: "getById",
});
return {
title: steamGame.name,
iconUrl: steamUrlBuilder.icon(objectId, steamGame.clientIcon),
};
} catch (err) {
logger.error("Failed to get Steam game", err);
return null;
}
};
const getMe = async (
_event: Electron.IpcMainInvokeEvent
): Promise<UserProfile | null> => {
return HydraApi.get(`/profile/me`)
.then((response) => {
const me = response.data;
.then(async (me) => {
userAuthRepository.upsert(
{
id: 1,
@@ -21,11 +38,33 @@ const getMe = async (
["id"]
);
if (me.currentGame) {
const steamGame = await getSteamGame(me.currentGame.objectId);
if (steamGame) {
me.currentGame = {
...me.currentGame,
...steamGame,
};
}
}
Sentry.setUser({ id: me.id, username: me.username });
return me;
})
.catch((err) => {
logger.error("getMe", err);
return userAuthRepository.findOne({ where: { id: 1 } });
.catch(async (err) => {
if (err instanceof UserNotLoggedInError) {
return null;
}
const loggedUser = await userAuthRepository.findOne({ where: { id: 1 } });
if (loggedUser) {
return { ...loggedUser, id: loggedUser.userId };
}
return null;
});
};

View File

@@ -0,0 +1,11 @@
import { registerEvent } from "../register-event";
import { PythonInstance } from "@main/services";
const processProfileImage = async (
_event: Electron.IpcMainInvokeEvent,
path: string
) => {
return PythonInstance.processProfileImage(path);
};
registerEvent("processProfileImage", processProfileImage);

View File

@@ -0,0 +1,11 @@
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
const sendFriendRequest = async (
_event: Electron.IpcMainInvokeEvent,
userId: string
) => {
return HydraApi.post("/profile/friend-requests", { friendCode: userId });
};
registerEvent("sendFriendRequest", sendFriendRequest);

View File

@@ -0,0 +1,11 @@
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
const undoFriendship = async (
_event: Electron.IpcMainInvokeEvent,
userId: string
) => {
await HydraApi.delete(`/profile/friends/${userId}`);
};
registerEvent("undoFriendship", undoFriendship);

View File

@@ -0,0 +1,19 @@
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
import { FriendRequestAction } from "@types";
const updateFriendRequest = async (
_event: Electron.IpcMainInvokeEvent,
userId: string,
action: FriendRequestAction
) => {
if (action == "CANCEL") {
return HydraApi.delete(`/profile/friend-requests/${userId}`);
}
return HydraApi.patch(`/profile/friend-requests/${userId}`, {
requestState: action,
});
};
registerEvent("updateFriendRequest", updateFriendRequest);

View File

@@ -1,61 +1,56 @@
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
import axios from "axios";
import { HydraApi, PythonInstance } from "@main/services";
import fs from "node:fs";
import path from "node:path";
import { fileTypeFromFile } from "file-type";
import { UserProfile } from "@types";
import type { UpdateProfileRequest, UserProfile } from "@types";
import { omit } from "lodash-es";
import axios from "axios";
const patchUserProfile = async (
displayName: string,
profileImageUrl?: string
) => {
if (profileImageUrl) {
return HydraApi.patch("/profile", {
displayName,
profileImageUrl,
interface PresignedResponse {
presignedUrl: string;
profileImageUrl: string;
}
const patchUserProfile = async (updateProfile: UpdateProfileRequest) => {
return HydraApi.patch<UserProfile>("/profile", updateProfile);
};
const getNewProfileImageUrl = async (localImageUrl: string) => {
const { imagePath, mimeType } =
await PythonInstance.processProfileImage(localImageUrl);
const stats = fs.statSync(imagePath);
const fileBuffer = fs.readFileSync(imagePath);
const fileSizeInBytes = stats.size;
const { presignedUrl, profileImageUrl } =
await HydraApi.post<PresignedResponse>(`/presigned-urls/profile-image`, {
imageExt: path.extname(imagePath).slice(1),
imageLength: fileSizeInBytes,
});
} else {
return HydraApi.patch("/profile", {
displayName,
});
}
await axios.put(presignedUrl, fileBuffer, {
headers: {
"Content-Type": mimeType,
},
});
return profileImageUrl;
};
const updateProfile = async (
_event: Electron.IpcMainInvokeEvent,
displayName: string,
newProfileImagePath: string | null
): Promise<UserProfile> => {
if (!newProfileImagePath) {
return (await patchUserProfile(displayName)).data;
updateProfile: UpdateProfileRequest
) => {
if (!updateProfile.profileImageUrl) {
return patchUserProfile(omit(updateProfile, "profileImageUrl"));
}
const stats = fs.statSync(newProfileImagePath);
const fileBuffer = fs.readFileSync(newProfileImagePath);
const fileSizeInBytes = stats.size;
const profileImageUrl = await getNewProfileImageUrl(
updateProfile.profileImageUrl
).catch(() => undefined);
const profileImageUrl = await HydraApi.post(`/presigned-urls/profile-image`, {
imageExt: path.extname(newProfileImagePath).slice(1),
imageLength: fileSizeInBytes,
})
.then(async (preSignedResponse) => {
const { presignedUrl, profileImageUrl } = preSignedResponse.data;
const mimeType = await fileTypeFromFile(newProfileImagePath);
await axios.put(presignedUrl, fileBuffer, {
headers: {
"Content-Type": mimeType?.mime,
},
});
return profileImageUrl;
})
.catch(() => {
return undefined;
});
return (await patchUserProfile(displayName, profileImageUrl)).data;
return patchUserProfile({ ...updateProfile, profileImageUrl });
};
registerEvent("updateProfile", updateProfile);

View File

@@ -1,117 +1,112 @@
import {
downloadQueueRepository,
gameRepository,
repackRepository,
} from "@main/repository";
import { registerEvent } from "../register-event";
import type { StartGameDownloadPayload } from "@types";
import { getFileBase64, getSteamAppAsset } from "@main/helpers";
import { getFileBase64 } from "@main/helpers";
import { DownloadManager } from "@main/services";
import { Not } from "typeorm";
import { steamGamesWorker } from "@main/workers";
import { createGame } from "@main/services/library-sync";
import { steamUrlBuilder } from "@shared";
import { dataSource } from "@main/data-source";
import { DownloadQueue, Game, Repack } from "@main/entity";
const startGameDownload = async (
_event: Electron.IpcMainInvokeEvent,
payload: StartGameDownloadPayload
) => {
const { repackId, objectID, title, shop, downloadPath, downloader } = payload;
const { repackId, objectID, title, shop, downloadPath, downloader, uri } =
payload;
const [game, repack] = await Promise.all([
gameRepository.findOne({
return dataSource.transaction(async (transactionalEntityManager) => {
const gameRepository = transactionalEntityManager.getRepository(Game);
const repackRepository = transactionalEntityManager.getRepository(Repack);
const downloadQueueRepository =
transactionalEntityManager.getRepository(DownloadQueue);
const [game, repack] = await Promise.all([
gameRepository.findOne({
where: {
objectID,
shop,
},
}),
repackRepository.findOne({
where: {
id: repackId,
},
}),
]);
if (!repack) return;
await DownloadManager.pauseDownload();
await gameRepository.update(
{ status: "active", progress: Not(1) },
{ status: "paused" }
);
if (game) {
await gameRepository.update(
{
id: game.id,
},
{
status: "active",
progress: 0,
bytesDownloaded: 0,
downloadPath,
downloader,
uri,
isDeleted: false,
}
);
} else {
const steamGame = await steamGamesWorker.run(Number(objectID), {
name: "getById",
});
const iconUrl = steamGame?.clientIcon
? steamUrlBuilder.icon(objectID, steamGame.clientIcon)
: null;
await gameRepository
.insert({
title,
iconUrl,
objectID,
downloader,
shop,
status: "active",
downloadPath,
uri,
})
.then((result) => {
if (iconUrl) {
getFileBase64(iconUrl).then((base64) =>
gameRepository.update({ objectID }, { iconUrl: base64 })
);
}
return result;
});
}
const updatedGame = await gameRepository.findOne({
where: {
objectID,
shop,
},
}),
repackRepository.findOne({
where: {
id: repackId,
},
}),
]);
if (!repack) return;
await DownloadManager.pauseDownload();
await gameRepository.update(
{ status: "active", progress: Not(1) },
{ status: "paused" }
);
if (game) {
await gameRepository.update(
{
id: game.id,
},
{
status: "active",
progress: 0,
bytesDownloaded: 0,
downloadPath,
downloader,
uri: repack.magnet,
isDeleted: false,
}
);
} else {
const steamGame = await steamGamesWorker.run(Number(objectID), {
name: "getById",
});
const iconUrl = steamGame?.clientIcon
? getSteamAppAsset("icon", objectID, steamGame.clientIcon)
: null;
createGame(updatedGame!).catch(() => {});
await gameRepository
.insert({
title,
iconUrl,
objectID,
downloader,
shop,
status: "active",
downloadPath,
uri: repack.magnet,
})
.then((result) => {
if (iconUrl) {
getFileBase64(iconUrl).then((base64) =>
gameRepository.update({ objectID }, { iconUrl: base64 })
);
}
await DownloadManager.cancelDownload(updatedGame!.id);
await DownloadManager.startDownload(updatedGame!);
return result;
});
}
const updatedGame = await gameRepository.findOne({
where: {
objectID,
},
await downloadQueueRepository.delete({ game: { id: updatedGame!.id } });
await downloadQueueRepository.insert({ game: { id: updatedGame!.id } });
});
createGame(updatedGame!).then((response) => {
const {
id: remoteId,
playTimeInMilliseconds,
lastTimePlayed,
} = response.data;
gameRepository.update(
{ objectID },
{ remoteId, playTimeInMilliseconds, lastTimePlayed }
);
});
await downloadQueueRepository.delete({ game: { id: updatedGame!.id } });
await downloadQueueRepository.insert({ game: { id: updatedGame!.id } });
await DownloadManager.startDownload(updatedGame!);
};
registerEvent("startGameDownload", startGameDownload);

View File

@@ -1,18 +1,41 @@
import { registerEvent } from "../register-event";
import AutoLaunch from "auto-launch";
import { app } from "electron";
import path from "path";
import fs from "node:fs";
import { logger } from "@main/services";
const windowsStartupPath = path.join(
app.getPath("appData"),
"Microsoft",
"Windows",
"Start Menu",
"Programs",
"Startup"
);
const autoLaunch = async (
_event: Electron.IpcMainInvokeEvent,
enabled: boolean
) => {
if (!app.isPackaged) return;
const appLauncher = new AutoLaunch({
name: app.getName(),
});
if (enabled) {
appLauncher.enable().catch();
appLauncher.enable().catch((err) => {
logger.error(err);
});
} else {
appLauncher.disable().catch();
if (process.platform == "win32") {
fs.rm(path.join(windowsStartupPath, "Hydra.vbs"), () => {});
}
appLauncher.disable().catch((err) => {
logger.error(err);
});
}
};

View File

@@ -2,17 +2,23 @@ import { userPreferencesRepository } from "@main/repository";
import { registerEvent } from "../register-event";
import type { UserPreferences } from "@types";
import i18next from "i18next";
const updateUserPreferences = async (
_event: Electron.IpcMainInvokeEvent,
preferences: Partial<UserPreferences>
) =>
userPreferencesRepository.upsert(
) => {
if (preferences.language) {
i18next.changeLanguage(preferences.language);
}
return userPreferencesRepository.upsert(
{
id: 1,
...preferences,
},
["id"]
);
};
registerEvent("updateUserPreferences", updateUserPreferences);

View File

@@ -0,0 +1,11 @@
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
const blockUser = async (
_event: Electron.IpcMainInvokeEvent,
userId: string
) => {
await HydraApi.post(`/users/${userId}/block`);
};
registerEvent("blockUser", blockUser);

View File

@@ -0,0 +1,13 @@
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
import { UserBlocks } from "@types";
export const getBlockedUsers = async (
_event: Electron.IpcMainInvokeEvent,
take: number,
skip: number
): Promise<UserBlocks> => {
return HydraApi.get(`/profile/blocks`, { take, skip });
};
registerEvent("getBlockedUsers", getBlockedUsers);

View File

@@ -0,0 +1,29 @@
import { userAuthRepository } from "@main/repository";
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
import { UserFriends } from "@types";
export const getUserFriends = async (
userId: string,
take: number,
skip: number
): Promise<UserFriends> => {
const loggedUser = await userAuthRepository.findOne({ where: { id: 1 } });
if (loggedUser?.userId === userId) {
return HydraApi.get(`/profile/friends`, { take, skip });
}
return HydraApi.get(`/users/${userId}/friends`, { take, skip });
};
const getUserFriendsEvent = async (
_event: Electron.IpcMainInvokeEvent,
userId: string,
take: number,
skip: number
) => {
return getUserFriends(userId, take, skip);
};
registerEvent("getUserFriends", getUserFriendsEvent);

View File

@@ -0,0 +1,12 @@
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
import type { UserStats } from "@types";
export const getUserStats = async (
_event: Electron.IpcMainInvokeEvent,
userId: string
): Promise<UserStats> => {
return HydraApi.get(`/users/${userId}/stats`);
};
registerEvent("getUserStats", getUserStats);

View File

@@ -1,54 +1,79 @@
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
import { HydraApi, logger } from "@main/services";
import { steamGamesWorker } from "@main/workers";
import { UserProfile } from "@types";
import { convertSteamGameToCatalogueEntry } from "../helpers/search-games";
import { getSteamAppAsset } from "@main/helpers";
import type { UserProfile } from "@types";
import { steamUrlBuilder } from "@shared";
const getSteamGame = async (objectId: string) => {
try {
const steamGame = await steamGamesWorker.run(Number(objectId), {
name: "getById",
});
return {
title: steamGame.name,
iconUrl: steamUrlBuilder.icon(objectId, steamGame.clientIcon),
};
} catch (err) {
logger.error("Failed to get Steam game", err);
return null;
}
};
const getUser = async (
_event: Electron.IpcMainInvokeEvent,
userId: string
): Promise<UserProfile | null> => {
try {
const response = await HydraApi.get(`/user/${userId}`);
const profile = response.data;
const profile = await HydraApi.get<UserProfile | null>(`/users/${userId}`);
if (!profile) return null;
const recentGames = await Promise.all(
profile.recentGames.map(async (game) => {
const steamGame = await steamGamesWorker.run(Number(game.objectId), {
name: "getById",
});
const iconUrl = steamGame?.clientIcon
? getSteamAppAsset("icon", game.objectId, steamGame.clientIcon)
: null;
profile.recentGames
.map(async (game) => {
const steamGame = await getSteamGame(game.objectId);
return {
...game,
...convertSteamGameToCatalogueEntry(steamGame),
iconUrl,
};
})
return {
...game,
...steamGame,
};
})
.filter((game) => game)
);
const libraryGames = await Promise.all(
profile.libraryGames.map(async (game) => {
const steamGame = await steamGamesWorker.run(Number(game.objectId), {
name: "getById",
});
const iconUrl = steamGame?.clientIcon
? getSteamAppAsset("icon", game.objectId, steamGame.clientIcon)
: null;
profile.libraryGames
.map(async (game) => {
const steamGame = await getSteamGame(game.objectId);
return {
...game,
...convertSteamGameToCatalogueEntry(steamGame),
iconUrl,
};
})
return {
...game,
...steamGame,
};
})
.filter((game) => game)
);
return { ...profile, libraryGames, recentGames };
if (profile.currentGame) {
const steamGame = await getSteamGame(profile.currentGame.objectId);
if (steamGame) {
profile.currentGame = {
...profile.currentGame,
...steamGame,
};
}
}
return {
...profile,
libraryGames,
recentGames,
};
} catch (err) {
console.log(err);
return null;
}
};

View File

@@ -0,0 +1,16 @@
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
export const reportUser = async (
_event: Electron.IpcMainInvokeEvent,
userId: string,
reason: string,
description: string
): Promise<void> => {
return HydraApi.post(`/users/${userId}/report`, {
reason,
description,
});
};
registerEvent("reportUser", reportUser);

View File

@@ -0,0 +1,11 @@
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
const unblockUser = async (
_event: Electron.IpcMainInvokeEvent,
userId: string
) => {
await HydraApi.post(`/users/${userId}/unblock`);
};
registerEvent("unblockUser", unblockUser);

View File

@@ -17,7 +17,8 @@ export const insertDownloadsFromSource = async (
const repacks: QueryDeepPartialEntity<Repack>[] = downloads.map(
(download) => ({
title: download.title,
magnet: download.uris[0],
uris: JSON.stringify(download.uris),
magnet: download.uris[0]!,
fileSize: download.fileSize,
repacker: downloadSource.name,
uploadDate: download.uploadDate,

View File

@@ -1,23 +1,7 @@
import axios from "axios";
import { JSDOM } from "jsdom";
import UserAgent from "user-agents";
export const getSteamAppAsset = (
category: "library" | "hero" | "logo" | "icon",
objectID: string,
clientIcon?: string
) => {
if (category === "library")
return `https://steamcdn-a.akamaihd.net/steam/apps/${objectID}/header.jpg`;
if (category === "hero")
return `https://steamcdn-a.akamaihd.net/steam/apps/${objectID}/library_hero.jpg`;
if (category === "logo")
return `https://cdn.cloudflare.steamstatic.com/steam/apps/${objectID}/logo.png`;
return `https://cdn.cloudflare.steamstatic.com/steamcommunity/public/images/apps/${objectID}/${clientIcon}.ico`;
};
export const getFileBuffer = async (url: string) =>
fetch(url, { method: "GET" }).then((response) =>
response.arrayBuffer().then((buffer) => Buffer.from(buffer))
@@ -33,29 +17,25 @@ export const getFileBase64 = async (url: string) =>
})
);
export const steamUrlBuilder = {
library: (objectID: string) =>
`https://steamcdn-a.akamaihd.net/steam/apps/${objectID}/header.jpg`,
libraryHero: (objectID: string) =>
`https://steamcdn-a.akamaihd.net/steam/apps/${objectID}/library_hero.jpg`,
logo: (objectID: string) =>
`https://cdn.cloudflare.steamstatic.com/steam/apps/${objectID}/logo.png`,
};
export const sleep = (ms: number) =>
new Promise((resolve) => setTimeout(resolve, ms));
export const requestWebPage = async (url: string) => {
const userAgent = new UserAgent();
return axios
const data = await axios
.get(url, {
headers: {
"User-Agent": userAgent.toString(),
},
})
.then((response) => response.data);
const { window } = new JSDOM(data);
return window.document;
};
export * from "./ps";
export const isPortableVersion = () =>
process.env.PORTABLE_EXECUTABLE_FILE != null;
export * from "./download-source";

View File

@@ -1,33 +0,0 @@
import psList from "ps-list";
import path from "node:path";
import childProcess from "node:child_process";
import { promisify } from "node:util";
import { app } from "electron";
const TEN_MEGABYTES = 1000 * 1000 * 10;
const execFile = promisify(childProcess.execFile);
export const getProcesses = async () => {
if (process.platform == "win32") {
const binaryPath = app.isPackaged
? path.join(process.resourcesPath, "fastlist.exe")
: path.join(__dirname, "..", "..", "fastlist.exe");
const { stdout } = await execFile(binaryPath, {
maxBuffer: TEN_MEGABYTES,
windowsHide: true,
});
return stdout
.trim()
.split("\r\n")
.map((line) => line.split("\t"))
.map(([pid, ppid, name]) => ({
pid: Number.parseInt(pid, 10),
ppid: Number.parseInt(ppid, 10),
name,
}));
} else {
return psList();
}
};

View File

@@ -1,13 +1,17 @@
import { app, BrowserWindow, net, protocol } from "electron";
import { init } from "@sentry/electron/main";
import updater from "electron-updater";
import i18n from "i18next";
import path from "node:path";
import url from "node:url";
import fs from "node:fs";
import { electronApp, optimizer } from "@electron-toolkit/utils";
import { DownloadManager, logger, WindowManager } from "@main/services";
import { logger, PythonInstance, WindowManager } from "@main/services";
import { dataSource } from "@main/data-source";
import * as resources from "@locales";
import resources from "@locales";
import { userPreferencesRepository } from "@main/repository";
import { knexClient, migrationConfig } from "./knex-client";
import { databaseDirectory } from "./constants";
const { autoUpdater } = updater;
@@ -22,6 +26,12 @@ autoUpdater.logger = logger;
const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) app.quit();
if (import.meta.env.MAIN_VITE_SENTRY_DSN) {
init({
dsn: import.meta.env.MAIN_VITE_SENTRY_DSN,
});
}
app.commandLine.appendSwitch("--no-sandbox");
i18n.init({
@@ -45,6 +55,22 @@ if (process.defaultApp) {
app.setAsDefaultProtocolClient(PROTOCOL);
}
const runMigrations = async () => {
if (!fs.existsSync(databaseDirectory)) {
fs.mkdirSync(databaseDirectory, { recursive: true });
}
await knexClient.migrate.list(migrationConfig).then((result) => {
logger.log(
"Migrations to run:",
result[1].map((migration) => migration.name)
);
});
await knexClient.migrate.latest(migrationConfig);
await knexClient.destroy();
};
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
@@ -56,8 +82,15 @@ app.whenReady().then(async () => {
return net.fetch(url.pathToFileURL(decodeURI(filePath)).toString());
});
await runMigrations()
.then(() => {
logger.log("Migrations executed successfully");
})
.catch((err) => {
logger.log("Migrations failed to run:", err);
});
await dataSource.initialize();
await dataSource.runMigrations();
await import("./main");
@@ -65,6 +98,10 @@ app.whenReady().then(async () => {
where: { id: 1 },
});
if (userPreferences?.language) {
i18n.changeLanguage(userPreferences.language);
}
WindowManager.createMainWindow();
WindowManager.createSystemTray(userPreferences?.language || "en");
});
@@ -75,10 +112,15 @@ app.on("browser-window-created", (_, window) => {
const handleDeepLinkPath = (uri?: string) => {
if (!uri) return;
const url = new URL(uri);
if (url.host === "install-source") {
WindowManager.redirect(`settings${url.search}`);
try {
const url = new URL(uri);
if (url.host === "install-source") {
WindowManager.redirect(`settings${url.search}`);
}
} catch (error) {
logger.error("Error handling deep link", uri, error);
}
};
@@ -108,7 +150,8 @@ app.on("window-all-closed", () => {
});
app.on("before-quit", () => {
DownloadManager.disconnect();
/* Disconnects libtorrent */
PythonInstance.kill();
});
app.on("activate", () => {

30
src/main/knex-client.ts Normal file
View File

@@ -0,0 +1,30 @@
import knex, { Knex } from "knex";
import { databasePath } from "./constants";
import { Hydra2_0_3 } from "./migrations/20240830143811_Hydra_2_0_3";
import { RepackUris } from "./migrations/20240830143906_RepackUris";
import { UpdateUserLanguage } from "./migrations/20240913213944_update_user_language";
export type HydraMigration = Knex.Migration & { name: string };
class MigrationSource implements Knex.MigrationSource<HydraMigration> {
getMigrations(): Promise<HydraMigration[]> {
return Promise.resolve([Hydra2_0_3, RepackUris, UpdateUserLanguage]);
}
getMigrationName(migration: HydraMigration): string {
return migration.name;
}
getMigration(migration: HydraMigration): Promise<Knex.Migration> {
return Promise.resolve(migration);
}
}
export const knexClient = knex({
client: "better-sqlite3",
connection: {
filename: databasePath,
},
});
export const migrationConfig: Knex.MigratorConfig = {
migrationSource: new MigrationSource(),
};

10
src/main/knexfile.ts Normal file
View File

@@ -0,0 +1,10 @@
const config = {
development: {
migrations: {
extension: "ts",
stub: "migrations/migration.stub",
},
},
};
export default config;

View File

@@ -1,4 +1,9 @@
import { DownloadManager, RepacksManager, startMainLoop } from "./services";
import {
DownloadManager,
RepacksManager,
PythonInstance,
startMainLoop,
} from "./services";
import {
downloadQueueRepository,
repackRepository,
@@ -12,18 +17,17 @@ import { MoreThan } from "typeorm";
import { HydraApi } from "./services/hydra-api";
import { uploadGamesBatch } from "./services/library-sync";
startMainLoop();
const loadState = async (userPreferences: UserPreferences | null) => {
await RepacksManager.updateRepacks();
RepacksManager.updateRepacks();
import("./events");
if (userPreferences?.realDebridApiToken)
if (userPreferences?.realDebridApiToken) {
RealDebridClient.authorize(userPreferences?.realDebridApiToken);
}
HydraApi.setupApi().then(async () => {
if (HydraApi.isLoggedIn()) uploadGamesBatch();
HydraApi.setupApi().then(() => {
uploadGamesBatch();
});
const [nextQueueItem] = await downloadQueueRepository.find({
@@ -35,8 +39,13 @@ const loadState = async (userPreferences: UserPreferences | null) => {
},
});
if (nextQueueItem?.game.status === "active")
if (nextQueueItem?.game.status === "active") {
DownloadManager.startDownload(nextQueueItem.game);
} else {
PythonInstance.spawn();
}
startMainLoop();
const now = new Date();

Some files were not shown because too many files have changed in this diff Show More