Compare commits

..

No commits in common. "main" and "v3.0.8" have entirely different histories.
main ... v3.0.8

483 changed files with 10291 additions and 18532 deletions

View file

@ -1,2 +1,3 @@
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

View file

@ -3,4 +3,3 @@ dist
out out
.gitignore .gitignore
migration.stub migration.stub
hydra-python-rpc/

View file

@ -26,9 +26,4 @@ module.exports = {
}, },
], ],
}, },
settings: {
react: {
version: "detect",
},
},
}; };

View file

@ -1,11 +1,10 @@
name: Build name: Build
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on: pull_request on: pull_request
env:
AWS_REGION: us-east-1
jobs: jobs:
build: build:
strategy: strategy:
@ -35,7 +34,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 python_rpc/setup.py build run: python torrent-client/setup.py build
- name: Build Linux - name: Build Linux
if: matrix.os == 'ubuntu-latest' if: matrix.os == 'ubuntu-latest'
@ -47,12 +46,10 @@ 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.EXTERNAL_RESOURCES_URL }} RENDERER_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.RENDERER_VITE_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'
@ -61,25 +58,10 @@ 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.EXTERNAL_RESOURCES_URL }} RENDERER_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.RENDERER_VITE_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

View file

@ -1,9 +1,5 @@
name: Lint name: Lint
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on: pull_request on: pull_request
jobs: jobs:

View file

@ -1,9 +1,5 @@
name: Release name: Release
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on: on:
push: push:
branches: main branches: main
@ -37,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 python_rpc/setup.py build run: python torrent-client/setup.py build
- name: Build Linux - name: Build Linux
if: matrix.os == 'ubuntu-latest' if: matrix.os == 'ubuntu-latest'
@ -51,12 +47,8 @@ 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.EXTERNAL_RESOURCES_URL }} RENDERER_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.RENDERER_VITE_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
@ -66,12 +58,8 @@ 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.EXTERNAL_RESOURCES_URL }} RENDERER_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.RENDERER_VITE_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:

10
.gitignore vendored
View file

@ -1,5 +1,7 @@
.vscode/ .vscode/
node_modules/ node_modules/
hydra-download-manager/
fastlist.exe
__pycache__ __pycache__
dist dist
out out
@ -8,11 +10,3 @@ out
.env .env
.vite .vite
ludusavi/ ludusavi/
hydra-python-rpc/
aria2/
.python-version
# Sentry Config File
.env.sentry-build-plugin
*storybook.log

View file

@ -2,7 +2,7 @@
<div align="center"> <div align="center">
[<img src="./resources/icon.png" width="144"/>](https://help.hydralauncher.gg) [<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<h1 align="center">Hydra Launcher</h1> <h1 align="center">Hydra Launcher</h1>
@ -125,10 +125,6 @@ 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/).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 188 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 188 KiB

Before After
Before After

View file

@ -1,5 +1,7 @@
!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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 604 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Before After
Before After

View file

@ -2,7 +2,7 @@
<div align="center"> <div align="center">
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg) [<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<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>

View file

@ -2,7 +2,7 @@
<div align="center"> <div align="center">
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg) [<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<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>

View file

@ -2,7 +2,7 @@
<div align="center"> <div align="center">
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg) [<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<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>

View file

@ -2,7 +2,7 @@
<div align="center"> <div align="center">
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg) [<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<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>

View file

@ -2,7 +2,7 @@
<div align="center"> <div align="center">
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg) [<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<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>

View file

@ -1,6 +1,6 @@
<div align="center"> <div align="center">
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg) [<img src="../resources/icon.png" width="144"/>](https://hydralauncher.site)
<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>

View file

@ -2,7 +2,7 @@
<div align="center"> <div align="center">
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg) [<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<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>

View file

@ -2,7 +2,7 @@
<div align="center"> <div align="center">
[<img src="./resources/icon.png" width="144"/>](https://help.hydralauncher.gg) [<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<h1 align="center">Hydra Launcher</h1> <h1 align="center">Hydra Launcher</h1>

View file

@ -2,7 +2,7 @@
<div align="center"> <div align="center">
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg) [<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<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>

View file

@ -2,7 +2,7 @@
<div align="center"> <div align="center">
[<img src="./resources/icon.png" width="144"/>](https://help.hydralauncher.gg) [<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<h1 align="center">Hydra Launcher</h1> <h1 align="center">Hydra Launcher</h1>

View file

@ -2,7 +2,7 @@
<div align="center"> <div align="center">
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg) [<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<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)
@ -125,10 +125,6 @@ cd hydra
yarn yarn
``` ```
### <a name="install-openssl-11"></a> Instale OpenSSL 1.1
[OpenSSL 1.1](https://slproweb.com/download/Win64OpenSSL-1_1_1w.exe) é exigido pelo libtorrent em ambientes Windows.
### <a name="install-python-39"></a> Instale Python 3.9 ### <a name="install-python-39"></a> Instale Python 3.9
Certifique-se de ter o Python 3.9 instalado em sua máquina. Você pode baixá-lo e instalá-lo em [python.org](https://www.python.org/downloads/release/python-3913/). Certifique-se de ter o Python 3.9 instalado em sua máquina. Você pode baixá-lo e instalá-lo em [python.org](https://www.python.org/downloads/release/python-3913/).

View file

@ -2,7 +2,7 @@
<div align="center"> <div align="center">
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg) [<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<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)

View file

@ -2,7 +2,7 @@
<div align="center"> <div align="center">
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg) [<img src="./resources/icon.png" width="144"/>](https://hydralauncher.site)
<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>

View file

@ -3,9 +3,8 @@ productName: Hydra
directories: directories:
buildResources: build buildResources: build
extraResources: extraResources:
- aria2
- ludusavi - ludusavi
- hydra-python-rpc - hydra-download-manager
- 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

View file

@ -6,8 +6,8 @@ import {
externalizeDepsPlugin, externalizeDepsPlugin,
} from "electron-vite"; } from "electron-vite";
import react from "@vitejs/plugin-react"; import react from "@vitejs/plugin-react";
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);
@ -37,13 +37,6 @@ export default defineConfig(({ mode }) => {
build: { build: {
sourcemap: true, sourcemap: true,
}, },
css: {
preprocessorOptions: {
scss: {
api: "modern",
},
},
},
resolve: { resolve: {
alias: { alias: {
"@renderer": resolve("src/renderer/src"), "@renderer": resolve("src/renderer/src"),
@ -51,15 +44,7 @@ export default defineConfig(({ mode }) => {
"@shared": resolve("src/shared"), "@shared": resolve("src/shared"),
}, },
}, },
plugins: [ plugins: [svgr(), react(), vanillaExtractPlugin()],
svgr(),
react(),
sentryVitePlugin({
authToken: process.env.SENTRY_AUTH_TOKEN,
org: "hydra-launcher",
project: "hydra-renderer",
}),
],
}, },
}; };
}); });

View file

@ -1,6 +1,6 @@
{ {
"name": "hydralauncher", "name": "hydralauncher",
"version": "3.2.3", "version": "3.0.8",
"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 ./scripts/postinstall.cjs", "postinstall": "electron-builder install-app-deps && node ./postinstall.cjs",
"build:unpack": "npm run build && electron-builder --dir", "build:unpack": "npm run build && electron-builder --dir",
"build:win": "electron-vite build && electron-builder --win", "build:win": "electron-vite build && electron-builder --win",
"build:mac": "electron-vite build && electron-builder --mac", "build:mac": "electron-vite build && electron-builder --mac",
@ -34,64 +34,61 @@
"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.1.0", "@fontsource/noto-sans": "^5.0.22",
"@hookform/resolvers": "^3.9.1", "@hookform/resolvers": "^3.9.0",
"@monaco-editor/react": "^4.6.0",
"@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", "@vanilla-extract/css": "^1.14.2",
"@sentry/vite-plugin": "^2.22.7", "@vanilla-extract/dynamic": "^2.1.1",
"@vanilla-extract/recipes": "^0.5.2",
"auto-launch": "^5.0.6", "auto-launch": "^5.0.6",
"axios": "^1.7.9", "axios": "^1.7.7",
"better-sqlite3": "^11.7.0", "better-sqlite3": "^11.3.0",
"classic-level": "^2.0.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.10", "dexie": "^4.0.9",
"diskusage": "^1.2.0", "electron-log": "^5.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",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"kill-port": "^2.0.1",
"knex": "^3.1.0", "knex": "^3.1.0",
"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",
"react-redux": "^9.1.1", "react-redux": "^9.1.1",
"react-router-dom": "^6.22.3", "react-router-dom": "^6.22.3",
"react-tooltip": "^5.28.0",
"sound-play": "^1.1.0", "sound-play": "^1.1.0",
"sudo-prompt": "^9.2.1", "sudo-prompt": "^9.2.1",
"tar": "^7.4.3", "tar": "^7.4.3",
"user-agents": "^1.1.387", "typeorm": "^0.3.20",
"yaml": "^2.6.1", "user-agents": "^1.1.193",
"yup": "^1.5.0", "yaml": "^2.4.1",
"zod": "^3.24.1" "yup": "^1.4.0",
"zod": "^3.23.8"
}, },
"devDependencies": { "devDependencies": {
"@aws-sdk/client-s3": "^3.705.0", "@commitlint/cli": "^19.5.0",
"@commitlint/cli": "^19.6.0", "@commitlint/config-conventional": "^19.5.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",
"@swc/core": "^1.4.16", "@swc/core": "^1.4.16",
"@types/auto-launch": "^5.0.5", "@types/auto-launch": "^5.0.5",
"@types/color": "^3.0.6", "@types/color": "^3.0.6",
"@types/jsdom": "^21.1.7", "@types/folder-hash": "^4.0.4",
"@types/jsonwebtoken": "^9.0.8", "@types/jsdom": "^21.1.6",
"@types/jsonwebtoken": "^9.0.6",
"@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",
@ -99,16 +96,17 @@
"@types/react-dom": "^18.2.18", "@types/react-dom": "^18.2.18",
"@types/sound-play": "^1.1.3", "@types/sound-play": "^1.1.3",
"@types/user-agents": "^1.0.4", "@types/user-agents": "^1.0.4",
"@vanilla-extract/vite-plugin": "^4.0.7",
"@vitejs/plugin-react": "^4.2.1", "@vitejs/plugin-react": "^4.2.1",
"electron": "^31.7.7", "electron": "^30.3.0",
"electron-builder": "^25.1.8", "electron-builder": "^25.1.8",
"electron-vite": "^2.3.0", "electron-vite": "^2.0.0",
"eslint": "^8.56.0", "eslint": "^8.56.0",
"eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-jsx-a11y": "^6.8.0",
"eslint-plugin-react": "^7.37.4", "eslint-plugin-react": "^7.33.2",
"eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-hooks": "^4.6.0",
"husky": "^9.1.7", "husky": "^9.0.11",
"prettier": "^3.4.2", "prettier": "^3.2.4",
"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",

49
postinstall.cjs Normal file
View file

@ -0,0 +1,49 @@
const { default: axios } = require("axios");
const util = require("node:util");
const fs = require("node:fs");
const path = require("node:path");
const exec = util.promisify(require("node:child_process").exec);
const fileName = {
win32: "ludusavi-v0.25.0-win64.zip",
linux: "ludusavi-v0.25.0-linux.zip",
darwin: "ludusavi-v0.25.0-mac.zip",
};
const downloadLudusavi = async () => {
if (fs.existsSync("ludusavi")) {
console.log("Ludusavi already exists, skipping download...");
return;
}
const file = fileName[process.platform];
const downloadUrl = `https://github.com/mtkennerly/ludusavi/releases/download/v0.25.0/${file}`;
console.log(`Downloading ${file}...`);
const response = await axios.get(downloadUrl, { responseType: "stream" });
const stream = response.data.pipe(fs.createWriteStream(file));
stream.on("finish", async () => {
console.log(`Downloaded ${file}, extracting...`);
const pwd = process.cwd();
const targetPath = path.join(pwd, "ludusavi");
await exec(`npx extract-zip ${file} ${targetPath}`);
if (process.platform !== "win32") {
fs.chmodSync(path.join(targetPath, "ludusavi"), 0o755);
}
console.log("Extracted. Renaming folder...");
console.log(`Extracted ${file}, removing compressed downloaded file...`);
fs.rmSync(file);
});
};
downloadLudusavi();

View file

@ -1,48 +0,0 @@
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, out: str = None):
if self.download:
self.aria2.resume([self.download])
else:
downloads = self.aria2.add(url, options={"header": header, "dir": save_path, "out": out})
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

View file

@ -1,185 +0,0 @@
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'), initial_download.get("out"))
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 "ok", 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'), data.get('out'))
else:
http_downloader = HttpDownloader()
downloads[game_id] = http_downloader
http_downloader.start_download(url, data['save_path'], data.get('header'), data.get('out'))
downloading_game_id = game_id
elif action == 'pause':
downloader = downloads.get(game_id)
if downloader:
downloader.pause_download()
if downloading_game_id == game_id:
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))

View file

@ -4,5 +4,3 @@ cx_Logging; sys_platform == 'win32'
pywin32; sys_platform == 'win32' pywin32; sys_platform == 'win32'
psutil psutil
Pillow Pillow
flask
aria2p

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 188 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Before After
Before After

View file

@ -1,125 +0,0 @@
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 = () => {
const aria2Path =
process.platform === "win32" ? "aria2/aria2c.exe" : "aria2/aria2c";
if (fs.existsSync(aria2Path)) {
console.log("Aria2 already exists, skipping download...");
return;
}
if (process.platform == "darwin") {
copyAria2Macos();
} else {
downloadAria2WindowsAndLinux();
}
};
copyAria2();
downloadLudusavi();

View file

@ -1,66 +0,0 @@
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,
};
})
);
for (const upload of uploads) {
await fetch(process.env.BUILD_WEBHOOK_URL, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
upload,
branchName: process.env.BRANCH_NAME,
version: packageJson.version,
githubActor: process.env.GITHUB_ACTOR,
}),
});
}
});

File diff suppressed because one or more lines are too long

View file

@ -1,352 +1,135 @@
{ {
"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": "تحتاج مساعدة؟",
"favorites": "المفضلة"
}, },
"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": {
"search": "تصفية...", "next_page": "الصفحة التالية",
"developers": "المطورون", "previous_page": "الصفحة السابقة"
"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": "خيار تنزيل واحد", "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}}",
"calculating_eta": "جاري حساب الوقت المتبقي...",
"downloading_metadata": "جاري تنزيل البيانات الوصفية...", "downloading_metadata": "جاري تنزيل البيانات الوصفية...",
"filter": "تصفية الإصدارات المعادة", "filter": "تصفية حزم إعادة التجميع",
"requirements": "متطلبات النظام", "requirements": "متطلبات النظام",
"minimum": "الحد الأدنى", "minimum": "الحد الأدنى",
"recommended": "مستحسن", "recommended": "موصى به",
"paused": "معلق", "release_date": "تم الإصدار في {{date}}",
"release_date": "تاريخ الإصدار {{date}}",
"publisher": "نشر بواسطة {{publisher}}", "publisher": "نشر بواسطة {{publisher}}",
"hours": "ساعات", "hours": "ساعات",
"minutes": "دقائق", "minutes": "دقائق",
"amount_hours": "{{amount}} ساعة", "amount_hours": "{{amount}} ساعات",
"amount_minutes": "{{amount}} دقيقة", "amount_minutes": "{{amount}} دقائق",
"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}} بعد",
"next_suggestion": "الاقتراح التالي", "next_suggestion": "الاقتراح التالي",
"play": "تشغيل", "play": "لعب",
"deleting": "جاري حذف المثبت...", "deleting": "جاري حذف المثبت...",
"close": "إغلاق", "close": "إغلاق",
"playing_now": "جاري التشغيل الآن", "playing_now": "قيد التشغيل الآن",
"change": "تغيير", "change": "تغيير",
"repacks_modal_description": "اختر الإصدار المعاد الذي تريد تنزيله", "repacks_modal_description": "اختر الحزمة التي تريد تنزيلها",
"select_folder_hint": "لتغيير المجلد الافتراضي، انتقل إلى <0>الإعدادات</0>", "select_folder_hint": "لتغيير المجلد الافتراضي، انتقل إلى الإعدادات",
"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": "لقطة الشاشة التالية",
"screenshot": "لقطة الشاشة {{number}}", "screenshot": "لقطة شاشة {{number}}",
"open_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": "لم يتم تحديد مجلد",
"no_write_permission": "لا يمكن التنزيل إلى هذا المجلد. انقر هنا للمزيد من المعلومات.",
"reset_achievements": "إعادة تعيين الإنجازات",
"reset_achievements_description": "سيؤدي هذا إلى إعادة تعيين جميع إنجازات {{game}}",
"reset_achievements_title": "هل أنت متأكد؟",
"reset_achievements_success": "تم إعادة تعيين الإنجازات بنجاح",
"reset_achievements_error": "فشل في إعادة تعيين الإنجازات",
"download_error_gofile_quota_exceeded": "لقد تجاوزت الحصة الشهرية لـ Gofile. يرجى الانتظار حتى إعادة تعيين الحصة.",
"download_error_real_debrid_account_not_authorized": "حساب Real-Debrid الخاص بك غير مصرح له بإجراء تنزيلات جديدة. يرجى مراجعة إعدادات الحساب والمحاولة مرة أخرى.",
"download_error_not_cached_in_real_debrid": "هذا التنزيل غير متوفر على Real-Debrid وجلب حالة التنزيل من Real-Debrid غير متاح حاليًا.",
"download_error_not_cached_in_torbox": "هذا التنزيل غير متوفر على Torbox وجلب حالة التنزيل من Torbox غير متاح حاليًا.",
"game_removed_from_favorites": "تمت إزالة اللعبة من المفضلة",
"game_added_to_favorites": "تمت إضافة اللعبة إلى المفضلة"
}, },
"activation": { "activation": {
"title": "تفعيل Hydra", "title": "تفعيل هايدرا",
"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": "اكتمل",
"removed": "غير منزّل",
"cancel": "إلغاء", "cancel": "إلغاء",
"filter": "تصفية الألعاب المنزلة", "filter": "تصفية الألعاب التي تم تنزيلها",
"remove": "إزالة", "remove": "إزالة",
"downloading_metadata": "جاري تنزيل البيانات الوصفية...", "downloading_metadata": "جار تنزيل البيانات الوصفية…",
"deleting": "جاري حذف المثبت...", "deleting": "جار حذف المثبت…",
"delete": "حذف المثبت", "delete": "إزالة المثبت",
"delete_modal_title": "هل أنت متأكد؟", "delete_modal_title": "هل أنت متأكد؟",
"delete_modal_description": "سيؤدي هذا إلى إزالة جميع ملفات التثبيت من جهازك", "delete_modal_description": "سيؤدي هذا إلى إزالة جميع ملفات التثبيت من جهاز الكمبيوتر الخاص بك",
"install": "تثبيت", "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": "رمز Real-Debrid API", "real_debrid_api_token_label": "رمز واجهة برمجة التطبيقات (API) لـReal-Debrid ",
"quit_app_instead_hiding": "لا تخفي Hydra عند الإغلاق", "quit_app_instead_hiding": "إنهاء هايدرا بدلاً من التصغير الى شريط الحالة",
"launch_with_system": "تشغيل Hydra مع بدء النظام", "launch_with_system": "تشغيل هايدرا عند بدء تشغيل النظام",
"general": "عام", "general": "عام",
"behavior": "السلوك", "behavior": "السلوك",
"download_sources": "مصادر التنزيل", "enable_real_debrid": "تفعيل Real-Debrid ",
"language": "اللغة", "real_debrid_api_token_hint": "يمكنك الحصول على مفتاح API الخاص بك هنا",
"api_token": "رمز API", "save_changes": "حفظ التغييرات"
"enable_real_debrid": "تفعيل Real-Debrid",
"real_debrid_description": "Real-Debrid هو أداة تنزيل غير مقيدة تتيح لك تنزيل الملفات بسرعة، محدودة فقط بسرعة اتصالك بالإنترنت.",
"debrid_invalid_token": "رمز API غير صالح",
"debrid_api_token_hint": "يمكنك الحصول على رمز API الخاص بك <0>هنا</0>",
"real_debrid_free_account_error": "الحساب \"{{username}}\" حساب مجاني. يرجى الاشتراك في Real-Debrid",
"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": "عرض وصف الإنجازات المخفية قبل فتحها",
"account": "الحساب",
"no_users_blocked": "لا يوجد مستخدمون محظورون",
"subscription_active_until": "اشتراك Hydra Cloud نشط حتى {{date}}",
"manage_subscription": "إدارة الاشتراك",
"update_email": "تحديث البريد الإلكتروني",
"update_password": "تحديث كلمة المرور",
"current_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": "سيتم إرسال فاتورتك القادمة حتى هذا اليوم",
"no_themes": "يبدو أنه ليس لديك أي سمات بعد، لكن لا تقلق، انقر هنا لإنشاء أول تحفة فنية لك.",
"editor_tab_code": "الكود",
"editor_tab_info": "معلومات",
"editor_tab_save": "حفظ",
"web_store": "المتجر الإلكتروني",
"clear_themes": "مسح",
"create_theme": "إنشاء",
"create_theme_modal_title": "إنشاء سمة مخصصة",
"create_theme_modal_description": "إنشاء سمة جديدة لتخصيص مظهر Hydra",
"theme_name": "الاسم",
"insert_theme_name": "أدخل اسم السمة",
"set_theme": "تعيين السمة",
"unset_theme": "إلغاء تعيين السمة",
"delete_theme": "حذف السمة",
"edit_theme": "تعديل السمة",
"delete_all_themes": "حذف جميع السمات",
"delete_all_themes_description": "سيؤدي هذا إلى حذف جميع السمات المخصصة الخاصة بك",
"delete_theme_description": "سيؤدي هذا إلى حذف السمة {{theme}}",
"cancel": "إلغاء",
"appearance": "المظهر",
"enable_torbox": "تفعيل Torbox",
"torbox_description": "TorBox هي خدمة seedbox متميزة تنافس أفضل الخوادم في السوق.",
"torbox_account_linked": "تم ربط حساب TorBox",
"real_debrid_account_linked": "تم ربط حساب Real-Debrid",
"name_min_length": "يجب أن يكون اسم السمة على الأقل 3 أحرف",
"import_theme": "استيراد سمة",
"import_theme_description": "ستقوم باستيراد {{theme}} من متجر السمات",
"error_importing_theme": "خطأ في استيراد السمة",
"theme_imported": "تم استيراد السمة بنجاح"
}, },
"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": "فتح Hydra", "open": "فتح هايدرا",
"quit": "خروج" "quit": "خروج"
}, },
"game_card": { "game_card": {
@ -354,122 +137,10 @@
}, },
"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": "معرفة المزيد"
} }
} }

View file

@ -14,10 +14,8 @@
"paused": "{{title}} (Спынена)", "paused": "{{title}} (Спынена)",
"downloading": "{{title}} ({{percentage}} - Сцягванне…)", "downloading": "{{title}} ({{percentage}} - Сцягванне…)",
"filter": "Фільтар бібліятэкі", "filter": "Фільтар бібліятэкі",
"home": "Галоўная", "home": "Галоўная"
"favorites": "Улюбленыя"
}, },
"header": { "header": {
"search": "Пошук", "search": "Пошук",
"home": "Галоўная", "home": "Галоўная",

View file

@ -26,8 +26,7 @@
"game_has_no_executable": "Играта няма избран изпълним файл", "game_has_no_executable": "Играта няма избран изпълним файл",
"sign_in": "Вписване", "sign_in": "Вписване",
"friends": "Приятели", "friends": "Приятели",
"need_help": "Имате нужда от помощ??", "need_help": "Имате нужда от помощ??"
"favorites": "Любими игри"
}, },
"header": { "header": {
"search": "Търсене", "search": "Търсене",
@ -47,20 +46,10 @@
"checking_files": "Проверка на {{title}} файловете… ({{percentage}} готово)" "checking_files": "Проверка на {{title}} файловете… ({{percentage}} готово)"
}, },
"catalogue": { "catalogue": {
"search": "Филтър…", "next_page": "Следваща страница",
"developers": "Разработчици", "previous_page": "Предишна страница"
"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}} варианти за изтегляне",
@ -188,10 +177,6 @@
"loading": "Зареждане…" "loading": "Зареждане…"
}, },
"downloads": { "downloads": {
"seeding": "Сийдване",
"stop_seeding": "Спри сийдването",
"resume_seeding": "Продължи сийдването",
"options": "Управление",
"resume": "Продължи", "resume": "Продължи",
"pause": "Пауза", "pause": "Пауза",
"eta": "Conclusion {{eta}}", "eta": "Conclusion {{eta}}",
@ -217,8 +202,6 @@
"checking_files": "Проверка на файлове…" "checking_files": "Проверка на файлове…"
}, },
"settings": { "settings": {
"seed_after_download_complete": "Сийд след завършване на изтеглянето",
"show_hidden_achievement_description": "Показвай описанието на скритите постижения преди отключването им",
"downloads_path": "Инсталационен път", "downloads_path": "Инсталационен път",
"change": "Актуализиране", "change": "Актуализиране",
"notifications": "Известия", "notifications": "Известия",
@ -227,17 +210,17 @@
"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": "Език",
"api_token": "API Токен", "real_debrid_api_token": "API Токен",
"enable_real_debrid": "Включи Real-Debrid", "enable_real_debrid": "Включи Real-Debrid",
"real_debrid_description": "Real-Debrid е неограничен даунлоудър, който ви позволява бързо да изтегляте файлове, ограничени само от скоростта на интернет..", "real_debrid_description": "Real-Debrid е неограничен даунлоудър, който ви позволява бързо да изтегляте файлове, ограничени само от скоростта на интернет..",
"debrid_invalid_token": "Невалиден API токен", "real_debrid_invalid_token": "Невалиден API токен",
"debrid_api_token_hint": "Вземете своя API токен <0>тук</0>", "real_debrid_api_token_hint": "Вземете своя API токен <0>тук</0>",
"real_debrid_free_account_error": "Акаунтът \"{{username}}\" е безплатен акаунт. Моля абонирай се за Real-Debrid", "real_debrid_free_account_error": "Акаунтът \"{{username}}\" е безплатен акаунт. Моля абонирай се за Real-Debrid",
"debrid_linked_message": "Акаунтът \"{{username}}\" е свързан", "real_debrid_linked_message": "Акаунтът \"{{username}}\" е свързан",
"save_changes": "Запази промените", "save_changes": "Запази промените",
"changes_saved": "Промените са успешно запазни", "changes_saved": "Промените са успешно запазни",
"download_sources_description": "Hydra ще извлича връзките за изтегляне от тези източници. URL адресът на източника трябва да е директна връзка към .json файл, съдържащ връзките за изтегляне.", "download_sources_description": "Hydra ще извлича връзките за изтегляне от тези източници. URL адресът на източника трябва да е директна връзка към .json файл, съдържащ връзките за изтегляне.",
@ -305,22 +288,12 @@
"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": "Общо време за игра", "total_play_time": "Общо време за игра: {{amount}}",
"no_recent_activity_title": "Хмм… няма нищо тук", "no_recent_activity_title": "Хмм… няма нищо тук",
"no_recent_activity_description": "Не сте играли игри напоследък. Време е да промените това.!", "no_recent_activity_description": "Не сте играли игри напоследък. Време е да промените това.!",
"display_name": "Показване на името", "display_name": "Показване на името",
@ -386,24 +359,16 @@
"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": "Отключено на: {{date}}", "unlocked_at": "Отключено на:",
"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}}"
}, },
"hydra_cloud": { "tour": {
"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": "Запазване в облака",

View file

@ -20,12 +20,10 @@
"home": "Inici", "home": "Inici",
"queued": "{{title}} (En espera)", "queued": "{{title}} (En espera)",
"game_has_no_executable": "El joc encara no té un executable seleccionat", "game_has_no_executable": "El joc encara no té un executable seleccionat",
"sign_in": "Entra", "sign_in": "Entra"
"favorites": "Favorits"
}, },
"header": { "header": {
"search": "Cerca jocs", "search": "Cerca jocs",
"home": "Inici", "home": "Inici",
"catalogue": "Catàleg", "catalogue": "Catàleg",
"downloads": "Baixades", "downloads": "Baixades",
@ -163,13 +161,13 @@
"behavior": "Comportament", "behavior": "Comportament",
"download_sources": "Fonts de descàrrega", "download_sources": "Fonts de descàrrega",
"language": "Idioma", "language": "Idioma",
"api_token": "Testimoni API", "real_debrid_api_token": "Testimoni API",
"enable_real_debrid": "Activa el Real Debrid", "enable_real_debrid": "Activa el Real Debrid",
"real_debrid_description": "Real-Debrid és un programa de descàrrega sense restriccions que us permet descarregar fitxers a l'instant i al màxim de la vostra velocitat d'Internet.", "real_debrid_description": "Real-Debrid és un programa de descàrrega sense restriccions que us permet descarregar fitxers a l'instant i al màxim de la vostra velocitat d'Internet.",
"debrid_invalid_token": "Invalida el testimoni de l'API", "real_debrid_invalid_token": "Invalida el testimoni de l'API",
"debrid_api_token_hint": "Pots obtenir la teva clau de l'API <0>aquí</0>.", "real_debrid_api_token_hint": "Pots obtenir la teva clau de l'API <0>aquí</0>.",
"real_debrid_free_account_error": "L'usuari \"{{username}}\" és un compte gratuït. Si us plau subscriu-te a Real-Debrid", "real_debrid_free_account_error": "L'usuari \"{{username}}\" és un compte gratuït. Si us plau subscriu-te a Real-Debrid",
"debrid_linked_message": "Compte \"{{username}}\" vinculat", "real_debrid_linked_message": "Compte \"{{username}}\" vinculat",
"save_changes": "Desa els canvis", "save_changes": "Desa els canvis",
"changes_saved": "Els canvis s'han desat correctament", "changes_saved": "Els canvis s'han desat correctament",
"download_sources_description": "Hydra buscarà els enllaços de descàrrega d'aquestes fonts. L'URL d'origen ha de ser un enllaç directe a un fitxer .json que contingui els enllaços de descàrrega.", "download_sources_description": "Hydra buscarà els enllaços de descàrrega d'aquestes fonts. L'URL d'origen ha de ser un enllaç directe a un fitxer .json que contingui els enllaços de descàrrega.",
@ -226,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", "total_play_time": "Temps total de joc:{{amount}}",
"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ó",

View file

@ -26,8 +26,7 @@
"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é", "friends": "Přátelé",
"need_help": "Potřebujete pomoc?", "need_help": "Potřebujete pomoc?"
"favorites": "Oblíbené"
}, },
"header": { "header": {
"search": "Vyhledat hry", "search": "Vyhledat hry",
@ -215,13 +214,13 @@
"behavior": "Chování", "behavior": "Chování",
"download_sources": "Zdroje stahování", "download_sources": "Zdroje stahování",
"language": "Jazyk", "language": "Jazyk",
"api_token": "API Token", "real_debrid_api_token": "API Token",
"enable_real_debrid": "Povolit Real-Debrid", "enable_real_debrid": "Povolit Real-Debrid",
"real_debrid_description": "Real-Debrid je neomezený správce stahování, který umožňuje stahovat soubory v nejvyšší rychlosti vašeho internetu.", "real_debrid_description": "Real-Debrid je neomezený správce stahování, který umožňuje stahovat soubory v nejvyšší rychlosti vašeho internetu.",
"debrid_invalid_token": "Neplatný API token", "real_debrid_invalid_token": "Neplatný API token",
"debrid_api_token_hint": "API token můžeš sehnat <0>zde</0>", "real_debrid_api_token_hint": "API token můžeš sehnat <0>zde</0>",
"real_debrid_free_account_error": "Účet \"{{username}}\" má základní úroveň. Prosím předplaťte si Real-Debrid", "real_debrid_free_account_error": "Účet \"{{username}}\" má základní úroveň. Prosím předplaťte si Real-Debrid",
"debrid_linked_message": "Účet \"{{username}}\" je propojen", "real_debrid_linked_message": "Účet \"{{username}}\" je propojen",
"save_changes": "Uložit změny", "save_changes": "Uložit změny",
"changes_saved": "Změny úspěšně uloženy", "changes_saved": "Změny úspěšně uloženy",
"download_sources_description": "Hydra bude odsud sbírat soubory. Zdrojový odkaz musí být .json soubor obsahující odkazy na soubory.", "download_sources_description": "Hydra bude odsud sbírat soubory. Zdrojový odkaz musí být .json soubor obsahující odkazy na soubory.",
@ -294,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", "total_play_time": "Celkový odehraný čas: {{amount}}",
"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",
@ -363,13 +362,13 @@
"achievement_unlocked": "Achievement odemčen", "achievement_unlocked": "Achievement odemčen",
"user_achievements": "Achievementy uživatele {{displayName}}", "user_achievements": "Achievementy uživatele {{displayName}}",
"your_achievements": "Vaše achievementy", "your_achievements": "Vaše achievementy",
"unlocked_at": "Odemčeno: {{date}}", "unlocked_at": "Odemčeno:",
"subscription_needed": "Je vyžadováno předplatné Hydra Cloud pro zobrazení tohoto obsahu", "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", "new_achievements_unlocked": "Odemčeno {{achievementCount}} nových achievementů z {{gameCount}} her",
"achievement_progress": "{{unlockedCount}}/{{totalCount}} achievementů", "achievement_progress": "{{unlockedCount}}/{{totalCount}} achievementů",
"achievements_unlocked_for_game": "Odemčeno {{achievementCount}} nových achievementů pro {{gameTitle}}" "achievements_unlocked_for_game": "Odemčeno {{achievementCount}} nových achievementů pro {{gameTitle}}"
}, },
"hydra_cloud": { "tour": {
"subscription_tour_title": "Předplatné Hydra Cloud", "subscription_tour_title": "Předplatné Hydra Cloud",
"subscribe_now": "Připojit se", "subscribe_now": "Připojit se",
"cloud_saving": "Ukládání v cloudu", "cloud_saving": "Ukládání v cloudu",

View file

@ -24,12 +24,10 @@
"queued": "{{title}} (I køen)", "queued": "{{title}} (I køen)",
"game_has_no_executable": "Spillet har ikke nogen eksekverbar fil valgt", "game_has_no_executable": "Spillet har ikke nogen eksekverbar fil valgt",
"sign_in": "Log ind", "sign_in": "Log ind",
"friends": "Venner", "friends": "Venner"
"favorites": "Favoritter"
}, },
"header": { "header": {
"search": "Søg efter spil", "search": "Søg efter spil",
"home": "Hjem", "home": "Hjem",
"catalogue": "Katalog", "catalogue": "Katalog",
"downloads": "Downloads", "downloads": "Downloads",
@ -179,13 +177,13 @@
"behavior": "Opførsel", "behavior": "Opførsel",
"download_sources": "Download kilder", "download_sources": "Download kilder",
"language": "Sprog", "language": "Sprog",
"api_token": "API nøgle", "real_debrid_api_token": "API nøgle",
"enable_real_debrid": "Slå Real-Debrid til", "enable_real_debrid": "Slå Real-Debrid til",
"real_debrid_description": "Real-Debrid er en ubegrænset downloader der gør det muligt for dig at downloade filer med det samme og med den bedste udnyttelse af din internet hastighed.", "real_debrid_description": "Real-Debrid er en ubegrænset downloader der gør det muligt for dig at downloade filer med det samme og med den bedste udnyttelse af din internet hastighed.",
"debrid_invalid_token": "Ugyldig API nøgle", "real_debrid_invalid_token": "Ugyldig API nøgle",
"debrid_api_token_hint": "Du kan få din API nøgle <0>her</0>", "real_debrid_api_token_hint": "Du kan få din API nøgle <0>her</0>",
"real_debrid_free_account_error": "Brugeren \"{{username}}\" er en gratis bruger. Venligst abbonér på Real-Debrid", "real_debrid_free_account_error": "Brugeren \"{{username}}\" er en gratis bruger. Venligst abbonér på Real-Debrid",
"debrid_linked_message": "Brugeren \"{{username}}\" er forbundet", "real_debrid_linked_message": "Brugeren \"{{username}}\" er forbundet",
"save_changes": "Gem ændringer", "save_changes": "Gem ændringer",
"changes_saved": "Ændringer gemt successfuldt", "changes_saved": "Ændringer gemt successfuldt",
"download_sources_description": "Hydra vil hente download links fra disse kilder. Kilde URLen skal være et direkte link til en .json fil der indeholder download linkene.", "download_sources_description": "Hydra vil hente download links fra disse kilder. Kilde URLen skal være et direkte link til en .json fil der indeholder download linkene.",
@ -253,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", "total_play_time": "Samlet spiltid: {{amount}}",
"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",

View file

@ -20,12 +20,10 @@
"home": "Home", "home": "Home",
"queued": "{{title}} (In Warteschlange)", "queued": "{{title}} (In Warteschlange)",
"game_has_no_executable": "Spiel hat keine ausführbare Datei gewählt", "game_has_no_executable": "Spiel hat keine ausführbare Datei gewählt",
"sign_in": "Anmelden", "sign_in": "Anmelden"
"favorites": "Favoriten"
}, },
"header": { "header": {
"search": "Spiele suchen", "search": "Spiele suchen",
"home": "Home", "home": "Home",
"catalogue": "Katalog", "catalogue": "Katalog",
"downloads": "Downloads", "downloads": "Downloads",
@ -163,13 +161,13 @@
"behavior": "Verhalten", "behavior": "Verhalten",
"download_sources": "Download-Quellen", "download_sources": "Download-Quellen",
"language": "Sprache", "language": "Sprache",
"api_token": "API Token", "real_debrid_api_token": "API Token",
"enable_real_debrid": "Real-Debrid aktivieren", "enable_real_debrid": "Real-Debrid aktivieren",
"real_debrid_description": "Real-Debrid ist ein unrestriktiver Downloader, der es dir ermöglicht Dateien sofort und mit deiner maximalen Internetgeschwindigkeit herunterzuladen.", "real_debrid_description": "Real-Debrid ist ein unrestriktiver Downloader, der es dir ermöglicht Dateien sofort und mit deiner maximalen Internetgeschwindigkeit herunterzuladen.",
"debrid_invalid_token": "API token nicht gültig", "real_debrid_invalid_token": "API token nicht gültig",
"debrid_api_token_hint": "<0>Hier</0> kannst du dir deinen API Token holen", "real_debrid_api_token_hint": "<0>Hier</0> kannst du dir deinen API Token holen",
"real_debrid_free_account_error": "Das Konto \"{{username}}\" ist ein gratis account. Bitte abonniere Real-Debrid", "real_debrid_free_account_error": "Das Konto \"{{username}}\" ist ein gratis account. Bitte abonniere Real-Debrid",
"debrid_linked_message": "Konto \"{{username}}\" verknüpft", "real_debrid_linked_message": "Konto \"{{username}}\" verknüpft",
"save_changes": "Änderungen speichern", "save_changes": "Änderungen speichern",
"changes_saved": "Änderungen erfolgreich gespeichert", "changes_saved": "Änderungen erfolgreich gespeichert",
"download_sources_description": "Hydra wird die Download-Links von diesen Quellen abrufen. Die Quell-URL muss ein direkter Link zu einer .json Datei, welche die Download-Links enthält, sein.", "download_sources_description": "Hydra wird die Download-Links von diesen Quellen abrufen. Die Quell-URL muss ein direkter Link zu einer .json Datei, welche die Download-Links enthält, sein.",
@ -226,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", "total_play_time": "Gesamtspielzeit: {{amount}}",
"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",

View file

@ -26,8 +26,7 @@
"game_has_no_executable": "Game has no executable selected", "game_has_no_executable": "Game has no executable selected",
"sign_in": "Sign in", "sign_in": "Sign in",
"friends": "Friends", "friends": "Friends",
"need_help": "Need help?", "need_help": "Need help?"
"favorites": "Favorites"
}, },
"header": { "header": {
"search": "Search games", "search": "Search games",
@ -47,15 +46,8 @@
"checking_files": "Checking {{title}} files… ({{percentage}} complete)" "checking_files": "Checking {{title}} files… ({{percentage}} complete)"
}, },
"catalogue": { "catalogue": {
"search": "Filter…", "next_page": "Next page",
"developers": "Developers", "previous_page": "Previous page"
"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",
@ -168,30 +160,15 @@
"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": "See how to synchronize your achievements", "achievements_not_sync": "Your achievements are not synchronized",
"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_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",
"download_error_gofile_quota_exceeded": "You have exceeded your Gofile monthly quota. Please await the quota to reset.",
"download_error_real_debrid_account_not_authorized": "Your Real-Debrid account is not authorized to make new downloads. Please check your account settings and try again.",
"download_error_not_cached_in_real_debrid": "This download is not available on Real-Debrid and polling download status from Real-Debrid is not yet available.",
"download_error_not_cached_in_torbox": "This download is not available on Torbox and polling download status from Torbox is not yet available.",
"game_removed_from_favorites": "Game removed from favorites",
"game_added_to_favorites": "Game added to favorites"
}, },
"activation": { "activation": {
"title": "Activate Hydra", "title": "Activate Hydra",
@ -224,11 +201,7 @@
"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",
@ -243,13 +216,13 @@
"behavior": "Behavior", "behavior": "Behavior",
"download_sources": "Download sources", "download_sources": "Download sources",
"language": "Language", "language": "Language",
"api_token": "API Token", "real_debrid_api_token": "API Token",
"enable_real_debrid": "Enable Real-Debrid", "enable_real_debrid": "Enable Real-Debrid",
"real_debrid_description": "Real-Debrid is an unrestricted downloader that allows you to quickly download files, only limited by your internet speed.", "real_debrid_description": "Real-Debrid is an unrestricted downloader that allows you to quickly download files, only limited by your internet speed.",
"debrid_invalid_token": "Invalid API token", "real_debrid_invalid_token": "Invalid API token",
"debrid_api_token_hint": "You can get your API token <0>here</0>", "real_debrid_api_token_hint": "You can get your API token <0>here</0>",
"real_debrid_free_account_error": "The account \"{{username}}\" is a free account. Please subscribe to Real-Debrid", "real_debrid_free_account_error": "The account \"{{username}}\" is a free account. Please subscribe to Real-Debrid",
"debrid_linked_message": "Account \"{{username}}\" linked", "real_debrid_linked_message": "Account \"{{username}}\" linked",
"save_changes": "Save changes", "save_changes": "Save changes",
"changes_saved": "Changes successfully saved", "changes_saved": "Changes successfully saved",
"download_sources_description": "Hydra will fetch the download links from these sources. The source URL must be a direct link to a .json file containing the download links.", "download_sources_description": "Hydra will fetch the download links from these sources. The source URL must be a direct link to a .json file containing the download links.",
@ -285,54 +258,7 @@
"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",
"no_themes": "Seems like you don't have any themes yet, but no worries, click here to create your first masterpiece.",
"editor_tab_code": "Code",
"editor_tab_info": "Info",
"editor_tab_save": "Save",
"web_store": "Web store",
"clear_themes": "Clear",
"create_theme": "Create",
"create_theme_modal_title": "Create custom theme",
"create_theme_modal_description": "Create a new theme to customize Hydra's appearance",
"theme_name": "Name",
"insert_theme_name": "Insert theme name",
"set_theme": "Set theme",
"unset_theme": "Unset theme",
"delete_theme": "Delete theme",
"edit_theme": "Edit theme",
"delete_all_themes": "Delete all themes",
"delete_all_themes_description": "This will delete all your custom themes",
"delete_theme_description": "This will delete the theme {{theme}}",
"cancel": "Cancel",
"appearance": "Appearance",
"enable_torbox": "Enable Torbox",
"torbox_description": "TorBox is your premium seedbox service rivaling even the best servers on the market.",
"torbox_account_linked": "TorBox account linked",
"real_debrid_account_linked": "Real-Debrid account linked",
"name_min_length": "Theme name must be at least 3 characters long",
"import_theme": "Import theme",
"import_theme_description": "You will import {{theme}} from the theme store",
"error_importing_theme": "Error importing theme",
"theme_imported": "Theme imported successfully"
}, },
"notifications": { "notifications": {
"download_complete": "Download complete", "download_complete": "Download complete",
@ -369,7 +295,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", "total_play_time": "Total playtime: {{amount}}",
"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",
@ -432,34 +358,19 @@
"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: {{date}}", "unlocked_at": "Unlocked at:",
"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?"
}, },
"hydra_cloud": { "tour": {
"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",
@ -467,9 +378,6 @@
"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"
} }
} }

View file

@ -26,8 +26,7 @@
"game_has_no_executable": "El juego no tiene un ejecutable seleccionado", "game_has_no_executable": "El juego no tiene un ejecutable seleccionado",
"sign_in": "Iniciar sesión", "sign_in": "Iniciar sesión",
"friends": "Amigos", "friends": "Amigos",
"need_help": "¿Necesitas ayuda?", "need_help": "¿Necesitas ayuda?"
"favorites": "Favoritos"
}, },
"header": { "header": {
"search": "Buscar juegos", "search": "Buscar juegos",
@ -47,15 +46,8 @@
"checking_files": "Verificando archivos de {{title}}… ({{percentage}} completado)" "checking_files": "Verificando archivos de {{title}}… ({{percentage}} completado)"
}, },
"catalogue": { "catalogue": {
"search": "Filtrar…", "next_page": "Siguiente página",
"developers": "Desarrolladores", "previous_page": "Pagina anterior"
"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",
@ -87,7 +79,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": "Has jugado {{amount}}", "play_time": "Jugado por {{amount}}",
"last_time_played": "Jugado por última vez: {{period}}", "last_time_played": "Jugado por última vez: {{period}}",
"not_played_yet": "Aún no has jugado a {{title}}", "not_played_yet": "Aún no has jugado a {{title}}",
"next_suggestion": "Siguiente sugerencia", "next_suggestion": "Siguiente sugerencia",
@ -176,16 +168,7 @@
"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", "clear": "Limpiar",
"no_directory_selected": "No se seleccionó un directorio", "no_directory_selected": "No se seleccionó un directório"
"launch_options": "Opciones de Inicio",
"launch_options_description": "Los usuarios avanzados pueden introducir sus propias modificaciones de opciones de inicio (característica experimental)",
"launch_options_placeholder": "Sin parámetro específicado",
"no_write_permission": "No se puede descargar en este directorio. Presiona aquí para aprender más.",
"reset_achievements": "Reiniciar logros",
"reset_achievements_description": "Esto reiniciará todos los logros de {{game}}",
"reset_achievements_title": "¿Estás seguro?",
"reset_achievements_success": "Logros reiniciados exitosamente",
"reset_achievements_error": "Se produjo un error al reiniciar los logros"
}, },
"activation": { "activation": {
"title": "Activar Hydra", "title": "Activar Hydra",
@ -218,11 +201,7 @@
"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",
@ -237,13 +216,13 @@
"behavior": "Otros", "behavior": "Otros",
"download_sources": "Fuentes de descarga", "download_sources": "Fuentes de descarga",
"language": "Idioma", "language": "Idioma",
"api_token": "Token API", "real_debrid_api_token": "Token API",
"enable_real_debrid": "Activar Real-Debrid", "enable_real_debrid": "Activar Real-Debrid",
"real_debrid_description": "Real-Debrid es una forma de descargar sin restricciones archivos instantáneamente con la máxima velocidad de tu internet.", "real_debrid_description": "Real-Debrid es una forma de descargar sin restricciones archivos instantáneamente con la máxima velocidad de tu internet.",
"debrid_invalid_token": "Token de API inválido", "real_debrid_invalid_token": "Token de API inválido",
"debrid_api_token_hint": "Puedes obtener tu clave de API <0>aquí</0>", "real_debrid_api_token_hint": "Puedes obtener tu clave de API <0>aquí</0>",
"real_debrid_free_account_error": "La cuenta \"{{username}}\" es una cuenta gratuita. Por favor, suscríbete a Real-Debrid", "real_debrid_free_account_error": "La cuenta \"{{username}}\" es una cuenta gratuita. Por favor, suscríbete a Real-Debrid",
"debrid_linked_message": "Cuenta \"{{username}}\" vinculada", "real_debrid_linked_message": "Cuenta \"{{username}}\" vinculada",
"save_changes": "Guardar cambios", "save_changes": "Guardar cambios",
"changes_saved": "Ajustes guardados exitosamente", "changes_saved": "Ajustes guardados exitosamente",
"download_sources_description": "Hydra buscará los enlaces de descarga de estas fuentes. La URL de origen debe ser un enlace directo a un archivo .json que contenga los enlaces de descarga", "download_sources_description": "Hydra buscará los enlaces de descarga de estas fuentes. La URL de origen debe ser un enlace directo a un archivo .json que contenga los enlaces de descarga",
@ -279,25 +258,7 @@
"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",
"account": "Cuenta",
"account_data_updated_successfully": "Datos de la cuenta actualizados",
"bill_sent_until": "Tú próxima factura se enviará el {{date}}",
"current_email": "Correo actual:",
"manage_subscription": "Gestionar suscripción",
"no_email_account": "No has configurado un correo aún",
"no_subscription": "Disfruta Hydra de la mejor manera",
"no_users_blocked": "No tienes usuarios bloqueados",
"notifications": "Notificaciones",
"renew_subscription": "Renovar Hydra Cloud",
"subscription_active_until": "Tu Hydra Cloud está activa hasta {{date}}",
"subscription_expired_at": "Tú suscripción expiró el {{date}}",
"subscription_renew_cancelled": "Está desactivada la renovación automática",
"subscription_renews_on": "Tú suscripción se renueva el {{date}}",
"update_email": "Actualizar correo",
"update_password": "Actualizar contraseña"
}, },
"notifications": { "notifications": {
"download_complete": "Descarga completada", "download_complete": "Descarga completada",
@ -334,7 +295,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": "Has jugado", "total_play_time": "Total de tiempo jugado: {{amount}}",
"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",
@ -347,7 +308,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": "Llevas jugando {{amount}}", "playing_for": "Jugando por {{amount}}",
"sign_out_modal_text": "Tu biblioteca se ha vinculado con tu cuenta. Cuando cierres sesión, tú biblioteca ya no será visible y cualquier progreso no se guardará. ¿Continuar con el cierre de sesión?", "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",
@ -397,34 +358,19 @@
"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: {{date}}", "unlocked_at": "Desbloqueado el:",
"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?"
}, },
"hydra_cloud": { "tour": {
"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",
@ -432,9 +378,6 @@
"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"
} }
} }

View file

@ -25,8 +25,7 @@
"queued": "{{title}} (Järjekorras)", "queued": "{{title}} (Järjekorras)",
"game_has_no_executable": "Mängul pole käivitusfaili valitud", "game_has_no_executable": "Mängul pole käivitusfaili valitud",
"sign_in": "Logi sisse", "sign_in": "Logi sisse",
"friends": "Sõbrad", "friends": "Sõbrad"
"favorites": "Lemmikud"
}, },
"header": { "header": {
"search": "Otsi mänge", "search": "Otsi mänge",
@ -214,13 +213,13 @@
"behavior": "Käitumine", "behavior": "Käitumine",
"download_sources": "Allalaadimise allikad", "download_sources": "Allalaadimise allikad",
"language": "Keel", "language": "Keel",
"api_token": "API Võti", "real_debrid_api_token": "API Võti",
"enable_real_debrid": "Luba Real-Debrid", "enable_real_debrid": "Luba Real-Debrid",
"real_debrid_description": "Real-Debrid on piiranguteta allalaadija, mis võimaldab sul faile alla laadida koheselt ja sinu internetiühenduse parima kiirusega.", "real_debrid_description": "Real-Debrid on piiranguteta allalaadija, mis võimaldab sul faile alla laadida koheselt ja sinu internetiühenduse parima kiirusega.",
"debrid_invalid_token": "Vigane API võti", "real_debrid_invalid_token": "Vigane API võti",
"debrid_api_token_hint": "Sa saad oma API võtme <0>siit</0>", "real_debrid_api_token_hint": "Sa saad oma API võtme <0>siit</0>",
"real_debrid_free_account_error": "Konto \"{{username}}\" on tasuta konto. Palun telli Real-Debrid", "real_debrid_free_account_error": "Konto \"{{username}}\" on tasuta konto. Palun telli Real-Debrid",
"debrid_linked_message": "Konto \"{{username}}\" ühendatud", "real_debrid_linked_message": "Konto \"{{username}}\" ühendatud",
"save_changes": "Salvesta muudatused", "save_changes": "Salvesta muudatused",
"changes_saved": "Muudatused edukalt salvestatud", "changes_saved": "Muudatused edukalt salvestatud",
"download_sources_description": "Hydra laeb allalaadimise lingid nendest allikatest. Allika URL peab olema otsene link .json failile, mis sisaldab allalaadimise linke.", "download_sources_description": "Hydra laeb allalaadimise lingid nendest allikatest. Allika URL peab olema otsene link .json failile, mis sisaldab allalaadimise linke.",
@ -291,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", "total_play_time": "Kogu mängitud aeg: {{amount}}",
"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",
@ -360,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: {{date}}", "unlocked_at": "Avatud:",
"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"
}, },
"hydra_cloud": { "tour": {
"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",

View file

@ -14,10 +14,8 @@
"paused": "{{title}} (متوقف شده)", "paused": "{{title}} (متوقف شده)",
"downloading": "{{title}} ({{percentage}} - در حال دانلود…)", "downloading": "{{title}} ({{percentage}} - در حال دانلود…)",
"filter": "فیلتر کردن کتابخانه", "filter": "فیلتر کردن کتابخانه",
"home": "خانه", "home": "خانه"
"favorites": "علاقه‌مندی‌ها"
}, },
"header": { "header": {
"search": "جستجوی بازی‌ها", "search": "جستجوی بازی‌ها",
"home": "خانه", "home": "خانه",
@ -112,7 +110,7 @@
"general": "کلی", "general": "کلی",
"behavior": "رفتار", "behavior": "رفتار",
"enable_real_debrid": "فعال‌سازی Real-Debrid", "enable_real_debrid": "فعال‌سازی Real-Debrid",
"debrid_api_token_hint": "کلید API خود را از <ب0>اینجا</0> بگیرید.", "real_debrid_api_token_hint": "کلید API خود را از <ب0>اینجا</0> بگیرید.",
"save_changes": "ذخیره تغییرات" "save_changes": "ذخیره تغییرات"
}, },
"notifications": { "notifications": {

View file

@ -14,12 +14,10 @@
"paused": "{{title}} (En pause)", "paused": "{{title}} (En pause)",
"downloading": "{{title}} ({{percentage}} - Téléchargement en cours…)", "downloading": "{{title}} ({{percentage}} - Téléchargement en cours…)",
"filter": "Filtrer la bibliothèque", "filter": "Filtrer la bibliothèque",
"home": "Page daccueil", "home": "Page daccueil"
"favorites": "Favoris"
}, },
"header": { "header": {
"search": "Recherche", "search": "Recherche",
"catalogue": "Catalogue", "catalogue": "Catalogue",
"downloads": "Téléchargements", "downloads": "Téléchargements",
"search_results": "Résultats de la recherche", "search_results": "Résultats de la recherche",

View file

@ -14,12 +14,10 @@
"paused": "{{title}} (Szünet)", "paused": "{{title}} (Szünet)",
"downloading": "{{title}} ({{percentage}} - Letöltés…)", "downloading": "{{title}} ({{percentage}} - Letöltés…)",
"filter": "Könyvtár szűrése", "filter": "Könyvtár szűrése",
"home": "Főoldal", "home": "Főoldal"
"favorites": "Kedvenc játékok"
}, },
"header": { "header": {
"search": "Keresés", "search": "Keresés",
"home": "Főoldal", "home": "Főoldal",
"catalogue": "Katalógus", "catalogue": "Katalógus",
"downloads": "Letöltések", "downloads": "Letöltések",

View file

@ -20,12 +20,10 @@
"home": "Beranda", "home": "Beranda",
"queued": "{{title}} (Antrian)", "queued": "{{title}} (Antrian)",
"game_has_no_executable": "Game tidak punya file eksekusi yang dipilih", "game_has_no_executable": "Game tidak punya file eksekusi yang dipilih",
"sign_in": "Masuk", "sign_in": "Masuk"
"favorites": "Favorit"
}, },
"header": { "header": {
"search": "Cari game", "search": "Cari game",
"home": "Beranda", "home": "Beranda",
"catalogue": "Katalog", "catalogue": "Katalog",
"downloads": "Unduhan", "downloads": "Unduhan",
@ -163,13 +161,13 @@
"behavior": "Perilaku", "behavior": "Perilaku",
"download_sources": "Sumber unduhan", "download_sources": "Sumber unduhan",
"language": "Bahasa", "language": "Bahasa",
"api_token": "Token API", "real_debrid_api_token": "Token API",
"enable_real_debrid": "Aktifkan Real-Debrid", "enable_real_debrid": "Aktifkan Real-Debrid",
"real_debrid_description": "Real-Debrid adalah downloader tanpa batas yang memungkinkan kamu untuk mengunduh file dengan cepat dan pada kecepatan terbaik dari Internet kamu.", "real_debrid_description": "Real-Debrid adalah downloader tanpa batas yang memungkinkan kamu untuk mengunduh file dengan cepat dan pada kecepatan terbaik dari Internet kamu.",
"debrid_invalid_token": "Token API tidak valid", "real_debrid_invalid_token": "Token API tidak valid",
"debrid_api_token_hint": "Kamu bisa dapatkan token API di <0>sini</0>", "real_debrid_api_token_hint": "Kamu bisa dapatkan token API di <0>sini</0>",
"real_debrid_free_account_error": "Akun \"{{username}}\" adalah akun gratis. Silakan berlangganan Real-Debrid", "real_debrid_free_account_error": "Akun \"{{username}}\" adalah akun gratis. Silakan berlangganan Real-Debrid",
"debrid_linked_message": "Akun \"{{username}}\" terhubung", "real_debrid_linked_message": "Akun \"{{username}}\" terhubung",
"save_changes": "Simpan perubahan", "save_changes": "Simpan perubahan",
"changes_saved": "Perubahan disimpan berhasil", "changes_saved": "Perubahan disimpan berhasil",
"download_sources_description": "Hydra akan mencari link unduhan dari sini. URL harus menuju file .json dengan link unduhan.", "download_sources_description": "Hydra akan mencari link unduhan dari sini. URL harus menuju file .json dengan link unduhan.",
@ -226,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", "total_play_time": "Total waktu bermain: {{amount}}",
"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",

View file

@ -14,12 +14,10 @@
"paused": "{{title}} (In pausa)", "paused": "{{title}} (In pausa)",
"downloading": "{{title}} ({{percentage}} - Download…)", "downloading": "{{title}} ({{percentage}} - Download…)",
"filter": "Filtra libreria", "filter": "Filtra libreria",
"home": "Home", "home": "Home"
"favorites": "Preferiti"
}, },
"header": { "header": {
"search": "Cerca", "search": "Cerca",
"home": "Home", "home": "Home",
"catalogue": "Catalogo", "catalogue": "Catalogo",
"downloads": "Download", "downloads": "Download",
@ -120,7 +118,7 @@
"general": "Generale", "general": "Generale",
"behavior": "Comportamento", "behavior": "Comportamento",
"enable_real_debrid": "Abilita Real Debrid", "enable_real_debrid": "Abilita Real Debrid",
"debrid_api_token_hint": "Puoi trovare la tua chiave API <0>here</0>", "real_debrid_api_token_hint": "Puoi trovare la tua chiave API <0>here</0>",
"save_changes": "Salva modifiche" "save_changes": "Salva modifiche"
}, },
"notifications": { "notifications": {

View file

@ -20,10 +20,8 @@
"home": "Басты бет", "home": "Басты бет",
"queued": "{{title}} (Кезекте)", "queued": "{{title}} (Кезекте)",
"game_has_no_executable": "Ойынды іске қосу файлы таңдалмаған", "game_has_no_executable": "Ойынды іске қосу файлы таңдалмаған",
"sign_in": "Кіру", "sign_in": "Кіру"
"favorites": "Таңдаулылар"
}, },
"header": { "header": {
"search": "Іздеу", "search": "Іздеу",
"home": "Басты бет", "home": "Басты бет",
@ -161,13 +159,13 @@
"behavior": "Мінез-құлық", "behavior": "Мінез-құлық",
"download_sources": "Жүктеу көздері", "download_sources": "Жүктеу көздері",
"language": "Тіл", "language": "Тіл",
"api_token": "API Кілті", "real_debrid_api_token": "API Кілті",
"enable_real_debrid": "Real-Debrid-ті қосу", "enable_real_debrid": "Real-Debrid-ті қосу",
"real_debrid_description": "Real-Debrid - бұл шектеусіз жүктеуші, ол интернетте орналастырылған файлдарды тез жүктеуге немесе жеке желі арқылы кез келген блоктарды айналып өтіп, оларды бірден плеерге беруге мүмкіндік береді.", "real_debrid_description": "Real-Debrid - бұл шектеусіз жүктеуші, ол интернетте орналастырылған файлдарды тез жүктеуге немесе жеке желі арқылы кез келген блоктарды айналып өтіп, оларды бірден плеерге беруге мүмкіндік береді.",
"debrid_invalid_token": "Қате API кілті", "real_debrid_invalid_token": "Қате API кілті",
"debrid_api_token_hint": "API кілтін <0>осы жерден</0> алуға болады", "real_debrid_api_token_hint": "API кілтін <0>осы жерден</0> алуға болады",
"real_debrid_free_account_error": "\"{{username}}\" аккаунты жазылымға ие емес. Real-Debrid жазылымын алыңыз", "real_debrid_free_account_error": "\"{{username}}\" аккаунты жазылымға ие емес. Real-Debrid жазылымын алыңыз",
"debrid_linked_message": "\"{{username}}\" аккаунты байланған", "real_debrid_linked_message": "\"{{username}}\" аккаунты байланған",
"save_changes": "Өзгерістерді сақтау", "save_changes": "Өзгерістерді сақтау",
"changes_saved": "Өзгерістер сәтті сақталды", "changes_saved": "Өзгерістер сәтті сақталды",
"download_sources_description": "Hydra осы көздерден жүктеу сілтемелерін алады. URL-да жүктеу сілтемелері бар .json файлына тікелей сілтеме болуы керек.", "download_sources_description": "Hydra осы көздерден жүктеу сілтемелерін алады. URL-да жүктеу сілтемелері бар .json файлына тікелей сілтеме болуы керек.",
@ -222,7 +220,7 @@
"last_time_played": "Соңғы ойын {{period}}", "last_time_played": "Соңғы ойын {{period}}",
"activity": "Соңғы әрекет", "activity": "Соңғы әрекет",
"library": "Кітапхана", "library": "Кітапхана",
"total_play_time": "Барлығы ойнаған", "total_play_time": "Барлығы ойнаған: {{amount}}",
"no_recent_activity_title": "Хммм... Мұнда ештеңе жоқ", "no_recent_activity_title": "Хммм... Мұнда ештеңе жоқ",
"no_recent_activity_description": "Сіз ұзақ уақыт бойы ештеңе ойнаған жоқсыз. Мұны өзгерту керек!", "no_recent_activity_description": "Сіз ұзақ уақыт бойы ештеңе ойнаған жоқсыз. Мұны өзгерту керек!",
"display_name": "Көрсету аты", "display_name": "Көрсету аты",

View file

@ -14,10 +14,8 @@
"paused": "{{title}} (일시 정지됨)", "paused": "{{title}} (일시 정지됨)",
"downloading": "{{title}} ({{percentage}} - 다운로드 중…)", "downloading": "{{title}} ({{percentage}} - 다운로드 중…)",
"filter": "라이브러리 정렬", "filter": "라이브러리 정렬",
"home": "홈", "home": "홈"
"favorites": "즐겨찾기"
}, },
"header": { "header": {
"search": "게임 검색하기", "search": "게임 검색하기",
"home": "홈", "home": "홈",
@ -112,7 +110,7 @@
"general": "일반", "general": "일반",
"behavior": "행동", "behavior": "행동",
"enable_real_debrid": "Real-Debrid 활성화", "enable_real_debrid": "Real-Debrid 활성화",
"debrid_api_token_hint": "API 키를 <0>이곳</0>에서 얻으세요.", "real_debrid_api_token_hint": "API 키를 <0>이곳</0>에서 얻으세요.",
"save_changes": "변경 사항 저장" "save_changes": "변경 사항 저장"
}, },
"notifications": { "notifications": {

View file

@ -24,12 +24,10 @@
"queued": "{{title}} (I køen)", "queued": "{{title}} (I køen)",
"game_has_no_executable": "Spillet har ikke noen kjørbar fil valgt", "game_has_no_executable": "Spillet har ikke noen kjørbar fil valgt",
"sign_in": "Logge inn", "sign_in": "Logge inn",
"friends": "Venner", "friends": "Venner"
"favorites": "Favoritter"
}, },
"header": { "header": {
"search": "Søk efter spill", "search": "Søk efter spill",
"home": "Hjem", "home": "Hjem",
"catalogue": "Katalog", "catalogue": "Katalog",
"downloads": "Nedlastinger", "downloads": "Nedlastinger",
@ -179,13 +177,13 @@
"behavior": "Oppførsel", "behavior": "Oppførsel",
"download_sources": "Nedlastingskilder", "download_sources": "Nedlastingskilder",
"language": "Språk", "language": "Språk",
"api_token": "API nøkkel", "real_debrid_api_token": "API nøkkel",
"enable_real_debrid": "Slå på Real-Debrid", "enable_real_debrid": "Slå på Real-Debrid",
"real_debrid_description": "Real-Debrid er en ubegrenset nedlaster som gør det mulig for deg å laste ned filer med en gang og med den beste utnyttelsen av internethastigheten din.", "real_debrid_description": "Real-Debrid er en ubegrenset nedlaster som gør det mulig for deg å laste ned filer med en gang og med den beste utnyttelsen av internethastigheten din.",
"debrid_invalid_token": "Ugyldig API nøkkel", "real_debrid_invalid_token": "Ugyldig API nøkkel",
"debrid_api_token_hint": "Du kan få API nøkkelen din <0>her</0>", "real_debrid_api_token_hint": "Du kan få API nøkkelen din <0>her</0>",
"real_debrid_free_account_error": "Brukeren \"{{username}}\" er en gratis bruker. Vennligst abboner på Real-Debrid", "real_debrid_free_account_error": "Brukeren \"{{username}}\" er en gratis bruker. Vennligst abboner på Real-Debrid",
"debrid_linked_message": "Brukeren \"{{username}}\" er forbunnet", "real_debrid_linked_message": "Brukeren \"{{username}}\" er forbunnet",
"save_changes": "Lagre endringer", "save_changes": "Lagre endringer",
"changes_saved": "Lagring av endringer vellykket", "changes_saved": "Lagring av endringer vellykket",
"download_sources_description": "Hydra vil hente nedlastingslenker fra disse kildene. Kilde URLen skal være en direkte lenke til en .json fil som inneholder nedlastingslenkene.", "download_sources_description": "Hydra vil hente nedlastingslenker fra disse kildene. Kilde URLen skal være en direkte lenke til en .json fil som inneholder nedlastingslenkene.",
@ -253,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", "total_play_time": "Samlet spilltid: {{amount}}",
"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",

View file

@ -14,12 +14,10 @@
"paused": "{{title}} (Gepauzeerd)", "paused": "{{title}} (Gepauzeerd)",
"downloading": "{{title}} ({{percentage}} - Downloading…)", "downloading": "{{title}} ({{percentage}} - Downloading…)",
"filter": "Filter Bibliotheek", "filter": "Filter Bibliotheek",
"home": "Home", "home": "Home"
"favorites": "Favorieten"
}, },
"header": { "header": {
"search": "Zoek spellen", "search": "Zoek spellen",
"home": "Home", "home": "Home",
"catalogue": "Bibliotheek", "catalogue": "Bibliotheek",
"downloads": "Downloads", "downloads": "Downloads",
@ -113,7 +111,7 @@
"general": "Algemeen", "general": "Algemeen",
"behavior": "Gedrag", "behavior": "Gedrag",
"enable_real_debrid": "Enable Real-Debrid", "enable_real_debrid": "Enable Real-Debrid",
"debrid_api_token_hint": "U kunt uw API-sleutel <0>hier</0> verkrijgen.", "real_debrid_api_token_hint": "U kunt uw API-sleutel <0>hier</0> verkrijgen.",
"save_changes": "Wijzigingen opslaan" "save_changes": "Wijzigingen opslaan"
}, },
"notifications": { "notifications": {

View file

@ -14,12 +14,10 @@
"paused": "{{title}} (Zatrzymano)", "paused": "{{title}} (Zatrzymano)",
"downloading": "{{title}} ({{percentage}} - Pobieranie…)", "downloading": "{{title}} ({{percentage}} - Pobieranie…)",
"filter": "Filtruj biblioteke", "filter": "Filtruj biblioteke",
"home": "Główna", "home": "Główna"
"favorites": "Ulubione"
}, },
"header": { "header": {
"search": "Szukaj", "search": "Szukaj",
"home": "Główna", "home": "Główna",
"catalogue": "Katalog", "catalogue": "Katalog",
"downloads": "Pobrane", "downloads": "Pobrane",
@ -121,7 +119,7 @@
"behavior": "Zachowania", "behavior": "Zachowania",
"language": "Język", "language": "Język",
"enable_real_debrid": "Włącz Real-Debrid", "enable_real_debrid": "Włącz Real-Debrid",
"debrid_api_token_hint": "Możesz uzyskać swój klucz API <0>tutaj</0>", "real_debrid_api_token_hint": "Możesz uzyskać swój klucz API <0>tutaj</0>",
"save_changes": "Zapisz zmiany" "save_changes": "Zapisz zmiany"
}, },
"notifications": { "notifications": {

View file

@ -26,12 +26,10 @@
"game_has_no_executable": "Jogo não possui executável selecionado", "game_has_no_executable": "Jogo não possui executável selecionado",
"sign_in": "Login", "sign_in": "Login",
"friends": "Amigos", "friends": "Amigos",
"need_help": "Precisa de ajuda?", "need_help": "Precisa de ajuda?"
"favorites": "Favoritos"
}, },
"header": { "header": {
"search": "Buscar jogos", "search": "Buscar jogos",
"catalogue": "Catálogo", "catalogue": "Catálogo",
"downloads": "Downloads", "downloads": "Downloads",
"search_results": "Resultados da busca", "search_results": "Resultados da busca",
@ -157,31 +155,16 @@
"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": "Veja como exibir suas conquistas no perfil", "achievements_not_sync": "Suas conquistas não estão sincronizadas",
"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", "clear": "Limpar",
"no_directory_selected": "Nenhum diretório selecionado", "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",
"no_write_permission": "Não é possível baixar nesse diretório. Clique aqui para saber mais.",
"download_error_gofile_quota_exceeded": "Você excedeu sua cota mensal do Gofile. Por favor, aguarde a cota resetar.",
"download_error_real_debrid_account_not_authorized": "Sua conta do Real-Debrid não está autorizada a fazer novos downloads. Por favor, verifique sua assinatura e tente novamente.",
"download_error_not_cached_in_real_debrid": "Este download não está disponível no Real-Debrid e a verificação do status do download não está disponível.",
"download_error_not_cached_in_torbox": "Este download não está disponível no Torbox e a verificação do status do download não está disponível.",
"game_removed_from_favorites": "Jogo removido dos favoritos",
"game_added_to_favorites": "Jogo adicionado aos favoritos"
}, },
"activation": { "activation": {
"title": "Ativação", "title": "Ativação",
@ -214,11 +197,7 @@
"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",
@ -233,13 +212,13 @@
"behavior": "Comportamento", "behavior": "Comportamento",
"download_sources": "Fontes de download", "download_sources": "Fontes de download",
"language": "Idioma", "language": "Idioma",
"api_token": "Token de API", "real_debrid_api_token": "Token de API",
"enable_real_debrid": "Habilitar Real-Debrid", "enable_real_debrid": "Habilitar Real-Debrid",
"debrid_api_token_hint": "Você pode obter seu token de API <0>aqui</0>", "real_debrid_api_token_hint": "Você pode obter seu token de API <0>aqui</0>",
"real_debrid_description": "O Real-Debrid é um downloader sem restrições que permite baixar arquivos instantaneamente e com a melhor velocidade da sua Internet.", "real_debrid_description": "O Real-Debrid é um downloader sem restrições que permite baixar arquivos instantaneamente e com a melhor velocidade da sua Internet.",
"debrid_invalid_token": "Token de API inválido", "real_debrid_invalid_token": "Token de API inválido",
"real_debrid_free_account_error": "A conta \"{{username}}\" é uma conta gratuita. Por favor, assine a Real-Debrid", "real_debrid_free_account_error": "A conta \"{{username}}\" é uma conta gratuita. Por favor, assine a Real-Debrid",
"debrid_linked_message": "Conta \"{{username}}\" vinculada", "real_debrid_linked_message": "Conta \"{{username}}\" vinculada",
"save_changes": "Salvar mudanças", "save_changes": "Salvar mudanças",
"changes_saved": "Ajustes salvos com sucesso", "changes_saved": "Ajustes salvos com sucesso",
"download_sources_description": "Hydra vai buscar links de download em todas as fontes habilitadas. A URL da fonte deve ser um link direto para um arquivo .json contendo uma lista de links.", "download_sources_description": "Hydra vai buscar links de download em todas as fontes habilitadas. A URL da fonte deve ser um link direto para um arquivo .json contendo uma lista de links.",
@ -275,52 +254,7 @@
"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",
"no_themes": "Parece que você ainda não tem nenhum tema. Não se preocupe, clique aqui para criar sua primeira obra de arte.",
"editor_tab_save": "Salvar",
"web_store": "Loja de temas",
"clear_themes": "Limpar",
"create_theme": "Criar",
"create_theme_modal_title": "Criar tema customizado",
"create_theme_modal_description": "Criar novo tema para customizar a aparência do Hydra",
"theme_name": "Nome",
"insert_theme_name": "Insira o nome do tema",
"set_theme": "Habilitar tema",
"unset_theme": "Desabilitar tema",
"delete_theme": "Deletar tema",
"edit_theme": "Editar tema",
"delete_all_themes": "Deletar todos os temas",
"delete_all_themes_description": "Isso irá deletar todos os seus temas",
"delete_theme_description": "Isso irá deletar o tema {{theme}}",
"cancel": "Cancelar",
"appearance": "Aparência",
"enable_torbox": "Habilitar Torbox",
"torbox_description": "TorBox é o seu serviço de seedbox premium que rivaliza até com os melhores servidores do mercado.",
"torbox_account_linked": "Conta do TorBox vinculada",
"real_debrid_account_linked": "Conta Real-Debrid associada",
"name_min_length": "O nome do tema deve ter pelo menos 3 caracteres",
"import_theme": "Importar tema",
"import_theme_description": "Você irá importar {{theme}} da loja de temas",
"error_importing_theme": "Erro ao importar tema",
"theme_imported": "Tema importado com sucesso"
}, },
"notifications": { "notifications": {
"download_complete": "Download concluído", "download_complete": "Download concluído",
@ -344,15 +278,8 @@
"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": {
"search": "Filtrar…", "next_page": "Próxima página",
"developers": "Desenvolvedores", "previous_page": "Página anterior"
"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"
@ -366,7 +293,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", "total_play_time": "Tempo total de jogo: {{amount}}",
"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",
@ -429,43 +356,26 @@
"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": "Desbloqueada em: {{date}}", "unlocked_at": "Desbloqueado em:",
"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?"
}, },
"hydra_cloud": { "tour": {
"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"
} }
} }

View file

@ -25,12 +25,10 @@
"queued": "{{title}} (Na fila)", "queued": "{{title}} (Na fila)",
"game_has_no_executable": "O jogo não tem um executável selecionado", "game_has_no_executable": "O jogo não tem um executável selecionado",
"sign_in": "Iniciar sessão", "sign_in": "Iniciar sessão",
"friends": "Amigos", "friends": "Amigos"
"favorites": "Favoritos"
}, },
"header": { "header": {
"search": "Procurar jogos", "search": "Procurar jogos",
"catalogue": "Catálogo", "catalogue": "Catálogo",
"downloads": "Transferências", "downloads": "Transferências",
"search_results": "Resultados da pesquisa", "search_results": "Resultados da pesquisa",
@ -207,13 +205,13 @@
"behavior": "Comportamento", "behavior": "Comportamento",
"download_sources": "Fontes de transferência", "download_sources": "Fontes de transferência",
"language": "Idioma", "language": "Idioma",
"api_token": "Token de API", "real_debrid_api_token": "Token de API",
"enable_real_debrid": "Ativar Real-Debrid", "enable_real_debrid": "Ativar Real-Debrid",
"debrid_api_token_hint": "Podes obter o teu token de API <0>aqui</0>", "real_debrid_api_token_hint": "Podes obter o teu token de API <0>aqui</0>",
"real_debrid_description": "O Real-Debrid é um downloader sem restrições que permite descarregar ficheiros instantaneamente e com a melhor velocidade da tua Internet.", "real_debrid_description": "O Real-Debrid é um downloader sem restrições que permite descarregar ficheiros instantaneamente e com a melhor velocidade da tua Internet.",
"debrid_invalid_token": "Token de API inválido", "real_debrid_invalid_token": "Token de API inválido",
"real_debrid_free_account_error": "A conta \"{{username}}\" é uma conta gratuita. Por favor, subscreve o Real-Debrid", "real_debrid_free_account_error": "A conta \"{{username}}\" é uma conta gratuita. Por favor, subscreve o Real-Debrid",
"debrid_linked_message": "Conta \"{{username}}\" associada", "real_debrid_linked_message": "Conta \"{{username}}\" associada",
"save_changes": "Guardar alterações", "save_changes": "Guardar alterações",
"changes_saved": "Alterações guardadas com sucesso", "changes_saved": "Alterações guardadas com sucesso",
"download_sources_description": "O Hydra vai procurar links de download em todas as fontes ativadas. O URL da fonte deve ser um link direto para um ficheiro .json que contenha uma lista de links.", "download_sources_description": "O Hydra vai procurar links de download em todas as fontes ativadas. O URL da fonte deve ser um link direto para um ficheiro .json que contenha uma lista de links.",
@ -289,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", "total_play_time": "Tempo total de jogo: {{amount}}",
"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",
@ -358,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: {{date}}", "unlocked_at": "Desbloqueada em:",
"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"
}, },
"hydra_cloud": { "tour": {
"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",

View file

@ -14,12 +14,10 @@
"paused": "{{title}} (Pauzat)", "paused": "{{title}} (Pauzat)",
"downloading": "{{title}} ({{percentage}} - Se descarcă...)", "downloading": "{{title}} ({{percentage}} - Se descarcă...)",
"filter": "Filtrează biblioteca", "filter": "Filtrează biblioteca",
"home": "Acasă", "home": "Acasă"
"favorites": "Favorite"
}, },
"header": { "header": {
"search": "Caută jocuri", "search": "Caută jocuri",
"home": "Acasă", "home": "Acasă",
"catalogue": "Catalog", "catalogue": "Catalog",
"downloads": "Descărcări", "downloads": "Descărcări",
@ -126,13 +124,13 @@
"general": "General", "general": "General",
"behavior": "Comportament", "behavior": "Comportament",
"language": "Limbă", "language": "Limbă",
"api_token": "Token API", "real_debrid_api_token": "Token API",
"enable_real_debrid": "Activează Real-Debrid", "enable_real_debrid": "Activează Real-Debrid",
"real_debrid_description": "Real-Debrid este un descărcător fără restricții care îți permite să descarci fișiere instantaneu și la cea mai bună viteză a internetului tău.", "real_debrid_description": "Real-Debrid este un descărcător fără restricții care îți permite să descarci fișiere instantaneu și la cea mai bună viteză a internetului tău.",
"debrid_invalid_token": "Token API invalid", "real_debrid_invalid_token": "Token API invalid",
"debrid_api_token_hint": "Poți obține token-ul tău API <0>aici</0>", "real_debrid_api_token_hint": "Poți obține token-ul tău API <0>aici</0>",
"real_debrid_free_account_error": "Contul \"{{username}}\" este un cont gratuit. Te rugăm să te abonezi la Real-Debrid", "real_debrid_free_account_error": "Contul \"{{username}}\" este un cont gratuit. Te rugăm să te abonezi la Real-Debrid",
"debrid_linked_message": "Contul \"{{username}}\" a fost legat", "real_debrid_linked_message": "Contul \"{{username}}\" a fost legat",
"save_changes": "Salvează modificările", "save_changes": "Salvează modificările",
"changes_saved": "Modificările au fost salvate cu succes" "changes_saved": "Modificările au fost salvate cu succes"
}, },

View file

@ -4,13 +4,12 @@
"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": "Каталог",
@ -20,14 +19,13 @@
"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": "Файл запуска игры не выбран",
"sign_in": "Войти", "sign_in": "Войти",
"friends": "Друзья", "friends": "Друзья",
"need_help": "Нужна помощь?", "need_help": "Нужна помощь?"
"favorites": "Избранное"
}, },
"header": { "header": {
"search": "Поиск", "search": "Поиск",
@ -47,21 +45,14 @@
"checking_files": "Проверка файлов {{title}}… ({{percentage}} завершено)" "checking_files": "Проверка файлов {{title}}… ({{percentage}} завершено)"
}, },
"catalogue": { "catalogue": {
"search": "Фильтр…", "next_page": "Следующая страница",
"developers": "Разработчики", "previous_page": "Предыдущая страница"
"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": "Возобновить",
@ -72,7 +63,7 @@
"eta": "Окончание {{eta}}", "eta": "Окончание {{eta}}",
"calculating_eta": "Подсчёт оставшегося времени…", "calculating_eta": "Подсчёт оставшегося времени…",
"downloading_metadata": "Загрузка метаданных…", "downloading_metadata": "Загрузка метаданных…",
"filter": "Поиск репаков", "filter": "Фильтр репаков",
"requirements": "Системные требования", "requirements": "Системные требования",
"minimum": "Минимальные", "minimum": "Минимальные",
"recommended": "Рекомендуемые", "recommended": "Рекомендуемые",
@ -86,7 +77,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}}",
@ -100,7 +91,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": "Следующий скриншот",
@ -113,7 +104,6 @@
"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}} будет удалена из вашей библиотеки.",
@ -123,73 +113,22 @@
"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": "Активные игроки",
"warning": "Внимание:", "refuse_nsfw_content": "Возвращаться",
"hydra_needs_to_remain_open": "Для этой загрузки Hydra должна оставаться открытой до завершения. Если Hydra закроется до завершения, вы потеряете прогресс.", "stats": "Статистика"
"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": "Не удалось сбросить достижения",
"download_error_gofile_quota_exceeded": "Вы превысили месячную квоту Gofile. Пожалуйста, подождите, пока квота не будет восстановлена.",
"download_error_real_debrid_account_not_authorized": "Ваш аккаунт Real-Debrid не авторизован для осуществления новых загрузок. Пожалуйста, проверьте настройки учетной записи и повторите попытку.",
"download_error_not_cached_in_real_debrid": "Эта загрузка недоступна на Real-Debrid, а опрос статуса загрузки с Real-Debrid пока недоступен.",
"download_error_not_cached_in_torbox": "Эта загрузка недоступна на Torbox, и опросить статус загрузки с Torbox пока невозможно.",
"game_added_to_favorites": "Игра добавлена в избранное",
"game_removed_from_favorites": "Игра удалена из избранного"
}, },
"activation": { "activation": {
"title": "Активировать Hydra", "title": "Активировать Hydra",
@ -208,7 +147,7 @@
"completed": "Завершено", "completed": "Завершено",
"removed": "Не скачано", "removed": "Не скачано",
"cancel": "Отмена", "cancel": "Отмена",
"filter": "Поиск загруженных игр", "filter": "Фильтр загруженных игр",
"remove": "Удалить", "remove": "Удалить",
"downloading_metadata": "Загрузка метаданных…", "downloading_metadata": "Загрузка метаданных…",
"deleting": "Удаление установщика…", "deleting": "Удаление установщика…",
@ -222,35 +161,28 @@
"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": "Источники загрузки",
"language": "Язык", "language": "Язык",
"api_token": "API Ключ", "real_debrid_api_token": "API Ключ",
"enable_real_debrid": "Включить Real-Debrid", "enable_real_debrid": "Включить Real-Debrid",
"real_debrid_description": "Real-Debrid - это неограниченный загрузчик, который позволяет быстро скачивать файлы, размещенные в Интернете, или мгновенно передавать их в плеер через частную сеть, позволяющую обходить любые блокировки.", "real_debrid_description": "Real-Debrid - это неограниченный загрузчик, который позволяет быстро скачивать файлы, размещенные в Интернете, или мгновенно передавать их в плеер через частную сеть, позволяющую обходить любые блокировки.",
"debrid_invalid_token": "Неверный API ключ", "real_debrid_invalid_token": "Неверный API ключ",
"debrid_api_token_hint": "API ключ можно получить <0>здесь</0>", "real_debrid_api_token_hint": "API ключ можно получить <0>здесь</0>",
"real_debrid_free_account_error": "Аккаунт \"{{username}}\" - не имеет подписки. Пожалуйста, оформите подписку на Real-Debrid", "real_debrid_free_account_error": "Аккаунт \"{{username}}\" - не имеет подписки. Пожалуйста, оформите подписку на Real-Debrid",
"debrid_linked_message": "Привязан аккаунт \"{{username}}\"", "real_debrid_linked_message": "Привязан аккаунт \"{{username}}\"",
"save_changes": "Сохранить изменения", "save_changes": "Сохранить изменения",
"changes_saved": "Изменения успешно сохранены", "changes_saved": "Изменения успешно сохранены",
"download_sources_description": "Hydra будет получать ссылки на загрузки из этих источников. URL должна содержать прямую ссылку на .json-файл с ссылками для загрузок.", "download_sources_description": "Hydra будет получать ссылки на загрузки из этих источников. URL должна содержать прямую ссылку на .json-файл с ссылками для загрузок.",
@ -264,7 +196,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": "Все источники загрузок синхронизированы",
@ -274,63 +206,16 @@
"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": "Ваш следующий счет будет отправлен до этого дня",
"no_themes": "Похоже, что у вас еще нет тем, но не волнуйтесь, нажмите здесь, чтобы создать свой первый шедевр",
"editor_tab_code": "Код",
"editor_tab_info": "Информация",
"editor_tab_save": "Сохранить",
"web_store": "Веб-магазин",
"clear_themes": "Очистить",
"create_theme": "Создать",
"create_theme_modal_title": "Создать пользовательскую тему",
"create_theme_modal_description": "Создать новую тему для настройки внешнего вида Hydra",
"theme_name": "Название",
"insert_theme_name": "Вставить название темы",
"set_theme": "Установить тему",
"unset_theme": "Снять тему",
"delete_theme": "Удалить тему",
"edit_theme": "Редактировать тему",
"delete_all_themes": "Удалить все темы",
"delete_all_themes_description": "Это удалит все ваши пользовательские темы",
"delete_theme_description": "Это приведет к удалению темы {{theme}}",
"cancel": "Отменить",
"appearance": "Внешний вид",
"enable_torbox": "Включить Torbox",
"torbox_description": "TorBox - это ваш премиум-сервис, конкурирующий даже с лучшими серверами на рынке.",
"torbox_account_linked": "Аккаунт TorBox привязан",
"real_debrid_account_linked": "Аккаунт Real-Debrid привязан",
"name_min_length": "Название темы должно содержать не менее 3 символов",
"import_theme": "Импортировать тему",
"import_theme_description": "Вы импортируете {{theme}} из магазина тем",
"error_importing_theme": "Ошибка при импорте темы",
"theme_imported": "Тема успешно импортирована"
}, },
"notifications": { "notifications": {
"download_complete": "Загрузка завершена", "download_complete": "Загрузка завершена",
@ -338,17 +223,15 @@
"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": "Программы не установлены",
@ -367,7 +250,7 @@
"last_time_played": "Последняя игра {{period}}", "last_time_played": "Последняя игра {{period}}",
"activity": "Недавняя активность", "activity": "Недавняя активность",
"library": "Библиотека", "library": "Библиотека",
"total_play_time": "Всего сыграно", "total_play_time": "Всего сыграно: {{amount}}",
"no_recent_activity_title": "Хммм... Тут ничего нет", "no_recent_activity_title": "Хммм... Тут ничего нет",
"no_recent_activity_description": "Вы давно ни во что не играли. Пора это изменить!", "no_recent_activity_description": "Вы давно ни во что не играли. Пора это изменить!",
"display_name": "Отображаемое имя", "display_name": "Отображаемое имя",
@ -426,46 +309,6 @@
"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": "Подробнее"
} }
} }

View file

@ -1,424 +1,131 @@
{ {
"language_name": "Türkçe", "language_name": "Türkçe",
"app": {
"successfully_signed_in": "Başarıyla giriş yapıldı"
},
"home": { "home": {
"featured": "Öne Çıkanlar", "featured": "Öne çıkan",
"surprise_me": "Beni Şaşırt", "surprise_me": "Şaşırt beni",
"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": "İndirilenler", "downloads": "İndirmeler",
"settings": "Ayarlar", "settings": "Ayarlar",
"my_library": "Kütüphanem", "my_library": "Kütüphane",
"downloading_metadata": "{{title}} (Meta verileri indiriliyor…)", "downloading_metadata": "{{title}} (Metadata indiriliyor…)",
"paused": "{{title}} (Durduruldu)", "paused": "{{title}} (Duraklatıldı)",
"downloading": "{{title}} ({{percentage}} - İndiriliyor…)", "downloading": "{{title}} ({{percentage}} - İndiriliyor…)",
"filter": "Kütüphaneyi filtrele", "filter": "Kütüphaneyi filtrele",
"home": "Ana Sayfa", "home": "Ana menü"
"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?",
"favorites": "Favoriler"
}, },
"header": { "header": {
"search": "Oyunları ara", "search": "Ara",
"home": "Ana Sayfa", "home": "Ana menü",
"catalogue": "Katalog", "catalogue": "Katalog",
"downloads": "İndirilenler", "downloads": "İndirmeler",
"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": "Devam eden indirme yok", "no_downloads_in_progress": "İndirilen bir şey yok",
"downloading_metadata": "{{title}} meta verileri indiriliyor…", "downloading_metadata": "{{title}} metadatası indiriliyor…",
"downloading": "{{title}} indiriliyor… ({{percentage}} tamamlandı) - Tamamlama: {{eta}} - Hız: {{speed}}", "downloading": "{{title}} indiriliyor… ({{percentage}} tamamlandı) - Bitiş {{eta}} - {{speed}}"
"calculating_eta": "{{title}} indiriliyor… ({{percentage}} tamamlandı) - Kalan süre hesaplanıyor…",
"checking_files": "{{title}} dosyaları kontrol ediliyor… ({{percentage}} tamamlandı)"
}, },
"catalogue": { "catalogue": {
"search": "Filtrele…", "next_page": "Sonraki sayfa",
"developers": "Geliştiriciler", "previous_page": "Önceki sayfa"
"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}} tarihinde güncellendi", "updated_at": "{{updated_at}} güncellendi",
"install": "Yükle", "install": "İndir",
"resume": "Devam et", "resume": "Devam et",
"pause": "Durdur", "pause": "Duraklat",
"cancel": "İptal et", "cancel": "İptal et",
"remove": "Kaldır", "remove": "Sil",
"space_left_on_disk": "Diskte {{space}} boş alan kaldı", "space_left_on_disk": "Diskte {{space}} yer kaldı",
"eta": "{{eta}} tahmini bitiş", "eta": "Bitiş {{eta}}",
"calculating_eta": "Kalan süre hesaplanıyor…", "downloading_metadata": "Metadata indiriliyor…",
"downloading_metadata": "Meta veriler indiriliyor…", "filter": "Repackleri filtrele",
"filter": "Paketleri filtrele",
"requirements": "Sistem gereksinimleri", "requirements": "Sistem gereksinimleri",
"minimum": "Minimum", "minimum": "Minimum",
"recommended": "Önerilen", "recommended": "Önerilen",
"paused": "Durduruldu", "release_date": "{{date}} tarihinde çıktı",
"release_date": "{{date}} tarihinde yayımlandı", "publisher": "{{publisher}} tarihinde yayınlandı",
"publisher": "{{publisher}} tarafından yayımlandı", "hours": "saatler",
"hours": "saat", "minutes": "dakikalar",
"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": "İndirilebilir içerik yok", "no_downloads": "İndirme yok",
"play_time": "{{amount}} süre oynandı", "play_time": "{{amount}} oynandı",
"last_time_played": "Son oynama {{period}} önce", "last_time_played": "Son oynanan {{period}}",
"not_played_yet": "{{title}} henüz oynanmadı", "not_played_yet": "Bu {{title}} hiç oynanmadı",
"next_suggestion": "Sonraki öneri", "next_suggestion": "Sıradaki öneri",
"play": "Oyna", "play": "Oyna",
"deleting": "Yükleyici siliniyor…", "deleting": "Installer siliniyor…",
"close": "Kapat", "close": "Kapat",
"playing_now": u anda oynanıyor", "playing_now": imdi oynanıyor",
"change": "Değiştir", "change": "Değiştir",
"repacks_modal_description": "İndirmek istediğiniz paketi seçin", "repacks_modal_description": "İndirmek istediğiiniz repacki seçin",
"select_folder_hint": "Varsayılan klasörü değiştirmek için <0>Ayarlar</0> bölümüne gidin", "select_folder_hint": "Varsayılan klasörü değiştirmek için ulaşmanız gereken ayar",
"download_now": "Şimdi indir", "download_now": "Şimdi"
"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ı Aktive Et", "title": "Hydra'yı aktif et",
"installation_id": "Kurulum Kimliği:", "installation_id": "Kurulum ID'si:",
"enter_activation_code": "Aktivasyon kodunuzu girin", "enter_activation_code": "Aktifleştirme kodunuzu girin",
"message": "Bunu nereden soracağınızı bilmiyorsanız, bu sizin için olmamalı.", "message": "Bunu nerede soracağınızı bilmiyorsanız, buna sahip olmamanız gerekiyor.",
"activate": "Aktive Et", "activate": "Aktif et",
"loading": "Yükleniyor…" "loading": "Yükleniyor…"
}, },
"downloads": { "downloads": {
"resume": "Devam Et", "resume": "Devam et",
"pause": "Duraklat", "pause": "Duraklat",
"eta": "Tamamlama {{eta}}", "eta": "Bitiş {{eta}}",
"paused": "Duraklatıldı", "paused": "Duraklatıldı",
"verifying": "Doğrulanıyor…", "verifying": "Doğrulanıyor…",
"completed": "Tamamlandı", "completed": "Tamamlandı",
"removed": "İndirilmedi", "cancel": "İptal et",
"cancel": "İptal Et", "filter": "Yüklü oyunları filtrele",
"filter": "İndirilen oyunları filtrele",
"remove": "Kaldır", "remove": "Kaldır",
"downloading_metadata": "Metadata indiriliyor…", "downloading_metadata": "Metadata indiriliyor…",
"deleting": "Yükleyici siliniyor…", "deleting": "Installer siliniyor…",
"delete": "Yükleyiciyi kaldır", "delete": "Installer'ı sil",
"delete_modal_title": "Emin misiniz?", "delete_modal_title": "Emin misiniz?",
"delete_modal_description": "Bu işlem, tüm kurulum dosyalarını bilgisayarınızdan kaldıracaktır", "delete_modal_description": "Bu bilgisayarınızdan tüm kurulum dosyalarını silecek",
"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 tamamlandığında", "enable_download_notifications": "Bir indirme bittiğinde",
"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",
"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.",
"debrid_invalid_token": "Geçersiz API anahtarı",
"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",
"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ııklamalarını kilitlenmeden önce göster"
}, },
"notifications": { "notifications": {
"download_complete": "İndirme tamamlandı", "download_complete": "İndirme tamamlandı",
"game_ready_to_install": "{{title}} kurulmaya hazır", "game_ready_to_install": "{{title}} kuruluma hazır",
"repack_list_updated": "Repack listesi güncellendi", "repack_list_updated": "Repack listesi güncellendi",
"repack_count_one": "{{count}} repack eklendi", "repack_count_one": "{{count}} yeni repack eklendi",
"repack_count_other": "{{count}} repack eklendi", "repack_count_other": "{{count}} yeni 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": "İndirilebilir içerik bulunmuyor" "no_downloads": "İndirme mevcut değil"
}, },
"binary_not_found_modal": { "binary_not_found_modal": {
"title": "Programlar Yüklü Değil", "title": "Programlar yüklü değil",
"description": "Wine veya Lutris çalıştırılabilir dosyaları sisteminizde bulunamadı", "description": "Sisteminizde Wine veya Lutris çalıştırılabiliri bulunamadı",
"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" "instructions": "Oyunları düzgün şekilde çalıştırmak için Linux distronuza bunlardan birini nasıl yükleyebileceğinize bakın"
}, },
"modal": { "modal": {
"close": "Kapat düğmesi" "close": "Kapat tuşu"
},
"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ıı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ııldı",
"achievement_progress": "{{unlockedCount}}/{{totalCount}} başarı",
"achievements_unlocked_for_game": "{{gameTitle}} oyunu için {{achievementCount}} yeni başarıı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"
} }
} }

View file

@ -20,12 +20,10 @@
"home": "Головна", "home": "Головна",
"game_has_no_executable": "Не було вибрано файл для запуску гри", "game_has_no_executable": "Не було вибрано файл для запуску гри",
"queued": "{{title}} в черзі", "queued": "{{title}} в черзі",
"sign_in": "Увійти", "sign_in": "Увійти"
"favorites": "Улюблені"
}, },
"header": { "header": {
"search": "Пошук", "search": "Пошук",
"home": "Головна", "home": "Головна",
"catalogue": "Каталог", "catalogue": "Каталог",
"downloads": "Завантаження", "downloads": "Завантаження",
@ -176,13 +174,13 @@
"import": "Імпортувати", "import": "Імпортувати",
"insert_valid_json_url": "Вставте дійсний URL JSON-файлу", "insert_valid_json_url": "Вставте дійсний URL JSON-файлу",
"language": "Мова", "language": "Мова",
"api_token": "API-токен", "real_debrid_api_token": "API-токен",
"debrid_api_token_hint": "API токен можливо отримати <0>тут</0>", "real_debrid_api_token_hint": "API токен можливо отримати <0>тут</0>",
"real_debrid_api_token_label": "Real-Debrid API-токен", "real_debrid_api_token_label": "Real-Debrid API-токен",
"real_debrid_description": "Real-Debrid — це необмежений завантажувач, який дозволяє швидко завантажувати файли, розміщені в Інтернеті, або миттєво передавати їх у плеєр через приватну мережу, що дозволяє обходити будь-які блокування.", "real_debrid_description": "Real-Debrid — це необмежений завантажувач, який дозволяє швидко завантажувати файли, розміщені в Інтернеті, або миттєво передавати їх у плеєр через приватну мережу, що дозволяє обходити будь-які блокування.",
"real_debrid_free_account_error": "Акаунт \"{{username}}\" - не має наявної підписки. Будь ласка, оформіть підписку на Real-Debrid", "real_debrid_free_account_error": "Акаунт \"{{username}}\" - не має наявної підписки. Будь ласка, оформіть підписку на Real-Debrid",
"debrid_invalid_token": "Невірний API-токен", "real_debrid_invalid_token": "Невірний API-токен",
"debrid_linked_message": "Акаунт \"{{username}}\" привязаний", "real_debrid_linked_message": "Акаунт \"{{username}}\" привязаний",
"remove_download_source": "Видалити", "remove_download_source": "Видалити",
"removed_download_source": "Джерело завантажень було видалено", "removed_download_source": "Джерело завантажень було видалено",
"save_changes": "Зберегти зміни", "save_changes": "Зберегти зміни",
@ -233,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": "Всього зіграно", "total_play_time": "Всього зіграно: {{amount}}",
"try_again": "Будь ласка, попробуйте ще раз" "try_again": "Будь ласка, попробуйте ще раз"
} }
} }

View file

@ -25,8 +25,7 @@
"queued": "{{title}} (已加入下载队列)", "queued": "{{title}} (已加入下载队列)",
"game_has_no_executable": "未选择游戏的可执行文件", "game_has_no_executable": "未选择游戏的可执行文件",
"sign_in": "登入", "sign_in": "登入",
"friends": "好友", "friends": "好友"
"favorites": "收藏"
}, },
"header": { "header": {
"search": "搜索游戏", "search": "搜索游戏",
@ -214,13 +213,13 @@
"behavior": "行为", "behavior": "行为",
"download_sources": "下载源", "download_sources": "下载源",
"language": "语言", "language": "语言",
"api_token": "API 令牌", "real_debrid_api_token": "API 令牌",
"enable_real_debrid": "启用 Real-Debrid", "enable_real_debrid": "启用 Real-Debrid",
"real_debrid_description": "Real-Debrid 是一个无限制的下载器,允许您以最快的互联网速度即时下载文件。", "real_debrid_description": "Real-Debrid 是一个无限制的下载器,允许您以最快的互联网速度即时下载文件。",
"debrid_invalid_token": "无效的 API 令牌", "real_debrid_invalid_token": "无效的 API 令牌",
"debrid_api_token_hint": "您可以从<0>这里</0>获取API密钥.", "real_debrid_api_token_hint": "您可以从<0>这里</0>获取API密钥.",
"real_debrid_free_account_error": "账户 \"{{username}}\" 是免费账户。请订阅 Real-Debrid", "real_debrid_free_account_error": "账户 \"{{username}}\" 是免费账户。请订阅 Real-Debrid",
"debrid_linked_message": "账户 \"{{username}}\" 已链接", "real_debrid_linked_message": "账户 \"{{username}}\" 已链接",
"save_changes": "保存更改", "save_changes": "保存更改",
"changes_saved": "更改已成功保存", "changes_saved": "更改已成功保存",
"download_sources_description": "Hydra 将从这些源获取下载链接。源 URL 必须是直接链接到包含下载链接的 .json 文件。", "download_sources_description": "Hydra 将从这些源获取下载链接。源 URL 必须是直接链接到包含下载链接的 .json 文件。",
@ -291,7 +290,7 @@
"last_time_played": "上次游玩时间 {{period}}", "last_time_played": "上次游玩时间 {{period}}",
"activity": "近期活动", "activity": "近期活动",
"library": "库", "library": "库",
"total_play_time": "总游戏时长", "total_play_time": "总游戏时长: {{amount}}",
"no_recent_activity_title": "Emmm… 这里暂时啥都没有", "no_recent_activity_title": "Emmm… 这里暂时啥都没有",
"no_recent_activity_description": "你最近没玩过任何游戏。是时候做出改变了!", "no_recent_activity_description": "你最近没玩过任何游戏。是时候做出改变了!",
"display_name": "昵称", "display_name": "昵称",
@ -360,11 +359,11 @@
"achievement_unlocked": "成就已解锁", "achievement_unlocked": "成就已解锁",
"user_achievements": "{{displayName}}的成就", "user_achievements": "{{displayName}}的成就",
"your_achievements": "你的成就", "your_achievements": "你的成就",
"unlocked_at": "解锁于: {{date}}", "unlocked_at": "解锁于:",
"subscription_needed": "需要订阅 Hydra Cloud 才能看到此内容", "subscription_needed": "需要订阅 Hydra Cloud 才能看到此内容",
"new_achievements_unlocked": "从 {{gameCount}} 游戏中解锁 {{achievementCount}} 新成就" "new_achievements_unlocked": "从 {{gameCount}} 游戏中解锁 {{achievementCount}} 新成就"
}, },
"hydra_cloud": { "tour": {
"subscription_tour_title": "Hydra 云订阅", "subscription_tour_title": "Hydra 云订阅",
"subscribe_now": "现在订购", "subscribe_now": "现在订购",
"cloud_saving": "云存档", "cloud_saving": "云存档",

View file

@ -7,18 +7,13 @@ export const defaultDownloadsPath = app.getPath("downloads");
export const isStaging = import.meta.env.MAIN_VITE_API_URL.includes("staging"); export const isStaging = import.meta.env.MAIN_VITE_API_URL.includes("staging");
export const levelDatabasePath = path.join(
app.getPath("userData"),
`hydra-db${isStaging ? "-staging" : ""}`
);
export const databaseDirectory = path.join(app.getPath("appData"), "hydra"); export const databaseDirectory = path.join(app.getPath("appData"), "hydra");
export const databasePath = path.join( export const databasePath = path.join(
databaseDirectory, databaseDirectory,
isStaging ? "hydra_test.db" : "hydra.db" isStaging ? "hydra_test.db" : "hydra.db"
); );
export const logsPath = path.join(app.getPath("userData"), "logs"); export const logsPath = path.join(app.getPath("appData"), "hydra", "logs");
export const seedsPath = app.isPackaged export const seedsPath = app.isPackaged
? path.join(process.resourcesPath, "seeds") ? path.join(process.resourcesPath, "seeds")

31
src/main/data-source.ts Normal file
View file

@ -0,0 +1,31 @@
import { DataSource } from "typeorm";
import {
DownloadQueue,
DownloadSource,
Game,
GameShopCache,
Repack,
UserPreferences,
UserAuth,
GameAchievement,
UserSubscription,
} from "@main/entity";
import { databasePath } from "./constants";
export const dataSource = new DataSource({
type: "better-sqlite3",
entities: [
Game,
Repack,
UserAuth,
UserPreferences,
UserSubscription,
GameShopCache,
DownloadSource,
DownloadQueue,
GameAchievement,
],
synchronize: false,
database: databasePath,
});

View file

@ -0,0 +1,25 @@
import {
Entity,
PrimaryGeneratedColumn,
CreateDateColumn,
UpdateDateColumn,
OneToOne,
JoinColumn,
} from "typeorm";
import type { Game } from "./game.entity";
@Entity("download_queue")
export class DownloadQueue {
@PrimaryGeneratedColumn()
id: number;
@OneToOne("Game", "downloadQueue")
@JoinColumn()
game: Game;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}

View file

@ -0,0 +1,41 @@
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;
}

View file

@ -0,0 +1,19 @@
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
@Entity("game_achievement")
export class GameAchievement {
@PrimaryGeneratedColumn()
id: number;
@Column("text")
objectId: string;
@Column("text")
shop: string;
@Column("text", { nullable: true })
unlockedAchievements: string | null;
@Column("text", { nullable: true })
achievements: string | null;
}

View file

@ -0,0 +1,35 @@
import {
Entity,
PrimaryColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
} from "typeorm";
import type { GameShop } from "@types";
@Entity("game_shop_cache")
export class GameShopCache {
@PrimaryColumn("text", { unique: true })
objectID: string;
@Column("text")
shop: GameShop;
@Column("text", { nullable: true })
serializedData: string;
/**
* @deprecated Use IndexedDB's `howLongToBeatEntries` instead
*/
@Column("text", { nullable: true })
howLongToBeatSerializedData: string;
@Column("text", { nullable: true })
language: string;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}

View file

@ -0,0 +1,93 @@
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
OneToOne,
JoinColumn,
} from "typeorm";
import { Repack } from "./repack.entity";
import type { GameShop, GameStatus } from "@types";
import { Downloader } from "@shared";
import type { DownloadQueue } from "./download-queue.entity";
@Entity("game")
export class Game {
@PrimaryGeneratedColumn()
id: number;
@Column("text", { unique: true })
objectID: string;
@Column("text", { unique: true, nullable: true })
remoteId: string | null;
@Column("text")
title: string;
@Column("text", { nullable: true })
iconUrl: string | null;
@Column("text", { nullable: true })
folderName: string | null;
@Column("text", { nullable: true })
downloadPath: string | null;
@Column("text", { nullable: true })
executablePath: string | null;
@Column("text", { nullable: true })
winePrefixPath: string | null;
@Column("int", { default: 0 })
playTimeInMilliseconds: number;
@Column("text")
shop: GameShop;
@Column("text", { nullable: true })
status: GameStatus | null;
@Column("int", { default: Downloader.Torrent })
downloader: Downloader;
/**
* Progress is a float between 0 and 1
*/
@Column("float", { default: 0 })
progress: number;
@Column("int", { default: 0 })
bytesDownloaded: number;
@Column("datetime", { nullable: true })
lastTimePlayed: Date | null;
@Column("float", { default: 0 })
fileSize: number;
@Column("text", { nullable: true })
uri: string | null;
/**
* @deprecated
*/
@OneToOne("Repack", "game", { nullable: true })
@JoinColumn()
repack: Repack;
@OneToOne("DownloadQueue", "game")
downloadQueue: DownloadQueue;
@Column("boolean", { default: false })
isDeleted: boolean;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}

10
src/main/entity/index.ts Normal file
View file

@ -0,0 +1,10 @@
export * from "./game.entity";
export * from "./repack.entity";
export * from "./user-auth.entity";
export * from "./user-preferences.entity";
export * from "./user-subscription.entity";
export * from "./game-shop-cache.entity";
export * from "./game.entity";
export * from "./game-achievements.entity";
export * from "./download-source.entity";
export * from "./download-queue.entity";

View file

@ -0,0 +1,45 @@
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;
}

View file

@ -0,0 +1,45 @@
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
OneToOne,
} from "typeorm";
import { UserSubscription } from "./user-subscription.entity";
@Entity("user_auth")
export class UserAuth {
@PrimaryGeneratedColumn()
id: number;
@Column("text", { default: "" })
userId: string;
@Column("text", { default: "" })
displayName: string;
@Column("text", { nullable: true })
profileImageUrl: string | null;
@Column("text", { nullable: true })
backgroundImageUrl: string | null;
@Column("text", { default: "" })
accessToken: string;
@Column("text", { default: "" })
refreshToken: string;
@Column("int", { default: 0 })
tokenExpirationTimestamp: number;
@OneToOne("UserSubscription", "user")
subscription: UserSubscription | null;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}

View file

@ -0,0 +1,49 @@
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
} from "typeorm";
@Entity("user_preferences")
export class UserPreferences {
@PrimaryGeneratedColumn()
id: number;
@Column("text", { nullable: true })
downloadsPath: string | null;
@Column("text", { default: "en" })
language: string;
@Column("text", { nullable: true })
realDebridApiToken: string | null;
@Column("boolean", { default: false })
downloadNotificationsEnabled: boolean;
@Column("boolean", { default: false })
repackUpdatesNotificationsEnabled: boolean;
@Column("boolean", { default: true })
achievementNotificationsEnabled: boolean;
@Column("boolean", { default: false })
preferQuitInsteadOfHiding: boolean;
@Column("boolean", { default: false })
runAtStartup: boolean;
@Column("boolean", { default: false })
startMinimized: boolean;
@Column("boolean", { default: false })
disableNsfwAlert: boolean;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}

View file

@ -0,0 +1,42 @@
import type { SubscriptionStatus } from "@types";
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
OneToOne,
JoinColumn,
} from "typeorm";
import { UserAuth } from "./user-auth.entity";
@Entity("user_subscription")
export class UserSubscription {
@PrimaryGeneratedColumn()
id: number;
@Column("text", { default: "" })
subscriptionId: string;
@OneToOne("UserAuth", "subscription")
@JoinColumn()
user: UserAuth;
@Column("text", { default: "" })
status: SubscriptionStatus;
@Column("text", { default: "" })
planId: string;
@Column("text", { default: "" })
planName: string;
@Column("datetime", { nullable: true })
expiresAt: Date | null;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}

View file

@ -1,19 +1,14 @@
import jwt from "jsonwebtoken"; import jwt from "jsonwebtoken";
import { userAuthRepository } from "@main/repository";
import { registerEvent } from "../register-event"; import { registerEvent } from "../register-event";
import { db, levelKeys } from "@main/level";
import type { Auth } from "@types";
const getSessionHash = async (_event: Electron.IpcMainInvokeEvent) => { const getSessionHash = async (_event: Electron.IpcMainInvokeEvent) => {
const auth = await db.get<string, Auth>(levelKeys.auth, { const auth = await userAuthRepository.findOne({ where: { id: 1 } });
valueEncoding: "json",
});
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;
}; };

View file

@ -1,24 +1,7 @@
import i18next from "i18next";
import { registerEvent } from "../register-event"; import { registerEvent } from "../register-event";
import { HydraApi, WindowManager } from "@main/services"; import { WindowManager } from "@main/services";
import { AuthPage } from "@shared";
const openAuthWindow = async ( const openAuthWindow = async (_event: Electron.IpcMainInvokeEvent) =>
_event: Electron.IpcMainInvokeEvent, WindowManager.openAuthWindow();
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);

View file

@ -1,29 +1,39 @@
import { registerEvent } from "../register-event"; import { registerEvent } from "../register-event";
import { DownloadManager, HydraApi, gamesPlaytime } from "@main/services"; import {
import { db, downloadsSublevel, gamesSublevel, levelKeys } from "@main/level"; DownloadManager,
HydraApi,
PythonInstance,
gamesPlaytime,
} from "@main/services";
import { dataSource } from "@main/data-source";
import { DownloadQueue, Game, UserAuth, UserSubscription } from "@main/entity";
const signOut = async (_event: Electron.IpcMainInvokeEvent) => { const signOut = async (_event: Electron.IpcMainInvokeEvent) => {
const databaseOperations = db const databaseOperations = dataSource
.batch([ .transaction(async (transactionalEntityManager) => {
{ await transactionalEntityManager.getRepository(DownloadQueue).delete({});
type: "del",
key: levelKeys.auth, await transactionalEntityManager.getRepository(Game).delete({});
},
{ await transactionalEntityManager
type: "del", .getRepository(UserAuth)
key: levelKeys.user, .delete({ id: 1 });
},
]) await transactionalEntityManager
.getRepository(UserSubscription)
.delete({ id: 1 });
})
.then(() => { .then(() => {
/* Removes all games being played */ /* Removes all games being played */
gamesPlaytime.clear(); gamesPlaytime.clear();
return Promise.all([gamesSublevel.clear(), downloadsSublevel.clear()]);
}); });
/* Cancels any ongoing downloads */ /* Cancels any ongoing downloads */
DownloadManager.cancelDownload(); DownloadManager.cancelDownload();
/* Disconnects libtorrent */
PythonInstance.killTorrent();
HydraApi.handleSignOut(); HydraApi.handleSignOut();
await Promise.all([ await Promise.all([

View file

@ -1,8 +1,47 @@
import type { AppUpdaterEvent } from "@types";
import { registerEvent } from "../register-event"; import { registerEvent } from "../register-event";
import { UpdateManager } from "@main/services/update-manager"; import updater, { UpdateInfo } from "electron-updater";
import { WindowManager } from "@main/services";
import { app } from "electron";
import { publishNotificationUpdateReadyToInstall } from "@main/services/notifications";
const { autoUpdater } = updater;
const sendEvent = (event: AppUpdaterEvent) => {
WindowManager.mainWindow?.webContents.send("autoUpdaterEvent", event);
};
const sendEventsForDebug = false;
const isAutoInstallAvailable =
process.platform !== "darwin" && process.env.PORTABLE_EXECUTABLE_FILE == null;
const mockValuesForDebug = () => {
sendEvent({ type: "update-available", info: { version: "1.3.0" } });
sendEvent({ type: "update-downloaded" });
};
const newVersionInfo = { version: "" };
const checkForUpdates = async (_event: Electron.IpcMainInvokeEvent) => { const checkForUpdates = async (_event: Electron.IpcMainInvokeEvent) => {
return UpdateManager.checkForUpdates(); autoUpdater
.once("update-available", (info: UpdateInfo) => {
sendEvent({ type: "update-available", info });
newVersionInfo.version = info.version;
})
.once("update-downloaded", () => {
sendEvent({ type: "update-downloaded" });
publishNotificationUpdateReadyToInstall(newVersionInfo.version);
});
if (app.isPackaged) {
autoUpdater.autoDownload = isAutoInstallAvailable;
autoUpdater.checkForUpdates();
} else if (sendEventsForDebug) {
mockValuesForDebug();
}
return isAutoInstallAvailable;
}; };
registerEvent("checkForUpdates", checkForUpdates); registerEvent("checkForUpdates", checkForUpdates);

View file

@ -1,6 +1,9 @@
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 } from "@shared"; import { CatalogueCategory, steamUrlBuilder } from "@shared";
import { steamGamesWorker } from "@main/workers";
const getCatalogue = async ( const getCatalogue = async (
_event: Electron.IpcMainInvokeEvent, _event: Electron.IpcMainInvokeEvent,
@ -11,11 +14,26 @@ const getCatalogue = async (
skip: "0", skip: "0",
}); });
return HydraApi.get( const response = await HydraApi.get<{ objectId: string; shop: GameShop }[]>(
`/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);

View file

@ -1,10 +0,0 @@
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);

View file

@ -1,10 +1,10 @@
import { getSteamAppDetails, logger } from "@main/services"; import { gameShopCacheRepository } from "@main/repository";
import { getSteamAppDetails } from "@main/services";
import type { ShopDetails, GameShop } from "@types"; import type { ShopDetails, GameShop, SteamAppDetails } from "@types";
import { registerEvent } from "../register-event"; import { registerEvent } from "../register-event";
import { steamGamesWorker } from "@main/workers"; import { steamGamesWorker } from "@main/workers";
import { gamesShopCacheSublevel, levelKeys } from "@main/level";
const getLocalizedSteamAppDetails = async ( const getLocalizedSteamAppDetails = async (
objectId: string, objectId: string,
@ -39,27 +39,35 @@ const getGameShopDetails = async (
language: string language: string
): Promise<ShopDetails | null> => { ): Promise<ShopDetails | null> => {
if (shop === "steam") { if (shop === "steam") {
const cachedData = await gamesShopCacheSublevel.get( const cachedData = await gameShopCacheRepository.findOne({
levelKeys.gameShopCacheItem(shop, objectId, language) where: { objectID: objectId, language },
); });
const appDetails = getLocalizedSteamAppDetails(objectId, language).then( const appDetails = getLocalizedSteamAppDetails(objectId, language).then(
(result) => { (result) => {
if (result) { if (result) {
gamesShopCacheSublevel gameShopCacheRepository.upsert(
.put(levelKeys.gameShopCacheItem(shop, objectId, language), result) {
.catch((err) => { objectID: objectId,
logger.error("Could not cache game details", err); shop: "steam",
}); language,
serializedData: JSON.stringify(result),
},
["objectID"]
);
} }
return result; return result;
} }
); );
if (cachedData) { const cachedGame = cachedData?.serializedData
? (JSON.parse(cachedData?.serializedData) as SteamAppDetails)
: null;
if (cachedGame) {
return { return {
...cachedData, ...cachedGame,
objectId, objectId,
} as ShopDetails; } as ShopDetails;
} }

View file

@ -0,0 +1,29 @@
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);

View file

@ -1,10 +0,0 @@
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);

View file

@ -1,14 +1,14 @@
import { db, levelKeys } from "@main/level";
import { registerEvent } from "../register-event"; import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services"; import { HydraApi } from "@main/services";
import { userPreferencesRepository } from "@main/repository";
import type { TrendingGame } from "@types"; import type { TrendingGame } from "@types";
const getTrendingGames = async (_event: Electron.IpcMainInvokeEvent) => { const getTrendingGames = async (_event: Electron.IpcMainInvokeEvent) => {
const language = await db const userPreferences = await userPreferencesRepository.findOne({
.get<string, string>(levelKeys.language, { where: { id: 1 },
valueEncoding: "utf-8", });
})
.then((language) => language || "en"); const language = userPreferences?.language || "en";
const trendingGames = await HydraApi.get<TrendingGame[]>( const trendingGames = await HydraApi.get<TrendingGame[]>(
"/games/trending", "/games/trending",

View file

@ -1,18 +1,23 @@
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 searchGames = async ( const searchGamesEvent = async (
_event: Electron.IpcMainInvokeEvent, _event: Electron.IpcMainInvokeEvent,
payload: CatalogueSearchPayload, query: string
take: number, ): Promise<CatalogueEntry[]> => {
skip: number const games = await HydraApi.get<
) => { { objectId: string; title: string; shop: string }[]
return HydraApi.post( >("/games/search", { title: query, take: 12, skip: 0 }, { needsAuth: false });
"/catalogue/search",
{ ...payload, take, skip }, return games.map((game) => {
{ needsAuth: false } return convertSteamGameToCatalogueEntry({
); id: Number(game.objectId),
name: game.title,
clientIcon: null,
});
});
}; };
registerEvent("searchGames", searchGames); registerEvent("searchGames", searchGamesEvent);

View file

@ -1,7 +1,6 @@
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,
@ -14,20 +13,8 @@ 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);

View file

@ -1,14 +1,19 @@
import { registerEvent } from "../register-event"; import { registerEvent } from "../register-event";
import type { GameShop } from "@types"; import type { GameShop } from "@types";
import { Ludusavi } from "@main/services"; import { Ludusavi } from "@main/services";
import { gamesSublevel, levelKeys } from "@main/level"; import { gameRepository } from "@main/repository";
const getGameBackupPreview = async ( const getGameBackupPreview = async (
_event: Electron.IpcMainInvokeEvent, _event: Electron.IpcMainInvokeEvent,
objectId: string, objectId: string,
shop: GameShop shop: GameShop
) => { ) => {
const game = await gamesSublevel.get(levelKeys.game(shop, objectId)); const game = await gameRepository.findOne({
where: {
objectID: objectId,
shop,
},
});
return Ludusavi.getBackupPreview(shop, objectId, game?.winePrefixPath); return Ludusavi.getBackupPreview(shop, objectId, game?.winePrefixPath);
}; };

View file

@ -10,7 +10,7 @@ import os from "node:os";
import { backupsPath } from "@main/constants"; import { backupsPath } from "@main/constants";
import { app } from "electron"; import { app } from "electron";
import { normalizePath } from "@main/helpers"; import { normalizePath } from "@main/helpers";
import { gamesSublevel, levelKeys } from "@main/level"; import { gameRepository } from "@main/repository";
const bundleBackup = async ( const bundleBackup = async (
shop: GameShop, shop: GameShop,
@ -46,7 +46,12 @@ const uploadSaveGame = async (
shop: GameShop, shop: GameShop,
downloadOptionTitle: string | null downloadOptionTitle: string | null
) => { ) => {
const game = await gamesSublevel.get(levelKeys.game(shop, objectId)); const game = await gameRepository.findOne({
where: {
objectID: objectId,
shop,
},
});
const bundleLocation = await bundleBackup( const bundleLocation = await bundleBackup(
shop, shop,
@ -84,7 +89,7 @@ const uploadSaveGame = async (
"Content-Type": "application/tar", "Content-Type": "application/tar",
}, },
onUploadProgress: (progressEvent) => { onUploadProgress: (progressEvent) => {
logger.log(progressEvent); console.log(progressEvent);
}, },
}); });

View file

@ -0,0 +1,9 @@
import { registerEvent } from "../register-event";
import { knexClient } from "@main/knex-client";
const deleteDownloadSource = async (
_event: Electron.IpcMainInvokeEvent,
id: number
) => knexClient("download_source").where({ id }).delete();
registerEvent("deleteDownloadSource", deleteDownloadSource);

View file

@ -0,0 +1,7 @@
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);

View file

@ -1,17 +0,0 @@
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);

View file

@ -1,21 +0,0 @@
import fs from "node:fs";
import path from "node:path";
import { registerEvent } from "../register-event";
const checkFolderWritePermission = async (
_event: Electron.IpcMainInvokeEvent,
testPath: string
) => {
const testFilePath = path.join(testPath, ".hydra-write-test");
try {
fs.writeFileSync(testFilePath, "");
fs.rmSync(testFilePath);
return true;
} catch (err) {
return false;
}
};
registerEvent("checkFolderWritePermission", checkFolderWritePermission);

View file

@ -1,10 +1,10 @@
import disk from "diskusage"; import checkDiskSpace from "check-disk-space";
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
) => disk.check(path); ) => checkDiskSpace(path);
registerEvent("getDiskFreeSpace", getDiskFreeSpace); registerEvent("getDiskFreeSpace", getDiskFreeSpace);

View file

@ -0,0 +1,44 @@
import { Document as YMLDocument } from "yaml";
import { Game } from "@main/entity";
import path from "node:path";
export const generateYML = (game: Game) => {
const slugifiedGameTitle = game.title.replace(/\s/g, "-").toLocaleLowerCase();
const doc = new YMLDocument({
name: game.title,
game_slug: slugifiedGameTitle,
slug: `${slugifiedGameTitle}-installer`,
version: "Installer",
runner: "wine",
script: {
game: {
prefix: "$GAMEDIR",
arch: "win64",
working_dir: "$GAMEDIR",
},
installer: [
{
task: {
name: "create_prefix",
arch: "win64",
prefix: "$GAMEDIR",
},
},
{
task: {
executable: path.join(
game.downloadPath!,
game.folderName!,
"setup.exe"
),
name: "wineexec",
prefix: "$GAMEDIR",
},
},
],
},
});
return doc.toString();
};

View file

@ -1,16 +1,15 @@
import { userPreferencesRepository } from "@main/repository";
import { defaultDownloadsPath } from "@main/constants"; import { defaultDownloadsPath } from "@main/constants";
import { db, levelKeys } from "@main/level";
import type { UserPreferences } from "@types";
export const getDownloadsPath = async () => { export const getDownloadsPath = async () => {
const userPreferences = await db.get<string, UserPreferences | null>( const userPreferences = await userPreferencesRepository.findOne({
levelKeys.userPreferences, where: {
{ id: 1,
valueEncoding: "json", },
} });
);
if (userPreferences?.downloadsPath) return userPreferences.downloadsPath; if (userPreferences && userPreferences.downloadsPath)
return userPreferences.downloadsPath;
return defaultDownloadsPath; return defaultDownloadsPath;
}; };

View file

@ -1,7 +0,0 @@
export const parseLaunchOptions = (params?: string | null): string[] => {
if (!params) {
return [];
}
return params.split(" ");
};

View file

@ -0,0 +1,31 @@
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);
};

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