From 442f940cc40cb4aa54c7747e416fa4ff6ed63cbb Mon Sep 17 00:00:00 2001 From: DecDuck Date: Fri, 1 Aug 2025 14:31:50 +1000 Subject: [PATCH 1/9] Translated using Weblate (English) (#151) Currently translated at 100.0% (456 of 456 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/en/ --- i18n/locales/en_us.json | 176 ++++++++++++++++++++-------------------- 1 file changed, 88 insertions(+), 88 deletions(-) diff --git a/i18n/locales/en_us.json b/i18n/locales/en_us.json index 84097d88..abb298f9 100644 --- a/i18n/locales/en_us.json +++ b/i18n/locales/en_us.json @@ -67,38 +67,6 @@ "signout": "Signout", "username": "Username" }, - "setup": { - "welcome": "Hey there.", - "welcomeDescription": "Welcome to Drop setup wizard. It will walk you through configuring Drop for the first time, and how it works.", - "finish": "Let's go {arrow}", - "noPage": "no page", - "auth": { - "title": "Authentication", - "description": "Authentication in Drop happens through multiple configured 'providers'. Each one can allow users to sign-in through their method. To get started, have at least one authentication provider enabled, and create an account through it.", - "docs": "Documentation {arrow}", - "enabled": "Enabled?", - "simple": { - "title": "Simple authentication", - "description": "Simple authentication uses username/password to authentication users. It is enabled by default if no other authentication provider is enabled.", - "register": "Register as admin {arrow}" - }, - "openid": { - "title": "OpenID Connect", - "description": "OpenID Connect (OIDC) is an OAuth2 extension commonly supported. Drop requires OIDC configuration to be done via environment variables.", - "skip": "I have a user with OIDC" - } - }, - "stages": { - "account": { - "name": "Setup your admin account.", - "description": "You need at least one account to start using Drop." - }, - "library": { - "name": "Create a library.", - "description": "Add at least one library source to use Drop." - } - } - }, "cancel": "Cancel", "chars": { "arrow": "→", @@ -107,6 +75,7 @@ "srComma": ", {0}" }, "common": { + "add": "Add", "cannotUndo": "This action cannot be undone.", "close": "Close", "create": "Create", @@ -126,8 +95,7 @@ "servers": "Servers", "srLoading": "Loading...", "tags": "Tags", - "today": "Today", - "add": "Add" + "today": "Today" }, "delete": "Delete", "drop": { @@ -284,9 +252,7 @@ "addToLib": "Add to Library", "admin": { "detectedGame": "Drop has detected you have new games to import.", - "detectedVersion": "Drop has detected you have new verions of this game to import.", - "offlineTitle": "Game offline", - "offline": "Drop couldn't access this game.", + "detectedVersion": "Drop has detected you have new versions of this game to import.", "game": { "addCarouselNoImages": "No images to add.", "addDescriptionNoImages": "No images to add.", @@ -307,6 +273,8 @@ }, "gameLibrary": "Game Library", "import": { + "bulkImportDescription": "When on, this page won't redirect you to the import task, so you can import multiple games in succession.", + "bulkImportTitle": "Bulk import mode", "import": "Import", "link": "Import {arrow}", "loading": "Loading game results...", @@ -317,8 +285,6 @@ "selectGamePlaceholder": "Please select a game...", "selectGameSearch": "Select game", "selectPlatform": "Please select a platform...", - "bulkImportTitle": "Bulk import mode", - "bulkImportDescription": "When on, this page won't redirect you to the import task, so you can import multiple games in succession.", "version": { "advancedOptions": "Advanced options", "import": "Import version", @@ -344,16 +310,64 @@ }, "withoutMetadata": "Import without metadata" }, + "metadata": { + "companies": { + "action": "Manage {arrow}", + "addGame": { + "description": "Pick a game to add to the company, and whether it should be listed as a developer, publisher, or both.", + "developer": "Developer?", + "noGames": "No games to add", + "publisher": "Publisher?", + "title": "Connect game to this company" + }, + "description": "Companies organize games by who they were developed or published by.", + "editor": { + "action": "Add Game {plus}", + "developed": "Developed", + "libraryDescription": "Add, remove, or customise what this company has developed and/or published.", + "libraryTitle": "Game Library", + "noDescription": "(no description)", + "published": "Published", + "uploadBanner": "Upload banner", + "uploadIcon": "Upload icon" + }, + "modals": { + "nameDescription": "Edit the company's name. Used to match to new game imports.", + "nameTitle": "Edit company name", + "shortDeckDescription": "Edit the company's description. Doesn't affect long (markdown) description.", + "shortDeckTitle": "Edit company description", + "websiteDescription": "Edit the company's website. Note: this will be a link, and won't have redirect protection.", + "websiteTitle": "Edit company website" + }, + "noCompanies": "No companies", + "noGames": "No games", + "search": "Search companies...", + "searchGames": "Search company games...", + "title": "Companies" + }, + "tags": { + "action": "Manage {arrow}", + "create": "Create", + "description": "Tags are automatically created from imported genres. You can add custom tags to add categorisation to your game library.", + "modal": { + "description": "Create a tag to organize your library.", + "title": "Create Tag" + }, + "title": "Tags" + } + }, "metadataProvider": "Metadata provider", "noGames": "No games imported", + "offline": "Drop couldn't access this game.", + "offlineTitle": "Game offline", "openEditor": "Open in Editor {arrow}", "openStore": "Open in Store", "shortDesc": "Short Description", "sources": { "create": "Create source", - "edit": "Edit source", "createDesc": "Drop will use this source to access your game library, and make them available.", "desc": "Configure your library sources, where Drop will look for new games and versions to import.", + "edit": "Edit source", "fsDesc": "Imports games from a path on disk. Requires version-based folder structure, and supports archived games.", "fsFlatDesc": "Imports games from a path on disk, but without a separate version subfolder. Useful when migrating an existing library to Drop.", "fsPath": "Path", @@ -373,53 +387,7 @@ "noVersions": "You have no versions of this game available.", "noVersionsAdded": "no versions added" }, - "versionPriority": "Version priority", - "metadata": { - "tags": { - "title": "Tags", - "description": "Tags are automatically created from imported genres. You can add custom tags to add categorisation to your game library.", - "action": "Manage {arrow}", - "create": "Create", - "modal": { - "title": "Create Tag", - "description": "Create a tag to organize your library." - } - }, - "companies": { - "title": "Companies", - "description": "Companies organize games by who they were developed or published by.", - "action": "Manage {arrow}", - "search": "Search companies...", - "searchGames": "Search company games...", - "noCompanies": "No companies", - "noGames": "No games", - "editor": { - "libraryTitle": "Game Library", - "libraryDescription": "Add, remove, or customise what this company has developed and/or published.", - "action": "Add Game {plus}", - "published": "Published", - "developed": "Developed", - "uploadIcon": "Upload icon", - "uploadBanner": "Upload banner", - "noDescription": "(no description)" - }, - "addGame": { - "title": "Connect game to this company", - "description": "Pick a game to add to the company, and whether it should be listed as a developer, publisher, or both.", - "publisher": "Publisher?", - "developer": "Developer?", - "noGames": "No games to add" - }, - "modals": { - "nameTitle": "Edit company name", - "nameDescription": "Edit the company's name. Used to match to new game imports.", - "shortDeckTitle": "Edit company description", - "shortDeckDescription": "Edit the company's description. Doesn't affect long (markdown) description.", - "websiteTitle": "Edit company website", - "websiteDescription": "Edit the company's website. Note: this will be a link, and won't have redirect protection." - } - } - } + "versionPriority": "Version priority" }, "back": "Back to Library", "collection": { @@ -490,6 +458,38 @@ "title": "Settings" } }, + "setup": { + "auth": { + "description": "Authentication in Drop happens through multiple configured 'providers'. Each one can allow users to sign-in through their method. To get started, have at least one authentication provider enabled, and create an account through it.", + "docs": "Documentation {arrow}", + "enabled": "Enabled?", + "openid": { + "description": "OpenID Connect (OIDC) is an OAuth2 extension commonly supported. Drop requires OIDC configuration to be done via environment variables.", + "skip": "I have a user with OIDC", + "title": "OpenID Connect" + }, + "simple": { + "description": "Simple authentication uses username/password to authentication users. It is enabled by default if no other authentication provider is enabled.", + "register": "Register as admin {arrow}", + "title": "Simple authentication" + }, + "title": "Authentication" + }, + "finish": "Let's go {arrow}", + "noPage": "no page", + "stages": { + "account": { + "description": "You need at least one account to start using Drop.", + "name": "Setup your admin account." + }, + "library": { + "description": "Add at least one library source to use Drop.", + "name": "Create a library." + } + }, + "welcome": "Hey there.", + "welcomeDescription": "Welcome to Drop setup wizard. It will walk you through configuring Drop for the first time, and how it works." + }, "store": { "about": "About", "commingSoon": "coming soon", @@ -568,6 +568,7 @@ "admin": { "adminHeader": "Admin?", "adminUserLabel": "Admin user", + "authLink": "Authentication {arrow}", "authentication": { "configure": "Configure", "description": "Drop supports a variety of \"authentication mechanisms\". As you enable or disable them, they are shown on the sign in screen for users to select from. Click the dot menu to configure the authentication mechanism.", @@ -579,7 +580,6 @@ "srOpenOptions": "Open options", "title": "Authentication" }, - "authLink": "Authentication {arrow}", "authoptionsHeader": "Auth Options", "delete": "Delete", "deleteUser": "Delete user {0}", From 545a6b154a2ca2d54296d1a1ded93cdd7f49915d Mon Sep 17 00:00:00 2001 From: DecDuck Date: Fri, 1 Aug 2025 16:26:27 +1000 Subject: [PATCH 2/9] Fix #119 (#153) --- package.json | 3 +++ yarn.lock | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 9f1e07a1..4f846929 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,9 @@ "private": true, "type": "module", "license": "AGPL-3.0-or-later", + "engines": { + "node": ">=22.16.0" + }, "scripts": { "build": "nuxt build", "dev": "nuxt dev", diff --git a/yarn.lock b/yarn.lock index f0f5195e..d6bd269f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2898,7 +2898,7 @@ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.18.tgz#529f24a88d3ed678d50fd5c07455841fbe8ac95e" integrity sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA== -"@vueuse/core@13.6.0", "@vueuse/core@^13.6.0": +"@vueuse/core@13.6.0": version "13.6.0" resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-13.6.0.tgz#4137f63dc4cef2ff8ae74ee146d6b6070d707878" integrity sha512-DJbD5fV86muVmBgS9QQPddVX7d9hWYswzlf4bIyUD2dj8GC46R1uNClZhVAmsdVts4xb2jwp1PbpuiA50Qee1A== From a435ead916ac770f4b38a4dc38abc964b4c28198 Mon Sep 17 00:00:00 2001 From: luzpaz Date: Fri, 1 Aug 2025 07:53:31 -0400 Subject: [PATCH 3/9] Fix various typos (#156) Found via `codespell -q 3 -S "./yarn.lock" -L pris` --- README.md | 2 +- server/internal/acls/descriptions.ts | 2 +- server/internal/clients/README.md | 2 +- server/internal/notifications/index.ts | 2 +- server/internal/objects/objectHandler.ts | 2 +- server/internal/tasks/index.ts | 2 +- server/plugins/01.system-init.ts | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 69ae3078..ed9d9c65 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ To add a game to the drop library, do as follows: 6. Navigate to http://your.drop.server.ip:3000/ 7. Import game metadata (uses GiantBomb API Key) by selecting the game and specifying which entry to import 8. Navigate to http://your.drop.server.ip:3000/admin/library -9. You should see the game which you have just imported listed in this menu. There should be a notification that "Drop has detected you have new verions of this game to import". Select import here. +9. You should see the game which you have just imported listed in this menu. There should be a notification that "Drop has detected you have new versions of this game to import". Select import here. 10. Select the game version to import and thus fill in fields as required. ## Tech Stack diff --git a/server/internal/acls/descriptions.ts b/server/internal/acls/descriptions.ts index ebb8d50a..1f090a13 100644 --- a/server/internal/acls/descriptions.ts +++ b/server/internal/acls/descriptions.ts @@ -19,7 +19,7 @@ export const userACLDescriptions: ObjectFromList = { "notifications:read": "Fetch this account's notifications.", "notifications:mark": "Mark notifications as read for this account.", - "notifications:listen": "Connect to a websocket to recieve notifications.", + "notifications:listen": "Connect to a websocket to receive notifications.", "notifications:delete": "Delete this account's notifications.", "screenshots:new": "Create screenshots for this account", diff --git a/server/internal/clients/README.md b/server/internal/clients/README.md index 0d158506..3007720d 100644 --- a/server/internal/clients/README.md +++ b/server/internal/clients/README.md @@ -16,7 +16,7 @@ Server sends redirect to `drop://handshake/[id]/[token]`, where the token is an ## 3. Client requests certificates -Client makes request: `POST /api/v1/client/auth/handshake` with the token recieved in the previous step. +Client makes request: `POST /api/v1/client/auth/handshake` with the token received in the previous step. The server uses it's CA to generate a public-private key pair, the CN of the client ID. It then sends that pair, plus the CA's public key, to the client, which stores it all. diff --git a/server/internal/notifications/index.ts b/server/internal/notifications/index.ts index f17d13f5..5585087f 100644 --- a/server/internal/notifications/index.ts +++ b/server/internal/notifications/index.ts @@ -1,5 +1,5 @@ /* -The notification system handles the recieving, creation and sending of notifications in Drop +The notification system handles the receiving, creation and sending of notifications in Drop Design goals: 1. Nonce-based notifications; notifications should only be created once diff --git a/server/internal/objects/objectHandler.ts b/server/internal/objects/objectHandler.ts index eb5379d9..21ec619d 100644 --- a/server/internal/objects/objectHandler.ts +++ b/server/internal/objects/objectHandler.ts @@ -195,7 +195,7 @@ export class ObjectHandler { * @returns * @description If we need to fetch a remote resource, it doesn't make sense * to immediately fetch the object, *then* check permissions. - * Instead the caller can pass a simple anonymous funciton, like + * Instead the caller can pass a simple anonymous function, like * () => $dropFetch('/my-image'); * And if we actually have permission to write, it fetches it then. */ diff --git a/server/internal/tasks/index.ts b/server/internal/tasks/index.ts index 8e75da1b..e7ee65fc 100644 --- a/server/internal/tasks/index.ts +++ b/server/internal/tasks/index.ts @@ -41,7 +41,7 @@ type TaskPoolEntry = FinishedTask & { * easily without re-inventing the wheel every time. */ class TaskHandler { - // registry of schedualed tasks to be created + // registry of scheduled tasks to be created private taskCreators: Map Task> = new Map(); // list of all currently running tasks diff --git a/server/plugins/01.system-init.ts b/server/plugins/01.system-init.ts index a28edbe7..edffdcc7 100644 --- a/server/plugins/01.system-init.ts +++ b/server/plugins/01.system-init.ts @@ -3,7 +3,7 @@ import prisma from "~/server/internal/db/database"; export default defineNitroPlugin(async (_nitro) => { // Ensure system user exists // The system user owns any user-based code - // that we want to re-use for the app + // that we want to reuse for the app // e.g. notifications await prisma.user.upsert({ where: { From 0b0972b48d39bd550a0663cb7e1752343b433a6c Mon Sep 17 00:00:00 2001 From: Husky <39809509+Huskydog9988@users.noreply.github.com> Date: Mon, 4 Aug 2025 02:30:22 -0400 Subject: [PATCH 4/9] Small IO tweaks, robots.txt, and README improvements (#173) * feat: add link to drop version in footer * feat: add drop logo aria label * feat: disable all crawling by bots for now i think this is a good default as all of drop is currently behind auth * feat: hide logo when inside wordmark for aria * docs: update readme and contributing * feat: default page in setup wizzard is img * ci: remove redundant perm in release ci * docs: update translation links and add progress image * fix: lang selector using wrong weblate link --- .github/workflows/release.yml | 3 -- CONTRIBUTING.md | 31 +++++++++++++++- README.md | 63 ++++++--------------------------- components/DropLogo.vue | 1 + components/DropWordmark.vue | 2 +- components/LanguageSelector.vue | 2 +- components/UserFooter.vue | 7 ++-- pages/setup.vue | 10 ++++-- public/robots.txt | 3 +- 9 files changed, 58 insertions(+), 64 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e244c816..8045e05d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,9 +8,6 @@ on: schedule: - cron: "0 2 * * *" # run at 2 AM UTC -permissions: - contents: read - jobs: web: name: Push website Docker image to registry diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5bb86362..9055675c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,11 +16,15 @@ you would make is not already covered. - [Reporting Issues](#reporting-issues) - [You have a problem](#you-have-a-problem) - [You have a suggestion](#you-have-a-suggestion) +- [Development](#development) + - [Note: `--optional` flag is **REQUIRED**](#note-optional-flag-is-required) + - [Tech Stack](#tech-stack) - [Submitting Pull Requests](#submitting-pull-requests) - [Getting started](#getting-started) - [You have a solution](#you-have-a-solution) - [You have an addition](#you-have-an-addition) - [Use the Search, Luke](#use-the-search-luke) +- [Translation](#translation) - [Commit Guidelines](#commit-guidelines) - [Format](#format) - [Style](#style) @@ -65,6 +69,31 @@ If you find one, comment on it, so we know more people are supporting it. If not, you can go ahead and create an issue. Please copy to anyone relevant (e.g. plugin maintainers) by mentioning their GitHub handle (starting with `@`) in your message. +## Development + +To get started with development, you need `yarn` and `docker compose` installed (or know how to set up a PostgreSQL database). + +Steps: + +1. Run `git submodule update --init --recursive` to setup submodules +1. Copy the `.env.example` to `.env` and add any api keys you need to use (e.g. for the Giant Bomb API) + - You can find other configuration options in the [documentation](https://docs.droposs.org/) +1. Create the `.data` directory with `mkdir .data` +1. Ensure that your user owns the `.data` directory with `sudo chown -R $(id -u $(whoami))` +1. Open up a terminal and navigate to `dev-tools`, and run `docker compose up` +1. Open up another terminal in the root directory of the project and run `yarn` and then `yarn prisma migrate dev` to setup the database +1. Run `yarn dev` to start the development server + +As part of the first-time bootstrap, Drop creates an invitation with the fixed id of 'admin'. So, to create an admin account, go to: + +http://localhost:3000/auth/register?id=admin + +### Tech Stack + +This repo uses the Nuxt 3 + TailwindCSS stack, with the `yarn` package manager. + +For the database, Drop uses Prisma connected to PostgreSQL. + ## Submitting Pull Requests ### Getting started @@ -132,7 +161,7 @@ and [create an issue](#reporting-issues) or [submit a PR](#submitting-pull-reque ## Translation -If you want to help translate Drop, we would love to have your help! You can do so on our weblate instance. Please make sure to read the [message format syntax](https://vue-i18n.intlify.dev/guide/essentials/syntax.html) page before starting. Failure to do so may result in your translations causing errors in Drop. +If you want to help translate Drop, we would love to have your help! You can do so on our [weblate instance](https://translate.droposs.org/engage/drop/). Please make sure to **read** the [message format syntax](https://vue-i18n.intlify.dev/guide/essentials/syntax.html) page before starting. We use this special syntax to enable high quality translations, and failure to do so may result in your translations **causing errors** in Drop. ## Commit Guidelines diff --git a/README.md b/README.md index ed9d9c65..9270659f 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,20 @@ # Drop [![Website](https://img.shields.io/badge/website-000000?style=for-the-badge&logo=About.me&logoColor=white)](https://droposs.org) +[![Docs](https://img.shields.io/badge/DOCS-black?style=for-the-badge&logo=docusaurus)](https://docs.droposs.org/) [![Static Badge](https://img.shields.io/badge/FORUM-blue?style=for-the-badge)](https://forum.droposs.org) [![GitHub License](https://img.shields.io/badge/AGPL--3.0-red?style=for-the-badge)](LICENSE) [![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/ACq4qZp4a9) [![Open Collective](https://img.shields.io/badge/OpenCollective-1F87FF?style=for-the-badge&logo=OpenCollective&logoColor=white)](https://opencollective.com/drop-oss) +[![Weblate project translated](https://img.shields.io/weblate/progress/drop?server=https%3A%2F%2Ftranslate.droposs.org&style=for-the-badge&logo=weblate) +](https://translate.droposs.org/engage/drop/) Drop is an open-source game distribution platform, like GameVault or Steam. It's designed to distribute and shared DRM-free game quickly, all while being incredibly flexible, beautiful and fast. +
+Drop Screenshot +
+ ## Philosophy 1. Drop is flexible. While abstractions and interfaces can make the codebase more complicated, the flexibility is worth it. @@ -21,58 +28,10 @@ Drop is an open-source game distribution platform, like GameVault or Steam. It's ## Deployment -To just deploy Drop, we've set up a simple docker compose file in deploy-template. - -1. Generate a [GiantBomb API Key](https://www.giantbomb.com/api/) -2. Navigate to the deploy-template directory in your terminal (`cd deploy-template`) -3. Edit the compose.yml file (`nano compose.yml`) and copy your GiamtBomb API Key into the GIANT_BOMB_API_KEY environment variable -4. Run `docker compose up -d` - -Your drop server should now be running. To register the admin user, navigate to http://your.drop.server.ip:3000/register?id=admin -and fill in the required forms - -### Adding a game - -To add a game to the drop library, do as follows: - -1. Ensure that the current user owns the library folder with `sudo chown -R $(id -u $(whoami)) library` -2. `cd library` -3. `mkdir ` with the name of the game which you would like to register -4. `cd ` -5. `mkdir ` Upload files for the specific game version to this folder -6. Navigate to http://your.drop.server.ip:3000/ -7. Import game metadata (uses GiantBomb API Key) by selecting the game and specifying which entry to import -8. Navigate to http://your.drop.server.ip:3000/admin/library -9. You should see the game which you have just imported listed in this menu. There should be a notification that "Drop has detected you have new versions of this game to import". Select import here. -10. Select the game version to import and thus fill in fields as required. - -## Tech Stack - -This repo uses the Nuxt 3 + TailwindCSS stack, with the `yarn` package manager. - -For the database, Drop uses Prisma connected to PostgreSQL. - -## Development - -To get started with development, you need `yarn --optional` and `docker compose` installed (or know how to set up a PostgreSQL database). - -### Note: `--optional` flag is **REQUIRED** - -Drop uses a utility package called droplet that's written in Rust. It has builts for Linux (GNU) and Windows, and they are set up as optional packages. `npm` installs these by default, but `yarn` needs the `--optional` flag. - -Steps: - -1. Run `git submodule update --init --recursive` to setup submodules -1. Copy the `.env.example` to `.env` and add your GiantBomb metadata key (more metadata providers coming) -1. Create the `.data` directory with `mkdir .data` -1. Ensure that your user owns the `.data` directory with `sudo chown -R $(id -u $(whoami))` -1. Open up a terminal and navigate to `dev-tools`, and run `docker compose up` -1. Open up another terminal in the root directory of the project and run `yarn` and then `yarn dev` to start the dev server - -As part of the first-time bootstrap, Drop creates an invitation with the fixed id of 'admin'. So, to create an admin account, go to: - -http://localhost:3000/auth/register?id=admin +See our documentation on how to [deploy Drop](https://docs.droposs.org/docs/guides/quickstart) for more information. ## Contributing -Please see the [in-depth contributing guide](CONTRIBUTING.md) +Please see the [in-depth contributing guide](CONTRIBUTING.md). The guide includes information on how to set up the project, how to contribute code, how to report issues, and even how to effectively translate Drop. + +[![Drop Translation Progress](https://translate.droposs.org/widget/drop/horizontal-auto.svg)](https://translate.droposs.org/engage/drop/) diff --git a/components/DropLogo.vue b/components/DropLogo.vue index 8645c5be..7dde7006 100644 --- a/components/DropLogo.vue +++ b/components/DropLogo.vue @@ -1,5 +1,6 @@ -

+ diff --git a/pages/setup.vue b/pages/setup.vue index 9e0e5ed5..2acdc1db 100644 --- a/pages/setup.vue +++ b/pages/setup.vue @@ -85,9 +85,15 @@ v-else-if="!useModal" class="bg-zinc-950/30 flex items-center justify-center" > -

+ +

diff --git a/public/robots.txt b/public/robots.txt index 8b137891..1f53798b 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1 +1,2 @@ - +User-agent: * +Disallow: / From e1dc26f6766a567a05a07b5595a278a95b23ef06 Mon Sep 17 00:00:00 2001 From: Mars7x <112448675+Mars7x@users.noreply.github.com> Date: Wed, 6 Aug 2025 03:48:25 -0400 Subject: [PATCH 5/9] README fixes (#174) --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9270659f..33cc5d0e 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ [![Weblate project translated](https://img.shields.io/weblate/progress/drop?server=https%3A%2F%2Ftranslate.droposs.org&style=for-the-badge&logo=weblate) ](https://translate.droposs.org/engage/drop/) -Drop is an open-source game distribution platform, like GameVault or Steam. It's designed to distribute and shared DRM-free game quickly, all while being incredibly flexible, beautiful and fast. +Drop is an open-source game distribution platform, similar to GameVault or Steam. It's designed to distribute and share DRM-free games quickly, all while being incredibly flexible, beautiful, and fast.
Drop Screenshot @@ -22,9 +22,9 @@ Drop is an open-source game distribution platform, like GameVault or Steam. It's ## Philosophy -1. Drop is flexible. While abstractions and interfaces can make the codebase more complicated, the flexibility is worth it. -2. Drop is secure. The nature of Drop means an instance can never be accessible without authentication. In line with #1, Drop also supports a huge variety of authentication mechanisms, from a username/password to SSO. -3. Drop is user-friendly. The interface is designed to be clean and simple to use, with complexity available to the users who want it. +1. Drop is flexible. While abstractions and interfaces can complicate the codebase, the flexibility is worth it. +2. Drop is secure. The nature of Drop means an instance can never be accessible without authentication. In line with #1, Drop also supports a huge variety of authentication mechanisms, from username/password to SSO. +3. Drop is user-friendly. The interface is designed to be clean and simple to use, with advanced features available to users who want them. ## Deployment From f6f972c2d6b8d330c1c7ccc221e813877edc4e32 Mon Sep 17 00:00:00 2001 From: DecDuck Date: Wed, 6 Aug 2025 17:49:07 +1000 Subject: [PATCH 6/9] Translations update from Weblate (#172) * Translated using Weblate (English) Currently translated at 100.0% (458 of 458 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/en/ * Translated using Weblate (English (en_PIRATE)) Currently translated at 80.7% (370 of 458 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/en_PIRATE/ * Translated using Weblate (English) Currently translated at 100.0% (458 of 458 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/en/ * Translated using Weblate (English (en_PIRATE)) Currently translated at 83.4% (382 of 458 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/en_PIRATE/ * Added translation using Weblate (Russian) * Translated using Weblate (French) Currently translated at 49.1% (225 of 458 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/fr/ * Translated using Weblate (German) Currently translated at 54.3% (249 of 458 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/de/ * Translated using Weblate (German) Currently translated at 54.3% (249 of 458 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/de/ * Translated using Weblate (Russian) Currently translated at 6.1% (28 of 458 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/ru/ * Translated using Weblate (English (en_PIRATE)) Currently translated at 84.0% (385 of 458 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/en_PIRATE/ * Translated using Weblate (French) Currently translated at 97.8% (448 of 458 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/fr/ * Translated using Weblate (French) Currently translated at 97.8% (448 of 458 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/fr/ * Translated using Weblate (German) Currently translated at 68.5% (314 of 458 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/de/ * Translated using Weblate (German) Currently translated at 68.5% (314 of 458 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/de/ * Translated using Weblate (German) Currently translated at 68.5% (314 of 458 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/de/ * Translated using Weblate (English) Currently translated at 100.0% (458 of 458 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/en/ * Translated using Weblate (French) Currently translated at 97.3% (446 of 458 strings) Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/fr/ * Update translation files Updated by "Remove blank strings" add-on in Weblate. Translation: Drop/Drop Translate-URL: http://translate.droposs.org/projects/drop/drop/ --------- Co-authored-by: Husky Co-authored-by: Ribemont Francois Co-authored-by: Hicks Co-authored-by: Kuschiniko Co-authored-by: Dmitrii Co-authored-by: Weblate Translation Memory Co-authored-by: Weblate --- i18n/locales/de.json | 481 +++++++++++++++++++++++++++- i18n/locales/en_pirate.json | 42 ++- i18n/locales/en_us.json | 30 +- i18n/locales/fr.json | 616 +++++++++++++++++++++++++++++++++++- i18n/locales/ru.json | 40 +++ 5 files changed, 1182 insertions(+), 27 deletions(-) create mode 100644 i18n/locales/ru.json diff --git a/i18n/locales/de.json b/i18n/locales/de.json index 0967ef42..9b2322cc 100644 --- a/i18n/locales/de.json +++ b/i18n/locales/de.json @@ -1 +1,480 @@ -{} +{ + "account": { + "devices": { + "capabilities": "Möglichkeiten", + "lastConnected": "Zuletzt verbunden", + "noDevices": "Keine Geräte sind mit deinem Konto verbunden.", + "platform": "Plattform", + "revoke": "Wiederrufen", + "title": "Geräte" + }, + "notifications": { + "all": "Alle anzeigen {arrow}", + "desc": "Benachrichtigungen anzeigen und verwalten.", + "markAllAsRead": "Alles als gelesen markieren", + "markAsRead": "Als gelesen Markieren", + "none": "Keine Benachrichtigungen", + "notifications": "Benachrichtigungen", + "title": "Benachrichtigungen", + "unread": "Ungelesene Benachrichtigungen" + }, + "settings": "Einstellungen", + "title": "Kontoeinstellungen" + }, + "actions": "Aktionen", + "add": "Hinzufügen", + "adminTitle": "Administrator Dashbord - Drop", + "adminTitleTemplate": "{0} - Administrator - Drop", + "auth": { + "callback": { + "authClient": "Client autorisieren?", + "authorize": "Autorisieren", + "authorizedClient": "Drop hat den Client erfolgreich autorisiert. Du darfst dieses Fenster nun schließen.", + "issues": "Probleme?", + "learn": "Mehr erfahren {arrow}", + "paste": "Füge diesen Code in den Client ein, um fortzufahren:", + "permWarning": "Das akzeptieren dieser Anfrage erlaubt \"{name}\" auf \"{plattform}\" folgende Berechtigungen:", + "requestedAccess": "\"{name}\" hat Zugriff auf dein Drop Konto angefordert.", + "success": "Erfolgreich!" + }, + "code": { + "description": "Verwende ein Code, um dein Drop Client zu verbinden, wenn dein Gerät kein Webbrowser öffnen kann.", + "title": "Verbinde dein Drop Client" + }, + "displayName": "Anzeigename", + "email": "E-Mail", + "password": "Passwort", + "register": { + "confirmPasswordFormat": "Muss mit oben genanntem übereinstimmen", + "emailFormat": "Muss im Format nutzer{'@'}beispiel.de sein", + "passwordFormat": "Muss mindestens 14 Zeichen enthalten", + "subheader": "Gebe unten deine Daten ein, um dein Konto zu erstellen.", + "title": "Erstelle dein Drop Konto", + "usernameFormat": "Muss mindestens 5 Zeichen enthalten und aus Kleinbuchstaben bestehen" + }, + "signin": { + "externalProvider": "Bei externem Anbieter anmelden {arrow}", + "forgot": "Passwort vergessen?", + "noAccount": "Noch kein Konto? Bitten den Administrator, eines für dich zu erstellt.", + "or": "ODER", + "pageTitle": "Bei Drop anmelden", + "rememberMe": "An mich erinnern", + "signin": "Anmelden", + "title": "Melde dich bei deinem Konto an" + }, + "signout": "Ausloggen", + "username": "Nutzername" + }, + "cancel": "Abbrechen", + "chars": { + "arrow": "→", + "arrowBack": "←", + "quoted": "\"\"", + "srComma": ", {0}" + }, + "common": { + "add": "Hinzufügen", + "cannotUndo": "Diese Aktion kann nicht rückgängig gemacht werden.", + "close": "Schließen", + "create": "Erstellen", + "date": "Datum", + "deleteConfirm": "Möchtest du \"{0}\" wirklich löschen?", + "divider": "{'|'}", + "edit": "Bearbeiten", + "friends": "Freunde", + "groups": "Gruppen", + "insert": "Einfügen", + "name": "Name", + "noResults": "Keine Ergebnisse", + "noSelected": "Keine Elemente ausgewählt.", + "remove": "Entfernen", + "save": "Speichern", + "saved": "Gespeichert", + "servers": "Server", + "srLoading": "Lade…", + "tags": "Tags", + "today": "Heute" + }, + "delete": "Löschen", + "drop": { + "desc": "Eine Open-Source-Plattform für die Verteilung von Spielen, die auf Geschwindigkeit, Flexibilität und Ästhetik ausgelegt ist.", + "drop": "Drop" + }, + "editor": { + "bold": "Fett", + "boldPlaceholder": "fettgedruckter Text", + "code": "Code", + "codePlaceholder": "code", + "heading": "Überschrift", + "headingPlaceholder": "überschrift", + "italic": "Kursiv", + "italicPlaceholder": "kursiver Text", + "link": "Link", + "linkPlaceholder": "link Text", + "listItem": "Listenelement", + "listItemPlaceholder": "listenelement" + }, + "errors": { + "admin": { + "user": { + "delete": { + "desc": "Drop konnte diesen Benutzer nicht löschen: {0}", + "title": "Benutzer konnte nicht gelöscht werden" + } + } + }, + "auth": { + "disabled": "Ungültiges oder deaktiviertes Konto. Bitte kontaktiere einen Server Administrator.", + "invalidInvite": "Ungültige oder abgelaufene Einladung", + "invalidPassState": "Ungültiger Passwortzustand. Bitte kontaktiere einen Server Administrator.", + "invalidUserOrPass": "Ungültiger Nutzername oder Passwort.", + "inviteIdRequired": "id erforderlich beim Abrufen der Einladung", + "method": { + "signinDisabled": "Anmeldemethode nicht aktiviert" + }, + "usernameTaken": "Nutzername bereits vergeben." + }, + "backHome": "{arrow} Zurück zur Startseite", + "game": { + "banner": { + "description": "Das Aktualisieren des Banners ist fehlgeschlagen: {0}", + "title": "Das Aktualisieren des Banners ist fehlgeschlagen" + }, + "carousel": { + "description": "Das Aktualisieren des Bildkarussells ist fehlgeschlagen: {0}", + "title": "Das Aktualisieren des Bildkarussells ist fehlgeschlagen" + }, + "cover": { + "description": "Das Aktualisieren des Titelbildes ist fehlgeschlagen: {0}", + "title": "Das Aktualisieren des Titelbildes ist fehlgeschlagen" + }, + "deleteImage": { + "description": "Das Löschen des Bildes ist fehlgeschlagen: {0}", + "title": "Das Löschen des Bildes ist fehlgeschlagen" + }, + "description": { + "description": "Das Aktualisieren der Spielbeschreibung ist fehlgeschlagen: {0}", + "title": "Das Aktualisieren der Spielbeschreibung ist fehlgeschlagen" + }, + "metadata": { + "description": "Das Aktualisieren der Spielmetadaten ist fehlgeschlagen: {0}", + "title": "Das Aktualisieren der Spielmetadaten ist fehlgeschlagen" + } + }, + "invalidBody": "Ungültiger Anfragenkörper: {0}", + "inviteRequired": "Registrierung nur mit Einladung möglich.", + "library": { + "add": { + "desc": "Drop konnte dieses Spiel nicht zu deiner Bibliothek hinzufügen: {0}", + "title": "Das Spiel konnte nicht zur Bibliothek hinzugefügt werden" + }, + "collection": { + "create": { + "desc": "Das Erstellen der Sammlung ist fehlgeschlagen: {0}", + "title": "Das Erstellen der Sammlung ist fehlgeschlagen" + } + }, + "source": { + "delete": { + "desc": "Das Löschen der Quelle ist fehlgeschlagen: {0}", + "title": "Das Löschen der Quellbibliothek ist fehlgeschlagen" + } + } + }, + "news": { + "article": { + "delete": { + "desc": "Das Löschen des Artikels ist fehlgeschlagen: {0}", + "title": "Das Löschen des Artikels ist fehlgeschlagen" + } + } + }, + "occurred": "Bei der Bearbeitung deiner Anfrage ist ein Fehler aufgetreten. Wenn du glaubst, dass es sich um einen Bug handelt, melde diesen bitte. Versuche dich anzumelden, um zu sehen, ob dadurch das Problem behoben wird.", + "ohNo": "Oh nein!", + "pageTitle": "{0} | Drop", + "signIn": "Anmelden {arrow}", + "support": "Support Discord", + "unknown": "Ein unbekannter Fehler ist aufgetreten", + "upload": { + "description": "Drop konnte die Datei nicht hochladen: {0}", + "title": "Das hochladen der Datei ist Fehlgeschlagen" + }, + "version": { + "delete": { + "desc": "Beim Löschen der Version ist ein Fehler aufgetreten: {error}", + "title": "Beim Löschen der Version ist ein Fehler aufgetreten" + }, + "order": { + "desc": "Beim Aktualisieren der Version ist ein Fehler aufgetreten: {error}", + "title": "Beim Aktualisieren der Versionsreihenfolge ist ein Fehler aufgetreten" + } + } + }, + "footer": { + "about": "Über", + "aboutDrop": "Über Drop", + "comparison": "Vergleich", + "docs": { + "client": "Client Dokumentation", + "server": "Server Dokumentation" + }, + "documentation": "Dokumentation", + "findGame": "Finde ein Spiel", + "footer": "Fußzeile", + "games": "Spiels", + "social": { + "discord": "Discord", + "github": "GitHub" + }, + "topSellers": "Bestseller", + "version": "Drop {version} {gitRef}" + }, + "header": { + "admin": { + "admin": "Administrator", + "settings": "Einstellungen", + "tasks": "Aufgaben", + "users": "Benutzer" + }, + "back": "Zurück", + "openSidebar": "Öffne Seitenleiste" + }, + "helpUsTranslate": "Hilf uns Drop zu übersetzen {arrow}", + "home": "Startseite", + "library": { + "addGames": "Alle Spiele", + "addToLib": "Zur Bibliothek hinzufügen", + "admin": { + "detectedGame": "Drop hat erkannt, dass du ein neues Spiel importieren kannst.", + "detectedVersion": "Drop hat erkannt, dass du eine neue Version dieses Spiels importieren kannst.", + "game": { + "addCarouselNoImages": "Keine Bilder zum hinzufügen.", + "addDescriptionNoImages": "Keine Bilder zum hinzufügen." + }, + "import": { + "version": { + "import": "Version Importieren", + "launchDesc": "Ausführbare Datei zum starten des Spiels", + "launchPlaceholder": "spiel.exe", + "loadingVersion": "Lade Versionsmetadaten…", + "noAdv": "Keine erweiterten Optionen für diese Konfiguration.", + "noVersions": "Keine Version zum importieren", + "setupMode": "Einrichtungsmodus", + "setupPlaceholder": "setup.exe", + "umuLauncherId": "UMU Launcher ID", + "updateMode": "Aktualisierungsmodus", + "version": "Wähle die Version für den Import aus" + }, + "withoutMetadata": "Ohne Metadaten importieren" + }, + "metadata": { + "companies": { + "action": "Verwalte {arrow}", + "addGame": { + "developer": "Entwickler?", + "noGames": "Keine Spiele zum hinzufügen", + "publisher": "Publisher?" + }, + "editor": { + "action": "Spiel hinzufügen {plus}", + "developed": "Entwickelt", + "libraryDescription": "Hinzufügen, bearbeiten oder entfernen, was diese Firma entwickelt und/oder veröffentlicht hat.", + "libraryTitle": "Spielebibliothek", + "noDescription": "(Keine Beschreibung)", + "published": "Veröffentlicht", + "uploadBanner": "Banner hochladen", + "uploadIcon": "Icon hochladen" + }, + "modals": { + "shortDeckDescription": "Bearbeite die Firmenbeschreibung. Beeinträchtigt nicht die Lange (markdown) Beschreibung.", + "shortDeckTitle": "Bearbeite Firmenbeschreibung" + } + }, + "tags": { + "action": "Verwalte {arrow}", + "create": "Erstellen" + } + }, + "metadataProvider": "Metadatenanbieter", + "noGames": "Keine Spiele importiert", + "offline": "Drop konnte auf dieses Spiel nicht zugreifen.", + "offlineTitle": "Spiel offline", + "openEditor": "Im Editor öffnen {arrow}", + "openStore": "Im Store öffnen", + "sources": { + "fsPath": "Pfad", + "fsPathDesc": "Absoluter Pfad zur Spielebibliothek.", + "fsPathPlaceholder": "/mnt/spiele" + }, + "title": "Bibliotheken", + "version": { + "noVersions": "Du hast keine verfügbare Version dieses Spiels.", + "noVersionsAdded": "keine Versionen hinzugefügt" + }, + "versionPriority": "Versions Priorität" + }, + "back": "Zurück zur Bibliothek", + "collection": { + "addToNew": "Zur neuen Sammlung hinzufügen", + "collections": "Sammlungen", + "create": "Sammlung erstellen", + "createDesc": "Sammlungen können genutzt werden, um deine Spiele zu organisieren und sie einfacher zu finden. Besonders bei großen Bibliotheken.", + "delete": "Sammlung löschen", + "namePlaceholder": "Sammlungsname", + "noCollections": "Keine Sammlungen", + "notFound": "Sammlung nicht gefunden", + "subheader": "Füge eine neue Sammlung hinzu, um deine Spiele zu organisieren", + "title": "Sammlung" + }, + "gameCount": "{0} Spiele | {0} Spiele | {0} Spiele", + "inLib": "In der Bibliothek", + "launcherOpen": "Im Launcher öffnen", + "noGames": "Keine Spiele in der Bibliothek", + "notFound": "Spiel nicht gefunden", + "search": "Durchsuche Bibliothek…" + }, + "news": { + "article": { + "add": "Hinzufügen", + "create": "Neuen Artikel erstellen", + "editor": "Editor", + "new": "Neuer Artikel", + "preview": "Vorschau", + "titles": "Titel" + }, + "delete": "Artikel löschen", + "filter": { + "month": "Diesen Monat", + "week": "Diese Woche", + "year": "Dieses Jahr" + }, + "none": "Keine Artikel", + "notFound": "Artikel nicht gefunden", + "search": "Suche Artikel", + "searchPlaceholder": "Suche Artikel…" + }, + "options": "Einstellungen", + "security": "Sicherheit", + "selectLanguage": "Sprache auswählen", + "settings": { + "admin": { + "description": "Konfiguriere Drop Einstellungen", + "title": "Einstellungen" + } + }, + "setup": { + "auth": { + "docs": "Dokumentation {arrow}", + "enabled": "Aktiviert?", + "openid": { + "description": "OpenID Connect (OIDC) ist eine oft unterstützte OAuth2 Erweiterung. Drop erfordert die Konfiguration von OIDC über Umgebungsvariablen.", + "title": "OpenID Connect" + }, + "simple": { + "description": "Die einfache Authentifizierung verwendet Nutzername und Password zur Authentifizierung von Benutzern. Sie ist standartmäßig aktiviert, wenn kein anderer Authentifizierungsanbieter aktiviert ist.", + "title": "Einfache Authentifizierung" + }, + "title": "Authentifizierung" + }, + "finish": "Los geht's {arrow}", + "stages": { + "account": { + "description": "Du benötigst mindestens ein Konto, um Drop zu benutzen.", + "name": "Richte dein Administratorkonto ein." + }, + "library": { + "name": "Erstelle eine Bibliothek." + } + }, + "welcome": "Hallo.", + "welcomeDescription": "Willkommen zum Drop Einrichtungsassistenten. Er führt dich durch die erstmalige Konfiguration von Drop und erklärt dir, wie es funktioniert." + }, + "store": { + "about": "Über", + "developers": "Entwickler | Entwickler | Entwickler", + "exploreMore": "Mehr entdecken {arrow}", + "featured": "Empfohlen", + "noDevelopers": "Keine Entwickler", + "noGame": "Kein Spiel", + "noImages": "Keine Bilder", + "platform": "Plattform | Plattform | Plattform", + "rating": "Bewertung", + "recentlyAdded": "Kürzlich hinzugefügt", + "recentlyReleased": "Kürzlich veröffentlicht", + "recentlyUpdated": "Kürzlich aktualisiert", + "released": "Veröffentlicht", + "reviews": "({0} Bewertungen)", + "view": { + "sort": "Sortieren", + "srFilters": "Filter", + "srGames": "Spiele" + }, + "website": "Webseite" + }, + "tasks": { + "admin": { + "scheduled": { + "cleanupInvitationsName": "Einladungen bereinigen", + "cleanupSessionsName": "Sitzungen bereinigen." + } + } + }, + "title": "Drop", + "titleTemplate": "{0} - Drop", + "upload": "Hochladen", + "uploadFile": "Datei hochladen", + "userHeader": { + "closeSidebar": "Seitenleiste schließen", + "links": { + "library": "Bibliothek" + }, + "profile": { + "settings": "Kontoeinstellungen" + } + }, + "users": { + "admin": { + "adminHeader": "Administrator?", + "authLink": "Authentifizierung {arrow}", + "authentication": { + "configure": "Konfigurieren", + "disabled": "Deaktiviert", + "enabled": "Aktiviert", + "enabledKey": "Aktiviert?", + "oidc": "OpenID Connect", + "srOpenOptions": "Einstellungen öffnen", + "title": "Authentifizierung" + }, + "authoptionsHeader": "Authentifizierungseinstellungen", + "delete": "Löschen", + "deleteUser": "Benutzer löschen {0}", + "displayNameHeader": "Anzeigename", + "emailHeader": "E-Mail", + "normalUserLabel": "Normaler Benutzer", + "simple": { + "createInvitation": "Einladung erstellen", + "invitationTitle": "Einladungen", + "invite3Days": "3 Tage", + "invite6Months": "6 Monate", + "inviteAdminSwitchDescription": "Erstelle diesen Benutzer als Administrator", + "inviteButton": "Einladung", + "inviteEmailLabel": "E-Mail-Adresse (optional)", + "inviteMonth": "1 Monat", + "inviteNever": "Niemals", + "inviteTitle": "Ein Benutzer zu Drop einladen", + "inviteUsernameFormat": "Muss mindestens 5 Zeichen lang sein", + "inviteUsernameLabel": "Nutzername (optional)", + "inviteWeek": "1 Woche", + "inviteYear": "1 Jahr", + "neverExpires": "Läuft niemals ab.", + "noEmailEnforced": "Keine E-Mail erforderlich.", + "noInvitations": "Keine Einladungen.", + "noUsernameEnforced": "Kein Nutzername erforderlich.", + "title": "Einfache Authentifizierung", + "userInvitation": "Benutzereinladung" + }, + "srEditLabel": "Bearbeiten", + "usernameHeader": "Nutzername" + } + } +} diff --git a/i18n/locales/en_pirate.json b/i18n/locales/en_pirate.json index e93be77d..22c1dd38 100644 --- a/i18n/locales/en_pirate.json +++ b/i18n/locales/en_pirate.json @@ -19,7 +19,7 @@ "title": "Messages from the Crows' Nest", "unread": "Unread Messages" }, - "settings": "Account Settings, savvy?", + "settings": "Settings, savvy?", "title": "Yer Own Coffer" }, "actions": "Deeds", @@ -38,6 +38,10 @@ "requestedAccess": "\"{name}\" has requested passage to yer Drop coffer.", "success": "Shiver me timbers, it worked!" }, + "code": { + "description": "Use the secret map to dock ye ship when lacking a web surfer.", + "title": "Dock ye ship" + }, "confirmPassword": "Confirm @:auth.password", "displayName": "Yer Scallywag Name", "email": "Salty Mail", @@ -71,6 +75,7 @@ "srComma": ", {0}" }, "common": { + "add": "Append", "cannotUndo": "This deed cannot be undone, ye hear!", "close": "Shut yer trap!", "create": "Forge!", @@ -83,9 +88,12 @@ "insert": "Insert", "name": "Name, argh!", "noResults": "No plunder found!", + "noSelected": "No cargo selected.", + "remove": "Walk the plank", "save": "Stow it!", + "saved": "Preserved", "servers": "Ships", - "srLoading": "Loading, loading, argh...", + "srLoading": "Loading, loading, argh…", "tags": "Marks", "today": "Today" }, @@ -228,6 +236,8 @@ "header": { "admin": { "admin": "Cap'n", + "metadata": "Meta argh", + "settings": "Shape", "tasks": "Duties", "users": "Crew" }, @@ -263,16 +273,18 @@ }, "gameLibrary": "Game Treasure Hoard", "import": { + "bulkImportDescription": "When importing ye versions, ye won't be sent to the import duty.", + "bulkImportTitle": "Plunder the imports", "import": "Import, ye dog!", "link": "Import {arrow}", - "loading": "Loadin' plunder results, arrr...", + "loading": "Loadin' plunder results, arrr…", "search": "Search", "searchPlaceholder": "Fallout 4, savvy?", - "selectDir": "Pick a directory, ye landlubber...", + "selectDir": "Pick a directory, ye landlubber…", "selectGame": "Pick plunder to import", - "selectGamePlaceholder": "Pick a game, ye dog...", + "selectGamePlaceholder": "Pick a game, ye dog…", "selectGameSearch": "Pick game", - "selectPlatform": "Pick a ship, ye scallywag...", + "selectPlatform": "Pick a ship, ye scallywag…", "version": { "advancedOptions": "Advanced options, savvy?", "import": "Import version", @@ -280,7 +292,7 @@ "launchCmd": "Launch executable/command, argh!", "launchDesc": "Executable to launch the game, matey!", "launchPlaceholder": "game.exe, aye!", - "loadingVersion": "Loading version charts...", + "loadingVersion": "Loading version charts…", "noAdv": "No advanced options for this rig, argh.", "noVersions": "No versions to import, savvy!", "platform": "Ship type", @@ -298,6 +310,16 @@ }, "withoutMetadata": "Import without charts" }, + "metadata": { + "companies": { + "action": "Shape {arrow}", + "addGame": { + "developer": "Creator?", + "noGames": "No games to plunder", + "publisher": "Distributor?" + } + } + }, "metadataProvider": "Charts Provider", "noGames": "No plunder imported, savvy!", "openEditor": "Open in Editor {arrow}", @@ -345,7 +367,7 @@ "launcherOpen": "Open in Launcher, argh!", "noGames": "No plunder in treasure hoard, savvy!", "notFound": "Plunder not found, matey!", - "search": "Search treasure hoard, ye dog...", + "search": "Search treasure hoard, ye dog…", "subheader": "Sort yer plunder into collections for easy access, and get to all yer plunder, savvy!" }, "lowest": "lowest", @@ -360,7 +382,7 @@ "preview": "Preview, matey!", "shortDesc": "Short description", "submit": "Submit, ye scurvy dog!", - "tagPlaceholder": "Add a mark, ye dog...", + "tagPlaceholder": "Add a mark, ye dog…", "titles": "Title, argh!", "uploadCover": "Hoist cover image" }, @@ -376,7 +398,7 @@ "none": "No articles, savvy!", "notFound": "Article not found, matey!", "search": "Search articles, ye dog!", - "searchPlaceholder": "Search articles, argh...", + "searchPlaceholder": "Search articles, argh…", "subheader": "Stay up to date with the latest charts and announcements, savvy!", "title": "Latest News from the High Seas" }, diff --git a/i18n/locales/en_us.json b/i18n/locales/en_us.json index abb298f9..128f250d 100644 --- a/i18n/locales/en_us.json +++ b/i18n/locales/en_us.json @@ -39,8 +39,8 @@ "success": "Successful!" }, "code": { - "title": "Connect your Drop client", - "description": "Use a code to connect your Drop client if you are unable to open a web browser on your device." + "description": "Use a code to connect your Drop client if you are unable to open a web browser on your device.", + "title": "Connect your Drop client" }, "confirmPassword": "Confirm @:auth.password", "displayName": "Display Name", @@ -93,7 +93,7 @@ "save": "Save", "saved": "Saved", "servers": "Servers", - "srLoading": "Loading...", + "srLoading": "Loading…", "tags": "Tags", "today": "Today" }, @@ -178,7 +178,7 @@ }, "source": { "delete": { - "desc": "Drop couldn't add delete this source: {0}", + "desc": "Drop couldn't delete this source: {0}", "title": "Failed to delete library source" } } @@ -273,18 +273,18 @@ }, "gameLibrary": "Game Library", "import": { - "bulkImportDescription": "When on, this page won't redirect you to the import task, so you can import multiple games in succession.", + "bulkImportDescription": "When on this page, you won't be redirect to the import task, so you can import multiple games in succession.", "bulkImportTitle": "Bulk import mode", "import": "Import", "link": "Import {arrow}", - "loading": "Loading game results...", + "loading": "Loading game results…", "search": "Search", "searchPlaceholder": "Fallout 4", - "selectDir": "Please select a directory...", + "selectDir": "Please select a directory…", "selectGame": "Select game to import", - "selectGamePlaceholder": "Please select a game...", + "selectGamePlaceholder": "Please select a game…", "selectGameSearch": "Select game", - "selectPlatform": "Please select a platform...", + "selectPlatform": "Please select a platform…", "version": { "advancedOptions": "Advanced options", "import": "Import version", @@ -292,7 +292,7 @@ "launchCmd": "Launch executable/command", "launchDesc": "Executable to launch the game", "launchPlaceholder": "game.exe", - "loadingVersion": "Loading version metadata...", + "loadingVersion": "Loading version metadata…", "noAdv": "No advanced options for this configuration.", "noVersions": "No versions to import", "platform": "Version platform", @@ -341,8 +341,8 @@ }, "noCompanies": "No companies", "noGames": "No games", - "search": "Search companies...", - "searchGames": "Search company games...", + "search": "Search companies…", + "searchGames": "Search company games…", "title": "Companies" }, "tags": { @@ -407,7 +407,7 @@ "launcherOpen": "Open in Launcher", "noGames": "No games in library", "notFound": "Game not found", - "search": "Search library...", + "search": "Search library…", "subheader": "Organize your games into collections for easy access, and access all your games." }, "lowest": "lowest", @@ -422,7 +422,7 @@ "preview": "Preview", "shortDesc": "Short description", "submit": "Submit", - "tagPlaceholder": "Add a tag...", + "tagPlaceholder": "Add a tag…", "titles": "Title", "uploadCover": "Upload cover image" }, @@ -438,7 +438,7 @@ "none": "No articles", "notFound": "Article not found", "search": "Search articles", - "searchPlaceholder": "Search articles...", + "searchPlaceholder": "Search articles…", "subheader": "Stay up to date with the latest updates and announcements.", "title": "Latest News" }, diff --git a/i18n/locales/fr.json b/i18n/locales/fr.json index 0967ef42..7113dd33 100644 --- a/i18n/locales/fr.json +++ b/i18n/locales/fr.json @@ -1 +1,615 @@ -{} +{ + "account": { + "devices": { + "noDevices": "Aucun appareil n'est connecté à vôtre compte.", + "platform": "Plateforme", + "revoke": "Révoquer", + "subheader": "Gérer les appareils authorisés à accéder à votre compte Drop.", + "title": "Appareils" + }, + "notifications": { + "all": "Tout voir {arrow}", + "desc": "Voir et gérer vos notifications.", + "markAllAsRead": "Tout marqué comme lu", + "markAsRead": "Marquer comme lu", + "none": "Pas de notifications", + "notifications": "Notifications", + "title": "Notifications", + "unread": "Notifications non lues" + }, + "settings": "Paramètres", + "title": "Paramètres du compte" + }, + "actions": "Actions", + "add": "Ajouter", + "adminTitle": "Tableau de Bord Administratif - Drop", + "adminTitleTemplate": "{0} - Administration - Drop", + "auth": { + "callback": { + "authClient": "Authoriser le client ?", + "authorize": "Authoriser", + "authorizedClient": "Drop a réussi a autoriser le client. Vous pouvez fermer cette fenêtre.", + "issues": "Vous avez des problèmes ?", + "learn": "En savoir plus {arrow}", + "paste": "Coller ce code dans le client pour continuer :", + "permWarning": "Accepter cette requête autorisera \"{name}\" sur \"{plateform} à :", + "requestedAccess": "\"{name} a demandé accès à votre compte Drop.", + "success": "Réussi !" + }, + "code": { + "description": "Utiliser un code pour vous connecter à votre client Drop si vous ne pouvez pas ouvrir un navigateur web sur votre appareil.", + "title": "Connecter votre client Drop" + }, + "displayName": "Nom d'Affichage", + "email": "Email", + "password": "Mot de passe", + "register": { + "confirmPasswordFormat": "Doit être pareil qu'au dessus", + "emailFormat": "Doit être au format utilisateur{'@'}exemple.com", + "passwordFormat": "Doit être au moins 14 caractères ou plus", + "subheader": "Remplissez vos coordonnées pour créer votre compte.", + "title": "Créer votre compte Drop", + "usernameFormat": "Doit être au moins 5 caractères et en minuscules" + }, + "signin": { + "externalProvider": "Connectez vous avec un fournisseur externe {arrow}", + "forgot": "Mot de passe oublié ?", + "noAccount": "Pas de compte ? Demande à un administrateur d'en créer un pour toi.", + "or": "OU", + "pageTitle": "Se connecter à Drop", + "rememberMe": "Se souvenir de moi", + "signin": "Se connecter", + "title": "Se connecter à votre compte" + }, + "signout": "Déconnexion", + "username": "Nom d'utilisateur" + }, + "cancel": "Annuler", + "chars": { + "arrow": "→", + "arrowBack": "←", + "quoted": "\"\"", + "srComma": ", {0}" + }, + "common": { + "add": "Ajouter", + "cannotUndo": "Cette action ne peut pas être défaite.", + "close": "Fermer", + "create": "Créer", + "date": "Date", + "deleteConfirm": "Êtes vous sûr de vouloir supprimer \"{0}\" ?", + "divider": "{'|'}", + "edit": "Éditer", + "friends": "Amis", + "groups": "Groupes", + "insert": "Insérer", + "name": "Nom", + "noResults": "Pas de résultat", + "noSelected": "Pas d'élément sélectionné.", + "remove": "Retirer", + "save": "Sauvegarder", + "saved": "Sauvegardé", + "servers": "Serveurs", + "srLoading": "Chargement…", + "tags": "Étiquettes", + "today": "Aujourd'hui" + }, + "delete": "Supprimer", + "drop": { + "desc": "Une plateforme de distribution libre conçue pour être rapide, flexible et belle.", + "drop": "Drop" + }, + "editor": { + "bold": "Gras", + "boldPlaceholder": "Caractères gras", + "code": "Code", + "codePlaceholder": "code", + "heading": "En-tête", + "headingPlaceholder": "en-tête", + "italic": "Italique", + "italicPlaceholder": "texte italique", + "link": "Lien", + "listItem": "Élement de liste", + "listItemPlaceholder": "élément de liste" + }, + "errors": { + "admin": { + "user": { + "delete": { + "desc": "Drop n'a pas pu supprimer cet utilisateur : {0}", + "title": "Échec de la suppression de l'utilisateur" + } + } + }, + "auth": { + "disabled": "Compte invalide or désactivé. Merci de contacter l'administrateur du serveur.", + "invalidInvite": "Invitation invalide ou expirée", + "invalidUserOrPass": "Nom d'utilisateur ou password invalide.", + "inviteIdRequired": "id est requis pour récupérer l'invitation", + "method": { + "signinDisabled": "Méthode de connexion non activée" + }, + "usernameTaken": "Nom d'utilisateur déjà pris." + }, + "backHome": "{arrow} Retour a l'accueil", + "game": { + "banner": { + "description": "Drop a échoué a mettre à jour l'image de la bannière : {0}", + "title": "Échec de la mise à jour de l'image de la bannière" + }, + "carousel": { + "description": "Drop a échoué a mettre a jour le carrousel à images : {0}", + "title": "Échec de la mise à jour du carrousel à images" + }, + "cover": { + "description": "Drop a échoué à mettre à jour l'image de couverture : {0}", + "title": "Échec de la mise à jour de l'image de couverture" + }, + "deleteImage": { + "description": "Drop a échoué à supprimer l'image : {0}", + "title": "Échec de la suppression de l'image" + }, + "description": { + "description": "Drop a échoué à mettre à jour la description du jeu : {0}", + "title": "Échec de la mise à jour de la description du jeu" + }, + "metadata": { + "description": "Drop a échoué à mettre à jour les données méta : {0}", + "title": "Échec de la mise à jour des données méta" + } + }, + "invalidBody": "Corps de requête non valide : {0}", + "inviteRequired": "Invitation requise pour créer un compte.", + "library": { + "add": { + "desc": "Drop n'a pas pu ajouter ce jeu à votre bibliothèque : {0}", + "title": "Échec de l'ajout du jeu à la bibliothèque" + }, + "collection": { + "create": { + "desc": "Drop n'a pas pu créer votre collection : {0}", + "title": "Échec de la création de la collection" + } + }, + "source": { + "delete": { + "desc": "Drop n'a pas pu supprimer cette source : {0}", + "title": "Échec de la suppression de la source de bibliothèque" + } + } + }, + "news": { + "article": { + "delete": { + "desc": "Drop n'a pas pu supprimer cet article : {0}", + "title": "Échec de la suppression de l'article" + } + } + }, + "occurred": "Une erreur s'est produite en réponse à vôtre requête. Si vous pensez que c'est un bug, merci de le rapporter. Essayer de vous connecter et voyez si cela résoud le problème.", + "ohNo": "Oh non !", + "pageTitle": "{0} | Drop", + "revokeClient": "Échec de la révocation du client", + "revokeClientFull": "Échec de la revocation du client {0}", + "signIn": "Se connecter {arrow}", + "unknown": "Une erreur inconnue est survenue", + "upload": { + "description": "Drop n'a pas pu uploader le fichier : {0}", + "title": "Échec de l'upload du fichier" + }, + "version": { + "delete": { + "desc": "Drop a rencontré une erreur pendant la suppression de la version : {error}", + "title": "Une erreur est survenue pendant la supression de la version" + }, + "order": { + "desc": "Drop a rencontré une erreur pendant la mise a jour de la version : {error}", + "title": "Une erreur est survenue pendant la mise a jour de l'ordre des versions" + } + } + }, + "footer": { + "about": "À propos", + "aboutDrop": "À propos de Drop", + "comparison": "Comparaison", + "docs": { + "client": "Documentation du client", + "server": "Documentation du serveur" + }, + "documentation": "Documentation", + "findGame": "Trouver un jeu", + "footer": "Pied de page", + "games": "Jeux", + "social": { + "discord": "Discord", + "github": "GitHub" + }, + "topSellers": "Meilleures Ventes", + "version": "Drop {version} {gitRef}" + }, + "header": { + "admin": { + "admin": "Administration", + "metadata": "Méta", + "settings": "Paramètres", + "tasks": "Tâches", + "users": "Utilisateurs" + }, + "back": "Retour", + "openSidebar": "Ouvrir la barre latérale" + }, + "helpUsTranslate": "Aidez nous à traduire Drop {arrow}", + "highest": "le plus haut", + "home": "Accueil", + "library": { + "addGames": "Tous les jeux", + "addToLib": "Ajouter à la bibliothèque", + "admin": { + "detectedGame": "Drop a détecté que vous avez des nouveaux jeux a importer.", + "detectedVersion": "Drop a détecté que vous avez des nouvelles versions de ce jeu à importer.", + "game": { + "addCarouselNoImages": "Pas d'image a ajouter.", + "addDescriptionNoImages": "Pas d'image à ajouter.", + "addImageCarousel": "Ajouter à partir d'une bibliothèque d'images", + "currentBanner": "bannière", + "currentCover": "couverture", + "deleteImage": "Supprimer l'image", + "editGameDescription": "Description du jeu", + "editGameName": "Nom du jeu", + "imageCarousel": "Carrousel d'images", + "imageCarouselDescription": "Personnaliser quelles images et dans quel ordre elles sont affichées sur la page du Store.", + "imageCarouselEmpty": "Aucune image n'a encore été ajoutée au carousel.", + "imageLibrary": "Bibliothèque d'images", + "imageLibraryDescription": "Veuillez noter que toutes les images uploadées sont accessible a tous les utilisateurs via des outils de développement des navigateurs.", + "removeImageCarousel": "Retirer l'image", + "setBanner": "Définir comme bannière", + "setCover": "Définir comme couverture" + }, + "gameLibrary": "Bibliothèque de jeux", + "import": { + "bulkImportDescription": "Lorsque vous êtes sur cette page, vous ne serez pas redirigé sur la tâche d'importation, pour que vous puissiez importer plusieurs jeux successivement.", + "bulkImportTitle": "Mode d'importation de masse", + "import": "Importer", + "link": "Imported {arrow}", + "loading": "Chargement des résultats des jeux…", + "search": "Rechercher", + "searchPlaceholder": "Fallout 4", + "selectDir": "Merci de choisir un dossier…", + "selectGame": "Sélectionnez le jeu à importer", + "selectGamePlaceholder": "Merci de sélectionner un jeu…", + "selectGameSearch": "Sélectionner un jeu", + "selectPlatform": "Merci de sélectionner une plateforme…", + "version": { + "advancedOptions": "Options avancées", + "import": "Importer une version", + "installDir": "(install_dir)/", + "launchCmd": "Lancer l'exécutable/commande", + "launchDesc": "Exécutable pour lancer le jeu", + "launchPlaceholder": "jeu.exe", + "loadingVersion": "Chargement des métadonnées de la version…", + "noAdv": "Pas d'option avancée pour cette configuration.", + "noVersions": "Pas de version à importer", + "platform": "Version de la plateforme", + "setupCmd": "Exécutable/commande d'installation", + "setupDesc": "Exécuté une fois lorsque le jeu a été installé", + "setupMode": "Mode de configuration", + "setupModeDesc": "Lorsqu'elle est activée, cette version n'a pas de commande de lancement, et exécute simplement l'exécutable sur l'ordinateur de l'utilisateur. Utile pour les jeux qui distribue uniquement des fichiers d'installation et non les fichiers portables.", + "setupPlaceholder": "setup.exe", + "umuLauncherId": "UMU Launcher ID", + "umuOverride": "Remplacer l'ID de jeu du lanceur UMU", + "umuOverrideDesc": "Par défaut, Drop utilise un non-ID pour lancer les jeux avec UMU Launcher. Pour récupérer les bons patchs pour certains jeux, vous pourriez avoir besoin de changer ce champ manuellement.", + "updateMode": "Mode de mise à jour", + "updateModeDesc": "Lorsqu'ils sont activés, ces fichiers seront installés par-dessus (remplaçant) la version précédente. Si plusieurs \"modes de mise à jour\" sont enchaînés, ils sont appliqués dans l'ordre.", + "version": "Sélectionner la version à importer" + }, + "withoutMetadata": "Importer sans les données méta" + }, + "metadata": { + "companies": { + "action": "Gérer {arrow}", + "addGame": { + "description": "Choisissez un jeu à ajouter à la société, et si il faudrait la lister en tant que développeur, éditeur, ou les deux.", + "developer": "Développeur ?", + "noGames": "Pas de jeu à ajouter", + "publisher": "Éditeur ?", + "title": "Connecter le jeu a cette société" + }, + "description": "Les sociétés organisent les jeux par qui les a développer ou éditer.", + "editor": { + "action": "Ajouter un jeu {plus}", + "developed": "Développé", + "libraryDescription": "Ajouter, supprimer ou personnaliser ce que cette société a développé et/ou publié.", + "libraryTitle": "Bibliothèque de jeux", + "noDescription": "(pas de description)", + "published": "Publié", + "uploadBanner": "Uploader bannière", + "uploadIcon": "Uplader icône" + }, + "modals": { + "nameDescription": "Éditer le nom de la société. Ce nom est utilisé pour trouver les jeux nouvellement importés.", + "nameTitle": "Éditer le nom de la société", + "shortDeckDescription": "Éditer la description de la company. Cela n'affecte pas la description longue (markdown).", + "shortDeckTitle": "Éditer la description de la société", + "websiteDescription": "Éditer le site internet de la société. Note : cela sera un lien, et ne bénéficiera pas de la protection aux redirects.", + "websiteTitle": "Éditer le site internet de la société" + }, + "noCompanies": "Pas de société", + "noGames": "Pas de jeu", + "search": "Chercher des sociétés…", + "searchGames": "Chercher les jeux de l'entreprise…", + "title": "Sociétés" + }, + "tags": { + "action": "Gérer {arrow}", + "create": "Créer", + "description": "Les tags sont automatiquement créés à partir des genres importés. Vous pouvez ajouter des tags personnalisés pour ajouter la catégorisation de votre bibliothèque de jeux.", + "modal": { + "description": "Créer un tag pour organiser votre bibliothèque.", + "title": "Créer un tag" + }, + "title": "Tags" + } + }, + "metadataProvider": "Fournisseur de données méta", + "noGames": "Pas de jeu importé", + "offline": "Drop n'a pas pu accéder à ce jeu.", + "offlineTitle": "Jeu hors-ligne", + "openEditor": "Ouvrir dans l'éditeur {arrow}", + "openStore": "Ouvrir dans le Store", + "shortDesc": "Description Courte", + "sources": { + "create": "Créer une source", + "createDesc": "Drop va utiliser cette source pour accéder à votre bibliothèque de jeux, et les rendre disponible.", + "desc": "Configurer vos sources de bibliothèques où Drop va regarder pour les nouveaux jeux et versions à importer.", + "edit": "Éditer la source", + "fsDesc": "Importe les jeux à partir d'un chemin d'accès sur le disque. Cela requière une structure des dossiers basées sur la version, et qui supporte les jeux archivés.", + "fsFlatDesc": "Importe les jeux à partir d'un chemin d’accès sur le disque, mais sans le sous-dossier version séparé. Utile pour migrer une bibliothèque vers Drop.", + "fsPath": "Chemin d’accès", + "fsPathDesc": "Un chemin d’accès absolu à votre bibliothèque de jeux.", + "fsPathPlaceholder": "/mnt/jeux", + "link": "Sources {arrow}", + "nameDesc": "Le nom de votre source, pour référence.", + "namePlaceholder": "Mes Nouvelle Source", + "sources": "Sources de Bibliothèques", + "typeDesc": "Le type de source. Affecte les options requises.", + "working": "Marche ?" + }, + "subheader": "Lorsque que vous rajoutez des dossiers à vos sources de bibliothèques, Drop le détectera et vous demandera de les importer. Chaque jeu a besoin d’être importé avant que vous puissiez importer une version.", + "title": "Bibliothèques", + "version": { + "delta": "Mode de mise à jour", + "noVersions": "Vous n'avez aucune version de ce jeu de disponible.", + "noVersionsAdded": "pas de version ajoutée" + }, + "versionPriority": "Priorité des versions" + }, + "back": "Retour à la Bibliothèque", + "collection": { + "addToNew": "Ajouter à une nouvelle collection", + "collections": "Collections", + "create": "Créer une Collection", + "createDesc": "Les collections peuvent être utilisées pour organiser vos jeux et vous permettre de les trouver plus facilement, surtout si vous possédez une grosse bibliothèque.", + "delete": "Supprimer la Collection", + "namePlaceholder": "Nom de la collection", + "noCollections": "Pas de collection", + "notFound": "Collection non trouvée", + "subheader": "Ajouter une nouvelle collection pour organiser vos jeux", + "title": "Collection" + }, + "gameCount": "{0} jeux | {0} jeu | {0} jeux", + "inLib": "Dans la Bibliothèque", + "launcherOpen": "Ouvrir dans le Launcher", + "noGames": "Pas de jeu dans la bibliothèque", + "notFound": "Jeu non trouvé", + "search": "Chercher bibliothèque…", + "subheader": "Organiser vos jeux en collections pour un accès facile, et accéder à tous vos jeux." + }, + "lowest": "le plus bas", + "news": { + "article": { + "add": "Ajouter", + "content": "Contenu (Markdown)", + "create": "Créer un Nouvel Article", + "editor": "Éditeur", + "editorGuide": "Utilisez les raccourcis ci-dessus ou écrivez en Markdown directement. Supporte **gras**, *italique*, [lines](adresse), et plus.", + "new": "Nouvel article", + "preview": "Aperçu", + "shortDesc": "Description courte", + "submit": "Soumettre", + "tagPlaceholder": "Ajouter un tag…", + "titles": "Titre", + "uploadCover": "Uploader l'image de couverture" + }, + "back": "Retour aux Nouvelles", + "checkLater": "Vérifier plus tard pour les mises à jour.", + "delete": "Supprimer l'Article", + "filter": { + "month": "Ce mois", + "week": "Cette semaine", + "year": "Cette année" + }, + "none": "Pas d'article", + "notFound": "Article non trouvé", + "search": "Chercher des articles", + "searchPlaceholder": "Chercher des articles…", + "subheader": "Rester à jour avec les dernières mises à et annonces.", + "title": "Dernières Nouvelles" + }, + "options": "Options", + "security": "Sécurité", + "selectLanguage": "Sélectionner la langue", + "settings": { + "admin": { + "description": "Configurer les paramètres de Drop", + "store": { + "dropGameAltPlaceholder": "Exemple d'icône de Jeu", + "dropGameDescriptionPlaceholder": "Ceci est un jeu exemple. Il sera remplacé si vous importez un jeu.", + "dropGameNamePlaceholder": "Jeu Exemple", + "showGamePanelTextDecoration": "Afficher le titre et la description sur les tuiles de jeu (par défaut : activé)", + "title": "Store" + }, + "title": "Paramètres" + } + }, + "setup": { + "auth": { + "description": "Authentification sur Drop se passe à travers multiple 'fournisseurs' pré-configuré. Chaque fournisseur peut autoriser des utilisateurs à se connecter via leurs méthodes. Pour commencer, aillez au moins un fournisseur d'authentification d'activé, et créer un compte via celui-ci.", + "docs": "Documentation {arrow}", + "enabled": "Activé ?", + "openid": { + "description": "OpenID Connect (OIDC) est une extension OAuth2 communément supportée. Drop requière que la configuration OIDC se fasse via des variables d'environnement.", + "skip": "J'ai un utiliser avec OIDC", + "title": "OpenID Connect" + }, + "simple": { + "description": "L'authentification simple utilise le nom d'utiliser et mot de passe pour authentifier les utilisateurs. Elle est activée par défaut si aucun autre fournisseur d'authentification est activé.", + "register": "Créer un compte administrateur", + "title": "Authentification simple" + }, + "title": "Authentification" + }, + "finish": "C'est parti {arrow}", + "noPage": "Pas de page", + "stages": { + "account": { + "description": "Vous avez besoin d'au moins un compte pour démarrer Drop.", + "name": "Configurez votre compte administrateur." + }, + "library": { + "description": "Ajouter au moins une source de bibliothèques pour utiliser Drop.", + "name": "Créer une bibliothèque." + } + }, + "welcome": "Salut.", + "welcomeDescription": "Bienvenue dans l'assistant de configuration de Drop. Il va aidera configurer Drop pour la première fois, et vous expliquera son fonctionnement." + }, + "store": { + "about": "À propos", + "commingSoon": "prochainement", + "exploreMore": "Explorer plus {arrow}", + "featured": "Mis en avant", + "images": "Images de Jeux", + "noDevelopers": "Pas de développeur", + "noGame": "pas de jeu", + "noImages": "Pas d'image", + "noPublishers": "Pas d'éditeur.", + "noTags": "Pas de tag", + "openAdminDashboard": "Ouvrir dans le Tableau de Bord d'Administration", + "platform": "Plateforme | Plateforme | Plateformes", + "publishers": "Éditeurs | Éditeur | Éditeurs", + "rating": "Note", + "readLess": "Cliquez pour lire moins", + "readMore": "Clique pour lire plus", + "recentlyAdded": "Ajouté Récemment", + "recentlyReleased": "Récemment publié", + "recentlyUpdated": "Récemment Mis à Jour", + "released": "Publié", + "reviews": "({0} Avis)", + "tags": "Tags", + "title": "Store", + "view": { + "sort": "Trier", + "srFilters": "Filtres", + "srGames": "Jeux", + "srViewGrid": "Voir grille" + }, + "viewInStore": "Voir dans le Store", + "website": "Site internet" + }, + "tasks": { + "admin": { + "back": "{arrow} Retour aux Tâches", + "completedTasksTitle": "Tâches complétées", + "dailyScheduledTitle": "Tâches quotidiennes planifiées", + "noTasksRunning": "Pas de tâche en cours", + "runningTasksTitle": "Tâches en cours d'exécution", + "scheduled": { + "checkUpdateDescription": "Vérifier si Drop a une mise à jour.", + "checkUpdateName": "Vérifier la mise à jour.", + "cleanupInvitationsDescription": "Nettoie les invitations expirées de la base de données pour économiser de l'espace.", + "cleanupInvitationsName": "Nettoie les invitations", + "cleanupObjectsDescription": "Détecte et supprime les objets non référencés et non utilisés pour économiser de l'espace.", + "cleanupObjectsName": "Nettoyer les objets", + "cleanupSessionsDescription": "Nettoie les sessions expirées pour économiser de l'espace et assurer la sécurité.", + "cleanupSessionsName": "Nettoie les sessions." + }, + "viewTask": "Voir {arrow}", + "weeklyScheduledTitle": "Tâches hebdomadaires planifiées" + } + }, + "title": "Drop", + "titleTemplate": "{0} - Drop", + "todo": "À faire", + "type": "Type", + "upload": "Uploader", + "uploadFile": "Uploader fichier", + "userHeader": { + "closeSidebar": "Fermer la barre latérale", + "links": { + "community": "Communauté", + "library": "Bibliothèque", + "news": "Nouvelles" + }, + "profile": { + "admin": "Tableau de Bord Administratif", + "settings": "Paramètres du compte" + } + }, + "users": { + "admin": { + "adminHeader": "Administrateur ?", + "adminUserLabel": "Administrateur", + "authLink": "Authentification {arrow}", + "authentication": { + "configure": "Configurer", + "description": "Drop supporte une variété de \"mécanismes d'authentification\". Lorsque vous les activez ou les désactivez, ils sont affichés sur la page de connection pour que les utilisateurs puissent les sélectionner. Cliquer sur le menu à points pour configurer le mécanisme d'authentification.", + "disabled": "Désactivé", + "enabled": "Activé", + "oidc": "OpenID Connect", + "simple": "Simple (nom d'utilisateur/mot de passe)", + "srOpenOptions": "Ouvrir les options", + "title": "Authentification" + }, + "delete": "Supprimer", + "deleteUser": "Supprimer l'utilisateur {0}", + "description": "Gérer les utilisateurs sur votre instance Drop, et configurer vos méthodes d'authentification.", + "displayNameHeader": "Nom d'affichage", + "emailHeader": "Email", + "normalUserLabel": "Utilisateur normal", + "simple": { + "adminInvitation": "Invitation adminstrateur", + "createInvitation": "Créer invitation", + "description": "L'authentification simple utilise un système d'invitations pour créer les utilisateurs. Tu peux créer une invitation et optionnellement spécifier le nom d'utilisateur ou email de cet utilisateur, et un lien magique sera généré un lien magique qui peut être utilisé pour créer le compte.", + "expires": "Expire : {expiry}", + "invitationTitle": "invitations", + "invite3Days": "3 jours", + "invite6Months": "6 mois", + "inviteAdminSwitchDescription": "Créer cet utilisateur en tant qu'adminstrateur", + "inviteAdminSwitchLabel": "Invitation adminstrateur", + "inviteButton": "Invitation", + "inviteDescription": "Drop va générer une adresse que vous pouvez envoyer à la personne que vous voulez inviter. Vous pouvez optionnellement spécifier un nom d'utilisateur ou une adresse e-mail qu'elle pourra utiliser.", + "inviteEmailDescription": "Doit être dans le format utilisateur{'@'}exemple.com", + "inviteEmailLabel": "E-mail adresse (optionnel)", + "inviteEmailPlaceholder": "moi{'@'}exemple.com", + "inviteExpiryLabel": "Expire", + "inviteMonth": "1 mois", + "inviteNever": "Jamais", + "inviteTitle": "Inviter l'utilisateur sur Drop", + "inviteUsernameFormat": "Doit être 5 caractères ou plus", + "inviteUsernameLabel": "Nom d'utilisateur (optionnel)", + "inviteUsernamePlaceholder": "monNomDUtilisateur", + "inviteWeek": "1 semaine", + "inviteYear": "1 an", + "neverExpires": "N'expire jamais.", + "noEmailEnforced": "Pas d'e-mail imposé.", + "noInvitations": "Pas d'invitation.", + "noUsernameEnforced": "Pas de nom d'utilisateur imposé.", + "title": "Authentication simple", + "userInvitation": "Invitation utilisateur" + }, + "srEditLabel": "Éditer", + "usernameHeader": "Nom d'utilisateur" + } + }, + "welcome": "Américain, bienvenue !" +} diff --git a/i18n/locales/ru.json b/i18n/locales/ru.json new file mode 100644 index 00000000..8c3d08fb --- /dev/null +++ b/i18n/locales/ru.json @@ -0,0 +1,40 @@ +{ + "account": { + "devices": { + "capabilities": "Возможности", + "lastConnected": "Последнее подключение", + "noDevices": "К вашей учетной записи не подключено ни одного устройства.", + "platform": "Платформа", + "subheader": "Управляйте устройствами, имеющими доступ к вашей учетной записи Drop.", + "title": "Устройства" + }, + "notifications": { + "all": "Показать все {arrow}", + "desc": "Просмотр и управление уведомлениями.", + "markAllAsRead": "Отметить все как прочитанные", + "markAsRead": "Отметить как прочитанное", + "none": "Нет уведомлений", + "notifications": "Уведомления", + "title": "Уведомления", + "unread": "Непрочитанные уведомления" + }, + "settings": "Настройки", + "title": "Настройки учетной записи" + }, + "actions": "Действия", + "add": "Добавить", + "adminTitle": "Панель администратора - Drop", + "adminTitleTemplate": "{0} - Админ - Drop", + "auth": { + "callback": { + "authClient": "Авторизовать клиента?", + "authorize": "Авторизовать", + "authorizedClient": "Drop успешно авторизовал клиента. Теперь вы можете закрыть это окно.", + "issues": "Есть проблемы?", + "learn": "Узнать больше {arrow}", + "paste": "Вставьте этот код в клиент, чтобы продолжить:", + "permWarning": "Принятие этого запроса позволит \"{name}\" на \"{platform}\" выполнять следующие действия:", + "requestedAccess": "\"{name}\" запросил доступ к вашей учетной записи Drop." + } + } +} From b84d1f20b5610b0f43ad3c4d749d448e61c0ba26 Mon Sep 17 00:00:00 2001 From: DecDuck Date: Sat, 9 Aug 2025 15:45:39 +1000 Subject: [PATCH 7/9] v2 download API and Admin UI fixes (#177) * fix: small ui fixes * feat: #171 * fix: improvements to library scanning on admin UI * feat: v2 download API * fix: add download context cleanup * fix: lint --- app.vue | 42 +++++ components/Modal/CreateCompany.vue | 148 ++++++++++++++++++ components/StoreView.vue | 2 +- i18n/locales/en_us.json | 23 ++- nuxt.config.ts | 1 + pages/admin/metadata/companies/[id]/index.vue | 11 +- pages/admin/metadata/companies/index.vue | 29 ++-- pages/store/index.vue | 25 ++- server/api/v1/admin/company/index.post.ts | 47 ++++++ server/api/v1/index.get.ts | 1 + server/api/v2/client/chunk.post.ts | 73 +++++++++ server/api/v2/client/context.post.ts | 22 +++ server/internal/downloads/coordinator.ts | 71 ++++++++- server/internal/downloads/manifest.ts | 2 +- server/internal/library/index.ts | 37 +++-- server/middleware/latency.ts | 3 + server/tasks/downloadCleanup.ts | 11 ++ 17 files changed, 504 insertions(+), 44 deletions(-) create mode 100644 components/Modal/CreateCompany.vue create mode 100644 server/api/v1/admin/company/index.post.ts create mode 100644 server/api/v2/client/chunk.post.ts create mode 100644 server/api/v2/client/context.post.ts create mode 100644 server/middleware/latency.ts create mode 100644 server/tasks/downloadCleanup.ts diff --git a/app.vue b/app.vue index c70e8047..26c93ff8 100644 --- a/app.vue +++ b/app.vue @@ -4,10 +4,52 @@ +
+
+ {{ + $t("errors.externalUrl.title") + }} + {{ + $t("errors.externalUrl.subtitle") + }} +
+ +