Merge branch 'main' into hotfix-game-minimun-specs-accordion
@ -1,3 +1,2 @@
|
|||||||
MAIN_VITE_API_URL=API_URL
|
MAIN_VITE_API_URL=API_URL
|
||||||
MAIN_VITE_AUTH_URL=AUTH_URL
|
MAIN_VITE_AUTH_URL=AUTH_URL
|
||||||
MAIN_VITE_STEAMGRIDDB_API_KEY=YOUR_API_KEY
|
|
||||||
|
@ -3,3 +3,4 @@ dist
|
|||||||
out
|
out
|
||||||
.gitignore
|
.gitignore
|
||||||
migration.stub
|
migration.stub
|
||||||
|
hydra-python-rpc/
|
||||||
|
@ -26,4 +26,9 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
settings: {
|
||||||
|
react: {
|
||||||
|
version: "detect",
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
30
.github/workflows/build.yml
vendored
@ -2,9 +2,6 @@ name: Build
|
|||||||
|
|
||||||
on: pull_request
|
on: pull_request
|
||||||
|
|
||||||
env:
|
|
||||||
AWS_REGION: us-east-1
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
strategy:
|
strategy:
|
||||||
@ -34,7 +31,7 @@ jobs:
|
|||||||
run: pip install -r requirements.txt
|
run: pip install -r requirements.txt
|
||||||
|
|
||||||
- name: Build with cx_Freeze
|
- name: Build with cx_Freeze
|
||||||
run: python torrent-client/setup.py build
|
run: python python_rpc/setup.py build
|
||||||
|
|
||||||
- name: Build Linux
|
- name: Build Linux
|
||||||
if: matrix.os == 'ubuntu-latest'
|
if: matrix.os == 'ubuntu-latest'
|
||||||
@ -46,10 +43,12 @@ jobs:
|
|||||||
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_STAGING_API_URL }}
|
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_STAGING_API_URL }}
|
||||||
MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_STAGING_AUTH_URL }}
|
MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_STAGING_AUTH_URL }}
|
||||||
MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_STAGING_CHECKOUT_URL }}
|
MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_STAGING_CHECKOUT_URL }}
|
||||||
MAIN_VITE_ANALYTICS_API_URL: ${{ vars.MAIN_VITE_ANALYTICS_API_URL }}
|
|
||||||
RENDERER_VITE_INTERCOM_APP_ID: ${{ vars.RENDERER_VITE_INTERCOM_APP_ID }}
|
RENDERER_VITE_INTERCOM_APP_ID: ${{ vars.RENDERER_VITE_INTERCOM_APP_ID }}
|
||||||
RENDERER_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.RENDERER_VITE_EXTERNAL_RESOURCES_URL }}
|
RENDERER_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.EXTERNAL_RESOURCES_URL }}
|
||||||
|
MAIN_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.EXTERNAL_RESOURCES_URL }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
|
RENDERER_VITE_SENTRY_DSN: ${{ vars.SENTRY_DSN }}
|
||||||
|
|
||||||
- name: Build Windows
|
- name: Build Windows
|
||||||
if: matrix.os == 'windows-latest'
|
if: matrix.os == 'windows-latest'
|
||||||
@ -58,10 +57,25 @@ jobs:
|
|||||||
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_STAGING_API_URL }}
|
MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_STAGING_API_URL }}
|
||||||
MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_STAGING_AUTH_URL }}
|
MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_STAGING_AUTH_URL }}
|
||||||
MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_STAGING_CHECKOUT_URL }}
|
MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_STAGING_CHECKOUT_URL }}
|
||||||
MAIN_VITE_ANALYTICS_API_URL: ${{ vars.MAIN_VITE_ANALYTICS_API_URL }}
|
|
||||||
RENDERER_VITE_INTERCOM_APP_ID: ${{ vars.RENDERER_VITE_INTERCOM_APP_ID }}
|
RENDERER_VITE_INTERCOM_APP_ID: ${{ vars.RENDERER_VITE_INTERCOM_APP_ID }}
|
||||||
RENDERER_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.RENDERER_VITE_EXTERNAL_RESOURCES_URL }}
|
RENDERER_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.EXTERNAL_RESOURCES_URL }}
|
||||||
|
MAIN_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.EXTERNAL_RESOURCES_URL }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
|
RENDERER_VITE_SENTRY_DSN: ${{ vars.SENTRY_DSN }}
|
||||||
|
|
||||||
|
- name: Test Upload build
|
||||||
|
env:
|
||||||
|
BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
|
||||||
|
S3_ENDPOINT: ${{ secrets.S3_ENDPOINT }}
|
||||||
|
S3_ACCESS_KEY_ID: ${{ secrets.S3_ACCESS_KEY_ID }}
|
||||||
|
S3_SECRET_ACCESS_KEY: ${{ secrets.S3_SECRET_ACCESS_KEY }}
|
||||||
|
S3_BUILDS_BUCKET_NAME: ${{ secrets.S3_BUILDS_BUCKET_NAME }}
|
||||||
|
BUILDS_URL: ${{ secrets.BUILDS_URL }}
|
||||||
|
BUILD_WEBHOOK_URL: ${{ secrets.BUILD_WEBHOOK_URL }}
|
||||||
|
GITHUB_ACTOR: ${{ github.actor }}
|
||||||
|
|
||||||
|
run: node scripts/upload-build.cjs
|
||||||
|
|
||||||
- name: Create artifact
|
- name: Create artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
|
14
.github/workflows/release.yml
vendored
@ -33,7 +33,7 @@ jobs:
|
|||||||
run: pip install -r requirements.txt
|
run: pip install -r requirements.txt
|
||||||
|
|
||||||
- name: Build with cx_Freeze
|
- name: Build with cx_Freeze
|
||||||
run: python torrent-client/setup.py build
|
run: python python_rpc/setup.py build
|
||||||
|
|
||||||
- name: Build Linux
|
- name: Build Linux
|
||||||
if: matrix.os == 'ubuntu-latest'
|
if: matrix.os == 'ubuntu-latest'
|
||||||
@ -47,8 +47,12 @@ jobs:
|
|||||||
MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_CHECKOUT_URL }}
|
MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_CHECKOUT_URL }}
|
||||||
MAIN_VITE_ANALYTICS_API_URL: ${{ vars.MAIN_VITE_ANALYTICS_API_URL }}
|
MAIN_VITE_ANALYTICS_API_URL: ${{ vars.MAIN_VITE_ANALYTICS_API_URL }}
|
||||||
RENDERER_VITE_INTERCOM_APP_ID: ${{ vars.RENDERER_VITE_INTERCOM_APP_ID }}
|
RENDERER_VITE_INTERCOM_APP_ID: ${{ vars.RENDERER_VITE_INTERCOM_APP_ID }}
|
||||||
RENDERER_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.RENDERER_VITE_EXTERNAL_RESOURCES_URL }}
|
RENDERER_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.EXTERNAL_RESOURCES_URL }}
|
||||||
|
MAIN_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.EXTERNAL_RESOURCES_URL }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
|
RENDERER_VITE_SENTRY_DSN: ${{ vars.SENTRY_DSN }}
|
||||||
|
|
||||||
- name: Build Windows
|
- name: Build Windows
|
||||||
if: matrix.os == 'windows-latest'
|
if: matrix.os == 'windows-latest'
|
||||||
run: yarn build:win
|
run: yarn build:win
|
||||||
@ -58,8 +62,12 @@ jobs:
|
|||||||
MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_CHECKOUT_URL }}
|
MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_CHECKOUT_URL }}
|
||||||
MAIN_VITE_ANALYTICS_API_URL: ${{ vars.MAIN_VITE_ANALYTICS_API_URL }}
|
MAIN_VITE_ANALYTICS_API_URL: ${{ vars.MAIN_VITE_ANALYTICS_API_URL }}
|
||||||
RENDERER_VITE_INTERCOM_APP_ID: ${{ vars.RENDERER_VITE_INTERCOM_APP_ID }}
|
RENDERER_VITE_INTERCOM_APP_ID: ${{ vars.RENDERER_VITE_INTERCOM_APP_ID }}
|
||||||
RENDERER_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.RENDERER_VITE_EXTERNAL_RESOURCES_URL }}
|
RENDERER_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.EXTERNAL_RESOURCES_URL }}
|
||||||
|
MAIN_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.EXTERNAL_RESOURCES_URL }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
|
RENDERER_VITE_SENTRY_DSN: ${{ vars.SENTRY_DSN }}
|
||||||
|
|
||||||
- name: Create artifact
|
- name: Create artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
|
8
.gitignore
vendored
@ -1,7 +1,5 @@
|
|||||||
.vscode/
|
.vscode/
|
||||||
node_modules/
|
node_modules/
|
||||||
hydra-download-manager/
|
|
||||||
fastlist.exe
|
|
||||||
__pycache__
|
__pycache__
|
||||||
dist
|
dist
|
||||||
out
|
out
|
||||||
@ -10,3 +8,9 @@ out
|
|||||||
.env
|
.env
|
||||||
.vite
|
.vite
|
||||||
ludusavi/
|
ludusavi/
|
||||||
|
hydra-python-rpc/
|
||||||
|
aria2/
|
||||||
|
.python-version
|
||||||
|
|
||||||
|
# Sentry Config File
|
||||||
|
.env.sentry-build-plugin
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
|
[<img src="./resources/icon.png" width="144"/>](https://help.hydralauncher.gg)
|
||||||
|
|
||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
@ -125,6 +125,10 @@ cd hydra
|
|||||||
yarn
|
yarn
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Install OpenSSL 1.1
|
||||||
|
|
||||||
|
[OpenSSL 1.1](https://slproweb.com/download/Win64OpenSSL-1_1_1w.exe) is required by libtorrent in Windows environments.
|
||||||
|
|
||||||
### Install Python 3.9
|
### Install Python 3.9
|
||||||
|
|
||||||
Ensure you have Python 3.9 installed on your machine. You can download and install it from [python.org](https://www.python.org/downloads/release/python-3913/).
|
Ensure you have Python 3.9 installed on your machine. You can download and install it from [python.org](https://www.python.org/downloads/release/python-3913/).
|
||||||
|
BIN
build/icon.ico
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 108 KiB |
BIN
build/icon.png
Before Width: | Height: | Size: 188 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 188 KiB After Width: | Height: | Size: 19 KiB |
@ -1,7 +1,5 @@
|
|||||||
!macro customUnInstall
|
!macro customUnInstall
|
||||||
${ifNot} ${isUpdated}
|
${ifNot} ${isUpdated}
|
||||||
RMDir /r "$APPDATA\${APP_PACKAGE_NAME}"
|
|
||||||
RMDir /r "$APPDATA\hydra"
|
|
||||||
RMDir /r "$LOCALAPPDATA\hydralauncher-updater"
|
RMDir /r "$LOCALAPPDATA\hydralauncher-updater"
|
||||||
${endIf}
|
${endIf}
|
||||||
!macroend
|
!macroend
|
||||||
|
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 604 KiB |
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
|
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg)
|
||||||
|
|
||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
@ -14,7 +14,7 @@
|
|||||||
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
||||||
|
|
||||||
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
||||||
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
|
[![en](https://img.shields.io/badge/lang-en-red.svg)](../README.md)
|
||||||
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
||||||
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
||||||
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
||||||
@ -27,7 +27,7 @@
|
|||||||
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
|
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
|
||||||
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
||||||
|
|
||||||
![Hydra Catalogue](./screenshot.png)
|
![Hydra Catalogue](screenshot.png)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
|
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg)
|
||||||
|
|
||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
@ -14,7 +14,7 @@
|
|||||||
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
||||||
|
|
||||||
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
||||||
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
|
[![en](https://img.shields.io/badge/lang-en-red.svg)](../README.md)
|
||||||
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
||||||
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
||||||
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
||||||
@ -27,7 +27,7 @@
|
|||||||
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
|
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
|
||||||
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
||||||
|
|
||||||
![Hydra Katalog](./screenshot.png)
|
![Hydra Katalog](screenshot.png)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
|
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg)
|
||||||
|
|
||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
@ -14,7 +14,7 @@
|
|||||||
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
||||||
|
|
||||||
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
||||||
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
|
[![en](https://img.shields.io/badge/lang-en-red.svg)](../README.md)
|
||||||
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
||||||
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
||||||
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
||||||
@ -26,7 +26,7 @@
|
|||||||
[![da](https://img.shields.io/badge/lang-da-red)](README.da.md)
|
[![da](https://img.shields.io/badge/lang-da-red)](README.da.md)
|
||||||
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
||||||
|
|
||||||
![Hydra Catalogue](./screenshot.png)
|
![Hydra Catalogue](screenshot.png)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
|
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg)
|
||||||
|
|
||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
@ -13,7 +13,7 @@
|
|||||||
[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions)
|
[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions)
|
||||||
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
||||||
|
|
||||||
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
|
[![en](https://img.shields.io/badge/lang-en-red.svg)](../README.md)
|
||||||
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
||||||
[![pl](https://img.shields.io/badge/lang-pl-white)](README.pl.md)
|
[![pl](https://img.shields.io/badge/lang-pl-white)](README.pl.md)
|
||||||
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
||||||
@ -27,7 +27,7 @@
|
|||||||
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
|
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
|
||||||
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
||||||
|
|
||||||
![Hydra Katalog](./screenshot.png)
|
![Hydra Katalog](screenshot.png)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
|
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg)
|
||||||
|
|
||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
@ -14,7 +14,7 @@
|
|||||||
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
||||||
|
|
||||||
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
||||||
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
|
[![en](https://img.shields.io/badge/lang-en-red.svg)](../README.md)
|
||||||
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
||||||
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
||||||
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
||||||
@ -27,7 +27,7 @@
|
|||||||
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
|
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
|
||||||
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
||||||
|
|
||||||
![Hydra Catalogue](./screenshot.png)
|
![Hydra Catalogue](screenshot.png)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[<img src="../resources/icon.png" width="144"/>](https://hydralauncher.site)
|
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg)
|
||||||
|
|
||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
@ -11,21 +11,21 @@
|
|||||||
[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions)
|
[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions)
|
||||||
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
||||||
|
|
||||||
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](./README.pt-BR.md)
|
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
||||||
[![en](https://img.shields.io/badge/lang-en-red.svg)](./README.md)
|
[![en](https://img.shields.io/badge/lang-en-red.svg)](../README.md)
|
||||||
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](./README.ru.md)
|
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
||||||
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](./README.uk-UA.md)
|
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
||||||
[![be](https://img.shields.io/badge/lang-be-orange)](./README.be.md)
|
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
||||||
[![es](https://img.shields.io/badge/lang-es-red)](./README.es.md)
|
[![es](https://img.shields.io/badge/lang-es-red)](README.es.md)
|
||||||
[![fr](https://img.shields.io/badge/lang-fr-blue)](./README.fr.md)
|
[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md)
|
||||||
[![de](https://img.shields.io/badge/lang-de-black)](./README.de.md)
|
[![de](https://img.shields.io/badge/lang-de-black)](README.de.md)
|
||||||
[![ita](https://img.shields.io/badge/lang-it-red)](./README.it.md)
|
[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md)
|
||||||
[![cs](https://img.shields.io/badge/lang-cs-purple)](./README.cs.md)
|
[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md)
|
||||||
[![da](https://img.shields.io/badge/lang-da-red)](./README.da.md)
|
[![da](https://img.shields.io/badge/lang-da-red)](README.da.md)
|
||||||
[![nb](https://img.shields.io/badge/lang-nb-blue)](./README.nb.md)
|
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
|
||||||
[![ee](https://img.shields.io/badge/lang-et-blue.svg)](./README.et.md)
|
[![ee](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
||||||
|
|
||||||
![Hydra Kataloog](./screenshot.png)
|
![Hydra Kataloog](screenshot.png)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
|
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg)
|
||||||
|
|
||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
@ -14,7 +14,7 @@
|
|||||||
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
||||||
|
|
||||||
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
||||||
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
|
[![en](https://img.shields.io/badge/lang-en-red.svg)](../README.md)
|
||||||
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
||||||
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
||||||
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
||||||
@ -27,7 +27,7 @@
|
|||||||
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
|
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
|
||||||
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
||||||
|
|
||||||
![Catalogue Hydra](./screenshot.png)
|
![Catalogue Hydra](screenshot.png)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
|
[<img src="./resources/icon.png" width="144"/>](https://help.hydralauncher.gg)
|
||||||
|
|
||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
|
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg)
|
||||||
|
|
||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
@ -14,7 +14,7 @@
|
|||||||
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
||||||
|
|
||||||
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
||||||
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
|
[![en](https://img.shields.io/badge/lang-en-red.svg)](../README.md)
|
||||||
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
||||||
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
||||||
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
||||||
@ -26,7 +26,7 @@
|
|||||||
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
|
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
|
||||||
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
||||||
|
|
||||||
![Hydra Catalogue](./screenshot.png)
|
![Hydra Catalogue](screenshot.png)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
|
[<img src="./resources/icon.png" width="144"/>](https://help.hydralauncher.gg)
|
||||||
|
|
||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
|
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg)
|
||||||
|
|
||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
@ -14,7 +14,7 @@
|
|||||||
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
||||||
|
|
||||||
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
||||||
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
|
[![en](https://img.shields.io/badge/lang-en-red.svg)](../README.md)
|
||||||
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
||||||
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
||||||
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
|
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg)
|
||||||
|
|
||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
@ -14,7 +14,7 @@
|
|||||||
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
||||||
|
|
||||||
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
||||||
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
|
[![en](https://img.shields.io/badge/lang-en-red.svg)](../README.md)
|
||||||
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
||||||
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
||||||
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
|
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg)
|
||||||
|
|
||||||
<h1 align="center">Hydra Launcher</h1>
|
<h1 align="center">Hydra Launcher</h1>
|
||||||
|
|
||||||
@ -14,7 +14,7 @@
|
|||||||
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
|
||||||
|
|
||||||
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
|
||||||
[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md)
|
[![en](https://img.shields.io/badge/lang-en-red.svg)](../README.md)
|
||||||
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
|
||||||
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
|
||||||
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
|
||||||
@ -27,7 +27,7 @@
|
|||||||
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
|
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
|
||||||
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
|
||||||
|
|
||||||
![Hydra Catalogue](./screenshot.png)
|
![Hydra Catalogue](screenshot.png)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -3,8 +3,9 @@ productName: Hydra
|
|||||||
directories:
|
directories:
|
||||||
buildResources: build
|
buildResources: build
|
||||||
extraResources:
|
extraResources:
|
||||||
|
- aria2
|
||||||
- ludusavi
|
- ludusavi
|
||||||
- hydra-download-manager
|
- hydra-python-rpc
|
||||||
- seeds
|
- seeds
|
||||||
- from: node_modules/create-desktop-shortcuts/src/windows.vbs
|
- from: node_modules/create-desktop-shortcuts/src/windows.vbs
|
||||||
- from: resources/achievement.wav
|
- from: resources/achievement.wav
|
||||||
|
@ -8,6 +8,7 @@ import {
|
|||||||
import react from "@vitejs/plugin-react";
|
import react from "@vitejs/plugin-react";
|
||||||
import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin";
|
import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin";
|
||||||
import svgr from "vite-plugin-svgr";
|
import svgr from "vite-plugin-svgr";
|
||||||
|
import { sentryVitePlugin } from "@sentry/vite-plugin";
|
||||||
|
|
||||||
export default defineConfig(({ mode }) => {
|
export default defineConfig(({ mode }) => {
|
||||||
loadEnv(mode);
|
loadEnv(mode);
|
||||||
@ -44,7 +45,16 @@ export default defineConfig(({ mode }) => {
|
|||||||
"@shared": resolve("src/shared"),
|
"@shared": resolve("src/shared"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
plugins: [svgr(), react(), vanillaExtractPlugin()],
|
plugins: [
|
||||||
|
svgr(),
|
||||||
|
react(),
|
||||||
|
vanillaExtractPlugin(),
|
||||||
|
sentryVitePlugin({
|
||||||
|
authToken: process.env.SENTRY_AUTH_TOKEN,
|
||||||
|
org: "hydra-launcher",
|
||||||
|
project: "hydra-renderer",
|
||||||
|
}),
|
||||||
|
],
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
52
package.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "hydralauncher",
|
"name": "hydralauncher",
|
||||||
"version": "3.0.6",
|
"version": "3.1.5",
|
||||||
"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 && node ./postinstall.cjs",
|
"postinstall": "electron-builder install-app-deps && node ./scripts/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",
|
||||||
@ -34,27 +34,29 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@electron-toolkit/preload": "^3.0.0",
|
"@electron-toolkit/preload": "^3.0.0",
|
||||||
"@electron-toolkit/utils": "^3.0.0",
|
"@electron-toolkit/utils": "^3.0.0",
|
||||||
"@fontsource/noto-sans": "^5.0.22",
|
"@fontsource/noto-sans": "^5.1.0",
|
||||||
"@hookform/resolvers": "^3.9.0",
|
"@hookform/resolvers": "^3.9.1",
|
||||||
"@primer/octicons-react": "^19.9.0",
|
"@primer/octicons-react": "^19.9.0",
|
||||||
|
"@radix-ui/react-dropdown-menu": "^2.1.2",
|
||||||
"@reduxjs/toolkit": "^2.2.3",
|
"@reduxjs/toolkit": "^2.2.3",
|
||||||
|
"@sentry/react": "^8.47.0",
|
||||||
|
"@sentry/vite-plugin": "^2.22.7",
|
||||||
"@vanilla-extract/css": "^1.14.2",
|
"@vanilla-extract/css": "^1.14.2",
|
||||||
"@vanilla-extract/dynamic": "^2.1.1",
|
"@vanilla-extract/dynamic": "^2.1.2",
|
||||||
"@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.9",
|
||||||
"better-sqlite3": "^11.3.0",
|
"better-sqlite3": "^11.7.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",
|
||||||
"dexie": "^4.0.9",
|
"dexie": "^4.0.10",
|
||||||
"electron-log": "^5.2.0",
|
"diskusage": "^1.2.0",
|
||||||
|
"electron-log": "^5.2.4",
|
||||||
"electron-updater": "^6.3.9",
|
"electron-updater": "^6.3.9",
|
||||||
"file-type": "^19.6.0",
|
"file-type": "^19.6.0",
|
||||||
"flexsearch": "^0.7.43",
|
|
||||||
"i18next": "^23.11.2",
|
"i18next": "^23.11.2",
|
||||||
"i18next-browser-languagedetector": "^7.2.1",
|
"i18next-browser-languagedetector": "^7.2.1",
|
||||||
"jsdom": "^24.0.0",
|
"jsdom": "^24.0.0",
|
||||||
@ -63,6 +65,7 @@
|
|||||||
"lodash-es": "^4.17.21",
|
"lodash-es": "^4.17.21",
|
||||||
"parse-torrent": "^11.0.17",
|
"parse-torrent": "^11.0.17",
|
||||||
"piscina": "^4.7.0",
|
"piscina": "^4.7.0",
|
||||||
|
"rc-virtual-list": "^3.16.1",
|
||||||
"react-hook-form": "^7.53.0",
|
"react-hook-form": "^7.53.0",
|
||||||
"react-i18next": "^14.1.0",
|
"react-i18next": "^14.1.0",
|
||||||
"react-loading-skeleton": "^3.4.0",
|
"react-loading-skeleton": "^3.4.0",
|
||||||
@ -72,14 +75,15 @@
|
|||||||
"sudo-prompt": "^9.2.1",
|
"sudo-prompt": "^9.2.1",
|
||||||
"tar": "^7.4.3",
|
"tar": "^7.4.3",
|
||||||
"typeorm": "^0.3.20",
|
"typeorm": "^0.3.20",
|
||||||
"user-agents": "^1.1.193",
|
"user-agents": "^1.1.387",
|
||||||
"yaml": "^2.4.1",
|
"yaml": "^2.6.1",
|
||||||
"yup": "^1.4.0",
|
"yup": "^1.5.0",
|
||||||
"zod": "^3.23.8"
|
"zod": "^3.24.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "^19.5.0",
|
"@aws-sdk/client-s3": "^3.705.0",
|
||||||
"@commitlint/config-conventional": "^19.5.0",
|
"@commitlint/cli": "^19.6.0",
|
||||||
|
"@commitlint/config-conventional": "^19.6.0",
|
||||||
"@electron-toolkit/eslint-config-prettier": "^2.0.0",
|
"@electron-toolkit/eslint-config-prettier": "^2.0.0",
|
||||||
"@electron-toolkit/eslint-config-ts": "^2.0.0",
|
"@electron-toolkit/eslint-config-ts": "^2.0.0",
|
||||||
"@electron-toolkit/tsconfig": "^1.0.1",
|
"@electron-toolkit/tsconfig": "^1.0.1",
|
||||||
@ -87,8 +91,8 @@
|
|||||||
"@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/folder-hash": "^4.0.4",
|
||||||
"@types/jsdom": "^21.1.6",
|
"@types/jsdom": "^21.1.7",
|
||||||
"@types/jsonwebtoken": "^9.0.6",
|
"@types/jsonwebtoken": "^9.0.7",
|
||||||
"@types/lodash-es": "^4.17.12",
|
"@types/lodash-es": "^4.17.12",
|
||||||
"@types/node": "^20.12.7",
|
"@types/node": "^20.12.7",
|
||||||
"@types/parse-torrent": "^5.8.7",
|
"@types/parse-torrent": "^5.8.7",
|
||||||
@ -98,15 +102,15 @@
|
|||||||
"@types/user-agents": "^1.0.4",
|
"@types/user-agents": "^1.0.4",
|
||||||
"@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": "^31.7.6",
|
||||||
"electron-builder": "^25.1.8",
|
"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.10.2",
|
||||||
"eslint-plugin-react": "^7.33.2",
|
"eslint-plugin-react": "^7.37.2",
|
||||||
"eslint-plugin-react-hooks": "^4.6.0",
|
"eslint-plugin-react-hooks": "^4.6.0",
|
||||||
"husky": "^9.0.11",
|
"husky": "^9.1.7",
|
||||||
"prettier": "^3.2.4",
|
"prettier": "^3.4.2",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"sass-embedded": "^1.80.6",
|
"sass-embedded": "^1.80.6",
|
||||||
|
@ -1,49 +0,0 @@
|
|||||||
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();
|
|
47
python_rpc/http_downloader.py
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import aria2p
|
||||||
|
|
||||||
|
class HttpDownloader:
|
||||||
|
def __init__(self):
|
||||||
|
self.download = None
|
||||||
|
self.aria2 = aria2p.API(
|
||||||
|
aria2p.Client(
|
||||||
|
host="http://localhost",
|
||||||
|
port=6800,
|
||||||
|
secret=""
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def start_download(self, url: str, save_path: str, header: str):
|
||||||
|
if self.download:
|
||||||
|
self.aria2.resume([self.download])
|
||||||
|
else:
|
||||||
|
downloads = self.aria2.add(url, options={"header": header, "dir": save_path})
|
||||||
|
self.download = downloads[0]
|
||||||
|
|
||||||
|
def pause_download(self):
|
||||||
|
if self.download:
|
||||||
|
self.aria2.pause([self.download])
|
||||||
|
|
||||||
|
def cancel_download(self):
|
||||||
|
if self.download:
|
||||||
|
self.aria2.remove([self.download])
|
||||||
|
self.download = None
|
||||||
|
|
||||||
|
def get_download_status(self):
|
||||||
|
if self.download == None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
download = self.aria2.get_download(self.download.gid)
|
||||||
|
|
||||||
|
response = {
|
||||||
|
'folderName': download.name,
|
||||||
|
'fileSize': download.total_length,
|
||||||
|
'progress': download.completed_length / download.total_length if download.total_length else 0,
|
||||||
|
'downloadSpeed': download.download_speed,
|
||||||
|
'numPeers': 0,
|
||||||
|
'numSeeds': 0,
|
||||||
|
'status': download.status,
|
||||||
|
'bytesDownloaded': download.completed_length,
|
||||||
|
}
|
||||||
|
|
||||||
|
return response
|
183
python_rpc/main.py
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
from flask import Flask, request, jsonify
|
||||||
|
import sys, json, urllib.parse, psutil
|
||||||
|
from torrent_downloader import TorrentDownloader
|
||||||
|
from http_downloader import HttpDownloader
|
||||||
|
from profile_image_processor import ProfileImageProcessor
|
||||||
|
import libtorrent as lt
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
# Retrieve command line arguments
|
||||||
|
torrent_port = sys.argv[1]
|
||||||
|
http_port = sys.argv[2]
|
||||||
|
rpc_password = sys.argv[3]
|
||||||
|
start_download_payload = sys.argv[4]
|
||||||
|
start_seeding_payload = sys.argv[5]
|
||||||
|
|
||||||
|
downloads = {}
|
||||||
|
# This can be streamed down from Node
|
||||||
|
downloading_game_id = -1
|
||||||
|
|
||||||
|
torrent_session = lt.session({'listen_interfaces': '0.0.0.0:{port}'.format(port=torrent_port)})
|
||||||
|
|
||||||
|
if start_download_payload:
|
||||||
|
initial_download = json.loads(urllib.parse.unquote(start_download_payload))
|
||||||
|
downloading_game_id = initial_download['game_id']
|
||||||
|
|
||||||
|
if initial_download['url'].startswith('magnet'):
|
||||||
|
torrent_downloader = TorrentDownloader(torrent_session)
|
||||||
|
downloads[initial_download['game_id']] = torrent_downloader
|
||||||
|
try:
|
||||||
|
torrent_downloader.start_download(initial_download['url'], initial_download['save_path'], "")
|
||||||
|
except Exception as e:
|
||||||
|
print("Error starting torrent download", e)
|
||||||
|
else:
|
||||||
|
http_downloader = HttpDownloader()
|
||||||
|
downloads[initial_download['game_id']] = http_downloader
|
||||||
|
try:
|
||||||
|
http_downloader.start_download(initial_download['url'], initial_download['save_path'], initial_download.get('header'))
|
||||||
|
except Exception as e:
|
||||||
|
print("Error starting http download", e)
|
||||||
|
|
||||||
|
if start_seeding_payload:
|
||||||
|
initial_seeding = json.loads(urllib.parse.unquote(start_seeding_payload))
|
||||||
|
for seed in initial_seeding:
|
||||||
|
torrent_downloader = TorrentDownloader(torrent_session, lt.torrent_flags.upload_mode)
|
||||||
|
downloads[seed['game_id']] = torrent_downloader
|
||||||
|
try:
|
||||||
|
torrent_downloader.start_download(seed['url'], seed['save_path'], "")
|
||||||
|
except Exception as e:
|
||||||
|
print("Error starting seeding", e)
|
||||||
|
|
||||||
|
def validate_rpc_password():
|
||||||
|
"""Middleware to validate RPC password."""
|
||||||
|
header_password = request.headers.get('x-hydra-rpc-password')
|
||||||
|
if header_password != rpc_password:
|
||||||
|
return jsonify({"error": "Unauthorized"}), 401
|
||||||
|
|
||||||
|
@app.route("/status", methods=["GET"])
|
||||||
|
def status():
|
||||||
|
auth_error = validate_rpc_password()
|
||||||
|
if auth_error:
|
||||||
|
return auth_error
|
||||||
|
|
||||||
|
downloader = downloads.get(downloading_game_id)
|
||||||
|
if downloader:
|
||||||
|
status = downloads.get(downloading_game_id).get_download_status()
|
||||||
|
return jsonify(status), 200
|
||||||
|
else:
|
||||||
|
return jsonify(None)
|
||||||
|
|
||||||
|
@app.route("/seed-status", methods=["GET"])
|
||||||
|
def seed_status():
|
||||||
|
auth_error = validate_rpc_password()
|
||||||
|
if auth_error:
|
||||||
|
return auth_error
|
||||||
|
|
||||||
|
seed_status = []
|
||||||
|
|
||||||
|
for game_id, downloader in downloads.items():
|
||||||
|
if not downloader:
|
||||||
|
continue
|
||||||
|
|
||||||
|
response = downloader.get_download_status()
|
||||||
|
if response is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if response.get('status') == 5:
|
||||||
|
seed_status.append({
|
||||||
|
'gameId': game_id,
|
||||||
|
**response,
|
||||||
|
})
|
||||||
|
|
||||||
|
return jsonify(seed_status), 200
|
||||||
|
|
||||||
|
@app.route("/healthcheck", methods=["GET"])
|
||||||
|
def healthcheck():
|
||||||
|
return "", 200
|
||||||
|
|
||||||
|
@app.route("/process-list", methods=["GET"])
|
||||||
|
def process_list():
|
||||||
|
auth_error = validate_rpc_password()
|
||||||
|
if auth_error:
|
||||||
|
return auth_error
|
||||||
|
|
||||||
|
process_list = [proc.info for proc in psutil.process_iter(['exe', 'pid', 'name'])]
|
||||||
|
return jsonify(process_list), 200
|
||||||
|
|
||||||
|
@app.route("/profile-image", methods=["POST"])
|
||||||
|
def profile_image():
|
||||||
|
auth_error = validate_rpc_password()
|
||||||
|
if auth_error:
|
||||||
|
return auth_error
|
||||||
|
|
||||||
|
data = request.get_json()
|
||||||
|
image_path = data.get('image_path')
|
||||||
|
|
||||||
|
try:
|
||||||
|
processed_image_path, mime_type = ProfileImageProcessor.process_image(image_path)
|
||||||
|
return jsonify({'imagePath': processed_image_path, 'mimeType': mime_type}), 200
|
||||||
|
except Exception as e:
|
||||||
|
return jsonify({"error": str(e)}), 400
|
||||||
|
|
||||||
|
@app.route("/action", methods=["POST"])
|
||||||
|
def action():
|
||||||
|
global torrent_session
|
||||||
|
global downloading_game_id
|
||||||
|
|
||||||
|
auth_error = validate_rpc_password()
|
||||||
|
if auth_error:
|
||||||
|
return auth_error
|
||||||
|
|
||||||
|
data = request.get_json()
|
||||||
|
action = data.get('action')
|
||||||
|
game_id = data.get('game_id')
|
||||||
|
|
||||||
|
if action == 'start':
|
||||||
|
url = data.get('url')
|
||||||
|
|
||||||
|
existing_downloader = downloads.get(game_id)
|
||||||
|
|
||||||
|
if url.startswith('magnet'):
|
||||||
|
if existing_downloader and isinstance(existing_downloader, TorrentDownloader):
|
||||||
|
existing_downloader.start_download(url, data['save_path'], "")
|
||||||
|
else:
|
||||||
|
torrent_downloader = TorrentDownloader(torrent_session)
|
||||||
|
downloads[game_id] = torrent_downloader
|
||||||
|
torrent_downloader.start_download(url, data['save_path'], "")
|
||||||
|
else:
|
||||||
|
if existing_downloader and isinstance(existing_downloader, HttpDownloader):
|
||||||
|
existing_downloader.start_download(url, data['save_path'], data.get('header'))
|
||||||
|
else:
|
||||||
|
http_downloader = HttpDownloader()
|
||||||
|
downloads[game_id] = http_downloader
|
||||||
|
http_downloader.start_download(url, data['save_path'], data.get('header'))
|
||||||
|
|
||||||
|
downloading_game_id = game_id
|
||||||
|
|
||||||
|
elif action == 'pause':
|
||||||
|
downloader = downloads.get(game_id)
|
||||||
|
if downloader:
|
||||||
|
downloader.pause_download()
|
||||||
|
downloading_game_id = -1
|
||||||
|
elif action == 'cancel':
|
||||||
|
downloader = downloads.get(game_id)
|
||||||
|
if downloader:
|
||||||
|
downloader.cancel_download()
|
||||||
|
elif action == 'resume_seeding':
|
||||||
|
torrent_downloader = TorrentDownloader(torrent_session, lt.torrent_flags.upload_mode)
|
||||||
|
downloads[game_id] = torrent_downloader
|
||||||
|
torrent_downloader.start_download(data['url'], data['save_path'], "")
|
||||||
|
elif action == 'pause_seeding':
|
||||||
|
downloader = downloads.get(game_id)
|
||||||
|
if downloader:
|
||||||
|
downloader.cancel_download()
|
||||||
|
|
||||||
|
else:
|
||||||
|
return jsonify({"error": "Invalid action"}), 400
|
||||||
|
|
||||||
|
return "", 200
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(host="0.0.0.0", port=int(http_port))
|
||||||
|
|
@ -15,8 +15,8 @@ class ProfileImageProcessor:
|
|||||||
mime_type = image.get_format_mimetype()
|
mime_type = image.get_format_mimetype()
|
||||||
return image_path, mime_type
|
return image_path, mime_type
|
||||||
else:
|
else:
|
||||||
newUUID = str(uuid.uuid4())
|
new_uuid = str(uuid.uuid4())
|
||||||
new_image_path = os.path.join(tempfile.gettempdir(), newUUID) + ".webp"
|
new_image_path = os.path.join(tempfile.gettempdir(), new_uuid) + ".webp"
|
||||||
image.save(new_image_path)
|
image.save(new_image_path)
|
||||||
|
|
||||||
new_image = Image.open(new_image_path)
|
new_image = Image.open(new_image_path)
|
@ -3,18 +3,18 @@ from cx_Freeze import setup, Executable
|
|||||||
# Dependencies are automatically detected, but it might need fine tuning.
|
# Dependencies are automatically detected, but it might need fine tuning.
|
||||||
build_exe_options = {
|
build_exe_options = {
|
||||||
"packages": ["libtorrent"],
|
"packages": ["libtorrent"],
|
||||||
"build_exe": "hydra-download-manager",
|
"build_exe": "hydra-python-rpc",
|
||||||
"include_msvcr": True
|
"include_msvcr": True
|
||||||
}
|
}
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="hydra-download-manager",
|
name="hydra-python-rpc",
|
||||||
version="0.1",
|
version="0.1",
|
||||||
description="Hydra",
|
description="Hydra",
|
||||||
options={"build_exe": build_exe_options},
|
options={"build_exe": build_exe_options},
|
||||||
executables=[Executable(
|
executables=[Executable(
|
||||||
"torrent-client/main.py",
|
"python_rpc/main.py",
|
||||||
target_name="hydra-download-manager",
|
target_name="hydra-python-rpc",
|
||||||
icon="build/icon.ico"
|
icon="build/icon.ico"
|
||||||
)]
|
)]
|
||||||
)
|
)
|
@ -1,10 +1,10 @@
|
|||||||
import libtorrent as lt
|
import libtorrent as lt
|
||||||
|
|
||||||
class TorrentDownloader:
|
class TorrentDownloader:
|
||||||
def __init__(self, port: str):
|
def __init__(self, torrent_session, flags = lt.torrent_flags.auto_managed):
|
||||||
self.torrent_handles = {}
|
self.torrent_handle = None
|
||||||
self.downloading_game_id = -1
|
self.session = torrent_session
|
||||||
self.session = lt.session({'listen_interfaces': '0.0.0.0:{port}'.format(port=port)})
|
self.flags = flags
|
||||||
self.trackers = [
|
self.trackers = [
|
||||||
"udp://tracker.opentrackr.org:1337/announce",
|
"udp://tracker.opentrackr.org:1337/announce",
|
||||||
"http://tracker.opentrackr.org:1337/announce",
|
"http://tracker.opentrackr.org:1337/announce",
|
||||||
@ -102,64 +102,48 @@ class TorrentDownloader:
|
|||||||
"http://bvarf.tracker.sh:2086/announce",
|
"http://bvarf.tracker.sh:2086/announce",
|
||||||
]
|
]
|
||||||
|
|
||||||
def start_download(self, game_id: int, magnet: str, save_path: str):
|
def start_download(self, magnet: str, save_path: str, header: str):
|
||||||
params = {'url': magnet, 'save_path': save_path, 'trackers': self.trackers}
|
params = {'url': magnet, 'save_path': save_path, 'trackers': self.trackers, 'flags': self.flags}
|
||||||
torrent_handle = self.session.add_torrent(params)
|
self.torrent_handle = self.session.add_torrent(params)
|
||||||
self.torrent_handles[game_id] = torrent_handle
|
self.torrent_handle.resume()
|
||||||
torrent_handle.set_flags(lt.torrent_flags.auto_managed)
|
|
||||||
torrent_handle.resume()
|
|
||||||
|
|
||||||
self.downloading_game_id = game_id
|
def pause_download(self):
|
||||||
|
if self.torrent_handle:
|
||||||
|
self.torrent_handle.pause()
|
||||||
|
self.torrent_handle.unset_flags(lt.torrent_flags.auto_managed)
|
||||||
|
|
||||||
def pause_download(self, game_id: int):
|
def cancel_download(self):
|
||||||
torrent_handle = self.torrent_handles.get(game_id)
|
if self.torrent_handle:
|
||||||
if torrent_handle:
|
self.torrent_handle.pause()
|
||||||
torrent_handle.pause()
|
self.session.remove_torrent(self.torrent_handle)
|
||||||
torrent_handle.unset_flags(lt.torrent_flags.auto_managed)
|
self.torrent_handle = None
|
||||||
self.downloading_game_id = -1
|
|
||||||
|
|
||||||
def cancel_download(self, game_id: int):
|
|
||||||
torrent_handle = self.torrent_handles.get(game_id)
|
|
||||||
if torrent_handle:
|
|
||||||
torrent_handle.pause()
|
|
||||||
self.session.remove_torrent(torrent_handle)
|
|
||||||
self.torrent_handles[game_id] = None
|
|
||||||
self.downloading_game_id = -1
|
|
||||||
|
|
||||||
def abort_session(self):
|
def abort_session(self):
|
||||||
for game_id in self.torrent_handles:
|
for game_id in self.torrent_handles:
|
||||||
torrent_handle = self.torrent_handles[game_id]
|
self.torrent_handle = self.torrent_handles[game_id]
|
||||||
torrent_handle.pause()
|
self.torrent_handle.pause()
|
||||||
self.session.remove_torrent(torrent_handle)
|
self.session.remove_torrent(self.torrent_handle)
|
||||||
|
|
||||||
self.session.abort()
|
self.session.abort()
|
||||||
self.torrent_handles = {}
|
self.torrent_handle = None
|
||||||
self.downloading_game_id = -1
|
|
||||||
|
|
||||||
def get_download_status(self):
|
def get_download_status(self):
|
||||||
if self.downloading_game_id == -1:
|
if self.torrent_handle is None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
torrent_handle = self.torrent_handles.get(self.downloading_game_id)
|
status = self.torrent_handle.status()
|
||||||
|
info = self.torrent_handle.get_torrent_info()
|
||||||
status = torrent_handle.status()
|
|
||||||
info = torrent_handle.get_torrent_info()
|
|
||||||
|
|
||||||
response = {
|
response = {
|
||||||
'folderName': info.name() if info else "",
|
'folderName': info.name() if info else "",
|
||||||
'fileSize': info.total_size() if info else 0,
|
'fileSize': info.total_size() if info else 0,
|
||||||
'gameId': self.downloading_game_id,
|
|
||||||
'progress': status.progress,
|
'progress': status.progress,
|
||||||
'downloadSpeed': status.download_rate,
|
'downloadSpeed': status.download_rate,
|
||||||
|
'uploadSpeed': status.upload_rate,
|
||||||
'numPeers': status.num_peers,
|
'numPeers': status.num_peers,
|
||||||
'numSeeds': status.num_seeds,
|
'numSeeds': status.num_seeds,
|
||||||
'status': status.state,
|
'status': status.state,
|
||||||
'bytesDownloaded': status.progress * info.total_size() if info else status.all_time_download,
|
'bytesDownloaded': status.progress * info.total_size() if info else status.all_time_download,
|
||||||
}
|
}
|
||||||
|
|
||||||
if status.progress == 1:
|
|
||||||
torrent_handle.pause()
|
|
||||||
self.session.remove_torrent(torrent_handle)
|
|
||||||
self.downloading_game_id = -1
|
|
||||||
|
|
||||||
return response
|
return response
|
@ -4,3 +4,5 @@ cx_Logging; sys_platform == 'win32'
|
|||||||
pywin32; sys_platform == 'win32'
|
pywin32; sys_platform == 'win32'
|
||||||
psutil
|
psutil
|
||||||
Pillow
|
Pillow
|
||||||
|
flask
|
||||||
|
aria2p
|
||||||
|
Before Width: | Height: | Size: 188 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 18 KiB |
122
scripts/postinstall.cjs
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
const { default: axios } = require("axios");
|
||||||
|
const util = require("node:util");
|
||||||
|
const fs = require("node:fs");
|
||||||
|
const path = require("node:path");
|
||||||
|
const { spawnSync } = require("node:child_process");
|
||||||
|
|
||||||
|
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);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const downloadAria2WindowsAndLinux = async () => {
|
||||||
|
const file =
|
||||||
|
process.platform === "win32"
|
||||||
|
? "aria2-1.37.0-win-64bit-build1.zip"
|
||||||
|
: "aria2-1.37.0-1-x86_64.pkg.tar.zst";
|
||||||
|
|
||||||
|
const downloadUrl =
|
||||||
|
process.platform === "win32"
|
||||||
|
? `https://github.com/aria2/aria2/releases/download/release-1.37.0/${file}`
|
||||||
|
: "https://archlinux.org/packages/extra/x86_64/aria2/download/";
|
||||||
|
|
||||||
|
console.log(`Downloading ${file}...`);
|
||||||
|
|
||||||
|
const response = await axios.get(downloadUrl, { responseType: "stream" });
|
||||||
|
|
||||||
|
const stream = response.data.pipe(fs.createWriteStream(file));
|
||||||
|
|
||||||
|
stream.on("finish", async () => {
|
||||||
|
console.log(`Downloaded ${file}, extracting...`);
|
||||||
|
|
||||||
|
if (process.platform === "win32") {
|
||||||
|
await exec(`npx extract-zip ${file}`);
|
||||||
|
console.log("Extracted. Renaming folder...");
|
||||||
|
|
||||||
|
fs.mkdirSync("aria2");
|
||||||
|
fs.copyFileSync(
|
||||||
|
path.join(file.replace(".zip", ""), "aria2c.exe"),
|
||||||
|
"aria2/aria2c.exe"
|
||||||
|
);
|
||||||
|
fs.rmSync(file.replace(".zip", ""), { recursive: true });
|
||||||
|
} else {
|
||||||
|
await exec(`tar --zstd -xvf ${file} usr/bin/aria2c`);
|
||||||
|
console.log("Extracted. Copying binary file...");
|
||||||
|
fs.mkdirSync("aria2");
|
||||||
|
fs.copyFileSync("usr/bin/aria2c", "aria2/aria2c");
|
||||||
|
fs.rmSync("usr", { recursive: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Extracted ${file}, removing compressed downloaded file...`);
|
||||||
|
fs.rmSync(file);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const copyAria2Macos = async () => {
|
||||||
|
console.log("Checking if aria2 is installed...");
|
||||||
|
|
||||||
|
const isAria2Installed = spawnSync("which", ["aria2c"]).status;
|
||||||
|
|
||||||
|
if (isAria2Installed != 0) {
|
||||||
|
console.log("Please install aria2");
|
||||||
|
console.log("brew install aria2");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Copying aria2 binary...");
|
||||||
|
fs.mkdirSync("aria2");
|
||||||
|
await exec(`cp $(which aria2c) aria2/aria2c`);
|
||||||
|
};
|
||||||
|
|
||||||
|
const copyAria2 = () => {
|
||||||
|
if (fs.existsSync("aria2")) {
|
||||||
|
console.log("Aria2 already exists, skipping download...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (process.platform == "darwin") {
|
||||||
|
copyAria2Macos();
|
||||||
|
} else {
|
||||||
|
downloadAria2WindowsAndLinux();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
copyAria2();
|
||||||
|
downloadLudusavi();
|
66
scripts/upload-build.cjs
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
const fs = require("node:fs");
|
||||||
|
const { S3Client, PutObjectCommand } = require("@aws-sdk/client-s3");
|
||||||
|
const path = require("node:path");
|
||||||
|
const packageJson = require("../package.json");
|
||||||
|
|
||||||
|
if (!process.env.BUILD_WEBHOOK_URL) {
|
||||||
|
console.log("No BUILD_WEBHOOK_URL provided, skipping upload");
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
const s3 = new S3Client({
|
||||||
|
region: "auto",
|
||||||
|
endpoint: process.env.S3_ENDPOINT,
|
||||||
|
forcePathStyle: true,
|
||||||
|
credentials: {
|
||||||
|
accessKeyId: process.env.S3_ACCESS_KEY_ID,
|
||||||
|
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const dist = path.resolve(__dirname, "..", "dist");
|
||||||
|
|
||||||
|
const extensionsToUpload = [".deb", ".exe", ".pacman"];
|
||||||
|
|
||||||
|
fs.readdir(dist, async (err, files) => {
|
||||||
|
if (err) throw err;
|
||||||
|
|
||||||
|
const uploads = await Promise.all(
|
||||||
|
files
|
||||||
|
.filter((file) => extensionsToUpload.includes(path.extname(file)))
|
||||||
|
.map(async (file) => {
|
||||||
|
console.log(`⌛️ Uploading ${file}...`);
|
||||||
|
const fileName = `${new Date().getTime()}-${file}`;
|
||||||
|
|
||||||
|
const command = new PutObjectCommand({
|
||||||
|
Bucket: process.env.S3_BUILDS_BUCKET_NAME,
|
||||||
|
Key: fileName,
|
||||||
|
Body: fs.createReadStream(path.resolve(dist, file)),
|
||||||
|
// 3 days
|
||||||
|
Expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 3),
|
||||||
|
});
|
||||||
|
|
||||||
|
await s3.send(command);
|
||||||
|
|
||||||
|
return {
|
||||||
|
url: `${process.env.BUILDS_URL}/${fileName}`,
|
||||||
|
name: fileName,
|
||||||
|
};
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
if (uploads.length > 0) {
|
||||||
|
await fetch(process.env.BUILD_WEBHOOK_URL, {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
uploads,
|
||||||
|
branchName: process.env.BRANCH_NAME,
|
||||||
|
version: packageJson.version,
|
||||||
|
githubActor: process.env.GITHUB_ACTOR,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
@ -1,146 +1,417 @@
|
|||||||
{
|
{
|
||||||
"language_name": "اَلْعَرَبِيَّةُ",
|
"language_name": "اَلْعَرَبِيَّةُ",
|
||||||
|
"app": {
|
||||||
|
"successfully_signed_in": "تم تسجيل الدخول بنجاح"
|
||||||
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "مميّز",
|
"featured": "مُتَمَيِّز",
|
||||||
"surprise_me": "فاجئني",
|
"surprise_me": "فَاجِئْنِي",
|
||||||
"no_results": "لم يتم العثور على نتائج"
|
"no_results": "لَمْ يُعْثَرْ عَلَى نَتائِج",
|
||||||
|
"start_typing": "اِبْدَأْ بِالْكِتَابَةِ لِلْبَحْثِ...",
|
||||||
|
"hot": "اَلْأَكْثَرُ شُيُوعًا الْآن",
|
||||||
|
"weekly": "📅 أَفْضَلُ أَلْعَابِ الْأُسْبُوعِ",
|
||||||
|
"achievements": "🏆 أَلْعَابٌ لِلتَّغَلُّبِ عَلَيْهَا"
|
||||||
},
|
},
|
||||||
"sidebar": {
|
"sidebar": {
|
||||||
"catalogue": "قائمة الألعاب",
|
"catalogue": "الْفِهْرِسُ",
|
||||||
"downloads": "التحميلات",
|
"downloads": "التَّنْزِيلَاتُ",
|
||||||
"settings": "إعدادات",
|
"settings": "الإعْدَادَاتُ",
|
||||||
"my_library": "مكتبتي",
|
"my_library": "مَكْتَبَتِي",
|
||||||
"downloading_metadata": "{{title}} (جارٍ تنزيل البيانات الوصفية...)",
|
"downloading_metadata": "{{title}} (جَارٍ تَنْزِيلُ الْبَيَانَاتِ الْوَصْفِيَّةِ...)",
|
||||||
"paused": "{{title}} (متوقف)",
|
"paused": "{{title}} (مُوْقَفٌ)",
|
||||||
"downloading": "{{title}} ({{percentage}} - جارٍ التنزيل...)",
|
"downloading": "{{title}} ({{percentage}} - جَارٍ التَّنْزِيلُ...)",
|
||||||
"filter": "بحث في المكتبة",
|
"filter": "تَصْفِيَةُ الْمَكْتَبَةِ",
|
||||||
"home": "الرئيسية"
|
"home": "الرَّئِيسِيَّةُ",
|
||||||
|
"queued": "{{title}} (فِي الْانْتِظَارِ)",
|
||||||
|
"game_has_no_executable": "اللُّعْبَةُ لَيْسَ لَدَيْهَا مِلَفٌّ تَنْفِيذِيٌّ مُحَدَّدٌ",
|
||||||
|
"sign_in": "تَسْجِيلُ الدُّخُولِ",
|
||||||
|
"friends": "الْأَصْدِقَاءُ",
|
||||||
|
"need_help": "هَلْ تَحْتَاجُ إِلَى مُسَاعَدَةٍ؟"
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
"search": "ابحث عن الألعاب",
|
"search": "بَحْثُ الْأَلْعَابِ",
|
||||||
"home": "الرئيسية",
|
"home": "الرَّئِيسِيَّةُ",
|
||||||
"catalogue": "قائمة الألعاب",
|
"catalogue": "الْفِهْرِسُ",
|
||||||
"downloads": "التحميلات",
|
"downloads": "التَّنْزِيلَاتُ",
|
||||||
"search_results": "نتائج البحث",
|
"search_results": "نَتائِجُ الْبَحْثِ",
|
||||||
"settings": "إعدادات"
|
"settings": "الإعْدَادَاتُ",
|
||||||
|
"version_available_install": "الْإِصْدَارُ {{version}} مَتَوَفِّرٌ. انْقُرْ هُنَا لِإِعَادَةِ التَّشْغِيلِ وَالتَّثْبِيتِ.",
|
||||||
|
"version_available_download": "الْإِصْدَارُ {{version}} مَتَوَفِّرٌ. انْقُرْ هُنَا لِلتَّنْزِيلِ."
|
||||||
},
|
},
|
||||||
"bottom_panel": {
|
"bottom_panel": {
|
||||||
"no_downloads_in_progress": "لا يوجد تنزيلات جارية",
|
"no_downloads_in_progress": "لَا تَوْجَدُ تَنْزِيلَاتٌ جَارِيَةٌ",
|
||||||
"downloading_metadata": "جارٍ تنزيل بيانات وصف {{title}}",
|
"downloading_metadata": "جَارٍ تَنْزِيلُ الْبَيَانَاتِ الْوَصْفِيَّةِ لِـ {{title}}...",
|
||||||
"downloading": "جارٍ تنزيل {{title}}… ({{percentage}} مكتملة) - الانتهاء {{eta}} - {{speed}}"
|
"downloading": "جَارٍ تَنْزِيلُ {{title}}... ({{percentage}} مَكْتُومٌ) - الِاكْتِمَالُ {{eta}} - {{speed}}",
|
||||||
|
"calculating_eta": "جَارٍ تَنْزِيلُ {{title}}... ({{percentage}} مَكْتُومٌ) - جَارٍ حِسَابُ الْوَقْتِ الْمُتَبَقِّي...",
|
||||||
|
"checking_files": "جَارٍ التَّحَقُّقُ مِنْ مَلَفَّاتِ {{title}}... ({{percentage}} مَكْتُومٌ)"
|
||||||
},
|
},
|
||||||
"catalogue": {
|
"catalogue": {
|
||||||
"next_page": "الصفحة التالية",
|
"search": "تَصْفِيَةٌ...",
|
||||||
"previous_page": "الصفحة السابقة"
|
"developers": "الْمُطَوِّرُونَ",
|
||||||
|
"genres": "الْأَنْوَاعُ",
|
||||||
|
"tags": "الْعَلَامَاتُ",
|
||||||
|
"publishers": "النَّاشِرُونَ",
|
||||||
|
"download_sources": "مَصَادِرُ التَّنْزِيلِ",
|
||||||
|
"result_count": "{{resultCount}} نَتائِجُ",
|
||||||
|
"filter_count": "{{filterCount}} مَتَوَفِّرٌ",
|
||||||
|
"clear_filters": "مَسْحُ {{filterCount}} الْمُخْتَارَةِ"
|
||||||
},
|
},
|
||||||
"game_details": {
|
"game_details": {
|
||||||
"open_download_options": "افتح خيارات التنزيل",
|
"open_download_options": "فَتْحُ خِيَارَاتِ التَّنْزِيلِ",
|
||||||
"download_options_zero": "لا يوجد خيار تنزيل",
|
"download_options_zero": "لَا تَوْجَدُ خِيَارَاتُ تَنْزِيلٍ",
|
||||||
"download_options_one": "{{count}} خيار تنزيل",
|
"download_options_one": "{{count}} خِيَارُ تَنْزِيلٍ",
|
||||||
"download_options_other": "{{count}} خيار تنزيل",
|
"download_options_other": "{{count}} خِيَارَاتُ تَنْزِيلٍ",
|
||||||
"updated_at": "تم التحديث {{updated_at}}",
|
"updated_at": "تَمَّ التَّحْدِيثُ فِي {{updated_at}}",
|
||||||
"install": "تثبيت",
|
"install": "تَثْبِيتٌ",
|
||||||
"resume": "استئناف",
|
"resume": "اسْتِئْنَافٌ",
|
||||||
"pause": "إيقاف",
|
"pause": "إِيقَافٌ",
|
||||||
"cancel": "إلغاء",
|
"cancel": "إِلْغَاءٌ",
|
||||||
"remove": "إزالة",
|
"remove": "إِزَالَةٌ",
|
||||||
"space_left_on_disk": "{{space}} متبقية على القرص",
|
"space_left_on_disk": "{{space}} مُتَبَقٍّ عَلَى الْقُرْصِ",
|
||||||
"eta": "الوقت المتبقي {{eta}}",
|
"eta": "الِاكْتِمَالُ {{eta}}",
|
||||||
"downloading_metadata": "جاري تنزيل البيانات الوصفية...",
|
"calculating_eta": "جَارٍ حِسَابُ الْوَقْتِ الْمُتَبَقِّي...",
|
||||||
"filter": "تصفية حزم إعادة التجميع",
|
"downloading_metadata": "جَارٍ تَنْزِيلُ الْبَيَانَاتِ الْوَصْفِيَّةِ...",
|
||||||
"requirements": "متطلبات النظام",
|
"filter": "تَصْفِيَةُ الْإِصْدَارَاتِ الْمُعَادِ تَغْلِيفُهَا",
|
||||||
"minimum": "الحد الأدنى",
|
"requirements": "مُتَطَلَّبَاتُ النِّظَامِ",
|
||||||
"recommended": "موصى به",
|
"minimum": "الْأَدْنَى",
|
||||||
"release_date": "تم الإصدار في {{date}}",
|
"recommended": "الْمُوَصَّى بِهِ",
|
||||||
"publisher": "نشر بواسطة {{publisher}}",
|
"paused": "مُوْقَفٌ",
|
||||||
"hours": "ساعات",
|
"release_date": "تَمَّ الْإِصْدَارُ فِي {{date}}",
|
||||||
"minutes": "دقائق",
|
"publisher": "نُشِرَ بِوَاسِطَةِ {{publisher}}",
|
||||||
"amount_hours": "{{amount}} ساعات",
|
"hours": "سَاعَاتٌ",
|
||||||
"amount_minutes": "{{amount}} دقائق",
|
"minutes": "دَقَائِقُ",
|
||||||
"accuracy": "دقة {{accuracy}}%",
|
"amount_hours": "{{amount}} سَاعَاتٌ",
|
||||||
"add_to_library": "إضافة إلى المكتبة",
|
"amount_minutes": "{{amount}} دَقَائِقُ",
|
||||||
"remove_from_library": "إزالة من المكتبة",
|
"accuracy": "دِقَّةٌ {{accuracy}}%",
|
||||||
"no_downloads": "لا توجد تنزيلات متاحة",
|
"add_to_library": "إِضَافَةٌ إِلَى الْمَكْتَبَةِ",
|
||||||
"play_time": "تم اللعب لمدة {{amount}}",
|
"remove_from_library": "إِزَالَةٌ مِنَ الْمَكْتَبَةِ",
|
||||||
"last_time_played": "آخر مرة لعبت {{period}}",
|
"no_downloads": "لَا تَوْجَدُ تَنْزِيلَاتٌ مَتَوَفِّرَةٌ",
|
||||||
"not_played_yet": "لم تلعب {{title}} بعد",
|
"play_time": "لُعِبَ لِمُدَّةِ {{amount}}",
|
||||||
"next_suggestion": "الاقتراح التالي",
|
"last_time_played": "آخِرُ مَرَّةٍ لُعِبَتْ {{period}}",
|
||||||
"play": "لعب",
|
"not_played_yet": "لَمْ تَلْعَبْ {{title}} بَعْدُ",
|
||||||
"deleting": "جاري حذف المثبت...",
|
"next_suggestion": "الِاقْتِرَاحُ التَّالِي",
|
||||||
"close": "إغلاق",
|
"play": "لَعِبٌ",
|
||||||
"playing_now": "قيد التشغيل الآن",
|
"deleting": "جَارٍ حَذْفُ الْمُثَبِّتِ...",
|
||||||
"change": "تغيير",
|
"close": "إِغْلَاقٌ",
|
||||||
"repacks_modal_description": "اختر الحزمة التي تريد تنزيلها",
|
"playing_now": "جَارِي اللَّعِبُ الْآن",
|
||||||
"select_folder_hint": "لتغيير المجلد الافتراضي، انتقل إلى الإعدادات",
|
"change": "تَغْيِيرٌ",
|
||||||
"download_now": "تنزيل الآن",
|
"repacks_modal_description": "اخْتَرِ الْإِصْدَارَ الْمُعَادَ تَغْلِيفُهُ الَّذِي تُرِيدُ تَنْزِيلَهُ",
|
||||||
"no_shop_details": "لم يتم استرداد تفاصيل المتجر.",
|
"select_folder_hint": "لِتَغْيِيرِ الْمَجَلَّدِ الافْتِرَاضِيِّ، اذْهَبْ إِلَى <0>الإعْدَادَاتِ</0>",
|
||||||
"download_options": "خيارات التنزيل",
|
"download_now": "تَنْزِيلٌ الْآن",
|
||||||
"download_path": "مسار التنزيل",
|
"no_shop_details": "لَمْ يَتَمَكَّنْ مِنْ اسْتِرْدَادِ تَفَاصِيلِ الْمَتْجَرِ.",
|
||||||
"previous_screenshot": "لقطة الشاشة السابقة",
|
"download_options": "خِيَارَاتُ التَّنْزِيلِ",
|
||||||
"next_screenshot": "لقطة الشاشة التالية",
|
"download_path": "مَسَارُ التَّنْزِيلِ",
|
||||||
"screenshot": "لقطة شاشة {{number}}",
|
"previous_screenshot": "لَقْطَةُ الشَّاشَةِ السَّابِقَةُ",
|
||||||
"open_screenshot": "افتح لقطة الشاشة {{number}}"
|
"next_screenshot": "لَقْطَةُ الشَّاشَةِ التَّالِيَةُ",
|
||||||
|
"screenshot": "لَقْطَةُ الشَّاشَةِ {{number}}",
|
||||||
|
"open_screenshot": "فَتْحُ لَقْطَةِ الشَّاشَةِ {{number}}",
|
||||||
|
"download_settings": "إعْدَادَاتُ التَّنْزِيلِ",
|
||||||
|
"downloader": "الْمُنَزِّلُ",
|
||||||
|
"select_executable": "تَحْدِيدٌ",
|
||||||
|
"no_executable_selected": "لَمْ يُحَدَّدْ مِلَفٌّ تَنْفِيذِيٌّ",
|
||||||
|
"open_folder": "فَتْحُ الْمَجَلَّدِ",
|
||||||
|
"open_download_location": "مُشَاهَدَةُ الْمَلَفَّاتِ الْمُنَزَّلَةِ",
|
||||||
|
"create_shortcut": "إِنْشَاءُ طَرِيقٍ مُخْتَصَرٍ عَلَى سَطْحِ الْمَكْتَبِ",
|
||||||
|
"clear": "مَسْحٌ",
|
||||||
|
"remove_files": "إِزَالَةُ الْمَلَفَّاتِ",
|
||||||
|
"remove_from_library_title": "هَلْ أَنْتَ مُتَأَكِّدٌ؟",
|
||||||
|
"remove_from_library_description": "سَيُؤَدِّي هَذَا إِلَى إِزَالَةِ {{game}} مِنْ مَكْتَبَتِكَ",
|
||||||
|
"options": "خِيَارَاتٌ",
|
||||||
|
"executable_section_title": "الْمِلَفُّ التَّنْفِيذِيُّ",
|
||||||
|
"executable_section_description": "مَسَارُ الْمِلَفِّ الَّذِي سَيَتِمُّ تَنْفِيذُهُ عِنْدَ النَّقْرِ عَلَى \"لَعِبٌ\"",
|
||||||
|
"downloads_secion_title": "التَّنْزِيلَاتُ",
|
||||||
|
"downloads_section_description": "تَحَقَّقْ مِنَ التَّحْدِيثَاتِ أَوِ الْإِصْدَارَاتِ الْأُخْرَى لِهَذِهِ اللُّعْبَةِ",
|
||||||
|
"danger_zone_section_title": "مِنْطَقَةُ الْخَطَرِ",
|
||||||
|
"danger_zone_section_description": "إِزَالَةُ هَذِهِ اللُّعْبَةِ مِنْ مَكْتَبَتِكَ أَوِ الْمَلَفَّاتِ الْمُنَزَّلَةِ بِوَاسِطَةِ Hydra",
|
||||||
|
"download_in_progress": "جَارٍ التَّنْزِيلُ",
|
||||||
|
"download_paused": "التَّنْزِيلُ مُوْقَفٌ",
|
||||||
|
"last_downloaded_option": "خِيَارُ التَّنْزِيلِ الْأَخِيرُ",
|
||||||
|
"create_shortcut_success": "تَمَّ إِنْشَاءُ الطَّرِيقِ الْمُخْتَصَرِ بِنَجَاحٍ",
|
||||||
|
"create_shortcut_error": "خَطَأٌ فِي إِنْشَاءِ الطَّرِيقِ الْمُخْتَصَرِ",
|
||||||
|
"nsfw_content_title": "هَذِهِ اللُّعْبَةُ تَحْتَوِي عَلَى مُحْتَوًى غَيْرِ لَائِقٍ",
|
||||||
|
"nsfw_content_description": "{{title}} تَحْتَوِي عَلَى مُحْتَوًى قَدْ لَا يَكُونُ مُنَاسِبًا لِجَمِيعِ الْأَعْمَارِ. هَلْ أَنْتَ مُتَأَكِّدٌ مِنْ أَنَّكَ تُرِيدُ الْمُتَابَعَةَ؟",
|
||||||
|
"allow_nsfw_content": "الْمُتَابَعَةُ",
|
||||||
|
"refuse_nsfw_content": "الرُّجُوعُ",
|
||||||
|
"stats": "الإحْصَائِيَّاتُ",
|
||||||
|
"download_count": "التَّنْزِيلَاتُ",
|
||||||
|
"player_count": "اللَّاعِبُونَ النَّشِطُونَ",
|
||||||
|
"download_error": "هَذَا خِيَارُ التَّنْزِيلِ غَيْرُ مَتَوَفِّرٍ",
|
||||||
|
"download": "تَنْزِيلٌ",
|
||||||
|
"executable_path_in_use": "الْمِلَفُّ التَّنْفِيذِيُّ مُسْتَخْدَمٌ بِوَاسِطَةِ \"{{game}}\"",
|
||||||
|
"warning": "تَنْبِيهٌ:",
|
||||||
|
"hydra_needs_to_remain_open": "لِهَذَا التَّنْزِيلِ، يَجِبُ أَنْ يَبْقَى Hydra مَفْتُوحًا حَتَّى يَتِمَّ الِاكْتِمَالُ. إِذَا أُغْلِقَ Hydra قَبْلَ الِاكْتِمَالِ، سَتَفْقِدُ تَقَدُّمَكَ.",
|
||||||
|
"achievements": "الإِنْجَازَاتُ",
|
||||||
|
"achievements_count": "الإِنْجَازَاتُ {{unlockedCount}}/{{achievementsCount}}",
|
||||||
|
"cloud_save": "حِفْظٌ سَحَابِيٌّ",
|
||||||
|
"cloud_save_description": "احْفَظْ تَقَدُّمَكَ فِي السَّحَابَةِ وَاسْتَمِرَّ فِي اللَّعِبِ عَلَى أَيِّ جِهَازٍ",
|
||||||
|
"backups": "الْنُسَخُ الِاحْتِيَاطِيَّةُ",
|
||||||
|
"install_backup": "تَثْبِيتٌ",
|
||||||
|
"delete_backup": "حَذْفٌ",
|
||||||
|
"create_backup": "نُسْخَةٌ احْتِيَاطِيَّةٌ جَدِيدَةٌ",
|
||||||
|
"last_backup_date": "آخِرُ نُسْخَةٍ احْتِيَاطِيَّةٍ فِي {{date}}",
|
||||||
|
"no_backup_preview": "لَمْ يُعْثَرْ عَلَى أَيِّ أَلْعَابٍ مَحْفُوظَةٍ لِهَذَا الْعُنْوَانِ",
|
||||||
|
"restoring_backup": "جَارٍ اسْتِعَادَةُ النُّسْخَةِ الِاحْتِيَاطِيَّةِ ({{progress}} مَكْتُومٌ)...",
|
||||||
|
"uploading_backup": "جَارٍ رَفْعُ النُّسْخَةِ الِاحْتِيَاطِيَّةِ...",
|
||||||
|
"no_backups": "لَمْ تَقُمْ بِإِنْشَاءِ أَيِّ نُسَخٍ احْتِيَاطِيَّةٍ لِهَذِهِ اللُّعْبَةِ بَعْدُ",
|
||||||
|
"backup_uploaded": "تَمَّ رَفْعُ النُّسْخَةِ الِاحْتِيَاطِيَّةِ",
|
||||||
|
"backup_deleted": "تَمَّ حَذْفُ النُّسْخَةِ الِاحْتِيَاطِيَّةِ",
|
||||||
|
"backup_restored": "تَمَّ اسْتِعَادَةُ النُّسْخَةِ الِاحْتِيَاطِيَّةِ",
|
||||||
|
"see_all_achievements": "عَرْضُ جَمِيعِ الإِنْجَازَاتِ",
|
||||||
|
"sign_in_to_see_achievements": "سَجِّلِ الدُّخُولَ لِعَرْضِ الإِنْجَازَاتِ",
|
||||||
|
"mapping_method_automatic": "آلِيٌّ",
|
||||||
|
"mapping_method_manual": "يَدَوِيٌّ",
|
||||||
|
"mapping_method_label": "طَرِيقَةُ التَّحْدِيدِ",
|
||||||
|
"files_automatically_mapped": "تَمَّ تَحْدِيدُ الْمَلَفَّاتِ تِلْقَائِيًّا",
|
||||||
|
"no_backups_created": "لَمْ تُنْشَأْ أَيُّ نُسَخٍ احْتِيَاطِيَّةٍ لِهَذِهِ اللُّعْبَةِ",
|
||||||
|
"manage_files": "إِدَارَةُ الْمَلَفَّاتِ",
|
||||||
|
"loading_save_preview": "جَارٍ الْبَحْثُ عَنْ أَلْعَابٍ مَحْفُوظَةٍ...",
|
||||||
|
"wine_prefix": "بَادِئَةُ Wine",
|
||||||
|
"wine_prefix_description": "بَادِئَةُ Wine الْمُسْتَخْدَمَةُ لِتَشْغِيلِ هَذِهِ اللُّعْبَةِ",
|
||||||
|
"launch_options": "خِيَارَاتُ الْإِطْلَاقِ",
|
||||||
|
"launch_options_description": "يُمْكِنُ لِلْمُسْتَخْدِمِينَ الْمُتَقَدِّمِينَ إِدْخَالُ تَعْدِيلَاتٍ عَلَى خِيَارَاتِ الْإِطْلَاقِ",
|
||||||
|
"launch_options_placeholder": "لَمْ يُحَدَّدْ أَيُّ مُعَامِلٍ",
|
||||||
|
"no_download_option_info": "لَا تَوْجَدُ مَعْلُومَاتٌ مَتَوَفِّرَةٌ",
|
||||||
|
"backup_deletion_failed": "فَشَلَ فِي حَذْفِ النُّسْخَةِ الِاحْتِيَاطِيَّةِ",
|
||||||
|
"max_number_of_artifacts_reached": "تَمَّ بَلُوغُ الْعَدَدِ الْأَقْصَى لِلنُّسَخِ الِاحْتِيَاطِيَّةِ لِهَذِهِ اللُّعْبَةِ",
|
||||||
|
"achievements_not_sync": "تَعَرَّفْ عَلَى كَيْفِيَّةِ مَزْجِ إِنْجَازَاتِكَ",
|
||||||
|
"manage_files_description": "إِدَارَةُ الْمَلَفَّاتِ الَّتِي سَيَتِمُّ نَسْخُهَا احْتِيَاطِيًّا وَاسْتِعَادَتُهَا",
|
||||||
|
"select_folder": "تَحْدِيدُ الْمَجَلَّدِ",
|
||||||
|
"backup_from": "نُسْخَةٌ احْتِيَاطِيَّةٌ مِنْ {{date}}",
|
||||||
|
"custom_backup_location_set": "تَمَّ تَحْدِيدُ مَوْقِعِ النُّسْخَةِ الِاحْتِيَاطِيَّةِ الْمُخَصَّصِ",
|
||||||
|
"no_directory_selected": "لَمْ يُحَدَّدْ أَيُّ دَلِيلٍ"
|
||||||
},
|
},
|
||||||
"activation": {
|
"activation": {
|
||||||
"title": "تفعيل هايدرا",
|
"title": "تَفْعِيلُ Hydra",
|
||||||
"installation_id": "معرف التثبيت:",
|
"installation_id": "مُعَرِّفُ التَّثْبِيتِ:",
|
||||||
"enter_activation_code": "أدخل رمز التفعيل الخاص بك",
|
"enter_activation_code": "أَدْخِلْ رَمْزَ التَّفْعِيلِ",
|
||||||
"message": "إذا كنت لا تعرف أين تسأل عن هذا ، فلا يجب أن يكون لديك هذا.",
|
"message": "إِذَا كُنْتَ لَا تَعْرِفُ أَيْنَ تَطْلُبُ هَذَا، فَلا يَجِبُ أَنْ تَكُونَ لَدَيْكَ.",
|
||||||
"activate": "تفعيل",
|
"activate": "تَفْعِيلٌ",
|
||||||
"loading": "جار التحميل…"
|
"loading": "جَارٍ التَّحْمِيلُ..."
|
||||||
},
|
},
|
||||||
"downloads": {
|
"downloads": {
|
||||||
"resume": "استئناف",
|
"resume": "اسْتِئْنَافٌ",
|
||||||
"pause": "إيقاف مؤقت",
|
"pause": "إِيقَافٌ",
|
||||||
"eta": "الوقت المتبقي {{eta}}",
|
"eta": "الِاكْتِمَالُ {{eta}}",
|
||||||
"paused": "متوقفة مؤقتًا",
|
"paused": "مُوْقَفٌ",
|
||||||
"verifying": "جار التحقق…",
|
"verifying": "جَارٍ التَّحَقُّقُ...",
|
||||||
"completed": "اكتمل",
|
"completed": "مَكْتُومٌ",
|
||||||
"cancel": "إلغاء",
|
"removed": "لَمْ يُنَزَّلْ",
|
||||||
"filter": "تصفية الألعاب التي تم تنزيلها",
|
"cancel": "إِلْغَاءٌ",
|
||||||
"remove": "إزالة",
|
"filter": "تَصْفِيَةُ الْأَلْعَابِ الْمُنَزَّلَةِ",
|
||||||
"downloading_metadata": "جار تنزيل البيانات الوصفية…",
|
"remove": "إِزَالَةٌ",
|
||||||
"deleting": "جار حذف المثبت…",
|
"downloading_metadata": "جَارٍ تَنْزِيلُ الْبَيَانَاتِ الْوَصْفِيَّةِ...",
|
||||||
"delete": "إزالة المثبت",
|
"deleting": "جَارٍ حَذْفُ الْمُثَبِّتِ...",
|
||||||
"delete_modal_title": "هل أنت متأكد؟",
|
"delete": "حَذْفُ الْمُثَبِّتِ",
|
||||||
"delete_modal_description": "سيؤدي هذا إلى إزالة جميع ملفات التثبيت من جهاز الكمبيوتر الخاص بك",
|
"delete_modal_title": "هَلْ أَنْتَ مُتَأَكِّدٌ؟",
|
||||||
"install": "تثبيت"
|
"delete_modal_description": "سَيُؤَدِّي هَذَا إِلَى إِزَالَةِ جَمِيعِ مَلَفَّاتِ التَّثْبِيتِ مِنْ حَاسُوبِكَ",
|
||||||
|
"install": "تَثْبِيتٌ",
|
||||||
|
"download_in_progress": "جَارٍ التَّنْفِيذُ",
|
||||||
|
"queued_downloads": "التَّنْزِيلَاتُ فِي الْانْتِظَارِ",
|
||||||
|
"downloads_completed": "مَكْتُومٌ",
|
||||||
|
"queued": "فِي الْانْتِظَارِ",
|
||||||
|
"no_downloads_title": "فَرَاغٌ تَامٌ",
|
||||||
|
"no_downloads_description": "لَمْ تَقُمْ بِتَنْزِيلِ أَيِّ شَيْءٍ بِاسْتِخْدَامِ Hydra بَعْدُ، لَكِنَّهُ لَيْسَ مُتَأَخِّرًا لِلْبَدْءِ.",
|
||||||
|
"checking_files": "جَارٍ التَّحَقُّقُ مِنَ الْمَلَفَّاتِ...",
|
||||||
|
"seeding": "الْبَذْرُ",
|
||||||
|
"stop_seeding": "إِيقَافُ الْبَذْرِ",
|
||||||
|
"resume_seeding": "اسْتِئْنَافُ الْبَذْرِ",
|
||||||
|
"options": "إِدَارَةٌ"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"downloads_path": "مسار التنزيلات",
|
"downloads_path": "مَسَارُ التَّنْزِيلَاتِ",
|
||||||
"change": "تحديث",
|
"change": "تَحْدِيثٌ",
|
||||||
"notifications": "الإشعارات",
|
"notifications": "الإِشْعَارَاتُ",
|
||||||
"enable_download_notifications": "عند اكتمال التنزيل",
|
"enable_download_notifications": "عِنْدَ اكْتِمَالِ التَّنْزِيلِ",
|
||||||
"enable_repack_list_notifications": "عند إضافة حزمة جديدة",
|
"enable_repack_list_notifications": "عِنْدَ إِضَافَةِ إِصْدَارٍ مُعَادٍ تَغْلِيفِهِ جَدِيدٍ",
|
||||||
"real_debrid_api_token_label": "رمز واجهة برمجة التطبيقات (API) لـReal-Debrid ",
|
"real_debrid_api_token_label": "رَمْزُ واجهة برمجة التطبيقات Real-Debrid",
|
||||||
"quit_app_instead_hiding": "إنهاء هايدرا بدلاً من التصغير الى شريط الحالة",
|
"quit_app_instead_hiding": "لا تُخْفِ Hydra عِنْدَ الإِغْلَاقِ",
|
||||||
"launch_with_system": "تشغيل هايدرا عند بدء تشغيل النظام",
|
"launch_with_system": "تَشْغِيلُ Hydra عِنْدَ بَدْءِ النِّظَامِ",
|
||||||
"general": "عام",
|
"general": "عَامٌ",
|
||||||
"behavior": "السلوك",
|
"behavior": "سُلُوكٌ",
|
||||||
"enable_real_debrid": "تفعيل Real-Debrid ",
|
"download_sources": "مَصَادِرُ التَّنْزِيلِ",
|
||||||
"real_debrid_api_token_hint": "يمكنك الحصول على مفتاح API الخاص بك هنا",
|
"language": "اللُّغَةُ",
|
||||||
"save_changes": "حفظ التغييرات"
|
"real_debrid_api_token": "رَمْزُ واجهة برمجة التطبيقات",
|
||||||
|
"enable_real_debrid": "تَمْكِينُ Real-Debrid",
|
||||||
|
"real_debrid_description": "Real-Debrid هُوَ مُنَزِّلٌ غَيْرُ مَقْيُودٍ يَتِيحُ لَكَ تَنْزِيلَ الْمَلَفَّاتِ بِسُرْعَةٍ، مَحْدُودٌ فَقَطْ بِسُرْعَةِ الْإِنْتَرْنِتِ لَدَيْكَ.",
|
||||||
|
"real_debrid_invalid_token": "رَمْزُ واجهة برمجة التطبيقات غَيْرُ صَالِحٍ",
|
||||||
|
"real_debrid_api_token_hint": "يُمْكِنُكَ الْحُصُولُ عَلَى رَمْزِ واجهة برمجة التطبيقات <0>هُنَا</0>",
|
||||||
|
"real_debrid_free_account_error": "الْحِسَابُ \"{{username}}\" هُوَ حِسَابٌ مَجَّانِيٌّ. يَرْجَى الِاشْتِرَاكُ فِي Real-Debrid",
|
||||||
|
"real_debrid_linked_message": "تَمَّ رَبْطُ الْحِسَابِ \"{{username}}\"",
|
||||||
|
"save_changes": "حِفْظُ التَّغْيِيرَاتِ",
|
||||||
|
"changes_saved": "تَمَّ حِفْظُ التَّغْيِيرَاتِ بِنَجَاحٍ",
|
||||||
|
"download_sources_description": "سَتَقُومُ Hydra بِجَلْبِ رَوَابِطِ التَّنْزِيلِ مِنْ هَذِهِ الْمَصَادِرِ. يَجِبُ أَنْ يَكُونَ عُنْوَانُ URL لِلْمَصْدَرِ رَابِطًا مُبَاشِرًا إِلَى مِلَفٍّ .json يَحْتَوِي عَلَى رَوَابِطِ التَّنْزِيلِ.",
|
||||||
|
"validate_download_source": "تَصْدِيقٌ",
|
||||||
|
"remove_download_source": "إِزَالَةٌ",
|
||||||
|
"add_download_source": "إِضَافَةُ مَصْدَرٍ",
|
||||||
|
"download_count_zero": "لَا تَوْجَدُ خِيَارَاتُ تَنْزِيلٍ",
|
||||||
|
"download_count_one": "{{countFormatted}} خِيَارُ تَنْزِيلٍ",
|
||||||
|
"download_count_other": "{{countFormatted}} خِيَارَاتُ تَنْزِيلٍ",
|
||||||
|
"download_source_url": "عُنْوَانُ مَصْدَرِ التَّنْزِيلِ",
|
||||||
|
"add_download_source_description": "أَدْخِلْ عُنْوَانَ URL لِمِلَفٍّ .json",
|
||||||
|
"download_source_up_to_date": "مُحَدَّثٌ",
|
||||||
|
"download_source_errored": "خَطَأٌ",
|
||||||
|
"sync_download_sources": "مَزْجُ الْمَصَادِرِ",
|
||||||
|
"removed_download_source": "تَمَّ إِزَالَةُ مَصْدَرِ التَّنْزِيلِ",
|
||||||
|
"added_download_source": "تَمَّتْ إِضَافَةُ مَصْدَرِ التَّنْزِيلِ",
|
||||||
|
"download_sources_synced": "تَمَّ مَزْجُ جَمِيعِ مَصَادِرِ التَّنْزِيلِ",
|
||||||
|
"insert_valid_json_url": "أَدْخِلْ عُنْوَانَ JSON صَالِحًا",
|
||||||
|
"found_download_option_zero": "لَمْ يُعْثَرْ عَلَى خِيَارِ تَنْزِيلٍ",
|
||||||
|
"found_download_option_one": "عُثِرَ عَلَى {{countFormatted}} خِيَارِ تَنْزِيلٍ",
|
||||||
|
"found_download_option_other": "عُثِرَ عَلَى {{countFormatted}} خِيَارَاتِ تَنْزِيلٍ",
|
||||||
|
"import": "اسْتِيرَادٌ",
|
||||||
|
"public": "عَامٌ",
|
||||||
|
"private": "خَاصٌ",
|
||||||
|
"friends_only": "الْأَصْدِقَاءُ فَقَطْ",
|
||||||
|
"privacy": "الْخُصُوصِيَّةُ",
|
||||||
|
"profile_visibility": "رُؤْيَةُ الْمَلَفِّ الشَّخْصِيِّ",
|
||||||
|
"profile_visibility_description": "اخْتَرْ مَنْ يُمْكِنُهُ رُؤْيَةُ مَلَفِّكَ الشَّخْصِيِّ وَمَكْتَبَتِكَ",
|
||||||
|
"required_field": "هَذَا الْحَقْلُ مَطْلُوبٌ",
|
||||||
|
"source_already_exists": "تَمَّتْ إِضَافَةُ هَذَا الْمَصْدَرِ مِنْ قَبْلُ",
|
||||||
|
"must_be_valid_url": "يَجِبُ أَنْ يَكُونَ الْمَصْدَرُ عُنْوَانَ URL صَالِحًا",
|
||||||
|
"blocked_users": "الْمُسْتَخْدِمُونَ الْمَحْظُورُونَ",
|
||||||
|
"user_unblocked": "تَمَّ إِزَالَةُ حَظْرِ الْمُسْتَخْدِمِ",
|
||||||
|
"enable_achievement_notifications": "عِنْدَ فَتْحِ إِنْجَازٍ",
|
||||||
|
"launch_minimized": "تَشْغِيلُ Hydra مُصَغَّرًا",
|
||||||
|
"disable_nsfw_alert": "تَعْطِيلُ تَنْبِيهِ الْمُحْتَوَى غَيْرِ اللَّائِقِ",
|
||||||
|
"seed_after_download_complete": "الْبَذْرُ بَعْدَ اكْتِمَالِ التَّنْزِيلِ",
|
||||||
|
"show_hidden_achievement_description": "إِظْهَارُ وَصْفِ الإِنْجَازَاتِ الْمَخْفِيَّةِ قَبْلَ فَتْحِهَا"
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"download_complete": "تم التحميل",
|
"download_complete": "اكْتِمَالُ التَّنْزِيلِ",
|
||||||
"game_ready_to_install": "{{title}} جاهزة للتثبيت",
|
"game_ready_to_install": "{{title}} جَاهِزٌ لِلتَّثْبِيتِ",
|
||||||
"repack_list_updated": "قائمة التجميعات المحدثة",
|
"repack_list_updated": "تَمَّ تَحْدِيثُ قَائِمَةِ الإِصْدَارَاتِ الْمُعَادَةِ تَغْلِيفُهَا",
|
||||||
"repack_count_one": "{{count}} حزمة مضافة",
|
"repack_count_one": "{{count}} إِصْدَارٌ مُعَادٌ تَغْلِيفُهُ أُضِيفَ",
|
||||||
"repack_count_other": "{{count}} حزم مُضافة"
|
"repack_count_other": "{{count}} إِصْدَارَاتٌ مُعَادَةٌ تَغْلِيفُهَا أُضِيفَتْ",
|
||||||
|
"new_update_available": "الْإِصْدَارُ {{version}} مَتَوَفِّرٌ",
|
||||||
|
"restart_to_install_update": "أَعِدْ تَشْغِيلَ Hydra لِتَثْبِيتِ التَّحْدِيثِ",
|
||||||
|
"notification_achievement_unlocked_title": "تَمَّ فَتْحُ إِنْجَازٍ لِـ {{game}}",
|
||||||
|
"notification_achievement_unlocked_body": "{{achievement}} وَ{{count}} أُخْرَى تَمَّ فَتْحُهَا"
|
||||||
},
|
},
|
||||||
"system_tray": {
|
"system_tray": {
|
||||||
"open": "فتح هايدرا",
|
"open": "فَتْحُ Hydra",
|
||||||
"quit": "خروج"
|
"quit": "الْخُرُوجُ"
|
||||||
},
|
},
|
||||||
"game_card": {
|
"game_card": {
|
||||||
"no_downloads": "لا توجد تنزيلات متاحة"
|
"no_downloads": "لَا تَوْجَدُ تَنْزِيلَاتٌ مَتَوَفِّرَةٌ"
|
||||||
},
|
},
|
||||||
"binary_not_found_modal": {
|
"binary_not_found_modal": {
|
||||||
"title": "البرامج غير مثبتة",
|
"title": "الْبَرَامِجُ غَيْرُ مُثَبَّتَةٍ",
|
||||||
"description": "لم يتم العثور على ملفات Wine أو Lutris التنفيذية على نظامك",
|
"description": "لَمْ يُعْثَرْ عَلَى مَلَفَّاتٍ تَنْفِيذِيَّةٍ لِـ Wine أَوْ Lutris عَلَى نِظَامِكَ",
|
||||||
"instructions": "تحقق من الطريقة الصحيحة لتثبيت أي منها على توزيعة Linux الخاصة بك حتى تعمل اللعبة بشكل طبيعي"
|
"instructions": "تَحَقَّقْ مِنَ الطَّرِيقَةِ الصَّحِيحَةِ لِتَثْبِيتِ أَيٍّ مِنْهُمَا عَلَى تَوْزِيعَةِ Linux لَدَيْكَ لِتَعْمَلَ اللُّعْبَةُ بِشَكْلٍ طَبِيعِيٍّ"
|
||||||
},
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
"close": "زر إغلاق"
|
"close": "زِرُّ الإِغْلَاقِ"
|
||||||
|
},
|
||||||
|
"forms": {
|
||||||
|
"toggle_password_visibility": "تَبْدِيلُ رُؤْيَةِ كَلِمَةِ الْمَرُورِ"
|
||||||
|
},
|
||||||
|
"user_profile": {
|
||||||
|
"amount_hours": "{{amount}} سَاعَاتٌ",
|
||||||
|
"amount_minutes": "{{amount}} دَقَائِقُ",
|
||||||
|
"last_time_played": "آخِرُ مَرَّةٍ لُعِبَتْ {{period}}",
|
||||||
|
"activity": "النَّشَاطُ الْأَخِيرُ",
|
||||||
|
"library": "الْمَكْتَبَةُ",
|
||||||
|
"total_play_time": "إِجْمَالِيُّ وَقْتِ اللَّعِبِ",
|
||||||
|
"no_recent_activity_title": "هَمَمْ... لَا شَيْءَ هُنَا",
|
||||||
|
"no_recent_activity_description": "لَمْ تَلْعَبْ أَيَّ أَلْعَابٍ مُؤَخَّرًا. حَانَ الْوَقْتُ لِتَغْيِيرِ ذَلِكَ!",
|
||||||
|
"display_name": "اسْمُ الْعَرْضِ",
|
||||||
|
"saving": "جَارٍ الْحِفْظُ",
|
||||||
|
"save": "حِفْظٌ",
|
||||||
|
"edit_profile": "تَحْرِيرُ الْمَلَفِّ الشَّخْصِيِّ",
|
||||||
|
"saved_successfully": "تَمَّ الْحِفْظُ بِنَجَاحٍ",
|
||||||
|
"try_again": "الرَّجَاءُ الْمُحَاوَلَةُ مَرَّةً أُخْرَى",
|
||||||
|
"sign_out_modal_title": "هَلْ أَنْتَ مُتَأَكِّدٌ؟",
|
||||||
|
"cancel": "إِلْغَاءٌ",
|
||||||
|
"successfully_signed_out": "تَمَّ تَسْجِيلُ الْخُرُوجِ بِنَجَاحٍ",
|
||||||
|
"sign_out": "تَسْجِيلُ الْخُرُوجِ",
|
||||||
|
"playing_for": "جَارِي اللَّعِبُ لِمُدَّةِ {{amount}}",
|
||||||
|
"sign_out_modal_text": "مَكْتَبَتُكَ مُرْتَبِطَةٌ بِحِسَابِكَ الْحَالِيِّ. عِنْدَ تَسْجِيلِ الْخُرُوجِ، لَنْ تَكُونَ مَكْتَبَتُكَ مَرْئِيَّةً بَعْدَ الْآنِ، وَلَنْ يَتِمَّ حِفْظُ أَيِّ تَقَدُّمٍ. هَلْ تُرِيدُ الْمُتَابَعَةَ مَعَ تَسْجِيلِ الْخُرُوجِ؟",
|
||||||
|
"add_friends": "إِضَافَةُ الْأَصْدِقَاءِ",
|
||||||
|
"add": "إِضَافَةٌ",
|
||||||
|
"friend_code": "رَمْزُ الصَّدِيقِ",
|
||||||
|
"see_profile": "رُؤْيَةُ الْمَلَفِّ الشَّخْصِيِّ",
|
||||||
|
"sending": "جَارٍ الْإِرْسَالُ",
|
||||||
|
"friend_request_sent": "تَمَّ إِرْسَالُ طَلَبِ الصَّدَاقَةِ",
|
||||||
|
"friends": "الْأَصْدِقَاءُ",
|
||||||
|
"friends_list": "قَائِمَةُ الْأَصْدِقَاءِ",
|
||||||
|
"user_not_found": "الْمُسْتَخْدِمُ غَيْرُ مَوْجُودٍ",
|
||||||
|
"block_user": "حَظْرُ الْمُسْتَخْدِمِ",
|
||||||
|
"add_friend": "إِضَافَةُ صَدِيقٍ",
|
||||||
|
"request_sent": "تَمَّ إِرْسَالُ الطَّلَبِ",
|
||||||
|
"request_received": "تَمَّ اسْتِقْبَالُ الطَّلَبِ",
|
||||||
|
"accept_request": "قَبُولُ الطَّلَبِ",
|
||||||
|
"ignore_request": "تَجَاهُلُ الطَّلَبِ",
|
||||||
|
"cancel_request": "إِلْغَاءُ الطَّلَبِ",
|
||||||
|
"undo_friendship": "إِلْغَاءُ الصَّدَاقَةِ",
|
||||||
|
"request_accepted": "تَمَّ قَبُولُ الطَّلَبِ",
|
||||||
|
"user_blocked_successfully": "تَمَّ حَظْرُ الْمُسْتَخْدِمِ بِنَجَاحٍ",
|
||||||
|
"user_block_modal_text": "سَيُؤَدِّي هَذَا إِلَى حَظْرِ {{displayName}}",
|
||||||
|
"blocked_users": "الْمُسْتَخْدِمُونَ الْمَحْظُورُونَ",
|
||||||
|
"unblock": "إِزَالَةُ الْحَظْرِ",
|
||||||
|
"no_friends_added": "لَيْسَ لَدَيْكَ أَصْدِقَاءٌ مُضَافُونَ",
|
||||||
|
"pending": "قَيْدُ الْانْتِظَارِ",
|
||||||
|
"no_pending_invites": "لَيْسَ لَدَيْكَ دَعَوَاتٌ قَيْدُ الْانْتِظَارِ",
|
||||||
|
"no_blocked_users": "لَيْسَ لَدَيْكَ مُسْتَخْدِمُونَ مَحْظُورُونَ",
|
||||||
|
"friend_code_copied": "تَمَّ نَسْخُ رَمْزِ الصَّدِيقِ",
|
||||||
|
"undo_friendship_modal_text": "سَيُؤَدِّي هَذَا إِلَى إِلْغَاءِ صَدَاقَتِكَ مَعَ {{displayName}}",
|
||||||
|
"privacy_hint": "لِتَعْدِيلِ مَنْ يُمْكِنُهُ رُؤْيَةُ هَذَا، اذْهَبْ إِلَى <0>الإعْدَادَاتِ</0>",
|
||||||
|
"locked_profile": "هَذَا الْمَلَفُّ الشَّخْصِيُّ خَاصٌّ",
|
||||||
|
"image_process_failure": "فَشَلَ أَثْنَاءَ مُعَالَجَةِ الصُّورَةِ",
|
||||||
|
"required_field": "هَذَا الْحَقْلُ مَطْلُوبٌ",
|
||||||
|
"displayname_min_length": "يَجِبُ أَنْ يَكُونَ اسْمُ الْعَرْضِ عَلَى الْأَقَلِّ 3 أَحْرُفٍ",
|
||||||
|
"displayname_max_length": "يَجِبُ أَنْ يَكُونَ اسْمُ الْعَرْضِ عَلَى الْأَكْثَرِ 50 حَرْفًا",
|
||||||
|
"report_profile": "تَقْرِيرٌ عَنْ هَذَا الْمَلَفِّ الشَّخْصِيِّ",
|
||||||
|
"report_reason": "لِمَاذَا تُقَدِّمُ تَقْرِيرًا عَنْ هَذَا الْمَلَفِّ الشَّخْصِيِّ؟",
|
||||||
|
"report_description": "مَعْلُومَاتٌ إِضَافِيَّةٌ",
|
||||||
|
"report_description_placeholder": "مَعْلُومَاتٌ إِضَافِيَّةٌ",
|
||||||
|
"report": "تَقْرِيرٌ",
|
||||||
|
"report_reason_hate": "خِطَابُ الْكُرْهِ",
|
||||||
|
"report_reason_sexual_content": "مُحْتَوًى جِنْسِيٌّ",
|
||||||
|
"report_reason_violence": "عُنْفٌ",
|
||||||
|
"report_reason_spam": "رَاسِلَةٌ عَشْوَائِيَّةٌ",
|
||||||
|
"report_reason_other": "آخَرُ",
|
||||||
|
"profile_reported": "تَمَّ تَقْرِيرُ الْمَلَفِّ الشَّخْصِيِّ",
|
||||||
|
"your_friend_code": "رَمْزُ صَدِيقِكَ:",
|
||||||
|
"upload_banner": "رَفْعُ لَافِتَةٍ",
|
||||||
|
"uploading_banner": "جَارٍ رَفْعُ اللَّافِتَةِ...",
|
||||||
|
"background_image_updated": "تَمَّ تَحْدِيثُ صُورَةِ الْخَلْفِيَّةِ",
|
||||||
|
"stats": "الإحْصَائِيَّاتُ",
|
||||||
|
"achievements": "الإِنْجَازَاتُ",
|
||||||
|
"games": "الْأَلْعَابُ",
|
||||||
|
"top_percentile": "الْأَفْضَلُ {{percentile}}%",
|
||||||
|
"ranking_updated_weekly": "التَّرْتِيبُ يُحَدَّثُ أُسْبُوعِيًّا",
|
||||||
|
"playing": "جَارِي اللَّعِبُ {{game}}",
|
||||||
|
"achievements_unlocked": "الإِنْجَازَاتُ الْمَفْتُوحَةُ",
|
||||||
|
"earned_points": "النَّقَاطُ الْمَكْسُوبَةُ",
|
||||||
|
"show_achievements_on_profile": "عَرْضُ إِنْجَازَاتِكَ عَلَى مَلَفِّكَ الشَّخْصِيِّ",
|
||||||
|
"show_points_on_profile": "عَرْضُ النَّقَاطِ الْمَكْسُوبَةِ عَلَى مَلَفِّكَ الشَّخْصِيِّ"
|
||||||
|
},
|
||||||
|
"achievement": {
|
||||||
|
"achievement_unlocked": "إِنْجَازٌ مَفْتُوحٌ",
|
||||||
|
"user_achievements": "إِنْجَازَاتُ {{displayName}}",
|
||||||
|
"your_achievements": "إِنْجَازَاتُكَ",
|
||||||
|
"unlocked_at": "تَمَّ الْفَتْحُ فِي: {{date}}",
|
||||||
|
"subscription_needed": "يَحْتَاجُ اشْتِرَاكُ Hydra Cloud لِرُؤْيَةِ هَذَا الْمُحْتَوَى",
|
||||||
|
"new_achievements_unlocked": "تَمَّ فَتْحُ {{achievementCount}} إِنْجَازَاتٍ جَدِيدَةٍ مِنْ {{gameCount}} أَلْعَابٍ",
|
||||||
|
"achievement_progress": "{{unlockedCount}}/{{totalCount}} إِنْجَازَاتٍ",
|
||||||
|
"achievements_unlocked_for_game": "تَمَّ فَتْحُ {{achievementCount}} إِنْجَازَاتٍ جَدِيدَةٍ لِـ {{gameTitle}}",
|
||||||
|
"hidden_achievement_tooltip": "هَذَا إِنْجَازٌ مَخْفِيٌّ",
|
||||||
|
"achievement_earn_points": "اكْسِبْ {{points}} نَقَاطًا بِهَذَا الإِنْجَازِ",
|
||||||
|
"earned_points": "النَّقَاطُ الْمَكْسُوبَةُ:",
|
||||||
|
"available_points": "النَّقَاطُ الْمُتَوَفِّرَةُ:",
|
||||||
|
"how_to_earn_achievements_points": "كَيْفَ تَكْسِبُ نَقَاطَ الإِنْجَازَاتِ؟"
|
||||||
|
},
|
||||||
|
"hydra_cloud": {
|
||||||
|
"subscription_tour_title": "اشْتِرَاكُ Hydra Cloud",
|
||||||
|
"subscribe_now": "اشْتَرِكِ الْآنَ",
|
||||||
|
"cloud_saving": "حِفْظٌ سَحَابِيٌّ",
|
||||||
|
"cloud_achievements": "حِفْظُ إِنْجَازَاتِكَ فِي السَّحَابَةِ",
|
||||||
|
"animated_profile_picture": "صُورُ الْمَلَفِّ الشَّخْصِيِّ الْمُتَحَرِّكَةِ",
|
||||||
|
"premium_support": "الدَّعْمُ الْمُتَقَدِّمُ",
|
||||||
|
"show_and_compare_achievements": "عَرْضٌ وَمُقَارَنَةُ إِنْجَازَاتِكَ مَعَ مُسْتَخْدِمِينَ آخَرِينَ",
|
||||||
|
"animated_profile_banner": "لَافِتَةُ الْمَلَفِّ الشَّخْصِيِّ الْمُتَحَرِّكَةِ",
|
||||||
|
"hydra_cloud": "Hydra Cloud",
|
||||||
|
"hydra_cloud_feature_found": "لَقَدْ اكْتَشَفْتَ مِيزَةً مِنْ Hydra Cloud!",
|
||||||
|
"learn_more": "تَعَلَّمْ أَكْثَرَ"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
"need_help": "Имате нужда от помощ??"
|
"need_help": "Имате нужда от помощ??"
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
"search": "Търси игри",
|
"search": "Търсене",
|
||||||
"home": "Начало",
|
"home": "Начало",
|
||||||
"catalogue": "Каталог",
|
"catalogue": "Каталог",
|
||||||
"downloads": "Изтегляния",
|
"downloads": "Изтегляния",
|
||||||
@ -46,10 +46,20 @@
|
|||||||
"checking_files": "Проверка на {{title}} файловете… ({{percentage}} готово)"
|
"checking_files": "Проверка на {{title}} файловете… ({{percentage}} готово)"
|
||||||
},
|
},
|
||||||
"catalogue": {
|
"catalogue": {
|
||||||
"next_page": "Следваща страница",
|
"search": "Филтър…",
|
||||||
"previous_page": "Предишна страница"
|
"developers": "Разработчици",
|
||||||
|
"genres": "Жанрове",
|
||||||
|
"tags": "Тагове",
|
||||||
|
"publishers": "Издатели",
|
||||||
|
"download_sources": "Източници за изтегляне",
|
||||||
|
"result_count": "{{resultCount}} резултати",
|
||||||
|
"filter_count": "{{filterCount}} налични",
|
||||||
|
"clear_filters": "Изчисти {{filterCount}} избрани"
|
||||||
},
|
},
|
||||||
"game_details": {
|
"game_details": {
|
||||||
|
"launch_options": "Опции за стартиране",
|
||||||
|
"launch_options_description": "Напредналите потребители могат да въведат модификации на своите опции за стартиране (экспериментальный)",
|
||||||
|
"launch_options_placeholder": "Няма зададен параметър",
|
||||||
"open_download_options": "Варианти за изтегляне",
|
"open_download_options": "Варианти за изтегляне",
|
||||||
"download_options_zero": "Няма варианти за изтегляне",
|
"download_options_zero": "Няма варианти за изтегляне",
|
||||||
"download_options_one": "{{count}} варианти за изтегляне",
|
"download_options_one": "{{count}} варианти за изтегляне",
|
||||||
@ -65,7 +75,7 @@
|
|||||||
"calculating_eta": "Калкулиране на оставащо време…",
|
"calculating_eta": "Калкулиране на оставащо време…",
|
||||||
"downloading_metadata": "Изтегляне на метадата…",
|
"downloading_metadata": "Изтегляне на метадата…",
|
||||||
"filter": "Филтрирай repacks",
|
"filter": "Филтрирай repacks",
|
||||||
"requirements": "Състемни изисквания",
|
"requirements": "Системни изисквания",
|
||||||
"minimum": "Минимални",
|
"minimum": "Минимални",
|
||||||
"recommended": "Препоръчителни",
|
"recommended": "Препоръчителни",
|
||||||
"paused": "Паузирано",
|
"paused": "Паузирано",
|
||||||
@ -79,8 +89,8 @@
|
|||||||
"add_to_library": "Добави в библиотеката",
|
"add_to_library": "Добави в библиотеката",
|
||||||
"remove_from_library": "Премахни от библиотеката",
|
"remove_from_library": "Премахни от библиотеката",
|
||||||
"no_downloads": "Няма налични изтегляния",
|
"no_downloads": "Няма налични изтегляния",
|
||||||
"play_time": "Играно {{amount}}",
|
"play_time": "Игрално време {{amount}}",
|
||||||
"last_time_played": "Последно играно {{period}}",
|
"last_time_played": "Последно пускане {{period}}",
|
||||||
"not_played_yet": "Не сте играли {{title}} все още",
|
"not_played_yet": "Не сте играли {{title}} все още",
|
||||||
"next_suggestion": "Следващо предложение",
|
"next_suggestion": "Следващо предложение",
|
||||||
"play": "Пускане",
|
"play": "Пускане",
|
||||||
@ -110,7 +120,7 @@
|
|||||||
"remove_from_library_description": "Това ще премахне {{game}} от Библиотеката",
|
"remove_from_library_description": "Това ще премахне {{game}} от Библиотеката",
|
||||||
"options": "Опции",
|
"options": "Опции",
|
||||||
"executable_section_title": "Стартиращ файл",
|
"executable_section_title": "Стартиращ файл",
|
||||||
"executable_section_description": "Пътят на файла, който ще се изпълни, когато се щракне върху \"Играй\"",
|
"executable_section_description": "Пътят на файла, който ще се изпълни, когато се щракне върху \"Пускане\"",
|
||||||
"downloads_secion_title": "Свалени",
|
"downloads_secion_title": "Свалени",
|
||||||
"downloads_section_description": "Вижте актуализации или други версии на тази игра",
|
"downloads_section_description": "Вижте актуализации или други версии на тази игра",
|
||||||
"danger_zone_section_title": "Опасна зона",
|
"danger_zone_section_title": "Опасна зона",
|
||||||
@ -162,7 +172,7 @@
|
|||||||
"no_download_option_info": "Няма налични данни",
|
"no_download_option_info": "Няма налични данни",
|
||||||
"backup_deletion_failed": "Неуспешно изтриване на резервно копие",
|
"backup_deletion_failed": "Неуспешно изтриване на резервно копие",
|
||||||
"max_number_of_artifacts_reached": "Достигнат максимален брой резервни копия за тази игра",
|
"max_number_of_artifacts_reached": "Достигнат максимален брой резервни копия за тази игра",
|
||||||
"achievements_not_sync": "Постиженията ви не са синхронизирани",
|
"achievements_not_sync": "Постиженията не са синхронизирани",
|
||||||
"manage_files_description": "Управлявайте кои файлове ще бъдат архивирани и възстановени",
|
"manage_files_description": "Управлявайте кои файлове ще бъдат архивирани и възстановени",
|
||||||
"select_folder": "Избери папка",
|
"select_folder": "Избери папка",
|
||||||
"backup_from": "Резервно копие от {{date}}",
|
"backup_from": "Резервно копие от {{date}}",
|
||||||
@ -177,6 +187,10 @@
|
|||||||
"loading": "Зареждане…"
|
"loading": "Зареждане…"
|
||||||
},
|
},
|
||||||
"downloads": {
|
"downloads": {
|
||||||
|
"seeding": "Сийдване",
|
||||||
|
"stop_seeding": "Спри сийдването",
|
||||||
|
"resume_seeding": "Продължи сийдването",
|
||||||
|
"options": "Управление",
|
||||||
"resume": "Продължи",
|
"resume": "Продължи",
|
||||||
"pause": "Пауза",
|
"pause": "Пауза",
|
||||||
"eta": "Conclusion {{eta}}",
|
"eta": "Conclusion {{eta}}",
|
||||||
@ -198,10 +212,12 @@
|
|||||||
"downloads_completed": "Приключени",
|
"downloads_completed": "Приключени",
|
||||||
"queued": "В опашка",
|
"queued": "В опашка",
|
||||||
"no_downloads_title": "Толкова е празно",
|
"no_downloads_title": "Толкова е празно",
|
||||||
"no_downloads_description": "Все още не сте изтеглили нищо с Hydra, но никога не е късно да започнете..",
|
"no_downloads_description": "Все още не сте изтеглили нищо с Hydra, но никога не е късно да започнете...",
|
||||||
"checking_files": "Проверка на файлове…"
|
"checking_files": "Проверка на файлове…"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"seed_after_download_complete": "Сийд след завършване на изтеглянето",
|
||||||
|
"show_hidden_achievement_description": "Показвай описанието на скритите постижения преди отключването им",
|
||||||
"downloads_path": "Инсталационен път",
|
"downloads_path": "Инсталационен път",
|
||||||
"change": "Актуализиране",
|
"change": "Актуализиране",
|
||||||
"notifications": "Известия",
|
"notifications": "Известия",
|
||||||
@ -210,7 +226,7 @@
|
|||||||
"real_debrid_api_token_label": "Real-Debrid API токен",
|
"real_debrid_api_token_label": "Real-Debrid API токен",
|
||||||
"quit_app_instead_hiding": "Не скривайте Hydra при затваряне",
|
"quit_app_instead_hiding": "Не скривайте Hydra при затваряне",
|
||||||
"launch_with_system": "Стартиране на Hydra при стартиране на системата",
|
"launch_with_system": "Стартиране на Hydra при стартиране на системата",
|
||||||
"general": "Общ",
|
"general": "Общи",
|
||||||
"behavior": "Поведение",
|
"behavior": "Поведение",
|
||||||
"download_sources": "Източници за изтегляне",
|
"download_sources": "Източници за изтегляне",
|
||||||
"language": "Език",
|
"language": "Език",
|
||||||
@ -288,12 +304,22 @@
|
|||||||
"toggle_password_visibility": "Превключване на видимостта на паролата"
|
"toggle_password_visibility": "Превключване на видимостта на паролата"
|
||||||
},
|
},
|
||||||
"user_profile": {
|
"user_profile": {
|
||||||
|
"stats": "Статистики",
|
||||||
|
"achievements": "Постижения",
|
||||||
|
"games": "Игри",
|
||||||
|
"top_percentile": "Топ {{percentile}}%",
|
||||||
|
"ranking_updated_weekly": "Класацията се актуализира седмично",
|
||||||
|
"playing": "Играе {{game}}",
|
||||||
|
"achievements_unlocked": "Отключени постижения",
|
||||||
|
"earned_points": "Спечелени точки",
|
||||||
|
"show_achievements_on_profile": "Показвай своите постижения в профила",
|
||||||
|
"show_points_on_profile": "Показвай спечелените точки в профила",
|
||||||
"amount_hours": "{{amount}} часове",
|
"amount_hours": "{{amount}} часове",
|
||||||
"amount_minutes": "{{amount}} минути",
|
"amount_minutes": "{{amount}} минути",
|
||||||
"last_time_played": "Последно играно {{period}}",
|
"last_time_played": "Последно играно {{period}}",
|
||||||
"activity": "Скорошна активност",
|
"activity": "Скорошна активност",
|
||||||
"library": "Библиотека",
|
"library": "Библиотека",
|
||||||
"total_play_time": "Общо време за игра: {{amount}}",
|
"total_play_time": "Общо време за игра",
|
||||||
"no_recent_activity_title": "Хмм… няма нищо тук",
|
"no_recent_activity_title": "Хмм… няма нищо тук",
|
||||||
"no_recent_activity_description": "Не сте играли игри напоследък. Време е да промените това.!",
|
"no_recent_activity_description": "Не сте играли игри напоследък. Време е да промените това.!",
|
||||||
"display_name": "Показване на името",
|
"display_name": "Показване на името",
|
||||||
@ -331,7 +357,7 @@
|
|||||||
"blocked_users": "Блокирани потребители",
|
"blocked_users": "Блокирани потребители",
|
||||||
"unblock": "Отблокирай",
|
"unblock": "Отблокирай",
|
||||||
"no_friends_added": "Не сте добавили приятели",
|
"no_friends_added": "Не сте добавили приятели",
|
||||||
"pending": "Чакащо",
|
"pending": "Чакащи",
|
||||||
"no_pending_invites": "Нямате чакащи покани",
|
"no_pending_invites": "Нямате чакащи покани",
|
||||||
"no_blocked_users": "Нямате блокирани потребители",
|
"no_blocked_users": "Нямате блокирани потребители",
|
||||||
"friend_code_copied": "Приятелския код е копиран",
|
"friend_code_copied": "Приятелския код е копиран",
|
||||||
@ -359,16 +385,24 @@
|
|||||||
"background_image_updated": "Обновено фоново изображение"
|
"background_image_updated": "Обновено фоново изображение"
|
||||||
},
|
},
|
||||||
"achievement": {
|
"achievement": {
|
||||||
|
"hidden_achievement_tooltip": "Това е скрито постижение",
|
||||||
|
"achievement_earn_points": "Спечели {{points}} точки с това постижение",
|
||||||
|
"earned_points": "Спечелени точки:",
|
||||||
|
"available_points": "Налични точки:",
|
||||||
|
"how_to_earn_achievements_points": "Как да спечелиш точки за постижения?",
|
||||||
"achievement_unlocked": "Постижението е отключено",
|
"achievement_unlocked": "Постижението е отключено",
|
||||||
"user_achievements": "Постиженията на {{displayName}} ",
|
"user_achievements": "Постиженията на {{displayName}} ",
|
||||||
"your_achievements": "Вашите Постижения",
|
"your_achievements": "Вашите Постижения",
|
||||||
"unlocked_at": "Отключено на:",
|
"unlocked_at": "Отключено на: {{date}}",
|
||||||
"subscription_needed": "Необходим е абонамент за Hydra Cloud, за да видите това съдържание",
|
"subscription_needed": "Необходим е абонамент за Hydra Cloud, за да видите това съдържание",
|
||||||
"new_achievements_unlocked": "Отключени {{achievementCount}} нови постижения от {{gameCount}} игра",
|
"new_achievements_unlocked": "Отключени {{achievementCount}} нови постижения от {{gameCount}} игра",
|
||||||
"achievement_progress": "{{unlockedCount}}/{{totalCount}} постижения",
|
"achievement_progress": "{{unlockedCount}}/{{totalCount}} постижения",
|
||||||
"achievements_unlocked_for_game": "Отключени {{achievementCount}} нови постижения за {{gameTitle}}"
|
"achievements_unlocked_for_game": "Отключени {{achievementCount}} нови постижения за {{gameTitle}}"
|
||||||
},
|
},
|
||||||
"tour": {
|
"hydra_cloud": {
|
||||||
|
"hydra_cloud": "Hydra Cloud",
|
||||||
|
"hydra_cloud_feature_found": "Открихте функция на Hydra Cloud!",
|
||||||
|
"learn_more": "Научете повече",
|
||||||
"subscription_tour_title": "Hydra Cloud Абонамент",
|
"subscription_tour_title": "Hydra Cloud Абонамент",
|
||||||
"subscribe_now": "Абонирай се сега",
|
"subscribe_now": "Абонирай се сега",
|
||||||
"cloud_saving": "Запазване в облака",
|
"cloud_saving": "Запазване в облака",
|
||||||
|
@ -224,7 +224,7 @@
|
|||||||
"last_time_played": "Última partida {{period}}",
|
"last_time_played": "Última partida {{period}}",
|
||||||
"activity": "Activitat recent",
|
"activity": "Activitat recent",
|
||||||
"library": "Biblioteca",
|
"library": "Biblioteca",
|
||||||
"total_play_time": "Temps total de joc:{{amount}}",
|
"total_play_time": "Temps total de joc",
|
||||||
"no_recent_activity_title": "Hmmm… encara no res",
|
"no_recent_activity_title": "Hmmm… encara no res",
|
||||||
"no_recent_activity_description": "No has jugat a cap joc recentment. És el moment de canviar-ho!",
|
"no_recent_activity_description": "No has jugat a cap joc recentment. És el moment de canviar-ho!",
|
||||||
"display_name": "Nom de visualització",
|
"display_name": "Nom de visualització",
|
||||||
|
@ -6,7 +6,11 @@
|
|||||||
"home": {
|
"home": {
|
||||||
"featured": "Doporučené",
|
"featured": "Doporučené",
|
||||||
"surprise_me": "Překvap mě",
|
"surprise_me": "Překvap mě",
|
||||||
"no_results": "Výsledek nenalezen"
|
"no_results": "Výsledek nenalezen",
|
||||||
|
"start_typing": "Začni psát pro vyhledávání...",
|
||||||
|
"hot": "Teď populární",
|
||||||
|
"weekly": "📅 Nejlepší hry týdne",
|
||||||
|
"achievements": "🏆 Hry k překonání"
|
||||||
},
|
},
|
||||||
"sidebar": {
|
"sidebar": {
|
||||||
"catalogue": "Katalog",
|
"catalogue": "Katalog",
|
||||||
@ -20,7 +24,9 @@
|
|||||||
"home": "Domov",
|
"home": "Domov",
|
||||||
"queued": "{{title}} (V řadě)",
|
"queued": "{{title}} (V řadě)",
|
||||||
"game_has_no_executable": "Hra nemá zvolen žádný spustitelný soubor",
|
"game_has_no_executable": "Hra nemá zvolen žádný spustitelný soubor",
|
||||||
"sign_in": "Přihlásit se"
|
"sign_in": "Přihlásit se",
|
||||||
|
"friends": "Přátelé",
|
||||||
|
"need_help": "Potřebujete pomoc?"
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
"search": "Vyhledat hry",
|
"search": "Vyhledat hry",
|
||||||
@ -113,7 +119,54 @@
|
|||||||
"download_paused": "Stahování pozastaveno",
|
"download_paused": "Stahování pozastaveno",
|
||||||
"last_downloaded_option": "Poslední stažená možnost",
|
"last_downloaded_option": "Poslední stažená možnost",
|
||||||
"create_shortcut_success": "Zástupce vytvořen úspěšně",
|
"create_shortcut_success": "Zástupce vytvořen úspěšně",
|
||||||
"create_shortcut_error": "Chyba při pokusu vytvořit zástupce"
|
"create_shortcut_error": "Chyba při pokusu vytvořit zástupce",
|
||||||
|
"nsfw_content_title": "Tahle hra obsahuje nevhodný obsah",
|
||||||
|
"nsfw_content_description": "{{title}} obsahuje obsah, který by nemusel být vhodný pro všechny věkové skupiny. Jste si jisti, že chcete pokračovat?",
|
||||||
|
"allow_nsfw_content": "Pokračovat",
|
||||||
|
"refuse_nsfw_content": "Jít zpět",
|
||||||
|
"stats": "Statistiky",
|
||||||
|
"download_count": "Stažení",
|
||||||
|
"player_count": "Aktivní hráči",
|
||||||
|
"download_error": "Tahle možnost stažení není dostupná",
|
||||||
|
"download": "Stáhnout",
|
||||||
|
"executable_path_in_use": "Spustitelný soubor již používá \"{{game}}\"",
|
||||||
|
"warning": "Varování",
|
||||||
|
"hydra_needs_to_remain_open": "Pro tohle stažení, musí Hydra zůstat otevřená až do konce stahování. Pokud Hydru zavřete dříve, postup stahování bude ztracen.",
|
||||||
|
"achievements": "Achievementy",
|
||||||
|
"achievements_count": "Achievementy {{unlockedCount}}/{{achievementsCount}}",
|
||||||
|
"cloud_save": "Uložení v cloudu",
|
||||||
|
"cloud_save_description": "Uložte si svůj postup v cloud a pokračujte v hraní na jakémkoliv zářízení",
|
||||||
|
"backups": "Zálohy",
|
||||||
|
"install_backup": "Nainstalovat",
|
||||||
|
"delete_backup": "Smazat",
|
||||||
|
"create_backup": "Vytvořit zálohu",
|
||||||
|
"last_backup_date": "Poslední záloha vytvořena {{date}}",
|
||||||
|
"no_backup_preview": "Žádné zálohy nebyly nalezeny pro tuhle hru",
|
||||||
|
"restoring_backup": "Obnovuji zálohu ({{progress}} hotovo)...",
|
||||||
|
"uploading_backup": "Nahrávání zálohy...",
|
||||||
|
"no_backups": "Nemáte zatím vytvořeny žádné zálohy pro tuto hru",
|
||||||
|
"backup_uploaded": "Záloha nahrána",
|
||||||
|
"backup_deleted": "Záloha odstraněna",
|
||||||
|
"backup_restored": "Záloha obnovena",
|
||||||
|
"see_all_achievements": "Zobrazit všechny achievementy",
|
||||||
|
"sign_in_to_see_achievements": "Musíte se přihlásit pro zobrazení achievementů",
|
||||||
|
"mapping_method_automatic": "Automaticky",
|
||||||
|
"mapping_method_manual": "Manuálně",
|
||||||
|
"mapping_method_label": "Metoda mapování",
|
||||||
|
"files_automatically_mapped": "Soubory automaticky zmapovány",
|
||||||
|
"no_backups_created": "Žádné zálohy nebyly vytvořeny pro tuto hru",
|
||||||
|
"manage_files": "Spravovat soubory",
|
||||||
|
"loading_save_preview": "Hledání uložených her...",
|
||||||
|
"wine_prefix": "Wine Prefix",
|
||||||
|
"wine_prefix_description": "Wine Prefix použit pro spuštění této hry",
|
||||||
|
"no_download_option_info": "Žádné informace nejsou dostupny",
|
||||||
|
"backup_deletion_failed": "Nepovedlo se odstranit zálohu",
|
||||||
|
"max_number_of_artifacts_reached": "Dosáhli jste maximálního počtu záloh pro tuto hru",
|
||||||
|
"achievements_not_sync": "Vaše achievementy nejsou synchronizovány",
|
||||||
|
"manage_files_description": "Spravovat, které soubory budou zálohovány a obnoveny",
|
||||||
|
"select_folder": "Vybrat složku",
|
||||||
|
"backup_from": "Zálohy z {{date}}",
|
||||||
|
"custom_backup_location_set": "Vlastní umístění záloh nastaveno"
|
||||||
},
|
},
|
||||||
"activation": {
|
"activation": {
|
||||||
"title": "Aktivovat hydru",
|
"title": "Aktivovat hydru",
|
||||||
@ -189,7 +242,21 @@
|
|||||||
"found_download_option_zero": "Nenalezena žádná možnost stahování",
|
"found_download_option_zero": "Nenalezena žádná možnost stahování",
|
||||||
"found_download_option_one": "Nalezena {{countFormatted}} možnost stahování",
|
"found_download_option_one": "Nalezena {{countFormatted}} možnost stahování",
|
||||||
"found_download_option_other": "Nalezeny {{countFormatted}} možnosti stahování",
|
"found_download_option_other": "Nalezeny {{countFormatted}} možnosti stahování",
|
||||||
"import": "Importovat"
|
"import": "Importovat",
|
||||||
|
"public": "Veřejné",
|
||||||
|
"private": "Soukromé",
|
||||||
|
"friends_only": "Pouze přátelé",
|
||||||
|
"privacy": "Soukromí",
|
||||||
|
"profile_visibility": "Viditelnost profilu",
|
||||||
|
"profile_visibility_description": "Vyberte si, kdo může vidět váš profil a knihovnu",
|
||||||
|
"required_field": "Toto pole je povinné",
|
||||||
|
"source_already_exists": "Tento zdroj byl již přidán",
|
||||||
|
"must_be_valid_url": "Zdroj musí být platký odkaz URL",
|
||||||
|
"blocked_users": "Zablokovaní uživatelé",
|
||||||
|
"user_unblocked": "Uživatel byl odblokován",
|
||||||
|
"enable_achievement_notifications": "Když je odemknut achievement",
|
||||||
|
"launch_minimized": "Spustit v minimalizovaném režimu",
|
||||||
|
"disable_nsfw_alert": "Deaktivovat upozornění na nevhodný obsah"
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"download_complete": "Stahování dokončeno",
|
"download_complete": "Stahování dokončeno",
|
||||||
@ -198,7 +265,9 @@
|
|||||||
"repack_count_one": "{{count}} repack přidán",
|
"repack_count_one": "{{count}} repack přidán",
|
||||||
"repack_count_other": "{{count}} repacky přidány",
|
"repack_count_other": "{{count}} repacky přidány",
|
||||||
"new_update_available": "Version {{version}} je dostupná",
|
"new_update_available": "Version {{version}} je dostupná",
|
||||||
"restart_to_install_update": "Restartuj Hydru pro aktualizaci"
|
"restart_to_install_update": "Restartuj Hydru pro aktualizaci",
|
||||||
|
"notification_achievement_unlocked_title": "Achievement pro {{game}} byl odemknut",
|
||||||
|
"notification_achievement_unlocked_body": "{{achievement}} a dalších {{count}} byly odemknuty"
|
||||||
},
|
},
|
||||||
"system_tray": {
|
"system_tray": {
|
||||||
"open": "Otevřít Hydru",
|
"open": "Otevřít Hydru",
|
||||||
@ -224,7 +293,7 @@
|
|||||||
"last_time_played": "Naposledy hráno {{period}}",
|
"last_time_played": "Naposledy hráno {{period}}",
|
||||||
"activity": "Nedávná aktivita",
|
"activity": "Nedávná aktivita",
|
||||||
"library": "Knihovna",
|
"library": "Knihovna",
|
||||||
"total_play_time": "Celkový odehraný čas: {{amount}}",
|
"total_play_time": "Celkový odehraný čas",
|
||||||
"no_recent_activity_title": "Hmmm… nic tu není",
|
"no_recent_activity_title": "Hmmm… nic tu není",
|
||||||
"no_recent_activity_description": "V poslední době si nehrál žádnout hru, můžeš to ale napravit!",
|
"no_recent_activity_description": "V poslední době si nehrál žádnout hru, můžeš to ale napravit!",
|
||||||
"display_name": "Zobrazované jméno",
|
"display_name": "Zobrazované jméno",
|
||||||
@ -266,6 +335,47 @@
|
|||||||
"no_pending_invites": "Nemáte žádné příchozí žádosti",
|
"no_pending_invites": "Nemáte žádné příchozí žádosti",
|
||||||
"no_blocked_users": "Nemáte nikoho zablokovaného",
|
"no_blocked_users": "Nemáte nikoho zablokovaného",
|
||||||
"friend_code_copied": "Kód přítele zkopírován",
|
"friend_code_copied": "Kód přítele zkopírován",
|
||||||
"undo_friendship_modal_text": "Tímto zrušíte své přátelství s {{displayName}}"
|
"undo_friendship_modal_text": "Tímto zrušíte své přátelství s {{displayName}}",
|
||||||
|
"privacy_hint": "Pro změnu toho, kdo tohle může vidět, jděte do <0>Nastavení</0>",
|
||||||
|
"locked_profile": "Tento profil je soukromý",
|
||||||
|
"image_process_failure": "Nastala chyba při zpracování obrázku",
|
||||||
|
"required_field": "Toto pole je povinné",
|
||||||
|
"displayname_min_length": "Uživatelské jméno musí být minimálně 3 znaky dlouhé",
|
||||||
|
"displayname_max_length": "Uživatelské jméno musí být maximálně 50 znaků dlouhé",
|
||||||
|
"report_profile": "Nahlásit profil",
|
||||||
|
"report_reason": "Proč nahlašujete tento profil?",
|
||||||
|
"report_description": "Přídavné informace",
|
||||||
|
"report_description_placeholder": "Přídavné informace",
|
||||||
|
"report": "Nahlásit",
|
||||||
|
"report_reason_hate": "Nenávistné projevy",
|
||||||
|
"report_reason_sexual_content": "Sexuální obsah",
|
||||||
|
"report_reason_violence": "Násilí",
|
||||||
|
"report_reason_spam": "Spam",
|
||||||
|
"report_reason_other": "Ostatní",
|
||||||
|
"profile_reported": "Profil nahlášen",
|
||||||
|
"your_friend_code": "Tvůj kód přítele:",
|
||||||
|
"upload_banner": "Nahrát banner profilu",
|
||||||
|
"uploading_banner": "Nahrávání banneru",
|
||||||
|
"background_image_updated": "Obrázek pozadí byl změněn"
|
||||||
|
},
|
||||||
|
"achievement": {
|
||||||
|
"achievement_unlocked": "Achievement odemčen",
|
||||||
|
"user_achievements": "Achievementy uživatele {{displayName}}",
|
||||||
|
"your_achievements": "Vaše achievementy",
|
||||||
|
"unlocked_at": "Odemčeno: {{date}}",
|
||||||
|
"subscription_needed": "Je vyžadováno předplatné Hydra Cloud pro zobrazení tohoto obsahu",
|
||||||
|
"new_achievements_unlocked": "Odemčeno {{achievementCount}} nových achievementů z {{gameCount}} her",
|
||||||
|
"achievement_progress": "{{unlockedCount}}/{{totalCount}} achievementů",
|
||||||
|
"achievements_unlocked_for_game": "Odemčeno {{achievementCount}} nových achievementů pro {{gameTitle}}"
|
||||||
|
},
|
||||||
|
"hydra_cloud": {
|
||||||
|
"subscription_tour_title": "Předplatné Hydra Cloud",
|
||||||
|
"subscribe_now": "Připojit se",
|
||||||
|
"cloud_saving": "Ukládání v cloudu",
|
||||||
|
"cloud_achievements": "Ukládejte vaše achievementy do cloudu",
|
||||||
|
"animated_profile_picture": "Animované profilové obrázky",
|
||||||
|
"premium_support": "Prémiová podpora",
|
||||||
|
"show_and_compare_achievements": "Zobraz a porovnej achievementy s ostatními uživateli",
|
||||||
|
"animated_profile_banner": "Animovaný banner na profilu"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -251,7 +251,7 @@
|
|||||||
"last_time_played": "Sidst spillet {{period}}",
|
"last_time_played": "Sidst spillet {{period}}",
|
||||||
"activity": "Seneste aktivitet",
|
"activity": "Seneste aktivitet",
|
||||||
"library": "Bibliotek",
|
"library": "Bibliotek",
|
||||||
"total_play_time": "Samlet spiltid: {{amount}}",
|
"total_play_time": "Samlet spiltid",
|
||||||
"no_recent_activity_title": "Hmmm… ikke noget her",
|
"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å!",
|
"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",
|
"display_name": "Brugernavn",
|
||||||
|
@ -224,7 +224,7 @@
|
|||||||
"last_time_played": "Zuletzt gespielt {{period}}",
|
"last_time_played": "Zuletzt gespielt {{period}}",
|
||||||
"activity": "Letzte Aktivität",
|
"activity": "Letzte Aktivität",
|
||||||
"library": "Bibliothek",
|
"library": "Bibliothek",
|
||||||
"total_play_time": "Gesamtspielzeit: {{amount}}",
|
"total_play_time": "Gesamtspielzeit",
|
||||||
"no_recent_activity_title": "Hmmm… hier ist nichts",
|
"no_recent_activity_title": "Hmmm… hier ist nichts",
|
||||||
"no_recent_activity_description": "Du hast in letzter Zeit keine Spiele gespielt. Es wird Zeit das zu ändern!",
|
"no_recent_activity_description": "Du hast in letzter Zeit keine Spiele gespielt. Es wird Zeit das zu ändern!",
|
||||||
"display_name": "Anzeigename",
|
"display_name": "Anzeigename",
|
||||||
|
@ -46,8 +46,15 @@
|
|||||||
"checking_files": "Checking {{title}} files… ({{percentage}} complete)"
|
"checking_files": "Checking {{title}} files… ({{percentage}} complete)"
|
||||||
},
|
},
|
||||||
"catalogue": {
|
"catalogue": {
|
||||||
"next_page": "Next page",
|
"search": "Filter…",
|
||||||
"previous_page": "Previous page"
|
"developers": "Developers",
|
||||||
|
"genres": "Genres",
|
||||||
|
"tags": "Tags",
|
||||||
|
"publishers": "Publishers",
|
||||||
|
"download_sources": "Download sources",
|
||||||
|
"result_count": "{{resultCount}} results",
|
||||||
|
"filter_count": "{{filterCount}} available",
|
||||||
|
"clear_filters": "Clear {{filterCount}} selected"
|
||||||
},
|
},
|
||||||
"game_details": {
|
"game_details": {
|
||||||
"open_download_options": "Open download options",
|
"open_download_options": "Open download options",
|
||||||
@ -105,6 +112,7 @@
|
|||||||
"open_folder": "Open folder",
|
"open_folder": "Open folder",
|
||||||
"open_download_location": "See downloaded files",
|
"open_download_location": "See downloaded files",
|
||||||
"create_shortcut": "Create desktop shortcut",
|
"create_shortcut": "Create desktop shortcut",
|
||||||
|
"clear": "Clear",
|
||||||
"remove_files": "Remove files",
|
"remove_files": "Remove files",
|
||||||
"remove_from_library_title": "Are you sure?",
|
"remove_from_library_title": "Are you sure?",
|
||||||
"remove_from_library_description": "This will remove {{game}} from your library",
|
"remove_from_library_description": "This will remove {{game}} from your library",
|
||||||
@ -159,14 +167,24 @@
|
|||||||
"loading_save_preview": "Searching for save games…",
|
"loading_save_preview": "Searching for save games…",
|
||||||
"wine_prefix": "Wine Prefix",
|
"wine_prefix": "Wine Prefix",
|
||||||
"wine_prefix_description": "The Wine prefix used to run this game",
|
"wine_prefix_description": "The Wine prefix used to run this game",
|
||||||
|
"launch_options": "Launch Options",
|
||||||
|
"launch_options_description": "Advanced users may choose to enter modifications to their launch options (experimental feature)",
|
||||||
|
"launch_options_placeholder": "No parameter specified",
|
||||||
"no_download_option_info": "No information available",
|
"no_download_option_info": "No information available",
|
||||||
"backup_deletion_failed": "Failed to delete backup",
|
"backup_deletion_failed": "Failed to delete backup",
|
||||||
"max_number_of_artifacts_reached": "Maximum number of backups reached for this game",
|
"max_number_of_artifacts_reached": "Maximum number of backups reached for this game",
|
||||||
"achievements_not_sync": "Your achievements are not synchronized",
|
"achievements_not_sync": "See how to synchronize your achievements",
|
||||||
"manage_files_description": "Manage which files will be backed up and restored",
|
"manage_files_description": "Manage which files will be backed up and restored",
|
||||||
"select_folder": "Select folder",
|
"select_folder": "Select folder",
|
||||||
"backup_from": "Backup from {{date}}",
|
"backup_from": "Backup from {{date}}",
|
||||||
"custom_backup_location_set": "Custom backup location set"
|
"custom_backup_location_set": "Custom backup location set",
|
||||||
|
"no_directory_selected": "No directory selected",
|
||||||
|
"no_write_permission": "Cannot download into this directory. Click here to learn more.",
|
||||||
|
"reset_achievements": "Reset achievements",
|
||||||
|
"reset_achievements_description": "This will reset all achievements for {{game}}",
|
||||||
|
"reset_achievements_title": "Are you sure?",
|
||||||
|
"reset_achievements_success": "Achievements successfully reset",
|
||||||
|
"reset_achievements_error": "Failed to reset achievements"
|
||||||
},
|
},
|
||||||
"activation": {
|
"activation": {
|
||||||
"title": "Activate Hydra",
|
"title": "Activate Hydra",
|
||||||
@ -199,7 +217,11 @@
|
|||||||
"queued": "Queued",
|
"queued": "Queued",
|
||||||
"no_downloads_title": "Such empty",
|
"no_downloads_title": "Such empty",
|
||||||
"no_downloads_description": "You haven't downloaded anything with Hydra yet, but it's never too late to start.",
|
"no_downloads_description": "You haven't downloaded anything with Hydra yet, but it's never too late to start.",
|
||||||
"checking_files": "Checking files…"
|
"checking_files": "Checking files…",
|
||||||
|
"seeding": "Seeding",
|
||||||
|
"stop_seeding": "Stop seeding",
|
||||||
|
"resume_seeding": "Resume seeding",
|
||||||
|
"options": "Manage"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"downloads_path": "Downloads path",
|
"downloads_path": "Downloads path",
|
||||||
@ -256,7 +278,25 @@
|
|||||||
"user_unblocked": "User has been unblocked",
|
"user_unblocked": "User has been unblocked",
|
||||||
"enable_achievement_notifications": "When an achievement is unlocked",
|
"enable_achievement_notifications": "When an achievement is unlocked",
|
||||||
"launch_minimized": "Launch Hydra minimized",
|
"launch_minimized": "Launch Hydra minimized",
|
||||||
"disable_nsfw_alert": "Disable NSFW alert"
|
"disable_nsfw_alert": "Disable NSFW alert",
|
||||||
|
"seed_after_download_complete": "Seed after download complete",
|
||||||
|
"show_hidden_achievement_description": "Show hidden achievements description before unlocking them",
|
||||||
|
"account": "Account",
|
||||||
|
"no_users_blocked": "You have no blocked users",
|
||||||
|
"subscription_active_until": "Your Hydra Cloud is active until {{date}}",
|
||||||
|
"manage_subscription": "Manage subscription",
|
||||||
|
"update_email": "Update email",
|
||||||
|
"update_password": "Update password",
|
||||||
|
"current_email": "Current email:",
|
||||||
|
"no_email_account": "You have not set an email yet",
|
||||||
|
"account_data_updated_successfully": "Account data updated successfully",
|
||||||
|
"renew_subscription": "Renew Hydra Cloud",
|
||||||
|
"subscription_expired_at": "Your subscription expired at {{date}}",
|
||||||
|
"no_subscription": "Enjoy Hydra in the best possible way",
|
||||||
|
"become_subscriber": "Be Hydra Cloud",
|
||||||
|
"subscription_renew_cancelled": "Automatic renewal is disabled",
|
||||||
|
"subscription_renews_on": "Your subscription renews on {{date}}",
|
||||||
|
"bill_sent_until": "Your next bill will be sent until this day"
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"download_complete": "Download complete",
|
"download_complete": "Download complete",
|
||||||
@ -293,7 +333,7 @@
|
|||||||
"last_time_played": "Last played {{period}}",
|
"last_time_played": "Last played {{period}}",
|
||||||
"activity": "Recent Activity",
|
"activity": "Recent Activity",
|
||||||
"library": "Library",
|
"library": "Library",
|
||||||
"total_play_time": "Total playtime: {{amount}}",
|
"total_play_time": "Total playtime",
|
||||||
"no_recent_activity_title": "Hmmm… nothing here",
|
"no_recent_activity_title": "Hmmm… nothing here",
|
||||||
"no_recent_activity_description": "You haven't played any games recently. It's time to change that!",
|
"no_recent_activity_description": "You haven't played any games recently. It's time to change that!",
|
||||||
"display_name": "Display name",
|
"display_name": "Display name",
|
||||||
@ -356,19 +396,34 @@
|
|||||||
"your_friend_code": "Your friend code:",
|
"your_friend_code": "Your friend code:",
|
||||||
"upload_banner": "Upload banner",
|
"upload_banner": "Upload banner",
|
||||||
"uploading_banner": "Uploading banner…",
|
"uploading_banner": "Uploading banner…",
|
||||||
"background_image_updated": "Background image updated"
|
"background_image_updated": "Background image updated",
|
||||||
|
"stats": "Stats",
|
||||||
|
"achievements": "achievements",
|
||||||
|
"games": "Games",
|
||||||
|
"top_percentile": "Top {{percentile}}%",
|
||||||
|
"ranking_updated_weekly": "Ranking is updated weekly",
|
||||||
|
"playing": "Playing {{game}}",
|
||||||
|
"achievements_unlocked": "Achievements Unlocked",
|
||||||
|
"earned_points": "Earned points",
|
||||||
|
"show_achievements_on_profile": "Show your achievements on your profile",
|
||||||
|
"show_points_on_profile": "Show your earned points on your profile"
|
||||||
},
|
},
|
||||||
"achievement": {
|
"achievement": {
|
||||||
"achievement_unlocked": "Achievement unlocked",
|
"achievement_unlocked": "Achievement unlocked",
|
||||||
"user_achievements": "{{displayName}}'s Achievements",
|
"user_achievements": "{{displayName}}'s Achievements",
|
||||||
"your_achievements": "Your Achievements",
|
"your_achievements": "Your Achievements",
|
||||||
"unlocked_at": "Unlocked at:",
|
"unlocked_at": "Unlocked at: {{date}}",
|
||||||
"subscription_needed": "A Hydra Cloud subscription is required to see this content",
|
"subscription_needed": "A Hydra Cloud subscription is required to see this content",
|
||||||
"new_achievements_unlocked": "Unlocked {{achievementCount}} new achievements from {{gameCount}} games",
|
"new_achievements_unlocked": "Unlocked {{achievementCount}} new achievements from {{gameCount}} games",
|
||||||
"achievement_progress": "{{unlockedCount}}/{{totalCount}} achievements",
|
"achievement_progress": "{{unlockedCount}}/{{totalCount}} achievements",
|
||||||
"achievements_unlocked_for_game": "Unlocked {{achievementCount}} new achievements for {{gameTitle}}"
|
"achievements_unlocked_for_game": "Unlocked {{achievementCount}} new achievements for {{gameTitle}}",
|
||||||
|
"hidden_achievement_tooltip": "This is a hidden achievement",
|
||||||
|
"achievement_earn_points": "Earn {{points}} points with this achievement",
|
||||||
|
"earned_points": "Earned points:",
|
||||||
|
"available_points": "Available points:",
|
||||||
|
"how_to_earn_achievements_points": "How to earn achievements points?"
|
||||||
},
|
},
|
||||||
"tour": {
|
"hydra_cloud": {
|
||||||
"subscription_tour_title": "Hydra Cloud Subscription",
|
"subscription_tour_title": "Hydra Cloud Subscription",
|
||||||
"subscribe_now": "Subscribe now",
|
"subscribe_now": "Subscribe now",
|
||||||
"cloud_saving": "Cloud saving",
|
"cloud_saving": "Cloud saving",
|
||||||
@ -376,6 +431,9 @@
|
|||||||
"animated_profile_picture": "Animated profile pictures",
|
"animated_profile_picture": "Animated profile pictures",
|
||||||
"premium_support": "Premium Support",
|
"premium_support": "Premium Support",
|
||||||
"show_and_compare_achievements": "Show and compare your achievements to other users",
|
"show_and_compare_achievements": "Show and compare your achievements to other users",
|
||||||
"animated_profile_banner": "Animated profile banner"
|
"animated_profile_banner": "Animated profile banner",
|
||||||
|
"hydra_cloud": "Hydra Cloud",
|
||||||
|
"hydra_cloud_feature_found": "You've just discovered a Hydra Cloud feature!",
|
||||||
|
"learn_more": "Learn More"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,8 +46,15 @@
|
|||||||
"checking_files": "Verificando archivos de {{title}}… ({{percentage}} completado)"
|
"checking_files": "Verificando archivos de {{title}}… ({{percentage}} completado)"
|
||||||
},
|
},
|
||||||
"catalogue": {
|
"catalogue": {
|
||||||
"next_page": "Siguiente página",
|
"search": "Filtrar…",
|
||||||
"previous_page": "Pagina anterior"
|
"developers": "Desarrolladores",
|
||||||
|
"genres": "Géneros",
|
||||||
|
"tags": "Marcadores",
|
||||||
|
"publishers": "Editores",
|
||||||
|
"download_sources": "Fuentes de descarga",
|
||||||
|
"result_count": "{{resultCount}} resultados",
|
||||||
|
"filter_count": "{{filterCount}} disponibles",
|
||||||
|
"clear_filters": "Limpiar {{filterCount}} seleccionados"
|
||||||
},
|
},
|
||||||
"game_details": {
|
"game_details": {
|
||||||
"open_download_options": "Ver opciones de descargas",
|
"open_download_options": "Ver opciones de descargas",
|
||||||
@ -79,7 +86,7 @@
|
|||||||
"add_to_library": "Agregar a la biblioteca",
|
"add_to_library": "Agregar a la biblioteca",
|
||||||
"remove_from_library": "Eliminar de la biblioteca",
|
"remove_from_library": "Eliminar de la biblioteca",
|
||||||
"no_downloads": "No hay descargas disponibles",
|
"no_downloads": "No hay descargas disponibles",
|
||||||
"play_time": "Jugado por {{amount}}",
|
"play_time": "Has jugado {{amount}}",
|
||||||
"last_time_played": "Jugado por última vez: {{period}}",
|
"last_time_played": "Jugado por última vez: {{period}}",
|
||||||
"not_played_yet": "Aún no has jugado a {{title}}",
|
"not_played_yet": "Aún no has jugado a {{title}}",
|
||||||
"next_suggestion": "Siguiente sugerencia",
|
"next_suggestion": "Siguiente sugerencia",
|
||||||
@ -100,7 +107,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 ejecutable",
|
"select_executable": "Seleccionar",
|
||||||
"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",
|
||||||
@ -166,7 +173,9 @@
|
|||||||
"manage_files_description": "Gestiona los archivos que serán respaldados y restaurados",
|
"manage_files_description": "Gestiona los archivos que serán respaldados y restaurados",
|
||||||
"select_folder": "Seleccionar carpeta",
|
"select_folder": "Seleccionar carpeta",
|
||||||
"backup_from": "Copia de seguridad de {{date}}",
|
"backup_from": "Copia de seguridad de {{date}}",
|
||||||
"custom_backup_location_set": "Se configuró la carpeta de copia de seguridad"
|
"custom_backup_location_set": "Se configuró la carpeta de copia de seguridad",
|
||||||
|
"clear": "Limpiar",
|
||||||
|
"no_directory_selected": "No se seleccionó un directorio"
|
||||||
},
|
},
|
||||||
"activation": {
|
"activation": {
|
||||||
"title": "Activar Hydra",
|
"title": "Activar Hydra",
|
||||||
@ -199,7 +208,11 @@
|
|||||||
"queued": "En cola",
|
"queued": "En cola",
|
||||||
"no_downloads_title": "Esto está tan... vacío",
|
"no_downloads_title": "Esto está tan... vacío",
|
||||||
"no_downloads_description": "No has descargado nada con Hydra... aún, ¡pero nunca es tarde para comenzar!.",
|
"no_downloads_description": "No has descargado nada con Hydra... aún, ¡pero nunca es tarde para comenzar!.",
|
||||||
"checking_files": "Verificando archivos…"
|
"checking_files": "Verificando archivos…",
|
||||||
|
"seeding": "Seeding",
|
||||||
|
"stop_seeding": "Detener seeding",
|
||||||
|
"resume_seeding": "Continuar seeding",
|
||||||
|
"options": "Gestionar"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"downloads_path": "Ruta de descarga",
|
"downloads_path": "Ruta de descarga",
|
||||||
@ -256,7 +269,9 @@
|
|||||||
"user_unblocked": "El usuario ha sido desbloqueado",
|
"user_unblocked": "El usuario ha sido desbloqueado",
|
||||||
"enable_achievement_notifications": "Cuando un logro se desbloquea",
|
"enable_achievement_notifications": "Cuando un logro se desbloquea",
|
||||||
"launch_minimized": "Iniciar Hydra minimizado",
|
"launch_minimized": "Iniciar Hydra minimizado",
|
||||||
"disable_nsfw_alert": "Desactivar alerta NSFW"
|
"disable_nsfw_alert": "Desactivar alerta NSFW",
|
||||||
|
"seed_after_download_complete": "Realizar seeding después de que se completa la descarga",
|
||||||
|
"show_hidden_achievement_description": "Ocultar descripción de logros ocultos antes de desbloquearlos"
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"download_complete": "Descarga completada",
|
"download_complete": "Descarga completada",
|
||||||
@ -293,7 +308,7 @@
|
|||||||
"last_time_played": "Última vez jugado: {{period}}",
|
"last_time_played": "Última vez jugado: {{period}}",
|
||||||
"activity": "Actividad reciente",
|
"activity": "Actividad reciente",
|
||||||
"library": "Biblioteca",
|
"library": "Biblioteca",
|
||||||
"total_play_time": "Total de tiempo jugado: {{amount}}",
|
"total_play_time": "Has jugado",
|
||||||
"no_recent_activity_title": "Que raro, no hay nada por acá...",
|
"no_recent_activity_title": "Que raro, no hay nada por acá...",
|
||||||
"no_recent_activity_description": "No has jugado ningún juego recientemente, ¡vamos a cambiar eso ahora!",
|
"no_recent_activity_description": "No has jugado ningún juego recientemente, ¡vamos a cambiar eso ahora!",
|
||||||
"display_name": "Nombre en pantalla",
|
"display_name": "Nombre en pantalla",
|
||||||
@ -306,7 +321,7 @@
|
|||||||
"cancel": "Cancelar",
|
"cancel": "Cancelar",
|
||||||
"successfully_signed_out": "Sesión cerrada exitosamente",
|
"successfully_signed_out": "Sesión cerrada exitosamente",
|
||||||
"sign_out": "Cerrar sesión",
|
"sign_out": "Cerrar sesión",
|
||||||
"playing_for": "Jugando por {{amount}}",
|
"playing_for": "Llevas jugando {{amount}}",
|
||||||
"sign_out_modal_text": "Tu biblioteca se ha vinculado con tu cuenta. Cuando cierres sesión, tú biblioteca ya no será visible y cualquier progreso no se guardará. ¿Continuar con el cierre de sesión?",
|
"sign_out_modal_text": "Tu biblioteca se ha vinculado con tu cuenta. Cuando cierres sesión, tú biblioteca ya no será visible y cualquier progreso no se guardará. ¿Continuar con el cierre de sesión?",
|
||||||
"add_friends": "Añadir amigos",
|
"add_friends": "Añadir amigos",
|
||||||
"add": "Añadir",
|
"add": "Añadir",
|
||||||
@ -356,19 +371,34 @@
|
|||||||
"your_friend_code": "Tu código de amigo:",
|
"your_friend_code": "Tu código de amigo:",
|
||||||
"upload_banner": "Subir un banner",
|
"upload_banner": "Subir un banner",
|
||||||
"uploading_banner": "Subiendo banner…",
|
"uploading_banner": "Subiendo banner…",
|
||||||
"background_image_updated": "Imagen de fondo actualizada"
|
"background_image_updated": "Imagen de fondo actualizada",
|
||||||
|
"playing": "Jugando {{game}}",
|
||||||
|
"achievements": "logros",
|
||||||
|
"achievements_unlocked": "Logros desbloqueados",
|
||||||
|
"earned_points": "Puntos Obtenidos",
|
||||||
|
"show_achievements_on_profile": "Mostrar tus logros en tu perfil",
|
||||||
|
"show_points_on_profile": "Mostrar tus puntos obtenidos en tu perfil",
|
||||||
|
"games": "Juegos",
|
||||||
|
"ranking_updated_weekly": "El Ranking se actualiza semanalmente",
|
||||||
|
"stats": "Estadísticas",
|
||||||
|
"top_percentile": "Top {{percentile}}%"
|
||||||
},
|
},
|
||||||
"achievement": {
|
"achievement": {
|
||||||
"achievement_unlocked": "Logro desbloqueado",
|
"achievement_unlocked": "Logro desbloqueado",
|
||||||
"user_achievements": "Logros de {{displayName}}",
|
"user_achievements": "Logros de {{displayName}}",
|
||||||
"your_achievements": "Tus Logros",
|
"your_achievements": "Tus Logros",
|
||||||
"unlocked_at": "Desbloqueado el:",
|
"unlocked_at": "Desbloqueado el: {{date}}",
|
||||||
"subscription_needed": "Se necesita una suscripción a Hydra Cloud necesita para ver este contenido",
|
"subscription_needed": "Se necesita una suscripción a Hydra Cloud necesita para ver este contenido",
|
||||||
"new_achievements_unlocked": "Desbloqueados {{achievementCount}} nuevos logros de {{gameCount}} juegos",
|
"new_achievements_unlocked": "Desbloqueados {{achievementCount}} nuevos logros de {{gameCount}} juegos",
|
||||||
"achievement_progress": "{{unlockedCount}}/{{totalCount}} logros",
|
"achievement_progress": "{{unlockedCount}}/{{totalCount}} logros",
|
||||||
"achievements_unlocked_for_game": "Se han desbloqueado {{achievementCount}} nuevos logros de {{gameTitle}}"
|
"achievements_unlocked_for_game": "Se han desbloqueado {{achievementCount}} nuevos logros de {{gameTitle}}",
|
||||||
|
"hidden_achievement_tooltip": "Este es un logro oculto",
|
||||||
|
"achievement_earn_points": "Obtén {{points}} puntos con este logro",
|
||||||
|
"earned_points": "Puntos obtenidos:",
|
||||||
|
"available_points": "Puntos disponibles:",
|
||||||
|
"how_to_earn_achievements_points": "¿Cómo obtener puntos de logros?"
|
||||||
},
|
},
|
||||||
"tour": {
|
"hydra_cloud": {
|
||||||
"subscription_tour_title": "Suscripción Hydra Cloud",
|
"subscription_tour_title": "Suscripción Hydra Cloud",
|
||||||
"subscribe_now": "Suscribirse ahora",
|
"subscribe_now": "Suscribirse ahora",
|
||||||
"cloud_saving": "Guardado en la nube",
|
"cloud_saving": "Guardado en la nube",
|
||||||
@ -376,6 +406,9 @@
|
|||||||
"animated_profile_picture": "Fotos de perfil animadas",
|
"animated_profile_picture": "Fotos de perfil animadas",
|
||||||
"premium_support": "Soporte Premium",
|
"premium_support": "Soporte Premium",
|
||||||
"show_and_compare_achievements": "Muestra y compara tus logros con otros usuarios",
|
"show_and_compare_achievements": "Muestra y compara tus logros con otros usuarios",
|
||||||
"animated_profile_banner": "Fondo de perfil animado"
|
"animated_profile_banner": "Fondo de perfil animado",
|
||||||
|
"hydra_cloud": "Hydra Cloud",
|
||||||
|
"hydra_cloud_feature_found": "¡Has descubierto una característica de Hydra Cloud!",
|
||||||
|
"learn_more": "Aprender más"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -290,7 +290,7 @@
|
|||||||
"last_time_played": "Viimati mängitud {{period}}",
|
"last_time_played": "Viimati mängitud {{period}}",
|
||||||
"activity": "Hiljutine aktiivsus",
|
"activity": "Hiljutine aktiivsus",
|
||||||
"library": "Kogu",
|
"library": "Kogu",
|
||||||
"total_play_time": "Kogu mängitud aeg: {{amount}}",
|
"total_play_time": "Kogu mängitud aeg",
|
||||||
"no_recent_activity_title": "Hmmm… siin pole midagi",
|
"no_recent_activity_title": "Hmmm… siin pole midagi",
|
||||||
"no_recent_activity_description": "Sa pole hiljuti ühtegi mängu mänginud. On aeg seda muuta!",
|
"no_recent_activity_description": "Sa pole hiljuti ühtegi mängu mänginud. On aeg seda muuta!",
|
||||||
"display_name": "Kuvatav nimi",
|
"display_name": "Kuvatav nimi",
|
||||||
@ -359,11 +359,11 @@
|
|||||||
"achievement_unlocked": "Saavutus avatud",
|
"achievement_unlocked": "Saavutus avatud",
|
||||||
"user_achievements": "{{displayName}} saavutused",
|
"user_achievements": "{{displayName}} saavutused",
|
||||||
"your_achievements": "Sinu saavutused",
|
"your_achievements": "Sinu saavutused",
|
||||||
"unlocked_at": "Avatud:",
|
"unlocked_at": "Avatud: {{date}}",
|
||||||
"subscription_needed": "Selle sisu nägemiseks on vaja Hydra Cloud tellimust",
|
"subscription_needed": "Selle sisu nägemiseks on vaja Hydra Cloud tellimust",
|
||||||
"new_achievements_unlocked": "Avatud {{achievementCount}} uut saavutust {{gameCount}} mängust"
|
"new_achievements_unlocked": "Avatud {{achievementCount}} uut saavutust {{gameCount}} mängust"
|
||||||
},
|
},
|
||||||
"tour": {
|
"hydra_cloud": {
|
||||||
"subscription_tour_title": "Hydra Cloud Tellimus",
|
"subscription_tour_title": "Hydra Cloud Tellimus",
|
||||||
"subscribe_now": "Telli kohe",
|
"subscribe_now": "Telli kohe",
|
||||||
"cloud_saving": "Pilvesalvestus",
|
"cloud_saving": "Pilvesalvestus",
|
||||||
|
@ -224,7 +224,7 @@
|
|||||||
"last_time_played": "Terakhir dimainkan {{period}}",
|
"last_time_played": "Terakhir dimainkan {{period}}",
|
||||||
"activity": "Aktivitas terbaru",
|
"activity": "Aktivitas terbaru",
|
||||||
"library": "Perpustakaan",
|
"library": "Perpustakaan",
|
||||||
"total_play_time": "Total waktu bermain: {{amount}}",
|
"total_play_time": "Total waktu bermain",
|
||||||
"no_recent_activity_title": "Hmm… kosong di sini",
|
"no_recent_activity_title": "Hmm… kosong di sini",
|
||||||
"no_recent_activity_description": "Kamu belum main game baru-baru ini. Yuk, mulai main!",
|
"no_recent_activity_description": "Kamu belum main game baru-baru ini. Yuk, mulai main!",
|
||||||
"display_name": "Nama tampilan",
|
"display_name": "Nama tampilan",
|
||||||
|
@ -220,7 +220,7 @@
|
|||||||
"last_time_played": "Соңғы ойын {{period}}",
|
"last_time_played": "Соңғы ойын {{period}}",
|
||||||
"activity": "Соңғы әрекет",
|
"activity": "Соңғы әрекет",
|
||||||
"library": "Кітапхана",
|
"library": "Кітапхана",
|
||||||
"total_play_time": "Барлығы ойнаған: {{amount}}",
|
"total_play_time": "Барлығы ойнаған",
|
||||||
"no_recent_activity_title": "Хммм... Мұнда ештеңе жоқ",
|
"no_recent_activity_title": "Хммм... Мұнда ештеңе жоқ",
|
||||||
"no_recent_activity_description": "Сіз ұзақ уақыт бойы ештеңе ойнаған жоқсыз. Мұны өзгерту керек!",
|
"no_recent_activity_description": "Сіз ұзақ уақыт бойы ештеңе ойнаған жоқсыз. Мұны өзгерту керек!",
|
||||||
"display_name": "Көрсету аты",
|
"display_name": "Көрсету аты",
|
||||||
|
@ -251,7 +251,7 @@
|
|||||||
"last_time_played": "Sist spilt {{period}}",
|
"last_time_played": "Sist spilt {{period}}",
|
||||||
"activity": "Seneste aktivitet",
|
"activity": "Seneste aktivitet",
|
||||||
"library": "Bibliotek",
|
"library": "Bibliotek",
|
||||||
"total_play_time": "Samlet spilltid: {{amount}}",
|
"total_play_time": "Samlet spilltid",
|
||||||
"no_recent_activity_title": "Hmmm… ikke noe her",
|
"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å!",
|
"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",
|
"display_name": "Brukernavn",
|
||||||
|
@ -155,14 +155,24 @@
|
|||||||
"loading_save_preview": "Buscando por arquivos de salvamento…",
|
"loading_save_preview": "Buscando por arquivos de salvamento…",
|
||||||
"wine_prefix": "Prefixo Wine",
|
"wine_prefix": "Prefixo Wine",
|
||||||
"wine_prefix_description": "O prefixo Wine que foi utilizado para instalar o jogo",
|
"wine_prefix_description": "O prefixo Wine que foi utilizado para instalar o jogo",
|
||||||
|
"launch_options": "Opções de Inicialização",
|
||||||
|
"launch_options_description": "Usuários avançados podem adicionar opções de inicialização no jogo (experimental)",
|
||||||
|
"launch_options_placeholder": "Nenhum parâmetro informado",
|
||||||
"no_download_option_info": "Sem informações disponíveis",
|
"no_download_option_info": "Sem informações disponíveis",
|
||||||
"backup_deletion_failed": "Falha ao apagar backup",
|
"backup_deletion_failed": "Falha ao apagar backup",
|
||||||
"max_number_of_artifacts_reached": "Número máximo de backups atingido para este jogo",
|
"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",
|
"achievements_not_sync": "Veja como exibir suas conquistas no perfil",
|
||||||
"backup_from": "Backup de {{date}}",
|
"backup_from": "Backup de {{date}}",
|
||||||
"custom_backup_location_set": "Localização customizada selecionada",
|
"custom_backup_location_set": "Localização customizada selecionada",
|
||||||
"select_folder": "Selecione a pasta",
|
"select_folder": "Selecione a pasta",
|
||||||
"manage_files_description": "Gerencie quais arquivos serão feitos backup"
|
"manage_files_description": "Gerencie quais arquivos serão feitos backup",
|
||||||
|
"clear": "Limpar",
|
||||||
|
"no_directory_selected": "Nenhum diretório selecionado",
|
||||||
|
"reset_achievements": "Resetar conquistas",
|
||||||
|
"reset_achievements_description": "Isso irá resetar todas as conquistas de {{game}}",
|
||||||
|
"reset_achievements_title": "Tem certeza?",
|
||||||
|
"reset_achievements_success": "Conquistas resetadas com sucesso",
|
||||||
|
"reset_achievements_error": "Falha ao resetar conquistas"
|
||||||
},
|
},
|
||||||
"activation": {
|
"activation": {
|
||||||
"title": "Ativação",
|
"title": "Ativação",
|
||||||
@ -195,7 +205,11 @@
|
|||||||
"queued": "Na fila",
|
"queued": "Na fila",
|
||||||
"no_downloads_title": "Nada por aqui…",
|
"no_downloads_title": "Nada por aqui…",
|
||||||
"no_downloads_description": "Você ainda não baixou nada pelo Hydra, mas nunca é tarde para começar.",
|
"no_downloads_description": "Você ainda não baixou nada pelo Hydra, mas nunca é tarde para começar.",
|
||||||
"checking_files": "Verificando arquivos…"
|
"checking_files": "Verificando arquivos…",
|
||||||
|
"seeding": "Semeando",
|
||||||
|
"stop_seeding": "Parar de semear",
|
||||||
|
"resume_seeding": "Semear",
|
||||||
|
"options": "Gerenciar"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"downloads_path": "Diretório dos downloads",
|
"downloads_path": "Diretório dos downloads",
|
||||||
@ -252,7 +266,25 @@
|
|||||||
"user_unblocked": "Usuário desbloqueado",
|
"user_unblocked": "Usuário desbloqueado",
|
||||||
"enable_achievement_notifications": "Quando uma conquista é desbloqueada",
|
"enable_achievement_notifications": "Quando uma conquista é desbloqueada",
|
||||||
"launch_minimized": "Iniciar o Hydra minimizado",
|
"launch_minimized": "Iniciar o Hydra minimizado",
|
||||||
"disable_nsfw_alert": "Desativar alerta de conteúdo inapropriado"
|
"disable_nsfw_alert": "Desativar alerta de conteúdo inapropriado",
|
||||||
|
"seed_after_download_complete": "Semear após a conclusão do download",
|
||||||
|
"show_hidden_achievement_description": "Mostrar descrição de conquistas ocultas antes de debloqueá-las",
|
||||||
|
"account": "Conta",
|
||||||
|
"no_users_blocked": "Você não bloqueou nenhum usuário",
|
||||||
|
"subscription_active_until": "Sua assinatura Hydra Cloud ficará ativa até {{date}}",
|
||||||
|
"manage_subscription": "Gerenciar assinatura",
|
||||||
|
"update_email": "Atualizar email",
|
||||||
|
"update_password": "Atualizar senha",
|
||||||
|
"current_email": "Email atual:",
|
||||||
|
"no_email_account": "Você ainda não adicionou um email a sua conta",
|
||||||
|
"account_data_updated_successfully": "Dados da conta atualizados com sucesso",
|
||||||
|
"renew_subscription": "Renovar Hydra Cloud",
|
||||||
|
"subscription_expired_at": "Sua assinatura expirou em {{date}}",
|
||||||
|
"no_subscription": "Aproveite o Hydra da melhor forma possível",
|
||||||
|
"become_subscriber": "Seja Hydra Cloud",
|
||||||
|
"subscription_renew_cancelled": "A renovação automática está desativada",
|
||||||
|
"subscription_renews_on": "Sua assinatura renova dia {{date}}",
|
||||||
|
"bill_sent_until": "Sua próxima cobrança será enviada até esse dia"
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"download_complete": "Download concluído",
|
"download_complete": "Download concluído",
|
||||||
@ -276,8 +308,15 @@
|
|||||||
"instructions": "Verifique a forma correta de instalar algum deles no seu distro Linux, garantindo assim a execução normal do jogo"
|
"instructions": "Verifique a forma correta de instalar algum deles no seu distro Linux, garantindo assim a execução normal do jogo"
|
||||||
},
|
},
|
||||||
"catalogue": {
|
"catalogue": {
|
||||||
"next_page": "Próxima página",
|
"search": "Filtrar…",
|
||||||
"previous_page": "Página anterior"
|
"developers": "Desenvolvedores",
|
||||||
|
"genres": "Gêneros",
|
||||||
|
"tags": "Marcadores",
|
||||||
|
"publishers": "Distribuidoras",
|
||||||
|
"download_sources": "Fontes de download",
|
||||||
|
"result_count": "{{resultCount}} resultados",
|
||||||
|
"filter_count": "{{filterCount}} disponíveis",
|
||||||
|
"clear_filters": "Limpar {{filterCount}} selecionados"
|
||||||
},
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
"close": "Botão de fechar"
|
"close": "Botão de fechar"
|
||||||
@ -291,7 +330,7 @@
|
|||||||
"last_time_played": "Última sessão {{period}}",
|
"last_time_played": "Última sessão {{period}}",
|
||||||
"activity": "Atividades recentes",
|
"activity": "Atividades recentes",
|
||||||
"library": "Biblioteca",
|
"library": "Biblioteca",
|
||||||
"total_play_time": "Tempo total de jogo: {{amount}}",
|
"total_play_time": "Tempo total de jogo",
|
||||||
"no_recent_activity_title": "Hmmm… nada por aqui",
|
"no_recent_activity_title": "Hmmm… nada por aqui",
|
||||||
"no_recent_activity_description": "Parece que você não jogou nada recentemente. Que tal começar agora?",
|
"no_recent_activity_description": "Parece que você não jogou nada recentemente. Que tal começar agora?",
|
||||||
"display_name": "Nome de exibição",
|
"display_name": "Nome de exibição",
|
||||||
@ -354,26 +393,43 @@
|
|||||||
"your_friend_code": "Seu código de amigo:",
|
"your_friend_code": "Seu código de amigo:",
|
||||||
"upload_banner": "Carregar banner",
|
"upload_banner": "Carregar banner",
|
||||||
"uploading_banner": "Carregando banner…",
|
"uploading_banner": "Carregando banner…",
|
||||||
"background_image_updated": "Imagem de fundo salva"
|
"background_image_updated": "Imagem de fundo salva",
|
||||||
|
"stats": "Estatísticas",
|
||||||
|
"achievements": "conquistas",
|
||||||
|
"games": "Jogos",
|
||||||
|
"ranking_updated_weekly": "O ranking é atualizado semanalmente",
|
||||||
|
"playing": "Jogando {{game}}",
|
||||||
|
"achievements_unlocked": "Conquistas desbloqueadas",
|
||||||
|
"earned_points": "Pontos ganhos",
|
||||||
|
"show_achievements_on_profile": "Exiba suas conquistas no perfil",
|
||||||
|
"show_points_on_profile": "Exiba seus pontos ganhos no perfil"
|
||||||
},
|
},
|
||||||
"achievement": {
|
"achievement": {
|
||||||
"achievement_unlocked": "Conquista desbloqueada",
|
"achievement_unlocked": "Conquista desbloqueada",
|
||||||
"your_achievements": "Suas Conquistas",
|
"your_achievements": "Suas Conquistas",
|
||||||
"user_achievements": "Conquistas de {{displayName}}",
|
"user_achievements": "Conquistas de {{displayName}}",
|
||||||
"unlocked_at": "Desbloqueado em:",
|
"unlocked_at": "Desbloqueada em: {{date}}",
|
||||||
"subscription_needed": "Você precisa de uma assinatura Hydra Cloud para visualizar este conteúdo",
|
"subscription_needed": "Você precisa de uma assinatura Hydra Cloud para visualizar este conteúdo",
|
||||||
"new_achievements_unlocked": "{{achievementCount}} novas conquistas de {{gameCount}} jogos",
|
"new_achievements_unlocked": "{{achievementCount}} novas conquistas de {{gameCount}} jogos",
|
||||||
"achievement_progress": "{{unlockedCount}}/{{totalCount}} conquistas",
|
"achievement_progress": "{{unlockedCount}}/{{totalCount}} conquistas",
|
||||||
"achievements_unlocked_for_game": "Desbloqueadas {{achievementCount}} novas conquistas em {{gameTitle}}"
|
"achievements_unlocked_for_game": "Desbloqueadas {{achievementCount}} novas conquistas em {{gameTitle}}",
|
||||||
|
"hidden_achievement_tooltip": "Esta é uma conquista oculta",
|
||||||
|
"achievement_earn_points": "Ganhe {{points}} pontos com essa conquista",
|
||||||
|
"earned_points": "Pontos ganhos:",
|
||||||
|
"available_points": "Pontos disponíveis:",
|
||||||
|
"how_to_earn_achievements_points": "Como desbloquear pontos nas conquistas?"
|
||||||
},
|
},
|
||||||
"tour": {
|
"hydra_cloud": {
|
||||||
"subscription_tour_title": "Assinatura Hydra Cloud",
|
"subscription_tour_title": "Assinatura Hydra Cloud",
|
||||||
|
"hydra_cloud": "Hydra Cloud",
|
||||||
"subscribe_now": "Inscreva-se agora",
|
"subscribe_now": "Inscreva-se agora",
|
||||||
"cloud_achievements": "Salvamento de conquistas em nuvem",
|
"cloud_achievements": "Salvamento de conquistas em nuvem",
|
||||||
"animated_profile_picture": "Fotos de perfil animadas",
|
"animated_profile_picture": "Fotos de perfil animadas",
|
||||||
"premium_support": "Suporte Premium",
|
"premium_support": "Suporte Premium",
|
||||||
"show_and_compare_achievements": "Exiba e compare suas conquistas com outros usuários",
|
"show_and_compare_achievements": "Exiba e compare suas conquistas com outros usuários",
|
||||||
"animated_profile_banner": "Banner animado no perfil",
|
"animated_profile_banner": "Banner animado no perfil",
|
||||||
"cloud_saving": "Saves de jogos em nuvem"
|
"cloud_saving": "Saves de jogos em nuvem",
|
||||||
|
"hydra_cloud_feature_found": "Você descobriu uma funcionalidade Hydra Cloud!",
|
||||||
|
"learn_more": "Saiba mais"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -287,7 +287,7 @@
|
|||||||
"last_time_played": "Última sessão {{period}}",
|
"last_time_played": "Última sessão {{period}}",
|
||||||
"activity": "Atividade recente",
|
"activity": "Atividade recente",
|
||||||
"library": "Biblioteca",
|
"library": "Biblioteca",
|
||||||
"total_play_time": "Tempo total de jogo: {{amount}}",
|
"total_play_time": "Tempo total de jogo",
|
||||||
"no_recent_activity_title": "Hmmm… não há 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 apresentação",
|
"display_name": "Nome de apresentação",
|
||||||
@ -356,11 +356,11 @@
|
|||||||
"achievement_unlocked": "Conquista desbloqueada",
|
"achievement_unlocked": "Conquista desbloqueada",
|
||||||
"your_achievements": "As tuas Conquistas",
|
"your_achievements": "As tuas Conquistas",
|
||||||
"user_achievements": "Conquistas de {{displayName}}",
|
"user_achievements": "Conquistas de {{displayName}}",
|
||||||
"unlocked_at": "Desbloqueada em:",
|
"unlocked_at": "Desbloqueada em: {{date}}",
|
||||||
"subscription_needed": "Precisas de uma subscrição Hydra Cloud para visualizar este conteúdo",
|
"subscription_needed": "Precisas de uma subscrição Hydra Cloud para visualizar este conteúdo",
|
||||||
"new_achievements_unlocked": "{{achievementCount}} novas conquistas de {{gameCount}} jogos"
|
"new_achievements_unlocked": "{{achievementCount}} novas conquistas de {{gameCount}} jogos"
|
||||||
},
|
},
|
||||||
"tour": {
|
"hydra_cloud": {
|
||||||
"subscription_tour_title": "Subscrição Hydra Cloud",
|
"subscription_tour_title": "Subscrição Hydra Cloud",
|
||||||
"subscribe_now": "Subscreve agora",
|
"subscribe_now": "Subscreve agora",
|
||||||
"cloud_achievements": "Gravação de conquistas na nuvem",
|
"cloud_achievements": "Gravação de conquistas na nuvem",
|
||||||
|
@ -4,12 +4,13 @@
|
|||||||
"successfully_signed_in": "Успешный вход"
|
"successfully_signed_in": "Успешный вход"
|
||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Рекомендованное",
|
"featured": "Рекомендации",
|
||||||
"surprise_me": "Удиви меня",
|
"surprise_me": "Удиви меня",
|
||||||
"no_results": "Ничего не найдено",
|
"no_results": "Ничего не найдено",
|
||||||
"hot": "Сейчас в топе",
|
"hot": "Сейчас в топе",
|
||||||
"start_typing": "Начинаю вводить текст для поиска...",
|
"start_typing": "Начинаю вводить текст для поиска...",
|
||||||
"weekly": "📅 Лучшие игры недели"
|
"weekly": "📅 Лучшие игры недели",
|
||||||
|
"achievements": "🏆 Игры, в которых нужно победить"
|
||||||
},
|
},
|
||||||
"sidebar": {
|
"sidebar": {
|
||||||
"catalogue": "Каталог",
|
"catalogue": "Каталог",
|
||||||
@ -19,7 +20,7 @@
|
|||||||
"downloading_metadata": "{{title}} (Загрузка метаданных…)",
|
"downloading_metadata": "{{title}} (Загрузка метаданных…)",
|
||||||
"paused": "{{title}} (Приостановлено)",
|
"paused": "{{title}} (Приостановлено)",
|
||||||
"downloading": "{{title}} ({{percentage}} - Загрузка…)",
|
"downloading": "{{title}} ({{percentage}} - Загрузка…)",
|
||||||
"filter": "Фильтр библиотеки",
|
"filter": "Поиск",
|
||||||
"home": "Главная",
|
"home": "Главная",
|
||||||
"queued": "{{title}} (В очереди)",
|
"queued": "{{title}} (В очереди)",
|
||||||
"game_has_no_executable": "Файл запуска игры не выбран",
|
"game_has_no_executable": "Файл запуска игры не выбран",
|
||||||
@ -45,14 +46,21 @@
|
|||||||
"checking_files": "Проверка файлов {{title}}… ({{percentage}} завершено)"
|
"checking_files": "Проверка файлов {{title}}… ({{percentage}} завершено)"
|
||||||
},
|
},
|
||||||
"catalogue": {
|
"catalogue": {
|
||||||
"next_page": "Следующая страница",
|
"search": "Фильтр…",
|
||||||
"previous_page": "Предыдущая страница"
|
"developers": "Разработчики",
|
||||||
|
"genres": "Жанры",
|
||||||
|
"tags": "Маркеры",
|
||||||
|
"publishers": "Издательства",
|
||||||
|
"download_sources": "Источники загрузки",
|
||||||
|
"result_count": "{{resultCount}} результатов",
|
||||||
|
"filter_count": "{{filterCount}} доступных",
|
||||||
|
"clear_filters": "Очистить {{filterCount}} выбранных"
|
||||||
},
|
},
|
||||||
"game_details": {
|
"game_details": {
|
||||||
"open_download_options": "Открыть варианты загрузки",
|
"open_download_options": "Открыть источники",
|
||||||
"download_options_zero": "Нет вариантов загрузки",
|
"download_options_zero": "Нет источников",
|
||||||
"download_options_one": "{{count}} вариант загрузки",
|
"download_options_one": "{{count}} источник",
|
||||||
"download_options_other": "{{count}} вариантов загрузки",
|
"download_options_other": "{{count}} источников",
|
||||||
"updated_at": "Обновлено {{updated_at}}",
|
"updated_at": "Обновлено {{updated_at}}",
|
||||||
"install": "Установить",
|
"install": "Установить",
|
||||||
"resume": "Возобновить",
|
"resume": "Возобновить",
|
||||||
@ -63,7 +71,7 @@
|
|||||||
"eta": "Окончание {{eta}}",
|
"eta": "Окончание {{eta}}",
|
||||||
"calculating_eta": "Подсчёт оставшегося времени…",
|
"calculating_eta": "Подсчёт оставшегося времени…",
|
||||||
"downloading_metadata": "Загрузка метаданных…",
|
"downloading_metadata": "Загрузка метаданных…",
|
||||||
"filter": "Фильтр репаков",
|
"filter": "Поиск репаков",
|
||||||
"requirements": "Системные требования",
|
"requirements": "Системные требования",
|
||||||
"minimum": "Минимальные",
|
"minimum": "Минимальные",
|
||||||
"recommended": "Рекомендуемые",
|
"recommended": "Рекомендуемые",
|
||||||
@ -77,7 +85,7 @@
|
|||||||
"accuracy": "точность {{accuracy}}%",
|
"accuracy": "точность {{accuracy}}%",
|
||||||
"add_to_library": "Добавить в библиотеку",
|
"add_to_library": "Добавить в библиотеку",
|
||||||
"remove_from_library": "Удалить из библиотеки",
|
"remove_from_library": "Удалить из библиотеки",
|
||||||
"no_downloads": "Нет доступных загрузок",
|
"no_downloads": "Нет доступных источников",
|
||||||
"play_time": "Сыграно {{amount}}",
|
"play_time": "Сыграно {{amount}}",
|
||||||
"last_time_played": "Последний запуск {{period}}",
|
"last_time_played": "Последний запуск {{period}}",
|
||||||
"not_played_yet": "Вы ещё не играли в {{title}}",
|
"not_played_yet": "Вы ещё не играли в {{title}}",
|
||||||
@ -91,7 +99,7 @@
|
|||||||
"select_folder_hint": "Чтобы изменить папку загрузок по умолчанию, откройте <0>Настройки</0>",
|
"select_folder_hint": "Чтобы изменить папку загрузок по умолчанию, откройте <0>Настройки</0>",
|
||||||
"download_now": "Загрузить сейчас",
|
"download_now": "Загрузить сейчас",
|
||||||
"no_shop_details": "Не удалось получить описание",
|
"no_shop_details": "Не удалось получить описание",
|
||||||
"download_options": "Вариантов загрузки",
|
"download_options": "Источники",
|
||||||
"download_path": "Путь для загрузок",
|
"download_path": "Путь для загрузок",
|
||||||
"previous_screenshot": "Предыдущий скриншот",
|
"previous_screenshot": "Предыдущий скриншот",
|
||||||
"next_screenshot": "Следующий скриншот",
|
"next_screenshot": "Следующий скриншот",
|
||||||
@ -104,6 +112,7 @@
|
|||||||
"open_folder": "Открыть папку",
|
"open_folder": "Открыть папку",
|
||||||
"open_download_location": "Просмотреть папку загрузок",
|
"open_download_location": "Просмотреть папку загрузок",
|
||||||
"create_shortcut": "Создать ярлык на рабочем столе",
|
"create_shortcut": "Создать ярлык на рабочем столе",
|
||||||
|
"clear": "Очистить",
|
||||||
"remove_files": "Удалить файлы",
|
"remove_files": "Удалить файлы",
|
||||||
"remove_from_library_title": "Вы уверены?",
|
"remove_from_library_title": "Вы уверены?",
|
||||||
"remove_from_library_description": "{{game}} будет удалена из вашей библиотеки.",
|
"remove_from_library_description": "{{game}} будет удалена из вашей библиотеки.",
|
||||||
@ -113,22 +122,67 @@
|
|||||||
"downloads_secion_title": "Загрузки",
|
"downloads_secion_title": "Загрузки",
|
||||||
"downloads_section_description": "Проверить наличие обновлений или других версий игры",
|
"downloads_section_description": "Проверить наличие обновлений или других версий игры",
|
||||||
"danger_zone_section_title": "Опасная зона",
|
"danger_zone_section_title": "Опасная зона",
|
||||||
"danger_zone_section_description": "Удалить эту игру из вашей библиотеки или файлы скачанные Hydra",
|
"danger_zone_section_description": "Вы можете удалить эту игру из вашей библиотеки или файлы скачанные из Hydra",
|
||||||
"download_in_progress": "Идёт загрузка",
|
"download_in_progress": "Идёт загрузка",
|
||||||
"download_paused": "Загрузка приостановлена",
|
"download_paused": "Загрузка приостановлена",
|
||||||
"last_downloaded_option": "Последний вариант загрузки",
|
"last_downloaded_option": "Последний вариант загрузки",
|
||||||
"create_shortcut_success": "Ярлык создан",
|
"create_shortcut_success": "Ярлык создан",
|
||||||
"create_shortcut_error": "Не удалось создать ярлык",
|
"create_shortcut_error": "Не удалось создать ярлык",
|
||||||
"allow_nsfw_content": "Продолжать",
|
"allow_nsfw_content": "Продолжить",
|
||||||
"download": "Скачать",
|
"download": "Скачать",
|
||||||
"download_count": "Загрузки",
|
"download_count": "Загрузки",
|
||||||
"download_error": "Этот вариант загрузки недоступен",
|
"download_error": "Этот вариант загрузки недоступен",
|
||||||
"executable_path_in_use": "Исполняемый файл уже используется \"{{game}}\"",
|
"executable_path_in_use": "Исполняемый файл уже используется \"{{game}}\"",
|
||||||
"nsfw_content_description": "{{title}} содержит контент, который может не подходить для всех возрастов. \nВы уверены, что хотите продолжить?",
|
"nsfw_content_description": "{{title}} содержит контент, который может не подходить для всех возрастов. \nВы уверены, что хотите продолжить?",
|
||||||
"nsfw_content_title": "Эта игра содержит неприемлемый контент",
|
"nsfw_content_title": "Эта игра содержит неприемлемый контент",
|
||||||
|
"refuse_nsfw_content": "Назад",
|
||||||
|
"stats": "Статистика",
|
||||||
"player_count": "Активные игроки",
|
"player_count": "Активные игроки",
|
||||||
"refuse_nsfw_content": "Возвращаться",
|
"warning": "Внимание:",
|
||||||
"stats": "Статистика"
|
"hydra_needs_to_remain_open": "Для этой загрузки Hydra должна оставаться открытой до завершения. Если Hydra закроется до завершения, вы потеряете прогресс.",
|
||||||
|
"achievements": "Достижения",
|
||||||
|
"achievements_count": "Достижения {{unlockedCount}}/{{achievementsCount}}",
|
||||||
|
"cloud_save": "Облачное сохранение",
|
||||||
|
"cloud_save_description": "Сохраняйте ваш прогресс в облаке и продолжайте играть на любом устройстве",
|
||||||
|
"backups": "Резервные копии",
|
||||||
|
"install_backup": "Установить",
|
||||||
|
"delete_backup": "Удалить",
|
||||||
|
"create_backup": "Создать новую резервную копию",
|
||||||
|
"last_backup_date": "Последняя резервная копия от {{date}}",
|
||||||
|
"no_backup_preview": "Сохранения для этого заголовка не найдены",
|
||||||
|
"restoring_backup": "Восстановление резервной копии ({{progress}} завершено)…",
|
||||||
|
"uploading_backup": "Загрузка резервной копии…",
|
||||||
|
"no_backups": "Вы еще не создали резервных копий для этой игры",
|
||||||
|
"backup_uploaded": "Резервная копия загружена",
|
||||||
|
"backup_deleted": "Резервная копия удалена",
|
||||||
|
"backup_restored": "Резервная копия восстановлена",
|
||||||
|
"see_all_achievements": "Просмотреть все достижения",
|
||||||
|
"sign_in_to_see_achievements": "Войдите, чтобы увидеть достижения",
|
||||||
|
"mapping_method_automatic": "Автоматическая",
|
||||||
|
"mapping_method_manual": "Ручная",
|
||||||
|
"mapping_method_label": "Метод сопоставления",
|
||||||
|
"files_automatically_mapped": "Файлы автоматически сопоставлены",
|
||||||
|
"no_backups_created": "Для этой игры не создано резервных копий",
|
||||||
|
"manage_files": "Управление файлами",
|
||||||
|
"loading_save_preview": "Поиск сохранений…",
|
||||||
|
"wine_prefix": "Префикс Wine",
|
||||||
|
"wine_prefix_description": "Префикс Wine, используемый для запуска этой игры",
|
||||||
|
"launch_options": "Параметры запуска",
|
||||||
|
"launch_options_description": "Опытные пользователи могут внести изменения в параметры запуска",
|
||||||
|
"launch_options_placeholder": "Параметр не указан ",
|
||||||
|
"no_download_option_info": "Информация недоступна",
|
||||||
|
"backup_deletion_failed": "Не удалось удалить резервную копию",
|
||||||
|
"max_number_of_artifacts_reached": "Достигнуто максимальное количество резервных копий для этой игры",
|
||||||
|
"achievements_not_sync": "Ваши достижения не синхронизированы",
|
||||||
|
"manage_files_description": "Управляйте файлами, которые будут сохраняться и восстанавливаться",
|
||||||
|
"select_folder": "Выбрать папку",
|
||||||
|
"backup_from": "Резервная копия от {{date}}",
|
||||||
|
"custom_backup_location_set": "Установлено настраиваемое местоположение резервной копии",
|
||||||
|
"no_directory_selected": "Не выбран каталог",
|
||||||
|
"no_write_permission": "Невозможно загрузить в эту директорию. Нажмите здесь, чтобы узнать больше.",
|
||||||
|
"reset_achievements_title": "Вы уверены?",
|
||||||
|
"reset_achievements_success": "Достижения успешно сброшены",
|
||||||
|
"reset_achievements_error": "Не удалось сбросить достижения"
|
||||||
},
|
},
|
||||||
"activation": {
|
"activation": {
|
||||||
"title": "Активировать Hydra",
|
"title": "Активировать Hydra",
|
||||||
@ -147,7 +201,7 @@
|
|||||||
"completed": "Завершено",
|
"completed": "Завершено",
|
||||||
"removed": "Не скачано",
|
"removed": "Не скачано",
|
||||||
"cancel": "Отмена",
|
"cancel": "Отмена",
|
||||||
"filter": "Фильтр загруженных игр",
|
"filter": "Поиск загруженных игр",
|
||||||
"remove": "Удалить",
|
"remove": "Удалить",
|
||||||
"downloading_metadata": "Загрузка метаданных…",
|
"downloading_metadata": "Загрузка метаданных…",
|
||||||
"deleting": "Удаление установщика…",
|
"deleting": "Удаление установщика…",
|
||||||
@ -161,17 +215,24 @@
|
|||||||
"queued": "В очереди",
|
"queued": "В очереди",
|
||||||
"no_downloads_title": "Здесь так пусто...",
|
"no_downloads_title": "Здесь так пусто...",
|
||||||
"no_downloads_description": "Вы ещё ничего не скачали через Hydra, но никогда не поздно начать.",
|
"no_downloads_description": "Вы ещё ничего не скачали через Hydra, но никогда не поздно начать.",
|
||||||
"checking_files": "Проверка файлов…"
|
"checking_files": "Проверка файлов…",
|
||||||
|
"seeding": "Раздача",
|
||||||
|
"stop_seeding": "Остановить раздачу",
|
||||||
|
"resume_seeding": "Продолжить раздачу",
|
||||||
|
"options": "Управлять"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"downloads_path": "Путь загрузок",
|
"downloads_path": "Путь загрузок",
|
||||||
"change": "Изменить",
|
"change": "Изменить",
|
||||||
"notifications": "Уведомления",
|
"notifications": "Уведомления",
|
||||||
"enable_download_notifications": "По завершении загрузки",
|
"enable_download_notifications": "По завершении загрузки",
|
||||||
|
"enable_achievement_notifications": "Когда достижение разблокировано",
|
||||||
"enable_repack_list_notifications": "При добавлении нового репака",
|
"enable_repack_list_notifications": "При добавлении нового репака",
|
||||||
"real_debrid_api_token_label": "Real-Debrid API-токен",
|
"real_debrid_api_token_label": "Real-Debrid API-токен",
|
||||||
"quit_app_instead_hiding": "Закрывать приложение вместо сворачивания в трей",
|
"quit_app_instead_hiding": "Закрывать приложение вместо сворачивания в трей",
|
||||||
"launch_with_system": "Запускать Hydra вместе с системой",
|
"launch_with_system": "Запускать Hydra вместе с системой",
|
||||||
|
"launch_minimized": "Запустить Hydra в свернутом виде",
|
||||||
|
"disable_nsfw_alert": "Отключить предупреждение о непристойном контенте",
|
||||||
"general": "Основные",
|
"general": "Основные",
|
||||||
"behavior": "Поведение",
|
"behavior": "Поведение",
|
||||||
"download_sources": "Источники загрузки",
|
"download_sources": "Источники загрузки",
|
||||||
@ -196,7 +257,7 @@
|
|||||||
"add_download_source_description": "Вставьте ссылку на .json-файл",
|
"add_download_source_description": "Вставьте ссылку на .json-файл",
|
||||||
"download_source_up_to_date": "Обновлён",
|
"download_source_up_to_date": "Обновлён",
|
||||||
"download_source_errored": "Ошибка",
|
"download_source_errored": "Ошибка",
|
||||||
"sync_download_sources": "Синхронизировать источники",
|
"sync_download_sources": "Обновить источники",
|
||||||
"removed_download_source": "Источник загрузок удален",
|
"removed_download_source": "Источник загрузок удален",
|
||||||
"added_download_source": "Источник загрузок добавлен",
|
"added_download_source": "Источник загрузок добавлен",
|
||||||
"download_sources_synced": "Все источники загрузок синхронизированы",
|
"download_sources_synced": "Все источники загрузок синхронизированы",
|
||||||
@ -206,16 +267,34 @@
|
|||||||
"found_download_option_other": "Найдено {{countFormatted}} вариантов загрузки",
|
"found_download_option_other": "Найдено {{countFormatted}} вариантов загрузки",
|
||||||
"import": "Импортировать",
|
"import": "Импортировать",
|
||||||
"blocked_users": "Заблокированные пользователи",
|
"blocked_users": "Заблокированные пользователи",
|
||||||
"friends_only": "Только друзья",
|
"friends_only": "Только для друзей",
|
||||||
"must_be_valid_url": "Источник должен быть действительным URL-адресом.",
|
"must_be_valid_url": "Источник должен быть действительным URL-адресом.",
|
||||||
"privacy": "Конфиденциальность",
|
"privacy": "Конфиденциальность",
|
||||||
"private": "Частный",
|
"private": "Частный",
|
||||||
"profile_visibility": "Видимость профиля",
|
"profile_visibility": "Видимость профиля",
|
||||||
"profile_visibility_description": "Выберите, кто может видеть ваш профиль и библиотеку",
|
"profile_visibility_description": "Выберите, кто может видеть ваш профиль и библиотеку",
|
||||||
"public": "Общественный",
|
"public": "Публичный",
|
||||||
"required_field": "Это поле обязательно к заполнению",
|
"required_field": "Это поле обязательно к заполнению",
|
||||||
"source_already_exists": "Этот источник уже добавлен",
|
"source_already_exists": "Этот источник уже добавлен",
|
||||||
"user_unblocked": "Пользователь разблокирован"
|
"user_unblocked": "Пользователь разблокирован",
|
||||||
|
"seed_after_download_complete": "Раздавать после завершения загрузки",
|
||||||
|
"show_hidden_achievement_description": "Показывать описание скрытых достижений перед их получением",
|
||||||
|
"account": "Аккаунт",
|
||||||
|
"no_users_blocked": "У вас нет заблокированных пользователей",
|
||||||
|
"subscription_active_until": "Ваша подписка на Hydra Cloud активна до {{date}}",
|
||||||
|
"manage_subscription": "Управлять подпиской",
|
||||||
|
"update_email": "Обновить электронную почту",
|
||||||
|
"update_password": "Обновить пароль",
|
||||||
|
"current_email": "Текущий email:",
|
||||||
|
"no_email_account": "Вы еще не установили электронную почту",
|
||||||
|
"account_data_updated_successfully": "Данные учетной записи успешно обновлены",
|
||||||
|
"renew_subscription": "Обновить подписку Hydra Cloud",
|
||||||
|
"subscription_expired_at": "Срок действия вашей подписки истек в {{date}}",
|
||||||
|
"no_subscription": "Наслаждайтесь Hydra по максимуму",
|
||||||
|
"become_subscriber": "Станьте обладателем Hydra Cloud",
|
||||||
|
"subscription_renew_cancelled": "Автоматическое продление отключено",
|
||||||
|
"subscription_renews_on": "Ваша подписка продлевается на {{date}}",
|
||||||
|
"bill_sent_until": "Ваш следующий счет будет отправлен до этого дня"
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"download_complete": "Загрузка завершена",
|
"download_complete": "Загрузка завершена",
|
||||||
@ -223,15 +302,17 @@
|
|||||||
"repack_list_updated": "Список репаков обновлен",
|
"repack_list_updated": "Список репаков обновлен",
|
||||||
"repack_count_one": "{{count}} репак добавлен",
|
"repack_count_one": "{{count}} репак добавлен",
|
||||||
"repack_count_other": "{{count}} репаков добавлено",
|
"repack_count_other": "{{count}} репаков добавлено",
|
||||||
"new_update_available": "Доступна версия {{version}}",
|
"new_update_available": "Доступна новая версия {{version}}",
|
||||||
"restart_to_install_update": "Перезапустите Hydra для установки обновления"
|
"restart_to_install_update": "Перезапустите Hydra для установки обновления",
|
||||||
|
"notification_achievement_unlocked_title": "Достижение разблокировано для {{game}}",
|
||||||
|
"notification_achievement_unlocked_body": "были разблокированы {{achievement}} и другие {{count}}"
|
||||||
},
|
},
|
||||||
"system_tray": {
|
"system_tray": {
|
||||||
"open": "Открыть Hydra",
|
"open": "Открыть Hydra",
|
||||||
"quit": "Выйти"
|
"quit": "Выйти"
|
||||||
},
|
},
|
||||||
"game_card": {
|
"game_card": {
|
||||||
"no_downloads": "Нет доступных загрузок"
|
"no_downloads": "Нет доступных источников"
|
||||||
},
|
},
|
||||||
"binary_not_found_modal": {
|
"binary_not_found_modal": {
|
||||||
"title": "Программы не установлены",
|
"title": "Программы не установлены",
|
||||||
@ -250,7 +331,7 @@
|
|||||||
"last_time_played": "Последняя игра {{period}}",
|
"last_time_played": "Последняя игра {{period}}",
|
||||||
"activity": "Недавняя активность",
|
"activity": "Недавняя активность",
|
||||||
"library": "Библиотека",
|
"library": "Библиотека",
|
||||||
"total_play_time": "Всего сыграно: {{amount}}",
|
"total_play_time": "Всего сыграно",
|
||||||
"no_recent_activity_title": "Хммм... Тут ничего нет",
|
"no_recent_activity_title": "Хммм... Тут ничего нет",
|
||||||
"no_recent_activity_description": "Вы давно ни во что не играли. Пора это изменить!",
|
"no_recent_activity_description": "Вы давно ни во что не играли. Пора это изменить!",
|
||||||
"display_name": "Отображаемое имя",
|
"display_name": "Отображаемое имя",
|
||||||
@ -309,6 +390,46 @@
|
|||||||
"report_reason_spam": "Спам",
|
"report_reason_spam": "Спам",
|
||||||
"report_reason_violence": "Насилие",
|
"report_reason_violence": "Насилие",
|
||||||
"required_field": "Это поле обязательно к заполнению",
|
"required_field": "Это поле обязательно к заполнению",
|
||||||
"undo_friendship_modal_text": "Это отменит вашу дружбу с {{displayName}}."
|
"undo_friendship_modal_text": "Это отменит вашу дружбу с {{displayName}}.",
|
||||||
|
"your_friend_code": "Код вашего друга:",
|
||||||
|
"upload_banner": "Загрузить баннер",
|
||||||
|
"uploading_banner": "Загрузка баннера...",
|
||||||
|
"background_image_updated": "Фоновое изображение обновлено",
|
||||||
|
"stats": "Статистика",
|
||||||
|
"games": "Игры",
|
||||||
|
"top_percentile": "Топ {{percentile}}%",
|
||||||
|
"ranking_updated_weekly": "Рейтинг обновляется еженедельно",
|
||||||
|
"playing": "Играет в {{game}}",
|
||||||
|
"achievements_unlocked": "Достижения разблокированы",
|
||||||
|
"show_achievements_on_profile": "Покажите свои достижения в профиле",
|
||||||
|
"show_points_on_profile": "Показывать заработанные очки в своем профиле"
|
||||||
|
},
|
||||||
|
"achievement": {
|
||||||
|
"achievement_unlocked": "Достижение разблокировано",
|
||||||
|
"user_achievements": "Достижения {{displayName}}",
|
||||||
|
"your_achievements": "Ваши достижения",
|
||||||
|
"unlocked_at": "Разблокировано: {{date}}",
|
||||||
|
"subscription_needed": "Для просмотра этого содержимого необходима подписка на Hydra Cloud",
|
||||||
|
"new_achievements_unlocked": "Разблокировано {{achievementCount}} новых достижений из {{gameCount}} игр",
|
||||||
|
"achievement_progress": "{{unlockedCount}}/{{totalCount}} достижений",
|
||||||
|
"achievements_unlocked_for_game": "Разблокировано {{achievementCount}} новых достижений для {{gameTitle}}",
|
||||||
|
"hidden_achievement_tooltip": "Это скрытое достижение",
|
||||||
|
"achievement_earn_points": "Заработайте {{points}} очков с этим достижением",
|
||||||
|
"earned_points": "Заработано очков:",
|
||||||
|
"available_points": "Доступные очки:",
|
||||||
|
"how_to_earn_achievements_points": "Как заработать очки достижений?"
|
||||||
|
},
|
||||||
|
"hydra_cloud": {
|
||||||
|
"subscription_tour_title": "Подписка Hydra Cloud",
|
||||||
|
"subscribe_now": "Подпишитесь прямо сейчас",
|
||||||
|
"cloud_saving": "Сохранение в облаке",
|
||||||
|
"cloud_achievements": "Сохраняйте свои достижения в облаке",
|
||||||
|
"animated_profile_picture": "Анимированные фотографии профиля",
|
||||||
|
"premium_support": "Премиальная поддержка",
|
||||||
|
"show_and_compare_achievements": "Показывайте и сравнивайте свои достижения с достижениями других пользователей",
|
||||||
|
"animated_profile_banner": "Анимированный баннер профиля",
|
||||||
|
"hydra_cloud": "Hydra Cloud",
|
||||||
|
"hydra_cloud_feature_found": "Вы только что открыли для себя функцию Hydra Cloud!",
|
||||||
|
"learn_more": "Подробнее"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,131 +1,423 @@
|
|||||||
{
|
{
|
||||||
"language_name": "Türkçe",
|
"language_name": "Türkçe",
|
||||||
|
"app": {
|
||||||
|
"successfully_signed_in": "Başarıyla giriş yapıldı"
|
||||||
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"featured": "Öne çıkan",
|
"featured": "Öne Çıkanlar",
|
||||||
"surprise_me": "Şaşırt beni",
|
"surprise_me": "Beni Şaşırt",
|
||||||
"no_results": "Sonuç bulunamadı"
|
"no_results": "Sonuç bulunamadı",
|
||||||
|
"start_typing": "Aramak için yazmaya başlayın...",
|
||||||
|
"hot": "Şu anda popüler",
|
||||||
|
"weekly": "📅 Haftanın en iyi oyunları",
|
||||||
|
"achievements": "🏆 Tamamlanacak oyunlar"
|
||||||
},
|
},
|
||||||
"sidebar": {
|
"sidebar": {
|
||||||
"catalogue": "Katalog",
|
"catalogue": "Katalog",
|
||||||
"downloads": "İndirmeler",
|
"downloads": "İndirilenler",
|
||||||
"settings": "Ayarlar",
|
"settings": "Ayarlar",
|
||||||
"my_library": "Kütüphane",
|
"my_library": "Kütüphanem",
|
||||||
"downloading_metadata": "{{title}} (Metadata indiriliyor…)",
|
"downloading_metadata": "{{title}} (Meta verileri indiriliyor…)",
|
||||||
"paused": "{{title}} (Duraklatıldı)",
|
"paused": "{{title}} (Durduruldu)",
|
||||||
"downloading": "{{title}} ({{percentage}} - İndiriliyor…)",
|
"downloading": "{{title}} ({{percentage}} - İndiriliyor…)",
|
||||||
"filter": "Kütüphaneyi filtrele",
|
"filter": "Kütüphaneyi filtrele",
|
||||||
"home": "Ana menü"
|
"home": "Ana Sayfa",
|
||||||
|
"queued": "{{title}} (Sırada)",
|
||||||
|
"game_has_no_executable": "Oyun için bir çalıştırılabilir dosya seçilmedi",
|
||||||
|
"sign_in": "Giriş yap",
|
||||||
|
"friends": "Arkadaşlar",
|
||||||
|
"need_help": "Yardıma mı ihtiyacınız var?"
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
"search": "Ara",
|
"search": "Oyunları ara",
|
||||||
"home": "Ana menü",
|
"home": "Ana Sayfa",
|
||||||
"catalogue": "Katalog",
|
"catalogue": "Katalog",
|
||||||
"downloads": "İndirmeler",
|
"downloads": "İndirilenler",
|
||||||
"search_results": "Arama sonuçları",
|
"search_results": "Arama sonuçları",
|
||||||
"settings": "Ayarlar"
|
"settings": "Ayarlar",
|
||||||
|
"version_available_install": "Sürüm {{version}} mevcut. Yüklemek ve yeniden başlatmak için buraya tıklayın.",
|
||||||
|
"version_available_download": "Sürüm {{version}} mevcut. İndirmek için buraya tıklayın."
|
||||||
},
|
},
|
||||||
"bottom_panel": {
|
"bottom_panel": {
|
||||||
"no_downloads_in_progress": "İndirilen bir şey yok",
|
"no_downloads_in_progress": "Devam eden indirme yok",
|
||||||
"downloading_metadata": "{{title}} metadatası indiriliyor…",
|
"downloading_metadata": "{{title}} meta verileri indiriliyor…",
|
||||||
"downloading": "{{title}} indiriliyor… ({{percentage}} tamamlandı) - Bitiş {{eta}} - {{speed}}"
|
"downloading": "{{title}} indiriliyor… ({{percentage}} tamamlandı) - Tamamlama: {{eta}} - Hız: {{speed}}",
|
||||||
|
"calculating_eta": "{{title}} indiriliyor… ({{percentage}} tamamlandı) - Kalan süre hesaplanıyor…",
|
||||||
|
"checking_files": "{{title}} dosyaları kontrol ediliyor… ({{percentage}} tamamlandı)"
|
||||||
},
|
},
|
||||||
"catalogue": {
|
"catalogue": {
|
||||||
"next_page": "Sonraki sayfa",
|
"search": "Filtrele…",
|
||||||
"previous_page": "Önceki sayfa"
|
"developers": "Geliştiriciler",
|
||||||
|
"genres": "Türler",
|
||||||
|
"tags": "Etiketler",
|
||||||
|
"publishers": "Yayıncılar",
|
||||||
|
"download_sources": "İndirme kaynakları",
|
||||||
|
"result_count": "{{resultCount}} sonuç",
|
||||||
|
"filter_count": "{{filterCount}} mevcut",
|
||||||
|
"clear_filters": "{{filterCount}} seçili filtreyi temizle"
|
||||||
},
|
},
|
||||||
"game_details": {
|
"game_details": {
|
||||||
"open_download_options": "İndirme seçeneklerini aç",
|
"open_download_options": "İndirme seçeneklerini aç",
|
||||||
"download_options_zero": "İndirme seçeneği yok",
|
"download_options_zero": "İndirme seçeneği yok",
|
||||||
"download_options_one": "{{count}} indirme seçeneği",
|
"download_options_one": "{{count}} indirme seçeneği",
|
||||||
"download_options_other": "{{count}} indirme seçeneği",
|
"download_options_other": "{{count}} indirme seçeneği",
|
||||||
"updated_at": "{{updated_at}} güncellendi",
|
"updated_at": "{{updated_at}} tarihinde güncellendi",
|
||||||
"install": "İndir",
|
"install": "Yükle",
|
||||||
"resume": "Devam et",
|
"resume": "Devam et",
|
||||||
"pause": "Duraklat",
|
"pause": "Durdur",
|
||||||
"cancel": "İptal et",
|
"cancel": "İptal et",
|
||||||
"remove": "Sil",
|
"remove": "Kaldır",
|
||||||
"space_left_on_disk": "Diskte {{space}} yer kaldı",
|
"space_left_on_disk": "Diskte {{space}} boş alan kaldı",
|
||||||
"eta": "Bitiş {{eta}}",
|
"eta": "{{eta}} tahmini bitiş",
|
||||||
"downloading_metadata": "Metadata indiriliyor…",
|
"calculating_eta": "Kalan süre hesaplanıyor…",
|
||||||
"filter": "Repackleri filtrele",
|
"downloading_metadata": "Meta veriler indiriliyor…",
|
||||||
|
"filter": "Paketleri filtrele",
|
||||||
"requirements": "Sistem gereksinimleri",
|
"requirements": "Sistem gereksinimleri",
|
||||||
"minimum": "Minimum",
|
"minimum": "Minimum",
|
||||||
"recommended": "Önerilen",
|
"recommended": "Önerilen",
|
||||||
"release_date": "{{date}} tarihinde çıktı",
|
"paused": "Durduruldu",
|
||||||
"publisher": "{{publisher}} tarihinde yayınlandı",
|
"release_date": "{{date}} tarihinde yayımlandı",
|
||||||
"hours": "saatler",
|
"publisher": "{{publisher}} tarafından yayımlandı",
|
||||||
"minutes": "dakikalar",
|
"hours": "saat",
|
||||||
|
"minutes": "dakika",
|
||||||
"amount_hours": "{{amount}} saat",
|
"amount_hours": "{{amount}} saat",
|
||||||
"amount_minutes": "{{amount}} dakika",
|
"amount_minutes": "{{amount}} dakika",
|
||||||
"accuracy": "%{{accuracy}} doğruluk",
|
"accuracy": "{{accuracy}}% doğruluk",
|
||||||
"add_to_library": "Kütüphaneye ekle",
|
"add_to_library": "Kütüphaneye ekle",
|
||||||
"remove_from_library": "Kütüphaneden kaldır",
|
"remove_from_library": "Kütüphaneden kaldır",
|
||||||
"no_downloads": "İndirme yok",
|
"no_downloads": "İndirilebilir içerik yok",
|
||||||
"play_time": "{{amount}} oynandı",
|
"play_time": "{{amount}} süre oynandı",
|
||||||
"last_time_played": "Son oynanan {{period}}",
|
"last_time_played": "Son oynama {{period}} önce",
|
||||||
"not_played_yet": "Bu {{title}} hiç oynanmadı",
|
"not_played_yet": "{{title}} henüz oynanmadı",
|
||||||
"next_suggestion": "Sıradaki öneri",
|
"next_suggestion": "Sonraki öneri",
|
||||||
"play": "Oyna",
|
"play": "Oyna",
|
||||||
"deleting": "Installer siliniyor…",
|
"deleting": "Yükleyici siliniyor…",
|
||||||
"close": "Kapat",
|
"close": "Kapat",
|
||||||
"playing_now": "Şimdi oynanıyor",
|
"playing_now": "Şu anda oynanıyor",
|
||||||
"change": "Değiştir",
|
"change": "Değiştir",
|
||||||
"repacks_modal_description": "İndirmek istediğiiniz repacki seçin",
|
"repacks_modal_description": "İndirmek istediğiniz paketi seçin",
|
||||||
"select_folder_hint": "Varsayılan klasörü değiştirmek için ulaşmanız gereken ayar",
|
"select_folder_hint": "Varsayılan klasörü değiştirmek için <0>Ayarlar</0> bölümüne gidin",
|
||||||
"download_now": "Şimdi"
|
"download_now": "Şimdi indir",
|
||||||
|
"no_shop_details": "Mağaza bilgileri alınamadı.",
|
||||||
|
"download_options": "İndirme seçenekleri",
|
||||||
|
"download_path": "İndirme yolu",
|
||||||
|
"previous_screenshot": "Önceki ekran görüntüsü",
|
||||||
|
"next_screenshot": "Sonraki ekran görüntüsü",
|
||||||
|
"screenshot": "{{number}} ekran görüntüsü",
|
||||||
|
"open_screenshot": "{{number}} ekran görüntüsünü aç",
|
||||||
|
"download_settings": "İndirme ayarları",
|
||||||
|
"downloader": "İndirici",
|
||||||
|
"select_executable": "Seç",
|
||||||
|
"no_executable_selected": "Hiçbir çalıştırılabilir dosya seçilmedi",
|
||||||
|
"open_folder": "Klasörü aç",
|
||||||
|
"open_download_location": "İndirilen dosyaları gör",
|
||||||
|
"create_shortcut": "Masaüstü kısayolu oluştur",
|
||||||
|
"clear": "Temizle",
|
||||||
|
"remove_files": "Dosyaları kaldır",
|
||||||
|
"remove_from_library_title": "Emin misiniz?",
|
||||||
|
"remove_from_library_description": "Bu işlem {{game}} oyununu kütüphanenizden kaldıracaktır",
|
||||||
|
"options": "Seçenekler",
|
||||||
|
"executable_section_title": "Çalıştırılabilir dosya",
|
||||||
|
"executable_section_description": "\"Oyna\" tıklandığında çalıştırılacak dosyanın yolu",
|
||||||
|
"downloads_secion_title": "İndirmeler",
|
||||||
|
"downloads_section_description": "Bu oyun için güncellemeleri veya diğer sürümleri kontrol edin",
|
||||||
|
"danger_zone_section_title": "Tehlike bölgesi",
|
||||||
|
"danger_zone_section_description": "Bu oyunu kütüphanenizden veya Hydra tarafından indirilen dosyaları kaldırın",
|
||||||
|
"download_in_progress": "İndirme devam ediyor",
|
||||||
|
"download_paused": "İndirme durduruldu",
|
||||||
|
"last_downloaded_option": "Son indirilen seçenek",
|
||||||
|
"create_shortcut_success": "Kısayol başarıyla oluşturuldu",
|
||||||
|
"create_shortcut_error": "Kısayol oluşturulurken hata oluştu",
|
||||||
|
"nsfw_content_title": "Bu oyun uygunsuz içerik içeriyor",
|
||||||
|
"nsfw_content_description": "{{title}} her yaş için uygun olmayabilecek içeriklere sahiptir. Devam etmek istediğinizden emin misiniz?",
|
||||||
|
"allow_nsfw_content": "Devam et",
|
||||||
|
"refuse_nsfw_content": "Geri dön",
|
||||||
|
"stats": "İstatistikler",
|
||||||
|
"download_count": "İndirme sayısı",
|
||||||
|
"player_count": "Aktif oyuncular",
|
||||||
|
"download_error": "Bu indirme seçeneği mevcut değil",
|
||||||
|
"download": "İndir",
|
||||||
|
"executable_path_in_use": "\"{{game}}\" tarafından kullanılan çalıştırılabilir dosya",
|
||||||
|
"warning": "Uyarı:",
|
||||||
|
"hydra_needs_to_remain_open": "Bu indirmenin tamamlanması için Hydra açık kalmalıdır. Eğer Hydra kapanırsa, ilerleme kaydedilmez.",
|
||||||
|
"achievements": "Başarılar",
|
||||||
|
"achievements_count": "Başarılar {{unlockedCount}}/{{achievementsCount}}",
|
||||||
|
"cloud_save": "Bulut kaydı",
|
||||||
|
"cloud_save_description": "İlerlemenizi buluta kaydedin ve herhangi bir cihazda oynamaya devam edin",
|
||||||
|
"backups": "Yedekler",
|
||||||
|
"install_backup": "Yükle",
|
||||||
|
"delete_backup": "Sil",
|
||||||
|
"create_backup": "Yeni yedek oluştur",
|
||||||
|
"last_backup_date": "{{date}} tarihindeki son yedek",
|
||||||
|
"no_backup_preview": "Bu oyun için kayıtlı oyun bulunamadı",
|
||||||
|
"restoring_backup": "Yedek geri yükleniyor ({{progress}} tamamlandı)…",
|
||||||
|
"uploading_backup": "Yedek yükleniyor…",
|
||||||
|
"no_backups": "Bu oyun için henüz bir yedek oluşturmadınız",
|
||||||
|
"backup_uploaded": "Yedek yüklendi",
|
||||||
|
"backup_deleted": "Yedek silindi",
|
||||||
|
"backup_restored": "Yedek geri yüklendi",
|
||||||
|
"see_all_achievements": "Tüm başarıları gör",
|
||||||
|
"sign_in_to_see_achievements": "Başarıları görmek için giriş yapın",
|
||||||
|
"mapping_method_automatic": "Otomatik",
|
||||||
|
"mapping_method_manual": "Manuel",
|
||||||
|
"mapping_method_label": "Eşleme yöntemi",
|
||||||
|
"files_automatically_mapped": "Dosyalar otomatik olarak eşlendi",
|
||||||
|
"no_backups_created": "Bu oyun için yedek oluşturulmadı",
|
||||||
|
"manage_files": "Dosyaları yönet",
|
||||||
|
"loading_save_preview": "Kayıtlı oyunlar aranıyor…",
|
||||||
|
"wine_prefix": "Wine Prefix",
|
||||||
|
"wine_prefix_description": "Bu oyunu çalıştırmak için kullanılan Wine Prefix",
|
||||||
|
"launch_options": "Başlatma Seçenekleri",
|
||||||
|
"launch_options_description": "İleri düzey kullanıcılar, başlatma seçeneklerine değişiklikler girebilir (deneysel özellik)",
|
||||||
|
"launch_options_placeholder": "Belirtilen bir parametre yok",
|
||||||
|
"no_download_option_info": "Bilgi mevcut değil",
|
||||||
|
"backup_deletion_failed": "Yedek silinemedi",
|
||||||
|
"max_number_of_artifacts_reached": "Bu oyun için maksimum yedek sayısına ulaşıldı",
|
||||||
|
"achievements_not_sync": "Başarılarınızı senkronize etmeyi öğrenin",
|
||||||
|
"manage_files_description": "Hangi dosyaların yedeklenip geri yükleneceğini yönetin",
|
||||||
|
"select_folder": "Klasör seç",
|
||||||
|
"backup_from": "{{date}} tarihinden yedek",
|
||||||
|
"custom_backup_location_set": "Özel yedekleme konumu ayarlandı",
|
||||||
|
"no_directory_selected": "Bir dizin seçilmedi",
|
||||||
|
"no_write_permission": "Bu dizine indirme yapılamaz. Daha fazla bilgi için buraya tıklayın.",
|
||||||
|
"reset_achievements": "Başarıları sıfırla",
|
||||||
|
"reset_achievements_description": "Bu işlem {{game}} için tüm başarıları sıfırlar",
|
||||||
|
"reset_achievements_title": "Emin misiniz?",
|
||||||
|
"reset_achievements_success": "Başarılar başarıyla sıfırlandı",
|
||||||
|
"reset_achievements_error": "Başarılar sıfırlanamadı"
|
||||||
},
|
},
|
||||||
"activation": {
|
"activation": {
|
||||||
"title": "Hydra'yı aktif et",
|
"title": "Hydra'yı Aktive Et",
|
||||||
"installation_id": "Kurulum ID'si:",
|
"installation_id": "Kurulum Kimliği:",
|
||||||
"enter_activation_code": "Aktifleştirme kodunuzu girin",
|
"enter_activation_code": "Aktivasyon kodunuzu girin",
|
||||||
"message": "Bunu nerede soracağınızı bilmiyorsanız, buna sahip olmamanız gerekiyor.",
|
"message": "Bunu nereden soracağınızı bilmiyorsanız, bu sizin için olmamalı.",
|
||||||
"activate": "Aktif et",
|
"activate": "Aktive Et",
|
||||||
"loading": "Yükleniyor…"
|
"loading": "Yükleniyor…"
|
||||||
},
|
},
|
||||||
"downloads": {
|
"downloads": {
|
||||||
"resume": "Devam et",
|
"resume": "Devam Et",
|
||||||
"pause": "Duraklat",
|
"pause": "Duraklat",
|
||||||
"eta": "Bitiş {{eta}}",
|
"eta": "Tamamlama {{eta}}",
|
||||||
"paused": "Duraklatıldı",
|
"paused": "Duraklatıldı",
|
||||||
"verifying": "Doğrulanıyor…",
|
"verifying": "Doğrulanıyor…",
|
||||||
"completed": "Tamamlandı",
|
"completed": "Tamamlandı",
|
||||||
"cancel": "İptal et",
|
"removed": "İndirilmedi",
|
||||||
"filter": "Yüklü oyunları filtrele",
|
"cancel": "İptal Et",
|
||||||
|
"filter": "İndirilen oyunları filtrele",
|
||||||
"remove": "Kaldır",
|
"remove": "Kaldır",
|
||||||
"downloading_metadata": "Metadata indiriliyor…",
|
"downloading_metadata": "Metadata indiriliyor…",
|
||||||
"deleting": "Installer siliniyor…",
|
"deleting": "Yükleyici siliniyor…",
|
||||||
"delete": "Installer'ı sil",
|
"delete": "Yükleyiciyi kaldır",
|
||||||
"delete_modal_title": "Emin misiniz?",
|
"delete_modal_title": "Emin misiniz?",
|
||||||
"delete_modal_description": "Bu bilgisayarınızdan tüm kurulum dosyalarını silecek",
|
"delete_modal_description": "Bu işlem, tüm kurulum dosyalarını bilgisayarınızdan kaldıracaktır",
|
||||||
"install": "Kur"
|
"install": "Kur",
|
||||||
|
"download_in_progress": "Devam ediyor",
|
||||||
|
"queued_downloads": "Sıradaki indirmeler",
|
||||||
|
"downloads_completed": "Tamamlananlar",
|
||||||
|
"queued": "Sırada",
|
||||||
|
"no_downloads_title": "Bomboş",
|
||||||
|
"no_downloads_description": "Henüz Hydra ile hiçbir şey indirmediniz, ancak başlamak için asla geç değil.",
|
||||||
|
"checking_files": "Dosyalar kontrol ediliyor…",
|
||||||
|
"seeding": "Paylaşılıyor",
|
||||||
|
"stop_seeding": "Paylaşımı durdur",
|
||||||
|
"resume_seeding": "Paylaşımı sürdür",
|
||||||
|
"options": "Yönet"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"downloads_path": "İndirme yolu",
|
"downloads_path": "İndirme yolu",
|
||||||
"change": "Güncelle",
|
"change": "Güncelle",
|
||||||
"notifications": "Bildirimler",
|
"notifications": "Bildirimler",
|
||||||
"enable_download_notifications": "Bir indirme bittiğinde",
|
"enable_download_notifications": "Bir indirme tamamlandığında",
|
||||||
"enable_repack_list_notifications": "Yeni bir repack eklendiğinde"
|
"enable_repack_list_notifications": "Yeni bir repack eklendiğinde",
|
||||||
|
"real_debrid_api_token_label": "Real-Debrid API anahtarı",
|
||||||
|
"quit_app_instead_hiding": "Hydra'yı kapatırken gizlemeyin",
|
||||||
|
"launch_with_system": "Hydra'yı sistem başlatıldığında çalıştır",
|
||||||
|
"general": "Genel",
|
||||||
|
"behavior": "Davranış",
|
||||||
|
"download_sources": "İndirme kaynakları",
|
||||||
|
"language": "Dil",
|
||||||
|
"real_debrid_api_token": "API Anahtarı",
|
||||||
|
"enable_real_debrid": "Real-Debrid'i Etkinleştir",
|
||||||
|
"real_debrid_description": "Real-Debrid, yalnızca internet hızınızla sınırlı olarak hızlı dosya indirmenizi sağlayan sınırsız bir indirici.",
|
||||||
|
"real_debrid_invalid_token": "Geçersiz API anahtarı",
|
||||||
|
"real_debrid_api_token_hint": "API anahtarınızı <0>buradan</0> alabilirsiniz",
|
||||||
|
"real_debrid_free_account_error": "\"{{username}}\" hesabı ücretsiz bir hesaptır. Lütfen Real-Debrid abonesi olun",
|
||||||
|
"real_debrid_linked_message": "\"{{username}}\" hesabı bağlandı",
|
||||||
|
"save_changes": "Değişiklikleri Kaydet",
|
||||||
|
"changes_saved": "Değişiklikler başarıyla kaydedildi",
|
||||||
|
"download_sources_description": "Hydra, indirme bağlantılarını bu kaynaklardan alacak. Kaynak URL, indirme bağlantılarını içeren bir .json dosyasına doğrudan bir bağlantı olmalıdır.",
|
||||||
|
"validate_download_source": "Doğrula",
|
||||||
|
"remove_download_source": "Kaldır",
|
||||||
|
"add_download_source": "Kaynak ekle",
|
||||||
|
"download_count_zero": "İndirme seçeneği yok",
|
||||||
|
"download_count_one": "{{countFormatted}} indirme seçeneği",
|
||||||
|
"download_count_other": "{{countFormatted}} indirme seçeneği",
|
||||||
|
"download_source_url": "İndirme kaynağı URL'si",
|
||||||
|
"add_download_source_description": ".json dosyasının URL'sini girin",
|
||||||
|
"download_source_up_to_date": "Güncel",
|
||||||
|
"download_source_errored": "Hatalı",
|
||||||
|
"sync_download_sources": "Kaynakları senkronize et",
|
||||||
|
"removed_download_source": "İndirme kaynağı kaldırıldı",
|
||||||
|
"added_download_source": "İndirme kaynağı eklendi",
|
||||||
|
"download_sources_synced": "Tüm indirme kaynakları senkronize edildi",
|
||||||
|
"insert_valid_json_url": "Geçerli bir JSON URL'si girin",
|
||||||
|
"found_download_option_zero": "Hiçbir indirme seçeneği bulunamadı",
|
||||||
|
"found_download_option_one": "{{countFormatted}} indirme seçeneği bulundu",
|
||||||
|
"found_download_option_other": "{{countFormatted}} indirme seçeneği bulundu",
|
||||||
|
"import": "İçe aktar",
|
||||||
|
"public": "Herkese açık",
|
||||||
|
"private": "Gizli",
|
||||||
|
"friends_only": "Sadece arkadaşlar",
|
||||||
|
"privacy": "Gizlilik",
|
||||||
|
"profile_visibility": "Profil görünürlüğü",
|
||||||
|
"profile_visibility_description": "Profilinizi ve kütüphanenizi kimlerin görebileceğini seçin",
|
||||||
|
"required_field": "Bu alan gereklidir",
|
||||||
|
"source_already_exists": "Bu kaynak zaten eklenmiş",
|
||||||
|
"must_be_valid_url": "Kaynak geçerli bir URL olmalıdır",
|
||||||
|
"blocked_users": "Engellenen kullanıcılar",
|
||||||
|
"user_unblocked": "Kullanıcının engeli kaldırıldı",
|
||||||
|
"enable_achievement_notifications": "Bir başarı kilidi açıldığında",
|
||||||
|
"launch_minimized": "Hydra'yı küçültülmüş başlat",
|
||||||
|
"disable_nsfw_alert": "NSFW uyarısını devre dışı bırak",
|
||||||
|
"seed_after_download_complete": "İndirme tamamlandıktan sonra paylaş",
|
||||||
|
"show_hidden_achievement_description": "Gizli başarı açıklamalarını kilitlenmeden önce göster"
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"download_complete": "İndirme tamamlandı",
|
"download_complete": "İndirme tamamlandı",
|
||||||
"game_ready_to_install": "{{title}} kuruluma hazır",
|
"game_ready_to_install": "{{title}} kurulmaya hazır",
|
||||||
"repack_list_updated": "Repack listesi güncellendi",
|
"repack_list_updated": "Repack listesi güncellendi",
|
||||||
"repack_count_one": "{{count}} yeni repack eklendi",
|
"repack_count_one": "{{count}} repack eklendi",
|
||||||
"repack_count_other": "{{count}} yeni repack eklendi"
|
"repack_count_other": "{{count}} repack eklendi",
|
||||||
|
"new_update_available": "Sürüm {{version}} mevcut",
|
||||||
|
"restart_to_install_update": "Güncellemeyi yüklemek için Hydra'yı yeniden başlatın",
|
||||||
|
"notification_achievement_unlocked_title": "{{game}} için başarı kilidi açıldı",
|
||||||
|
"notification_achievement_unlocked_body": "{{achievement}} ve diğer {{count}} başarılar açıldı"
|
||||||
},
|
},
|
||||||
"system_tray": {
|
"system_tray": {
|
||||||
"open": "Hydra'yı aç",
|
"open": "Hydra'yı Aç",
|
||||||
"quit": "Çık"
|
"quit": "Çık"
|
||||||
},
|
},
|
||||||
"game_card": {
|
"game_card": {
|
||||||
"no_downloads": "İndirme mevcut değil"
|
"no_downloads": "İndirilebilir içerik bulunmuyor"
|
||||||
},
|
},
|
||||||
"binary_not_found_modal": {
|
"binary_not_found_modal": {
|
||||||
"title": "Programlar yüklü değil",
|
"title": "Programlar Yüklü Değil",
|
||||||
"description": "Sisteminizde Wine veya Lutris çalıştırılabiliri bulunamadı",
|
"description": "Wine veya Lutris çalıştırılabilir dosyaları sisteminizde bulunamadı",
|
||||||
"instructions": "Oyunları düzgün şekilde çalıştırmak için Linux distronuza bunlardan birini nasıl yükleyebileceğinize bakın"
|
"instructions": "Oyunun normal çalışabilmesi için bunlardan herhangi birini Linux dağıtımınıza uygun şekilde nasıl kuracağınızı kontrol edin"
|
||||||
},
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
"close": "Kapat tuşu"
|
"close": "Kapat düğmesi"
|
||||||
|
},
|
||||||
|
"forms": {
|
||||||
|
"toggle_password_visibility": "Şifre görünürlüğünü değiştir"
|
||||||
|
},
|
||||||
|
"user_profile": {
|
||||||
|
"amount_hours": "{{amount}} saat",
|
||||||
|
"amount_minutes": "{{amount}} dakika",
|
||||||
|
"last_time_played": "Son oynanma {{period}}",
|
||||||
|
"activity": "Son Etkinlik",
|
||||||
|
"library": "Kütüphane",
|
||||||
|
"total_play_time": "Toplam oynama süresi",
|
||||||
|
"no_recent_activity_title": "Hmmm… burada bir şey yok",
|
||||||
|
"no_recent_activity_description": "Son zamanlarda hiç oyun oynamamışsınız. Bunu değiştirmenin zamanı geldi!",
|
||||||
|
"display_name": "Görünen isim",
|
||||||
|
"saving": "Kaydediliyor",
|
||||||
|
"save": "Kaydet",
|
||||||
|
"edit_profile": "Profili Düzenle",
|
||||||
|
"saved_successfully": "Başarıyla kaydedildi",
|
||||||
|
"try_again": "Lütfen tekrar deneyin",
|
||||||
|
"sign_out_modal_title": "Emin misiniz?",
|
||||||
|
"cancel": "İptal",
|
||||||
|
"successfully_signed_out": "Başarıyla çıkış yapıldı",
|
||||||
|
"sign_out": "Çıkış yap",
|
||||||
|
"playing_for": "{{amount}} oynanıyor",
|
||||||
|
"sign_out_modal_text": "Kütüphaneniz mevcut hesabınıza bağlı. Çıkış yaptığınızda kütüphaneniz görünür olmayacak ve herhangi bir ilerleme kaydedilmeyecek. Çıkışa devam etmek istiyor musunuz?",
|
||||||
|
"add_friends": "Arkadaş Ekle",
|
||||||
|
"add": "Ekle",
|
||||||
|
"friend_code": "Arkadaş kodu",
|
||||||
|
"see_profile": "Profili gör",
|
||||||
|
"sending": "Gönderiliyor",
|
||||||
|
"friend_request_sent": "Arkadaşlık isteği gönderildi",
|
||||||
|
"friends": "Arkadaşlar",
|
||||||
|
"friends_list": "Arkadaş listesi",
|
||||||
|
"user_not_found": "Kullanıcı bulunamadı",
|
||||||
|
"block_user": "Kullanıcıyı engelle",
|
||||||
|
"add_friend": "Arkadaş ekle",
|
||||||
|
"request_sent": "İstek gönderildi",
|
||||||
|
"request_received": "İstek alındı",
|
||||||
|
"accept_request": "İsteği kabul et",
|
||||||
|
"ignore_request": "İsteği yok say",
|
||||||
|
"cancel_request": "İsteği iptal et",
|
||||||
|
"undo_friendship": "Arkadaşlığı sonlandır",
|
||||||
|
"request_accepted": "İstek kabul edildi",
|
||||||
|
"user_blocked_successfully": "Kullanıcı başarıyla engellendi",
|
||||||
|
"user_block_modal_text": "Bu işlem {{displayName}} adlı kullanıcıyı engelleyecek",
|
||||||
|
"blocked_users": "Engellenen kullanıcılar",
|
||||||
|
"unblock": "Engeli kaldır",
|
||||||
|
"no_friends_added": "Hiç arkadaş eklemediniz",
|
||||||
|
"pending": "Bekliyor",
|
||||||
|
"no_pending_invites": "Bekleyen davetiniz yok",
|
||||||
|
"no_blocked_users": "Engellenmiş kullanıcı yok",
|
||||||
|
"friend_code_copied": "Arkadaş kodu kopyalandı",
|
||||||
|
"undo_friendship_modal_text": "Bu işlem {{displayName}} ile arkadaşlığınızı sonlandıracak",
|
||||||
|
"privacy_hint": "Bunu kimin görebileceğini ayarlamak için <0>Ayarlar</0> bölümüne gidin",
|
||||||
|
"locked_profile": "Bu profil gizli",
|
||||||
|
"image_process_failure": "Görüntü işleme başarısız oldu",
|
||||||
|
"required_field": "Bu alan gerekli",
|
||||||
|
"displayname_min_length": "Görünen isim en az 3 karakter uzunluğunda olmalıdır",
|
||||||
|
"displayname_max_length": "Görünen isim en fazla 50 karakter uzunluğunda olabilir",
|
||||||
|
"report_profile": "Bu profili bildir",
|
||||||
|
"report_reason": "Bu profili neden bildiriyorsunuz?",
|
||||||
|
"report_description": "Ek bilgi",
|
||||||
|
"report_description_placeholder": "Ek bilgi",
|
||||||
|
"report": "Bildir",
|
||||||
|
"report_reason_hate": "Nefret söylemi",
|
||||||
|
"report_reason_sexual_content": "Cinsel içerik",
|
||||||
|
"report_reason_violence": "Şiddet",
|
||||||
|
"report_reason_spam": "Spam",
|
||||||
|
"report_reason_other": "Diğer",
|
||||||
|
"profile_reported": "Profil bildirildi",
|
||||||
|
"your_friend_code": "Arkadaş kodunuz:",
|
||||||
|
"upload_banner": "Afiş yükle",
|
||||||
|
"uploading_banner": "Afiş yükleniyor…",
|
||||||
|
"background_image_updated": "Arka plan görüntüsü güncellendi",
|
||||||
|
"stats": "İstatistikler",
|
||||||
|
"achievements": "Başarılar",
|
||||||
|
"games": "Oyunlar",
|
||||||
|
"top_percentile": "En üst {{percentile}}%",
|
||||||
|
"ranking_updated_weekly": "Sıralama haftalık olarak güncellenir",
|
||||||
|
"playing": "{{game}} oynanıyor",
|
||||||
|
"achievements_unlocked": "Başarılar açıldı",
|
||||||
|
"earned_points": "Kazanılan puanlar",
|
||||||
|
"show_achievements_on_profile": "Başarılarınızı profilinizde gösterin",
|
||||||
|
"show_points_on_profile": "Kazandığınız puanları profilinizde gösterin"
|
||||||
|
},
|
||||||
|
"achievement": {
|
||||||
|
"achievement_unlocked": "Başarı açıldı",
|
||||||
|
"user_achievements": "{{displayName}}'in Başarıları",
|
||||||
|
"your_achievements": "Başarılarınız",
|
||||||
|
"unlocked_at": "Açılma zamanı: {{date}}",
|
||||||
|
"subscription_needed": "Bu içeriği görmek için bir Hydra Cloud aboneliği gereklidir",
|
||||||
|
"new_achievements_unlocked": "{{gameCount}} oyundan {{achievementCount}} yeni başarı açıldı",
|
||||||
|
"achievement_progress": "{{unlockedCount}}/{{totalCount}} başarı",
|
||||||
|
"achievements_unlocked_for_game": "{{gameTitle}} oyunu için {{achievementCount}} yeni başarı açıldı",
|
||||||
|
"hidden_achievement_tooltip": "Bu gizli bir başarıdır",
|
||||||
|
"achievement_earn_points": "Bu başarı ile {{points}} puan kazanın",
|
||||||
|
"earned_points": "Kazanılan puanlar:",
|
||||||
|
"available_points": "Mevcut puanlar:",
|
||||||
|
"how_to_earn_achievements_points": "Başarı puanları nasıl kazanılır?"
|
||||||
|
},
|
||||||
|
"hydra_cloud": {
|
||||||
|
"subscription_tour_title": "Hydra Cloud Aboneliği",
|
||||||
|
"subscribe_now": "Şimdi abone olun",
|
||||||
|
"cloud_saving": "Bulut kaydetme",
|
||||||
|
"cloud_achievements": "Başarılarınızı buluta kaydedin",
|
||||||
|
"animated_profile_picture": "Animasyonlu profil resimleri",
|
||||||
|
"premium_support": "Premium Destek",
|
||||||
|
"show_and_compare_achievements": "Başarılarınızı diğer kullanıcılarla karşılaştırın ve gösterin",
|
||||||
|
"animated_profile_banner": "Animasyonlu profil afişi",
|
||||||
|
"hydra_cloud": "Hydra Cloud",
|
||||||
|
"hydra_cloud_feature_found": "Bir Hydra Cloud özelliği keşfettiniz!",
|
||||||
|
"learn_more": "Daha Fazla Bilgi Edinin"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -231,7 +231,7 @@
|
|||||||
"sign_out_modal_text": "Ваша бібліотека пов'язана з поточним обліковим записом. При виході з системи ваша бібліотека буде недоступною, і прогрес не буде збережено. Продовжити вихід?",
|
"sign_out_modal_text": "Ваша бібліотека пов'язана з поточним обліковим записом. При виході з системи ваша бібліотека буде недоступною, і прогрес не буде збережено. Продовжити вихід?",
|
||||||
"sign_out_modal_title": "Ви впевнені?",
|
"sign_out_modal_title": "Ви впевнені?",
|
||||||
"successfully_signed_out": "Успішний вихід з акаунту",
|
"successfully_signed_out": "Успішний вихід з акаунту",
|
||||||
"total_play_time": "Всього зіграно: {{amount}}",
|
"total_play_time": "Всього зіграно",
|
||||||
"try_again": "Будь ласка, попробуйте ще раз"
|
"try_again": "Будь ласка, попробуйте ще раз"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -290,7 +290,7 @@
|
|||||||
"last_time_played": "上次游玩时间 {{period}}",
|
"last_time_played": "上次游玩时间 {{period}}",
|
||||||
"activity": "近期活动",
|
"activity": "近期活动",
|
||||||
"library": "库",
|
"library": "库",
|
||||||
"total_play_time": "总游戏时长: {{amount}}",
|
"total_play_time": "总游戏时长",
|
||||||
"no_recent_activity_title": "Emmm… 这里暂时啥都没有",
|
"no_recent_activity_title": "Emmm… 这里暂时啥都没有",
|
||||||
"no_recent_activity_description": "你最近没玩过任何游戏。是时候做出改变了!",
|
"no_recent_activity_description": "你最近没玩过任何游戏。是时候做出改变了!",
|
||||||
"display_name": "昵称",
|
"display_name": "昵称",
|
||||||
@ -359,11 +359,11 @@
|
|||||||
"achievement_unlocked": "成就已解锁",
|
"achievement_unlocked": "成就已解锁",
|
||||||
"user_achievements": "{{displayName}}的成就",
|
"user_achievements": "{{displayName}}的成就",
|
||||||
"your_achievements": "你的成就",
|
"your_achievements": "你的成就",
|
||||||
"unlocked_at": "解锁于:",
|
"unlocked_at": "解锁于: {{date}}",
|
||||||
"subscription_needed": "需要订阅 Hydra Cloud 才能看到此内容",
|
"subscription_needed": "需要订阅 Hydra Cloud 才能看到此内容",
|
||||||
"new_achievements_unlocked": "从 {{gameCount}} 游戏中解锁 {{achievementCount}} 新成就"
|
"new_achievements_unlocked": "从 {{gameCount}} 游戏中解锁 {{achievementCount}} 新成就"
|
||||||
},
|
},
|
||||||
"tour": {
|
"hydra_cloud": {
|
||||||
"subscription_tour_title": "Hydra 云订阅",
|
"subscription_tour_title": "Hydra 云订阅",
|
||||||
"subscribe_now": "现在订购",
|
"subscribe_now": "现在订购",
|
||||||
"cloud_saving": "云存档",
|
"cloud_saving": "云存档",
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
import { DataSource } from "typeorm";
|
import { DataSource } from "typeorm";
|
||||||
import {
|
import {
|
||||||
DownloadQueue,
|
DownloadQueue,
|
||||||
DownloadSource,
|
|
||||||
Game,
|
Game,
|
||||||
GameShopCache,
|
GameShopCache,
|
||||||
Repack,
|
|
||||||
UserPreferences,
|
UserPreferences,
|
||||||
UserAuth,
|
UserAuth,
|
||||||
GameAchievement,
|
GameAchievement,
|
||||||
@ -17,12 +15,10 @@ export const dataSource = new DataSource({
|
|||||||
type: "better-sqlite3",
|
type: "better-sqlite3",
|
||||||
entities: [
|
entities: [
|
||||||
Game,
|
Game,
|
||||||
Repack,
|
|
||||||
UserAuth,
|
UserAuth,
|
||||||
UserPreferences,
|
UserPreferences,
|
||||||
UserSubscription,
|
UserSubscription,
|
||||||
GameShopCache,
|
GameShopCache,
|
||||||
DownloadSource,
|
|
||||||
DownloadQueue,
|
DownloadQueue,
|
||||||
GameAchievement,
|
GameAchievement,
|
||||||
],
|
],
|
||||||
|
@ -1,41 +0,0 @@
|
|||||||
import {
|
|
||||||
Entity,
|
|
||||||
PrimaryGeneratedColumn,
|
|
||||||
Column,
|
|
||||||
CreateDateColumn,
|
|
||||||
UpdateDateColumn,
|
|
||||||
OneToMany,
|
|
||||||
} from "typeorm";
|
|
||||||
import type { Repack } from "./repack.entity";
|
|
||||||
|
|
||||||
import { DownloadSourceStatus } from "@shared";
|
|
||||||
|
|
||||||
@Entity("download_source")
|
|
||||||
export class DownloadSource {
|
|
||||||
@PrimaryGeneratedColumn()
|
|
||||||
id: number;
|
|
||||||
|
|
||||||
@Column("text", { nullable: true, unique: true })
|
|
||||||
url: string;
|
|
||||||
|
|
||||||
@Column("text")
|
|
||||||
name: string;
|
|
||||||
|
|
||||||
@Column("text", { nullable: true })
|
|
||||||
etag: string | null;
|
|
||||||
|
|
||||||
@Column("int", { default: 0 })
|
|
||||||
downloadCount: number;
|
|
||||||
|
|
||||||
@Column("text", { default: DownloadSourceStatus.UpToDate })
|
|
||||||
status: DownloadSourceStatus;
|
|
||||||
|
|
||||||
@OneToMany("Repack", "downloadSource", { cascade: true })
|
|
||||||
repacks: Repack[];
|
|
||||||
|
|
||||||
@CreateDateColumn()
|
|
||||||
createdAt: Date;
|
|
||||||
|
|
||||||
@UpdateDateColumn()
|
|
||||||
updatedAt: Date;
|
|
||||||
}
|
|
@ -5,9 +5,7 @@ import {
|
|||||||
CreateDateColumn,
|
CreateDateColumn,
|
||||||
UpdateDateColumn,
|
UpdateDateColumn,
|
||||||
OneToOne,
|
OneToOne,
|
||||||
JoinColumn,
|
|
||||||
} from "typeorm";
|
} from "typeorm";
|
||||||
import { Repack } from "./repack.entity";
|
|
||||||
|
|
||||||
import type { GameShop, GameStatus } from "@types";
|
import type { GameShop, GameStatus } from "@types";
|
||||||
import { Downloader } from "@shared";
|
import { Downloader } from "@shared";
|
||||||
@ -39,6 +37,9 @@ export class Game {
|
|||||||
@Column("text", { nullable: true })
|
@Column("text", { nullable: true })
|
||||||
executablePath: string | null;
|
executablePath: string | null;
|
||||||
|
|
||||||
|
@Column("text", { nullable: true })
|
||||||
|
launchOptions: string | null;
|
||||||
|
|
||||||
@Column("text", { nullable: true })
|
@Column("text", { nullable: true })
|
||||||
winePrefixPath: string | null;
|
winePrefixPath: string | null;
|
||||||
|
|
||||||
@ -72,19 +73,15 @@ export class Game {
|
|||||||
@Column("text", { nullable: true })
|
@Column("text", { nullable: true })
|
||||||
uri: string | null;
|
uri: string | null;
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
@OneToOne("Repack", "game", { nullable: true })
|
|
||||||
@JoinColumn()
|
|
||||||
repack: Repack;
|
|
||||||
|
|
||||||
@OneToOne("DownloadQueue", "game")
|
@OneToOne("DownloadQueue", "game")
|
||||||
downloadQueue: DownloadQueue;
|
downloadQueue: DownloadQueue;
|
||||||
|
|
||||||
@Column("boolean", { default: false })
|
@Column("boolean", { default: false })
|
||||||
isDeleted: boolean;
|
isDeleted: boolean;
|
||||||
|
|
||||||
|
@Column("boolean", { default: false })
|
||||||
|
shouldSeed: boolean;
|
||||||
|
|
||||||
@CreateDateColumn()
|
@CreateDateColumn()
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
|
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
export * from "./game.entity";
|
export * from "./game.entity";
|
||||||
export * from "./repack.entity";
|
|
||||||
export * from "./user-auth.entity";
|
export * from "./user-auth.entity";
|
||||||
export * from "./user-preferences.entity";
|
export * from "./user-preferences.entity";
|
||||||
export * from "./user-subscription.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.entity";
|
||||||
export * from "./game-achievements.entity";
|
export * from "./game-achievements.entity";
|
||||||
export * from "./download-source.entity";
|
|
||||||
export * from "./download-queue.entity";
|
export * from "./download-queue.entity";
|
||||||
|
@ -1,45 +0,0 @@
|
|||||||
import {
|
|
||||||
Entity,
|
|
||||||
PrimaryGeneratedColumn,
|
|
||||||
Column,
|
|
||||||
CreateDateColumn,
|
|
||||||
UpdateDateColumn,
|
|
||||||
ManyToOne,
|
|
||||||
} from "typeorm";
|
|
||||||
import { DownloadSource } from "./download-source.entity";
|
|
||||||
|
|
||||||
@Entity("repack")
|
|
||||||
export class Repack {
|
|
||||||
@PrimaryGeneratedColumn()
|
|
||||||
id: number;
|
|
||||||
|
|
||||||
@Column("text", { unique: true })
|
|
||||||
title: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use uris instead
|
|
||||||
*/
|
|
||||||
@Column("text", { unique: true })
|
|
||||||
magnet: string;
|
|
||||||
|
|
||||||
@Column("text")
|
|
||||||
repacker: string;
|
|
||||||
|
|
||||||
@Column("text")
|
|
||||||
fileSize: string;
|
|
||||||
|
|
||||||
@Column("datetime")
|
|
||||||
uploadDate: Date | string;
|
|
||||||
|
|
||||||
@ManyToOne(() => DownloadSource, { nullable: true, onDelete: "CASCADE" })
|
|
||||||
downloadSource: DownloadSource;
|
|
||||||
|
|
||||||
@Column("text", { default: "[]" })
|
|
||||||
uris: string;
|
|
||||||
|
|
||||||
@CreateDateColumn()
|
|
||||||
createdAt: Date;
|
|
||||||
|
|
||||||
@UpdateDateColumn()
|
|
||||||
updatedAt: Date;
|
|
||||||
}
|
|
@ -41,6 +41,12 @@ export class UserPreferences {
|
|||||||
@Column("boolean", { default: false })
|
@Column("boolean", { default: false })
|
||||||
disableNsfwAlert: boolean;
|
disableNsfwAlert: boolean;
|
||||||
|
|
||||||
|
@Column("boolean", { default: true })
|
||||||
|
seedAfterDownloadComplete: boolean;
|
||||||
|
|
||||||
|
@Column("boolean", { default: false })
|
||||||
|
showHiddenAchievementsDescription: boolean;
|
||||||
|
|
||||||
@CreateDateColumn()
|
@CreateDateColumn()
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
|
|
||||||
|
@ -9,6 +9,8 @@ const getSessionHash = async (_event: Electron.IpcMainInvokeEvent) => {
|
|||||||
if (!auth) return null;
|
if (!auth) return null;
|
||||||
const payload = jwt.decode(auth.accessToken) as jwt.JwtPayload;
|
const payload = jwt.decode(auth.accessToken) as jwt.JwtPayload;
|
||||||
|
|
||||||
|
if (!payload) return null;
|
||||||
|
|
||||||
return payload.sessionId;
|
return payload.sessionId;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,7 +1,24 @@
|
|||||||
|
import i18next from "i18next";
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import { WindowManager } from "@main/services";
|
import { HydraApi, WindowManager } from "@main/services";
|
||||||
|
import { AuthPage } from "@shared";
|
||||||
|
|
||||||
const openAuthWindow = async (_event: Electron.IpcMainInvokeEvent) =>
|
const openAuthWindow = async (
|
||||||
WindowManager.openAuthWindow();
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
page: AuthPage
|
||||||
|
) => {
|
||||||
|
const searchParams = new URLSearchParams({
|
||||||
|
lng: i18next.language,
|
||||||
|
});
|
||||||
|
|
||||||
|
if ([AuthPage.UpdateEmail, AuthPage.UpdatePassword].includes(page)) {
|
||||||
|
const { accessToken } = await HydraApi.refreshToken().catch(() => {
|
||||||
|
return { accessToken: "" };
|
||||||
|
});
|
||||||
|
searchParams.set("token", accessToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
WindowManager.openAuthWindow(page, searchParams);
|
||||||
|
};
|
||||||
|
|
||||||
registerEvent("openAuthWindow", openAuthWindow);
|
registerEvent("openAuthWindow", openAuthWindow);
|
||||||
|
@ -1,12 +1,8 @@
|
|||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import {
|
import { DownloadManager, HydraApi, gamesPlaytime } from "@main/services";
|
||||||
DownloadManager,
|
|
||||||
HydraApi,
|
|
||||||
PythonInstance,
|
|
||||||
gamesPlaytime,
|
|
||||||
} from "@main/services";
|
|
||||||
import { dataSource } from "@main/data-source";
|
import { dataSource } from "@main/data-source";
|
||||||
import { DownloadQueue, Game, UserAuth, UserSubscription } from "@main/entity";
|
import { DownloadQueue, Game, UserAuth, UserSubscription } from "@main/entity";
|
||||||
|
import { PythonRPC } from "@main/services/python-rpc";
|
||||||
|
|
||||||
const signOut = async (_event: Electron.IpcMainInvokeEvent) => {
|
const signOut = async (_event: Electron.IpcMainInvokeEvent) => {
|
||||||
const databaseOperations = dataSource
|
const databaseOperations = dataSource
|
||||||
@ -32,7 +28,7 @@ const signOut = async (_event: Electron.IpcMainInvokeEvent) => {
|
|||||||
DownloadManager.cancelDownload();
|
DownloadManager.cancelDownload();
|
||||||
|
|
||||||
/* Disconnects libtorrent */
|
/* Disconnects libtorrent */
|
||||||
PythonInstance.killTorrent();
|
PythonRPC.kill();
|
||||||
|
|
||||||
HydraApi.handleSignOut();
|
HydraApi.handleSignOut();
|
||||||
|
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
import type { GameShop } from "@types";
|
|
||||||
|
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import { HydraApi } from "@main/services";
|
import { HydraApi } from "@main/services";
|
||||||
import { CatalogueCategory, steamUrlBuilder } from "@shared";
|
import { CatalogueCategory } from "@shared";
|
||||||
import { steamGamesWorker } from "@main/workers";
|
|
||||||
|
|
||||||
const getCatalogue = async (
|
const getCatalogue = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
@ -14,26 +11,11 @@ const getCatalogue = async (
|
|||||||
skip: "0",
|
skip: "0",
|
||||||
});
|
});
|
||||||
|
|
||||||
const response = await HydraApi.get<{ objectId: string; shop: GameShop }[]>(
|
return HydraApi.get(
|
||||||
`/catalogue/${category}?${params.toString()}`,
|
`/catalogue/${category}?${params.toString()}`,
|
||||||
{},
|
{},
|
||||||
{ needsAuth: false }
|
{ needsAuth: false }
|
||||||
);
|
);
|
||||||
|
|
||||||
return Promise.all(
|
|
||||||
response.map(async (game) => {
|
|
||||||
const steamGame = await steamGamesWorker.run(Number(game.objectId), {
|
|
||||||
name: "getById",
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
title: steamGame.name,
|
|
||||||
shop: game.shop,
|
|
||||||
cover: steamUrlBuilder.library(game.objectId),
|
|
||||||
objectId: game.objectId,
|
|
||||||
};
|
|
||||||
})
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
registerEvent("getCatalogue", getCatalogue);
|
registerEvent("getCatalogue", getCatalogue);
|
||||||
|
10
src/main/events/catalogue/get-developers.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { HydraApi } from "@main/services";
|
||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
|
||||||
|
const getDevelopers = async (_event: Electron.IpcMainInvokeEvent) => {
|
||||||
|
return HydraApi.get<string[]>(`/catalogue/developers`, null, {
|
||||||
|
needsAuth: false,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("getDevelopers", getDevelopers);
|
@ -1,29 +0,0 @@
|
|||||||
import type { CatalogueEntry } from "@types";
|
|
||||||
|
|
||||||
import { registerEvent } from "../register-event";
|
|
||||||
import { HydraApi } from "@main/services";
|
|
||||||
import { steamUrlBuilder } from "@shared";
|
|
||||||
|
|
||||||
const getGames = async (
|
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
|
||||||
take = 12,
|
|
||||||
skip = 0
|
|
||||||
): Promise<CatalogueEntry[]> => {
|
|
||||||
const searchParams = new URLSearchParams({
|
|
||||||
take: take.toString(),
|
|
||||||
skip: skip.toString(),
|
|
||||||
});
|
|
||||||
|
|
||||||
const games = await HydraApi.get<CatalogueEntry[]>(
|
|
||||||
`/games/catalogue?${searchParams.toString()}`,
|
|
||||||
undefined,
|
|
||||||
{ needsAuth: false }
|
|
||||||
);
|
|
||||||
|
|
||||||
return games.map((game) => ({
|
|
||||||
...game,
|
|
||||||
cover: steamUrlBuilder.library(game.objectId),
|
|
||||||
}));
|
|
||||||
};
|
|
||||||
|
|
||||||
registerEvent("getGames", getGames);
|
|
10
src/main/events/catalogue/get-publishers.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { HydraApi } from "@main/services";
|
||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
|
||||||
|
const getPublishers = async (_event: Electron.IpcMainInvokeEvent) => {
|
||||||
|
return HydraApi.get<string[]>(`/catalogue/publishers`, null, {
|
||||||
|
needsAuth: false,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("getPublishers", getPublishers);
|
@ -1,23 +1,18 @@
|
|||||||
|
import type { CatalogueSearchPayload } from "@types";
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import { convertSteamGameToCatalogueEntry } from "../helpers/search-games";
|
|
||||||
import type { CatalogueEntry } from "@types";
|
|
||||||
import { HydraApi } from "@main/services";
|
import { HydraApi } from "@main/services";
|
||||||
|
|
||||||
const searchGamesEvent = async (
|
const searchGames = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
query: string
|
payload: CatalogueSearchPayload,
|
||||||
): Promise<CatalogueEntry[]> => {
|
take: number,
|
||||||
const games = await HydraApi.get<
|
skip: number
|
||||||
{ objectId: string; title: string; shop: string }[]
|
) => {
|
||||||
>("/games/search", { title: query, take: 12, skip: 0 }, { needsAuth: false });
|
return HydraApi.post(
|
||||||
|
"/catalogue/search",
|
||||||
return games.map((game) => {
|
{ ...payload, take, skip },
|
||||||
return convertSteamGameToCatalogueEntry({
|
{ needsAuth: false }
|
||||||
id: Number(game.objectId),
|
);
|
||||||
name: game.title,
|
|
||||||
clientIcon: null,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
registerEvent("searchGames", searchGamesEvent);
|
registerEvent("searchGames", searchGames);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import { HydraApi } from "@main/services";
|
import { HydraApi } from "@main/services";
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import type { GameArtifact, GameShop } from "@types";
|
import type { GameArtifact, GameShop } from "@types";
|
||||||
|
import { SubscriptionRequiredError, UserNotLoggedInError } from "@shared";
|
||||||
|
|
||||||
const getGameArtifacts = async (
|
const getGameArtifacts = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
@ -13,8 +14,20 @@ const getGameArtifacts = async (
|
|||||||
});
|
});
|
||||||
|
|
||||||
return HydraApi.get<GameArtifact[]>(
|
return HydraApi.get<GameArtifact[]>(
|
||||||
`/profile/games/artifacts?${params.toString()}`
|
`/profile/games/artifacts?${params.toString()}`,
|
||||||
);
|
{},
|
||||||
|
{ needsSubscription: true }
|
||||||
|
).catch((err) => {
|
||||||
|
if (err instanceof SubscriptionRequiredError) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err instanceof UserNotLoggedInError) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
throw err;
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
registerEvent("getGameArtifacts", getGameArtifacts);
|
registerEvent("getGameArtifacts", getGameArtifacts);
|
||||||
|
@ -89,7 +89,7 @@ const uploadSaveGame = async (
|
|||||||
"Content-Type": "application/tar",
|
"Content-Type": "application/tar",
|
||||||
},
|
},
|
||||||
onUploadProgress: (progressEvent) => {
|
onUploadProgress: (progressEvent) => {
|
||||||
console.log(progressEvent);
|
logger.log(progressEvent);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
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,7 +0,0 @@
|
|||||||
import { registerEvent } from "../register-event";
|
|
||||||
import { knexClient } from "@main/knex-client";
|
|
||||||
|
|
||||||
const getDownloadSources = async (_event: Electron.IpcMainInvokeEvent) =>
|
|
||||||
knexClient.select("*").from("download_source");
|
|
||||||
|
|
||||||
registerEvent("getDownloadSources", getDownloadSources);
|
|
17
src/main/events/download-sources/put-download-source.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { HydraApi } from "@main/services";
|
||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
|
||||||
|
const putDownloadSource = async (
|
||||||
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
objectIds: string[]
|
||||||
|
) => {
|
||||||
|
return HydraApi.put<{ fingerprint: string }>(
|
||||||
|
"/download-sources",
|
||||||
|
{
|
||||||
|
objectIds,
|
||||||
|
},
|
||||||
|
{ needsAuth: false }
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("putDownloadSource", putDownloadSource);
|
15
src/main/events/hardware/check-folder-write-permission.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import fs from "node:fs";
|
||||||
|
|
||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
|
||||||
|
const checkFolderWritePermission = async (
|
||||||
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
path: string
|
||||||
|
) =>
|
||||||
|
new Promise((resolve) => {
|
||||||
|
fs.access(path, fs.constants.W_OK, (err) => {
|
||||||
|
resolve(!err);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
registerEvent("checkFolderWritePermission", checkFolderWritePermission);
|
@ -1,10 +1,10 @@
|
|||||||
import checkDiskSpace from "check-disk-space";
|
import disk from "diskusage";
|
||||||
|
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
|
|
||||||
const getDiskFreeSpace = async (
|
const getDiskFreeSpace = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
path: string
|
path: string
|
||||||
) => checkDiskSpace(path);
|
) => disk.check(path);
|
||||||
|
|
||||||
registerEvent("getDiskFreeSpace", getDiskFreeSpace);
|
registerEvent("getDiskFreeSpace", getDiskFreeSpace);
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
import type { GameShop, CatalogueEntry, SteamGame } from "@types";
|
|
||||||
|
|
||||||
import { steamGamesWorker } from "@main/workers";
|
|
||||||
import { steamUrlBuilder } from "@shared";
|
|
||||||
|
|
||||||
export interface SearchGamesArgs {
|
|
||||||
query?: string;
|
|
||||||
take?: number;
|
|
||||||
skip?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const convertSteamGameToCatalogueEntry = (
|
|
||||||
game: SteamGame
|
|
||||||
): CatalogueEntry => ({
|
|
||||||
objectId: String(game.id),
|
|
||||||
title: game.name,
|
|
||||||
shop: "steam" as GameShop,
|
|
||||||
cover: steamUrlBuilder.library(String(game.id)),
|
|
||||||
});
|
|
||||||
|
|
||||||
export const getSteamGameById = async (
|
|
||||||
objectId: string
|
|
||||||
): Promise<CatalogueEntry | null> => {
|
|
||||||
const steamGame = await steamGamesWorker.run(Number(objectId), {
|
|
||||||
name: "getById",
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!steamGame) return null;
|
|
||||||
|
|
||||||
return convertSteamGameToCatalogueEntry(steamGame);
|
|
||||||
};
|
|
@ -3,13 +3,15 @@ import { ipcMain } from "electron";
|
|||||||
|
|
||||||
import "./catalogue/get-catalogue";
|
import "./catalogue/get-catalogue";
|
||||||
import "./catalogue/get-game-shop-details";
|
import "./catalogue/get-game-shop-details";
|
||||||
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/get-game-stats";
|
import "./catalogue/get-game-stats";
|
||||||
import "./catalogue/get-trending-games";
|
import "./catalogue/get-trending-games";
|
||||||
|
import "./catalogue/get-publishers";
|
||||||
|
import "./catalogue/get-developers";
|
||||||
import "./hardware/get-disk-free-space";
|
import "./hardware/get-disk-free-space";
|
||||||
|
import "./hardware/check-folder-write-permission";
|
||||||
import "./library/add-game-to-library";
|
import "./library/add-game-to-library";
|
||||||
import "./library/create-game-shortcut";
|
import "./library/create-game-shortcut";
|
||||||
import "./library/close-game";
|
import "./library/close-game";
|
||||||
@ -21,25 +23,30 @@ import "./library/open-game-executable-path";
|
|||||||
import "./library/open-game-installer";
|
import "./library/open-game-installer";
|
||||||
import "./library/open-game-installer-path";
|
import "./library/open-game-installer-path";
|
||||||
import "./library/update-executable-path";
|
import "./library/update-executable-path";
|
||||||
|
import "./library/update-launch-options";
|
||||||
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 "./library/select-game-wine-prefix";
|
||||||
|
import "./library/reset-game-achievements";
|
||||||
import "./misc/open-checkout";
|
import "./misc/open-checkout";
|
||||||
import "./misc/open-external";
|
import "./misc/open-external";
|
||||||
import "./misc/show-open-dialog";
|
import "./misc/show-open-dialog";
|
||||||
|
import "./misc/get-features";
|
||||||
|
import "./misc/show-item-in-folder";
|
||||||
import "./torrenting/cancel-game-download";
|
import "./torrenting/cancel-game-download";
|
||||||
import "./torrenting/pause-game-download";
|
import "./torrenting/pause-game-download";
|
||||||
import "./torrenting/resume-game-download";
|
import "./torrenting/resume-game-download";
|
||||||
import "./torrenting/start-game-download";
|
import "./torrenting/start-game-download";
|
||||||
|
import "./torrenting/pause-game-seed";
|
||||||
|
import "./torrenting/resume-game-seed";
|
||||||
import "./user-preferences/get-user-preferences";
|
import "./user-preferences/get-user-preferences";
|
||||||
import "./user-preferences/update-user-preferences";
|
import "./user-preferences/update-user-preferences";
|
||||||
import "./user-preferences/auto-launch";
|
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/put-download-source";
|
||||||
import "./download-sources/get-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";
|
||||||
@ -68,7 +75,6 @@ import "./cloud-save/delete-game-artifact";
|
|||||||
import "./cloud-save/select-game-backup-path";
|
import "./cloud-save/select-game-backup-path";
|
||||||
import "./notifications/publish-new-repacks-notification";
|
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", () => appVersion);
|
ipcMain.handle("getVersion", () => appVersion);
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
import { gameRepository } from "@main/repository";
|
import { gameRepository } from "@main/repository";
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import { PythonInstance, logger } from "@main/services";
|
import { logger } from "@main/services";
|
||||||
import sudo from "sudo-prompt";
|
import sudo from "sudo-prompt";
|
||||||
import { app } from "electron";
|
import { app } from "electron";
|
||||||
|
import { PythonRPC } from "@main/services/python-rpc";
|
||||||
|
import { ProcessPayload } from "@main/services/download/types";
|
||||||
|
|
||||||
const getKillCommand = (pid: number) => {
|
const getKillCommand = (pid: number) => {
|
||||||
if (process.platform == "win32") {
|
if (process.platform == "win32") {
|
||||||
@ -16,7 +18,10 @@ const closeGame = async (
|
|||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
gameId: number
|
gameId: number
|
||||||
) => {
|
) => {
|
||||||
const processes = await PythonInstance.getProcessList();
|
const processes =
|
||||||
|
(await PythonRPC.rpc.get<ProcessPayload[] | null>("/process-list")).data ||
|
||||||
|
[];
|
||||||
|
|
||||||
const game = await gameRepository.findOne({
|
const game = await gameRepository.findOne({
|
||||||
where: { id: gameId, isDeleted: false },
|
where: { id: gameId, isDeleted: false },
|
||||||
});
|
});
|
||||||
@ -24,7 +29,11 @@ const closeGame = async (
|
|||||||
if (!game) return;
|
if (!game) return;
|
||||||
|
|
||||||
const gameProcess = processes.find((runningProcess) => {
|
const gameProcess = processes.find((runningProcess) => {
|
||||||
return runningProcess.exe === game.executablePath;
|
if (process.platform === "linux") {
|
||||||
|
return runningProcess.name === game.executablePath?.split("/").at(-1);
|
||||||
|
} else {
|
||||||
|
return runningProcess.exe === game.executablePath;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (gameProcess) {
|
if (gameProcess) {
|
||||||
|
@ -7,11 +7,16 @@ import { parseExecutablePath } from "../helpers/parse-executable-path";
|
|||||||
const openGame = async (
|
const openGame = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
gameId: number,
|
gameId: number,
|
||||||
executablePath: string
|
executablePath: string,
|
||||||
|
launchOptions: string | null
|
||||||
) => {
|
) => {
|
||||||
|
// TODO: revisit this for launchOptions
|
||||||
const parsedPath = parseExecutablePath(executablePath);
|
const parsedPath = parseExecutablePath(executablePath);
|
||||||
|
|
||||||
await gameRepository.update({ id: gameId }, { executablePath: parsedPath });
|
await gameRepository.update(
|
||||||
|
{ id: gameId },
|
||||||
|
{ executablePath: parsedPath, launchOptions }
|
||||||
|
);
|
||||||
|
|
||||||
shell.openPath(parsedPath);
|
shell.openPath(parsedPath);
|
||||||
};
|
};
|
||||||
|
56
src/main/events/library/reset-game-achievements.ts
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
import { gameAchievementRepository, gameRepository } from "@main/repository";
|
||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
import { findAchievementFiles } from "@main/services/achievements/find-achivement-files";
|
||||||
|
import fs from "fs";
|
||||||
|
import { achievementsLogger, HydraApi, WindowManager } from "@main/services";
|
||||||
|
import { getUnlockedAchievements } from "../user/get-unlocked-achievements";
|
||||||
|
|
||||||
|
const resetGameAchievements = async (
|
||||||
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
gameId: number
|
||||||
|
) => {
|
||||||
|
try {
|
||||||
|
const game = await gameRepository.findOne({ where: { id: gameId } });
|
||||||
|
|
||||||
|
if (!game) return;
|
||||||
|
|
||||||
|
const achievementFiles = findAchievementFiles(game);
|
||||||
|
|
||||||
|
if (achievementFiles.length) {
|
||||||
|
for (const achievementFile of achievementFiles) {
|
||||||
|
achievementsLogger.log(`deleting ${achievementFile.filePath}`);
|
||||||
|
await fs.promises.rm(achievementFile.filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await gameAchievementRepository.update(
|
||||||
|
{ objectId: game.objectID },
|
||||||
|
{
|
||||||
|
unlockedAchievements: null,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
await HydraApi.delete(`/profile/games/achievements/${game.remoteId}`).then(
|
||||||
|
() =>
|
||||||
|
achievementsLogger.log(
|
||||||
|
`Deleted achievements from ${game.remoteId} - ${game.objectID} - ${game.title}`
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
const gameAchievements = await getUnlockedAchievements(
|
||||||
|
game.objectID,
|
||||||
|
game.shop,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
|
||||||
|
WindowManager.mainWindow?.webContents.send(
|
||||||
|
`on-update-achievements-${game.objectID}-${game.shop}`,
|
||||||
|
gameAchievements
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
achievementsLogger.error(error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("resetGameAchievements", resetGameAchievements);
|
@ -5,9 +5,9 @@ import { registerEvent } from "../register-event";
|
|||||||
const selectGameWinePrefix = async (
|
const selectGameWinePrefix = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
id: number,
|
id: number,
|
||||||
winePrefixPath: string
|
winePrefixPath: string | null
|
||||||
) => {
|
) => {
|
||||||
return gameRepository.update({ id }, { winePrefixPath });
|
return gameRepository.update({ id }, { winePrefixPath: winePrefixPath });
|
||||||
};
|
};
|
||||||
|
|
||||||
registerEvent("selectGameWinePrefix", selectGameWinePrefix);
|
registerEvent("selectGameWinePrefix", selectGameWinePrefix);
|
||||||
|
@ -6,14 +6,18 @@ import { parseExecutablePath } from "../helpers/parse-executable-path";
|
|||||||
const updateExecutablePath = async (
|
const updateExecutablePath = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
id: number,
|
id: number,
|
||||||
executablePath: string
|
executablePath: string | null
|
||||||
) => {
|
) => {
|
||||||
|
const parsedPath = executablePath
|
||||||
|
? parseExecutablePath(executablePath)
|
||||||
|
: null;
|
||||||
|
|
||||||
return gameRepository.update(
|
return gameRepository.update(
|
||||||
{
|
{
|
||||||
id,
|
id,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
executablePath: parseExecutablePath(executablePath),
|
executablePath: parsedPath,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
19
src/main/events/library/update-launch-options.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import { gameRepository } from "@main/repository";
|
||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
|
||||||
|
const updateLaunchOptions = async (
|
||||||
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
id: number,
|
||||||
|
launchOptions: string | null
|
||||||
|
) => {
|
||||||
|
return gameRepository.update(
|
||||||
|
{
|
||||||
|
id,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
launchOptions: launchOptions?.trim() != "" ? launchOptions : null,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("updateLaunchOptions", updateLaunchOptions);
|
8
src/main/events/misc/get-features.ts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
import { HydraApi } from "@main/services";
|
||||||
|
|
||||||
|
const getFeatures = async (_event: Electron.IpcMainInvokeEvent) => {
|
||||||
|
return HydraApi.get<string[]>("/features", null, { needsAuth: false });
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("getFeatures", getFeatures);
|
@ -1,16 +1,10 @@
|
|||||||
import { shell } from "electron";
|
import { shell } from "electron";
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import {
|
import { userAuthRepository } from "@main/repository";
|
||||||
userAuthRepository,
|
|
||||||
userPreferencesRepository,
|
|
||||||
} from "@main/repository";
|
|
||||||
import { HydraApi } from "@main/services";
|
import { HydraApi } from "@main/services";
|
||||||
|
|
||||||
const openCheckout = async (_event: Electron.IpcMainInvokeEvent) => {
|
const openCheckout = async (_event: Electron.IpcMainInvokeEvent) => {
|
||||||
const [userAuth, userPreferences] = await Promise.all([
|
const userAuth = await userAuthRepository.findOne({ where: { id: 1 } });
|
||||||
userAuthRepository.findOne({ where: { id: 1 } }),
|
|
||||||
userPreferencesRepository.findOne({ where: { id: 1 } }),
|
|
||||||
]);
|
|
||||||
|
|
||||||
if (!userAuth) {
|
if (!userAuth) {
|
||||||
return;
|
return;
|
||||||
@ -22,7 +16,6 @@ const openCheckout = async (_event: Electron.IpcMainInvokeEvent) => {
|
|||||||
|
|
||||||
const params = new URLSearchParams({
|
const params = new URLSearchParams({
|
||||||
token: paymentToken,
|
token: paymentToken,
|
||||||
lng: userPreferences?.language || "en",
|
|
||||||
});
|
});
|
||||||
|
|
||||||
shell.openExternal(
|
shell.openExternal(
|
||||||
|
@ -1,11 +1,16 @@
|
|||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import { PythonInstance } from "@main/services";
|
import { PythonRPC } from "@main/services/python-rpc";
|
||||||
|
|
||||||
const processProfileImage = async (
|
const processProfileImage = async (
|
||||||
_event: Electron.IpcMainInvokeEvent,
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
path: string
|
path: string
|
||||||
) => {
|
) => {
|
||||||
return PythonInstance.processProfileImage(path);
|
return PythonRPC.rpc
|
||||||
|
.post<{
|
||||||
|
imagePath: string;
|
||||||
|
mimeType: string;
|
||||||
|
}>("/profile-image", { image_path: path })
|
||||||
|
.then((response) => response.data);
|
||||||
};
|
};
|
||||||
|
|
||||||
registerEvent("processProfileImage", processProfileImage);
|
registerEvent("processProfileImage", processProfileImage);
|
||||||
|
17
src/main/events/torrenting/pause-game-seed.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
import { DownloadManager } from "@main/services";
|
||||||
|
import { gameRepository } from "@main/repository";
|
||||||
|
|
||||||
|
const pauseGameSeed = async (
|
||||||
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
gameId: number
|
||||||
|
) => {
|
||||||
|
await gameRepository.update(gameId, {
|
||||||
|
status: "complete",
|
||||||
|
shouldSeed: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
await DownloadManager.pauseSeeding(gameId);
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("pauseGameSeed", pauseGameSeed);
|
29
src/main/events/torrenting/resume-game-seed.ts
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import { registerEvent } from "../register-event";
|
||||||
|
import { gameRepository } from "../../repository";
|
||||||
|
import { DownloadManager } from "@main/services";
|
||||||
|
import { Downloader } from "@shared";
|
||||||
|
|
||||||
|
const resumeGameSeed = async (
|
||||||
|
_event: Electron.IpcMainInvokeEvent,
|
||||||
|
gameId: number
|
||||||
|
) => {
|
||||||
|
const game = await gameRepository.findOne({
|
||||||
|
where: {
|
||||||
|
id: gameId,
|
||||||
|
isDeleted: false,
|
||||||
|
downloader: Downloader.Torrent,
|
||||||
|
progress: 1,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!game) return;
|
||||||
|
|
||||||
|
await gameRepository.update(gameId, {
|
||||||
|
status: "seeding",
|
||||||
|
shouldSeed: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
await DownloadManager.resumeSeeding(game);
|
||||||
|
};
|
||||||
|
|
||||||
|
registerEvent("resumeGameSeed", resumeGameSeed);
|
@ -1,6 +1,6 @@
|
|||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import type { StartGameDownloadPayload } from "@types";
|
import type { StartGameDownloadPayload } from "@types";
|
||||||
import { DownloadManager, HydraApi, logger } from "@main/services";
|
import { DownloadManager, HydraApi } from "@main/services";
|
||||||
|
|
||||||
import { Not } from "typeorm";
|
import { Not } from "typeorm";
|
||||||
import { steamGamesWorker } from "@main/workers";
|
import { steamGamesWorker } from "@main/workers";
|
||||||
@ -76,24 +76,23 @@ const startGameDownload = async (
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
createGame(updatedGame!).catch(() => {});
|
|
||||||
|
|
||||||
HydraApi.post(
|
|
||||||
"/games/download",
|
|
||||||
{
|
|
||||||
objectId: updatedGame!.objectID,
|
|
||||||
shop: updatedGame!.shop,
|
|
||||||
},
|
|
||||||
{ needsAuth: false }
|
|
||||||
).catch((err) => {
|
|
||||||
logger.error("Failed to create game download", err);
|
|
||||||
});
|
|
||||||
|
|
||||||
await DownloadManager.cancelDownload(updatedGame!.id);
|
await DownloadManager.cancelDownload(updatedGame!.id);
|
||||||
await DownloadManager.startDownload(updatedGame!);
|
await DownloadManager.startDownload(updatedGame!);
|
||||||
|
|
||||||
await downloadQueueRepository.delete({ game: { id: updatedGame!.id } });
|
await downloadQueueRepository.delete({ game: { id: updatedGame!.id } });
|
||||||
await downloadQueueRepository.insert({ game: { id: updatedGame!.id } });
|
await downloadQueueRepository.insert({ game: { id: updatedGame!.id } });
|
||||||
|
|
||||||
|
await Promise.all([
|
||||||
|
createGame(updatedGame!).catch(() => {}),
|
||||||
|
HydraApi.post(
|
||||||
|
"/games/download",
|
||||||
|
{
|
||||||
|
objectId: updatedGame!.objectID,
|
||||||
|
shop: updatedGame!.shop,
|
||||||
|
},
|
||||||
|
{ needsAuth: false }
|
||||||
|
).catch(() => {}),
|
||||||
|
]);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { RealDebridClient } from "@main/services/real-debrid";
|
import { RealDebridClient } from "@main/services/download/real-debrid";
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
|
|
||||||
const authenticateRealDebrid = async (
|
const authenticateRealDebrid = async (
|
||||||
|
@ -13,6 +13,9 @@ const getComparedUnlockedAchievements = async (
|
|||||||
where: { id: 1 },
|
where: { id: 1 },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const showHiddenAchievementsDescription =
|
||||||
|
userPreferences?.showHiddenAchievementsDescription || false;
|
||||||
|
|
||||||
return HydraApi.get<ComparedAchievements>(
|
return HydraApi.get<ComparedAchievements>(
|
||||||
`/users/${userId}/games/achievements/compare`,
|
`/users/${userId}/games/achievements/compare`,
|
||||||
{
|
{
|
||||||
@ -21,15 +24,35 @@ const getComparedUnlockedAchievements = async (
|
|||||||
language: userPreferences?.language || "en",
|
language: userPreferences?.language || "en",
|
||||||
}
|
}
|
||||||
).then((achievements) => {
|
).then((achievements) => {
|
||||||
const sortedAchievements = achievements.achievements.sort((a, b) => {
|
const sortedAchievements = achievements.achievements
|
||||||
if (a.targetStat.unlocked && !b.targetStat.unlocked) return -1;
|
.sort((a, b) => {
|
||||||
if (!a.targetStat.unlocked && b.targetStat.unlocked) return 1;
|
if (a.targetStat.unlocked && !b.targetStat.unlocked) return -1;
|
||||||
if (a.targetStat.unlocked && b.targetStat.unlocked) {
|
if (!a.targetStat.unlocked && b.targetStat.unlocked) return 1;
|
||||||
return b.targetStat.unlockTime! - a.targetStat.unlockTime!;
|
if (a.targetStat.unlocked && b.targetStat.unlocked) {
|
||||||
}
|
return b.targetStat.unlockTime! - a.targetStat.unlockTime!;
|
||||||
|
}
|
||||||
|
|
||||||
return Number(a.hidden) - Number(b.hidden);
|
return Number(a.hidden) - Number(b.hidden);
|
||||||
});
|
})
|
||||||
|
.map((achievement) => {
|
||||||
|
if (!achievement.hidden) return achievement;
|
||||||
|
|
||||||
|
if (!achievement.ownerStat) {
|
||||||
|
return {
|
||||||
|
...achievement,
|
||||||
|
description: "",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!showHiddenAchievementsDescription && achievement.hidden) {
|
||||||
|
return {
|
||||||
|
...achievement,
|
||||||
|
description: "",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return achievement;
|
||||||
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...achievements,
|
...achievements,
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
import type { GameShop, UnlockedAchievement, UserAchievement } from "@types";
|
import type { GameShop, UnlockedAchievement, UserAchievement } from "@types";
|
||||||
import { registerEvent } from "../register-event";
|
import { registerEvent } from "../register-event";
|
||||||
import { gameAchievementRepository } from "@main/repository";
|
import {
|
||||||
|
gameAchievementRepository,
|
||||||
|
userPreferencesRepository,
|
||||||
|
} from "@main/repository";
|
||||||
import { getGameAchievementData } from "@main/services/achievements/get-game-achievement-data";
|
import { getGameAchievementData } from "@main/services/achievements/get-game-achievement-data";
|
||||||
|
|
||||||
export const getUnlockedAchievements = async (
|
export const getUnlockedAchievements = async (
|
||||||
@ -12,10 +15,17 @@ export const getUnlockedAchievements = async (
|
|||||||
where: { objectId, shop },
|
where: { objectId, shop },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const userPreferences = await userPreferencesRepository.findOne({
|
||||||
|
where: { id: 1 },
|
||||||
|
});
|
||||||
|
|
||||||
|
const showHiddenAchievementsDescription =
|
||||||
|
userPreferences?.showHiddenAchievementsDescription || false;
|
||||||
|
|
||||||
const achievementsData = await getGameAchievementData(
|
const achievementsData = await getGameAchievementData(
|
||||||
objectId,
|
objectId,
|
||||||
shop,
|
shop,
|
||||||
useCachedData
|
useCachedData ? cachedAchievements : null
|
||||||
);
|
);
|
||||||
|
|
||||||
const unlockedAchievements = JSON.parse(
|
const unlockedAchievements = JSON.parse(
|
||||||
@ -50,6 +60,10 @@ export const getUnlockedAchievements = async (
|
|||||||
unlocked: false,
|
unlocked: false,
|
||||||
unlockTime: null,
|
unlockTime: null,
|
||||||
icongray: icongray,
|
icongray: icongray,
|
||||||
|
description:
|
||||||
|
!achievementData.hidden || showHiddenAchievementsDescription
|
||||||
|
? achievementData.description
|
||||||
|
: undefined,
|
||||||
} as UserAchievement;
|
} as UserAchievement;
|
||||||
})
|
})
|
||||||
.sort((a, b) => {
|
.sort((a, b) => {
|
||||||
|
@ -11,7 +11,7 @@ const getSteamGame = async (objectId: string) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
title: steamGame.name,
|
title: steamGame.name as string,
|
||||||
iconUrl: steamUrlBuilder.icon(objectId, steamGame.clientIcon),
|
iconUrl: steamUrlBuilder.icon(objectId, steamGame.clientIcon),
|
||||||
};
|
};
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@ -67,8 +67,25 @@ const getUser = async (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const friends = await Promise.all(
|
||||||
|
profile.friends.map(async (friend) => {
|
||||||
|
if (!friend.currentGame) return friend;
|
||||||
|
|
||||||
|
const currentGame = await getSteamGame(friend.currentGame.objectId);
|
||||||
|
|
||||||
|
return {
|
||||||
|
...friend,
|
||||||
|
currentGame: {
|
||||||
|
...friend.currentGame,
|
||||||
|
...currentGame,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...profile,
|
...profile,
|
||||||
|
friends,
|
||||||
libraryGames,
|
libraryGames,
|
||||||
recentGames,
|
recentGames,
|
||||||
};
|
};
|
||||||
|
@ -5,12 +5,14 @@ import path from "node:path";
|
|||||||
import url from "node:url";
|
import url from "node:url";
|
||||||
import fs from "node:fs";
|
import fs from "node:fs";
|
||||||
import { electronApp, optimizer } from "@electron-toolkit/utils";
|
import { electronApp, optimizer } from "@electron-toolkit/utils";
|
||||||
import { logger, PythonInstance, WindowManager } from "@main/services";
|
import { logger, WindowManager } from "@main/services";
|
||||||
import { dataSource } from "@main/data-source";
|
import { dataSource } from "@main/data-source";
|
||||||
import resources from "@locales";
|
import resources from "@locales";
|
||||||
import { userPreferencesRepository } from "@main/repository";
|
import { userPreferencesRepository } from "@main/repository";
|
||||||
import { knexClient, migrationConfig } from "./knex-client";
|
import { knexClient, migrationConfig } from "./knex-client";
|
||||||
import { databaseDirectory } from "./constants";
|
import { databaseDirectory } from "./constants";
|
||||||
|
import { PythonRPC } from "./services/python-rpc";
|
||||||
|
import { Aria2 } from "./services/aria2";
|
||||||
|
|
||||||
const { autoUpdater } = updater;
|
const { autoUpdater } = updater;
|
||||||
|
|
||||||
@ -146,7 +148,8 @@ app.on("window-all-closed", () => {
|
|||||||
|
|
||||||
app.on("before-quit", () => {
|
app.on("before-quit", () => {
|
||||||
/* Disconnects libtorrent */
|
/* Disconnects libtorrent */
|
||||||
PythonInstance.kill();
|
PythonRPC.kill();
|
||||||
|
Aria2.kill();
|
||||||
});
|
});
|
||||||
|
|
||||||
app.on("activate", () => {
|
app.on("activate", () => {
|
||||||
|
@ -13,6 +13,11 @@ import { AddBackgroundImageUrl } from "./migrations/20241016100249_add_backgroun
|
|||||||
import { AddWinePrefixToGame } from "./migrations/20241019081648_add_wine_prefix_to_game";
|
import { AddWinePrefixToGame } from "./migrations/20241019081648_add_wine_prefix_to_game";
|
||||||
import { AddStartMinimizedColumn } from "./migrations/20241030171454_add_start_minimized_column";
|
import { AddStartMinimizedColumn } from "./migrations/20241030171454_add_start_minimized_column";
|
||||||
import { AddDisableNsfwAlertColumn } from "./migrations/20241106053733_add_disable_nsfw_alert_column";
|
import { AddDisableNsfwAlertColumn } from "./migrations/20241106053733_add_disable_nsfw_alert_column";
|
||||||
|
import { AddShouldSeedColumn } from "./migrations/20241108200154_add_should_seed_colum";
|
||||||
|
import { AddSeedAfterDownloadColumn } from "./migrations/20241108201806_add_seed_after_download";
|
||||||
|
import { AddHiddenAchievementDescriptionColumn } from "./migrations/20241216140633_add_hidden_achievement_description_column ";
|
||||||
|
import { AddLaunchOptionsColumnToGame } from "./migrations/20241226044022_add_launch_options_column_to_game";
|
||||||
|
|
||||||
export type HydraMigration = Knex.Migration & { name: string };
|
export type HydraMigration = Knex.Migration & { name: string };
|
||||||
|
|
||||||
class MigrationSource implements Knex.MigrationSource<HydraMigration> {
|
class MigrationSource implements Knex.MigrationSource<HydraMigration> {
|
||||||
@ -30,6 +35,10 @@ class MigrationSource implements Knex.MigrationSource<HydraMigration> {
|
|||||||
AddWinePrefixToGame,
|
AddWinePrefixToGame,
|
||||||
AddStartMinimizedColumn,
|
AddStartMinimizedColumn,
|
||||||
AddDisableNsfwAlertColumn,
|
AddDisableNsfwAlertColumn,
|
||||||
|
AddShouldSeedColumn,
|
||||||
|
AddSeedAfterDownloadColumn,
|
||||||
|
AddHiddenAchievementDescriptionColumn,
|
||||||
|
AddLaunchOptionsColumnToGame,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
getMigrationName(migration: HydraMigration): string {
|
getMigrationName(migration: HydraMigration): string {
|
||||||
|
@ -1,21 +1,22 @@
|
|||||||
import {
|
import { DownloadManager, Ludusavi, startMainLoop } from "./services";
|
||||||
DownloadManager,
|
|
||||||
Ludusavi,
|
|
||||||
PythonInstance,
|
|
||||||
startMainLoop,
|
|
||||||
} from "./services";
|
|
||||||
import {
|
import {
|
||||||
downloadQueueRepository,
|
downloadQueueRepository,
|
||||||
|
gameRepository,
|
||||||
userPreferencesRepository,
|
userPreferencesRepository,
|
||||||
} from "./repository";
|
} from "./repository";
|
||||||
import { UserPreferences } from "./entity";
|
import { UserPreferences } from "./entity";
|
||||||
import { RealDebridClient } from "./services/real-debrid";
|
import { RealDebridClient } from "./services/download/real-debrid";
|
||||||
import { HydraApi } from "./services/hydra-api";
|
import { HydraApi } from "./services/hydra-api";
|
||||||
import { uploadGamesBatch } from "./services/library-sync";
|
import { uploadGamesBatch } from "./services/library-sync";
|
||||||
|
import { Aria2 } from "./services/aria2";
|
||||||
|
import { Downloader } from "@shared";
|
||||||
|
import { IsNull, Not } from "typeorm";
|
||||||
|
|
||||||
const loadState = async (userPreferences: UserPreferences | null) => {
|
const loadState = async (userPreferences: UserPreferences | null) => {
|
||||||
import("./events");
|
import("./events");
|
||||||
|
|
||||||
|
Aria2.spawn();
|
||||||
|
|
||||||
if (userPreferences?.realDebridApiToken) {
|
if (userPreferences?.realDebridApiToken) {
|
||||||
RealDebridClient.authorize(userPreferences?.realDebridApiToken);
|
RealDebridClient.authorize(userPreferences?.realDebridApiToken);
|
||||||
}
|
}
|
||||||
@ -35,11 +36,16 @@ const loadState = async (userPreferences: UserPreferences | null) => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
if (nextQueueItem?.game.status === "active") {
|
const seedList = await gameRepository.find({
|
||||||
DownloadManager.startDownload(nextQueueItem.game);
|
where: {
|
||||||
} else {
|
shouldSeed: true,
|
||||||
PythonInstance.spawn();
|
downloader: Downloader.Torrent,
|
||||||
}
|
progress: 1,
|
||||||
|
uri: Not(IsNull()),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
await DownloadManager.startRPC(nextQueueItem?.game, seedList);
|
||||||
|
|
||||||
startMainLoop();
|
startMainLoop();
|
||||||
};
|
};
|
||||||
|