mirror of
https://github.com/modrinth/code.git
synced 2026-08-01 13:45:53 +00:00
Compare commits
12
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6257940747 | ||
|
|
47c60788ff | ||
|
|
d1e8a9c574 | ||
|
|
7bf85239de | ||
|
|
6380dd16d5 | ||
|
|
2376d571bb | ||
|
|
e7926083fb | ||
|
|
a686a93858 | ||
|
|
2876890fe5 | ||
|
|
4c869d2a37 | ||
|
|
525f60c389 | ||
|
|
042a27a17c |
@@ -81,6 +81,6 @@ Please follow these rules precisely:
|
||||
Use existing patterns from our codebase:
|
||||
|
||||
- Variables/plurals: see `apps/frontend/src/pages/frog.vue`
|
||||
- Rich-text link tags: see `apps/frontend/src/error.vue`
|
||||
- Rich-text link tags: see `apps/frontend/src/pages/auth/welcome.vue` and `apps/frontend/src/error.vue`
|
||||
|
||||
When you finish, there should be no hard-coded English strings left in the template—everything comes from `formatMessage` or `<IntlFormatted>`.
|
||||
|
||||
@@ -20,6 +20,14 @@ on:
|
||||
required: true
|
||||
type: string
|
||||
description: 'The environment to deploy to (staging-preview or production-preview)'
|
||||
head_sha:
|
||||
required: false
|
||||
type: string
|
||||
description: 'The commit SHA to deploy (defaults to github.sha)'
|
||||
head_ref:
|
||||
required: false
|
||||
type: string
|
||||
description: 'The branch name to deploy (defaults to github.ref_name)'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.environment || 'push' }}
|
||||
@@ -40,12 +48,14 @@ jobs:
|
||||
|
||||
- name: Configure environment
|
||||
id: meta
|
||||
env:
|
||||
ENV_INPUT: ${{ inputs.environment }}
|
||||
REF: ${{ github.ref }}
|
||||
DEPLOY_SHA: ${{ inputs.head_sha || github.sha }}
|
||||
run: |
|
||||
echo "cmd=deploy" >> $GITHUB_OUTPUT
|
||||
|
||||
ENV_INPUT="${{ inputs.environment }}"
|
||||
REF="${{ github.ref }}"
|
||||
SHA_SHORT="${GITHUB_SHA::8}"
|
||||
SHA_SHORT="${DEPLOY_SHA::8}"
|
||||
|
||||
if [ "$ENV_INPUT" = "staging-preview" ]; then
|
||||
echo "env=staging" >> $GITHUB_OUTPUT
|
||||
@@ -106,8 +116,8 @@ jobs:
|
||||
working-directory: ./apps/frontend
|
||||
run: pnpm build
|
||||
env:
|
||||
CF_PAGES_BRANCH: ${{ github.ref_name }}
|
||||
CF_PAGES_COMMIT_SHA: ${{ github.sha }}
|
||||
CF_PAGES_BRANCH: ${{ inputs.head_ref || github.ref_name }}
|
||||
CF_PAGES_COMMIT_SHA: ${{ inputs.head_sha || github.sha }}
|
||||
CF_PAGES_URL: ${{ steps.meta.outputs.url }}
|
||||
BUILD_ENV: ${{ steps.meta.outputs.env }}
|
||||
PREVIEW: ${{ inputs.environment != '' && 'true' || 'false' }}
|
||||
|
||||
@@ -24,6 +24,8 @@ jobs:
|
||||
environment: [staging-preview, production-preview]
|
||||
with:
|
||||
environment: ${{ matrix.environment }}
|
||||
head_sha: ${{ github.event.pull_request.head.sha }}
|
||||
head_ref: ${{ github.event.pull_request.head.ref }}
|
||||
|
||||
deploy-storybook:
|
||||
if: github.repository_owner == 'modrinth' && github.event.pull_request.head.repo.full_name == github.repository
|
||||
@@ -68,7 +70,9 @@ jobs:
|
||||
|
||||
- name: Configure short SHA
|
||||
id: meta
|
||||
run: echo "sha_short=${GITHUB_SHA::8}" >> $GITHUB_OUTPUT
|
||||
env:
|
||||
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
||||
run: echo "sha_short=${HEAD_SHA::8}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Deploy Storybook preview
|
||||
uses: cloudflare/wrangler-action@9acf94ace14e7dc412b076f2c5c20b8ce93c79cd # v3.15.0
|
||||
@@ -93,6 +97,8 @@ jobs:
|
||||
|
||||
- name: Read deployment URLs
|
||||
id: urls
|
||||
env:
|
||||
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
||||
run: |
|
||||
STAGING_PREVIEW_URL=$(cat deployment-url-staging-preview.txt)
|
||||
PRODUCTION_PREVIEW_URL=$(cat deployment-url-production-preview.txt)
|
||||
@@ -102,7 +108,7 @@ jobs:
|
||||
|
||||
echo "staging-preview-url=$STAGING_PREVIEW_URL" >> $GITHUB_OUTPUT
|
||||
echo "production-preview-url=$PRODUCTION_PREVIEW_URL" >> $GITHUB_OUTPUT
|
||||
echo "storybook-preview-url=https://git-${GITHUB_SHA::8}-storybook.modrinth.workers.dev" >> $GITHUB_OUTPUT
|
||||
echo "storybook-preview-url=https://git-${HEAD_SHA::8}-storybook.modrinth.workers.dev" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Find comment
|
||||
if: github.event_name == 'pull_request'
|
||||
@@ -123,7 +129,7 @@ jobs:
|
||||
body: |
|
||||
## Frontend previews
|
||||
|
||||
Last deployed commit is [${{ github.sha }}](${{ github.event.pull_request.head.repo.html_url }}/commit/${{ github.sha }})
|
||||
Last deployed commit is [${{ github.event.pull_request.head.sha }}](${{ github.event.pull_request.head.repo.html_url }}/commit/${{ github.event.pull_request.head.sha }})
|
||||
|
||||
| Environment | URL |
|
||||
|-------------|-----|
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
"message": "Stahování aktualizace"
|
||||
},
|
||||
"app.action-bar.downloads": {
|
||||
"message": "Stažené Soubory"
|
||||
"message": "Stahování"
|
||||
},
|
||||
"app.action-bar.hide-more-running-instances": {
|
||||
"message": "Skrýt více spuštěných instancí"
|
||||
},
|
||||
"app.action-bar.make-primary-instance": {
|
||||
"message": "Použít jako primární instanci"
|
||||
"message": "Nastavit jako primární instanci"
|
||||
},
|
||||
"app.action-bar.no-instances-running": {
|
||||
"message": "Žádné spuštěné instance"
|
||||
@@ -24,13 +24,13 @@
|
||||
"message": "Primární instance"
|
||||
},
|
||||
"app.action-bar.reload-to-update": {
|
||||
"message": "Obnovit pro aktualizaci"
|
||||
"message": "Znovu načíst pro aktualizaci"
|
||||
},
|
||||
"app.action-bar.show-more-running-instances": {
|
||||
"message": "Zobrazit další spuštěné instance"
|
||||
},
|
||||
"app.action-bar.stop-instance": {
|
||||
"message": "Ukončit instanci"
|
||||
"message": "Zastavit instanci"
|
||||
},
|
||||
"app.action-bar.update": {
|
||||
"message": "Aktualizace"
|
||||
@@ -42,10 +42,10 @@
|
||||
"message": "Zobrazit instanci"
|
||||
},
|
||||
"app.action-bar.view-logs": {
|
||||
"message": "Zobrazit záznamy"
|
||||
"message": "Zobrazit logy"
|
||||
},
|
||||
"app.appearance-settings.advanced-rendering.description": {
|
||||
"message": "Umožňuje pokročilé vykreslování, jako jsou efekty rozostření, které mohou způsobit problémy s výkonem bez hardwarového vykreslení."
|
||||
"message": "Povolí pokročilé vykreslování, například efekty rozmazání, které mohou bez hardwarového zrychlení způsobovat problémy s výkonem."
|
||||
},
|
||||
"app.appearance-settings.advanced-rendering.title": {
|
||||
"message": "Pokročilé vykreslování"
|
||||
@@ -57,16 +57,16 @@
|
||||
"message": "Barevný motiv"
|
||||
},
|
||||
"app.appearance-settings.default-landing-page.description": {
|
||||
"message": "Změňte stránku, na které se spouštěč otevře."
|
||||
"message": "Změňte stránku, která se otevře po spuštění launcheru."
|
||||
},
|
||||
"app.appearance-settings.default-landing-page.home": {
|
||||
"message": "Domov"
|
||||
"message": "Domů"
|
||||
},
|
||||
"app.appearance-settings.default-landing-page.library": {
|
||||
"message": "Knihovna"
|
||||
},
|
||||
"app.appearance-settings.default-landing-page.title": {
|
||||
"message": "Výchozí úvodní stránka"
|
||||
"message": "Výchozí stránka po spuštění"
|
||||
},
|
||||
"app.appearance-settings.hide-nametag.description": {
|
||||
"message": "Zakáže zobrazení jmenovky nad vaší postavou na stránce skinů."
|
||||
@@ -75,31 +75,34 @@
|
||||
"message": "Skrýt jmenovku"
|
||||
},
|
||||
"app.appearance-settings.jump-back-into-worlds.description": {
|
||||
"message": "V sekci „Vrátit se do hry“ na úvodní stránce jsou uvedeny nejnovější světy."
|
||||
"message": "Zahrne nedávné světy do sekce „Vrátit se do hry“ na domovské stránce."
|
||||
},
|
||||
"app.appearance-settings.jump-back-into-worlds.title": {
|
||||
"message": "Skočit zpět do světů"
|
||||
"message": "Rychlý návrat do světů"
|
||||
},
|
||||
"app.appearance-settings.minimize-launcher.description": {
|
||||
"message": "Minimalizovat spouštěč při spuštění procesu Minecraftu."
|
||||
"message": "Minimalizovat launcher při spuštění Minecraftu."
|
||||
},
|
||||
"app.appearance-settings.minimize-launcher.title": {
|
||||
"message": "Minimalizovat spouštěč"
|
||||
"message": "Minimalizovat launcher"
|
||||
},
|
||||
"app.appearance-settings.native-decorations.description": {
|
||||
"message": "Použít systémový rámeček okna (vyžaduje restart aplikace)."
|
||||
},
|
||||
"app.appearance-settings.native-decorations.title": {
|
||||
"message": "Nativní dekorace"
|
||||
"message": "Systémové dekorace"
|
||||
},
|
||||
"app.appearance-settings.select-option": {
|
||||
"message": "Vyberte možnost"
|
||||
},
|
||||
"app.appearance-settings.show-play-time.description": {
|
||||
"message": "Zobrazuje, kolik času jsi strávil hraním instance."
|
||||
},
|
||||
"app.appearance-settings.show-play-time.title": {
|
||||
"message": "Ukázat herní čas"
|
||||
"message": "Zobrazit odehraný čas"
|
||||
},
|
||||
"app.appearance-settings.toggle-sidebar.description": {
|
||||
"message": "Umožňí přepínat zobrazení postranního panelu."
|
||||
"message": "Umožní přepínat zobrazení postranního panelu."
|
||||
},
|
||||
"app.appearance-settings.toggle-sidebar.title": {
|
||||
"message": "Přepnout postranní panel"
|
||||
@@ -111,19 +114,19 @@
|
||||
"message": "Upozorni mě před instalací neznámých modpacků"
|
||||
},
|
||||
"app.auth-servers.unreachable.body": {
|
||||
"message": "Autořizační servery Minecraftu aktuálně nejsou k dispozici. Zkontrolujte si své připojení k internetu a zkuste to znovu později."
|
||||
"message": "Ověřovací Minecraft servery mohou být právě teď nedostupné. Zkontroluj si své připojení k internetu a zkus to znovu později."
|
||||
},
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Připojení k autorizačním serverům se nezdařilo"
|
||||
"message": "Nelze se připojit k ověřovacím serverům"
|
||||
},
|
||||
"app.browse.add-servers-to-instance": {
|
||||
"message": "Přidat server do instance"
|
||||
"message": "Přidání serveru do instance"
|
||||
},
|
||||
"app.browse.add-to-an-instance": {
|
||||
"message": "Přidat do instalace"
|
||||
"message": "Přidat do instance"
|
||||
},
|
||||
"app.browse.add-to-instance": {
|
||||
"message": "Přidat do instalace"
|
||||
"message": "Přidat do instance"
|
||||
},
|
||||
"app.browse.add-to-instance-name": {
|
||||
"message": "Přidat do {instanceName}"
|
||||
@@ -132,22 +135,22 @@
|
||||
"message": "Přidáno"
|
||||
},
|
||||
"app.browse.already-added": {
|
||||
"message": "Už přidáno"
|
||||
"message": "Již přidáno"
|
||||
},
|
||||
"app.browse.back-to-instance": {
|
||||
"message": "Zpět k instanci"
|
||||
},
|
||||
"app.browse.discover-content": {
|
||||
"message": "Prozkoumat obsah"
|
||||
"message": "Objevovat obsah"
|
||||
},
|
||||
"app.browse.discover-servers": {
|
||||
"message": "Prozkoumat servery"
|
||||
"message": "Objevovat servery"
|
||||
},
|
||||
"app.browse.hide-added-servers": {
|
||||
"message": "Skrýt již přidané servery"
|
||||
},
|
||||
"app.browse.project-type.modpacks": {
|
||||
"message": "Balíčky Modifikací"
|
||||
"message": "Modpacky"
|
||||
},
|
||||
"app.browse.server-instance-content-warning": {
|
||||
"message": "Přidání obsahu může narušit kompatibilitu při připojení k serveru. Veškerý přidaný obsah se navíc ztratí při aktualizaci obsahu instance serveru."
|
||||
@@ -155,6 +158,9 @@
|
||||
"app.browse.server.installing": {
|
||||
"message": "Instalování"
|
||||
},
|
||||
"app.content-install.no-compatible-versions": {
|
||||
"message": "Žádná dostupná verze se neshoduje s verzí {compatibilityLabel}. Vyber verzi, abys ji i přesto nainstaloval/a. Závislosti nebudou automaticky nainstalovány."
|
||||
},
|
||||
"app.creation-modal.installing-modpack.description": {
|
||||
"message": "{fileName}"
|
||||
},
|
||||
@@ -162,7 +168,7 @@
|
||||
"message": "Probíhá instalace modpacku..."
|
||||
},
|
||||
"app.export-modal.description-placeholder": {
|
||||
"message": "Přidej popis modpacku..."
|
||||
"message": "Zadej popis modpacku..."
|
||||
},
|
||||
"app.export-modal.export-button": {
|
||||
"message": "Exportovat"
|
||||
@@ -174,10 +180,10 @@
|
||||
"message": "Zahrnout \"{file}\"?"
|
||||
},
|
||||
"app.export-modal.modpack-name-label": {
|
||||
"message": "Jméno Modpacku"
|
||||
"message": "Název modpacku"
|
||||
},
|
||||
"app.export-modal.modpack-name-placeholder": {
|
||||
"message": "Jméno modpacku"
|
||||
"message": "Název modpacku"
|
||||
},
|
||||
"app.export-modal.select-files-label": {
|
||||
"message": "Nastavte, které soubory mají být do tohoto exportu zahrnuty"
|
||||
@@ -189,7 +195,7 @@
|
||||
"message": "1.0.0"
|
||||
},
|
||||
"app.instance.confirm-delete.admonition-body": {
|
||||
"message": "Všechna data z instance budou navždy smazána, včetně světů, nastavení a všeho ostatního."
|
||||
"message": "Všechna data tvé instance budou trvale smazána, včetně světů, konfigurací a veškerého nainstalovaného obsahu."
|
||||
},
|
||||
"app.instance.confirm-delete.admonition-header": {
|
||||
"message": "Tato akce nemůže být vrácena"
|
||||
@@ -198,19 +204,19 @@
|
||||
"message": "Odstranit instanci"
|
||||
},
|
||||
"app.instance.confirm-delete.header": {
|
||||
"message": "Odstanit instanci"
|
||||
"message": "Odstranění instance"
|
||||
},
|
||||
"app.instance.modpack-already-installed.body": {
|
||||
"message": "Tento modpack je už nainstalovaný v instanci <bold>{instanceName}</bold>. Opravdu ho chceš duplikovat?"
|
||||
"message": "Tento modpack je již nainstalovaný v instanci <bold>{instanceName}</bold>. Opravdu ho chceš duplikovat?"
|
||||
},
|
||||
"app.instance.modpack-already-installed.create": {
|
||||
"message": "Vytvořit"
|
||||
},
|
||||
"app.instance.modpack-already-installed.header": {
|
||||
"message": "Modpack už je nainstalovaný"
|
||||
"message": "Modpack je již nainstalován"
|
||||
},
|
||||
"app.instance.modpack-already-installed.instance": {
|
||||
"message": "Instalace"
|
||||
"message": "Instance"
|
||||
},
|
||||
"app.instance.mods.content-type-project": {
|
||||
"message": "projekt"
|
||||
@@ -222,7 +228,7 @@
|
||||
"message": "{count} projektů bylo přidáno"
|
||||
},
|
||||
"app.instance.mods.share-text": {
|
||||
"message": "Podívejte se na projekty co používám ve svém modpacku!"
|
||||
"message": "Podívejte se na projekty, které používám ve svém modpacku!"
|
||||
},
|
||||
"app.instance.mods.share-title": {
|
||||
"message": "Sdílení obsahu modpacku"
|
||||
@@ -236,11 +242,14 @@
|
||||
"app.instance.worlds.browse-servers": {
|
||||
"message": "Procházet servery"
|
||||
},
|
||||
"app.instance.worlds.delete-world-description": {
|
||||
"message": "'{name}' bude **navždy smazán** a nebude možné jej obnovit."
|
||||
},
|
||||
"app.instance.worlds.delete-world-title": {
|
||||
"message": "Opravdu si jsi jistý, že chceš navždy smazat tenhle svět?"
|
||||
"message": "Jsi si jistý, že chceš trvale smazat tento svět?"
|
||||
},
|
||||
"app.instance.worlds.filter-modded": {
|
||||
"message": "Módováno"
|
||||
"message": "Módovaný"
|
||||
},
|
||||
"app.instance.worlds.filter-offline": {
|
||||
"message": "Offline"
|
||||
@@ -252,19 +261,22 @@
|
||||
"message": "Vanilla"
|
||||
},
|
||||
"app.instance.worlds.no-worlds-description": {
|
||||
"message": "Přidej nebo procházej servery"
|
||||
"message": "Přidej server nebo začni procházet"
|
||||
},
|
||||
"app.instance.worlds.no-worlds-heading": {
|
||||
"message": "Žádné servery nebo světy nebyly přidány"
|
||||
},
|
||||
"app.instance.worlds.remove-server-description": {
|
||||
"message": "'{name}' bude odstraněn z tvého seznamu i ze hry a nebude možné jej obnovit."
|
||||
},
|
||||
"app.instance.worlds.remove-server-description-with-address": {
|
||||
"message": "'{name}' ({address}) bude odstraněn z vašeho seznamu, a to i ve hře, a nebude možné jej obnovit."
|
||||
"message": "'{name}' ({address}) bude odstraněn z tvého seznamu i ze hry a nebude možné jej obnovit."
|
||||
},
|
||||
"app.instance.worlds.remove-server-title": {
|
||||
"message": "Opravdu chceš odstranit {name}?"
|
||||
},
|
||||
"app.instance.worlds.search-worlds-placeholder": {
|
||||
"message": "Hledat ve světech {count}..."
|
||||
"message": "Hledat v {count} světech..."
|
||||
},
|
||||
"app.instance.worlds.this-server": {
|
||||
"message": "tento server"
|
||||
@@ -273,19 +285,19 @@
|
||||
"message": "Požadovaný obsah"
|
||||
},
|
||||
"app.modal.install-to-play.header": {
|
||||
"message": "Nainstaluj ke hraní"
|
||||
"message": "Nainstaluj pro hraní"
|
||||
},
|
||||
"app.modal.install-to-play.install-button": {
|
||||
"message": "Instalovat"
|
||||
},
|
||||
"app.modal.install-to-play.mod-count": {
|
||||
"message": "{count, plural,one {#mód} other {#módy}}"
|
||||
"message": "{count, plural, one {# mód} few {# módy} other {# módů}}"
|
||||
},
|
||||
"app.modal.install-to-play.required-modpack": {
|
||||
"message": "Povinný modpack"
|
||||
"message": "Požadovaný modpack"
|
||||
},
|
||||
"app.modal.install-to-play.server-requires-mods": {
|
||||
"message": "Tento server k hraní vyžaduje módy. Klikni na instalovat pro získání potřebných módů z Modrinth."
|
||||
"message": "Tento server k hraní vyžaduje módy. Klikni na instalovat pro získání potřebných módů z Modrinth a poté se rovnou připoj na server."
|
||||
},
|
||||
"app.modal.install-to-play.shared-instance": {
|
||||
"message": "Sdílená instance"
|
||||
@@ -297,22 +309,22 @@
|
||||
"message": "Zobrazit obsah"
|
||||
},
|
||||
"app.modal.update-to-play.header": {
|
||||
"message": "Updatuj ke hraní"
|
||||
"message": "Aktualizuj pro hraní"
|
||||
},
|
||||
"app.modal.update-to-play.update-required": {
|
||||
"message": "Je vyžadována aktualizace"
|
||||
},
|
||||
"app.modal.update-to-play.update-required-description": {
|
||||
"message": "Je nutná aktualizace ke hraní {name}. Prosím updatuj na nejnovější verzi k spuštění hry."
|
||||
"message": "Pro hraní {name} je vyžadována aktualizace. Prosím aktualizuj na nejnovější verzi, abys mohl hru spustit."
|
||||
},
|
||||
"app.project.install-button.already-installed": {
|
||||
"message": "Tento projekt je již nainstalován"
|
||||
},
|
||||
"app.project.install-context.back-to-browse": {
|
||||
"message": "Zpět na Prozkoumat"
|
||||
"message": "Zpět k Objevování"
|
||||
},
|
||||
"app.project.install-context.install-content-to-instance": {
|
||||
"message": "Nainstalovat obsah do instnce"
|
||||
"message": "Nainstalovat obsah do instance"
|
||||
},
|
||||
"app.settings.developer-mode-enabled": {
|
||||
"message": "Vývojářský režim povolen."
|
||||
@@ -342,7 +354,7 @@
|
||||
"message": "Přidat skin"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "Vem a drž"
|
||||
"message": "Přetáhni a pusť"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Použít"
|
||||
@@ -350,24 +362,96 @@
|
||||
"app.skins.delete-button": {
|
||||
"message": "Smazat skin"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "Tahle akce navždy smaže vybraný skin a nejde vrátit zpět."
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "Opravdu chceš smazat tenhle skin?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "Nepodařilo se načíst přetažený soubor."
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "Chyba při načítání souboru"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Upravit skin"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Přidat skin"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Přidání skinu"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "Typ paží"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Štíhlý"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Široký"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Plášť"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Plášť"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "Úprava skinu"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "Nejdříve uprav skin!"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Bez pláště"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Žádný"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "Nahradit texturu"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "Uložit skin"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "Ukládání..."
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "Textura"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "Nejdříve nahraj skin!"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "Upravit skin"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "Náhled"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "Měníš svůj skin příliš často. Servery Mojangu dočasně zablokovaly další požadavky. Počkej chvíli, než to zkusíš znovu."
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "Zpomal!"
|
||||
},
|
||||
"app.skins.reorder-error.text": {
|
||||
"message": "Tvé pořadí skinů se nepodařilo uložit."
|
||||
},
|
||||
"app.skins.reorder-error.title": {
|
||||
"message": "Nepodařilo se změnit pořadí skinů"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Builders & Biomes"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "Chase the Skies"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "Výchozí skiny"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
@@ -377,14 +461,47 @@
|
||||
"app.skins.section.modrinth-pride": {
|
||||
"message": "Modrinth Pride"
|
||||
},
|
||||
"app.skins.section.modrinth-pride.tooltip": {
|
||||
"message": "Tyto skiny jsi obdržel za přispění do sbírky Modrinth Pride behěm Pride měsíce."
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Mounts of Mayhem"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "Uložené skiny"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "The Copper Age"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "The Garden Awakens"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "Tiny Takeover"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "Přihlásit se"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "Přihlas se prosím ke svému Minecraft účtu, abys mohl/a využívat funkce pro správu skinů v aplikaci Modrinth."
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "Nadšený Modrinth Bot"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "Přihlas se prosím"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "Výběr skinu"
|
||||
},
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "Stahování aplikace Modrinth v{version} bylo dokončeno. Nainstalujte aktualizaci nyní nebo automaticky po zavření aplikace Modrinth."
|
||||
"message": "Stahování aplikace Modrinth v{version} bylo dokončeno. Aktualizujte ji znovunačtením nebo se automaticky aktualizuje po zavření."
|
||||
},
|
||||
"app.update-popup.body.linux": {
|
||||
"message": "Aplikace Modrinth v{version} je k dispozici. Aktualizujte pomocí svého správce balíčků, abyste získali nejnovější funkce a opravy!"
|
||||
"message": "Aplikace Modrinth v{version} je k dispozici. Aktualizujte ji pomocí svého správce balíčků, abyste získali nejnovější funkce a opravy!"
|
||||
},
|
||||
"app.update-popup.body.metered": {
|
||||
"message": "Aplikace Modrinth v{version} je nyní k dispozici! Protože jste v měřené síti, nebyla stažena automaticky."
|
||||
@@ -398,8 +515,11 @@
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "Stahování bylo dokončeno"
|
||||
},
|
||||
"app.update-popup.reload": {
|
||||
"message": "Znovu načíst pro aktualizaci"
|
||||
},
|
||||
"app.update-popup.title": {
|
||||
"message": "Je k dispozici aktualizace"
|
||||
"message": "Aktualizace k dispozici"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "Kliknutím sem zobrazíte seznam změn."
|
||||
@@ -411,13 +531,13 @@
|
||||
"message": "priklad.modrinth.gg"
|
||||
},
|
||||
"app.world.server-modal.select-an-option": {
|
||||
"message": "Vyberte možnost"
|
||||
"message": "Vybrat možnost"
|
||||
},
|
||||
"app.world.world-item.incompatible-version": {
|
||||
"message": "Nekompatibilní verze {version}"
|
||||
},
|
||||
"app.world.world-item.not-played-yet": {
|
||||
"message": "Ještě nehráno"
|
||||
"message": "Zatím nehráno"
|
||||
},
|
||||
"app.world.world-item.offline": {
|
||||
"message": "Offline"
|
||||
@@ -429,25 +549,25 @@
|
||||
"message": "Přidat přítele"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count} přátelé {count, plural, one {request} other {requests}}"
|
||||
"message": "{count} {count, plural, one {žádost} few {žádosti} other {žádostí}} o přátelství"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "Poslat žádost o přátelství"
|
||||
},
|
||||
"friends.add-friend.title": {
|
||||
"message": "Přidávání kamaráda"
|
||||
"message": "Přidání přítele"
|
||||
},
|
||||
"friends.add-friend.username.description": {
|
||||
"message": "Může být jiné než jejich Minecraft jméno!"
|
||||
"message": "Může se lišit od jejich Minecraft přezdívky!"
|
||||
},
|
||||
"friends.add-friend.username.placeholder": {
|
||||
"message": "Zadejte uživatelské jméno Modrinth..."
|
||||
"message": "Zadej přezdívku na Modrinthu..."
|
||||
},
|
||||
"friends.add-friend.username.title": {
|
||||
"message": "Jak se váš kamarád jmenuje na Modrinthu?"
|
||||
"message": "Jaká je přezdívka tvého přítele na Modrinthu?"
|
||||
},
|
||||
"friends.add-friends-to-share": {
|
||||
"message": "<link>Přidejte si přátelé</link> a podívejte se, co hrají!"
|
||||
"message": "<link>Přidej si přátele</link>, abys viděl, co hrají!"
|
||||
},
|
||||
"friends.friend.cancel-request": {
|
||||
"message": "Zrušit žádost"
|
||||
@@ -462,7 +582,7 @@
|
||||
"message": "Zobrazit profil"
|
||||
},
|
||||
"friends.heading": {
|
||||
"message": "Kamarádi"
|
||||
"message": "Přátelé"
|
||||
},
|
||||
"friends.heading.active": {
|
||||
"message": "Aktivní"
|
||||
@@ -476,6 +596,9 @@
|
||||
"friends.heading.pending": {
|
||||
"message": "Čeká na vyřízení"
|
||||
},
|
||||
"friends.no-friends-match": {
|
||||
"message": "Žádní přátelé neodpovídají ''{query}''"
|
||||
},
|
||||
"friends.search-friends-placeholder": {
|
||||
"message": "Hledat přátele..."
|
||||
},
|
||||
@@ -483,7 +606,7 @@
|
||||
"message": "{title} - {count}"
|
||||
},
|
||||
"friends.sign-in-to-add-friends": {
|
||||
"message": "<link>Přihlašte se ke svému Modrinth účtu</link>, abyste jsi přidali přátele a uviděli co hrají!"
|
||||
"message": "<link>Přihlas se k Modrinth účtu</link>, abys mohl přidávat přátele a vidět, co hrají!"
|
||||
},
|
||||
"instance.add-server.add-and-play": {
|
||||
"message": "Přidat a hrát"
|
||||
@@ -495,10 +618,10 @@
|
||||
"message": "Vypnuto"
|
||||
},
|
||||
"instance.add-server.resource-pack.enabled": {
|
||||
"message": "Zapnuto"
|
||||
"message": "Povolený"
|
||||
},
|
||||
"instance.add-server.resource-pack.prompt": {
|
||||
"message": "Ptát se"
|
||||
"message": "Zeptat se"
|
||||
},
|
||||
"instance.add-server.title": {
|
||||
"message": "Přidat server"
|
||||
@@ -507,7 +630,7 @@
|
||||
"message": "Upravit server"
|
||||
},
|
||||
"instance.edit-world.hide-from-home": {
|
||||
"message": "Skrýt z domovské obrazovky"
|
||||
"message": "Skrýt z domovské stránky"
|
||||
},
|
||||
"instance.edit-world.name": {
|
||||
"message": "Název"
|
||||
@@ -516,7 +639,7 @@
|
||||
"message": "Minecraft svět"
|
||||
},
|
||||
"instance.edit-world.reset-icon": {
|
||||
"message": "Resetovat ikonu"
|
||||
"message": "Obnovit ikonu"
|
||||
},
|
||||
"instance.edit-world.title": {
|
||||
"message": "Upravit svět"
|
||||
@@ -534,22 +657,22 @@
|
||||
"message": "Název"
|
||||
},
|
||||
"instance.server-modal.placeholder-name": {
|
||||
"message": "Minecraft Server"
|
||||
"message": "Minecraft server"
|
||||
},
|
||||
"instance.server-modal.resource-pack": {
|
||||
"message": "Balíčky textur"
|
||||
"message": "Balíček textur"
|
||||
},
|
||||
"instance.settings.tabs.general": {
|
||||
"message": "Obecné"
|
||||
},
|
||||
"instance.settings.tabs.general.delete": {
|
||||
"message": "Odstranit instalaci"
|
||||
"message": "Odstranění instance"
|
||||
},
|
||||
"instance.settings.tabs.general.delete.button": {
|
||||
"message": "Odstranit instalaci"
|
||||
"message": "Odstranit instanci"
|
||||
},
|
||||
"instance.settings.tabs.general.delete.description": {
|
||||
"message": "Trvale smaže instalaci z vašeho zařízení, včetně vašich světů, konfigurací a veškerého nainstalovaného obsahu. Buďte opatrní, protože jakmile instalaci smažete, nebude možné ji obnovit."
|
||||
"message": "Trvale smaže instanci z tvého zařízení, včetně světů, konfigurací a veškerého nainstalovaného obsahu. Buď opatrný, jakmile instanci smažeš, nepůjde ji obnovit."
|
||||
},
|
||||
"instance.settings.tabs.general.deleting.button": {
|
||||
"message": "Mazání..."
|
||||
@@ -558,47 +681,65 @@
|
||||
"message": "Duplikovat"
|
||||
},
|
||||
"instance.settings.tabs.general.duplicate-button.tooltip.installing": {
|
||||
"message": "Nelze duplikovat při instalaci."
|
||||
"message": "Nelze duplikovat během instalace."
|
||||
},
|
||||
"instance.settings.tabs.general.duplicate-instance": {
|
||||
"message": "Duplikovat instalaci"
|
||||
"message": "Duplikace instance"
|
||||
},
|
||||
"instance.settings.tabs.general.duplicate-instance.description": {
|
||||
"message": "Vytvoří kopii této instalace, včetně světů, konfigurací, modů atd."
|
||||
"message": "Vytvoří kopii této instance, včetně světů, konfigurací, modů, atd."
|
||||
},
|
||||
"instance.settings.tabs.general.edit-icon": {
|
||||
"message": "Upravit ikonu"
|
||||
},
|
||||
"instance.settings.tabs.general.edit-icon.remove": {
|
||||
"message": "Odstranit ikonu"
|
||||
"message": "Odebrat ikonu"
|
||||
},
|
||||
"instance.settings.tabs.general.edit-icon.replace": {
|
||||
"message": "Změnit ikonu"
|
||||
"message": "Nahradit ikonu"
|
||||
},
|
||||
"instance.settings.tabs.general.edit-icon.select": {
|
||||
"message": "Vybrat ikonu"
|
||||
},
|
||||
"instance.settings.tabs.general.library-groups": {
|
||||
"message": "Skupina knihoven"
|
||||
"message": "Skupiny knihovny"
|
||||
},
|
||||
"instance.settings.tabs.general.library-groups.create": {
|
||||
"message": "Vytvořit novou skupinu"
|
||||
},
|
||||
"instance.settings.tabs.general.library-groups.description": {
|
||||
"message": "Skupiny knihoven vám umožňují uspořádat instalace do různých sekcí."
|
||||
"message": "Skupiny knihovny ti umožňují uspořádat instance do různých sekcí v knihovně."
|
||||
},
|
||||
"instance.settings.tabs.general.library-groups.enter-name": {
|
||||
"message": "Zadejte název skupiny"
|
||||
"message": "Zadej název skupiny"
|
||||
},
|
||||
"instance.settings.tabs.general.name": {
|
||||
"message": "Název"
|
||||
"message": "Jméno"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel": {
|
||||
"message": "Aktualizační kanál"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.alpha": {
|
||||
"message": "Alpha"
|
||||
"message": "Alfa"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.alpha.description": {
|
||||
"message": "Vydané, beta a alfa verze se zobrazí jako dostupné aktualizace."
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.beta": {
|
||||
"message": "Beta"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.beta.description": {
|
||||
"message": "Vydané a beta verze se zobrazí jako dostupné aktualizace."
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.release": {
|
||||
"message": "Vydání"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.release.description": {
|
||||
"message": "Pouze vydané verze se zobrazí jako dostupné aktualizace."
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.select": {
|
||||
"message": "Vyber aktualizační kanál"
|
||||
},
|
||||
"instance.settings.tabs.hooks": {
|
||||
"message": "Spouštěcí hooky"
|
||||
},
|
||||
@@ -606,28 +747,28 @@
|
||||
"message": "Vlastní spouštěcí hooky"
|
||||
},
|
||||
"instance.settings.tabs.hooks.description": {
|
||||
"message": "Hooky umožňují pokročilým uživatelům spouštět určité systémové příkazy před a po spuštění hry."
|
||||
"message": "Hooky umožňují pokročilým uživatelům spustit určité systémové příkazy před a po spuštění hry."
|
||||
},
|
||||
"instance.settings.tabs.hooks.post-exit": {
|
||||
"message": "Po ukončení"
|
||||
},
|
||||
"instance.settings.tabs.hooks.post-exit.description": {
|
||||
"message": "Spušteno po vypnutí hry."
|
||||
"message": "Provede se po ukončení hry."
|
||||
},
|
||||
"instance.settings.tabs.hooks.post-exit.enter": {
|
||||
"message": "Zadejte příkaz k provedení po ukončení..."
|
||||
"message": "Zadej příkaz k provedení po ukončení..."
|
||||
},
|
||||
"instance.settings.tabs.hooks.pre-launch": {
|
||||
"message": "Před spuštěním"
|
||||
},
|
||||
"instance.settings.tabs.hooks.pre-launch.description": {
|
||||
"message": "Spouštějí se před spuštěním instalace."
|
||||
"message": "Provede se před spuštěním instance."
|
||||
},
|
||||
"instance.settings.tabs.hooks.pre-launch.enter": {
|
||||
"message": "Zadejte příkaz k provedení před spuštěním..."
|
||||
"message": "Zadej příkaz k provedení před spuštěním..."
|
||||
},
|
||||
"instance.settings.tabs.hooks.title": {
|
||||
"message": "Spouštěcí hooky hry"
|
||||
"message": "Spouštěcí příkazy hry"
|
||||
},
|
||||
"instance.settings.tabs.hooks.wrapper": {
|
||||
"message": "Wrapper"
|
||||
@@ -636,7 +777,7 @@
|
||||
"message": "Příkaz wrapperu pro spuštění Minecraftu."
|
||||
},
|
||||
"instance.settings.tabs.hooks.wrapper.enter": {
|
||||
"message": "Zadejte příkaz wrapperu..."
|
||||
"message": "Zadej příkaz wrapperu..."
|
||||
},
|
||||
"instance.settings.tabs.installation": {
|
||||
"message": "Instalace"
|
||||
@@ -647,6 +788,24 @@
|
||||
"instance.settings.tabs.java": {
|
||||
"message": "Java a pamět"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-environment-variables": {
|
||||
"message": "Vlastní proměnná prostředí"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-arguments": {
|
||||
"message": "Vlastní argumenty Javy"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-installation": {
|
||||
"message": "Vlastní instalace Javy"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-memory-allocation": {
|
||||
"message": "Vlastní nastavení paměti"
|
||||
},
|
||||
"instance.settings.tabs.java.enter-environment-variables": {
|
||||
"message": "Zadej proměnná prostředí..."
|
||||
},
|
||||
"instance.settings.tabs.java.enter-java-arguments": {
|
||||
"message": "Zadej argumenty Javy..."
|
||||
},
|
||||
"instance.settings.tabs.java.environment-variables": {
|
||||
"message": "Proměnné prostředí"
|
||||
},
|
||||
@@ -654,13 +813,16 @@
|
||||
"message": "Hooky"
|
||||
},
|
||||
"instance.settings.tabs.java.java-arguments": {
|
||||
"message": "Java argumenty"
|
||||
"message": "Argumenty Javy"
|
||||
},
|
||||
"instance.settings.tabs.java.java-installation": {
|
||||
"message": "Instalace Javy"
|
||||
},
|
||||
"instance.settings.tabs.java.java-memory": {
|
||||
"message": "Paměti přiřazeno"
|
||||
"message": "Přiřazeno paměti"
|
||||
},
|
||||
"instance.settings.tabs.java.java-path-placeholder": {
|
||||
"message": "/path/to/java"
|
||||
},
|
||||
"instance.settings.tabs.window": {
|
||||
"message": "Okno"
|
||||
@@ -669,10 +831,10 @@
|
||||
"message": "Vlastní nastavení okna"
|
||||
},
|
||||
"instance.settings.tabs.window.fullscreen": {
|
||||
"message": "Celá obrazovka"
|
||||
"message": "Režim celé obrazovky"
|
||||
},
|
||||
"instance.settings.tabs.window.fullscreen.description": {
|
||||
"message": "Spustit hru v plné obrazovce pokud spuštěno (použitím options.txt)."
|
||||
"message": "Při spuštění otevřít hru v režimu celé obrazovky (použitím options.txt)."
|
||||
},
|
||||
"instance.settings.tabs.window.height": {
|
||||
"message": "Výška"
|
||||
@@ -681,7 +843,7 @@
|
||||
"message": "Výška herního okna při spuštění."
|
||||
},
|
||||
"instance.settings.tabs.window.height.enter": {
|
||||
"message": "Zadejte výšku..."
|
||||
"message": "Zadej výšku..."
|
||||
},
|
||||
"instance.settings.tabs.window.width": {
|
||||
"message": "Šířka"
|
||||
@@ -690,19 +852,19 @@
|
||||
"message": "Šířka herního okna při spuštění."
|
||||
},
|
||||
"instance.settings.tabs.window.width.enter": {
|
||||
"message": "Zadejte šířku..."
|
||||
"message": "Zadej šířku..."
|
||||
},
|
||||
"instance.worlds.a_minecraft_server": {
|
||||
"message": "Minecraft Server"
|
||||
"message": "Minecraft server"
|
||||
},
|
||||
"instance.worlds.cant_connect": {
|
||||
"message": "Nelze připojit k serveru"
|
||||
"message": "Nelze se připojit k serveru"
|
||||
},
|
||||
"instance.worlds.copy_address": {
|
||||
"message": "Kopírovat adresu"
|
||||
},
|
||||
"instance.worlds.dont_show_on_home": {
|
||||
"message": "Nezobrazuje na domovské stránce"
|
||||
"message": "Nezobrazovat na domovské stránce"
|
||||
},
|
||||
"instance.worlds.game_already_open": {
|
||||
"message": "Instance je již otevřená"
|
||||
@@ -717,13 +879,13 @@
|
||||
"message": "Spravováno projektem serveru"
|
||||
},
|
||||
"instance.worlds.no_contact": {
|
||||
"message": "Server se nepodařilo spojit"
|
||||
"message": "Se serverem se nepodařilo spojit"
|
||||
},
|
||||
"instance.worlds.no_server_quick_play": {
|
||||
"message": "Můžeš rovnou skočit na server pouze v Minecraftu Alpha 1.0.5+"
|
||||
"message": "Připojit se rovnou k serverům můžeš pouze s Minecraft verzí Alpha 1.0.5+"
|
||||
},
|
||||
"instance.worlds.no_singleplayer_quick_play": {
|
||||
"message": "V Minecraftu 1.20+ se dá rovnou přeskočit pouze do singleplayerových světů"
|
||||
"message": "Můžeš se rovnou připojit do světů pro jednoho hráče pouze s Minecraft verzí 1.20+"
|
||||
},
|
||||
"instance.worlds.play_instance": {
|
||||
"message": "Hrát instanci"
|
||||
@@ -732,22 +894,22 @@
|
||||
"message": "Zobrazit instanci"
|
||||
},
|
||||
"instance.worlds.world_in_use": {
|
||||
"message": "Svět je použit"
|
||||
"message": "Svět je používán"
|
||||
},
|
||||
"minecraft-account.add-account": {
|
||||
"message": "Přidat účet"
|
||||
},
|
||||
"minecraft-account.label": {
|
||||
"message": "Účet Minecraft"
|
||||
"message": "Minecraft účet"
|
||||
},
|
||||
"minecraft-account.not-signed-in": {
|
||||
"message": "Nejste přihlášeni"
|
||||
},
|
||||
"minecraft-account.remove-account": {
|
||||
"message": "Odstranit účet"
|
||||
"message": "Odebrat účet"
|
||||
},
|
||||
"minecraft-account.select-account": {
|
||||
"message": "Vyberte účet"
|
||||
"message": "Zvolte účet"
|
||||
},
|
||||
"minecraft-account.sign-in": {
|
||||
"message": "Přihlásit se do Minecraftu"
|
||||
@@ -756,31 +918,31 @@
|
||||
"message": "Poskytováno instancí"
|
||||
},
|
||||
"search.filter.locked.instance-game-version.title": {
|
||||
"message": "Verze hry je poskytnut instanci"
|
||||
"message": "Verze hry je poskytována instancí"
|
||||
},
|
||||
"search.filter.locked.instance-loader.title": {
|
||||
"message": "Spouštěč je poskytnut instancí"
|
||||
"message": "Načítací modul je poskytován instancí"
|
||||
},
|
||||
"search.filter.locked.instance.sync": {
|
||||
"message": "Synchronizováno z instancí"
|
||||
"message": "Synchronizováno s instancí"
|
||||
},
|
||||
"search.filter.locked.server": {
|
||||
"message": "Poskytováno serverem"
|
||||
},
|
||||
"search.filter.locked.server-environment.title": {
|
||||
"message": "Jen klientské mody mohou být přidány na server"
|
||||
"message": "Pouze módy ze strany klientu mohou být přidány na server"
|
||||
},
|
||||
"search.filter.locked.server-game-version.title": {
|
||||
"message": "Verzi hry poskytuje server"
|
||||
"message": "Verze hry je poskytována serverem"
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "Loader zprostředkovává server"
|
||||
},
|
||||
"unknown-pack-warning-modal.body": {
|
||||
"message": "Soubor je zkontrolován pouze v případě, že je nahrán na Modrinth, a to bez ohledu na jeho formát (včetně formátu .mrpack)."
|
||||
"message": "Soubor je zkontrolován pouze v případě, že je nahrán na Modrinth, bez ohledu na jeho formát (včetně formátu .mrpack)."
|
||||
},
|
||||
"unknown-pack-warning-modal.dont-show-again": {
|
||||
"message": "Toto varování již nezobrazovat"
|
||||
"message": "Toto varování znovu nezobrazovat"
|
||||
},
|
||||
"unknown-pack-warning-modal.header": {
|
||||
"message": "Potvrdit instalaci"
|
||||
|
||||
@@ -23,12 +23,18 @@
|
||||
"app.action-bar.primary-instance": {
|
||||
"message": "Primære instance"
|
||||
},
|
||||
"app.action-bar.reload-to-update": {
|
||||
"message": "Genindlæs for at opdater"
|
||||
},
|
||||
"app.action-bar.show-more-running-instances": {
|
||||
"message": "Vis flere kørende instances"
|
||||
},
|
||||
"app.action-bar.stop-instance": {
|
||||
"message": "Stop instance"
|
||||
},
|
||||
"app.action-bar.update": {
|
||||
"message": "Opdater"
|
||||
},
|
||||
"app.action-bar.view-active-downloads": {
|
||||
"message": "Vis aktive downloads"
|
||||
},
|
||||
@@ -146,6 +152,9 @@
|
||||
"app.browse.server.installing": {
|
||||
"message": "Installere"
|
||||
},
|
||||
"app.content-install.no-compatible-versions": {
|
||||
"message": "Ingen tilgængelige versioner passer til {compatibilityLabel}. Vælg en version for at installere. Afhængigheder bliver ikke installeret automatisk."
|
||||
},
|
||||
"app.creation-modal.installing-modpack.description": {
|
||||
"message": "{fileName}"
|
||||
},
|
||||
|
||||
@@ -429,7 +429,7 @@
|
||||
"message": "Nicht so schnell!"
|
||||
},
|
||||
"app.skins.reorder-error.text": {
|
||||
"message": "Die Anordnung deiner Skins konnte nicht gespeichert werden."
|
||||
"message": "Deine Skin-Reihenfolge konnte nicht gespeichert werden."
|
||||
},
|
||||
"app.skins.reorder-error.title": {
|
||||
"message": "Skins konnten nicht neu angeordnet werden"
|
||||
@@ -708,28 +708,28 @@
|
||||
"message": "Name"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel": {
|
||||
"message": "Aktualisierungskanal"
|
||||
"message": "Update-Kanal"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.alpha": {
|
||||
"message": "Alpha"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.alpha.description": {
|
||||
"message": "Voll, Beta- und Alpha-Versionen werden als verfügbare Aktualisierungen angezeigt."
|
||||
"message": "Release-, Beta- und Alpha-Versionen werden als verfügbare Updates angezeigt."
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.beta": {
|
||||
"message": "Beta"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.beta.description": {
|
||||
"message": "Voll- und Beta-Versionen werden als verfügbare Aktualisierungen angezeigt."
|
||||
"message": "Release- und Beta-Versionen werden als verfügbare Updates angezeigt."
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.release": {
|
||||
"message": "Vollversion"
|
||||
"message": "Release"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.release.description": {
|
||||
"message": "Nur Vollversionen werden als verfügbare Aktualisierungen angezeigt."
|
||||
"message": "Nur Release-Versionen werden als verfügbare Updates angezeigt."
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.select": {
|
||||
"message": "Aktualisierungskanal auswählen"
|
||||
"message": "Update-Kanal auswählen"
|
||||
},
|
||||
"instance.settings.tabs.hooks": {
|
||||
"message": "Start Hooks"
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
"app.action-bar.downloading-java": {
|
||||
"message": "Dina-download ang Java {version}"
|
||||
},
|
||||
"app.action-bar.downloading-update": {
|
||||
"message": "Dina-download ang update"
|
||||
},
|
||||
"app.action-bar.downloads": {
|
||||
"message": "Mga downloads"
|
||||
},
|
||||
@@ -20,6 +23,9 @@
|
||||
"app.action-bar.primary-instance": {
|
||||
"message": "Pangunahing instansiya"
|
||||
},
|
||||
"app.action-bar.reload-to-update": {
|
||||
"message": "Mag-reload upang ma-update"
|
||||
},
|
||||
"app.action-bar.show-more-running-instances": {
|
||||
"message": "Ipakita ang mas marami pang tumatakbong instansiya"
|
||||
},
|
||||
@@ -89,6 +95,9 @@
|
||||
"app.appearance-settings.select-option": {
|
||||
"message": "Pumili ng opsiyon"
|
||||
},
|
||||
"app.appearance-settings.show-play-time.description": {
|
||||
"message": "Magpapakita ang katagal ng iyong paglalaro sa isang instansiya."
|
||||
},
|
||||
"app.appearance-settings.toggle-sidebar.description": {
|
||||
"message": "Pagpapagana na mata-toggle ang sidebar."
|
||||
},
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
"message": "Afficher le temps de jeu"
|
||||
},
|
||||
"app.appearance-settings.toggle-sidebar.description": {
|
||||
"message": "Permet d’afficher ou de masquer la barre latérale."
|
||||
"message": "Permet d'ouvrir ou de fermer la barre latérale."
|
||||
},
|
||||
"app.appearance-settings.toggle-sidebar.title": {
|
||||
"message": "Tiroir latéral"
|
||||
|
||||
@@ -8,6 +8,12 @@
|
||||
"app.action-bar.downloads": {
|
||||
"message": "הורדות"
|
||||
},
|
||||
"app.action-bar.hide-more-running-instances": {
|
||||
"message": "החבא יותר התקנים רצים"
|
||||
},
|
||||
"app.action-bar.make-primary-instance": {
|
||||
"message": "הפוך למקרה ראשי"
|
||||
},
|
||||
"app.action-bar.offline": {
|
||||
"message": "לא מקוון"
|
||||
},
|
||||
@@ -260,6 +266,9 @@
|
||||
"friends.action.add-friend": {
|
||||
"message": "הוספת חבר"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count, plural, one {בקשת חברות אחת} other {# בקשות חברות}}"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "שליחת בקשת חברות"
|
||||
},
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
"message": "A kezdőlap „Folytasd itt” részében a legújabb világok is megtalálhatók."
|
||||
},
|
||||
"app.appearance-settings.jump-back-into-worlds.title": {
|
||||
"message": "„Folytasd itt” a világokat is"
|
||||
"message": "Visszaugrás a világokba"
|
||||
},
|
||||
"app.appearance-settings.minimize-launcher.description": {
|
||||
"message": "Minimalizáld az indítót a Minecraft indításakor."
|
||||
@@ -290,6 +290,9 @@
|
||||
"app.modal.install-to-play.install-button": {
|
||||
"message": "Telepítés"
|
||||
},
|
||||
"app.modal.install-to-play.mod-count": {
|
||||
"message": "{count} mod"
|
||||
},
|
||||
"app.modal.install-to-play.required-modpack": {
|
||||
"message": "Szükséges modcsomag"
|
||||
},
|
||||
@@ -539,6 +542,9 @@
|
||||
"friends.action.add-friend": {
|
||||
"message": "Barát hozzáadása"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count} barát {count, plural, other {kérelem}}"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "Barátkérelem elküldése"
|
||||
},
|
||||
@@ -708,19 +714,19 @@
|
||||
"message": "Frissítési csatorna"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.alpha": {
|
||||
"message": "Alpha"
|
||||
"message": "Alfa"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.alpha.description": {
|
||||
"message": "A release, béta és az alpha verziók is meg fognak jelenni az elérhető frissítések között."
|
||||
"message": "A kiadás, béta és az alfa verziók is meg fognak jelenni az elérhető frissítések között."
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.beta": {
|
||||
"message": "Béta"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.beta.description": {
|
||||
"message": "A release és a béta verziók is meg fognak jelenni az elérhető frissítések között."
|
||||
"message": "A kiadás és a béta verziók is meg fognak jelenni az elérhető frissítések között."
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.release": {
|
||||
"message": "Release"
|
||||
"message": "Kiadás"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.release.description": {
|
||||
"message": "Csak a release verziók fognak megjelenni az elérhető frissítések között."
|
||||
|
||||
@@ -290,6 +290,9 @@
|
||||
"app.modal.install-to-play.install-button": {
|
||||
"message": "Pasang"
|
||||
},
|
||||
"app.modal.install-to-play.mod-count": {
|
||||
"message": "{count, plural, other {# mod}}"
|
||||
},
|
||||
"app.modal.install-to-play.required-modpack": {
|
||||
"message": "Paket mod yang diperlukan"
|
||||
},
|
||||
@@ -545,6 +548,9 @@
|
||||
"friends.action.add-friend": {
|
||||
"message": "Tambah teman"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count} {count, plural, other {permintaan}} teman"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "Kirim permintaan teman"
|
||||
},
|
||||
|
||||
@@ -278,6 +278,9 @@
|
||||
"app.modal.install-to-play.install-button": {
|
||||
"message": "Installa"
|
||||
},
|
||||
"app.modal.install-to-play.mod-count": {
|
||||
"message": "{count} mod"
|
||||
},
|
||||
"app.modal.install-to-play.required-modpack": {
|
||||
"message": "Pacchetto di mod richiesto"
|
||||
},
|
||||
@@ -533,6 +536,9 @@
|
||||
"friends.action.add-friend": {
|
||||
"message": "Stringi un'amicizia"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count, plural, one {# richiesta} other {# richieste}} d''amicizia"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "Invia richiesta d'amicizia"
|
||||
},
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
"app.action-bar.downloading-java": {
|
||||
"message": "Java {version} をダウンロード中"
|
||||
},
|
||||
"app.action-bar.downloading-update": {
|
||||
"message": "アップデートをダウンロード中"
|
||||
},
|
||||
"app.action-bar.downloads": {
|
||||
"message": "ダウンロード"
|
||||
},
|
||||
@@ -260,6 +263,9 @@
|
||||
"app.modal.install-to-play.install-button": {
|
||||
"message": "インストール"
|
||||
},
|
||||
"app.modal.install-to-play.mod-count": {
|
||||
"message": "{count, plural, other {#個のMod}}"
|
||||
},
|
||||
"app.modal.install-to-play.required-modpack": {
|
||||
"message": "必須のModパック"
|
||||
},
|
||||
@@ -308,6 +314,21 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "リソース管理"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "スリム"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "ワイド"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "マント"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "マント"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "マントなし"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "置きかえる"
|
||||
},
|
||||
@@ -317,6 +338,42 @@
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "編集"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "ビルダーズ&バイオーム"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "チェイス・ザ・スカイ"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.modrinth": {
|
||||
"message": "Modrinth"
|
||||
},
|
||||
"app.skins.section.modrinth-pride": {
|
||||
"message": "Modrinth プライド"
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "マウント・オブ・メイヘム"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "保存済みのスキン"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "銅の時代"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "ガーデン・アウェイケンズ"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "タイニー・テイクオーバー"
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "ワクワクしている Modrinth ボット"
|
||||
},
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "Modrinth App v{version} のダウンロードが完了しました。今すぐ更新するには再読み込みするか、Modrinth Appを閉じる際に自動更新されます。"
|
||||
},
|
||||
@@ -365,6 +422,9 @@
|
||||
"friends.action.add-friend": {
|
||||
"message": "フレンドを追加"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count}件の友達リクエスト"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "フレンド申請を送信"
|
||||
},
|
||||
|
||||
@@ -533,6 +533,9 @@
|
||||
"friends.action.add-friend": {
|
||||
"message": "친구 추가"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count}건의 친구 요청"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "친구 요청 보내기"
|
||||
},
|
||||
|
||||
@@ -275,6 +275,9 @@
|
||||
"app.modal.install-to-play.install-button": {
|
||||
"message": "Pasang"
|
||||
},
|
||||
"app.modal.install-to-play.mod-count": {
|
||||
"message": "{count, plural, other {# mod}}"
|
||||
},
|
||||
"app.modal.install-to-play.required-modpack": {
|
||||
"message": "Pek mod yang diperlukan"
|
||||
},
|
||||
@@ -485,6 +488,9 @@
|
||||
"friends.action.add-friend": {
|
||||
"message": "Tambah rakan"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count} {count, plural, other {permintaan}} rakan"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "Hantar permintaan rakan"
|
||||
},
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
"app.action-bar.downloading-java": {
|
||||
"message": "Java {version} aan het downloaden"
|
||||
},
|
||||
"app.action-bar.downloading-update": {
|
||||
"message": "Update aan het downloaden"
|
||||
},
|
||||
"app.action-bar.downloads": {
|
||||
"message": "Downloads"
|
||||
},
|
||||
@@ -20,12 +23,18 @@
|
||||
"app.action-bar.primary-instance": {
|
||||
"message": "Primaire instantie"
|
||||
},
|
||||
"app.action-bar.reload-to-update": {
|
||||
"message": "Herlaadt om te updaten"
|
||||
},
|
||||
"app.action-bar.show-more-running-instances": {
|
||||
"message": "Toon meer actieve instanties"
|
||||
},
|
||||
"app.action-bar.stop-instance": {
|
||||
"message": "Stop instantie"
|
||||
},
|
||||
"app.action-bar.update": {
|
||||
"message": "Updaten"
|
||||
},
|
||||
"app.action-bar.view-active-downloads": {
|
||||
"message": "Bekijk actieve downloads"
|
||||
},
|
||||
@@ -86,6 +95,12 @@
|
||||
"app.appearance-settings.select-option": {
|
||||
"message": "Selecteer een optie"
|
||||
},
|
||||
"app.appearance-settings.show-play-time.description": {
|
||||
"message": "Toont hoeveel tijd je aan een instantie hebt besteed."
|
||||
},
|
||||
"app.appearance-settings.show-play-time.title": {
|
||||
"message": "Speeltijd laten zien"
|
||||
},
|
||||
"app.appearance-settings.toggle-sidebar.description": {
|
||||
"message": "Schakelt de mogelijkheid om de zijbalk in- of uit te schakelen in."
|
||||
},
|
||||
@@ -143,6 +158,9 @@
|
||||
"app.browse.server.installing": {
|
||||
"message": "Installeren"
|
||||
},
|
||||
"app.content-install.no-compatible-versions": {
|
||||
"message": "Er zijn geen beschikbare versies die overeenkomen met {compatibilityLabel}. Selecteer toch een versie om te installeren. Afhankelijkheden worden niet automatisch geïnstalleerd."
|
||||
},
|
||||
"app.creation-modal.installing-modpack.description": {
|
||||
"message": "{fileName}"
|
||||
},
|
||||
@@ -254,6 +272,9 @@
|
||||
"app.instance.worlds.remove-server-title": {
|
||||
"message": "Ben je zeker dat je {name} wil verwijderen?"
|
||||
},
|
||||
"app.instance.worlds.search-worlds-placeholder": {
|
||||
"message": "Zoek werelden"
|
||||
},
|
||||
"app.instance.worlds.this-server": {
|
||||
"message": "deze server"
|
||||
},
|
||||
@@ -296,6 +317,9 @@
|
||||
"app.project.install-button.already-installed": {
|
||||
"message": "Dit project is al geïnstalleerd"
|
||||
},
|
||||
"app.project.install-context.back-to-browse": {
|
||||
"message": "Terug naar Ontdekken"
|
||||
},
|
||||
"app.project.install-context.install-content-to-instance": {
|
||||
"message": "Installeer content naar instantie"
|
||||
},
|
||||
@@ -323,6 +347,153 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Bronnenbeheer"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Skin toevoegen"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "Slepen en neerzetten"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Toepassen"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "Skin verwijderen"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "De geselecteerde skin wordt permanent verwijderd. Deze actie kan niet ongedaan worden gemaakt."
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "Weet u zeker dat u deze skin wilt verwijderen?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "Kan het neergezette bestand niet lezen."
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "Fout bij het verwerken van het bestand"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Skin aanpassen"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Skin toevoegen"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Voeg een skin toe"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "Armstijl"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Slank"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Breed"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Cape"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Cape"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "Skin aan het aanpassen"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "Verander eerst iets aan de skin!"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Geen cape"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Geen"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "Texture vervangen"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "Skin opslaan"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "Opslaan..."
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "Textuur"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "Upload eerst een skin!"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "Skin aanpassen"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "Voorvertonen"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "U verandert te snel van skin. Mojang's servers hebben nieuwe aanvragen tijdelijk geblokkeerd. Wacht een moment voordat u het opnieuw probeert."
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "Rustig aan!"
|
||||
},
|
||||
"app.skins.reorder-error.text": {
|
||||
"message": "Je skinvolgorde kon niet worden opgeslagen."
|
||||
},
|
||||
"app.skins.reorder-error.title": {
|
||||
"message": "Het herschikken van skins is mislukt."
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Builders & Biomes"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "Chase the Skies"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "Standaardskins"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.modrinth": {
|
||||
"message": "Modrinth"
|
||||
},
|
||||
"app.skins.section.modrinth-pride": {
|
||||
"message": "Modrinth Pride"
|
||||
},
|
||||
"app.skins.section.modrinth-pride.tooltip": {
|
||||
"message": "U heeft deze skins ontvangen omdat u tijdens Pride Month heeft gedoneerd aan een Modrinth Pride-inzamelingsactie."
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Mounts of Mayhem"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "Opgeslagen skins"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "The Copper Age"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "The Garden Awakens"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "Tiny Takeover"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "Inloggen"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "Log in op je Minecraft-account om de skinbeheerfuncties van de Modrinth-app te gebruiken."
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "Excited Modrinth Bot"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "Log in"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "Skinkiezer"
|
||||
},
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "Modrinth App v{version} is klaar met downloaden. Herlaad om nu te updaten, of automatisch wanneer je de Modrinth App afsluit."
|
||||
},
|
||||
@@ -341,6 +512,9 @@
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "Downloaden voltooid"
|
||||
},
|
||||
"app.update-popup.reload": {
|
||||
"message": "Herladen om te updaten"
|
||||
},
|
||||
"app.update-popup.title": {
|
||||
"message": "Update beschikbaar"
|
||||
},
|
||||
@@ -539,6 +713,30 @@
|
||||
"instance.settings.tabs.general.name": {
|
||||
"message": "Naam"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel": {
|
||||
"message": "Updatekanaal"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.alpha": {
|
||||
"message": "Alfa"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.alpha.description": {
|
||||
"message": "Release-, beta- en alfaversies worden als beschikbare updates weergegeven."
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.beta": {
|
||||
"message": "Beta"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.beta.description": {
|
||||
"message": "Release- en beta-versies worden als beschikbare updates weergegeven.\n"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.release": {
|
||||
"message": "Release"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.release.description": {
|
||||
"message": "Alleen releaseversies worden als beschikbare updates weergegeven."
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.select": {
|
||||
"message": "Selecteer updatekanaal"
|
||||
},
|
||||
"instance.settings.tabs.hooks": {
|
||||
"message": "Opstart haakjes"
|
||||
},
|
||||
@@ -587,6 +785,24 @@
|
||||
"instance.settings.tabs.java": {
|
||||
"message": "Java en geheugen"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-environment-variables": {
|
||||
"message": "Aangepaste omgevingsvariabelen"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-arguments": {
|
||||
"message": "Aangepaste Java-argumenten"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-installation": {
|
||||
"message": "Aangepaste Java-installatie"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-memory-allocation": {
|
||||
"message": "Aangepaste geheugentoewijzing"
|
||||
},
|
||||
"instance.settings.tabs.java.enter-environment-variables": {
|
||||
"message": "Voer omgevingsvariabelen in…"
|
||||
},
|
||||
"instance.settings.tabs.java.enter-java-arguments": {
|
||||
"message": "Voer Java-argumenten in…"
|
||||
},
|
||||
"instance.settings.tabs.java.environment-variables": {
|
||||
"message": "Environment variabelen"
|
||||
},
|
||||
@@ -602,6 +818,9 @@
|
||||
"instance.settings.tabs.java.java-memory": {
|
||||
"message": "Voorgeschreven geheugen"
|
||||
},
|
||||
"instance.settings.tabs.java.java-path-placeholder": {
|
||||
"message": "//pad/naar/java"
|
||||
},
|
||||
"instance.settings.tabs.window": {
|
||||
"message": "Venster"
|
||||
},
|
||||
|
||||
@@ -287,6 +287,9 @@
|
||||
"app.modal.install-to-play.install-button": {
|
||||
"message": "Zainstaluj"
|
||||
},
|
||||
"app.modal.install-to-play.mod-count": {
|
||||
"message": "{count, plural, one {# mod} few {# mody} other {# modów}}"
|
||||
},
|
||||
"app.modal.install-to-play.required-modpack": {
|
||||
"message": "Wymagana paczka modów"
|
||||
},
|
||||
@@ -542,6 +545,9 @@
|
||||
"friends.action.add-friend": {
|
||||
"message": "Dodaj znajomego"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count} {count, plural, one {zaproszenie} few {zaproszenia} other {zaproszeń}} do znajomych"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "Wyślij zaproszenie"
|
||||
},
|
||||
|
||||
@@ -290,6 +290,9 @@
|
||||
"app.modal.install-to-play.install-button": {
|
||||
"message": "Instalar"
|
||||
},
|
||||
"app.modal.install-to-play.mod-count": {
|
||||
"message": "{count, plural, =0 {Nenhum mod} one {# mod} other {# mods}}"
|
||||
},
|
||||
"app.modal.install-to-play.required-modpack": {
|
||||
"message": "Pacote de mods necessário"
|
||||
},
|
||||
|
||||
@@ -275,6 +275,9 @@
|
||||
"app.modal.install-to-play.install-button": {
|
||||
"message": "Установить"
|
||||
},
|
||||
"app.modal.install-to-play.mod-count": {
|
||||
"message": "{count, plural, one {# мод} few {# мода} other {# модов}}"
|
||||
},
|
||||
"app.modal.install-to-play.required-modpack": {
|
||||
"message": "Необходимая сборка"
|
||||
},
|
||||
@@ -530,6 +533,9 @@
|
||||
"friends.action.add-friend": {
|
||||
"message": "Добавить в друзья"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count} {count, plural, one {запрос} few {запроса} other {запросов}} дружбы"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "Отправить запрос дружбы"
|
||||
},
|
||||
|
||||
@@ -74,6 +74,9 @@
|
||||
"app.appearance-settings.hide-nametag.title": {
|
||||
"message": "Dölj namnskylt"
|
||||
},
|
||||
"app.appearance-settings.jump-back-into-worlds.title": {
|
||||
"message": "Hoppa tillbaka i världar"
|
||||
},
|
||||
"app.appearance-settings.minimize-launcher.title": {
|
||||
"message": "Minimera programstartare"
|
||||
},
|
||||
@@ -458,6 +461,9 @@
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "Logga in"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "Snälla logga in din Minecraft konto att använda hud hantering förmågor i Modrinth appen."
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "Exalterad Modrinth bot"
|
||||
},
|
||||
|
||||
@@ -1,36 +1,45 @@
|
||||
{
|
||||
"app.action-bar.downloading-java": {
|
||||
"message": "ดาวน์โหลดเวอร์ชัน Java {version}"
|
||||
"message": "กำลังดาวน์โหลด Java {version}"
|
||||
},
|
||||
"app.action-bar.downloading-update": {
|
||||
"message": "กำลังดาวน์โหลดอัปเดต"
|
||||
},
|
||||
"app.action-bar.downloads": {
|
||||
"message": "ดาวน์โหลด"
|
||||
},
|
||||
"app.action-bar.hide-more-running-instances": {
|
||||
"message": "ซ่อนการดำเนินการโปรแกรมเบื้องหลัง"
|
||||
"message": "ซ่อนอินสแตนซ์ที่ทำงานอยู่เพิ่มเติม"
|
||||
},
|
||||
"app.action-bar.make-primary-instance": {
|
||||
"message": "กำหนดโปรแกรมหลัก"
|
||||
"message": "กำหนดอินสแตนซ์หลัก"
|
||||
},
|
||||
"app.action-bar.no-instances-running": {
|
||||
"message": "ไม่มีโปรแกรมใดดำเนินการ"
|
||||
"message": "ไม่มีอินสแตนซ์ที่กำลังทำงาน"
|
||||
},
|
||||
"app.action-bar.offline": {
|
||||
"message": "ออฟไลน์"
|
||||
},
|
||||
"app.action-bar.primary-instance": {
|
||||
"message": "โปรแกรมหลัก"
|
||||
"message": "อินสแตนซ์หลัก"
|
||||
},
|
||||
"app.action-bar.reload-to-update": {
|
||||
"message": "รีโหลดเพื่ออัปเดต"
|
||||
},
|
||||
"app.action-bar.show-more-running-instances": {
|
||||
"message": "แสดงการดำเนินการโปรแกรมเบื้องหลังเพิ่มเติม"
|
||||
"message": "แสดงอินสแตนซ์ที่ทำงานอยู่เพิ่มเติม"
|
||||
},
|
||||
"app.action-bar.stop-instance": {
|
||||
"message": "หยุดการทำงานโปรแกรม"
|
||||
"message": "หยุดอินสแตนซ์"
|
||||
},
|
||||
"app.action-bar.update": {
|
||||
"message": "อัปเดต"
|
||||
},
|
||||
"app.action-bar.view-active-downloads": {
|
||||
"message": "ดูยอดการดาวน์โหลดที่ยังใช้งาน"
|
||||
"message": "ดูการดาวน์โหลดที่กำลังดำเนินการอยู่"
|
||||
},
|
||||
"app.action-bar.view-instance": {
|
||||
"message": "ดูโปรแกรม"
|
||||
"message": "ดูอินสแตนซ์"
|
||||
},
|
||||
"app.action-bar.view-logs": {
|
||||
"message": "ดู Log"
|
||||
@@ -42,7 +51,7 @@
|
||||
"message": "การเรนเดอร์ขั้นสูง"
|
||||
},
|
||||
"app.appearance-settings.color-theme.description": {
|
||||
"message": "เลือกธีมสีที่คุณชื่นชอบสำหรับ Modrinth บนอุปกรณ์นี้"
|
||||
"message": "เลือกธีมสีที่คุณต้องการสำหรับ Modrinth App"
|
||||
},
|
||||
"app.appearance-settings.color-theme.title": {
|
||||
"message": "ธีมสี"
|
||||
@@ -54,22 +63,22 @@
|
||||
"message": "หน้าหลัก"
|
||||
},
|
||||
"app.appearance-settings.default-landing-page.library": {
|
||||
"message": "รายการ"
|
||||
"message": "ไลบรารี"
|
||||
},
|
||||
"app.appearance-settings.default-landing-page.title": {
|
||||
"message": "หน้าเริ่มต้น"
|
||||
},
|
||||
"app.appearance-settings.hide-nametag.description": {
|
||||
"message": "ปิดป้ายชื่อบนศีรษะของผู้เล่นในหน้าแสดงสกิน"
|
||||
"message": "ซ่อนป้ายชื่อบนศีรษะของผู้เล่นในหน้าแสดงสกิน"
|
||||
},
|
||||
"app.appearance-settings.hide-nametag.title": {
|
||||
"message": "ซ่อนป้ายชื่อ"
|
||||
},
|
||||
"app.appearance-settings.jump-back-into-worlds.description": {
|
||||
"message": "การแสดงผลโลกล่าสุดที่ผู้เล่นเล่นในส่วน \"กระโดดกลับเข้าไป\" ในหน้าหลัก"
|
||||
"message": "แสดงโลกที่เล่นล่าสุดในส่วน \"เล่นต่อ\" บนหน้าหลัก"
|
||||
},
|
||||
"app.appearance-settings.jump-back-into-worlds.title": {
|
||||
"message": "กระโดดกลับเข้าไปในโลก"
|
||||
"message": "เล่นต่อ"
|
||||
},
|
||||
"app.appearance-settings.minimize-launcher.description": {
|
||||
"message": "ย่อลันเชอร์เมื่อกระบวนการการรัน Minecraft เริ่มต้นแล้ว"
|
||||
@@ -78,13 +87,19 @@
|
||||
"message": "ย่อลันเชอร์"
|
||||
},
|
||||
"app.appearance-settings.native-decorations.description": {
|
||||
"message": "ใช้ระบบกรอบหน้าต่าง (ต้องการการรีสตาร์ทโปรแกรมใหม่)"
|
||||
"message": "ใช้กรอบหน้าต่างระบบ (ต้องรีสตาร์ทแอป)"
|
||||
},
|
||||
"app.appearance-settings.native-decorations.title": {
|
||||
"message": "ของตกแต่งดั้งเดิม"
|
||||
},
|
||||
"app.appearance-settings.select-option": {
|
||||
"message": "เลือกตัวเลิือก"
|
||||
"message": "เลือกตัวเลือก"
|
||||
},
|
||||
"app.appearance-settings.show-play-time.description": {
|
||||
"message": "แสดงเวลาที่คุณใช้เล่นในแต่ละอินสแตนซ์"
|
||||
},
|
||||
"app.appearance-settings.show-play-time.title": {
|
||||
"message": "แสดงระยะเวลาที่เล่น"
|
||||
},
|
||||
"app.appearance-settings.toggle-sidebar.description": {
|
||||
"message": "เปิดใช้งานตัวเลือกในการเลือกย่อหรือขยายแถบด้านข้าง"
|
||||
@@ -104,6 +119,12 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "ไม่สามารถเชื่อมต่อถึงเซิร์ฟเวอร์ได้"
|
||||
},
|
||||
"app.browse.add-servers-to-instance": {
|
||||
"message": "เพิ่มเซิร์ฟเวอร์ลงในอินสแตนซ์"
|
||||
},
|
||||
"app.browse.add-to-an-instance": {
|
||||
"message": "เพิ่มลงในอินสแตนซ์"
|
||||
},
|
||||
"app.browse.add-to-instance": {
|
||||
"message": "เพิ่มลงในโปรแกรม"
|
||||
},
|
||||
@@ -116,6 +137,9 @@
|
||||
"app.browse.already-added": {
|
||||
"message": "เพิ่มแล้ว"
|
||||
},
|
||||
"app.browse.back-to-instance": {
|
||||
"message": "กลับสู่อินสแตนซ์"
|
||||
},
|
||||
"app.browse.discover-content": {
|
||||
"message": "สำรวจเนื้อหา"
|
||||
},
|
||||
@@ -128,9 +152,15 @@
|
||||
"app.browse.project-type.modpacks": {
|
||||
"message": "แพ็กม็อด"
|
||||
},
|
||||
"app.browse.server-instance-content-warning": {
|
||||
"message": "การเพิ่มเนื้อหาอาจทำให้ใช้งานร่วมกันไม่ได้เมื่อเข้าร่วมเซิร์ฟเวอร์ เนื้อหาที่เพิ่มเข้ามาจะหายไปเมื่อคุณอัปเดตอินสแตนซ์ของเซิร์ฟเวอร์"
|
||||
},
|
||||
"app.browse.server.installing": {
|
||||
"message": "กำลังติดตั้ง"
|
||||
},
|
||||
"app.content-install.no-compatible-versions": {
|
||||
"message": "ไม่มีเวอร์ชันที่เข้ากันได้ {compatibilityLabel} โปรดเลือกเวอร์ชันที่จะติดตั้ง ไฟล์ที่จำเป็นจะไม่ถูกติดตั้งโดยอัตโนมัติ"
|
||||
},
|
||||
"app.creation-modal.installing-modpack.description": {
|
||||
"message": "{fileName}"
|
||||
},
|
||||
@@ -260,6 +290,9 @@
|
||||
"app.modal.install-to-play.install-button": {
|
||||
"message": "ติดตั้ง"
|
||||
},
|
||||
"app.modal.install-to-play.mod-count": {
|
||||
"message": "{count, plural, other {# ม็อด}}"
|
||||
},
|
||||
"app.modal.install-to-play.required-modpack": {
|
||||
"message": "มอดแพ็กที่จำเป็น"
|
||||
},
|
||||
@@ -284,6 +317,15 @@
|
||||
"app.modal.update-to-play.update-required-description": {
|
||||
"message": "จำเป็นต้องอัปเดตเพื่อเล่น {name} กรุณาอัปเดตเป็นเวอร์ชันล่าสุดเพื่อเปิดเกม"
|
||||
},
|
||||
"app.project.install-button.already-installed": {
|
||||
"message": "โปรเจคนี้ถูกติดตั้งแล้ว"
|
||||
},
|
||||
"app.project.install-context.back-to-browse": {
|
||||
"message": "กลับไปที่หน้าค้นหา"
|
||||
},
|
||||
"app.project.install-context.install-content-to-instance": {
|
||||
"message": "ติดตั้งเนื้อหาลงสู่อินสแตนซ์"
|
||||
},
|
||||
"app.settings.developer-mode-enabled": {
|
||||
"message": "โหมดนักพัฒนาเปิดอยู่"
|
||||
},
|
||||
@@ -308,6 +350,150 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "การจัดการทรัพยากร"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "เพิ่มสกิน"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "ลากและวาง"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "นำไปใช้"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "ลบสกิน"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "การดำเนินการนี้จะลบสกินที่เลือกอย่างถาวร การกระทำนี้ไม่สามารถย้อนกลับได้"
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "คุณแน่ใจหรือว่าต้องการที่จะลบสกินนี้?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "ไม่สามารถอ่านไฟล์ที่ถูกลากและวางได้"
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "ข้อผิดพลาดในการประมวลผลไฟล์"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "แก้ไขสกิน"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "เพิ่มสกิน"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "การเพิ่มสกิน"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "สไตล์แขน"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "เพรียว"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "กว้าง"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "ผ้าคลุม"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "ผ้าคลุม"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "แก้ไขสกิน"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "แก้ไขสกินก่อน!"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "ไม่มีผ้าคลุม"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "ไม่มี"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "เปลี่ยนเท็กซ์เจอร์"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "บันทึกสกิน"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "กำลังบันทึก"
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "เท็กซ์เจอร์"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "อัพโหลดสกินก่อน!"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "แก้ไขสกิน"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "การแสดงตัวอย่าง"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "คุณได้เปลี่ยนสกินบ่อยเกินไป เซิร์ฟเวอร์ของ Mojang ได้บล็อกคำขอเพิ่มเติมชั่วคราว โปรดรอสักครู่ก่อนลองอีกครั้ง"
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "ลดความถี่ลง!"
|
||||
},
|
||||
"app.skins.reorder-error.text": {
|
||||
"message": "ไม่สามารถบันทึกลำดับสกินของคุณได้"
|
||||
},
|
||||
"app.skins.reorder-error.title": {
|
||||
"message": "ไม่สามารถจัดเรียงสกินได้"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Builders & Biomes"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "Chase the Skies"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "สกินเริ่มต้น"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.modrinth": {
|
||||
"message": "Modrinth"
|
||||
},
|
||||
"app.skins.section.modrinth-pride": {
|
||||
"message": "Modrinth Pride"
|
||||
},
|
||||
"app.skins.section.modrinth-pride.tooltip": {
|
||||
"message": "คุณได้รับสกินเหล่านี้จากการร่วมบริจาคให้กับกิจกรรมระดมทุน Modrinth Pride ในช่วงเดือน Pride Month"
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Mounts of Mayhem"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "สกินที่บันทึกไว้"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "The Copper Age"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "The Garden Awakens"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "Tiny Takeover"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "ลงชื่อเข้าใช้"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "โปรดลงชื่อเข้าใช้บัญชี Minecraft ของคุณเพื่อใช้งานฟีเจอร์จัดการสกินของแอป Modrinth"
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "บอท Modrinth ที่กำลังตื่นเต้น"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "โปรดลงชื่อเข้าใช้"
|
||||
},
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "ดาวน์โหลด Modrinth v{version} สำเร็จแล้ว เปิดโปรแกรมใหม่อีกครั้งเพื่ออัปเดตตอนนี้ หรือจะรออัปเดตอัตโนมัติ ซึ่งจะเกิดขึ้นเมื่อคุณกดปิดโปรแกรม Modrinth"
|
||||
},
|
||||
@@ -356,6 +542,9 @@
|
||||
"friends.action.add-friend": {
|
||||
"message": "เพิ่มเพื่อน"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "คำขอเป็นเพื่อน {count} {count, plural, other {คน}}"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "ส่งคำขอเป็นเพื่อน"
|
||||
},
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
"message": "Kurulumu durdur"
|
||||
},
|
||||
"app.action-bar.update": {
|
||||
"message": "Güncelle"
|
||||
"message": "Güncelleme"
|
||||
},
|
||||
"app.action-bar.view-active-downloads": {
|
||||
"message": "Şu anda indirilienleri göster"
|
||||
@@ -54,7 +54,7 @@
|
||||
"message": "Modrinth App için tercih ettiğiniz temayı seçin."
|
||||
},
|
||||
"app.appearance-settings.color-theme.title": {
|
||||
"message": "Tema"
|
||||
"message": "Tema Rengi"
|
||||
},
|
||||
"app.appearance-settings.default-landing-page.description": {
|
||||
"message": "Launcher açıldığında varsayılan olarak açılacak sayfayı seçin."
|
||||
@@ -144,7 +144,7 @@
|
||||
"message": "İçerik keşfet"
|
||||
},
|
||||
"app.browse.discover-servers": {
|
||||
"message": "Sunucu keşfet"
|
||||
"message": "Sunucuları keşfet"
|
||||
},
|
||||
"app.browse.hide-added-servers": {
|
||||
"message": "Zaten eklenmiş sunucuları gizle"
|
||||
@@ -548,6 +548,9 @@
|
||||
"friends.action.add-friend": {
|
||||
"message": "Bir arkadaş ekle"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count} arkadaşlık isteği"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "Arkadaşlık isteği gönder"
|
||||
},
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
"app.action-bar.downloading-java": {
|
||||
"message": "Завантаження Java {version}"
|
||||
},
|
||||
"app.action-bar.downloading-update": {
|
||||
"message": "Завантаження оновлення"
|
||||
},
|
||||
"app.action-bar.downloads": {
|
||||
"message": "Завантаження"
|
||||
},
|
||||
@@ -20,12 +23,18 @@
|
||||
"app.action-bar.primary-instance": {
|
||||
"message": "Основний профіль"
|
||||
},
|
||||
"app.action-bar.reload-to-update": {
|
||||
"message": "Перезавантаження для оновлення"
|
||||
},
|
||||
"app.action-bar.show-more-running-instances": {
|
||||
"message": "Показати більше запущених профілів"
|
||||
},
|
||||
"app.action-bar.stop-instance": {
|
||||
"message": "Зупинити профіль"
|
||||
},
|
||||
"app.action-bar.update": {
|
||||
"message": "Оновлення"
|
||||
},
|
||||
"app.action-bar.view-active-downloads": {
|
||||
"message": "Переглянути активні завантаження"
|
||||
},
|
||||
@@ -272,6 +281,9 @@
|
||||
"app.modal.install-to-play.install-button": {
|
||||
"message": "Установити"
|
||||
},
|
||||
"app.modal.install-to-play.mod-count": {
|
||||
"message": "{count, plural, one {# мод} few {# мода} other {# модів}}"
|
||||
},
|
||||
"app.modal.install-to-play.required-modpack": {
|
||||
"message": "Потрібна збірка"
|
||||
},
|
||||
@@ -416,6 +428,12 @@
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "Повільніше!"
|
||||
},
|
||||
"app.skins.reorder-error.text": {
|
||||
"message": "Ваше замовлення скінів не вдалося зберегти."
|
||||
},
|
||||
"app.skins.reorder-error.title": {
|
||||
"message": "Не вдалося змінити порядок скінів"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Builders & Biomes"
|
||||
},
|
||||
@@ -488,6 +506,9 @@
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "Завантаження завершено"
|
||||
},
|
||||
"app.update-popup.reload": {
|
||||
"message": "Перезавантаження для оновлення"
|
||||
},
|
||||
"app.update-popup.title": {
|
||||
"message": "Доступне оновлення"
|
||||
},
|
||||
@@ -518,6 +539,9 @@
|
||||
"friends.action.add-friend": {
|
||||
"message": "Додати друга"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count} запит{count, plural, one { у} few {и в} many {ів у} other {у в}} друзі"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "Надіслати запит у друзі"
|
||||
},
|
||||
@@ -683,6 +707,30 @@
|
||||
"instance.settings.tabs.general.name": {
|
||||
"message": "Назва"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel": {
|
||||
"message": "Випуск оновлення"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.alpha": {
|
||||
"message": "Альфа"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.alpha.description": {
|
||||
"message": "Випуски, бета- та альфа-версії будуть показуватися як доступні оновлення."
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.beta": {
|
||||
"message": "Бета"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.beta.description": {
|
||||
"message": "Випуски та бета-версії будуть показуватися як доступні оновлення."
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.release": {
|
||||
"message": "Випуск"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.release.description": {
|
||||
"message": "Тільки випуски версії будуть показуватися як доступні оновлення."
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.select": {
|
||||
"message": "Оберіть випуск оновлення"
|
||||
},
|
||||
"instance.settings.tabs.hooks": {
|
||||
"message": "Гуки запуску"
|
||||
},
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
"app.action-bar.downloading-java": {
|
||||
"message": "Đang tải xuống Java {version}"
|
||||
},
|
||||
"app.action-bar.downloading-update": {
|
||||
"message": "Đang tải xuống bản cập nhật"
|
||||
},
|
||||
"app.action-bar.downloads": {
|
||||
"message": "Tải xuống"
|
||||
},
|
||||
@@ -20,12 +23,18 @@
|
||||
"app.action-bar.primary-instance": {
|
||||
"message": "Bản instance chính"
|
||||
},
|
||||
"app.action-bar.reload-to-update": {
|
||||
"message": "Tải lại để cập nhật"
|
||||
},
|
||||
"app.action-bar.show-more-running-instances": {
|
||||
"message": "Hiện thêm các phiên bản đang chạy"
|
||||
},
|
||||
"app.action-bar.stop-instance": {
|
||||
"message": "Dừng instance"
|
||||
},
|
||||
"app.action-bar.update": {
|
||||
"message": "Cập nhật"
|
||||
},
|
||||
"app.action-bar.view-active-downloads": {
|
||||
"message": "Xem các lượt tải xuống"
|
||||
},
|
||||
@@ -149,6 +158,9 @@
|
||||
"app.browse.server.installing": {
|
||||
"message": "Đang cài đặt"
|
||||
},
|
||||
"app.content-install.no-compatible-versions": {
|
||||
"message": "Không có phiên bản nào phù hợp với {compatibilityLabel}. Nếu vẫn chọn một phiên bản để cài đặt, các gói phụ thuộc sẽ không được tải tự động."
|
||||
},
|
||||
"app.creation-modal.installing-modpack.description": {
|
||||
"message": "{fileName}"
|
||||
},
|
||||
@@ -278,6 +290,9 @@
|
||||
"app.modal.install-to-play.install-button": {
|
||||
"message": "Tải xuống"
|
||||
},
|
||||
"app.modal.install-to-play.mod-count": {
|
||||
"message": "{count, plural, other {# mod}}"
|
||||
},
|
||||
"app.modal.install-to-play.required-modpack": {
|
||||
"message": "Yêu cầu modpack"
|
||||
},
|
||||
@@ -422,6 +437,12 @@
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "Bình tĩnh lại!"
|
||||
},
|
||||
"app.skins.reorder-error.text": {
|
||||
"message": "Không thể lưu thứ tự skin của bạn."
|
||||
},
|
||||
"app.skins.reorder-error.title": {
|
||||
"message": "Sắp xếp lại skin thất bại"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Builders & Biomes"
|
||||
},
|
||||
@@ -494,6 +515,9 @@
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "Cài đặt thành công"
|
||||
},
|
||||
"app.update-popup.reload": {
|
||||
"message": "Tải lại để cập nhật"
|
||||
},
|
||||
"app.update-popup.title": {
|
||||
"message": "Cập nhật mới hiện đang khả dụng"
|
||||
},
|
||||
@@ -524,6 +548,9 @@
|
||||
"friends.action.add-friend": {
|
||||
"message": "Thêm một người bạn"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count} {count, plural, other {yêu cầu kết bạn}}"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "Gửi yêu cầu kết bạn"
|
||||
},
|
||||
@@ -689,6 +716,30 @@
|
||||
"instance.settings.tabs.general.name": {
|
||||
"message": "Tên"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel": {
|
||||
"message": "Kênh cập nhật"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.alpha": {
|
||||
"message": "Sơ khai"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.alpha.description": {
|
||||
"message": "Các phiên bản chính thức, thử nghiệm và sơ khai sẽ hiển thị trong danh sách cập nhật có sẵn."
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.beta": {
|
||||
"message": "Thử nghiệm"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.beta.description": {
|
||||
"message": "Các phiên bản chính thức và thử nghiệm sẽ hiển thị trong danh sách cập nhật có sẵn."
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.release": {
|
||||
"message": "Chính thức"
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.release.description": {
|
||||
"message": "Chỉ phiên bản chính thức sẽ hiển thị trong danh sách cập nhật có sẵn."
|
||||
},
|
||||
"instance.settings.tabs.general.update-channel.select": {
|
||||
"message": "Chọn kênh cập nhật"
|
||||
},
|
||||
"instance.settings.tabs.hooks": {
|
||||
"message": "Khởi chạy Hooks"
|
||||
},
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
"message": "在皮肤页面中禁用你玩家头顶上的名牌。"
|
||||
},
|
||||
"app.appearance-settings.hide-nametag.title": {
|
||||
"message": "隐藏名称标签"
|
||||
"message": "隐藏名牌"
|
||||
},
|
||||
"app.appearance-settings.jump-back-into-worlds.description": {
|
||||
"message": "在主页的“快速回到”部分包含最近的世界。"
|
||||
@@ -153,7 +153,7 @@
|
||||
"message": "整合包"
|
||||
},
|
||||
"app.browse.server-instance-content-warning": {
|
||||
"message": "加入服务器时,添加内容可能会破坏兼容性。当更新服务器实例内容时任何添加的内容也将丢失。"
|
||||
"message": "加入服务器时,添加内容可能会破坏兼容性。当更新服务器实例内容时,任何添加的内容也将丢失。"
|
||||
},
|
||||
"app.browse.server.installing": {
|
||||
"message": "安装中"
|
||||
@@ -281,6 +281,9 @@
|
||||
"app.modal.install-to-play.install-button": {
|
||||
"message": "安装"
|
||||
},
|
||||
"app.modal.install-to-play.mod-count": {
|
||||
"message": "{count} 个模组"
|
||||
},
|
||||
"app.modal.install-to-play.required-modpack": {
|
||||
"message": "需求整合包"
|
||||
},
|
||||
@@ -536,6 +539,9 @@
|
||||
"friends.action.add-friend": {
|
||||
"message": "添加好友"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count} 个好友请求"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "发送好友请求"
|
||||
},
|
||||
|
||||
@@ -96,10 +96,10 @@
|
||||
"message": "選擇選項"
|
||||
},
|
||||
"app.appearance-settings.show-play-time.description": {
|
||||
"message": "顯示你在該實例的遊玩時間。"
|
||||
"message": "顯示你在該實例的遊玩時數。"
|
||||
},
|
||||
"app.appearance-settings.show-play-time.title": {
|
||||
"message": "顯示遊玩時間"
|
||||
"message": "顯示遊玩時數"
|
||||
},
|
||||
"app.appearance-settings.toggle-sidebar.description": {
|
||||
"message": "啟用切換側邊欄的功能。"
|
||||
@@ -281,6 +281,9 @@
|
||||
"app.modal.install-to-play.install-button": {
|
||||
"message": "安裝"
|
||||
},
|
||||
"app.modal.install-to-play.mod-count": {
|
||||
"message": "{count, plural, other {# 個模組}}"
|
||||
},
|
||||
"app.modal.install-to-play.required-modpack": {
|
||||
"message": "所需模組包"
|
||||
},
|
||||
@@ -483,7 +486,7 @@
|
||||
"message": "請登入"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "外觀選擇"
|
||||
"message": "外觀選擇工具"
|
||||
},
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "Modrinth App v{version} 已完成下載!立即重新載入以更新,或在關閉 Modrinth App 時自動更新。"
|
||||
@@ -536,6 +539,9 @@
|
||||
"friends.action.add-friend": {
|
||||
"message": "新增好友"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count} 個好友{count, plural, other {邀請}}"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "送出好友邀請"
|
||||
},
|
||||
@@ -786,10 +792,10 @@
|
||||
"message": "自訂記憶體分配"
|
||||
},
|
||||
"instance.settings.tabs.java.enter-environment-variables": {
|
||||
"message": "輸入環境變數……"
|
||||
"message": "輸入環境變數..."
|
||||
},
|
||||
"instance.settings.tabs.java.enter-java-arguments": {
|
||||
"message": "輸入 Java 參數……"
|
||||
"message": "輸入 Java 參數..."
|
||||
},
|
||||
"instance.settings.tabs.java.environment-variables": {
|
||||
"message": "環境變數"
|
||||
|
||||
@@ -432,6 +432,20 @@ components:
|
||||
primary_file:
|
||||
type: string
|
||||
description: The multipart field name of the primary file
|
||||
environment:
|
||||
type: string
|
||||
enum:
|
||||
- client_and_server
|
||||
- client_only
|
||||
- client_only_server_optional
|
||||
- singleplayer_only
|
||||
- server_only
|
||||
- server_only_client_optional
|
||||
- dedicated_server_only
|
||||
- client_or_server
|
||||
- client_or_server_prefers_both
|
||||
- unknown
|
||||
description: The environment that this version is for.
|
||||
required:
|
||||
- file_parts
|
||||
- project_id
|
||||
|
||||
@@ -14,8 +14,6 @@ import { I18nDebugPanel, LoadingBar, NotificationPanel } from '@modrinth/ui'
|
||||
|
||||
import { setupProviders } from '~/providers/setup.ts'
|
||||
|
||||
import { useAuth } from './composables/auth'
|
||||
|
||||
const auth = await useAuth()
|
||||
setupProviders(auth)
|
||||
</script>
|
||||
|
||||
@@ -86,7 +86,7 @@ export const analyticsMessages = defineMessages({
|
||||
},
|
||||
noDependent: {
|
||||
id: 'analytics.value.no-dependent',
|
||||
defaultMessage: 'No dependents',
|
||||
defaultMessage: 'None',
|
||||
},
|
||||
noDependentTooltip: {
|
||||
id: 'analytics.value.no-dependent-tooltip',
|
||||
@@ -370,7 +370,7 @@ export const analyticsBreakdownMessages = defineMessages({
|
||||
},
|
||||
members: {
|
||||
id: 'analytics.breakdown.members',
|
||||
defaultMessage: 'Members',
|
||||
defaultMessage: 'Member',
|
||||
},
|
||||
dependentProjectDownload: {
|
||||
id: 'analytics.breakdown.dependent-project-download',
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
:placeholder="formatMessage(analyticsMessages.selectProjects)"
|
||||
:no-options-message="noProjectsMessage"
|
||||
:searchable="projectOptions.length > 6"
|
||||
fuzzy-search
|
||||
:max-tag-rows="1"
|
||||
:trigger-class="analyticsQueryChipTriggerClass"
|
||||
fit-content
|
||||
@@ -211,6 +212,7 @@
|
||||
:placeholder="formatMessage(analyticsMessages.selectProjects)"
|
||||
:no-options-message="noProjectsMessage"
|
||||
:searchable="projectOptions.length > 6"
|
||||
fuzzy-search
|
||||
:max-tag-rows="1"
|
||||
checkbox-position="right"
|
||||
show-selection-actions
|
||||
@@ -545,7 +547,7 @@ function getProjectOption(
|
||||
return {
|
||||
value: project.id,
|
||||
label: project.name,
|
||||
searchTerms: groupTitle ? [groupTitle] : undefined,
|
||||
searchTerms: [project.id, groupTitle].filter((term): term is string => Boolean(term)),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-21
@@ -47,34 +47,17 @@ defineExpose({
|
||||
></div>
|
||||
</template>
|
||||
|
||||
<style>
|
||||
<style lang="scss">
|
||||
.h-captcha {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
overflow: hidden;
|
||||
border-radius: var(--radius-md);
|
||||
border: 2px solid var(--color-button-bg);
|
||||
height: 100px;
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
}
|
||||
height: 78px;
|
||||
|
||||
.h-captcha iframe {
|
||||
transform: scale(1.33);
|
||||
transform-origin: center;
|
||||
margin: -1px;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 400px) {
|
||||
.h-captcha {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.h-captcha iframe {
|
||||
transform: scale(1.03);
|
||||
margin: 0;
|
||||
max-width: 100%;
|
||||
iframe {
|
||||
margin: -1px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,279 +0,0 @@
|
||||
<template>
|
||||
<div
|
||||
class="shadow-card mx-auto flex w-full max-w-[28rem] flex-col gap-6 rounded-2xl border border-button-bg bg-surface-3 p-6"
|
||||
>
|
||||
<h1
|
||||
class="mx-auto my-0 flex w-full justify-center text-center text-2xl font-semibold text-contrast"
|
||||
>
|
||||
{{ formatMessage(messages.title) }}
|
||||
</h1>
|
||||
|
||||
<section v-if="requiresDob" class="flex flex-col gap-2.5">
|
||||
<label class="text-md font-semibold text-contrast" for="create-account-dob">
|
||||
{{ formatMessage(messages.dateOfBirthLabel) }}
|
||||
</label>
|
||||
<DatePicker
|
||||
id="create-account-dob"
|
||||
v-model="dateOfBirthModel"
|
||||
wrapper-class="w-full"
|
||||
min-date="1900-01-01"
|
||||
:max-date="maxInputDate"
|
||||
:default-view-date="defaultDobViewDate"
|
||||
preserve-day
|
||||
:placeholder="formatMessage(messages.dateOfBirthPlaceholder)"
|
||||
/>
|
||||
<div>
|
||||
{{ formatMessage(messages.over13HelperText) }}
|
||||
</div>
|
||||
<Admonition :type="'info'">
|
||||
<template #header>
|
||||
<div class="-mb-3 -mt-1 flex flex-col gap-0 text-sm font-normal leading-normal">
|
||||
<div>
|
||||
{{ formatMessage(messages.infoPanelText) }}
|
||||
</div>
|
||||
<a
|
||||
class="w-fit text-link underline"
|
||||
:href="SOURCE_CODE_URL"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
{{ formatMessage(messages.relevantSourceCodeText) }}
|
||||
</a>
|
||||
</div>
|
||||
</template>
|
||||
</Admonition>
|
||||
</section>
|
||||
|
||||
<section class="flex flex-col gap-2.5">
|
||||
<label class="text-md font-semibold text-contrast" for="create-account-username">
|
||||
{{ formatMessage(messages.usernameOptionalLabel) }}
|
||||
<span class="font-normal text-primary">(optional)</span>
|
||||
</label>
|
||||
<StyledInput
|
||||
id="create-account-username"
|
||||
v-model="usernameModel"
|
||||
type="text"
|
||||
:placeholder="formatMessage(messages.usernamePlaceholder)"
|
||||
wrapper-class="w-full"
|
||||
/>
|
||||
</section>
|
||||
|
||||
<section v-if="globals?.captcha_enabled" class="flex flex-col gap-2.5">
|
||||
<label class="text-md font-semibold text-contrast">{{
|
||||
formatMessage(messages.securityCheckLabel)
|
||||
}}</label>
|
||||
<HCaptcha v-if="globals?.captcha_enabled" :ref="onSetCaptchaRef" v-model="tokenModel" />
|
||||
</section>
|
||||
|
||||
<div
|
||||
class="flex gap-2.5 rounded-2xl border border-solid border-surface-5 bg-surface-3 transition-all hover:brightness-110"
|
||||
>
|
||||
<Checkbox
|
||||
v-model="subscribeModel"
|
||||
class="p-3 text-left leading-snug text-primary transition-all"
|
||||
:label="formatMessage(messages.subscribeLabel)"
|
||||
:description="formatMessage(messages.subscribeLabel)"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<ButtonStyled color="brand">
|
||||
<button
|
||||
class="!w-full font-bold"
|
||||
:disabled="globals?.captcha_enabled ? !tokenModel : false"
|
||||
@click="onCompleteSignUpClick"
|
||||
>
|
||||
{{ formatMessage(messages.completeSignUpButton) }}
|
||||
<RightArrowIcon />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { RightArrowIcon } from '@modrinth/assets'
|
||||
import {
|
||||
Admonition,
|
||||
ButtonStyled,
|
||||
Checkbox,
|
||||
DatePicker,
|
||||
defineMessages,
|
||||
injectNotificationManager,
|
||||
StyledInput,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { computed } from 'vue'
|
||||
|
||||
import HCaptcha from '@/components/ui/auth/HCaptcha.vue'
|
||||
|
||||
interface AuthGlobals {
|
||||
captcha_enabled?: boolean
|
||||
[key: string]: unknown
|
||||
}
|
||||
|
||||
interface Props {
|
||||
globals?: AuthGlobals | null
|
||||
requiresDob?: boolean
|
||||
onCompleteSignUp?: () => void
|
||||
onSetCaptchaRef?: ((captchaRef: unknown) => void) | undefined
|
||||
}
|
||||
|
||||
const {
|
||||
globals = null,
|
||||
requiresDob = true,
|
||||
onCompleteSignUp = () => {},
|
||||
onSetCaptchaRef = undefined,
|
||||
} = defineProps<Props>()
|
||||
|
||||
const SOURCE_CODE_URL =
|
||||
'https://github.com/modrinth/code/blob/main/apps/frontend/src/components/ui/auth/CreateAccount.vue'
|
||||
|
||||
const dateOfBirthModel = defineModel<string | null>('dateOfBirth', { default: '' })
|
||||
const usernameModel = defineModel<string>('username', { default: '' })
|
||||
const tokenModel = defineModel<string>('token', { default: '' })
|
||||
const subscribeModel = defineModel<boolean>('subscribe', { default: false })
|
||||
|
||||
const maxInputDate = computed(() => `${new Date().getFullYear()}-12-31`)
|
||||
|
||||
const defaultDobViewDate = computed(() => `${new Date().getFullYear()}-01-01`)
|
||||
|
||||
const maxBirthDate = computed(() => {
|
||||
const date = new Date()
|
||||
date.setFullYear(date.getFullYear() - 13)
|
||||
|
||||
const year = date.getFullYear()
|
||||
const month = String(date.getMonth() + 1).padStart(2, '0')
|
||||
const day = String(date.getDate()).padStart(2, '0')
|
||||
|
||||
return `${year}-${month}-${day}`
|
||||
})
|
||||
|
||||
const getBirthYear = (dateOfBirth: string | null): number | null => {
|
||||
if (!dateOfBirth) {
|
||||
return null
|
||||
}
|
||||
|
||||
const [yearPart = ''] = dateOfBirth.split('-')
|
||||
const year = Number(yearPart)
|
||||
return Number.isInteger(year) ? year : null
|
||||
}
|
||||
|
||||
const isDateOfBirthMissing = computed(() => requiresDob && !dateOfBirthModel.value)
|
||||
|
||||
const isDateOfBirthYearZero = computed(() => {
|
||||
if (!requiresDob || !dateOfBirthModel.value) {
|
||||
return false
|
||||
}
|
||||
|
||||
return getBirthYear(dateOfBirthModel.value) === 0
|
||||
})
|
||||
|
||||
const isUnder13 = computed(
|
||||
() => requiresDob && !!dateOfBirthModel.value && dateOfBirthModel.value > maxBirthDate.value,
|
||||
)
|
||||
|
||||
const { addNotification } = injectNotificationManager()
|
||||
const { formatMessage } = useVIntl()
|
||||
|
||||
function onCompleteSignUpClick() {
|
||||
if (isDateOfBirthMissing.value) {
|
||||
addNotification({
|
||||
title: formatMessage(messages.dateOfBirthRequiredTitle),
|
||||
text: formatMessage(messages.dateOfBirthRequiredText),
|
||||
type: 'warning',
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if (isDateOfBirthYearZero.value) {
|
||||
addNotification({
|
||||
title: formatMessage(messages.dateOfBirthInvalidTitle),
|
||||
text: formatMessage(messages.dateOfBirthInvalidText),
|
||||
type: 'error',
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if (isUnder13.value) {
|
||||
addNotification({
|
||||
title: formatMessage(messages.ageRequirementWarningTitle),
|
||||
text: formatMessage(messages.under13HelperText),
|
||||
type: 'error',
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
onCompleteSignUp()
|
||||
}
|
||||
|
||||
const messages = defineMessages({
|
||||
title: {
|
||||
id: 'auth.create-account.title',
|
||||
defaultMessage: 'Create an Account',
|
||||
},
|
||||
dateOfBirthLabel: {
|
||||
id: 'auth.create-account.date-of-birth.label',
|
||||
defaultMessage: 'Date of birth',
|
||||
},
|
||||
dateOfBirthPlaceholder: {
|
||||
id: 'auth.create-account.date-of-birth.placeholder',
|
||||
defaultMessage: 'Select your date of birth',
|
||||
},
|
||||
dateOfBirthRequiredTitle: {
|
||||
id: 'auth.create-account.date-of-birth.required.title',
|
||||
defaultMessage: 'Date of birth required',
|
||||
},
|
||||
dateOfBirthRequiredText: {
|
||||
id: 'auth.create-account.date-of-birth.required.text',
|
||||
defaultMessage: 'Please enter your date of birth before continuing.',
|
||||
},
|
||||
dateOfBirthInvalidTitle: {
|
||||
id: 'auth.create-account.date-of-birth.invalid.title',
|
||||
defaultMessage: 'Invalid date of birth',
|
||||
},
|
||||
dateOfBirthInvalidText: {
|
||||
id: 'auth.create-account.date-of-birth.invalid.text',
|
||||
defaultMessage: 'Please enter a valid date of birth. Year cannot be 0000.',
|
||||
},
|
||||
over13HelperText: {
|
||||
id: 'auth.create-account.date-of-birth.over13-helper',
|
||||
defaultMessage: 'You must be over 13 years old to use Modrinth.',
|
||||
},
|
||||
under13HelperText: {
|
||||
id: 'auth.create-account.date-of-birth.under13-helper',
|
||||
defaultMessage: 'You cannot create an account at Modrinth unless you are over 13 years old.',
|
||||
},
|
||||
ageRequirementWarningTitle: {
|
||||
id: 'auth.create-account.age-requirement.warning-title',
|
||||
defaultMessage: 'Age requirement',
|
||||
},
|
||||
infoPanelText: {
|
||||
id: 'auth.create-account.info-panel.text',
|
||||
defaultMessage:
|
||||
'We do not store your date of birth, only whether you are over 13 to use Modrinth.',
|
||||
},
|
||||
relevantSourceCodeText: {
|
||||
id: 'auth.create-account.info-panel.source-code-link',
|
||||
defaultMessage: 'Relevant source code',
|
||||
},
|
||||
usernameOptionalLabel: {
|
||||
id: 'auth.create-account.username.optional-label',
|
||||
defaultMessage: 'Username',
|
||||
},
|
||||
usernamePlaceholder: {
|
||||
id: 'auth.create-account.username.placeholder',
|
||||
defaultMessage: 'Enter username',
|
||||
},
|
||||
securityCheckLabel: {
|
||||
id: 'auth.create-account.security-check.label',
|
||||
defaultMessage: 'Security check',
|
||||
},
|
||||
subscribeLabel: {
|
||||
id: 'auth.create-account.subscribe.label',
|
||||
defaultMessage: 'Keep me updated on the cool things Modrinth is working on via email',
|
||||
},
|
||||
completeSignUpButton: {
|
||||
id: 'auth.create-account.complete-sign-up',
|
||||
defaultMessage: 'Complete sign up',
|
||||
},
|
||||
})
|
||||
</script>
|
||||
@@ -1,383 +0,0 @@
|
||||
<template>
|
||||
<div v-if="subtleLauncherRedirectUri">
|
||||
<iframe
|
||||
:src="subtleLauncherRedirectUri"
|
||||
class="fixed left-0 top-0 z-[9999] m-0 h-full w-full border-0 p-0"
|
||||
></iframe>
|
||||
</div>
|
||||
<div
|
||||
v-else
|
||||
class="universal-card mx-auto flex w-full max-w-[28rem] flex-col gap-6 border border-solid border-surface-5"
|
||||
>
|
||||
<template v-if="flow && !subtleLauncherRedirectUri">
|
||||
<div class="flex flex-col items-end gap-4">
|
||||
<div class="flex flex-col gap-1.5">
|
||||
<label for="two-factor-code">
|
||||
<span class="label__title">{{ formatMessage(messages.twoFactorCodeLabel) }}</span>
|
||||
<span class="label__description">
|
||||
{{ formatMessage(messages.twoFactorCodeLabelDescription) }}
|
||||
</span>
|
||||
</label>
|
||||
<StyledInput
|
||||
id="two-factor-code"
|
||||
v-model="twoFactorCodeModel"
|
||||
:maxlength="11"
|
||||
inputmode="numeric"
|
||||
:placeholder="formatMessage(messages.twoFactorCodeInputPlaceholder)"
|
||||
autocomplete="one-time-code"
|
||||
@keyup.enter="onTwoFactorSignIn()"
|
||||
/>
|
||||
</div>
|
||||
<ButtonStyled color="brand">
|
||||
<button @click="onTwoFactorSignIn()">
|
||||
{{ formatMessage(commonMessages.signInButton) }} <RightArrowIcon />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div class="flex flex-col gap-6">
|
||||
<div class="text-center text-2xl font-semibold text-contrast">
|
||||
{{ formatMessage(messages.signInWithLabel) }}
|
||||
</div>
|
||||
|
||||
<section class="flex flex-col gap-2.5">
|
||||
<ButtonStyled>
|
||||
<a
|
||||
class="oauth-provider-link !shadow-none"
|
||||
:class="{ 'oauth-provider-link--last': lastSignInProvider === 'google' }"
|
||||
:href="getAuthUrl('google', redirectTarget)"
|
||||
@click="onOAuthProviderClick('google')"
|
||||
>
|
||||
<GoogleColorIcon />
|
||||
<span class="ml-1">{{
|
||||
formatMessage(messages.continueWithProvider, { provider: 'Google' })
|
||||
}}</span>
|
||||
<span
|
||||
v-if="lastSignInProvider === 'google'"
|
||||
class="oauth-provider-last-sign-in-badge"
|
||||
>
|
||||
{{ formatMessage(messages.lastSignInLabel) }}
|
||||
</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a
|
||||
class="oauth-provider-link !shadow-none"
|
||||
:class="{ 'oauth-provider-link--last': lastSignInProvider === 'microsoft' }"
|
||||
:href="getAuthUrl('microsoft', redirectTarget)"
|
||||
@click="onOAuthProviderClick('microsoft')"
|
||||
>
|
||||
<MicrosoftColorIcon />
|
||||
<span class="ml-1">{{
|
||||
formatMessage(messages.continueWithProvider, { provider: 'Microsoft' })
|
||||
}}</span>
|
||||
<span
|
||||
v-if="lastSignInProvider === 'microsoft'"
|
||||
class="oauth-provider-last-sign-in-badge"
|
||||
>
|
||||
{{ formatMessage(messages.lastSignInLabel) }}
|
||||
</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a
|
||||
class="oauth-provider-link !shadow-none"
|
||||
:class="{ 'oauth-provider-link--last': lastSignInProvider === 'discord' }"
|
||||
:href="getAuthUrl('discord', redirectTarget)"
|
||||
@click="onOAuthProviderClick('discord')"
|
||||
>
|
||||
<DiscordColorIcon />
|
||||
<span class="ml-1">{{
|
||||
formatMessage(messages.continueWithProvider, { provider: 'Discord' })
|
||||
}}</span>
|
||||
<span
|
||||
v-if="lastSignInProvider === 'discord'"
|
||||
class="oauth-provider-last-sign-in-badge"
|
||||
>
|
||||
{{ formatMessage(messages.lastSignInLabel) }}
|
||||
</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a
|
||||
class="oauth-provider-link !shadow-none"
|
||||
:class="{ 'oauth-provider-link--last': lastSignInProvider === 'github' }"
|
||||
:href="getAuthUrl('github', redirectTarget)"
|
||||
@click="onOAuthProviderClick('github')"
|
||||
>
|
||||
<GitHubColorIcon />
|
||||
<span class="ml-1">{{
|
||||
formatMessage(messages.continueWithProvider, { provider: 'GitHub' })
|
||||
}}</span>
|
||||
<span
|
||||
v-if="lastSignInProvider === 'github'"
|
||||
class="oauth-provider-last-sign-in-badge"
|
||||
>
|
||||
{{ formatMessage(messages.lastSignInLabel) }}
|
||||
</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a
|
||||
class="oauth-provider-link !shadow-none"
|
||||
:class="{ 'oauth-provider-link--last': lastSignInProvider === 'gitlab' }"
|
||||
:href="getAuthUrl('gitlab', redirectTarget)"
|
||||
@click="onOAuthProviderClick('gitlab')"
|
||||
>
|
||||
<GitLabColorIcon />
|
||||
<span class="ml-1">{{
|
||||
formatMessage(messages.continueWithProvider, { provider: 'GitLab' })
|
||||
}}</span>
|
||||
<span
|
||||
v-if="lastSignInProvider === 'gitlab'"
|
||||
class="oauth-provider-last-sign-in-badge"
|
||||
>
|
||||
{{ formatMessage(messages.lastSignInLabel) }}
|
||||
</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a
|
||||
class="oauth-provider-link !shadow-none"
|
||||
:class="{ 'oauth-provider-link--last': lastSignInProvider === 'steam' }"
|
||||
:href="getAuthUrl('steam', redirectTarget)"
|
||||
@click="onOAuthProviderClick('steam')"
|
||||
>
|
||||
<SteamColorIcon />
|
||||
<span class="ml-1">{{
|
||||
formatMessage(messages.continueWithProvider, { provider: 'Steam' })
|
||||
}}</span>
|
||||
<span v-if="lastSignInProvider === 'steam'" class="oauth-provider-last-sign-in-badge">
|
||||
{{ formatMessage(messages.lastSignInLabel) }}
|
||||
</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
</section>
|
||||
|
||||
<div class="h-px w-full bg-surface-5"></div>
|
||||
|
||||
<section class="flex flex-col gap-2.5">
|
||||
<label for="email" hidden>{{ formatMessage(commonMessages.emailUsernameLabel) }}</label>
|
||||
<StyledInput
|
||||
id="email"
|
||||
v-model="emailModel"
|
||||
:icon="MailIcon"
|
||||
type="text"
|
||||
inputmode="email"
|
||||
autocomplete="username"
|
||||
:placeholder="formatMessage(commonMessages.emailUsernameLabel)"
|
||||
wrapper-class="w-full"
|
||||
/>
|
||||
|
||||
<label for="password" hidden>{{ formatMessage(commonMessages.passwordLabel) }}</label>
|
||||
<StyledInput
|
||||
id="password"
|
||||
v-model="passwordModel"
|
||||
:icon="KeyIcon"
|
||||
type="password"
|
||||
autocomplete="current-password"
|
||||
:placeholder="formatMessage(commonMessages.passwordLabel)"
|
||||
wrapper-class="w-full"
|
||||
/>
|
||||
|
||||
<HCaptcha
|
||||
v-if="globals?.captcha_enabled && emailModel && passwordModel"
|
||||
:ref="onSetCaptchaRef"
|
||||
v-model="tokenModel"
|
||||
/>
|
||||
|
||||
<ButtonStyled color="brand">
|
||||
<button
|
||||
class="!w-full"
|
||||
:disabled="globals?.captcha_enabled ? !tokenModel : false"
|
||||
@click="onPasswordSignIn()"
|
||||
>
|
||||
{{ formatMessage(messages.continueWithEmail) }} <RightArrowIcon />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
|
||||
<div class="flex flex-wrap items-center justify-center gap-2.5 !text-base">
|
||||
<NuxtLink
|
||||
class="text-link"
|
||||
:to="{
|
||||
path: '/auth/reset-password',
|
||||
query: routeQuery,
|
||||
}"
|
||||
>
|
||||
{{ formatMessage(messages.forgotPasswordLabel) }}
|
||||
</NuxtLink>
|
||||
<div class="h-1.5 w-1.5 rounded-full bg-surface-5" />
|
||||
<NuxtLink
|
||||
class="inline text-link"
|
||||
:to="{
|
||||
path: '/auth/sign-up',
|
||||
query: routeQuery,
|
||||
}"
|
||||
>
|
||||
{{ formatMessage(messages.createAccountLabel) }}
|
||||
</NuxtLink>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
DiscordColorIcon,
|
||||
GitHubColorIcon,
|
||||
GitLabColorIcon,
|
||||
GoogleColorIcon,
|
||||
KeyIcon,
|
||||
MailIcon,
|
||||
MicrosoftColorIcon,
|
||||
RightArrowIcon,
|
||||
SteamColorIcon,
|
||||
} from '@modrinth/assets'
|
||||
import { ButtonStyled, commonMessages, defineMessages, StyledInput, useVIntl } from '@modrinth/ui'
|
||||
import { useStorage } from '@vueuse/core'
|
||||
import { computed } from 'vue'
|
||||
import type { LocationQuery } from 'vue-router'
|
||||
|
||||
import HCaptcha from '@/components/ui/auth/HCaptcha.vue'
|
||||
import {
|
||||
getAuthUrl,
|
||||
LAST_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY,
|
||||
PENDING_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY,
|
||||
} from '@/composables/auth.ts'
|
||||
|
||||
type AuthProvider = 'discord' | 'google' | 'github' | 'gitlab' | 'steam' | 'microsoft'
|
||||
|
||||
interface AuthGlobals {
|
||||
captcha_enabled?: boolean
|
||||
[key: string]: unknown
|
||||
}
|
||||
|
||||
interface Props {
|
||||
subtleLauncherRedirectUri?: string
|
||||
flow?: string
|
||||
redirectTarget?: string
|
||||
routeQuery?: LocationQuery
|
||||
globals?: AuthGlobals | null
|
||||
onPasswordSignIn?: () => void
|
||||
onTwoFactorSignIn?: () => void
|
||||
onSetCaptchaRef?: ((captchaRef: unknown) => void) | undefined
|
||||
}
|
||||
|
||||
const {
|
||||
subtleLauncherRedirectUri = '',
|
||||
flow = '',
|
||||
redirectTarget = '',
|
||||
routeQuery = {},
|
||||
globals = null,
|
||||
onPasswordSignIn = () => {},
|
||||
onTwoFactorSignIn = () => {},
|
||||
onSetCaptchaRef = undefined,
|
||||
} = defineProps<Props>()
|
||||
|
||||
const emailModel = defineModel<string>('email', { default: '' })
|
||||
const passwordModel = defineModel<string>('password', { default: '' })
|
||||
const tokenModel = defineModel<string>('token', { default: '' })
|
||||
const twoFactorCodeModel = defineModel<string>('twoFactorCode', { default: '' })
|
||||
|
||||
const lastSignInOAuthProvider = useStorage<AuthProvider | null>(
|
||||
LAST_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY,
|
||||
null,
|
||||
undefined,
|
||||
{ initOnMounted: true },
|
||||
)
|
||||
const pendingSignInOAuthProvider = useStorage<AuthProvider | null>(
|
||||
PENDING_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY,
|
||||
null,
|
||||
undefined,
|
||||
{ initOnMounted: true },
|
||||
)
|
||||
const lastSignInProvider = computed(() => lastSignInOAuthProvider.value)
|
||||
const onOAuthProviderClick = (provider: AuthProvider) => {
|
||||
pendingSignInOAuthProvider.value = provider
|
||||
}
|
||||
|
||||
const { formatMessage } = useVIntl()
|
||||
|
||||
const messages = defineMessages({
|
||||
forgotPasswordLabel: {
|
||||
id: 'auth.sign-in.forgot-password',
|
||||
defaultMessage: 'Forgot password',
|
||||
},
|
||||
noAccountLabel: {
|
||||
id: 'auth.sign-in.no-account',
|
||||
defaultMessage: "Don't have an account?",
|
||||
},
|
||||
createAccountLabel: {
|
||||
id: 'auth.sign-in.create-account',
|
||||
defaultMessage: 'Sign up',
|
||||
},
|
||||
signInWithLabel: {
|
||||
id: 'auth.sign-in.sign-in-with',
|
||||
defaultMessage: 'Sign into Modrinth',
|
||||
},
|
||||
twoFactorCodeInputPlaceholder: {
|
||||
id: 'auth.sign-in.2fa.placeholder',
|
||||
defaultMessage: 'Enter code...',
|
||||
},
|
||||
twoFactorCodeLabel: {
|
||||
id: 'auth.sign-in.2fa.label',
|
||||
defaultMessage: 'Two-factor authentication',
|
||||
},
|
||||
twoFactorCodeLabelDescription: {
|
||||
id: 'auth.sign-in.2fa.description',
|
||||
defaultMessage:
|
||||
'Enter the 6-digit code from your authenticator app, or one of your backup codes.',
|
||||
},
|
||||
continueWithProvider: {
|
||||
id: 'auth.continue-with-provider',
|
||||
defaultMessage: 'Continue with {provider}',
|
||||
},
|
||||
continueWithEmail: {
|
||||
id: 'auth.sign-in.continue-with-email',
|
||||
defaultMessage: 'Continue with Email',
|
||||
},
|
||||
lastSignInLabel: {
|
||||
id: 'auth.sign-in.last-sign-in',
|
||||
defaultMessage: 'Last sign in',
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.oauth-provider-link {
|
||||
position: relative;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.oauth-provider-link--last {
|
||||
border-width: 1px !important;
|
||||
border-color: var(--color-green) !important;
|
||||
}
|
||||
|
||||
.oauth-provider-last-sign-in-badge {
|
||||
position: absolute;
|
||||
top: -0.75rem;
|
||||
right: 0.5rem;
|
||||
z-index: 1;
|
||||
border-radius: 9999px;
|
||||
background-color: var(--surface-3);
|
||||
color: var(--color-green);
|
||||
border: 1px solid var(--color-green);
|
||||
padding: 0.25rem 0.5rem;
|
||||
font-size: 0.75rem;
|
||||
font-weight: 600;
|
||||
line-height: 1;
|
||||
pointer-events: none;
|
||||
}
|
||||
.oauth-provider-last-sign-in-badge::before {
|
||||
content: '';
|
||||
inset: 0;
|
||||
border-radius: inherit;
|
||||
background-color: var(--color-green-highlight);
|
||||
position: absolute;
|
||||
z-index: 0;
|
||||
}
|
||||
</style>
|
||||
@@ -1,236 +0,0 @@
|
||||
<template>
|
||||
<div
|
||||
class="universal-card flex w-full max-w-[28rem] flex-col gap-6 border border-solid border-surface-5"
|
||||
>
|
||||
<div class="mx-auto text-center text-2xl font-semibold text-contrast">
|
||||
{{ formatMessage(messages.signUpWithTitle) }}
|
||||
</div>
|
||||
<section class="flex flex-col gap-2.5">
|
||||
<ButtonStyled>
|
||||
<a
|
||||
class="!shadow-none"
|
||||
:href="getAuthUrl('google', redirectTarget)"
|
||||
@click="onOAuthProviderClick('google')"
|
||||
>
|
||||
<GoogleColorIcon />
|
||||
<span>{{ formatMessage(messages.continueWithProvider, { provider: 'Google' }) }}</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a
|
||||
class="!shadow-none"
|
||||
:href="getAuthUrl('microsoft', redirectTarget)"
|
||||
@click="onOAuthProviderClick('microsoft')"
|
||||
>
|
||||
<MicrosoftColorIcon />
|
||||
<span>{{ formatMessage(messages.continueWithProvider, { provider: 'Microsoft' }) }}</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a
|
||||
class="!shadow-none"
|
||||
:href="getAuthUrl('discord', redirectTarget)"
|
||||
@click="onOAuthProviderClick('discord')"
|
||||
>
|
||||
<DiscordColorIcon />
|
||||
<span>{{ formatMessage(messages.continueWithProvider, { provider: 'Discord' }) }}</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<template v-if="showOtherOptions">
|
||||
<ButtonStyled>
|
||||
<a
|
||||
class="!shadow-none"
|
||||
:href="getAuthUrl('github', redirectTarget)"
|
||||
@click="onOAuthProviderClick('github')"
|
||||
>
|
||||
<GitHubColorIcon />
|
||||
<span>{{ formatMessage(messages.continueWithProvider, { provider: 'GitHub' }) }}</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a
|
||||
class="!shadow-none"
|
||||
:href="getAuthUrl('gitlab', redirectTarget)"
|
||||
@click="onOAuthProviderClick('gitlab')"
|
||||
>
|
||||
<GitLabColorIcon />
|
||||
<span>{{ formatMessage(messages.continueWithProvider, { provider: 'GitLab' }) }}</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a
|
||||
class="!shadow-none"
|
||||
:href="getAuthUrl('steam', redirectTarget)"
|
||||
@click="onOAuthProviderClick('steam')"
|
||||
>
|
||||
<SteamColorIcon />
|
||||
<span>{{ formatMessage(messages.continueWithProvider, { provider: 'Steam' }) }}</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
</template>
|
||||
<button
|
||||
class="mx-auto -mb-3 bg-transparent pt-1 text-center text-base font-semibold text-secondary transition-all hover:text-primary"
|
||||
@click="onToggleOtherOptions()"
|
||||
>
|
||||
{{
|
||||
showOtherOptions
|
||||
? formatMessage(messages.showFewerOptions)
|
||||
: formatMessage(messages.showOtherOptions)
|
||||
}}
|
||||
</button>
|
||||
</section>
|
||||
|
||||
<div class="h-px w-full bg-surface-5"></div>
|
||||
|
||||
<section class="flex flex-col gap-2.5">
|
||||
<label for="email" hidden>{{ formatMessage(commonMessages.emailLabel) }}</label>
|
||||
<StyledInput
|
||||
id="email"
|
||||
v-model="emailModel"
|
||||
:icon="MailIcon"
|
||||
type="email"
|
||||
autocomplete="email"
|
||||
:placeholder="formatMessage(commonMessages.emailLabel)"
|
||||
wrapper-class="w-full"
|
||||
/>
|
||||
|
||||
<label for="password" hidden>{{ formatMessage(commonMessages.passwordLabel) }}</label>
|
||||
<StyledInput
|
||||
id="password"
|
||||
v-model="passwordModel"
|
||||
:icon="KeyIcon"
|
||||
type="password"
|
||||
autocomplete="new-password"
|
||||
:placeholder="formatMessage(commonMessages.passwordLabel)"
|
||||
wrapper-class="w-full"
|
||||
/>
|
||||
|
||||
<ButtonStyled color="brand">
|
||||
<button
|
||||
class="!w-full"
|
||||
:disabled="!emailModel || !passwordModel"
|
||||
@click="onContinueWithEmail()"
|
||||
>
|
||||
{{ formatMessage(messages.continueWithEmail) }} <RightArrowIcon />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
|
||||
<p v-if="!routeQuery.launcher" class="m-0 text-center">
|
||||
<IntlFormatted :message-id="messages.legalDisclaimer">
|
||||
<template #terms-link="{ children }">
|
||||
<NuxtLink to="/legal/terms" class="text-link">
|
||||
<component :is="() => children" />
|
||||
</NuxtLink>
|
||||
</template>
|
||||
<template #privacy-policy-link="{ children }">
|
||||
<NuxtLink to="/legal/privacy" class="text-link">
|
||||
<component :is="() => children" />
|
||||
</NuxtLink>
|
||||
</template>
|
||||
</IntlFormatted>
|
||||
</p>
|
||||
|
||||
<div class="mx-auto flex flex-wrap items-center justify-start gap-2 text-center">
|
||||
{{ formatMessage(messages.alreadyHaveAccountLabel) }}
|
||||
<NuxtLink
|
||||
class="mr-1 text-link"
|
||||
:to="{
|
||||
path: '/auth/sign-in',
|
||||
query: routeQuery,
|
||||
}"
|
||||
>
|
||||
{{ formatMessage(commonMessages.signInButton) }}
|
||||
</NuxtLink>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
DiscordColorIcon,
|
||||
GitHubColorIcon,
|
||||
GitLabColorIcon,
|
||||
GoogleColorIcon,
|
||||
KeyIcon,
|
||||
MailIcon,
|
||||
MicrosoftColorIcon,
|
||||
RightArrowIcon,
|
||||
SteamColorIcon,
|
||||
} from '@modrinth/assets'
|
||||
import {
|
||||
ButtonStyled,
|
||||
commonMessages,
|
||||
defineMessages,
|
||||
IntlFormatted,
|
||||
StyledInput,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { useStorage } from '@vueuse/core'
|
||||
import type { LocationQuery } from 'vue-router'
|
||||
|
||||
import { getAuthUrl, PENDING_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY } from '@/composables/auth.ts'
|
||||
|
||||
type AuthProvider = 'discord' | 'google' | 'github' | 'gitlab' | 'steam' | 'microsoft'
|
||||
|
||||
interface Props {
|
||||
redirectTarget?: string
|
||||
showOtherOptions?: boolean
|
||||
routeQuery?: LocationQuery
|
||||
onToggleOtherOptions?: () => void
|
||||
onContinueWithEmail?: () => void
|
||||
}
|
||||
|
||||
const {
|
||||
redirectTarget = '',
|
||||
showOtherOptions = false,
|
||||
routeQuery = {},
|
||||
onToggleOtherOptions = () => {},
|
||||
onContinueWithEmail = () => {},
|
||||
} = defineProps<Props>()
|
||||
|
||||
const emailModel = defineModel<string>('email', { default: '' })
|
||||
const passwordModel = defineModel<string>('password', { default: '' })
|
||||
|
||||
const pendingSignInOAuthProvider = useStorage<AuthProvider | null>(
|
||||
PENDING_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY,
|
||||
null,
|
||||
)
|
||||
const onOAuthProviderClick = (provider: AuthProvider) => {
|
||||
pendingSignInOAuthProvider.value = provider
|
||||
}
|
||||
|
||||
const { formatMessage } = useVIntl()
|
||||
|
||||
const messages = defineMessages({
|
||||
signUpWithTitle: {
|
||||
id: 'auth.sign-up.title.sign-up-with',
|
||||
defaultMessage: 'Create an Account',
|
||||
},
|
||||
continueWithProvider: {
|
||||
id: 'auth.continue-with-provider',
|
||||
defaultMessage: 'Continue with {provider}',
|
||||
},
|
||||
legalDisclaimer: {
|
||||
id: 'auth.sign-up.legal-dislaimer',
|
||||
defaultMessage:
|
||||
"By creating an account, you agree to Modrinth's <terms-link>Terms</terms-link> and <privacy-policy-link>Privacy Policy</privacy-policy-link>.",
|
||||
},
|
||||
alreadyHaveAccountLabel: {
|
||||
id: 'auth.sign-up.sign-in-option.title',
|
||||
defaultMessage: 'Already have an account?',
|
||||
},
|
||||
continueWithEmail: {
|
||||
id: 'auth.sign-up.continue-with-email',
|
||||
defaultMessage: 'Continue with Email',
|
||||
},
|
||||
showFewerOptions: {
|
||||
id: 'auth.sign-up.show-fewer-options',
|
||||
defaultMessage: 'Show fewer options',
|
||||
},
|
||||
showOtherOptions: {
|
||||
id: 'auth.sign-up.show-other-options',
|
||||
defaultMessage: 'Show other options',
|
||||
},
|
||||
})
|
||||
</script>
|
||||
@@ -166,7 +166,9 @@ defineExpose({
|
||||
show,
|
||||
})
|
||||
|
||||
const auth = await useAuth()
|
||||
const auth = (await useAuth()) as Ref<{
|
||||
user: { id: string; username: string; avatar_url: string } | null
|
||||
}>
|
||||
|
||||
const messages = defineMessages({
|
||||
title: {
|
||||
|
||||
+2
-1
@@ -120,7 +120,7 @@ import { computed, onMounted, ref, watch } from 'vue'
|
||||
|
||||
import RevenueInputField from '@/components/ui/dashboard/RevenueInputField.vue'
|
||||
import WithdrawFeeBreakdown from '@/components/ui/dashboard/WithdrawFeeBreakdown.vue'
|
||||
import { getAuthUrl, removeAuthProvider, useAuth } from '@/composables/auth.ts'
|
||||
import { getAuthUrl, removeAuthProvider, useAuth } from '@/composables/auth.js'
|
||||
import { useWithdrawContext } from '@/providers/creator-withdraw.ts'
|
||||
|
||||
const { withdrawData, maxWithdrawAmount, availableMethods, calculateFees, saveStateToStorage } =
|
||||
@@ -193,6 +193,7 @@ async function saveVenmoHandle() {
|
||||
},
|
||||
})
|
||||
|
||||
// @ts-expect-error auth.js is not typed
|
||||
await useAuth(auth.value.token)
|
||||
|
||||
initialVenmoHandle.value = venmoHandle.value.trim()
|
||||
|
||||
+1
-1
@@ -358,8 +358,8 @@ import { computed, onMounted, ref, watch } from 'vue'
|
||||
|
||||
import RevenueInputField from '@/components/ui/dashboard/RevenueInputField.vue'
|
||||
import WithdrawFeeBreakdown from '@/components/ui/dashboard/WithdrawFeeBreakdown.vue'
|
||||
import { useAuth } from '@/composables/auth.js'
|
||||
import { useWithdrawContext } from '@/providers/creator-withdraw.ts'
|
||||
import { useAuth } from '~/composables/auth.ts'
|
||||
|
||||
const debug = useDebugLogger('TremendousDetailsStage')
|
||||
const { withdrawData, maxWithdrawAmount, availableMethods, paymentOptions, calculateFees } =
|
||||
|
||||
@@ -190,6 +190,7 @@ import {
|
||||
LinkIcon,
|
||||
} from '@modrinth/assets'
|
||||
import { type ExtendedReport, reportQuickReplies } from '@modrinth/moderation'
|
||||
import { type OverflowMenuOption, useFormatDateTime } from '@modrinth/ui'
|
||||
import {
|
||||
Avatar,
|
||||
ButtonStyled,
|
||||
@@ -197,8 +198,6 @@ import {
|
||||
getProjectTypeIcon,
|
||||
injectNotificationManager,
|
||||
OverflowMenu,
|
||||
type OverflowMenuOption,
|
||||
useFormatDateTime,
|
||||
useRelativeTime,
|
||||
} from '@modrinth/ui'
|
||||
import { formatProjectType } from '@modrinth/utils'
|
||||
|
||||
@@ -26,12 +26,12 @@ import {
|
||||
getProjectTypeIcon,
|
||||
injectModrinthClient,
|
||||
injectNotificationManager,
|
||||
NavTabs,
|
||||
OverflowMenu,
|
||||
type OverflowMenuOption,
|
||||
useFormatBytes,
|
||||
useFormatDateTime,
|
||||
} from '@modrinth/ui'
|
||||
import { NavTabs } from '@modrinth/ui'
|
||||
import {
|
||||
capitalizeString,
|
||||
formatProjectType,
|
||||
|
||||
+1
-1
@@ -87,7 +87,7 @@ const currentProjectId = computed(() => projectV3.value?.id)
|
||||
const { selectedProjectId, selectedVersionId } = injectServerCompatibilityContext()
|
||||
const { labrinth } = injectModrinthClient()
|
||||
const { addNotification } = injectNotificationManager()
|
||||
const auth = await useAuth()
|
||||
const auth = (await useAuth()) as { user?: { id: string } }
|
||||
|
||||
interface VersionInfo {
|
||||
id: string
|
||||
|
||||
@@ -0,0 +1,179 @@
|
||||
function normalizeAuthToken(value) {
|
||||
if (typeof value === 'string') {
|
||||
return value
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
export const useAuth = async (oldToken = null) => {
|
||||
const auth = useState('auth', () => ({
|
||||
user: null,
|
||||
token: '',
|
||||
headers: {},
|
||||
}))
|
||||
|
||||
if (!auth.value.user || oldToken) {
|
||||
auth.value = await initAuth(oldToken)
|
||||
}
|
||||
|
||||
return auth
|
||||
}
|
||||
|
||||
export const initAuth = async (oldToken = null) => {
|
||||
const auth = {
|
||||
user: null,
|
||||
token: '',
|
||||
}
|
||||
|
||||
if (oldToken === 'none') {
|
||||
return auth
|
||||
}
|
||||
|
||||
const route = useRoute()
|
||||
const config = useRuntimeConfig()
|
||||
const authCookie = useCookie('auth-token', {
|
||||
maxAge: 60 * 60 * 24 * 365 * 10,
|
||||
sameSite: 'lax',
|
||||
secure: config.public.cookieSecure,
|
||||
httpOnly: false,
|
||||
path: '/',
|
||||
})
|
||||
|
||||
if (oldToken) {
|
||||
const normalized = normalizeAuthToken(oldToken)
|
||||
if (normalized) {
|
||||
authCookie.value = normalized
|
||||
}
|
||||
}
|
||||
|
||||
const oauthCode = normalizeAuthToken(route.query.code)
|
||||
if (oauthCode && !route.fullPath.includes('new_account=true')) {
|
||||
authCookie.value = oauthCode
|
||||
}
|
||||
|
||||
if (route.fullPath.includes('new_account=true') && route.path !== '/auth/welcome') {
|
||||
const redirect = route.path.startsWith('/auth/') ? null : route.fullPath
|
||||
|
||||
await navigateTo(
|
||||
`/auth/welcome?authToken=${oauthCode}${
|
||||
redirect ? `&redirect=${encodeURIComponent(redirect)}` : ''
|
||||
}`,
|
||||
)
|
||||
}
|
||||
|
||||
const tokenStr = normalizeAuthToken(authCookie.value)
|
||||
|
||||
if (authCookie.value != null && tokenStr === '') {
|
||||
authCookie.value = null
|
||||
} else if (tokenStr) {
|
||||
auth.token = tokenStr
|
||||
|
||||
if (!auth.token.startsWith('mra_')) {
|
||||
return auth
|
||||
}
|
||||
|
||||
try {
|
||||
auth.user = await useBaseFetch(
|
||||
'user',
|
||||
{
|
||||
apiVersion: 3,
|
||||
headers: {
|
||||
Authorization: auth.token,
|
||||
},
|
||||
},
|
||||
true,
|
||||
)
|
||||
} catch {
|
||||
/* empty */
|
||||
}
|
||||
}
|
||||
|
||||
if (!auth.user && auth.token && typeof auth.token === 'string') {
|
||||
try {
|
||||
const session = await useBaseFetch(
|
||||
'session/refresh',
|
||||
{
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Authorization: auth.token,
|
||||
},
|
||||
},
|
||||
true,
|
||||
)
|
||||
|
||||
auth.token = normalizeAuthToken(session.session)
|
||||
if (auth.token) {
|
||||
authCookie.value = auth.token
|
||||
auth.user = await useBaseFetch(
|
||||
'user',
|
||||
{
|
||||
apiVersion: 3,
|
||||
headers: {
|
||||
Authorization: auth.token,
|
||||
},
|
||||
},
|
||||
true,
|
||||
)
|
||||
} else {
|
||||
authCookie.value = null
|
||||
auth.token = ''
|
||||
}
|
||||
} catch {
|
||||
authCookie.value = null
|
||||
}
|
||||
}
|
||||
|
||||
return auth
|
||||
}
|
||||
|
||||
export const getSignInRedirectPath = (route) => {
|
||||
const fullPath = route.fullPath
|
||||
if (fullPath === '/auth' || fullPath.startsWith('/auth/')) {
|
||||
return '/dashboard'
|
||||
}
|
||||
return fullPath
|
||||
}
|
||||
|
||||
export const getSignInRouteObj = (route, redirectOverride) => ({
|
||||
path: '/auth/sign-in',
|
||||
query: {
|
||||
redirect: redirectOverride ?? getSignInRedirectPath(route),
|
||||
},
|
||||
})
|
||||
|
||||
export const getAuthUrl = (provider, redirect = '/dashboard') => {
|
||||
const config = useRuntimeConfig()
|
||||
const route = useNativeRoute()
|
||||
|
||||
const fullURL = route.query.launcher
|
||||
? getLauncherRedirectUrl(route)
|
||||
: `${config.public.siteUrl}/auth/sign-in?redirect=${encodeURIComponent(redirect)}`
|
||||
|
||||
return `${config.public.apiBaseUrl}auth/init?provider=${provider}&url=${encodeURIComponent(fullURL)}`
|
||||
}
|
||||
|
||||
export const removeAuthProvider = async (provider) => {
|
||||
startLoading()
|
||||
|
||||
const auth = await useAuth()
|
||||
|
||||
await useBaseFetch('auth/provider', {
|
||||
method: 'DELETE',
|
||||
body: {
|
||||
provider,
|
||||
},
|
||||
})
|
||||
|
||||
await useAuth(auth.value.token)
|
||||
|
||||
stopLoading()
|
||||
}
|
||||
|
||||
export const getLauncherRedirectUrl = (route) => {
|
||||
const usesLocalhostRedirectionScheme =
|
||||
['4', '6'].includes(route.query.ipver) && Number(route.query.port) < 65536
|
||||
|
||||
return usesLocalhostRedirectionScheme
|
||||
? `http://${route.query.ipver === '4' ? '127.0.0.1' : '[::1]'}:${route.query.port}`
|
||||
: `https://launcher-files.modrinth.com`
|
||||
}
|
||||
@@ -1,241 +0,0 @@
|
||||
import type { Labrinth } from '@modrinth/api-client'
|
||||
import { useStorage } from '@vueuse/core'
|
||||
import type { LocationQueryValue, RouteLocationNormalizedLoaded } from 'vue-router'
|
||||
|
||||
import type { CookieOptions } from '#app'
|
||||
|
||||
type AuthState = {
|
||||
user: Labrinth.Users.v2.User | null
|
||||
token: string
|
||||
}
|
||||
|
||||
type QueryValue = LocationQueryValue | LocationQueryValue[] | undefined
|
||||
type FullPathRoute = Pick<RouteLocationNormalizedLoaded, 'fullPath'>
|
||||
type LauncherRoute = Pick<RouteLocationNormalizedLoaded, 'query'>
|
||||
|
||||
export const LAST_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY = 'auth-last-sign-in-oauth-provider'
|
||||
export const PENDING_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY = 'auth-pending-sign-in-oauth-provider'
|
||||
|
||||
const AUTH_COOKIE_OPTIONS = {
|
||||
maxAge: 60 * 60 * 24 * 365 * 10,
|
||||
sameSite: 'lax',
|
||||
httpOnly: false,
|
||||
path: '/',
|
||||
} satisfies CookieOptions<string | null>
|
||||
|
||||
const normalizeAuthToken = (value: unknown) => {
|
||||
if (typeof value === 'string') {
|
||||
return value
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
const getQueryString = (value: QueryValue) => {
|
||||
if (Array.isArray(value)) {
|
||||
return value[0] ?? null
|
||||
}
|
||||
return value ?? null
|
||||
}
|
||||
|
||||
export const useAuth = async (oldToken: string | null | undefined = null) => {
|
||||
const auth = useState<AuthState>('auth', () => ({
|
||||
user: null,
|
||||
token: '',
|
||||
}))
|
||||
|
||||
if (!auth.value.user || oldToken) {
|
||||
auth.value = await initAuth(oldToken)
|
||||
}
|
||||
|
||||
return auth
|
||||
}
|
||||
|
||||
export const initAuth = async (oldToken: string | null | undefined = null) => {
|
||||
const auth: AuthState = {
|
||||
user: null,
|
||||
token: '',
|
||||
}
|
||||
|
||||
if (oldToken === 'none') {
|
||||
return auth
|
||||
}
|
||||
|
||||
const route = useRoute()
|
||||
const config = useRuntimeConfig()
|
||||
const authCookie = useCookie<string | null>('auth-token', {
|
||||
...AUTH_COOKIE_OPTIONS,
|
||||
secure: config.public.cookieSecure,
|
||||
})
|
||||
|
||||
if (oldToken) {
|
||||
const normalized = normalizeAuthToken(oldToken)
|
||||
if (normalized) {
|
||||
authCookie.value = normalized
|
||||
}
|
||||
}
|
||||
|
||||
const oauthCode = normalizeAuthToken(route.query.code)
|
||||
if (oauthCode && !route.fullPath.includes('new_account=true')) {
|
||||
authCookie.value = oauthCode
|
||||
}
|
||||
|
||||
if (route.fullPath.includes('new_account=true') && route.path !== '/auth/welcome') {
|
||||
const redirect = route.path.startsWith('/auth/') ? null : route.fullPath
|
||||
|
||||
await navigateTo(
|
||||
`/auth/welcome?authToken=${oauthCode}${
|
||||
redirect ? `&redirect=${encodeURIComponent(redirect)}` : ''
|
||||
}`,
|
||||
)
|
||||
}
|
||||
|
||||
const tokenStr = normalizeAuthToken(authCookie.value)
|
||||
|
||||
if (authCookie.value != null && tokenStr === '') {
|
||||
authCookie.value = null
|
||||
} else if (tokenStr) {
|
||||
auth.token = tokenStr
|
||||
|
||||
if (!auth.token.startsWith('mra_')) {
|
||||
return auth
|
||||
}
|
||||
|
||||
try {
|
||||
auth.user = (await useBaseFetch(
|
||||
'user',
|
||||
{
|
||||
apiVersion: 3,
|
||||
headers: {
|
||||
Authorization: auth.token,
|
||||
},
|
||||
},
|
||||
true,
|
||||
)) as Labrinth.Users.v2.User
|
||||
} catch {
|
||||
/* empty */
|
||||
}
|
||||
}
|
||||
|
||||
if (!auth.user && auth.token) {
|
||||
try {
|
||||
const session = (await useBaseFetch(
|
||||
'session/refresh',
|
||||
{
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Authorization: auth.token,
|
||||
},
|
||||
},
|
||||
true,
|
||||
)) as { session: unknown }
|
||||
|
||||
auth.token = normalizeAuthToken(session.session)
|
||||
if (auth.token) {
|
||||
authCookie.value = auth.token
|
||||
auth.user = (await useBaseFetch(
|
||||
'user',
|
||||
{
|
||||
apiVersion: 3,
|
||||
headers: {
|
||||
Authorization: auth.token,
|
||||
},
|
||||
},
|
||||
true,
|
||||
)) as Labrinth.Users.v2.User
|
||||
} else {
|
||||
authCookie.value = null
|
||||
auth.token = ''
|
||||
}
|
||||
} catch {
|
||||
authCookie.value = null
|
||||
}
|
||||
}
|
||||
|
||||
return auth
|
||||
}
|
||||
|
||||
export const getSignInRedirectPath = (route: FullPathRoute) => {
|
||||
const fullPath = route.fullPath
|
||||
if (fullPath === '/auth' || fullPath.startsWith('/auth/')) {
|
||||
return '/dashboard'
|
||||
}
|
||||
return fullPath
|
||||
}
|
||||
|
||||
export const getSignInRouteObj = (route: FullPathRoute, redirectOverride?: string | null) => ({
|
||||
path: '/auth/sign-in',
|
||||
query: {
|
||||
redirect: redirectOverride ?? getSignInRedirectPath(route),
|
||||
},
|
||||
})
|
||||
|
||||
export const getAuthUrl = (provider: string, redirect = '/dashboard') => {
|
||||
const config = useRuntimeConfig()
|
||||
const route = useNativeRoute()
|
||||
const launcher = getQueryString(route.query.launcher)
|
||||
|
||||
const fullURL = launcher
|
||||
? (() => {
|
||||
const callbackUrl = new URL('/auth/sign-in', config.public.siteUrl)
|
||||
callbackUrl.searchParams.set('launcher', launcher)
|
||||
|
||||
const ipver = getQueryString(route.query.ipver)
|
||||
const port = getQueryString(route.query.port)
|
||||
|
||||
if (ipver) {
|
||||
callbackUrl.searchParams.set('ipver', ipver)
|
||||
}
|
||||
|
||||
if (port) {
|
||||
callbackUrl.searchParams.set('port', port)
|
||||
}
|
||||
|
||||
return callbackUrl.toString()
|
||||
})()
|
||||
: `${config.public.siteUrl}/auth/sign-in?redirect=${encodeURIComponent(redirect)}`
|
||||
|
||||
return `${config.public.apiBaseUrl}auth/init?provider=${provider}&url=${encodeURIComponent(fullURL)}`
|
||||
}
|
||||
|
||||
export const promotePendingSignInOAuthProvider = () => {
|
||||
if (!import.meta.client) return
|
||||
const pending = useStorage<string | null>(
|
||||
PENDING_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY,
|
||||
null,
|
||||
undefined,
|
||||
{ initOnMounted: true },
|
||||
)
|
||||
if (!pending.value) return
|
||||
const last = useStorage<string | null>(LAST_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY, null, undefined, {
|
||||
initOnMounted: true,
|
||||
})
|
||||
last.value = pending.value
|
||||
pending.value = null
|
||||
}
|
||||
|
||||
export const removeAuthProvider = async (provider: string) => {
|
||||
startLoading()
|
||||
|
||||
const auth = await useAuth()
|
||||
|
||||
await useBaseFetch('auth/provider', {
|
||||
method: 'DELETE',
|
||||
body: {
|
||||
provider,
|
||||
},
|
||||
})
|
||||
|
||||
await useAuth(auth.value.token)
|
||||
|
||||
stopLoading()
|
||||
}
|
||||
|
||||
export const getLauncherRedirectUrl = (route: LauncherRoute) => {
|
||||
const ipver = getQueryString(route.query.ipver)
|
||||
const port = Number(getQueryString(route.query.port))
|
||||
const usesLocalhostRedirectionScheme = ['4', '6'].includes(ipver ?? '') && port < 65536
|
||||
|
||||
return usesLocalhostRedirectionScheme
|
||||
? `http://${ipver === '4' ? '127.0.0.1' : '[::1]'}:${port}`
|
||||
: 'https://launcher-files.modrinth.com'
|
||||
}
|
||||
@@ -799,7 +799,7 @@ import CollectionCreateModal from '~/components/ui/create/CollectionCreateModal.
|
||||
import OrganizationCreateModal from '~/components/ui/create/OrganizationCreateModal.vue'
|
||||
import ProjectCreateModal from '~/components/ui/create/ProjectCreateModal.vue'
|
||||
import ModrinthFooter from '~/components/ui/ModrinthFooter.vue'
|
||||
import { getSignInRouteObj } from '~/composables/auth.ts'
|
||||
import { getSignInRouteObj } from '~/composables/auth.js'
|
||||
import { errors as generatedStateErrors } from '~/generated/state.json'
|
||||
import { getProjectTypeMessage } from '~/utils/i18n-project-type.ts'
|
||||
import { hasActiveMidas } from '~/utils/user-membership.ts'
|
||||
|
||||
@@ -80,6 +80,9 @@
|
||||
"analytics.project-event.project-status-changed": {
|
||||
"message": "تم تغيير حالة المشروع"
|
||||
},
|
||||
"analytics.project-event.version-released": {
|
||||
"message": ""
|
||||
},
|
||||
"analytics.project-status.draft": {
|
||||
"message": "مسودة"
|
||||
},
|
||||
@@ -506,6 +509,9 @@
|
||||
"create-project-version.create-modal.stage.add-files.admonition": {
|
||||
"message": "الملفات التكميلية تستخدم لدعم الموارد مثل كود المصدر، وليس للإصدارات أو الأنواع البديلة."
|
||||
},
|
||||
"create.collection.collection-info": {
|
||||
"message": "سيتم إنشاء مجموعتك الجديدة كمجموعة عامة تحتوي على {count, plural,\n one {# مشروع}\n other {# مشاريع}\n}."
|
||||
},
|
||||
"create.collection.create-collection": {
|
||||
"message": "إنشاء مجموعة"
|
||||
},
|
||||
|
||||
@@ -74,6 +74,84 @@
|
||||
"analytics.chart.controls.button": {
|
||||
"message": "Ovládání"
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>: {title}"
|
||||
},
|
||||
"analytics.chart.tooltip.hide-entry": {
|
||||
"message": "Skrýt {name} v grafu"
|
||||
},
|
||||
"analytics.chart.tooltip.show-entry": {
|
||||
"message": "Zobrazit {name} v grafu"
|
||||
},
|
||||
"analytics.chart.view.area": {
|
||||
"message": "Oblast"
|
||||
},
|
||||
"analytics.download-reason.update": {
|
||||
"message": "Aktualizace"
|
||||
},
|
||||
"analytics.downloads.suffix": {
|
||||
"message": "stažení"
|
||||
},
|
||||
"analytics.empty.no-projects": {
|
||||
"message": "Žádné dostupné projekty"
|
||||
},
|
||||
"analytics.empty.no-projects-for-analytics": {
|
||||
"message": "Žádné dostupné projekty pro analýzu "
|
||||
},
|
||||
"analytics.empty.select-project": {
|
||||
"message": "Vyber alespoň jeden projekt pro zobrazení dat"
|
||||
},
|
||||
"analytics.group-by.1h": {
|
||||
"message": "1h"
|
||||
},
|
||||
"analytics.group-by.6h": {
|
||||
"message": "6h"
|
||||
},
|
||||
"analytics.group-by.date": {
|
||||
"message": "Datum"
|
||||
},
|
||||
"analytics.group-by.day": {
|
||||
"message": "Den"
|
||||
},
|
||||
"analytics.group-by.month": {
|
||||
"message": "Měsíc"
|
||||
},
|
||||
"analytics.group-by.week": {
|
||||
"message": "Týden "
|
||||
},
|
||||
"analytics.group-by.year": {
|
||||
"message": "Rok"
|
||||
},
|
||||
"analytics.options.loading": {
|
||||
"message": "Načítání..."
|
||||
},
|
||||
"analytics.project-status.approved": {
|
||||
"message": "Schválený"
|
||||
},
|
||||
"analytics.project-status.archived": {
|
||||
"message": "Archivovaný "
|
||||
},
|
||||
"analytics.project-status.other": {
|
||||
"message": "Jiné"
|
||||
},
|
||||
"analytics.project-status.private": {
|
||||
"message": "Soukromý "
|
||||
},
|
||||
"analytics.project-status.unlisted": {
|
||||
"message": "Neveřejný "
|
||||
},
|
||||
"analytics.project-status.withheld": {
|
||||
"message": "Pozastavený"
|
||||
},
|
||||
"analytics.project.all": {
|
||||
"message": "Všechny projekty"
|
||||
},
|
||||
"analytics.query.label.project": {
|
||||
"message": "Projekt:"
|
||||
},
|
||||
"analytics.value.other": {
|
||||
"message": "Jiné"
|
||||
},
|
||||
"app-marketing.download.description": {
|
||||
"message": "Naše aplikace je dostupná pro všechny počítačové platformy, vyberte si požadovanou verzi."
|
||||
},
|
||||
@@ -470,6 +548,12 @@
|
||||
"conversation-thread.action.add-private-note": {
|
||||
"message": "Přidat soukromou poznámku"
|
||||
},
|
||||
"conversation-thread.action.approve": {
|
||||
"message": "Schválit"
|
||||
},
|
||||
"conversation-thread.action.approve-with-reply": {
|
||||
"message": "Schválit s odpovědí"
|
||||
},
|
||||
"conversation-thread.action.close-thread": {
|
||||
"message": "Uzavřít vlákno"
|
||||
},
|
||||
@@ -491,6 +575,12 @@
|
||||
"conversation-thread.action.reply-to-thread": {
|
||||
"message": "Odpovědět vláknu"
|
||||
},
|
||||
"conversation-thread.action.resubmit-for-review": {
|
||||
"message": "Znovu odeslat ke kontrole"
|
||||
},
|
||||
"conversation-thread.action.resubmit-for-review-with-reply": {
|
||||
"message": "Znovu odeslat ke kontrole s odpovědí "
|
||||
},
|
||||
"conversation-thread.action.send": {
|
||||
"message": "Odeslat"
|
||||
},
|
||||
@@ -500,6 +590,12 @@
|
||||
"conversation-thread.action.send-to-review-with-reply": {
|
||||
"message": "Odeslat ke kontrole s odpovědí"
|
||||
},
|
||||
"conversation-thread.action.withhold": {
|
||||
"message": "Pozastavit "
|
||||
},
|
||||
"conversation-thread.action.withhold-with-reply": {
|
||||
"message": "Pozastavit s odpovědí"
|
||||
},
|
||||
"conversation-thread.reply-editor.placeholder.reply": {
|
||||
"message": "Odpovědět vláknu..."
|
||||
},
|
||||
@@ -512,6 +608,9 @@
|
||||
"create-project-version.create-modal.stage.add-files.admonition": {
|
||||
"message": "Doplňkové soubory slouží jako podpůrné materiály (např. zdrojový kód), ne jako alternativní verze či varianty."
|
||||
},
|
||||
"create.collection.collection-info": {
|
||||
"message": "Tvá nová kolekce bude vytvořena jako veřejná a bude obsahovat {count, plural, =0 {žádné projekty} one {# projekt} few {# projekty} other {# projektů}}."
|
||||
},
|
||||
"create.collection.create-collection": {
|
||||
"message": "Vytvořit kolekci"
|
||||
},
|
||||
@@ -686,6 +785,9 @@
|
||||
"dashboard.collections.sort.recently-updated": {
|
||||
"message": "Nedávno aktualizováno"
|
||||
},
|
||||
"dashboard.creator-tax-form-modal.confirmation.download-button": {
|
||||
"message": "Stáhnout {formType}"
|
||||
},
|
||||
"dashboard.creator-tax-form-modal.confirmation.title": {
|
||||
"message": "Hotovo! 🎉"
|
||||
},
|
||||
@@ -720,7 +822,7 @@
|
||||
"message": "Vyhladaj štát..."
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.method-selection.region": {
|
||||
"message": "Región"
|
||||
"message": "Oblast"
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.muralpay-details.account-owner": {
|
||||
"message": "Majitel účtu"
|
||||
@@ -740,6 +842,9 @@
|
||||
"dashboard.creator-withdraw-modal.muralpay-details.document-number-tax-id-placeholder": {
|
||||
"message": "Zadejte DIČ"
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.muralpay-details.network": {
|
||||
"message": "Síť"
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.paypal-details.account": {
|
||||
"message": "Účet"
|
||||
},
|
||||
@@ -759,7 +864,7 @@
|
||||
"message": "Přihlásit přes PayPal"
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.stage.tax-form": {
|
||||
"message": ""
|
||||
"message": "Daňový formulář"
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.tremendous-details.enter-denomination-placeholder": {
|
||||
"message": "Zadejte množství"
|
||||
@@ -782,6 +887,9 @@
|
||||
"dashboard.creator-withdraw-modal.withdraw-limit-used": {
|
||||
"message": "Vyčerpali jste svůj limit pro výběr <b>{withdrawLimit}</b>. Pro vyšší výběr musíte vyplnit daňový formulář."
|
||||
},
|
||||
"dashboard.discord-roles.role.creator": {
|
||||
"message": "Tvůrce"
|
||||
},
|
||||
"dashboard.organizations.button.create": {
|
||||
"message": "Vytvořit organizaci"
|
||||
},
|
||||
@@ -791,12 +899,18 @@
|
||||
"dashboard.organizations.error.fetch": {
|
||||
"message": "Nepodařilo se načíst organizace"
|
||||
},
|
||||
"dashboard.organizations.title": {
|
||||
"message": "Organizace"
|
||||
},
|
||||
"dashboard.overview.notifications.button.mark-all-as-read": {
|
||||
"message": "Označit vše jako přečtené"
|
||||
},
|
||||
"dashboard.overview.notifications.button.view-history": {
|
||||
"message": "Ukázat historii"
|
||||
},
|
||||
"dashboard.overview.notifications.empty.no-unread": {
|
||||
"message": "Nemáš žádná nepřečtená oznámení."
|
||||
},
|
||||
"dashboard.overview.notifications.history.label": {
|
||||
"message": "Historie"
|
||||
},
|
||||
@@ -809,6 +923,9 @@
|
||||
"dashboard.projects.head-title": {
|
||||
"message": "Projekty"
|
||||
},
|
||||
"dashboard.projects.links.button.edit": {
|
||||
"message": "Upravit odkazy"
|
||||
},
|
||||
"dashboard.projects.links.discord-invite.label": {
|
||||
"message": "Discord pozvánka"
|
||||
},
|
||||
@@ -827,6 +944,9 @@
|
||||
"dashboard.projects.table.status": {
|
||||
"message": "Stav"
|
||||
},
|
||||
"dashboard.report.title": {
|
||||
"message": "Nahlásit {id}"
|
||||
},
|
||||
"dashboard.revenue.available-now": {
|
||||
"message": "K dispozici nyní"
|
||||
},
|
||||
@@ -1271,6 +1391,9 @@
|
||||
"profile.meta.description-with-bio": {
|
||||
"message": "{bio} - Stáhněte si projekty od {username} na Modrinthu"
|
||||
},
|
||||
"profile.stats.projects-followers": {
|
||||
"message": "{count, plural, one {<stat>{count}</stat> sledující projektu} few {<stat>{count}</stat> sledující projektu} other {<stat>{count}</stat> sledujících projektu}}"
|
||||
},
|
||||
"profile.user-id": {
|
||||
"message": "ID uživatele: {id}"
|
||||
},
|
||||
|
||||
@@ -1455,19 +1455,19 @@
|
||||
"message": "Du hast dein Auszahlungslimit von <b>{withdrawLimit}</b> aufgebraucht. Du musst ein Steuerformular ausfüllen, um merh abzuheben."
|
||||
},
|
||||
"dashboard.discord-roles.banner.body": {
|
||||
"message": "Du bist für {roles} qualifiziert. Verknüpfe dein Discord-Konto über Modrinth, dann synchronisieren wir diese automatisch."
|
||||
"message": "Du bist berechtigt für {roles}. Verknüpfe dein Discord-Konto über Modrinth und wir synchronisieren sie automatisch."
|
||||
},
|
||||
"dashboard.discord-roles.banner.cta": {
|
||||
"message": "Discord verbinden"
|
||||
"message": "Discord verknüpfen"
|
||||
},
|
||||
"dashboard.discord-roles.banner.title": {
|
||||
"message": "Hol dir deine Discord-Rollen"
|
||||
"message": "Beanspruche deine Discord-Rollen"
|
||||
},
|
||||
"dashboard.discord-roles.role.big-creator": {
|
||||
"message": "1M+ Downloads"
|
||||
"message": "1 Mio.+ Downloads"
|
||||
},
|
||||
"dashboard.discord-roles.role.creator": {
|
||||
"message": "Ersteller"
|
||||
"message": "Creator"
|
||||
},
|
||||
"dashboard.discord-roles.role.pride": {
|
||||
"message": "Pride 2026"
|
||||
@@ -2304,7 +2304,7 @@
|
||||
"message": "Entdecke, Spiele und teile Minecraft-Inhalte durch unsere quelloffene Platform, welche für die Community entwickelt wird."
|
||||
},
|
||||
"layout.action.analytics-events": {
|
||||
"message": "Analytics-Events"
|
||||
"message": "Analytics-Ergebnisse"
|
||||
},
|
||||
"layout.action.change-theme": {
|
||||
"message": "Farbschema ändern"
|
||||
@@ -2862,7 +2862,7 @@
|
||||
"message": "Ein Modrinth Benutzer."
|
||||
},
|
||||
"profile.button.analytics": {
|
||||
"message": "Benutzeranalysen anzeigen"
|
||||
"message": "Nutzungsstatistik anzeigen"
|
||||
},
|
||||
"profile.button.billing": {
|
||||
"message": "Nutzer Zahlungen verwalten"
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
"message": "Loader"
|
||||
},
|
||||
"analytics.breakdown.members": {
|
||||
"message": "Members"
|
||||
"message": "Member"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Monetization"
|
||||
@@ -504,7 +504,7 @@
|
||||
"message": "Monetized"
|
||||
},
|
||||
"analytics.value.no-dependent": {
|
||||
"message": "No dependents"
|
||||
"message": "None"
|
||||
},
|
||||
"analytics.value.no-dependent-tooltip": {
|
||||
"message": "Downloaded for reasons other than being a dependency"
|
||||
@@ -731,75 +731,12 @@
|
||||
"auth.authorize.authorize-app-name": {
|
||||
"message": "Authorize {appName}"
|
||||
},
|
||||
"auth.authorize.error.missing-parameters": {
|
||||
"message": "Missing required OAuth query parameters."
|
||||
},
|
||||
"auth.authorize.error.no-redirect-url": {
|
||||
"message": "No redirect location found in response"
|
||||
},
|
||||
"auth.authorize.errro-title": {
|
||||
"message": "An Error Occured"
|
||||
},
|
||||
"auth.authorize.redirect-url": {
|
||||
"message": "You will be redirected to <redirect-url>{url}</redirect-url>"
|
||||
},
|
||||
"auth.continue-with-provider": {
|
||||
"message": "Continue with {provider}"
|
||||
},
|
||||
"auth.create-account.age-requirement.warning-title": {
|
||||
"message": "Age requirement"
|
||||
},
|
||||
"auth.create-account.complete-sign-up": {
|
||||
"message": "Complete sign up"
|
||||
},
|
||||
"auth.create-account.date-of-birth.invalid.text": {
|
||||
"message": "Please enter a valid date of birth. Year cannot be 0000."
|
||||
},
|
||||
"auth.create-account.date-of-birth.invalid.title": {
|
||||
"message": "Invalid date of birth"
|
||||
},
|
||||
"auth.create-account.date-of-birth.label": {
|
||||
"message": "Date of birth"
|
||||
},
|
||||
"auth.create-account.date-of-birth.over13-helper": {
|
||||
"message": "You must be over 13 years old to use Modrinth."
|
||||
},
|
||||
"auth.create-account.date-of-birth.placeholder": {
|
||||
"message": "Select your date of birth"
|
||||
},
|
||||
"auth.create-account.date-of-birth.required.text": {
|
||||
"message": "Please enter your date of birth before continuing."
|
||||
},
|
||||
"auth.create-account.date-of-birth.required.title": {
|
||||
"message": "Date of birth required"
|
||||
},
|
||||
"auth.create-account.date-of-birth.under13-helper": {
|
||||
"message": "You cannot create an account at Modrinth unless you are over 13 years old."
|
||||
},
|
||||
"auth.create-account.info-panel.source-code-link": {
|
||||
"message": "Relevant source code"
|
||||
},
|
||||
"auth.create-account.info-panel.text": {
|
||||
"message": "We do not store your date of birth, only whether you are over 13 to use Modrinth."
|
||||
},
|
||||
"auth.create-account.page-title": {
|
||||
"message": "Create Account"
|
||||
},
|
||||
"auth.create-account.security-check.label": {
|
||||
"message": "Security check"
|
||||
},
|
||||
"auth.create-account.subscribe.label": {
|
||||
"message": "Keep me updated on the cool things Modrinth is working on via email"
|
||||
},
|
||||
"auth.create-account.title": {
|
||||
"message": "Create an Account"
|
||||
},
|
||||
"auth.create-account.username.optional-label": {
|
||||
"message": "Username"
|
||||
},
|
||||
"auth.create-account.username.placeholder": {
|
||||
"message": "Enter username"
|
||||
},
|
||||
"auth.reset-password.method-choice.action": {
|
||||
"message": "Send recovery email"
|
||||
},
|
||||
@@ -834,65 +771,53 @@
|
||||
"message": "Reset your password"
|
||||
},
|
||||
"auth.sign-in.2fa.description": {
|
||||
"message": "Enter the 6-digit code from your authenticator app, or one of your backup codes."
|
||||
"message": "Please enter a two-factor code to proceed."
|
||||
},
|
||||
"auth.sign-in.2fa.label": {
|
||||
"message": "Two-factor authentication"
|
||||
"message": "Enter two-factor code"
|
||||
},
|
||||
"auth.sign-in.2fa.placeholder": {
|
||||
"message": "Enter code..."
|
||||
},
|
||||
"auth.sign-in.continue-with-email": {
|
||||
"message": "Continue with Email"
|
||||
},
|
||||
"auth.sign-in.create-account": {
|
||||
"message": "Sign up"
|
||||
},
|
||||
"auth.sign-in.forgot-password": {
|
||||
"message": "Forgot password"
|
||||
},
|
||||
"auth.sign-in.last-sign-in": {
|
||||
"message": "Last sign in"
|
||||
},
|
||||
"auth.sign-in.no-account": {
|
||||
"message": "Don't have an account?"
|
||||
"auth.sign-in.additional-options": {
|
||||
"message": "<forgot-password-link>Forgot password?</forgot-password-link> • <create-account-link>Create an account</create-account-link>"
|
||||
},
|
||||
"auth.sign-in.sign-in-with": {
|
||||
"message": "Sign into Modrinth"
|
||||
"message": "Sign in with"
|
||||
},
|
||||
"auth.sign-in.title": {
|
||||
"message": "Sign In"
|
||||
},
|
||||
"auth.sign-up.age-requirement.warning-title": {
|
||||
"message": "Age requirement"
|
||||
"auth.sign-in.use-password": {
|
||||
"message": "Or use a password"
|
||||
},
|
||||
"auth.sign-up.continue-with-email": {
|
||||
"message": "Continue with Email"
|
||||
"auth.sign-up.action.create-account": {
|
||||
"message": "Create account"
|
||||
},
|
||||
"auth.sign-up.legal-dislaimer": {
|
||||
"message": "By creating an account, you agree to Modrinth's <terms-link>Terms</terms-link> and <privacy-policy-link>Privacy Policy</privacy-policy-link>."
|
||||
},
|
||||
"auth.sign-up.show-fewer-options": {
|
||||
"message": "Show fewer options"
|
||||
},
|
||||
"auth.sign-up.show-other-options": {
|
||||
"message": "Show other options"
|
||||
"auth.sign-up.notification.password-mismatch.text": {
|
||||
"message": "Passwords do not match!"
|
||||
},
|
||||
"auth.sign-up.sign-in-option.title": {
|
||||
"message": "Already have an account?"
|
||||
},
|
||||
"auth.sign-up.subscribe.label": {
|
||||
"message": "Subscribe to updates about Modrinth"
|
||||
},
|
||||
"auth.sign-up.title": {
|
||||
"message": "Sign Up"
|
||||
},
|
||||
"auth.sign-up.title.create-account": {
|
||||
"message": "Or create an account yourself"
|
||||
},
|
||||
"auth.sign-up.title.sign-up-with": {
|
||||
"message": "Create an Account"
|
||||
"message": "Sign up with"
|
||||
},
|
||||
"auth.verify-email.action.account-settings": {
|
||||
"message": "Account settings"
|
||||
},
|
||||
"auth.verify-email.action.discover-mods": {
|
||||
"message": "Discover mods"
|
||||
},
|
||||
"auth.verify-email.already-verified.description": {
|
||||
"message": "Your email is already verified!"
|
||||
},
|
||||
@@ -911,15 +836,6 @@
|
||||
"auth.verify-email.failed-verification.title": {
|
||||
"message": "Email verification failed"
|
||||
},
|
||||
"auth.verify-email.notification.email-sent.description": {
|
||||
"message": "An email with a link to verify your account has been sent to {email}."
|
||||
},
|
||||
"auth.verify-email.notification.email-sent.title": {
|
||||
"message": "Email sent"
|
||||
},
|
||||
"auth.verify-email.notification.error-occurred.title": {
|
||||
"message": "An error occurred"
|
||||
},
|
||||
"auth.verify-email.post-verification.description": {
|
||||
"message": "Your email address has been successfully verified!"
|
||||
},
|
||||
@@ -929,6 +845,21 @@
|
||||
"auth.verify-email.title": {
|
||||
"message": "Verify Email"
|
||||
},
|
||||
"auth.welcome.checkbox.subscribe": {
|
||||
"message": "Subscribe to updates about Modrinth"
|
||||
},
|
||||
"auth.welcome.description": {
|
||||
"message": "You’re now part of the awesome community of creators & explorers already building, downloading, and staying up-to-date with amazing mods."
|
||||
},
|
||||
"auth.welcome.label.tos": {
|
||||
"message": "By creating an account, you have agreed to Modrinth's <terms-link>Terms</terms-link> and <privacy-policy-link>Privacy Policy</privacy-policy-link>."
|
||||
},
|
||||
"auth.welcome.long-title": {
|
||||
"message": "Welcome to Modrinth!"
|
||||
},
|
||||
"auth.welcome.title": {
|
||||
"message": "Welcome"
|
||||
},
|
||||
"collection.button.edit-icon": {
|
||||
"message": "Edit icon"
|
||||
},
|
||||
@@ -3510,7 +3441,7 @@
|
||||
"message": "Some content can't be included"
|
||||
},
|
||||
"project.settings.permissions.info-banner.description": {
|
||||
"message": "If you include content that isn’t hosted on Modrinth, you need to let us know where it’s from and verify that you have permission to distribute the files. Check out <link>our guide</link> to learn more and get started!"
|
||||
"message": "If you include content that isn’t hosted on Modrinth, you need to let us know where it’s from and verify that you have permission to distribute the files. Check out <link>our announcement of this new system</link> to learn more!"
|
||||
},
|
||||
"project.settings.permissions.info-banner.title": {
|
||||
"message": "Learn about distribution permissions"
|
||||
|
||||
@@ -23,6 +23,15 @@
|
||||
"analytics.breakdown.country": {
|
||||
"message": "País"
|
||||
},
|
||||
"analytics.breakdown.dependent-on": {
|
||||
"message": "Dependiente de"
|
||||
},
|
||||
"analytics.breakdown.dependent-project-download": {
|
||||
"message": "Proyecto dependiente"
|
||||
},
|
||||
"analytics.breakdown.dependent-project-type": {
|
||||
"message": "Tipo de proyecto dependiente"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "Razón de descarga"
|
||||
},
|
||||
@@ -38,6 +47,9 @@
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "Loader"
|
||||
},
|
||||
"analytics.breakdown.members": {
|
||||
"message": "Miembro"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Monetización"
|
||||
},
|
||||
@@ -134,6 +146,24 @@
|
||||
"analytics.chart.render-limit.header": {
|
||||
"message": "¿Mostrar todas las {count} líneas en el gráfico?"
|
||||
},
|
||||
"analytics.chart.table-selection.all": {
|
||||
"message": "Mostrando {itemType, select, project {{count, plural, one {el proyecto} other {todos los proyectos}}} country {{count, plural, one {el país} other {todos los países}}} monetization {{count, plural, one {el valor de monetización} other {todos los valores de monetización}}} downloadSource {{count, plural, one {la fuente de descarga} other {todas las fuentes de descarga}}} downloadReason {{count, plural, one {el motivo de descarga} other {todos los motivos de descarga}}} member {{count, plural, one {el miembro} other {todos los miembros}}} projectVersion {{count, plural, one {la versión del proyecto} other {todas las versiones del proyecto}}} loader {{count, plural, one {el cargador} other {todos los cargadores}}} gameVersion {{count, plural, one {la versión del juego} other {todas las versiones del juego}}} other {{count, plural, one {el elemento} other {todos los elementos}}}} de la tabla"
|
||||
},
|
||||
"analytics.chart.table-selection.count": {
|
||||
"message": "Mostrando {count} {itemType, select, project {{count, plural, one {proyecto} other {proyectos}}} country {{count, plural, one {país} other {países}}} monetization {{count, plural, one {valor de monetización} other {valores de monetización}}} downloadSource {{count, plural, one {fuente de descarga} other {fuentes de descarga}}} downloadReason {{count, plural, one {motivo de descarga} other {motivos de descarga}}} member {{count, plural, one {miembro} other {miembros}}} projectVersion {{count, plural, one {versión del proyecto} other {versiones del proyecto}}} loader {{count, plural, one {cargador} other {cargadores}}} gameVersion {{count, plural, one {versión del juego} other {versiones del juego}}} other {{count, plural, one {elemento} other {elementos}}}} de la tabla"
|
||||
},
|
||||
"analytics.chart.table-selection.limited": {
|
||||
"message": "Mostrando {limit} {itemType, select, project {{limit, plural, one {proyecto} other {proyectos}}} country {{limit, plural, one {país} other {países}}} monetization {{limit, plural, one {valor de monetización} other {valores de monetización}}} downloadSource {{limit, plural, one {fuente de descarga} other {fuentes de descarga}}} downloadReason {{limit, plural, one {motivo de descarga} other {motivos de descarga}}} member {{limit, plural, one {miembro} other {miembros}}} projectVersion {{limit, plural, one {versión del proyecto} other {versiones del proyecto}}} loader {{limit, plural, one {cargador} other {cargadores}}} gameVersion {{limit, plural, one {versión del juego} other {versiones del juego}}} other {{limit, plural, one {elemento} other {elementos}}}} de la tabla"
|
||||
},
|
||||
"analytics.chart.table-selection.top": {
|
||||
"message": "Mostrando el top {count} de {itemType, select, project {{count, plural, one {proyecto} other {proyectos}}} country {{count, plural, one {país} other {países}}} monetization {{count, plural, one {valor de monetización} other {valores de monetización}}} downloadSource {{count, plural, one {fuente de descarga} other {fuentes de descarga}}} downloadReason {{count, plural, one {motivo de descarga} other {motivos de descarga}}} member {{count, plural, one {miembro} other {miembros}}} projectVersion {{count, plural, one {versión del proyecto} other {versiones del proyecto}}} loader {{count, plural, one {cargador} other {cargadores}}} gameVersion {{count, plural, one {versión del juego} other {versiones del juego}}} other {{count, plural, one {elemento} other {elementos}}}} de la tabla"
|
||||
},
|
||||
"analytics.chart.tooltip.dependent-on-project": {
|
||||
"message": "Dependiente de {project}"
|
||||
},
|
||||
"analytics.chart.tooltip.dependent-project-version": {
|
||||
"message": "{dependentProject} depende de la {version} de {dependencyProject}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, one {# día} other {# días}}"
|
||||
},
|
||||
@@ -218,9 +248,15 @@
|
||||
"analytics.filter.search.countries": {
|
||||
"message": "Buscar países..."
|
||||
},
|
||||
"analytics.filter.search.dependent-projects": {
|
||||
"message": "Buscar proyectos..."
|
||||
},
|
||||
"analytics.filter.search.download-sources": {
|
||||
"message": "Buscar fuentes de descarga..."
|
||||
},
|
||||
"analytics.filter.search.members": {
|
||||
"message": "Buscar miembros..."
|
||||
},
|
||||
"analytics.filter.search.project-versions": {
|
||||
"message": "Buscar versiones del proyecto..."
|
||||
},
|
||||
@@ -467,6 +503,12 @@
|
||||
"analytics.value.monetized": {
|
||||
"message": "Monetizado"
|
||||
},
|
||||
"analytics.value.no-dependent": {
|
||||
"message": "Nada"
|
||||
},
|
||||
"analytics.value.no-dependent-tooltip": {
|
||||
"message": "Descargado por razones distintas a ser una dependencia"
|
||||
},
|
||||
"analytics.value.none": {
|
||||
"message": "Nada"
|
||||
},
|
||||
|
||||
@@ -23,6 +23,15 @@
|
||||
"analytics.breakdown.country": {
|
||||
"message": "País"
|
||||
},
|
||||
"analytics.breakdown.dependent-on": {
|
||||
"message": "Depende de"
|
||||
},
|
||||
"analytics.breakdown.dependent-project-download": {
|
||||
"message": "Proyecto dependiente"
|
||||
},
|
||||
"analytics.breakdown.dependent-project-type": {
|
||||
"message": "Tipo de proyecto dependiente"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "Descargar razón"
|
||||
},
|
||||
@@ -38,6 +47,9 @@
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "Loader"
|
||||
},
|
||||
"analytics.breakdown.members": {
|
||||
"message": "Miembro"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Monetización"
|
||||
},
|
||||
@@ -134,6 +146,24 @@
|
||||
"analytics.chart.render-limit.header": {
|
||||
"message": "¿Mostrar todas las {count} líneas en el gráfico?"
|
||||
},
|
||||
"analytics.chart.table-selection.all": {
|
||||
"message": "Mostrando {itemType, select, project {{count, plural, one {el proyecto} other {todos los proyectos}}} country {{count, plural, one {el país} other {todos los países}}} monetization {{count, plural, one {el valor de monetización} other {todos los valores de monetización}}} downloadSource {{count, plural, one {la fuente de descarga} other {todas las fuentes de descarga}}} downloadReason {{count, plural, one {el motivo de descarga} other {todos los motivos de descarga}}} member {{count, plural, one {el miembro} other {todos los miembros}}} projectVersion {{count, plural, one {la versión del proyecto} other {todas las versiones del proyecto}}} loader {{count, plural, one {el cargador} other {todos los cargadores}}} gameVersion {{count, plural, one {la versión del juego} other {todas las versiones del juego}}} other {{count, plural, one {el elemento} other {todos los elementos}}}} de la tabla"
|
||||
},
|
||||
"analytics.chart.table-selection.count": {
|
||||
"message": "Mostrando {count} {itemType, select, project {{count, plural, one {proyecto} other {proyectos}}} country {{count, plural, one {país} other {países}}} monetization {{count, plural, one {valor de monetización} other {valores de monetización}}} downloadSource {{count, plural, one {fuente de descarga} other {fuentes de descarga}}} downloadReason {{count, plural, one {motivo de descarga} other {motivos de descarga}}} member {{count, plural, one {miembro} other {miembros}}} projectVersion {{count, plural, one {versión del proyecto} other {versiones del proyecto}}} loader {{count, plural, one {cargador} other {cargadores}}} gameVersion {{count, plural, one {versión del juego} other {versiones del juego}}} other {{count, plural, one {elemento} other {elementos}}}} de la tabla"
|
||||
},
|
||||
"analytics.chart.table-selection.limited": {
|
||||
"message": "Mostrando {limit} {itemType, select, project {{limit, plural, one {proyecto} other {proyectos}}} country {{limit, plural, one {país} other {países}}} monetization {{limit, plural, one {valor de monetización} other {valores de monetización}}} downloadSource {{limit, plural, one {fuente de descarga} other {fuentes de descarga}}} downloadReason {{limit, plural, one {motivo de descarga} other {motivos de descarga}}} member {{limit, plural, one {miembro} other {miembros}}} projectVersion {{limit, plural, one {versión del proyecto} other {versiones del proyecto}}} loader {{limit, plural, one {cargador} other {cargadores}}} gameVersion {{limit, plural, one {versión del juego} other {versiones del juego}}} other {{limit, plural, one {elemento} other {elementos}}}} de la tabla"
|
||||
},
|
||||
"analytics.chart.table-selection.top": {
|
||||
"message": "Mostrando el top {count} de {itemType, select, project {{count, plural, one {proyecto} other {proyectos}}} country {{count, plural, one {país} other {países}}} monetization {{count, plural, one {valor de monetización} other {valores de monetización}}} downloadSource {{count, plural, one {fuente de descarga} other {fuentes de descarga}}} downloadReason {{count, plural, one {motivo de descarga} other {motivos de descarga}}} member {{count, plural, one {miembro} other {miembros}}} projectVersion {{count, plural, one {versión del proyecto} other {versiones del proyecto}}} loader {{count, plural, one {cargador} other {cargadores}}} gameVersion {{count, plural, one {versión del juego} other {versiones del juego}}} other {{count, plural, one {elemento} other {elementos}}}} de la tabla"
|
||||
},
|
||||
"analytics.chart.tooltip.dependent-on-project": {
|
||||
"message": "Depende de {project}"
|
||||
},
|
||||
"analytics.chart.tooltip.dependent-project-version": {
|
||||
"message": "{dependentProject} depende de {dependencyProject}, {version}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, one {# día} other {# días}}"
|
||||
},
|
||||
@@ -218,9 +248,15 @@
|
||||
"analytics.filter.search.countries": {
|
||||
"message": "Buscar países..."
|
||||
},
|
||||
"analytics.filter.search.dependent-projects": {
|
||||
"message": "Buscar proyectos..."
|
||||
},
|
||||
"analytics.filter.search.download-sources": {
|
||||
"message": "Buscar fuentes de descarga..."
|
||||
},
|
||||
"analytics.filter.search.members": {
|
||||
"message": "Buscar miembros..."
|
||||
},
|
||||
"analytics.filter.search.project-versions": {
|
||||
"message": "Buscar versiones del proyecto..."
|
||||
},
|
||||
@@ -467,6 +503,12 @@
|
||||
"analytics.value.monetized": {
|
||||
"message": "Monetizado"
|
||||
},
|
||||
"analytics.value.no-dependent": {
|
||||
"message": "Nada"
|
||||
},
|
||||
"analytics.value.no-dependent-tooltip": {
|
||||
"message": "Descargado por motivos distintos a ser una dependencia"
|
||||
},
|
||||
"analytics.value.none": {
|
||||
"message": "Nada"
|
||||
},
|
||||
@@ -4529,6 +4571,9 @@
|
||||
"settings.sessions.description": {
|
||||
"message": "Aquí están todos los dispositivos que están actualmente conectados con tu cuenta Modrinth. Puedes cerrar sesión en cada uno de ellos individualmente.\n\nSi ves una entrada que no reconoces, cierra sesión en ese dispositivo y cambia la contraseña de tu cuenta Modrinth inmediatamente."
|
||||
},
|
||||
"settings.sessions.last-accessed-ago": {
|
||||
"message": "Último Acceso"
|
||||
},
|
||||
"settings.sessions.unknown-os": {
|
||||
"message": "Sistema operativo desconocido"
|
||||
},
|
||||
|
||||
@@ -1019,6 +1019,9 @@
|
||||
"dashboard.notifications.link.view-history": {
|
||||
"message": "Tingnan ang kasaysayan ng notipikasyon"
|
||||
},
|
||||
"dashboard.notifications.link.view-more": {
|
||||
"message": "Tingnan ang {extraNotifs} pang {extraNotifs, plural, other {notipikasyon}}"
|
||||
},
|
||||
"dashboard.organizations.button.create": {
|
||||
"message": "Lumikha ng organisasyon"
|
||||
},
|
||||
|
||||
@@ -23,6 +23,15 @@
|
||||
"analytics.breakdown.country": {
|
||||
"message": "Pays"
|
||||
},
|
||||
"analytics.breakdown.dependent-on": {
|
||||
"message": "Dépend de"
|
||||
},
|
||||
"analytics.breakdown.dependent-project-download": {
|
||||
"message": "Projet dépendant"
|
||||
},
|
||||
"analytics.breakdown.dependent-project-type": {
|
||||
"message": "Type de projet dépendant"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "Télécharger la raison"
|
||||
},
|
||||
@@ -38,6 +47,9 @@
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "Loader"
|
||||
},
|
||||
"analytics.breakdown.members": {
|
||||
"message": "Membre"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Monétisation"
|
||||
},
|
||||
@@ -134,6 +146,24 @@
|
||||
"analytics.chart.render-limit.header": {
|
||||
"message": "Afficher les {count} lignes sur le graphique ?"
|
||||
},
|
||||
"analytics.chart.table-selection.all": {
|
||||
"message": "Affichage de tous les {itemType, select, project {{count, plural, one {projet} other {projets}}} country {{count, plural, one {pays} other {pays}}} monetization {{count, plural, one {valeur de monétisation} other {valeurs de monétisation}}} downloadSource {{count, plural, one {source de téléchargement} other {sources de téléchargement}}} downloadReason {{count, plural, one {motif de téléchargement} other {motifs de téléchargement}}} member {{count, plural, one {membre} other {membres}}} projectVersion {{count, plural, one {version du projet} other {versions du projet}}} loader {{count, plural, one {chargeur} other {chargeurs}}} gameVersion {{count, plural, one {version du jeu} other {versions du jeu}}} other {{count, plural, one {élément} other {éléments}}}} du tableau"
|
||||
},
|
||||
"analytics.chart.table-selection.count": {
|
||||
"message": "Affichage de {count} {itemType, select, project {{count, plural, one {projet} other {projets}}} country {{count, plural, one {pays} other {pays}}} monetization {{count, plural, one {valeur de monétisation} other {valeurs de monétisation}}} downloadSource {{count, plural, one {source de téléchargement} other {sources de téléchargement}}} downloadReason {{count, plural, one {motif de téléchargement} other {motifs de téléchargement}}} member {{count, plural, one {membre} other {membres}}} projectVersion {{count, plural, one {version du projet} other {versions du projet}}} loader {{count, plural, one {chargeur} other {chargeurs}}} gameVersion {{count, plural, one {version du jeu} other {versions du jeu}}} other {{count, plural, one {élément} other {éléments}}}} du tableau"
|
||||
},
|
||||
"analytics.chart.table-selection.limited": {
|
||||
"message": "Affichage de {limit} {itemType, select, project {{limit, plural, one {projet} other {projets}}} country {{limit, plural, one {pays} other {pays}}} monetization {{limit, plural, one {valeur de monétisation} other {valeurs de monétisation}}} downloadSource {{limit, plural, one {source de téléchargement} other {sources de téléchargement}}} downloadReason {{limit, plural, one {motif de téléchargement} other {motifs de téléchargement}}} member {{limit, plural, one {membre} other {membres}}} projectVersion {{limit, plural, one {version du projet} other {versions du projet}}} loader {{limit, plural, one {chargeur} other {chargeurs}}} gameVersion {{limit, plural, one {version du jeu} other {versions du jeu}}} other {{limit, plural, one {élément} other {éléments}}}} du tableau"
|
||||
},
|
||||
"analytics.chart.table-selection.top": {
|
||||
"message": "Affichage des {count} {itemType, select, project {{count, plural, one {projet} other {projets}}} country {{count, plural, one {pays} other {pays}}} monetization {{count, plural, one {valeur de monétisation} other {valeurs de monétisation}}} downloadSource {{count, plural, one {source de téléchargement} other {sources de téléchargement}}} downloadReason {{count, plural, one {motif de téléchargement} other {motifs de téléchargement}}} member {{count, plural, one {membre} other {membres}}} projectVersion {{count, plural, one {version du projet} other {versions du projet}}} loader {{count, plural, one {chargeur} other {chargeurs}}} gameVersion {{count, plural, one {version du jeu} other {versions du jeu}}} other {{count, plural, one {élément} other {éléments}}}} les plus pertinents du tableau"
|
||||
},
|
||||
"analytics.chart.tooltip.dependent-on-project": {
|
||||
"message": "Dépend de {project}"
|
||||
},
|
||||
"analytics.chart.tooltip.dependent-project-version": {
|
||||
"message": "{dependentProject} dépend de {dependencyProject}, {version}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, one {# jour} other {# jours}}"
|
||||
},
|
||||
@@ -218,9 +248,15 @@
|
||||
"analytics.filter.search.countries": {
|
||||
"message": "Rechercher des pays..."
|
||||
},
|
||||
"analytics.filter.search.dependent-projects": {
|
||||
"message": "Rechercher des projets..."
|
||||
},
|
||||
"analytics.filter.search.download-sources": {
|
||||
"message": "Rechercher des sources de téléchargement..."
|
||||
},
|
||||
"analytics.filter.search.members": {
|
||||
"message": "Rechercher des membres..."
|
||||
},
|
||||
"analytics.filter.search.project-versions": {
|
||||
"message": "Rechercher des versions du projet..."
|
||||
},
|
||||
@@ -467,6 +503,12 @@
|
||||
"analytics.value.monetized": {
|
||||
"message": "Monétisé"
|
||||
},
|
||||
"analytics.value.no-dependent": {
|
||||
"message": "Aucun"
|
||||
},
|
||||
"analytics.value.no-dependent-tooltip": {
|
||||
"message": "Téléchargé pour des raisons autres que le fait d'être une dépendance"
|
||||
},
|
||||
"analytics.value.none": {
|
||||
"message": "Aucun"
|
||||
},
|
||||
@@ -2978,11 +3020,14 @@
|
||||
"project-member-header.invitation-title": {
|
||||
"message": "Invitation à rejoindre un projet"
|
||||
},
|
||||
"project-member-header.invitation-with-role": {
|
||||
"message": "Vous avez été invité à être membre de ce projet sous le rôle de '{role}''."
|
||||
},
|
||||
"project-member-header.success-decline": {
|
||||
"message": "Vous avez refusé l’invitation à rejoindre l’équipe."
|
||||
"message": "Vous avez refusé l’invitation à rejoindre l’équipe"
|
||||
},
|
||||
"project-member-header.success-join": {
|
||||
"message": "Vous avez rejoint l’équipe du projet."
|
||||
"message": "Vous avez rejoint l’équipe du projet"
|
||||
},
|
||||
"project-moderation-nags.publishing-checklist": {
|
||||
"message": "Liste de contrôle de publication"
|
||||
|
||||
@@ -134,6 +134,15 @@
|
||||
"analytics.chart.render-limit.header": {
|
||||
"message": "Megjelenítse a grafikonon mind a {count} sort?"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count} nap"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.hours": {
|
||||
"message": "{count} óra"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.minutes": {
|
||||
"message": "{count} perc"
|
||||
},
|
||||
"analytics.chart.tooltip.hide-entry": {
|
||||
"message": "{name} elrejtése a grafikonon"
|
||||
},
|
||||
@@ -320,6 +329,9 @@
|
||||
"analytics.project.all": {
|
||||
"message": "Összes projekt"
|
||||
},
|
||||
"analytics.project.count": {
|
||||
"message": "{count} projekt"
|
||||
},
|
||||
"analytics.project.icon-alt": {
|
||||
"message": "{name} ikon"
|
||||
},
|
||||
@@ -395,9 +407,30 @@
|
||||
"analytics.table.export-csv": {
|
||||
"message": "CSV exportálása"
|
||||
},
|
||||
"analytics.table.export.grouped": {
|
||||
"message": "{groupBy} szerint csoportosítva"
|
||||
},
|
||||
"analytics.table.search.placeholder": {
|
||||
"message": "Keresés..."
|
||||
},
|
||||
"analytics.title": {
|
||||
"message": "Statisztika"
|
||||
},
|
||||
"analytics.value.monetized": {
|
||||
"message": "Bevételszerzés"
|
||||
},
|
||||
"analytics.value.none": {
|
||||
"message": "Nincs"
|
||||
},
|
||||
"analytics.value.other": {
|
||||
"message": "Egyéb"
|
||||
},
|
||||
"analytics.value.unknown": {
|
||||
"message": "Ismeretlen"
|
||||
},
|
||||
"analytics.value.unmonetized": {
|
||||
"message": "Nem bevételszerző"
|
||||
},
|
||||
"app-marketing.download.description": {
|
||||
"message": "Asztali alkalmazásunk minden platformon elérhető, válaszd ki a kívánt verziót."
|
||||
},
|
||||
@@ -512,6 +545,9 @@
|
||||
"app-marketing.features.performance.infinite-mb": {
|
||||
"message": "∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.infinite-times-infinite-mb": {
|
||||
"message": "∞ × ∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.less-than-150mb": {
|
||||
"message": "< 150 MB"
|
||||
},
|
||||
@@ -878,6 +914,9 @@
|
||||
"create-project-version.create-modal.stage.add-files.admonition": {
|
||||
"message": "A kiegészítő fájlok olyan kiegészítő forrásokhoz tartoznak, mint például a forráskód, nem pedig alternatív verziókhoz vagy változatokhoz."
|
||||
},
|
||||
"create.collection.collection-info": {
|
||||
"message": "Az új gyűjteményed nyilvános gyűjteményként jön létre {count, plural, =0 {projektek nélkül} other {# projekttel}}."
|
||||
},
|
||||
"create.collection.create-collection": {
|
||||
"message": "Gyűjtemény létrehozása"
|
||||
},
|
||||
@@ -1037,6 +1076,9 @@
|
||||
"dashboard.affiliate-links.search": {
|
||||
"message": "Társulati linkek keresése..."
|
||||
},
|
||||
"dashboard.analytics.from-projects": {
|
||||
"message": "{count} projektből"
|
||||
},
|
||||
"dashboard.analytics.total-downloads": {
|
||||
"message": "Összes letöltés"
|
||||
},
|
||||
@@ -1058,6 +1100,9 @@
|
||||
"dashboard.collections.empty.no-match-hint": {
|
||||
"message": "Próbáld meg módosítani a szűrőket vagy a keresési kifejezéseket."
|
||||
},
|
||||
"dashboard.collections.label.projects-count": {
|
||||
"message": "{count} projekt"
|
||||
},
|
||||
"dashboard.collections.label.search-input": {
|
||||
"message": "Keresd meg a gyűjteményeidet"
|
||||
},
|
||||
@@ -1340,12 +1385,18 @@
|
||||
"dashboard.notifications.link.view-history": {
|
||||
"message": "Értesítési előzmények megtekintése"
|
||||
},
|
||||
"dashboard.notifications.link.view-more": {
|
||||
"message": "További {extraNotifs} értesítés megtekintése"
|
||||
},
|
||||
"dashboard.organizations.button.create": {
|
||||
"message": "Szervezet létrehozása"
|
||||
},
|
||||
"dashboard.organizations.empty.cta": {
|
||||
"message": "Hozz létre egy szervezetet!"
|
||||
},
|
||||
"dashboard.organizations.member-count": {
|
||||
"message": "{count} tag"
|
||||
},
|
||||
"dashboard.organizations.title": {
|
||||
"message": "Szervezetek"
|
||||
},
|
||||
@@ -1388,12 +1439,18 @@
|
||||
"dashboard.projects.links.button.edit": {
|
||||
"message": "Linkek szerkesztése"
|
||||
},
|
||||
"dashboard.projects.links.changes-applied": {
|
||||
"message": "A változtatások <strong>{count}</strong> projektre vonatkoznak."
|
||||
},
|
||||
"dashboard.projects.links.discord-invite.description": {
|
||||
"message": "Meghívólink a Discord szerveredre."
|
||||
},
|
||||
"dashboard.projects.links.discord-invite.label": {
|
||||
"message": "Discord meghívó"
|
||||
},
|
||||
"dashboard.projects.links.header.edit": {
|
||||
"message": "Hivatkozások szerkesztése"
|
||||
},
|
||||
"dashboard.projects.links.issue-tracker.description": {
|
||||
"message": "Egy hely, ahol a felhasználók hibákat, problémákat és aggályokat jelenthetnek a projekteddel kapcsolatban."
|
||||
},
|
||||
@@ -2085,7 +2142,7 @@
|
||||
"message": "{time} kaptad"
|
||||
},
|
||||
"landing.notifications.version-released": {
|
||||
"message": "Egy új verzió {version} kijött erre: {gameVersion}"
|
||||
"message": "Egy új verzió ({version}) kijött erre: {gameVersion}"
|
||||
},
|
||||
"landing.section.for-creators.description": {
|
||||
"message": "Adj otthont alkotásaidnak az interneten, és érj el hatalmas közönséget elkötelezett játékosokból."
|
||||
@@ -2651,6 +2708,9 @@
|
||||
"muralpay.warning.wallet-address": {
|
||||
"message": "Nézd át jól a pénztárca címedet. Az egyenleg rossz címre lesz küldve az nem szerezhető vissza."
|
||||
},
|
||||
"organization.settings.projects.edit-links.affected-projects": {
|
||||
"message": "A módosítások {count} projektre vonatkoznak."
|
||||
},
|
||||
"profile.bio.fallback.creator": {
|
||||
"message": "Egy Modrinth fejlesztő."
|
||||
},
|
||||
@@ -2675,6 +2735,9 @@
|
||||
"profile.button.set-affiliate": {
|
||||
"message": "Beállítás társult vállalkozás ként"
|
||||
},
|
||||
"profile.collection.projects-count": {
|
||||
"message": "{count} projekt"
|
||||
},
|
||||
"profile.details.label.auth-providers": {
|
||||
"message": "Auth szolgáltatók"
|
||||
},
|
||||
@@ -2711,6 +2774,9 @@
|
||||
"profile.label.collection": {
|
||||
"message": "Gyűjtemény"
|
||||
},
|
||||
"profile.label.downloads": {
|
||||
"message": "{count} letöltés"
|
||||
},
|
||||
"profile.label.joined": {
|
||||
"message": "Csatlakozott"
|
||||
},
|
||||
@@ -2729,6 +2795,9 @@
|
||||
"profile.label.organizations": {
|
||||
"message": "Szervezetek"
|
||||
},
|
||||
"profile.label.projects": {
|
||||
"message": "{count} projekt"
|
||||
},
|
||||
"profile.label.saving": {
|
||||
"message": "Mentés..."
|
||||
},
|
||||
@@ -2738,6 +2807,9 @@
|
||||
"profile.meta.description-with-bio": {
|
||||
"message": "{bio} - Töltsd le {username} projektjeit a Modrinthon"
|
||||
},
|
||||
"profile.stats.projects-followers": {
|
||||
"message": "<stat>{count}</stat> projektkövető"
|
||||
},
|
||||
"profile.user-id": {
|
||||
"message": "Felhasználói azonosító: {id}"
|
||||
},
|
||||
@@ -3098,12 +3170,18 @@
|
||||
"project.settings.permissions.learn-more": {
|
||||
"message": "További információ"
|
||||
},
|
||||
"project.settings.permissions.search-placeholder": {
|
||||
"message": "Keresés {count} külső projekt között..."
|
||||
},
|
||||
"project.settings.title": {
|
||||
"message": "Beállítások"
|
||||
},
|
||||
"project.settings.visit-dashboard": {
|
||||
"message": "Projektek irányítópult megnyitása"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "{count} letöltés"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "A(z) {title} archiválásra került. A(z) {title} nem kap további frissítéseket, kivéve, ha a fejlesztő úgy dönt, hogy visszavonja a projekt archiválását."
|
||||
},
|
||||
|
||||
@@ -107,6 +107,9 @@
|
||||
"analytics.chart.empty.select-table-items": {
|
||||
"message": "Pilih benda dari tabel di bawah ini untuk memvisualisasi data Anda."
|
||||
},
|
||||
"analytics.chart.events.count-aria": {
|
||||
"message": "{count, plural, other {# acara analisis}}"
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>: {title}"
|
||||
},
|
||||
@@ -119,6 +122,15 @@
|
||||
"analytics.chart.render-limit.header": {
|
||||
"message": "Tampilkan semua ({count}) garis di grafik?"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, other {# hari}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.hours": {
|
||||
"message": "{count, plural, other {# jam}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.minutes": {
|
||||
"message": "{count, plural, other {# menit}}"
|
||||
},
|
||||
"analytics.chart.tooltip.hide-entry": {
|
||||
"message": "Sembunyikan {name} di grafik"
|
||||
},
|
||||
@@ -614,6 +626,9 @@
|
||||
"create-project-version.create-modal.stage.add-files.admonition": {
|
||||
"message": "Berkas tambahan hanya untuk sumber pendukung seperti kode sumber, bukan untuk versi atau varian lain."
|
||||
},
|
||||
"create.collection.collection-info": {
|
||||
"message": "Koleksi baru Anda akan dibuat sebagai koleksi publik dengan {count, plural, =0 {0 proyek} other {# proyek}}."
|
||||
},
|
||||
"create.collection.create-collection": {
|
||||
"message": "Buat koleksi"
|
||||
},
|
||||
@@ -788,6 +803,9 @@
|
||||
"dashboard.collections.empty.no-match-hint": {
|
||||
"message": "Coba sesuaikan kata kunci pencarian atau penyaringan Anda."
|
||||
},
|
||||
"dashboard.collections.label.projects-count": {
|
||||
"message": "{count} {countPlural, plural, other {proyek}}"
|
||||
},
|
||||
"dashboard.collections.label.search-input": {
|
||||
"message": "Cari koleksi Anda"
|
||||
},
|
||||
@@ -2246,6 +2264,9 @@
|
||||
"profile.label.collection": {
|
||||
"message": "Koleksi"
|
||||
},
|
||||
"profile.label.downloads": {
|
||||
"message": "{count} {countPlural, plural, other {pengunduhan}}"
|
||||
},
|
||||
"profile.label.joined": {
|
||||
"message": "Telah bergabung"
|
||||
},
|
||||
@@ -2264,6 +2285,9 @@
|
||||
"profile.label.organizations": {
|
||||
"message": "Organisasi"
|
||||
},
|
||||
"profile.label.projects": {
|
||||
"message": "{count} {countPlural, plural, other {proyek}}"
|
||||
},
|
||||
"profile.label.saving": {
|
||||
"message": "Menyimpan..."
|
||||
},
|
||||
@@ -2273,6 +2297,9 @@
|
||||
"profile.meta.description-with-bio": {
|
||||
"message": "{bio} - Unduh proyek milik {username} di Modrinth"
|
||||
},
|
||||
"profile.stats.projects-followers": {
|
||||
"message": "{count, plural, other {<stat>{count}</stat> pengikut proyek}}"
|
||||
},
|
||||
"profile.user-id": {
|
||||
"message": "Pengenal Pengguna: {id}"
|
||||
},
|
||||
|
||||
@@ -23,6 +23,15 @@
|
||||
"analytics.breakdown.country": {
|
||||
"message": "Paese"
|
||||
},
|
||||
"analytics.breakdown.dependent-on": {
|
||||
"message": "Dipendenza su"
|
||||
},
|
||||
"analytics.breakdown.dependent-project-download": {
|
||||
"message": "Progetto dipendente"
|
||||
},
|
||||
"analytics.breakdown.dependent-project-type": {
|
||||
"message": "Tipo progetto dipendente"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "Motivo del download"
|
||||
},
|
||||
@@ -38,6 +47,9 @@
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "Loader"
|
||||
},
|
||||
"analytics.breakdown.members": {
|
||||
"message": "Membro"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Monetizzazione"
|
||||
},
|
||||
@@ -128,6 +140,24 @@
|
||||
"analytics.chart.render-limit.header": {
|
||||
"message": "Mostrare tutte le {count} linee nel grafico?"
|
||||
},
|
||||
"analytics.chart.table-selection.all": {
|
||||
"message": "Mostrando {itemType, select, project {tutti i progetti} country {tutti i paesi} monetization {tutti i valori di monetizzazione} downloadSource {tutte le fonti di download} downloadReason {tutti i motivi di download} member {tutti i membri} projectVersion {tutte le versioni del progetto} loader {tutti i loader} gameVersion {tutte le versioni di gioco} other {tutti gli elementi}} dalla tabella"
|
||||
},
|
||||
"analytics.chart.table-selection.count": {
|
||||
"message": "Mostrando {count} {itemType, select, project {{count, plural, one {progetto} other {progetti}}} country {{count, plural, one {paese} other {paesi}}} monetization {{count, plural, one {valore} other {valori}} di monetizzazione} downloadSource {{count, plural, one {fonte} other {fonti}} di download} downloadReason {{count, plural, one {motivo} other {motivi}} di download} member {{count, plural, one {membro} other {membri}}} projectVersion {{count, plural, one {versione} other {versioni}} del progetto} loader {loader} gameVersion {{count, plural, one {versione} other {versioni}} di gioco} other {{count, plural, one {elemento} other {elementi}}}} dalla tabella"
|
||||
},
|
||||
"analytics.chart.table-selection.limited": {
|
||||
"message": "Mostrando {limit} {itemType, select, project {{limit, plural, one {progetto} other {progetti}}} country {{limit, plural, one {paese} other {paesi}}} monetization {{limit, plural, one {valore} other {valori}} di monetizzazione} downloadSource {{limit, plural, one {fonte} other {fonti}} di download} downloadReason {{limit, plural, one {motivo} other {motivi}} di download} member {{limit, plural, one {membro} other {membri}}} projectVersion {{limit, plural, one {versione} other {versioni}} del progetto} loader {loader} gameVersion {{limit, plural, one {versione} other {versioni}} di gioco} other {{limit, plural, one {elemento} other {elementi}}}} dalla tabella"
|
||||
},
|
||||
"analytics.chart.table-selection.top": {
|
||||
"message": "Mostrando {itemType, select, project {{count, plural, one {il primo progetto} other {i primi # progetti}}} country {{count, plural, one {il primo paese} other {i primi # paesi}}} monetization {{count, plural, one {il primo valore} other {i primi # valori}} di monetizzazione} downloadSource {{count, plural, one {la prima fonte} other {le prime # fonti}} di download} downloadReason {{count, plural, one {il primo motivo} other {i primi # motivi}} di download} member {{count, plural, one {il primo membro} other {i primi # membri}}} projectVersion {{count, plural, one {la prima versione} other {le prime # versioni}} del progetto} loader {{count, plural, one {il primo} other {i primi #}} loader} gameVersion {{count, plural, one {la prima versione} other {le prime # versioni}} di gioco} other {{count, plural, one {il primo elemento} other {i primi {count} elementi}}}} dalla tabella"
|
||||
},
|
||||
"analytics.chart.tooltip.dependent-on-project": {
|
||||
"message": "Dipendente su {project}"
|
||||
},
|
||||
"analytics.chart.tooltip.dependent-project-version": {
|
||||
"message": "{dependentProject} dipende su {dependencyProject}, {version}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, one {# giorno} other {# giorni}}"
|
||||
},
|
||||
@@ -212,9 +242,15 @@
|
||||
"analytics.filter.search.countries": {
|
||||
"message": "Cerca tra i paesi..."
|
||||
},
|
||||
"analytics.filter.search.dependent-projects": {
|
||||
"message": "Cerca tra i progetti..."
|
||||
},
|
||||
"analytics.filter.search.download-sources": {
|
||||
"message": "Cerca tra le fonti di download..."
|
||||
},
|
||||
"analytics.filter.search.members": {
|
||||
"message": "Cerca tra i membri..."
|
||||
},
|
||||
"analytics.filter.search.project-versions": {
|
||||
"message": "Cerca tra le versioni del progetto..."
|
||||
},
|
||||
@@ -461,6 +497,12 @@
|
||||
"analytics.value.monetized": {
|
||||
"message": "Monetizzato"
|
||||
},
|
||||
"analytics.value.no-dependent": {
|
||||
"message": "Nessuno"
|
||||
},
|
||||
"analytics.value.no-dependent-tooltip": {
|
||||
"message": "Scaricato per altri motivi che non siano per dipendenza"
|
||||
},
|
||||
"analytics.value.none": {
|
||||
"message": "Nessuno"
|
||||
},
|
||||
@@ -1151,6 +1193,9 @@
|
||||
"dashboard.affiliate-links.search": {
|
||||
"message": "Cerca tra i link affiliati..."
|
||||
},
|
||||
"dashboard.analytics.from-projects": {
|
||||
"message": "da {count, plural, one {# progetto} other {# progetti}}"
|
||||
},
|
||||
"dashboard.analytics.total-downloads": {
|
||||
"message": "Download totali"
|
||||
},
|
||||
@@ -1475,6 +1520,9 @@
|
||||
"dashboard.notifications.link.view-history": {
|
||||
"message": "Mostra cronologia notifiche"
|
||||
},
|
||||
"dashboard.notifications.link.view-more": {
|
||||
"message": "Mostra {extraNotifs, plural, one {# altra notifica} other {altre # notifiche}}"
|
||||
},
|
||||
"dashboard.organizations.button.create": {
|
||||
"message": "Crea organizzazione"
|
||||
},
|
||||
@@ -1484,6 +1532,9 @@
|
||||
"dashboard.organizations.error.fetch": {
|
||||
"message": "Impossibile ottenere le organizzazioni"
|
||||
},
|
||||
"dashboard.organizations.member-count": {
|
||||
"message": "{count, plural, one {# membro} other {# membri}}"
|
||||
},
|
||||
"dashboard.organizations.title": {
|
||||
"message": "Organizzazioni"
|
||||
},
|
||||
@@ -2903,6 +2954,9 @@
|
||||
"profile.label.collection": {
|
||||
"message": "Raccolta"
|
||||
},
|
||||
"profile.label.downloads": {
|
||||
"message": "{count} download"
|
||||
},
|
||||
"profile.label.joined": {
|
||||
"message": "Iscrizione"
|
||||
},
|
||||
@@ -2939,6 +2993,9 @@
|
||||
"profile.official-account.bio": {
|
||||
"message": "L'account ufficiale di Modrinth. Ricevi assistenza presso <support-link></support-link> o tramite mail presso <email></email>"
|
||||
},
|
||||
"profile.stats.projects-followers": {
|
||||
"message": "<stat>{count, plural, =0 {Nessun} other {{count}}}</stat> follower del progetto"
|
||||
},
|
||||
"profile.user-id": {
|
||||
"message": "ID utente: {id}"
|
||||
},
|
||||
@@ -3371,12 +3428,21 @@
|
||||
"project.settings.permissions.learn-more": {
|
||||
"message": "Scopri di più"
|
||||
},
|
||||
"project.settings.permissions.search-placeholder": {
|
||||
"message": "Cerca tra {count, plural, one {# progetto esterno} other {# progetti esterni}}..."
|
||||
},
|
||||
"project.settings.title": {
|
||||
"message": "Impostazioni"
|
||||
},
|
||||
"project.settings.visit-dashboard": {
|
||||
"message": "Visita bacheca del progetto"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "{count} download"
|
||||
},
|
||||
"project.stats.followers-label": {
|
||||
"message": "{count} follower"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "{title} è stato archiviato. {title} non riceverà più aggiornamenti a meno che l'autore decida di rimuoverlo dall'archivio."
|
||||
},
|
||||
|
||||
@@ -23,14 +23,20 @@
|
||||
"analytics.breakdown.country": {
|
||||
"message": "国"
|
||||
},
|
||||
"analytics.breakdown.dependent-project-download": {
|
||||
"message": "依存プロジェクト"
|
||||
},
|
||||
"analytics.breakdown.dependent-project-type": {
|
||||
"message": "依存プロジェクトの種類"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "理由"
|
||||
},
|
||||
"analytics.breakdown.download-source": {
|
||||
"message": "流入元"
|
||||
"message": "ソース"
|
||||
},
|
||||
"analytics.breakdown.game-version": {
|
||||
"message": "マインクラフト"
|
||||
"message": "ゲームのバージョン"
|
||||
},
|
||||
"analytics.breakdown.generic": {
|
||||
"message": "内訳"
|
||||
@@ -38,9 +44,15 @@
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "ローダー"
|
||||
},
|
||||
"analytics.breakdown.members": {
|
||||
"message": "メンバー"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "収益化"
|
||||
},
|
||||
"analytics.breakdown.none.selected": {
|
||||
"message": "分析 - デフォルト"
|
||||
},
|
||||
"analytics.breakdown.project": {
|
||||
"message": "プロジェクト"
|
||||
},
|
||||
@@ -48,7 +60,10 @@
|
||||
"message": "ステータス"
|
||||
},
|
||||
"analytics.breakdown.project-version": {
|
||||
"message": "バージョン"
|
||||
"message": "プロジェクトのバージョン"
|
||||
},
|
||||
"analytics.breakdown.selected": {
|
||||
"message": "分析 - {breakdown}"
|
||||
},
|
||||
"analytics.chart.action.show-all": {
|
||||
"message": "すべて表示"
|
||||
@@ -59,6 +74,45 @@
|
||||
"analytics.chart.axis.playtime-hours": {
|
||||
"message": "{hours}時間"
|
||||
},
|
||||
"analytics.chart.controls.active-count": {
|
||||
"message": "{count}件がアクティブ"
|
||||
},
|
||||
"analytics.chart.controls.annotations": {
|
||||
"message": "注釈"
|
||||
},
|
||||
"analytics.chart.controls.aria": {
|
||||
"message": "アナリティクスのグラフ設定, {activeCount}"
|
||||
},
|
||||
"analytics.chart.controls.button": {
|
||||
"message": "設定"
|
||||
},
|
||||
"analytics.chart.controls.dialog-aria": {
|
||||
"message": "アナリティクスのグラフ設定"
|
||||
},
|
||||
"analytics.chart.controls.display": {
|
||||
"message": "ディスプレイ"
|
||||
},
|
||||
"analytics.chart.controls.modrinth-events": {
|
||||
"message": "Modrinth"
|
||||
},
|
||||
"analytics.chart.controls.no-modrinth-events": {
|
||||
"message": "Modrinthのイベントがありません。"
|
||||
},
|
||||
"analytics.chart.controls.no-project-events": {
|
||||
"message": "プロジェクトのイベントがありません。"
|
||||
},
|
||||
"analytics.chart.controls.previous-period": {
|
||||
"message": "1期前の描画"
|
||||
},
|
||||
"analytics.chart.controls.project-events": {
|
||||
"message": "プロジェクト"
|
||||
},
|
||||
"analytics.chart.controls.ratio": {
|
||||
"message": ""
|
||||
},
|
||||
"analytics.chart.tooltip.total": {
|
||||
"message": "合計"
|
||||
},
|
||||
"analytics.chart.view.area": {
|
||||
"message": "エリア"
|
||||
},
|
||||
@@ -75,7 +129,7 @@
|
||||
"message": "Modパック"
|
||||
},
|
||||
"analytics.download-reason.standalone": {
|
||||
"message": "新規"
|
||||
"message": "スタンドアローン"
|
||||
},
|
||||
"analytics.download-reason.update": {
|
||||
"message": "更新"
|
||||
@@ -86,29 +140,77 @@
|
||||
"analytics.download-source.website": {
|
||||
"message": "Modrinth Web"
|
||||
},
|
||||
"analytics.downloads.suffix": {
|
||||
"message": "ダウンロード"
|
||||
},
|
||||
"analytics.empty.no-data": {
|
||||
"message": "使用可能なデータがありません"
|
||||
},
|
||||
"analytics.empty.no-data-for-analytics": {
|
||||
"message": "統計に使用可能なデータがありません"
|
||||
},
|
||||
"analytics.filter.game-version-type.all": {
|
||||
"message": "全て"
|
||||
},
|
||||
"analytics.filter.game-version-type.release": {
|
||||
"message": "リリース"
|
||||
},
|
||||
"analytics.filter.search.countries": {
|
||||
"message": "国を検索..."
|
||||
"message": "国を検索…"
|
||||
},
|
||||
"analytics.filter.search.project-versions": {
|
||||
"message": "プロジェクトバージョンを検索…"
|
||||
},
|
||||
"analytics.filter.search.versions": {
|
||||
"message": "バージョンを検索…"
|
||||
},
|
||||
"analytics.graph.title.downloads": {
|
||||
"message": "ダウンロード回数の推移"
|
||||
"message": "ダウンロードの推移"
|
||||
},
|
||||
"analytics.graph.title.revenue": {
|
||||
"message": "収益の推移"
|
||||
},
|
||||
"analytics.project-event.project-approved": {
|
||||
"message": "承認完了"
|
||||
"message": "承認済み"
|
||||
},
|
||||
"analytics.project-status.approved": {
|
||||
"message": "承認済み"
|
||||
},
|
||||
"analytics.project-status.private": {
|
||||
"message": "非公開"
|
||||
},
|
||||
"analytics.project-status.unlisted": {
|
||||
"message": "限定公開"
|
||||
},
|
||||
"analytics.project.all": {
|
||||
"message": "全てのプロジェクト"
|
||||
},
|
||||
"analytics.query.label.breakdown": {
|
||||
"message": "分析"
|
||||
},
|
||||
"analytics.query.label.grouped-by": {
|
||||
"message": "時間足"
|
||||
},
|
||||
"analytics.query.label.project": {
|
||||
"message": "プロジェクト"
|
||||
},
|
||||
"analytics.query.label.timeframe": {
|
||||
"message": "期間"
|
||||
},
|
||||
"analytics.stat.downloads": {
|
||||
"message": "ダウンロード回数"
|
||||
"message": "ダウンロード"
|
||||
},
|
||||
"analytics.stat.monetization-banner.body": {
|
||||
"message": "Modrinthを通じて行われた閲覧およびダウンロードが収益の対象となります。\nまた、Webからの場合は不正防止のためのフィルターを通過する必要があり、アプリからの場合は先述のフィルターに加え、Modrinthにログインされたユーザーに限ります。\n注意として、すべてのプロジェクトにおいて、収益の対象となる操作の割合はほぼ均一に保たれるため、最終的な収益で不公平が生まれることはありません。"
|
||||
},
|
||||
"analytics.stat.monetization-banner.learn-more": {
|
||||
"message": "もっと詳しく"
|
||||
},
|
||||
"analytics.stat.monetization-banner.title": {
|
||||
"message": "収益が発生する仕組みは?"
|
||||
},
|
||||
"analytics.stat.playtime": {
|
||||
"message": "プレイ時間"
|
||||
"message": "プレイ"
|
||||
},
|
||||
"analytics.stat.playtime-hours": {
|
||||
"message": "{hours}時間"
|
||||
@@ -128,20 +230,56 @@
|
||||
"analytics.stat.unavailable": {
|
||||
"message": "N/A"
|
||||
},
|
||||
"analytics.stat.unavailable-tooltip": {
|
||||
"message": "現在のクエリでは利用不可"
|
||||
},
|
||||
"analytics.stat.views": {
|
||||
"message": "表示回数"
|
||||
"message": "表示"
|
||||
},
|
||||
"analytics.table.csv.date-range": {
|
||||
"message": "{start}から{end}"
|
||||
},
|
||||
"analytics.table.csv.header.playtime-seconds": {
|
||||
"message": "プレイ時間 (秒)"
|
||||
},
|
||||
"analytics.table.duration.days": {
|
||||
"message": "{count, number}日"
|
||||
},
|
||||
"analytics.table.duration.hours": {
|
||||
"message": "{count, number}時間"
|
||||
},
|
||||
"analytics.table.duration.minutes": {
|
||||
"message": "{count, number}分"
|
||||
},
|
||||
"analytics.table.export-csv": {
|
||||
"message": "CSVをエクスポート"
|
||||
},
|
||||
"analytics.table.pagination.summary": {
|
||||
"message": "{start}~{end}件目を表示中 (全{total}件)"
|
||||
},
|
||||
"analytics.table.search.placeholder": {
|
||||
"message": "検索..."
|
||||
"message": "検索…"
|
||||
},
|
||||
"analytics.title": {
|
||||
"message": "アナリティクス"
|
||||
},
|
||||
"analytics.value.monetized": {
|
||||
"message": "設定済み"
|
||||
"message": "発生済み"
|
||||
},
|
||||
"analytics.value.no-dependent": {
|
||||
"message": "なし"
|
||||
},
|
||||
"analytics.value.none": {
|
||||
"message": "デフォルト"
|
||||
},
|
||||
"analytics.value.other": {
|
||||
"message": "その他"
|
||||
},
|
||||
"analytics.value.unknown": {
|
||||
"message": "不明"
|
||||
},
|
||||
"analytics.value.unmonetized": {
|
||||
"message": "未設定"
|
||||
"message": "未発生"
|
||||
},
|
||||
"app-marketing.download.description": {
|
||||
"message": "我々のデスクトップアプリはすべてのプラットフォームでご利用いただけますので、ご希望のバージョンをお選びください。"
|
||||
@@ -257,6 +395,9 @@
|
||||
"app-marketing.features.performance.infinite-mb": {
|
||||
"message": "∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.infinite-times-infinite-mb": {
|
||||
"message": "∞ × ∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.less-than-150mb": {
|
||||
"message": "< 150 MB"
|
||||
},
|
||||
@@ -546,11 +687,14 @@
|
||||
"message": "送信して承認"
|
||||
},
|
||||
"conversation-thread.reply-editor.placeholder.send": {
|
||||
"message": "メッセージを送る..."
|
||||
"message": "メッセージを送る…"
|
||||
},
|
||||
"create-project-version.create-modal.stage.add-files.admonition": {
|
||||
"message": "補足ファイルはソースコードなどの支援用リソースのためのものであり、別バージョンや派生版を配布するためのものではありません。"
|
||||
},
|
||||
"create.collection.collection-info": {
|
||||
"message": "新しいコレクションは、{count, plural, =0 {空の} other {#個のプロジェクトを含む}}公開コレクションとして作成されます。"
|
||||
},
|
||||
"create.collection.create-collection": {
|
||||
"message": "コレクションを作成"
|
||||
},
|
||||
@@ -693,7 +837,7 @@
|
||||
"message": "アフィリエイトリンクを作成"
|
||||
},
|
||||
"dashboard.affiliate-links.empty.no-codes": {
|
||||
"message": "アフィリエイトコードが見つかりませんでした"
|
||||
"message": "アフィリエイトコードが見つかりませんでした。"
|
||||
},
|
||||
"dashboard.affiliate-links.error.title": {
|
||||
"message": "アフィリエイトリンクの読み込みエラー"
|
||||
@@ -713,6 +857,9 @@
|
||||
"dashboard.affiliate-links.search": {
|
||||
"message": "アフィリエイトリンクを検索…"
|
||||
},
|
||||
"dashboard.analytics.from-projects": {
|
||||
"message": "{count} 件のプロジェクトから"
|
||||
},
|
||||
"dashboard.analytics.total-downloads": {
|
||||
"message": "総ダウンロード数"
|
||||
},
|
||||
@@ -744,7 +891,7 @@
|
||||
"message": "コレクション"
|
||||
},
|
||||
"dashboard.collections.placeholder.search": {
|
||||
"message": "コレクションを検索"
|
||||
"message": "コレクションを検索…"
|
||||
},
|
||||
"dashboard.collections.sort.name-ascending": {
|
||||
"message": "名前順(昇順)"
|
||||
@@ -1016,6 +1163,9 @@
|
||||
"dashboard.notifications.link.view-history": {
|
||||
"message": "通知履歴を表示"
|
||||
},
|
||||
"dashboard.notifications.link.view-more": {
|
||||
"message": "{extraNotifs} 件の通知をさらに表示"
|
||||
},
|
||||
"dashboard.organizations.button.create": {
|
||||
"message": "組織を作成"
|
||||
},
|
||||
@@ -1025,23 +1175,41 @@
|
||||
"dashboard.organizations.error.fetch": {
|
||||
"message": "組織の取得に失敗しました"
|
||||
},
|
||||
"dashboard.organizations.member-count": {
|
||||
"message": "{count} 人のメンバー"
|
||||
},
|
||||
"dashboard.organizations.title": {
|
||||
"message": "組織"
|
||||
},
|
||||
"dashboard.overview.notifications.button.mark-all-as-read": {
|
||||
"message": "全て既読にする"
|
||||
},
|
||||
"dashboard.overview.notifications.button.view-history": {
|
||||
"message": "履歴を表示"
|
||||
},
|
||||
"dashboard.overview.notifications.history.label": {
|
||||
"message": "履歴"
|
||||
},
|
||||
"dashboard.overview.notifications.history.title": {
|
||||
"message": "通知履歴"
|
||||
},
|
||||
"dashboard.overview.notifications.loading": {
|
||||
"message": "通知を読み込み中…"
|
||||
},
|
||||
"dashboard.projects.bulk-edit-hint": {
|
||||
"message": "以下で選択することで、複数のプロジェクトを一括で編集できます"
|
||||
"message": "以下で選択することで、複数のプロジェクトを一括で編集できます。"
|
||||
},
|
||||
"dashboard.projects.bulk-edit.server-disabled": {
|
||||
"message": "サーバープロジェクトでは一括編集を利用できません"
|
||||
},
|
||||
"dashboard.projects.empty": {
|
||||
"message": "まだプロジェクトがありません。上にある緑のボタンを押して始めましょう"
|
||||
"message": "まだプロジェクトがありません。上にある緑のボタンを押して始めましょう。"
|
||||
},
|
||||
"dashboard.projects.head-title": {
|
||||
"message": "プロジェクト"
|
||||
},
|
||||
"dashboard.projects.links.and-more": {
|
||||
"message": "さらに {count} 件..."
|
||||
"message": "さらに {count} 件…"
|
||||
},
|
||||
"dashboard.projects.links.button.clear-link": {
|
||||
"message": "リンクを削除"
|
||||
@@ -1049,17 +1217,23 @@
|
||||
"dashboard.projects.links.button.edit": {
|
||||
"message": "リンクを編集"
|
||||
},
|
||||
"dashboard.projects.links.changes-applied": {
|
||||
"message": "変更は <strong>{count}</strong> 件のプロジェクトに適用されます"
|
||||
},
|
||||
"dashboard.projects.links.description": {
|
||||
"message": "下記に入力したリンクは、選択した各プロジェクトに上書きされます。空欄のままにしたリンクは無視されます。ゴミ箱ボタンを使用すると、選択したすべてのプロジェクトからリンクを削除できます。"
|
||||
},
|
||||
"dashboard.projects.links.discord-invite.description": {
|
||||
"message": "Discordサーバーへの招待リンク"
|
||||
"message": "Discordサーバーへの招待リンク。"
|
||||
},
|
||||
"dashboard.projects.links.discord-invite.label": {
|
||||
"message": "Discordの招待"
|
||||
},
|
||||
"dashboard.projects.links.header.edit": {
|
||||
"message": "リンクを編集"
|
||||
},
|
||||
"dashboard.projects.links.issue-tracker.description": {
|
||||
"message": "ユーザーがプロジェクトに関するバグ、問題、懸念事項を報告できる場所"
|
||||
"message": "ユーザーがプロジェクトに関するバグ、問題、懸念事項を報告できる場所。"
|
||||
},
|
||||
"dashboard.projects.links.issue-tracker.label": {
|
||||
"message": "問題の報告と追跡"
|
||||
@@ -1086,7 +1260,7 @@
|
||||
"message": "ウィキページ"
|
||||
},
|
||||
"dashboard.projects.notification.bulk-edit-success": {
|
||||
"message": "選択されたプロジェクトのリンクを一括編集しました"
|
||||
"message": "選択されたプロジェクトのリンクを一括編集しました。"
|
||||
},
|
||||
"dashboard.projects.project.icon-alt": {
|
||||
"message": "{title} のアイコン"
|
||||
@@ -1347,7 +1521,7 @@
|
||||
"message": "コレクションが見つかりません"
|
||||
},
|
||||
"error.generic.401.signed-in-as": {
|
||||
"message": "現在サインイン中のアカウント:"
|
||||
"message": "現在サインイン中のアカウント:"
|
||||
},
|
||||
"error.generic.401.title": {
|
||||
"message": "このページにアクセスする権限がありません"
|
||||
@@ -2360,6 +2534,9 @@
|
||||
"profile.label.collection": {
|
||||
"message": "コレクション"
|
||||
},
|
||||
"profile.label.downloads": {
|
||||
"message": "{count}件のダウンロード"
|
||||
},
|
||||
"profile.label.joined": {
|
||||
"message": "参加: "
|
||||
},
|
||||
@@ -3537,7 +3714,7 @@
|
||||
"message": "{shared}個の共有されたCPU ({bursts}個のCPUに増加)"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.not-found": {
|
||||
"message": "このサブスクリプションに対応するサーバーが見つかりませんでした。これにはいくつか説明があります。あなたがサーバーを購入してすぐの場合、これは通常であり、サーバーが提供されるまで長くて1時間かかります。しばらく前にサーバーを購入していた場合はおそらくそれ以来サーバーが停止されています。これが期待したものではない場合は、以下の情報と共にModrinth Supportにお問い合わせください。"
|
||||
"message": "このサブスクリプションに対応するサーバーが見つかりませんでした。これにはいくつか説明があります。あなたがサーバーを購入してすぐの場合、これは通常であり、サーバーが提供されるまで長くて1時間かかります。しばらく前にサーバーを購入していた場合はおそらくそれ以来サーバーが停止されています。これが期待したものではない場合は、以下の情報と共にModrinth Supportにお問い合わせください:"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.server-id": {
|
||||
"message": "サーバーID: {id}"
|
||||
|
||||
@@ -530,6 +530,9 @@
|
||||
"create-project-version.create-modal.stage.add-files.admonition": {
|
||||
"message": "보조 파일은 소스 코드와 같은 지원용 리소스를 위한 것이며, 대체 버전이나 변형을 위한 것이 아닙니다."
|
||||
},
|
||||
"create.collection.collection-info": {
|
||||
"message": "새 컬렉션은 {count, plural, =0 {프로젝트 없음} other {#개의 프로젝트}}를 포함한 공개 컬렉션으로 생성됩니다."
|
||||
},
|
||||
"create.collection.create-collection": {
|
||||
"message": "컬렉션 생성"
|
||||
},
|
||||
@@ -686,6 +689,9 @@
|
||||
"dashboard.affiliate-links.revoke-confirm.button": {
|
||||
"message": "취소"
|
||||
},
|
||||
"dashboard.affiliate-links.revoke-confirm.title": {
|
||||
"message": "'{title}' 제휴 링크를 정말 삭제하시겠습니까?"
|
||||
},
|
||||
"dashboard.affiliate-links.search": {
|
||||
"message": "제휴 링크 검색..."
|
||||
},
|
||||
@@ -998,6 +1004,9 @@
|
||||
"dashboard.notifications.link.view-history": {
|
||||
"message": "알림 기록 보기"
|
||||
},
|
||||
"dashboard.notifications.link.view-more": {
|
||||
"message": "알림 {extraNotifs}개 더 보기"
|
||||
},
|
||||
"dashboard.organizations.button.create": {
|
||||
"message": "조직 생성"
|
||||
},
|
||||
@@ -1007,6 +1016,9 @@
|
||||
"dashboard.organizations.error.fetch": {
|
||||
"message": "조직 정보 가져오기 실패"
|
||||
},
|
||||
"dashboard.organizations.member-count": {
|
||||
"message": "멤버 {count}명"
|
||||
},
|
||||
"dashboard.organizations.title": {
|
||||
"message": "조직"
|
||||
},
|
||||
@@ -1052,6 +1064,9 @@
|
||||
"dashboard.projects.links.button.edit": {
|
||||
"message": "링크 편집"
|
||||
},
|
||||
"dashboard.projects.links.changes-applied": {
|
||||
"message": "변경사항이 <strong>{count}개</strong>의 프로젝트에 적용됩니다."
|
||||
},
|
||||
"dashboard.projects.links.description": {
|
||||
"message": "아래 지정한 링크는 선택한 각 프로젝트에서 덮어쓰게 됩니다. 비워 둔 항목은 무시됩니다. 휴지통 버튼을 클릭하면 선택한 모든 프로젝트에서 링크를 삭제할 수 있습니다."
|
||||
},
|
||||
@@ -2423,6 +2438,9 @@
|
||||
"profile.meta.description-with-bio": {
|
||||
"message": "{bio} - Modrinth에서 {username}의 프로젝트 다운로드"
|
||||
},
|
||||
"profile.stats.projects-followers": {
|
||||
"message": "{count, plural, other {<stat>{count}</stat> 프로젝트 팔로워}}"
|
||||
},
|
||||
"profile.user-id": {
|
||||
"message": "사용자 ID: {id}"
|
||||
},
|
||||
@@ -2855,6 +2873,9 @@
|
||||
"project.settings.permissions.learn-more": {
|
||||
"message": "더보기"
|
||||
},
|
||||
"project.settings.permissions.search-placeholder": {
|
||||
"message": "{count}개의 {count, plural, other {외부 프로젝트}} 검색..."
|
||||
},
|
||||
"project.settings.title": {
|
||||
"message": "설정"
|
||||
},
|
||||
@@ -2867,6 +2888,12 @@
|
||||
"project.versions.title": {
|
||||
"message": "버전"
|
||||
},
|
||||
"project.versions.withheld-versions-warning.description": {
|
||||
"message": "{count, plural, other {해당 버전은}} 현재 보류 상태이며 공개되지 않았습니다. 이 모드팩 {count, plural, other {버전에}} 포함된 특정 파일들을 재배포할 수 있는 권한이 있음을 증명하는 자료를 제출해주세요."
|
||||
},
|
||||
"project.versions.withheld-versions-warning.title": {
|
||||
"message": "알 수 없는 내장 콘텐츠로 인해 일부 {count, plural, other {버전}}은 공개되지 않았습니다"
|
||||
},
|
||||
"report.already-reported": {
|
||||
"message": "이미 {title} 을(를) 신고했습니다"
|
||||
},
|
||||
|
||||
@@ -107,6 +107,9 @@
|
||||
"analytics.chart.empty.select-table-items": {
|
||||
"message": "Pilih item daripada jadual di bawah untuk menggambarkan data anda."
|
||||
},
|
||||
"analytics.chart.events.count-aria": {
|
||||
"message": "{count, plural, other {# peristiwa analitik}}"
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>: {title}"
|
||||
},
|
||||
@@ -125,6 +128,15 @@
|
||||
"analytics.chart.legend.previous-period-suffix": {
|
||||
"message": "{name} (Sblm.)"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, other {# hari}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.hours": {
|
||||
"message": "{count, plural, other {# jam}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.minutes": {
|
||||
"message": "{count, plural, other {# minit}}"
|
||||
},
|
||||
"analytics.chart.tooltip.hide-entry": {
|
||||
"message": "Sembunyikan {name} dalam graf"
|
||||
},
|
||||
@@ -293,6 +305,9 @@
|
||||
"analytics.project.all": {
|
||||
"message": "Semua projek"
|
||||
},
|
||||
"analytics.project.count": {
|
||||
"message": "{count, plural, other {# projek}}"
|
||||
},
|
||||
"analytics.project.icon-alt": {
|
||||
"message": "Ikon {name}"
|
||||
},
|
||||
@@ -350,6 +365,15 @@
|
||||
"analytics.stat.views": {
|
||||
"message": "Tontonan"
|
||||
},
|
||||
"analytics.table.duration.days": {
|
||||
"message": "{count, plural, other {# hari}}"
|
||||
},
|
||||
"analytics.table.duration.hours": {
|
||||
"message": "{count, plural, other {# jam}}"
|
||||
},
|
||||
"analytics.table.duration.minutes": {
|
||||
"message": "{count, plural, other {# minit}}"
|
||||
},
|
||||
"analytics.table.export-csv": {
|
||||
"message": "Eksport CSV"
|
||||
},
|
||||
@@ -887,6 +911,9 @@
|
||||
"create-project-version.create-modal.stage.add-files.admonition": {
|
||||
"message": "Fail tambahan adalah untuk sumber sokongan seperti kod sumber, bukan untuk versi atau varian alternatif."
|
||||
},
|
||||
"create.collection.collection-info": {
|
||||
"message": "Koleksi baharu anda akan dibuat sebagai koleksi awam dengan {count, plural, =0 {0 projek} other {# projek}}."
|
||||
},
|
||||
"create.collection.create-collection": {
|
||||
"message": "Cipta koleksi"
|
||||
},
|
||||
@@ -1046,6 +1073,9 @@
|
||||
"dashboard.affiliate-links.search": {
|
||||
"message": "Cari pautan afiliasi..."
|
||||
},
|
||||
"dashboard.analytics.from-projects": {
|
||||
"message": "daripada {count} {count, plural, other {projek}}"
|
||||
},
|
||||
"dashboard.analytics.total-downloads": {
|
||||
"message": "Jumlah muat turun"
|
||||
},
|
||||
@@ -1067,6 +1097,9 @@
|
||||
"dashboard.collections.empty.no-match-hint": {
|
||||
"message": "Cuba laraskan penapis atau istilah carian anda."
|
||||
},
|
||||
"dashboard.collections.label.projects-count": {
|
||||
"message": "{count} {countPlural, plural, other {projek}}"
|
||||
},
|
||||
"dashboard.collections.label.search-input": {
|
||||
"message": "Cari koleksi anda"
|
||||
},
|
||||
@@ -1349,6 +1382,9 @@
|
||||
"dashboard.notifications.link.view-history": {
|
||||
"message": "Lihat sejarah pemberitahuan"
|
||||
},
|
||||
"dashboard.notifications.link.view-more": {
|
||||
"message": "Lihat {extraNotifs} lagi {extraNotifs, plural, other {pemberitahuan}}"
|
||||
},
|
||||
"dashboard.organizations.button.create": {
|
||||
"message": "Cipta organisasi"
|
||||
},
|
||||
@@ -1394,6 +1430,9 @@
|
||||
"dashboard.projects.links.button.edit": {
|
||||
"message": "Sunting pautan"
|
||||
},
|
||||
"dashboard.projects.links.changes-applied": {
|
||||
"message": "Perubahan akan diterapkan kepada <strong>{count}</strong> {count, plural, other {projek}}."
|
||||
},
|
||||
"dashboard.projects.links.description": {
|
||||
"message": "Sebarang pautan yang anda nyatakan di bawah akan ditulis ganti pada setiap projek yang dipilih. Sebarang pautan yang anda biarkan kosong akan diabaikan. Anda boleh memadamkan pautan daripada semua projek yang dipilih menggunakan butang tong sampah."
|
||||
},
|
||||
@@ -2672,6 +2711,9 @@
|
||||
"muralpay.warning.wallet-address": {
|
||||
"message": "Semak semula alamat dompet anda. Dana yang dihantar ke alamat yang salah tidak boleh dipulihkan."
|
||||
},
|
||||
"organization.settings.projects.edit-links.affected-projects": {
|
||||
"message": "Pemasangan akan diterapkan kepada {count, plural, other {# projek}}."
|
||||
},
|
||||
"profile.bio.fallback.creator": {
|
||||
"message": "Seorang pencipta Modrinth."
|
||||
},
|
||||
@@ -2696,6 +2738,9 @@
|
||||
"profile.button.set-affiliate": {
|
||||
"message": "Tetapkan sebagai rakan afiliasi"
|
||||
},
|
||||
"profile.collection.projects-count": {
|
||||
"message": "{count, plural, other {# projek}}"
|
||||
},
|
||||
"profile.details.label.auth-providers": {
|
||||
"message": "Penyedia pengesahan"
|
||||
},
|
||||
@@ -2732,6 +2777,9 @@
|
||||
"profile.label.collection": {
|
||||
"message": "Koleksi"
|
||||
},
|
||||
"profile.label.downloads": {
|
||||
"message": "{count} {countPlural, plural, other {muat turun}}"
|
||||
},
|
||||
"profile.label.joined": {
|
||||
"message": "Telah menyertai"
|
||||
},
|
||||
@@ -2750,6 +2798,9 @@
|
||||
"profile.label.organizations": {
|
||||
"message": "Organisasi"
|
||||
},
|
||||
"profile.label.projects": {
|
||||
"message": "{count} {countPlural, plural, other {projek}}"
|
||||
},
|
||||
"profile.label.saving": {
|
||||
"message": "Sedang menyimpan..."
|
||||
},
|
||||
@@ -2762,6 +2813,9 @@
|
||||
"profile.official-account.bio": {
|
||||
"message": "Akaun pengguna rasmi Modrinth. Dapatkan sokongan di <support-link></support-link> atau melalui e-mel di <email></email>"
|
||||
},
|
||||
"profile.stats.projects-followers": {
|
||||
"message": "{count, plural, other {<stat>{count}</stat> pengikut projek}}"
|
||||
},
|
||||
"profile.user-id": {
|
||||
"message": "ID Pengguna: {id}"
|
||||
},
|
||||
@@ -3194,18 +3248,30 @@
|
||||
"project.settings.permissions.learn-more": {
|
||||
"message": "Ketahui lebih lanjut"
|
||||
},
|
||||
"project.settings.permissions.search-placeholder": {
|
||||
"message": "Cari {count} {count, plural, other {projek luaran}}..."
|
||||
},
|
||||
"project.settings.title": {
|
||||
"message": "Tetapan"
|
||||
},
|
||||
"project.settings.visit-dashboard": {
|
||||
"message": "Kunjungi papan pemuka projek"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "{count, plural, other {muat turun}}"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "{title} telah diarkibkan. {title} tidak akan menerima sebarang kemas kini lanjut melainkan pengarang memutuskan untuk menyaharkibkan projek."
|
||||
},
|
||||
"project.versions.title": {
|
||||
"message": "Versi"
|
||||
},
|
||||
"project.versions.withheld-versions-warning.description": {
|
||||
"message": "{count, plural, other {Versi ini}} kini ditahan dan tidak disenaraikan secara umum. Sila berikan bukti bahawa anda mempunyai kebenaran untuk mengedarkan semula fail tertentu yang disertakan dalam {count, plural, other {versi}} pek mod ini."
|
||||
},
|
||||
"project.versions.withheld-versions-warning.title": {
|
||||
"message": "{count, plural, other {Versi}} telah ditahan kerana kandungan terbenam yang tidak diketahui"
|
||||
},
|
||||
"report.already-reported": {
|
||||
"message": "Anda telah melaporkan {title}"
|
||||
},
|
||||
|
||||
@@ -8,6 +8,366 @@
|
||||
"admin.billing.error.not-found": {
|
||||
"message": "Gebruiker niet gevonden"
|
||||
},
|
||||
"analytics.action.add": {
|
||||
"message": "Toevoegen"
|
||||
},
|
||||
"analytics.action.cancel": {
|
||||
"message": "Annuleren"
|
||||
},
|
||||
"analytics.action.refresh": {
|
||||
"message": "Ververs"
|
||||
},
|
||||
"analytics.action.reset": {
|
||||
"message": "Herstel"
|
||||
},
|
||||
"analytics.breakdown.country": {
|
||||
"message": "Land"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "Download reden"
|
||||
},
|
||||
"analytics.breakdown.download-source": {
|
||||
"message": "Download bron"
|
||||
},
|
||||
"analytics.breakdown.game-version": {
|
||||
"message": "Spel versie"
|
||||
},
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "Lader"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Monetisatie"
|
||||
},
|
||||
"analytics.breakdown.project": {
|
||||
"message": "Project"
|
||||
},
|
||||
"analytics.breakdown.project-status": {
|
||||
"message": "Project status"
|
||||
},
|
||||
"analytics.breakdown.project-version": {
|
||||
"message": "Project versie"
|
||||
},
|
||||
"analytics.chart.action.show-all": {
|
||||
"message": "Allemaal laten zien"
|
||||
},
|
||||
"analytics.chart.action.show-top-eight": {
|
||||
"message": "Laat de top 8 zien"
|
||||
},
|
||||
"analytics.chart.axis.playtime-hours": {
|
||||
"message": "{hours} h"
|
||||
},
|
||||
"analytics.chart.controls.active-count": {
|
||||
"message": "{count} actief"
|
||||
},
|
||||
"analytics.chart.controls.annotations": {
|
||||
"message": "Annotatie"
|
||||
},
|
||||
"analytics.chart.controls.display": {
|
||||
"message": "Weergave"
|
||||
},
|
||||
"analytics.chart.controls.modrinth-events": {
|
||||
"message": "Modrinth evenementen"
|
||||
},
|
||||
"analytics.chart.controls.no-modrinth-events": {
|
||||
"message": "Geen Modrinth evenementen in de grafiek."
|
||||
},
|
||||
"analytics.chart.controls.no-project-events": {
|
||||
"message": "Geen project evenementen in de grafiek."
|
||||
},
|
||||
"analytics.chart.controls.previous-period": {
|
||||
"message": "Vorige periode"
|
||||
},
|
||||
"analytics.chart.controls.project-events": {
|
||||
"message": "Project evenementen"
|
||||
},
|
||||
"analytics.chart.controls.ratio": {
|
||||
"message": "Percentage"
|
||||
},
|
||||
"analytics.chart.empty.select-table-items": {
|
||||
"message": "Selecteer een element uit de tabel beneden om jouw data te visualiseren."
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>: {title}"
|
||||
},
|
||||
"analytics.chart.events.see-announcement": {
|
||||
"message": "Zie aankondiging"
|
||||
},
|
||||
"analytics.chart.render-limit.description": {
|
||||
"message": "Het laten zien van alle lijnen in de grafiek kan de pagina slomer maken."
|
||||
},
|
||||
"analytics.chart.render-limit.header": {
|
||||
"message": "Alle {count} punten in de grafiek laten zien?"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, one {# dag} other {# dagen}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.hours": {
|
||||
"message": "{count, plural, one {# uur} other {# uren}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.minutes": {
|
||||
"message": "{count, plural, one {# minuut} other {# minuten}}"
|
||||
},
|
||||
"analytics.chart.tooltip.hide-entry": {
|
||||
"message": "Verberg {name} in de grafiek"
|
||||
},
|
||||
"analytics.chart.tooltip.pinned": {
|
||||
"message": "Grafiek tooltip vastgepind"
|
||||
},
|
||||
"analytics.chart.tooltip.pinned-aria": {
|
||||
"message": "Vastgepind"
|
||||
},
|
||||
"analytics.chart.tooltip.show-entry": {
|
||||
"message": "Laat {name} in de grafiek zien"
|
||||
},
|
||||
"analytics.chart.tooltip.total": {
|
||||
"message": "Totaal"
|
||||
},
|
||||
"analytics.chart.view.area": {
|
||||
"message": "Vlak"
|
||||
},
|
||||
"analytics.chart.view.bar": {
|
||||
"message": "Staaf"
|
||||
},
|
||||
"analytics.chart.view.line": {
|
||||
"message": "Lijn"
|
||||
},
|
||||
"analytics.download-reason.modpack": {
|
||||
"message": "Modpack"
|
||||
},
|
||||
"analytics.download-reason.standalone": {
|
||||
"message": "Direct"
|
||||
},
|
||||
"analytics.download-reason.update": {
|
||||
"message": "Update"
|
||||
},
|
||||
"analytics.download-source.app": {
|
||||
"message": "Modrinth App"
|
||||
},
|
||||
"analytics.download-source.website": {
|
||||
"message": "Modrinth Website"
|
||||
},
|
||||
"analytics.downloads.suffix": {
|
||||
"message": "installaties"
|
||||
},
|
||||
"analytics.empty.no-data": {
|
||||
"message": "Geen data beschikbaar"
|
||||
},
|
||||
"analytics.empty.no-data-for-analytics": {
|
||||
"message": "Geen data beschikbaar voor analyse"
|
||||
},
|
||||
"analytics.empty.no-projects": {
|
||||
"message": "Geen projecten beschikbaar"
|
||||
},
|
||||
"analytics.empty.no-projects-for-analytics": {
|
||||
"message": "Geen projecten beschikbaar voor analyse"
|
||||
},
|
||||
"analytics.filter.game-version-type": {
|
||||
"message": "Game versie typen"
|
||||
},
|
||||
"analytics.filter.game-version-type.all": {
|
||||
"message": "Allemaal"
|
||||
},
|
||||
"analytics.filter.game-version-type.release": {
|
||||
"message": "Uitgaves"
|
||||
},
|
||||
"analytics.filter.search.countries": {
|
||||
"message": "Zoek landen..."
|
||||
},
|
||||
"analytics.filter.search.download-sources": {
|
||||
"message": "Zoek download bron..."
|
||||
},
|
||||
"analytics.filter.search.project-versions": {
|
||||
"message": "Zoek project versies..."
|
||||
},
|
||||
"analytics.filter.search.versions": {
|
||||
"message": "Zoek versies"
|
||||
},
|
||||
"analytics.graph.title.downloads": {
|
||||
"message": "Downloads Over Tijd"
|
||||
},
|
||||
"analytics.graph.title.playtime": {
|
||||
"message": "Speeltijd Over Tijd"
|
||||
},
|
||||
"analytics.graph.title.revenue": {
|
||||
"message": "Inkomsten Over Tijd"
|
||||
},
|
||||
"analytics.group-by.1h": {
|
||||
"message": "1h"
|
||||
},
|
||||
"analytics.group-by.6h": {
|
||||
"message": "6h"
|
||||
},
|
||||
"analytics.group-by.date": {
|
||||
"message": "Datum"
|
||||
},
|
||||
"analytics.group-by.day": {
|
||||
"message": "Dag"
|
||||
},
|
||||
"analytics.group-by.month": {
|
||||
"message": "Maand"
|
||||
},
|
||||
"analytics.group-by.selected.day": {
|
||||
"message": "Sorteer per dag"
|
||||
},
|
||||
"analytics.group-by.selected.hour": {
|
||||
"message": "Sorteer per uur"
|
||||
},
|
||||
"analytics.group-by.selected.month": {
|
||||
"message": "Sorteer per maand"
|
||||
},
|
||||
"analytics.group-by.selected.six-hours": {
|
||||
"message": "Sorteer per 6 uur"
|
||||
},
|
||||
"analytics.group-by.selected.week": {
|
||||
"message": "Sorteer per week"
|
||||
},
|
||||
"analytics.group-by.selected.year": {
|
||||
"message": "Sorteer per jaar"
|
||||
},
|
||||
"analytics.group-by.week": {
|
||||
"message": "Week"
|
||||
},
|
||||
"analytics.group-by.year": {
|
||||
"message": "Jaar"
|
||||
},
|
||||
"analytics.loading.fetching-results": {
|
||||
"message": "Resultaten ophalen..."
|
||||
},
|
||||
"analytics.options.loading": {
|
||||
"message": "Laden..."
|
||||
},
|
||||
"analytics.project-event.project-approved": {
|
||||
"message": "Project goedgekeurd"
|
||||
},
|
||||
"analytics.project-event.project-private": {
|
||||
"message": "Project privé gemaakt"
|
||||
},
|
||||
"analytics.project-event.project-status-changed": {
|
||||
"message": "Project status veranderd"
|
||||
},
|
||||
"analytics.project-event.project-unlisted": {
|
||||
"message": "Project verborgen"
|
||||
},
|
||||
"analytics.project-event.version-released": {
|
||||
"message": "{version} gelanceerd"
|
||||
},
|
||||
"analytics.project-event.version-uploaded": {
|
||||
"message": "Versie geüpdate"
|
||||
},
|
||||
"analytics.project-status.approved": {
|
||||
"message": "Goedgekeurd"
|
||||
},
|
||||
"analytics.project-status.archived": {
|
||||
"message": "Gearchiveerd"
|
||||
},
|
||||
"analytics.project-status.draft": {
|
||||
"message": "Concept"
|
||||
},
|
||||
"analytics.project-status.other": {
|
||||
"message": "Ander"
|
||||
},
|
||||
"analytics.project-status.private": {
|
||||
"message": "Privé"
|
||||
},
|
||||
"analytics.project-status.rejected": {
|
||||
"message": "Afgekeurd"
|
||||
},
|
||||
"analytics.project-status.unlisted": {
|
||||
"message": "Verborgen"
|
||||
},
|
||||
"analytics.project.all": {
|
||||
"message": "Alle projecten"
|
||||
},
|
||||
"analytics.project.count": {
|
||||
"message": "{count, plural, one {# project} other {# projecten}}"
|
||||
},
|
||||
"analytics.project.icon-alt": {
|
||||
"message": "{name} Icoon"
|
||||
},
|
||||
"analytics.project.select": {
|
||||
"message": "Selecteer projecten"
|
||||
},
|
||||
"analytics.project.user": {
|
||||
"message": "{username} zijn projecten"
|
||||
},
|
||||
"analytics.project.your": {
|
||||
"message": "Jouw projecten"
|
||||
},
|
||||
"analytics.query.filter.add": {
|
||||
"message": "Filter toevoegen"
|
||||
},
|
||||
"analytics.query.label.grouped-by": {
|
||||
"message": "Groepeer per"
|
||||
},
|
||||
"analytics.query.label.project": {
|
||||
"message": "Project:"
|
||||
},
|
||||
"analytics.query.label.timeframe": {
|
||||
"message": "Tijdsframe:"
|
||||
},
|
||||
"analytics.stat.downloads": {
|
||||
"message": "Installaties"
|
||||
},
|
||||
"analytics.stat.monetization-banner.learn-more": {
|
||||
"message": "Meer informatie"
|
||||
},
|
||||
"analytics.stat.monetization-banner.title": {
|
||||
"message": "Hoe werkt monetisatie?"
|
||||
},
|
||||
"analytics.stat.playtime": {
|
||||
"message": "Speeltijd"
|
||||
},
|
||||
"analytics.stat.playtime-hours": {
|
||||
"message": "{hours} uur"
|
||||
},
|
||||
"analytics.stat.revenue": {
|
||||
"message": "Inkomsten"
|
||||
},
|
||||
"analytics.stat.revenue-value": {
|
||||
"message": "${value}"
|
||||
},
|
||||
"analytics.stat.unavailable": {
|
||||
"message": "n.v.t."
|
||||
},
|
||||
"analytics.table.csv.date-range": {
|
||||
"message": "{start} tot {end}"
|
||||
},
|
||||
"analytics.table.csv.header.playtime-seconds": {
|
||||
"message": "Speeltijd (seconden)"
|
||||
},
|
||||
"analytics.table.empty.no-matching-rows": {
|
||||
"message": "Geen passende gegevens"
|
||||
},
|
||||
"analytics.table.export-csv": {
|
||||
"message": "Exporteer naar CSV"
|
||||
},
|
||||
"analytics.table.export.cumulative": {
|
||||
"message": "Cumulatief"
|
||||
},
|
||||
"analytics.table.export.grouped": {
|
||||
"message": "Gegroepeerd op {groupBy}"
|
||||
},
|
||||
"analytics.table.pagination.summary": {
|
||||
"message": "Laat {start} t/m {end} van de {total} resultaten zien"
|
||||
},
|
||||
"analytics.table.search.placeholder": {
|
||||
"message": "Zoek..."
|
||||
},
|
||||
"analytics.threshold.countries-above": {
|
||||
"message": "Landen boven"
|
||||
},
|
||||
"analytics.threshold.country-downloads-aria": {
|
||||
"message": "Land download limiet"
|
||||
},
|
||||
"analytics.threshold.projects-above": {
|
||||
"message": "Projecten boven"
|
||||
},
|
||||
"analytics.title": {
|
||||
"message": "Analytica"
|
||||
},
|
||||
"analytics.value.unknown": {
|
||||
"message": "Onbekend"
|
||||
},
|
||||
"app-marketing.download.description": {
|
||||
"message": "Ons bureaublad app is overal verkrijgbaar, kies de gewenste versie."
|
||||
},
|
||||
@@ -122,6 +482,9 @@
|
||||
"app-marketing.features.performance.infinite-mb": {
|
||||
"message": "∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.infinite-times-infinite-mb": {
|
||||
"message": "∞ × ∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.less-than-150mb": {
|
||||
"message": "< 150 MB"
|
||||
},
|
||||
@@ -162,13 +525,13 @@
|
||||
"message": "Deel modpacks"
|
||||
},
|
||||
"app-marketing.features.unlike-any-launcher": {
|
||||
"message": "Onvergelijkbaar met de concurrentie "
|
||||
"message": "Onvergelijkbaar met de concurrentie"
|
||||
},
|
||||
"app-marketing.features.website.description": {
|
||||
"message": "Modrinth App is volledig geïntegreerd met de website, zodat u vanuit de app toegang heeft tot al uw favoriete projecten!"
|
||||
},
|
||||
"app-marketing.features.website.title": {
|
||||
"message": "Website integratie "
|
||||
"message": "Website integratie"
|
||||
},
|
||||
"app-marketing.features.youve-used-before": {
|
||||
"message": "je hebt het al gezien"
|
||||
@@ -398,12 +761,114 @@
|
||||
"collection.title": {
|
||||
"message": "{name} - Collectie"
|
||||
},
|
||||
"conversation-thread.action.add-private-note": {
|
||||
"message": "Voeg privé notatie toe"
|
||||
},
|
||||
"conversation-thread.action.approve": {
|
||||
"message": "Accepteren"
|
||||
},
|
||||
"conversation-thread.action.approve-with-reply": {
|
||||
"message": "Accepteren met antwoord"
|
||||
},
|
||||
"conversation-thread.action.close-thread": {
|
||||
"message": "Sluit thread"
|
||||
},
|
||||
"conversation-thread.action.close-with-reply": {
|
||||
"message": "Sluit met antwoord"
|
||||
},
|
||||
"conversation-thread.action.reject": {
|
||||
"message": "Afkeuren"
|
||||
},
|
||||
"conversation-thread.action.reject-with-reply": {
|
||||
"message": "Afkeuren met antwoord"
|
||||
},
|
||||
"conversation-thread.action.reopen-thread": {
|
||||
"message": "Heropen thread"
|
||||
},
|
||||
"conversation-thread.action.reply": {
|
||||
"message": "Beantwoorden"
|
||||
},
|
||||
"conversation-thread.action.reply-to-thread": {
|
||||
"message": "Beantwoord thread"
|
||||
},
|
||||
"conversation-thread.action.resubmit-for-review": {
|
||||
"message": "Heropsturen voor beoordeling"
|
||||
},
|
||||
"conversation-thread.action.resubmit-for-review-with-reply": {
|
||||
"message": "Heropsturen voor beoordeling met antwoord"
|
||||
},
|
||||
"conversation-thread.action.send": {
|
||||
"message": "Versturen"
|
||||
},
|
||||
"conversation-thread.action.send-to-review": {
|
||||
"message": "Versturen naar beoordelingen"
|
||||
},
|
||||
"conversation-thread.action.send-to-review-with-reply": {
|
||||
"message": "Versturen naar beoordelingen met antwoord"
|
||||
},
|
||||
"conversation-thread.action.set-to-draft": {
|
||||
"message": "Wijzig naar concept"
|
||||
},
|
||||
"conversation-thread.action.set-to-draft-with-reply": {
|
||||
"message": "Wijzig naar concept met antwoord"
|
||||
},
|
||||
"conversation-thread.action.withhold": {
|
||||
"message": "Terughouden"
|
||||
},
|
||||
"conversation-thread.action.withhold-with-reply": {
|
||||
"message": "Terughouden met antwoord"
|
||||
},
|
||||
"conversation-thread.closed-thread.description": {
|
||||
"message": "Deze thread is gesloten en kan geen nieuwe berichten meer ontvangen."
|
||||
},
|
||||
"conversation-thread.error.closing-report": {
|
||||
"message": "Fout tijdens het sluiten van rapport"
|
||||
},
|
||||
"conversation-thread.error.reopening-report": {
|
||||
"message": "Fout tijdens het heropenen van rapport"
|
||||
},
|
||||
"conversation-thread.error.sending-message": {
|
||||
"message": "Fout tijdens het versturen van bericht"
|
||||
},
|
||||
"conversation-thread.reply-editor.placeholder.reply": {
|
||||
"message": "Reageer op het thread..."
|
||||
},
|
||||
"conversation-thread.reply-editor.placeholder.send": {
|
||||
"message": "Verstuur een bericht..."
|
||||
},
|
||||
"conversation-thread.reply-modal.confirmation.description": {
|
||||
"message": "Conformeer dat moderators hier niet actief naar kijken"
|
||||
},
|
||||
"conversation-thread.reply-modal.confirmation.label": {
|
||||
"message": "Ik erken dat de moderators deze thread niet actief monitoren."
|
||||
},
|
||||
"conversation-thread.reply-modal.description": {
|
||||
"message": "Je project is al goedgekeurd. Daarom houdt het moderatieteam deze thread niet actief in de gaten. Mocht er echter een probleem met je project zijn, dan kunnen zij je bericht wel zien."
|
||||
},
|
||||
"conversation-thread.reply-modal.header": {
|
||||
"message": "Reageer op thread"
|
||||
},
|
||||
"conversation-thread.reply-modal.help-center-note": {
|
||||
"message": "Als je contact wilt opnemen met het moderatorteam, ga dan naar het <help-center-link>Modrinth Helpcentrum</help-center-link> en klik op het blauwe ballonnetje rechtsonder om contact op te nemen met de ondersteuning."
|
||||
},
|
||||
"conversation-thread.resubmit-modal.confirmation.description": {
|
||||
"message": "Conformeer dat ik de opmerking van de moderator heb geadresseerd"
|
||||
},
|
||||
"conversation-thread.resubmit-modal.confirmation.label": {
|
||||
"message": "Ik conformeer dat ik de opmerking van de moderator heb geadresseerd."
|
||||
},
|
||||
"conversation-thread.resubmit-modal.description": {
|
||||
"message": "Je verstuurd <project-title>{projectTitle}</project-title> om opnieuw door de moderators gereviewd te laten worden."
|
||||
},
|
||||
"conversation-thread.resubmit-modal.header.resubmitting": {
|
||||
"message": "Heropsturen voor beoordeling"
|
||||
},
|
||||
"conversation-thread.resubmit-modal.header.submitting": {
|
||||
"message": "Versuur voor beoordeling"
|
||||
},
|
||||
"conversation-thread.resubmit-modal.reminder": {
|
||||
"message": "Zorg ervoor dat je alle opmerkingen van het moderatie team verwerkt hebt."
|
||||
},
|
||||
"conversation-thread.resubmit-modal.warning": {
|
||||
"message": "Herhaaldelijk berichten plaatsen zonder in te gaan op de opmerkingen van de moderators kan leiden tot een opschorting van je account."
|
||||
},
|
||||
@@ -446,6 +911,9 @@
|
||||
"create.limit-alert.limit-reached": {
|
||||
"message": "{type} limiet bereikt"
|
||||
},
|
||||
"create.limit-alert.limit-reached-description": {
|
||||
"message": "Je hebt het {type} limiet bereikt. Neem contact op met support om je limiet te verhogen."
|
||||
},
|
||||
"create.limit-alert.type-collection": {
|
||||
"message": "Collectie"
|
||||
},
|
||||
@@ -546,7 +1014,7 @@
|
||||
"message": "Publiek"
|
||||
},
|
||||
"create.project.visibility-unlisted": {
|
||||
"message": "Niet vermeld"
|
||||
"message": "Verborgen"
|
||||
},
|
||||
"dashboard.affiliate-links.create.button": {
|
||||
"message": "Maak een affiliate-link"
|
||||
@@ -572,6 +1040,12 @@
|
||||
"dashboard.analytics.from-projects": {
|
||||
"message": "van {count} {count, plural, one {project} other {projects}}"
|
||||
},
|
||||
"dashboard.analytics.total-downloads": {
|
||||
"message": "Totale downoads"
|
||||
},
|
||||
"dashboard.analytics.total-followers": {
|
||||
"message": "Totale volgers"
|
||||
},
|
||||
"dashboard.collections.button.create-new": {
|
||||
"message": "Maak nieuwe"
|
||||
},
|
||||
@@ -596,6 +1070,18 @@
|
||||
"dashboard.collections.long-title": {
|
||||
"message": "Je collecties"
|
||||
},
|
||||
"dashboard.collections.placeholder.search": {
|
||||
"message": "Zoek naar collecties..."
|
||||
},
|
||||
"dashboard.collections.sort.name-ascending": {
|
||||
"message": "Naam (A-Z)"
|
||||
},
|
||||
"dashboard.collections.sort.recently-created": {
|
||||
"message": "Recentelijk gemaakt"
|
||||
},
|
||||
"dashboard.collections.sort.recently-updated": {
|
||||
"message": "Recentelijk geüpdate"
|
||||
},
|
||||
"dashboard.creator-tax-form-modal.confirmation.download-button": {
|
||||
"message": "Download {formType}"
|
||||
},
|
||||
@@ -848,18 +1334,138 @@
|
||||
"dashboard.creator-withdraw-modal.withdraw-limit-used": {
|
||||
"message": "Je hebt je opnamelimiet <b>{withdrawLimit}</b> bereikt. Je moet een belastingformulier invullen om meer geld op te nemen."
|
||||
},
|
||||
"dashboard.discord-roles.banner.cta": {
|
||||
"message": "Verbind Discord"
|
||||
},
|
||||
"dashboard.discord-roles.banner.title": {
|
||||
"message": "Claim uw Discord rollen"
|
||||
},
|
||||
"dashboard.discord-roles.role.big-creator": {
|
||||
"message": "1M+ Downloads"
|
||||
},
|
||||
"dashboard.discord-roles.role.creator": {
|
||||
"message": "Maaker"
|
||||
},
|
||||
"dashboard.discord-roles.role.pride": {
|
||||
"message": "Pride 2026"
|
||||
},
|
||||
"dashboard.head-title": {
|
||||
"message": "Dashboard"
|
||||
},
|
||||
"dashboard.notifications.empty.no-unread": {
|
||||
"message": "U heeft geen ongelezen notificaties."
|
||||
},
|
||||
"dashboard.notifications.link.see-all": {
|
||||
"message": "Allemaal bekijken"
|
||||
},
|
||||
"dashboard.notifications.link.view-history": {
|
||||
"message": "Zie notificatie geschiedenis"
|
||||
},
|
||||
"dashboard.notifications.link.view-more": {
|
||||
"message": "Bekijk {extraNotifs} meer {extraNotifs, plural, one {notification} other {notifications}}"
|
||||
},
|
||||
"dashboard.organizations.button.create": {
|
||||
"message": "Creëer organisatie"
|
||||
},
|
||||
"dashboard.organizations.empty.cta": {
|
||||
"message": "Maak een organisatie!"
|
||||
},
|
||||
"dashboard.organizations.error.fetch": {
|
||||
"message": "Organisaties niet op kunnen halen"
|
||||
},
|
||||
"dashboard.organizations.member-count": {
|
||||
"message": "{count} {count, plural, one {member} other {members}}"
|
||||
},
|
||||
"dashboard.organizations.title": {
|
||||
"message": "Organisaties"
|
||||
},
|
||||
"dashboard.overview.notifications.button.mark-all-as-read": {
|
||||
"message": "Markeer allemaal als gelezen"
|
||||
},
|
||||
"dashboard.overview.notifications.button.view-history": {
|
||||
"message": "Geschiedenis bekijken"
|
||||
},
|
||||
"dashboard.overview.notifications.empty.no-unread": {
|
||||
"message": "U heeft geen ongelezen notificaties."
|
||||
},
|
||||
"dashboard.overview.notifications.error.loading": {
|
||||
"message": "Fout tijdens het laden van de notificaties:"
|
||||
},
|
||||
"dashboard.overview.notifications.history.label": {
|
||||
"message": "Geschiedenis"
|
||||
},
|
||||
"dashboard.overview.notifications.history.title": {
|
||||
"message": "Notificatie geschiedenis"
|
||||
},
|
||||
"dashboard.overview.notifications.loading": {
|
||||
"message": "Notificaties aan het laden..."
|
||||
},
|
||||
"dashboard.projects.bulk-edit-hint": {
|
||||
"message": "U kunt meerdere projecten tegelijkertijd bijwerken door ze hieronder te selecteren."
|
||||
},
|
||||
"dashboard.projects.bulk-edit.server-disabled": {
|
||||
"message": "Massa wijzigingen worden niet ondersteund door server projecten"
|
||||
},
|
||||
"dashboard.projects.empty": {
|
||||
"message": "U heeft nog geen projecten. Klik de groene knop hierboven om te beginnen."
|
||||
},
|
||||
"dashboard.projects.head-title": {
|
||||
"message": "Projecten"
|
||||
},
|
||||
"dashboard.projects.links.and-more": {
|
||||
"message": "en nog {count} anderen..."
|
||||
},
|
||||
"dashboard.projects.links.button.clear-link": {
|
||||
"message": "Leeg link"
|
||||
},
|
||||
"dashboard.projects.links.button.edit": {
|
||||
"message": "Wijzig link"
|
||||
},
|
||||
"dashboard.projects.links.changes-applied": {
|
||||
"message": "De wijzigingen worden toegepast op <strong>{count}</strong> {count, plural, one {project} other {projects}}."
|
||||
},
|
||||
"dashboard.projects.links.description": {
|
||||
"message": "Alle links die u hieronder opgeeft, worden in elk van de geselecteerde projecten overschreven. Links die u leeg laat, worden genegeerd. U kunt een link uit alle geselecteerde projecten verwijderen met de prullenbakknop."
|
||||
},
|
||||
"dashboard.projects.links.discord-invite.description": {
|
||||
"message": "Een uitnodigingslink naar jouw Discord server."
|
||||
},
|
||||
"dashboard.projects.links.discord-invite.label": {
|
||||
"message": "Discord uitnodiging"
|
||||
},
|
||||
"dashboard.projects.links.header.edit": {
|
||||
"message": "Wijzig linken"
|
||||
},
|
||||
"dashboard.projects.links.source-code.label": {
|
||||
"message": "Broncode"
|
||||
},
|
||||
"dashboard.projects.links.wiki-page.label": {
|
||||
"message": "Wiki pagina"
|
||||
},
|
||||
"dashboard.projects.notification.bulk-edit-success": {
|
||||
"message": "Alle links van de geselecteerde projecten zijn geüpdate."
|
||||
},
|
||||
"dashboard.projects.project.icon-alt": {
|
||||
"message": "Icoon voor {title}"
|
||||
},
|
||||
"dashboard.projects.project.moderator-message-aria": {
|
||||
"message": "Dit project heeft een bericht van de moderators. Bekijk het project voor meer informatie."
|
||||
},
|
||||
"dashboard.projects.project.review-environment-metadata": {
|
||||
"message": "Controller project metadata alstublieft"
|
||||
},
|
||||
"dashboard.projects.sort.option.name": {
|
||||
"message": "Naam"
|
||||
},
|
||||
"dashboard.projects.sort.option.status": {
|
||||
"message": "Status"
|
||||
},
|
||||
"dashboard.projects.table.name": {
|
||||
"message": "Naam"
|
||||
},
|
||||
"dashboard.projects.table.status": {
|
||||
"message": "Status"
|
||||
},
|
||||
"dashboard.revenue.available-now": {
|
||||
"message": "Nu beschikbaar"
|
||||
},
|
||||
@@ -1329,7 +1935,7 @@
|
||||
"message": "Krijg gedetailleerde overzichten over paginaweergaven, aantal downloads en inkomsten"
|
||||
},
|
||||
"landing.creator.feature.data-statistics.title": {
|
||||
"message": "Cijfers en Statistieken "
|
||||
"message": "Cijfers en Statistieken"
|
||||
},
|
||||
"landing.creator.feature.discovery.description": {
|
||||
"message": "Word ontdekt door duizenden gebruikers door middel van zoekresultaten, onze startpagina, Discord server, en nog veel meer mogelijkheden in de toekomst!"
|
||||
@@ -1347,7 +1953,7 @@
|
||||
"message": "Krijg advertentie geld van jouw project paginas, en neem je winst op elk moment op."
|
||||
},
|
||||
"landing.creator.feature.monetization.title": {
|
||||
"message": "Maak jouw projecten te gelden"
|
||||
"message": "Monetisatie"
|
||||
},
|
||||
"landing.creator.feature.team-management.description": {
|
||||
"message": "Nodig je teamleden uit en beheer rollen en machtigingen eenvoudig"
|
||||
@@ -2327,6 +2933,15 @@
|
||||
"project.license.title": {
|
||||
"message": "Licentie"
|
||||
},
|
||||
"project.moderation.admonition.approved.body.unlisted": {
|
||||
"message": "Jouw project is verborgen. Dit betekend dat het alleen beschikbaar is via een directe link en niet vindbaar is op Modrinth."
|
||||
},
|
||||
"project.moderation.admonition.withheld.body": {
|
||||
"message": "Jouw project wordt niet publiek weergegeven en kan alleen benaderd worden via een directe link. {requestedStatus, select, unlisted { Gebaseerd op jouw geselecteerde <visibility-settings-link>zichtbaarheidsinstelling</visibility-settings-link> hoeft u waarschijnlijk geen verdere actie te ondernemen.} other { Verbeter alstublieft alle gekregen punten en de hieronder genoteerde problemen voordat u dit project opnieuw inzend.}}"
|
||||
},
|
||||
"project.moderation.admonition.withheld.header": {
|
||||
"message": "Verborgen door moderator"
|
||||
},
|
||||
"project.moderation.title": {
|
||||
"message": "Moderatie"
|
||||
},
|
||||
@@ -2394,7 +3009,7 @@
|
||||
"message": "Instellingen"
|
||||
},
|
||||
"project.settings.visit-dashboard": {
|
||||
"message": "Bezoek dashboard van het project"
|
||||
"message": "Bezoek het project dashboard"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "{title} is gearchiveerd. {title} zal geen verdere updates krijgen tenzij de auteur het project de-archiveerd."
|
||||
|
||||
@@ -23,6 +23,15 @@
|
||||
"analytics.breakdown.country": {
|
||||
"message": "Kraj"
|
||||
},
|
||||
"analytics.breakdown.dependent-on": {
|
||||
"message": "Wymaga"
|
||||
},
|
||||
"analytics.breakdown.dependent-project-download": {
|
||||
"message": "Wymagany projekt"
|
||||
},
|
||||
"analytics.breakdown.dependent-project-type": {
|
||||
"message": "Rodzaj wymaganego projektu"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "Powód pobrania"
|
||||
},
|
||||
@@ -38,6 +47,9 @@
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "Loader"
|
||||
},
|
||||
"analytics.breakdown.members": {
|
||||
"message": "Członek"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Monetyzacja"
|
||||
},
|
||||
@@ -107,15 +119,24 @@
|
||||
"analytics.chart.empty.select-table-items": {
|
||||
"message": "Wybierz coś w tabeli poniżej, by wizualizować dane."
|
||||
},
|
||||
"analytics.chart.events.count-aria": {
|
||||
"message": "{count, plural, one {# wydarzenie analityczne} few {# wydarzenia analityczne} other {# wydarzeń analitycznych}}"
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>: {title}"
|
||||
},
|
||||
"analytics.chart.events.see-announcement": {
|
||||
"message": "Pokaż ogłoszenie"
|
||||
},
|
||||
"analytics.chart.legend.monetization-details.aria": {
|
||||
"message": "Pokaż szczegóły analityki monetyzacji"
|
||||
},
|
||||
"analytics.chart.legend.monetization-details.description": {
|
||||
"message": "Tylko wyświetlenia i pobrania z Modrinth liczą się do monetyzacji, gdzie pobrania wymagają, że użytkownik jest zalogowany."
|
||||
},
|
||||
"analytics.chart.legend.monetization-details.title": {
|
||||
"message": "Szczegóły analityki monetyzacji"
|
||||
},
|
||||
"analytics.chart.legend.previous-period-suffix": {
|
||||
"message": "{name} (poprz.)"
|
||||
},
|
||||
@@ -125,12 +146,39 @@
|
||||
"analytics.chart.render-limit.header": {
|
||||
"message": "Pokazać wszystkie {count} linii na wykresie?"
|
||||
},
|
||||
"analytics.chart.table-selection.all": {
|
||||
"message": "Pokazano {itemType, select, project {{count, plural, one {projekt} other {wszystkie projekty}}} country {{count, plural, one {kraj} other {wszystkie kraje}}} monetization {{count, plural, one {wartość z monetyzacji} other {wszystkie wartości z monetyzacji}}} downloadSource {{count, plural, one {żródło pobrań} other {wszystkie źródła pobrań}}} downloadReason {{count, plural, one {powód pobrań} other {wszystkie powody pobrań}}} member {{count, plural, one {członek} other {wszystkich członków}}} projectVersion {{count, plural, one {wersję projektu} other {wszystkie wersje projektu}}} loader {{count, plural, one {loader} other {wszystkie loadery}}} gameVersion {{count, plural, one {wersję gry} other {wszystkie wersje gry}}} other {{count, plural, one {pozycję} other {wszystkie pozycje}}}} z tabeli"
|
||||
},
|
||||
"analytics.chart.table-selection.count": {
|
||||
"message": "Pokazano {count} {itemType, select, project {{count, plural, one {projekt} few {projekty} other {projektów}}} country {{count, plural, one {kraj} few {kraje} other {krajów}}} monetization {{count, plural, one {wartość z monetyzacji} other {wartości z monetyzacji}}} downloadSource {{count, plural, one {żródło pobrań} few {źródła pobrań} other {źródeł pobrań}}} downloadReason {{count, plural, one {powód pobrań} few {powody pobrań} other {powodów pobrań}}} member {{count, plural, one {członka} other {członków}}} projectVersion {{count, plural, one {wersję projektu} few {wersje projektu} other {wersji projektu}}} loader {{count, plural, one {loader} few {loadery} other {loaderów}}} gameVersion {{count, plural, one {wersję gry} few {wersje gry} other {wersji gry}}} other {{count, plural, one {pozycję} few {pozycje} other {pozycji}}}} z tabeli"
|
||||
},
|
||||
"analytics.chart.table-selection.limited": {
|
||||
"message": "Pokazano {limit} {itemType, select, project {{limit, plural, one {projekt} few {projekty} other {projektów}}} country {{limit, plural, one {kraj} few {kraje} other {krajów}}} monetization {{limit, plural, one {wartość z monetyzacji} other {wartości z monetyzacji}}} downloadSource {{limit, plural, one {żródło pobrań} few {źródła pobrań} other {źródeł pobrań}}} downloadReason {{limit, plural, one {powód pobrań} few {powody pobrań} other {powodów pobrań}}} member {{limit, plural, one {członka} other {członków}}} projectVersion {{limit, plural, one {wersję projektu} few {wersje projektu} other {wersji projektu}}} loader {{limit, plural, one {loader} few {loadery} other {loaderów}}} gameVersion {{limit, plural, one {wersję gry} few {wersje gry} other {wersji gry}}} other {{limit, plural, one {pozycję} few {pozycje} other {pozycji}}}} z tabeli"
|
||||
},
|
||||
"analytics.chart.table-selection.top": {
|
||||
"message": "Pokazano top {count} {itemType, select, project {{count, plural, one {projekt} few {projekty} other {projektów}}} country {{count, plural, one {kraj} few {kraje} other {krajów}}} monetization {{count, plural, one {wartość z monetyzacji} other {wartości z monetyzacji}}} downloadSource {{count, plural, one {żródło pobrań} few {źródła pobrań} other {źródeł pobrań}}} downloadReason {{count, plural, one {powód pobrań} few {powody pobrań} other {powodów pobrań}}} member {{count, plural, one {członka} other {członków}}} projectVersion {{count, plural, one {wersję projektu} few {wersje projektu} other {wersji projektu}}} loader {{count, plural, one {loader} few {loadery} other {loaderów}}} gameVersion {{count, plural, one {wersję gry} few {wersje gry} other {wersji gry}}} other {{count, plural, one {pozycję} few {pozycje} other {pozycji}}}} z tabeli"
|
||||
},
|
||||
"analytics.chart.tooltip.dependent-on-project": {
|
||||
"message": "Wymaga {project}"
|
||||
},
|
||||
"analytics.chart.tooltip.dependent-project-version": {
|
||||
"message": "{dependentProject} wymaga {dependencyProject}, {version}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, one {# dzień} other {# dni}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.hours": {
|
||||
"message": "{count, plural, one {# godzina} few {# godziny} other {# godzin}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.minutes": {
|
||||
"message": "{count, plural, one {# minuta} few {# minuty} other {# minut}}"
|
||||
},
|
||||
"analytics.chart.tooltip.hide-entry": {
|
||||
"message": "Ukryj {name} na wykresie"
|
||||
},
|
||||
"analytics.chart.tooltip.pinned": {
|
||||
"message": "Przypięto informacje"
|
||||
},
|
||||
"analytics.chart.tooltip.pinned-aria": {
|
||||
"message": "Przypięte"
|
||||
},
|
||||
@@ -200,15 +248,33 @@
|
||||
"analytics.filter.search.countries": {
|
||||
"message": "Szukaj kraju..."
|
||||
},
|
||||
"analytics.filter.search.dependent-projects": {
|
||||
"message": "Szukaj projektów..."
|
||||
},
|
||||
"analytics.filter.search.download-sources": {
|
||||
"message": "Szukaj źródeł pobrań..."
|
||||
},
|
||||
"analytics.filter.search.members": {
|
||||
"message": "Szukaj członków..."
|
||||
},
|
||||
"analytics.filter.search.project-versions": {
|
||||
"message": "Szukaj wersji projektu..."
|
||||
},
|
||||
"analytics.filter.search.versions": {
|
||||
"message": "Szukaj wersji..."
|
||||
},
|
||||
"analytics.graph.title.downloads": {
|
||||
"message": "Pobrania w czasie"
|
||||
},
|
||||
"analytics.graph.title.playtime": {
|
||||
"message": "Czas gry w czasie"
|
||||
},
|
||||
"analytics.graph.title.revenue": {
|
||||
"message": "Przychody w czasie"
|
||||
},
|
||||
"analytics.graph.title.views": {
|
||||
"message": "Wyświetlenia w czasie"
|
||||
},
|
||||
"analytics.group-by.1h": {
|
||||
"message": "1 godz"
|
||||
},
|
||||
@@ -299,6 +365,9 @@
|
||||
"analytics.project.all": {
|
||||
"message": "Wszystkie projekty"
|
||||
},
|
||||
"analytics.project.count": {
|
||||
"message": "{count, plural, one {# projekt} few {# projekty} other {# projektów}}"
|
||||
},
|
||||
"analytics.project.icon-alt": {
|
||||
"message": "Ikona {name}"
|
||||
},
|
||||
@@ -344,6 +413,12 @@
|
||||
"analytics.stat.playtime-hours": {
|
||||
"message": "{hours} godz"
|
||||
},
|
||||
"analytics.stat.previous-period-comparison": {
|
||||
"message": "W porównaniu z poprzednim okresem"
|
||||
},
|
||||
"analytics.stat.previous-period-comparison-short": {
|
||||
"message": "W porównaniu z poprzednim"
|
||||
},
|
||||
"analytics.stat.revenue": {
|
||||
"message": "Przychód"
|
||||
},
|
||||
@@ -362,6 +437,9 @@
|
||||
"analytics.table.csv.date-range": {
|
||||
"message": "Od {start} do {end}"
|
||||
},
|
||||
"analytics.table.csv.filename": {
|
||||
"message": "Analityka Modrinth - {breakdown} - {dateRange}"
|
||||
},
|
||||
"analytics.table.csv.header.playtime-seconds": {
|
||||
"message": "Czas gry (w sekundach)"
|
||||
},
|
||||
@@ -371,6 +449,15 @@
|
||||
"analytics.table.duration.days": {
|
||||
"message": "{count, plural, one {# dzień} other {# dni}}"
|
||||
},
|
||||
"analytics.table.duration.hours": {
|
||||
"message": "{count, plural, one {# godzina} few {# godziny} other {# godzin}}"
|
||||
},
|
||||
"analytics.table.duration.minutes": {
|
||||
"message": "{count, plural, one {# minuta} few {# minuty} other {# minut}}"
|
||||
},
|
||||
"analytics.table.empty.no-matching-rows": {
|
||||
"message": "Brak pasujących wierszy analiz"
|
||||
},
|
||||
"analytics.table.export-csv": {
|
||||
"message": "Eksportuj jako CSV"
|
||||
},
|
||||
@@ -384,7 +471,7 @@
|
||||
"message": "Pokazano od {start} do {end} z {total}"
|
||||
},
|
||||
"analytics.table.search.placeholder": {
|
||||
"message": "Wyszukaj..."
|
||||
"message": "Szukaj..."
|
||||
},
|
||||
"analytics.threshold.countries-above": {
|
||||
"message": "Kraje powyżej"
|
||||
@@ -416,6 +503,12 @@
|
||||
"analytics.value.monetized": {
|
||||
"message": "Monetyzowane"
|
||||
},
|
||||
"analytics.value.no-dependent": {
|
||||
"message": "Żadne"
|
||||
},
|
||||
"analytics.value.no-dependent-tooltip": {
|
||||
"message": "Pobrano z innych powodów poza byciem wymaganym"
|
||||
},
|
||||
"analytics.value.none": {
|
||||
"message": "Brak"
|
||||
},
|
||||
@@ -678,10 +771,10 @@
|
||||
"message": "Zresetuj swoje hasło"
|
||||
},
|
||||
"auth.sign-in.2fa.description": {
|
||||
"message": "Wprowadź otrzymany kod 2FA, aby kontynuować."
|
||||
"message": "Wprowadź otrzymany kod, aby kontynuować."
|
||||
},
|
||||
"auth.sign-in.2fa.label": {
|
||||
"message": "Wprowadź otrzymany kod 2FA"
|
||||
"message": "Wprowadź otrzymany kod"
|
||||
},
|
||||
"auth.sign-in.2fa.placeholder": {
|
||||
"message": "Wprowadź kod..."
|
||||
@@ -1130,6 +1223,9 @@
|
||||
"dashboard.collections.empty.no-match-hint": {
|
||||
"message": "Spróbuj zmienić filtry wyszukiwania lub zapytanie."
|
||||
},
|
||||
"dashboard.collections.label.projects-count": {
|
||||
"message": "{count} {countPlural, plural, one {projekt} few {projekty} other {projektów}}"
|
||||
},
|
||||
"dashboard.collections.label.search-input": {
|
||||
"message": "Szukaj swoich kolekcji"
|
||||
},
|
||||
@@ -1430,6 +1526,9 @@
|
||||
"dashboard.notifications.link.view-history": {
|
||||
"message": "Pokaż historię powiadomień"
|
||||
},
|
||||
"dashboard.notifications.link.view-more": {
|
||||
"message": "Pokaż jeszcze {extraNotifs} {extraNotifs, plural, one {powiadomienie} few {powiadomienia} other {powiadomień}}"
|
||||
},
|
||||
"dashboard.organizations.button.create": {
|
||||
"message": "Utwórz organizację"
|
||||
},
|
||||
@@ -1727,6 +1826,9 @@
|
||||
"dashboard.withdraw.error.email-verification.title": {
|
||||
"message": "Wymagana weryfikacja e-maila"
|
||||
},
|
||||
"dashboard.withdraw.error.generic.text": {
|
||||
"message": "Nie udało się przesłać prośby o wypłatę, sprawdź podane dane lub skontaktuj się z obsługą"
|
||||
},
|
||||
"dashboard.withdraw.error.generic.title": {
|
||||
"message": "Wypłata nie powiodła się"
|
||||
},
|
||||
@@ -2240,6 +2342,9 @@
|
||||
"landing.subheading": {
|
||||
"message": "Odkrywaj, graj i udostępniaj treści Minecraft poprzez naszą otwartoźródłową platformę, stworzoną dla społeczności."
|
||||
},
|
||||
"layout.action.analytics-events": {
|
||||
"message": "Wydarzenia analityczne"
|
||||
},
|
||||
"layout.action.change-theme": {
|
||||
"message": "Zmień motyw"
|
||||
},
|
||||
@@ -2816,6 +2921,9 @@
|
||||
"profile.button.set-affiliate": {
|
||||
"message": "Ustaw jako afiliację"
|
||||
},
|
||||
"profile.collection.projects-count": {
|
||||
"message": "{count, plural, one {# projekt} few {# projekty} other {# projektów}}"
|
||||
},
|
||||
"profile.details.label.auth-providers": {
|
||||
"message": "Dostawcy uwierzytelniania"
|
||||
},
|
||||
@@ -2852,6 +2960,9 @@
|
||||
"profile.label.collection": {
|
||||
"message": "Kolekcja"
|
||||
},
|
||||
"profile.label.downloads": {
|
||||
"message": "{count} {countPlural, plural, one {pobranie} few {pobrania} other {pobrań}}"
|
||||
},
|
||||
"profile.label.joined": {
|
||||
"message": "Dołączył(-a)"
|
||||
},
|
||||
@@ -2870,6 +2981,9 @@
|
||||
"profile.label.organizations": {
|
||||
"message": "Organizacje"
|
||||
},
|
||||
"profile.label.projects": {
|
||||
"message": "{count} {countPlural, plural, one {projekt} few {projekty} other {projektów}}"
|
||||
},
|
||||
"profile.label.saving": {
|
||||
"message": "Zapisywanie..."
|
||||
},
|
||||
@@ -2903,6 +3017,9 @@
|
||||
"project-member-header.invitation-title": {
|
||||
"message": "Zaproszenie do dołączenia do projektu"
|
||||
},
|
||||
"project-member-header.invitation-with-role": {
|
||||
"message": "Zostałeś zaproszony do udziału w tym projekcie w roli '{role}''."
|
||||
},
|
||||
"project-member-header.success-decline": {
|
||||
"message": "Odrzucono zaproszenie do zespołu"
|
||||
},
|
||||
@@ -3323,6 +3440,9 @@
|
||||
"project.settings.visit-dashboard": {
|
||||
"message": "Odwiedź pulpit projektów"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "{count, plural, one {pobranie} few {pobrania} other {pobrań}}"
|
||||
},
|
||||
"project.stats.followers-label": {
|
||||
"message": "{count, plural, one {obserwujący} other {obserwujących}}"
|
||||
},
|
||||
@@ -3417,7 +3537,7 @@
|
||||
"message": "Wyślij zgłoszenie"
|
||||
},
|
||||
"scopes.analytics.description": {
|
||||
"message": "Dostęp do danych analityki"
|
||||
"message": "Dostęp do danych analitycznych"
|
||||
},
|
||||
"scopes.analytics.label": {
|
||||
"message": "Odczytywanie danych analitycznych"
|
||||
@@ -3435,7 +3555,7 @@
|
||||
"message": "Organizacje"
|
||||
},
|
||||
"scopes.category.pats": {
|
||||
"message": "Tokeny dostępu"
|
||||
"message": "Klucze dostępu osobistego"
|
||||
},
|
||||
"scopes.category.payouts": {
|
||||
"message": "Wypłaty"
|
||||
@@ -3477,19 +3597,19 @@
|
||||
"message": "Odczytywanie kolekcji"
|
||||
},
|
||||
"scopes.collectionWrite.description": {
|
||||
"message": "Modyfikowanie kolekcji"
|
||||
"message": "Edytowanie kolekcji"
|
||||
},
|
||||
"scopes.collectionWrite.label": {
|
||||
"message": "Pisz kolekcje"
|
||||
"message": "Edytowanie kolekcji"
|
||||
},
|
||||
"scopes.notificationRead.description": {
|
||||
"message": "Odczytywanie twoich powiadomień"
|
||||
"message": "Odczytywanie Twoich powiadomień"
|
||||
},
|
||||
"scopes.notificationRead.label": {
|
||||
"message": "Odczytywanie powiadomień"
|
||||
},
|
||||
"scopes.notificationWrite.description": {
|
||||
"message": "Usuń/Wyświetl swoje powiadomienia"
|
||||
"message": "Usuwanie/odczytywanie Twoich powiadomień"
|
||||
},
|
||||
"scopes.notificationWrite.label": {
|
||||
"message": "Pisz powiadomienia"
|
||||
@@ -3507,46 +3627,58 @@
|
||||
"message": "Usuwanie organizacji"
|
||||
},
|
||||
"scopes.organizationRead.description": {
|
||||
"message": "Odczytaj organizacje"
|
||||
"message": "Odczytywanie organizacji"
|
||||
},
|
||||
"scopes.organizationRead.label": {
|
||||
"message": "Odczytaj organizacje"
|
||||
"message": "Odczytywanie organizacji"
|
||||
},
|
||||
"scopes.organizationWrite.description": {
|
||||
"message": "Napisz do organizacji"
|
||||
"message": "Edytowanie organizacji"
|
||||
},
|
||||
"scopes.organizationWrite.label": {
|
||||
"message": "Napisz organizacje"
|
||||
"message": "Edytowanie organizacji"
|
||||
},
|
||||
"scopes.patCreate.description": {
|
||||
"message": "Tworzenie kluczy dostępu osobistego"
|
||||
},
|
||||
"scopes.patCreate.label": {
|
||||
"message": "Tworzenie PATów"
|
||||
"message": "Tworzenie kluczy dostępu osobistego"
|
||||
},
|
||||
"scopes.patDelete.description": {
|
||||
"message": "Usuwanie kluczy dostępu osobistego"
|
||||
},
|
||||
"scopes.patDelete.label": {
|
||||
"message": "Usuwanie PATów"
|
||||
"message": "Usuwanie kluczy dostępu osobistego"
|
||||
},
|
||||
"scopes.patRead.description": {
|
||||
"message": "Odczytywanie kluczy dostępu osobistego"
|
||||
},
|
||||
"scopes.patRead.label": {
|
||||
"message": "Odczytywanie PATów"
|
||||
"message": "Odczytywanie kluczy dostępu osobistego"
|
||||
},
|
||||
"scopes.patWrite.description": {
|
||||
"message": "Edytowanie kluczy dostępu osobistego"
|
||||
},
|
||||
"scopes.patWrite.label": {
|
||||
"message": "Napisz PAT"
|
||||
"message": "Edytowanie kluczy dostępu osobistego"
|
||||
},
|
||||
"scopes.payoutsRead.description": {
|
||||
"message": "Przeczytaj dane dotyczące wypłat"
|
||||
"message": "Odczytywanie danych wypłat"
|
||||
},
|
||||
"scopes.payoutsRead.label": {
|
||||
"message": "Przeczytaj wypłaty"
|
||||
"message": "Odczytywanie wypłat"
|
||||
},
|
||||
"scopes.payoutsWrite.description": {
|
||||
"message": "Wypłać pieniądze"
|
||||
"message": "Wypłacanie pieniędzy"
|
||||
},
|
||||
"scopes.payoutsWrite.label": {
|
||||
"message": "Napisz Wypłaty"
|
||||
"message": "Zarządzanie wypłatami"
|
||||
},
|
||||
"scopes.performAnalytics.description": {
|
||||
"message": "Wykonuj działania analityczne"
|
||||
"message": "Wykonywanie działań analitycznych"
|
||||
},
|
||||
"scopes.performAnalytics.label": {
|
||||
"message": "Przeprowadź analizę"
|
||||
"message": "Przeprowadzanie analityki"
|
||||
},
|
||||
"scopes.projectCreate.description": {
|
||||
"message": "Tworzenie nowych projektów"
|
||||
@@ -3555,22 +3687,22 @@
|
||||
"message": "Tworzenie projektów"
|
||||
},
|
||||
"scopes.projectDelete.description": {
|
||||
"message": "Usuń swoje projekty"
|
||||
"message": "Usuwanie Twoich projektów"
|
||||
},
|
||||
"scopes.projectDelete.label": {
|
||||
"message": "Usuwanie projektów"
|
||||
},
|
||||
"scopes.projectRead.description": {
|
||||
"message": "Przeczytaj wszystkie swoje projekty"
|
||||
"message": "Odczytywanie wszystkich Twoich projektów"
|
||||
},
|
||||
"scopes.projectRead.label": {
|
||||
"message": "Przeczytaj projekty"
|
||||
"message": "Odczytywanie projektów"
|
||||
},
|
||||
"scopes.projectWrite.description": {
|
||||
"message": "Zapisz dane projektu"
|
||||
"message": "Edytowanie danych projektu"
|
||||
},
|
||||
"scopes.projectWrite.label": {
|
||||
"message": "Pisz projekty"
|
||||
"message": "Edytowanie projektów"
|
||||
},
|
||||
"scopes.reportCreate.description": {
|
||||
"message": "Tworzenie zgłoszeń"
|
||||
@@ -3579,22 +3711,22 @@
|
||||
"message": "Tworzenie zgłoszeń"
|
||||
},
|
||||
"scopes.reportDelete.description": {
|
||||
"message": "Usuń raporty"
|
||||
"message": "Usuwanie zgłoszeń"
|
||||
},
|
||||
"scopes.reportDelete.label": {
|
||||
"message": "Usuń raporty"
|
||||
"message": "Usuwanie zgłoszeń"
|
||||
},
|
||||
"scopes.reportRead.description": {
|
||||
"message": "Przeczytaj raporty"
|
||||
"message": "Odczytywanie zgłoszeń"
|
||||
},
|
||||
"scopes.reportRead.label": {
|
||||
"message": "Przeczytaj raporty"
|
||||
"message": "Odczytywanie zgłoszeń"
|
||||
},
|
||||
"scopes.reportWrite.description": {
|
||||
"message": "Edytuj raporty"
|
||||
"message": "Edytowanie zgłoszeń"
|
||||
},
|
||||
"scopes.reportWrite.label": {
|
||||
"message": "Napisz raporty"
|
||||
"message": "Edytowanie zgłoszeń"
|
||||
},
|
||||
"scopes.sessionAccess.description": {
|
||||
"message": "Dostęp do sesji wydanych przez Modrinth"
|
||||
@@ -3606,79 +3738,79 @@
|
||||
"message": "Usuwanie sesji"
|
||||
},
|
||||
"scopes.sessionDelete.label": {
|
||||
"message": "Usuń sesje"
|
||||
"message": "Usuwanie sesji"
|
||||
},
|
||||
"scopes.sessionRead.description": {
|
||||
"message": "Przeczytaj aktywne sesje"
|
||||
"message": "Odczytywanie aktywnych sesji"
|
||||
},
|
||||
"scopes.sessionRead.label": {
|
||||
"message": "Przeczytaj sesje"
|
||||
"message": "Odczytywanie sesji"
|
||||
},
|
||||
"scopes.threadRead.description": {
|
||||
"message": "Przeczytaj wątki"
|
||||
"message": "Odczytywanie wątków"
|
||||
},
|
||||
"scopes.threadRead.label": {
|
||||
"message": "Przeczytaj wątki"
|
||||
"message": "Odczytywanie wątków"
|
||||
},
|
||||
"scopes.threadWrite.description": {
|
||||
"message": "Napisz do wątków"
|
||||
"message": "Pisanie do wątków"
|
||||
},
|
||||
"scopes.threadWrite.label": {
|
||||
"message": "Napisz wątki"
|
||||
"message": "Pisanie do wątków"
|
||||
},
|
||||
"scopes.userAuthWrite.description": {
|
||||
"message": "Zmodyfikuj swoje dane uwierzytelniające"
|
||||
"message": "Edytowanie twoich danych uwierzytelniania"
|
||||
},
|
||||
"scopes.userAuthWrite.label": {
|
||||
"message": "Zapisz dane autoryzacyjne"
|
||||
"message": "Edytowanie danych uwierzytelniania"
|
||||
},
|
||||
"scopes.userDelete.description": {
|
||||
"message": "Usuń swoje konto"
|
||||
"message": "Usuwanie Twojego konta"
|
||||
},
|
||||
"scopes.userDelete.label": {
|
||||
"message": "Usuń swoje konto"
|
||||
"message": "Usuwanie Twojego konta"
|
||||
},
|
||||
"scopes.userRead.description": {
|
||||
"message": "Dostęp do informacji w publicznym profilu"
|
||||
},
|
||||
"scopes.userRead.label": {
|
||||
"message": "Odczyt danych użytkownika"
|
||||
"message": "Odczytywanie danych użytkownika"
|
||||
},
|
||||
"scopes.userReadEmail.description": {
|
||||
"message": "Przeczytaj swoją wiadomość e-mail"
|
||||
"message": "Odczytywanie twoich wiadomości e-mail"
|
||||
},
|
||||
"scopes.userReadEmail.label": {
|
||||
"message": "Przeczytaj e-maila użytkownika"
|
||||
"message": "Odczytywanie wiadomości e-mail"
|
||||
},
|
||||
"scopes.userWrite.description": {
|
||||
"message": "Napisz do swojego profilu"
|
||||
"message": "Pisanie na Twoim profilu"
|
||||
},
|
||||
"scopes.userWrite.label": {
|
||||
"message": "Zapisz dane użytkownika"
|
||||
"message": "Edytowanie danych użytkownika"
|
||||
},
|
||||
"scopes.versionCreate.description": {
|
||||
"message": "Utwórz nowe wersje"
|
||||
"message": "Tworzenie nowych wersji"
|
||||
},
|
||||
"scopes.versionCreate.label": {
|
||||
"message": "Twórz wersje"
|
||||
"message": "Tworzenie wersji"
|
||||
},
|
||||
"scopes.versionDelete.description": {
|
||||
"message": "Usuń wersję"
|
||||
"message": "Usuwanie wersji"
|
||||
},
|
||||
"scopes.versionDelete.label": {
|
||||
"message": "Usuń wersje"
|
||||
"message": "Usuwanie wersji"
|
||||
},
|
||||
"scopes.versionRead.description": {
|
||||
"message": "Przeczytaj wszystkie wersje"
|
||||
"message": "Odczytywanie wszystkich wersji"
|
||||
},
|
||||
"scopes.versionRead.label": {
|
||||
"message": "Przeczytaj wersje"
|
||||
"message": "Odczytywanie wersji"
|
||||
},
|
||||
"scopes.versionWrite.description": {
|
||||
"message": "Zapisz dane wersji"
|
||||
"message": "Edytowanie danych wersji"
|
||||
},
|
||||
"scopes.versionWrite.label": {
|
||||
"message": "Napisz wersje"
|
||||
"message": "Edytowanie wersji"
|
||||
},
|
||||
"search.filter.game-version-shader-message": {
|
||||
"message": "Paczki shaderów stworzone dla starszych wersji najprawdopodobniej będą działać na nowszych wersjach z pomniejszymi błędami."
|
||||
@@ -3734,6 +3866,9 @@
|
||||
"servers.plan.small.description": {
|
||||
"message": "Idealny dla 1–5 przyjaciół z kilkoma lekkimi modami."
|
||||
},
|
||||
"servers.purchase.step.plan.billed": {
|
||||
"message": "naliczane {interval, select, monthly {miesięcznie} quarterly {co kwartał} yearly {rocznie} other {{interval}}}"
|
||||
},
|
||||
"settings.account.button.complete-setup": {
|
||||
"message": "Zakończ ustawianie"
|
||||
},
|
||||
@@ -3888,14 +4023,20 @@
|
||||
"message": "Bezpieczeństwo konta"
|
||||
},
|
||||
"settings.account.security.two-factor.action.remove": {
|
||||
"message": "Usuń weryfikację"
|
||||
"message": "Usuń weryfikację dwuskładnikową"
|
||||
},
|
||||
"settings.account.security.two-factor.action.setup": {
|
||||
"message": "Dodaj weryfikację"
|
||||
"message": "Dodaj weryfikację dwuskładnikową"
|
||||
},
|
||||
"settings.account.security.two-factor.description": {
|
||||
"message": "Dodaj dodatkową warstwę bezpieczeństwa podczas logowania na Twoje konto."
|
||||
},
|
||||
"settings.account.security.two-factor.modal.remove.header": {
|
||||
"message": "Usuń weryfikację dwuskładnikową"
|
||||
},
|
||||
"settings.account.security.two-factor.modal.setup.header": {
|
||||
"message": "Dodaj weryfikację dwuskładnikową"
|
||||
},
|
||||
"settings.account.security.two-factor.title": {
|
||||
"message": "Weryfikacja dwuetapowa"
|
||||
},
|
||||
@@ -3912,7 +4053,7 @@
|
||||
"message": "Wprowadź otrzymany kod weryfikacyjny, aby kontynuować."
|
||||
},
|
||||
"settings.account.two-factor.field.code.label": {
|
||||
"message": "Wprowadź otrzymany kod 2FA"
|
||||
"message": "Wprowadź otrzymany kod"
|
||||
},
|
||||
"settings.account.two-factor.field.code.placeholder": {
|
||||
"message": "Wprowadź kod..."
|
||||
@@ -4229,9 +4370,18 @@
|
||||
"settings.billing.subscription.title": {
|
||||
"message": "Subskrypcje"
|
||||
},
|
||||
"settings.billing.switch.switching-to-interval": {
|
||||
"message": "Zmienianie na {interval, select, monthly {monthly} yearly {yearly} other {{interval}}}"
|
||||
},
|
||||
"settings.billing.switch.to-interval": {
|
||||
"message": "Zmień na {interval, select, monthly {monthly} yearly {yearly} other {{interval}}}"
|
||||
},
|
||||
"settings.billing.switch.tooltip.monthly-additional-per-year": {
|
||||
"message": "Miesięcznie będzie cię to kosztować dodatkowe {amount} na rok"
|
||||
},
|
||||
"settings.billing.switches-to-billing-on": {
|
||||
"message": "Zmieni się na rozliczanie {interval, select, monthly {miesięczne} yearly {roczne} other {{interval}}} dnia {date}"
|
||||
},
|
||||
"settings.billing.update-method": {
|
||||
"message": "Zaktualizuj metodę"
|
||||
},
|
||||
@@ -4338,13 +4488,13 @@
|
||||
"message": "Ustawienia wyświetlania"
|
||||
},
|
||||
"settings.pats.action.create": {
|
||||
"message": "Utwórz PAT"
|
||||
"message": "Utwórz klucz dostępu osobistego"
|
||||
},
|
||||
"settings.pats.description": {
|
||||
"message": "PATy zezwalają na dostęp do API Modrinth. Mogą być dowolnie tworzone bądź unieważniane. Więcej informacji zawarte jest w <doc-link>dokumentacji API Modrinth</doc-link>."
|
||||
"message": "Klucze dostępu osobistego zezwalają na dostęp do API Modrinth. Mogą być dowolnie tworzone bądź unieważniane. Więcej informacji zawarte jest w <doc-link>dokumentacji API Modrinth</doc-link>."
|
||||
},
|
||||
"settings.pats.modal.create.action": {
|
||||
"message": "Utwórz PAT"
|
||||
"message": "Utwórz klucz dostępu osobistego"
|
||||
},
|
||||
"settings.pats.modal.create.expires.label": {
|
||||
"message": "Wygasa"
|
||||
@@ -4353,25 +4503,25 @@
|
||||
"message": "Nazwa"
|
||||
},
|
||||
"settings.pats.modal.create.name.placeholder": {
|
||||
"message": "Wprowadź nazwę PATu..."
|
||||
"message": "Wprowadź nazwę klucza..."
|
||||
},
|
||||
"settings.pats.modal.create.title": {
|
||||
"message": "Utwórz token dostępu osobistego"
|
||||
"message": "Utwórz klucz dostępu osobistego"
|
||||
},
|
||||
"settings.pats.modal.delete.action": {
|
||||
"message": "Usuń token"
|
||||
"message": "Usuń klucz"
|
||||
},
|
||||
"settings.pats.modal.delete.description": {
|
||||
"message": "Usunie to token na zawsze (na serio na zawsze)."
|
||||
"message": "Usunie to klucz na zawsze (na serio na zawsze)."
|
||||
},
|
||||
"settings.pats.modal.delete.title": {
|
||||
"message": "Czy na pewno chcesz usunąć ten token?"
|
||||
"message": "Czy na pewno chcesz usunąć ten klucz?"
|
||||
},
|
||||
"settings.pats.modal.edit.title": {
|
||||
"message": "Edytuj token dostępu osobistego"
|
||||
"message": "Edytuj klucz dostępu osobistego"
|
||||
},
|
||||
"settings.pats.token.action.edit": {
|
||||
"message": "Edytuj token"
|
||||
"message": "Edytuj klucz"
|
||||
},
|
||||
"settings.pats.token.action.revoke": {
|
||||
"message": "Unieważnij token"
|
||||
|
||||
@@ -23,6 +23,15 @@
|
||||
"analytics.breakdown.country": {
|
||||
"message": "País"
|
||||
},
|
||||
"analytics.breakdown.dependent-on": {
|
||||
"message": "Dependente em"
|
||||
},
|
||||
"analytics.breakdown.dependent-project-download": {
|
||||
"message": "Projeto dependente"
|
||||
},
|
||||
"analytics.breakdown.dependent-project-type": {
|
||||
"message": "Tipo de projeto dependente"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "Motivo do download"
|
||||
},
|
||||
@@ -38,6 +47,9 @@
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "Loader"
|
||||
},
|
||||
"analytics.breakdown.members": {
|
||||
"message": "Membro"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Monetização"
|
||||
},
|
||||
@@ -134,6 +146,24 @@
|
||||
"analytics.chart.render-limit.header": {
|
||||
"message": "Exibir todas as {count} linhas no gráfico?"
|
||||
},
|
||||
"analytics.chart.table-selection.all": {
|
||||
"message": "Exibindo todo(s) {itemType, select, project {{count, plural, one {projeto} other {os projetos}}} country {{count, plural, one {país} other {os países}}} monetization {{count, plural, one {valor monetário} other {os valores monetários}}} downloadSource {{count, plural, one {fonte do download} other {as fontes do download}}} downloadReason {{count, plural, one {motivo do download} other {os motivos do download}}} member {{count, plural, one {membro} other {os membros}}} projectVersion {{count, plural, one {versão do projeto} other {as versões do projeto}}} loader {{count, plural, one {loader} other {os loaders}}} gameVersion {{count, plural, one {versão do jogo} other {as versões do jogo}}} other {{count, plural, one {item} other {itens}}}} da tabela"
|
||||
},
|
||||
"analytics.chart.table-selection.count": {
|
||||
"message": "Exibindo {count} {itemType, select, project {{count, plural, one {projeto} other {os projetos}}} country {{count, plural, one {país} other {os países}}} monetization {{count, plural, one {valor monetário} other {os valores monetários}}} downloadSource {{count, plural, one {fonte do download} other {as fontes do download}}} downloadReason {{count, plural, one {motivo do download} other {os motivos do download}}} member {{count, plural, one {membro} other {os membros}}} projectVersion {{count, plural, one {versão do projeto} other {as versões do projeto}}} loader {{count, plural, one {loader} other {os loaders}}} gameVersion {{count, plural, one {versão do jogo} other {as versões do jogo}}} other {{count, plural, one {item} other {itens}}}} da tabela"
|
||||
},
|
||||
"analytics.chart.table-selection.limited": {
|
||||
"message": "Exibindo {limit} {itemType, select, project {{limit, plural, one {projeto} other {os projetos}}} country {{limit, plural, one {país} other {os países}}} monetization {{limit, plural, one {valor monetário} other {os valores monetários}}} downloadSource {{limit, plural, one {fonte do download} other {as fontes do download}}} downloadReason {{limit, plural, one {motivo do download} other {os motivos do download}}} member {{limit, plural, one {membro} other {os membros}}} projectVersion {{limit, plural, one {versão do projeto} other {as versões do projeto}}} loader {{limit, plural, one {loader} other {os loaders}}} gameVersion {{limit, plural, one {versão do jogo} other {as versões do jogo}}} other {{limit, plural, one {item} other {itens}}}} da tabela"
|
||||
},
|
||||
"analytics.chart.table-selection.top": {
|
||||
"message": "Exibindo {count} {itemType, select, project {{count, plural, one {projeto} other {os projetos}}} country {{count, plural, one {país} other {os países}}} monetization {{count, plural, one {valor monetário} other {os valores monetários}}} downloadSource {{count, plural, one {fonte do download} other {as fontes do download}}} downloadReason {{count, plural, one {motivo do download} other {os motivos do download}}} member {{count, plural, one {membro} other {os membros}}} projectVersion {{count, plural, one {versão do projeto} other {as versões do projeto}}} loader {{count, plural, one {loader} other {os loaders}}} gameVersion {{count, plural, one {versão do jogo} other {as versões do jogo}}} other {{count, plural, one {item} other {itens}}}} do topo da tabela"
|
||||
},
|
||||
"analytics.chart.tooltip.dependent-on-project": {
|
||||
"message": "Dependente em {project}"
|
||||
},
|
||||
"analytics.chart.tooltip.dependent-project-version": {
|
||||
"message": "{dependentProject} dependente em {dependencyProject}, {version}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, one {# dia} other {# dias}}"
|
||||
},
|
||||
@@ -218,9 +248,15 @@
|
||||
"analytics.filter.search.countries": {
|
||||
"message": "Buscar países..."
|
||||
},
|
||||
"analytics.filter.search.dependent-projects": {
|
||||
"message": "Buscar projetos..."
|
||||
},
|
||||
"analytics.filter.search.download-sources": {
|
||||
"message": "Buscar fontes dos downloads..."
|
||||
},
|
||||
"analytics.filter.search.members": {
|
||||
"message": "Buscar membros..."
|
||||
},
|
||||
"analytics.filter.search.project-versions": {
|
||||
"message": "Buscar versões do projeto..."
|
||||
},
|
||||
@@ -288,7 +324,7 @@
|
||||
"message": "Projeto aprovado"
|
||||
},
|
||||
"analytics.project-event.project-private": {
|
||||
"message": "Projeto definido como privado"
|
||||
"message": "Projeto definido para privado"
|
||||
},
|
||||
"analytics.project-event.project-status-changed": {
|
||||
"message": "O status do projeto foi alterado"
|
||||
@@ -333,10 +369,10 @@
|
||||
"message": "{count, plural, one {# projeto} other {# projetos}}"
|
||||
},
|
||||
"analytics.project.icon-alt": {
|
||||
"message": "{name} Ícone"
|
||||
"message": "Ícone de {name}"
|
||||
},
|
||||
"analytics.project.select": {
|
||||
"message": "Selecione projetos"
|
||||
"message": "Selecionar projetos"
|
||||
},
|
||||
"analytics.project.user": {
|
||||
"message": "Projetos de {username}"
|
||||
@@ -348,10 +384,10 @@
|
||||
"message": "Adicionar filtro"
|
||||
},
|
||||
"analytics.query.label.breakdown": {
|
||||
"message": "Detalhamento:"
|
||||
"message": "Detalhes:"
|
||||
},
|
||||
"analytics.query.label.grouped-by": {
|
||||
"message": "Agrupados por"
|
||||
"message": "Agrupado por"
|
||||
},
|
||||
"analytics.query.label.project": {
|
||||
"message": "Projeto:"
|
||||
@@ -363,7 +399,7 @@
|
||||
"message": "Downloads"
|
||||
},
|
||||
"analytics.stat.monetization-banner.body": {
|
||||
"message": "Somente visualizações e downloads feitos através do Modrinth são elegíveis para monetização e devem passar por filtros de prevenção de fraudes. Os downloads do aplicativo Modrinth também exigem que o usuário esteja logado. Como todos os projetos têm uma proporção semelhante de downloads monetizados, sua receita não mudaria significativamente se todos os downloads fossem contabilizados."
|
||||
"message": "Somente downloads e visualizações feitas através do Modrinth são elegíveis para monetização e devem passar pela filtração anti-fraude. Downloads do Modrinth App também exigem que o usuário esteja conectado. Pois, todos os projetos possuem uma proporção semelhante de downloads monetizados, sua receita não mudaria bastante se todos os downloads fossem contados."
|
||||
},
|
||||
"analytics.stat.monetization-banner.learn-more": {
|
||||
"message": "Saiba mais"
|
||||
@@ -372,10 +408,10 @@
|
||||
"message": "Como funciona a monetização?"
|
||||
},
|
||||
"analytics.stat.playtime": {
|
||||
"message": "Tempo jogado"
|
||||
"message": "Tempo de jogo"
|
||||
},
|
||||
"analytics.stat.playtime-hours": {
|
||||
"message": "{hours} h"
|
||||
"message": "{hours}h"
|
||||
},
|
||||
"analytics.stat.previous-period-comparison": {
|
||||
"message": "vs período anterior"
|
||||
@@ -393,7 +429,7 @@
|
||||
"message": "N/D"
|
||||
},
|
||||
"analytics.stat.unavailable-tooltip": {
|
||||
"message": "Estatística não disponível para a consulta atual"
|
||||
"message": "Estatística indisponível para a consulta atual"
|
||||
},
|
||||
"analytics.stat.views": {
|
||||
"message": "Visualizações"
|
||||
@@ -402,10 +438,10 @@
|
||||
"message": "{start} a {end}"
|
||||
},
|
||||
"analytics.table.csv.filename": {
|
||||
"message": "Análises do Modrinth: Detalhamento por {breakdown} - {dateRange}"
|
||||
"message": "Estatísticas do Modrinth: Detalhes por {breakdown} - {dateRange}"
|
||||
},
|
||||
"analytics.table.csv.header.playtime-seconds": {
|
||||
"message": "Tempo jogado (segundos)"
|
||||
"message": "Tempo de jogo (segundos)"
|
||||
},
|
||||
"analytics.table.csv.selected-range": {
|
||||
"message": "Intervalo selecionado"
|
||||
@@ -420,7 +456,7 @@
|
||||
"message": "{count, plural, one {# minuto} other {# minutos}}"
|
||||
},
|
||||
"analytics.table.empty.no-matching-rows": {
|
||||
"message": "Nenhuma linha de análise correspondente"
|
||||
"message": "Sem linhas de estatísticas correspondentes"
|
||||
},
|
||||
"analytics.table.export-csv": {
|
||||
"message": "Exportar CSV"
|
||||
@@ -467,6 +503,12 @@
|
||||
"analytics.value.monetized": {
|
||||
"message": "Monetizado"
|
||||
},
|
||||
"analytics.value.no-dependent": {
|
||||
"message": "Nenhum"
|
||||
},
|
||||
"analytics.value.no-dependent-tooltip": {
|
||||
"message": "Instalado por outros motivos além de ser uma dependência"
|
||||
},
|
||||
"analytics.value.none": {
|
||||
"message": "Nenhum"
|
||||
},
|
||||
@@ -480,28 +522,28 @@
|
||||
"message": "Não monetizado"
|
||||
},
|
||||
"app-marketing.download.description": {
|
||||
"message": "Nosso aplicativo para PC está disponível em todas as plataformas, escolha a versão desejada."
|
||||
"message": "Nosso aplicativo para desktop está disponível em todas as plataformas, escolha a versão desejada."
|
||||
},
|
||||
"app-marketing.download.download-appimage": {
|
||||
"message": "Baixar o AppImage"
|
||||
"message": "Baixar AppImage"
|
||||
},
|
||||
"app-marketing.download.download-beta": {
|
||||
"message": "Baixar a beta"
|
||||
"message": "Baixar beta"
|
||||
},
|
||||
"app-marketing.download.download-deb": {
|
||||
"message": "Baixar o DEB"
|
||||
"message": "Baixar DEB"
|
||||
},
|
||||
"app-marketing.download.download-rpm": {
|
||||
"message": "Baixar o RPM"
|
||||
"message": "Baixar RPM"
|
||||
},
|
||||
"app-marketing.download.flathub": {
|
||||
"message": "Obtenha no Flathub"
|
||||
"message": "Obtenha-o no Flathub"
|
||||
},
|
||||
"app-marketing.download.linux": {
|
||||
"message": "Linux"
|
||||
},
|
||||
"app-marketing.download.linux-disclaimer": {
|
||||
"message": "As versões Linux do Modrinth App são <issues-link>conhecidas por apresentar problemas</issues-link> em alguns sistemas e configurações. Se o Modrinth App estiver instável no seu sistema, recomendamos que você tente outros aplicativos, como o <prism-link>Prism Launcher</prism-link>, para instalar facilmente o conteúdo do Modrinth."
|
||||
"message": "As versões Linux do Modrinth App são <issues-link>conhecidas por ter problemas</issues-link> em certos sistemas e configurações. Se o Modrinth App for instável em seu sistema, recomendamos você usar outros aplicativos como <prism-link>Prism Launcher</prism-link>, para instalar conteúdo do Modrinth facilmente."
|
||||
},
|
||||
"app-marketing.download.mac": {
|
||||
"message": "Mac"
|
||||
@@ -513,19 +555,19 @@
|
||||
"message": "Ao baixar o Modrinth App, você concorda com nossos <terms-link>Termos</terms-link> e <privacy-link>Política de Privacidade</privacy-link>."
|
||||
},
|
||||
"app-marketing.download.title": {
|
||||
"message": "Baixe a beta do Modrinth App"
|
||||
"message": "Baixar Modrinth App (Beta)"
|
||||
},
|
||||
"app-marketing.download.windows": {
|
||||
"message": "Windows"
|
||||
},
|
||||
"app-marketing.features.follow.description": {
|
||||
"message": "Salve o conteúdo que você gosta e receba atualizações com um clique."
|
||||
"message": "Salve o conteúdo que você gosta e receba atualizações em um só clique."
|
||||
},
|
||||
"app-marketing.features.follow.title": {
|
||||
"message": "Siga os projetos"
|
||||
},
|
||||
"app-marketing.features.importing.description": {
|
||||
"message": "Importe todos os seus perfis favoritos do launcher que você estava usando e comece a usar o Modrinth App em segundos!"
|
||||
"message": "Importe todos os perfis favoritos do launcher que você usou antes e comece a usar o Modrinth App em segundos!"
|
||||
},
|
||||
"app-marketing.features.importing.gdlauncher-alt": {
|
||||
"message": "GDLauncher"
|
||||
@@ -543,7 +585,7 @@
|
||||
"message": "por {author}"
|
||||
},
|
||||
"app-marketing.features.mod-management.description": {
|
||||
"message": "O Modrinth facilita o gerenciamento de todos os seus mods em um só lugar. Você pode instalar, desinstalar e atualizar mods com um único clique."
|
||||
"message": "O Modrinth facilita o gerenciamento de todos os mods em um só lugar. Você pode instalar, desinstalar e atualizar mods facilmente."
|
||||
},
|
||||
"app-marketing.features.mod-management.installed-mods": {
|
||||
"message": "Mods instalados"
|
||||
@@ -561,7 +603,7 @@
|
||||
"message": "Versão"
|
||||
},
|
||||
"app-marketing.features.offline.description": {
|
||||
"message": "Jogue seus mods, com ou sem internet."
|
||||
"message": "Jogue com mods, sem ou com internet."
|
||||
},
|
||||
"app-marketing.features.offline.title": {
|
||||
"message": "Modo offline"
|
||||
@@ -576,10 +618,10 @@
|
||||
"message": "Monitoramento de atividades"
|
||||
},
|
||||
"app-marketing.features.performance.cpu-percent": {
|
||||
"message": "Uso de CPU"
|
||||
"message": "% CPU"
|
||||
},
|
||||
"app-marketing.features.performance.description": {
|
||||
"message": "O Modrinth App tem um desempenho melhor que muitos dos principais gerenciadores de mods, usando apenas 150 MB de RAM!"
|
||||
"message": "O Modrinth App desempenha melhor que muitos outros gerenciadores de mods, usando apenas 150 MB de RAM!"
|
||||
},
|
||||
"app-marketing.features.performance.discord": {
|
||||
"message": "Discord"
|
||||
@@ -612,19 +654,19 @@
|
||||
"message": "RAM"
|
||||
},
|
||||
"app-marketing.features.performance.small": {
|
||||
"message": "Pequeno"
|
||||
"message": "Pouco"
|
||||
},
|
||||
"app-marketing.features.performance.title": {
|
||||
"message": "Desempenho"
|
||||
"message": "Eficiente"
|
||||
},
|
||||
"app-marketing.features.play.description": {
|
||||
"message": "Use o Modrinth App para baixar e jogar seus mods e pacotes de mods favoritos."
|
||||
"message": "Use o Modrinth App para instalar e jogar com seus mods e pacotes de mods favoritos."
|
||||
},
|
||||
"app-marketing.features.play.title": {
|
||||
"message": "Jogue com os seus mods favoritos"
|
||||
"message": "Jogue com seus mods favoritos"
|
||||
},
|
||||
"app-marketing.features.sharing.description": {
|
||||
"message": "Crie, compartilhe e jogue com qualquer um dos milhares de mods e pacotes de mods hospedados aqui no Modrinth."
|
||||
"message": "Crie, compartilhe e jogue com pacotes de mods com qualquer um de milhares de mods e pacotes de mods hospedados aqui."
|
||||
},
|
||||
"app-marketing.features.sharing.modpack": {
|
||||
"message": "Pacote de mods"
|
||||
@@ -639,7 +681,7 @@
|
||||
"message": "Diferente de qualquer launcher"
|
||||
},
|
||||
"app-marketing.features.website.description": {
|
||||
"message": "O Modrinth App é totalmente integrado com o site, permitindo que você acesse todos os seus projetos favoritos pelo aplicativo!"
|
||||
"message": "O Modrinth App é totalmente integrado com o site, para você conseguir acessar seus projetos favoritos do aplicativo!"
|
||||
},
|
||||
"app-marketing.features.website.title": {
|
||||
"message": "Integração com o site"
|
||||
@@ -648,10 +690,10 @@
|
||||
"message": "que você já usou antes"
|
||||
},
|
||||
"app-marketing.hero.app-screenshot-alt": {
|
||||
"message": "Captura de tela do Modrinth App com uma instância do Cobblemon aberta na página \"Conteúdo\"."
|
||||
"message": "Uma captura de tela do Modrinth App com uma instância do Cobblemon aberta na página 'Conteúdo'."
|
||||
},
|
||||
"app-marketing.hero.description": {
|
||||
"message": "O Modrinth App é um launcher de código aberto que permite jogar seus mods favoritos e mantê-los sempre atualizados, tudo em um só lugar."
|
||||
"message": "O Modrinth App é um launcher de código aberto que permite jogar com seus mods favoritos e mantê-los sempre atualizados, tudo em um só lugar."
|
||||
},
|
||||
"app-marketing.hero.download-button": {
|
||||
"message": "Baixar Modrinth App"
|
||||
@@ -672,7 +714,7 @@
|
||||
"message": "Ocultar outros pacotes"
|
||||
},
|
||||
"app-marketing.not-recommended": {
|
||||
"message": "Não recomendamos que você os utilize, a menos que saiba o que está fazendo."
|
||||
"message": "Não é recomendado usá-los, a menos que saiba o que está fazendo."
|
||||
},
|
||||
"app-marketing.show-other-packages": {
|
||||
"message": "Mostrar outros pacotes"
|
||||
@@ -690,7 +732,7 @@
|
||||
"message": "Autorizar {appName}"
|
||||
},
|
||||
"auth.authorize.error.no-redirect-url": {
|
||||
"message": "Nenhum redirecionamento encontrado na resposta"
|
||||
"message": "Sem redirecionamento encontrado na resposta"
|
||||
},
|
||||
"auth.authorize.redirect-url": {
|
||||
"message": "Você será redirecionado para <redirect-url>{url}</redirect-url>"
|
||||
@@ -699,7 +741,7 @@
|
||||
"message": "Enviar e-mail de recuperação"
|
||||
},
|
||||
"auth.reset-password.method-choice.description": {
|
||||
"message": "Insira seu e-mail abaixo e enviaremos um link de recuperação para que você possa recuperar sua conta."
|
||||
"message": "Insira seu e-mail abaixo e enviaremos um link de recuperação para ajudá-lo a recuperar sua conta."
|
||||
},
|
||||
"auth.reset-password.notification.email-sent.text": {
|
||||
"message": "Um e-mail com instruções foi enviado a você se o e-mail foi salvo anteriormente em sua conta."
|
||||
@@ -708,19 +750,19 @@
|
||||
"message": "E-mail enviado"
|
||||
},
|
||||
"auth.reset-password.notification.password-reset.text": {
|
||||
"message": "Agora você pode fazer login na sua conta com sua nova senha."
|
||||
"message": "Agora você pode iniciar sessão em sua conta com a nova senha."
|
||||
},
|
||||
"auth.reset-password.notification.password-reset.title": {
|
||||
"message": "Sua senha foi redefinida com sucesso"
|
||||
},
|
||||
"auth.reset-password.post-challenge.action": {
|
||||
"message": "Redefenir senha"
|
||||
"message": "Redefinir senha"
|
||||
},
|
||||
"auth.reset-password.post-challenge.confirm-password.label": {
|
||||
"message": "Confirmar senha"
|
||||
},
|
||||
"auth.reset-password.post-challenge.description": {
|
||||
"message": "Entre com sua nova senha para ter acesso a sua conta."
|
||||
"message": "Insira sua nova senha abaixo para ter acesso à conta."
|
||||
},
|
||||
"auth.reset-password.title": {
|
||||
"message": "Redefinir senha"
|
||||
@@ -747,7 +789,7 @@
|
||||
"message": "Iniciar sessão"
|
||||
},
|
||||
"auth.sign-in.use-password": {
|
||||
"message": "Ou com senha"
|
||||
"message": "Ou use a senha"
|
||||
},
|
||||
"auth.sign-up.action.create-account": {
|
||||
"message": "Criar conta"
|
||||
@@ -756,22 +798,22 @@
|
||||
"message": "Ao criar uma conta, você concorda com os <terms-link>Termos</terms-link> e a <privacy-policy-link>Política de Privacidade</privacy-policy-link>."
|
||||
},
|
||||
"auth.sign-up.notification.password-mismatch.text": {
|
||||
"message": "As senhas não estão iguais!"
|
||||
"message": "As senhas não correspondem!"
|
||||
},
|
||||
"auth.sign-up.sign-in-option.title": {
|
||||
"message": "Já possui uma conta?"
|
||||
},
|
||||
"auth.sign-up.subscribe.label": {
|
||||
"message": "Inscreva-se para receber atualizações sobre o Modrinth"
|
||||
"message": "Inscreva-se para receber novidades do Modrinth"
|
||||
},
|
||||
"auth.sign-up.title": {
|
||||
"message": "Entrar"
|
||||
"message": "Criar conta"
|
||||
},
|
||||
"auth.sign-up.title.create-account": {
|
||||
"message": "Ou crie uma conta você mesmo"
|
||||
},
|
||||
"auth.sign-up.title.sign-up-with": {
|
||||
"message": "Entrar com"
|
||||
"message": "Criar conta com"
|
||||
},
|
||||
"auth.verify-email.action.account-settings": {
|
||||
"message": "Configuração da conta"
|
||||
@@ -2951,6 +2993,9 @@
|
||||
"profile.official-account.bio": {
|
||||
"message": "Conta oficial do Modrinth. Obtenha suporte em<support-link></support-link> ou por e-mail via <email></email>"
|
||||
},
|
||||
"profile.stats.projects-followers": {
|
||||
"message": "{count, plural, =0 {{count} seguidores} one {<stat>{count}</stat> seguidor} other {<stat>{count}</stat> seguidores}} do projeto"
|
||||
},
|
||||
"profile.user-id": {
|
||||
"message": "ID do usuário: {id}"
|
||||
},
|
||||
@@ -3392,6 +3437,12 @@
|
||||
"project.settings.visit-dashboard": {
|
||||
"message": "Visitar painel de projetos"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "{count, plural, =0 {Nenhum download} one {# download} other {# downloads}}"
|
||||
},
|
||||
"project.stats.followers-label": {
|
||||
"message": "{count, plural, =0 {Nenhum seguidor} one {# seguidor} other {# seguidores}}"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "{title} foi arquivado. {title} não receberá atualizações a menos que o autor decida desarquivar o projeto."
|
||||
},
|
||||
|
||||
@@ -431,6 +431,9 @@
|
||||
"create.collection.title": {
|
||||
"message": "Criar uma coleção"
|
||||
},
|
||||
"create.limit-alert.approaching-limit-description": {
|
||||
"message": "Estás prestes a atingir o limite de {typePlural}, por favor contacta o suporte se precisas de mais do que {max} {typePlural}."
|
||||
},
|
||||
"create.limit-alert.contact-support": {
|
||||
"message": "Contacta o suporte"
|
||||
},
|
||||
|
||||
@@ -1325,6 +1325,9 @@
|
||||
"project-member-header.invitation-title": {
|
||||
"message": "Invitație de a te alătura proiectului"
|
||||
},
|
||||
"project-member-header.invitation-with-role": {
|
||||
"message": "Ai fost invitat să devii membru al acestui proiect cu rolul de '{role}''."
|
||||
},
|
||||
"project-member-header.success-decline": {
|
||||
"message": "Ai refuzat invitația în echipă"
|
||||
},
|
||||
|
||||
@@ -38,6 +38,9 @@
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "Загрузчик"
|
||||
},
|
||||
"analytics.breakdown.members": {
|
||||
"message": "Участник"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Монетизация"
|
||||
},
|
||||
@@ -104,6 +107,9 @@
|
||||
"analytics.chart.empty.select-table-items": {
|
||||
"message": "Выберите элементы из таблицы ниже, чтобы отобразить данные."
|
||||
},
|
||||
"analytics.chart.events.count-aria": {
|
||||
"message": "{count, plural, one {# событие аналитики} few {# события аналитики} other {# событий аналитики}}"
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>: {title}"
|
||||
},
|
||||
@@ -125,6 +131,33 @@
|
||||
"analytics.chart.render-limit.description": {
|
||||
"message": "Если показать все выбранные строки, страница может работать медленнее."
|
||||
},
|
||||
"analytics.chart.table-selection.all": {
|
||||
"message": "Показаны все {itemType, select,\n project {проекты}\n country {страны}\n monetization {типы монетизации}\n downloadSource {источники скачивания}\n downloadReason {причины скачивания}\n member {участники}\n projectVersion {версии проекта}\n loader {загрузчики}\n gameVersion {версии игры}\n other {элементы}\n} из таблицы"
|
||||
},
|
||||
"analytics.chart.table-selection.count": {
|
||||
"message": "{itemType, select,\n project {{count, plural, one {Показан # проект} few {Показано # проекта} other {Показано # проектов}}}\n country {{count, plural, one {Показана # страна} few {Показано # страны} other {Показано # стран}}}\n monetization {{count, plural, one {Показан # тип монетизации} few {Показано # типа монетизации} other {Показано # типов монетизации}}}\n downloadSource {{count, plural, one {Показан # источник скачивания} few {Показано # источника скачивания} other {Показано # источников скачивания}}}\n downloadReason {{count, plural, one {Показана # причина скачивания} few {Показано # причины скачивания} other {Показано # причин скачивания}}}\n member {{count, plural, one {Показан # участник} few {Показано # участника} other {Показано # участников}}}\n projectVersion {{count, plural, one {Показана # версия проекта} few {Показано # версии проекта} other {Показано # версий проекта}}}\n loader {{count, plural, one {Показан # загрузчик} few {Показано # загрузчика} other {Показано # загрузчиков}}}\n gameVersion {{count, plural, one {Показана # версия игры} few {Показано # версии игры} other {Показано # версий игры}}}\n other {{count, plural, one {Показан # элемент} few {Показано # элемента} other {Показано # элементов}}}\n} из таблицы"
|
||||
},
|
||||
"analytics.chart.table-selection.limited": {
|
||||
"message": "{itemType, select,\n project {{limit, plural, one {Показан # проект} few {Показано # проекта} other {Показано # проектов}}}\n country {{limit, plural, one {Показана # страна} few {Показано # страны} other {Показано # стран}}}\n monetization {{limit, plural, one {Показан # тип монетизации} few {Показано # типа монетизации} other {Показано # типов монетизации}}}\n downloadSource {{limit, plural, one {Показан # источник скачивания} few {Показано # источника скачивания} other {Показано # источников скачивания}}}\n downloadReason {{limit, plural, one {Показана # причина скачивания} few {Показано # причины скачивания} other {Показано # причин скачивания}}}\n member {{limit, plural, one {Показан # участник} few {Показано # участника} other {Показано # участников}}}\n projectVersion {{limit, plural, one {Показана # версия проекта} few {Показано # версии проекта} other {Показано # версий проекта}}}\n loader {{limit, plural, one {Показан # загрузчик} few {Показано # загрузчика} other {Показано # загрузчиков}}}\n gameVersion {{limit, plural, one {Показана # версия игры} few {Показано # версии игры} other {Показано # версий игры}}}\n other {{limit, plural, one {Показан # элемент} few {Показано # элемента} other {Показано # элементов}}}\n} из таблицы"
|
||||
},
|
||||
"analytics.chart.table-selection.top": {
|
||||
"message": "Показан топ‑{count} {itemType, select,\n project {проектов}\n country {стран}\n monetization {типов монетизации}\n downloadSource {источников скачивания}\n downloadReason {причин скачивания}\n member {участников}\n projectVersion {версий проекта}\n loader {загрузчиков}\n gameVersion {версий игры}\n other {элементов}\n} из таблицы"
|
||||
},
|
||||
"analytics.chart.tooltip.dependent-on-project": {
|
||||
"message": "Зависит от {project}"
|
||||
},
|
||||
"analytics.chart.tooltip.dependent-project-version": {
|
||||
"message": "{dependentProject} зависит от {dependencyProject} версии {version}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, one {# день} few {# дня} other {# дней}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.hours": {
|
||||
"message": "{count, plural, one {# час} few {# часа} other {# часов}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.minutes": {
|
||||
"message": "{count, plural, one {# минута} few {# минуты} other {# минут}}"
|
||||
},
|
||||
"analytics.chart.tooltip.hide-entry": {
|
||||
"message": "Скрыть {name} на диаграмме"
|
||||
},
|
||||
@@ -200,9 +233,15 @@
|
||||
"analytics.filter.search.countries": {
|
||||
"message": "Поиск стран..."
|
||||
},
|
||||
"analytics.filter.search.dependent-projects": {
|
||||
"message": "Поиск проектов..."
|
||||
},
|
||||
"analytics.filter.search.download-sources": {
|
||||
"message": "Поиск источников..."
|
||||
},
|
||||
"analytics.filter.search.members": {
|
||||
"message": "Поиск участников..."
|
||||
},
|
||||
"analytics.filter.search.project-versions": {
|
||||
"message": "Поиск версий проекта..."
|
||||
},
|
||||
@@ -311,6 +350,9 @@
|
||||
"analytics.project.all": {
|
||||
"message": "Все проекты"
|
||||
},
|
||||
"analytics.project.count": {
|
||||
"message": "{count, plural, one {# проект} few {# проекта} other {# проектов}}"
|
||||
},
|
||||
"analytics.project.icon-alt": {
|
||||
"message": "Иконка {name}"
|
||||
},
|
||||
@@ -387,13 +429,22 @@
|
||||
"message": "Время игры (в секундах)"
|
||||
},
|
||||
"analytics.table.csv.selected-range": {
|
||||
"message": "Выбранный диапазон"
|
||||
"message": "в выбранном диапазоне"
|
||||
},
|
||||
"analytics.table.duration.days": {
|
||||
"message": "{count, plural, one {# день} few {# дня} other {# дней}}"
|
||||
},
|
||||
"analytics.table.duration.hours": {
|
||||
"message": "{count, plural, one {# час} few {# часа} other {# часов}}"
|
||||
},
|
||||
"analytics.table.duration.minutes": {
|
||||
"message": "{count, plural, one {# минута} few {# минуты} other {# минут}}"
|
||||
},
|
||||
"analytics.table.empty.no-matching-rows": {
|
||||
"message": "Нет данных по этому запросу"
|
||||
},
|
||||
"analytics.table.export-csv": {
|
||||
"message": "Экспорт в CSV"
|
||||
"message": "Экспортировать в CSV"
|
||||
},
|
||||
"analytics.table.export.cumulative": {
|
||||
"message": "С накоплением"
|
||||
@@ -402,7 +453,7 @@
|
||||
"message": "С группировкой: {groupBy}"
|
||||
},
|
||||
"analytics.table.pagination.summary": {
|
||||
"message": "Показано с {start} по {end} из {total}"
|
||||
"message": "Показано с {start} по {end} из {total}"
|
||||
},
|
||||
"analytics.table.search.placeholder": {
|
||||
"message": "Поиск..."
|
||||
@@ -437,6 +488,9 @@
|
||||
"analytics.value.monetized": {
|
||||
"message": "С монетизацией"
|
||||
},
|
||||
"analytics.value.no-dependent": {
|
||||
"message": "Нет"
|
||||
},
|
||||
"analytics.value.none": {
|
||||
"message": "Нет"
|
||||
},
|
||||
@@ -989,6 +1043,9 @@
|
||||
"create.limit-alert.approaching-limit": {
|
||||
"message": "Почти исчерпан лимит {type} ({current}/{max})"
|
||||
},
|
||||
"create.limit-alert.approaching-limit-description": {
|
||||
"message": "Почти достигнут лимит в {max} {type}. Увеличьте его, обратившись в поддержку."
|
||||
},
|
||||
"create.limit-alert.contact-support": {
|
||||
"message": "Связаться с поддержкой"
|
||||
},
|
||||
@@ -1124,6 +1181,9 @@
|
||||
"dashboard.affiliate-links.search": {
|
||||
"message": "Поиск ссылок..."
|
||||
},
|
||||
"dashboard.analytics.from-projects": {
|
||||
"message": "с {count, plural, one {# проекта} other {# проектов}}"
|
||||
},
|
||||
"dashboard.analytics.total-downloads": {
|
||||
"message": "Всего скачиваний"
|
||||
},
|
||||
@@ -1145,6 +1205,9 @@
|
||||
"dashboard.collections.empty.no-match-hint": {
|
||||
"message": "Попробуйте изменить фильтры или запрос."
|
||||
},
|
||||
"dashboard.collections.label.projects-count": {
|
||||
"message": "{count} {countPlural, plural, one {проект} few {проекта} other {проектов}}"
|
||||
},
|
||||
"dashboard.collections.label.search-input": {
|
||||
"message": "Поиск по коллекциям"
|
||||
},
|
||||
@@ -1416,22 +1479,22 @@
|
||||
"message": "Достигнут лимит вывода в <b>{withdrawLimit}</b>. Для снятия лимита заполните налоговую форму."
|
||||
},
|
||||
"dashboard.discord-roles.banner.body": {
|
||||
"message": "Привяжите ваш аккаунт Discord через Modrinth для синхронизации следующих ролей: {roles}."
|
||||
"message": "Вам доступны роли за {roles}. Привяжите Discord к аккаунту Modrinth, чтобы синхронизировать роли."
|
||||
},
|
||||
"dashboard.discord-roles.banner.cta": {
|
||||
"message": "Привязать Discord"
|
||||
},
|
||||
"dashboard.discord-roles.banner.title": {
|
||||
"message": "Получите ваши роли Discord"
|
||||
"message": "Получите роли в Discord"
|
||||
},
|
||||
"dashboard.discord-roles.role.big-creator": {
|
||||
"message": ">1 млн скачиваний"
|
||||
"message": "1 млн скачиваний"
|
||||
},
|
||||
"dashboard.discord-roles.role.creator": {
|
||||
"message": "Автор"
|
||||
"message": "статус автора"
|
||||
},
|
||||
"dashboard.discord-roles.role.pride": {
|
||||
"message": "Pride 2026"
|
||||
"message": "поддержку ЛГБТК+"
|
||||
},
|
||||
"dashboard.head-title": {
|
||||
"message": "Панель управления"
|
||||
@@ -1445,6 +1508,9 @@
|
||||
"dashboard.notifications.link.view-history": {
|
||||
"message": "История уведомлений"
|
||||
},
|
||||
"dashboard.notifications.link.view-more": {
|
||||
"message": "Посмотреть ещё {extraNotifs, number}"
|
||||
},
|
||||
"dashboard.organizations.button.create": {
|
||||
"message": "Создать организацию"
|
||||
},
|
||||
@@ -1454,6 +1520,9 @@
|
||||
"dashboard.organizations.error.fetch": {
|
||||
"message": "Не удалось получить организации"
|
||||
},
|
||||
"dashboard.organizations.member-count": {
|
||||
"message": "{count, plural, one {# участник} few {# участника} other {# участников}}"
|
||||
},
|
||||
"dashboard.organizations.title": {
|
||||
"message": "Организации"
|
||||
},
|
||||
@@ -1479,7 +1548,7 @@
|
||||
"message": "Загрузка уведомлений..."
|
||||
},
|
||||
"dashboard.projects.bulk-edit-hint": {
|
||||
"message": "Вы можете редактировать сразу несколько проектов, выбрав их ниже."
|
||||
"message": "Можно редактировать сразу несколько проектов, выбрав их ниже."
|
||||
},
|
||||
"dashboard.projects.bulk-edit.server-disabled": {
|
||||
"message": "Серверные проекты не поддерживают массовое редактирование"
|
||||
@@ -1554,7 +1623,7 @@
|
||||
"message": "Модераторы оставили сообщение к проекту. Перейдите на страницу проекта, чтобы узнать подробности."
|
||||
},
|
||||
"dashboard.projects.project.review-environment-metadata": {
|
||||
"message": "Пожалуйста, проверьте файл metadata"
|
||||
"message": "Проверьте метаданные среды"
|
||||
},
|
||||
"dashboard.projects.sort.ascending": {
|
||||
"message": "По возрастанию"
|
||||
@@ -2837,6 +2906,9 @@
|
||||
"profile.button.set-affiliate": {
|
||||
"message": "Сделать партнёром"
|
||||
},
|
||||
"profile.collection.projects-count": {
|
||||
"message": "{count, plural, one {# проект} few {# проекта} other {# проектов}}"
|
||||
},
|
||||
"profile.details.label.auth-providers": {
|
||||
"message": "Сервисы входа"
|
||||
},
|
||||
@@ -2862,7 +2934,7 @@
|
||||
"message": "Почта подтверждена"
|
||||
},
|
||||
"profile.error.not-found": {
|
||||
"message": "Пользователь не найден"
|
||||
"message": "Пользователь не найден"
|
||||
},
|
||||
"profile.label.affiliate": {
|
||||
"message": "Партнёр"
|
||||
@@ -2873,6 +2945,9 @@
|
||||
"profile.label.collection": {
|
||||
"message": "Коллекция"
|
||||
},
|
||||
"profile.label.downloads": {
|
||||
"message": "{count} {countPlural, plural, one {скачивание} few {скачивания} other {скачиваний}}"
|
||||
},
|
||||
"profile.label.joined": {
|
||||
"message": "Регистрация:"
|
||||
},
|
||||
@@ -2891,6 +2966,9 @@
|
||||
"profile.label.organizations": {
|
||||
"message": "Организации"
|
||||
},
|
||||
"profile.label.projects": {
|
||||
"message": "{count} {countPlural, plural, one {проект} few {проекта} other {проектов}}"
|
||||
},
|
||||
"profile.label.saving": {
|
||||
"message": "Сохранение..."
|
||||
},
|
||||
@@ -2906,6 +2984,9 @@
|
||||
"profile.official-account.bio": {
|
||||
"message": "Официальный аккаунт Modrinth. Связаться с поддержкой можно по ссылке <support-link></support-link> или по электронной почте: <email></email>"
|
||||
},
|
||||
"profile.stats.projects-followers": {
|
||||
"message": "{count, plural, one {<stat>{count}</stat> подписчик} few {<stat>{count}</stat> подписчика} other {<stat>{count}</stat> подписчиков}} у проектов"
|
||||
},
|
||||
"profile.user-id": {
|
||||
"message": "ID пользователя: {id}"
|
||||
},
|
||||
@@ -3347,6 +3428,12 @@
|
||||
"project.settings.visit-dashboard": {
|
||||
"message": "Управление проектами"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "{count, plural, one {загрузка} few {загрузки} other {загрузок}}"
|
||||
},
|
||||
"project.stats.followers-label": {
|
||||
"message": "{count, plural, one {подписчик} few {подписчика} other {подписчиков}}"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "{title} помещён в архив. {title} больше не будет получать обновления, если только автор не решит разархивировать проект."
|
||||
},
|
||||
|
||||
@@ -515,6 +515,9 @@
|
||||
"profile.meta.description-with-bio": {
|
||||
"message": "{bio} - Preuzmite projekte korisnika {username} na Modrinthu"
|
||||
},
|
||||
"profile.stats.projects-followers": {
|
||||
"message": "{count, plural, one {<stat>{count}</stat> pratilac projekta} few {<stat>{count}</stat> pratioca projekta} other {<stat>{count}</stat> pratilaca projekta}}"
|
||||
},
|
||||
"profile.user-id": {
|
||||
"message": "ID korisnika: {id}"
|
||||
},
|
||||
|
||||
@@ -23,6 +23,9 @@
|
||||
"analytics.breakdown.country": {
|
||||
"message": "Land"
|
||||
},
|
||||
"analytics.breakdown.dependent-on": {
|
||||
"message": "Beroende på"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "Nedladdningsanledning"
|
||||
},
|
||||
@@ -38,6 +41,9 @@
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "Laddare"
|
||||
},
|
||||
"analytics.breakdown.members": {
|
||||
"message": "Medlem"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Intäkter"
|
||||
},
|
||||
@@ -59,6 +65,9 @@
|
||||
"analytics.chart.action.show-all": {
|
||||
"message": "Visa alla"
|
||||
},
|
||||
"analytics.chart.action.show-limited": {
|
||||
"message": "Visa begränsad"
|
||||
},
|
||||
"analytics.chart.action.show-top-eight": {
|
||||
"message": "Visa topp 8"
|
||||
},
|
||||
@@ -95,6 +104,9 @@
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>: {title}"
|
||||
},
|
||||
"analytics.chart.events.see-announcement": {
|
||||
"message": "Se meddelande"
|
||||
},
|
||||
"analytics.chart.legend.previous-period-suffix": {
|
||||
"message": "{name} (förhandsvisa)"
|
||||
},
|
||||
@@ -284,6 +296,9 @@
|
||||
"analytics.project.all": {
|
||||
"message": "Alla projekt"
|
||||
},
|
||||
"analytics.project.count": {
|
||||
"message": "{count, number} projekt"
|
||||
},
|
||||
"analytics.project.icon-alt": {
|
||||
"message": "{name} Ikon"
|
||||
},
|
||||
@@ -1421,6 +1436,9 @@
|
||||
"dashboard.projects.links.button.edit": {
|
||||
"message": "Ändra länkar"
|
||||
},
|
||||
"dashboard.projects.links.changes-applied": {
|
||||
"message": "Ändringar kommer appliceras till <strong>{count}</strong> projekt."
|
||||
},
|
||||
"dashboard.projects.links.discord-invite.label": {
|
||||
"message": "Discordinbjudan"
|
||||
},
|
||||
|
||||
@@ -8,6 +8,231 @@
|
||||
"admin.billing.error.not-found": {
|
||||
"message": "ไม่พบผู้ใช้นี้"
|
||||
},
|
||||
"analytics.action.add": {
|
||||
"message": "เพิ่ม"
|
||||
},
|
||||
"analytics.action.cancel": {
|
||||
"message": "ยกเลิก"
|
||||
},
|
||||
"analytics.action.refresh": {
|
||||
"message": "รีเฟรช"
|
||||
},
|
||||
"analytics.action.reset": {
|
||||
"message": "รีเซ็ต"
|
||||
},
|
||||
"analytics.breakdown.country": {
|
||||
"message": "ประเทศ"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "เหตุผลในการดาวน์โหลด"
|
||||
},
|
||||
"analytics.breakdown.download-source": {
|
||||
"message": "แหล่งที่มาของการดาวน์โหลด"
|
||||
},
|
||||
"analytics.breakdown.game-version": {
|
||||
"message": "เวอร์ชันของเกม"
|
||||
},
|
||||
"analytics.breakdown.generic": {
|
||||
"message": "รายละเอียดจำแนกตาม"
|
||||
},
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "โหลดเดอร์"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "การสร้างรายได้"
|
||||
},
|
||||
"analytics.breakdown.none.selected": {
|
||||
"message": "ไม่มีรายละเอียดการจำแนก"
|
||||
},
|
||||
"analytics.breakdown.project": {
|
||||
"message": "โปรเจกต์"
|
||||
},
|
||||
"analytics.breakdown.project-status": {
|
||||
"message": "สถานะของโปรเจกต์"
|
||||
},
|
||||
"analytics.breakdown.project-version": {
|
||||
"message": "เวอร์ชั่นของโปรเจกต์"
|
||||
},
|
||||
"analytics.breakdown.selected": {
|
||||
"message": "การแยกตาม {breakdown}"
|
||||
},
|
||||
"analytics.chart.action.show-all": {
|
||||
"message": "แสดงทั้งหมด"
|
||||
},
|
||||
"analytics.chart.action.show-limited": {
|
||||
"message": "แสดงแบบจำกัด"
|
||||
},
|
||||
"analytics.chart.action.show-top-eight": {
|
||||
"message": "แสดง 8 อันดับแรก"
|
||||
},
|
||||
"analytics.chart.axis.playtime-hours": {
|
||||
"message": "{hours} ชั่วโมง"
|
||||
},
|
||||
"analytics.chart.controls.active-count": {
|
||||
"message": "{count} กำลังเล่นอยู่"
|
||||
},
|
||||
"analytics.chart.controls.annotations": {
|
||||
"message": "คำอธิบายประกอบ"
|
||||
},
|
||||
"analytics.chart.controls.aria": {
|
||||
"message": "ตัวควบคุมกราฟวิเคราะห์, {activeCount}"
|
||||
},
|
||||
"analytics.chart.controls.button": {
|
||||
"message": "ส่วนควบคุม"
|
||||
},
|
||||
"analytics.chart.controls.dialog-aria": {
|
||||
"message": "การควบคุมกราฟการวิเคราะห์"
|
||||
},
|
||||
"analytics.chart.controls.display": {
|
||||
"message": "การแสดงผล"
|
||||
},
|
||||
"analytics.chart.controls.modrinth-events": {
|
||||
"message": "เหตุการณ์จาก Modrinth"
|
||||
},
|
||||
"analytics.chart.controls.no-modrinth-events": {
|
||||
"message": "ไม่มีเหตุการณ์จาก Modrinth ในกราฟ"
|
||||
},
|
||||
"analytics.chart.controls.no-project-events": {
|
||||
"message": "ไม่มีเหตุการณ์ของโปรเจกต์ในกราฟ"
|
||||
},
|
||||
"analytics.chart.controls.previous-period": {
|
||||
"message": "ช่วงเวลาก่อนหน้า"
|
||||
},
|
||||
"analytics.chart.controls.project-events": {
|
||||
"message": "กิจกรรมโปรเจกต์"
|
||||
},
|
||||
"analytics.chart.controls.ratio": {
|
||||
"message": "อัตราส่วน"
|
||||
},
|
||||
"analytics.chart.empty.select-table-items": {
|
||||
"message": "เลือกรายการจากตารางด้านล่างเพื่อแสดงข้อมูลของคุณ"
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>: {title}"
|
||||
},
|
||||
"analytics.chart.events.see-announcement": {
|
||||
"message": "ดูประกาศ"
|
||||
},
|
||||
"analytics.chart.legend.monetization-details.aria": {
|
||||
"message": "ดูรายละเอียดการวิเคราะห์ที่สร้างรายได้"
|
||||
},
|
||||
"analytics.chart.legend.monetization-details.description": {
|
||||
"message": "มีเพียงการดูและการดาวน์โหลดที่ทำผ่าน Modrinth เท่านั้นที่จะนับรวมเพื่อการสร้างรายได้ และการดาวน์โหลดต้องให้ผู้ใช้เข้าสู่ระบบก่อน"
|
||||
},
|
||||
"analytics.chart.legend.monetization-details.title": {
|
||||
"message": "ข้อมูลวิเคราะห์การสร้างรายได้"
|
||||
},
|
||||
"analytics.chart.legend.previous-period-suffix": {
|
||||
"message": "{name} (ก่อนหน้า)"
|
||||
},
|
||||
"analytics.chart.render-limit.description": {
|
||||
"message": "การแสดงเส้นกราฟที่เลือกทั้งหมดจากตาราง อาจทำให้หน้าเว็บทำงานช้าลง"
|
||||
},
|
||||
"analytics.chart.render-limit.header": {
|
||||
"message": "แสดงเส้นกราฟทั้ง {count} เส้นหรือไม่?"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, one {# วัน} other {# วัน}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.hours": {
|
||||
"message": "{count, plural, one {# ชั่วโมง} other {# ชั่วโมง}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.minutes": {
|
||||
"message": "{count, plural, one {# นาที} other {# นาที}}"
|
||||
},
|
||||
"analytics.chart.tooltip.hide-entry": {
|
||||
"message": "ซ่อน {name} ในกราฟ"
|
||||
},
|
||||
"analytics.chart.tooltip.pinned": {
|
||||
"message": "ปักหมุดคำแนะนำบนกราฟแล้ว"
|
||||
},
|
||||
"analytics.chart.tooltip.pinned-aria": {
|
||||
"message": "ปักหมุดแล้ว"
|
||||
},
|
||||
"analytics.chart.tooltip.previous-period-short": {
|
||||
"message": "(ก่อนหน้า)"
|
||||
},
|
||||
"analytics.chart.tooltip.show-entry": {
|
||||
"message": "แสดง {name} ในกราฟ"
|
||||
},
|
||||
"analytics.chart.tooltip.total": {
|
||||
"message": "ทั้งหมด"
|
||||
},
|
||||
"analytics.chart.view.area": {
|
||||
"message": "ขอบเขต"
|
||||
},
|
||||
"analytics.chart.view.bar": {
|
||||
"message": "แผนภูมิแท่ง"
|
||||
},
|
||||
"analytics.chart.view.line": {
|
||||
"message": "แผนภูมิเส้น"
|
||||
},
|
||||
"analytics.download-reason.dependency": {
|
||||
"message": "ม็อดเสริมที่จำเป็น"
|
||||
},
|
||||
"analytics.download-reason.modpack": {
|
||||
"message": "ม็อดแพ็ก"
|
||||
},
|
||||
"analytics.download-reason.standalone": {
|
||||
"message": "แบบแยกต่างหาก"
|
||||
},
|
||||
"analytics.download-reason.update": {
|
||||
"message": "อัปเดต"
|
||||
},
|
||||
"analytics.download-source.app": {
|
||||
"message": "แอป Modrinth"
|
||||
},
|
||||
"analytics.download-source.website": {
|
||||
"message": "เว็ปไซต์ Modrinth"
|
||||
},
|
||||
"analytics.project.user": {
|
||||
"message": "โปรเจกต์ของ {username}"
|
||||
},
|
||||
"analytics.project.your": {
|
||||
"message": "โปรเจกต์ของคุณ"
|
||||
},
|
||||
"analytics.query.filter.add": {
|
||||
"message": "เพิ่มตัวกรอง"
|
||||
},
|
||||
"analytics.query.label.breakdown": {
|
||||
"message": "รายละเอียดจำแนก:"
|
||||
},
|
||||
"analytics.query.label.grouped-by": {
|
||||
"message": "จัดกลุ่มโดย"
|
||||
},
|
||||
"analytics.query.label.project": {
|
||||
"message": "โปรเจกต์:"
|
||||
},
|
||||
"analytics.query.label.timeframe": {
|
||||
"message": "ช่วงเวลา:"
|
||||
},
|
||||
"analytics.stat.downloads": {
|
||||
"message": "ดาวน์โหลด"
|
||||
},
|
||||
"analytics.stat.monetization-banner.body": {
|
||||
"message": "เฉพาะยอดเข้าชมและยอดดาวน์โหลดที่ทำผ่าน Modrinth เท่านั้นที่มีสิทธิ์นำไปคิดสร้างรายได้ และจะต้องผ่านระบบกรองป้องกันการทุจริตด้วย นอกจากนี้ การดาวน์โหลดผ่านแอป Modrinth ยังกำหนดให้ผู้ใช้งานต้องเข้าสู่ระบบไว้ด้วยเช่นกัน เนื่องจากทุกๆ โปรเจกต์ต่างก็มีสัดส่วนของยอดดาวน์โหลดที่สร้างรายได้ในระดับที่ใกล้เคียงกัน ดังนั้น รายได้ของคุณจะไม่เปลี่ยนแปลงไปจากเดิมอย่างมีนัยสำคัญ ถึงแม้จะนับยอดดาวน์โหลดทั้งหมดก็ตาม"
|
||||
},
|
||||
"analytics.stat.monetization-banner.learn-more": {
|
||||
"message": "เรียนรู้เพิ่มเติม"
|
||||
},
|
||||
"analytics.stat.monetization-banner.title": {
|
||||
"message": "ระบบสร้างรายได้ทำงานอย่างไร?"
|
||||
},
|
||||
"analytics.stat.playtime": {
|
||||
"message": "เวลาเล่น"
|
||||
},
|
||||
"analytics.stat.playtime-hours": {
|
||||
"message": "{hours} ชั่วโมง"
|
||||
},
|
||||
"analytics.stat.previous-period-comparison": {
|
||||
"message": "เทียบกับช่วงเวลาก่อนหน้า"
|
||||
},
|
||||
"analytics.stat.previous-period-comparison-short": {
|
||||
"message": "เทียบกับก่อนหน้า"
|
||||
},
|
||||
"analytics.stat.revenue": {
|
||||
"message": "รายได้"
|
||||
},
|
||||
"app-marketing.download.description": {
|
||||
"message": "แอปเดสก์ท็อปของเราพร้อมใช้งานบนทุกแพลตฟอร์ม เลือกเวอร์ชันที่คุณต้องการได้เลย"
|
||||
},
|
||||
@@ -420,7 +645,7 @@
|
||||
"message": "ประเภท"
|
||||
},
|
||||
"create.project.type-project": {
|
||||
"message": "โปรเจ็ก"
|
||||
"message": "โปรเจกต์"
|
||||
},
|
||||
"create.project.type-server": {
|
||||
"message": "เซิร์ฟเวอร์"
|
||||
@@ -575,6 +800,9 @@
|
||||
"landing.notifications.heading": {
|
||||
"message": "การแจ้งเตือน"
|
||||
},
|
||||
"landing.notifications.received-time": {
|
||||
"message": ""
|
||||
},
|
||||
"settings.applications.button.upload-icon": {
|
||||
"message": "อัปโหลดไอคอน"
|
||||
},
|
||||
|
||||
@@ -992,6 +992,9 @@
|
||||
"create-project-version.create-modal.stage.add-files.admonition": {
|
||||
"message": "Ek dosyalar, alternatif sürümler veya varyantlar için değil, kaynak kodu gibi destekleyici kaynaklar içindir."
|
||||
},
|
||||
"create.collection.collection-info": {
|
||||
"message": "Yeni koleksiyonunuz herkese açık olarak {count, plural, =0 {projesiz hâlde} other {# proje ile}} oluşturulacaktır."
|
||||
},
|
||||
"create.collection.create-collection": {
|
||||
"message": "Koleksiyon oluştur"
|
||||
},
|
||||
@@ -2294,6 +2297,9 @@
|
||||
"landing.section.for-players.label": {
|
||||
"message": "Oyuncular İçin"
|
||||
},
|
||||
"landing.section.for-players.tagline": {
|
||||
"message": "{count}'un üzerinde içerik keşfedin"
|
||||
},
|
||||
"landing.subheading": {
|
||||
"message": "Topluluk odaklı açık kaynak platformumuzda Minecraft içerikleri keşfedin, oynayın ve paylaşın."
|
||||
},
|
||||
|
||||
@@ -107,6 +107,9 @@
|
||||
"analytics.chart.empty.select-table-items": {
|
||||
"message": "Виберіть елементи з таблиці знизу щоб відобразити ваші дані."
|
||||
},
|
||||
"analytics.chart.events.count-aria": {
|
||||
"message": "{count, plural, one {# подія аналітики} few {# події аналітики} other {# подій аналітики}}"
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>: {title}"
|
||||
},
|
||||
@@ -131,6 +134,39 @@
|
||||
"analytics.chart.tooltip.pinned-aria": {
|
||||
"message": "Закріплено"
|
||||
},
|
||||
"analytics.download-source.app": {
|
||||
"message": "Modrinth App"
|
||||
},
|
||||
"analytics.download-source.website": {
|
||||
"message": "Сайт Modrinth"
|
||||
},
|
||||
"analytics.downloads.suffix": {
|
||||
"message": "завантажень"
|
||||
},
|
||||
"analytics.empty.no-data": {
|
||||
"message": "Данні не доступні"
|
||||
},
|
||||
"analytics.empty.no-data-for-analytics": {
|
||||
"message": "Данні не доступні для аналітики"
|
||||
},
|
||||
"analytics.empty.no-projects": {
|
||||
"message": "Немає доступних проєктів"
|
||||
},
|
||||
"analytics.empty.no-projects-for-analytics": {
|
||||
"message": "Немає доступних проєктів для аналітики"
|
||||
},
|
||||
"analytics.filter.game-version-type.all": {
|
||||
"message": "Усі"
|
||||
},
|
||||
"analytics.filter.game-version-type.release": {
|
||||
"message": "Випуск"
|
||||
},
|
||||
"analytics.filter.search.project-versions": {
|
||||
"message": "Пошук версій проєкту…"
|
||||
},
|
||||
"analytics.filter.search.versions": {
|
||||
"message": "Пошук версії…"
|
||||
},
|
||||
"analytics.graph.title.downloads": {
|
||||
"message": "Динаміка завантажень"
|
||||
},
|
||||
@@ -221,6 +257,9 @@
|
||||
"analytics.project.all": {
|
||||
"message": "Усі проєкти"
|
||||
},
|
||||
"analytics.project.count": {
|
||||
"message": "{count, plural, one {# проєкт} few {# проєкти} many {# проєктів} other {# проєктів}}"
|
||||
},
|
||||
"analytics.project.icon-alt": {
|
||||
"message": "Значок {name}"
|
||||
},
|
||||
@@ -248,6 +287,30 @@
|
||||
"analytics.stat.playtime-hours": {
|
||||
"message": "{hours} год"
|
||||
},
|
||||
"analytics.table.pagination.summary": {
|
||||
"message": "Показано {start} до {end} з {total}"
|
||||
},
|
||||
"analytics.table.search.placeholder": {
|
||||
"message": "Пошук…"
|
||||
},
|
||||
"analytics.title": {
|
||||
"message": "Аналітика"
|
||||
},
|
||||
"analytics.value.monetized": {
|
||||
"message": "Монетизація"
|
||||
},
|
||||
"analytics.value.none": {
|
||||
"message": "Немає"
|
||||
},
|
||||
"analytics.value.other": {
|
||||
"message": "Інше"
|
||||
},
|
||||
"analytics.value.unknown": {
|
||||
"message": "Невідомо"
|
||||
},
|
||||
"analytics.value.unmonetized": {
|
||||
"message": "Прибрати монетизацію"
|
||||
},
|
||||
"app-marketing.download.description": {
|
||||
"message": "Наш застосунок доступний на всіх платформах, виберіть бажану вами версію."
|
||||
},
|
||||
@@ -761,6 +824,9 @@
|
||||
"create-project-version.create-modal.stage.add-files.admonition": {
|
||||
"message": "Додаткові файли призначені для допоміжних ресурсів, таких як початковий код, а не для альтернативних версій чи варіантів."
|
||||
},
|
||||
"create.collection.collection-info": {
|
||||
"message": "Ваша нова добірка після створення буде публічною {count, plural,=0 {без проєктів} one {і міститиме # проєкт} few {і міститиме # проєкти} other {і міститиме # проєктів}}."
|
||||
},
|
||||
"create.collection.create-collection": {
|
||||
"message": "Створити добірку"
|
||||
},
|
||||
@@ -923,6 +989,9 @@
|
||||
"dashboard.affiliate-links.search": {
|
||||
"message": "Пошук партнерських посилань…"
|
||||
},
|
||||
"dashboard.analytics.from-projects": {
|
||||
"message": "з {count} {count, plural, one {проєкту} few {проєктів} many {проєктів} other {проєктів}}"
|
||||
},
|
||||
"dashboard.analytics.total-downloads": {
|
||||
"message": "Всього завантажень"
|
||||
},
|
||||
@@ -944,6 +1013,9 @@
|
||||
"dashboard.collections.empty.no-match-hint": {
|
||||
"message": "Спробуйте налаштувати фільтри або пошукові терміни."
|
||||
},
|
||||
"dashboard.collections.label.projects-count": {
|
||||
"message": "{count} {countPlural, plural, one {проєкт} few {проєкти} many {проєктів} other {проєктів}}"
|
||||
},
|
||||
"dashboard.collections.label.search-input": {
|
||||
"message": "Пошук у ваших добірках"
|
||||
},
|
||||
@@ -1214,6 +1286,15 @@
|
||||
"dashboard.creator-withdraw-modal.withdraw-limit-used": {
|
||||
"message": "Ви використали свій ліміт зняття коштів <b>{withdrawLimit}</b>. Щоб зняти більше, вам потрібно заповнити податкову форму."
|
||||
},
|
||||
"dashboard.discord-roles.banner.cta": {
|
||||
"message": "Посилання Discord"
|
||||
},
|
||||
"dashboard.discord-roles.banner.title": {
|
||||
"message": "Забрати ваші Discord ролі"
|
||||
},
|
||||
"dashboard.discord-roles.role.big-creator": {
|
||||
"message": "понад 1млн завантажень"
|
||||
},
|
||||
"dashboard.head-title": {
|
||||
"message": "Панель керування"
|
||||
},
|
||||
@@ -1226,6 +1307,9 @@
|
||||
"dashboard.notifications.link.view-history": {
|
||||
"message": "Побачити історію сповіщень"
|
||||
},
|
||||
"dashboard.notifications.link.view-more": {
|
||||
"message": "Побачити {extraNotifs} ще {extraNotifs, plural, one {повідомлення} few {повідомлень} many {повідомлень} other {повідомлень}}"
|
||||
},
|
||||
"dashboard.organizations.button.create": {
|
||||
"message": "Створити організацію"
|
||||
},
|
||||
@@ -1235,6 +1319,9 @@
|
||||
"dashboard.organizations.error.fetch": {
|
||||
"message": "Не вдалося отримати організації"
|
||||
},
|
||||
"dashboard.organizations.member-count": {
|
||||
"message": "{count} {count, plural, one {учасник} few {учасники} many {учасників} other {учасників}}"
|
||||
},
|
||||
"dashboard.organizations.title": {
|
||||
"message": "Організації"
|
||||
},
|
||||
@@ -1292,6 +1379,9 @@
|
||||
"dashboard.projects.links.discord-invite.label": {
|
||||
"message": "Запрошення до Discord"
|
||||
},
|
||||
"dashboard.projects.links.header.edit": {
|
||||
"message": "Редагувати посилання"
|
||||
},
|
||||
"dashboard.projects.links.issue-tracker.description": {
|
||||
"message": "Місце, де користувачі можуть повідомляти про помилки, проблеми та сумніви щодо вашого проєкту."
|
||||
},
|
||||
@@ -2621,6 +2711,9 @@
|
||||
"profile.label.collection": {
|
||||
"message": "Добірка"
|
||||
},
|
||||
"profile.label.downloads": {
|
||||
"message": "{count} {countPlural, plural, one {завантаження} few {завантаження} many {завантажень} other {завантажень}}"
|
||||
},
|
||||
"profile.label.joined": {
|
||||
"message": "Приєднався"
|
||||
},
|
||||
@@ -2639,6 +2732,9 @@
|
||||
"profile.label.organizations": {
|
||||
"message": "Організації"
|
||||
},
|
||||
"profile.label.projects": {
|
||||
"message": "{count} {countPlural, plural, one {проєкт} few {проєкти} many {проєктів} other {проєктів}}"
|
||||
},
|
||||
"profile.label.saving": {
|
||||
"message": "Збереження…"
|
||||
},
|
||||
@@ -2648,6 +2744,9 @@
|
||||
"profile.meta.description-with-bio": {
|
||||
"message": "{bio} — Завантажуйте проєкти {username} на Modrinth"
|
||||
},
|
||||
"profile.stats.projects-followers": {
|
||||
"message": "{count, plural, one {<stat>{count}</stat> відстежує} few {<stat>{count}</stat> відстежує} other {<stat>{count}</stat> відстежують}}"
|
||||
},
|
||||
"profile.user-id": {
|
||||
"message": "ID користувача: {id}"
|
||||
},
|
||||
@@ -3080,6 +3179,9 @@
|
||||
"project.settings.permissions.learn-more": {
|
||||
"message": "Дізнатися більше"
|
||||
},
|
||||
"project.settings.permissions.search-placeholder": {
|
||||
"message": "Пошук {count} {count, plural, one {зовнішнього проєкту} few {зовнішніх проєктів} many {зовнішніх проєктів} other {зовнішніх проєктів}}…"
|
||||
},
|
||||
"project.settings.title": {
|
||||
"message": "Налаштування"
|
||||
},
|
||||
@@ -3092,6 +3194,9 @@
|
||||
"project.versions.title": {
|
||||
"message": "Версії"
|
||||
},
|
||||
"project.versions.withheld-versions-warning.description": {
|
||||
"message": "{count, plural, one {Ця версія} few {Ці версії} many {Ці версії} other {Ці версії}} наразі наразі утримано та поза списком. Будь ласка, надайте підтвердження того, що ви маєте дозвіл на повторне розповсюдження певних файлів, які входять до {count, plural, one {версії} few {версій} many {версій} other {версій}} збірки."
|
||||
},
|
||||
"project.versions.withheld-versions-warning.title": {
|
||||
"message": "{count, plural, one {Версія{version_name}} other {Версії}} утримано через невідомий убудований уміст"
|
||||
},
|
||||
@@ -3980,6 +4085,9 @@
|
||||
"settings.billing.switch.tooltip.monthly-additional-per-year": {
|
||||
"message": "Щомісячна оплата обійдеться вам у додаткові {amount} на рік"
|
||||
},
|
||||
"settings.billing.switches-to-billing-on": {
|
||||
"message": "Змінено на {interval, select, monthly {monthly} yearly {yearly} other {{interval}}} оплату {date}"
|
||||
},
|
||||
"settings.billing.update-method": {
|
||||
"message": "Оновити спосіб"
|
||||
},
|
||||
|
||||
@@ -107,6 +107,9 @@
|
||||
"analytics.chart.empty.select-table-items": {
|
||||
"message": "Chọn các mục trong bảng dưới để hiển thị dự liệu của bạn."
|
||||
},
|
||||
"analytics.chart.events.count-aria": {
|
||||
"message": "{count, plural, other {# sự kiện dự án}}"
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>: {title}"
|
||||
},
|
||||
@@ -131,6 +134,15 @@
|
||||
"analytics.chart.render-limit.header": {
|
||||
"message": "Hiện thị tất cả {count} đường trong biểu đồ?"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, other {# ngày}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.hours": {
|
||||
"message": "{count, plural, other {# giờ}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.minutes": {
|
||||
"message": "{count, plural, other {# phút}}"
|
||||
},
|
||||
"analytics.chart.tooltip.hide-entry": {
|
||||
"message": "Che {name} trong biểu đồ"
|
||||
},
|
||||
@@ -317,12 +329,21 @@
|
||||
"analytics.project.all": {
|
||||
"message": "Tất cả dự án"
|
||||
},
|
||||
"analytics.project.count": {
|
||||
"message": "{count, plural, other {# dự án}}"
|
||||
},
|
||||
"analytics.project.icon-alt": {
|
||||
"message": "Biểu tượng {name}"
|
||||
},
|
||||
"analytics.project.select": {
|
||||
"message": "Chọn dự án"
|
||||
},
|
||||
"analytics.project.user": {
|
||||
"message": "Dự án của {username}"
|
||||
},
|
||||
"analytics.project.your": {
|
||||
"message": "Dự án của bạn"
|
||||
},
|
||||
"analytics.query.filter.add": {
|
||||
"message": "Thêm bộ lọc"
|
||||
},
|
||||
@@ -341,6 +362,15 @@
|
||||
"analytics.stat.downloads": {
|
||||
"message": "Lượt tải"
|
||||
},
|
||||
"analytics.stat.monetization-banner.body": {
|
||||
"message": "Chỉ lượt xem và lượt tải qua Modrinth hợp lệ cho việc kiếm tiền và phải vượt qua bộ lọc chống gian lận. Lượt tải từ Modrinth App yêu cầu người dùng phải đăng nhập. Vì tất cả các dự án đều có tỷ lệ lượt tải xuống hợp lệ tương đương nhau, doanh thu của bạn cũng không thay đổi đáng kể ngay cả khi tính toàn bộ lượt tải."
|
||||
},
|
||||
"analytics.stat.monetization-banner.learn-more": {
|
||||
"message": "Tìm hiểu thêm"
|
||||
},
|
||||
"analytics.stat.monetization-banner.title": {
|
||||
"message": "Việc kiếm tiền hoạt động như thế nào?"
|
||||
},
|
||||
"analytics.stat.playtime": {
|
||||
"message": "Thời gian chơi"
|
||||
},
|
||||
@@ -380,6 +410,15 @@
|
||||
"analytics.table.csv.selected-range": {
|
||||
"message": "Phạm Vi Được Chọn"
|
||||
},
|
||||
"analytics.table.duration.days": {
|
||||
"message": "{count, plural, other {# ngày}}"
|
||||
},
|
||||
"analytics.table.duration.hours": {
|
||||
"message": "{count, plural, other {# giờ}}"
|
||||
},
|
||||
"analytics.table.duration.minutes": {
|
||||
"message": "{count, plural, other {# phút}}"
|
||||
},
|
||||
"analytics.table.empty.no-matching-rows": {
|
||||
"message": "Không mục thống kê nào giống với mục tìm kiếm"
|
||||
},
|
||||
@@ -953,6 +992,9 @@
|
||||
"create-project-version.create-modal.stage.add-files.admonition": {
|
||||
"message": "Các tệp bổ trợ dùng cho các tài nguyên hỗ trợ như mã nguồn, không dùng cho các phiên bản hoặc biến thể thay thế."
|
||||
},
|
||||
"create.collection.collection-info": {
|
||||
"message": "Bộ sưu tập mới của bạn sẽ được tạo dưới dạng bộ sưu tập công khai với {count, plural, =0 {không có dự án} other {# dự án}}."
|
||||
},
|
||||
"create.collection.create-collection": {
|
||||
"message": "Tạo bộ sưu tập"
|
||||
},
|
||||
@@ -1115,6 +1157,9 @@
|
||||
"dashboard.affiliate-links.search": {
|
||||
"message": "Tìm kiếm link affiliate..."
|
||||
},
|
||||
"dashboard.analytics.from-projects": {
|
||||
"message": "từ {count} {count, plural, other {dự án}} khác"
|
||||
},
|
||||
"dashboard.analytics.total-downloads": {
|
||||
"message": "Tổng số lượt tải xuống"
|
||||
},
|
||||
@@ -1409,6 +1454,24 @@
|
||||
"dashboard.creator-withdraw-modal.withdraw-limit-used": {
|
||||
"message": "Bạn đã sử dụng hết giới hạn rút tiền <b>{withdrawLimit}</b>. Bạn cần hoàn thành biểu mẫu thuế để rút thêm."
|
||||
},
|
||||
"dashboard.discord-roles.banner.body": {
|
||||
"message": "Bạn đủ điều kiện cho vai trò {roles}. Hãy liên kết tài khoản Discord với Modrinth và chúng tôi sẽ đồng bộ chúng tự động."
|
||||
},
|
||||
"dashboard.discord-roles.banner.cta": {
|
||||
"message": "Liên kết với Discord"
|
||||
},
|
||||
"dashboard.discord-roles.banner.title": {
|
||||
"message": "Nhận vai trò Discord của bạn"
|
||||
},
|
||||
"dashboard.discord-roles.role.big-creator": {
|
||||
"message": "1M+ Downloads"
|
||||
},
|
||||
"dashboard.discord-roles.role.creator": {
|
||||
"message": "Creator"
|
||||
},
|
||||
"dashboard.discord-roles.role.pride": {
|
||||
"message": "Pride 2026"
|
||||
},
|
||||
"dashboard.head-title": {
|
||||
"message": "Bảng điều khiển"
|
||||
},
|
||||
@@ -1433,6 +1496,9 @@
|
||||
"dashboard.organizations.error.fetch": {
|
||||
"message": "Không thể tải tổ chức"
|
||||
},
|
||||
"dashboard.organizations.member-count": {
|
||||
"message": "{count} {count, plural,other {thành viên}}"
|
||||
},
|
||||
"dashboard.organizations.title": {
|
||||
"message": "Tổ chức"
|
||||
},
|
||||
@@ -1478,6 +1544,9 @@
|
||||
"dashboard.projects.links.button.edit": {
|
||||
"message": "Sửa liên kết"
|
||||
},
|
||||
"dashboard.projects.links.changes-applied": {
|
||||
"message": "<strong>{count}</strong> {count, plural, other {dự án}} sẽ được thay đổi."
|
||||
},
|
||||
"dashboard.projects.links.description": {
|
||||
"message": "Bất kể đường liên kết nào bạn nhập ở dưới sẽ được ghi đè lên các dự án được chọn. Mục nào để trống sẽ được bỏ qua. Bạn có thể xóa đường liên kết trong tất cả các dự án được chọn bằng nút thùng rác."
|
||||
},
|
||||
@@ -1895,6 +1964,9 @@
|
||||
"frog.title": {
|
||||
"message": "Ếch"
|
||||
},
|
||||
"hosting-marketing.available-locations": {
|
||||
"message": "Có mặt tại Bắc Mỹ, Châu Âu, Đông Nam Á và Úc với độ phủ sóng rộng."
|
||||
},
|
||||
"hosting-marketing.billing.monthly": {
|
||||
"message": "Thanh toán hàng tháng"
|
||||
},
|
||||
@@ -1955,6 +2027,9 @@
|
||||
"hosting-marketing.faq.location": {
|
||||
"message": "Những máy chủ Modrinth Hosting được nằm ở đâu? Tôi có thể chọn khu vực không?"
|
||||
},
|
||||
"hosting-marketing.faq.location.answer": {
|
||||
"message": "Hiện giờ chúng tôi có máy chủ khắp Bắc Mỹ, Châu Âu, Đông Nam Á và Úc mà bạn có thể chọn khi mua. Sẽ có thêm khu vực trong tương lai! Nếu bạn muốn đổi khu vực, hãy liên hệ đội hỗ trợ."
|
||||
},
|
||||
"hosting-marketing.faq.versions-loaders": {
|
||||
"message": "Những phiên bản Minecraft và modloader nào có thể được sử dụng?"
|
||||
},
|
||||
@@ -2228,6 +2303,9 @@
|
||||
"landing.subheading": {
|
||||
"message": "Khám phá, chơi và chia sẻ nội dung Minecraft thông qua nền tảng nguồn mở được xây dựng cho cộng đồng."
|
||||
},
|
||||
"layout.action.analytics-events": {
|
||||
"message": "Sự kiện phân tích"
|
||||
},
|
||||
"layout.action.change-theme": {
|
||||
"message": "Đổi chủ đề"
|
||||
},
|
||||
@@ -2774,12 +2852,18 @@
|
||||
"muralpay.warning.wallet-address": {
|
||||
"message": "Hãy kiểm tra kỹ địa chỉ ví. Số tiền gửi đến địa chỉ không chính xác sẽ không thể khôi phục."
|
||||
},
|
||||
"organization.settings.projects.edit-links.affected-projects": {
|
||||
"message": "{count, plural, other {# dự án}} sẽ được thay đổi."
|
||||
},
|
||||
"profile.bio.fallback.creator": {
|
||||
"message": "Một nhà sáng tạo trên Modrinth."
|
||||
},
|
||||
"profile.bio.fallback.user": {
|
||||
"message": "Một người dùng Modrinth."
|
||||
},
|
||||
"profile.button.analytics": {
|
||||
"message": "Xem phân tích người dùng"
|
||||
},
|
||||
"profile.button.billing": {
|
||||
"message": "Quản lý thanh toán người dùng"
|
||||
},
|
||||
@@ -2798,6 +2882,9 @@
|
||||
"profile.button.set-affiliate": {
|
||||
"message": "Đặt làm affiliate"
|
||||
},
|
||||
"profile.collection.projects-count": {
|
||||
"message": "{count, plural, other {# dự án}}"
|
||||
},
|
||||
"profile.details.label.auth-providers": {
|
||||
"message": "Nhà cung cấp xác thực"
|
||||
},
|
||||
@@ -2873,6 +2960,9 @@
|
||||
"profile.official-account.bio": {
|
||||
"message": "Tài khoản chính thức của Modrinth. Nhận hỗ trợ từ <support-link></support-link> hoặc qua email tại <email></email>"
|
||||
},
|
||||
"profile.stats.projects-followers": {
|
||||
"message": "{count, plural, other {<stat>{count}</stat> người theo dõi dự án}}"
|
||||
},
|
||||
"profile.user-id": {
|
||||
"message": "ID người dùng: {id}"
|
||||
},
|
||||
@@ -3305,18 +3395,33 @@
|
||||
"project.settings.permissions.learn-more": {
|
||||
"message": "Tìm hiểu thêm"
|
||||
},
|
||||
"project.settings.permissions.search-placeholder": {
|
||||
"message": "Tìm kiếm trong {count} {count, plural,other {dự án ngoài}}..."
|
||||
},
|
||||
"project.settings.title": {
|
||||
"message": "Cài đặt"
|
||||
},
|
||||
"project.settings.visit-dashboard": {
|
||||
"message": "Truy cập bảng điều khiển dự án"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "{count, plural, other {lượt tải}}"
|
||||
},
|
||||
"project.stats.followers-label": {
|
||||
"message": "{count, plural, other {lượt theo dõi}}"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "{title} đã được lưu trữ. {title} sẽ không nhận được bất kỳ bản cập nhật nào trong tương lai trừ khi tác giả quyết định hủy lưu trữ dự án."
|
||||
},
|
||||
"project.versions.title": {
|
||||
"message": "Phiên bản"
|
||||
},
|
||||
"project.versions.withheld-versions-warning.description": {
|
||||
"message": "{count, plural, other {Những phiên bản này}} bị giữ lại và không được công khai. Vui lòng đưa ra bằng chứng rằng bạn có quyền để đăng tải một số tệp đưọc bao gồm trong {count, plural, other {các phiên bản}} modpack đó."
|
||||
},
|
||||
"project.versions.withheld-versions-warning.title": {
|
||||
"message": "{count, plural, other{Phiên bản}} bị giữ lại do chứa nội dung nhúng không xác định"
|
||||
},
|
||||
"report.already-reported": {
|
||||
"message": "Bạn đã báo cáo {title}"
|
||||
},
|
||||
|
||||
@@ -107,6 +107,9 @@
|
||||
"analytics.chart.empty.select-table-items": {
|
||||
"message": "从下表中选择项目以可视化您的数据。"
|
||||
},
|
||||
"analytics.chart.events.count-aria": {
|
||||
"message": "{count, plural,other {# 个分析事件}}"
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>:{title}"
|
||||
},
|
||||
@@ -132,7 +135,7 @@
|
||||
"message": "是否在图中显示全部 {count} 行?"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, one {# 天} other {# 天}}"
|
||||
"message": "{count, plural, other {# 天}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.hours": {
|
||||
"message": "{count, plural, one {# 小时} other {# 小时}}"
|
||||
@@ -405,7 +408,7 @@
|
||||
"message": "选择范围"
|
||||
},
|
||||
"analytics.table.duration.days": {
|
||||
"message": "{count, plural, one {# 天} other {# 天}}"
|
||||
"message": "{count, plural, other {# 天}}"
|
||||
},
|
||||
"analytics.table.duration.hours": {
|
||||
"message": "{count, plural, one {# 小时} other {# 小时}}"
|
||||
@@ -723,10 +726,10 @@
|
||||
"message": "重置你的密码"
|
||||
},
|
||||
"auth.sign-in.2fa.description": {
|
||||
"message": "请输入双重身份验证代码以继续。"
|
||||
"message": "请输入双重验证代码以便继续操作。"
|
||||
},
|
||||
"auth.sign-in.2fa.label": {
|
||||
"message": "输入双重身份验证代码"
|
||||
"message": "输入双重验证代码"
|
||||
},
|
||||
"auth.sign-in.2fa.placeholder": {
|
||||
"message": "输入验证码…"
|
||||
@@ -986,6 +989,9 @@
|
||||
"create-project-version.create-modal.stage.add-files.admonition": {
|
||||
"message": "补充文件仅用来保存源代码等支持性资料,不能用来存放替代版本或者变体文件。"
|
||||
},
|
||||
"create.collection.collection-info": {
|
||||
"message": "将创建一个公开收藏夹,包含{count, plural, =0 {0个项目} other {#个项目}}。"
|
||||
},
|
||||
"create.collection.create-collection": {
|
||||
"message": "新建收藏夹"
|
||||
},
|
||||
@@ -1148,6 +1154,9 @@
|
||||
"dashboard.affiliate-links.search": {
|
||||
"message": "搜索推广链接…"
|
||||
},
|
||||
"dashboard.analytics.from-projects": {
|
||||
"message": "来自 {count} {count, plural, other {个项目}}"
|
||||
},
|
||||
"dashboard.analytics.total-downloads": {
|
||||
"message": "总下载量"
|
||||
},
|
||||
@@ -1169,6 +1178,9 @@
|
||||
"dashboard.collections.empty.no-match-hint": {
|
||||
"message": "尝试调整你的过滤器或搜索词。"
|
||||
},
|
||||
"dashboard.collections.label.projects-count": {
|
||||
"message": "{count} {countPlural, plural, other {个项目}}"
|
||||
},
|
||||
"dashboard.collections.label.search-input": {
|
||||
"message": "搜索你的收藏夹"
|
||||
},
|
||||
@@ -1469,6 +1481,9 @@
|
||||
"dashboard.notifications.link.view-history": {
|
||||
"message": "查看历史通知"
|
||||
},
|
||||
"dashboard.notifications.link.view-more": {
|
||||
"message": "查看更多 {extraNotifs} 个{extraNotifs, plural, other {通知}}"
|
||||
},
|
||||
"dashboard.organizations.button.create": {
|
||||
"message": "创建组织"
|
||||
},
|
||||
@@ -1478,6 +1493,9 @@
|
||||
"dashboard.organizations.error.fetch": {
|
||||
"message": "获取组织失败"
|
||||
},
|
||||
"dashboard.organizations.member-count": {
|
||||
"message": "{count} {count, plural, other {名成员}}"
|
||||
},
|
||||
"dashboard.organizations.title": {
|
||||
"message": "组织"
|
||||
},
|
||||
@@ -1523,6 +1541,9 @@
|
||||
"dashboard.projects.links.button.edit": {
|
||||
"message": "编辑链接"
|
||||
},
|
||||
"dashboard.projects.links.changes-applied": {
|
||||
"message": "更改将应用到 <strong>{count}</strong> {count, plural, other {个项目}}。"
|
||||
},
|
||||
"dashboard.projects.links.description": {
|
||||
"message": "以下你指定的任何链接,都会覆盖所选项目上的现有链接。留空的内容将被忽略。你可以使用垃圾桶按钮从所有选定的项目中清除某个链接。"
|
||||
},
|
||||
@@ -2894,6 +2915,9 @@
|
||||
"profile.label.collection": {
|
||||
"message": "收藏夹"
|
||||
},
|
||||
"profile.label.downloads": {
|
||||
"message": "{count} {countPlural, plural, other {次下载}}"
|
||||
},
|
||||
"profile.label.joined": {
|
||||
"message": "加入于"
|
||||
},
|
||||
@@ -2912,6 +2936,9 @@
|
||||
"profile.label.organizations": {
|
||||
"message": "组织"
|
||||
},
|
||||
"profile.label.projects": {
|
||||
"message": "{count} {countPlural, plural, other {个项目}}"
|
||||
},
|
||||
"profile.label.saving": {
|
||||
"message": "正在保存…"
|
||||
},
|
||||
@@ -2927,6 +2954,9 @@
|
||||
"profile.official-account.bio": {
|
||||
"message": "Modrinth的官方用户账号。在<support-link></support-link>处获取支持或通过电子邮件<email></email>获取支持。"
|
||||
},
|
||||
"profile.stats.projects-followers": {
|
||||
"message": "{count, plural, other {<stat>{count}</stat>项目关注者}}"
|
||||
},
|
||||
"profile.user-id": {
|
||||
"message": "用户ID:{id}"
|
||||
},
|
||||
@@ -3368,6 +3398,12 @@
|
||||
"project.settings.visit-dashboard": {
|
||||
"message": "访问项目的控制面板"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "{count, plural, other {下载}}"
|
||||
},
|
||||
"project.stats.followers-label": {
|
||||
"message": "{count, plural, other {关注者}}"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "{title} 已归档。除非作者决定取消归档,否则 {title} 将不再更新。"
|
||||
},
|
||||
@@ -3375,7 +3411,7 @@
|
||||
"message": "版本"
|
||||
},
|
||||
"project.versions.withheld-versions-warning.description": {
|
||||
"message": "{count, plural, one {此版本已保留且未公开列出。} other {这些版本已保留且未公开列出。}} 请提供证明,证明你有权重新分发该模组包{count, plural, one {版本} other {各版本}}中包含的某些文件。"
|
||||
"message": "{count, plural, other {此版本}}已保留且未公开列出。请提供你有权重新分发此模组包{count, plural, other {版本}}所包含的某些文件的证明。"
|
||||
},
|
||||
"project.versions.withheld-versions-warning.title": {
|
||||
"message": "{count, plural, one {版本 {version_name}} other {这些版本}} 因未知嵌入内容被保留"
|
||||
@@ -3945,19 +3981,19 @@
|
||||
"message": "账户安全"
|
||||
},
|
||||
"settings.account.security.two-factor.action.remove": {
|
||||
"message": "移除 2FA"
|
||||
"message": "移除双重验证"
|
||||
},
|
||||
"settings.account.security.two-factor.action.setup": {
|
||||
"message": "设置 2FA"
|
||||
"message": "设置双重验证"
|
||||
},
|
||||
"settings.account.security.two-factor.description": {
|
||||
"message": "在登录时为您的账户增加一层额外的安全保障。"
|
||||
},
|
||||
"settings.account.security.two-factor.modal.remove.header": {
|
||||
"message": "移除2重验证"
|
||||
"message": "移除双重验证"
|
||||
},
|
||||
"settings.account.security.two-factor.modal.setup.header": {
|
||||
"message": "设置2重验证"
|
||||
"message": "设置双重验证"
|
||||
},
|
||||
"settings.account.security.two-factor.title": {
|
||||
"message": "双因素认证"
|
||||
|
||||
@@ -23,6 +23,15 @@
|
||||
"analytics.breakdown.country": {
|
||||
"message": "國家或地區"
|
||||
},
|
||||
"analytics.breakdown.dependent-on": {
|
||||
"message": "依賴於"
|
||||
},
|
||||
"analytics.breakdown.dependent-project-download": {
|
||||
"message": "依賴專案"
|
||||
},
|
||||
"analytics.breakdown.dependent-project-type": {
|
||||
"message": "依賴專案類型"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "下載原因"
|
||||
},
|
||||
@@ -38,6 +47,9 @@
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "載入器"
|
||||
},
|
||||
"analytics.breakdown.members": {
|
||||
"message": "成員"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "營利情形"
|
||||
},
|
||||
@@ -69,7 +81,7 @@
|
||||
"message": "{hours} 小時"
|
||||
},
|
||||
"analytics.chart.controls.active-count": {
|
||||
"message": "{count} 項啟用中"
|
||||
"message": "已啟用 {count} 項"
|
||||
},
|
||||
"analytics.chart.controls.annotations": {
|
||||
"message": "註釋"
|
||||
@@ -107,6 +119,9 @@
|
||||
"analytics.chart.empty.select-table-items": {
|
||||
"message": "從表格選取項目來視覺化你的數據。"
|
||||
},
|
||||
"analytics.chart.events.count-aria": {
|
||||
"message": "{count, plural, other {# 個分析事件}}"
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>:{title}"
|
||||
},
|
||||
@@ -125,6 +140,39 @@
|
||||
"analytics.chart.legend.previous-period-suffix": {
|
||||
"message": "{name}(上一期)"
|
||||
},
|
||||
"analytics.chart.render-limit.description": {
|
||||
"message": "顯示表格中所有已選取的資料列可能會降低頁面效能。"
|
||||
},
|
||||
"analytics.chart.render-limit.header": {
|
||||
"message": "要在圖表中顯示所有 {count} 個資料列嗎?"
|
||||
},
|
||||
"analytics.chart.table-selection.all": {
|
||||
"message": "正在顯示表格中的所有{itemType, select, project {{count, plural, other {專案}}} country {{count, plural, other {國家/地區}}} monetization {{count, plural, other {營利情形}}} downloadSource {{count, plural, other {下載來源}}} downloadReason {{count, plural, other {下載原因}}} member {{count, plural, other {成員}}} projectVersion {{count, plural, other {專案版本}}} loader {{count, plural, other {載入器}}} gameVersion {{count, plural, other {遊戲版本}}} other {{count, plural, other {項目}}}}"
|
||||
},
|
||||
"analytics.chart.table-selection.count": {
|
||||
"message": "正在顯示表格中的 {count} 個{itemType, select, project {{count, plural, other {專案}}} country {{count, plural, other {國家/地區}}} monetization {{count, plural, other {營利情形}}} downloadSource {{count, plural, other {下載來源}}} downloadReason {{count, plural, other {下載原因}}} member {{count, plural, other {成員}}} projectVersion {{count, plural, other {專案版本}}} loader {{count, plural, other {載入器}}} gameVersion {{count, plural, other {遊戲版本}}} other {{count, plural, other {項目}}}}"
|
||||
},
|
||||
"analytics.chart.table-selection.limited": {
|
||||
"message": "正在顯示表格中的 {limit} 個{itemType, select, project {{limit, plural, other {專案}}} country {{limit, plural, other {國家/地區}}} monetization {{limit, plural, other {營利情形}}} downloadSource {{limit, plural, other {下載來源}}} downloadReason {{limit, plural, other {下載原因}}} member {{limit, plural, other {成員}}} projectVersion {{limit, plural, other {專案版本}}} loader {{limit, plural, other {載入器}}} gameVersion {{limit, plural, other {遊戲版本}}} other {{limit, plural, other {項目}}}}"
|
||||
},
|
||||
"analytics.chart.table-selection.top": {
|
||||
"message": "正在顯示表格中的前 {count} 個{itemType, select, project {{count, plural, other {專案}}} country {{count, plural, other {國家/地區}}} monetization {{count, plural, other {營利情形}}} downloadSource {{count, plural, other {下載來源}}} downloadReason {{count, plural, other {下載原因}}} member {{count, plural, other {成員}}} projectVersion {{count, plural, other {專案版本}}} loader {{count, plural, other {載入器}}} gameVersion {{count, plural, other {遊戲版本}}} other {{count, plural, other {項目}}}}"
|
||||
},
|
||||
"analytics.chart.tooltip.dependent-on-project": {
|
||||
"message": "依賴於 {project}"
|
||||
},
|
||||
"analytics.chart.tooltip.dependent-project-version": {
|
||||
"message": "{dependentProject} 依賴於 {dependencyProject},{version}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, other {# 天}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.hours": {
|
||||
"message": "{count, plural, other {# 小時}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.minutes": {
|
||||
"message": "{count, plural, other {# 分鐘}}"
|
||||
},
|
||||
"analytics.chart.tooltip.hide-entry": {
|
||||
"message": "在圖表中隱藏 {name}"
|
||||
},
|
||||
@@ -153,7 +201,7 @@
|
||||
"message": "曲線圖"
|
||||
},
|
||||
"analytics.download-reason.dependency": {
|
||||
"message": "前置模組"
|
||||
"message": "相依項"
|
||||
},
|
||||
"analytics.download-reason.modpack": {
|
||||
"message": "模組包"
|
||||
@@ -176,12 +224,18 @@
|
||||
"analytics.empty.no-data": {
|
||||
"message": "暫無可用數據"
|
||||
},
|
||||
"analytics.empty.no-data-for-analytics": {
|
||||
"message": "暫無可供分析的數據"
|
||||
},
|
||||
"analytics.empty.no-projects": {
|
||||
"message": "暫無可用專案"
|
||||
},
|
||||
"analytics.empty.no-projects-for-analytics": {
|
||||
"message": "暫無可供分析的專案"
|
||||
},
|
||||
"analytics.empty.select-project": {
|
||||
"message": "請選擇至少一個專案以查看數據"
|
||||
},
|
||||
"analytics.filter.game-version-type": {
|
||||
"message": "遊戲版本類型"
|
||||
},
|
||||
@@ -194,9 +248,15 @@
|
||||
"analytics.filter.search.countries": {
|
||||
"message": "搜尋國家或地區..."
|
||||
},
|
||||
"analytics.filter.search.dependent-projects": {
|
||||
"message": "搜尋專案..."
|
||||
},
|
||||
"analytics.filter.search.download-sources": {
|
||||
"message": "搜尋下載來源..."
|
||||
},
|
||||
"analytics.filter.search.members": {
|
||||
"message": "搜尋成員..."
|
||||
},
|
||||
"analytics.filter.search.project-versions": {
|
||||
"message": "搜尋專案版本..."
|
||||
},
|
||||
@@ -207,7 +267,7 @@
|
||||
"message": "下載量趨勢"
|
||||
},
|
||||
"analytics.graph.title.playtime": {
|
||||
"message": "遊玩時長趨勢"
|
||||
"message": "遊玩時數趨勢"
|
||||
},
|
||||
"analytics.graph.title.revenue": {
|
||||
"message": "收益趨勢"
|
||||
@@ -305,6 +365,9 @@
|
||||
"analytics.project.all": {
|
||||
"message": "所有專案"
|
||||
},
|
||||
"analytics.project.count": {
|
||||
"message": "{count, plural, other {# 個專案}}"
|
||||
},
|
||||
"analytics.project.icon-alt": {
|
||||
"message": "{name}圖示"
|
||||
},
|
||||
@@ -345,7 +408,7 @@
|
||||
"message": "盈利機制是如何運作的?"
|
||||
},
|
||||
"analytics.stat.playtime": {
|
||||
"message": "遊玩時長"
|
||||
"message": "遊玩時數"
|
||||
},
|
||||
"analytics.stat.playtime-hours": {
|
||||
"message": "{hours} 小時"
|
||||
@@ -378,11 +441,20 @@
|
||||
"message": "Modrinth 數據分析 - 按{breakdown} - {dateRange}"
|
||||
},
|
||||
"analytics.table.csv.header.playtime-seconds": {
|
||||
"message": "遊玩時長(秒)"
|
||||
"message": "遊玩時數(秒)"
|
||||
},
|
||||
"analytics.table.csv.selected-range": {
|
||||
"message": "選取範圍"
|
||||
},
|
||||
"analytics.table.duration.days": {
|
||||
"message": "{count, plural, other {# 天}}"
|
||||
},
|
||||
"analytics.table.duration.hours": {
|
||||
"message": "{count, plural, other {# 小時}}"
|
||||
},
|
||||
"analytics.table.duration.minutes": {
|
||||
"message": "{count, plural, other {# 分鐘}}"
|
||||
},
|
||||
"analytics.table.empty.no-matching-rows": {
|
||||
"message": "沒有符合條件的數據"
|
||||
},
|
||||
@@ -431,6 +503,12 @@
|
||||
"analytics.value.monetized": {
|
||||
"message": "可營利"
|
||||
},
|
||||
"analytics.value.no-dependent": {
|
||||
"message": "無"
|
||||
},
|
||||
"analytics.value.no-dependent-tooltip": {
|
||||
"message": "下載原因不是相依項"
|
||||
},
|
||||
"analytics.value.none": {
|
||||
"message": "無"
|
||||
},
|
||||
@@ -917,18 +995,48 @@
|
||||
"conversation-thread.reply-editor.placeholder.send": {
|
||||
"message": "傳送訊息..."
|
||||
},
|
||||
"conversation-thread.reply-modal.confirmation.description": {
|
||||
"message": "確認管理員不會主動查看此內容"
|
||||
},
|
||||
"conversation-thread.reply-modal.confirmation.label": {
|
||||
"message": "我了解管理員不會主動查看這個討論串。"
|
||||
},
|
||||
"conversation-thread.reply-modal.description": {
|
||||
"message": "你的專案已獲核准。因此,管理團隊不會主動查看這個討論串。不過,如果你的專案出現問題,他們仍可能會看到你的訊息。"
|
||||
},
|
||||
"conversation-thread.reply-modal.header": {
|
||||
"message": "回覆討論串"
|
||||
},
|
||||
"conversation-thread.reply-modal.help-center-note": {
|
||||
"message": "如果你需要聯絡管理團隊,請前往 <help-center-link>Modrinth 說明中心</help-center-link>,並按一下右下角的藍色對話氣泡以聯絡客服團隊。"
|
||||
},
|
||||
"conversation-thread.resubmit-modal.confirmation.description": {
|
||||
"message": "確認我解決了管理員提到的問題"
|
||||
},
|
||||
"conversation-thread.resubmit-modal.confirmation.label": {
|
||||
"message": "我確認管理員所提到的問題皆已解決。"
|
||||
},
|
||||
"conversation-thread.resubmit-modal.description": {
|
||||
"message": "你即將提交 <project-title>{projectTitle}</project-title> 給管理員再次審查。"
|
||||
},
|
||||
"conversation-thread.resubmit-modal.header.resubmitting": {
|
||||
"message": "重新提交審查"
|
||||
},
|
||||
"conversation-thread.resubmit-modal.header.submitting": {
|
||||
"message": "提交審查"
|
||||
},
|
||||
"conversation-thread.resubmit-modal.reminder": {
|
||||
"message": "請務必確認你解決了管理團隊提出的所有問題。"
|
||||
},
|
||||
"conversation-thread.resubmit-modal.warning": {
|
||||
"message": "在未解決管理員提出的問題的情況下反覆提交審查,可能會導致帳號被停權。"
|
||||
},
|
||||
"create-project-version.create-modal.stage.add-files.admonition": {
|
||||
"message": "補充檔案是用於提供原始碼等支援性資源,而非用於替代版本或變體。"
|
||||
},
|
||||
"create.collection.collection-info": {
|
||||
"message": "你的新收藏將建立為公開收藏,{count, plural, =0 {不包含任何專案} other {包含 # 個專案}}。"
|
||||
},
|
||||
"create.collection.create-collection": {
|
||||
"message": "建立收藏"
|
||||
},
|
||||
@@ -1091,6 +1199,9 @@
|
||||
"dashboard.affiliate-links.search": {
|
||||
"message": "搜尋聯盟連結..."
|
||||
},
|
||||
"dashboard.analytics.from-projects": {
|
||||
"message": "來自 {count} 個{count, plural, other {專案}}"
|
||||
},
|
||||
"dashboard.analytics.total-downloads": {
|
||||
"message": "總下載量"
|
||||
},
|
||||
@@ -1112,6 +1223,9 @@
|
||||
"dashboard.collections.empty.no-match-hint": {
|
||||
"message": "試試調整篩選器或搜尋字詞。"
|
||||
},
|
||||
"dashboard.collections.label.projects-count": {
|
||||
"message": "{count} 個{countPlural, plural, other {專案}}"
|
||||
},
|
||||
"dashboard.collections.label.search-input": {
|
||||
"message": "搜尋收藏"
|
||||
},
|
||||
@@ -1412,6 +1526,9 @@
|
||||
"dashboard.notifications.link.view-history": {
|
||||
"message": "查看通知紀錄"
|
||||
},
|
||||
"dashboard.notifications.link.view-more": {
|
||||
"message": "查看另外 {extraNotifs} 則{extraNotifs, plural, other {通知}}"
|
||||
},
|
||||
"dashboard.organizations.button.create": {
|
||||
"message": "建立組織"
|
||||
},
|
||||
@@ -1421,6 +1538,9 @@
|
||||
"dashboard.organizations.error.fetch": {
|
||||
"message": "無法取得組織資訊"
|
||||
},
|
||||
"dashboard.organizations.member-count": {
|
||||
"message": "{count} 位{count, plural, other {成員}}"
|
||||
},
|
||||
"dashboard.organizations.title": {
|
||||
"message": "組織"
|
||||
},
|
||||
@@ -1466,6 +1586,9 @@
|
||||
"dashboard.projects.links.button.edit": {
|
||||
"message": "編輯連結"
|
||||
},
|
||||
"dashboard.projects.links.changes-applied": {
|
||||
"message": "變更將套用於<strong>{count}</strong> 個{count, plural, other {專案}}。"
|
||||
},
|
||||
"dashboard.projects.links.description": {
|
||||
"message": "你在下方指定的任何連結都將覆蓋到每個選定的專案中。留空的連結將被忽略。你可以使用垃圾桶按鈕從所有選定的專案中清除連結。"
|
||||
},
|
||||
@@ -1772,6 +1895,9 @@
|
||||
"discover.install.heading.reset-modpack": {
|
||||
"message": "在重設後選擇要安裝的模組包"
|
||||
},
|
||||
"discover.seo.description": {
|
||||
"message": "在 Modrinth 搜尋並瀏覽數千個 Minecraft {projectType},即時獲得精準的搜尋結果。我們的篩選功能可協助你快速找到最優質的 Minecraft {projectType}。"
|
||||
},
|
||||
"discover.seo.title": {
|
||||
"message": "搜尋 {projectType}"
|
||||
},
|
||||
@@ -2640,10 +2766,10 @@
|
||||
"message": "CBU(阿根廷銀行帳戶碼)或 CVU(虛擬帳戶碼)"
|
||||
},
|
||||
"muralpay.help.cci": {
|
||||
"message": "跨行帳戶代碼 (CCI)"
|
||||
"message": "秘魯境內跨行匯款帳號(Código de Cuenta Interbancaria)"
|
||||
},
|
||||
"muralpay.help.clabe": {
|
||||
"message": "銀行標準代碼 (CLABE)"
|
||||
"message": "銀行標準代碼(墨西哥銀行帳號)"
|
||||
},
|
||||
"muralpay.help.cpf-cnpj": {
|
||||
"message": "巴西稅務識別碼"
|
||||
@@ -2768,6 +2894,9 @@
|
||||
"muralpay.warning.wallet-address": {
|
||||
"message": "請仔細檢查你的錢包帳戶。發送到錯誤帳戶的款項將無法追回。"
|
||||
},
|
||||
"organization.settings.projects.edit-links.affected-projects": {
|
||||
"message": "變更將套用於 {count, plural, other {# 個專案}}。"
|
||||
},
|
||||
"profile.bio.fallback.creator": {
|
||||
"message": "一位 Modrinth 創作者。"
|
||||
},
|
||||
@@ -2795,6 +2924,9 @@
|
||||
"profile.button.set-affiliate": {
|
||||
"message": "設為聯盟行銷夥伴"
|
||||
},
|
||||
"profile.collection.projects-count": {
|
||||
"message": "{count, plural, other {# 個專案}}"
|
||||
},
|
||||
"profile.details.label.auth-providers": {
|
||||
"message": "驗證提供者"
|
||||
},
|
||||
@@ -2831,6 +2963,9 @@
|
||||
"profile.label.collection": {
|
||||
"message": "收藏"
|
||||
},
|
||||
"profile.label.downloads": {
|
||||
"message": "下載次數:{count}"
|
||||
},
|
||||
"profile.label.joined": {
|
||||
"message": "加入時間"
|
||||
},
|
||||
@@ -2849,6 +2984,9 @@
|
||||
"profile.label.organizations": {
|
||||
"message": "組織"
|
||||
},
|
||||
"profile.label.projects": {
|
||||
"message": "{count} 個{countPlural, plural, other {專案}}"
|
||||
},
|
||||
"profile.label.saving": {
|
||||
"message": "儲存中..."
|
||||
},
|
||||
@@ -2861,6 +2999,12 @@
|
||||
"profile.official-account": {
|
||||
"message": "Modrinth 官方帳號"
|
||||
},
|
||||
"profile.official-account.bio": {
|
||||
"message": "Modrinth 的官方使用者帳號。請至 <support-link></support-link> 取得支援,或透過電子郵件 <email></email> 聯絡客服團隊"
|
||||
},
|
||||
"profile.stats.projects-followers": {
|
||||
"message": "{count, plural, other {<stat>{count}</stat> 位專案追蹤者}}"
|
||||
},
|
||||
"profile.user-id": {
|
||||
"message": "使用者 ID:{id}"
|
||||
},
|
||||
@@ -3119,6 +3263,18 @@
|
||||
"project.license.title": {
|
||||
"message": "授權條款"
|
||||
},
|
||||
"project.moderation.admonition.approved.body.private": {
|
||||
"message": "你的專案目前設為私人,這代表只有你和你邀請的人才能存取。"
|
||||
},
|
||||
"project.moderation.admonition.approved.body.public": {
|
||||
"message": "你的專案已在 Modrinth 上發布並可供他人搜尋探索。"
|
||||
},
|
||||
"project.moderation.admonition.approved.body.unlisted": {
|
||||
"message": "你的專案目前設為不公開,這代表專案只能透過直接連結存取,無法在 Modrinth 上被搜尋到。"
|
||||
},
|
||||
"project.moderation.admonition.approved.body.visibility-message": {
|
||||
"message": "你可以前往專案的<visibility-settings-link>瀏覽權限設定</visibility-settings-link>來變更瀏覽權限。"
|
||||
},
|
||||
"project.moderation.admonition.approved.header": {
|
||||
"message": "專案已獲核准"
|
||||
},
|
||||
@@ -3236,12 +3392,21 @@
|
||||
"project.settings.permissions.learn-more": {
|
||||
"message": "了解更多"
|
||||
},
|
||||
"project.settings.permissions.search-placeholder": {
|
||||
"message": "搜尋 {count} 個{count, plural, other {外部專案}}..."
|
||||
},
|
||||
"project.settings.title": {
|
||||
"message": "設定"
|
||||
},
|
||||
"project.settings.visit-dashboard": {
|
||||
"message": "前往專案資訊主頁"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "{count, plural, other {下載}}"
|
||||
},
|
||||
"project.stats.followers-label": {
|
||||
"message": "{count, plural, other {追蹤者}}"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "{title} 已封存。{title} 將不會再收到任何後續更新,除非作者決定解除封存該專案。"
|
||||
},
|
||||
@@ -3837,7 +4002,7 @@
|
||||
"message": "雙重驗證"
|
||||
},
|
||||
"settings.account.two-factor.backup.intro": {
|
||||
"message": "請下載並將這些備份碼妥善儲存在安全的地方。如果日後無法存取你的裝置,可以使用這些備份碼來替代雙重驗證碼。請務必像保護密碼一樣妥善保管這些備份碼。"
|
||||
"message": "請下載並將這些備用碼妥善儲存在安全的地方。如果日後無法存取你的裝置,可以使用這些備用碼來替代雙重驗證碼。請務必像保護密碼一樣妥善保管這些備用碼。"
|
||||
},
|
||||
"settings.account.two-factor.backup.single-use": {
|
||||
"message": "備用碼只能使用一次。"
|
||||
|
||||
@@ -1125,7 +1125,7 @@ import MessageBanner from '~/components/ui/MessageBanner.vue'
|
||||
import ModerationChecklist from '~/components/ui/moderation/checklist/ModerationChecklist.vue'
|
||||
import ModerationProjectNags from '~/components/ui/moderation/ModerationProjectNags.vue'
|
||||
import ProjectMemberHeader from '~/components/ui/ProjectMemberHeader.vue'
|
||||
import { getSignInRouteObj } from '~/composables/auth.ts'
|
||||
import { getSignInRouteObj } from '~/composables/auth.js'
|
||||
import { saveFeatureFlags } from '~/composables/featureFlags.ts'
|
||||
import { STALE_TIME, STALE_TIME_LONG } from '~/composables/queries/project'
|
||||
import { versionQueryOptions } from '~/composables/queries/version'
|
||||
|
||||
@@ -297,7 +297,7 @@ const messages = defineMessages({
|
||||
},
|
||||
infoBannerDescription: {
|
||||
id: 'project.settings.permissions.info-banner.description',
|
||||
defaultMessage: `If you include content that isn’t hosted on Modrinth, you need to let us know where it’s from and verify that you have permission to distribute the files. Check out <link>our guide</link> to learn more and get started!`,
|
||||
defaultMessage: `If you include content that isn’t hosted on Modrinth, you need to let us know where it’s from and verify that you have permission to distribute the files. Check out <link>our announcement of this new system</link> to learn more!`,
|
||||
},
|
||||
learnMore: {
|
||||
id: 'project.settings.permissions.learn-more',
|
||||
@@ -428,7 +428,9 @@ function dismissInfoBanner() {
|
||||
>
|
||||
<IntlFormatted :message-id="messages.infoBannerDescription">
|
||||
<template #link="{ children }">
|
||||
<a class="text-link" target="_blank"> <component :is="() => children" /> </a>
|
||||
<nuxt-link class="text-link" to="/news/article/modpack-permissions/" target="_blank">
|
||||
<component :is="() => children" />
|
||||
</nuxt-link>
|
||||
</template>
|
||||
</IntlFormatted>
|
||||
<template #actions>
|
||||
|
||||
@@ -348,7 +348,7 @@ import {
|
||||
import { useTemplateRef, watch } from 'vue'
|
||||
|
||||
import CreateProjectVersionModal from '~/components/ui/create-project-version/CreateProjectVersionModal.vue'
|
||||
import { getSignInRouteObj } from '~/composables/auth.ts'
|
||||
import { getSignInRouteObj } from '~/composables/auth.js'
|
||||
import { reportVersion } from '~/utils/report-helpers.ts'
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
@@ -441,7 +441,7 @@ import { isStaff } from '@modrinth/utils'
|
||||
import { useMutation, useQuery, useQueryClient } from '@tanstack/vue-query'
|
||||
|
||||
import CreateProjectVersionModal from '~/components/ui/create-project-version/CreateProjectVersionModal.vue'
|
||||
import { getSignInRouteObj } from '~/composables/auth.ts'
|
||||
import { getSignInRouteObj } from '~/composables/auth.js'
|
||||
import { STALE_TIME } from '~/composables/queries/project'
|
||||
import { createDataPackVersion } from '~/helpers/package.js'
|
||||
import { reportVersion } from '~/utils/report-helpers.ts'
|
||||
|
||||
@@ -269,7 +269,7 @@ import {
|
||||
import { onMounted, useTemplateRef, watch } from 'vue'
|
||||
|
||||
import CreateProjectVersionModal from '~/components/ui/create-project-version/CreateProjectVersionModal.vue'
|
||||
import { getSignInRouteObj } from '~/composables/auth.ts'
|
||||
import { getSignInRouteObj } from '~/composables/auth.js'
|
||||
import { reportVersion } from '~/utils/report-helpers.ts'
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
@@ -8,9 +8,7 @@ useSeoMeta({
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
<div class="grid min-h-[calc(100vh-4.5rem)] place-items-center pb-20">
|
||||
<NuxtPage />
|
||||
</div>
|
||||
<NuxtPage class="auth-container universal-card" />
|
||||
</template>
|
||||
|
||||
<style>
|
||||
@@ -33,17 +31,19 @@ useSeoMeta({
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.auth-container .btn {
|
||||
.auth-container .btn-wrapper :is(a, button) {
|
||||
font-weight: 700;
|
||||
min-height: 2.5rem;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.centered-btn {
|
||||
.centered-btn :is(a, button),
|
||||
.centered-btn:is(a, button) {
|
||||
margin-inline: auto;
|
||||
}
|
||||
|
||||
.btn.continue-btn svg {
|
||||
.continue-btn :is(a, button) svg,
|
||||
.continue-btn:is(a, button) svg {
|
||||
margin: 0 0 0 0.5rem;
|
||||
}
|
||||
|
||||
@@ -54,19 +54,19 @@ useSeoMeta({
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.third-party .btn {
|
||||
.third-party a {
|
||||
width: 100%;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.third-party .btn svg {
|
||||
.third-party a svg {
|
||||
margin-right: var(--gap-sm);
|
||||
width: 1.25rem;
|
||||
height: 1.25rem;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 25.5rem) {
|
||||
.third-party .btn {
|
||||
.third-party a {
|
||||
grid-column: 1 / 3;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,33 +1,29 @@
|
||||
<template>
|
||||
<div
|
||||
class="universal-card flex w-full max-w-[28rem] flex-col gap-6 border border-solid border-surface-5"
|
||||
>
|
||||
<div v-if="authorizationError" class="flex flex-col gap-2.5">
|
||||
<h1 class="m-0 mx-auto text-xl font-semibold text-contrast">
|
||||
{{ formatMessage(messages.errorTitle) }}
|
||||
</h1>
|
||||
<p class="m-0">
|
||||
<span>{{ authorizationError.error }}: </span>
|
||||
{{ authorizationError.description }}
|
||||
<div>
|
||||
<div v-if="error" class="oauth-items">
|
||||
<div>
|
||||
<h1>{{ formatMessage(commonMessages.errorLabel) }}</h1>
|
||||
</div>
|
||||
<p>
|
||||
<span>{{ error.data?.error }}: </span>
|
||||
{{ error.data?.description }}
|
||||
</p>
|
||||
</div>
|
||||
<div v-else-if="app && createdBy && authorizationData" class="flex flex-col gap-6">
|
||||
<div class="mt-4 flex items-center justify-center">
|
||||
<div class="flex w-full flex-row items-center justify-evenly">
|
||||
<div v-else-if="app && createdBy && authorizationData" class="oauth-items">
|
||||
<div class="connected-items">
|
||||
<div class="profile-pics">
|
||||
<Avatar size="md" :src="app.icon_url" />
|
||||
<!-- <img class="profile-pic" :src="app.icon_url" alt="User profile picture" /> -->
|
||||
<div class="flex select-none items-center justify-center text-[2rem] text-primary">→</div>
|
||||
<Avatar size="md" circle :src="auth.user?.avatar_url" />
|
||||
<div class="connection-indicator">→</div>
|
||||
<Avatar size="md" circle :src="auth.user.avatar_url" />
|
||||
<!-- <img class="profile-pic" :src="auth.user.avatar_url" alt="User profile picture" /> -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="mx-auto">
|
||||
<h1 class="mb-0 ml-0 mr-0 mt-0 text-xl text-contrast">
|
||||
{{ formatMessage(messages.title, { appName: app.name }) }}
|
||||
</h1>
|
||||
<div class="title">
|
||||
<h1>{{ formatMessage(messages.title, { appName: app.name }) }}</h1>
|
||||
</div>
|
||||
<div class="flex flex-col gap-3">
|
||||
<div class="mb-3">
|
||||
<div class="auth-info">
|
||||
<div class="scope-heading">
|
||||
<IntlFormatted
|
||||
:message-id="messages.appInfo"
|
||||
:values="{
|
||||
@@ -47,11 +43,11 @@
|
||||
</template>
|
||||
</IntlFormatted>
|
||||
</div>
|
||||
<div class="flex flex-col gap-3">
|
||||
<div class="scope-items">
|
||||
<div v-for="scopeItem in scopeDefinitions" :key="scopeItem">
|
||||
<div class="flex flex-row items-center gap-2">
|
||||
<div class="grid h-5 min-h-5 w-5 min-w-5 place-content-center rounded-full bg-green">
|
||||
<CheckIcon class="text-sm text-black" />
|
||||
<div class="scope-item">
|
||||
<div class="scope-icon">
|
||||
<CheckIcon />
|
||||
</div>
|
||||
{{ scopeItem }}
|
||||
</div>
|
||||
@@ -72,11 +68,11 @@
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
<div class="flex flex-col gap-2 text-center">
|
||||
<p class="m-0 text-sm">
|
||||
<div class="redirection-notice">
|
||||
<p class="redirect-instructions">
|
||||
<IntlFormatted :message-id="messages.redirectUrl" :values="{ url: redirectUri }">
|
||||
<template #redirect-url="{ children }">
|
||||
<span class="font-bold">
|
||||
<span class="redirect-url">
|
||||
<component :is="() => normalizeChildren(children)" />
|
||||
</span>
|
||||
</template>
|
||||
@@ -87,7 +83,7 @@
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
<script setup>
|
||||
import { CheckIcon, XIcon } from '@modrinth/assets'
|
||||
import {
|
||||
Avatar,
|
||||
@@ -102,35 +98,10 @@ import {
|
||||
} from '@modrinth/ui'
|
||||
import { useQuery } from '@tanstack/vue-query'
|
||||
import { computed } from 'vue'
|
||||
import type { LocationQueryValue } from 'vue-router'
|
||||
|
||||
import { useAuth } from '@/composables/auth.js'
|
||||
import { useScopes } from '@/composables/auth/scopes.ts'
|
||||
|
||||
interface ApiErrorShape {
|
||||
data?: {
|
||||
description?: string
|
||||
error?: string
|
||||
}
|
||||
}
|
||||
|
||||
const getQueryString = (
|
||||
value: LocationQueryValue | LocationQueryValue[] | null | undefined,
|
||||
): string => {
|
||||
const firstValue = Array.isArray(value) ? value[0] : value
|
||||
return typeof firstValue === 'string' ? firstValue : ''
|
||||
}
|
||||
|
||||
const getErrorMessage = (error: unknown): string => {
|
||||
const apiError = error as ApiErrorShape
|
||||
if (typeof apiError?.data?.description === 'string') {
|
||||
return apiError.data.description
|
||||
}
|
||||
if (error instanceof Error) {
|
||||
return error.message
|
||||
}
|
||||
return String(error)
|
||||
}
|
||||
|
||||
const client = injectModrinthClient()
|
||||
const { addNotification } = injectNotificationManager()
|
||||
const { formatMessage } = useVIntl()
|
||||
@@ -153,10 +124,6 @@ const messages = defineMessages({
|
||||
id: 'auth.authorize.error.no-redirect-url',
|
||||
defaultMessage: 'No redirect location found in response',
|
||||
},
|
||||
missingParametersError: {
|
||||
id: 'auth.authorize.error.missing-parameters',
|
||||
defaultMessage: 'Missing required OAuth query parameters.',
|
||||
},
|
||||
redirectUrl: {
|
||||
id: 'auth.authorize.redirect-url',
|
||||
defaultMessage: 'You will be redirected to <redirect-url>{url}</redirect-url>',
|
||||
@@ -165,35 +132,33 @@ const messages = defineMessages({
|
||||
id: 'auth.authorize.authorize-app-name',
|
||||
defaultMessage: 'Authorize {appName}',
|
||||
},
|
||||
errorTitle: {
|
||||
id: 'auth.authorize.errro-title',
|
||||
defaultMessage: 'An Error Occured',
|
||||
},
|
||||
})
|
||||
|
||||
const router = useNativeRoute()
|
||||
const auth = await useAuth()
|
||||
const { scopesToDefinitions } = useScopes()
|
||||
|
||||
const clientId = computed(() => getQueryString(router.query.client_id))
|
||||
const redirectUri = computed(() => getQueryString(router.query.redirect_uri))
|
||||
const scope = computed(() => getQueryString(router.query.scope))
|
||||
const state = computed(() => getQueryString(router.query.state))
|
||||
const hasRequiredParams = computed(() => !!clientId.value && !!redirectUri.value && !!scope.value)
|
||||
const clientId = router.query?.client_id || false
|
||||
const redirectUri = router.query?.redirect_uri || false
|
||||
const scope = router.query?.scope || false
|
||||
const state = router.query?.state || false
|
||||
|
||||
const getFlowIdAuthorization = async () => {
|
||||
const authorization = await client.labrinth.oauth_internal.authorize({
|
||||
client_id: clientId.value,
|
||||
redirect_uri: redirectUri.value,
|
||||
scope: scope.value,
|
||||
...(state.value ? { state: state.value } : {}),
|
||||
})
|
||||
const params = {
|
||||
client_id: clientId,
|
||||
redirect_uri: redirectUri,
|
||||
scope,
|
||||
}
|
||||
if (state) {
|
||||
params.state = state
|
||||
}
|
||||
|
||||
const authorization = await client.labrinth.oauth_internal.authorize(params)
|
||||
|
||||
if (typeof authorization === 'string') {
|
||||
await navigateTo(authorization, {
|
||||
external: true,
|
||||
})
|
||||
return null
|
||||
}
|
||||
|
||||
return authorization
|
||||
@@ -205,60 +170,27 @@ const {
|
||||
error,
|
||||
suspense: authSusp,
|
||||
} = useQuery({
|
||||
queryKey: computed(() => [
|
||||
'authorization',
|
||||
clientId.value,
|
||||
redirectUri.value,
|
||||
scope.value,
|
||||
state.value,
|
||||
]),
|
||||
queryKey: computed(() => ['authorization', clientId, redirectUri, scope, state]),
|
||||
queryFn: getFlowIdAuthorization,
|
||||
enabled: hasRequiredParams,
|
||||
})
|
||||
|
||||
const authorizationError = computed(() => {
|
||||
if (!hasRequiredParams.value) {
|
||||
return {
|
||||
error: 'invalid_request',
|
||||
description: formatMessage(messages.missingParametersError),
|
||||
}
|
||||
}
|
||||
|
||||
const apiError = (error.value as ApiErrorShape | null)?.data
|
||||
if (apiError) {
|
||||
return apiError
|
||||
}
|
||||
|
||||
if (error.value) {
|
||||
return {
|
||||
error: 'server_error',
|
||||
description: getErrorMessage(error.value),
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
enabled: computed(() => !!clientId && !!redirectUri && !!scope),
|
||||
})
|
||||
|
||||
const { data: app, suspense: appSusp } = useQuery({
|
||||
queryKey: computed(() => ['oauth/app', clientId.value]),
|
||||
queryFn: () => client.labrinth.oauth_internal.getApp(clientId.value),
|
||||
enabled: computed(() => !!clientId.value),
|
||||
queryKey: computed(() => ['oauth/app', clientId]),
|
||||
queryFn: () => client.labrinth.oauth_internal.getApp(clientId),
|
||||
enabled: computed(() => !!clientId),
|
||||
})
|
||||
|
||||
const { data: createdBy, suspense: userSusp } = useQuery({
|
||||
queryKey: computed(() => ['user', app.value?.created_by]),
|
||||
queryFn: () => {
|
||||
if (!app.value?.created_by) {
|
||||
throw new Error('Missing OAuth app creator')
|
||||
}
|
||||
|
||||
return client.labrinth.users_v2.get(app.value.created_by)
|
||||
},
|
||||
queryFn: () => client.labrinth.users_v2.get(app.value.created_by),
|
||||
enabled: computed(() => !!app.value?.created_by),
|
||||
})
|
||||
|
||||
onServerPrefetch(async () => {
|
||||
await Promise.allSettled([authSusp(), appSusp(), userSusp()])
|
||||
await authSusp()
|
||||
await appSusp()
|
||||
await userSusp()
|
||||
})
|
||||
|
||||
const scopeDefinitions = computed(() =>
|
||||
@@ -267,10 +199,6 @@ const scopeDefinitions = computed(() =>
|
||||
|
||||
const onAuthorize = async () => {
|
||||
try {
|
||||
if (!authorizationData.value?.flow_id) {
|
||||
throw new Error(formatMessage(messages.noRedirectUrlError))
|
||||
}
|
||||
|
||||
const res = await client.labrinth.oauth_internal.accept({
|
||||
flow: authorizationData.value.flow_id,
|
||||
})
|
||||
@@ -286,7 +214,7 @@ const onAuthorize = async () => {
|
||||
} catch (err) {
|
||||
addNotification({
|
||||
title: formatMessage(commonMessages.errorNotificationTitle),
|
||||
text: getErrorMessage(err),
|
||||
text: err.data ? err.data.description : err,
|
||||
type: 'error',
|
||||
})
|
||||
}
|
||||
@@ -294,10 +222,6 @@ const onAuthorize = async () => {
|
||||
|
||||
const onReject = async () => {
|
||||
try {
|
||||
if (!authorizationData.value?.flow_id) {
|
||||
throw new Error(formatMessage(messages.noRedirectUrlError))
|
||||
}
|
||||
|
||||
const res = await client.labrinth.oauth_internal.reject({
|
||||
flow: authorizationData.value.flow_id,
|
||||
})
|
||||
@@ -313,7 +237,7 @@ const onReject = async () => {
|
||||
} catch (err) {
|
||||
addNotification({
|
||||
title: formatMessage(commonMessages.errorNotificationTitle),
|
||||
text: getErrorMessage(err),
|
||||
text: err.data ? err.data.description : err,
|
||||
type: 'error',
|
||||
})
|
||||
}
|
||||
@@ -323,3 +247,130 @@ definePageMeta({
|
||||
middleware: 'auth',
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.oauth-items {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--gap-xl);
|
||||
}
|
||||
|
||||
.scope-items {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--gap-sm);
|
||||
}
|
||||
|
||||
.scope-item {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: var(--gap-sm);
|
||||
}
|
||||
|
||||
.scope-icon {
|
||||
display: flex;
|
||||
|
||||
color: var(--color-raised-bg);
|
||||
background-color: var(--color-green);
|
||||
aspect-ratio: 1;
|
||||
border-radius: 50%;
|
||||
padding: var(--gap-xs);
|
||||
}
|
||||
.title {
|
||||
margin-inline: auto;
|
||||
|
||||
h1 {
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
}
|
||||
.redirection-notice {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--gap-xs);
|
||||
text-align: center;
|
||||
|
||||
.redirect-instructions {
|
||||
font-size: var(--font-size-sm);
|
||||
}
|
||||
|
||||
.redirect-url {
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
|
||||
.wide-button {
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.button-row {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
gap: var(--gap-xs);
|
||||
justify-content: center;
|
||||
}
|
||||
.auth-info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--gap-sm);
|
||||
}
|
||||
|
||||
.scope-heading {
|
||||
margin-bottom: var(--gap-sm);
|
||||
}
|
||||
|
||||
.profile-pics {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
|
||||
.connection-indicator {
|
||||
// Make sure the text sits in the middle and is centered.
|
||||
// Make the text large, and make sure it's not selectable.
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 2rem;
|
||||
user-select: none;
|
||||
|
||||
color: var(--color-primary);
|
||||
}
|
||||
}
|
||||
|
||||
.profile-pic {
|
||||
width: 6rem;
|
||||
height: 6rem;
|
||||
border-radius: 50%;
|
||||
margin: 0 1rem;
|
||||
}
|
||||
|
||||
.dotted-border-line {
|
||||
width: 75%;
|
||||
border: 0.1rem dashed var(--color-divider);
|
||||
}
|
||||
|
||||
.connected-items {
|
||||
// Display dotted-border-line under profile-pics and centered behind them
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
margin-top: 1rem;
|
||||
|
||||
// Display profile-pics on top of dotted-border-line
|
||||
.profile-pics {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
// Display dotted-border-line behind profile-pics
|
||||
.dotted-border-line {
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,196 +0,0 @@
|
||||
<template>
|
||||
<div v-if="subtleLauncherRedirectUri">
|
||||
<iframe
|
||||
:src="subtleLauncherRedirectUri"
|
||||
class="fixed left-0 top-0 z-[9999] m-0 h-full w-full border-0 p-0"
|
||||
></iframe>
|
||||
</div>
|
||||
<CreateAccountView
|
||||
v-else
|
||||
v-model:date-of-birth="dateOfBirth"
|
||||
v-model:username="username"
|
||||
v-model:token="token"
|
||||
v-model:subscribe="subscribe"
|
||||
:globals="globals"
|
||||
:requires-dob="requiresDob"
|
||||
:on-complete-sign-up="completeOAuthSignUp"
|
||||
:on-set-captcha-ref="setCaptchaRef"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
commonMessages,
|
||||
defineMessages,
|
||||
injectModrinthClient,
|
||||
injectNotificationManager,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { useQuery, useQueryClient } from '@tanstack/vue-query'
|
||||
import type { LocationQueryValue } from 'vue-router'
|
||||
|
||||
import CreateAccountView from '@/components/ui/auth/CreateAccount.vue'
|
||||
import { getLauncherRedirectUrl, promotePendingSignInOAuthProvider } from '@/composables/auth.ts'
|
||||
|
||||
interface AuthGlobalsResponse {
|
||||
captcha_enabled?: boolean
|
||||
[key: string]: unknown
|
||||
}
|
||||
|
||||
interface ApiErrorShape {
|
||||
data?: {
|
||||
description?: string
|
||||
}
|
||||
}
|
||||
|
||||
const getQueryString = (
|
||||
value: LocationQueryValue | LocationQueryValue[] | null | undefined,
|
||||
): string => {
|
||||
const firstValue = Array.isArray(value) ? value[0] : value
|
||||
return typeof firstValue === 'string' ? firstValue : ''
|
||||
}
|
||||
|
||||
const getErrorMessage = (error: unknown): string => {
|
||||
const apiError = error as ApiErrorShape
|
||||
if (typeof apiError?.data?.description === 'string') {
|
||||
return apiError.data.description
|
||||
}
|
||||
if (error instanceof Error) {
|
||||
return error.message
|
||||
}
|
||||
return String(error)
|
||||
}
|
||||
|
||||
const client = injectModrinthClient()
|
||||
const queryClient = useQueryClient()
|
||||
const { addNotification } = injectNotificationManager()
|
||||
const { formatMessage } = useVIntl()
|
||||
|
||||
const route = useNativeRoute()
|
||||
const auth = await useAuth()
|
||||
|
||||
const messages = defineMessages({
|
||||
createAccountTitle: {
|
||||
id: 'auth.create-account.page-title',
|
||||
defaultMessage: 'Create Account',
|
||||
},
|
||||
})
|
||||
|
||||
useHead({
|
||||
title() {
|
||||
return `${formatMessage(messages.createAccountTitle)} - Modrinth`
|
||||
},
|
||||
})
|
||||
|
||||
const requiresDob = computed(() => {
|
||||
const raw = route.query.requires_dob
|
||||
const value = Array.isArray(raw) ? raw[0] : raw
|
||||
|
||||
if (!value) {
|
||||
return false
|
||||
}
|
||||
|
||||
return value === 'true' || value === '1'
|
||||
})
|
||||
|
||||
const oauthFlowState = computed(() => {
|
||||
const state = route.query.state
|
||||
const value = Array.isArray(state) ? state[0] : state
|
||||
return typeof value === 'string' ? value : ''
|
||||
})
|
||||
|
||||
const defaultUsername = computed(() => {
|
||||
const queryUsername = route.query.username
|
||||
const value = Array.isArray(queryUsername) ? queryUsername[0] : queryUsername
|
||||
return typeof value === 'string' && value.length > 0 ? value : ''
|
||||
})
|
||||
|
||||
const dateOfBirth = ref('')
|
||||
const username = ref(defaultUsername.value)
|
||||
const token = ref('')
|
||||
const subscribe = ref(false)
|
||||
const subtleLauncherRedirectUri = ref<string>()
|
||||
|
||||
const captcha = ref<{ reset?: () => void } | null>(null)
|
||||
const setCaptchaRef = (captchaRef: unknown) => {
|
||||
captcha.value = (captchaRef as { reset?: () => void } | null) ?? null
|
||||
}
|
||||
|
||||
const { data: globals } = useQuery<AuthGlobalsResponse>({
|
||||
queryKey: ['auth-globals'],
|
||||
queryFn: async () => {
|
||||
try {
|
||||
return await client.labrinth.globals_internal.get()
|
||||
} catch (err) {
|
||||
console.error('Error fetching globals:', err)
|
||||
return { captcha_enabled: true, tax_compliance_thresholds: {} }
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
async function completeOAuthSignUp() {
|
||||
startLoading()
|
||||
try {
|
||||
if (!oauthFlowState.value) {
|
||||
throw new Error('Missing OAuth flow state')
|
||||
}
|
||||
|
||||
const res = await client.labrinth.auth_v2.createOAuthAccount({
|
||||
username: username.value.trim() || defaultUsername.value,
|
||||
state: oauthFlowState.value,
|
||||
challenge: token.value,
|
||||
sign_up_newsletter: subscribe.value,
|
||||
})
|
||||
|
||||
await finishSignIn(res.session)
|
||||
} catch (err) {
|
||||
addNotification({
|
||||
title: formatMessage(commonMessages.errorNotificationTitle),
|
||||
text: getErrorMessage(err),
|
||||
type: 'error',
|
||||
})
|
||||
captcha.value?.reset?.()
|
||||
}
|
||||
stopLoading()
|
||||
}
|
||||
|
||||
async function finishSignIn(sessionToken?: string | null) {
|
||||
if (route.query.launcher) {
|
||||
let token = sessionToken
|
||||
if (!token) {
|
||||
token = auth.value.token
|
||||
}
|
||||
|
||||
promotePendingSignInOAuthProvider()
|
||||
|
||||
const redirectUrl = `${getLauncherRedirectUrl(route)}/?code=${token}`
|
||||
|
||||
if (redirectUrl.startsWith('https://launcher-files.modrinth.com/')) {
|
||||
await navigateTo(redirectUrl, {
|
||||
external: true,
|
||||
})
|
||||
} else {
|
||||
subtleLauncherRedirectUri.value = redirectUrl
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if (sessionToken) {
|
||||
await useAuth(sessionToken)
|
||||
await useUser()
|
||||
queryClient.clear()
|
||||
|
||||
promotePendingSignInOAuthProvider()
|
||||
}
|
||||
|
||||
if (route.query.redirect) {
|
||||
const redirect = decodeURIComponent(getQueryString(route.query.redirect))
|
||||
await navigateTo(redirect, {
|
||||
replace: true,
|
||||
})
|
||||
} else {
|
||||
await navigateTo('/dashboard')
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -1,24 +1,14 @@
|
||||
<template>
|
||||
<div
|
||||
class="universal-card flex w-full max-w-[28rem] flex-col gap-6 border border-solid border-surface-5"
|
||||
>
|
||||
<h1 class="m-0 mx-auto text-xl font-semibold text-contrast">
|
||||
{{ formatMessage(messages.longTitle) }}
|
||||
</h1>
|
||||
<template v-if="step === 'choose_method'">
|
||||
<Admonition :type="'info'">
|
||||
<template #header>
|
||||
<div class="-mb-2 flex flex-col gap-1.5 font-normal leading-normal">
|
||||
<div>
|
||||
{{ formatMessage(methodChoiceMessages.description) }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</Admonition>
|
||||
<div>
|
||||
<h1>{{ formatMessage(messages.longTitle) }}</h1>
|
||||
<section class="auth-form">
|
||||
<template v-if="step === 'choose_method'">
|
||||
<p>
|
||||
{{ formatMessage(methodChoiceMessages.description) }}
|
||||
</p>
|
||||
|
||||
<div class="flex flex-col gap-2.5">
|
||||
<label class="text-md font-semibold text-contrast" for="email">
|
||||
{{ formatMessage(commonMessages.emailLabel) }}
|
||||
<label for="email" hidden>
|
||||
{{ formatMessage(commonMessages.emailUsernameLabel) }}
|
||||
</label>
|
||||
<StyledInput
|
||||
id="email"
|
||||
@@ -29,37 +19,22 @@
|
||||
:placeholder="formatMessage(commonMessages.emailLabel)"
|
||||
wrapper-class="w-full"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col gap-2.5">
|
||||
<label class="text-md font-semibold text-contrast">{{
|
||||
formatMessage(messages.securityCheckLabel)
|
||||
}}</label>
|
||||
<HCaptcha v-if="globals?.captcha_enabled" ref="captcha" v-model="token" />
|
||||
</div>
|
||||
|
||||
<ButtonStyled color="brand">
|
||||
<button
|
||||
class="!w-full"
|
||||
:disabled="globals?.captcha_enabled ? !token : false"
|
||||
@click="recovery"
|
||||
>
|
||||
<SendIcon /> {{ formatMessage(methodChoiceMessages.action) }}
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</template>
|
||||
<template v-else-if="step === 'passed_challenge'">
|
||||
<Admonition :type="'info'">
|
||||
<template #header>
|
||||
<div class="-mb-2 flex flex-col gap-1.5 font-normal leading-normal">
|
||||
<div>
|
||||
{{ formatMessage(postChallengeMessages.description) }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</Admonition>
|
||||
<ButtonStyled color="brand">
|
||||
<button
|
||||
class="mx-auto"
|
||||
:disabled="globals?.captcha_enabled ? !token : false"
|
||||
@click="recovery"
|
||||
>
|
||||
<SendIcon /> {{ formatMessage(methodChoiceMessages.action) }}
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</template>
|
||||
<template v-else-if="step === 'passed_challenge'">
|
||||
<p>{{ formatMessage(postChallengeMessages.description) }}</p>
|
||||
|
||||
<div class="flex flex-col gap-2.5">
|
||||
<label for="password" hidden>{{ formatMessage(commonMessages.passwordLabel) }}</label>
|
||||
<StyledInput
|
||||
id="password"
|
||||
@@ -85,18 +60,17 @@
|
||||
/>
|
||||
|
||||
<ButtonStyled color="brand">
|
||||
<button class="!w-full" @click="changePassword">
|
||||
<button class="auth-form__input continue-btn" @click="changePassword">
|
||||
{{ formatMessage(postChallengeMessages.action) }}
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
</section>
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
<script setup>
|
||||
import { KeyIcon, MailIcon, SendIcon } from '@modrinth/assets'
|
||||
import {
|
||||
Admonition,
|
||||
ButtonStyled,
|
||||
commonMessages,
|
||||
defineMessages,
|
||||
@@ -106,41 +80,8 @@ import {
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { useQuery } from '@tanstack/vue-query'
|
||||
import type { LocationQueryValue } from 'vue-router'
|
||||
|
||||
import HCaptcha from '@/components/ui/auth/HCaptcha.vue'
|
||||
|
||||
interface AuthGlobalsResponse {
|
||||
captcha_enabled?: boolean
|
||||
[key: string]: unknown
|
||||
}
|
||||
|
||||
interface ApiErrorShape {
|
||||
data?: {
|
||||
description?: string
|
||||
error?: string
|
||||
}
|
||||
}
|
||||
|
||||
type ResetPasswordStep = 'choose_method' | 'passed_challenge'
|
||||
|
||||
const getQueryString = (
|
||||
value: LocationQueryValue | LocationQueryValue[] | null | undefined,
|
||||
): string => {
|
||||
const firstValue = Array.isArray(value) ? value[0] : value
|
||||
return typeof firstValue === 'string' ? firstValue : ''
|
||||
}
|
||||
|
||||
const getErrorMessage = (error: unknown): string => {
|
||||
const apiError = error as ApiErrorShape
|
||||
if (typeof apiError?.data?.description === 'string') {
|
||||
return apiError.data.description
|
||||
}
|
||||
if (error instanceof Error) {
|
||||
return error.message
|
||||
}
|
||||
return String(error)
|
||||
}
|
||||
import HCaptcha from '@/components/ui/HCaptcha.vue'
|
||||
|
||||
const client = injectModrinthClient()
|
||||
const { addNotification } = injectNotificationManager()
|
||||
@@ -208,10 +149,6 @@ const messages = defineMessages({
|
||||
id: 'auth.reset-password.title.long',
|
||||
defaultMessage: 'Reset your password',
|
||||
},
|
||||
securityCheckLabel: {
|
||||
id: 'auth.create-account.security-check.label',
|
||||
defaultMessage: 'Security check',
|
||||
},
|
||||
})
|
||||
|
||||
useHead({
|
||||
@@ -225,15 +162,15 @@ if (auth.value.user) {
|
||||
|
||||
const route = useNativeRoute()
|
||||
|
||||
const step = ref<ResetPasswordStep>('choose_method')
|
||||
const step = ref('choose_method')
|
||||
|
||||
if (route.query.flow) {
|
||||
step.value = 'passed_challenge'
|
||||
}
|
||||
|
||||
const captcha = ref<{ reset?: () => void } | null>(null)
|
||||
const captcha = ref()
|
||||
|
||||
const { data: globals } = useQuery<AuthGlobalsResponse>({
|
||||
const { data: globals } = useQuery({
|
||||
queryKey: ['auth-globals'],
|
||||
queryFn: async () => {
|
||||
try {
|
||||
@@ -264,10 +201,10 @@ async function recovery() {
|
||||
} catch (err) {
|
||||
addNotification({
|
||||
title: formatMessage(commonMessages.errorNotificationTitle),
|
||||
text: getErrorMessage(err),
|
||||
text: err.data ? err.data.description : err,
|
||||
type: 'error',
|
||||
})
|
||||
captcha.value?.reset?.()
|
||||
captcha.value?.reset()
|
||||
}
|
||||
stopLoading()
|
||||
}
|
||||
@@ -280,7 +217,7 @@ async function changePassword() {
|
||||
try {
|
||||
await client.labrinth.auth_v2.changePassword({
|
||||
new_password: newPassword.value,
|
||||
flow: getQueryString(route.query.flow),
|
||||
flow: route.query.flow,
|
||||
})
|
||||
|
||||
addNotification({
|
||||
@@ -292,10 +229,10 @@ async function changePassword() {
|
||||
} catch (err) {
|
||||
addNotification({
|
||||
title: formatMessage(commonMessages.errorNotificationTitle),
|
||||
text: getErrorMessage(err),
|
||||
text: err.data ? err.data.description : err,
|
||||
type: 'error',
|
||||
})
|
||||
captcha.value?.reset?.()
|
||||
captcha.value?.reset()
|
||||
}
|
||||
stopLoading()
|
||||
}
|
||||
|
||||
@@ -1,70 +1,171 @@
|
||||
<template>
|
||||
<SignInView
|
||||
v-model:email="email"
|
||||
v-model:password="password"
|
||||
v-model:token="token"
|
||||
v-model:two-factor-code="twoFactorCode"
|
||||
:subtle-launcher-redirect-uri="subtleLauncherRedirectUri"
|
||||
:flow="flow"
|
||||
:redirect-target="redirectTarget"
|
||||
:route-query="route.query"
|
||||
:globals="globals"
|
||||
:on-password-sign-in="beginPasswordSignIn"
|
||||
:on-two-factor-sign-in="begin2FASignIn"
|
||||
:on-set-captcha-ref="setCaptchaRef"
|
||||
/>
|
||||
<div v-if="subtleLauncherRedirectUri">
|
||||
<iframe
|
||||
:src="subtleLauncherRedirectUri"
|
||||
class="fixed left-0 top-0 z-[9999] m-0 h-full w-full border-0 p-0"
|
||||
></iframe>
|
||||
</div>
|
||||
<div v-else>
|
||||
<template v-if="flow && !subtleLauncherRedirectUri">
|
||||
<label for="two-factor-code">
|
||||
<span class="label__title">{{ formatMessage(messages.twoFactorCodeLabel) }}</span>
|
||||
<span class="label__description">
|
||||
{{ formatMessage(messages.twoFactorCodeLabelDescription) }}
|
||||
</span>
|
||||
</label>
|
||||
<StyledInput
|
||||
id="two-factor-code"
|
||||
v-model="twoFactorCode"
|
||||
:maxlength="11"
|
||||
inputmode="numeric"
|
||||
:placeholder="formatMessage(messages.twoFactorCodeInputPlaceholder)"
|
||||
autocomplete="one-time-code"
|
||||
@keyup.enter="begin2FASignIn"
|
||||
/>
|
||||
|
||||
<ButtonStyled color="brand">
|
||||
<button class="continue-btn" @click="begin2FASignIn">
|
||||
{{ formatMessage(commonMessages.signInButton) }} <RightArrowIcon />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</template>
|
||||
<template v-else>
|
||||
<h1>{{ formatMessage(messages.signInWithLabel) }}</h1>
|
||||
|
||||
<section class="third-party">
|
||||
<ButtonStyled>
|
||||
<a :href="getAuthUrl('discord', redirectTarget)">
|
||||
<DiscordColorIcon />
|
||||
<span>Discord</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a :href="getAuthUrl('github', redirectTarget)">
|
||||
<GitHubColorIcon />
|
||||
<span>GitHub</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a :href="getAuthUrl('microsoft', redirectTarget)">
|
||||
<MicrosoftColorIcon />
|
||||
<span>Microsoft</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a :href="getAuthUrl('google', redirectTarget)">
|
||||
<GoogleColorIcon />
|
||||
<span>Google</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a :href="getAuthUrl('steam', redirectTarget)">
|
||||
<SteamColorIcon />
|
||||
<span>Steam</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a :href="getAuthUrl('gitlab', redirectTarget)">
|
||||
<GitLabColorIcon />
|
||||
<span>GitLab</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
</section>
|
||||
|
||||
<h1>{{ formatMessage(messages.usePasswordLabel) }}</h1>
|
||||
|
||||
<section class="auth-form">
|
||||
<label for="email" hidden>{{ formatMessage(commonMessages.emailUsernameLabel) }}</label>
|
||||
<StyledInput
|
||||
id="email"
|
||||
v-model="email"
|
||||
:icon="MailIcon"
|
||||
type="text"
|
||||
inputmode="email"
|
||||
autocomplete="username"
|
||||
:placeholder="formatMessage(commonMessages.emailUsernameLabel)"
|
||||
wrapper-class="w-full"
|
||||
/>
|
||||
|
||||
<label for="password" hidden>{{ formatMessage(commonMessages.passwordLabel) }}</label>
|
||||
<StyledInput
|
||||
id="password"
|
||||
v-model="password"
|
||||
:icon="KeyIcon"
|
||||
type="password"
|
||||
autocomplete="current-password"
|
||||
:placeholder="formatMessage(commonMessages.passwordLabel)"
|
||||
wrapper-class="w-full"
|
||||
/>
|
||||
|
||||
<HCaptcha v-if="globals?.captcha_enabled" ref="captcha" v-model="token" />
|
||||
|
||||
<ButtonStyled color="brand">
|
||||
<button
|
||||
class="continue-btn centered-btn"
|
||||
:disabled="globals?.captcha_enabled ? !token : false"
|
||||
@click="beginPasswordSignIn()"
|
||||
>
|
||||
{{ formatMessage(commonMessages.signInButton) }} <RightArrowIcon />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
|
||||
<div class="auth-form__additional-options">
|
||||
<IntlFormatted :message-id="messages.additionalOptionsLabel">
|
||||
<template #forgot-password-link="{ children }">
|
||||
<NuxtLink
|
||||
class="text-link"
|
||||
:to="{
|
||||
path: '/auth/reset-password',
|
||||
query: route.query,
|
||||
}"
|
||||
>
|
||||
<component :is="() => children" />
|
||||
</NuxtLink>
|
||||
</template>
|
||||
<template #create-account-link="{ children }">
|
||||
<NuxtLink
|
||||
class="text-link"
|
||||
:to="{
|
||||
path: '/auth/sign-up',
|
||||
query: route.query,
|
||||
}"
|
||||
>
|
||||
<component :is="() => children" />
|
||||
</NuxtLink>
|
||||
</template>
|
||||
</IntlFormatted>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
<script setup>
|
||||
import {
|
||||
DiscordColorIcon,
|
||||
GitHubColorIcon,
|
||||
GitLabColorIcon,
|
||||
GoogleColorIcon,
|
||||
KeyIcon,
|
||||
MailIcon,
|
||||
MicrosoftColorIcon,
|
||||
RightArrowIcon,
|
||||
SteamColorIcon,
|
||||
} from '@modrinth/assets'
|
||||
import {
|
||||
ButtonStyled,
|
||||
commonMessages,
|
||||
defineMessages,
|
||||
injectModrinthClient,
|
||||
injectNotificationManager,
|
||||
IntlFormatted,
|
||||
StyledInput,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { useQuery, useQueryClient } from '@tanstack/vue-query'
|
||||
import { useStorage } from '@vueuse/core'
|
||||
import type { LocationQueryValue } from 'vue-router'
|
||||
|
||||
import SignInView from '@/components/ui/auth/SignIn.vue'
|
||||
import {
|
||||
getLauncherRedirectUrl,
|
||||
LAST_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY,
|
||||
PENDING_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY,
|
||||
promotePendingSignInOAuthProvider,
|
||||
} from '@/composables/auth.ts'
|
||||
|
||||
type AuthProvider = 'discord' | 'google' | 'github' | 'gitlab' | 'steam' | 'microsoft'
|
||||
|
||||
interface AuthGlobalsResponse {
|
||||
captcha_enabled?: boolean
|
||||
[key: string]: unknown
|
||||
}
|
||||
|
||||
interface ApiErrorShape {
|
||||
data?: {
|
||||
description?: string
|
||||
}
|
||||
}
|
||||
|
||||
const getQueryString = (
|
||||
value: LocationQueryValue | LocationQueryValue[] | null | undefined,
|
||||
): string => {
|
||||
const firstValue = Array.isArray(value) ? value[0] : value
|
||||
return typeof firstValue === 'string' ? firstValue : ''
|
||||
}
|
||||
|
||||
const getErrorMessage = (error: unknown): string => {
|
||||
const apiError = error as ApiErrorShape
|
||||
if (typeof apiError?.data?.description === 'string') {
|
||||
return apiError.data.description
|
||||
}
|
||||
if (error instanceof Error) {
|
||||
return error.message
|
||||
}
|
||||
return String(error)
|
||||
}
|
||||
import HCaptcha from '@/components/ui/HCaptcha.vue'
|
||||
import { getAuthUrl, getLauncherRedirectUrl } from '@/composables/auth.js'
|
||||
|
||||
const client = injectModrinthClient()
|
||||
const queryClient = useQueryClient()
|
||||
@@ -72,10 +173,35 @@ const { addNotification } = injectNotificationManager()
|
||||
const { formatMessage } = useVIntl()
|
||||
|
||||
const messages = defineMessages({
|
||||
additionalOptionsLabel: {
|
||||
id: 'auth.sign-in.additional-options',
|
||||
defaultMessage:
|
||||
'<forgot-password-link>Forgot password?</forgot-password-link> • <create-account-link>Create an account</create-account-link>',
|
||||
},
|
||||
signInWithLabel: {
|
||||
id: 'auth.sign-in.sign-in-with',
|
||||
defaultMessage: 'Sign in with',
|
||||
},
|
||||
signInTitle: {
|
||||
id: 'auth.sign-in.title',
|
||||
defaultMessage: 'Sign In',
|
||||
},
|
||||
twoFactorCodeInputPlaceholder: {
|
||||
id: 'auth.sign-in.2fa.placeholder',
|
||||
defaultMessage: 'Enter code...',
|
||||
},
|
||||
twoFactorCodeLabel: {
|
||||
id: 'auth.sign-in.2fa.label',
|
||||
defaultMessage: 'Enter two-factor code',
|
||||
},
|
||||
twoFactorCodeLabelDescription: {
|
||||
id: 'auth.sign-in.2fa.description',
|
||||
defaultMessage: 'Please enter a two-factor code to proceed.',
|
||||
},
|
||||
usePasswordLabel: {
|
||||
id: 'auth.sign-in.use-password',
|
||||
defaultMessage: 'Or use a password',
|
||||
},
|
||||
})
|
||||
|
||||
useHead({
|
||||
@@ -86,35 +212,11 @@ useHead({
|
||||
|
||||
const auth = await useAuth()
|
||||
const route = useNativeRoute()
|
||||
const pendingSignInOAuthProvider = useStorage<AuthProvider | null>(
|
||||
PENDING_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY,
|
||||
null,
|
||||
undefined,
|
||||
{ initOnMounted: true },
|
||||
)
|
||||
const lastSignInOAuthProvider = useStorage<AuthProvider | null>(
|
||||
LAST_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY,
|
||||
null,
|
||||
undefined,
|
||||
{ initOnMounted: true },
|
||||
)
|
||||
|
||||
if (route.query.state !== undefined) {
|
||||
await navigateTo(
|
||||
{
|
||||
path: '/auth/create/oauth',
|
||||
query: route.query,
|
||||
},
|
||||
{
|
||||
replace: true,
|
||||
},
|
||||
)
|
||||
}
|
||||
const redirectTarget = route.query.redirect || ''
|
||||
const subtleLauncherRedirectUri = ref()
|
||||
|
||||
const redirectTarget = getQueryString(route.query.redirect)
|
||||
const subtleLauncherRedirectUri = ref<string>()
|
||||
|
||||
if (route.query.code) {
|
||||
if (route.query.code && !route.fullPath.includes('new_account=true')) {
|
||||
await finishSignIn()
|
||||
}
|
||||
|
||||
@@ -122,12 +224,9 @@ if (auth.value.user) {
|
||||
await finishSignIn()
|
||||
}
|
||||
|
||||
const captcha = ref<{ reset?: () => void } | null>(null)
|
||||
const setCaptchaRef = (captchaRef: unknown) => {
|
||||
captcha.value = (captchaRef as { reset?: () => void } | null) ?? null
|
||||
}
|
||||
const captcha = ref()
|
||||
|
||||
const { data: globals } = useQuery<AuthGlobalsResponse>({
|
||||
const { data: globals } = useQuery({
|
||||
queryKey: ['auth-globals'],
|
||||
queryFn: async () => {
|
||||
try {
|
||||
@@ -143,11 +242,9 @@ const email = ref('')
|
||||
const password = ref('')
|
||||
const token = ref('')
|
||||
|
||||
const flow = ref(getQueryString(route.query.flow))
|
||||
const flow = ref(route.query.flow)
|
||||
|
||||
async function beginPasswordSignIn() {
|
||||
pendingSignInOAuthProvider.value = null
|
||||
lastSignInOAuthProvider.value = null
|
||||
startLoading()
|
||||
try {
|
||||
const res = await client.labrinth.auth_v2.login({
|
||||
@@ -164,44 +261,41 @@ async function beginPasswordSignIn() {
|
||||
} catch (err) {
|
||||
addNotification({
|
||||
title: formatMessage(commonMessages.errorNotificationTitle),
|
||||
text: getErrorMessage(err),
|
||||
text: err.data ? err.data.description : err,
|
||||
type: 'error',
|
||||
})
|
||||
captcha.value?.reset?.()
|
||||
captcha.value?.reset()
|
||||
}
|
||||
stopLoading()
|
||||
}
|
||||
|
||||
const twoFactorCode = ref('')
|
||||
const twoFactorCode = ref(null)
|
||||
async function begin2FASignIn() {
|
||||
startLoading()
|
||||
try {
|
||||
const res = await client.labrinth.auth_v2.login2FA({
|
||||
flow: flow.value,
|
||||
code: twoFactorCode.value,
|
||||
code: twoFactorCode.value ? twoFactorCode.value.toString() : twoFactorCode.value,
|
||||
})
|
||||
|
||||
await finishSignIn(res.session)
|
||||
} catch (err) {
|
||||
addNotification({
|
||||
title: formatMessage(commonMessages.errorNotificationTitle),
|
||||
text: getErrorMessage(err),
|
||||
text: err.data ? err.data.description : err,
|
||||
type: 'error',
|
||||
})
|
||||
captcha.value?.reset?.()
|
||||
captcha.value?.reset()
|
||||
}
|
||||
stopLoading()
|
||||
}
|
||||
|
||||
async function finishSignIn(sessionToken?: string | null) {
|
||||
async function finishSignIn(token) {
|
||||
if (route.query.launcher) {
|
||||
let token = sessionToken
|
||||
if (!token) {
|
||||
token = auth.value.token
|
||||
}
|
||||
|
||||
promotePendingSignInOAuthProvider()
|
||||
|
||||
const redirectUrl = `${getLauncherRedirectUrl(route)}/?code=${token}`
|
||||
|
||||
if (redirectUrl.startsWith('https://launcher-files.modrinth.com/')) {
|
||||
@@ -222,16 +316,14 @@ async function finishSignIn(sessionToken?: string | null) {
|
||||
return
|
||||
}
|
||||
|
||||
if (sessionToken) {
|
||||
await useAuth(sessionToken)
|
||||
if (token) {
|
||||
await useAuth(token)
|
||||
await useUser()
|
||||
queryClient.clear()
|
||||
}
|
||||
|
||||
promotePendingSignInOAuthProvider()
|
||||
|
||||
if (route.query.redirect) {
|
||||
const redirect = decodeURIComponent(getQueryString(route.query.redirect))
|
||||
const redirect = decodeURIComponent(route.query.redirect)
|
||||
await navigateTo(redirect, {
|
||||
replace: true,
|
||||
})
|
||||
|
||||
@@ -1,81 +1,171 @@
|
||||
<template>
|
||||
<SignUpView
|
||||
v-if="!isCreateAccountStep"
|
||||
v-model:email="email"
|
||||
v-model:password="password"
|
||||
:redirect-target="redirectTarget"
|
||||
:show-other-options="showOtherOptions"
|
||||
:route-query="route.query"
|
||||
:on-toggle-other-options="toggleOtherOptions"
|
||||
:on-continue-with-email="continueWithEmail"
|
||||
/>
|
||||
<CreateAccountView
|
||||
v-else
|
||||
v-model:date-of-birth="dateOfBirth"
|
||||
v-model:username="username"
|
||||
v-model:token="token"
|
||||
v-model:subscribe="subscribe"
|
||||
:globals="globals"
|
||||
:on-complete-sign-up="createAccount"
|
||||
:on-set-captcha-ref="setCaptchaRef"
|
||||
/>
|
||||
<div>
|
||||
<h1>{{ formatMessage(messages.signUpWithTitle) }}</h1>
|
||||
|
||||
<section class="third-party">
|
||||
<ButtonStyled>
|
||||
<a class="discord-btn" :href="getAuthUrl('discord', redirectTarget)">
|
||||
<DiscordColorIcon />
|
||||
<span>Discord</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a :href="getAuthUrl('github', redirectTarget)">
|
||||
<GitHubColorIcon />
|
||||
<span>GitHub</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a :href="getAuthUrl('microsoft', redirectTarget)">
|
||||
<MicrosoftColorIcon />
|
||||
<span>Microsoft</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a :href="getAuthUrl('google', redirectTarget)">
|
||||
<GoogleColorIcon />
|
||||
<span>Google</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a :href="getAuthUrl('steam', redirectTarget)">
|
||||
<SteamColorIcon />
|
||||
<span>Steam</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a :href="getAuthUrl('gitlab', redirectTarget)">
|
||||
<GitLabColorIcon />
|
||||
<span>GitLab</span>
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
</section>
|
||||
|
||||
<h1>{{ formatMessage(messages.createAccountTitle) }}</h1>
|
||||
|
||||
<section class="auth-form">
|
||||
<label for="email" hidden>{{ formatMessage(commonMessages.emailLabel) }}</label>
|
||||
<StyledInput
|
||||
id="email"
|
||||
v-model="email"
|
||||
:icon="MailIcon"
|
||||
type="email"
|
||||
autocomplete="username"
|
||||
:placeholder="formatMessage(commonMessages.emailLabel)"
|
||||
wrapper-class="w-full"
|
||||
/>
|
||||
|
||||
<label for="username" hidden>{{ formatMessage(commonMessages.usernameLabel) }}</label>
|
||||
<StyledInput
|
||||
id="username"
|
||||
v-model="username"
|
||||
:icon="UserIcon"
|
||||
type="text"
|
||||
autocomplete="username"
|
||||
:placeholder="formatMessage(commonMessages.usernameLabel)"
|
||||
wrapper-class="w-full"
|
||||
/>
|
||||
|
||||
<label for="password" hidden>{{ formatMessage(commonMessages.passwordLabel) }}</label>
|
||||
<StyledInput
|
||||
id="password"
|
||||
v-model="password"
|
||||
:icon="KeyIcon"
|
||||
type="password"
|
||||
autocomplete="new-password"
|
||||
:placeholder="formatMessage(commonMessages.passwordLabel)"
|
||||
wrapper-class="w-full"
|
||||
/>
|
||||
|
||||
<label for="confirm-password" hidden>{{ formatMessage(commonMessages.passwordLabel) }}</label>
|
||||
<StyledInput
|
||||
id="confirm-password"
|
||||
v-model="confirmPassword"
|
||||
:icon="KeyIcon"
|
||||
type="password"
|
||||
autocomplete="new-password"
|
||||
:placeholder="formatMessage(commonMessages.confirmPasswordLabel)"
|
||||
wrapper-class="w-full"
|
||||
/>
|
||||
|
||||
<Checkbox
|
||||
v-model="subscribe"
|
||||
class="subscribe-btn"
|
||||
:label="formatMessage(messages.subscribeLabel)"
|
||||
:description="formatMessage(messages.subscribeLabel)"
|
||||
/>
|
||||
|
||||
<p v-if="!route.query.launcher">
|
||||
<IntlFormatted :message-id="messages.legalDisclaimer">
|
||||
<template #terms-link="{ children }">
|
||||
<NuxtLink to="/legal/terms" class="text-link">
|
||||
<component :is="() => children" />
|
||||
</NuxtLink>
|
||||
</template>
|
||||
<template #privacy-policy-link="{ children }">
|
||||
<NuxtLink to="/legal/privacy" class="text-link">
|
||||
<component :is="() => children" />
|
||||
</NuxtLink>
|
||||
</template>
|
||||
</IntlFormatted>
|
||||
</p>
|
||||
|
||||
<HCaptcha v-if="globals?.captcha_enabled" ref="captcha" v-model="token" />
|
||||
|
||||
<ButtonStyled color="brand">
|
||||
<button
|
||||
class="continue-btn centered-btn"
|
||||
:disabled="globals?.captcha_enabled ? !token : false"
|
||||
@click="createAccount"
|
||||
>
|
||||
{{ formatMessage(messages.createAccountButton) }} <RightArrowIcon />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
|
||||
<div class="auth-form__additional-options">
|
||||
{{ formatMessage(messages.alreadyHaveAccountLabel) }}
|
||||
<NuxtLink
|
||||
class="text-link"
|
||||
:to="{
|
||||
path: '/auth/sign-in',
|
||||
query: route.query,
|
||||
}"
|
||||
>
|
||||
{{ formatMessage(commonMessages.signInButton) }}
|
||||
</NuxtLink>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
<script setup>
|
||||
import {
|
||||
DiscordColorIcon,
|
||||
GitHubColorIcon,
|
||||
GitLabColorIcon,
|
||||
GoogleColorIcon,
|
||||
KeyIcon,
|
||||
MailIcon,
|
||||
MicrosoftColorIcon,
|
||||
RightArrowIcon,
|
||||
SteamColorIcon,
|
||||
UserIcon,
|
||||
} from '@modrinth/assets'
|
||||
import {
|
||||
ButtonStyled,
|
||||
Checkbox,
|
||||
commonMessages,
|
||||
defineMessages,
|
||||
injectModrinthClient,
|
||||
injectNotificationManager,
|
||||
IntlFormatted,
|
||||
StyledInput,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { useQuery } from '@tanstack/vue-query'
|
||||
import { useStorage } from '@vueuse/core'
|
||||
import type { LocationQueryValue } from 'vue-router'
|
||||
|
||||
import CreateAccountView from '@/components/ui/auth/CreateAccount.vue'
|
||||
import SignUpView from '@/components/ui/auth/SignUp.vue'
|
||||
import {
|
||||
LAST_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY,
|
||||
PENDING_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY,
|
||||
promotePendingSignInOAuthProvider,
|
||||
} from '@/composables/auth.ts'
|
||||
|
||||
interface AuthGlobalsResponse {
|
||||
captcha_enabled?: boolean
|
||||
[key: string]: unknown
|
||||
}
|
||||
|
||||
interface ApiErrorShape {
|
||||
data?: {
|
||||
description?: string
|
||||
error?: string
|
||||
}
|
||||
v1Error?: {
|
||||
error?: string
|
||||
}
|
||||
responseData?: {
|
||||
error?: string
|
||||
}
|
||||
}
|
||||
|
||||
const getQueryString = (
|
||||
value: LocationQueryValue | LocationQueryValue[] | null | undefined,
|
||||
): string => {
|
||||
const firstValue = Array.isArray(value) ? value[0] : value
|
||||
return typeof firstValue === 'string' ? firstValue : ''
|
||||
}
|
||||
|
||||
const getErrorMessage = (error: unknown): string => {
|
||||
const apiError = error as ApiErrorShape
|
||||
if (typeof apiError?.data?.description === 'string') {
|
||||
return apiError.data.description
|
||||
}
|
||||
if (error instanceof Error) {
|
||||
return error.message
|
||||
}
|
||||
return String(error)
|
||||
}
|
||||
import HCaptcha from '@/components/ui/HCaptcha.vue'
|
||||
import { getAuthUrl } from '@/composables/auth.js'
|
||||
|
||||
const client = injectModrinthClient()
|
||||
const { addNotification } = injectNotificationManager()
|
||||
@@ -86,13 +176,30 @@ const messages = defineMessages({
|
||||
id: 'auth.sign-up.title',
|
||||
defaultMessage: 'Sign Up',
|
||||
},
|
||||
ageRequirementWarningTitle: {
|
||||
id: 'auth.sign-up.age-requirement.warning-title',
|
||||
defaultMessage: 'Age requirement',
|
||||
signUpWithTitle: {
|
||||
id: 'auth.sign-up.title.sign-up-with',
|
||||
defaultMessage: 'Sign up with',
|
||||
},
|
||||
under13HelperText: {
|
||||
id: 'auth.create-account.date-of-birth.under13-helper',
|
||||
defaultMessage: 'You cannot create an account at Modrinth unless you are over 13 years old.',
|
||||
createAccountTitle: {
|
||||
id: 'auth.sign-up.title.create-account',
|
||||
defaultMessage: 'Or create an account yourself',
|
||||
},
|
||||
subscribeLabel: {
|
||||
id: 'auth.sign-up.subscribe.label',
|
||||
defaultMessage: 'Subscribe to updates about Modrinth',
|
||||
},
|
||||
legalDisclaimer: {
|
||||
id: 'auth.sign-up.legal-dislaimer',
|
||||
defaultMessage:
|
||||
"By creating an account, you agree to Modrinth's <terms-link>Terms</terms-link> and <privacy-policy-link>Privacy Policy</privacy-policy-link>.",
|
||||
},
|
||||
createAccountButton: {
|
||||
id: 'auth.sign-up.action.create-account',
|
||||
defaultMessage: 'Create account',
|
||||
},
|
||||
alreadyHaveAccountLabel: {
|
||||
id: 'auth.sign-up.sign-in-option.title',
|
||||
defaultMessage: 'Already have an account?',
|
||||
},
|
||||
})
|
||||
|
||||
@@ -102,36 +209,16 @@ useHead({
|
||||
|
||||
const auth = await useAuth()
|
||||
const route = useNativeRoute()
|
||||
const pendingSignInOAuthProvider = useStorage(
|
||||
PENDING_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY,
|
||||
null,
|
||||
undefined,
|
||||
{ initOnMounted: true },
|
||||
)
|
||||
const lastSignInOAuthProvider = useStorage(
|
||||
LAST_SIGN_IN_OAUTH_PROVIDER_STORAGE_KEY,
|
||||
null,
|
||||
undefined,
|
||||
{ initOnMounted: true },
|
||||
)
|
||||
|
||||
const redirectTarget = getQueryString(route.query.redirect)
|
||||
const showOtherOptions = ref(false)
|
||||
const isCreateAccountStep = ref(false)
|
||||
const redirectTarget = route.query.redirect
|
||||
|
||||
if (auth.value.user) {
|
||||
await navigateTo('/dashboard')
|
||||
}
|
||||
|
||||
const captcha = ref<{ reset?: () => void } | null>(null)
|
||||
const setCaptchaRef = (captchaRef: unknown) => {
|
||||
captcha.value = (captchaRef as { reset?: () => void } | null) ?? null
|
||||
}
|
||||
const toggleOtherOptions = () => {
|
||||
showOtherOptions.value = !showOtherOptions.value
|
||||
}
|
||||
const captcha = ref()
|
||||
|
||||
const { data: globals } = useQuery<AuthGlobalsResponse>({
|
||||
const { data: globals } = useQuery({
|
||||
queryKey: ['auth-globals'],
|
||||
queryFn: async () => {
|
||||
try {
|
||||
@@ -144,117 +231,29 @@ const { data: globals } = useQuery<AuthGlobalsResponse>({
|
||||
})
|
||||
|
||||
const email = ref('')
|
||||
const password = ref('')
|
||||
const dateOfBirth = ref('')
|
||||
const username = ref('')
|
||||
const password = ref('')
|
||||
const confirmPassword = ref('')
|
||||
const token = ref('')
|
||||
const subscribe = ref(false)
|
||||
const USERNAME_MAX_LENGTH = 39
|
||||
const MAX_USERNAME_SUFFIX_RETRIES = 10
|
||||
const MAX_RANDOM_USERNAME_ATTEMPTS = 10
|
||||
|
||||
async function continueWithEmail() {
|
||||
pendingSignInOAuthProvider.value = null
|
||||
lastSignInOAuthProvider.value = null
|
||||
startLoading()
|
||||
try {
|
||||
const generatedUsername = await findAvailableGeneratedUsername()
|
||||
|
||||
token.value = ''
|
||||
username.value = generatedUsername
|
||||
isCreateAccountStep.value = true
|
||||
} catch (err) {
|
||||
addNotification({
|
||||
title: formatMessage(commonMessages.errorNotificationTitle),
|
||||
text: getErrorMessage(err),
|
||||
type: 'error',
|
||||
})
|
||||
}
|
||||
stopLoading()
|
||||
}
|
||||
|
||||
function generateUsernameFromEmail(emailAddress: string): string {
|
||||
const [localPart = ''] = emailAddress.trim().toLowerCase().split('@')
|
||||
const sanitized = localPart
|
||||
.replace(/[^a-zA-Z0-9_-]/g, '_')
|
||||
.replace(/_+/g, '_')
|
||||
.replace(/^_+|_+$/g, '')
|
||||
|
||||
return (sanitized || 'user').slice(0, USERNAME_MAX_LENGTH)
|
||||
}
|
||||
|
||||
async function findAvailableGeneratedUsername(): Promise<string> {
|
||||
const baseUsername = generateUsernameFromEmail(email.value)
|
||||
|
||||
for (let suffixAttempt = 0; suffixAttempt <= MAX_USERNAME_SUFFIX_RETRIES; suffixAttempt++) {
|
||||
const candidateUsername = appendUsernameSuffix(baseUsername, suffixAttempt)
|
||||
|
||||
try {
|
||||
await validateCreateAccountCandidate(candidateUsername)
|
||||
return candidateUsername
|
||||
} catch (err) {
|
||||
if (!isUsernameTakenValidationError(err)) {
|
||||
throw err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return await findAvailableRandomUsername()
|
||||
}
|
||||
|
||||
function appendUsernameSuffix(baseUsername: string, suffixAttempt: number): string {
|
||||
if (suffixAttempt === 0) {
|
||||
return baseUsername
|
||||
}
|
||||
|
||||
const suffix = String(suffixAttempt)
|
||||
const maxBaseLength = Math.max(1, USERNAME_MAX_LENGTH - suffix.length)
|
||||
return `${baseUsername.slice(0, maxBaseLength)}${suffix}`
|
||||
}
|
||||
|
||||
function generateRandomUsername(): string {
|
||||
const randomSuffix = `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 8)}`
|
||||
const base = `user_${randomSuffix}`
|
||||
return base.slice(0, USERNAME_MAX_LENGTH)
|
||||
}
|
||||
|
||||
async function findAvailableRandomUsername(): Promise<string> {
|
||||
for (let attempt = 0; attempt < MAX_RANDOM_USERNAME_ATTEMPTS; attempt++) {
|
||||
const candidateUsername = generateRandomUsername()
|
||||
|
||||
try {
|
||||
await validateCreateAccountCandidate(candidateUsername)
|
||||
return candidateUsername
|
||||
} catch (err) {
|
||||
if (!isUsernameTakenValidationError(err)) {
|
||||
throw err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error('Unable to find an available username. Please choose one manually.')
|
||||
}
|
||||
|
||||
async function validateCreateAccountCandidate(candidateUsername: string): Promise<void> {
|
||||
await client.labrinth.auth_v2.validateCreateAccount({
|
||||
username: candidateUsername,
|
||||
password: password.value,
|
||||
email: email.value,
|
||||
})
|
||||
}
|
||||
|
||||
function isUsernameTakenValidationError(error: unknown): boolean {
|
||||
const apiError = error as ApiErrorShape
|
||||
const errorCode =
|
||||
apiError?.data?.error ?? apiError?.v1Error?.error ?? apiError?.responseData?.error
|
||||
return errorCode === 'username_taken'
|
||||
}
|
||||
|
||||
async function createAccount() {
|
||||
startLoading()
|
||||
try {
|
||||
if (confirmPassword.value !== password.value) {
|
||||
addNotification({
|
||||
title: formatMessage(commonMessages.errorNotificationTitle),
|
||||
text: formatMessage({
|
||||
id: 'auth.sign-up.notification.password-mismatch.text',
|
||||
defaultMessage: 'Passwords do not match!',
|
||||
}),
|
||||
type: 'error',
|
||||
})
|
||||
captcha.value?.reset()
|
||||
}
|
||||
|
||||
const res = await client.labrinth.auth_v2.createAccount({
|
||||
username: username.value.trim() || generateUsernameFromEmail(email.value),
|
||||
username: username.value,
|
||||
password: password.value,
|
||||
email: email.value,
|
||||
challenge: token.value,
|
||||
@@ -264,25 +263,23 @@ async function createAccount() {
|
||||
await useAuth(res.session)
|
||||
await useUser()
|
||||
|
||||
promotePendingSignInOAuthProvider()
|
||||
|
||||
if (route.query.launcher) {
|
||||
await navigateTo({ path: '/auth/sign-in', query: route.query })
|
||||
return
|
||||
}
|
||||
|
||||
if (route.query.redirect) {
|
||||
await navigateTo(getQueryString(route.query.redirect))
|
||||
await navigateTo(route.query.redirect)
|
||||
} else {
|
||||
await navigateTo('/dashboard')
|
||||
}
|
||||
} catch (err) {
|
||||
addNotification({
|
||||
title: formatMessage(commonMessages.errorNotificationTitle),
|
||||
text: getErrorMessage(err),
|
||||
text: err.data ? err.data.description : err,
|
||||
type: 'error',
|
||||
})
|
||||
captcha.value?.reset?.()
|
||||
captcha.value?.reset()
|
||||
}
|
||||
stopLoading()
|
||||
}
|
||||
|
||||
@@ -1,126 +1,78 @@
|
||||
<template>
|
||||
<div
|
||||
class="universal-card flex w-full max-w-[28rem] flex-col gap-6 border border-solid border-surface-5"
|
||||
>
|
||||
<div>
|
||||
<template v-if="auth.user && auth.user.email_verified && !success">
|
||||
<h1 class="m-0 mx-auto text-xl font-semibold text-contrast">
|
||||
{{ formatMessage(alreadyVerifiedMessages.title) }}
|
||||
</h1>
|
||||
<h1>{{ formatMessage(alreadyVerifiedMessages.title) }}</h1>
|
||||
|
||||
<Admonition type="success">
|
||||
{{ formatMessage(alreadyVerifiedMessages.description) }}
|
||||
</Admonition>
|
||||
<section class="auth-form">
|
||||
<p>{{ formatMessage(alreadyVerifiedMessages.description) }}</p>
|
||||
|
||||
<div class="grid grid-cols-2 gap-2">
|
||||
<ButtonStyled>
|
||||
<NuxtLink class="shadow-none" to="/settings/account">
|
||||
<NuxtLink to="/settings/account">
|
||||
<SettingsIcon /> {{ formatMessage(messages.accountSettings) }}
|
||||
</NuxtLink>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled color="brand">
|
||||
<NuxtLink to="/discover/mods">
|
||||
{{ formatMessage(messages.discoverMods) }}
|
||||
<RightArrowIcon />
|
||||
</NuxtLink>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<template v-else-if="success">
|
||||
<h1 class="m-0 mx-auto text-xl font-semibold text-contrast">
|
||||
{{ formatMessage(postVerificationMessages.title) }}
|
||||
</h1>
|
||||
<h1>{{ formatMessage(postVerificationMessages.title) }}</h1>
|
||||
|
||||
<Admonition type="success">
|
||||
{{ formatMessage(postVerificationMessages.description) }}
|
||||
</Admonition>
|
||||
<section class="auth-form">
|
||||
<p>{{ formatMessage(postVerificationMessages.description) }}</p>
|
||||
|
||||
<template v-if="auth.user">
|
||||
<div class="grid grid-cols-2 gap-2">
|
||||
<ButtonStyled>
|
||||
<NuxtLink to="/settings/account">
|
||||
<SettingsIcon /> {{ formatMessage(messages.accountSettings) }}
|
||||
</NuxtLink>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled color="brand">
|
||||
<NuxtLink to="/discover/mods">
|
||||
{{ formatMessage(messages.discoverMods) }}
|
||||
<RightArrowIcon />
|
||||
</NuxtLink>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
</template>
|
||||
<ButtonStyled v-else color="brand">
|
||||
<NuxtLink to="/auth/sign-in" class="!w-full">
|
||||
{{ formatMessage(commonMessages.signInButton) }}
|
||||
<RightArrowIcon />
|
||||
</NuxtLink>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled v-if="auth.user">
|
||||
<NuxtLink to="/settings/account">
|
||||
<SettingsIcon /> {{ formatMessage(messages.accountSettings) }}
|
||||
</NuxtLink>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled v-else>
|
||||
<NuxtLink to="/auth/sign-in">
|
||||
{{ formatMessage(commonMessages.signInButton) }}
|
||||
<RightArrowIcon />
|
||||
</NuxtLink>
|
||||
</ButtonStyled>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<template v-else>
|
||||
<h1 class="m-0 mx-auto text-xl font-semibold text-contrast">
|
||||
{{ formatMessage(failedVerificationMessages.title) }}
|
||||
</h1>
|
||||
<h1>{{ formatMessage(failedVerificationMessages.title) }}</h1>
|
||||
|
||||
<Admonition v-if="auth.user" type="warning">
|
||||
{{ formatMessage(failedVerificationMessages.loggedInDescription) }}
|
||||
</Admonition>
|
||||
<Admonition v-else type="warning">
|
||||
{{ formatMessage(failedVerificationMessages.description) }}
|
||||
</Admonition>
|
||||
<section class="auth-form">
|
||||
<p>
|
||||
<template v-if="auth.user">
|
||||
{{ formatMessage(failedVerificationMessages.loggedInDescription) }}
|
||||
</template>
|
||||
<template v-else>
|
||||
{{ formatMessage(failedVerificationMessages.description) }}
|
||||
</template>
|
||||
</p>
|
||||
|
||||
<ButtonStyled v-if="auth.user" color="brand">
|
||||
<button class="!w-full" @click="handleResendEmailVerification">
|
||||
{{ formatMessage(failedVerificationMessages.action) }}
|
||||
<RightArrowIcon />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled v-else color="brand">
|
||||
<NuxtLink to="/auth/sign-in" class="!w-full">
|
||||
{{ formatMessage(commonMessages.signInButton) }}
|
||||
<RightArrowIcon />
|
||||
</NuxtLink>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled v-if="auth.user" color="brand">
|
||||
<button @click="handleResendEmailVerification">
|
||||
{{ formatMessage(failedVerificationMessages.action) }}
|
||||
<RightArrowIcon />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
|
||||
<ButtonStyled v-else color="brand">
|
||||
<NuxtLink to="/auth/sign-in">
|
||||
{{ formatMessage(commonMessages.signInButton) }}
|
||||
<RightArrowIcon />
|
||||
</NuxtLink>
|
||||
</ButtonStyled>
|
||||
</section>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
<script setup>
|
||||
import { RightArrowIcon, SettingsIcon } from '@modrinth/assets'
|
||||
import {
|
||||
Admonition,
|
||||
ButtonStyled,
|
||||
commonMessages,
|
||||
defineMessages,
|
||||
injectNotificationManager,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import type { LocationQueryValue } from 'vue-router'
|
||||
|
||||
interface ApiErrorShape {
|
||||
data?: {
|
||||
description?: string
|
||||
error?: string
|
||||
}
|
||||
}
|
||||
|
||||
const getQueryString = (
|
||||
value: LocationQueryValue | LocationQueryValue[] | null | undefined,
|
||||
): string => {
|
||||
const firstValue = Array.isArray(value) ? value[0] : value
|
||||
return typeof firstValue === 'string' ? firstValue : ''
|
||||
}
|
||||
|
||||
const getErrorMessage = (error: unknown): string => {
|
||||
const apiError = error as ApiErrorShape
|
||||
if (typeof apiError?.data?.description === 'string') {
|
||||
return apiError.data.description
|
||||
}
|
||||
if (error instanceof Error) {
|
||||
return error.message
|
||||
}
|
||||
return String(error)
|
||||
}
|
||||
|
||||
const { addNotification } = injectNotificationManager()
|
||||
const { formatMessage } = useVIntl()
|
||||
@@ -134,22 +86,6 @@ const messages = defineMessages({
|
||||
id: 'auth.verify-email.action.account-settings',
|
||||
defaultMessage: 'Account settings',
|
||||
},
|
||||
discoverMods: {
|
||||
id: 'auth.verify-email.action.discover-mods',
|
||||
defaultMessage: 'Discover mods',
|
||||
},
|
||||
emailSentNotificationTitle: {
|
||||
id: 'auth.verify-email.notification.email-sent.title',
|
||||
defaultMessage: 'Email sent',
|
||||
},
|
||||
emailSentNotificationDescription: {
|
||||
id: 'auth.verify-email.notification.email-sent.description',
|
||||
defaultMessage: 'An email with a link to verify your account has been sent to {email}.',
|
||||
},
|
||||
errorOccurredTitle: {
|
||||
id: 'auth.verify-email.notification.error-occurred.title',
|
||||
defaultMessage: 'An error occurred',
|
||||
},
|
||||
})
|
||||
|
||||
const alreadyVerifiedMessages = defineMessages({
|
||||
@@ -206,13 +142,13 @@ const route = useNativeRoute()
|
||||
|
||||
if (route.query.flow) {
|
||||
try {
|
||||
const emailVerified = useState<boolean | null>('emailVerified', () => null)
|
||||
const emailVerified = useState('emailVerified', () => null)
|
||||
|
||||
if (emailVerified.value === null) {
|
||||
await useBaseFetch('auth/email/verify', {
|
||||
method: 'POST',
|
||||
body: {
|
||||
flow: getQueryString(route.query.flow),
|
||||
flow: route.query.flow,
|
||||
},
|
||||
})
|
||||
emailVerified.value = true
|
||||
@@ -235,16 +171,14 @@ async function handleResendEmailVerification() {
|
||||
try {
|
||||
await resendVerifyEmail()
|
||||
addNotification({
|
||||
title: formatMessage(messages.emailSentNotificationTitle),
|
||||
text: formatMessage(messages.emailSentNotificationDescription, {
|
||||
email: auth.value.user?.email ?? '',
|
||||
}),
|
||||
title: 'Email sent',
|
||||
text: `An email with a link to verify your account has been sent to ${auth.value.user.email}.`,
|
||||
type: 'success',
|
||||
})
|
||||
} catch (err) {
|
||||
addNotification({
|
||||
title: formatMessage(messages.errorOccurredTitle),
|
||||
text: getErrorMessage(err),
|
||||
title: 'An error occurred',
|
||||
text: err.data.description,
|
||||
type: 'error',
|
||||
})
|
||||
}
|
||||
|
||||
@@ -0,0 +1,205 @@
|
||||
<template>
|
||||
<div class="welcome-box has-bot">
|
||||
<img :src="WavingRinthbot" alt="Waving Modrinth Bot" class="welcome-box__waving-bot" />
|
||||
<div class="welcome-box__top-glow" />
|
||||
<div class="welcome-box__body">
|
||||
<h1 class="welcome-box__title">
|
||||
{{ formatMessage(messages.welcomeLongTitle) }}
|
||||
</h1>
|
||||
|
||||
<p class="welcome-box__subtitle">
|
||||
<IntlFormatted :message-id="messages.welcomeDescription">
|
||||
<template #bold="{ children }">
|
||||
<strong>
|
||||
<component :is="() => normalizeChildren(children)" />
|
||||
</strong>
|
||||
</template>
|
||||
</IntlFormatted>
|
||||
</p>
|
||||
|
||||
<Checkbox
|
||||
v-model="subscribe"
|
||||
class="subscribe-btn"
|
||||
:label="formatMessage(messages.subscribeCheckbox)"
|
||||
:description="formatMessage(messages.subscribeCheckbox)"
|
||||
/>
|
||||
|
||||
<ButtonStyled color="brand">
|
||||
<button class="centered-btn" @click="continueSignUp">
|
||||
{{ formatMessage(commonMessages.continueButton) }}
|
||||
<RightArrowIcon />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
|
||||
<p class="tos-text">
|
||||
<IntlFormatted :message-id="messages.tosLabel">
|
||||
<template #terms-link="{ children }">
|
||||
<NuxtLink to="/legal/terms" class="text-link">
|
||||
<component :is="() => children" />
|
||||
</NuxtLink>
|
||||
</template>
|
||||
<template #privacy-policy-link="{ children }">
|
||||
<NuxtLink to="/legal/privacy" class="text-link">
|
||||
<component :is="() => children" />
|
||||
</NuxtLink>
|
||||
</template>
|
||||
</IntlFormatted>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { RightArrowIcon, WavingRinthbot } from '@modrinth/assets'
|
||||
import {
|
||||
ButtonStyled,
|
||||
Checkbox,
|
||||
commonMessages,
|
||||
defineMessages,
|
||||
IntlFormatted,
|
||||
normalizeChildren,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { useQueryClient } from '@tanstack/vue-query'
|
||||
|
||||
const queryClient = useQueryClient()
|
||||
const route = useRoute()
|
||||
|
||||
const { formatMessage } = useVIntl()
|
||||
|
||||
const messages = defineMessages({
|
||||
subscribeCheckbox: {
|
||||
id: 'auth.welcome.checkbox.subscribe',
|
||||
defaultMessage: 'Subscribe to updates about Modrinth',
|
||||
},
|
||||
tosLabel: {
|
||||
id: 'auth.welcome.label.tos',
|
||||
defaultMessage:
|
||||
"By creating an account, you have agreed to Modrinth's <terms-link>Terms</terms-link> and <privacy-policy-link>Privacy Policy</privacy-policy-link>.",
|
||||
},
|
||||
welcomeDescription: {
|
||||
id: 'auth.welcome.description',
|
||||
defaultMessage:
|
||||
'You’re now part of the awesome community of creators & explorers already building, downloading, and staying up-to-date with amazing mods.',
|
||||
},
|
||||
welcomeLongTitle: {
|
||||
id: 'auth.welcome.long-title',
|
||||
defaultMessage: 'Welcome to Modrinth!',
|
||||
},
|
||||
welcomeTitle: {
|
||||
id: 'auth.welcome.title',
|
||||
defaultMessage: 'Welcome',
|
||||
},
|
||||
})
|
||||
|
||||
useHead({
|
||||
title: () => `${formatMessage(messages.welcomeTitle)} - Modrinth`,
|
||||
})
|
||||
|
||||
const subscribe = ref(true)
|
||||
|
||||
onMounted(async () => {
|
||||
await useAuth(route.query.authToken)
|
||||
await useUser()
|
||||
queryClient.clear()
|
||||
})
|
||||
|
||||
async function continueSignUp() {
|
||||
if (subscribe.value) {
|
||||
try {
|
||||
await useBaseFetch('auth/email/subscribe', {
|
||||
method: 'POST',
|
||||
})
|
||||
} catch {
|
||||
// Ignored
|
||||
}
|
||||
}
|
||||
|
||||
if (route.query.redirect) {
|
||||
await navigateTo(route.query.redirect)
|
||||
} else {
|
||||
await navigateTo('/dashboard')
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.welcome-box {
|
||||
background-color: var(--color-raised-bg);
|
||||
border-radius: var(--size-rounded-lg);
|
||||
padding: 1.75rem 2rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1.25rem;
|
||||
box-shadow: var(--shadow-card);
|
||||
position: relative;
|
||||
|
||||
&.has-bot {
|
||||
margin-block: 120px;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0;
|
||||
}
|
||||
a {
|
||||
color: var(--color-brand);
|
||||
font-weight: var(--weight-bold);
|
||||
&:hover,
|
||||
&:focus {
|
||||
filter: brightness(1.125);
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
&__waving-bot {
|
||||
--bot-height: 112px;
|
||||
position: absolute;
|
||||
top: calc(-1 * var(--bot-height));
|
||||
right: 5rem;
|
||||
height: var(--bot-height);
|
||||
width: auto;
|
||||
|
||||
@media (max-width: 768px) {
|
||||
--bot-height: 70px;
|
||||
right: 2rem;
|
||||
}
|
||||
}
|
||||
|
||||
&__top-glow {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 1px;
|
||||
opacity: 0.4;
|
||||
background: linear-gradient(
|
||||
to right,
|
||||
transparent 2rem,
|
||||
var(--color-green) calc(100% - 13rem),
|
||||
var(--color-green) calc(100% - 5rem),
|
||||
transparent calc(100% - 2rem)
|
||||
);
|
||||
}
|
||||
|
||||
&__body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1.25rem;
|
||||
}
|
||||
|
||||
&__title {
|
||||
font-size: var(--text-32);
|
||||
font-weight: var(--weight-extrabold);
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
&__subtitle {
|
||||
font-size: var(--text-18);
|
||||
}
|
||||
|
||||
.tos-text {
|
||||
font-size: var(--text-14);
|
||||
line-height: 1.5;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -57,6 +57,7 @@ import { Avatar, ButtonStyled, defineMessages, injectModrinthClient, useVIntl }
|
||||
import { useQuery } from '@tanstack/vue-query'
|
||||
|
||||
import OrganizationCreateModal from '~/components/ui/create/OrganizationCreateModal.vue'
|
||||
import { useAuth } from '~/composables/auth.js'
|
||||
|
||||
const { formatMessage } = useVIntl()
|
||||
|
||||
|
||||
@@ -9,30 +9,23 @@
|
||||
:has-to-type="true"
|
||||
@proceed="deleteAccount"
|
||||
/>
|
||||
<NewModal
|
||||
<Modal
|
||||
ref="changeEmailModal"
|
||||
width="500px"
|
||||
:header="`${auth.user.email ? formatMessage(messages.changeEmailHeaderChange) : formatMessage(messages.changeEmailHeaderAdd)}`"
|
||||
>
|
||||
<div class="flex flex-col gap-6">
|
||||
<Admonition type="info">
|
||||
{{ formatMessage(messages.emailNotPublicNotice) }}
|
||||
</Admonition>
|
||||
<div class="flex flex-col gap-2.5">
|
||||
<label for="email-input">
|
||||
<span class="text-md font-semibold text-contrast">{{
|
||||
formatMessage(messages.emailAddressLabel)
|
||||
}}</span>
|
||||
</label>
|
||||
<StyledInput
|
||||
id="email-input"
|
||||
v-model="email"
|
||||
:maxlength="2048"
|
||||
type="email"
|
||||
:placeholder="formatMessage(messages.emailAddressPlaceholder)"
|
||||
@keyup.enter="saveEmail()"
|
||||
/>
|
||||
</div>
|
||||
<div class="universal-modal">
|
||||
<p>{{ formatMessage(messages.emailNotPublicNotice) }}</p>
|
||||
<label for="email-input">
|
||||
<span class="label__title">{{ formatMessage(messages.emailAddressLabel) }}</span>
|
||||
</label>
|
||||
<StyledInput
|
||||
id="email-input"
|
||||
v-model="email"
|
||||
:maxlength="2048"
|
||||
type="email"
|
||||
:placeholder="formatMessage(messages.emailAddressPlaceholder)"
|
||||
@keyup.enter="saveEmail()"
|
||||
/>
|
||||
<div class="input-group push-right">
|
||||
<ButtonStyled>
|
||||
<button @click="$refs.changeEmailModal.hide()">
|
||||
@@ -48,10 +41,9 @@
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
</div>
|
||||
</NewModal>
|
||||
<NewModal
|
||||
</Modal>
|
||||
<Modal
|
||||
ref="managePasswordModal"
|
||||
width="600px"
|
||||
:header="`${
|
||||
removePasswordMode
|
||||
? formatMessage(messages.passwordHeaderRemove)
|
||||
@@ -60,74 +52,60 @@
|
||||
: formatMessage(messages.passwordHeaderAdd)
|
||||
}`"
|
||||
>
|
||||
<div class="flex flex-col gap-6">
|
||||
<div v-if="auth.user.has_password" class="flex flex-col gap-2.5">
|
||||
<label v-if="removePasswordMode" for="old-password">
|
||||
<span class="text-md font-semibold text-contrast">{{
|
||||
formatMessage(messages.confirmPasswordLabel)
|
||||
}}</span>
|
||||
</label>
|
||||
<label v-else for="old-password">
|
||||
<span class="text-md font-semibold text-contrast">{{
|
||||
formatMessage(messages.oldPasswordLabel)
|
||||
}}</span>
|
||||
</label>
|
||||
<StyledInput
|
||||
id="old-password"
|
||||
v-model="oldPassword"
|
||||
:maxlength="2048"
|
||||
type="password"
|
||||
autocomplete="current-password"
|
||||
:placeholder="
|
||||
removePasswordMode
|
||||
? formatMessage(messages.confirmPasswordPlaceholder)
|
||||
: formatMessage(messages.oldPasswordPlaceholder)
|
||||
"
|
||||
/>
|
||||
<span v-if="removePasswordMode" class="label__description">{{
|
||||
<div class="universal-modal">
|
||||
<ul
|
||||
v-if="newPassword !== confirmNewPassword && confirmNewPassword.length > 0"
|
||||
class="known-errors"
|
||||
>
|
||||
<li>{{ formatMessage(messages.passwordsDoNotMatchError) }}</li>
|
||||
</ul>
|
||||
<label v-if="removePasswordMode" for="old-password">
|
||||
<span class="label__title">{{ formatMessage(messages.confirmPasswordLabel) }}</span>
|
||||
<span class="label__description">{{
|
||||
formatMessage(messages.confirmPasswordDescription)
|
||||
}}</span>
|
||||
</div>
|
||||
|
||||
</label>
|
||||
<label v-else-if="auth.user.has_password" for="old-password">
|
||||
<span class="label__title">{{ formatMessage(messages.oldPasswordLabel) }}</span>
|
||||
</label>
|
||||
<StyledInput
|
||||
v-if="auth.user.has_password"
|
||||
id="old-password"
|
||||
v-model="oldPassword"
|
||||
:maxlength="2048"
|
||||
type="password"
|
||||
autocomplete="current-password"
|
||||
:placeholder="
|
||||
removePasswordMode
|
||||
? formatMessage(messages.confirmPasswordPlaceholder)
|
||||
: formatMessage(messages.oldPasswordPlaceholder)
|
||||
"
|
||||
/>
|
||||
<template v-if="!removePasswordMode">
|
||||
<div class="flex flex-col gap-2.5">
|
||||
<label for="new-password"
|
||||
><span class="text-md font-semibold text-contrast">{{
|
||||
formatMessage(messages.newPasswordLabel)
|
||||
}}</span></label
|
||||
>
|
||||
<StyledInput
|
||||
id="new-password"
|
||||
v-model="newPassword"
|
||||
:maxlength="2048"
|
||||
type="password"
|
||||
autocomplete="new-password"
|
||||
:placeholder="formatMessage(messages.newPasswordPlaceholder)"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col gap-2.5">
|
||||
<label for="confirm-new-password">
|
||||
<span class="text-md font-semibold text-contrast">{{
|
||||
formatMessage(messages.confirmNewPasswordLabel)
|
||||
}}</span>
|
||||
</label>
|
||||
<StyledInput
|
||||
id="confirm-new-password"
|
||||
v-model="confirmNewPassword"
|
||||
:maxlength="2048"
|
||||
type="password"
|
||||
autocomplete="new-password"
|
||||
:placeholder="formatMessage(messages.confirmNewPasswordPlaceholder)"
|
||||
/>
|
||||
<div
|
||||
v-if="newPassword !== confirmNewPassword && confirmNewPassword.length > 0"
|
||||
class="known-errors"
|
||||
>
|
||||
{{ formatMessage(messages.passwordsDoNotMatchError) }}
|
||||
</div>
|
||||
</div>
|
||||
<label for="new-password"
|
||||
><span class="label__title">{{ formatMessage(messages.newPasswordLabel) }}</span></label
|
||||
>
|
||||
<StyledInput
|
||||
id="new-password"
|
||||
v-model="newPassword"
|
||||
:maxlength="2048"
|
||||
type="password"
|
||||
autocomplete="new-password"
|
||||
:placeholder="formatMessage(messages.newPasswordPlaceholder)"
|
||||
/>
|
||||
<label for="confirm-new-password">
|
||||
<span class="label__title">{{ formatMessage(messages.confirmNewPasswordLabel) }}</span>
|
||||
</label>
|
||||
<StyledInput
|
||||
id="confirm-new-password"
|
||||
v-model="confirmNewPassword"
|
||||
:maxlength="2048"
|
||||
type="password"
|
||||
autocomplete="new-password"
|
||||
:placeholder="formatMessage(messages.confirmNewPasswordPlaceholder)"
|
||||
/>
|
||||
</template>
|
||||
<p></p>
|
||||
<div class="input-group push-right">
|
||||
<ButtonStyled>
|
||||
<button @click="$refs.managePasswordModal.hide()">
|
||||
@@ -169,10 +147,9 @@
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</NewModal>
|
||||
<NewModal
|
||||
</Modal>
|
||||
<Modal
|
||||
ref="manageTwoFactorModal"
|
||||
width="500px"
|
||||
:header="
|
||||
formatMessage(
|
||||
auth.user.has_totp && twoFactorStep === 0
|
||||
@@ -181,12 +158,10 @@
|
||||
)
|
||||
"
|
||||
>
|
||||
<div class="flex flex-col gap-6">
|
||||
<div class="universal-modal">
|
||||
<template v-if="auth.user.has_totp && twoFactorStep === 0">
|
||||
<label for="two-factor-code">
|
||||
<span class="text-md font-semibold text-contrast">{{
|
||||
formatMessage(messages.twoFactorEnterCodeLabel)
|
||||
}}</span>
|
||||
<span class="label__title">{{ formatMessage(messages.twoFactorEnterCodeLabel) }}</span>
|
||||
<span class="label__description">{{
|
||||
formatMessage(messages.twoFactorEnterCodeDescription)
|
||||
}}</span>
|
||||
@@ -198,7 +173,7 @@
|
||||
:placeholder="formatMessage(messages.twoFactorCodePlaceholder)"
|
||||
@keyup.enter="removeTwoFactor()"
|
||||
/>
|
||||
<p v-if="twoFactorIncorrect" class="known-errors m-0">
|
||||
<p v-if="twoFactorIncorrect" class="known-errors">
|
||||
{{ formatMessage(messages.twoFactorIncorrectError) }}
|
||||
</p>
|
||||
<div class="input-group push-right">
|
||||
@@ -218,8 +193,8 @@
|
||||
</template>
|
||||
<template v-else>
|
||||
<template v-if="twoFactorStep === 0">
|
||||
<p class="m-0">{{ formatMessage(messages.twoFactorSetupIntro) }}</p>
|
||||
<p class="m-0">
|
||||
<p>{{ formatMessage(messages.twoFactorSetupIntro) }}</p>
|
||||
<p>
|
||||
<IntlFormatted :message-id="messages.twoFactorSetupScan">
|
||||
<template #authy-link="{ children }">
|
||||
<a href="https://authy.com/" target="_blank" rel="noreferrer">
|
||||
@@ -246,14 +221,14 @@
|
||||
:margin="2"
|
||||
level="H"
|
||||
/>
|
||||
<p class="m-0">
|
||||
<p>
|
||||
{{ formatMessage(messages.twoFactorManualSecretPrefix) }}
|
||||
<strong>{{ twoFactorSecret }}</strong>
|
||||
</p>
|
||||
</template>
|
||||
<template v-if="twoFactorStep === 1">
|
||||
<label for="verify-code">
|
||||
<span class="text-md font-semibold text-contrast">{{
|
||||
<span class="label__title">{{
|
||||
formatMessage(messages.twoFactorVerifyCodeLabel)
|
||||
}}</span>
|
||||
<span class="label__description">{{
|
||||
@@ -268,13 +243,13 @@
|
||||
:placeholder="formatMessage(messages.twoFactorCodePlaceholder)"
|
||||
@keyup.enter="verifyTwoFactorCode()"
|
||||
/>
|
||||
<p v-if="twoFactorIncorrect" class="known-errors m-0">
|
||||
<p v-if="twoFactorIncorrect" class="known-errors">
|
||||
{{ formatMessage(messages.twoFactorIncorrectError) }}
|
||||
</p>
|
||||
</template>
|
||||
<template v-if="twoFactorStep === 2">
|
||||
<p class="m-0">{{ formatMessage(messages.twoFactorBackupCodesIntro) }}</p>
|
||||
<p class="m-0">{{ formatMessage(messages.twoFactorBackupCodesSingleUse) }}</p>
|
||||
<p>{{ formatMessage(messages.twoFactorBackupCodesIntro) }}</p>
|
||||
<p>{{ formatMessage(messages.twoFactorBackupCodesSingleUse) }}</p>
|
||||
<ul>
|
||||
<li v-for="code in backupCodes" :key="code">{{ code }}</li>
|
||||
</ul>
|
||||
@@ -307,34 +282,38 @@
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</NewModal>
|
||||
<NewModal
|
||||
ref="manageProvidersModal"
|
||||
width="500px"
|
||||
:header="formatMessage(messages.manageProvidersModalHeader)"
|
||||
>
|
||||
<div class="flex flex-col gap-4">
|
||||
<Table :columns="manageProvidersColumns" :data="authProviders" row-key="id">
|
||||
<template #cell-provider="{ row }">
|
||||
<span class="inline-flex items-center gap-1.5">
|
||||
<component :is="row.icon" class="size-5" />
|
||||
{{ row.display }}
|
||||
</span>
|
||||
</template>
|
||||
<template #cell-actions="{ row }">
|
||||
<ButtonStyled v-if="auth.user.auth_providers.includes(row.id)">
|
||||
<button class="!w-full" @click="handleRemoveAuthProvider(row.id)">
|
||||
<TrashIcon /> {{ formatMessage(commonMessages.removeButton) }}
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled v-else>
|
||||
<a :href="`${getAuthUrl(row.id, '/settings/account')}&token=${auth.token}`">
|
||||
<ExternalIcon /> {{ formatMessage(messages.providerAddButton) }}
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
</template>
|
||||
</Table>
|
||||
<div class="self-end">
|
||||
</Modal>
|
||||
<Modal ref="manageProvidersModal" :header="formatMessage(messages.manageProvidersModalHeader)">
|
||||
<div class="universal-modal">
|
||||
<div class="table">
|
||||
<div class="table-head table-row">
|
||||
<div class="table-text table-cell">
|
||||
{{ formatMessage(messages.providersTableProvider) }}
|
||||
</div>
|
||||
<div class="table-text table-cell">
|
||||
{{ formatMessage(messages.providersTableActions) }}
|
||||
</div>
|
||||
</div>
|
||||
<div v-for="provider in authProviders" :key="provider.id" class="table-row">
|
||||
<div class="table-text table-cell">
|
||||
<span><component :is="provider.icon" /> {{ provider.display }}</span>
|
||||
</div>
|
||||
<div class="table-text manage table-cell">
|
||||
<ButtonStyled v-if="auth.user.auth_providers.includes(provider.id)">
|
||||
<button @click="handleRemoveAuthProvider(provider.id)">
|
||||
<TrashIcon /> {{ formatMessage(commonMessages.removeButton) }}
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled v-else>
|
||||
<a :href="`${getAuthUrl(provider.id, '/settings/account')}&token=${auth.token}`">
|
||||
<ExternalIcon /> {{ formatMessage(messages.providerAddButton) }}
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p></p>
|
||||
<div class="input-group push-right">
|
||||
<ButtonStyled>
|
||||
<button @click="$refs.manageProvidersModal.hide()">
|
||||
<XIcon />
|
||||
@@ -343,7 +322,7 @@
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
</div>
|
||||
</NewModal>
|
||||
</Modal>
|
||||
<section class="universal-card">
|
||||
<h2 class="text-2xl">{{ formatMessage(messages.accountSecurityTitle) }}</h2>
|
||||
|
||||
@@ -492,16 +471,13 @@ import {
|
||||
XIcon,
|
||||
} from '@modrinth/assets'
|
||||
import {
|
||||
Admonition,
|
||||
ButtonStyled,
|
||||
commonMessages,
|
||||
ConfirmModal,
|
||||
defineMessages,
|
||||
injectNotificationManager,
|
||||
IntlFormatted,
|
||||
NewModal,
|
||||
StyledInput,
|
||||
Table,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import KeyIcon from 'assets/icons/auth/key.svg'
|
||||
@@ -513,7 +489,8 @@ import MicrosoftIcon from 'assets/icons/auth/sso-microsoft.svg'
|
||||
import SteamIcon from 'assets/icons/auth/sso-steam.svg'
|
||||
import QrcodeVue from 'qrcode.vue'
|
||||
|
||||
import { getAuthUrl, removeAuthProvider } from '~/composables/auth.ts'
|
||||
import Modal from '~/components/ui/Modal.vue'
|
||||
import { getAuthUrl, removeAuthProvider } from '~/composables/auth.js'
|
||||
|
||||
definePageMeta({
|
||||
middleware: 'auth',
|
||||
@@ -980,18 +957,6 @@ const authProviders = [
|
||||
icon: GoogleIcon,
|
||||
},
|
||||
]
|
||||
const manageProvidersColumns = computed(() => [
|
||||
{
|
||||
key: 'provider',
|
||||
label: formatMessage(messages.providersTableProvider),
|
||||
},
|
||||
{
|
||||
key: 'actions',
|
||||
label: formatMessage(messages.providersTableActions),
|
||||
align: 'right',
|
||||
width: '10rem',
|
||||
},
|
||||
])
|
||||
|
||||
async function deleteAccount() {
|
||||
startLoading()
|
||||
@@ -1045,4 +1010,20 @@ canvas {
|
||||
margin: 0 auto;
|
||||
border-radius: var(--size-rounded-card);
|
||||
}
|
||||
|
||||
.table-row {
|
||||
grid-template-columns: 1fr 10rem;
|
||||
|
||||
span {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin: auto 0;
|
||||
|
||||
svg {
|
||||
width: 1.25rem;
|
||||
height: 1.25rem;
|
||||
margin-right: 0.35rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -561,7 +561,7 @@ import UpToDate from '~/assets/images/illustrations/up_to_date.svg?component'
|
||||
import AdPlaceholder from '~/components/ui/AdPlaceholder.vue'
|
||||
import CollectionCreateModal from '~/components/ui/create/CollectionCreateModal.vue'
|
||||
import ModalCreation from '~/components/ui/create/ProjectCreateModal.vue'
|
||||
import { getSignInRouteObj } from '~/composables/auth.ts'
|
||||
import { getSignInRouteObj } from '~/composables/auth.js'
|
||||
import { projectUserSorting } from '~/utils/projects.ts'
|
||||
import { reportUser } from '~/utils/report-helpers.ts'
|
||||
import { hasActiveMidas, hasPride26Badge } from '~/utils/user-membership.ts'
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
import { promotePendingSignInOAuthProvider } from '@/composables/auth.ts'
|
||||
|
||||
export default defineNuxtPlugin(async () => {
|
||||
const auth = await useAuth()
|
||||
if (auth.value.user) {
|
||||
promotePendingSignInOAuthProvider()
|
||||
}
|
||||
})
|
||||
@@ -2,7 +2,7 @@ import type { Labrinth } from '@modrinth/api-client'
|
||||
import { type AuthProvider, type AuthUser, provideAuth } from '@modrinth/ui'
|
||||
import { ref, watchEffect } from 'vue'
|
||||
|
||||
import { getSignInRedirectPath } from '~/composables/auth.ts'
|
||||
import { getSignInRedirectPath } from '~/composables/auth.js'
|
||||
|
||||
export function setupAuthProvider(auth: Awaited<ReturnType<typeof useAuth>>) {
|
||||
const router = useRouter()
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 272 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 882 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 54 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.2 MiB |
@@ -1,5 +1,12 @@
|
||||
{
|
||||
"articles": [
|
||||
{
|
||||
"title": "Improving Modpack review delays",
|
||||
"summary": "Reducing the back-and-forth needed to get your modpack approved.",
|
||||
"thumbnail": "https://modrinth.com/news/article/modpack-permissions/thumbnail.webp",
|
||||
"date": "2026-06-23T20:00:00.000Z",
|
||||
"link": "https://modrinth.com/news/article/modpack-permissions"
|
||||
},
|
||||
{
|
||||
"title": "Modrinth joins Spark Universe",
|
||||
"summary": "The next chapter. What it means and why we think it’s right for Modrinth.",
|
||||
|
||||
File diff suppressed because one or more lines are too long
+3
-4
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"db_name": "PostgreSQL",
|
||||
"query": "\n INSERT INTO users (\n id, username, email,\n avatar_url, raw_avatar_url, bio, created,\n github_id, discord_id, gitlab_id, google_id, steam_id, microsoft_id,\n email_verified, password, paypal_id, paypal_country, paypal_email,\n venmo_handle, stripe_customer_id, allow_friend_requests, is_subscribed_to_newsletter,\n eligibility_verified_at\n )\n VALUES (\n $1, $2, $3, $4, $5,\n $6, $7,\n $8, $9, $10, $11, $12, $13,\n $14, $15, $16, $17, $18, $19, $20, $21, $22,\n $23\n )\n ",
|
||||
"query": "\n INSERT INTO users (\n id, username, email,\n avatar_url, raw_avatar_url, bio, created,\n github_id, discord_id, gitlab_id, google_id, steam_id, microsoft_id,\n email_verified, password, paypal_id, paypal_country, paypal_email,\n venmo_handle, stripe_customer_id, allow_friend_requests, is_subscribed_to_newsletter\n )\n VALUES (\n $1, $2, $3, $4, $5,\n $6, $7,\n $8, $9, $10, $11, $12, $13,\n $14, $15, $16, $17, $18, $19, $20, $21, $22\n )\n ",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
@@ -26,11 +26,10 @@
|
||||
"Text",
|
||||
"Text",
|
||||
"Bool",
|
||||
"Bool",
|
||||
"Timestamptz"
|
||||
"Bool"
|
||||
]
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "a335ff4338fa4b3c1aaa9f62c61aad3c3e8bef0e68035a024995c62cfe69c568"
|
||||
"hash": "010c69fa61e1329156020b251e75d46bc09344c1846b3098accce5801e571e5e"
|
||||
}
|
||||
Generated
+16
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"db_name": "PostgreSQL",
|
||||
"query": "\n\t\tdelete from project_attribution_files paf\n\t\tusing project_attribution_groups pag\n\t\twhere pag.id = paf.group_id\n\t\t\tand pag.project_id = $1\n\t\t\tand paf.sha1 = $2\n\t\t\tand paf.group_id != $3\n\t\t",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
"Left": [
|
||||
"Int8",
|
||||
"Bytea",
|
||||
"Int8"
|
||||
]
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "2055c95a568c9159849b10fa94fd6682fb4edf05d80d9b5c17c597d8807f1346"
|
||||
}
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"db_name": "PostgreSQL",
|
||||
"query": "\n insert into project_attribution_files (group_id, name, sha1, moderation_external_license_id)\n values ($1, $2, $3, $4)\n ",
|
||||
"query": "\n insert into project_attribution_files (group_id, name, sha1, moderation_external_license_id)\n values ($1, $2, $3, $4)\n on conflict (group_id, sha1) do update\n set moderation_external_license_id = excluded.moderation_external_license_id\n ",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
@@ -13,5 +13,5 @@
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "1d27a83fb85c4640c3fc88fc6caa8209973ced0f88d8dbecdac349bbe70930a5"
|
||||
"hash": "2ecca6dd46f1d4cc99745a8ab6780701a07444b2b658f2f7e8af94f78411bab6"
|
||||
}
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"db_name": "PostgreSQL",
|
||||
"query": "\n insert into project_attribution_files (group_id, name, sha1)\n select $1, unnest($2::text[]), unnest($3::bytea[])\n ",
|
||||
"query": "\n insert into project_attribution_files (group_id, name, sha1)\n select $1, unnest($2::text[]), unnest($3::bytea[])\n on conflict (group_id, sha1) do nothing\n ",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
@@ -12,5 +12,5 @@
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "2e6bb84f45c0f8ba7bb9b09bf3def4322f727c7af8bd4be49dc4d7c487b925ed"
|
||||
"hash": "428bef57672572cfe1f308701d17844412e6b25a06b1ec530a18f5ad11274bd2"
|
||||
}
|
||||
Generated
+14
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"db_name": "PostgreSQL",
|
||||
"query": "\n\t\tinsert into file_scans (file_id)\n\t\tselect f.id\n\t\tfrom files f\n\t\tinner join attribution_enforced_versions aev on aev.id = f.version_id\n\t\twhere f.version_id = any($1)\n\t\ton conflict (file_id) do nothing\n\t\t",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
"Left": [
|
||||
"Int8Array"
|
||||
]
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "43ce7cbf44ce123c3d71c5dee035022d2e6b537eb53fcb39608e820e77174b81"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user