mirror of
https://github.com/hydralauncher/hydra.git
synced 2026-01-18 16:53:57 +00:00
Compare commits
335 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7d79048a25 | ||
|
|
4a3ba43dae | ||
|
|
dc413736e8 | ||
|
|
2d98addd02 | ||
|
|
b85e712d8c | ||
|
|
582c276e95 | ||
|
|
430b07eb89 | ||
|
|
b46f46bc45 | ||
|
|
fd41ec5070 | ||
|
|
25d0f77c1d | ||
|
|
c5b2a8242c | ||
|
|
8b7ce6b062 | ||
|
|
db58ff0ba3 | ||
|
|
e951e11e62 | ||
|
|
0b854eda7c | ||
|
|
648083fbf4 | ||
|
|
09316dac9e | ||
|
|
670df826af | ||
|
|
912f9611ea | ||
|
|
d8254353b5 | ||
|
|
73185e7cbc | ||
|
|
c36c940a79 | ||
|
|
1d73b0a251 | ||
|
|
8e4e87840a | ||
|
|
cb8d9aeb82 | ||
|
|
1656ff1b0a | ||
|
|
b54cfbadc5 | ||
|
|
f02959f134 | ||
|
|
3bff55ef2c | ||
|
|
02d1f8ff47 | ||
|
|
f1cf4b683b | ||
|
|
a774b107f3 | ||
|
|
57179446ce | ||
|
|
034e71b3ee | ||
|
|
c1144d3891 | ||
|
|
2620f31989 | ||
|
|
3bca6eed2b | ||
|
|
d10fed6aeb | ||
|
|
ee73c04b12 | ||
|
|
73eb7ac637 | ||
|
|
144444ad10 | ||
|
|
8d892ab440 | ||
|
|
eb6c056713 | ||
|
|
4063568a42 | ||
|
|
7ebe42ebf1 | ||
|
|
21b6783624 | ||
|
|
1ab9564fac | ||
|
|
ab618cea90 | ||
|
|
202533c85c | ||
|
|
7a5cacf103 | ||
|
|
dfb6a324c3 | ||
|
|
6a26c6e5e8 | ||
|
|
5dac84051e | ||
|
|
57e4bd4d27 | ||
|
|
dec4254cb3 | ||
|
|
7d3d5d42d1 | ||
|
|
6bbd916e99 | ||
|
|
ceef316a19 | ||
|
|
fe056eaf85 | ||
|
|
bfcf8178d8 | ||
|
|
3ade87fe0b | ||
|
|
07205d043d | ||
|
|
7de6e96f63 | ||
|
|
9c595583cd | ||
|
|
1c63fc11ee | ||
|
|
49ee05770a | ||
|
|
44131fe831 | ||
|
|
a72eb768e7 | ||
|
|
955725b646 | ||
|
|
8a24fd8ef9 | ||
|
|
b7f717a6f4 | ||
|
|
6d1f290895 | ||
|
|
e86daacad4 | ||
|
|
f2d66df34f | ||
|
|
21fecb2c4e | ||
|
|
af8468066a | ||
|
|
34a33ccef3 | ||
|
|
6ef1135ba2 | ||
|
|
df5f82d47f | ||
|
|
d801bad49e | ||
|
|
9f76ae8c59 | ||
|
|
2f9fa6da48 | ||
|
|
d0f42e73ff | ||
|
|
0bcf005365 | ||
|
|
27e8a0820f | ||
|
|
fd5262cd6e | ||
|
|
36b98a7d73 | ||
|
|
c6fda9b4d8 | ||
|
|
bb65d77fc6 | ||
|
|
22fc95ff53 | ||
|
|
36e6a8cef7 | ||
|
|
33e91e2007 | ||
|
|
2599b332fd | ||
|
|
735b540af4 | ||
|
|
1d7858438d | ||
|
|
993b35cf3b | ||
|
|
63507f00f6 | ||
|
|
ded56c518d | ||
|
|
fbae552b1b | ||
|
|
0567674f2a | ||
|
|
b7c9b5ec54 | ||
|
|
f0a2bf2f48 | ||
|
|
89bb099caa | ||
|
|
f7b9a88219 | ||
|
|
7f8fd32cfe | ||
|
|
614c840aac | ||
|
|
bc6d038c58 | ||
|
|
0e5d37a3a0 | ||
|
|
1bdb80a92b | ||
|
|
584f725eda | ||
|
|
1176ddbe30 | ||
|
|
c7fe59c854 | ||
|
|
9a61a3b448 | ||
|
|
801658fb39 | ||
|
|
6c6d13e387 | ||
|
|
ab27fd21d7 | ||
|
|
2700f27d03 | ||
|
|
ea5b07a1ec | ||
|
|
108b2552b5 | ||
|
|
a498f9dd80 | ||
|
|
67109ff51a | ||
|
|
bdaf68ad23 | ||
|
|
05625e7594 | ||
|
|
4820109b8d | ||
|
|
5c4ddd9b7a | ||
|
|
fe681c3af9 | ||
|
|
8ff925fbb9 | ||
|
|
958a7d037f | ||
|
|
c5764a49e1 | ||
|
|
64c16e82b4 | ||
|
|
e9186e0a3c | ||
|
|
e7a4888f54 | ||
|
|
359733fa40 | ||
|
|
034e88e286 | ||
|
|
1d29bc3620 | ||
|
|
c24f6be1b7 | ||
|
|
694e0cd12c | ||
|
|
8cc8b5fe6f | ||
|
|
a4475d2145 | ||
|
|
a064958d4c | ||
|
|
7e25741657 | ||
|
|
0d909d6eeb | ||
|
|
9a699e082d | ||
|
|
bf416e47b3 | ||
|
|
0461aa2b71 | ||
|
|
b3aae3e8aa | ||
|
|
887ec3f8eb | ||
|
|
be08fb6d14 | ||
|
|
05653500b6 | ||
|
|
0241d8752b | ||
|
|
c8022896a6 | ||
|
|
3dcdcae9a7 | ||
|
|
fa026f82a6 | ||
|
|
e3f61bbaa8 | ||
|
|
8fb31e0e64 | ||
|
|
d93e234001 | ||
|
|
03413a9e6b | ||
|
|
ffac677e3f | ||
|
|
0fdd2797a5 | ||
|
|
4b763173f6 | ||
|
|
446b03eeff | ||
|
|
16cd5b43d8 | ||
|
|
bcca701dc9 | ||
|
|
365178b06d | ||
|
|
1bba8c84bd | ||
|
|
a557735545 | ||
|
|
1705b89355 | ||
|
|
fca585d062 | ||
|
|
63aee44982 | ||
|
|
f5445b00f4 | ||
|
|
e93088e8b9 | ||
|
|
0f1ed20bbb | ||
|
|
9405b0dcfc | ||
|
|
39af661720 | ||
|
|
75be6e5b47 | ||
|
|
baafc6c7d1 | ||
|
|
6d4f957e2b | ||
|
|
7c9c27801f | ||
|
|
7f09a7796f | ||
|
|
af83152997 | ||
|
|
5d21adcbb1 | ||
|
|
456e7ed809 | ||
|
|
f5da836b1b | ||
|
|
1ea64d7243 | ||
|
|
57118ec5b9 | ||
|
|
002028130b | ||
|
|
71e7f1ee58 | ||
|
|
0222121288 | ||
|
|
f6acfa4aee | ||
|
|
2a6b757e37 | ||
|
|
9391b7e6c9 | ||
|
|
b99dbe83e2 | ||
|
|
bcbe6c9619 | ||
|
|
0873c8e244 | ||
|
|
58502aeb1f | ||
|
|
4222fcec52 | ||
|
|
035e424a76 | ||
|
|
5e313a0374 | ||
|
|
81e2bda049 | ||
|
|
d27ce9781f | ||
|
|
94e242168c | ||
|
|
e4ca3d38ec | ||
|
|
0acb0fd4c8 | ||
|
|
241d7692b9 | ||
|
|
0895e9ec72 | ||
|
|
9b932358e8 | ||
|
|
3ed4547dfe | ||
|
|
9731035820 | ||
|
|
7e2d9316f3 | ||
|
|
7cddcd8147 | ||
|
|
5da9eb6366 | ||
|
|
9c7651d8e2 | ||
|
|
8b5ed96e9b | ||
|
|
f0e0abae8c | ||
|
|
cadb9e8dff | ||
|
|
beaa919c80 | ||
|
|
ef4844b8c0 | ||
|
|
d5b1bcdc7f | ||
|
|
05652d9c1b | ||
|
|
6a0f47eacb | ||
|
|
8f9508c00e | ||
|
|
44e59a5f6f | ||
|
|
c18c41ac95 | ||
|
|
084b7f5b9c | ||
|
|
92b0ced08a | ||
|
|
f6ce6eddb8 | ||
|
|
a031049b73 | ||
|
|
a48e269d7f | ||
|
|
333b143b17 | ||
|
|
586df616e8 | ||
|
|
eda47fc6af | ||
|
|
202751ddca | ||
|
|
790f7a2549 | ||
|
|
eebd09ccf2 | ||
|
|
ac9565f924 | ||
|
|
55a92fd68a | ||
|
|
37111c11d8 | ||
|
|
84420668fc | ||
|
|
4bf25f8c52 | ||
|
|
bdba3dd29c | ||
|
|
43e9919b6b | ||
|
|
2aa393967f | ||
|
|
17febcd88a | ||
|
|
753a293cd7 | ||
|
|
d7c05247c3 | ||
|
|
54dae87a58 | ||
|
|
50b34dc864 | ||
|
|
08fbd4c8d8 | ||
|
|
780ab5f909 | ||
|
|
c72eefdb77 | ||
|
|
5c790edb2c | ||
|
|
24d21b9839 | ||
|
|
5b9d860937 | ||
|
|
9b5e13ad35 | ||
|
|
25cfdb50d8 | ||
|
|
32fa69627c | ||
|
|
3e165e05fb | ||
|
|
89b830fe9a | ||
|
|
2d7aef34c6 | ||
|
|
0ea7329aa3 | ||
|
|
b87aade2a3 | ||
|
|
41c80daaaa | ||
|
|
e64a414309 | ||
|
|
f98432f6c6 | ||
|
|
f3a5f90bc7 | ||
|
|
d57980edc7 | ||
|
|
97dc9b03b0 | ||
|
|
7e3cf0a00e | ||
|
|
5b0cf1e82b | ||
|
|
500cd2a531 | ||
|
|
8fb62af0cf | ||
|
|
fabeedaa8a | ||
|
|
e701a273d8 | ||
|
|
6c32fdbcbb | ||
|
|
61b2d55d47 | ||
|
|
7b5e4459d4 | ||
|
|
5b450db5eb | ||
|
|
d88e06e289 | ||
|
|
e77991ea16 | ||
|
|
5e55c05bd7 | ||
|
|
81e74f068f | ||
|
|
d5a510175f | ||
|
|
2b2f29da61 | ||
|
|
339dc89702 | ||
|
|
50028fbfd8 | ||
|
|
d97c5b894a | ||
|
|
f860439fb5 | ||
|
|
ddd6ff7dbe | ||
|
|
849b6de6bc | ||
|
|
79e2eb042a | ||
|
|
f9ad26c836 | ||
|
|
f6fbfe33e0 | ||
|
|
18d6ca630a | ||
|
|
c7afcff0b4 | ||
|
|
a3bdfe7641 | ||
|
|
e7b4f8e1c8 | ||
|
|
e526c0f650 | ||
|
|
9791c311f1 | ||
|
|
b1ea9cbfaa | ||
|
|
74d2ec8238 | ||
|
|
f8f2124cec | ||
|
|
3833e11e98 | ||
|
|
613898b32d | ||
|
|
2bc98317e9 | ||
|
|
2e87ae8486 | ||
|
|
df5f34119f | ||
|
|
2271368199 | ||
|
|
e139423b52 | ||
|
|
aa2ecfad96 | ||
|
|
b76441a763 | ||
|
|
2d160ba8ee | ||
|
|
5863b15b12 | ||
|
|
bc175e635f | ||
|
|
f7f89cb778 | ||
|
|
16c45692da | ||
|
|
30aa3f5470 | ||
|
|
ef16732c0a | ||
|
|
84c472a3fa | ||
|
|
2610f8b17b | ||
|
|
705b12019f | ||
|
|
39be8fdf53 | ||
|
|
cc7c3455fa | ||
|
|
d1f4bc7207 | ||
|
|
aa4ca25653 | ||
|
|
405ea0a824 | ||
|
|
43bc0cb08f | ||
|
|
3c200aa2eb | ||
|
|
cc5967814b | ||
|
|
ec16efed2f | ||
|
|
09d0e5b4ef | ||
|
|
5b18aba2b8 | ||
|
|
192008c76c | ||
|
|
1de3a9836c | ||
|
|
ee02811aea | ||
|
|
c21ebe1ce2 |
@@ -1,4 +1,5 @@
|
|||||||
MAIN_VITE_STEAMGRIDDB_API_KEY=YOUR_API_KEY
|
|
||||||
MAIN_VITE_API_URL=API_URL
|
MAIN_VITE_API_URL=API_URL
|
||||||
|
MAIN_VITE_AUTH_URL=AUTH_URL
|
||||||
|
MAIN_VITE_STEAMGRIDDB_API_KEY=YOUR_API_KEY
|
||||||
MAIN_VITE_SENTRY_DSN=YOUR_SENTRY_DSN
|
MAIN_VITE_SENTRY_DSN=YOUR_SENTRY_DSN
|
||||||
SENTRY_AUTH_TOKEN=
|
SENTRY_AUTH_TOKEN=
|
||||||
|
|||||||
20
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
20
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -1,6 +1,6 @@
|
|||||||
name: Bug Report
|
name: Bug Report
|
||||||
description: Create a report to help us improve. Write in English, please.
|
description: Create a report to help us improve. Write in English, please.
|
||||||
title: "[BUG] "
|
title: "[BUG] Write a title for your bug"
|
||||||
labels: ["bug"]
|
labels: ["bug"]
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
@@ -29,12 +29,15 @@ body:
|
|||||||
validations:
|
validations:
|
||||||
required: false
|
required: false
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: screenshots
|
id: additional-info
|
||||||
attributes:
|
attributes:
|
||||||
label: Screenshots
|
label: Additional information and data
|
||||||
description: If applicable, add screenshots to help explain your problem.
|
description: |
|
||||||
|
Add screenshots and upload your logs file here.
|
||||||
|
Logs location on Windows: "%appdata%/hydra"
|
||||||
|
Logs location on Linux: "~/.config/hydra/"
|
||||||
validations:
|
validations:
|
||||||
required: false
|
required: true
|
||||||
- type: input
|
- type: input
|
||||||
id: OS
|
id: OS
|
||||||
attributes:
|
attributes:
|
||||||
@@ -49,13 +52,6 @@ body:
|
|||||||
description: Please provide the version of Hydra you are using.
|
description: Please provide the version of Hydra you are using.
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
|
||||||
id: additional-info
|
|
||||||
attributes:
|
|
||||||
label: Additional Information
|
|
||||||
description: Please provide any additional information and context about your problem.
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
id: terms
|
id: terms
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
9
.github/workflows/build.yml
vendored
9
.github/workflows/build.yml
vendored
@@ -40,7 +40,9 @@ jobs:
|
|||||||
sudo apt-get install -y libarchive-tools
|
sudo apt-get install -y libarchive-tools
|
||||||
yarn build:linux
|
yarn build:linux
|
||||||
env:
|
env:
|
||||||
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }}
|
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_STAGING_API_URL }}
|
||||||
|
MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_STAGING_AUTH_URL }}
|
||||||
|
MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_STAGING_CHECKOUT_URL }}
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }}
|
MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -49,7 +51,9 @@ jobs:
|
|||||||
if: matrix.os == 'windows-latest'
|
if: matrix.os == 'windows-latest'
|
||||||
run: yarn build:win
|
run: yarn build:win
|
||||||
env:
|
env:
|
||||||
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }}
|
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_STAGING_API_URL }}
|
||||||
|
MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_STAGING_AUTH_URL }}
|
||||||
|
MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_STAGING_CHECKOUT_URL }}
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }}
|
MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -59,7 +63,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: Build-${{ matrix.os }}
|
name: Build-${{ matrix.os }}
|
||||||
path: |
|
path: |
|
||||||
dist/win-unpacked/**
|
|
||||||
dist/*-portable.exe
|
dist/*-portable.exe
|
||||||
dist/*.zip
|
dist/*.zip
|
||||||
dist/*.dmg
|
dist/*.dmg
|
||||||
|
|||||||
20
.github/workflows/release.yml
vendored
20
.github/workflows/release.yml
vendored
@@ -43,6 +43,8 @@ jobs:
|
|||||||
yarn build:linux
|
yarn build:linux
|
||||||
env:
|
env:
|
||||||
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }}
|
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }}
|
||||||
|
MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_AUTH_URL }}
|
||||||
|
MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_CHECKOUT_URL }}
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }}
|
MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -52,10 +54,28 @@ jobs:
|
|||||||
run: yarn build:win
|
run: yarn build:win
|
||||||
env:
|
env:
|
||||||
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }}
|
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }}
|
||||||
|
MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_AUTH_URL }}
|
||||||
|
MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_CHECKOUT_URL }}
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }}
|
MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Create artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: Build-${{ matrix.os }}
|
||||||
|
path: |
|
||||||
|
dist/win-unpacked/**
|
||||||
|
dist/*-portable.exe
|
||||||
|
dist/*.zip
|
||||||
|
dist/*.dmg
|
||||||
|
dist/*.deb
|
||||||
|
dist/*.rpm
|
||||||
|
dist/*.tar.gz
|
||||||
|
dist/*.yml
|
||||||
|
dist/*.blockmap
|
||||||
|
dist/*.pacman
|
||||||
|
|
||||||
- name: Release
|
- name: Release
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
with:
|
with:
|
||||||
|
|||||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,5 +1,5 @@
|
|||||||
.vscode
|
.vscode/
|
||||||
node_modules
|
node_modules/
|
||||||
hydra-download-manager/
|
hydra-download-manager/
|
||||||
fastlist.exe
|
fastlist.exe
|
||||||
__pycache__
|
__pycache__
|
||||||
@@ -10,3 +10,4 @@ out
|
|||||||
.env
|
.env
|
||||||
.vite
|
.vite
|
||||||
sentry.properties
|
sentry.properties
|
||||||
|
ludusavi/
|
||||||
23
README.md
23
README.md
@@ -13,16 +13,19 @@
|
|||||||
[](https://github.com/hydralauncher/hydra/actions)
|
[](https://github.com/hydralauncher/hydra/actions)
|
||||||
[](https://github.com/hydralauncher/hydra/releases)
|
[](https://github.com/hydralauncher/hydra/releases)
|
||||||
|
|
||||||
[](README.pt-BR.md)
|
[](./README.pt-BR.md)
|
||||||
[](README.md)
|
[](./README.md)
|
||||||
[](README.ru.md)
|
[](./README.ru.md)
|
||||||
[](README.uk-UA.md)
|
[](./README.uk-UA.md)
|
||||||
[](README.be.md)
|
[](./README.be.md)
|
||||||
[](README.es.md)
|
[](./README.es.md)
|
||||||
[](README.fr.md)
|
[](./README.fr.md)
|
||||||
[](README.de.md)
|
[](./README.de.md)
|
||||||
[](README.it.md)
|
[](./README.it.md)
|
||||||
[](README.cs.md)
|
[](./README.cs.md)
|
||||||
|
[](./README.da.md)
|
||||||
|
[](./README.nb.md)
|
||||||
|
[](./README.et.md)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|||||||
7
build/installer.nsh
Normal file
7
build/installer.nsh
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
!macro customUnInstall
|
||||||
|
${ifNot} ${isUpdated}
|
||||||
|
RMDir /r "$APPDATA\${APP_PACKAGE_NAME}"
|
||||||
|
RMDir /r "$APPDATA\hydra"
|
||||||
|
RMDir /r "$LOCALAPPDATA\hydralauncher-updater"
|
||||||
|
${endIf}
|
||||||
|
!macroend
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<strong>Hydra - гэта гульнявы лаўнчар з уласным убудаваным кліентам BitTorrent і самастойным scraper`ам для рэпакаў.</strong>
|
<strong>Hydra - гэта гульнявы лаўнчар з уласным убудаваным кліентам BitTorrent.</strong>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
[](https://github.com/hydralauncher/hydra/actions)
|
[](https://github.com/hydralauncher/hydra/actions)
|
||||||
@@ -23,8 +23,11 @@
|
|||||||
[](README.de.md)
|
[](README.de.md)
|
||||||
[](README.it.md)
|
[](README.it.md)
|
||||||
[](README.cs.md)
|
[](README.cs.md)
|
||||||
|
[](README.da.md)
|
||||||
|
[](README.nb.md)
|
||||||
|
[](README.et.md)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -139,9 +142,8 @@ pip install -r requirements.txt
|
|||||||
## Пераменныя асяроддзі
|
## Пераменныя асяроддзі
|
||||||
|
|
||||||
Вам спатрэбіцца ключ API SteamGridDB, каб атрымаць значкі гульняў пры ўсталёўкі.
|
Вам спатрэбіцца ключ API SteamGridDB, каб атрымаць значкі гульняў пры ўсталёўкі.
|
||||||
Калі вы жадаеце выкарыстоўваць onlinefix у якасці рэпака, вам трэба дадаць вашыя ўліковыя дадзеныя ў файл .env.
|
|
||||||
|
|
||||||
Як толькі вы атрымаеце ключ, вы зможаце скапіяваць або пераназваць файл `.env.example` у `.env` і змясціць у яго `STEAMGRIDDB_API_KEY`, `ONLINEFIX_USERNAME`, `ONLINEFIX_PASSWORD`.
|
Як толькі вы атрымаеце ключ, вы зможаце скапіяваць або пераназваць файл `.env.example` у `.env` і змясціць у яго `STEAMGRIDDB_API_KEY`.
|
||||||
|
|
||||||
## Запуск
|
## Запуск
|
||||||
|
|
||||||
@@ -23,8 +23,11 @@
|
|||||||
[](README.de.md)
|
[](README.de.md)
|
||||||
[](README.it.md)
|
[](README.it.md)
|
||||||
[](README.cs.md)
|
[](README.cs.md)
|
||||||
|
[](README.da.md)
|
||||||
|
[](README.nb.md)
|
||||||
|
[](README.et.md)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
187
docs/README.da.md
Normal file
187
docs/README.da.md
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
<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 er en spil launcher med sin egen indbyggede bittorrent klient.</strong>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
[](https://github.com/hydralauncher/hydra/actions)
|
||||||
|
[](https://github.com/hydralauncher/hydra/releases)
|
||||||
|
|
||||||
|
[](README.pt-BR.md)
|
||||||
|
[](README.md)
|
||||||
|
[](README.ru.md)
|
||||||
|
[](README.uk-UA.md)
|
||||||
|
[](README.be.md)
|
||||||
|
[](README.es.md)
|
||||||
|
[](README.fr.md)
|
||||||
|
[](README.de.md)
|
||||||
|
[](README.it.md)
|
||||||
|
[](README.cs.md)
|
||||||
|
[](README.da.md)
|
||||||
|
[](README.et.md)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## Indholdsfortegnelse
|
||||||
|
|
||||||
|
- [Indholdsfortegnelse](#indholdsfortegnelse)
|
||||||
|
- [Om](#om)
|
||||||
|
- [Funktioner](#funktioner)
|
||||||
|
- [Installation](#installation)
|
||||||
|
- [Bidrag](#-bidrag)
|
||||||
|
- [Bliv medlem af vores Telegram kanal](#-join-our-telegram)
|
||||||
|
- [Fork og klon dit repo](#fork-and-clone-your-repository)
|
||||||
|
- [Måder du kan bidrage](#ways-you-can-contribute)
|
||||||
|
- [Projekt Struktur](#project-structure)
|
||||||
|
- [Byg fra kildekode](#build-from-source)
|
||||||
|
- [Installér Node.js](#install-nodejs)
|
||||||
|
- [Installér Yarn](#install-yarn)
|
||||||
|
- [Installér Node Afhængigheder](#install-node-dependencies)
|
||||||
|
- [Installér Python 3.9](#install-python-39)
|
||||||
|
- [Installér Python Afhængigheder](#install-python-dependencies)
|
||||||
|
- [Miljøvariabler](#environment-variables)
|
||||||
|
- [Køre](#running)
|
||||||
|
- [Bygge](#build)
|
||||||
|
- [Bygge bittorrent klienten](#build-the-bittorrent-client)
|
||||||
|
- [Bygge Electron applikationen](#build-the-electron-application)
|
||||||
|
- [Bidragere](#contributors)
|
||||||
|
- [Licens](#license)
|
||||||
|
|
||||||
|
## Om
|
||||||
|
|
||||||
|
**Hydra** er en **Spil Launcher** med sin egen indbyggede **BitTorrent Klient**.
|
||||||
|
<br>
|
||||||
|
Launcheren er skrevet i TypeScript (Electron) og Python, som håndterer torrenting system ved brug af libtorrent.
|
||||||
|
|
||||||
|
## Funktioner
|
||||||
|
|
||||||
|
- Sin egen indbyggede bittorrent klient
|
||||||
|
- How Long To Beat (HLTB) integration på spil siden
|
||||||
|
- Downloadsti tilpasning
|
||||||
|
- Windows og Linux understøttelse
|
||||||
|
- Konstant opdateret
|
||||||
|
- Og mere ...
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Følg trinene her under for at installere:
|
||||||
|
|
||||||
|
1. Download den seneste version af Hydra fra [Releases](https://github.com/hydralauncher/hydra/releases/latest) siden.
|
||||||
|
- Download kun .exe hvis du vil installere Hydra på Windows.
|
||||||
|
- Download .deb, .rpm eller .zip hvis du vil installere Hydra på Linux. (afhænger af din Linux distro)
|
||||||
|
2. Kør den downloadede fil.
|
||||||
|
3. Nyd Hydra!
|
||||||
|
|
||||||
|
## <a name="bidrag"> Bidrag
|
||||||
|
|
||||||
|
### <a name="join-our-telegram"></a> Bliv medlem af vores Telegram kanal
|
||||||
|
|
||||||
|
Vi holder vores diskusioner i vores [Telegram](https://t.me/hydralauncher) kanal.
|
||||||
|
|
||||||
|
### Fork og klon dit repo
|
||||||
|
|
||||||
|
1. Fork repoet [(klik her for at forke nu)](https://github.com/hydralauncher/hydra/fork)
|
||||||
|
2. Klon din forkede kode `git clone https://github.com/dit_brugernavn/hydra`
|
||||||
|
3. Lav en ny branch
|
||||||
|
4. Skub dine commits
|
||||||
|
5. Indsend en ny Pull Request
|
||||||
|
|
||||||
|
### Måder du kan bidrage
|
||||||
|
|
||||||
|
- Oversættelse: Vi vil gerne have at Hydra er tilgængeligt for så mange folk som overhovedet muligt. Du er velkommen til at hjælpe med at oversætte til nye sprog eller at opdatere og forbedre de sprog som allerede er tilgængelige i Hydra.
|
||||||
|
- Kode: Hydra er lavet med Typescript, Electron og en lille smule Python. Hvis du har lyst til at bidrage, kan du blive medlem af vores [Telegram](https://t.me/hydralauncher) kanal! (Alt kommunikation foregår hovedsageligt på Engelsk, Brasiliansk eller Russisk)
|
||||||
|
|
||||||
|
### Projekt struktur
|
||||||
|
|
||||||
|
- torrent-client: Vi bruger libtorrent, et Python bibliotek, til at administrere torrent downloads
|
||||||
|
- src/renderer: UI'en i applikationen
|
||||||
|
- src/main: her har vi al logikken
|
||||||
|
|
||||||
|
## Byg fra kildekode
|
||||||
|
|
||||||
|
### Installér Node.js
|
||||||
|
|
||||||
|
Vær sikker på at du har Node.js installeret på din maskine. Hvis ikke, kan du downloade og installere det fra [nodejs.org](https://nodejs.org/).
|
||||||
|
|
||||||
|
### Installér Yarn
|
||||||
|
|
||||||
|
Yarn er et pakkehåndteringsprogram til Node.js. Hvis du ikke har installeret Yarn endnu, så kan du gøre det ved at følge instruktionerne på [yarnpkg.com](https://classic.yarnpkg.com/lang/en/docs/install/).
|
||||||
|
|
||||||
|
### Installér Node Afhængigheder
|
||||||
|
|
||||||
|
Navigér til projekt mappen og installér Node afhængighederne ved bruge af Yarn:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd hydra
|
||||||
|
yarn
|
||||||
|
```
|
||||||
|
|
||||||
|
### Installér Python 3.9
|
||||||
|
|
||||||
|
Vær sikker på at du har Python 3.9 installeret på din maskine. Du kan downloade og installere det her: [python.org](https://www.python.org/downloads/release/python-3913/).
|
||||||
|
|
||||||
|
### Installér Python Afhængigheder
|
||||||
|
|
||||||
|
Installér de påkrævede Python afhængigheder ved brug af pip:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Miljøvariabler
|
||||||
|
|
||||||
|
Du får brug for en SteamGridDB API nøgle for at kunne hente spil ikonerne under installationen.
|
||||||
|
|
||||||
|
Når du har det, kan du kopiere og omdøbe `.env.example` filen til `.env` og indsætte nøglen som `STEAMGRIDDB_API_KEY`.
|
||||||
|
|
||||||
|
## Køre
|
||||||
|
|
||||||
|
Når alt er sat op, kan du køre den følgende kommando for at starte både Electron processen og bittorrent klienten:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn dev
|
||||||
|
```
|
||||||
|
|
||||||
|
## Bygge
|
||||||
|
|
||||||
|
### Byg bittorrent klienten
|
||||||
|
|
||||||
|
Byg bittorrent klienten ved brug af følgende kommando:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python torrent-client/setup.py build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Byg Electron applikationen
|
||||||
|
|
||||||
|
Byg Electron applikationen ved brug af følgende kommando:
|
||||||
|
|
||||||
|
På Windows:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn build:win
|
||||||
|
```
|
||||||
|
|
||||||
|
På Linux:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn build:linux
|
||||||
|
```
|
||||||
|
|
||||||
|
## Bidragere
|
||||||
|
|
||||||
|
<a href="https://github.com/hydralauncher/hydra/graphs/contributors">
|
||||||
|
<img src="https://contrib.rocks/image?repo=hydralauncher/hydra" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
## Licens
|
||||||
|
|
||||||
|
Hydra benytter sig af [MIT Licensen](LICENSE).
|
||||||
@@ -23,8 +23,11 @@
|
|||||||
[](README.fr.md)
|
[](README.fr.md)
|
||||||
[](README.de.md)
|
[](README.de.md)
|
||||||
[](README.cs.md)
|
[](README.cs.md)
|
||||||
|
[](README.da.md)
|
||||||
|
[](README.nb.md)
|
||||||
|
[](README.et.md)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<strong>Hydra es un launcher de juegos con su propio cliente de bittorrent y gestor propio de repacks.</strong>
|
<strong>Hydra es un launcher de juegos con su propio cliente de bittorrent.</strong>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
[](https://github.com/hydralauncher/hydra/actions)
|
[](https://github.com/hydralauncher/hydra/actions)
|
||||||
@@ -23,8 +23,11 @@
|
|||||||
[](README.de.md)
|
[](README.de.md)
|
||||||
[](README.it.md)
|
[](README.it.md)
|
||||||
[](README.cs.md)
|
[](README.cs.md)
|
||||||
|
[](README.da.md)
|
||||||
|
[](README.nb.md)
|
||||||
|
[](README.et.md)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -55,17 +58,15 @@
|
|||||||
|
|
||||||
## Acerca de
|
## Acerca de
|
||||||
|
|
||||||
**Hydra** es un **Launcher de Juegos** con su propio **Cliente Bittorrent** y **autogestor de Repacks**.
|
**Hydra** es un **Launcher de Juegos** con su propio **Cliente Bittorrent**.
|
||||||
<br>
|
<br>
|
||||||
El launcher está escrito en TypeScript (Electron) y Python, el cuál se encarga del sistema de torrent usando libtorrent.
|
El launcher está escrito en TypeScript (Electron) y Python, el cuál se encarga del sistema de torrent usando libtorrent.
|
||||||
|
|
||||||
## Caracteristicas
|
## Caracteristicas
|
||||||
|
|
||||||
- Buscador e instalador autogestionado de repacks a través de las páginas más confiables en él [Megahilo](https://www.reddit.com/r/Piracy/wiki/megathread/)
|
|
||||||
- Cliente propio de bittorrent integrado
|
- Cliente propio de bittorrent integrado
|
||||||
- Integración de How Long To Beat (HLTB) en la página del juego
|
- Integración de How Long To Beat (HLTB) en la página del juego
|
||||||
- Customización de rutas de descargas
|
- Customización de rutas de descargas
|
||||||
- Notificaciones en actualizaciones a listas de repacks
|
|
||||||
- Soporte a Windows y Linux
|
- Soporte a Windows y Linux
|
||||||
- En constante actualización
|
- En constante actualización
|
||||||
- Y mucho más ...
|
- Y mucho más ...
|
||||||
@@ -139,9 +140,8 @@ pip install -r requirements.txt
|
|||||||
## Variables del Entorno
|
## Variables del Entorno
|
||||||
|
|
||||||
Necesitas una llave API de SteamGridDB para así poder obtener los íconos de los juegos en la instalación.
|
Necesitas una llave API de SteamGridDB para así poder obtener los íconos de los juegos en la instalación.
|
||||||
Si quieres también tener los repacks de onlinefix, necesitarás añadir tus credenciales al .env
|
|
||||||
|
|
||||||
Una vez que los tengas, puedes copiar o renombrar el archivo `.env.example` cómo `.env` y colocarlo en `STEAMGRIDDB_API_KEY`, `ONLINEFIX_USERNAME`, `ONLINEFIX_PASSWORD`.
|
Una vez que los tengas, puedes copiar o renombrar el archivo `.env.example` cómo `.env` y colocarlo en `STEAMGRIDDB_API_KEY`.
|
||||||
|
|
||||||
## Ejecucion
|
## Ejecucion
|
||||||
|
|
||||||
186
docs/README.et.md
Normal file
186
docs/README.et.md
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
<div align="center">
|
||||||
|
|
||||||
|
[<img src="../resources/icon.png" width="144"/>](https://hydralauncher.site)
|
||||||
|
|
||||||
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<strong>Hydra on mängulauncher oma sisseehitatud bittorrenti kliendiga.</strong>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
[](https://github.com/hydralauncher/hydra/actions)
|
||||||
|
[](https://github.com/hydralauncher/hydra/releases)
|
||||||
|
|
||||||
|
[](./README.pt-BR.md)
|
||||||
|
[](./README.md)
|
||||||
|
[](./README.ru.md)
|
||||||
|
[](./README.uk-UA.md)
|
||||||
|
[](./README.be.md)
|
||||||
|
[](./README.es.md)
|
||||||
|
[](./README.fr.md)
|
||||||
|
[](./README.de.md)
|
||||||
|
[](./README.it.md)
|
||||||
|
[](./README.cs.md)
|
||||||
|
[](./README.da.md)
|
||||||
|
[](./README.nb.md)
|
||||||
|
[](./README.et.md)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## Sisukord
|
||||||
|
|
||||||
|
- [Sisukord](#sisukord)
|
||||||
|
- [Tutvustus](#tutvustus)
|
||||||
|
- [Funktsioonid](#funktsioonid)
|
||||||
|
- [Paigaldamine](#paigaldamine)
|
||||||
|
- [Panustamine](#panustamine)
|
||||||
|
- [Liitu meie Telegramiga](#liitu-meie-telegramiga)
|
||||||
|
- [Forki ja klooni oma repositoorium](#forki-ja-klooni-oma-repositoorium)
|
||||||
|
- [Viisid panustamiseks](#viisid-panustamiseks)
|
||||||
|
- [Projekti Struktuur](#projekti-struktuur)
|
||||||
|
- [Lähtekoodi kompileerimine](#lähtekoodi-kompileerimine)
|
||||||
|
- [Node.js paigaldamine](#nodejs-paigaldamine)
|
||||||
|
- [Yarn'i paigaldamine](#yarni-paigaldamine)
|
||||||
|
- [Node sõltuvuste paigaldamine](#node-sõltuvuste-paigaldamine)
|
||||||
|
- [Python 3.9 paigaldamine](#python-39-paigaldamine)
|
||||||
|
- [Python'i sõltuvuste paigaldamine](#pythoni-sõltuvuste-paigaldamine)
|
||||||
|
- [Keskkonna muutujad](#keskkonna-muutujad)
|
||||||
|
- [Käivitamine](#käivitamine)
|
||||||
|
- [Kompileerimine](#kompileerimine)
|
||||||
|
- [Bittorrenti kliendi kompileerimine](#bittorrenti-kliendi-kompileerimine)
|
||||||
|
- [Electron rakenduse kompileerimine](#electron-rakenduse-kompileerimine)
|
||||||
|
- [Panustajad](#panustajad)
|
||||||
|
- [Litsents](#litsents)
|
||||||
|
|
||||||
|
## Tutvustus
|
||||||
|
|
||||||
|
**Hydra** on **Mängulauncher** oma sisseehitatud **BitTorrent Kliendiga**.
|
||||||
|
<br>
|
||||||
|
Launcher on kirjutatud TypeScriptis (Electron) ja Pythonis, mis haldab torrentide süsteemi kasutades libtorrenti.
|
||||||
|
|
||||||
|
## Funktsioonid
|
||||||
|
|
||||||
|
- Sisseehitatud bittorrenti klient
|
||||||
|
- How Long To Beat (HLTB) integratsioon mängu lehel
|
||||||
|
- Allalaadimiste kausta kohandamine
|
||||||
|
- Windowsi ja Linuxi tugi
|
||||||
|
- Pidevad uuendused
|
||||||
|
- Ja palju muud ...
|
||||||
|
|
||||||
|
## Paigaldamine
|
||||||
|
|
||||||
|
Järgi paigaldamiseks järgmisi samme:
|
||||||
|
|
||||||
|
1. Lae alla Hydra uusim versioon [Releases](https://github.com/hydralauncher/hydra/releases/latest) lehelt.
|
||||||
|
- Lae alla ainult .exe fail, kui soovid paigaldada Hydrat Windowsile.
|
||||||
|
- Lae alla .deb või .rpm või .zip fail, kui soovid paigaldada Hydrat Linuxile. (sõltub sinu Linuxi distrost)
|
||||||
|
2. Käivita allalaaditud fail.
|
||||||
|
3. Naudi Hydrat!
|
||||||
|
|
||||||
|
## Panustamine
|
||||||
|
|
||||||
|
### Liitu meie Telegramiga
|
||||||
|
|
||||||
|
Me keskendume aruteludele meie [Telegrami](https://t.me/hydralauncher) kanalis.
|
||||||
|
|
||||||
|
### Forki ja klooni oma repositoorium
|
||||||
|
|
||||||
|
1. Forki repositoorium [(klõpsa siia forkimiseks)](https://github.com/hydralauncher/hydra/fork)
|
||||||
|
2. Klooni oma forkitud kood `git clone https://github.com/your_username/hydra`
|
||||||
|
3. Loo uus haru
|
||||||
|
4. Pushi oma commitid
|
||||||
|
5. Esita uus Pull Request
|
||||||
|
|
||||||
|
### Viisid panustamiseks
|
||||||
|
|
||||||
|
- Tõlkimine: Me soovime, et Hydra oleks kättesaadav võimalikult paljudele inimestele. Võid aidata tõlkida uutesse keeltesse või uuendada ja parandada juba olemasolevaid tõlkeid Hydras.
|
||||||
|
- Kood: Hydra on ehitatud kasutades TypeScripti, Electroni ja natuke Pythonit. Kui soovid panustada, liitu meie [Telegramiga](https://t.me/hydralauncher)!
|
||||||
|
|
||||||
|
### Projekti Struktuur
|
||||||
|
|
||||||
|
- torrent-client: Kasutame libtorrenti, Pythoni teeki, torrentide allalaadimiste haldamiseks
|
||||||
|
- src/renderer: rakenduse kasutajaliides
|
||||||
|
- src/main: kogu loogika asub siin.
|
||||||
|
|
||||||
|
## Lähtekoodi kompileerimine
|
||||||
|
|
||||||
|
### Node.js paigaldamine
|
||||||
|
|
||||||
|
Veendu, et Node.js on sinu arvutisse paigaldatud. Kui ei ole, lae alla ja paigalda see [nodejs.org](https://nodejs.org/) lehelt.
|
||||||
|
|
||||||
|
### Yarn'i paigaldamine
|
||||||
|
|
||||||
|
Yarn on Node.js paketihaldur. Kui sa pole Yarni veel paigaldanud, saad seda teha järgides juhiseid [yarnpkg.com](https://classic.yarnpkg.com/lang/en/docs/install/) lehel.
|
||||||
|
|
||||||
|
### Node sõltuvuste paigaldamine
|
||||||
|
|
||||||
|
Liigu projekti kausta ja paigalda Node sõltuvused kasutades Yarni:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd hydra
|
||||||
|
yarn
|
||||||
|
```
|
||||||
|
|
||||||
|
### Python 3.9 paigaldamine
|
||||||
|
|
||||||
|
Veendu, et Python 3.9 on sinu arvutisse paigaldatud. Saad selle alla laadida ja paigaldada [python.org](https://www.python.org/downloads/release/python-3913/) lehelt.
|
||||||
|
|
||||||
|
### Python'i sõltuvuste paigaldamine
|
||||||
|
|
||||||
|
Paigalda vajalikud Pythoni sõltuvused kasutades pip'i:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Keskkonna muutujad
|
||||||
|
|
||||||
|
Sul on vaja SteamGridDB API võtit, et laadida alla mängude ikoone paigaldamisel.
|
||||||
|
|
||||||
|
Kui sul on see olemas, saad kopeerida või ümber nimetada `.env.example` faili `.env` failiks ja lisada sinna `STEAMGRIDDB_API_KEY`.
|
||||||
|
|
||||||
|
## Käivitamine
|
||||||
|
|
||||||
|
Kui kõik on seadistatud, saad käivitada järgmise käsu, et käivitada nii Electroni protsess kui ka bittorrenti klient:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn dev
|
||||||
|
```
|
||||||
|
|
||||||
|
## Kompileerimine
|
||||||
|
|
||||||
|
### Bittorrenti kliendi kompileerimine
|
||||||
|
|
||||||
|
Kompileeri bittorrenti klient kasutades järgmist käsku:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python torrent-client/setup.py build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Electron rakenduse kompileerimine
|
||||||
|
|
||||||
|
Kompileeri Electron rakendus kasutades järgmist käsku:
|
||||||
|
|
||||||
|
Windowsil:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn build:win
|
||||||
|
```
|
||||||
|
|
||||||
|
Linuxil:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn build:linux
|
||||||
|
```
|
||||||
|
|
||||||
|
## Panustajad
|
||||||
|
|
||||||
|
<a href="https://github.com/hydralauncher/hydra/graphs/contributors">
|
||||||
|
<img src="https://contrib.rocks/image?repo=hydralauncher/hydra" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
## Litsents
|
||||||
|
|
||||||
|
Hydra on litsentseeritud [MIT Litsentsi](LICENSE) all.
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
<p align="center">
|
<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>
|
<strong>Hydra est un lanceur de jeux avec son propre client bittorrent intégré.</strong>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
[](https://github.com/hydralauncher/hydra/actions)
|
[](https://github.com/hydralauncher/hydra/actions)
|
||||||
@@ -23,8 +23,11 @@
|
|||||||
[](README.de.md)
|
[](README.de.md)
|
||||||
[](README.it.md)
|
[](README.it.md)
|
||||||
[](README.cs.md)
|
[](README.cs.md)
|
||||||
|
[](README.da.md)
|
||||||
|
[](README.nb.md)
|
||||||
|
[](README.et.md)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -55,17 +58,15 @@
|
|||||||
|
|
||||||
## À propos
|
## À propos
|
||||||
|
|
||||||
**Hydra** est un **lanceur de jeux** avec son propre **client BitTorrent** intégré et un **scraper de repack auto-géré**.
|
**Hydra** est un **lanceur de jeux** avec son propre **client BitTorrent** intégré.
|
||||||
<br>
|
<br>
|
||||||
Le lanceur est écrit en TypeScript (Electron) et Python, qui gère le système de torrent en utilisant libtorrent.
|
Le lanceur est écrit en TypeScript (Electron) et Python, qui gère le système de torrent en utilisant libtorrent.
|
||||||
|
|
||||||
## Fonctionnalités
|
## Fonctionnalités
|
||||||
|
|
||||||
- Scraper de repack auto-géré parmi tous les sites les plus fiables sur le [Megathread]("https://www.reddit.com/r/Piracy/wiki/megathread/")
|
|
||||||
- Client bittorrent intégré
|
- Client bittorrent intégré
|
||||||
- Intégration How Long To Beat (HLTB) sur la page du jeu
|
- Intégration How Long To Beat (HLTB) sur la page du jeu
|
||||||
- Personnalisation des chemins de téléchargement
|
- Personnalisation des chemins de téléchargement
|
||||||
- Notifications de mise à jour de la liste de repack
|
|
||||||
- Support pour Windows et Linux
|
- Support pour Windows et Linux
|
||||||
- Constamment mis à jour
|
- Constamment mis à jour
|
||||||
- Et plus encore ...
|
- Et plus encore ...
|
||||||
@@ -139,9 +140,8 @@ pip install -r requirements.txt
|
|||||||
## Variables d'environnement
|
## Variables d'environnement
|
||||||
|
|
||||||
Vous aurez besoin d'une clé API SteamGridDB pour récupérer les icônes de jeux lors de l'installation.
|
Vous aurez besoin d'une clé API SteamGridDB pour récupérer les icônes de jeux lors de l'installation.
|
||||||
Si vous voulez avoir onlinefix comme repacker, vous devrez ajouter vos identifiants au fichier .env.
|
|
||||||
|
|
||||||
Une fois que vous l'avez, vous pouvez copier ou renommer le fichier `.env.example` en `.env` et y mettre `STEAMGRIDDB_API_KEY`, `ONLINEFIX_USERNAME`, `ONLINEFIX_PASSWORD`.
|
Une fois que vous l'avez, vous pouvez copier ou renommer le fichier `.env.example` en `.env` et y mettre `STEAMGRIDDB_API_KEY`.
|
||||||
|
|
||||||
## Lancement
|
## Lancement
|
||||||
|
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<strong>Hydra è un game launcher con il proprio client bittorrent e autogestore di repacks.</strong>
|
<strong>Hydra è un game launcher con il proprio client bittorrent.</strong>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
[](https://github.com/hydralauncher/hydra/actions)
|
[](https://github.com/hydralauncher/hydra/actions)
|
||||||
@@ -23,8 +23,11 @@
|
|||||||
[](README.de.md)
|
[](README.de.md)
|
||||||
[](README.it.md)
|
[](README.it.md)
|
||||||
[](README.cs.md)
|
[](README.cs.md)
|
||||||
|
[](README.da.md)
|
||||||
|
[](README.nb.md)
|
||||||
|
[](README.et.md)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -55,17 +58,15 @@
|
|||||||
|
|
||||||
## A proposito
|
## A proposito
|
||||||
|
|
||||||
**Hydra** è un **Game Launcher** con il proprio **Client BitTorrent** e **autogestore di repack**.
|
**Hydra** è un **Game Launcher** con il proprio **Client BitTorrent**.
|
||||||
<br>
|
<br>
|
||||||
Il launcher è scritto in TypeScript (Electron) and Python, che gestisce il sistema di torrenting appoggiandosi a libtorrent.
|
Il launcher è scritto in TypeScript (Electron) and Python, che gestisce il sistema di torrenting appoggiandosi a libtorrent.
|
||||||
|
|
||||||
## Caratteristiche
|
## Caratteristiche
|
||||||
|
|
||||||
- Motore di ricerca automatizzato sulle fonti di repack dal [Megathread]("https://www.reddit.com/r/Piracy/wiki/megathread/")
|
|
||||||
- Client Bittorrent integrato
|
- Client Bittorrent integrato
|
||||||
- Integrazione How Long To Beat (HLTB) nella pagina del gioco
|
- Integrazione How Long To Beat (HLTB) nella pagina del gioco
|
||||||
- Percorso del download Personalizzato
|
- Percorso del download Personalizzato
|
||||||
- Notifiche di aggiornamenti sulla list dei repacks
|
|
||||||
- Supporto Windows e Linux
|
- Supporto Windows e Linux
|
||||||
- Costantemente Aggiornato
|
- Costantemente Aggiornato
|
||||||
- E molto altro ...
|
- E molto altro ...
|
||||||
@@ -139,9 +140,8 @@ pip install -r requirements.txt
|
|||||||
## Variabili d'ambiente
|
## Variabili d'ambiente
|
||||||
|
|
||||||
Avrai bisogno di una chiave API SteamGridDB per poter caricare le icone di gioco.
|
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`.
|
Una volta ottenuta, puoi copiare e rinominare il file `.env.example` a `.env` e metterlo in `STEAMGRIDDB_API_KEY`.
|
||||||
|
|
||||||
## Esecuzione
|
## Esecuzione
|
||||||
|
|
||||||
188
docs/README.nb.md
Normal file
188
docs/README.nb.md
Normal 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 er en spill launcher sin egen innebygt bittorrent klient.</strong>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
[](https://github.com/hydralauncher/hydra/actions)
|
||||||
|
[](https://github.com/hydralauncher/hydra/releases)
|
||||||
|
|
||||||
|
[](README.pt-BR.md)
|
||||||
|
[](README.md)
|
||||||
|
[](README.ru.md)
|
||||||
|
[](README.uk-UA.md)
|
||||||
|
[](README.be.md)
|
||||||
|
[](README.es.md)
|
||||||
|
[](README.fr.md)
|
||||||
|
[](README.de.md)
|
||||||
|
[](README.it.md)
|
||||||
|
[](README.cs.md)
|
||||||
|
[](README.nb.md)
|
||||||
|
[](README.et.md)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## Innhold
|
||||||
|
|
||||||
|
- [Innhold](#innhold)
|
||||||
|
- [Om](#om)
|
||||||
|
- [Funksjoner](#funksjoner)
|
||||||
|
- [Installasjon](#installasjon)
|
||||||
|
- [Bidra](#-bidra)
|
||||||
|
- [Bli med i Telegram kanalen vår](#-join-our-telegram)
|
||||||
|
- [Forke og klone repoet ditt](#fork-and-clone-your-repository)
|
||||||
|
- [Måter du kan bidra](#ways-you-can-contribute)
|
||||||
|
- [Prosjekt Struktur](#project-structure)
|
||||||
|
- [Bygg fra kilden](#build-from-source)
|
||||||
|
- [Installere Node.js](#install-nodejs)
|
||||||
|
- [Installere Yarn](#install-yarn)
|
||||||
|
- [Installere Node-avhengigheter](#install-node-dependencies)
|
||||||
|
- [Installere Python 3.9](#install-python-39)
|
||||||
|
- [Installere Python-avhengigheter](#install-python-dependencies)
|
||||||
|
- [Miljøvariabler](#environment-variables)
|
||||||
|
- [Kjøre](#running)
|
||||||
|
- [Bygge](#build)
|
||||||
|
- [Bygg bittorrent klienten](#build-the-bittorrent-client)
|
||||||
|
- [Bygg Electron applikationen](#build-the-electron-application)
|
||||||
|
- [Bidragsytere](#contributors)
|
||||||
|
- [Lisens](#license)
|
||||||
|
|
||||||
|
## Om
|
||||||
|
|
||||||
|
**Hydra** er en **Spill Launcher** sin egne innbygte **BitTorrent Klient**.
|
||||||
|
<br>
|
||||||
|
Launcheren er skrevet i TypeScript (Electron) og Python, som håndterer torrent systemet ved bruk av libtorrent.
|
||||||
|
|
||||||
|
## Funksjoner
|
||||||
|
|
||||||
|
- Sin egen innebyggte bittorrent klient
|
||||||
|
- How Long To Beat (HLTB) integrasjon på spillsiden
|
||||||
|
- Nedlastingssti tilpasning
|
||||||
|
- Windows og Linux understøttelse
|
||||||
|
- Konstant oppdatert
|
||||||
|
- Og mer ...
|
||||||
|
|
||||||
|
## Installasjon
|
||||||
|
|
||||||
|
Følg trinnene her under for å innstallere:
|
||||||
|
|
||||||
|
1. Last ned den seneste versjonen av Hydra fra [Releases](https://github.com/hydralauncher/hydra/releases/latest) siden.
|
||||||
|
- Last kun .exe filen ned om du vil installere Hydra på Windows.
|
||||||
|
- Last kun .deb, .rpm eller .zip ned om du vil installere Hydra på Linux. (kommer an på Linux distroen din)
|
||||||
|
2. Kjør den nedlastede filen.
|
||||||
|
3. Nyt Hydra!
|
||||||
|
|
||||||
|
## <a name="contributing"> Bidra
|
||||||
|
|
||||||
|
### <a name="join-our-telegram"></a> Bli med i Telegram kanalen vår
|
||||||
|
|
||||||
|
Vi holder diskusjonene våres i [Telegram](https://t.me/hydralauncher) kanalen.
|
||||||
|
|
||||||
|
### Forke og klone repoet ditt
|
||||||
|
|
||||||
|
1. Fork repoet [(trykk her for å forke nå)](https://github.com/hydralauncher/hydra/fork)
|
||||||
|
2. Klon den forkede koden `git clone https://github.com/brukernavnet_ditt/hydra`
|
||||||
|
3. Lag en ny branch
|
||||||
|
4. Skyv committene dine
|
||||||
|
5. Send inn en ny Pull-forespørsel.
|
||||||
|
|
||||||
|
### Måter du kan bidra
|
||||||
|
|
||||||
|
- Oversetting: Vi har lyst at Hydra skal bli tilgjengelig for så mange som mulig. Hjelp gjerne med å oversette til nye språk eller oppdater og forbedre de som allerede er tilgjengelige i Hydra.
|
||||||
|
- Code: Hydra is built with Typescript, Electron and a little bit of Python. If you want to contribute, join our [Telegram](https://t.me/hydralauncher)!
|
||||||
|
- Kode: Hydra er laget med Typescript, Electron og lite gran Pythong. Hvis du har lyst på å bidra, bli med i [Telegram](https://t.me/hydralauncher) kanalen vår!
|
||||||
|
|
||||||
|
### Prosjektstruktur
|
||||||
|
|
||||||
|
- torrent-client: Vi bruker libtorrent, et Python-bibliotek, til å håndtere torrent nedlastinger.
|
||||||
|
- src/renderer: UIen til applikasjonen
|
||||||
|
- src/main: all logikken er her.
|
||||||
|
|
||||||
|
## Bygg fra kildekoden
|
||||||
|
|
||||||
|
### Installere Node.js
|
||||||
|
|
||||||
|
Vær sikker på at du har installert Node.js på maskinen din. Hvis du ikke har det, må du laste ned og installere det fra [nodejs.org](https://nodejs.org/).
|
||||||
|
|
||||||
|
### Installere Yarn
|
||||||
|
|
||||||
|
Yarn er et pakkehåndteringsverktøy til Node.js. Hvis du ikke allerede har installert Yarn, da kan du gjøre det ved å følge instruksjonene på [yarnpkg.com](https://classic.yarnpkg.com/lang/en/docs/install/).
|
||||||
|
|
||||||
|
### Installere Node-avhengigheter
|
||||||
|
|
||||||
|
Naviger til prosjektmappen og installer Node-avhengighetene ved bruk av Yarn:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd hydra
|
||||||
|
yarn
|
||||||
|
```
|
||||||
|
|
||||||
|
### Installere Python 3.9
|
||||||
|
|
||||||
|
Vær sikker på at du har installert Python 3.9 på maskinen din. Du kan laste ned og installere det på [python.org](https://www.python.org/downloads/release/python-3913/).
|
||||||
|
|
||||||
|
### Installere Python-avhengigheter
|
||||||
|
|
||||||
|
Installer de nødvendige Python-avhengigheter ved bruk av pip:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Miljøvariabler
|
||||||
|
|
||||||
|
Du trenger en SteamGridDB API nøkkel for å kunne hente spillikonene ved installasjon.
|
||||||
|
|
||||||
|
Når du har det, kan du kopiere eller endre navnet på `.env.example` filen til å være `.env` og lagre nøkkelen som `STEAMGRIDDB_API_KEY`.
|
||||||
|
|
||||||
|
## Kjøre
|
||||||
|
|
||||||
|
Når alt er satt op, kan du kjøre følgende kommando for å start både Electron prosessen og bittorrent klienten.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn dev
|
||||||
|
```
|
||||||
|
|
||||||
|
## Bygge
|
||||||
|
|
||||||
|
### Bygge bittorrent klienten
|
||||||
|
|
||||||
|
Bygg bittorrent klienten ved å bruke denne kommandoen:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python torrent-client/setup.py build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bygge Electron applikasjonen
|
||||||
|
|
||||||
|
Bygg Electron applikasjonen ved å bruke denne kommandoen:
|
||||||
|
|
||||||
|
På Windows:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn build:win
|
||||||
|
```
|
||||||
|
|
||||||
|
På Linux:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn build:linux
|
||||||
|
```
|
||||||
|
|
||||||
|
## Bidragsytere
|
||||||
|
|
||||||
|
<a href="https://github.com/hydralauncher/hydra/graphs/contributors">
|
||||||
|
<img src="https://contrib.rocks/image?repo=hydralauncher/hydra" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
## Lisens
|
||||||
|
|
||||||
|
Hydra bruker [MIT Lisensen](LICENSE).
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<strong>Hydra - to program uruchamiający gry z własnym wbudowanym klientem bittorrent i samodzielnie zarządzanym repackagerem..</strong>
|
<strong>Hydra - to program uruchamiający gry z własnym wbudowanym klientem bittorrent.</strong>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
[](https://github.com/hydralauncher/hydra/actions)
|
[](https://github.com/hydralauncher/hydra/actions)
|
||||||
@@ -23,8 +23,11 @@
|
|||||||
[](README.de.md)
|
[](README.de.md)
|
||||||
[](README.it.md)
|
[](README.it.md)
|
||||||
[](README.cs.md)
|
[](README.cs.md)
|
||||||
|
[](README.da.md)
|
||||||
|
[](README.nb.md)
|
||||||
|
[](README.et.md)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -55,17 +58,15 @@
|
|||||||
|
|
||||||
## O nas
|
## O nas
|
||||||
|
|
||||||
**Hydra** - jest **programem uruchamiającym gry** z wbudowanym **klientem BitTorrent** i **samozarządzającym się repackagerem**.
|
**Hydra** - jest **programem uruchamiającym gry** z wbudowanym **klientem BitTorrent**.
|
||||||
<br>
|
<br>
|
||||||
Ten launcher jest napisany w TypeScript (Electron) i Pythonie, który współpracuje z systemem torrent przy użyciu libtorrent.
|
Ten launcher jest napisany w TypeScript (Electron) i Pythonie, który współpracuje z systemem torrent przy użyciu libtorrent.
|
||||||
|
|
||||||
## Cechy
|
## Cechy
|
||||||
|
|
||||||
- Samodzielnie zarządzany repackager wśród wszystkich najbardziej zaufanych stron na [Megathread]("https://www.reddit.com/r/Piracy/wiki/megathread/").
|
|
||||||
- Własny wbudowany klient bittorrent
|
- Własny wbudowany klient bittorrent
|
||||||
- Integracja funkcji How Long To Beat (HLTB) na stronie gry
|
- Integracja funkcji How Long To Beat (HLTB) na stronie gry
|
||||||
- Personalizacja folderu pobierania
|
- Personalizacja folderu pobierania
|
||||||
- Powiadomienia o aktualizacjach listy repacków
|
|
||||||
- Wsparcie dla systemów Windows i Linux
|
- Wsparcie dla systemów Windows i Linux
|
||||||
- Stała aktualizacja
|
- Stała aktualizacja
|
||||||
- I nie tylko ...
|
- I nie tylko ...
|
||||||
@@ -143,9 +144,8 @@ pip install -r requirements.txt
|
|||||||
## Zmienne środowiskowe
|
## Zmienne środowiskowe
|
||||||
|
|
||||||
Będziesz potrzebował klucza API SteamGridDB, aby uzyskać ikony gier podczas instalacji.
|
Będziesz potrzebował klucza API SteamGridDB, aby uzyskać ikony gier podczas instalacji.
|
||||||
Jeśli chcesz użyć onlinefix jako repackagera, musisz dodać swoje dane uwierzytelniające do .env
|
|
||||||
|
|
||||||
Po jego uzyskaniu można skopiować plik lub zmienić jego nazwę `.env.example` na `.env` i umieść go na`STEAMGRIDDB_API_KEY`, `ONLINEFIX_USERNAME`, `ONLINEFIX_PASSWORD`.
|
Po jego uzyskaniu można skopiować plik lub zmienić jego nazwę `.env.example` na `.env` i umieść go na`STEAMGRIDDB_API_KEY`.
|
||||||
|
|
||||||
## Run
|
## Run
|
||||||
|
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
<p align="center">
|
<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>
|
<strong>Hydra é um Launcher de Jogos com seu próprio cliente de bittorrent integrado.</strong>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
[](https://github.com/hydralauncher/hydra/actions)
|
[](https://github.com/hydralauncher/hydra/actions)
|
||||||
@@ -23,8 +23,11 @@
|
|||||||
[](README.de.md)
|
[](README.de.md)
|
||||||
[](README.it.md)
|
[](README.it.md)
|
||||||
[](README.cs.md)
|
[](README.cs.md)
|
||||||
|
[](README.da.md)
|
||||||
|
[](README.nb.md)
|
||||||
|
[](README.et.md)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -48,24 +51,22 @@
|
|||||||
- [Environment variables](#-environment-variables)
|
- [Environment variables](#-environment-variables)
|
||||||
- [Running](#-running)
|
- [Running](#-running)
|
||||||
- [Build](#-build)
|
- [Build](#-build)
|
||||||
- [Build the bittorrent client](#-build-the-bittorrent-client)
|
- [ Criar o cliente bittorrent](#-build-the-bittorrent-client)
|
||||||
- [Build the Electron application](#-build-the-electron-application)
|
- [Criar a aplicação Electron](#-build-the-electron-application)
|
||||||
- [Contributors](#-contributors)
|
- [Contribuidores](#-contributors)
|
||||||
- [Licença](#-licença)
|
- [Licença](#-licença)
|
||||||
|
|
||||||
## <a name="about"> Sobre
|
## <a name="about"> Sobre
|
||||||
|
|
||||||
**Hydra** é um **Launcher de Jogos** com seu próprio **Cliente BitTorrent incorporado** e um **raspador de repack auto-gerenciado**.
|
**Hydra** é um **Launcher de Jogos** com seu próprio **Cliente BitTorrent incorporado**.
|
||||||
<br>
|
<br>
|
||||||
O launcher é escrito em TypeScript (Electron) e Python, que lida com o sistema de torrent usando libtorrent.
|
O launcher é escrito em TypeScript (Electron) e Python, que lida com o sistema de torrent usando libtorrent.
|
||||||
|
|
||||||
## <a name="features"> Recursos
|
## <a name="features"> Recursos
|
||||||
|
|
||||||
- Wrapper de repacks auto-gerenciado entre todos os sites mais confiáveis no [Megathread]("https://www.reddit.com/r/Piracy/wiki/megathread/")
|
|
||||||
- Cliente BitTorrent incorporado próprio
|
- Cliente BitTorrent incorporado próprio
|
||||||
- Integração com [How Long To Beat (HLTB)](https://howlongtobeat.com/) na página do jogo
|
- Integração com [How Long To Beat (HLTB)](https://howlongtobeat.com/) na página do jogo
|
||||||
- Personalização do caminho de downloads
|
- Personalização do caminho de downloads
|
||||||
- Notificações de atualização da lista de repacks
|
|
||||||
- Suporte para Windows e Linux
|
- Suporte para Windows e Linux
|
||||||
- Constantemente atualizado
|
- Constantemente atualizado
|
||||||
- E mais ...
|
- E mais ...
|
||||||
@@ -136,14 +137,13 @@ Instale as dependências Python necessárias usando o pip:
|
|||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
## <a name="environment-variables"></a> Environment variables
|
## <a name="environment-variables"></a> Variáveis de ambiente
|
||||||
|
|
||||||
Você precisará de uma chave da API SteamGridDB para buscar os ícones do jogo durante a instalação.
|
Você precisará de uma chave da API SteamGridDB para buscar os ícones do jogo durante a instalação.
|
||||||
Se você deseja ter o onlinefix como um repacker, precisará adicionar suas credenciais ao arquivo .env.
|
|
||||||
|
|
||||||
Depois de obtê-lo, você pode copiar ou renomear o arquivo `.env.example` para `.env` e inserir `STEAMGRIDDB_API_KEY`, `ONLINEFIX_USERNAME` e `ONLINEFIX_PASSWORD`.
|
Depois de obtê-lo, você pode copiar ou renomear o arquivo `.env.example` para `.env` e inserir `STEAMGRIDDB_API_KEY`.
|
||||||
|
|
||||||
## <a name="running"></a> Running
|
## <a name="running"></a> Executando
|
||||||
|
|
||||||
Uma vez que você tenha configurado tudo, você pode executar o seguinte comando para iniciar tanto o processo Electron quanto o cliente BitTorrent:
|
Uma vez que você tenha configurado tudo, você pode executar o seguinte comando para iniciar tanto o processo Electron quanto o cliente BitTorrent:
|
||||||
|
|
||||||
@@ -153,7 +153,7 @@ yarn dev
|
|||||||
|
|
||||||
## <a name="build"></a> Build
|
## <a name="build"></a> Build
|
||||||
|
|
||||||
### <a name="build-the-bittorrent-client"></a> Build the bittorrent client
|
### <a name="build-the-bittorrent-client"></a> Criar o cliente bittorrent
|
||||||
|
|
||||||
Compile o cliente BitTorrent usando este comando
|
Compile o cliente BitTorrent usando este comando
|
||||||
|
|
||||||
@@ -161,7 +161,7 @@ Compile o cliente BitTorrent usando este comando
|
|||||||
python torrent-client/setup.py build
|
python torrent-client/setup.py build
|
||||||
```
|
```
|
||||||
|
|
||||||
### <a name="build-the-electron-application"></a> Build the Electron application
|
### <a name="build-the-electron-application"></a> Criar a aplicação Electron
|
||||||
|
|
||||||
Compile a aplicação Electron usando este comando:
|
Compile a aplicação Electron usando este comando:
|
||||||
|
|
||||||
@@ -177,7 +177,7 @@ No Linux:
|
|||||||
yarn build:linux
|
yarn build:linux
|
||||||
```
|
```
|
||||||
|
|
||||||
## <a name="contributors"></a> Contributors
|
## <a name="contributors"></a> Contribuidores
|
||||||
|
|
||||||
<a href="https://github.com/hydralauncher/hydra/graphs/contributors">
|
<a href="https://github.com/hydralauncher/hydra/graphs/contributors">
|
||||||
<img src="https://contrib.rocks/image?repo=hydralauncher/hydra" />
|
<img src="https://contrib.rocks/image?repo=hydralauncher/hydra" />
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<strong>Hydra - это игровой лаунчер с собственным встроенным клиентом BitTorrent и самостоятельным scraper`ом для репаков.</strong>
|
<strong>Hydra - это игровой лаунчер с собственным встроенным клиентом BitTorrent.</strong>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
[](https://github.com/hydralauncher/hydra/actions)
|
[](https://github.com/hydralauncher/hydra/actions)
|
||||||
@@ -23,8 +23,11 @@
|
|||||||
[](README.de.md)
|
[](README.de.md)
|
||||||
[](README.it.md)
|
[](README.it.md)
|
||||||
[](README.cs.md)
|
[](README.cs.md)
|
||||||
|
[](README.da.md)
|
||||||
|
[](README.nb.md)
|
||||||
|
[](README.et.md)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -139,9 +142,8 @@ pip install -r requirements.txt
|
|||||||
## Переменные среды
|
## Переменные среды
|
||||||
|
|
||||||
Вам понадобится ключ API SteamGridDB, чтобы получить значки игр при установке.
|
Вам понадобится ключ API SteamGridDB, чтобы получить значки игр при установке.
|
||||||
Если вы хотите использовать onlinefix в качестве репака, вам нужно добавить ваши учетные данные в файл .env.
|
|
||||||
|
|
||||||
Как только у вас будет ключ, вы можете скопировать или переименовать файл `.env.example` в `.env` и поместить в него `STEAMGRIDDB_API_KEY`, `ONLINEFIX_USERNAME`, `ONLINEFIX_PASSWORD`.
|
Как только у вас будет ключ, вы можете скопировать или переименовать файл `.env.example` в `.env` и поместить в него `STEAMGRIDDB_API_KEY`.
|
||||||
|
|
||||||
## Запуск
|
## Запуск
|
||||||
|
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<strong>Hydra - це ігровий лаунчер з власним вбудованим bittorrent-клієнтом і самокерованим збирачем репаків.</strong>
|
<strong>Hydra - це ігровий лаунчер з власним вбудованим bittorrent-клієнтом.</strong>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
[](https://github.com/hydralauncher/hydra/actions)
|
[](https://github.com/hydralauncher/hydra/actions)
|
||||||
@@ -23,8 +23,11 @@
|
|||||||
[](README.de.md)
|
[](README.de.md)
|
||||||
[](README.it.md)
|
[](README.it.md)
|
||||||
[](README.cs.md)
|
[](README.cs.md)
|
||||||
|
[](README.da.md)
|
||||||
|
[](README.nb.md)
|
||||||
|
[](README.et.md)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -143,9 +146,8 @@ pip install -r requirements.txt
|
|||||||
## Змінні середовища
|
## Змінні середовища
|
||||||
|
|
||||||
Вам знадобиться ключ API SteamGridDB, щоб отримати іконки ігор під час встановлення.
|
Вам знадобиться ключ API SteamGridDB, щоб отримати іконки ігор під час встановлення.
|
||||||
Якщо ви хочете використовувати onlinefix як перепакувальник, вам потрібно додати свої облікові дані до .env
|
|
||||||
|
|
||||||
Отримавши його, ви можете скопіювати або перейменувати файл `.env.example` на `.env`і помістити його на`STEAMGRIDDB_API_KEY`, `ONLINEFIX_USERNAME`, `ONLINEFIX_PASSWORD`.
|
Отримавши його, ви можете скопіювати або перейменувати файл `.env.example` на `.env`і помістити його на`STEAMGRIDDB_API_KEY`.
|
||||||
|
|
||||||
## Запустіть
|
## Запустіть
|
||||||
|
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
appId: site.hydralauncher.hydra
|
appId: gg.hydralauncher.hydra
|
||||||
productName: Hydra
|
productName: Hydra
|
||||||
directories:
|
directories:
|
||||||
buildResources: build
|
buildResources: build
|
||||||
extraResources:
|
extraResources:
|
||||||
|
- ludusavi
|
||||||
- hydra-download-manager
|
- hydra-download-manager
|
||||||
- seeds
|
- seeds
|
||||||
- from: node_modules/create-desktop-shortcuts/src/windows.vbs
|
- from: node_modules/create-desktop-shortcuts/src/windows.vbs
|
||||||
@@ -27,6 +28,7 @@ nsis:
|
|||||||
createDesktopShortcut: always
|
createDesktopShortcut: always
|
||||||
oneClick: false
|
oneClick: false
|
||||||
allowToChangeInstallationDirectory: true
|
allowToChangeInstallationDirectory: true
|
||||||
|
include: installer.nsh
|
||||||
portable:
|
portable:
|
||||||
artifactName: ${name}-${version}-portable.${ext}
|
artifactName: ${name}-${version}-portable.${ext}
|
||||||
mac:
|
mac:
|
||||||
|
|||||||
20
package.json
20
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "hydralauncher",
|
"name": "hydralauncher",
|
||||||
"version": "2.1.2",
|
"version": "3.0.2",
|
||||||
"description": "Hydra",
|
"description": "Hydra",
|
||||||
"main": "./out/main/index.js",
|
"main": "./out/main/index.js",
|
||||||
"author": "Los Broxas",
|
"author": "Los Broxas",
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
"start": "electron-vite preview",
|
"start": "electron-vite preview",
|
||||||
"dev": "electron-vite dev",
|
"dev": "electron-vite dev",
|
||||||
"build": "npm run typecheck && electron-vite build",
|
"build": "npm run typecheck && electron-vite build",
|
||||||
"postinstall": "electron-builder install-app-deps",
|
"postinstall": "electron-builder install-app-deps && node ./postinstall.cjs",
|
||||||
"build:unpack": "npm run build && electron-builder --dir",
|
"build:unpack": "npm run build && electron-builder --dir",
|
||||||
"build:win": "electron-vite build && electron-builder --win",
|
"build:win": "electron-vite build && electron-builder --win",
|
||||||
"build:mac": "electron-vite build && electron-builder --mac",
|
"build:mac": "electron-vite build && electron-builder --mac",
|
||||||
@@ -44,26 +44,26 @@
|
|||||||
"@vanilla-extract/recipes": "^0.5.2",
|
"@vanilla-extract/recipes": "^0.5.2",
|
||||||
"auto-launch": "^5.0.6",
|
"auto-launch": "^5.0.6",
|
||||||
"axios": "^1.7.7",
|
"axios": "^1.7.7",
|
||||||
"better-sqlite3": "^11.2.1",
|
"better-sqlite3": "^11.3.0",
|
||||||
"check-disk-space": "^3.4.0",
|
"check-disk-space": "^3.4.0",
|
||||||
"classnames": "^2.5.1",
|
"classnames": "^2.5.1",
|
||||||
"color": "^4.2.3",
|
"color": "^4.2.3",
|
||||||
"color.js": "^1.2.0",
|
"color.js": "^1.2.0",
|
||||||
"create-desktop-shortcuts": "^1.11.0",
|
"create-desktop-shortcuts": "^1.11.0",
|
||||||
"date-fns": "^3.6.0",
|
"date-fns": "^3.6.0",
|
||||||
"electron-log": "^5.1.4",
|
"dexie": "^4.0.8",
|
||||||
"electron-updater": "^6.1.8",
|
"electron-log": "^5.2.0",
|
||||||
"fetch-cookie": "^3.0.1",
|
"electron-updater": "^6.3.9",
|
||||||
"flexsearch": "^0.7.43",
|
"flexsearch": "^0.7.43",
|
||||||
"i18next": "^23.11.2",
|
"i18next": "^23.11.2",
|
||||||
"i18next-browser-languagedetector": "^7.2.1",
|
"i18next-browser-languagedetector": "^7.2.1",
|
||||||
"icojs": "^0.19.3",
|
"icojs": "^0.19.4",
|
||||||
"jsdom": "^24.0.0",
|
"jsdom": "^24.0.0",
|
||||||
"jsonwebtoken": "^9.0.2",
|
"jsonwebtoken": "^9.0.2",
|
||||||
"knex": "^3.1.0",
|
"knex": "^3.1.0",
|
||||||
"lodash-es": "^4.17.21",
|
"lodash-es": "^4.17.21",
|
||||||
"lottie-react": "^2.4.0",
|
"lottie-react": "^2.4.0",
|
||||||
"parse-torrent": "^11.0.16",
|
"parse-torrent": "^11.0.17",
|
||||||
"piscina": "^4.5.1",
|
"piscina": "^4.5.1",
|
||||||
"react-hook-form": "^7.53.0",
|
"react-hook-form": "^7.53.0",
|
||||||
"react-i18next": "^14.1.0",
|
"react-i18next": "^14.1.0",
|
||||||
@@ -71,6 +71,7 @@
|
|||||||
"react-redux": "^9.1.1",
|
"react-redux": "^9.1.1",
|
||||||
"react-router-dom": "^6.22.3",
|
"react-router-dom": "^6.22.3",
|
||||||
"sudo-prompt": "^9.2.1",
|
"sudo-prompt": "^9.2.1",
|
||||||
|
"tar": "^7.4.3",
|
||||||
"typeorm": "^0.3.20",
|
"typeorm": "^0.3.20",
|
||||||
"user-agents": "^1.1.193",
|
"user-agents": "^1.1.193",
|
||||||
"yaml": "^2.4.1",
|
"yaml": "^2.4.1",
|
||||||
@@ -87,6 +88,7 @@
|
|||||||
"@swc/core": "^1.4.16",
|
"@swc/core": "^1.4.16",
|
||||||
"@types/auto-launch": "^5.0.5",
|
"@types/auto-launch": "^5.0.5",
|
||||||
"@types/color": "^3.0.6",
|
"@types/color": "^3.0.6",
|
||||||
|
"@types/folder-hash": "^4.0.4",
|
||||||
"@types/jsdom": "^21.1.6",
|
"@types/jsdom": "^21.1.6",
|
||||||
"@types/jsonwebtoken": "^9.0.6",
|
"@types/jsonwebtoken": "^9.0.6",
|
||||||
"@types/lodash-es": "^4.17.12",
|
"@types/lodash-es": "^4.17.12",
|
||||||
@@ -98,7 +100,7 @@
|
|||||||
"@vanilla-extract/vite-plugin": "^4.0.7",
|
"@vanilla-extract/vite-plugin": "^4.0.7",
|
||||||
"@vitejs/plugin-react": "^4.2.1",
|
"@vitejs/plugin-react": "^4.2.1",
|
||||||
"electron": "^30.3.0",
|
"electron": "^30.3.0",
|
||||||
"electron-builder": "^24.9.1",
|
"electron-builder": "^25.1.8",
|
||||||
"electron-vite": "^2.0.0",
|
"electron-vite": "^2.0.0",
|
||||||
"eslint": "^8.56.0",
|
"eslint": "^8.56.0",
|
||||||
"eslint-plugin-jsx-a11y": "^6.8.0",
|
"eslint-plugin-jsx-a11y": "^6.8.0",
|
||||||
|
|||||||
49
postinstall.cjs
Normal file
49
postinstall.cjs
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
const { default: axios } = require("axios");
|
||||||
|
const util = require("node:util");
|
||||||
|
const fs = require("node:fs");
|
||||||
|
const path = require("node:path");
|
||||||
|
|
||||||
|
const exec = util.promisify(require("node:child_process").exec);
|
||||||
|
|
||||||
|
const fileName = {
|
||||||
|
win32: "ludusavi-v0.25.0-win64.zip",
|
||||||
|
linux: "ludusavi-v0.25.0-linux.zip",
|
||||||
|
darwin: "ludusavi-v0.25.0-mac.zip",
|
||||||
|
};
|
||||||
|
|
||||||
|
const downloadLudusavi = async () => {
|
||||||
|
if (fs.existsSync("ludusavi")) {
|
||||||
|
console.log("Ludusavi already exists, skipping download...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const file = fileName[process.platform];
|
||||||
|
const downloadUrl = `https://github.com/mtkennerly/ludusavi/releases/download/v0.25.0/${file}`;
|
||||||
|
|
||||||
|
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...`);
|
||||||
|
|
||||||
|
const pwd = process.cwd();
|
||||||
|
|
||||||
|
const targetPath = path.join(pwd, "ludusavi");
|
||||||
|
|
||||||
|
await exec(`npx extract-zip ${file} ${targetPath}`);
|
||||||
|
|
||||||
|
if (process.platform !== "win32") {
|
||||||
|
fs.chmodSync(path.join(targetPath, "ludusavi"), 0o755);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Extracted. Renaming folder...");
|
||||||
|
|
||||||
|
console.log(`Extracted ${file}, removing compressed downloaded file...`);
|
||||||
|
fs.rmSync(file);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
downloadLudusavi();
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
libtorrent
|
libtorrent
|
||||||
cx_Freeze
|
cx_Freeze
|
||||||
cx_Logging; sys_platform == 'win32'
|
cx_Logging; sys_platform == 'win32'
|
||||||
lief; sys_platform == 'win32'
|
|
||||||
pywin32; sys_platform == 'win32'
|
pywin32; sys_platform == 'win32'
|
||||||
psutil
|
psutil
|
||||||
Pillow
|
Pillow
|
||||||
|
|||||||
BIN
resources/achievement-sound.mp3
Normal file
BIN
resources/achievement-sound.mp3
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -2,7 +2,6 @@
|
|||||||
"language_name": "اَلْعَرَبِيَّةُ",
|
"language_name": "اَلْعَرَبِيَّةُ",
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "مميّز",
|
"featured": "مميّز",
|
||||||
"trending": "شائع",
|
|
||||||
"surprise_me": "فاجئني",
|
"surprise_me": "فاجئني",
|
||||||
"no_results": "لم يتم العثور على نتائج"
|
"no_results": "لم يتم العثور على نتائج"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
"language_name": "беларуская мова",
|
"language_name": "беларуская мова",
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Рэкамэндаванае",
|
"featured": "Рэкамэндаванае",
|
||||||
"trending": "Актуальнае",
|
|
||||||
"surprise_me": "Здзіві мяне",
|
"surprise_me": "Здзіві мяне",
|
||||||
"no_results": "Няма вынікаў"
|
"no_results": "Няма вынікаў"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Destacats",
|
"featured": "Destacats",
|
||||||
"trending": "Populars",
|
|
||||||
"surprise_me": "Sorprèn-me",
|
"surprise_me": "Sorprèn-me",
|
||||||
"no_results": "No s'ha trobat res"
|
"no_results": "No s'ha trobat res"
|
||||||
},
|
},
|
||||||
@@ -178,9 +177,6 @@
|
|||||||
"download_count_zero": "No hi ha baixades a la llista",
|
"download_count_zero": "No hi ha baixades a la llista",
|
||||||
"download_count_one": "{{countFormatted}} a la llista de baixades",
|
"download_count_one": "{{countFormatted}} a la llista de baixades",
|
||||||
"download_count_other": "{{countFormatted}} baixades a la llista",
|
"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",
|
"download_source_url": "Descarrega l'URL de la font",
|
||||||
"add_download_source_description": "Inseriu la URL que conté el fitxer .json",
|
"add_download_source_description": "Inseriu la URL que conté el fitxer .json",
|
||||||
"download_source_up_to_date": "Actualitzat",
|
"download_source_up_to_date": "Actualitzat",
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Doporučené",
|
"featured": "Doporučené",
|
||||||
"trending": "Trendy",
|
|
||||||
"surprise_me": "Překvap mě",
|
"surprise_me": "Překvap mě",
|
||||||
"no_results": "Výsledek nenalezen"
|
"no_results": "Výsledek nenalezen"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,10 +1,15 @@
|
|||||||
{
|
{
|
||||||
"language_name": "Dansk",
|
"language_name": "Dansk",
|
||||||
|
"app": {
|
||||||
|
"successfully_signed_in": "Loggede ind successfuldt"
|
||||||
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Anbefalet",
|
"featured": "Anbefalet",
|
||||||
"trending": "Trender",
|
|
||||||
"surprise_me": "Overrask mig",
|
"surprise_me": "Overrask mig",
|
||||||
"no_results": "Ingen resultater fundet"
|
"no_results": "Ingen resultater fundet",
|
||||||
|
"start_typing": "Begynd at skrive for at søge...",
|
||||||
|
"hot": "Populært lige nu",
|
||||||
|
"weekly": "📅 Mest populære spil denne uge"
|
||||||
},
|
},
|
||||||
"sidebar": {
|
"sidebar": {
|
||||||
"catalogue": "Katalog",
|
"catalogue": "Katalog",
|
||||||
@@ -12,27 +17,35 @@
|
|||||||
"settings": "Indstillinger",
|
"settings": "Indstillinger",
|
||||||
"my_library": "Mit bibliotek",
|
"my_library": "Mit bibliotek",
|
||||||
"downloading_metadata": "{{title}} (Downloader metadata…)",
|
"downloading_metadata": "{{title}} (Downloader metadata…)",
|
||||||
"paused": "{{title}} (Paused)",
|
"paused": "{{title}} (Sat på pause)",
|
||||||
"downloading": "{{title}} ({{percentage}} - Downloading…)",
|
"downloading": "{{title}} ({{percentage}} - Downloader…)",
|
||||||
"filter": "Filtrer bibliotek",
|
"filter": "Filtrér bibliotek",
|
||||||
"home": "Hjem"
|
"home": "Hjem",
|
||||||
|
"queued": "{{title}} (I køen)",
|
||||||
|
"game_has_no_executable": "Spillet har ikke nogen eksekverbar fil valgt",
|
||||||
|
"sign_in": "Log ind",
|
||||||
|
"friends": "Venner"
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
"search": "Søg spil",
|
"search": "Søg efter spil",
|
||||||
"home": "Hjem",
|
"home": "Hjem",
|
||||||
"catalogue": "Katalog",
|
"catalogue": "Katalog",
|
||||||
"downloads": "Downloads",
|
"downloads": "Downloads",
|
||||||
"search_results": "Søge resultater",
|
"search_results": "Søge resultater",
|
||||||
"settings": "Indstillinger"
|
"settings": "Indstillinger",
|
||||||
|
"version_available_install": "Version {{version}} tilgængelig. Klik her for at genstarte og installere.",
|
||||||
|
"version_available_download": "Version {{version}} tilgængelig. Klik her for at downloade."
|
||||||
},
|
},
|
||||||
"bottom_panel": {
|
"bottom_panel": {
|
||||||
"no_downloads_in_progress": "Ingen downloads igang",
|
"no_downloads_in_progress": "Ingen downloads igang",
|
||||||
"downloading_metadata": "Downloader {{title}} metadata…",
|
"downloading_metadata": "Downloader {{title}} metadata…",
|
||||||
"downloading": "Downloader {{title}}… ({{percentage}} færdig) - Konklusion {{eta}} - {{speed}}"
|
"downloading": "Downloader {{title}}… ({{percentage}} færdig) - Fuldt downloadet {{eta}} - {{speed}}",
|
||||||
|
"calculating_eta": "Downloader {{title}}… ({{percentage}} færdig) - Udregner resterende tid…",
|
||||||
|
"checking_files": "Checker {{title}} filer… ({{percentage}} færdig)"
|
||||||
},
|
},
|
||||||
"catalogue": {
|
"catalogue": {
|
||||||
"next_page": "Næste side",
|
"next_page": "Næste side",
|
||||||
"previous_page": "Tidligere side"
|
"previous_page": "Forrige side"
|
||||||
},
|
},
|
||||||
"game_details": {
|
"game_details": {
|
||||||
"open_download_options": "Åben download muligheder",
|
"open_download_options": "Åben download muligheder",
|
||||||
@@ -47,11 +60,13 @@
|
|||||||
"remove": "Fjern",
|
"remove": "Fjern",
|
||||||
"space_left_on_disk": "{{space}} tilbage på harddisken",
|
"space_left_on_disk": "{{space}} tilbage på harddisken",
|
||||||
"eta": "Konklusion {{eta}}",
|
"eta": "Konklusion {{eta}}",
|
||||||
|
"calculating_eta": "Udregner resterende tid…",
|
||||||
"downloading_metadata": "Downloader metadata…",
|
"downloading_metadata": "Downloader metadata…",
|
||||||
"filter": "Filtrer repacks",
|
"filter": "Filtrér repacks",
|
||||||
"requirements": "System behov",
|
"requirements": "System behov",
|
||||||
"minimum": "Mindste",
|
"minimum": "Mindste",
|
||||||
"recommended": "Anbefalet",
|
"recommended": "Anbefalet",
|
||||||
|
"paused": "Sat på pause",
|
||||||
"release_date": "Offentliggjort den {{date}}",
|
"release_date": "Offentliggjort den {{date}}",
|
||||||
"publisher": "Udgivet af {{publisher}}",
|
"publisher": "Udgivet af {{publisher}}",
|
||||||
"hours": "timer",
|
"hours": "timer",
|
||||||
@@ -70,10 +85,51 @@
|
|||||||
"deleting": "Sletter installatør…",
|
"deleting": "Sletter installatør…",
|
||||||
"close": "Luk",
|
"close": "Luk",
|
||||||
"playing_now": "Spiller nu",
|
"playing_now": "Spiller nu",
|
||||||
"change": "Ændré",
|
"change": "Ændre",
|
||||||
"repacks_modal_description": "Vælg den repack du vil downloade",
|
"repacks_modal_description": "Vælg den repack du vil downloade",
|
||||||
"select_folder_hint": "For at ændre standard mappen, gå til <0>Instillingerne</0>",
|
"select_folder_hint": "For at ændre standard mappen, gå til <0>Instillingerne</0>",
|
||||||
"download_now": "Download nu"
|
"download_now": "Download nu",
|
||||||
|
"no_shop_details": "Kunne ikke modtage butiks detaljerne.",
|
||||||
|
"download_options": "Download muligheder",
|
||||||
|
"download_path": "Download sti",
|
||||||
|
"previous_screenshot": "Forrige skærmbillede",
|
||||||
|
"next_screenshot": "Næste skærmbillede",
|
||||||
|
"screenshot": "Skærmbillede {{number}}",
|
||||||
|
"open_screenshot": "Åben skærmbillede {{number}}",
|
||||||
|
"download_settings": "Download indstillinger",
|
||||||
|
"downloader": "Downloader",
|
||||||
|
"select_executable": "Vælg",
|
||||||
|
"no_executable_selected": "Ingen eksekverbar fil valgt",
|
||||||
|
"open_folder": "Åben mappe",
|
||||||
|
"open_download_location": "Se downloadede filer",
|
||||||
|
"create_shortcut": "Lav skrivebords genvej",
|
||||||
|
"remove_files": "Fjern filer",
|
||||||
|
"remove_from_library_title": "Er du sikker?",
|
||||||
|
"remove_from_library_description": "Dette vil fjerne {{game}} fra dit bibliotek",
|
||||||
|
"options": "Valgmuligheder",
|
||||||
|
"executable_section_title": "Eksekverbar fil",
|
||||||
|
"executable_section_description": "Sti til filen som skal bruges når \"Spil\" bliver klikket",
|
||||||
|
"downloads_secion_title": "Downloads",
|
||||||
|
"downloads_section_description": "Undersøg opdateringer eller andre versioner af dette spil",
|
||||||
|
"danger_zone_section_title": "Farezonen",
|
||||||
|
"danger_zone_section_description": "Fjern dette spil fra dit bibliotek eller filerne der er blevet downloadet af Hydra",
|
||||||
|
"download_in_progress": "Download undervejs",
|
||||||
|
"download_paused": "Download sat på pause",
|
||||||
|
"last_downloaded_option": "Sidste download mulighed",
|
||||||
|
"create_shortcut_success": "Genvej lavet successfuldt",
|
||||||
|
"create_shortcut_error": "Fejl under skabelsen af genvej",
|
||||||
|
"nsfw_content_title": "Dette spil indeholder upassende indhold",
|
||||||
|
"nsfw_content_description": "{{title}} indeholder indhold der ikke egner sig til alle aldre. Er du sikker på at du vil fortsætte?",
|
||||||
|
"allow_nsfw_content": "Fortsæt",
|
||||||
|
"refuse_nsfw_content": "Gå tilbage",
|
||||||
|
"stats": "Statistik",
|
||||||
|
"download_count": "Downloads",
|
||||||
|
"player_count": "Aktive spillere",
|
||||||
|
"download_error": "Denne download mulighed er ikke tilgængelig",
|
||||||
|
"download": "Download",
|
||||||
|
"executable_path_in_use": "Eksekverbar allerede i brug af \"{{game}}\"",
|
||||||
|
"warning": "Advarsel:",
|
||||||
|
"hydra_needs_to_remain_open": "Hydra skal forblive åbent for at denne download kan gennemføres. I tilfælde af at Hydra lukker før downloaden er færdig, mister du dit fremskridt."
|
||||||
},
|
},
|
||||||
"activation": {
|
"activation": {
|
||||||
"title": "Aktivér Hydra",
|
"title": "Aktivér Hydra",
|
||||||
@@ -81,45 +137,95 @@
|
|||||||
"enter_activation_code": "Indtast din aktiverings kode",
|
"enter_activation_code": "Indtast din aktiverings kode",
|
||||||
"message": "Hvis du ikke ved hvor du skal spørge om dette, burde du ikke have dette.",
|
"message": "Hvis du ikke ved hvor du skal spørge om dette, burde du ikke have dette.",
|
||||||
"activate": "Aktivér",
|
"activate": "Aktivér",
|
||||||
"loading": "Loader…"
|
"loading": "Indlæser…"
|
||||||
},
|
},
|
||||||
"downloads": {
|
"downloads": {
|
||||||
"resume": "Fortsæt",
|
"resume": "Fortsæt",
|
||||||
"pause": "Pause",
|
"pause": "Pause",
|
||||||
"eta": "Konklusion {{eta}}",
|
"eta": "Konklusion {{eta}}",
|
||||||
"paused": "Pauset",
|
"paused": "Sat på pause",
|
||||||
"verifying": "Verificerer…",
|
"verifying": "Verificerer…",
|
||||||
"completed": "Færdigt",
|
"completed": "Færdigt",
|
||||||
|
"removed": "Ikke downloadet",
|
||||||
"cancel": "Annullér",
|
"cancel": "Annullér",
|
||||||
"filter": "Filtrer downloadet spil",
|
"filter": "Filtrér downloadet spil",
|
||||||
"remove": "Fjern",
|
"remove": "Fjern",
|
||||||
"downloading_metadata": "Downloader metadata…",
|
"downloading_metadata": "Downloader metadata…",
|
||||||
"deleting": "Sletter installatør…",
|
"deleting": "Sletter installatør…",
|
||||||
"delete": "Fjern installatør",
|
"delete": "Fjern installatør",
|
||||||
"delete_modal_title": "Er du sikker?",
|
"delete_modal_title": "Er du sikker?",
|
||||||
"delete_modal_description": "Dette vil fjerne alle installations filerne fra din computer",
|
"delete_modal_description": "Dette vil fjerne alle installations filerne fra din computer",
|
||||||
"install": "Installér"
|
"install": "Installér",
|
||||||
|
"download_in_progress": "Undervejs",
|
||||||
|
"queued_downloads": "Downloadkø",
|
||||||
|
"downloads_completed": "Gennemførte",
|
||||||
|
"queued": "I kø",
|
||||||
|
"no_downloads_title": "Rimelig tomt",
|
||||||
|
"no_downloads_description": "Du har ikke downloadet noget med Hydra endnu, men det er aldrig for sent at begynde.",
|
||||||
|
"checking_files": "Undersøger filer…"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"downloads_path": "Downloads sti",
|
"downloads_path": "Downloads sti",
|
||||||
"change": "Opdatering",
|
"change": "Opdatér",
|
||||||
"notifications": "Notifikationer",
|
"notifications": "Notifikationer",
|
||||||
"enable_download_notifications": "Når et download bliver færdigt",
|
"enable_download_notifications": "Når en download bliver færdigt",
|
||||||
"enable_repack_list_notifications": "Når en ny repack bliver tilføjet",
|
"enable_repack_list_notifications": "Når en ny repack bliver tilføjet",
|
||||||
|
"real_debrid_api_token_label": "Real-Debrid API nøgle",
|
||||||
"quit_app_instead_hiding": "Afslut Hydra instedet for at minimere til processlinjen",
|
"quit_app_instead_hiding": "Afslut Hydra instedet for at minimere til processlinjen",
|
||||||
"launch_with_system": "Åben Hydra ved start af systemet",
|
"launch_with_system": "Åben Hydra ved start af systemet",
|
||||||
"general": "Generelt",
|
"general": "Generelt",
|
||||||
"behavior": "Opførsel",
|
"behavior": "Opførsel",
|
||||||
|
"download_sources": "Download kilder",
|
||||||
|
"language": "Sprog",
|
||||||
|
"real_debrid_api_token": "API nøgle",
|
||||||
"enable_real_debrid": "Slå Real-Debrid til",
|
"enable_real_debrid": "Slå Real-Debrid til",
|
||||||
|
"real_debrid_description": "Real-Debrid er en ubegrænset downloader der gør det muligt for dig at downloade filer med det samme og med den bedste udnyttelse af din internet hastighed.",
|
||||||
|
"real_debrid_invalid_token": "Ugyldig API nøgle",
|
||||||
"real_debrid_api_token_hint": "Du kan få din API nøgle <0>her</0>",
|
"real_debrid_api_token_hint": "Du kan få din API nøgle <0>her</0>",
|
||||||
"save_changes": "Gem ændringer"
|
"real_debrid_free_account_error": "Brugeren \"{{username}}\" er en gratis bruger. Venligst abbonér på Real-Debrid",
|
||||||
|
"real_debrid_linked_message": "Brugeren \"{{username}}\" er forbundet",
|
||||||
|
"save_changes": "Gem ændringer",
|
||||||
|
"changes_saved": "Ændringer gemt successfuldt",
|
||||||
|
"download_sources_description": "Hydra vil hente download links fra disse kilder. Kilde URLen skal være et direkte link til en .json fil der indeholder download linkene.",
|
||||||
|
"validate_download_source": "Validér",
|
||||||
|
"remove_download_source": "Fjern",
|
||||||
|
"add_download_source": "Tilføj kilde",
|
||||||
|
"download_count_zero": "Ingen download muligheder",
|
||||||
|
"download_count_one": "{{countFormatted}} download mulighed",
|
||||||
|
"download_count_other": "{{countFormatted}} download muligheder",
|
||||||
|
"download_source_url": "Download kilde URL",
|
||||||
|
"add_download_source_description": "Indsæt URLen der indeholder .json filen",
|
||||||
|
"download_source_up_to_date": "Op til dato",
|
||||||
|
"download_source_errored": "Fejlede",
|
||||||
|
"sync_download_sources": "Synkronisér kilder",
|
||||||
|
"removed_download_source": "Download kilde fjernet",
|
||||||
|
"added_download_source": "Tilføjede download kilde",
|
||||||
|
"download_sources_synced": "Alle download kilder er synkroniserede",
|
||||||
|
"insert_valid_json_url": "Indsæt en gyldig JSON url",
|
||||||
|
"found_download_option_zero": "Ingen download mulighed fundet",
|
||||||
|
"found_download_option_one": "Fandt {{countFormatted}} download mulighed",
|
||||||
|
"found_download_option_other": "Fandt {{countFormatted}} download mulighed",
|
||||||
|
"import": "Importér",
|
||||||
|
"public": "Offentlig",
|
||||||
|
"private": "Privat",
|
||||||
|
"friends_only": "Kun blandt venner",
|
||||||
|
"privacy": "Privatliv",
|
||||||
|
"profile_visibility": "Synlighed af profil",
|
||||||
|
"profile_visibility_description": "Vælg hvem der kan se din profil og dit bibliotek",
|
||||||
|
"required_field": "Dette felt er påkrævet",
|
||||||
|
"source_already_exists": "Denne kilde er allerede blevet tilføjet",
|
||||||
|
"must_be_valid_url": "Kilden skal være en gyldig URL",
|
||||||
|
"blocked_users": "Blokerede brugere",
|
||||||
|
"user_unblocked": "Brugeren er blevet afblokeret"
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"download_complete": "Download færdig",
|
"download_complete": "Download færdig",
|
||||||
"game_ready_to_install": "{{title}} er klar til at installeret",
|
"game_ready_to_install": "{{title}} er klar til at installeret",
|
||||||
"repack_list_updated": "Repack liste opdateret",
|
"repack_list_updated": "Repack liste opdateret",
|
||||||
"repack_count_one": "{{count}} repack tilføjet",
|
"repack_count_one": "{{count}} repack tilføjet",
|
||||||
"repack_count_other": "{{count}} repacks tilføjet"
|
"repack_count_other": "{{count}} repacks tilføjet",
|
||||||
|
"new_update_available": "Version {{version}} tilgængelig",
|
||||||
|
"restart_to_install_update": "Genstart Hydra for at installere opdateringen"
|
||||||
},
|
},
|
||||||
"system_tray": {
|
"system_tray": {
|
||||||
"open": "Åben Hydra",
|
"open": "Åben Hydra",
|
||||||
@@ -130,10 +236,80 @@
|
|||||||
},
|
},
|
||||||
"binary_not_found_modal": {
|
"binary_not_found_modal": {
|
||||||
"title": "Programmer ikke installeret",
|
"title": "Programmer ikke installeret",
|
||||||
"description": "Wine eller Lutris eksekverbare blev ikke fundet på dit system",
|
"description": "Wine eller Lutris eksekverbar blev ikke fundet på dit system",
|
||||||
"instructions": "Tjek den korrekte måde at installere nogle af dem, på din Linux distribution, så spillet kan køre normalt"
|
"instructions": "Tjek den korrekte måde at installere nogle af dem, på din Linux distribution, så spillet kan køre normalt"
|
||||||
},
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
"close": "Luk knap"
|
"close": "Luk knap"
|
||||||
|
},
|
||||||
|
"forms": {
|
||||||
|
"toggle_password_visibility": "Skift synlighed af kodeord"
|
||||||
|
},
|
||||||
|
"user_profile": {
|
||||||
|
"amount_hours": "{{amount}} timer",
|
||||||
|
"amount_minutes": "{{amount}} minuter",
|
||||||
|
"last_time_played": "Sidst spillet {{period}}",
|
||||||
|
"activity": "Seneste aktivitet",
|
||||||
|
"library": "Bibliotek",
|
||||||
|
"total_play_time": "Samlet spiltid: {{amount}}",
|
||||||
|
"no_recent_activity_title": "Hmmm… ikke noget her",
|
||||||
|
"no_recent_activity_description": "Du har ikke spillet nogen spil for nyligt. Dét er det på tide at lave om på!",
|
||||||
|
"display_name": "Brugernavn",
|
||||||
|
"saving": "Gemmer",
|
||||||
|
"save": "Gem",
|
||||||
|
"edit_profile": "Redigér Profil",
|
||||||
|
"saved_successfully": "Gemt successfuldt",
|
||||||
|
"try_again": "Venligst, prøv igen",
|
||||||
|
"sign_out_modal_title": "Er du sikker?",
|
||||||
|
"cancel": "Annullér",
|
||||||
|
"successfully_signed_out": "Loggede ud successfuldt",
|
||||||
|
"sign_out": "Log ud",
|
||||||
|
"playing_for": "Spiller i {{amount}}",
|
||||||
|
"sign_out_modal_text": "Dit bibliotek er koblet sammen med din nuværende bruger. Når du logger ud er dit bibliotek ikke synligt længere, og nogen som helst form for fremskridt bliver ikke gemt. Vil du fortsætte med at logge ud?",
|
||||||
|
"add_friends": "Tilføj venner",
|
||||||
|
"add": "Tilføj",
|
||||||
|
"friend_code": "Venne kode",
|
||||||
|
"see_profile": "Se profil",
|
||||||
|
"sending": "Sender",
|
||||||
|
"friend_request_sent": "Venne anmodning sendt",
|
||||||
|
"friends": "Venner",
|
||||||
|
"friends_list": "Venne liste",
|
||||||
|
"user_not_found": "Bruger ikke fundet",
|
||||||
|
"block_user": "Blokér bruger",
|
||||||
|
"add_friend": "Tilføj ven",
|
||||||
|
"request_sent": "Anmodning sendt",
|
||||||
|
"request_received": "Anmodning modtaget",
|
||||||
|
"accept_request": "Acceptér anmodning",
|
||||||
|
"ignore_request": "Ignorér anmodning",
|
||||||
|
"cancel_request": "Annullér anmodning",
|
||||||
|
"undo_friendship": "Fortryd venskab",
|
||||||
|
"request_accepted": "Anmodning accepteret",
|
||||||
|
"user_blocked_successfully": "Bruger blokeret successfuldt",
|
||||||
|
"user_block_modal_text": "Dette blokerer {{displayName}}",
|
||||||
|
"blocked_users": "Blokerede brugere",
|
||||||
|
"unblock": "Afblokér",
|
||||||
|
"no_friends_added": "Du har stadig ikke tilføjet nogen venner",
|
||||||
|
"pending": "Afventer",
|
||||||
|
"no_pending_invites": "Du har ingen afventende invitationer",
|
||||||
|
"no_blocked_users": "Du har ingen blokerede brugere",
|
||||||
|
"friend_code_copied": "Venne kode kopieret",
|
||||||
|
"undo_friendship_modal_text": "Dette vil fortryde dit venskab med {{displayName}}",
|
||||||
|
"privacy_hint": "For at justere hvem der kan se dette, gå til <0>Indstillingerne</0>",
|
||||||
|
"locked_profile": "Denne profil er privat",
|
||||||
|
"image_process_failure": "Fejlede under håndteringen af billedet",
|
||||||
|
"required_field": "Dette felt er påkrævet",
|
||||||
|
"displayname_min_length": "Brugernavnet skal være mindst 3 karakterer langt",
|
||||||
|
"displayname_max_length": "Brugernavnet skal være højest 50 karakterer langt",
|
||||||
|
"report_profile": "Rapportér denne profil",
|
||||||
|
"report_reason": "Hvorfor rapportérer du denne profil?",
|
||||||
|
"report_description": "Yderligere information",
|
||||||
|
"report_description_placeholder": "Yderligere information",
|
||||||
|
"report": "Rapportér",
|
||||||
|
"report_reason_hate": "Hadefuld tale",
|
||||||
|
"report_reason_sexual_content": "Seksuelt indhold",
|
||||||
|
"report_reason_violence": "Vold",
|
||||||
|
"report_reason_spam": "Spam",
|
||||||
|
"report_reason_other": "Andet",
|
||||||
|
"profile_reported": "Profil rapporteret"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Empfohlen",
|
"featured": "Empfohlen",
|
||||||
"trending": "Beliebt",
|
|
||||||
"surprise_me": "Überrasche mich",
|
"surprise_me": "Überrasche mich",
|
||||||
"no_results": "Keine Ergebnisse gefunden"
|
"no_results": "Keine Ergebnisse gefunden"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,12 +5,12 @@
|
|||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Featured",
|
"featured": "Featured",
|
||||||
"trending": "Trending",
|
|
||||||
"surprise_me": "Surprise me",
|
"surprise_me": "Surprise me",
|
||||||
"no_results": "No results found",
|
"no_results": "No results found",
|
||||||
"start_typing": "Starting typing to search...",
|
"start_typing": "Starting typing to search...",
|
||||||
"hot": "🔥 Hot now",
|
"hot": "Hot now",
|
||||||
"weekly": "📅 Top games of the week"
|
"weekly": "📅 Top games of the week",
|
||||||
|
"achievements": "🏆 Games to beat"
|
||||||
},
|
},
|
||||||
"sidebar": {
|
"sidebar": {
|
||||||
"catalogue": "Catalogue",
|
"catalogue": "Catalogue",
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
"bottom_panel": {
|
"bottom_panel": {
|
||||||
"no_downloads_in_progress": "No downloads in progress",
|
"no_downloads_in_progress": "No downloads in progress",
|
||||||
"downloading_metadata": "Downloading {{title}} metadata…",
|
"downloading_metadata": "Downloading {{title}} metadata…",
|
||||||
"downloading": "Downloading {{title}}… ({{percentage}} complete) - Conclusion {{eta}} - {{speed}}",
|
"downloading": "Downloading {{title}}… ({{percentage}} complete) - Completion {{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)"
|
"checking_files": "Checking {{title}} files… ({{percentage}} complete)"
|
||||||
},
|
},
|
||||||
@@ -130,7 +130,42 @@
|
|||||||
"download": "Download",
|
"download": "Download",
|
||||||
"executable_path_in_use": "Executable already in use by \"{{game}}\"",
|
"executable_path_in_use": "Executable already in use by \"{{game}}\"",
|
||||||
"warning": "Warning:",
|
"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."
|
"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.",
|
||||||
|
"achievements": "Achievements",
|
||||||
|
"achievements_count": "Achievements {{unlockedCount}}/{{achievementsCount}}",
|
||||||
|
"cloud_save": "Cloud save",
|
||||||
|
"cloud_save_description": "Save your progress in the cloud and continue playing on any device",
|
||||||
|
"backups": "Backups",
|
||||||
|
"install_backup": "Install",
|
||||||
|
"delete_backup": "Delete",
|
||||||
|
"create_backup": "New backup",
|
||||||
|
"last_backup_date": "Last backup on {{date}}",
|
||||||
|
"no_backup_preview": "No save games were found for this title",
|
||||||
|
"restoring_backup": "Restoring backup ({{progress}} complete)…",
|
||||||
|
"uploading_backup": "Uploading backup…",
|
||||||
|
"no_backups": "You haven't created any backups for this game yet",
|
||||||
|
"backup_uploaded": "Backup uploaded",
|
||||||
|
"backup_deleted": "Backup deleted",
|
||||||
|
"backup_restored": "Backup restored",
|
||||||
|
"see_all_achievements": "See all achievements",
|
||||||
|
"sign_in_to_see_achievements": "Sign in to see achievements",
|
||||||
|
"mapping_method_automatic": "Automatic",
|
||||||
|
"mapping_method_manual": "Manual",
|
||||||
|
"mapping_method_label": "Mapping method",
|
||||||
|
"files_automatically_mapped": "Files automatically mapped",
|
||||||
|
"no_backups_created": "No backups created for this game",
|
||||||
|
"manage_files": "Manage files",
|
||||||
|
"loading_save_preview": "Searching for save games…",
|
||||||
|
"wine_prefix": "Wine Prefix",
|
||||||
|
"wine_prefix_description": "The Wine prefix used to run this game",
|
||||||
|
"no_download_option_info": "No information available",
|
||||||
|
"backup_deletion_failed": "Failed to delete backup",
|
||||||
|
"max_number_of_artifacts_reached": "Maximum number of backups reached for this game",
|
||||||
|
"achievements_not_sync": "Your achievements are not synchronized",
|
||||||
|
"manage_files_description": "Manage which files will be backed up and restored",
|
||||||
|
"select_folder": "Select folder",
|
||||||
|
"backup_from": "Backup from {{date}}",
|
||||||
|
"custom_backup_location_set": "Custom backup location set"
|
||||||
},
|
},
|
||||||
"activation": {
|
"activation": {
|
||||||
"title": "Activate Hydra",
|
"title": "Activate Hydra",
|
||||||
@@ -217,7 +252,8 @@
|
|||||||
"source_already_exists": "This source has been already added",
|
"source_already_exists": "This source has been already added",
|
||||||
"must_be_valid_url": "The source must be a valid URL",
|
"must_be_valid_url": "The source must be a valid URL",
|
||||||
"blocked_users": "Blocked users",
|
"blocked_users": "Blocked users",
|
||||||
"user_unblocked": "User has been unblocked"
|
"user_unblocked": "User has been unblocked",
|
||||||
|
"enable_achievement_notifications": "When an achievement in unlocked"
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"download_complete": "Download complete",
|
"download_complete": "Download complete",
|
||||||
@@ -226,7 +262,9 @@
|
|||||||
"repack_count_one": "{{count}} repack added",
|
"repack_count_one": "{{count}} repack added",
|
||||||
"repack_count_other": "{{count}} repacks added",
|
"repack_count_other": "{{count}} repacks added",
|
||||||
"new_update_available": "Version {{version}} available",
|
"new_update_available": "Version {{version}} available",
|
||||||
"restart_to_install_update": "Restart Hydra to install the update"
|
"restart_to_install_update": "Restart Hydra to install the update",
|
||||||
|
"notification_achievement_unlocked_title": "Achievement unlocked for {{game}}",
|
||||||
|
"notification_achievement_unlocked_body": "{{achievement}} and other {{count}} were unlocked"
|
||||||
},
|
},
|
||||||
"system_tray": {
|
"system_tray": {
|
||||||
"open": "Open Hydra",
|
"open": "Open Hydra",
|
||||||
@@ -311,6 +349,28 @@
|
|||||||
"report_reason_violence": "Violence",
|
"report_reason_violence": "Violence",
|
||||||
"report_reason_spam": "Spam",
|
"report_reason_spam": "Spam",
|
||||||
"report_reason_other": "Other",
|
"report_reason_other": "Other",
|
||||||
"profile_reported": "Profile reported"
|
"profile_reported": "Profile reported",
|
||||||
|
"your_friend_code": "Your friend code:",
|
||||||
|
"upload_banner": "Upload banner",
|
||||||
|
"uploading_banner": "Uploading banner…",
|
||||||
|
"background_image_updated": "Background image updated"
|
||||||
|
},
|
||||||
|
"achievement": {
|
||||||
|
"achievement_unlocked": "Achievement unlocked",
|
||||||
|
"user_achievements": "{{displayName}}'s Achievements",
|
||||||
|
"your_achievements": "Your Achievements",
|
||||||
|
"unlocked_at": "Unlocked at:",
|
||||||
|
"subscription_needed": "A Hydra Cloud subscription is required to see this content",
|
||||||
|
"new_achievements_unlocked": "Unlocked {{achievementCount}} new achievements from {{gameCount}} games"
|
||||||
|
},
|
||||||
|
"tour": {
|
||||||
|
"subscription_tour_title": "Hydra Cloud Subscription",
|
||||||
|
"subscribe_now": "Subscribe now",
|
||||||
|
"cloud_saving": "Cloud saving",
|
||||||
|
"cloud_achievements": "Save your achievements on the cloud",
|
||||||
|
"animated_profile_picture": "Animated profile pictures",
|
||||||
|
"premium_support": "Premium Support",
|
||||||
|
"show_and_compare_achievements": "Show and compare your achievements to other users",
|
||||||
|
"animated_profile_banner": "Animated profile banner"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
{
|
{
|
||||||
"language_name": "Español",
|
"language_name": "Español",
|
||||||
"app": {
|
"app": {
|
||||||
"successfully_signed_in": "Sesión iniciada correctamente"
|
"successfully_signed_in": "Sesión iniciada exitosamente"
|
||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Destacado",
|
"featured": "Destacado",
|
||||||
"trending": "Tendencias",
|
|
||||||
"surprise_me": "¡Sorpréndeme!",
|
"surprise_me": "¡Sorpréndeme!",
|
||||||
"no_results": "No se encontraron resultados",
|
"no_results": "Sin resultados encontrados",
|
||||||
"hot": "🔥 Caliente ahora",
|
"start_typing": "Empieza a escribir para buscar...",
|
||||||
"weekly": "📅 Los mejores juegos de la semana",
|
"hot": "Popular Ahora",
|
||||||
"start_typing": "Empieza a escribir para buscar..."
|
"weekly": "📅 Mejores juegos de la semana",
|
||||||
|
"achievements": "🏆 Juegos para completar"
|
||||||
},
|
},
|
||||||
"sidebar": {
|
"sidebar": {
|
||||||
"catalogue": "Catálogo",
|
"catalogue": "Catálogo",
|
||||||
@@ -22,8 +22,8 @@
|
|||||||
"downloading": "{{title}} ({{percentage}} - Descargando…)",
|
"downloading": "{{title}} ({{percentage}} - Descargando…)",
|
||||||
"filter": "Buscar en la biblioteca",
|
"filter": "Buscar en la biblioteca",
|
||||||
"home": "Inicio",
|
"home": "Inicio",
|
||||||
"queued": "{{title}} (En Cola)",
|
"queued": "{{title}} (En cola)",
|
||||||
"game_has_no_executable": "El juego no tiene un ejecutable",
|
"game_has_no_executable": "El juego no tiene un ejecutable seleccionado",
|
||||||
"sign_in": "Iniciar sesión",
|
"sign_in": "Iniciar sesión",
|
||||||
"friends": "Amigos"
|
"friends": "Amigos"
|
||||||
},
|
},
|
||||||
@@ -34,8 +34,8 @@
|
|||||||
"downloads": "Descargas",
|
"downloads": "Descargas",
|
||||||
"search_results": "Resultados de búsqueda",
|
"search_results": "Resultados de búsqueda",
|
||||||
"settings": "Ajustes",
|
"settings": "Ajustes",
|
||||||
"version_available_install": "Version {{version}} disponible. Haz clic aquí para reiniciar e instalar.",
|
"version_available_install": "Versión {{version}} disponible. Presiona acá para descargar y reinstalar.",
|
||||||
"version_available_download": "Version {{version}} disponible. Haz clic aquí para descargar."
|
"version_available_download": "Versión {{version}} disponible. Presiona aquí para descargar."
|
||||||
},
|
},
|
||||||
"bottom_panel": {
|
"bottom_panel": {
|
||||||
"no_downloads_in_progress": "Sin descargas en progreso",
|
"no_downloads_in_progress": "Sin descargas en progreso",
|
||||||
@@ -99,7 +99,7 @@
|
|||||||
"open_screenshot": "Abrir captura {{number}}",
|
"open_screenshot": "Abrir captura {{number}}",
|
||||||
"download_settings": "Ajustes de descarga",
|
"download_settings": "Ajustes de descarga",
|
||||||
"downloader": "Método de descarga",
|
"downloader": "Método de descarga",
|
||||||
"select_executable": "Seleccionar",
|
"select_executable": "Seleccionar ejecutable",
|
||||||
"no_executable_selected": "No se seleccionó un ejecutable",
|
"no_executable_selected": "No se seleccionó un ejecutable",
|
||||||
"open_folder": "Abrir carpeta",
|
"open_folder": "Abrir carpeta",
|
||||||
"open_download_location": "Ver archivos descargados",
|
"open_download_location": "Ver archivos descargados",
|
||||||
@@ -119,16 +119,53 @@
|
|||||||
"last_downloaded_option": "Última opción descargada",
|
"last_downloaded_option": "Última opción descargada",
|
||||||
"create_shortcut_success": "Atajo creado con éxito",
|
"create_shortcut_success": "Atajo creado con éxito",
|
||||||
"create_shortcut_error": "Error al crear un atajo",
|
"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.",
|
"nsfw_content_title": "Este juego contiene contenido inapropiado.",
|
||||||
|
"nsfw_content_description": "{{title}} puede ser no adecuado para todas las edades por su contenido. \n¿Deseas continuar de igual forma?",
|
||||||
|
"allow_nsfw_content": "Continuar",
|
||||||
|
"refuse_nsfw_content": "No, gracias",
|
||||||
|
"stats": "Estadísticas",
|
||||||
|
"download_count": "Downloads",
|
||||||
"player_count": "Jugadores activos",
|
"player_count": "Jugadores activos",
|
||||||
"refuse_nsfw_content": "Volver",
|
"download_error": "Esta opción de descarga no está disponible.",
|
||||||
"stats": "Estadísticas"
|
"download": "Descargar",
|
||||||
|
"executable_path_in_use": "El ejecutable se encuentra en uso por \"{{game}}\"",
|
||||||
|
"warning": "Advertencia:",
|
||||||
|
"hydra_needs_to_remain_open": "Para esta descarga, Hydra necesita mantenerse abierta hasta que concluya. En caso de que Hydra se cierre antes de que concluya, podrías perder todo el progreso.",
|
||||||
|
"achievements": "Logros",
|
||||||
|
"achievements_count": "Logros {{unlockedCount}}/{{achievementsCount}}",
|
||||||
|
"cloud_save": "Guardado en la nube",
|
||||||
|
"cloud_save_description": "Guarda tu progreso en la nube y continúa jugando en cualquier dispositivo",
|
||||||
|
"backups": "Copias de Seguridad",
|
||||||
|
"install_backup": "Instalar",
|
||||||
|
"delete_backup": "Eliminar",
|
||||||
|
"create_backup": "Nueva Copia de Seguridad",
|
||||||
|
"last_backup_date": "Última copia de seguridad el {{date}}",
|
||||||
|
"no_backup_preview": "No se encontraron datos de guardados para este juego",
|
||||||
|
"restoring_backup": "Restaurando copia de seguridad ({{progress}} completado)…",
|
||||||
|
"uploading_backup": "Subiendo copia de seguridad…",
|
||||||
|
"no_backups": "No has creado ninguna copia de seguridad para este juego aún",
|
||||||
|
"backup_uploaded": "Copia de seguridad subida",
|
||||||
|
"backup_deleted": "Copia de seguridad eliminada",
|
||||||
|
"backup_restored": "Copia de seguridad restaurada",
|
||||||
|
"see_all_achievements": "Ver todos los logros",
|
||||||
|
"sign_in_to_see_achievements": "Inicia sesión para ver los logros",
|
||||||
|
"mapping_method_automatic": "Automático",
|
||||||
|
"mapping_method_manual": "Manual",
|
||||||
|
"mapping_method_label": "Método de mapeo",
|
||||||
|
"files_automatically_mapped": "Archivos mapeados automáticamente",
|
||||||
|
"no_backups_created": "Sin copias de seguridad creadas para este juego",
|
||||||
|
"manage_files": "Gestionar archivos",
|
||||||
|
"loading_save_preview": "Buscando datos de guardados de juegos…",
|
||||||
|
"wine_prefix": "Prefijo de Wine",
|
||||||
|
"wine_prefix_description": "El prefijo de Wine usado para ejecutar este juego",
|
||||||
|
"no_download_option_info": "Sin información disponible",
|
||||||
|
"backup_deletion_failed": "La eliminación de la copia de seguridad falló",
|
||||||
|
"max_number_of_artifacts_reached": "Número máximo de copias de seguridad de este juego alcanzadas",
|
||||||
|
"achievements_not_sync": "Tus logros no están sincronizados",
|
||||||
|
"manage_files_description": "Gestiona los archivos que serán respaldados y restaurados",
|
||||||
|
"select_folder": "Seleccionar carpeta",
|
||||||
|
"backup_from": "Copia de seguridad de {{date}}",
|
||||||
|
"custom_backup_location_set": "Se configuró la carpeta de copia de seguridad"
|
||||||
},
|
},
|
||||||
"activation": {
|
"activation": {
|
||||||
"title": "Activar Hydra",
|
"title": "Activar Hydra",
|
||||||
@@ -205,20 +242,18 @@
|
|||||||
"found_download_option_one": "Se encontró {{countFormatted}} 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",
|
"found_download_option_other": "Se encontraron {{countFormatted}} opciones de descarga",
|
||||||
"import": "Importar",
|
"import": "Importar",
|
||||||
"blocked_users": "Usuarios bloqueados",
|
"public": "Público",
|
||||||
"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",
|
"private": "Privado",
|
||||||
|
"friends_only": "Solo amigos",
|
||||||
|
"privacy": "Privacidad",
|
||||||
"profile_visibility": "Visibilidad del perfil",
|
"profile_visibility": "Visibilidad del perfil",
|
||||||
"profile_visibility_description": "Elige quién puede ver tu perfil y biblioteca",
|
"profile_visibility_description": "Elige quién puede ver tu perfil y biblioteca",
|
||||||
"public": "Público",
|
|
||||||
"required_field": "Este campo es obligatorio",
|
"required_field": "Este campo es obligatorio",
|
||||||
"source_already_exists": "Esta fuente ya ha sido agregada.",
|
"source_already_exists": "Esta fuente ya ha sido agregada.",
|
||||||
"user_unblocked": "El usuario ha sido desbloqueado"
|
"must_be_valid_url": "La fuente debe ser una URL válida.",
|
||||||
|
"blocked_users": "Usuarios bloqueados",
|
||||||
|
"user_unblocked": "El usuario ha sido desbloqueado",
|
||||||
|
"enable_achievement_notifications": "Cuando un logro se desbloquea"
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"download_complete": "Descarga completada",
|
"download_complete": "Descarga completada",
|
||||||
@@ -227,7 +262,9 @@
|
|||||||
"repack_count_one": "{{count}} repack ha sido añadido",
|
"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",
|
"new_update_available": "Version {{version}} disponible",
|
||||||
"restart_to_install_update": "Reinicia Hydra para instalar la actualización"
|
"restart_to_install_update": "Reinicia Hydra para instalar la actualización",
|
||||||
|
"notification_achievement_unlocked_title": "Logro desbloqueado de {{game}}",
|
||||||
|
"notification_achievement_unlocked_body": "{{achievement}} y otros {{count}} fueron desbloqueados"
|
||||||
},
|
},
|
||||||
"system_tray": {
|
"system_tray": {
|
||||||
"open": "Abrir Hydra",
|
"open": "Abrir Hydra",
|
||||||
@@ -238,7 +275,7 @@
|
|||||||
},
|
},
|
||||||
"binary_not_found_modal": {
|
"binary_not_found_modal": {
|
||||||
"title": "Programas no instalados",
|
"title": "Programas no instalados",
|
||||||
"description": "Los ejecutables de Wine o Lutris no se encontraron en su sistema",
|
"description": "Los ejecutables de Wine o Lutris no se encontraron en tu sistema",
|
||||||
"instructions": "Comprueba como instalar de forma correcta uno de los dos en tu distro de Linux para ejecutar el juego con normalidad"
|
"instructions": "Comprueba como instalar de forma correcta uno de los dos en tu distro de Linux para ejecutar el juego con normalidad"
|
||||||
},
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
@@ -296,23 +333,44 @@
|
|||||||
"no_blocked_users": "No has bloqueado a ningún usuario",
|
"no_blocked_users": "No has bloqueado a ningún usuario",
|
||||||
"friend_code_copied": "Código de amigo copiado",
|
"friend_code_copied": "Código de amigo copiado",
|
||||||
"undo_friendship_modal_text": "Esto deshará tu amistad con {{displayName}}",
|
"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>.",
|
"privacy_hint": "Para ajustar quién puede ver esto, ve a <0>Configuración</0>.",
|
||||||
"profile_locked": "",
|
"locked_profile": "Este perfil es privado",
|
||||||
"profile_reported": "Perfil reportado",
|
"image_process_failure": "Error al procesar la imagen",
|
||||||
"report": "Informe",
|
"required_field": "Este campo es obligatorio",
|
||||||
|
"displayname_min_length": "El nombre a mostrar debe tener al menos 3 caracteres",
|
||||||
|
"displayname_max_length": "El nombre a mostrar debe tener como máximo 50 caracteres",
|
||||||
|
"report_profile": "Reportar este perfil",
|
||||||
|
"report_reason": "¿Cual es el motivo del reporte?",
|
||||||
"report_description": "Información adicional",
|
"report_description": "Información adicional",
|
||||||
"report_description_placeholder": "Información adicional",
|
"report_description_placeholder": "Información adicional",
|
||||||
"report_profile": "Reportar este perfil",
|
"report": "Reportar",
|
||||||
"report_reason": "¿Por qué estás denunciando este perfil?",
|
"report_reason_hate": "Discursos de odio",
|
||||||
"report_reason_hate": "Discurso de odio",
|
|
||||||
"report_reason_other": "Otro",
|
|
||||||
"report_reason_sexual_content": "Contenido sexual",
|
"report_reason_sexual_content": "Contenido sexual",
|
||||||
"report_reason_spam": "Correo basura",
|
|
||||||
"report_reason_violence": "Violencia",
|
"report_reason_violence": "Violencia",
|
||||||
"required_field": "Este campo es obligatorio",
|
"report_reason_spam": "Spam / Contenido no deseado",
|
||||||
"image_process_failure": "Error al procesar la imagen"
|
"report_reason_other": "Otro",
|
||||||
|
"profile_reported": "Perfil reportado",
|
||||||
|
"your_friend_code": "Tu código de amigo:",
|
||||||
|
"upload_banner": "Subir un banner",
|
||||||
|
"uploading_banner": "Subiendo banner…",
|
||||||
|
"background_image_updated": "Imagen de fondo actualizada"
|
||||||
|
},
|
||||||
|
"achievement": {
|
||||||
|
"achievement_unlocked": "Logro desbloqueado",
|
||||||
|
"user_achievements": "Logros de {{displayName}}",
|
||||||
|
"your_achievements": "Tus Logros",
|
||||||
|
"unlocked_at": "Desbloqueado el:",
|
||||||
|
"subscription_needed": "Se necesita una suscripción a Hydra Cloud se necesita para ver este contenido",
|
||||||
|
"new_achievements_unlocked": "Desbloqueados {{achievementCount}} nuevos logros de {{gameCount}} juegos"
|
||||||
|
},
|
||||||
|
"tour": {
|
||||||
|
"subscription_tour_title": "Suscripción Hydra Cloud",
|
||||||
|
"subscribe_now": "Suscribirse ahora",
|
||||||
|
"cloud_saving": "Guardado en la nube",
|
||||||
|
"cloud_achievements": "Guarda tus logros en la nube",
|
||||||
|
"animated_profile_picture": "Fotos de perfil animadas",
|
||||||
|
"premium_support": "Soporte Premium",
|
||||||
|
"show_and_compare_achievements": "Muestra y compara tus logros con otros usuarios",
|
||||||
|
"animated_profile_banner": "Fondo de perfil animado"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
376
src/locales/et/translation.json
Normal file
376
src/locales/et/translation.json
Normal file
@@ -0,0 +1,376 @@
|
|||||||
|
{
|
||||||
|
"language_name": "Eesti",
|
||||||
|
"app": {
|
||||||
|
"successfully_signed_in": "Edukalt sisse logitud"
|
||||||
|
},
|
||||||
|
"home": {
|
||||||
|
"featured": "Esile toodud",
|
||||||
|
"surprise_me": "Üllata mind",
|
||||||
|
"no_results": "Tulemusi ei leitud",
|
||||||
|
"start_typing": "Alusta otsimiseks kirjutamist...",
|
||||||
|
"hot": "Praegu kuum",
|
||||||
|
"weekly": "📅 Nädala top mängud",
|
||||||
|
"achievements": "🏆 Mängud, mida läbida"
|
||||||
|
},
|
||||||
|
"sidebar": {
|
||||||
|
"catalogue": "Kataloog",
|
||||||
|
"downloads": "Allalaadimised",
|
||||||
|
"settings": "Seaded",
|
||||||
|
"my_library": "Minu kogu",
|
||||||
|
"downloading_metadata": "{{title}} (Metaandmete allalaadimine…)",
|
||||||
|
"paused": "{{title}} (Peatatud)",
|
||||||
|
"downloading": "{{title}} ({{percentage}} - Allalaadimine…)",
|
||||||
|
"filter": "Filtreeri kogu",
|
||||||
|
"home": "Avaleht",
|
||||||
|
"queued": "{{title}} (Järjekorras)",
|
||||||
|
"game_has_no_executable": "Mängul pole käivitusfaili valitud",
|
||||||
|
"sign_in": "Logi sisse",
|
||||||
|
"friends": "Sõbrad"
|
||||||
|
},
|
||||||
|
"header": {
|
||||||
|
"search": "Otsi mänge",
|
||||||
|
"home": "Avaleht",
|
||||||
|
"catalogue": "Kataloog",
|
||||||
|
"downloads": "Allalaadimised",
|
||||||
|
"search_results": "Otsingutulemused",
|
||||||
|
"settings": "Seaded",
|
||||||
|
"version_available_install": "Versioon {{version}} on saadaval. Klõpsa siia taaskäivitamiseks ja installimiseks.",
|
||||||
|
"version_available_download": "Versioon {{version}} on saadaval. Klõpsa siia allalaadimiseks."
|
||||||
|
},
|
||||||
|
"bottom_panel": {
|
||||||
|
"no_downloads_in_progress": "Allalaadimisi pole pooleli",
|
||||||
|
"downloading_metadata": "{{title}} metaandmete allalaadimine…",
|
||||||
|
"downloading": "{{title}} allalaadimine… ({{percentage}} valmis) - Lõpp {{eta}} - {{speed}}",
|
||||||
|
"calculating_eta": "{{title}} allalaadimine… ({{percentage}} valmis) - Järelejäänud aja arvutamine…",
|
||||||
|
"checking_files": "{{title}} failide kontrollimine… ({{percentage}} valmis)"
|
||||||
|
},
|
||||||
|
"catalogue": {
|
||||||
|
"next_page": "Järgmine leht",
|
||||||
|
"previous_page": "Eelmine leht"
|
||||||
|
},
|
||||||
|
"game_details": {
|
||||||
|
"open_download_options": "Ava allalaadimise valikud",
|
||||||
|
"download_options_zero": "Allalaadimise valikuid pole",
|
||||||
|
"download_options_one": "{{count}} allalaadimise valik",
|
||||||
|
"download_options_other": "{{count}} allalaadimise valikut",
|
||||||
|
"updated_at": "Uuendatud {{updated_at}}",
|
||||||
|
"install": "Installi",
|
||||||
|
"resume": "Jätka",
|
||||||
|
"pause": "Peata",
|
||||||
|
"cancel": "Tühista",
|
||||||
|
"remove": "Eemalda",
|
||||||
|
"space_left_on_disk": "{{space}} kettaruumi järel",
|
||||||
|
"eta": "Lõpp {{eta}}",
|
||||||
|
"calculating_eta": "Järelejäänud aja arvutamine…",
|
||||||
|
"downloading_metadata": "Metaandmete allalaadimine…",
|
||||||
|
"filter": "Filtreeri repacke",
|
||||||
|
"requirements": "Süsteeminõuded",
|
||||||
|
"minimum": "Miinimum",
|
||||||
|
"recommended": "Soovitatav",
|
||||||
|
"paused": "Peatatud",
|
||||||
|
"release_date": "Välja antud {{date}}",
|
||||||
|
"publisher": "Avaldaja {{publisher}}",
|
||||||
|
"hours": "tundi",
|
||||||
|
"minutes": "minutit",
|
||||||
|
"amount_hours": "{{amount}} tundi",
|
||||||
|
"amount_minutes": "{{amount}} minutit",
|
||||||
|
"accuracy": "{{accuracy}}% täpsus",
|
||||||
|
"add_to_library": "Lisa kogusse",
|
||||||
|
"remove_from_library": "Eemalda kogust",
|
||||||
|
"no_downloads": "Allalaadimisi pole saadaval",
|
||||||
|
"play_time": "Mängitud {{amount}}",
|
||||||
|
"last_time_played": "Viimati mängitud {{period}}",
|
||||||
|
"not_played_yet": "Sa pole veel {{title}} mänginud",
|
||||||
|
"next_suggestion": "Järgmine soovitus",
|
||||||
|
"play": "Mängi",
|
||||||
|
"deleting": "Installeri kustutamine…",
|
||||||
|
"close": "Sulge",
|
||||||
|
"playing_now": "Mängib praegu",
|
||||||
|
"change": "Muuda",
|
||||||
|
"repacks_modal_description": "Vali repack, mida soovid alla laadida",
|
||||||
|
"select_folder_hint": "Vaikimisi kausta muutmiseks mine <0>Seadetesse</0>",
|
||||||
|
"download_now": "Laadi alla kohe",
|
||||||
|
"no_shop_details": "Poe andmeid ei õnnestunud laadida.",
|
||||||
|
"download_options": "Allalaadimise valikud",
|
||||||
|
"download_path": "Allalaadimise tee",
|
||||||
|
"previous_screenshot": "Eelmine kuvatõmmis",
|
||||||
|
"next_screenshot": "Järgmine kuvatõmmis",
|
||||||
|
"screenshot": "Kuvatõmmis {{number}}",
|
||||||
|
"open_screenshot": "Ava kuvatõmmis {{number}}",
|
||||||
|
"download_settings": "Allalaadimise seaded",
|
||||||
|
"downloader": "Allalaadija",
|
||||||
|
"select_executable": "Vali",
|
||||||
|
"no_executable_selected": "Käivitusfaili pole valitud",
|
||||||
|
"open_folder": "Ava kaust",
|
||||||
|
"open_download_location": "Vaata allalaaditud faile",
|
||||||
|
"create_shortcut": "Loo töölaua otsetee",
|
||||||
|
"remove_files": "Eemalda failid",
|
||||||
|
"remove_from_library_title": "Oled sa kindel?",
|
||||||
|
"remove_from_library_description": "See eemaldab {{game}} sinu kogust",
|
||||||
|
"options": "Valikud",
|
||||||
|
"executable_section_title": "Käivitusfail",
|
||||||
|
"executable_section_description": "Faili tee, mida käivitatakse \"Mängi\" nupule vajutades",
|
||||||
|
"downloads_secion_title": "Allalaadimised",
|
||||||
|
"downloads_section_description": "Vaata uuendusi või selle mängu teisi versioone",
|
||||||
|
"danger_zone_section_title": "Ohutsoon",
|
||||||
|
"danger_zone_section_description": "Eemalda see mäng oma kogust või Hydra poolt allalaaditud failid",
|
||||||
|
"download_in_progress": "Allalaadimine käimas",
|
||||||
|
"download_paused": "Allalaadimine peatatud",
|
||||||
|
"last_downloaded_option": "Viimane allalaaditud variant",
|
||||||
|
"create_shortcut_success": "Otsetee edukalt loodud",
|
||||||
|
"create_shortcut_error": "Viga otsetee loomisel",
|
||||||
|
"nsfw_content_title": "See mäng sisaldab sobimatut sisu",
|
||||||
|
"nsfw_content_description": "{{title}} sisaldab sisu, mis ei pruugi sobida kõigile vanusegruppidele. Kas soovid kindlasti jätkata?",
|
||||||
|
"allow_nsfw_content": "Jätka",
|
||||||
|
"refuse_nsfw_content": "Mine tagasi",
|
||||||
|
"stats": "Statistika",
|
||||||
|
"download_count": "Allalaadimised",
|
||||||
|
"player_count": "Aktiivsed mängijad",
|
||||||
|
"download_error": "See allalaadimise valik pole saadaval",
|
||||||
|
"download": "Laadi alla",
|
||||||
|
"executable_path_in_use": "Käivitusfail on juba kasutusel mängus \"{{game}}\"",
|
||||||
|
"warning": "Hoiatus:",
|
||||||
|
"hydra_needs_to_remain_open": "selle allalaadimise jaoks peab Hydra jääma avatuks kuni lõpuni. Kui Hydra sulgub enne lõppu, kaotad oma progressi.",
|
||||||
|
"achievements": "Saavutused",
|
||||||
|
"achievements_count": "Saavutused {{unlockedCount}}/{{achievementsCount}}",
|
||||||
|
"cloud_save": "Pilvesalvestus",
|
||||||
|
"cloud_save_description": "Salvesta oma progress pilve ja jätka mängimist mistahes seadmes",
|
||||||
|
"backups": "Varundused",
|
||||||
|
"install_backup": "Installi",
|
||||||
|
"delete_backup": "Kustuta",
|
||||||
|
"create_backup": "Uus varundus",
|
||||||
|
"last_backup_date": "Viimane varundus {{date}}",
|
||||||
|
"no_backup_preview": "Selle mängu jaoks ei leitud salvestusi",
|
||||||
|
"restoring_backup": "Varunduse taastamine ({{progress}} valmis)…",
|
||||||
|
"uploading_backup": "Varunduse üleslaadimine…",
|
||||||
|
"no_backups": "Sa pole veel selle mängu jaoks varundusi loonud",
|
||||||
|
"backup_uploaded": "Varundus üles laaditud",
|
||||||
|
"backup_deleted": "Varundus kustutatud",
|
||||||
|
"backup_restored": "Varundus taastatud",
|
||||||
|
"see_all_achievements": "Vaata kõiki saavutusi",
|
||||||
|
"sign_in_to_see_achievements": "Logi sisse, et näha saavutusi",
|
||||||
|
"mapping_method_automatic": "Automaatne",
|
||||||
|
"mapping_method_manual": "Käsitsi",
|
||||||
|
"mapping_method_label": "Kaardistamise meetod",
|
||||||
|
"files_automatically_mapped": "Failid automaatselt kaardistatud",
|
||||||
|
"no_backups_created": "Selle mängu jaoks pole varundusi loodud",
|
||||||
|
"manage_files": "Halda faile",
|
||||||
|
"loading_save_preview": "Salvestuste otsimine…",
|
||||||
|
"wine_prefix": "Wine Prefix",
|
||||||
|
"wine_prefix_description": "Wine prefix, mida kasutatakse selle mängu käivitamiseks",
|
||||||
|
"no_download_option_info": "Info pole saadaval",
|
||||||
|
"backup_deletion_failed": "Varunduse kustutamine ebaõnnestus",
|
||||||
|
"max_number_of_artifacts_reached": "Selle mängu varunduste maksimaalne arv on saavutatud",
|
||||||
|
"achievements_not_sync": "Sinu saavutused pole sünkroniseeritud",
|
||||||
|
"manage_files_description": "Hallake, millised failid varundatakse ja taastatakse",
|
||||||
|
"select_folder": "Vali kaust",
|
||||||
|
"backup_from": "Varundamine kuupäevast {{date}}",
|
||||||
|
"custom_backup_location_set": "Kohandatud varundamise asukoht määratud"
|
||||||
|
},
|
||||||
|
"activation": {
|
||||||
|
"title": "Aktiveeri Hydra",
|
||||||
|
"installation_id": "Installatsiooni ID:",
|
||||||
|
"enter_activation_code": "Sisesta oma aktiveerimiskood",
|
||||||
|
"message": "Kui sa ei tea, kust seda küsida, siis sa ei peaks seda omama.",
|
||||||
|
"activate": "Aktiveeri",
|
||||||
|
"loading": "Laadimine…"
|
||||||
|
},
|
||||||
|
"downloads": {
|
||||||
|
"resume": "Jätka",
|
||||||
|
"pause": "Peata",
|
||||||
|
"eta": "Lõpp {{eta}}",
|
||||||
|
"paused": "Peatatud",
|
||||||
|
"verifying": "Kontrollimine…",
|
||||||
|
"completed": "Lõpetatud",
|
||||||
|
"removed": "Pole alla laaditud",
|
||||||
|
"cancel": "Tühista",
|
||||||
|
"filter": "Filtreeri allalaaditud mänge",
|
||||||
|
"remove": "Eemalda",
|
||||||
|
"downloading_metadata": "Metaandmete allalaadimine…",
|
||||||
|
"deleting": "Installeri kustutamine…",
|
||||||
|
"delete": "Eemalda installer",
|
||||||
|
"delete_modal_title": "Oled sa kindel?",
|
||||||
|
"delete_modal_description": "See eemaldab kõik installifailid sinu arvutist",
|
||||||
|
"install": "Installi",
|
||||||
|
"download_in_progress": "Töös",
|
||||||
|
"queued_downloads": "Järjekorras allalaadimised",
|
||||||
|
"downloads_completed": "Lõpetatud",
|
||||||
|
"queued": "Järjekorras",
|
||||||
|
"no_downloads_title": "Nii tühi",
|
||||||
|
"no_downloads_description": "Sa pole veel Hydraga midagi alla laadinud, aga pole kunagi hilja alustada.",
|
||||||
|
"checking_files": "Failide kontrollimine…"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"downloads_path": "Allalaadimiste tee",
|
||||||
|
"change": "Uuenda",
|
||||||
|
"notifications": "Teavitused",
|
||||||
|
"enable_download_notifications": "Kui allalaadimine on lõpetatud",
|
||||||
|
"enable_repack_list_notifications": "Kui uus repack on lisatud",
|
||||||
|
"real_debrid_api_token_label": "Real-Debrid API võti",
|
||||||
|
"quit_app_instead_hiding": "Ära peida Hydrat sulgemisel",
|
||||||
|
"launch_with_system": "Käivita Hydra süsteemi käivitamisel",
|
||||||
|
"general": "Üldine",
|
||||||
|
"behavior": "Käitumine",
|
||||||
|
"download_sources": "Allalaadimise allikad",
|
||||||
|
"language": "Keel",
|
||||||
|
"real_debrid_api_token": "API Võti",
|
||||||
|
"enable_real_debrid": "Luba Real-Debrid",
|
||||||
|
"real_debrid_description": "Real-Debrid on piiranguteta allalaadija, mis võimaldab sul faile alla laadida koheselt ja sinu internetiühenduse parima kiirusega.",
|
||||||
|
"real_debrid_invalid_token": "Vigane API võti",
|
||||||
|
"real_debrid_api_token_hint": "Sa saad oma API võtme <0>siit</0>",
|
||||||
|
"real_debrid_free_account_error": "Konto \"{{username}}\" on tasuta konto. Palun telli Real-Debrid",
|
||||||
|
"real_debrid_linked_message": "Konto \"{{username}}\" ühendatud",
|
||||||
|
"save_changes": "Salvesta muudatused",
|
||||||
|
"changes_saved": "Muudatused edukalt salvestatud",
|
||||||
|
"download_sources_description": "Hydra laeb allalaadimise lingid nendest allikatest. Allika URL peab olema otsene link .json failile, mis sisaldab allalaadimise linke.",
|
||||||
|
"validate_download_source": "Valideeri",
|
||||||
|
"remove_download_source": "Eemalda",
|
||||||
|
"add_download_source": "Lisa allikas",
|
||||||
|
"download_count_zero": "Allalaadimise valikuid pole",
|
||||||
|
"download_count_one": "{{countFormatted}} allalaadimise valik",
|
||||||
|
"download_count_other": "{{countFormatted}} allalaadimise valikut",
|
||||||
|
"download_source_url": "Allalaadimise allika URL",
|
||||||
|
"add_download_source_description": "Sisesta URL, mis sisaldab .json faili",
|
||||||
|
"download_source_up_to_date": "Ajakohane",
|
||||||
|
"download_source_errored": "Vigane",
|
||||||
|
"sync_download_sources": "Sünkroniseeri allikad",
|
||||||
|
"removed_download_source": "Allalaadimise allikas eemaldatud",
|
||||||
|
"added_download_source": "Allalaadimise allikas lisatud",
|
||||||
|
"download_sources_synced": "Kõik allalaadimise allikad on sünkroniseeritud",
|
||||||
|
"insert_valid_json_url": "Sisesta kehtiv JSON url",
|
||||||
|
"found_download_option_zero": "Allalaadimise valikuid ei leitud",
|
||||||
|
"found_download_option_one": "Leitud {{countFormatted}} allalaadimise valik",
|
||||||
|
"found_download_option_other": "Leitud {{countFormatted}} allalaadimise valikut",
|
||||||
|
"import": "Impordi",
|
||||||
|
"public": "Avalik",
|
||||||
|
"private": "Privaatne",
|
||||||
|
"friends_only": "Ainult sõpradele",
|
||||||
|
"privacy": "Privaatsus",
|
||||||
|
"profile_visibility": "Profiili nähtavus",
|
||||||
|
"profile_visibility_description": "Vali, kes saavad näha sinu profiili ja kogu",
|
||||||
|
"required_field": "See väli on kohustuslik",
|
||||||
|
"source_already_exists": "See allikas on juba lisatud",
|
||||||
|
"must_be_valid_url": "Allikas peab olema kehtiv URL",
|
||||||
|
"blocked_users": "Blokeeritud kasutajad",
|
||||||
|
"user_unblocked": "Kasutaja blokeering on eemaldatud",
|
||||||
|
"enable_achievement_notifications": "Kui saavutus avatakse"
|
||||||
|
},
|
||||||
|
"notifications": {
|
||||||
|
"download_complete": "Allalaadimine lõpetatud",
|
||||||
|
"game_ready_to_install": "{{title}} on valmis installimiseks",
|
||||||
|
"repack_list_updated": "Repackide nimekiri uuendatud",
|
||||||
|
"repack_count_one": "{{count}} repack lisatud",
|
||||||
|
"repack_count_other": "{{count}} repacki lisatud",
|
||||||
|
"new_update_available": "Versioon {{version}} saadaval",
|
||||||
|
"restart_to_install_update": "Taaskäivita Hydra uuenduse installimiseks",
|
||||||
|
"notification_achievement_unlocked_title": "Saavutus avatud mängus {{game}}",
|
||||||
|
"notification_achievement_unlocked_body": "{{achievement}} ja veel {{count}} avati"
|
||||||
|
},
|
||||||
|
"system_tray": {
|
||||||
|
"open": "Ava Hydra",
|
||||||
|
"quit": "Välju"
|
||||||
|
},
|
||||||
|
"game_card": {
|
||||||
|
"no_downloads": "Allalaadimisi pole saadaval"
|
||||||
|
},
|
||||||
|
"binary_not_found_modal": {
|
||||||
|
"title": "Programmid pole installitud",
|
||||||
|
"description": "Wine või Lutrise käivitusfaile ei leitud sinu süsteemist",
|
||||||
|
"instructions": "Kontrolli õiget viisi nende installimiseks oma Linuxi distrol, et mäng saaks normaalselt töötada"
|
||||||
|
},
|
||||||
|
"modal": {
|
||||||
|
"close": "Sulgemise nupp"
|
||||||
|
},
|
||||||
|
"forms": {
|
||||||
|
"toggle_password_visibility": "Lülita parooli nähtavust"
|
||||||
|
},
|
||||||
|
"user_profile": {
|
||||||
|
"amount_hours": "{{amount}} tundi",
|
||||||
|
"amount_minutes": "{{amount}} minutit",
|
||||||
|
"last_time_played": "Viimati mängitud {{period}}",
|
||||||
|
"activity": "Hiljutine aktiivsus",
|
||||||
|
"library": "Kogu",
|
||||||
|
"total_play_time": "Kogu mängitud aeg: {{amount}}",
|
||||||
|
"no_recent_activity_title": "Hmmm… siin pole midagi",
|
||||||
|
"no_recent_activity_description": "Sa pole hiljuti ühtegi mängu mänginud. On aeg seda muuta!",
|
||||||
|
"display_name": "Kuvatav nimi",
|
||||||
|
"saving": "Salvestamine",
|
||||||
|
"save": "Salvesta",
|
||||||
|
"edit_profile": "Muuda profiili",
|
||||||
|
"saved_successfully": "Edukalt salvestatud",
|
||||||
|
"try_again": "Palun proovi uuesti",
|
||||||
|
"sign_out_modal_title": "Oled sa kindel?",
|
||||||
|
"cancel": "Tühista",
|
||||||
|
"successfully_signed_out": "Edukalt välja logitud",
|
||||||
|
"sign_out": "Logi välja",
|
||||||
|
"playing_for": "Mängib {{amount}}",
|
||||||
|
"sign_out_modal_text": "Sinu kogu on seotud sinu praeguse kontoga. Välja logides pole sinu kogu enam nähtav ja edasist progressi ei salvestata. Jätkata väljalogimisega?",
|
||||||
|
"add_friends": "Lisa sõpru",
|
||||||
|
"add": "Lisa",
|
||||||
|
"friend_code": "Sõbrakood",
|
||||||
|
"see_profile": "Vaata profiili",
|
||||||
|
"sending": "Saatmine",
|
||||||
|
"friend_request_sent": "Sõbrakutse saadetud",
|
||||||
|
"friends": "Sõbrad",
|
||||||
|
"friends_list": "Sõbrade nimekiri",
|
||||||
|
"user_not_found": "Kasutajat ei leitud",
|
||||||
|
"block_user": "Blokeeri kasutaja",
|
||||||
|
"add_friend": "Lisa sõbraks",
|
||||||
|
"request_sent": "Kutse saadetud",
|
||||||
|
"request_received": "Kutse saadud",
|
||||||
|
"accept_request": "Võta kutse vastu",
|
||||||
|
"ignore_request": "Ignoreeri kutset",
|
||||||
|
"cancel_request": "Tühista kutse",
|
||||||
|
"undo_friendship": "Tühista sõprus",
|
||||||
|
"request_accepted": "Kutse vastu võetud",
|
||||||
|
"user_blocked_successfully": "Kasutaja edukalt blokeeritud",
|
||||||
|
"user_block_modal_text": "See blokeerib kasutaja {{displayName}}",
|
||||||
|
"blocked_users": "Blokeeritud kasutajad",
|
||||||
|
"unblock": "Eemalda blokeering",
|
||||||
|
"no_friends_added": "Sul pole veel lisatud sõpru",
|
||||||
|
"pending": "Ootel",
|
||||||
|
"no_pending_invites": "Sul pole ootel kutseid",
|
||||||
|
"no_blocked_users": "Sul pole blokeeritud kasutajaid",
|
||||||
|
"friend_code_copied": "Sõbrakood kopeeritud",
|
||||||
|
"undo_friendship_modal_text": "See tühistab sinu sõpruse kasutajaga {{displayName}}",
|
||||||
|
"privacy_hint": "Et muuta, kes seda näevad, mine <0>Seadetesse</0>",
|
||||||
|
"locked_profile": "See profiil on privaatne",
|
||||||
|
"image_process_failure": "Viga pildi töötlemisel",
|
||||||
|
"required_field": "See väli on kohustuslik",
|
||||||
|
"displayname_min_length": "Kuvatav nimi peab olema vähemalt 3 tähemärki pikk",
|
||||||
|
"displayname_max_length": "Kuvatav nimi võib olla maksimaalselt 50 tähemärki pikk",
|
||||||
|
"report_profile": "Teata sellest profiilist",
|
||||||
|
"report_reason": "Miks sa sellest profiilist teatad?",
|
||||||
|
"report_description": "Lisainfo",
|
||||||
|
"report_description_placeholder": "Lisainfo",
|
||||||
|
"report": "Teata",
|
||||||
|
"report_reason_hate": "Vaenukõne",
|
||||||
|
"report_reason_sexual_content": "Seksuaalne sisu",
|
||||||
|
"report_reason_violence": "Vägivald",
|
||||||
|
"report_reason_spam": "Rämpspost",
|
||||||
|
"report_reason_other": "Muu",
|
||||||
|
"profile_reported": "Profiilist teatatud",
|
||||||
|
"your_friend_code": "Sinu sõbrakood:",
|
||||||
|
"upload_banner": "Lae üles bänner",
|
||||||
|
"uploading_banner": "Bänneri üleslaadimine…",
|
||||||
|
"background_image_updated": "Bänner uuendatud"
|
||||||
|
},
|
||||||
|
"achievement": {
|
||||||
|
"achievement_unlocked": "Saavutus avatud",
|
||||||
|
"user_achievements": "{{displayName}} saavutused",
|
||||||
|
"your_achievements": "Sinu saavutused",
|
||||||
|
"unlocked_at": "Avatud:",
|
||||||
|
"subscription_needed": "Selle sisu nägemiseks on vaja Hydra Cloud tellimust",
|
||||||
|
"new_achievements_unlocked": "Avatud {{achievementCount}} uut saavutust {{gameCount}} mängust"
|
||||||
|
},
|
||||||
|
"tour": {
|
||||||
|
"subscription_tour_title": "Hydra Cloud Tellimus",
|
||||||
|
"subscribe_now": "Telli kohe",
|
||||||
|
"cloud_saving": "Pilvesalvestus",
|
||||||
|
"cloud_achievements": "Salvesta oma saavutused pilve",
|
||||||
|
"animated_profile_picture": "Animeeritud profiilipildid",
|
||||||
|
"premium_support": "Premium tugi",
|
||||||
|
"show_and_compare_achievements": "Näita ja võrdle oma saavutusi teiste kasutajatega",
|
||||||
|
"animated_profile_banner": "Animeeritud profiilibänner"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,6 @@
|
|||||||
"language_name": "فارسی",
|
"language_name": "فارسی",
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "پیشنهادی",
|
"featured": "پیشنهادی",
|
||||||
"trending": "پرطرفدار",
|
|
||||||
"surprise_me": "سوپرایزم کن",
|
"surprise_me": "سوپرایزم کن",
|
||||||
"no_results": "اتمامای پیدا نشد"
|
"no_results": "اتمامای پیدا نشد"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
"language_name": "Français",
|
"language_name": "Français",
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "En vedette",
|
"featured": "En vedette",
|
||||||
"trending": "Tendance",
|
|
||||||
"surprise_me": "Surprenez-moi",
|
"surprise_me": "Surprenez-moi",
|
||||||
"no_results": "Aucun résultat trouvé"
|
"no_results": "Aucun résultat trouvé"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
"language_name": "Magyar",
|
"language_name": "Magyar",
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Featured",
|
"featured": "Featured",
|
||||||
"trending": "Népszerű",
|
|
||||||
"surprise_me": "Lepj meg",
|
"surprise_me": "Lepj meg",
|
||||||
"no_results": "Nem található"
|
"no_results": "Nem található"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Unggulan",
|
"featured": "Unggulan",
|
||||||
"trending": "Sedang Tren",
|
|
||||||
"surprise_me": "Kejutkan saya",
|
"surprise_me": "Kejutkan saya",
|
||||||
"no_results": "Tidak ada hasil ditemukan"
|
"no_results": "Tidak ada hasil ditemukan"
|
||||||
},
|
},
|
||||||
@@ -178,9 +177,6 @@
|
|||||||
"download_count_zero": "Tidak ada unduhan dalam daftar",
|
"download_count_zero": "Tidak ada unduhan dalam daftar",
|
||||||
"download_count_one": "{{countFormatted}} unduhan dalam daftar",
|
"download_count_one": "{{countFormatted}} unduhan dalam daftar",
|
||||||
"download_count_other": "{{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",
|
"download_source_url": "URL sumber unduhan",
|
||||||
"add_download_source_description": "Masukkan URL yang berisi file .json",
|
"add_download_source_description": "Masukkan URL yang berisi file .json",
|
||||||
"download_source_up_to_date": "Terkini",
|
"download_source_up_to_date": "Terkini",
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ import ro from "./ro/translation.json";
|
|||||||
import ca from "./ca/translation.json";
|
import ca from "./ca/translation.json";
|
||||||
import kk from "./kk/translation.json";
|
import kk from "./kk/translation.json";
|
||||||
import cs from "./cs/translation.json";
|
import cs from "./cs/translation.json";
|
||||||
|
import nb from "./nb/translation.json";
|
||||||
|
import et from "./et/translation.json";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
"pt-BR": ptBR,
|
"pt-BR": ptBR,
|
||||||
@@ -48,4 +50,6 @@ export default {
|
|||||||
ca,
|
ca,
|
||||||
kk,
|
kk,
|
||||||
cs,
|
cs,
|
||||||
|
nb,
|
||||||
|
et,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
"language_name": "Italiano",
|
"language_name": "Italiano",
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "In primo piano",
|
"featured": "In primo piano",
|
||||||
"trending": "Di tendenza",
|
|
||||||
"surprise_me": "Sorprendimi",
|
"surprise_me": "Sorprendimi",
|
||||||
"no_results": "Nessun risultato trovato"
|
"no_results": "Nessun risultato trovato"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Ұсынылған",
|
"featured": "Ұсынылған",
|
||||||
"trending": "Трендте",
|
|
||||||
"surprise_me": "Таңқалдыр",
|
"surprise_me": "Таңқалдыр",
|
||||||
"no_results": "Ештеңе табылмады"
|
"no_results": "Ештеңе табылмады"
|
||||||
},
|
},
|
||||||
@@ -176,9 +175,6 @@
|
|||||||
"download_count_zero": "Жүктеулер тізімінде жоқ",
|
"download_count_zero": "Жүктеулер тізімінде жоқ",
|
||||||
"download_count_one": "{{countFormatted}} жүктеу тізімде",
|
"download_count_one": "{{countFormatted}} жүктеу тізімде",
|
||||||
"download_count_other": "{{countFormatted}} жүктеу тізімде",
|
"download_count_other": "{{countFormatted}} жүктеу тізімде",
|
||||||
"download_options_zero": "Қолжетімді жүктеулер жоқ",
|
|
||||||
"download_options_one": "{{countFormatted}} жүктеу нұсқасы қол жетімді",
|
|
||||||
"download_options_other": "{{countFormatted}} жүктеу нұсқалары қол жетімді",
|
|
||||||
"download_source_url": "Көздің сілтемесі",
|
"download_source_url": "Көздің сілтемесі",
|
||||||
"add_download_source_description": ".json файлға сілтемені қойыңыз",
|
"add_download_source_description": ".json файлға сілтемені қойыңыз",
|
||||||
"download_source_up_to_date": "Жаңартылған",
|
"download_source_up_to_date": "Жаңартылған",
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
"language_name": "한국어",
|
"language_name": "한국어",
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "추천",
|
"featured": "추천",
|
||||||
"trending": "인기",
|
|
||||||
"surprise_me": "무작위 추천",
|
"surprise_me": "무작위 추천",
|
||||||
"no_results": "결과 없음"
|
"no_results": "결과 없음"
|
||||||
},
|
},
|
||||||
|
|||||||
315
src/locales/nb/translation.json
Normal file
315
src/locales/nb/translation.json
Normal file
@@ -0,0 +1,315 @@
|
|||||||
|
{
|
||||||
|
"language_name": "Norsk Bokmål",
|
||||||
|
"app": {
|
||||||
|
"successfully_signed_in": "Logget inn vellykket"
|
||||||
|
},
|
||||||
|
"home": {
|
||||||
|
"featured": "Anbefalinger",
|
||||||
|
"surprise_me": "Overrask meg",
|
||||||
|
"no_results": "Ingen resultater fundet",
|
||||||
|
"start_typing": "Begynn å skrive for å søke...",
|
||||||
|
"hot": "Populært akkurat nå",
|
||||||
|
"weekly": "📅 De mest populære spillene denne uken"
|
||||||
|
},
|
||||||
|
"sidebar": {
|
||||||
|
"catalogue": "Katalog",
|
||||||
|
"downloads": "Nedlastinger",
|
||||||
|
"settings": "Innstillinger",
|
||||||
|
"my_library": "Mitt bibliotek",
|
||||||
|
"downloading_metadata": "{{title}} (Laster ned metadata…)",
|
||||||
|
"paused": "{{title}} (Satt på pause)",
|
||||||
|
"downloading": "{{title}} ({{percentage}} - Laster ned…)",
|
||||||
|
"filter": "Filtrér bibliotek",
|
||||||
|
"home": "Hjem",
|
||||||
|
"queued": "{{title}} (I køen)",
|
||||||
|
"game_has_no_executable": "Spillet har ikke noen kjørbar fil valgt",
|
||||||
|
"sign_in": "Logge inn",
|
||||||
|
"friends": "Venner"
|
||||||
|
},
|
||||||
|
"header": {
|
||||||
|
"search": "Søk efter spill",
|
||||||
|
"home": "Hjem",
|
||||||
|
"catalogue": "Katalog",
|
||||||
|
"downloads": "Nedlastinger",
|
||||||
|
"search_results": "Søkeresultater",
|
||||||
|
"settings": "Innstillinger",
|
||||||
|
"version_available_install": "Versjon {{version}} tilgjengelig. Klikk her for å gjenstarte og installere.",
|
||||||
|
"version_available_download": "Versjon {{version}} tilgjengelig. Klikk her for at laste ned."
|
||||||
|
},
|
||||||
|
"bottom_panel": {
|
||||||
|
"no_downloads_in_progress": "Ingen nedlastinger pågår",
|
||||||
|
"downloading_metadata": "Laster ned {{title}} metadata…",
|
||||||
|
"downloading": "Laster ned {{title}}… ({{percentage}} ferdig) - Fullstendig nedlastet {{eta}} - {{speed}}",
|
||||||
|
"calculating_eta": "Laster ned {{title}}… ({{percentage}} ferdig) - Regner ut resterende tid…",
|
||||||
|
"checking_files": "Sjekker {{title}} filer… ({{percentage}} ferdig)"
|
||||||
|
},
|
||||||
|
"catalogue": {
|
||||||
|
"next_page": "Neste side",
|
||||||
|
"previous_page": "Forrige side"
|
||||||
|
},
|
||||||
|
"game_details": {
|
||||||
|
"open_download_options": "Åpne nedlastingsmuligheter",
|
||||||
|
"download_options_zero": "Ingen nedlastingsmulighet",
|
||||||
|
"download_options_one": "{{count}} nedlastingsmulighet",
|
||||||
|
"download_options_other": "{{count}} nedlastingsmuligheter",
|
||||||
|
"updated_at": "Oppdatert {{updated_at}}",
|
||||||
|
"install": "Installere",
|
||||||
|
"resume": "Fortsett",
|
||||||
|
"pause": "Pause",
|
||||||
|
"cancel": "Kansellere",
|
||||||
|
"remove": "Fjern",
|
||||||
|
"space_left_on_disk": "{{space}} tilbake på harddisken",
|
||||||
|
"eta": "Konklusjon {{eta}}",
|
||||||
|
"calculating_eta": "Utregner resterende tid…",
|
||||||
|
"downloading_metadata": "Laster ned metadata…",
|
||||||
|
"filter": "Filtrér gjennpakkinger",
|
||||||
|
"requirements": "Systemkrav",
|
||||||
|
"minimum": "Mindste",
|
||||||
|
"recommended": "Anbefalet",
|
||||||
|
"paused": "Satt på pause",
|
||||||
|
"release_date": "Offentliggjort den {{date}}",
|
||||||
|
"publisher": "Gitt ut av {{publisher}}",
|
||||||
|
"hours": "timer",
|
||||||
|
"minutes": "minutter",
|
||||||
|
"amount_hours": "{{amount}} timer",
|
||||||
|
"amount_minutes": "{{amount}} minutter",
|
||||||
|
"accuracy": "{{accuracy}}% nøyaktighet",
|
||||||
|
"add_to_library": "Tilføy til biblioteket",
|
||||||
|
"remove_from_library": "Fjern fra biblioteket",
|
||||||
|
"no_downloads": "Ingen nedlastinger tilgjengelig",
|
||||||
|
"play_time": "Spilt i {{amount}}",
|
||||||
|
"last_time_played": "Sist spilt {{period}}",
|
||||||
|
"not_played_yet": "Du har ikke spilt {{title}} enda",
|
||||||
|
"next_suggestion": "Neste forslag",
|
||||||
|
"play": "Spil",
|
||||||
|
"deleting": "Sletter installatør…",
|
||||||
|
"close": "Lukk",
|
||||||
|
"playing_now": "Spiller nå",
|
||||||
|
"change": "Endre",
|
||||||
|
"repacks_modal_description": "Velg den gjennpakking du vil laste ned",
|
||||||
|
"select_folder_hint": "For å endre standard mappen, gå til <0>Innstillingene</0>",
|
||||||
|
"download_now": "Last ned nå",
|
||||||
|
"no_shop_details": "Kunne ikke modta butikksdetaljene.",
|
||||||
|
"download_options": "Nedlastingsmuligheter",
|
||||||
|
"download_path": "Nedlastingssti",
|
||||||
|
"previous_screenshot": "Forrige skjermbilde",
|
||||||
|
"next_screenshot": "Neste skjermbilde",
|
||||||
|
"screenshot": "Skjermbilde {{number}}",
|
||||||
|
"open_screenshot": "Åpen skjermbilde {{number}}",
|
||||||
|
"download_settings": "Nedlastingsinnstillinger",
|
||||||
|
"downloader": "Laster ned",
|
||||||
|
"select_executable": "Velg",
|
||||||
|
"no_executable_selected": "Ingen kjørbar fil valgt",
|
||||||
|
"open_folder": "Åpne mappe",
|
||||||
|
"open_download_location": "Se nedlastingede filer",
|
||||||
|
"create_shortcut": "Opprett snarvei på skrivebordet",
|
||||||
|
"remove_files": "Fjern filer",
|
||||||
|
"remove_from_library_title": "Er du sikker?",
|
||||||
|
"remove_from_library_description": "Dette vil fjerne {{game}} fra biblioteket ditt",
|
||||||
|
"options": "Valgmuligheter",
|
||||||
|
"executable_section_title": "Kjørbar fil",
|
||||||
|
"executable_section_description": "Sti til filen som skal brukes når det trykkes på \"Spill\"",
|
||||||
|
"downloads_secion_title": "Nedlastinger",
|
||||||
|
"downloads_section_description": "Sjekk for oppdateringer eller andre versjoner af dette spillet",
|
||||||
|
"danger_zone_section_title": "Faresonen",
|
||||||
|
"danger_zone_section_description": "Fjern dette spillet fra biblioteket ditt eller filene som har blitt lastet ned av Hydra",
|
||||||
|
"download_in_progress": "Nedlasting pågår",
|
||||||
|
"download_paused": "Nedlasting satt på pause",
|
||||||
|
"last_downloaded_option": "Siste nedlastingsmulighet",
|
||||||
|
"create_shortcut_success": "Opprettelse av snarvei vellykket",
|
||||||
|
"create_shortcut_error": "Feil under oprettelsen av snarvei",
|
||||||
|
"nsfw_content_title": "Dette spillet inneholder upassende innhold",
|
||||||
|
"nsfw_content_description": "{{title}} inneholder innhold som ikke passer til alle aldre. Er du sikker på at du vil fortsette?",
|
||||||
|
"allow_nsfw_content": "Fortsett",
|
||||||
|
"refuse_nsfw_content": "Gå tilbake",
|
||||||
|
"stats": "Statistikk",
|
||||||
|
"download_count": "Nedlastinger",
|
||||||
|
"player_count": "Aktive spillere",
|
||||||
|
"download_error": "Denne nedlastingsmulighet er ikke tilgjengelig",
|
||||||
|
"download": "Last ned",
|
||||||
|
"executable_path_in_use": "Kjørbar fil blir allerede brukt av \"{{game}}\"",
|
||||||
|
"warning": "Advarsel:",
|
||||||
|
"hydra_needs_to_remain_open": "Hydra skal forbli åpent for at denne nedlastingen kan gjennomføres. I tilfelle av at Hydra lukker før nedlastingen er ferdig, mister du fremskrittet ditt."
|
||||||
|
},
|
||||||
|
"activation": {
|
||||||
|
"title": "Aktivér Hydra",
|
||||||
|
"installation_id": "Installasjons ID:",
|
||||||
|
"enter_activation_code": "Inntast aktiveringskoden din",
|
||||||
|
"message": "Hvis du ikke vet hvor du skal spørre om dette, burde du ikke ha dette.",
|
||||||
|
"activate": "Aktivér",
|
||||||
|
"loading": "Innleser…"
|
||||||
|
},
|
||||||
|
"downloads": {
|
||||||
|
"resume": "Fortsett",
|
||||||
|
"pause": "Pause",
|
||||||
|
"eta": "Konklusjon {{eta}}",
|
||||||
|
"paused": "Satt på pause",
|
||||||
|
"verifying": "Verifiserer…",
|
||||||
|
"completed": "Ferdig",
|
||||||
|
"removed": "Ikke lastet ned",
|
||||||
|
"cancel": "Kansellér",
|
||||||
|
"filter": "Filtrér nedlastede spill",
|
||||||
|
"remove": "Fjern",
|
||||||
|
"downloading_metadata": "Laster ned metadata…",
|
||||||
|
"deleting": "Sletter installatør…",
|
||||||
|
"delete": "Fjern installatør",
|
||||||
|
"delete_modal_title": "Er du sikker?",
|
||||||
|
"delete_modal_description": "Dette vil fjerne alle installasjonsfilene fra datamaskinen din",
|
||||||
|
"install": "Installér",
|
||||||
|
"download_in_progress": "Pågår",
|
||||||
|
"queued_downloads": "Nedlastingskø",
|
||||||
|
"downloads_completed": "Gjennomførte",
|
||||||
|
"queued": "I kø",
|
||||||
|
"no_downloads_title": "Ganske tomt",
|
||||||
|
"no_downloads_description": "Du har ikke lastet ned noe med Hydra enda, men det er aldri for sent å begynne.",
|
||||||
|
"checking_files": "Undersøker filer…"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"downloads_path": "Nedlastingssti",
|
||||||
|
"change": "Oppdater",
|
||||||
|
"notifications": "Notifikasjoner",
|
||||||
|
"enable_download_notifications": "Når en nedlasting blir ferdig",
|
||||||
|
"enable_repack_list_notifications": "Når en ny gjennpakking bliver lagt til",
|
||||||
|
"real_debrid_api_token_label": "Real-Debrid API nøkkel",
|
||||||
|
"quit_app_instead_hiding": "Avslut Hydra i stedet for å minimere til prosesslinjen",
|
||||||
|
"launch_with_system": "Åpne Hydra ved oppstart av datamaskinen",
|
||||||
|
"general": "Generelt",
|
||||||
|
"behavior": "Oppførsel",
|
||||||
|
"download_sources": "Nedlastingskilder",
|
||||||
|
"language": "Språk",
|
||||||
|
"real_debrid_api_token": "API nøkkel",
|
||||||
|
"enable_real_debrid": "Slå på Real-Debrid",
|
||||||
|
"real_debrid_description": "Real-Debrid er en ubegrenset nedlaster som gør det mulig for deg å laste ned filer med en gang og med den beste utnyttelsen av internethastigheten din.",
|
||||||
|
"real_debrid_invalid_token": "Ugyldig API nøkkel",
|
||||||
|
"real_debrid_api_token_hint": "Du kan få API nøkkelen din <0>her</0>",
|
||||||
|
"real_debrid_free_account_error": "Brukeren \"{{username}}\" er en gratis bruker. Vennligst abboner på Real-Debrid",
|
||||||
|
"real_debrid_linked_message": "Brukeren \"{{username}}\" er forbunnet",
|
||||||
|
"save_changes": "Lagre endringer",
|
||||||
|
"changes_saved": "Lagring av endringer vellykket",
|
||||||
|
"download_sources_description": "Hydra vil hente nedlastingslenker fra disse kildene. Kilde URLen skal være en direkte lenke til en .json fil som inneholder nedlastingslenkene.",
|
||||||
|
"validate_download_source": "Validér",
|
||||||
|
"remove_download_source": "Fjern",
|
||||||
|
"add_download_source": "Legg til kilde",
|
||||||
|
"download_count_zero": "Ingen nedlastingsmuligheter",
|
||||||
|
"download_count_one": "{{countFormatted}} nedlastingsmulighet",
|
||||||
|
"download_count_other": "{{countFormatted}} nedlastingsmuligheter",
|
||||||
|
"download_source_url": "Last ned kilde URL",
|
||||||
|
"add_download_source_description": "Sett inn URLen som inneholder .json filen",
|
||||||
|
"download_source_up_to_date": "Oppdatert",
|
||||||
|
"download_source_errored": "Mislyktes",
|
||||||
|
"sync_download_sources": "Synkroniser kilder",
|
||||||
|
"removed_download_source": "Nedlastingskilde fjernet",
|
||||||
|
"added_download_source": "La til Nedlastingskilde",
|
||||||
|
"download_sources_synced": "Alle nedlastingskilder er synkroniserte",
|
||||||
|
"insert_valid_json_url": "Innsett en gyldig JSON url",
|
||||||
|
"found_download_option_zero": "Ingen nedlastingsmulighet funnet",
|
||||||
|
"found_download_option_one": "Fant {{countFormatted}} nedlastingsmulighet",
|
||||||
|
"found_download_option_other": "Fant {{countFormatted}} nedlastingsmuligheter",
|
||||||
|
"import": "Importer",
|
||||||
|
"public": "Offentlig",
|
||||||
|
"private": "Privat",
|
||||||
|
"friends_only": "Kun blant venner",
|
||||||
|
"privacy": "Privatliv",
|
||||||
|
"profile_visibility": "Synlighet av profil",
|
||||||
|
"profile_visibility_description": "Velg hvem som kan se profilen din og biblioteket ditt",
|
||||||
|
"required_field": "Dette feltet er påkrevet",
|
||||||
|
"source_already_exists": "Denne kilden har allerede blitt lagt til",
|
||||||
|
"must_be_valid_url": "Kilden må være en gyldig URL",
|
||||||
|
"blocked_users": "Blokerte brukere",
|
||||||
|
"user_unblocked": "Brukeren har blit avblokert"
|
||||||
|
},
|
||||||
|
"notifications": {
|
||||||
|
"download_complete": "Nedlasting ferdig",
|
||||||
|
"game_ready_to_install": "{{title}} er klar til å bli installert",
|
||||||
|
"repack_list_updated": "Gjennpakkingslisten er opdateret",
|
||||||
|
"repack_count_one": "{{count}} gjennpakking lagt til",
|
||||||
|
"repack_count_other": "{{count}} gjennpakkinger lagt til",
|
||||||
|
"new_update_available": "Versjon {{version}} tilgjengelig",
|
||||||
|
"restart_to_install_update": "Gjenstart Hydra for å installere oppdateringen"
|
||||||
|
},
|
||||||
|
"system_tray": {
|
||||||
|
"open": "Åpne Hydra",
|
||||||
|
"quit": "Avslutt"
|
||||||
|
},
|
||||||
|
"game_card": {
|
||||||
|
"no_downloads": "Ingen nedlastinger tilgjengelig"
|
||||||
|
},
|
||||||
|
"binary_not_found_modal": {
|
||||||
|
"title": "Programmer ikke installert",
|
||||||
|
"description": "Wine eller Lutris kjørbar ble ikke funnet på systemet ditt",
|
||||||
|
"instructions": "Sjekk den korrekte måten å installere noen av de, på Linux distributionen din, så spillet kan kjøre på vanlig måte"
|
||||||
|
},
|
||||||
|
"modal": {
|
||||||
|
"close": "Lukk knapp"
|
||||||
|
},
|
||||||
|
"forms": {
|
||||||
|
"toggle_password_visibility": "Skift synlighet af passord"
|
||||||
|
},
|
||||||
|
"user_profile": {
|
||||||
|
"amount_hours": "{{amount}} timer",
|
||||||
|
"amount_minutes": "{{amount}} minutter",
|
||||||
|
"last_time_played": "Sist spilt {{period}}",
|
||||||
|
"activity": "Seneste aktivitet",
|
||||||
|
"library": "Bibliotek",
|
||||||
|
"total_play_time": "Samlet spilltid: {{amount}}",
|
||||||
|
"no_recent_activity_title": "Hmmm… ikke noe her",
|
||||||
|
"no_recent_activity_description": "Du har ikke spilt noen spill for på det seneste. Det er det på tide at endre på!",
|
||||||
|
"display_name": "Brukernavn",
|
||||||
|
"saving": "Lagrer",
|
||||||
|
"save": "Lagre",
|
||||||
|
"edit_profile": "Rediger Profil",
|
||||||
|
"saved_successfully": "Lagring vellykket",
|
||||||
|
"try_again": "Vennligst, prøv igjen",
|
||||||
|
"sign_out_modal_title": "Er du sikker?",
|
||||||
|
"cancel": "Kansellér",
|
||||||
|
"successfully_signed_out": "Utlogging vellykket",
|
||||||
|
"sign_out": "Log ut",
|
||||||
|
"playing_for": "Spiller i {{amount}}",
|
||||||
|
"sign_out_modal_text": "Biblioteket ditt er sammenkobelt med den nåverende brukeren. Når du logger ut er biblioteket ditt ikke synlig lenger, og hvilken som helst form for fremskritt bliver ikke lagret. Vil du fortsette med å logge ut?",
|
||||||
|
"add_friends": "Legg til venner",
|
||||||
|
"add": "Legg til",
|
||||||
|
"friend_code": "Vennekode",
|
||||||
|
"see_profile": "Se profil",
|
||||||
|
"sending": "Sender",
|
||||||
|
"friend_request_sent": "Venneforespørsel sendt",
|
||||||
|
"friends": "Venner",
|
||||||
|
"friends_list": "Venneliste",
|
||||||
|
"user_not_found": "Bruker ikke funnet",
|
||||||
|
"block_user": "Blokkere bruker",
|
||||||
|
"add_friend": "Legg til venn",
|
||||||
|
"request_sent": "Forespørsel sendt",
|
||||||
|
"request_received": "Forespørsel modtatt",
|
||||||
|
"accept_request": "Akseptere forespørsel",
|
||||||
|
"ignore_request": "Ignorere forespørsel",
|
||||||
|
"cancel_request": "Kansellre forespørsel",
|
||||||
|
"undo_friendship": "Angre venskab",
|
||||||
|
"request_accepted": "Forespørsel akseptert",
|
||||||
|
"user_blocked_successfully": "Blokkering av bruker vellykket",
|
||||||
|
"user_block_modal_text": "Dette blokerer {{displayName}}",
|
||||||
|
"blocked_users": "Blokerte brukere",
|
||||||
|
"unblock": "Avblokere",
|
||||||
|
"no_friends_added": "Du har fortsatt ikke lagt til noen venner",
|
||||||
|
"pending": "Avventer",
|
||||||
|
"no_pending_invites": "Du har ingen avventende invitasjoner",
|
||||||
|
"no_blocked_users": "Du har ingen blokerte brukere",
|
||||||
|
"friend_code_copied": "Vennekode kopiert",
|
||||||
|
"undo_friendship_modal_text": "Dette vil angre venskapet ditt med {{displayName}}",
|
||||||
|
"privacy_hint": "For å justere på hvem som kan se dette, gå til <0>Innstillingene</0>",
|
||||||
|
"locked_profile": "Denne profilen er privat",
|
||||||
|
"image_process_failure": "Mislyktes under håndteringen av bildet",
|
||||||
|
"required_field": "Dette feltet er påkrevet",
|
||||||
|
"displayname_min_length": "Brukernavnet skal være minst 3 karakterer langt",
|
||||||
|
"displayname_max_length": "Brukernavnet skal være maksimalt 50 karakterer langt",
|
||||||
|
"report_profile": "Rapportér denne profilen",
|
||||||
|
"report_reason": "Hvorfor rapportérer du denne profilen?",
|
||||||
|
"report_description": "Mer informasjon",
|
||||||
|
"report_description_placeholder": "Mer informasjon",
|
||||||
|
"report": "Rapportér",
|
||||||
|
"report_reason_hate": "Hatytringer",
|
||||||
|
"report_reason_sexual_content": "Seksuelt innhold",
|
||||||
|
"report_reason_violence": "Vold",
|
||||||
|
"report_reason_spam": "Spam",
|
||||||
|
"report_reason_other": "Annet",
|
||||||
|
"profile_reported": "Profil rapportert"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,6 @@
|
|||||||
"language_name": "Nederlands",
|
"language_name": "Nederlands",
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Uitgelicht",
|
"featured": "Uitgelicht",
|
||||||
"trending": "Trending",
|
|
||||||
"surprise_me": "Verrasing",
|
"surprise_me": "Verrasing",
|
||||||
"no_results": "Geen resultaten gevonden"
|
"no_results": "Geen resultaten gevonden"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
"language_name": "Polski",
|
"language_name": "Polski",
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Wyróżnione",
|
"featured": "Wyróżnione",
|
||||||
"trending": "Trendujące",
|
|
||||||
"surprise_me": "Zaskocz mnie",
|
"surprise_me": "Zaskocz mnie",
|
||||||
"no_results": "Nie znaleziono wyników"
|
"no_results": "Nie znaleziono wyników"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,9 +5,9 @@
|
|||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Destaques",
|
"featured": "Destaques",
|
||||||
"trending": "Populares",
|
"hot": "Populares",
|
||||||
"hot": "🔥 Populares agora",
|
|
||||||
"weekly": "📅 Mais baixados da semana",
|
"weekly": "📅 Mais baixados da semana",
|
||||||
|
"achievements": "🏆 Pra platinar",
|
||||||
"surprise_me": "Surpreenda-me",
|
"surprise_me": "Surpreenda-me",
|
||||||
"no_results": "Nenhum resultado encontrado",
|
"no_results": "Nenhum resultado encontrado",
|
||||||
"start_typing": "Comece a digitar para pesquisar…"
|
"start_typing": "Comece a digitar para pesquisar…"
|
||||||
@@ -126,7 +126,42 @@
|
|||||||
"download": "Baixar",
|
"download": "Baixar",
|
||||||
"executable_path_in_use": "Executável em uso por \"{{game}}\"",
|
"executable_path_in_use": "Executável em uso por \"{{game}}\"",
|
||||||
"warning": "Aviso:",
|
"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."
|
"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.",
|
||||||
|
"achievements": "Conquistas",
|
||||||
|
"achievements_count": "Conquistas ({{unlockedCount}}/{{achievementsCount}})",
|
||||||
|
"cloud_save": "Salvamento em nuvem",
|
||||||
|
"cloud_save_description": "Matenha seu progresso na nuvem e continue de onde parou em qualquer dispositivo",
|
||||||
|
"backups": "Backups",
|
||||||
|
"install_backup": "Restaurar",
|
||||||
|
"delete_backup": "Apagar",
|
||||||
|
"create_backup": "Novo backup",
|
||||||
|
"last_backup_date": "Último backup em {{date}}",
|
||||||
|
"no_backup_preview": "Não foi possível encontrar nenhum salvamento para este jogo",
|
||||||
|
"restoring_backup": "Restaurando backup ({{progress}} concluído)…",
|
||||||
|
"uploading_backup": "Criando backup…",
|
||||||
|
"no_backups": "Você ainda não fez nenhum backup deste jogo",
|
||||||
|
"backup_uploaded": "Backup criado",
|
||||||
|
"backup_deleted": "Backup apagado",
|
||||||
|
"backup_restored": "Backup restaurado",
|
||||||
|
"see_all_achievements": "Ver todas as conquistas",
|
||||||
|
"sign_in_to_see_achievements": "Faça login para ver as conquistas",
|
||||||
|
"mapping_method_automatic": "Automático",
|
||||||
|
"mapping_method_manual": "Manual",
|
||||||
|
"mapping_method_label": "Método de mapeamento",
|
||||||
|
"files_automatically_mapped": "Arquivos automaticamente mapeados",
|
||||||
|
"no_backups_created": "Nenhum backup criado para este jogo",
|
||||||
|
"manage_files": "Gerenciar arquivos",
|
||||||
|
"loading_save_preview": "Buscando por arquivos de salvamento…",
|
||||||
|
"wine_prefix": "Prefixo Wine",
|
||||||
|
"wine_prefix_description": "O prefixo Wine que foi utilizado para instalar o jogo",
|
||||||
|
"no_download_option_info": "Sem informações disponíveis",
|
||||||
|
"backup_deletion_failed": "Falha ao apagar backup",
|
||||||
|
"max_number_of_artifacts_reached": "Número máximo de backups atingido para este jogo",
|
||||||
|
"achievements_not_sync": "Suas conquistas não estão sincronizadas",
|
||||||
|
"backup_from": "Backup de {{date}}",
|
||||||
|
"custom_backup_location_set": "Localização customizada selecionada",
|
||||||
|
"select_folder": "Selecione a pasta",
|
||||||
|
"manage_files_description": "Gerencie quais arquivos serão feitos backup"
|
||||||
},
|
},
|
||||||
"activation": {
|
"activation": {
|
||||||
"title": "Ativação",
|
"title": "Ativação",
|
||||||
@@ -168,7 +203,7 @@
|
|||||||
"enable_download_notifications": "Quando um download for concluído",
|
"enable_download_notifications": "Quando um download for concluído",
|
||||||
"enable_repack_list_notifications": "Quando a lista de repacks for atualizada",
|
"enable_repack_list_notifications": "Quando a lista de repacks for atualizada",
|
||||||
"real_debrid_api_token_label": "Token de API do Real-Debrid",
|
"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.",
|
"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",
|
"launch_with_system": "Iniciar o Hydra junto com o sistema",
|
||||||
"general": "Geral",
|
"general": "Geral",
|
||||||
"behavior": "Comportamento",
|
"behavior": "Comportamento",
|
||||||
@@ -190,9 +225,6 @@
|
|||||||
"download_count_zero": "Sem downloads na lista",
|
"download_count_zero": "Sem downloads na lista",
|
||||||
"download_count_one": "{{countFormatted}} download na lista",
|
"download_count_one": "{{countFormatted}} download na lista",
|
||||||
"download_count_other": "{{countFormatted}} downloads na lista",
|
"download_count_other": "{{countFormatted}} downloads na lista",
|
||||||
"download_options_zero": "Sem downloads disponíveis",
|
|
||||||
"download_options_one": "{{countFormatted}} download disponível",
|
|
||||||
"download_options_other": "{{countFormatted}} downloads disponíveis",
|
|
||||||
"download_source_url": "URL da fonte",
|
"download_source_url": "URL da fonte",
|
||||||
"add_download_source_description": "Insira a URL contendo o arquivo .json",
|
"add_download_source_description": "Insira a URL contendo o arquivo .json",
|
||||||
"download_source_up_to_date": "Sincronizada",
|
"download_source_up_to_date": "Sincronizada",
|
||||||
@@ -216,7 +248,8 @@
|
|||||||
"source_already_exists": "Essa fonte já foi adicionada",
|
"source_already_exists": "Essa fonte já foi adicionada",
|
||||||
"must_be_valid_url": "A fonte deve ser uma URL válida",
|
"must_be_valid_url": "A fonte deve ser uma URL válida",
|
||||||
"blocked_users": "Usuários bloqueados",
|
"blocked_users": "Usuários bloqueados",
|
||||||
"user_unblocked": "Usuário desbloqueado"
|
"user_unblocked": "Usuário desbloqueado",
|
||||||
|
"enable_achievement_notifications": "Quando uma conquista é desbloqueada"
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"download_complete": "Download concluído",
|
"download_complete": "Download concluído",
|
||||||
@@ -299,7 +332,6 @@
|
|||||||
"friend_code_copied": "Código de amigo copiado",
|
"friend_code_copied": "Código de amigo copiado",
|
||||||
"undo_friendship_modal_text": "Isso irá remover sua amizade com {{displayName}}",
|
"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>",
|
"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",
|
"image_process_failure": "Falha ao processar a imagem",
|
||||||
"required_field": "Este campo é obrigatório",
|
"required_field": "Este campo é obrigatório",
|
||||||
"displayname_min_length": "Nome de exibição deve ter pelo menos 3 caracteres",
|
"displayname_min_length": "Nome de exibição deve ter pelo menos 3 caracteres",
|
||||||
@@ -315,6 +347,28 @@
|
|||||||
"report_reason_violence": "Violência",
|
"report_reason_violence": "Violência",
|
||||||
"report_reason_spam": "Spam",
|
"report_reason_spam": "Spam",
|
||||||
"report_reason_other": "Outro",
|
"report_reason_other": "Outro",
|
||||||
"profile_reported": "Perfil reportado"
|
"profile_reported": "Perfil reportado",
|
||||||
|
"your_friend_code": "Seu código de amigo:",
|
||||||
|
"upload_banner": "Carregar banner",
|
||||||
|
"uploading_banner": "Carregando banner…",
|
||||||
|
"background_image_updated": "Imagem de fundo salva"
|
||||||
|
},
|
||||||
|
"achievement": {
|
||||||
|
"achievement_unlocked": "Conquista desbloqueada",
|
||||||
|
"your_achievements": "Suas Conquistas",
|
||||||
|
"user_achievements": "Conquistas de {{displayName}}",
|
||||||
|
"unlocked_at": "Desbloqueado em:",
|
||||||
|
"subscription_needed": "Você precisa de uma assinatura Hydra Cloud para visualizar este conteúdo",
|
||||||
|
"new_achievements_unlocked": "{{achievementCount}} novas conquistas de {{gameCount}} jogos"
|
||||||
|
},
|
||||||
|
"tour": {
|
||||||
|
"subscription_tour_title": "Assinatura Hydra Cloud",
|
||||||
|
"subscribe_now": "Inscreva-se agora",
|
||||||
|
"cloud_achievements": "Salvamento de conquistas em nuvem",
|
||||||
|
"animated_profile_picture": "Fotos de perfil animadas",
|
||||||
|
"premium_support": "Suporte Premium",
|
||||||
|
"show_and_compare_achievements": "Exiba e compare suas conquistas com outros usuários",
|
||||||
|
"animated_profile_banner": "Banner animado no perfil",
|
||||||
|
"cloud_saving": "Saves de jogos em nuvem"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,10 +5,12 @@
|
|||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Destaques",
|
"featured": "Destaques",
|
||||||
"trending": "Populares",
|
"hot": "Populares",
|
||||||
|
"weekly": "📅 Mais descarregados esta semana",
|
||||||
|
"achievements": "🏆 Para completar",
|
||||||
"surprise_me": "Surpreende-me",
|
"surprise_me": "Surpreende-me",
|
||||||
"no_results": "Nenhum resultado encontrado",
|
"no_results": "Nenhum resultado encontrado",
|
||||||
"start_typing": "Comece a digitar para pesquisar…"
|
"start_typing": "Começa a escrever para pesquisar…"
|
||||||
},
|
},
|
||||||
"sidebar": {
|
"sidebar": {
|
||||||
"catalogue": "Catálogo",
|
"catalogue": "Catálogo",
|
||||||
@@ -16,13 +18,14 @@
|
|||||||
"settings": "Definições",
|
"settings": "Definições",
|
||||||
"my_library": "Biblioteca",
|
"my_library": "Biblioteca",
|
||||||
"downloading_metadata": "{{title}} (A transferir metadados…)",
|
"downloading_metadata": "{{title}} (A transferir metadados…)",
|
||||||
"paused": "{{title}} (Pausado)",
|
"paused": "{{title}} (Em pausa)",
|
||||||
"downloading": "{{title}} ({{percentage}} - A transferir…)",
|
"downloading": "{{title}} ({{percentage}} - A transferir…)",
|
||||||
"filter": "Procurar",
|
"filter": "Procurar",
|
||||||
"home": "Início",
|
"home": "Início",
|
||||||
"queued": "{{title}} (Na fila)",
|
"queued": "{{title}} (Na fila)",
|
||||||
"game_has_no_executable": "Jogo não tem executável selecionado",
|
"game_has_no_executable": "O jogo não tem um executável selecionado",
|
||||||
"sign_in": "Iniciar sessão"
|
"sign_in": "Iniciar sessão",
|
||||||
|
"friends": "Amigos"
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
"search": "Procurar jogos",
|
"search": "Procurar jogos",
|
||||||
@@ -31,8 +34,8 @@
|
|||||||
"search_results": "Resultados da pesquisa",
|
"search_results": "Resultados da pesquisa",
|
||||||
"settings": "Definições",
|
"settings": "Definições",
|
||||||
"home": "Início",
|
"home": "Início",
|
||||||
"version_available_install": "Versão {{version}} disponível. Clique aqui para reiniciar e instalar.",
|
"version_available_install": "Versão {{version}} disponível. Clica aqui para reiniciar e instalar.",
|
||||||
"version_available_download": "Versão {{version}} disponível. Clique aqui para fazer o download."
|
"version_available_download": "Versão {{version}} disponível. Clica aqui para fazer o download."
|
||||||
},
|
},
|
||||||
"bottom_panel": {
|
"bottom_panel": {
|
||||||
"no_downloads_in_progress": "Sem transferências em andamento",
|
"no_downloads_in_progress": "Sem transferências em andamento",
|
||||||
@@ -47,19 +50,19 @@
|
|||||||
"download_options_one": "{{count}} opção de transferência",
|
"download_options_one": "{{count}} opção de transferência",
|
||||||
"download_options_other": "{{count}} opções de transferência",
|
"download_options_other": "{{count}} opções de transferência",
|
||||||
"updated_at": "Atualizado a {{updated_at}}",
|
"updated_at": "Atualizado a {{updated_at}}",
|
||||||
"resume": "Retomar",
|
"resume": "Continuar",
|
||||||
"pause": "Pausar",
|
"pause": "Colocar em pausa",
|
||||||
"cancel": "Cancelar",
|
"cancel": "Cancelar",
|
||||||
"remove": "Remover",
|
"remove": "Remover",
|
||||||
"space_left_on_disk": "{{space}} livres no disco",
|
"space_left_on_disk": "{{space}} livres no disco",
|
||||||
"eta": "Conclusão {{eta}}",
|
"eta": "Conclusão {{eta}}",
|
||||||
"calculating_eta": "A calcular tempo restante…",
|
"calculating_eta": "A calcular tempo restante…",
|
||||||
"downloading_metadata": "A transferir metadados…",
|
"downloading_metadata": "A transferir metadados…",
|
||||||
"filter": "Filtrar repacks",
|
"filter": "Filtrar opções de transferência",
|
||||||
"requirements": "Requisitos do sistema",
|
"requirements": "Requisitos do sistema",
|
||||||
"minimum": "Mínimos",
|
"minimum": "Mínimos",
|
||||||
"recommended": "Recomendados",
|
"recommended": "Recomendados",
|
||||||
"paused": "Pausado",
|
"paused": "Em pausa",
|
||||||
"release_date": "Lançado em {{date}}",
|
"release_date": "Lançado em {{date}}",
|
||||||
"publisher": "Publicado por {{publisher}}",
|
"publisher": "Publicado por {{publisher}}",
|
||||||
"hours": "horas",
|
"hours": "horas",
|
||||||
@@ -70,24 +73,24 @@
|
|||||||
"add_to_library": "Adicionar à biblioteca",
|
"add_to_library": "Adicionar à biblioteca",
|
||||||
"remove_from_library": "Remover da biblioteca",
|
"remove_from_library": "Remover da biblioteca",
|
||||||
"no_downloads": "Nenhuma transferência disponível",
|
"no_downloads": "Nenhuma transferência disponível",
|
||||||
"play_time": "Jogou por {{amount}}",
|
"play_time": "Jogaste por {{amount}}",
|
||||||
"next_suggestion": "Próxima sugestão",
|
"next_suggestion": "Próxima sugestão",
|
||||||
"install": "Instalar",
|
"install": "Instalar",
|
||||||
"last_time_played": "Última sessão {{period}}",
|
"last_time_played": "Última sessão {{period}}",
|
||||||
"play": "Jogar",
|
"play": "Jogar",
|
||||||
"not_played_yet": "Ainda não jogou {{title}}",
|
"not_played_yet": "Ainda não jogaste {{title}}",
|
||||||
"close": "Fechar",
|
"close": "Fechar",
|
||||||
"deleting": "A eliminar instalador…",
|
"deleting": "A eliminar instalador…",
|
||||||
"playing_now": "A jogar agora",
|
"playing_now": "A jogar agora",
|
||||||
"change": "Explorar",
|
"change": "Explorar",
|
||||||
"repacks_modal_description": "Escolha o repack do jogo que deseja transferir",
|
"repacks_modal_description": "Escolhe a versão do jogo que desejas transferir",
|
||||||
"select_folder_hint": "Para trocar o diretório padrão, aceda à <0>Tela de Definições</0>",
|
"select_folder_hint": "Para alterar o local predefinido, acede às <0>Definições</0>",
|
||||||
"download_now": "Iniciar transferência",
|
"download_now": "Iniciar transferência",
|
||||||
"no_shop_details": "Não foi possível obter os detalhes da loja.",
|
"no_shop_details": "Não foi possível obter os detalhes da loja.",
|
||||||
"download_options": "Opções de transferência",
|
"download_options": "Opções de transferência",
|
||||||
"download_path": "Diretório de transferência",
|
"download_path": "Local de transferência",
|
||||||
"previous_screenshot": "Captura de ecrã anterior",
|
"previous_screenshot": "Captura de ecrã anterior",
|
||||||
"next_screenshot": "Próxima captura de ecrã",
|
"next_screenshot": "Captura de ecrã seguinte",
|
||||||
"screenshot": "Captura de ecrã {{number}}",
|
"screenshot": "Captura de ecrã {{number}}",
|
||||||
"open_screenshot": "Ver captura de ecrã {{number}}",
|
"open_screenshot": "Ver captura de ecrã {{number}}",
|
||||||
"download_settings": "Definições de transferência",
|
"download_settings": "Definições de transferência",
|
||||||
@@ -99,65 +102,104 @@
|
|||||||
"create_shortcut": "Criar atalho no ambiente de trabalho",
|
"create_shortcut": "Criar atalho no ambiente de trabalho",
|
||||||
"remove_files": "Remover ficheiros",
|
"remove_files": "Remover ficheiros",
|
||||||
"options": "Gerir",
|
"options": "Gerir",
|
||||||
"remove_from_library_description": "Isto irá remover {{game}} da sua biblioteca",
|
"remove_from_library_description": "Isto vai remover {{game}} da tua biblioteca",
|
||||||
"remove_from_library_title": "Tem a certeza?",
|
"remove_from_library_title": "Tens a certeza?",
|
||||||
"executable_section_title": "Executável",
|
"executable_section_title": "Executável",
|
||||||
"executable_section_description": "O caminho do ficheiro que será executado ao clicar em \"Jogar\"",
|
"executable_section_description": "O caminho do ficheiro que vai ser executado ao clicar em \"Jogar\"",
|
||||||
"downloads_secion_title": "Transferências",
|
"downloads_secion_title": "Transferências",
|
||||||
"downloads_section_description": "Confira atualizações ou versões diferentes para este mesmo título",
|
"downloads_section_description": "Encontra atualizações ou versões diferentes para este mesmo título",
|
||||||
"danger_zone_section_title": "Zona de perigo",
|
"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",
|
"danger_zone_section_description": "Remove o jogo da tua biblioteca ou os ficheiros que foram transferidos pelo Hydra",
|
||||||
"download_in_progress": "Transferência em andamento",
|
"download_in_progress": "Transferência em andamento",
|
||||||
"download_paused": "Transferência pausada",
|
"download_paused": "Transferência em pausa",
|
||||||
"last_downloaded_option": "Última opção transferida",
|
"last_downloaded_option": "Última opção transferida",
|
||||||
"create_shortcut_success": "Atalho criado com sucesso",
|
"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. Desejas continuar?",
|
||||||
|
"allow_nsfw_content": "Continuar",
|
||||||
|
"refuse_nsfw_content": "Voltar",
|
||||||
|
"stats": "Estatísticas",
|
||||||
|
"download_count": "Transferências",
|
||||||
|
"player_count": "Jogadores ativos",
|
||||||
|
"download_error": "Esta opção de transferência falhou",
|
||||||
"download": "Transferir",
|
"download": "Transferir",
|
||||||
"executable_path_in_use": "Executável em uso por \"{{game}}\"",
|
"executable_path_in_use": "Executável em uso por \"{{game}}\"",
|
||||||
"warning": "Aviso:",
|
"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."
|
"hydra_needs_to_remain_open": "para esta transferência, o Hydra precisa de ficar aberto até a conclusão. Caso o Hydra encerre antes da transferência terminar, vais perder o teu progresso.",
|
||||||
|
"achievements": "Conquistas",
|
||||||
|
"achievements_count": "Conquistas ({{unlockedCount}}/{{achievementsCount}})",
|
||||||
|
"cloud_save": "Gravação na nuvem",
|
||||||
|
"cloud_save_description": "Mantém o teu progresso guardado na nuvem e continua de onde paraste em qualquer dispositivo",
|
||||||
|
"backups": "Backups",
|
||||||
|
"install_backup": "Restaurar",
|
||||||
|
"delete_backup": "Apagar",
|
||||||
|
"create_backup": "Novo backup",
|
||||||
|
"last_backup_date": "Último backup realizado em {{date}}",
|
||||||
|
"no_backup_preview": "Não foi possível encontrar nenhum ficheiro de gravação para este jogo",
|
||||||
|
"restoring_backup": "A restaurar backup ({{progress}} concluído)…",
|
||||||
|
"uploading_backup": "A criar backup…",
|
||||||
|
"no_backups": "Ainda não fizeste nenhum backup deste jogo",
|
||||||
|
"backup_uploaded": "Backup criado",
|
||||||
|
"backup_deleted": "Backup apagado",
|
||||||
|
"backup_restored": "Backup restaurado",
|
||||||
|
"see_all_achievements": "Ver todas as conquistas",
|
||||||
|
"sign_in_to_see_achievements": "Faz login para vez as conquistas",
|
||||||
|
"mapping_method_automatic": "Automático",
|
||||||
|
"mapping_method_manual": "Manual",
|
||||||
|
"mapping_method_label": "Modo de mapeamento",
|
||||||
|
"files_automatically_mapped": "Ficheiros automaticamente mapeados",
|
||||||
|
"no_backups_created": "Nenhum backup criado para este jogo",
|
||||||
|
"manage_files": "Gerir ficheiros",
|
||||||
|
"loading_save_preview": "A procurar ficheiros de gravação…",
|
||||||
|
"wine_prefix": "Prefixo Wine",
|
||||||
|
"wine_prefix_description": "O prefixo Wine que foi utilizado para instalar o jogo",
|
||||||
|
"no_download_option_info": "Sem informações disponíveis",
|
||||||
|
"backup_deletion_failed": "Falha ao apagar o backup",
|
||||||
|
"max_number_of_artifacts_reached": "Número máximo de backups atingido para este jogo",
|
||||||
|
"achievements_not_sync": "As tuas conquistas não estão sincronizadas"
|
||||||
},
|
},
|
||||||
"activation": {
|
"activation": {
|
||||||
"title": "Ativação",
|
"title": "Ativação",
|
||||||
"installation_id": "ID da instalação:",
|
"installation_id": "ID da instalação:",
|
||||||
"enter_activation_code": "Insira o seu código de ativação",
|
"enter_activation_code": "Insere o teu código de ativação",
|
||||||
"message": "Se não sabe onde conseguir o código, talvez não devesse estar aqui.",
|
"message": "Se não souberes onde conseguir o código, talvez não devias estar aqui.",
|
||||||
"activate": "Ativar",
|
"activate": "Ativar",
|
||||||
"loading": "A carregar…"
|
"loading": "A carregar…"
|
||||||
},
|
},
|
||||||
"downloads": {
|
"downloads": {
|
||||||
"resume": "Retomar",
|
"resume": "Continuar",
|
||||||
"pause": "Pausar",
|
"pause": "Colocar em pausa",
|
||||||
"eta": "Conclusão {{eta}}",
|
"eta": "Conclusão {{eta}}",
|
||||||
"paused": "Pausado",
|
"paused": "Em pausa",
|
||||||
"verifying": "A verificar…",
|
"verifying": "A verificar…",
|
||||||
"completed": "Concluído",
|
"completed": "Concluído",
|
||||||
"removed": "Cancelado",
|
"removed": "Cancelado",
|
||||||
"cancel": "Cancelar",
|
"cancel": "Cancelar",
|
||||||
"filter": "Filtrar jogos transferidos",
|
"filter": "Filtrar jogos descarregados",
|
||||||
"remove": "Remover",
|
"remove": "Remover",
|
||||||
"downloading_metadata": "A transferir metadados…",
|
"downloading_metadata": "A transferir metadados…",
|
||||||
"delete": "Remover instalador",
|
"delete": "Remover instalador",
|
||||||
"delete_modal_description": "Isto removerá todos os ficheiros de instalação do seu computador",
|
"delete_modal_description": "Isto vai remover todos os ficheiros de instalação do teu computador",
|
||||||
"delete_modal_title": "Tem a certeza?",
|
"delete_modal_title": "Tens a certeza?",
|
||||||
"deleting": "A eliminar instalador…",
|
"deleting": "A remover o instalador…",
|
||||||
"install": "Instalar",
|
"install": "Instalar",
|
||||||
"download_in_progress": "A transferir agora",
|
"download_in_progress": "A descarregar agora",
|
||||||
"queued_downloads": "Na fila",
|
"queued_downloads": "Na fila",
|
||||||
"downloads_completed": "Concluído",
|
"downloads_completed": "Concluído",
|
||||||
"queued": "Na fila",
|
"queued": "Na fila",
|
||||||
"no_downloads_title": "Nada por aqui…",
|
"no_downloads_title": "Nada por aqui…",
|
||||||
"no_downloads_description": "Ainda não transferiu nada pelo Hydra, mas nunca é tarde para começar.",
|
"no_downloads_description": "Ainda não descarregaste nada pelo Hydra, mas nunca é tarde para começar.",
|
||||||
"checking_files": "A verificar ficheiros…"
|
"checking_files": "A verificar ficheiros…"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"downloads_path": "Diretório das transferências",
|
"downloads_path": "Local das transferências",
|
||||||
"change": "Explorar...",
|
"change": "Procurar...",
|
||||||
"notifications": "Notificações",
|
"notifications": "Notificações",
|
||||||
"enable_download_notifications": "Quando uma transferência for concluída",
|
"enable_download_notifications": "Quando uma transferência for concluída",
|
||||||
"enable_repack_list_notifications": "Quando a lista de repacks for atualizada",
|
"enable_repack_list_notifications": "Quando a lista de repacks for atualizada",
|
||||||
"real_debrid_api_token_label": "Token de API do Real-Debrid",
|
"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.",
|
"quit_app_instead_hiding": "Encerrar o Hydra em vez de apenas minimizá-lo ao fechar",
|
||||||
"launch_with_system": "Iniciar o Hydra com o sistema",
|
"launch_with_system": "Iniciar o Hydra com o sistema",
|
||||||
"general": "Geral",
|
"general": "Geral",
|
||||||
"behavior": "Comportamento",
|
"behavior": "Comportamento",
|
||||||
@@ -165,60 +207,72 @@
|
|||||||
"language": "Idioma",
|
"language": "Idioma",
|
||||||
"real_debrid_api_token": "Token de API",
|
"real_debrid_api_token": "Token de API",
|
||||||
"enable_real_debrid": "Ativar Real-Debrid",
|
"enable_real_debrid": "Ativar Real-Debrid",
|
||||||
"real_debrid_api_token_hint": "Pode obter o seu token de API <0>aqui</0>",
|
"real_debrid_api_token_hint": "Podes obter o teu 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_description": "O Real-Debrid é um downloader sem restrições que permite descarregar ficheiros instantaneamente e com a melhor velocidade da tua Internet.",
|
||||||
"real_debrid_invalid_token": "Token de API inválido",
|
"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_free_account_error": "A conta \"{{username}}\" é uma conta gratuita. Por favor, subscreve o Real-Debrid",
|
||||||
"real_debrid_linked_message": "Conta \"{{username}}\" vinculada",
|
"real_debrid_linked_message": "Conta \"{{username}}\" associada",
|
||||||
"save_changes": "Guardar alterações",
|
"save_changes": "Guardar alterações",
|
||||||
"changes_saved": "Definições guardadas com sucesso",
|
"changes_saved": "Alteraçõ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.",
|
"download_sources_description": "O Hydra vai procurar links de download em todas as fontes ativadas. O URL da fonte deve ser um link direto para um ficheiro .json que contenha uma lista de links.",
|
||||||
"validate_download_source": "Validar",
|
"validate_download_source": "Validar",
|
||||||
"remove_download_source": "Remover",
|
"remove_download_source": "Remover",
|
||||||
"add_download_source": "Adicionar fonte",
|
"add_download_source": "Adicionar fonte",
|
||||||
"download_count_zero": "Sem transferências na lista",
|
"download_count_zero": "Sem downloads na lista",
|
||||||
"download_count_one": "{{countFormatted}} transferência na lista",
|
"download_count_one": "{{countFormatted}} download na lista",
|
||||||
"download_count_other": "{{countFormatted}} transferências na lista",
|
"download_count_other": "{{countFormatted}} downloads na lista",
|
||||||
"download_options_zero": "Sem transferências disponíveis",
|
"download_options_zero": "Sem downloads disponíveis",
|
||||||
"download_options_one": "{{countFormatted}} transferência disponível",
|
"download_options_one": "{{countFormatted}} download disponível",
|
||||||
"download_options_other": "{{countFormatted}} transferências disponíveis",
|
"download_options_other": "{{countFormatted}} downloads disponíveis",
|
||||||
"download_source_url": "URL da fonte",
|
"download_source_url": "URL da fonte",
|
||||||
"add_download_source_description": "Insira o URL contendo o arquivo .json",
|
"add_download_source_description": "Insere o URL que contém o ficheiro .json",
|
||||||
"download_source_up_to_date": "Sincronizada",
|
"download_source_up_to_date": "Sincronizada",
|
||||||
"download_source_errored": "Falhou",
|
"download_source_errored": "Falhou",
|
||||||
"sync_download_sources": "Sincronizar",
|
"sync_download_sources": "Sincronizar",
|
||||||
"removed_download_source": "Fonte removida",
|
"removed_download_source": "Fonte removida",
|
||||||
"added_download_source": "Fonte adicionada",
|
"added_download_source": "Fonte adicionada",
|
||||||
"download_sources_synced": "As fontes foram sincronizadas",
|
"download_sources_synced": "As fontes foram sincronizadas",
|
||||||
"insert_valid_json_url": "Insira o URL de um JSON válido",
|
"insert_valid_json_url": "Insere o URL de um JSON válido",
|
||||||
"found_download_option_zero": "Nenhuma opção de transferência encontrada",
|
"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_one": "{{countFormatted}} opção de transferência encontrada",
|
||||||
"found_download_option_other": "{{countFormatted}} opções de transferências encontradas",
|
"found_download_option_other": "{{countFormatted}} opções de transferência encontradas",
|
||||||
"import": "Importar"
|
"import": "Importar",
|
||||||
|
"privacy": "Privacidade",
|
||||||
|
"private": "Privado",
|
||||||
|
"friends_only": "Apenas amigos",
|
||||||
|
"public": "Público",
|
||||||
|
"profile_visibility": "Visibilidade do perfil",
|
||||||
|
"profile_visibility_description": "Escolhe quem pode ver o teu 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 um URL válido",
|
||||||
|
"blocked_users": "Utilizadores bloqueados",
|
||||||
|
"user_unblocked": "Utilizador desbloqueado",
|
||||||
|
"enable_achievement_notifications": "Quando uma conquista é desbloqueada"
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"download_complete": "Transferência concluída",
|
"download_complete": "Transferência concluída",
|
||||||
"game_ready_to_install": "{{title}} está pronto para ser descarregado",
|
"game_ready_to_install": "{{title}} está pronto para ser instalado",
|
||||||
"repack_list_updated": "Lista de repacks atualizada",
|
"repack_list_updated": "Lista de repacks atualizada",
|
||||||
"repack_count_one": "{{count}} novo repack",
|
"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",
|
"new_update_available": "Versão {{version}} disponível",
|
||||||
"restart_to_install_update": "Reinicie o Hydra para instalar a nova versão"
|
"restart_to_install_update": "Reinicia o Hydra para instalar a nova versão"
|
||||||
},
|
},
|
||||||
"system_tray": {
|
"system_tray": {
|
||||||
"open": "Abrir Hydra",
|
"open": "Abrir o Hydra",
|
||||||
"quit": "Fechar"
|
"quit": "Sair"
|
||||||
},
|
},
|
||||||
"game_card": {
|
"game_card": {
|
||||||
"no_downloads": "Sem transferências disponíveis"
|
"no_downloads": "Sem downloads disponíveis"
|
||||||
},
|
},
|
||||||
"binary_not_found_modal": {
|
"binary_not_found_modal": {
|
||||||
"title": "Programas não instalados",
|
"title": "Programas não instalados",
|
||||||
"description": "Os executáveis do Wine ou Lutris não foram encontrados em seu sistema.",
|
"description": "Os executáveis do Wine ou Lutris não foram encontrados no teu sistema.",
|
||||||
"instructions": "Verifique a forma correta de instalar algum deles na sua distro Linux, garantindo assim a execução normal do jogo."
|
"instructions": "Verifica a forma correta de instalar algum deles na tua distribuição Linux, para garantir a execução normal do jogo"
|
||||||
},
|
},
|
||||||
"catalogue": {
|
"catalogue": {
|
||||||
"next_page": "Próxima página",
|
"next_page": "Página seguinte",
|
||||||
"previous_page": "Página anterior"
|
"previous_page": "Página anterior"
|
||||||
},
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
@@ -231,24 +285,24 @@
|
|||||||
"amount_hours": "{{amount}} horas",
|
"amount_hours": "{{amount}} horas",
|
||||||
"amount_minutes": "{{amount}} minutos",
|
"amount_minutes": "{{amount}} minutos",
|
||||||
"last_time_played": "Última sessão {{period}}",
|
"last_time_played": "Última sessão {{period}}",
|
||||||
"activity": "Atividades recentes",
|
"activity": "Atividade recente",
|
||||||
"library": "Biblioteca",
|
"library": "Biblioteca",
|
||||||
"total_play_time": "Tempo total de jogo: {{amount}}",
|
"total_play_time": "Tempo total de jogo: {{amount}}",
|
||||||
"no_recent_activity_title": "Hmmm… nada por aqui",
|
"no_recent_activity_title": "Hmmm… não há nada por aqui",
|
||||||
"no_recent_activity_description": "Parece que não jogaste nada recentemente. Que tal começar agora?",
|
"no_recent_activity_description": "Parece que não jogaste nada recentemente. Que tal começar agora?",
|
||||||
"display_name": "Nome de exibição",
|
"display_name": "Nome de apresentação",
|
||||||
"saving": "a guardar…",
|
"saving": "A guardar…",
|
||||||
"save": "Guardar",
|
"save": "Guardar",
|
||||||
"edit_profile": "Editar perfil",
|
"edit_profile": "Editar perfil",
|
||||||
"saved_successfully": "Guardado com sucesso",
|
"saved_successfully": "Guardado com sucesso",
|
||||||
"try_again": "Por favor, tenta novamente",
|
"try_again": "Por favor, tenta novamente",
|
||||||
"cancel": "Cancelar",
|
"cancel": "Cancelar",
|
||||||
"successfully_signed_out": "Terminado com sucesso",
|
"successfully_signed_out": "Sessão terminada com sucesso",
|
||||||
"sign_out": "Terminar sessão",
|
"sign_out": "Terminar sessão",
|
||||||
"sign_out_modal_title": "Tens a certeza?",
|
"sign_out_modal_title": "Desejas mesmo terminar sessão?",
|
||||||
"playing_for": "A jogar há {{amount}}",
|
"playing_for": "A jogar por {{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?",
|
"sign_out_modal_text": "A tua biblioteca de jogos está associada à conta atual. Ao terminar sessão, a tua biblioteca não irá aparecer mais no Hydra e qualquer progresso não será guardado. Desejas continuar?",
|
||||||
"add_friends": "Adicionar Amigos",
|
"add_friends": "Adicionar amigos",
|
||||||
"friend_code": "Código de amigo",
|
"friend_code": "Código de amigo",
|
||||||
"see_profile": "Ver perfil",
|
"see_profile": "Ver perfil",
|
||||||
"friend_request_sent": "Pedido de amizade enviado",
|
"friend_request_sent": "Pedido de amizade enviado",
|
||||||
@@ -270,11 +324,49 @@
|
|||||||
"user_block_modal_text": "Bloquear {{displayName}}",
|
"user_block_modal_text": "Bloquear {{displayName}}",
|
||||||
"blocked_users": "Utilizadores bloqueados",
|
"blocked_users": "Utilizadores bloqueados",
|
||||||
"unblock": "Desbloquear",
|
"unblock": "Desbloquear",
|
||||||
"no_friends_added": "Ainda não adicionaste amigos",
|
"no_friends_added": "Ainda não adicionaste nenhum amigo",
|
||||||
"pending": "Pendentes",
|
"pending": "Pendentes",
|
||||||
"no_pending_invites": "Não tens convites de amizade pendentes",
|
"no_pending_invites": "Não tens pedidos de amizade pendentes",
|
||||||
"no_blocked_users": "Não tens nenhum utilizador bloqueado",
|
"no_blocked_users": "Não tens nenhum utilizador bloqueado",
|
||||||
"friend_code_copied": "Código de amigo copiado",
|
"friend_code_copied": "Código de amigo copiado",
|
||||||
"image_process_failure": "Falha ao processar a imagem"
|
"undo_friendship_modal_text": "Isto vai remover a tua amizade com {{displayName}}",
|
||||||
|
"privacy_hint": "Para controlar quem pode ver o teu perfil, acede às <0>Definições</0>",
|
||||||
|
"profile_locked": "Este perfil é privado",
|
||||||
|
"image_process_failure": "Falha ao processar a imagem",
|
||||||
|
"required_field": "Este campo é obrigatório",
|
||||||
|
"displayname_min_length": "O nome de apresentação deve ter pelo menos 3 caracteres",
|
||||||
|
"displayname_max_length": "O nome de apresentação deve ter no máximo 50 caracteres",
|
||||||
|
"locked_profile": "Este perfil é privado",
|
||||||
|
"report_profile": "Denunciar este perfil",
|
||||||
|
"report_reason": "Por que é que desejas denunciar este perfil?",
|
||||||
|
"report_description": "Informações adicionais",
|
||||||
|
"report_description_placeholder": "Insere aqui",
|
||||||
|
"report": "Denunciar",
|
||||||
|
"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 denunciado",
|
||||||
|
"your_friend_code": "O teu código de amigo:",
|
||||||
|
"upload_banner": "Fazer upload do banner",
|
||||||
|
"uploading_banner": "A fazer upload do banner…"
|
||||||
|
},
|
||||||
|
"achievement": {
|
||||||
|
"achievement_unlocked": "Conquista desbloqueada",
|
||||||
|
"your_achievements": "As tuas Conquistas",
|
||||||
|
"user_achievements": "Conquistas de {{displayName}}",
|
||||||
|
"unlocked_at": "Desbloqueada em:",
|
||||||
|
"subscription_needed": "Precisas de uma subscrição Hydra Cloud para visualizar este conteúdo",
|
||||||
|
"new_achievements_unlocked": "{{achievementCount}} novas conquistas de {{gameCount}} jogos"
|
||||||
|
},
|
||||||
|
"tour": {
|
||||||
|
"subscription_tour_title": "Subscrição Hydra Cloud",
|
||||||
|
"subscribe_now": "Subscreve agora",
|
||||||
|
"cloud_achievements": "Gravação de conquistas na nuvem",
|
||||||
|
"animated_profile_picture": "Fotos de perfil animadas",
|
||||||
|
"premium_support": "Apoio Premium",
|
||||||
|
"show_and_compare_achievements": "Mostra e compara as tuas conquistas com as de outros utilizadores",
|
||||||
|
"animated_profile_banner": "Banner animado no perfil"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
"language_name": "Română",
|
"language_name": "Română",
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Recomandate",
|
"featured": "Recomandate",
|
||||||
"trending": "Populare",
|
|
||||||
"surprise_me": "Surprinde-mă",
|
"surprise_me": "Surprinde-mă",
|
||||||
"no_results": "Niciun rezultat găsit"
|
"no_results": "Niciun rezultat găsit"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,10 +5,9 @@
|
|||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Рекомендованное",
|
"featured": "Рекомендованное",
|
||||||
"trending": "В тренде",
|
|
||||||
"surprise_me": "Удиви меня",
|
"surprise_me": "Удиви меня",
|
||||||
"no_results": "Ничего не найдено",
|
"no_results": "Ничего не найдено",
|
||||||
"hot": "🔥 Сейчас жарко",
|
"hot": "Сейчас жарко",
|
||||||
"start_typing": "Начинаю вводить текст для поиска...",
|
"start_typing": "Начинаю вводить текст для поиска...",
|
||||||
"weekly": "📅 Лучшие игры недели"
|
"weekly": "📅 Лучшие игры недели"
|
||||||
},
|
},
|
||||||
@@ -206,9 +205,6 @@
|
|||||||
"found_download_option_other": "Найдено {{countFormatted}} вариантов загрузки",
|
"found_download_option_other": "Найдено {{countFormatted}} вариантов загрузки",
|
||||||
"import": "Импортировать",
|
"import": "Импортировать",
|
||||||
"blocked_users": "Заблокированные пользователи",
|
"blocked_users": "Заблокированные пользователи",
|
||||||
"download_options_one": "",
|
|
||||||
"download_options_other": "",
|
|
||||||
"download_options_zero": "",
|
|
||||||
"friends_only": "Только друзья",
|
"friends_only": "Только друзья",
|
||||||
"must_be_valid_url": "Источник должен быть действительным URL-адресом.",
|
"must_be_valid_url": "Источник должен быть действительным URL-адресом.",
|
||||||
"privacy": "Конфиденциальность",
|
"privacy": "Конфиденциальность",
|
||||||
@@ -300,7 +296,6 @@
|
|||||||
"image_process_failure": "Сбой при обработке изображения",
|
"image_process_failure": "Сбой при обработке изображения",
|
||||||
"locked_profile": "Этот профиль является частным",
|
"locked_profile": "Этот профиль является частным",
|
||||||
"privacy_hint": "Чтобы указать, кто может это видеть, перейдите в <0>Настройки</0>.",
|
"privacy_hint": "Чтобы указать, кто может это видеть, перейдите в <0>Настройки</0>.",
|
||||||
"profile_locked": "",
|
|
||||||
"profile_reported": "Профиль сообщил",
|
"profile_reported": "Профиль сообщил",
|
||||||
"report": "Отчет",
|
"report": "Отчет",
|
||||||
"report_description": "Дополнительная информация",
|
"report_description": "Дополнительная информация",
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
"language_name": "Türkçe",
|
"language_name": "Türkçe",
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Öne çıkan",
|
"featured": "Öne çıkan",
|
||||||
"trending": "Popüler",
|
|
||||||
"surprise_me": "Şaşırt beni",
|
"surprise_me": "Şaşırt beni",
|
||||||
"no_results": "Sonuç bulunamadı"
|
"no_results": "Sonuç bulunamadı"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Рекомендоване",
|
"featured": "Рекомендоване",
|
||||||
"trending": "У тренді",
|
|
||||||
"surprise_me": "Здивуй мене",
|
"surprise_me": "Здивуй мене",
|
||||||
"no_results": "Результатів не знайдено"
|
"no_results": "Результатів не знайдено"
|
||||||
},
|
},
|
||||||
@@ -161,9 +160,6 @@
|
|||||||
"download_count_one": "{{countFormatted}} завантаження в списку",
|
"download_count_one": "{{countFormatted}} завантаження в списку",
|
||||||
"download_count_other": "{{countFormatted}} завантажень в списку",
|
"download_count_other": "{{countFormatted}} завантажень в списку",
|
||||||
"download_count_zero": "В списку немає завантажень",
|
"download_count_zero": "В списку немає завантажень",
|
||||||
"download_options_one": "{{countFormatted}} доступний варіант завантаження",
|
|
||||||
"download_options_other": "{{countFormatted}} доступних варіантів завантаження",
|
|
||||||
"download_options_zero": "Немає доступних завантажень",
|
|
||||||
"download_source_errored": "Помилка",
|
"download_source_errored": "Помилка",
|
||||||
"download_source_up_to_date": "Оновлено",
|
"download_source_up_to_date": "Оновлено",
|
||||||
"download_source_url": "Посилання на джерело",
|
"download_source_url": "Посилання на джерело",
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "特色推荐",
|
"featured": "特色推荐",
|
||||||
"trending": "最近热门",
|
|
||||||
"surprise_me": "向我推荐",
|
"surprise_me": "向我推荐",
|
||||||
"no_results": "没有找到结果"
|
"no_results": "没有找到结果"
|
||||||
},
|
},
|
||||||
@@ -170,9 +169,6 @@
|
|||||||
"download_count_zero": "列表中无下载",
|
"download_count_zero": "列表中无下载",
|
||||||
"download_count_one": "列表中有 {{countFormatted}} 个下载",
|
"download_count_one": "列表中有 {{countFormatted}} 个下载",
|
||||||
"download_count_other": "列表中有 {{countFormatted}} 个下载",
|
"download_count_other": "列表中有 {{countFormatted}} 个下载",
|
||||||
"download_options_zero": "无可用下载",
|
|
||||||
"download_options_one": "有 {{countFormatted}} 个下载可用",
|
|
||||||
"download_options_other": "有 {{countFormatted}} 个下载可用",
|
|
||||||
"download_source_url": "下载源 URL",
|
"download_source_url": "下载源 URL",
|
||||||
"add_download_source_description": "插入包含 .json 文件的 URL",
|
"add_download_source_description": "插入包含 .json 文件的 URL",
|
||||||
"download_source_up_to_date": "已更新",
|
"download_source_up_to_date": "已更新",
|
||||||
|
|||||||
@@ -1,13 +1,24 @@
|
|||||||
import { app } from "electron";
|
import { app } from "electron";
|
||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
|
|
||||||
|
export const LUDUSAVI_MANIFEST_URL = "https://cdn.losbroxas.org/manifest.yaml";
|
||||||
|
|
||||||
export const defaultDownloadsPath = app.getPath("downloads");
|
export const defaultDownloadsPath = app.getPath("downloads");
|
||||||
|
|
||||||
export const databaseDirectory = path.join(app.getPath("appData"), "hydra");
|
export const databaseDirectory = path.join(app.getPath("appData"), "hydra");
|
||||||
export const databasePath = path.join(databaseDirectory, "hydra.db");
|
export const databasePath = path.join(
|
||||||
|
databaseDirectory,
|
||||||
|
import.meta.env.MAIN_VITE_API_URL.includes("staging")
|
||||||
|
? "hydra_test.db"
|
||||||
|
: "hydra.db"
|
||||||
|
);
|
||||||
|
|
||||||
export const logsPath = path.join(app.getPath("appData"), "hydra", "logs");
|
export const logsPath = path.join(app.getPath("appData"), "hydra", "logs");
|
||||||
|
|
||||||
export const seedsPath = app.isPackaged
|
export const seedsPath = app.isPackaged
|
||||||
? path.join(process.resourcesPath, "seeds")
|
? path.join(process.resourcesPath, "seeds")
|
||||||
: path.join(__dirname, "..", "..", "seeds");
|
: path.join(__dirname, "..", "..", "seeds");
|
||||||
|
|
||||||
|
export const backupsPath = path.join(app.getPath("userData"), "Backups");
|
||||||
|
|
||||||
|
export const appVersion = app.getVersion();
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import {
|
|||||||
Repack,
|
Repack,
|
||||||
UserPreferences,
|
UserPreferences,
|
||||||
UserAuth,
|
UserAuth,
|
||||||
|
GameAchievement,
|
||||||
|
UserSubscription,
|
||||||
} from "@main/entity";
|
} from "@main/entity";
|
||||||
|
|
||||||
import { databasePath } from "./constants";
|
import { databasePath } from "./constants";
|
||||||
@@ -16,11 +18,13 @@ export const dataSource = new DataSource({
|
|||||||
entities: [
|
entities: [
|
||||||
Game,
|
Game,
|
||||||
Repack,
|
Repack,
|
||||||
|
UserAuth,
|
||||||
UserPreferences,
|
UserPreferences,
|
||||||
|
UserSubscription,
|
||||||
GameShopCache,
|
GameShopCache,
|
||||||
DownloadSource,
|
DownloadSource,
|
||||||
DownloadQueue,
|
DownloadQueue,
|
||||||
UserAuth,
|
GameAchievement,
|
||||||
],
|
],
|
||||||
synchronize: false,
|
synchronize: false,
|
||||||
database: databasePath,
|
database: databasePath,
|
||||||
|
|||||||
19
src/main/entity/game-achievements.entity.ts
Normal file
19
src/main/entity/game-achievements.entity.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
|
||||||
|
|
||||||
|
@Entity("game_achievement")
|
||||||
|
export class GameAchievement {
|
||||||
|
@PrimaryGeneratedColumn()
|
||||||
|
id: number;
|
||||||
|
|
||||||
|
@Column("text")
|
||||||
|
objectId: string;
|
||||||
|
|
||||||
|
@Column("text")
|
||||||
|
shop: string;
|
||||||
|
|
||||||
|
@Column("text", { nullable: true })
|
||||||
|
unlockedAchievements: string | null;
|
||||||
|
|
||||||
|
@Column("text", { nullable: true })
|
||||||
|
achievements: string | null;
|
||||||
|
}
|
||||||
@@ -18,6 +18,9 @@ export class GameShopCache {
|
|||||||
@Column("text", { nullable: true })
|
@Column("text", { nullable: true })
|
||||||
serializedData: string;
|
serializedData: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use IndexedDB's `howLongToBeatEntries` instead
|
||||||
|
*/
|
||||||
@Column("text", { nullable: true })
|
@Column("text", { nullable: true })
|
||||||
howLongToBeatSerializedData: string;
|
howLongToBeatSerializedData: string;
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,9 @@ export class Game {
|
|||||||
@Column("text", { nullable: true })
|
@Column("text", { nullable: true })
|
||||||
executablePath: string | null;
|
executablePath: string | null;
|
||||||
|
|
||||||
|
@Column("text", { nullable: true })
|
||||||
|
winePrefixPath: string | null;
|
||||||
|
|
||||||
@Column("int", { default: 0 })
|
@Column("int", { default: 0 })
|
||||||
playTimeInMilliseconds: number;
|
playTimeInMilliseconds: number;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
export * from "./game.entity";
|
export * from "./game.entity";
|
||||||
export * from "./repack.entity";
|
export * from "./repack.entity";
|
||||||
|
export * from "./user-auth.entity";
|
||||||
export * from "./user-preferences.entity";
|
export * from "./user-preferences.entity";
|
||||||
|
export * from "./user-subscription.entity";
|
||||||
export * from "./game-shop-cache.entity";
|
export * from "./game-shop-cache.entity";
|
||||||
|
export * from "./game.entity";
|
||||||
|
export * from "./game-achievements.entity";
|
||||||
export * from "./download-source.entity";
|
export * from "./download-source.entity";
|
||||||
export * from "./download-queue.entity";
|
export * from "./download-queue.entity";
|
||||||
export * from "./user-auth";
|
|
||||||
|
|||||||
@@ -4,7 +4,9 @@ import {
|
|||||||
Column,
|
Column,
|
||||||
CreateDateColumn,
|
CreateDateColumn,
|
||||||
UpdateDateColumn,
|
UpdateDateColumn,
|
||||||
|
OneToOne,
|
||||||
} from "typeorm";
|
} from "typeorm";
|
||||||
|
import { UserSubscription } from "./user-subscription.entity";
|
||||||
|
|
||||||
@Entity("user_auth")
|
@Entity("user_auth")
|
||||||
export class UserAuth {
|
export class UserAuth {
|
||||||
@@ -20,6 +22,9 @@ export class UserAuth {
|
|||||||
@Column("text", { nullable: true })
|
@Column("text", { nullable: true })
|
||||||
profileImageUrl: string | null;
|
profileImageUrl: string | null;
|
||||||
|
|
||||||
|
@Column("text", { nullable: true })
|
||||||
|
backgroundImageUrl: string | null;
|
||||||
|
|
||||||
@Column("text", { default: "" })
|
@Column("text", { default: "" })
|
||||||
accessToken: string;
|
accessToken: string;
|
||||||
|
|
||||||
@@ -29,6 +34,9 @@ export class UserAuth {
|
|||||||
@Column("int", { default: 0 })
|
@Column("int", { default: 0 })
|
||||||
tokenExpirationTimestamp: number;
|
tokenExpirationTimestamp: number;
|
||||||
|
|
||||||
|
@OneToOne("UserSubscription", "user")
|
||||||
|
subscription: UserSubscription | null;
|
||||||
|
|
||||||
@CreateDateColumn()
|
@CreateDateColumn()
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
|
|
||||||
@@ -26,6 +26,9 @@ export class UserPreferences {
|
|||||||
@Column("boolean", { default: false })
|
@Column("boolean", { default: false })
|
||||||
repackUpdatesNotificationsEnabled: boolean;
|
repackUpdatesNotificationsEnabled: boolean;
|
||||||
|
|
||||||
|
@Column("boolean", { default: true })
|
||||||
|
achievementNotificationsEnabled: boolean;
|
||||||
|
|
||||||
@Column("boolean", { default: false })
|
@Column("boolean", { default: false })
|
||||||
preferQuitInsteadOfHiding: boolean;
|
preferQuitInsteadOfHiding: boolean;
|
||||||
|
|
||||||
|
|||||||
42
src/main/entity/user-subscription.entity.ts
Normal file
42
src/main/entity/user-subscription.entity.ts
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
import type { SubscriptionStatus } from "@types";
|
||||||
|
import {
|
||||||
|
Entity,
|
||||||
|
PrimaryGeneratedColumn,
|
||||||
|
Column,
|
||||||
|
CreateDateColumn,
|
||||||
|
UpdateDateColumn,
|
||||||
|
OneToOne,
|
||||||
|
JoinColumn,
|
||||||
|
} from "typeorm";
|
||||||
|
import { UserAuth } from "./user-auth.entity";
|
||||||
|
|
||||||
|
@Entity("user_subscription")
|
||||||
|
export class UserSubscription {
|
||||||
|
@PrimaryGeneratedColumn()
|
||||||
|
id: number;
|
||||||
|
|
||||||
|
@Column("text", { default: "" })
|
||||||
|
subscriptionId: string;
|
||||||
|
|
||||||
|
@OneToOne("UserAuth", "subscription")
|
||||||
|
@JoinColumn()
|
||||||
|
user: UserAuth;
|
||||||
|
|
||||||
|
@Column("text", { default: "" })
|
||||||
|
status: SubscriptionStatus;
|
||||||
|
|
||||||
|
@Column("text", { default: "" })
|
||||||
|
planId: string;
|
||||||
|
|
||||||
|
@Column("text", { default: "" })
|
||||||
|
planName: string;
|
||||||
|
|
||||||
|
@Column("datetime", { nullable: true })
|
||||||
|
expiresAt: Date | null;
|
||||||
|
|
||||||
|
@CreateDateColumn()
|
||||||
|
createdAt: Date;
|
||||||
|
|
||||||
|
@UpdateDateColumn()
|
||||||
|
updatedAt: Date;
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@ import {
|
|||||||
gamesPlaytime,
|
gamesPlaytime,
|
||||||
} from "@main/services";
|
} from "@main/services";
|
||||||
import { dataSource } from "@main/data-source";
|
import { dataSource } from "@main/data-source";
|
||||||
import { DownloadQueue, Game, UserAuth } from "@main/entity";
|
import { DownloadQueue, Game, UserAuth, UserSubscription } from "@main/entity";
|
||||||
|
|
||||||
const signOut = async (_event: Electron.IpcMainInvokeEvent) => {
|
const signOut = async (_event: Electron.IpcMainInvokeEvent) => {
|
||||||
const databaseOperations = dataSource
|
const databaseOperations = dataSource
|
||||||
@@ -19,6 +19,10 @@ const signOut = async (_event: Electron.IpcMainInvokeEvent) => {
|
|||||||
await transactionalEntityManager
|
await transactionalEntityManager
|
||||||
.getRepository(UserAuth)
|
.getRepository(UserAuth)
|
||||||
.delete({ id: 1 });
|
.delete({ id: 1 });
|
||||||
|
|
||||||
|
await transactionalEntityManager
|
||||||
|
.getRepository(UserSubscription)
|
||||||
|
.delete({ id: 1 });
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
/* Removes all games being played */
|
/* Removes all games being played */
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { AppUpdaterEvent } from "@types";
|
import type { AppUpdaterEvent } from "@types";
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import updater, { UpdateInfo } from "electron-updater";
|
import updater, { UpdateInfo } from "electron-updater";
|
||||||
import { WindowManager } from "@main/services";
|
import { WindowManager } from "@main/services";
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import type { GameShop } from "@types";
|
import type { GameShop } from "@types";
|
||||||
|
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import { HydraApi, RepacksManager } from "@main/services";
|
import { HydraApi } from "@main/services";
|
||||||
import { CatalogueCategory, formatName, steamUrlBuilder } from "@shared";
|
import { CatalogueCategory, steamUrlBuilder } from "@shared";
|
||||||
import { steamGamesWorker } from "@main/workers";
|
import { steamGamesWorker } from "@main/workers";
|
||||||
|
|
||||||
const getCatalogue = async (
|
const getCatalogue = async (
|
||||||
@@ -15,7 +15,7 @@ const getCatalogue = async (
|
|||||||
});
|
});
|
||||||
|
|
||||||
const response = await HydraApi.get<{ objectId: string; shop: GameShop }[]>(
|
const response = await HydraApi.get<{ objectId: string; shop: GameShop }[]>(
|
||||||
`/games/${category}?${params.toString()}`,
|
`/catalogue/${category}?${params.toString()}`,
|
||||||
{},
|
{},
|
||||||
{ needsAuth: false }
|
{ needsAuth: false }
|
||||||
);
|
);
|
||||||
@@ -26,16 +26,11 @@ const getCatalogue = async (
|
|||||||
name: "getById",
|
name: "getById",
|
||||||
});
|
});
|
||||||
|
|
||||||
const repacks = RepacksManager.search({
|
|
||||||
query: formatName(steamGame.name),
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
title: steamGame.name,
|
title: steamGame.name,
|
||||||
shop: game.shop,
|
shop: game.shop,
|
||||||
repacks,
|
|
||||||
cover: steamUrlBuilder.library(game.objectId),
|
cover: steamUrlBuilder.library(game.objectId),
|
||||||
objectID: game.objectId,
|
objectId: game.objectId,
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -7,16 +7,16 @@ import { registerEvent } from "../register-event";
|
|||||||
import { steamGamesWorker } from "@main/workers";
|
import { steamGamesWorker } from "@main/workers";
|
||||||
|
|
||||||
const getLocalizedSteamAppDetails = async (
|
const getLocalizedSteamAppDetails = async (
|
||||||
objectID: string,
|
objectId: string,
|
||||||
language: string
|
language: string
|
||||||
): Promise<ShopDetails | null> => {
|
): Promise<ShopDetails | null> => {
|
||||||
if (language === "english") {
|
if (language === "english") {
|
||||||
return getSteamAppDetails(objectID, language);
|
return getSteamAppDetails(objectId, language);
|
||||||
}
|
}
|
||||||
|
|
||||||
return getSteamAppDetails(objectID, language).then(
|
return getSteamAppDetails(objectId, language).then(
|
||||||
async (localizedAppDetails) => {
|
async (localizedAppDetails) => {
|
||||||
const steamGame = await steamGamesWorker.run(Number(objectID), {
|
const steamGame = await steamGamesWorker.run(Number(objectId), {
|
||||||
name: "getById",
|
name: "getById",
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -34,26 +34,28 @@ const getLocalizedSteamAppDetails = async (
|
|||||||
|
|
||||||
const getGameShopDetails = async (
|
const getGameShopDetails = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
objectID: string,
|
objectId: string,
|
||||||
shop: GameShop,
|
shop: GameShop,
|
||||||
language: string
|
language: string
|
||||||
): Promise<ShopDetails | null> => {
|
): Promise<ShopDetails | null> => {
|
||||||
if (shop === "steam") {
|
if (shop === "steam") {
|
||||||
const cachedData = await gameShopCacheRepository.findOne({
|
const cachedData = await gameShopCacheRepository.findOne({
|
||||||
where: { objectID, language },
|
where: { objectID: objectId, language },
|
||||||
});
|
});
|
||||||
|
|
||||||
const appDetails = getLocalizedSteamAppDetails(objectID, language).then(
|
const appDetails = getLocalizedSteamAppDetails(objectId, language).then(
|
||||||
(result) => {
|
(result) => {
|
||||||
gameShopCacheRepository.upsert(
|
if (result) {
|
||||||
{
|
gameShopCacheRepository.upsert(
|
||||||
objectID,
|
{
|
||||||
shop: "steam",
|
objectID: objectId,
|
||||||
language,
|
shop: "steam",
|
||||||
serializedData: JSON.stringify(result),
|
language,
|
||||||
},
|
serializedData: JSON.stringify(result),
|
||||||
["objectID"]
|
},
|
||||||
);
|
["objectID"]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -66,7 +68,7 @@ const getGameShopDetails = async (
|
|||||||
if (cachedGame) {
|
if (cachedGame) {
|
||||||
return {
|
return {
|
||||||
...cachedGame,
|
...cachedGame,
|
||||||
objectID,
|
objectId,
|
||||||
} as ShopDetails;
|
} as ShopDetails;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,23 +1,17 @@
|
|||||||
import type { GameShop } from "@types";
|
import type { GameShop, GameStats } from "@types";
|
||||||
|
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import { HydraApi } from "@main/services";
|
import { HydraApi } from "@main/services";
|
||||||
import type { GameStats } from "@types";
|
|
||||||
|
|
||||||
const getGameStats = async (
|
const getGameStats = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
objectId: string,
|
objectId: string,
|
||||||
shop: GameShop
|
shop: GameShop
|
||||||
) => {
|
) => {
|
||||||
const params = new URLSearchParams({
|
return HydraApi.get<GameStats>(
|
||||||
objectId,
|
`/games/stats`,
|
||||||
shop,
|
{ objectId, shop },
|
||||||
});
|
{ needsAuth: false }
|
||||||
|
|
||||||
const response = await HydraApi.get<GameStats>(
|
|
||||||
`/games/stats?${params.toString()}`
|
|
||||||
);
|
);
|
||||||
return response;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
registerEvent("getGameStats", getGameStats);
|
registerEvent("getGameStats", getGameStats);
|
||||||
|
|||||||
@@ -1,28 +1,29 @@
|
|||||||
import type { CatalogueEntry } from "@types";
|
import type { CatalogueEntry } from "@types";
|
||||||
|
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import { steamGamesWorker } from "@main/workers";
|
import { HydraApi } from "@main/services";
|
||||||
import { convertSteamGameToCatalogueEntry } from "../helpers/search-games";
|
import { steamUrlBuilder } from "@shared";
|
||||||
import { RepacksManager } from "@main/services";
|
|
||||||
|
|
||||||
const getGames = async (
|
const getGames = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
take = 12,
|
take = 12,
|
||||||
cursor = 0
|
skip = 0
|
||||||
): Promise<{ results: CatalogueEntry[]; cursor: number }> => {
|
): Promise<CatalogueEntry[]> => {
|
||||||
const steamGames = await steamGamesWorker.run(
|
const searchParams = new URLSearchParams({
|
||||||
{ limit: take, offset: cursor },
|
take: take.toString(),
|
||||||
{ name: "list" }
|
skip: skip.toString(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const games = await HydraApi.get<CatalogueEntry[]>(
|
||||||
|
`/games/catalogue?${searchParams.toString()}`,
|
||||||
|
undefined,
|
||||||
|
{ needsAuth: false }
|
||||||
);
|
);
|
||||||
|
|
||||||
const entries = RepacksManager.findRepacksForCatalogueEntries(
|
return games.map((game) => ({
|
||||||
steamGames.map((game) => convertSteamGameToCatalogueEntry(game))
|
...game,
|
||||||
);
|
cover: steamUrlBuilder.library(game.objectId),
|
||||||
|
}));
|
||||||
return {
|
|
||||||
results: entries,
|
|
||||||
cursor: cursor + entries.length,
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
registerEvent("getGames", getGames);
|
registerEvent("getGames", getGames);
|
||||||
|
|||||||
@@ -1,45 +1,23 @@
|
|||||||
import type { GameShop, HowLongToBeatCategory } from "@types";
|
import type { HowLongToBeatCategory } from "@types";
|
||||||
import { getHowLongToBeatGame, searchHowLongToBeat } from "@main/services";
|
import { getHowLongToBeatGame, searchHowLongToBeat } from "@main/services";
|
||||||
|
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import { gameShopCacheRepository } from "@main/repository";
|
import { formatName } from "@shared";
|
||||||
|
|
||||||
const getHowLongToBeat = async (
|
const getHowLongToBeat = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
objectID: string,
|
|
||||||
shop: GameShop,
|
|
||||||
title: string
|
title: string
|
||||||
): Promise<HowLongToBeatCategory[] | null> => {
|
): Promise<HowLongToBeatCategory[] | null> => {
|
||||||
const searchHowLongToBeatPromise = searchHowLongToBeat(title);
|
const response = await searchHowLongToBeat(title);
|
||||||
|
|
||||||
const gameShopCache = await gameShopCacheRepository.findOne({
|
const game = response.data.find((game) => {
|
||||||
where: { objectID, shop },
|
return formatName(game.game_name) === formatName(title);
|
||||||
});
|
});
|
||||||
|
|
||||||
const howLongToBeatCachedData = gameShopCache?.howLongToBeatSerializedData
|
if (!game) return null;
|
||||||
? JSON.parse(gameShopCache?.howLongToBeatSerializedData)
|
const howLongToBeat = await getHowLongToBeatGame(String(game.game_id));
|
||||||
: null;
|
|
||||||
if (howLongToBeatCachedData) return howLongToBeatCachedData;
|
|
||||||
|
|
||||||
return searchHowLongToBeatPromise.then(async (response) => {
|
return howLongToBeat;
|
||||||
const game = response.data.find(
|
|
||||||
(game) => game.profile_steam === Number(objectID)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!game) return null;
|
|
||||||
const howLongToBeat = await getHowLongToBeatGame(String(game.game_id));
|
|
||||||
|
|
||||||
gameShopCacheRepository.upsert(
|
|
||||||
{
|
|
||||||
objectID,
|
|
||||||
shop,
|
|
||||||
howLongToBeatSerializedData: JSON.stringify(howLongToBeat),
|
|
||||||
},
|
|
||||||
["objectID"]
|
|
||||||
);
|
|
||||||
|
|
||||||
return howLongToBeat;
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
registerEvent("getHowLongToBeat", getHowLongToBeat);
|
registerEvent("getHowLongToBeat", getHowLongToBeat);
|
||||||
|
|||||||
@@ -3,32 +3,15 @@ import { shuffle } from "lodash-es";
|
|||||||
import { getSteam250List } from "@main/services";
|
import { getSteam250List } from "@main/services";
|
||||||
|
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import { getSteamGameById } from "../helpers/search-games";
|
|
||||||
import type { Steam250Game } from "@types";
|
import type { Steam250Game } from "@types";
|
||||||
|
|
||||||
const state = { games: Array<Steam250Game>(), index: 0 };
|
const state = { games: Array<Steam250Game>(), index: 0 };
|
||||||
|
|
||||||
const filterGames = async (games: Steam250Game[]) => {
|
|
||||||
const results: Steam250Game[] = [];
|
|
||||||
|
|
||||||
for (const game of games) {
|
|
||||||
const steamGame = await getSteamGameById(game.objectID);
|
|
||||||
|
|
||||||
if (steamGame?.repacks.length) {
|
|
||||||
results.push(game);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return results;
|
|
||||||
};
|
|
||||||
|
|
||||||
const getRandomGame = async (_event: Electron.IpcMainInvokeEvent) => {
|
const getRandomGame = async (_event: Electron.IpcMainInvokeEvent) => {
|
||||||
if (state.games.length == 0) {
|
if (state.games.length == 0) {
|
||||||
const steam250List = await getSteam250List();
|
const steam250List = await getSteam250List();
|
||||||
|
|
||||||
const filteredSteam250List = await filterGames(steam250List);
|
state.games = shuffle(steam250List);
|
||||||
|
|
||||||
state.games = shuffle(filteredSteam250List);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state.games.length == 0) {
|
if (state.games.length == 0) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import { HydraApi } from "@main/services";
|
import { HydraApi } from "@main/services";
|
||||||
import { userPreferencesRepository } from "@main/repository";
|
import { userPreferencesRepository } from "@main/repository";
|
||||||
import { TrendingGame } from "@types";
|
import type { TrendingGame } from "@types";
|
||||||
|
|
||||||
const getTrendingGames = async (_event: Electron.IpcMainInvokeEvent) => {
|
const getTrendingGames = async (_event: Electron.IpcMainInvokeEvent) => {
|
||||||
const userPreferences = await userPreferencesRepository.findOne({
|
const userPreferences = await userPreferencesRepository.findOne({
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
import { RepacksManager } from "@main/services";
|
|
||||||
import { registerEvent } from "../register-event";
|
|
||||||
|
|
||||||
const searchGameRepacks = (
|
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
|
||||||
query: string
|
|
||||||
) => RepacksManager.search({ query });
|
|
||||||
|
|
||||||
registerEvent("searchGameRepacks", searchGameRepacks);
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import { convertSteamGameToCatalogueEntry } from "../helpers/search-games";
|
import { convertSteamGameToCatalogueEntry } from "../helpers/search-games";
|
||||||
import { CatalogueEntry } from "@types";
|
import type { CatalogueEntry } from "@types";
|
||||||
import { HydraApi, RepacksManager } from "@main/services";
|
import { HydraApi } from "@main/services";
|
||||||
|
|
||||||
const searchGamesEvent = async (
|
const searchGamesEvent = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
@@ -11,15 +11,13 @@ const searchGamesEvent = async (
|
|||||||
{ objectId: string; title: string; shop: string }[]
|
{ objectId: string; title: string; shop: string }[]
|
||||||
>("/games/search", { title: query, take: 12, skip: 0 }, { needsAuth: false });
|
>("/games/search", { title: query, take: 12, skip: 0 }, { needsAuth: false });
|
||||||
|
|
||||||
const steamGames = games.map((game) => {
|
return games.map((game) => {
|
||||||
return convertSteamGameToCatalogueEntry({
|
return convertSteamGameToCatalogueEntry({
|
||||||
id: Number(game.objectId),
|
id: Number(game.objectId),
|
||||||
name: game.title,
|
name: game.title,
|
||||||
clientIcon: null,
|
clientIcon: null,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
return RepacksManager.findRepacksForCatalogueEntries(steamGames);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
registerEvent("searchGames", searchGamesEvent);
|
registerEvent("searchGames", searchGamesEvent);
|
||||||
|
|||||||
12
src/main/events/cloud-save/delete-game-artifact.ts
Normal file
12
src/main/events/cloud-save/delete-game-artifact.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { HydraApi } from "@main/services";
|
||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
|
||||||
|
const deleteGameArtifact = async (
|
||||||
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
gameArtifactId: string
|
||||||
|
) =>
|
||||||
|
HydraApi.delete<{ ok: boolean }>(
|
||||||
|
`/profile/games/artifacts/${gameArtifactId}`
|
||||||
|
);
|
||||||
|
|
||||||
|
registerEvent("deleteGameArtifact", deleteGameArtifact);
|
||||||
147
src/main/events/cloud-save/download-game-artifact.ts
Normal file
147
src/main/events/cloud-save/download-game-artifact.ts
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
import { HydraApi, logger, Ludusavi, WindowManager } from "@main/services";
|
||||||
|
import fs from "node:fs";
|
||||||
|
import * as tar from "tar";
|
||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
import axios from "axios";
|
||||||
|
import os from "node:os";
|
||||||
|
import { app } from "electron";
|
||||||
|
import path from "node:path";
|
||||||
|
import { backupsPath } from "@main/constants";
|
||||||
|
import type { GameShop } from "@types";
|
||||||
|
|
||||||
|
import YAML from "yaml";
|
||||||
|
import { normalizePath } from "@main/helpers";
|
||||||
|
|
||||||
|
export interface LudusaviBackup {
|
||||||
|
files: {
|
||||||
|
[key: string]: {
|
||||||
|
hash: string;
|
||||||
|
size: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const replaceLudusaviBackupWithCurrentUser = (
|
||||||
|
backupPath: string,
|
||||||
|
title: string,
|
||||||
|
homeDir: string
|
||||||
|
) => {
|
||||||
|
const gameBackupPath = path.join(backupPath, title);
|
||||||
|
const mappingYamlPath = path.join(gameBackupPath, "mapping.yaml");
|
||||||
|
|
||||||
|
const data = fs.readFileSync(mappingYamlPath, "utf8");
|
||||||
|
const manifest = YAML.parse(data) as {
|
||||||
|
backups: LudusaviBackup[];
|
||||||
|
drives: Record<string, string>;
|
||||||
|
};
|
||||||
|
|
||||||
|
const currentHomeDir = normalizePath(app.getPath("home"));
|
||||||
|
|
||||||
|
/* Renaming logic */
|
||||||
|
if (os.platform() === "win32") {
|
||||||
|
const mappedHomeDir = path.join(
|
||||||
|
gameBackupPath,
|
||||||
|
path.join("drive-C", homeDir.replace("C:", ""))
|
||||||
|
);
|
||||||
|
|
||||||
|
if (fs.existsSync(mappedHomeDir)) {
|
||||||
|
fs.renameSync(
|
||||||
|
mappedHomeDir,
|
||||||
|
path.join(gameBackupPath, "drive-C", currentHomeDir.replace("C:", ""))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const backups = manifest.backups.map((backup: LudusaviBackup) => {
|
||||||
|
const files = Object.entries(backup.files).reduce((prev, [key, value]) => {
|
||||||
|
const updatedKey = key.replace(homeDir, currentHomeDir);
|
||||||
|
|
||||||
|
return {
|
||||||
|
...prev,
|
||||||
|
[updatedKey]: value,
|
||||||
|
};
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
return {
|
||||||
|
...backup,
|
||||||
|
files,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
fs.writeFileSync(mappingYamlPath, YAML.stringify({ ...manifest, backups }));
|
||||||
|
};
|
||||||
|
|
||||||
|
const downloadGameArtifact = async (
|
||||||
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
objectId: string,
|
||||||
|
shop: GameShop,
|
||||||
|
gameArtifactId: string
|
||||||
|
) => {
|
||||||
|
try {
|
||||||
|
const { downloadUrl, objectKey, homeDir } = await HydraApi.post<{
|
||||||
|
downloadUrl: string;
|
||||||
|
objectKey: string;
|
||||||
|
homeDir: string;
|
||||||
|
}>(`/profile/games/artifacts/${gameArtifactId}/download`);
|
||||||
|
|
||||||
|
const zipLocation = path.join(app.getPath("userData"), objectKey);
|
||||||
|
const backupPath = path.join(backupsPath, `${shop}-${objectId}`);
|
||||||
|
|
||||||
|
if (fs.existsSync(backupPath)) {
|
||||||
|
fs.rmSync(backupPath, {
|
||||||
|
recursive: true,
|
||||||
|
force: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await axios.get(downloadUrl, {
|
||||||
|
responseType: "stream",
|
||||||
|
onDownloadProgress: (progressEvent) => {
|
||||||
|
WindowManager.mainWindow?.webContents.send(
|
||||||
|
`on-backup-download-progress-${objectId}-${shop}`,
|
||||||
|
progressEvent
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const writer = fs.createWriteStream(zipLocation);
|
||||||
|
|
||||||
|
response.data.pipe(writer);
|
||||||
|
|
||||||
|
writer.on("error", (err) => {
|
||||||
|
logger.error("Failed to write zip", err);
|
||||||
|
throw err;
|
||||||
|
});
|
||||||
|
|
||||||
|
fs.mkdirSync(backupPath, { recursive: true });
|
||||||
|
|
||||||
|
writer.on("close", () => {
|
||||||
|
tar
|
||||||
|
.x({
|
||||||
|
file: zipLocation,
|
||||||
|
cwd: backupPath,
|
||||||
|
})
|
||||||
|
.then(async () => {
|
||||||
|
replaceLudusaviBackupWithCurrentUser(
|
||||||
|
backupPath,
|
||||||
|
objectId,
|
||||||
|
normalizePath(homeDir)
|
||||||
|
);
|
||||||
|
|
||||||
|
Ludusavi.restoreBackup(backupPath).then(() => {
|
||||||
|
WindowManager.mainWindow?.webContents.send(
|
||||||
|
`on-backup-download-complete-${objectId}-${shop}`,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
WindowManager.mainWindow?.webContents.send(
|
||||||
|
`on-backup-download-complete-${objectId}-${shop}`,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("downloadGameArtifact", downloadGameArtifact);
|
||||||
20
src/main/events/cloud-save/get-game-artifacts.ts
Normal file
20
src/main/events/cloud-save/get-game-artifacts.ts
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import { HydraApi } from "@main/services";
|
||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
import type { GameArtifact, GameShop } from "@types";
|
||||||
|
|
||||||
|
const getGameArtifacts = async (
|
||||||
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
objectId: string,
|
||||||
|
shop: GameShop
|
||||||
|
) => {
|
||||||
|
const params = new URLSearchParams({
|
||||||
|
objectId,
|
||||||
|
shop,
|
||||||
|
});
|
||||||
|
|
||||||
|
return HydraApi.get<GameArtifact[]>(
|
||||||
|
`/profile/games/artifacts?${params.toString()}`
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("getGameArtifacts", getGameArtifacts);
|
||||||
21
src/main/events/cloud-save/get-game-backup-preview.ts
Normal file
21
src/main/events/cloud-save/get-game-backup-preview.ts
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
import type { GameShop } from "@types";
|
||||||
|
import { Ludusavi } from "@main/services";
|
||||||
|
import { gameRepository } from "@main/repository";
|
||||||
|
|
||||||
|
const getGameBackupPreview = async (
|
||||||
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
objectId: string,
|
||||||
|
shop: GameShop
|
||||||
|
) => {
|
||||||
|
const game = await gameRepository.findOne({
|
||||||
|
where: {
|
||||||
|
objectID: objectId,
|
||||||
|
shop,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return Ludusavi.getBackupPreview(shop, objectId, game?.winePrefixPath);
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("getGameBackupPreview", getGameBackupPreview);
|
||||||
14
src/main/events/cloud-save/select-game-backup-path.ts
Normal file
14
src/main/events/cloud-save/select-game-backup-path.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
import type { GameShop } from "@types";
|
||||||
|
import { Ludusavi } from "@main/services";
|
||||||
|
|
||||||
|
const selectGameBackupPath = async (
|
||||||
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
_shop: GameShop,
|
||||||
|
objectId: string,
|
||||||
|
backupPath: string | null
|
||||||
|
) => {
|
||||||
|
return Ludusavi.addCustomGame(objectId, backupPath);
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("selectGameBackupPath", selectGameBackupPath);
|
||||||
111
src/main/events/cloud-save/upload-save-game.ts
Normal file
111
src/main/events/cloud-save/upload-save-game.ts
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
import { HydraApi, logger, Ludusavi, WindowManager } from "@main/services";
|
||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
import fs from "node:fs";
|
||||||
|
import path from "node:path";
|
||||||
|
import * as tar from "tar";
|
||||||
|
import crypto from "node:crypto";
|
||||||
|
import type { GameShop } from "@types";
|
||||||
|
import axios from "axios";
|
||||||
|
import os from "node:os";
|
||||||
|
import { backupsPath } from "@main/constants";
|
||||||
|
import { app } from "electron";
|
||||||
|
import { normalizePath } from "@main/helpers";
|
||||||
|
import { gameRepository } from "@main/repository";
|
||||||
|
|
||||||
|
const bundleBackup = async (
|
||||||
|
shop: GameShop,
|
||||||
|
objectId: string,
|
||||||
|
winePrefix: string | null
|
||||||
|
) => {
|
||||||
|
const backupPath = path.join(backupsPath, `${shop}-${objectId}`);
|
||||||
|
|
||||||
|
// Remove existing backup
|
||||||
|
if (fs.existsSync(backupPath)) {
|
||||||
|
fs.rmSync(backupPath, { recursive: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
await Ludusavi.backupGame(shop, objectId, backupPath, winePrefix);
|
||||||
|
|
||||||
|
const tarLocation = path.join(backupsPath, `${crypto.randomUUID()}.tar`);
|
||||||
|
|
||||||
|
await tar.create(
|
||||||
|
{
|
||||||
|
gzip: false,
|
||||||
|
file: tarLocation,
|
||||||
|
cwd: backupPath,
|
||||||
|
},
|
||||||
|
["."]
|
||||||
|
);
|
||||||
|
|
||||||
|
return tarLocation;
|
||||||
|
};
|
||||||
|
|
||||||
|
const uploadSaveGame = async (
|
||||||
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
objectId: string,
|
||||||
|
shop: GameShop,
|
||||||
|
downloadOptionTitle: string | null
|
||||||
|
) => {
|
||||||
|
const game = await gameRepository.findOne({
|
||||||
|
where: {
|
||||||
|
objectID: objectId,
|
||||||
|
shop,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const bundleLocation = await bundleBackup(
|
||||||
|
shop,
|
||||||
|
objectId,
|
||||||
|
game?.winePrefixPath ?? null
|
||||||
|
);
|
||||||
|
|
||||||
|
fs.stat(bundleLocation, async (err, stat) => {
|
||||||
|
if (err) {
|
||||||
|
logger.error("Failed to get zip file stats", err);
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { uploadUrl } = await HydraApi.post<{
|
||||||
|
id: string;
|
||||||
|
uploadUrl: string;
|
||||||
|
}>("/profile/games/artifacts", {
|
||||||
|
artifactLengthInBytes: stat.size,
|
||||||
|
shop,
|
||||||
|
objectId,
|
||||||
|
hostname: os.hostname(),
|
||||||
|
homeDir: normalizePath(app.getPath("home")),
|
||||||
|
downloadOptionTitle,
|
||||||
|
platform: os.platform(),
|
||||||
|
});
|
||||||
|
|
||||||
|
fs.readFile(bundleLocation, async (err, fileBuffer) => {
|
||||||
|
if (err) {
|
||||||
|
logger.error("Failed to read zip file", err);
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
|
||||||
|
await axios.put(uploadUrl, fileBuffer, {
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/tar",
|
||||||
|
},
|
||||||
|
onUploadProgress: (progressEvent) => {
|
||||||
|
console.log(progressEvent);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
WindowManager.mainWindow?.webContents.send(
|
||||||
|
`on-upload-complete-${objectId}-${shop}`,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
|
||||||
|
fs.rm(bundleLocation, (err) => {
|
||||||
|
if (err) {
|
||||||
|
logger.error("Failed to remove tar file", err);
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("uploadSaveGame", uploadSaveGame);
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
import { registerEvent } from "../register-event";
|
|
||||||
import { dataSource } from "@main/data-source";
|
|
||||||
import { DownloadSource } from "@main/entity";
|
|
||||||
import axios from "axios";
|
|
||||||
import { downloadSourceSchema } from "../helpers/validators";
|
|
||||||
import { insertDownloadsFromSource } from "@main/helpers";
|
|
||||||
import { RepacksManager } from "@main/services";
|
|
||||||
|
|
||||||
const addDownloadSource = async (
|
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
|
||||||
url: string
|
|
||||||
) => {
|
|
||||||
const response = await axios.get(url);
|
|
||||||
|
|
||||||
const source = downloadSourceSchema.parse(response.data);
|
|
||||||
|
|
||||||
const downloadSource = await dataSource.transaction(
|
|
||||||
async (transactionalEntityManager) => {
|
|
||||||
const downloadSource = await transactionalEntityManager
|
|
||||||
.getRepository(DownloadSource)
|
|
||||||
.save({
|
|
||||||
url,
|
|
||||||
name: source.name,
|
|
||||||
downloadCount: source.downloads.length,
|
|
||||||
});
|
|
||||||
|
|
||||||
await insertDownloadsFromSource(
|
|
||||||
transactionalEntityManager,
|
|
||||||
downloadSource,
|
|
||||||
source.downloads
|
|
||||||
);
|
|
||||||
|
|
||||||
return downloadSource;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
await RepacksManager.updateRepacks();
|
|
||||||
|
|
||||||
return downloadSource;
|
|
||||||
};
|
|
||||||
|
|
||||||
registerEvent("addDownloadSource", addDownloadSource);
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
import { knexClient } from "@main/knex-client";
|
||||||
|
|
||||||
|
const deleteDownloadSource = async (
|
||||||
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
id: number
|
||||||
|
) => knexClient("download_source").where({ id }).delete();
|
||||||
|
|
||||||
|
registerEvent("deleteDownloadSource", deleteDownloadSource);
|
||||||
@@ -1,11 +1,7 @@
|
|||||||
import { downloadSourceRepository } from "@main/repository";
|
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
|
import { knexClient } from "@main/knex-client";
|
||||||
|
|
||||||
const getDownloadSources = async (_event: Electron.IpcMainInvokeEvent) =>
|
const getDownloadSources = async (_event: Electron.IpcMainInvokeEvent) =>
|
||||||
downloadSourceRepository.find({
|
knexClient.select("*").from("download_source");
|
||||||
order: {
|
|
||||||
createdAt: "DESC",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
registerEvent("getDownloadSources", getDownloadSources);
|
registerEvent("getDownloadSources", getDownloadSources);
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
import { downloadSourceRepository } from "@main/repository";
|
|
||||||
import { registerEvent } from "../register-event";
|
|
||||||
import { RepacksManager } from "@main/services";
|
|
||||||
|
|
||||||
const removeDownloadSource = async (
|
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
|
||||||
id: number
|
|
||||||
) => {
|
|
||||||
await downloadSourceRepository.delete(id);
|
|
||||||
await RepacksManager.updateRepacks();
|
|
||||||
};
|
|
||||||
|
|
||||||
registerEvent("removeDownloadSource", removeDownloadSource);
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
import { registerEvent } from "../register-event";
|
|
||||||
import { fetchDownloadSourcesAndUpdate } from "@main/helpers";
|
|
||||||
|
|
||||||
const syncDownloadSources = async (_event: Electron.IpcMainInvokeEvent) =>
|
|
||||||
fetchDownloadSourcesAndUpdate();
|
|
||||||
|
|
||||||
registerEvent("syncDownloadSources", syncDownloadSources);
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
import { registerEvent } from "../register-event";
|
|
||||||
import { downloadSourceRepository } from "@main/repository";
|
|
||||||
import { RepacksManager } from "@main/services";
|
|
||||||
import { downloadSourceWorker } from "@main/workers";
|
|
||||||
|
|
||||||
const validateDownloadSource = async (
|
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
|
||||||
url: string
|
|
||||||
) => {
|
|
||||||
const existingSource = await downloadSourceRepository.findOne({
|
|
||||||
where: { url },
|
|
||||||
});
|
|
||||||
|
|
||||||
if (existingSource)
|
|
||||||
throw new Error("Source with the same url already exists");
|
|
||||||
|
|
||||||
const repacks = RepacksManager.repacks;
|
|
||||||
|
|
||||||
return downloadSourceWorker.run(
|
|
||||||
{ url, repacks },
|
|
||||||
{
|
|
||||||
name: "validateDownloadSource",
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
registerEvent("validateDownloadSource", validateDownloadSource);
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
import type { GameShop, CatalogueEntry, SteamGame } from "@types";
|
import type { GameShop, CatalogueEntry, SteamGame } from "@types";
|
||||||
|
|
||||||
import { steamGamesWorker } from "@main/workers";
|
import { steamGamesWorker } from "@main/workers";
|
||||||
import { RepacksManager } from "@main/services";
|
|
||||||
import { steamUrlBuilder } from "@shared";
|
import { steamUrlBuilder } from "@shared";
|
||||||
|
|
||||||
export interface SearchGamesArgs {
|
export interface SearchGamesArgs {
|
||||||
@@ -13,11 +12,10 @@ export interface SearchGamesArgs {
|
|||||||
export const convertSteamGameToCatalogueEntry = (
|
export const convertSteamGameToCatalogueEntry = (
|
||||||
game: SteamGame
|
game: SteamGame
|
||||||
): CatalogueEntry => ({
|
): CatalogueEntry => ({
|
||||||
objectID: String(game.id),
|
objectId: String(game.id),
|
||||||
title: game.name,
|
title: game.name,
|
||||||
shop: "steam" as GameShop,
|
shop: "steam" as GameShop,
|
||||||
cover: steamUrlBuilder.library(String(game.id)),
|
cover: steamUrlBuilder.library(String(game.id)),
|
||||||
repacks: [],
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export const getSteamGameById = async (
|
export const getSteamGameById = async (
|
||||||
@@ -29,9 +27,5 @@ export const getSteamGameById = async (
|
|||||||
|
|
||||||
if (!steamGame) return null;
|
if (!steamGame) return null;
|
||||||
|
|
||||||
const catalogueEntry = convertSteamGameToCatalogueEntry(steamGame);
|
return convertSteamGameToCatalogueEntry(steamGame);
|
||||||
|
|
||||||
const result = RepacksManager.findRepacksForCatalogueEntry(catalogueEntry);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
import { z } from "zod";
|
|
||||||
|
|
||||||
export const downloadSourceSchema = z.object({
|
|
||||||
name: z.string().max(255),
|
|
||||||
downloads: z.array(
|
|
||||||
z.object({
|
|
||||||
title: z.string().max(255),
|
|
||||||
uris: z.array(z.string()),
|
|
||||||
uploadDate: z.string().max(255),
|
|
||||||
fileSize: z.string().max(255),
|
|
||||||
})
|
|
||||||
),
|
|
||||||
});
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import { defaultDownloadsPath } from "@main/constants";
|
import { appVersion, defaultDownloadsPath } from "@main/constants";
|
||||||
import { app, ipcMain } from "electron";
|
import { ipcMain } from "electron";
|
||||||
|
|
||||||
import "./catalogue/get-catalogue";
|
import "./catalogue/get-catalogue";
|
||||||
import "./catalogue/get-game-shop-details";
|
import "./catalogue/get-game-shop-details";
|
||||||
@@ -7,7 +7,6 @@ import "./catalogue/get-games";
|
|||||||
import "./catalogue/get-how-long-to-beat";
|
import "./catalogue/get-how-long-to-beat";
|
||||||
import "./catalogue/get-random-game";
|
import "./catalogue/get-random-game";
|
||||||
import "./catalogue/search-games";
|
import "./catalogue/search-games";
|
||||||
import "./catalogue/search-game-repacks";
|
|
||||||
import "./catalogue/get-game-stats";
|
import "./catalogue/get-game-stats";
|
||||||
import "./catalogue/get-trending-games";
|
import "./catalogue/get-trending-games";
|
||||||
import "./hardware/get-disk-free-space";
|
import "./hardware/get-disk-free-space";
|
||||||
@@ -25,6 +24,8 @@ import "./library/update-executable-path";
|
|||||||
import "./library/verify-executable-path";
|
import "./library/verify-executable-path";
|
||||||
import "./library/remove-game";
|
import "./library/remove-game";
|
||||||
import "./library/remove-game-from-library";
|
import "./library/remove-game-from-library";
|
||||||
|
import "./library/select-game-wine-prefix";
|
||||||
|
import "./misc/open-checkout";
|
||||||
import "./misc/open-external";
|
import "./misc/open-external";
|
||||||
import "./misc/show-open-dialog";
|
import "./misc/show-open-dialog";
|
||||||
import "./torrenting/cancel-game-download";
|
import "./torrenting/cancel-game-download";
|
||||||
@@ -37,11 +38,8 @@ import "./user-preferences/auto-launch";
|
|||||||
import "./autoupdater/check-for-updates";
|
import "./autoupdater/check-for-updates";
|
||||||
import "./autoupdater/restart-and-install-update";
|
import "./autoupdater/restart-and-install-update";
|
||||||
import "./user-preferences/authenticate-real-debrid";
|
import "./user-preferences/authenticate-real-debrid";
|
||||||
|
import "./download-sources/delete-download-source";
|
||||||
import "./download-sources/get-download-sources";
|
import "./download-sources/get-download-sources";
|
||||||
import "./download-sources/validate-download-source";
|
|
||||||
import "./download-sources/add-download-source";
|
|
||||||
import "./download-sources/remove-download-source";
|
|
||||||
import "./download-sources/sync-download-sources";
|
|
||||||
import "./auth/sign-out";
|
import "./auth/sign-out";
|
||||||
import "./auth/open-auth-window";
|
import "./auth/open-auth-window";
|
||||||
import "./auth/get-session-hash";
|
import "./auth/get-session-hash";
|
||||||
@@ -52,6 +50,8 @@ import "./user/unblock-user";
|
|||||||
import "./user/get-user-friends";
|
import "./user/get-user-friends";
|
||||||
import "./user/get-user-stats";
|
import "./user/get-user-stats";
|
||||||
import "./user/report-user";
|
import "./user/report-user";
|
||||||
|
import "./user/get-unlocked-achievements";
|
||||||
|
import "./user/get-compared-unlocked-achievements";
|
||||||
import "./profile/get-friend-requests";
|
import "./profile/get-friend-requests";
|
||||||
import "./profile/get-me";
|
import "./profile/get-me";
|
||||||
import "./profile/undo-friendship";
|
import "./profile/undo-friendship";
|
||||||
@@ -59,9 +59,18 @@ import "./profile/update-friend-request";
|
|||||||
import "./profile/update-profile";
|
import "./profile/update-profile";
|
||||||
import "./profile/process-profile-image";
|
import "./profile/process-profile-image";
|
||||||
import "./profile/send-friend-request";
|
import "./profile/send-friend-request";
|
||||||
|
import "./profile/sync-friend-requests";
|
||||||
|
import "./cloud-save/download-game-artifact";
|
||||||
|
import "./cloud-save/get-game-artifacts";
|
||||||
|
import "./cloud-save/get-game-backup-preview";
|
||||||
|
import "./cloud-save/upload-save-game";
|
||||||
|
import "./cloud-save/delete-game-artifact";
|
||||||
|
import "./cloud-save/select-game-backup-path";
|
||||||
|
import "./notifications/publish-new-repacks-notification";
|
||||||
import { isPortableVersion } from "@main/helpers";
|
import { isPortableVersion } from "@main/helpers";
|
||||||
|
import "./misc/show-item-in-folder";
|
||||||
|
|
||||||
ipcMain.handle("ping", () => "pong");
|
ipcMain.handle("ping", () => "pong");
|
||||||
ipcMain.handle("getVersion", () => app.getVersion());
|
ipcMain.handle("getVersion", () => appVersion);
|
||||||
ipcMain.handle("isPortableVersion", () => isPortableVersion());
|
ipcMain.handle("isPortableVersion", () => isPortableVersion());
|
||||||
ipcMain.handle("getDefaultDownloadsPath", () => defaultDownloadsPath);
|
ipcMain.handle("getDefaultDownloadsPath", () => defaultDownloadsPath);
|
||||||
|
|||||||
@@ -3,22 +3,22 @@ import { gameRepository } from "@main/repository";
|
|||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
|
|
||||||
import type { GameShop } from "@types";
|
import type { GameShop } from "@types";
|
||||||
import { getFileBase64 } from "@main/helpers";
|
|
||||||
|
|
||||||
import { steamGamesWorker } from "@main/workers";
|
import { steamGamesWorker } from "@main/workers";
|
||||||
import { createGame } from "@main/services/library-sync";
|
import { createGame } from "@main/services/library-sync";
|
||||||
import { steamUrlBuilder } from "@shared";
|
import { steamUrlBuilder } from "@shared";
|
||||||
|
import { updateLocalUnlockedAchivements } from "@main/services/achievements/update-local-unlocked-achivements";
|
||||||
|
|
||||||
const addGameToLibrary = async (
|
const addGameToLibrary = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
objectID: string,
|
objectId: string,
|
||||||
title: string,
|
title: string,
|
||||||
shop: GameShop
|
shop: GameShop
|
||||||
) => {
|
) => {
|
||||||
return gameRepository
|
return gameRepository
|
||||||
.update(
|
.update(
|
||||||
{
|
{
|
||||||
objectID,
|
objectID: objectId,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
shop,
|
shop,
|
||||||
@@ -28,31 +28,27 @@ const addGameToLibrary = async (
|
|||||||
)
|
)
|
||||||
.then(async ({ affected }) => {
|
.then(async ({ affected }) => {
|
||||||
if (!affected) {
|
if (!affected) {
|
||||||
const steamGame = await steamGamesWorker.run(Number(objectID), {
|
const steamGame = await steamGamesWorker.run(Number(objectId), {
|
||||||
name: "getById",
|
name: "getById",
|
||||||
});
|
});
|
||||||
|
|
||||||
const iconUrl = steamGame?.clientIcon
|
const iconUrl = steamGame?.clientIcon
|
||||||
? steamUrlBuilder.icon(objectID, steamGame.clientIcon)
|
? steamUrlBuilder.icon(objectId, steamGame.clientIcon)
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
await gameRepository
|
await gameRepository.insert({
|
||||||
.insert({
|
title,
|
||||||
title,
|
iconUrl,
|
||||||
iconUrl,
|
objectID: objectId,
|
||||||
objectID,
|
shop,
|
||||||
shop,
|
});
|
||||||
})
|
|
||||||
.then(() => {
|
|
||||||
if (iconUrl) {
|
|
||||||
getFileBase64(iconUrl).then((base64) =>
|
|
||||||
gameRepository.update({ objectID }, { iconUrl: base64 })
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const game = await gameRepository.findOne({ where: { objectID } });
|
const game = await gameRepository.findOne({
|
||||||
|
where: { objectID: objectId },
|
||||||
|
});
|
||||||
|
|
||||||
|
updateLocalUnlockedAchivements(game!);
|
||||||
|
|
||||||
createGame(game!).catch(() => {});
|
createGame(game!).catch(() => {});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,15 +2,15 @@ import { gameRepository } from "@main/repository";
|
|||||||
|
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
|
|
||||||
const getGameByObjectID = async (
|
const getGameByObjectId = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
objectID: string
|
objectId: string
|
||||||
) =>
|
) =>
|
||||||
gameRepository.findOne({
|
gameRepository.findOne({
|
||||||
where: {
|
where: {
|
||||||
objectID,
|
objectID: objectId,
|
||||||
isDeleted: false,
|
isDeleted: false,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
registerEvent("getGameByObjectID", getGameByObjectID);
|
registerEvent("getGameByObjectId", getGameByObjectId);
|
||||||
|
|||||||
@@ -50,7 +50,8 @@ const openGameInstaller = async (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fs.lstatSync(gamePath).isFile()) {
|
if (fs.lstatSync(gamePath).isFile()) {
|
||||||
return executeGameInstaller(gamePath);
|
shell.showItemInFolder(gamePath);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const setupPath = path.join(gamePath, "setup.exe");
|
const setupPath = path.join(gamePath, "setup.exe");
|
||||||
|
|||||||
13
src/main/events/library/select-game-wine-prefix.ts
Normal file
13
src/main/events/library/select-game-wine-prefix.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import { gameRepository } from "@main/repository";
|
||||||
|
|
||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
|
||||||
|
const selectGameWinePrefix = async (
|
||||||
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
id: number,
|
||||||
|
winePrefixPath: string
|
||||||
|
) => {
|
||||||
|
return gameRepository.update({ id }, { winePrefixPath });
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("selectGameWinePrefix", selectGameWinePrefix);
|
||||||
26
src/main/events/misc/open-checkout.ts
Normal file
26
src/main/events/misc/open-checkout.ts
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
import { shell } from "electron";
|
||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
import { userAuthRepository } from "@main/repository";
|
||||||
|
import { HydraApi } from "@main/services";
|
||||||
|
|
||||||
|
const openCheckout = async (_event: Electron.IpcMainInvokeEvent) => {
|
||||||
|
const userAuth = await userAuthRepository.findOne({ where: { id: 1 } });
|
||||||
|
|
||||||
|
if (!userAuth) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const paymentToken = await HydraApi.post("/auth/payment", {
|
||||||
|
refreshToken: userAuth.refreshToken,
|
||||||
|
}).then((response) => response.accessToken);
|
||||||
|
|
||||||
|
const params = new URLSearchParams({
|
||||||
|
token: paymentToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
shell.openExternal(
|
||||||
|
`${import.meta.env.MAIN_VITE_CHECKOUT_URL}?${params.toString()}`
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("openCheckout", openCheckout);
|
||||||
11
src/main/events/misc/show-item-in-folder.ts
Normal file
11
src/main/events/misc/show-item-in-folder.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import { shell } from "electron";
|
||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
|
||||||
|
const showItemInFolder = async (
|
||||||
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
filePath: string
|
||||||
|
) => {
|
||||||
|
return shell.showItemInFolder(filePath);
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("showItemInFolder", showItemInFolder);
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
import { Notification } from "electron";
|
||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
import { userPreferencesRepository } from "@main/repository";
|
||||||
|
import { t } from "i18next";
|
||||||
|
|
||||||
|
const publishNewRepacksNotification = async (
|
||||||
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
newRepacksCount: number
|
||||||
|
) => {
|
||||||
|
if (newRepacksCount < 1) return;
|
||||||
|
|
||||||
|
const userPreferences = await userPreferencesRepository.findOne({
|
||||||
|
where: { id: 1 },
|
||||||
|
});
|
||||||
|
|
||||||
|
if (userPreferences?.repackUpdatesNotificationsEnabled) {
|
||||||
|
new Notification({
|
||||||
|
title: t("repack_list_updated", {
|
||||||
|
ns: "notifications",
|
||||||
|
}),
|
||||||
|
body: t("repack_count", {
|
||||||
|
ns: "notifications",
|
||||||
|
count: newRepacksCount,
|
||||||
|
}),
|
||||||
|
}).show();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("publishNewRepacksNotification", publishNewRepacksNotification);
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import { HydraApi } from "@main/services";
|
import { HydraApi } from "@main/services";
|
||||||
import { FriendRequest } from "@types";
|
import type { FriendRequest } from "@types";
|
||||||
|
|
||||||
const getFriendRequests = async (
|
const getFriendRequests = async (
|
||||||
_event: Electron.IpcMainInvokeEvent
|
_event: Electron.IpcMainInvokeEvent
|
||||||
|
|||||||
@@ -1,71 +1,11 @@
|
|||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import * as Sentry from "@sentry/electron/main";
|
import type { UserDetails } from "@types";
|
||||||
import { HydraApi, logger } from "@main/services";
|
import { getUserData } from "@main/services/user/get-user-data";
|
||||||
import { UserProfile } from "@types";
|
|
||||||
import { userAuthRepository } from "@main/repository";
|
|
||||||
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 (
|
const getMe = async (
|
||||||
_event: Electron.IpcMainInvokeEvent
|
_event: Electron.IpcMainInvokeEvent
|
||||||
): Promise<UserProfile | null> => {
|
): Promise<UserDetails | null> => {
|
||||||
return HydraApi.get(`/profile/me`)
|
return getUserData();
|
||||||
.then(async (me) => {
|
|
||||||
userAuthRepository.upsert(
|
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
displayName: me.displayName,
|
|
||||||
profileImageUrl: me.profileImageUrl,
|
|
||||||
userId: me.id,
|
|
||||||
},
|
|
||||||
["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(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;
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
registerEvent("getMe", getMe);
|
registerEvent("getMe", getMe);
|
||||||
|
|||||||
17
src/main/events/profile/sync-friend-requests.ts
Normal file
17
src/main/events/profile/sync-friend-requests.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
import { HydraApi } from "@main/services";
|
||||||
|
import { UserNotLoggedInError } from "@shared";
|
||||||
|
import type { FriendRequestSync } from "@types";
|
||||||
|
|
||||||
|
const syncFriendRequests = async (_event: Electron.IpcMainInvokeEvent) => {
|
||||||
|
return HydraApi.get<FriendRequestSync>(`/profile/friend-requests/sync`).catch(
|
||||||
|
(err) => {
|
||||||
|
if (err instanceof UserNotLoggedInError) {
|
||||||
|
return { friendRequests: [] };
|
||||||
|
}
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("syncFriendRequests", syncFriendRequests);
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import { HydraApi } from "@main/services";
|
import { HydraApi } from "@main/services";
|
||||||
import { FriendRequestAction } from "@types";
|
import type { FriendRequestAction } from "@types";
|
||||||
|
|
||||||
const updateFriendRequest = async (
|
const updateFriendRequest = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
|||||||
@@ -1,56 +1,75 @@
|
|||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import { HydraApi, PythonInstance } from "@main/services";
|
import { HydraApi } from "@main/services";
|
||||||
import fs from "node:fs";
|
import fs from "node:fs";
|
||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
import type { UpdateProfileRequest, UserProfile } from "@types";
|
import type { UpdateProfileRequest, UserProfile } from "@types";
|
||||||
import { omit } from "lodash-es";
|
import { omit } from "lodash-es";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
|
import { fileTypeFromFile } from "file-type";
|
||||||
interface PresignedResponse {
|
|
||||||
presignedUrl: string;
|
|
||||||
profileImageUrl: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
const patchUserProfile = async (updateProfile: UpdateProfileRequest) => {
|
const patchUserProfile = async (updateProfile: UpdateProfileRequest) => {
|
||||||
return HydraApi.patch<UserProfile>("/profile", updateProfile);
|
return HydraApi.patch<UserProfile>("/profile", updateProfile);
|
||||||
};
|
};
|
||||||
|
|
||||||
const getNewProfileImageUrl = async (localImageUrl: string) => {
|
const uploadImage = async (
|
||||||
const { imagePath, mimeType } =
|
type: "profile-image" | "background-image",
|
||||||
await PythonInstance.processProfileImage(localImageUrl);
|
imagePath: string
|
||||||
|
) => {
|
||||||
const stats = fs.statSync(imagePath);
|
const stat = fs.statSync(imagePath);
|
||||||
const fileBuffer = fs.readFileSync(imagePath);
|
const fileBuffer = fs.readFileSync(imagePath);
|
||||||
const fileSizeInBytes = stats.size;
|
const fileSizeInBytes = stat.size;
|
||||||
|
|
||||||
const { presignedUrl, profileImageUrl } =
|
const response = await HydraApi.post<{ presignedUrl: string }>(
|
||||||
await HydraApi.post<PresignedResponse>(`/presigned-urls/profile-image`, {
|
`/presigned-urls/${type}`,
|
||||||
|
{
|
||||||
imageExt: path.extname(imagePath).slice(1),
|
imageExt: path.extname(imagePath).slice(1),
|
||||||
imageLength: fileSizeInBytes,
|
imageLength: fileSizeInBytes,
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
await axios.put(presignedUrl, fileBuffer, {
|
const mimeType = await fileTypeFromFile(imagePath);
|
||||||
|
|
||||||
|
await axios.put(response.presignedUrl, fileBuffer, {
|
||||||
headers: {
|
headers: {
|
||||||
"Content-Type": mimeType,
|
"Content-Type": mimeType?.mime,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
return profileImageUrl;
|
if (type === "background-image") {
|
||||||
|
return response["backgroundImageUrl"];
|
||||||
|
}
|
||||||
|
|
||||||
|
return response["profileImageUrl"];
|
||||||
};
|
};
|
||||||
|
|
||||||
const updateProfile = async (
|
const updateProfile = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
updateProfile: UpdateProfileRequest
|
updateProfile: UpdateProfileRequest
|
||||||
) => {
|
) => {
|
||||||
if (!updateProfile.profileImageUrl) {
|
const payload = omit(updateProfile, [
|
||||||
return patchUserProfile(omit(updateProfile, "profileImageUrl"));
|
"profileImageUrl",
|
||||||
|
"backgroundImageUrl",
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (updateProfile.profileImageUrl) {
|
||||||
|
const profileImageUrl = await uploadImage(
|
||||||
|
"profile-image",
|
||||||
|
updateProfile.profileImageUrl
|
||||||
|
).catch(() => undefined);
|
||||||
|
|
||||||
|
payload["profileImageUrl"] = profileImageUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
const profileImageUrl = await getNewProfileImageUrl(
|
if (updateProfile.backgroundImageUrl) {
|
||||||
updateProfile.profileImageUrl
|
const backgroundImageUrl = await uploadImage(
|
||||||
).catch(() => undefined);
|
"background-image",
|
||||||
|
updateProfile.backgroundImageUrl
|
||||||
|
).catch(() => undefined);
|
||||||
|
|
||||||
return patchUserProfile({ ...updateProfile, profileImageUrl });
|
payload["backgroundImageUrl"] = backgroundImageUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return patchUserProfile(payload);
|
||||||
};
|
};
|
||||||
|
|
||||||
registerEvent("updateProfile", updateProfile);
|
registerEvent("updateProfile", updateProfile);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user